ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMKaW5kZXggYmRmOWE0OS4uMzc4NWIxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMKQEAgLTEsMzggKzEsNDEgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjaW5nIGZvciBvcmcuZWNsaXBzZS5qZHQuY29yZSBwbHVnaW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zz10cnVlDQotDQotIyBSZXBvcnRzIGJhY2tncm91bmQgaW5kZXhlciBhY3Rpdml0eTogaW5kZXhpbmcsIHNhdmluZyBpbmRleCBmaWxlLCBpbmRleCBxdWVyaWVzDQotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyPWZhbHNlDQotDQotIyBSZXBvcnRzIGNvbXBpbGVyIGFjdGl2aXR5DQotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGlsZXI9ZmFsc2UNCi0NCi0jIFJlcG9ydHMgSmF2YSBtb2RlbCBlbGVtZW50cyBvcGVuaW5nL2Nsb3NpbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhbW9kZWw9ZmFsc2UNCi0NCi0jIFJlcG9ydHMgc2hhcmVkIHdvcmtpbmcgY29weSB1c2UNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zaGFyZWR3b3JraW5nY29weT1mYWxzZQ0KLQ0KLSMgUmVwb3J0cyBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6YXRpb24sIGFuZCBjbGFzc3BhdGggY29udGFpbmVyIHJlc29sdXRpb24NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb249ZmFsc2UNCi0NCi0jIFJlcG9ydHMgYWNjZXNzIHRvIHppcCBhbmQgamFyIGZpbGVzIHRocm91Z2ggdGhlIEphdmEgbW9kZWwNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3M9ZmFsc2UNCi0NCi0jIFByaW50IG5vdGlmaWVkIEphdmEgZWxlbWVudCBkZWx0YXMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGE9ZmFsc2UNCi0NCi0jIFJlcG9ydCB0eXBlIGhpZXJhcmNoeSBjb25uZWN0aW9ucywgcmVmcmVzaGVzIGFuZCBkZWx0YXMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9oaWVyYXJjaHk9ZmFsc2UNCi0NCi0jIFJlcG9ydHMgaW5jcmVtZW50YWwgYnVpbGRlciBhY3Rpdml0eSA6IG5hdHVyZSBvZiBidWlsZCwgYnVpbHQgc3RhdGUgcmVhZGluZywgaW5kaWN0bWVudCBwcm9jZXNzDQotb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlcj1mYWxzZQ0KLQ0KLSMgUmVwb3J0cyBjb2RlYXNzaXN0IGNvbXBsZXRpb24gYWN0aXZpdHkgOiByZWNvdmVyZWQgdW5pdCwgaW5mZXJyZWQgY29tcGxldGlvbnMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uPWZhbHNlDQotDQotIyBSZXBvcnRzIG9wZW4gb24gc2VsZWN0aW9uIGFjdGl2aXR5IDogcmVjb3ZlcmVkIHVuaXQsIGluZmVycmVkIHNlbGVjdGlvbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbj1mYWxzZQ0KLQ0KLSMgUmVwb3J0cyBqYXZhIHNlYXJjaCBhY3Rpdml0eQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaD1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyMgVHVybiBvbiBkZWJ1ZyB0cmFjaW5nIGZvciBvcmcuZWNsaXBzZS5qZHQuY29yZSBwbHVnaW4KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnPXRydWUKKworIyBSZXBvcnRzIGluY3JlbWVudGFsIGJ1aWxkZXIgYWN0aXZpdHkgOiBuYXR1cmUgb2YgYnVpbGQsIGJ1aWx0IHN0YXRlIHJlYWRpbmcsIGluZGljdG1lbnQgcHJvY2Vzcworb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlcj1mYWxzZQorCisjIFJlcG9ydHMgY29tcGlsZXIgYWN0aXZpdHkKK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyPWZhbHNlCisKKyMgUmVwb3J0cyBjb2RlYXNzaXN0IGNvbXBsZXRpb24gYWN0aXZpdHkgOiByZWNvdmVyZWQgdW5pdCwgaW5mZXJyZWQgY29tcGxldGlvbnMKK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBsZXRpb249ZmFsc2UKKworIyBSZXBvcnRzIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiwgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgcmVzb2x1dGlvbgorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uPWZhbHNlCisKKyMgUmVwb3J0IHR5cGUgaGllcmFyY2h5IGNvbm5lY3Rpb25zLCByZWZyZXNoZXMgYW5kIGRlbHRhcworb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5PWZhbHNlCisKKyMgUmVwb3J0cyBiYWNrZ3JvdW5kIGluZGV4ZXIgYWN0aXZpdHk6IGluZGV4aW5nLCBzYXZpbmcgaW5kZXggZmlsZSwgaW5kZXggcXVlcmllcworb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyPWZhbHNlCisKKyMgUHJpbnQgbm90aWZpZWQgSmF2YSBlbGVtZW50IGRlbHRhcworb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhPWZhbHNlCisKKyMgUmVwb3J0cyBKYXZhIG1vZGVsIGVsZW1lbnRzIG9wZW5pbmcvY2xvc2luZworb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsPWZhbHNlCisKKyMgUmVwb3J0cyBwb3N0IGFjdGlvbnMgYWRkaXRpb24vcnVuCitvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uPWZhbHNlCisKKyMgUmVwb3J0cyBqYXZhIHNlYXJjaCBhY3Rpdml0eQorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoPWZhbHNlCisKKyMgUmVwb3J0cyBvcGVuIG9uIHNlbGVjdGlvbiBhY3Rpdml0eSA6IHJlY292ZXJlZCB1bml0LCBpbmZlcnJlZCBzZWxlY3Rpb24KK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbj1mYWxzZQorCisjIFJlcG9ydHMgc2hhcmVkIHdvcmtpbmcgY29weSB1c2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NoYXJlZHdvcmtpbmdjb3B5PWZhbHNlCisKKyMgUmVwb3J0cyBhY2Nlc3MgdG8gemlwIGFuZCBqYXIgZmlsZXMgdGhyb3VnaCB0aGUgSmF2YSBtb2RlbAorb3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9KRFRDb21waWxlckFkYXB0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2FudGFkYXB0ZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvSkRUQ29tcGlsZXJBZGFwdGVyLmphdmEKaW5kZXggNjY0YWUwYS4uODViYThmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYW50YWRhcHRlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9KRFRDb21waWxlckFkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9hbnRhZGFwdGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL0pEVENvbXBpbGVyQWRhcHRlci5qYXZhCkBAIC0xLDI5ICsxLDM0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkRlZmF1bHRDb21waWxlckFkYXB0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogCiAvKioKLSAqIEFudCBjb21waWxlciBhZGFwdGVyIGZvciB0aGUgRWNsaXBzZSBKYXZhIGNvbXBpbGVyLiBUaGlzIGFkYXB0ZXIgcGVybWl0cyB0aGUKKyAqIEFudCAxLjUgY29tcGlsZXIgYWRhcHRlciBmb3IgdGhlIEVjbGlwc2UgSmF2YSBjb21waWxlci4gVGhpcyBhZGFwdGVyIHBlcm1pdHMgdGhlCiAgKiBFY2xpcHNlIEphdmEgY29tcGlsZXIgdG8gYmUgdXNlZCB3aXRoIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4gdGFzayBpbiBBbnQgc2NyaXB0cy4gSW4gb3JkZXIKICAqIHRvIHVzZSBpdCwganVzdCBzZXQgdGhlIHByb3BlcnR5IDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBhcyBmb2xsb3dzOgogICogPHA+CkBAIC0zNyw2ICs0Miw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKRFRDb21waWxlckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29tcGlsZXJDbGFzcyA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guTWFpbiI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgbG9nRmlsZU5hbWU7CisJCiAJLyoqCiAJICogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBKRFQgYmF0Y2ggY29tcGlsZXIgCiAJICovCkBAIC00NiwxNCArNTMsMjAgQEAKIAogCQl0cnkgewogCQkJQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoY29tcGlsZXJDbGFzcyk7Ci0JCQlNZXRob2QgY29tcGlsZSA9IGMuZ2V0TWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW10geyBTdHJpbmdbXS5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJY29tcGlsZS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgY21kLmdldEFyZ3VtZW50cygpfSk7CisJCQlDb25zdHJ1Y3RvciBiYXRjaENvbXBpbGVyQ29uc3RydWN0b3IgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgUHJpbnRXcml0ZXIuY2xhc3MsIFByaW50V3JpdGVyLmNsYXNzLCBCb29sZWFuLlRZUEV9KTsKKwkJCU9iamVjdCBiYXRjaENvbXBpbGVySW5zdGFuY2UgPSBiYXRjaENvbXBpbGVyQ29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHtuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0uZXJyKSwgbmV3IEJvb2xlYW4odHJ1ZSl9KTsKKwkJCU1ldGhvZCBjb21waWxlID0gYy5nZXRNZXRob2QoImNvbXBpbGUiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAorCQkJT2JqZWN0IHJlc3VsdCA9IGNvbXBpbGUuaW52b2tlKGJhdGNoQ29tcGlsZXJJbnN0YW5jZSwgbmV3IE9iamVjdFtdIHsgY21kLmdldEFyZ3VtZW50cygpfSk7CisJCQlmaW5hbCBib29sZWFuIHJlc3VsdFZhbHVlID0gKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOworCQkJaWYgKCFyZXN1bHRWYWx1ZSAmJiB2ZXJib3NlKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuYmluZCgiYW50LmpkdGFkYXB0ZXIuZXJyb3IuY29tcGlsYXRpb25GYWlsZWQiLCB0aGlzLmxvZ0ZpbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiByZXN1bHRWYWx1ZTsKIAkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CiAJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVXRpbC5iaW5kKCJhbnQuamR0YWRhcHRlci5lcnJvci5taXNzaW5nSkRUQ29tcGlsZXIiKSk7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogCQl9Ci0JCXJldHVybiB0cnVlOwogCX0KIAkKIAkKQEAgLTY1LDE1ICs3OCwxMiBAQAogCQkgKi8KIAkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ub0V4aXQiKTsgLy8kTk9OLU5MUy0xJAogCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRWNsaXBzZSBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgYm9vdGNsYXNzcGF0aCBkaXIgKC1ib290Y2xhc3NwYXRoKS4KLSAgICAgICAgICogSXQgaXMgZW11bGF0ZWQgdXNpbmcgdGhlIGNsYXNzcGF0aC4gV2UgYWRkIGJvb3RjbGFzc3BhdGggYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICAgICAgKiB0aGUgY2xhc3NwYXRoLgotICAgICAgICAgKi8KKwkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ib290Y2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggIT0gbnVsbCAmJiBib290Y2xhc3NwYXRoLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKGJvb3RjbGFzc3BhdGgpOworCQkJLyoKKwkJCSAqIFNldCB0aGUgYm9vdGNsYXNzcGF0aCBmb3IgdGhlIEVjbGlwc2UgY29tcGlsZXIuCisJCQkgKi8KKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYm9vdGNsYXNzcGF0aCk7ICAgICAgICAJCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogTm8gYm9vdGNsYXNzcGF0aCwgd2Ugd2lsbCBhZGQgb25lIHRocm91Z2h0IHRoZSBKUkVfTElCIHZhcmlhYmxlCkBAIC04MiwxMCArOTIsMTIgQEAKIAkJCWlmIChqcmVfbGliID09IG51bGwpIHsKIAkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVXRpbC5iaW5kKCJhbnQuamR0YWRhcHRlci5lcnJvci5taXNzaW5nSlJFTElCIikpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQljbGFzc3BhdGguYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwganJlX2xpYi50b09TU3RyaW5nKCkpKTsKKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgobmV3IFBhdGgobnVsbCwganJlX2xpYi50b09TU3RyaW5nKCkpKTsgICAgICAgIAkKICAgICAgICAgfQogCi0gICAgICAgIC8qCisgICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7CisKKyAgICAgICAvKgogICAgICAgICAgKiBFY2xpcHNlIGNvbXBpbGVyIGRvZXNuJ3Qgc3VwcG9ydCAtZXh0ZGlycy4KICAgICAgICAgICogSXQgaXMgZW11bGF0ZWQgdXNpbmcgdGhlIGNsYXNzcGF0aC4gV2UgYWRkIGV4dGRpcnMgZW50cmllcyBhZnRlciB0aGUgCiAgICAgICAgICAqIGJvb3RjbGFzc3BhdGguCkBAIC05OSwzMCArMTExLDEwOSBAQAogCQlpbmNsdWRlSmF2YVJ1bnRpbWUgPSBmYWxzZTsKICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChnZXRDb21waWxlQ2xhc3NwYXRoKCkpOwogCisgICAgICAgIC8vIEZvciAtc291cmNlcGF0aCwgdXNlIHRoZSAic291cmNlcGF0aCIgdmFsdWUgaWYgcHJlc2VudC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlICJzcmNkaXIiIHZhbHVlLgorICAgICAgICBQYXRoIHNvdXJjZXBhdGggPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gcmV0cmlldmUgdGhlIG1ldGhvZCBnZXRTb3VyY2VwYXRoKCkgdXNpbmcgcmVmbGVjdAorICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gaW1wcm92ZSB0aGUgY29tcGF0aWJpbGl0eSB0byBhbnQgMS41CisgICAgICAgIENsYXNzIGphdmFjQ2xhc3MgPSBKYXZhYy5jbGFzczsKKyAgICAgICAgTWV0aG9kIGdldFNvdXJjZXBhdGhNZXRob2QgPSBudWxsOworICAgICAgICB0cnkgeworCSAgICAgICAgZ2V0U291cmNlcGF0aE1ldGhvZCA9IGphdmFjQ2xhc3MuZ2V0TWV0aG9kKCJnZXRTb3VyY2VwYXRoIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfSBjYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIFBhdGggY29tcGlsZVNvdXJjZXBhdGggPSBudWxsOworICAgICAgICBpZiAoZ2V0U291cmNlcGF0aE1ldGhvZCAhPSBudWxsKSB7CisJIAkJdHJ5IHsKKwkJCQljb21waWxlU291cmNlcGF0aCA9IChQYXRoKSBnZXRTb3VyY2VwYXRoTWV0aG9kLmludm9rZShhdHRyaWJ1dGVzLCBudWxsKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQl9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZXBhdGggPSBjb21waWxlU291cmNlcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvdXJjZXBhdGggPSBzcmM7CisgICAgICAgIH0KKwkJY2xhc3NwYXRoLmFwcGVuZChzb3VyY2VwYXRoKTsKIAkJLyoKIAkJICogU2V0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBFY2xpcHNlIGNvbXBpbGVyLgogCQkgKi8KIAkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAogCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNsYXNzcGF0aCk7CiAKKyAgICAgICAgU3RyaW5nIG1lbW9yeVBhcmFtZXRlclByZWZpeCA9IEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpLmVxdWFscyhKYXZhRW52VXRpbHMuSkFWQV8xXzEpID8gIi1KLSIgOiAiLUotWCI7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKyAgICAgICAgaWYgKG1lbW9yeUluaXRpYWxTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZyhVdGlsLmJpbmQoImFudC5qZHRhZGFwdGVyLmVycm9yLmlnbm9yaW5nTWVtb3J5SW5pdGlhbFNpemUiKSwgUHJvamVjdC5NU0dfV0FSTik7Ly8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShtZW1vcnlQYXJhbWV0ZXJQcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcyIgKyBtZW1vcnlJbml0aWFsU2l6ZSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuaXNGb3JrZWRKYXZhYygpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coVXRpbC5iaW5kKCJhbnQuamR0YWRhcHRlci5lcnJvci5pZ25vcmluZ01lbW9yeU1heGltdW1TaXplIiksIFByb2plY3QuTVNHX1dBUk4pOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobWVtb3J5UGFyYW1ldGVyUHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXgiICsgbWVtb3J5TWF4aW11bVNpemUpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVidWcpIHsKKwkgICAgICAgLy8gcmV0cmlldmUgdGhlIG1ldGhvZCBnZXRTb3VyY2VwYXRoKCkgdXNpbmcgcmVmbGVjdAorCSAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIGltcHJvdmUgdGhlIGNvbXBhdGliaWxpdHkgdG8gYW50IDEuNQorCSAgICAgICAgTWV0aG9kIGdldERlYnVnTGV2ZWxNZXRob2QgPSBudWxsOworCSAgICAgICAgdHJ5IHsKKwkJICAgICAgICBnZXREZWJ1Z0xldmVsTWV0aG9kID0gamF2YWNDbGFzcy5nZXRNZXRob2QoImdldERlYnVnTGV2ZWwiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCSAgICAgICAgfSBjYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworCSAgICAgICAgfQorICAgICAJICAgIFN0cmluZyBkZWJ1Z0xldmVsID0gbnVsbDsKKwkgICAgICAgIGlmIChnZXREZWJ1Z0xldmVsTWV0aG9kICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlkZWJ1Z0xldmVsID0gKFN0cmluZykgZ2V0RGVidWdMZXZlbE1ldGhvZC5pbnZva2UoYXR0cmlidXRlcywgbnVsbCk7CisJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorICAgICAgICAJfQorCQkJaWYgKGRlYnVnTGV2ZWwgIT0gbnVsbCkgeworCQkJCWlmIChkZWJ1Z0xldmVsLmxlbmd0aCgpID09IDApIHsKKwkJCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nOm5vbmUiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZzoiICsgZGVidWdMZXZlbCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWc6bm9uZSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgCiAJCS8qCiAJCSAqIEhhbmRsZSB0aGUgbm93YXJuIG9wdGlvbi4gSWYgbm9uZSwgdGhlbiB3ZSBnZW5lcmF0ZSBhbGwgd2FybmluZ3MuCiAJCSAqLwkJCiAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldE5vd2FybigpKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vd2FybiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZGVwcmVjYXRpb24pIHsKKwkJCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXdhcm46YWxsRGVwcmVjYXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vd2FybiIpOyAvLyROT04tTkxTLTEkCisJCQl9CiAgICAgICAgIH0gZWxzZSB7Ci0JCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgKLQkJCQkiLXdhcm46Y29uc3RydWN0b3JOYW1lLHBhY2thZ2VEZWZhdWx0TWV0aG9kLG1hc2tlZENhdGNoQmxvY2tzLGRlcHJlY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCS8qCisJCQkgKiBkZXByZWNhdGlvbiBvcHRpb24uCisJCQkgKi8JCQorCQkJaWYgKGRlcHJlY2F0aW9uKSB7CisJCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoCisJCQkJCSItd2FybjphbGxEZXByZWNhdGlvbixjb25zdHJ1Y3Rvck5hbWUscGFja2FnZURlZmF1bHRNZXRob2QsbWFza2VkQ2F0Y2hCbG9ja3MsdW51c2VkSW1wb3J0cyxzdGF0aWNSZWNlaXZlciIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKAorCQkJCQkiLXdhcm46Y29uc3RydWN0b3JOYW1lLHBhY2thZ2VEZWZhdWx0TWV0aG9kLG1hc2tlZENhdGNoQmxvY2tzLHVudXNlZEltcG9ydHMsc3RhdGljUmVjZWl2ZXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogICAgICAgICB9CiAKIAkJLyoKLQkJICogZGVwcmVjYXRpb24gb3B0aW9uLgotCQkgKi8JCQotCQlpZiAoZGVwcmVjYXRpb24pIHsKLQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVwcmVjYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKIAkJICogZGVzdERpciBvcHRpb24uCiAJCSAqLwkJCiAJCWlmIChkZXN0RGlyICE9IG51bGwpIHsKQEAgLTEzOSwxMyArMjMwLDYgQEAKIAkJfQogCiAJCS8qCi0JCSAqIGRlYnVnIG9wdGlvbgotCQkgKi8KLQkJaWYgKGRlYnVnKSB7Ci0JCQljbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKIAkJICogdmVyYm9zZSBvcHRpb24KIAkJICovCiAJCWlmICh2ZXJib3NlKSB7CkBAIC0xNTQsNyArMjM4LDggQEAKIAkJCSAqIGV4dHJhIG9wdGlvbiBhbGxvd2VkIGJ5IHRoZSBFY2xpcHNlIGNvbXBpbGVyCiAJCQkgKi8KIAkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkCisJCQlsb2dGaWxlTmFtZSA9IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmxvZyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxvZ0ZpbGVOYW1lKTsKIAkJfQogCiAJCS8qCkBAIC0xNjUsMTYgKzI1MCw2IEBACiAJCX0KIAogCQkvKgotCQkgKiBleHRyYSBvcHRpb24gYWxsb3dlZCBieSB0aGUgRWNsaXBzZSBjb21waWxlcgotCQkgKi8KLQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10aW1lIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvKgotCQkgKiBleHRyYSBvcHRpb24gYWxsb3dlZCBieSB0aGUgRWNsaXBzZSBjb21waWxlcgotCQkgKi8KLQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ub0ltcG9ydEVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvKgogCQkgKiBzb3VyY2Ugb3B0aW9uCiAJCSAqLwogCQlTdHJpbmcgc291cmNlID0gYXR0cmlidXRlcy5nZXRTb3VyY2UoKTsKQEAgLTE4Miw3ICsyNTcsMTcgQEAKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHNvdXJjZSk7CiAgICAgICAgIH0KLQorICAgICAgICAKKwkJaWYgKEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpLmVxdWFscyhKYXZhRW52VXRpbHMuSkFWQV8xXzQpKSB7CisJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVxdWFscygiMS4xIikpIHsJCQkgICAvLyROT04tTkxTLTEkCQorCQkJCWNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItMS4zIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0xLjQiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGVsc2UgeworCQkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0xLjMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQogCQkvKgogCQkgKiBlbmNvZGluZyBvcHRpb24KIAkJICovCkBAIC0xOTIsNiArMjc3LDExIEBACiAgICAgICAgIH0KIAogCQkvKgorCQkgKiBleHRyYSBvcHRpb24gYWxsb3dlZCBieSB0aGUgRWNsaXBzZSBjb21waWxlcgorCQkgKi8KKwkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10aW1lIik7IC8vJE5PTi1OTFMtMSQKKworCQkvKgogCQkgKiBFY2xpcHNlIGNvbXBpbGVyIGRvZXNuJ3QgaGF2ZSBhIC1zb3VyY2VwYXRoIG9wdGlvbi4gVGhpcyBpcwogCQkgKiBoYW5kbGVkIHRocm91Z2ggdGhlIGphdmFjIHRhc2sgdGhhdCBjb2xsZWN0cyBhbGwgc291cmNlIGZpbGVzIGluCiAJCSAqIHNyY2RpciBvcHRpb24uCkBAIC0yMjgsNCArMzE4LDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKaW5kZXggODczZWI3Ni4uYWQyYWU2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTExNCw0ICsxMTQsNCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlyZXR1cm4gIkNsYXNzcGF0aERpcmVjdG9yeSAiICsgcGF0aDsgLy8kTk9OLU5MUy0xJAogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhKYXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9DbGFzc3BhdGhKYXIuamF2YQppbmRleCBlZTZiZmQ2Li41MDA5Y2M0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ2xhc3NwYXRoSmFyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NsYXNzcGF0aEphci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzUsNyArMzUsOCBAQAogCXRoaXMuY2xvc2VaaXBGaWxlQXRFbmQgPSBjbG9zZVppcEZpbGVBdEVuZDsKIH0JCiBwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhjaGFyW10gdHlwZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKSB7Ci0JaWYgKCFpc1BhY2thZ2UocXVhbGlmaWVkUGFja2FnZU5hbWUpKSByZXR1cm4gbnVsbDsgLy8gbW9zdCBjb21tb24gY2FzZQorCWlmICghaXNQYWNrYWdlKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkgCisJCXJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCiAKIAl0cnkgewogCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoemlwRmlsZSwgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpOwpAQCAtNzMsNiArNzQsNiBAQAogCXRoaXMucGFja2FnZUNhY2hlID0gbnVsbDsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJDbGFzc3BhdGggZm9yIGphciBmaWxlICIgKyB6aXBGaWxlOyAvLyROT04tTkxTLTEkCisJcmV0dXJuICJDbGFzc3BhdGggZm9yIGphciBmaWxlICIgKyB6aXBGaWxlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9Db21waWxhdGlvblVuaXQuamF2YQppbmRleCBhNmFjNzgzLi5lMGU4Mzk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDE4ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCkBAIC01Niw3ICs1Nyw3IEBACiAJCXJldHVybiBVdGlsLmdldEZpbGVDaGFyQ29udGVudChuZXcgRmlsZShuZXcgU3RyaW5nKGZpbGVOYW1lKSksIGVuY29kaW5nKTsKIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJfQotCXJldHVybiBuZXcgY2hhclswXTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogfQogcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKIAlyZXR1cm4gZmlsZU5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVGaW5kZXIuamF2YQppbmRleCBiMzllOTdjLi41ZWQ0MDI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZUZpbmRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlRmluZGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL0ZpbGVTeXN0ZW0uamF2YQppbmRleCA2MzhmMmVhLi5kMjYzNzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvRmlsZVN5c3RlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9GaWxlU3lzdGVtLmphdmEKQEAgLTEsMjIgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgRmlsZVN5c3RlbSBpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnQgIHsKIAlDbGFzc3BhdGhbXSBjbGFzc3BhdGhzOwpAQCAtMTY2LDQgKzE2Niw0IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL01haW4uamF2YQppbmRleCA0N2ZhZTkwLi5kNGNlYThkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9iYXRjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYmF0Y2gvTWFpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9NYWluLmphdmEKQEAgLTEsMjEgKzEsMjQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2g7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwpAQCAtMjUsNiArMjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKQEAgLTM5LDE0ICs0MywxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBjbGFzcyBNYWluIGltcGxlbWVudHMgUHJvYmxlbVNldmVyaXRpZXMgewogCiAJcHVibGljIGJvb2xlYW4gbm9XYXJuID0gZmFsc2U7CiAKIAlwdWJsaWMgUHJpbnRXcml0ZXIgb3V0OworCXB1YmxpYyBQcmludFdyaXRlciBlcnI7CQogCXB1YmxpYyBib29sZWFuIHN5c3RlbUV4aXRXaGVuRmluaXNoZWQgPSB0cnVlOwogCXB1YmxpYyBib29sZWFuIHByb2NlZWRPbkVycm9yID0gZmFsc2U7CiAKQEAgLTU4LDcgKzYzLDcgQEAKIAlwdWJsaWMgbG9uZyBsaW5lQ291bnQ7CiAJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVQYWNrYWdlc1N0cnVjdHVyZTsKIAotCXB1YmxpYyBIYXNodGFibGUgb3B0aW9uczsKKwlwdWJsaWMgTWFwIG9wdGlvbnM7CiAJcHVibGljIFN0cmluZ1tdIGZpbGVuYW1lczsKIAlwdWJsaWMgU3RyaW5nW10gZW5jb2RpbmdzOwogCXB1YmxpYyBTdHJpbmdbXSBjbGFzc3BhdGhzOwpAQCAtODUsNjAgKzkwLDEzIEBACiAKIAlwdWJsaWMgYm9vbGVhbiBwcm9jZWVkID0gdHJ1ZTsKIAotCXB1YmxpYyBNYWluKFByaW50V3JpdGVyIHdyaXRlciwgYm9vbGVhbiBzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkKSB7CisJcHVibGljIE1haW4oUHJpbnRXcml0ZXIgb3V0V3JpdGVyLCBQcmludFdyaXRlciBlcnJXcml0ZXIsIGJvb2xlYW4gc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgewogCi0JCXRoaXMub3V0ID0gd3JpdGVyOworCQl0aGlzLm91dCA9IG91dFdyaXRlcjsKKwkJdGhpcy5lcnIgPSBlcnJXcml0ZXI7CiAJCXRoaXMuc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCA9IHN5c3RlbUV4aXRXaGVuRmluaXNoZWQ7CiAJCWV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIgPSAwOwotCQlvcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTGluZU51bWJlckF0dHJpYnV0ZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUHJlc2VydmVVbnVzZWRMb2NhbCwKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJTUlaRV9PVVQpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW5yZWFjaGFibGVDb2RlLAotCQkJQ29tcGlsZXJPcHRpb25zLkVSUk9SKTsKLQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSW1wb3J0LCBDb21waWxlck9wdGlvbnMuRVJST1IpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0T3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kLAotCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaywKLQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRMb2NhbCwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCW9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsCi0JCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJb3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiwKLQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKLQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwKLQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7Ci0JCW9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsCi0JCQlDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOwotCQlvcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCi0JCQlDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzEpOworCQl0aGlzLm9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogCX0KIAogCS8qCkBAIC0xNTEsNyArMTA5LDcgQEAKIAkJCWNvbmZpZ3VyZShhcmd2KTsKIAkJCWlmIChwcm9jZWVkKSB7CiAJCQkJaWYgKHNob3dQcm9ncmVzcykKLQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgicHJvZ3Jlc3MuY29tcGlsaW5nIikpOyAvLyROT04tTkxTLTEkCisJCQkJCW91dC5wcmludGxuKE1haW4uYmluZCgicHJvZ3Jlc3MuY29tcGlsaW5nIikpOyAvLyROT04tTkxTLTEkCiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKSB7CiAJCQkJCWdsb2JhbFByb2JsZW1zQ291bnQgPSAwOwogCQkJCQlnbG9iYWxFcnJvcnNDb3VudCA9IDA7CkBAIC0xODYsMzkgKzE0NCwzOSBAQAogCQkJCQl9CiAJCQkJCWlmIChnbG9iYWxQcm9ibGVtc0NvdW50ID4gMCkgewogCQkJCQkJaWYgKGdsb2JhbFByb2JsZW1zQ291bnQgPT0gMSkgewotCQkJCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUub25lUHJvYmxlbSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWVyci5wcmludChNYWluLmJpbmQoImNvbXBpbGUub25lUHJvYmxlbSIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlvdXQucHJpbnQoCisJCQkJCQkJZXJyLnByaW50KAogCQkJCQkJCQlNYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbFByb2JsZW1zIiwgU3RyaW5nLnZhbHVlT2YoZ2xvYmFsUHJvYmxlbXNDb3VudCkpKTsgCS8vJE5PTi1OTFMtMSQKIAkJCQkJCX0KLQkJCQkJCW91dC5wcmludCgiICgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZXJyLnByaW50KCIgKCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAoZ2xvYmFsRXJyb3JzQ291bnQgPiAwKSB7CiAJCQkJCQkJaWYgKGdsb2JhbEVycm9yc0NvdW50ID09IDEpIHsKLQkJCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVFcnJvciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQllcnIucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLm9uZUVycm9yIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJb3V0LnByaW50KAorCQkJCQkJCQllcnIucHJpbnQoCiAJCQkJCQkJCQlNYWluLmJpbmQoImNvbXBpbGUuc2V2ZXJhbEVycm9ycyIsIFN0cmluZy52YWx1ZU9mKGdsb2JhbEVycm9yc0NvdW50KSkpOyAJLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWlmIChnbG9iYWxXYXJuaW5nc0NvdW50ID4gMCkgewogCQkJCQkJCWlmIChnbG9iYWxFcnJvcnNDb3VudCA+IDApIHsKLQkJCQkJCQkJb3V0LnByaW50KCIsICIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCWVyci5wcmludCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCQlpZiAoZ2xvYmFsV2FybmluZ3NDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCW91dC5wcmludChNYWluLmJpbmQoImNvbXBpbGUub25lV2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQllcnIucHJpbnQoTWFpbi5iaW5kKCJjb21waWxlLm9uZVdhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlvdXQucHJpbnQoCisJCQkJCQkJCWVyci5wcmludCgKIAkJCQkJCQkJCU1haW4uYmluZCgiY29tcGlsZS5zZXZlcmFsV2FybmluZ3MiLCBTdHJpbmcudmFsdWVPZihnbG9iYWxXYXJuaW5nc0NvdW50KSkpOyAJLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJCW91dC5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWVyci5wcmludGxuKCIpIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQlpZiAoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciAhPSAwCiAJCQkJCQkmJiAodGhpcy5zaG93UHJvZ3Jlc3MgfHwgdGhpcy50aW1lciB8fCB0aGlzLnZlcmJvc2UpKSB7CiAJCQkJCQlpZiAoZXhwb3J0ZWRDbGFzc0ZpbGVzQ291bnRlciA9PSAxKSB7Ci0JCQkJCQkJb3V0LnByaW50KE1haW4uYmluZCgiY29tcGlsZS5vbmVDbGFzc0ZpbGVHZW5lcmF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbXBpbGUub25lQ2xhc3NGaWxlR2VuZXJhdGVkIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCW91dC5wcmludCgKKwkJCQkJCQlvdXQucHJpbnRsbigKIAkJCQkJCQkJTWFpbi5iaW5kKAogCQkJCQkJCQkJImNvbXBpbGUuc2V2ZXJhbENsYXNzRmlsZXNHZW5lcmF0ZWQiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQlTdHJpbmcudmFsdWVPZihleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyKSkpOwpAQCAtMjI2LDE1ICsxODQsMTYgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAoc2hvd1Byb2dyZXNzKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCQkJb3V0LnByaW50bG4oKTsKIAkJCX0KIAkJCWlmIChzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkKSB7CiAJCQkJb3V0LmZsdXNoKCk7CisJCQkJZXJyLmZsdXNoKCk7CiAJCQkJU3lzdGVtLmV4aXQoZ2xvYmFsRXJyb3JzQ291bnQgPiAwID8gLTEgOiAwKTsKIAkJCX0KIAkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJCW91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCW91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJZXJyLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCiAJCQlwcmludFVzYWdlKCk7CiAJCQlpZiAoc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgewogCQkJCVN5c3RlbS5leGl0KC0xKTsKQEAgLTI0NCwxNiArMjAzLDE4IEBACiAJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7IC8vIGludGVybmFsIGNvbXBpbGVyIGVycm9yCiAJCQlpZiAoc3lzdGVtRXhpdFdoZW5GaW5pc2hlZCkgewogCQkJCW91dC5mbHVzaCgpOworCQkJCWVyci5mbHVzaCgpOwogCQkJCWlmICh0aGlzLmxvZyAhPSBudWxsKSB7Ci0JCQkJCW91dC5jbG9zZSgpOworCQkJCQllcnIuY2xvc2UoKTsKIAkJCQl9CiAJCQkJU3lzdGVtLmV4aXQoLTEpOwogCQkJfQogCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOwogCQl9IGZpbmFsbHkgewogCQkJb3V0LmZsdXNoKCk7CisJCQllcnIuZmx1c2goKTsKIAkJCWlmICh0aGlzLmxvZyAhPSBudWxsKSB7Ci0JCQkJb3V0LmNsb3NlKCk7CisJCQkJZXJyLmNsb3NlKCk7CiAJCQl9CiAJCX0KIAkJaWYgKGdsb2JhbEVycm9yc0NvdW50ID09IDApewpAQCAtMjY4LDE1ICsyMjksMTUgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShTdHJpbmcgY29tbWFuZExpbmUpIHsKIAotCQlyZXR1cm4gY29tcGlsZShjb21tYW5kTGluZSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpKTsKKwkJcmV0dXJuIGNvbXBpbGUoY29tbWFuZExpbmUsIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpKTsKIAl9CiAKIAkvKgogCSAqIEludGVybmFsIElERSBBUEkgZm9yIHRlc3QgaGFybmVzcyBwdXJwb3NlCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBpbGUoU3RyaW5nIGNvbW1hbmRMaW5lLCBQcmludFdyaXRlciB3cml0ZXIpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShTdHJpbmcgY29tbWFuZExpbmUsIFByaW50V3JpdGVyIG91dFdyaXRlciwgUHJpbnRXcml0ZXIgZXJyV3JpdGVyKSB7CiAKLQkJcmV0dXJuIG5ldyBNYWluKHdyaXRlciwgZmFsc2UpLmNvbXBpbGUodG9rZW5pemUoY29tbWFuZExpbmUpKTsKKwkJcmV0dXJuIG5ldyBNYWluKG91dFdyaXRlciwgZXJyV3JpdGVyLCBmYWxzZSkuY29tcGlsZSh0b2tlbml6ZShjb21tYW5kTGluZSkpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemUoU3RyaW5nIGNvbW1hbmRMaW5lKSB7CkBAIC0yODQsNyArMjQ1LDcgQEAKIAkJaW50IGNvdW50ID0gMDsKIAkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1sxMF07CiAJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1hbmRMaW5lLCAiIFwiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRva2VuID0gIiIsIGxhc3RUb2tlbjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgdG9rZW4gPSAiIjsgLy8kTk9OLU5MUy0xJAogCQlib29sZWFuIGluc2lkZVF1b3RlcyA9IGZhbHNlOwogCQlib29sZWFuIHN0YXJ0TmV3VG9rZW4gPSB0cnVlOwogCkBAIC0yOTQsNyArMjU1LDYgQEAKIAkJLy8gJ3h4eCAiYWFhIGJiYiI7ImNjYyIgeXl5JyAtLS0+ICB7Inh4eCIsICJhYWEgYmJiO2NjYyIsICJ5eXkiIH0KIAkJLy8gJ3h4eC8iYWFhIGJiYiI7ImNjYyIgeXl5JyAtLS0+ICB7Inh4eC9hYWEgYmJiO2NjYyIsICJ5eXkiIH0KIAkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxhc3RUb2tlbiA9IHRva2VuOwogCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CiAKIAkJCWlmICh0b2tlbi5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCkBAIC0zMjEsNyArMjgxLDEwIEBACiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoY291bnQgPT0gYXJndW1lbnRzLmxlbmd0aCkKIAkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgKGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbY291bnQgKiAyXSksIDAsIGNvdW50KTsKLQkJCQkJCWFyZ3VtZW50c1tjb3VudCsrXSA9IHRva2VuOworCQkJCQkJU3RyaW5nIHRyaW1tZWRUb2tlbiA9IHRva2VuLnRyaW0oKTsKKwkJCQkJCWlmICh0cmltbWVkVG9rZW4ubGVuZ3RoKCkgIT0gMCkgeworCQkJCQkJCWFyZ3VtZW50c1tjb3VudCsrXSA9IHRyaW1tZWRUb2tlbjsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQlzdGFydE5ld1Rva2VuID0gZmFsc2U7CkBAIC0zMzYsOCArMjk5LDEwIEBACiAJICovCiAJcHVibGljIHZvaWQgY29uZmlndXJlKFN0cmluZ1tdIGFyZ3YpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkKLQkJaWYgKChhcmd2ID09IG51bGwpIHx8IChhcmd2Lmxlbmd0aCA9PSAwKSkKLQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUubm9Tb3VyY2VGaWxlIikpOyAvLyROT04tTkxTLTEkCisJCWlmICgoYXJndiA9PSBudWxsKSB8fCAoYXJndi5sZW5ndGggPT0gMCkpIHsKKwkJCXByaW50VXNhZ2UoKTsKKwkJCXJldHVybjsKKwkJfQogCQlmaW5hbCBpbnQgSW5zaWRlQ2xhc3NwYXRoID0gMTsKIAkJZmluYWwgaW50IEluc2lkZURlc3RpbmF0aW9uUGF0aCA9IDI7CiAJCWZpbmFsIGludCBUYXJnZXRTZXR0aW5nID0gNDsKQEAgLTM0NSwxMSArMzEwLDEyIEBACiAJCWZpbmFsIGludCBJbnNpZGVSZXBldGl0aW9uID0gMTY7CiAJCWZpbmFsIGludCBJbnNpZGVTb3VyY2UgPSAzMjsKIAkJZmluYWwgaW50IEluc2lkZURlZmF1bHRFbmNvZGluZyA9IDY0OworCQlmaW5hbCBpbnQgSW5zaWRlQm9vdENsYXNzcGF0aCA9IDEyODsKIAkJZmluYWwgaW50IERlZmF1bHQgPSAwOworCQlTdHJpbmdbXSBib290Y2xhc3NwYXRocyA9IG51bGw7CiAJCWludCBERUZBVUxUX1NJWkVfQ0xBU1NQQVRIID0gNDsKLQkJYm9vbGVhbiB3YXJuT3B0aW9uSW5Vc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBub1dhcm5PcHRpb25JblVzZSA9IGZhbHNlOwogCQlpbnQgcGF0aENvdW50ID0gMDsKKwkJaW50IGJvb3RjbGFzc3BhdGhDb3VudCA9IDA7CiAJCWludCBpbmRleCA9IC0xLCBmaWxlc0NvdW50ID0gMCwgYXJnQ291bnQgPSBhcmd2Lmxlbmd0aDsKIAkJaW50IG1vZGUgPSBEZWZhdWx0OwogCQlyZXBldGl0aW9ucyA9IDA7CkBAIC0zNTcsMTMgKzMyMyw2MCBAQAogCQlib29sZWFuIHByaW50VXNhZ2VSZXF1aXJlZCA9IGZhbHNlOwogCiAJCWJvb2xlYW4gZGlkU3BlY2lmeUNvbXBsaWFuY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBkaWRTcGVjaWZ5U291cmNlTGV2ZWwgPSBmYWxzZTsKIAkJYm9vbGVhbiBkaWRTcGVjaWZ5RGVmYXVsdEVuY29kaW5nID0gZmFsc2U7CiAJCWJvb2xlYW4gZGlkU3BlY2lmeVRhcmdldCA9IGZhbHNlOwogCiAJCVN0cmluZyBjdXN0b21FbmNvZGluZyA9IG51bGw7CiAJCVN0cmluZyBjdXJyZW50QXJnID0gIiI7IC8vJE5PTi1OTFMtMSQKIAorCQkvLyBleHBhbmQgdGhlIGNvbW1hbmQgbGluZSBpZiBuZWNlc3NhcnkKKwkJYm9vbGVhbiBuZWVkRXhwYW5zaW9uID0gZmFsc2U7CisJCWxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgeworCQkJCWlmIChhcmd2W2ldLnN0YXJ0c1dpdGgoIkAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW5lZWRFeHBhbnNpb24gPSB0cnVlOworCQkJCQlicmVhayBsb29wOworCQkJCX0KKwkJfQorCisJCVN0cmluZ1tdIG5ld0NvbW1hbmRMaW5lQXJncyA9IG51bGw7CisJCWlmIChuZWVkRXhwYW5zaW9uKSB7CisJCQluZXdDb21tYW5kTGluZUFyZ3MgPSBuZXcgU3RyaW5nW2FyZ0NvdW50XTsKKwkJCWluZGV4ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgeworCQkJCVN0cmluZ1tdIG5ld0FyZ3MgPSBudWxsOworCQkJCVN0cmluZyBhcmcgPSBhcmd2W2ldLnRyaW0oKTsKKwkJCQlpZiAoYXJnLnN0YXJ0c1dpdGgoIkAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXRyeSB7CisJCQkJCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZyhVdGlsLmdldEZpbGVDaGFyQ29udGVudChuZXcgRmlsZShhcmcuc3Vic3RyaW5nKDEpKSwgbnVsbCkpKSk7CisJCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQkJU3RyaW5nIGxpbmU7CisJCQkJCQl3aGlsZSgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJCQkJYnVmZmVyLmFwcGVuZChsaW5lKS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJbmV3QXJncyA9IHRva2VuaXplKGJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKAorCQkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWRleHBhbnNpb25hcmd1bWVudG5hbWUiLCBhcmcpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJCWlmIChuZXdBcmdzICE9IG51bGwpIHsKKwkJCQkJaW50IG5ld0NvbW1hbmRMaW5lQXJnc0xlbmd0aCA9IG5ld0NvbW1hbmRMaW5lQXJncy5sZW5ndGg7CisJCQkJCWludCBuZXdBcmdzTGVuZ3RoID0gbmV3QXJncy5sZW5ndGg7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3Q29tbWFuZExpbmVBcmdzLCAwLCAobmV3Q29tbWFuZExpbmVBcmdzID0gbmV3IFN0cmluZ1tuZXdDb21tYW5kTGluZUFyZ3NMZW5ndGggKyBuZXdBcmdzTGVuZ3RoIC0gMV0pLCAwLCBpbmRleCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3QXJncywgMCwgbmV3Q29tbWFuZExpbmVBcmdzLCBpbmRleCwgbmV3QXJnc0xlbmd0aCk7CisJCQkJCWluZGV4ICs9IG5ld0FyZ3NMZW5ndGg7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3Q29tbWFuZExpbmVBcmdzW2luZGV4KytdID0gYXJnOworCQkJCX0KKwkJCX0KKwkJCWluZGV4ID0gLTE7CisJCX0gZWxzZSB7CisJCQluZXdDb21tYW5kTGluZUFyZ3MgPSBhcmd2OworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7CisJCQkJbmV3Q29tbWFuZExpbmVBcmdzW2ldID0gbmV3Q29tbWFuZExpbmVBcmdzW2ldLnRyaW0oKTsKKwkJCX0KKwkJfQorCQlhcmdDb3VudCA9IG5ld0NvbW1hbmRMaW5lQXJncy5sZW5ndGg7CiAJCXdoaWxlICgrK2luZGV4IDwgYXJnQ291bnQpIHsKIAogCQkJaWYgKGN1c3RvbUVuY29kaW5nICE9IG51bGwpIHsKQEAgLTM3MSw3ICszODQsNyBAQAogCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS51bmV4cGVjdGVkQ3VzdG9tRW5jb2RpbmciLCBjdXJyZW50QXJnLCBjdXN0b21FbmNvZGluZykpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAKLQkJCWN1cnJlbnRBcmcgPSBhcmd2W2luZGV4XS50cmltKCk7CisJCQljdXJyZW50QXJnID0gbmV3Q29tbWFuZExpbmVBcmdzW2luZGV4XTsKIAogCQkJY3VzdG9tRW5jb2RpbmcgPSBudWxsOwogCQkJaWYgKGN1cnJlbnRBcmcuZW5kc1dpdGgoIl0iKSkgeyAvLyROT04tTkxTLTEkIApAQCAtNDMzLDcgKzQ0Niw2IEBACiAJCQl9CiAJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1zb3VyY2UiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJbW9kZSA9IEluc2lkZVNvdXJjZTsKLQkJCQlkaWRTcGVjaWZ5U291cmNlTGV2ZWwgPSB0cnVlOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItZW5jb2RpbmciKSkgeyAvLyROT04tTkxTLTEkCkBAIC00NzAsMTMgKzQ4MiwyMCBAQAogCQkJfQogCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItY2xhc3NwYXRoIikgLy8kTk9OLU5MUy0xJAogCQkJCXx8IGN1cnJlbnRBcmcuZXF1YWxzKCItY3AiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAocGF0aENvdW50ID4gMCkKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKLQkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUNsYXNzcGF0aCIsIGN1cnJlbnRBcmcpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNsYXNzcGF0aHMgPSBuZXcgU3RyaW5nW0RFRkFVTFRfU0laRV9DTEFTU1BBVEhdOworCQkJCWlmIChwYXRoQ291bnQgPT0gMCkgeworCQkJCQljbGFzc3BhdGhzID0gbmV3IFN0cmluZ1tERUZBVUxUX1NJWkVfQ0xBU1NQQVRIXTsKKwkJCQl9CiAJCQkJbW9kZSA9IEluc2lkZUNsYXNzcGF0aDsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmIChjdXJyZW50QXJnLmVxdWFscygiLWJvb3RjbGFzc3BhdGgiKSkgey8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoYm9vdGNsYXNzcGF0aENvdW50ID4gMCkKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKKwkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZUJvb3RDbGFzc3BhdGgiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlib290Y2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbREVGQVVMVF9TSVpFX0NMQVNTUEFUSF07CisJCQkJbW9kZSA9IEluc2lkZUJvb3RDbGFzc3BhdGg7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAoY3VycmVudEFyZy5lcXVhbHMoIi1wcm9ncmVzcyIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQltb2RlID0gRGVmYXVsdDsKIAkJCQlzaG93UHJvZ3Jlc3MgPSB0cnVlOwpAQCAtNDk4LDEwICs1MTcsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKCItZGVwcmVjYXRpb24iLmVxdWFscyhjdXJyZW50QXJnKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd2Fybk9wdGlvbkluVXNlID0gdHJ1ZTsKLQkJCQlpZiAobm9XYXJuT3B0aW9uSW5Vc2UpCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCi0JCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVXYXJuaW5nQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkKIAkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCBDb21waWxlck9wdGlvbnMuV0FSTklORyk7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC01NzgsNyArNTkzLDYgQEAKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKIAkJCQkJCQkJTWFpbi5iaW5kKCJjb25maWd1cmUuaW52YWxpZERlYnVnT3B0aW9uIiwgZGVidWdPcHRpb24pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vJE5PTi1OTFMtMSQKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQljb250aW51ZTsKQEAgLTU4NywyNCArNjAxLDM2IEBACiAJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmludmFsaWREZWJ1Z09wdGlvbiIsIGRlYnVnT3B0aW9uKSk7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJCWlmIChjdXJyZW50QXJnLnN0YXJ0c1dpdGgoIi1ub3dhcm4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbm9XYXJuT3B0aW9uSW5Vc2UgPSB0cnVlOwotCQkJCW5vV2FybiA9IHRydWU7Ci0JCQkJaWYgKHdhcm5PcHRpb25JblVzZSkKLQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigKLQkJCQkJCU1haW4uYmluZCgiY29uZmlndXJlLmR1cGxpY2F0ZVdhcm5pbmdDb25maWd1cmF0aW9uIikpOyAvLyROT04tTkxTLTEkCisJCQkJT2JqZWN0W10gZW50cmllcyA9IG9wdGlvbnMuZW50cnlTZXQoKS50b0FycmF5KCk7CisJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllc1tpXTsKKwkJCQkJaWYgKCEoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBTdHJpbmcpKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICghKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICgoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKSkgeworCQkJCQkJb3B0aW9ucy5wdXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIENvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQkJCQl9CisJCQkJfQogCQkJCW1vZGUgPSBEZWZhdWx0OwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKGN1cnJlbnRBcmcuc3RhcnRzV2l0aCgiLXdhcm4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd2Fybk9wdGlvbkluVXNlID0gdHJ1ZTsKLQkJCQlpZiAobm9XYXJuT3B0aW9uSW5Vc2UpCi0JCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oCi0JCQkJCQlNYWluLmJpbmQoImNvbmZpZ3VyZS5kdXBsaWNhdGVXYXJuaW5nQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCW1vZGUgPSBEZWZhdWx0OwogCQkJCVN0cmluZyB3YXJuaW5nT3B0aW9uID0gY3VycmVudEFyZzsKIAkJCQlpbnQgbGVuZ3RoID0gY3VycmVudEFyZy5sZW5ndGgoKTsKIAkJCQlpZiAobGVuZ3RoID09IDEwICYmIHdhcm5pbmdPcHRpb24uZXF1YWxzKCItd2Fybjpub25lIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlub1dhcm4gPSB0cnVlOworCQkJCQlPYmplY3RbXSBlbnRyaWVzID0gb3B0aW9ucy5lbnRyeVNldCgpLnRvQXJyYXkoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVudHJpZXNbaV07CisJCQkJCQlpZiAoIShlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFN0cmluZykpCisJCQkJCQkJY29udGludWU7CisJCQkJCQlpZiAoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCWlmICgoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKSkgeworCQkJCQkJCW9wdGlvbnMucHV0KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJaWYgKGxlbmd0aCA8IDYpCkBAIC02NDQsNiArNjcwLDI0IEBACiAJCQkJb3B0aW9ucy5wdXQoCiAJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0LAogCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTdGF0aWNBY2Nlc3NSZWNlaXZlciwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQkJb3B0aW9ucy5wdXQoCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9FZmZlY3RBc3NpZ25tZW50LAorCQkJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJCQlvcHRpb25zLnB1dCgKKwkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CQkJCQorCQkJCW9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCwKKwkJCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CQkJCQorCQkJCW9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFByaXZhdGVNZW1iZXIsCisJCQkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQkJCW9wdGlvbnMucHV0KAorCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLAorCQkJCQkiIik7IC8vJE5PTi1OTFMtMSQKIAogCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CiAJCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKQEAgLTY1Niw3ICs3MDAsNyBAQAogCQkJCQkJb3B0aW9ucy5wdXQoCiAJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRPdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QsCiAJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibWFza2VkQ2F0Y2hCbG9ja3MiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJtYXNrZWRDYXRjaEJsb2NrIikgfHwgdG9rZW4uZXF1YWxzKCJtYXNrZWRDYXRjaEJsb2NrcyIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQlvcHRpb25zLnB1dCgKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssCiAJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwpAQCAtNjY0LDE4ICs3MDgsMzIgQEAKIAkJCQkJCW9wdGlvbnMucHV0KAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb24sIAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZExvY2FscyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlLCAKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuRElTQUJMRUQpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiYWxsRGVwcmVjYXRpb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLCAKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSwgCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLkVOQUJMRUQpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkTG9jYWwiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZExvY2FscyIpLypiYWNrd2FyZCBjb21wYXRpYmxlKi8pIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQlvcHRpb25zLnB1dCgKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsLCAKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRBcmd1bWVudHMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRBcmd1bWVudCIpIHx8IHRva2VuLmVxdWFscygidW51c2VkQXJndW1lbnRzIikvKmJhY2t3YXJkIGNvbXBhdGlibGUqLykgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCW9wdGlvbnMucHV0KAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyLAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJCQkJfSBlbHNlIGlmICh0b2tlbi5lcXVhbHMoInVudXNlZEltcG9ydHMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ1bnVzZWRJbXBvcnQiKSB8fCB0b2tlbi5lcXVhbHMoInVudXNlZEltcG9ydHMiKS8qYmFja3dhcmQgY29tcGF0aWJsZSovKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJb3B0aW9ucy5wdXQoCiAJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQsCiAJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygidW51c2VkUHJpdmF0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUHJpdmF0ZU1lbWJlciwKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CiAJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzeW50aGV0aWNBY2Nlc3MiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCQlvcHRpb25zLnB1dCgKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiwKQEAgLTY4NCw2ICs3NDIsMzYgQEAKIAkJCQkJCW9wdGlvbnMucHV0KAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKIAkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJzdGF0aWNSZWNlaXZlciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0U3RhdGljQWNjZXNzUmVjZWl2ZXIsCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygibm9FZmZlY3RBc3NpZ24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vRWZmZWN0QXNzaWdubWVudCwKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJpbnRlcmZhY2VOb25Jbmhlcml0ZWQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlvcHRpb25zLnB1dCgKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCwKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCQkJb3B0aW9ucy5wdXQoCisJCQkJCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiwKKwkJCQkJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCQkJCX0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidGFza3MiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlTdHJpbmcgdGFza1RhZ3MgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJaW50IHN0YXJ0ID0gdG9rZW4uaW5kZXhPZignKCcpOworCQkJCQkJaW50IGVuZCA9IHRva2VuLmluZGV4T2YoJyknKTsKKwkJCQkJCWlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwICYmIHN0YXJ0IDwgZW5kKXsKKwkJCQkJCQl0YXNrVGFncyA9IHRva2VuLnN1YnN0cmluZyhzdGFydCsxLCBlbmQpLnRyaW0oKTsKKwkJCQkJCQl0YXNrVGFncyA9IHRhc2tUYWdzLnJlcGxhY2UoJ3wnLCcsJyk7CisJCQkJCQl9CisJCQkJCQlpZiAodGFza1RhZ3MubGVuZ3RoKCkgPT0gMCl7CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbnZhbGlkVGFza1RhZyIsIHRva2VuKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJCW9wdGlvbnMucHV0KAorCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFza1RhZ3MsCisJCQkJCQkJdGFza1RhZ3MpOwogCQkJCQl9IGVsc2UgaWYgKHRva2VuLmVxdWFscygiYXNzZXJ0SWRlbnRpZmllciIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCW9wdGlvbnMucHV0KAogCQkJCQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwKQEAgLTY5OCw3ICs3ODYsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCItdGFyZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWRpZFNwZWNpZnlUYXJnZXQgPSB0cnVlOwogCQkJCW1vZGUgPSBUYXJnZXRTZXR0aW5nOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNzA5LDYgKzc5Niw3IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlpZiAobW9kZSA9PSBUYXJnZXRTZXR0aW5nKSB7CisJCQkJZGlkU3BlY2lmeVRhcmdldCA9IHRydWU7CiAJCQkJaWYgKGN1cnJlbnRBcmcuZXF1YWxzKCIxLjEiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMSk7CiAJCQkJfSBlbHNlIGlmIChjdXJyZW50QXJnLmVxdWFscygiMS4yIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtNzE3LDYgKzgwNSwxMCBAQAogCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOwogCQkJCX0gZWxzZSBpZiAoY3VycmVudEFyZy5lcXVhbHMoIjEuNCIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKwkJCQkJaWYgKGRpZFNwZWNpZnlDb21wbGlhbmNlICYmIG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMykpIHsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oTWFpbi5iaW5kKCJjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclRhcmdldDE0IiwgKFN0cmluZylvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS50YXJnZXRKREsiLCBjdXJyZW50QXJnKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CkBAIC03ODksNiArODgxLDIzIEBACiAJCQkJbW9kZSA9IERlZmF1bHQ7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlpZiAobW9kZSA9PSBJbnNpZGVCb290Q2xhc3NwYXRoKSB7CisJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudEFyZywgRmlsZS5wYXRoU2VwYXJhdG9yKTsKKwkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworCQkJCQlpbnQgbGVuZ3RoOworCQkJCQlpZiAoKGxlbmd0aCA9IGJvb3RjbGFzc3BhdGhzLmxlbmd0aCkgPD0gYm9vdGNsYXNzcGF0aENvdW50KSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCWJvb3RjbGFzc3BhdGhzLAorCQkJCQkJCTAsCisJCQkJCQkJKGJvb3RjbGFzc3BhdGhzID0gbmV3IFN0cmluZ1tsZW5ndGggKiAyXSksCisJCQkJCQkJMCwKKwkJCQkJCQlsZW5ndGgpOworCQkJCQl9CisJCQkJCWJvb3RjbGFzc3BhdGhzW2Jvb3RjbGFzc3BhdGhDb3VudCsrXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQl9CisJCQkJbW9kZSA9IERlZmF1bHQ7CisJCQkJY29udGludWU7CisJCQl9CQkJCiAJCQkvL2RlZmF1bHQgaXMgaW5wdXQgZGlyZWN0b3J5CiAJCQljdXJyZW50QXJnID0gY3VycmVudEFyZy5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKIAkJCWlmIChjdXJyZW50QXJnLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKQEAgLTgzOSwyMCArOTQ4LDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKG5vV2FybikgewotCQkJLy8gZmlsdGVyIG9wdGlvbnMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIGFzc2lzdCBjb21wb25lbnQKLQkJCU9iamVjdFtdIGVudHJpZXMgPSBvcHRpb25zLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyaWVzW2ldOwotCQkJCWlmICghKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICgoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKSkgewotCQkJCQlvcHRpb25zLnB1dCgoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKSwgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7Ci0JCQkJfQotCQkJfQotCQl9CiAJCS8qCiAJCSAqIFN0YW5kYWxvbmUgb3B0aW9ucwogCQkgKi8KQEAgLTg3NywzMCArOTcyLDEyMCBAQAogCQkJCTAsCiAJCQkJZmlsZXNDb3VudCk7CiAJCWlmIChwYXRoQ291bnQgPT0gMCkgewotCQkJU3RyaW5nIGNsYXNzUHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiREVGQVVMVF9DTEFTU1BBVEgiKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gbm8gdXNlciBjbGFzc3BhdGggc3BlY2lmaWVkLgorCQkJU3RyaW5nIGNsYXNzUHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7IC8vJE5PTi1OTFMtMSQKIAkJCWlmICgoY2xhc3NQcm9wID09IG51bGwpIHx8IChjbGFzc1Byb3AubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlvdXQucHJpbnRsbihNYWluLmJpbmQoImNvbmZpZ3VyZS5ub0NsYXNzcGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNsYXNzUHJvcCA9ICIuIjsgLy8kTk9OLU5MUy0xJAorCQkJCWVyci5wcmludGxuKE1haW4uYmluZCgiY29uZmlndXJlLm5vQ2xhc3NwYXRoIikpOyAvLyROT04tTkxTLTEkCisJCQkJY2xhc3NQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1Byb3AsIEZpbGUucGF0aFNlcGFyYXRvcik7Ci0JCQljbGFzc3BhdGhzID0gbmV3IFN0cmluZ1t0b2tlbml6ZXIuY291bnRUb2tlbnMoKV07CisJCQljbGFzc3BhdGhzID0gbmV3IFN0cmluZ1t0b2tlbml6ZXIuY291bnRUb2tlbnMoKSArIDFdOwogCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKIAkJCQljbGFzc3BhdGhzW3BhdGhDb3VudCsrXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKIAkJCX0KKwkJCWNsYXNzcGF0aHNbcGF0aENvdW50KytdID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJaWYgKGJvb3RjbGFzc3BhdGhDb3VudCA9PSAwKSB7CisJCQkvKiBubyBib290Y2xhc3NwYXRoIHNwZWNpZmllZAorCQkJICogd2UgY2FuIHRyeSB0byByZXRyaWV2ZSB0aGUgZGVmYXVsdCBsaWJyYWlyaWVzIG9mIHRoZSBWTSB1c2VkIHRvIHJ1bgorCQkJICogdGhlIGJhdGNoIGNvbXBpbGVyCisJCQkgKi8KKwkJCSBTdHJpbmcgamF2YXZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOy8vJE5PTi1OTFMtMSQKKwkJCSBpZiAoamF2YXZlcnNpb24gIT0gbnVsbCAmJiBqYXZhdmVyc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCIxLjEuOCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQllcnIucHJpbnRsbihNYWluLmJpbmQoImNvbmZpZ3VyZS5yZXF1aXJlc0pESzEuMm9yQWJvdmUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlwcm9jZWVkID0gZmFsc2U7CisJCQkJcmV0dXJuOworCQkJIH0gZWxzZSB7CisJCQkJIFN0cmluZyBqYXZhVk1OYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsvLyROT04tTkxTLTEkCisJCQkJIGlmIChqYXZhVk1OYW1lICE9IG51bGwgJiYgamF2YVZNTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJKOSIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCSAJLyoKKwkJCQkgCSAqIEhhbmRsZSBKOSBWTSBzZXR0aW5nczogUmV0cmlldmUgamNsTWF4IGJ5IGRlZmF1bHQKKwkJCQkgCSAqLworCQkJCSAJIFN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ly8kTk9OLU5MUy0xJAorCQkJCSAJIGlmIChqYXZhSG9tZSAhPSBudWxsKSB7CisJCQkJIAkgCUZpbGUgamF2YUhvbWVGaWxlID0gbmV3IEZpbGUoamF2YUhvbWUpOworCQkJCSAJIAlpZiAoamF2YUhvbWVGaWxlLmV4aXN0cygpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJamF2YUhvbWVGaWxlID0gbmV3IEZpbGUoamF2YUhvbWVGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7CisJCQkJCQkJCUZpbGUgZGVmYXVsdExpYnJhcnkgPSBuZXcgRmlsZShqYXZhSG9tZUZpbGUsICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgKyAiamNsTWF4IiArICBGaWxlLnNlcGFyYXRvciArICJjbGFzc2VzLnppcCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKKwkJCQkJCQkJRmlsZSBsb2NhbGVzID0gbmV3IEZpbGUoamF2YUhvbWVGaWxlLCAibGliIiArIEZpbGUuc2VwYXJhdG9yICsgImpjbE1heCIgKyAgRmlsZS5zZXBhcmF0b3IgKyAibG9jYWxlLnppcCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKKwkJCQkJCQkJRmlsZSBjaGFyY29udiA9IG5ldyBGaWxlKGphdmFIb21lRmlsZSwgImxpYiIgKyAgRmlsZS5zZXBhcmF0b3IgKyAiY2hhcmNvbnYuemlwIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQkJCQkJCS8qIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgZGVmYXVsdExpYnJhcnkgZXhpc3RzLiBUaGlzIGlzIGRvbmUgbGF0ZXIgd2hlbiB0aGUgdXNlcgorCQkJCQkJCQkgKiBjbGFzc3BhdGggYW5kIHRoZSBib290Y2xhc3NwYXRoIGFyZSBtZXJnZWQuIAorCQkJCQkJCQkgKi8KKwkJCQkJCQkJYm9vdGNsYXNzcGF0aHMgPSBuZXcgU3RyaW5nW10geworCQkJCQkJCQkJZGVmYXVsdExpYnJhcnkuZ2V0QWJzb2x1dGVQYXRoKCksCisJCQkJCQkJCQlsb2NhbGVzLmdldEFic29sdXRlUGF0aCgpLAorCQkJCQkJCQkJY2hhcmNvbnYuZ2V0QWJzb2x1dGVQYXRoKCl9OworCQkJCQkJCQlib290Y2xhc3NwYXRoQ291bnQgPSAzOworCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl9CisJCQkJIAkgCX0KKwkJCQkgCSB9CisJCQkJIH0gZWxzZSB7CisJCQkJIAkvKgorCQkJCSAJICogSGFuZGxlID49IEpESyAxLjIuMiBzZXR0aW5nczogcmV0cmlldmUgcnQuamFyCisJCQkJIAkgKi8KKwkJCQkgCSBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOy8vJE5PTi1OTFMtMSQKKwkJCQkgCSBpZiAoamF2YUhvbWUgIT0gbnVsbCkgeworCQkJCSAJIAlGaWxlIGphdmFIb21lRmlsZSA9IG5ldyBGaWxlKGphdmFIb21lKTsKKwkJCQkgCSAJaWYgKGphdmFIb21lRmlsZS5leGlzdHMoKSkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWphdmFIb21lRmlsZSA9IG5ldyBGaWxlKGphdmFIb21lRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOworCQkJCQkJCQkvLyBhZGQgYWxsIGphcnMgaW4gdGhlIGxpYiBzdWJkaXJlY3RvcnkKKwkJCQkJCQkJRmlsZVtdIHN5c3RlbUxpYnJhcmllc0phcnMgPSBnZXRGaWxlc0Zyb20obmV3IEZpbGUoamF2YUhvbWVGaWxlLCAibGliIiksICIuamFyIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJaW50IGxlbmd0aCA9IHN5c3RlbUxpYnJhcmllc0phcnMubGVuZ3RoOworCQkJCQkJCQlib290Y2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJCQkJLyogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiB0aGlzIGZpbGUgZXhpc3RzLiBUaGlzIGlzIGRvbmUgbGF0ZXIgd2hlbiB0aGUgdXNlcgorCQkJCQkJCQkJICogY2xhc3NwYXRoIGFuZCB0aGUgYm9vdGNsYXNzcGF0aCBhcmUgbWVyZ2VkLiAKKwkJCQkJCQkJCSAqLworCQkJCQkJCQkJYm9vdGNsYXNzcGF0aHNbYm9vdGNsYXNzcGF0aENvdW50KytdID0gc3lzdGVtTGlicmFyaWVzSmFyc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQkJCQkJfSAKKwkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJfQorCQkJCSAJIAl9CisJCQkJIAkgfQorCQkJCSB9CisJCQkgfQogCQl9CiAKLQkJaWYgKGNsYXNzcGF0aHMgPT0gbnVsbCkKKwkJaWYgKGNsYXNzcGF0aHMgPT0gbnVsbCkgewogCQkJY2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbMF07CisJCX0KKwkJLyogCisJCSAqIFdlIHB1dCB0aGUgYm9vdGNsYXNzcGF0aCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzc3BhdGggZW50cmllcworCQkgKi8KKwkJU3RyaW5nW10gbmV3Y2xhc3NwYXRocyA9IG51bGw7CisJCWlmICgocGF0aENvdW50ICsgYm9vdGNsYXNzcGF0aENvdW50KSAhPSBjbGFzc3BhdGhzLmxlbmd0aCkgeworCQkJbmV3Y2xhc3NwYXRocyA9IG5ldyBTdHJpbmdbcGF0aENvdW50ICsgYm9vdGNsYXNzcGF0aENvdW50XTsKKwkJfSBlbHNlIHsKKwkJCW5ld2NsYXNzcGF0aHMgPSBjbGFzc3BhdGhzOworCQl9CiAJCVN5c3RlbS5hcnJheWNvcHkoCiAJCQljbGFzc3BhdGhzLAogCQkJMCwKLQkJCShjbGFzc3BhdGhzID0gbmV3IFN0cmluZ1twYXRoQ291bnRdKSwKLQkJCTAsCisJCQluZXdjbGFzc3BhdGhzLAorCQkJYm9vdGNsYXNzcGF0aENvdW50LAogCQkJcGF0aENvdW50KTsKKworCQlpZiAoYm9vdGNsYXNzcGF0aENvdW50ICE9IDApIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJYm9vdGNsYXNzcGF0aHMsCisJCQkJMCwKKwkJCQluZXdjbGFzc3BhdGhzLAorCQkJCTAsCisJCQkJYm9vdGNsYXNzcGF0aENvdW50KTsKKwkJfQorCQljbGFzc3BhdGhzID0gbmV3Y2xhc3NwYXRoczsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGNsYXNzcGF0aHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGNsYXNzcGF0aHNbaV0pOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSAvLyBzaWduYWwgbWlzc2luZyBjbGFzc3BhdGggZW50cnkgZmlsZQotCQkJCW91dC5wcmludGxuKE1haW4uYmluZCgiY29uZmlndXJlLmluY29ycmVjdENsYXNzcGF0aCIsIGNsYXNzcGF0aHNbaV0pKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7IC8vIHNpZ25hbCBtaXNzaW5nIGNsYXNzcGF0aCBlbnRyeSBmaWxlCisJCQkJZXJyLnByaW50bG4oTWFpbi5iaW5kKCJjb25maWd1cmUuaW5jb3JyZWN0Q2xhc3NwYXRoIiwgY2xhc3NwYXRoc1tpXSkpOyAvLyROT04tTkxTLTEkCisJCQl9IC8qIGVsc2UgeworCQkJCW91dC5wcmludGxuKGNsYXNzcGF0aHNbaV0pOworCQkJfSovCiAJCX0KIAkJaWYgKGRlc3RpbmF0aW9uUGF0aCA9PSBudWxsKSB7CiAJCQlnZW5lcmF0ZVBhY2thZ2VzU3RydWN0dXJlID0gZmFsc2U7CkBAIC05MDgsNTggKzEwOTMsNDYgQEAKIAkJCWRlc3RpbmF0aW9uUGF0aCA9IG51bGw7CiAJCX0KIAotCQlpZiAoZmlsZW5hbWVzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLm5vU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgYW5kIHNldCBjb21wbGlhbmNlL3NvdXJjZS90YXJnZXQgY29tcGF0aWJpbGl0aWVzCi0JCWlmICghZGlkU3BlY2lmeUNvbXBsaWFuY2UpewotCQkJCWlmIChvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkpewotCQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOwotCQkJCX0KKwkJaWYgKGZpbGVuYW1lcyA9PSBudWxsKSB7CisJCQlwcmludFVzYWdlKCk7CisJCQlyZXR1cm47CiAJCX0KLQkJU3RyaW5nIGNvbXBsaWFuY2UgPSAoU3RyaW5nKW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSk7Ci0JCWlmIChDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQuZXF1YWxzKGNvbXBsaWFuY2UpKXsKLQkJCQotCQkJLy8gZGVmYXVsdCAxLjQgc2V0dGluZ3MKLQkJCWlmICghZGlkU3BlY2lmeVNvdXJjZUxldmVsKXsKLQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKLQkJCX0KLQkJCWlmICghZGlkU3BlY2lmeVRhcmdldCl7Ci0JCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMuZXF1YWxzKGNvbXBsaWFuY2UpKXsKIAotCQkJLy8gZGVmYXVsdCAxLjQgc2V0dGluZ3MKLQkJCWlmICghZGlkU3BlY2lmeVNvdXJjZUxldmVsKXsKLQkJCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKLQkJCX0KLQkJCWlmICghZGlkU3BlY2lmeVRhcmdldCl7Ci0JCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8xKTsKLQkJCX0KKwkJLy8gdGFyZ2V0IG11c3QgYmUgMS40IGlmIHNvdXJjZSBpcyAxLjQKKwkJaWYgKG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJCSYmICFvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJCSYmIGRpZFNwZWNpZnlUYXJnZXQpeyAKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZVRhcmdldEZvclNvdXJjZTE0IiwgKFN0cmluZylvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKSkpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQkvLyB0YXJnZXQgY2Fubm90IGJlIDEuNCBpZiBjb21wbGlhbmNlIGlzIDEuMworCQlpZiAob3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkKKwkJCQkmJiAhb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJCSYmIGRpZFNwZWNpZnlUYXJnZXQpeyAKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JUYXJnZXQxNCIsIChTdHJpbmcpb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJCisJCS8vIGNoZWNrIGFuZCBzZXQgY29tcGxpYW5jZS9zb3VyY2UvdGFyZ2V0IGNvbXBhdGliaWxpdGllcworCQlpZiAob3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UpLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKXsKKwkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKwkJCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCk7CisJCX0gZWxzZSBpZiAob3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQorCQkJICAmJiBvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8xKSkgeworCQkJICAJaWYgKGRpZFNwZWNpZnlUYXJnZXQpIHsKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yVGFyZ2V0MTEiLCAoU3RyaW5nKW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJICAJfSBlbHNlIHsKKwkJCQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8yKTsKKwkJCSAgCX0KIAkJfQogCQkvLyBjb21wbGlhbmNlIG11c3QgYmUgMS40IGlmIHNvdXJjZSBpcyAxLjQKIAkJaWYgKG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlKS5lcXVhbHMoQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KQogCQkJCSYmICFvcHRpb25zLmdldChDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UpLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKXsgCiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yU291cmNlMTQiLCAoU3RyaW5nKW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSkpKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCQotCQkvLyB0YXJnZXQgbXVzdCBiZSAxLjQgaWYgc291cmNlIGlzIDEuNAotCQlpZiAob3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UpLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpCi0JCQkJJiYgIW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0pLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpKXsgCi0JCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5pbmNvbXBhdGlibGVUYXJnZXRGb3JTb3VyY2UxNCIsIChTdHJpbmcpb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSkpKTsgLy8kTk9OLU5MUy0xJAotCQl9CiAKLQkJLy8gdGFyZ2V0IGNhbm5vdCBiZSAxLjQgaWYgY29tcGxpYW5jZSBpcyAxLjMKLQkJaWYgKG9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0pLmVxdWFscyhDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpCi0JCQkJJiYgIW9wdGlvbnMuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSkuZXF1YWxzKENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNCkpeyAKLQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKE1haW4uYmluZCgiY29uZmlndXJlLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JUYXJnZXQxNCIsIChTdHJpbmcpb3B0aW9ucy5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCiAJCWlmIChsb2cgIT0gbnVsbCkgewogCQkJdHJ5IHsKLQkJCQlvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCBmYWxzZSkpOworCQkJCWVyciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsb2csIGZhbHNlKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihNYWluLmJpbmQoImNvbmZpZ3VyZS5jYW5ub3RPcGVuTG9nIikpOyAvLyROT04tTkxTLTEkCiAJCQl9CkBAIC05NzEsNiArMTE0NCw4OSBAQAogCQkJcmVwZXRpdGlvbnMgPSAxOwogCQl9CiAJfQorCQorCXByaXZhdGUgRmlsZVtdIGdldEZpbGVzRnJvbShGaWxlIGYsIGZpbmFsIFN0cmluZyBleHRlbnNpb24pIHsKKwkJcmV0dXJuIGYubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKwkJCQlpZiAobmFtZS5lbmRzV2l0aChleHRlbnNpb24pKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgTWFwIGdldERlZmF1bHRPcHRpb25zKCkgeworCQlNYXAgZGVmYXVsdE9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7CisJCWRlZmF1bHRPcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwKKwkJCUNvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsCisJCQlDb21waWxlck9wdGlvbnMuR0VORVJBVEUpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZUZpbGVBdHRyaWJ1dGUsCisJCQlDb21waWxlck9wdGlvbnMuR0VORVJBVEUpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwsCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU1JWkVfT1VUKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnJlYWNoYWJsZUNvZGUsCisJCQlDb21waWxlck9wdGlvbnMuRVJST1IpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRJbnZhbGlkSW1wb3J0LCBDb21waWxlck9wdGlvbnMuRVJST1IpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCwKKwkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lLAorCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnREZXByZWNhdGlvbiwgQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEhpZGRlbkNhdGNoQmxvY2ssCisJCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCWRlZmF1bHRPcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZExvY2FsLCBDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0LCBDb21waWxlck9wdGlvbnMuV0FSTklORyk7CisJCWRlZmF1bHRPcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyLAorCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCWRlZmF1bHRPcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0LAorCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlLAorCQkJQ29tcGlsZXJPcHRpb25zLkRJU0FCTEVEKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRTeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24sCisJCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsLAorCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCWRlZmF1bHRPcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciwKKwkJCUNvbXBpbGVyT3B0aW9ucy5JR05PUkUpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0NvbXBsaWFuY2UsCisJCQlDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwKKwkJCUNvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMyk7CisJCWRlZmF1bHRPcHRpb25zLnB1dCgKKwkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisJCQlDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzEpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uLAorCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOworCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFN0YXRpY0FjY2Vzc1JlY2VpdmVyLAorCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwkJCQorCQlkZWZhdWx0T3B0aW9ucy5wdXQoCisJCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCwKKwkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKKwkJZGVmYXVsdE9wdGlvbnMucHV0KAorCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyLAorCQkJQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisJCQlyZXR1cm4gZGVmYXVsdE9wdGlvbnM7CisJfQogCXB1YmxpYyBNYXAgZ2V0T3B0aW9ucygpIHsKIAkJcmV0dXJuIHRoaXMub3B0aW9uczsKIAl9CkBAIC05ODcsMjAgKzEyNDMsMjAgQEAKIAkJCQkJbGluZURlbHRhICs9IHVuaXRMaW5lQ291bnQ7CiAJCQkJCWlmIChzaG93UHJvZ3Jlc3MKIAkJCQkJCSYmIGxpbmVEZWx0YSA+IDIwMDApIHsgLy8gaW4gLWxvZyBtb2RlLCBkdW1wIGEgZG90IGV2ZXJ5IDIwMDAgbGluZXMgY29tcGlsZWQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoJy4nKTsKKwkJCQkJCW91dC5wcmludCgnLicpOwogCQkJCQkJbGluZURlbHRhID0gMDsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAoY29tcGlsYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKSkgewotCQkJCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gY29tcGlsYXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJCQlpZiAoY29tcGlsYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKSB8fCBjb21waWxhdGlvblJlc3VsdC5oYXNUYXNrcygpKSB7CisJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPSBjb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpOwogCQkJCQlpbnQgY291bnQgPSBwcm9ibGVtcy5sZW5ndGg7CiAJCQkJCWludCBsb2NhbEVycm9yQ291bnQgPSAwOwogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQkJCWlmIChwcm9ibGVtc1tpXSAhPSBudWxsKSB7CiAJCQkJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudCsrOwogCQkJCQkJCWlmIChsb2NhbEVycm9yQ291bnQgPT0gMCkKLQkJCQkJCQkJb3V0LnByaW50bG4oIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW91dC5wcmludCgKKwkJCQkJCQkJZXJyLnByaW50bG4oIi0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWVyci5wcmludCgKIAkJCQkJCQkJZ2xvYmFsUHJvYmxlbXNDb3VudAogCQkJCQkJCQkJKyAiLiAiICAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQkrIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkKQEAgLTEwMTEsMjUgKzEyNjcsMjYgQEAKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlnbG9iYWxXYXJuaW5nc0NvdW50Kys7CiAJCQkJCQkJfQotCQkJCQkJCW91dC5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJb3V0LnByaW50KAorCQkJCQkJCWVyci5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJZXJyLnByaW50KAogCQkJCQkJCQlNYWluLmJpbmQoInJlcXVlc3Rvci5pbiIsIG5ldyBTdHJpbmcocHJvYmxlbXNbaV0uZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJb3V0LnByaW50bG4oCisJCQkJCQkJCWVyci5wcmludGxuKAogCQkJCQkJCQkJKChEZWZhdWx0UHJvYmxlbSkgcHJvYmxlbXNbaV0pLmVycm9yUmVwb3J0U291cmNlKAogCQkJCQkJCQkJCWNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCkpOwotCQkJCQkJCQlvdXQucHJpbnRsbihwcm9ibGVtc1tpXS5nZXRNZXNzYWdlKCkpOworCQkJCQkJCQllcnIucHJpbnRsbihwcm9ibGVtc1tpXS5nZXRNZXNzYWdlKCkpOwogCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCW91dC5wcmludGxuKAorCQkJCQkJCQllcnIucHJpbnRsbigKIAkJCQkJCQkJCU1haW4uYmluZCgicmVxdWVzdG9yLm5vdFJldHJpZXZlRXJyb3JNZXNzYWdlIiwgcHJvYmxlbXNbaV0udG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJfQotCQkJCQkJCW91dC5wcmludGxuKCItLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQllcnIucHJpbnRsbigiLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSkKIAkJCQkJCQkJbG9jYWxFcnJvckNvdW50Kys7CiAJCQkJCQl9CiAJCQkJCX07CiAJCQkJCS8vIGV4aXQ/CiAJCQkJCWlmIChzeXN0ZW1FeGl0V2hlbkZpbmlzaGVkICYmICFwcm9jZWVkT25FcnJvciAmJiAobG9jYWxFcnJvckNvdW50ID4gMCkpIHsKKwkJCQkJCWVyci5mbHVzaCgpOwogCQkJCQkJb3V0LmZsdXNoKCk7CiAJCQkJCQlTeXN0ZW0uZXhpdCgtMSk7CiAJCQkJCX0KQEAgLTExMDQsNyArMTM2MSw3IEBACiAJICovCiAKIAlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCW5ldyBNYWluKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSwgdHJ1ZSkuY29tcGlsZShhcmd2KTsKKwkJbmV3IE1haW4obmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVyciksIHRydWUpLmNvbXBpbGUoYXJndik7CiAJfQogCS8vIER1bXAgY2xhc3NmaWxlcyBvbnRvIGRpc2sgZm9yIGFsbCBjb21waWxhdGlvbiB1bml0cyB0aGF0IHdoZXJlIHN1Y2Nlc3NmdWxsLgogCkBAIC0xMTMyLDcgKzEzODksNyBAQAogCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBkZXN0aW5hdGlvblBhdGggKyBuZXcgU3RyaW5nKHJlbGF0aXZlTmFtZSk7CiAJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1haW4uYmluZCgib3V0cHV0Lm5vQ2xhc3NGaWxlQ3JlYXRlZCIsIGZpbGVOYW1lKSk7ICAvLyROT04tTkxTLTEkCisJCQkJCQllcnIucHJpbnRsbihNYWluLmJpbmQoIm91dHB1dC5ub0NsYXNzRmlsZUNyZWF0ZWQiLCBmaWxlTmFtZSkpOyAgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJCWV4cG9ydGVkQ2xhc3NGaWxlc0NvdW50ZXIrKzsKIAkJCQl9CkBAIC0xMTU1LDcgKzE0MTIsNyBAQAogCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBkZXN0aW5hdGlvblBhdGggKyBuZXcgU3RyaW5nKHJlbGF0aXZlTmFtZSk7CiAJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1haW4uYmluZCgib3V0cHV0Lm5vQ2xhc3NGaWxlQ3JlYXRlZCIsIGZpbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWVyci5wcmludGxuKE1haW4uYmluZCgib3V0cHV0Lm5vQ2xhc3NGaWxlQ3JlYXRlZCIsIGZpbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQlleHBvcnRlZENsYXNzRmlsZXNDb3VudGVyKys7CiAJCQkJfQpAQCAtMTE4OCwxMyArMTQ0NSwxOSBAQAogCXB1YmxpYyB2b2lkIHByaW50VXNhZ2UoKSB7CiAJCW91dC5wcmludGxuKE1haW4uYmluZCgibWlzYy51c2FnZSIsIE1haW4uYmluZCgiY29tcGlsZXIudmVyc2lvbiIpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlvdXQuZmx1c2goKTsKKwkJZXJyLmZsdXNoKCk7CiAJfQogCiAJLyoqCiAJICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvY2FsaXplKCkgewotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCXRyeSB7CisJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyByZXNvdXJjZSA6ICIgKyBidW5kbGVOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5wcm9wZXJ0aWVzIGZvciBsb2NhbGUgIiArIExvY2FsZS5nZXREZWZhdWx0KCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJdGhyb3cgZTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMTI4NSw0ICsxNTQ4LDQgQEAKIAkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggMzQ5YjRlZi4uZWQ3ZGUzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNyArMSwxNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBKYXZhQmF0Y2hDb21waWxlciBtZXNzYWdlcy4KIAogIyMjIGNvbXBpbGVyIHZlcnNpb24gaWQKLWNvbXBpbGVyLnZlcnNpb24gPSAwLjI2NAorY29tcGlsZXIudmVyc2lvbiA9IDAuMzA4CiAjIyMgc2Nhbm5pbmcKIHNjYW5uaW5nLnN0YXJ0ID0gQ29sbGVjdGluZyBzb3VyY2UgZmlsZXMgaW5zaWRlIHswfQogCkBAIC0yMiwxNiArMzIsMTUgQEAKIGNvbXBpbGUuc2V2ZXJhbENsYXNzRmlsZXNHZW5lcmF0ZWQgPSB7MH0gLmNsYXNzIGZpbGVzIGdlbmVyYXRlZAogCiAjIyMgY29uZmlndXJlCitjb25maWd1cmUucmVxdWlyZXNKREsxLjJvckFib3ZlID0gTmVlZCB0byB1c2UgYSBKVk0gPj0gMS4yCiBjb25maWd1cmUubm9Tb3VyY2VGaWxlID0gbm8gc291cmNlIGZpbGUgc3BlY2lmaWVkCiBjb25maWd1cmUuZHVwbGljYXRlTG9nID0gZHVwbGljYXRlIGxvZyBzcGVjaWZpY2F0aW9uOiB7MH0KIGNvbmZpZ3VyZS5kdXBsaWNhdGVSZXBlYXQgPSBkdXBsaWNhdGUgcmVwZWF0IHNwZWNpZmljYXRpb246IHswfQogY29uZmlndXJlLmR1cGxpY2F0ZUNvbXBsaWFuY2UgPSBkdXBsaWNhdGUgY29tcGxpYW5jZSBzZXR0aW5nIHNwZWNpZmljYXRpb246IHswfQogY29uZmlndXJlLnNvdXJjZSA9IGludmFsaWQgc291cmNlIG9wdGlvbiwgc291cmNlIGlzIGVpdGhlciAnJzEuMycnIG9yICcnMS40Jyc6IHswfQotY29uZmlndXJlLmpjayA9IGludmFsaWQgamNrIG9wdGlvbiwgamNrIGNvbXBsaWFuY2UgbGV2ZWwgaXMgZWl0aGVyICcnMS4zJycgb3IgJycxLjQnJzogezB9CiBjb25maWd1cmUuZHVwbGljYXRlT3V0cHV0UGF0aCA9IGR1cGxpY2F0ZSBvdXRwdXQgcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0KLWNvbmZpZ3VyZS5kdXBsaWNhdGVDbGFzc3BhdGggPSBkdXBsaWNhdGUgY2xhc3NwYXRoIHNwZWNpZmljYXRpb246IHswfQorY29uZmlndXJlLmR1cGxpY2F0ZUJvb3RDbGFzc3BhdGggPSBkdXBsaWNhdGUgYm9vdGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uOiB7MH0KIGNvbmZpZ3VyZS5pbnZhbGlkRGVidWdPcHRpb24gPSBpbnZhbGlkIGRlYnVnIG9wdGlvbjogezB9Ci1jb25maWd1cmUuZHVwbGljYXRlV2FybmluZ0NvbmZpZ3VyYXRpb24gPSBkdXBsaWNhdGUgdXNhZ2Ugb2Ygd2FybmluZyBjb25maWd1cmF0aW9uCiBjb25maWd1cmUuaW52YWxpZFdhcm5pbmdDb25maWd1cmF0aW9uID0gaW52YWxpZCB3YXJuaW5nIGNvbmZpZ3VyYXRpb246IHswfQogY29uZmlndXJlLmludmFsaWRXYXJuaW5nID0gaW52YWxpZCB3YXJuaW5nOiB7MH0KIGNvbmZpZ3VyZS5pbnZhbGlkV2FybmluZ09wdGlvbiA9IGludmFsaWQgd2FybmluZyBvcHRpb246IHswfQpAQCAtMzksMTcgKzQ4LDE5IEBACiBjb25maWd1cmUuaW5jb21wYXRpYmxlVGFyZ2V0Rm9yU291cmNlMTQgPSAnJzEuNCcnIHNvdXJjZSBtb2RlIHJlcXVpcmVzICcnLXRhcmdldCAxLjQnJyA6IHswfQogY29uZmlndXJlLmluY29tcGF0aWJsZUNvbXBsaWFuY2VGb3JTb3VyY2UxNCA9ICcnMS40Jycgc291cmNlIG1vZGUgcmVxdWlyZXMgJyctMS40JycgY29tcGxpYW5jZSBtb2RlOiB7MH0KIGNvbmZpZ3VyZS5pbmNvbXBhdGlibGVDb21wbGlhbmNlRm9yVGFyZ2V0MTQgPSAnJzEuNCcnIHRhcmdldCBtb2RlIHJlcXVpcmVzICcnLTEuNCcnIGNvbXBsaWFuY2UgbW9kZTogezB9Citjb25maWd1cmUuaW5jb21wYXRpYmxlQ29tcGxpYW5jZUZvclRhcmdldDExID0gJycxLjEnJyB0YXJnZXQgbW9kZSByZXF1aXJlcyAnJy0xLjMnJyBjb21wbGlhbmNlIG1vZGU6IHswfQogY29uZmlndXJlLnJlcGV0aXRpb24gPSByZXBldGl0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyOiB7MH0KIGNvbmZpZ3VyZS5kaXJlY3RvcnlOb3RFeGlzdCA9IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogezB9CiBjb25maWd1cmUuSU9FcnJvciA9IGkvbyBlcnJvciA6IHVuYWJsZSB0byByZXRyaWV2ZSAuSkFWQSBmaWxlcyBpbiBkaXJlY3Rvcnk6IHswfQogY29uZmlndXJlLnZlcnNpb24gPSBFY2xpcHNlIEphdmEgQ29tcGlsZXIgezB9LCBDb3B5cmlnaHQgSUJNIENvcnAgMjAwMC0yMDAyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogY29uZmlndXJlLm5vQ2xhc3NwYXRoID0gbm8gY2xhc3NwYXRoIGRlZmluZWQsIHVzaW5nIGRlZmF1bHQgZGlyZWN0b3J5IGluc3RlYWQKIGNvbmZpZ3VyZS5pbmNvcnJlY3RDbGFzc3BhdGggPSBpbmNvcnJlY3QgY2xhc3NwYXRoOiB7MH0KLWNvbmZpZ3VyZS5ub1NvdXJjZSA9IG5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZAorY29uZmlndXJlLmludmFsaWRleHBhbnNpb25hcmd1bWVudG5hbWUgPSBleHBhbnNpb24gYXJndW1lbnQgZmlsZSB7MH0gZG9lc24ndCBleGlzdCBvciBjYW5ub3QgYmUgcmVhZAogY29uZmlndXJlLmNhbm5vdE9wZW5Mb2cgPSBjYW5ub3Qgb3BlbiAubG9nIGZpbGUKIGNvbmZpZ3VyZS51bmV4cGVjdGVkQ3VzdG9tRW5jb2RpbmcgPSB1bmV4cGVjdGVkIGN1c3RvbSBlbmNvZGluZyBzcGVjaWZpY2F0aW9uOiB7MH1bezF9XQogY29uZmlndXJlLnVuc3VwcG9ydGVkRW5jb2RpbmcgPSB1bnN1cHBvcnRlZCBlbmNvZGluZyBmb3JtYXQ6IHswfQogY29uZmlndXJlLmR1cGxpY2F0ZURlZmF1bHRFbmNvZGluZyA9IGR1cGxpY2F0ZSBkZWZhdWx0IGVuY29kaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9uOiB7MH0KK2NvbmZpZ3VyZS5pbnZhbGlkVGFza1RhZyA9ezB9IGlzIGFuIGludmFsaWQgdGFzayB0YWcKIAogIyMjIHJlcXVlc3RvcgogcmVxdWVzdG9yLmVycm9yID0gRVJST1IKQEAgLTY2LDQzICs3Nyw1MiBAQAogCiAjIyMgbWlzY2VsbGFuZW91cwogbWlzYy51c2FnZSA9IEVjbGlwc2UgSmF2YSBDb21waWxlciB7MH1cblwKLQkJQ29weXJpZ2h0IElCTSBDb3JwIDIwMDAtMjAwMi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuXAorCQlDb3B5cmlnaHQgSUJNIENvcnAgMjAwMCwgMjAwMy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuXAogCQlVc2FnZTogPG9wdGlvbnM+IDxzb3VyY2UgZmlsZXMgfCBkaXJlY3Rvcmllcz5cblxuXAogCQl3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG5cCi0JCS1oZWxwCQkJZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZVxuXAotCQktdmVyc2lvbgkJY29tcGlsZXIgdmVyc2lvbiBudW1iZXJcblwKLQkJLWNsYXNzcGF0aAkJPGRpciAxPjs8ZGlyIDI+Oy4uLjs8ZGlyIFA+XG5cCi0JCS1kIDxkaXI+CQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGlmIG9taXR0ZWQgbm8gcGFja2FnZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIGNyZWF0ZWQpXG5cCisJCS1oZWxwCQkJCWRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2VcblwKKwkJLXZlcnNpb24JCQlvbmx5IGRpc3BsYXkgY29tcGlsZXIgdmVyc2lvbiBudW1iZXJcblwKKwkJLWNsYXNzcGF0aAkJCTxkaXIgMT47PGRpciAyPjsuLi47PGRpciBQPlxuXAorCQktYm9vdGNsYXNzcGF0aAkJPGRpciAxPjs8ZGlyIDI+Oy4uLjs8ZGlyIFA+XG5cCisJCS1kIDxkaXI+CQkJZGVzdGluYXRpb24gZGlyZWN0b3J5IChpZiBvbWl0dGVkLCBubyBkaXJlY3RvcnkgaXMgY3JlYXRlZClcblwKIAkJICAgXHQtZCBub25lCQkJbm8gY2xhc3NmaWxlIGlzIGdlbmVyYXRlZFxuXAotCQktdGFyZ2V0IDx2ZXI+CQljbGFzc2ZpbGUgdGFyZ2V0IHNldHRpbmcgKDEuMSBvciAxLjIsIGRlZmF1bHQgaXMgMS4xKVxuXAotCQktMS4zIAkJCXNldCBjb21wbGlhbmNlIGxldmVsIHRvIDEuMyAoZGVmYXVsdClcblwKLQkJLTEuNCAJCQlzZXQgY29tcGxpYW5jZSBsZXZlbCB0byAxLjRcblwKLQkJLXNvdXJjZSA8dmVyPgkJYXNzZXJ0aW9ucyB0b2dnbGUgKDEuMyBvciAxLjQsIGRlZmF1bHQgaXMgMS4zIGluIC0xLjMgbW9kZSBhbmQgMS40IGluIC0xLjQgbW9kZSlcblwKLQkJLW5vd2FybgkJCW5vIHdhcm5pbmcgKGVxdWl2YWxlbnQgdG8gJyctd2Fybjpub25lJycpXG5cCisJCS10YXJnZXQgPHZlcj4JCXNldCBjbGFzc2ZpbGUgdGFyZ2V0ICgxLjEgdG8gMS40LCBkZWZhdWx0IGlzICcnMS4xJycpXG5cCisJCS0xLjMgCQkJCXVzZSAxLjMgY29tcGxpYW5jZSBsZXZlbCAoZGVmYXVsdClcblwKKwkJLTEuNCAJCQkJdXNlIDEuNCBjb21wbGlhbmNlIGxldmVsXG5cCisJCS1zb3VyY2UgPHZlcj4JCXNldCBzb3VyY2UgbGV2ZWwgKDEuMyBvciAxLjQsIGRlZmF1bHQgbWF0Y2hlcyBjb21wbGlhbmNlIGxldmVsKVxuXAorCQktbm93YXJuCQkJCW5vIHdhcm5pbmcgKGVxdWl2YWxlbnQgdG8gJyctd2Fybjpub25lJycpXG5cCiAJCS13YXJuOiA8bGV2ZWw+CQlzZXQgd2FybmluZyBsZXZlbCAoZS5nLiAnJy13YXJuOnVudXNlZExvY2FscyxkZXByZWNhdGlvbicnKVxuXAotCQlcdGNvbnN0cnVjdG9yTmFtZQkJd2FybiBtZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lXG5cCi0JCVx0cGFja2FnZURlZmF1bHRNZXRob2QJd2FybiBhdHRlbXB0IHRvIG92ZXJyaWRlIHBhY2thZ2UtZGVmYXVsdCBtZXRob2RcblwKLQkJXHRkZXByZWNhdGlvbgkJd2FybiB1c2FnZSBvZiBkZXByZWNhdGVkIHR5cGUgb3IgbWVtYmVyXG5cCi0JCVx0bWFza2VkQ2F0Y2hCbG9ja3MJd2FybiBoaWRkZW4gY2F0Y2ggYmxvY2tcblwKLQkJXHR1bnVzZWRMb2NhbHMJCXdhcm4gb24gdW51c2VkIGxvY2FsIHZhcmlhYmxlIChuZXZlciByZWFkKVxuXAotCQlcdHVudXNlZEFyZ3VtZW50cwkJd2FybiBvbiB1bnVzZWQgbWV0aG9kIGFyZ3VtZW50IChuZXZlciByZWFkKVxuXAotCQlcdHVudXNlZEltcG9ydHMJCXdhcm4gb24gdW51c2VkIGltcG9ydHNcblwKLQkJXHRzeW50aGV0aWNBY2Nlc3MJCXdhcm4gd2hlbiBwZXJmb3JtaW5nIHN5bnRoZXRpYyBhY2Nlc3MgZm9yIGlubmVyY2xhc3NcblwKLQkJXHRhc3NlcnRJZGVudGlmaWVyCXdhcm4gb2NjdXJyZW5jZSBvZiAnJ2Fzc2VydCcnIHVzZWQgYXMgaWRlbnRpZmllclxuXAotCQktZGVwcmVjYXRpb24JCWVxdWl2YWxlbnQgdG8gLXdhcm46ZGVwcmVjYXRpb24uXG5cCi0JCS1nWzo8bGV2ZWw+XQkJZGVidWcgYXR0cmlidXRlcyBsZXZlbFxuXAotCQkJXHQtZwkJCWFsbCBkZWJ1ZyBpbmZvICgnJy1nOmxpbmVzLHZhcnMsc291cmNlJycpXG5cCisJCVx0YWxsRGVwcmVjYXRpb24JCQkgZGVwcmVjYXRpb24gKGluY2x1ZGluZyBpbiBkZXByZWNhdGVkIGNvZGUpXG5cCisJCVx0YXNzZXJ0SWRlbnRpZmllcgkJICcnYXNzZXJ0JycgdXNlZCBhcyBpZGVudGlmaWVyXG5cCisJCVx0Y29uc3RydWN0b3JOYW1lCQkJIG1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWUgXHRcdFx0XHQgIChkZWZhdWx0KSBcblwKKwkJXHRkZXByZWNhdGlvbgkJCQkgZGVwcmVjYXRpb24gKG91dHNpZGUgZGVwcmVjYXRlZCBjb2RlKSBcdFx0ICAoZGVmYXVsdClcblwKKwkJXHRtYXNrZWRDYXRjaEJsb2NrCQkgaGlkZGVuIGNhdGNoIGJsb2NrIFx0XHRcdFx0XHRcdCAgKGRlZmF1bHQpXG5cCisJCVx0bmxzCQkJCQkJIHN0cmluZyBsaXRlcmFsIGxhY2tpbmcgbm9uLW5scyB0YWcgLy8kTk9OLU5MUy08bj4kXG5cCisJCVx0cGFja2FnZURlZmF1bHRNZXRob2QJIGF0dGVtcHQgdG8gb3ZlcnJpZGUgcGFja2FnZS1kZWZhdWx0IG1ldGhvZCAgIChkZWZhdWx0KVxuXAorCQlcdHVudXNlZEFyZ3VtZW50CQkJIHVudXNlZCBtZXRob2QgYXJndW1lbnQgKG5ldmVyIHJlYWQpXG5cCisJCVx0dW51c2VkSW1wb3J0CQkJIHVudXNlZCBpbXBvcnQgZGVjbGFyYXRpb24gXHRcdFx0XHRcdCAgKGRlZmF1bHQpXG5cCisJCVx0dW51c2VkTG9jYWwJCQkJIHVudXNlZCBsb2NhbCB2YXJpYWJsZSAobmV2ZXIgcmVhZClcblwKKwkJXHR1bnVzZWRQcml2YXRlCQkJIHVudXNlZCBwcml2YXRlIG1lbWJlciBkZWNsYXJhdGlvblxuXAorCQlcdHN0YXRpY1JlY2VpdmVyCQkJIG5vbi1zdGF0aWMgcmVmZXJlbmNlIHRvIHN0YXRpYyBtZW1iZXIgXHRcdCAgKGRlZmF1bHQpXG5cCisJCVx0bm9FZmZlY3RBc3NpZ24JCQkgYXNzaWdubWVudCB3aXRob3V0IGVmZmVjdCBcdFx0XHRcdFx0ICAoZGVmYXVsdClcblwKKwkJXHRzeW50aGV0aWNBY2Nlc3MJCQkgc3ludGhldGljIGFjY2VzcyBmb3IgaW5uZXJjbGFzc1xuXAorCQlcdGludGVyZmFjZU5vbkluaGVyaXRlZAkgaW50ZXJmYWNlIG5vbi1pbmhlcml0ZWQgbWV0aG9kIGNvbXBhdGliaWxpdHkgKGRlZmF1bHQpXG5cCisJCVx0bm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gY2hhcltdIGluIFN0cmluZyBjb25jYXRcdFx0XHRcdFx0ICAoZGVmYXVsdClcblwKKwkJXHR0YXNrcyg8dGFnMT58Li4ufDx0YWdOPikgdGFza3MgaWRlbnRpZmllZCBieSB0YWdzIGluc2lkZSBjb21tZW50c1xuXAorCQktZGVwcmVjYXRpb24JCWVxdWl2YWxlbnQgdG8gJyctd2FybjpkZXByZWNhdGlvbicnIChkZWZhdWx0KVxuXAorCQktZ1s6PGxldmVsPl0JCWRlYnVnIGF0dHJpYnV0ZXMgbGV2ZWwgKGRlZmF1bHQgJyctZzpsaW5lcyxzb3VyY2UnJylcblwKKwkJCVx0LWcJCQkJYWxsIGRlYnVnIGluZm8gKCcnLWc6bGluZXMsdmFycyxzb3VyY2UnJylcblwKIAkJCVx0LWc6bm9uZQkJCW5vIGRlYnVnIGluZm9cblwKIAkJCVx0LWc6W2xpbmVzLHZhcnMsc291cmNlXQlzZWxlY3RpdmUgZGVidWcgaW5mb1xuXAotCQktcHJlc2VydmVBbGxMb2NhbHMJY29kZSBnZW4gcHJlc2VydmUgYWxsIGxvY2FsIHZhcmlhYmxlcyAoZm9yIGRlYnVnIHB1cnBvc2UpXG5cCi0JCS1ub0ltcG9ydEVycm9yCQlubyBlcnJvcnMgZm9yIHVucmVzb2x2ZWQgaW1wb3J0c1xuXAotCQktZW5jb2RpbmcJCXNwZWNpZnkgZGVmYXVsdCBzb3VyY2UgZW5jb2RpbmcgZm9ybWF0IChjdXN0b20gZW5jb2RpbmcgY2FuIGFsc28gYmUgc3BlY2lmZWQgb25cblwKLQkJXHRcdFx0YSBwZXIgZmlsZSBiYXNpcyBieSBzdWZmaXhpbmcgZWFjaCBpbnB1dCBzb3VyY2UgZmlsZS9mb2xkZXIgbmFtZSB3aXRoICdbZW5jb2RpbmddJylcblwKKwkJLXByZXNlcnZlQWxsTG9jYWxzCXByZXNlcnZlIHVudXNlZCBsb2NhbCB2YXJzIGZvciBkZWJ1ZyBwdXJwb3NlIChkZWZhdWx0IGlzIG9wdGltaXplIG91dClcblwKKwkJLW5vSW1wb3J0RXJyb3IJCW5vIGVycm9ycyBmb3IgdW5yZXNvbHZlZCBpbXBvcnRzIChkZWZhdWx0IGlzIGVycm9yKVxuXAorCQktZW5jb2RpbmcgPGVuYz4JCXNwZWNpZnkgYSBkaWZmZXJlbnQgZGVmYXVsdCBzb3VyY2UgZW5jb2RpbmcgZm9ybWF0IChjdXN0b20gZW5jb2RpbmcgY2FuIGJlIHNwZWNpZmllZCBvblxuXAorCQlcdFx0XHRcdFx0YSBwZXIgZmlsZSBiYXNpcyBieSBhZGRpbmcgc3VmZml4ICcnWzxlbmM+XScnIHRvIGZpbGUvZm9sZGVyIG5hbWVzXG5cCiAJCS1sb2cgPGZpbGVuYW1lPgkJc3BlY2lmeSBhIGxvZyBmaWxlXG5cCi0JCS1wcm9jZWVkT25FcnJvcgkJa2VlcCBjb21waWxpbmcgd2hlbiBlcnJvciwgZHVtcGluZyBjbGFzcyBmaWxlcyB3aXRoIHByb2JsZW0gbWV0aG9kc1xuXAotCQktdmVyYm9zZQkJcHJpbnQgYWNjZXNzZWQvcHJvY2Vzc2VkIGNvbXBpbGF0aW9uIHVuaXRzIFxuXAorCQktcHJvY2VlZE9uRXJyb3IJCWtlZXAgY29tcGlsaW5nIHdoZW4gZXJyb3IsIGR1bXBpbmcgY2xhc3MgZmlsZXMgd2l0aCBwcm9ibGVtIG1ldGhvZHMgKGRlZmF1bHQgaXMgb2ZmKVxuXAorCQktdmVyYm9zZQkJCXByaW50IGFjY2Vzc2VkL3Byb2Nlc3NlZCBjb21waWxhdGlvbiB1bml0c1xuXAogCQktcmVmZXJlbmNlSW5mbwkJY29tcHV0ZSByZWZlcmVuY2UgaW5mb1xuXAotCQktcHJvZ3Jlc3MJCXNob3cgcHJvZ3Jlc3MgKG9ubHkgaW4gLWxvZyBtb2RlKVxuXAotCQktdGltZQkJCWRpc3BsYXkgc3BlZWQgaW5mb3JtYXRpb25cblwKLQkJLW5vRXhpdAkJCWRvIG5vdCBjYWxsIFN5c3RlbS5leGl0KG4pIGF0IGVuZCBvZiBjb21waWxhdGlvbiAobj0wIGlmIG5vIGVycm9yKVxuXAotCQktcmVwZWF0IDxuPgkJcmVwZWF0IGNvbXBpbGF0aW9uIHByb2Nlc3MgPG4+IHRpbWVzIChwZXJmIGFuYWx5c2lzKVxuCisJCS1wcm9ncmVzcwkJCXNob3cgcHJvZ3Jlc3MgKG9ubHkgaW4gLWxvZyBtb2RlKVxuXAorCQktdGltZQkJCQlkaXNwbGF5IHNwZWVkIGluZm9ybWF0aW9uIFxuXAorCQktbm9FeGl0CQkJCWRvIG5vdCBjYWxsIFN5c3RlbS5leGl0KG4pIGF0IGVuZCBvZiBjb21waWxhdGlvbiAobj0wIGlmIG5vIGVycm9yKVxuXAorCQktcmVwZWF0IDxuPgkJCXJlcGVhdCBjb21waWxhdGlvbiBwcm9jZXNzIDxuPiB0aW1lcyAocGVyZiBhbmFseXNpcylcbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggMmQ4NTI4MC4uMDAxNmVkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKICAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXApAQCAtMjAsNCArMzAsNCBAQAogc291cmNlLmpkdENvbXBpbGVyQWRhcHRlci5qYXIgPSBhbnRhZGFwdGVyLwogamFycy5jb21waWxlLm9yZGVyPWpkdGNvcmUuamFyLGpkdENvbXBpbGVyQWRhcHRlci5qYXIKIGphcnMuZXh0cmEuY2xhc3NwYXRoPS4uL29yZy5hcGFjaGUuYW50L2FudC5qYXIKLXNyYy5pbmNsdWRlcz1hYm91dC5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3JjLmluY2x1ZGVzPWFib3V0Lmh0bWwsc2NoZW1hLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAppbmRleCBhNGVjMTBlLi45NDA1YmQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCkBAIC01LDQzMzUgKzUsMzIyMiBAQAogICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgogICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgogICAgPHRpdGxlPkpEVC9Db3JlIFJlbGVhc2UgTm90ZXM8L3RpdGxlPgorCiA8L2hlYWQ+CiA8Ym9keT4KIAotPGgxPgorPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+CismbmJzcDsKKworPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgorICA8dHI+IAorICAgIDx0ZCBhbGlnbj1sZWZ0IHdpZHRoPSI3MiUiPgorICAgICAgPGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSIgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgMi4xIHN0cmVhbSA8L2ZvbnQ+CisgICAgICA8YnI+PGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTIiIGNvbG9yPSIjODA4MGZmIj5qYXZhIGRldmVsb3BtZW50IHRvb2xpbmcgY29yZTwvZm9udD48L3RkPgorICA8L3RyPgorCTx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICA8dHI+CisgIAk8dGQ+CisJICA8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CisJICBIZXJlIGFyZSB0aGUgYnVpbGQgbm90ZXMgZm9yIHRoZSBFY2xpcHNlIEpEVC9Db3JlIHBsdWctaW4gcHJvamVjdCAKKwkgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvamR0LWNvcmUtaG9tZS9tYWluLmh0bWwiPjxiPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9iPjwvYT4sIAorCSAgZGVzY3JpYmluZyBidWcgcmVzb2x1dGlvbiBhbmQgc3Vic3RhbnRpYWwgY2hhbmdlcyBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5qZHQuY29yZSI+PGI+SEVBRDwvYj48L2E+IGJyYW5jaC4gCisJICBUaGlzIHByZXNlbnQgZG9jdW1lbnQgY292ZXJzIGFsbCBjaGFuZ2VzIHNpbmNlIFJlbGVhc2UgMi4wLCBjaGFuZ2VzIHdoaWNoIG9jY3VycmVkIHVwIHRvIFJlbGVhc2UgMi4wIGNhbiBiZSBmb3VuZAorCSAgaW4gPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMjBfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIj5idWlsZCBub3RlcyBSMi4wPC9hPi4KKwkgIDwvZm9udD4KKwk8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBHTTUgLSAyN3RoIEp1bmUgMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjQKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDIwdGggTWFyY2ggMjAwMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDgKIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLTxsaT5DaGFuZ2VkIEFTQ0lJL2JpbmFyeSBwcm9wZXJ0eSBmb3IgJ2Fib3V0Lmh0bWwnIGZpbGUgdG8gQVNDSUkuPC9saT4KLTwvdWw+IAorPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTMwNiI+MzUzMDY8L2E+CitJbmRleCB1cGRhdGUgcmVxdWVzdCBjYW4gYmUgaW5jb3JyZWN0bHkgaGFuZGxlZAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTI2MyI+MzUyNjM8L2E+CitFY2xpcHNlIGNyYXNoZXMgd2hlbiBvcGVuaW5nIEhpZXJhcmNoeSB2aWV3IGZvciBqYXZhLmxhbmcuRWNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTI5OCI+MzUyOTg8L2E+CitOUEU6IEludGVybmFsIGNvbXBpbGVyIGVycm9yCisKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxOXRoIE1hcmNoIDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzA3IC0gMi4xIFJFTEVBU0UgQ0FORElEQVRFIDMKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNDAiPjM0MDQwPC9hPgorSXQgdGFrZXMgYSBtaW51dGUgdG8gZXhwYW5kIGEgcHJvamVjdCBpbiBQYWNrYWdlIGV4cGxvcmVyCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KIAotPGgxPgorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBHTTQgLSAyNnRoIEp1bmUgMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjMKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE4dGggTWFyY2ggMjAwMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDYgCiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08L3VsPiAKKzwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTMiPjIwNTUzPC9hPiAgCi1Eb2MgLSBKYXZhZG9jcyBvZiAyLjAgY2xhc3NlcyBtdXN0IHNwZWNpZnkgaWYgdGhlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudC4gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDQyIj4yMDQ0MjwvYT4gIAotRG9jIC0gSmF2YWRvYyBtaXNzaW5nIGluIElDb2RlU25pcHBldFJlcXVlc3RvciAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTAiPjIwNTUwPC9hPiAKLURvYyAtIGZpZWxkcyBvZiBDb3JyZWN0aW9uRW5naW5lIHNob3VsZCBub3QgYmUgQVBJCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NzIiPjIwODcyPC9hPiAgCi1Eb2MgLSB0aGUgamF2YWRvYyBpcyBub3QgY29ycmVjdCBmb3IgSUNvZGVBc3Npc3QjY29kZVNlbGVjdAotPGJyPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUyMzciPjM1MjM3PC9hPgorQW50IGFkYXB0ZXIgc2hvdWxkIHNheSB3aGVyZSB0byBsb29rIGZvciB0aGUgLmxvZyBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUxMzIiPjM1MTMyPC9hPgorTmVlZCB0byByZWluZGV4IGphciBub3Qgb24gY2xhc3NwYXRoIG5vdCBkZXRlY3RlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTEzMSI+MzUxMzE8L2E+CitPcHRpbWl6ZSBzb3VyY2UgYXR0YWNobWVudCBxdWVyeSB3aGVuIG5vIHNvdXJjZSBhdHRhY2htZW50IGF2YWlsYWJsZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTEyOCI+MzUxMjg8L2E+CitQcm9ibGVtcyB3aXRoIHBhY2thZ2VzIG5hbWVkICJqYXZhIgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkzNiI+MjA5MzY8L2E+ICAKLW51bGxwb2ludGVyIGV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkphdmFCdWlsZGVyCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDIxNCI+MzQyMTQ8L2E+CitjcmVhdGVQYWNrYWdlRGVjbGFyYXRpb24gb24gSUNvbXBpbGF0aW9uVW5pdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MDk4Ij4zNTA5ODwvYT4KK0RlbGV0ZSBjb21waWxlZCBjbGFzcyBmaWxlcyB3aGVuIGRlbGV0aW5nIHNvdXJjZSBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwODciPjM1MDg3PC9hPgorTlBFIHdoaWxlIGltcG9ydGluZyBwbHVnLWlucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODUwIj4zNDg1MDwvYT4KK05lZWQgYmV0dGVyIGNvbnRyb2wgb3ZlciBkZXByZWNhdGlvbiBtZXNzYWdlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzIyIj4zNDMyMjwvYT4KK1NESyBoYW5ncyB3aGlsZSBidWlsZGluZyBvbiBJQk0xLjMuMVNSMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDE4Ij4zMDQxODwvYT4KK0lubmVyIGNsYXNzZXMgY2F1c2UgY29tcGlsYXRpb24gZXJyb3JzIHdpdGggYXNzZXJ0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDc4OSI+MzQ3ODk8L2E+CitTZWFyY2ggZm9yIHJlZmVyZW5jZXMgZG9lcyBub3Qgc2hvdyBzdWJjbGFzc2VkIG1ldGhvZHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4ODUiPjMzODg1PC9hPgorcGFja2FnZXMgd2l0aCBqYXZheCBpbiB0aGVpciBuYW1lIGRvbid0IGltcG9ydCBwcm9wZXJseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTkyIj4zNDk5MjwvYT4KK1RPRE8gYXMgYSBzdWJzdHJpbmcgaW4gYSBjb21tZW50IGdlbmVyYXRlcyBhIHRhc2sgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MDgiPjM0NzA4PC9hPgordW5yZWxpYWJsZSBmdWxsIGJ1aWxkL3JlZnJlc2ggdXNpbmcgbGlua2VkIHNvdXJjZSBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUwOTMiPjM1MDkzPC9hPgorTm90IG9ubHkgY2hhbmdlcyBpbiB3b3JraW5nIGNvcHkgc2hvdWxkIHJlZnJlc2ggdHlwZSBoaWVyYXJjeS4gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ4NTEiPjM0ODUxPC9hPgorUmVuYW1lIENsYXNzIG9wZXJhdGlvbiBoYW5ncyAKIAotPGgxPgorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyNCAtIDI0dGggSnVuZSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTN0aCBNYXJjaCAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwNQogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPlVwZGF0ZWQgYWJvdXQuaHRtbCBmaWxlLgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDg0NSI+MzQ4NDU8L2E+Cithc3NlcnRzIGRvIG5vdCBuZWVkIHRvIGJlIE5MUydlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NjU4Ij4zNDY1ODwvYT4KK1NhdmUgQWxsIGZhaWxlZCB3aXRoIHVuaGVscGZ1bCBlcnJvciBtZXNzYWdlLgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDk2MiI+MzQ5NjI8L2E+CitOUEUgaW4gU2NvcGUuZ2V0VHlwZU9yUGFja2FnZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0ODAyIj4zNDgwMjwvYT4KK2luc3RhbmNlb2YgcHJvZHVjZSBJbnRlcm5hbENvbXBpbGVyRXJyb3Igb24gTWFjT1NYIHdpdGggSkRLMS40LjEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDczNCI+MzQ3MzQ8L2E+CitpbnRlcm5hbCBjb21waWxlciBlcnJvciBBcnJheUluZGV4T3V0T2ZCb3VuZCB3LyAxLjQuMSByZWxlYXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MDYiPjM0NzA2PC9hPgorSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDkwNyI+MzQ5MDc8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWZ0ZXIgaW5zdGFsbGluZyBKYXZhIDEuNC4xXzAxCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMjkiPjM0MDI5PC9hPgorIkZhbHNlLXBvc2l0aXZlIiBkZXByZWNhdGVkIHdhcm5pbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDgxMyI+MzQ4MTM8L2E+CitOUEUgZnJvbSBidWlsZGVyCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTF0aCBNYXJjaCAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMwNAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyNyI+MzM5Mjc8L2E+CitMZWFrIGluIEphdmEgRWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5NTAiPjMzOTUwPC9hPgorU2xvdyBwZXJmb3JtYW5jZSB3aGVuIGNoYW5naW5nIGNvZGUgaW4gYSBtdWNoIHJlZmVyZW5jZWQgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDAwIj4zNDAwMDwvYT4KK0pESyBDb21wbGlhbmNlIGRvZXNuJ3QgbWF0Y2ggamF2YWMgZ2VuZXJhdGlvbiBmcm9tIGFuIElCTSBvciBTVU4gSkRLCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNzgiPjM0MDc4PC9hPgorSGllcmFyY2h5OiAyNyUgb2YgdGltZSBzcGVudCByZXBvcnRpbmcgcHJvZ3Jlc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5OTgiPjMzOTk4PC9hPgordW5leHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiAKKyAgIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1NjYiPjM0NTY2PC9hPgorY2FuJ3QgZ2V0IGFzc2VydCB0byB3b3JrIHdpdGggbWFjIG9zIHggamF2YSAxLjQuMQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzM3Ij4zNDMzNzwvYT4KK1tSQzJdIFNlYXJjaGVzIGZyZWV6ZXMgPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDEyIj4zMzQxMjwvYT4KK0dCMTgwMzA6IENhbid0IHNldCBKUkUgaW4gYSBwYXRoIGNvbnRhaW5zIEdCMTgwMzAgY2hhcmFjdGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjkyIj4zNDI5MjwvYT4KK1tSQzJdIE91dE9mTWVtb3J5IGNvbXBpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTMwIj4zNDEzMDwvYT4KK0RlYnVnIHN0YXRlbWVudHMgb24gY29uc29sZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzAxIj4zNDMwMTwvYT4KK0phdmEgY29tcGlsZXIgZG9lc24ndCBkZWN0ZWQgYWx3YXlzIHVucmVwb3J0ZWQgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MjciPjMyOTI3PC9hPgorRXhjZXB0aW9uIHdoaWxlIHBsYXlpbmcgd2l0aCB0eXBlIGhpZXJhcmNoeSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA1OSI+MzQwNTk8L2E+CitXaGVuIGFkZGluZyBhIGxpYnJhcnkgdGhhdCBpcyBzdG9yZWQgaW4gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhICIoIiBvciAiKSIgdGhlIGNsYXNzZXMgYXJlICAqbm90KiByZWFjaGFibGUgZm9yIENvZGUgQXNzaXN0LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTAwIj4zMzkwMDwvYT4KK05QRSBzZXR0aW5nIG91dHB1dCBkaXJlY3Rvcnkgb2YgYSBzb3VyY2UgZm9sZGVyCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gNnRoIE1hcmNoIDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzAzIC0gMi4xIFJFTEVBU0UgQ0FORElEQVRFIDIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT48Y29kZT5JSmF2YVByb2plY3QuaXNPbkNsYXNzcGF0aCguLi4pPC9jb2RlPiBubyBsb25nZXIgdGhyb3dzIGFueSBleGNlcHRpb24sIGJ1dCByYXRoZXIgY29uc2lzdGVudGx5IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KK2luIHRoZXNlIGNpcmN1bXN0YW5jZXMuIEluZGVlZCwgaXQgaXMgZGlmZmljdWx0IGZvciBjbGllbnRzIHRvIHdvcmsgd2l0aCBwcmVkaWNhdGVzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucy4gCitBbHRob3VnaCB0aGlzIGNoYW5nZSBjcmVhdGVzIGEgc291cmNlIGluY29tcGF0aWJpbGl0eSwgdGhlIGNoYW5nZSBpcyBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIDIuMCBhbmQgd2l0aGluIHRoZSBvcmlnaW5hbCAKK3NwaXJpdCBvZiB0aGUgb3JpZ2luYWwgQVBJIGNvbnRyYWN0LiBJbmNsdWRlIGluIDIuMSByZWFkbWUuCiA8L2xpPgotPC91bD4gCis8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTkwIj4zMzk5MDwvYT4KKy5jbGFzcyBmaWxlIHRpbWUtc3RhbXBzIG91dCBvZiBzeW5jIHdpdGggLmphdmEgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY2NSI+MzI2NjU8L2E+CitDbG9zaW5nIGVsZW1lbnQgdHJhY2Ugc2hvdWxkIGhpZGUgY2hpbGRyZW4gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2MzQiPjMyNjM0PC9hPgorSW1wcm92ZSByZWFkYWJpbGl0eSBvZiBjb21waWxpbmcgcHJvZ3Jlc3MgbWVzc2FnZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQ5Ij4zMzk0OTwvYT4KK0RPTTogYXNzZXJ0IHN0YXRlbWVudCBoYXMgd3JvbmcgbGVuZ3RoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2OTUiPjMzNjk1PC9hPgorcHJvamVjdCBidWlsZCBwYXRoIGJyb2tlbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ3NSI+MzM0NzU8L2E+CitCdWlsZCBwYXRoIHNlZW1zIHRvIGJlIGxvc3QgZXZlcnkgdGltZSBFY2xpcHNlIHJlc3RhcnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzg1Ij4zMzc4NTwvYT4KK09wZW4gb24gc2VsZWN0aW9uIGZhaWxzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODAwIj4zMzgwMDwvYT4KK3NlYXJjaDogcmVwb3J0aW5nIHRvbyBtYW55IG1ldGhvZCBvY2N1cnJlbmNlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgwNiI+MzM4MDY8L2E+CitDb2RlIGFzc2lzdCBmYWlsdXJlOiBhc3NpZ25tZW50IG9mIGRvdWJsZSBpbiBmb3IgbG9vcCBoaWRlcyBwcmV2aW91cyB2YXJpYWJsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc1NCI+MzM3NTQ8L2E+CitJSmF2YVByb2plY3QuaXNPbkNsYXNzcGF0aCBzaG91bGQgYW5zd2VyIGZhbHNlIGZvciB3b3JraW5nIGNvcGllcyBvdXRzaWRlIHRoZSBjbGFzc3BhdGgKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5MTgiPjMzOTE4PC9hPgorTGlicmFyaWVzIGFyZSBub3QgcHJlc2VudGVkIGluIHRoZSBQYWNrYWdlIEV4cGxvcmVyIChJMDMwMjI3KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODQzIj4zMzg0MzwvYT4KK0NvbXBpbGVyIGluY29ycmVjdGx5IGdlbmVyYXRpbmcgc3RhdGljIG1ldGhvZCBjYWxscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjI1Ij4zMzYyNTwvYT4KK1NlYXJjaGluZyBmb3IgZmllbGQgcmVmZXJlbmNlcyB3aXRoIFNlYXJjaEVuZ2luZSByZXR1cm5zIHNvbWUgaW5jb3JyZWN0IHJlc3VsdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTYxMCI+MzE2MTA8L2E+CitJREUgZG9lcyBoYW5nLXVwCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gNHRoIE1hcmNoIDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzAyYQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzU3Ij4zMzc1NzwvYT4KK1Byb2JsZW0gbm90IGRldGVjdGVkIHdoZW4gb3BlbmluZyBhIHdvcmtpbmcgY29weSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc1MyI+MzM3NTM8L2E+CitNaXNzaW5nIHJlc291cmNlIG1lc3NhZ2VzIGNvdWxkIGJlIGltcHJvdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NDgiPjMzNzQ4PC9hPgorQ2Fubm90IG9wZW4gd29ya2luZyBjb3B5IG9uIC5qYXZhIGZpbGUgaW4gc2ltcGxlIHByb2plY3QgCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KIAotPGgxPgorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyMSAtIDIxc3QgSnVuZSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MQorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gNHRoIE1hcmNoIDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzAyCiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08L3VsPiAKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY5MyI+MjA2OTM8L2E+ICAKLUZpbmRpbmcgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMgZG9lcyBub3QgZmluZCBhbGwgb2NjdXJhbmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMDExIj4yMDAxMTwvYT4gIAotU2VhcmNoaW5nIGZvciBJbm5lciBDbGFzc2VzIGdpdmVzIGJhZCBzZWFyY2ggcmVzdWx0cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTIwIj4yMDUyMDwvYT4gIAotUmVmYWN0b3IgLSBleHByZXNzaW9uIGRldGVjdGlvbiBpbmNvcnJlY3QKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NDMiPjIwNjQzPC9hPiAgCi1KYXZhIFByb2plY3RzIGRpc2FwcGVhcgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MjAgLSAyMHRoIEp1bmUgMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjAKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTwvdWw+IAotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTMyIj4yMDUzMjwvYT4gIAotRGVjbGFyYXRpb24gb2YgbWVtYmVyIGJpbmFyeSB0eXBlIG5vdCBmb3VuZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk3OTkiPjE5Nzk5PC9hPiAgCi1Nb3JlIHByb2JsZW1zIHdpdGggaW1wb3J0aW5nLiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNDAiPjE2MTQwPC9hPgotTm9uLWphdmEgcHJvamVjdCBnZXRzIC5jbGFzc3BhdGgKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NTkiPjIwNjU5PC9hPiAgCi1Db21waWxlL3JlYnVpbGQgYW5hbHlzaXM6IHdoaXRlIHNwYWNlIGNhdXNlcyBsYXJnZSByZWJ1aWxkCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxOCAtIDE4dGggSnVuZSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1OQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPlVwZGF0ZWQgYWJvdXQuaHRtbCBmaWxlIHdpdGggcmVmZXJlbmNlIHRvIENQTCAxLjAuCis8bGk+R2VuZXJhbGl6YXRpb24gb2Ygd29ya2luZyBjb3B5IGRlbHRhczogdGhlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBhbnkgd29ya2luZyBjb3B5IChyZWd1bGFyIG9yIHNoYXJlZCkgCisJbm93IGZpcmVzIGFuIDxjb2RlPkVsZW1lbnRDaGFuZ2VkRXZlbnQ8L2NvZGU+IGFzIHdlbGwgaW5kaWNhdGluZyB0aGF0IHRoZSB3b3JraW5nIGNvcHkgaGFzIGJlZW4gCisJPGNvZGU+QURERUQ8L2NvZGU+IG9yIDxjb2RlPlJFTU9WRUQ8L2NvZGU+LiAKKwlVbnRpbCBub3csIG9ubHkgc2hhcmVkIHdvcmtpbmcgY29waWVzIHdlcmUgcHJvdmlkaW5nIHN1Y2ggZGVsdGEgbm90aWZpY2F0aW9ucy4KKyAgICAgIDxicj5TZWU6IAorICAgICAgPHVsPgorICAgICAgPGxpPjxjb2RlPklXb3JraW5nQ29weS5nZXRXb3JraW5nQ29weSgpPC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGU+SVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3Rvcik8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT5JV29ya2luZ0NvcHkuZGVzdHJveSgpPC9jb2RlPjwvbGk+CisgICAgICA8L3VsPgogPC9saT4KLTwvdWw+IAorPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc5OSI+MzE3OTk8L2E+CitHZXR0aW5nIHNxdWlnZ2xpZXMgaW4gSmF2YSBmaWxlcyBub3Qgb24gY2xhc3NwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NTgiPjMxODU4PC9hPgorTlBFIGluIGxvZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM3MSI+MzMzNzE8L2E+CitSZW5hbWUgbWV0aG9kIGRpYWxvZzogRXJyb3IgbWVzc2FnZSBzaG91bGQgcXVvdGUgbmFtZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4NiI+MzM2ODY8L2E+CitNaXNzaW5nIGV4dGVuc2lvbiBwb2ludCBzY2hlbWFzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5ODEiPjMyOTgxPC9hPgorQ2FuY2VsIEV4dHJhY3QgSW50ZXJmYWNlIHJlZmFjdG9yaW5nIGRvZXMgbm90IGNsZWFudXAgd29ya2luZyBjb3BpZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2OTIiPjMzNjkyPC9hPgorQ2xlYW51cCBpbiB0aGUgYmF0Y2ggY29tcGlsZXIgZGVmYXVsdCBvcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NTMiPjMzNjUzPC9hPgorUmVsZXZhbmNlIC0gc2hvdWxkIHByaXZpbGVnZSB0eXBlIG5vdCBuZWVkaW5nIHF1YWxpZmljYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzAzOSI+MzMwMzk8L2E+CitRdWljayBGaXg6IElBRSBuIGludm9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU4OCI+MzI1ODg8L2E+CitFcnJvciBzYXZpbmcgY2hhbmdlZCBzb3VyY2UgZmlsZXM7IGFsbCBmaWxlcyBpbiBwcm9qZWN0IGRlbGV0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU2MCI+MzM1NjA8L2E+CitXb3Jrc3BhY2Ugc2hvd3MgdGVtcG9yYXJ5IHByb2JsZW1zIGFsc28gdGhlIGNvbXBpbGVyIGRvZXNuJ3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc2NSI+MzE3NjU8L2E+Citwcml2YXRlIHJlY3Vyc2l2ZSBtZXRob2RzIG5vdCBtYXJrZWQgYXMgdW51c2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyMzEiPjMzMjMxPC9hPgorRGVhZGxvY2sgcGVyZm9ybWluZyBDVlMgZGVjb3JhdGlvbiB3aGlsZSBKUkUgaW5pdGlhbGl6ZXJzIGFyZSBpbnZva2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NzEiPjMzNTcxPC9hPgorU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lczogTlBFIHdoZW4gcGFzc2luZyBudWxsIGFzIHByb2dyZXNzIG1vbml0b3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwMzUiPjMzMDM1PC9hPgorT3V0T2ZNZW1vcnlFeGNlcHRpb24gd2hpbGUgc2VhcmNoaW5nIGZvciByZWZlcmVuY2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDQ1Ij4zMzQ0NTwvYT4KK0NvZGVBc3Npc3QgLSBSZWxldmFuY2UgaXMgbm90IGNvcnJlY3QgZm9yIGxvY2FsIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NjIiPjMzNDYyPC9hPgorTlBFIGR1cmluZyBzaHV0ZG93bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDI0Ij4zMzQyNDwvYT4KK05vIGNvbXBsZXRpb24gYXZhaWxhYmxlIGluIGxvY2FsIHR5cGUgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIyNSI+MzMyMjU8L2E+CitPdmVycmlkZSBtZXRob2RzLi4uIGluc2VydHMgbWV0aG9kcyBpbmNvcnJlY3RseSBpZiBjbGFzcyBib2R5IGlzIGFzIHt9Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyMDciPjMzMjA3PC9hPgorUmVqZWN0IG91dHB1dCBmb2xkZXIgdGhhdCBjb2luY2lkYXRlIHdpdGggc291cmNlIGZvbGRlciBpZiBub3QgZXF1YWwKIAogPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MjEiPjMzNjIxPC9hPgorSUNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQoaW50KSByZXR1cm5zIHN0cmFuZ2UgdGhpbmdzIHdoZW4gcGFyYW1ldGVyIGlzIGluIGEgZmllbGQgZGVjbGFyYXRpb24gaW5zaWRlIGFub255bW91cyBhbmQgbG9jYWwgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjk2Ij4zMzY5NjwvYT4KK0phdmEgc291cmNlIGV4Y2x1c2lvbiBmaWx0ZXIgc3RvcHBlZCB3b3JraW5nIGluIFJDMQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjUwIj4zMjI1MDwvYT4KK1JlcG9ydGluZyB1bnVzZWQgcHJpdmF0ZSBtZXRob2RzIGNvdWxkIGJlIGltcHJvdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MTAiPjMzNjEwPC9hPgorRGVsdGFzIHNlbnQgd2hpbGUgaW4gb3BlcmF0aW9uIGV4ZWN1dGVkIHdpdGggSmF2YUNvcmUucnVuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NzMiPjMzNTczPC9hPgorTlBFIGluIEluZGV4TWFuYWdlciBvbiBzaHV0ZG93bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTI3Ij4zMzUyNzwvYT4KK0luZXhhY3QgbWF0Y2ggc2VhcmNoaW5nIGluIGphdmEubWF0aC5CaWdEZWNpbWFsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTA1Ij4zMzUwNTwvYT4KK0NvbXBpbGVyIGZhaWxzIG9uIGFsbG93ZWQgaW5uZXIgY2xhc3MgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDYxIj4zMzQ2MTwvYT4KK05QRSB1cG9uIHNodXRkb3duCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NjYiPjMzNDY2PC9hPgorTlBFIG9uIHNodXRkb3duIGZyb20gSW5kZXhNYW5hZ2VyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NzUiPjMzNDc1PC9hPgorQnVpbGQgcGF0aCBzZWVtcyB0byBiZSBsb3N0IGV2ZXJ5IHRpbWUgRWNsaXBzZSByZXN0YXJ0cwogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjE3IC0gMTd0aCBKdW5lIDIwMDIKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU4CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyN3RoIEZlYnJ1YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzAxCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzMjEiPjMzMzIxPC9hPgorTlBFIGluIEluZGV4TWFuYWdlciBzaHV0ZG93bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzY0Ij4zMTc2NDwvYT4KK0NvbXBsZXRpb25FbmdpbmUgZG9lc24ndCBmZWVkIGVycm9ycyB0byBjb21wbGV0aW9uIHJlcXVlc3RvciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ4OCI+MzI0ODg8L2E+CitSZXF1ZXN0IHRvIGFkZC9yZW1vdmUgc291cmNlIGZvbGRlciB0byBpbmRleCBzaG91bGQgbm90IGxvb2sgYXQgYWN0aXZlIGpvYiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM5MiI+MzIzOTI8L2E+CitOUEUgaW4gU291cmNlTWFwcGVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzAxIj4zMjcwMTwvYT4KK0Rpc2Fzc2VtYmxlciBkb2Vzbid0IHNob3cgYWN0dWFsIG1vZGlmaWVycyBmb3IgbWVtYmVyIHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MTkiPjMyOTE5PC9hPgorSGllcmFyY2h5IHZpZXdzIHByb2dyZXNzIGJhciBpcyB1c2VsZXNzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTczIj4zMjk3MzwvYT4KK0NvZGVhc3Npc3QgcmVsZXZhbmNlIHNob3VsZCBwcml2aWxlZ2UgcHJlZml4IG1hdGNoIG92ZXIgbmVlZCBmb3IgcXVhbGlmaWNhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYyOSI+MzI2Mjk8L2E+CitEZWx0YVByb2Nlc3NvciB3YWxraW5nIHNvbWUgYmluYXJ5IG91dHB1dCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYxMiI+MzI2MTI8L2E+CitTYXZlZCBpbmRleCBmaWxlIG5hbWVzIGxlYWtpbmcgbmFtZXM/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNzYiPjMyMzc2PC9hPgorU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUvUXVhbGlmaWVyIHNob3VsZCBub3QgY3JlYXRlIGFuIG93biBjaGFyLWFycmF5IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjI4Ij4zMjYyODwvYT4gIAorVG9vIG11Y2ggdGltZSBmaW5kaW5nIG91dCB0aGVyZSBpcyBubyBzb3VyY2UgZHVyaW5nIHNlYXJjaCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk3NCI+MzI5NzQ8L2E+CitJbnZhbGlkIGNsYXNzcGF0aCBlcnJvciBvbiAuLmNsYXNzcGF0aCBlZGl0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5ODYiPjMyOTg2PC9hPgorU3RhY2sgb3ZlcmZsb3csIGluZmluYXRlIHJlY3Vyc2lvbiBpbiBjb21waWxlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYwNyI+MzI2MDc8L2E+CitSZW1vdmluZyBvdXRlciBmb2xkZXIgcmVtb3ZlcyBuZXN0ZWQgZm9sZGVyJ3MgY3VzIGZyb20gaW5kZXggCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MzciPjMyOTM3PC9hPgorS2luZCBub3Qgc2V0IGZvciBlbXB0eSBmaW5lLWdyYWluZWQgZGVsdGEgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MDkiPjMyOTA5PC9hPgorY29tcGlsZXIgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY5MCI+MzI2OTA8L2E+CitDbGFzc3BhdGggZXJyb3IgYXJlIG5vdCBkZXRlY3RlZCBhZnRlciBhIENoZWNrIG91dAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjczOCI+MzI3Mzg8L2E+CitUVlQ6IEV4dGVybmFsaXplZCBTdHJpbmdzIHRvIGJlIHJlbW92ZWQgZnJvbSAucHJvcGVydGllcyBmaWxlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTU3Ij4zMjk1NzwvYT4KK1N0YWNrT3ZlckZsb3dFcnJvciByZW5hbWluZyBjbGFzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMyMyI+MzIzMjM8L2E+CitDVlMgaW5mb3JtYXRpb24gb24gY2xhc3MtRmlsZXMgbG9zdCBkdXJpbmcgInJlYnVpbGQgcHJvamVjdCIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU2MyI+MzI1NjM8L2E+CitJQUUgaW4gb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlLnRvQ2hhckFycmF5IChNNSkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MDAiPjMyOTAwPC9hPgorSmF2YSBvdXQgb2YgbWVtb3J5IHByb2JsZW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg0OCI+MjU4NDg8L2E+CitSZWRIYXQgTGludXggTEFORz1lbl9VUy5VVEYtOCAgY2F1c2VzIHNvbWUgZmlsZXMgKk5PVCogdG8gYmUgY29tcGlsZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU3OSI+MzI1Nzk8L2E+CithYnN0cmFjdCBwcm90ZWN0ZWQgbWV0aG9kIGNhbid0IGJlIG92ZXJyaWRkZW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU0NSI+MzI1NDU8L2E+CitDYW5ub3Qgb3ZlcnJpZGUgYSBtZXRob2QgdGhhdCdzIGFjY2Vzc2libGUgaW4gdGhlIHN1cGVyY2xhc3MsIGJ1dCBpbmFjY2Vzc2libGUgaW4gdGhlIHN1cGVyLXN1cGVyY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE3OSI+MzIxNzk8L2E+CitQcm9ibGVtcyBzZWFyY2hpbmcgZm9yIHJlZmVyZW5jZXMgdG8gc2VsZWN0ZWQgdGV4dAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDIxc3QgRmVicnVhcnkgMjAwMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zMDAgLSAyLjEgUkVMRUFTRSBDQU5ESURBVEUgMQogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPlJlbW92ZWQgZGVwcmVjYXRlZCAyLjAgdGVtcG9yYXJ5IEFQSTogPGNvZGU+SVdvcmtpbmdDb3B5I2ZpbmRTaGFyZWRXb3JraW5nQ29weSgpPC9jb2RlPiB3aGljaCB3YXMgbm8gbG9uZ2VyIHVzZWQgYW55d2F5LiBQcm9wZXIgQVBJIGlzIHRha2luZyAKLWEgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+IGluIGFyZ3VtZW50LjwvbGk+Ci08L3VsPiAKKzxsaT5JbiAxLjQgY29tcGxpYW50IG1vZGUsIHRoZSBjb21waWxlciB3aWxsIGFsbG93IHVudGVybWluYXRlZCBsaW5lIGNvbW1lbnQgKGkuZS4gd2l0aCBubyB0cmFpbGluZyBsaW5lIHNlcGFyYXRvciksIGFzIGEgY29uc2VxdWVuY2UKK29mIHRoZSBKTFMgcmV2aXNhbC4gVGh1cyByZW1vdmVkIHRlbXBvcmFyeSAoYW5kIHVudXNlZCkgMi4xIEFQSSA6Cis8Y29kZT5Ub29sRmFjdG9yeS5jcmVhdGVTY2FubmVyKGJvb2xlYW4gdG9rZW5pemVDb21tZW50cywgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIGJvb2xlYW4gYXNzZXJ0TW9kZSwgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yLCA8Yj5ib29sZWFuIHN0cmljdENvbW1lbnQ8L2I+KTwvY29kZT4KKzwvbGk+Cis8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDI3Ij4yMDQyNzwvYT4KLUo5YyBuZWVkcyBpbnRlcm5hbCBiYXRjaCBjb21waWxlciBtZXRob2RzIHRvIGJlIHB1YmxpYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzA5Ij4yMDMwOTwvYT4KLWNhbm5vdCBjb2RlIHJlc29sdmUgb24gYmluYXJ5IG1ldGhvZCB3aXRoIG1lbWJlciB0eXBlIGFyZ3VtZW50cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTU4Ij4yMDE1ODwvYT4KLUNsb3NlIGFuZCByZW9wZW4gYSBwcm9qZWN0IGRvZXMgbm90IHJlbW92ZSBlcnJvcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyNSI+MjAzMjU8L2E+Ci1DUCBWYXJpYWJsZSAtIHNob3VsZCBub3QgcGVyc2lzdCAiaW5pdGlhbGl6YXRpb24gaW4gcHJvZ3Jlc3MiIHZhbHVlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxNzMiPjIwMTczPC9hPgotT3BlbiB0eXBlIGZyb20gYSBqYXIgbG9jYXRlZCBpbnNpZGUgYSBjbG9zZWQgcHJvamVjdC4KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDEzNSI+MjAxMzU8L2E+Ci0yLjAgZGVwcmVjYXRlZCBtZXRob2QKKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzQyIj4zMjM0MjwvYT4KK1RoZSBmaWVsZCB0eXBlIENsYXNzX0EgaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0NzYiPjMyNDc2PC9hPgorU3BlYyBub3cgYWxsb3dzIGxpbmUgY29tbWVudCB0byBlbmQgd2l0aCBFT0YKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMzOSI+MzIzMzk8L2E+CitDYW5ub3QgZmluZCBkZWNsYXJhdGlvbiBvZiBTSUdOQVRVUkUgaW4gSmF2YSB0ZXh0IHNlYXJjaAogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM1OSI+MjAzNTk8L2E+Ci1jbGFzc3BhdGggdmFyaWFibGUgRUNMSVBTRV9IT01FIG5vdCBpbml0aWFsaXplZCBvbiBzdGFydHVwCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNjEiPjIwMjYxPC9hPgotY3ljbGUgaW4gY2xhc3NwYXRoIGRldGVjdGlvbiBzZWVtcyBvdmVyemVhbG91cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODI2Ij4xOTgyNjwvYT4KLWxpdmVsb2NrIGR1cmluZyBpbmRleGluZz8KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA0OCI+MjAwNDg8L2E+Ci1NaW5pbWl6ZSByZWNvbXBpbGF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwNTMiPjIwMDUzPC9hPgotaW50ZXJmYWNlIHdpdGggc2FtZS1uYW1lZCBtZXRob2QgZ2VuZXJhdGVzIGNvbXBpbGUgZXJyb3IKIAotPGgxPgorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxMiAtIDEydGggSnVuZSAyMDAyIC0gRlJFRVpFIDMKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU3CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyMHRoIEZlYnJ1YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjk5CiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08L3VsPiAKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUzNyI+MTk1Mzc8L2E+Ci1JbnRlcm5hbCBlcnJvciBzYXZpbmcgZmlsZSAoanplbnRyeSA9PSAwKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTE3Ij4xOTkxNzwvYT4KLUNvZGUgQXNzaXN0IGluY29ycmVjdCBmb3IgaGlkZGVuIGludGVyZmFjZSBmaWVsZHMKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MTYiPjE5OTE2PC9hPgotRXJyb3IgYWNjZXNzaW5nIHZhbHVlIGZyb20gdW5pbml0aWFsaXplZCBsb2NhbHZhcmlhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NjYiPjE5NTY2PC9hPgotSW52YWxpZCBDbGFzc0Nhc3RFeGNlcHRpb24gdGhyb3duIGF0IHJ1bnRpbWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA2Ij4zMzA2PC9hPgotQ2FuJ3QgY29tcGlsZSBKREsgc3JjCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NTEiPjE5ODUxPC9hPgotSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIHJlZmFjdG9yLWV4dHJhY3QgbWV0aG9kIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNzIiPjcyNzI8L2E+Ci1PcGVuIG9uIHNlbGVjdGlvbiBub3Qgd29ya2luZyBpbiBleHRlcm5hbCBKQVJzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMTkiPjE0MjE5PC9hPgotRU9GIGV4Y2VwdGlvbiBhZnRlciBidWlsZGluZyBpbiBpbXBvcnRlZCBwbHVnaW4gd2l0aCBleHRyYWN0ZWQgc291cmNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyOTAiPjE4MjkwPC9hPgotSW5jb3JyZWN0IGVycm9ycyByZXBvcnRlZCBkdXJpbmcgcmVjb25jaWxpbmcKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjExIC0gMTF0aCBKdW5lIDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NgotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPiBBZGRlZCBwcm90ZWN0aW9uIGFyb3VuZCBsaXN0ZW5lciBjYWxsYmFjayBpbnZvY2F0aW9ucyAodXNpbmcgPGNvZGU+SVNhZmVSdW5uYWJsZTwvY29kZT4pLiA8L2xpPgotPGxpPiBSZW1vdmVkIDIgdW51c2VkIGRlcHJlY2F0ZWQgY29uc3RhbnRzIG9uIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzPC9jb2RlPjogUkVBRF9SRUZFUkVOQ0VTIGFuZCBXUklURV9SRUZFUkVOQ0VTLgotVGhleSB3ZXJlIGFubm90ZWQgd2l0aCBpbnRlbnRpb24gdG8gZGlzY2FyZCBiZWZvcmUgMi4wIHNpbmNlIHdlcmUgdGVtcG9yYXJpbHkgaW50cm9kdWNlZCBhbmQgZGVwcmVjYXRlZCAoZHVlIHRvIGJhZCBuYW1pbmcpLgorPGxpPkFkZGVkIGhlbHBlciBtZXRob2QgdG8gZXh0cmFjdCBwcm9ibGVtIG1hcmtlciBhcmd1bWVudHM6IDxjb2RlPkNvcnJlY3Rpb25FbmdpbmUuZ2V0UHJvYmxlbUFyZ3VtZW50cyhJTWFya2VyIHByb2JsZW1NYXJrZXIpPC9jb2RlPgorPGxpPkFkZGVkIDIgc2V0dGluZ3MgdG8gZGlzYWJsZSBjbGFzc3BhdGggZW5oYW5jZW1lbnRzIHdoaWNoIGNvdWxkIGFmZmVjdCAyLjAgY2xpZW50cy4KIDxwcmU+Ci0JLyoqIAotCSAqIEBkZXByZWNhdGVkIC0gdXNlIFdSSVRFX0FDQ0VTU0VTIGluc3RlYWQgKHdpbGwgYmUgZGlzY2FyZGVkIGJlZm9yZSAyLjApCi0JICogQHNpbmNlIDIuMAotCSAqLwotCWludCBXUklURV9SRUZFUkVOQ0VTID0gV1JJVEVfQUNDRVNTRVM7Ci0JPC9wcmU+PC9saT4KLTwvdWw+IAorKiBKQVZBQ09SRSAvIEVuYWJsaW5nIFVzYWdlIG9mIENsYXNzcGF0aCBFeGNsdXNpb24gUGF0dGVybnMKKyogICAgV2hlbiBzZXQgdG8gImRpc2FibGVkIiwgbm8gZW50cnkgb24gYSBwcm9qZWN0IGNsYXNzcGF0aCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCisqICAgIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuLgorKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucyIKKyogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKyogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgorKiAKKyogSkFWQUNPUkUgLyBFbmFibGluZyBVc2FnZSBvZiBDbGFzc3BhdGggTXVsdGlwbGUgT3V0cHV0IExvY2F0aW9ucworKiAgICBXaGVuIHNldCB0byAiZGlzYWJsZWQiLCBubyBlbnRyeSBvbiBhIHByb2plY3QgY2xhc3NwYXRoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKyogICAgYSBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24sIHByZXZlbnRpbmcgdGh1cyB1c2FnZSBvZiBtdWx0aXBsZSBvdXRwdXQgbG9jYXRpb25zLgorKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucyIKKyogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKyogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgorPC9wcmU+Cis8bGk+UmVtb3ZlZCB0ZW1wb3JhcnkgMi4xIEFQSSA6CisgICAgPHVsPgorICAgICA8bGk+PGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3QuY29tcHV0ZVNvdXJjZUF0dGFjaG1lbnRSb290UGF0aChJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCk8L2NvZGU+CisgICAgIDwvbGk+CisgICAgIDxsaT48Y29kZT5JSmF2YU1vZGVsTWFya2VyLlVOQk9VTkRfQ09OVEFJTkVSPC9jb2RlPiwgdXNlIGNsYXNzcGF0aCBwcm9ibGVtIG1hcmtlciBJRCBpbnN0ZWFkICg8Y29kZT5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQ8L2NvZGU+KS4KKyAgICAgPC9saT4KKyAgICAgPGxpPjxjb2RlPklKYXZhTW9kZWxNYXJrZXIuVU5CT1VORF9WQVJJQUJMRTwvY29kZT4sIHVzZSBjbGFzc3BhdGggcHJvYmxlbSBtYXJrZXIgSUQgaW5zdGVhZCAoPGNvZGU+SUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DUF9WQVJJQUJMRV9QQVRIX1VOQk9VTkQ8L2NvZGU+KS4KKyAgICAgPC9saT4KKyAgICA8L3VsPgorPC9saT4KKzwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk3MTQiPjE5NzE0PC9hPgotRWNsaXBzZSBjcmFzaGVzOiBEcmFnICYgRHJvcAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5Nzk0Ij4xOTc5NDwvYT4KLU1ldGhvZCBib2R5IGNoYW5nZSBtYXkgcmVzdWx0IGluIG1hc3NpdmUgcmVjb21waWxhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTgzIj4xODk4MzwvYT4KLVJlcGxhY2luZyBiaW5hcnkgcHJvamVjdCBkb2Vzbid0IHRyaWdnZXIgYnVpbGQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk1MyI+MTg5NTM8L2E+Ci1QYWNrYWdlIGRpc2FwZWFycyB3aGVuIGRpc2Nvbm5lY3RlZCBmcm9tIENWUyByZXBvcHNpdG9yeQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NjM4Ij4xOTYzODwvYT4KLU9wZW4gVHlwZSBIaWVyYXJjaHkgY2FuIHN0YXJ0IGluZmluaXRlIHByb2dyZXNzIG1vbml0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTY4NyI+MTk2ODc8L2E+Ci1QcmVmZXJlbmNlcyBub3Qgd29ya2luZyB3aXRoIGltcG9ydC9leHBvcnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUxMiI+MTk1MTI8L2E+Ci1BcnJheUluZGV4T3V0T2ZCb3VuZCBkdXJpbmcgaW5jcmVtZW50YWwgYnVpbGQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODkyMiI+MTg5MjI8L2E+Ci1TY3JhcGJvb2sgZG9lcyBub3QgY29tZSBiYWNrIHdoZW4gZXJyb3JzIGluIHNuaXBwZXQgIAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1NzgiPjI5NTc4PC9hPgorSXNzdWVzIHdpdGggbWlncmF0aW5nIHNoYXJlZCBkYXRhCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNDAiPjMyMDQwPC9hPgorTXVsdGlwbGUgb3V0cHV0IGZvbGRlcnMgZm9vbGluZyBKYXZhIGJ1aWxkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIxNyI+MzIyMTc8L2E+CitNaXNzaW5nIEphdmFDb3JlIGluIEpEVC9Db3JlIHByb2plY3QgaW5kZXgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMzOCI+MzIzMzg8L2E+CitBdXRvIGdlbmVyYXRlZCBjb21tZW50cyBvZiBxdWlja2ZpeCBtZXRob2QgZ2VuZXJhdGlvbiBmb3IgdW5uYW1lZCBwYWNrYWdlIGNsYXNzIGlzIHdyb25nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNzEiPjMyMjcxPC9hPgorVHlwZSBIaWVyYXJjaHkgUHJvZ3Jlc3MgbW9uaXRvciBpbXByb3ZlbWVudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyNjciPjMyMjY3PC9hPgorVHlwZUhpZXJhcmNoeS4gRG9lcyBub3Qgc2V0IHByb2dyZXNzIG1vbml0b3IgdG8gZG9uZSB3aGVuIGNhbmNlbGxlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIxOCI+MzIyMTg8L2E+CitJbmV4YWN0IG1hdGNoZXMgZm91bmQgd2hlbiBzaG91bGQgYmUgZXhhY3QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwMTYiPjMxMDE2PC9hPgorYnVpbGRlciBleGNlcHRpb24gZm91bmQgaW4gbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyMjUiPjMyMjI1PC9hPgoraW5jb3JyZWN0IGRlbHRhIGFmdGVyIGRlbGV0aW5nIDIgZmllbGRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjE5Ij4zMjIxOTwvYT4KK0phdmFNb2RlbCBvcGVyYXRpb25zIGZhaWwgd2l0aCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgYXJyYXkgZW1wdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE4MiI+MzIxODI8L2E+CitOUEUgcGVyZm9ybWluZyBzZWFyY2ggCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5OTQiPjI3OTk0PC9hPgorQ29kZSBBc3Npc3QgcmVwbGFjZSBtb2RlIGluY29uc2lzdGVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA0MSI+MzIwNDE8L2E+CitNdWx0aXBsZSBvdXRwdXQgZm9sZGVycyBmb29saW5nIEphdmEgTW9kZWwgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxOTYiPjMyMTk2PC9hPgorUGF0Y2g6IGNvcnJlY3RseSBkZXRlY3QgbWlzaXNuZyAucnNjIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjExMSI+MzIxMTE8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZHVyaW5nIGRlbGV0ZSBvZiBtZW1iZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxMDAiPjMyMTAwPC9hPgord2hlbiBzdXBlcnBhY2thZ2UgcGFja2FnZSBlbXB0eSBkZWxldGluZyBhIHN1YnBhY2thZ2UgZGVsZXRlcyBzdXBlcnBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTY0NiI+MzE2NDY8L2E+CitObyBwcm9wb3NhbCB1c2luZyBjb2RlIGFzc2lzdCBpbiBmaWVsZCBpbml0aWFsaXplcgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgwOCI+MTk4MDg8L2E+Ci1jb3JlIENsYXNzQ2FzdEV4Y2VwdGlvbiBleGNlcHRpb24gaW4gbG9nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4ODIiPjE5ODgyPC9hPgotbWF5YmUgYSBjdSdzIHNpbmdsZSB0eXBlIGNhbiBiZSBpdHMgcHJvaW1hcnkgdHlwZSB0b28KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTU4NiI+MTk1ODY8L2E+Ci1KYXZhIHByb2plY3QgcmVtb3ZlZCBmcm9tIFByb2plY3RzIHZpZXcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk3MiI+MTU5NzI8L2E+Ci1KQVIgZmlsZSBmcm9tIGNsYXNzcGF0aCBub3QgaW5kZXhlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjgwIj4xODY4MDwvYT4KLUNsYXNzcGF0aCBMb29wCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIyNyI+MzIyMjc8L2E+CitTZXJpYWxpemF0aW9uIGluY29tcGF0aWJpbGl0eSB3aXRoIFN1bidzIDEuNCBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDI2Ij4yODQyNjwvYT4KK0NvbnRlbnQgQXNzaXN0IGRpc3BsYXlzIHgoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSBzaG91bGQgYmUgeChTdHJpbmcgc3RyLCBTdHJpbmcgZGVsaW0pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNjQiPjMyMTY0PC9hPgorU2VyaWFsaXphdGlvbiBtZXRob2RzIHdpdGggcHJpdmF0ZSBvciBhcmJpdHJhcnkgYWNjZXNzIG1vZGlmaWVycyBzaG91bGQgYmUgaWdub3JlZCBieSAidW51c2VkIHByaXZhdGUgbWVtYmVycyIgY29tcGlsZXIgY2hlY2suCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwOTciPjMyMDk3PC9hPgorUmVncmVzc2lvbiAtIGF0dGFjaGVkIHNvdXJjZSBub3QgZm91bmQgd2hlbiBpbiBhIHN1YmRpcmVjb3J5IG9mIGFyY2hpdmUKIAotPGgxPgorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYwNiAtIDZ0aCBKdW5lIDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NQorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTh0aCBGZWJydWFyeSAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5OAogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPlJlbW92ZWQgZGVwcmVjYXRlZCBBUEkgb24gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4gVGhlc2Ugd2VyZSBub3QgaW4gMS4wLCBhbmQgc2hvdWxkbid0IGhhdmUgYmVlbgotaW50cm9kdWNlZCAoaW5jb3JyZWN0bHkgcmVzdXJyZWN0ZWQgZnJvbSAwLjkpLgorPGxpPkZpeCBmb3IgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTk3Ij4zMTk5NzwvYT4KKyAgICAgcmVxdWlyZXMgdGhlIGluZGV4IGZvcm1hdCB0byBiZSBjaGFuZ2VkLiBJbmRleGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdlbmVyYXRlZCB1cG9uCisgICAgIHN1YnNlcXVlbnQgc2VhcmNoIHF1ZXJpZXMgKGFjY291bnRpbmcgZm9yIGluZGV4aW5nIG5vdGlmaWNhdGlvbiBpbiBzZWFyY2ggcHJvZ3Jlc3MgZGlhbG9ncykuCis8L2xpPgorPGxpPlVudXNlZCBwYXJhbWV0ZXIgZGlhZ25vc2lzIHdpbGwgbm93IGlnbm9yZSBwYXJhbWV0ZXJzIGluIGFuIGFic3RyYWN0IG1ldGhvZCwKK2EgbWFpbiBtZXRob2QsIGFuIGltcGxlbWVudGF0aW9uIG9mIGFuIGFic3RyYWN0IG1ldGhvZCBvciBhIG1ldGhvZCBvdmVycmlkaW5nIGEKK2NvbmNyZXRlIG9uZS4gQWRkaXRpb25hbCBzZXR0aW5ncyBnb3QgYWRkZWQgZm9yIGVuYWJsaW5nIHRoZSBkaWFnbm9zaXMgb2YgdGhlIGxhdHRlcgordHdvIHNjZW5hcmlpLgorPHByZT4KKyogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFBhcmFtZXRlciBpZiBJbXBsZW1lbnRpbmcgQWJzdHJhY3QgTWV0aG9kCisqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVudXNlZCBwYXJhbWV0ZXJzIGluIGFic3RyYWN0IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuCisqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIuCisqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QiCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZGlzYWJsZWQiCisqCisqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBQYXJhbWV0ZXIgaWYgT3ZlcnJpZGluZyBDb25jcmV0ZSBNZXRob2QKKyogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgdW51c2VkIHBhcmFtZXRlcnMgaW4gbWV0aG9kcyBvdmVycmlkaW5nIGNvbmNyZXRlIG9uZXMuCisqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIuCisqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlIgorKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZW5hYmxlZCIsICJkaXNhYmxlZCIgfQorKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgorPC9wcmU+Cis8L2xpPgorPGxpPjxiPkNvZGUgY29tcGxldGlvbiBlbmhhbmNlbWVudDo8L2I+CisgICA8dWw+CisgICA8bGk+UmVsZXZhbmNlIG9mIGEgcHJvcG9zYWwgaXMgaGlnaGVyIGlmIHRoZSBwcm9wb3NhbCBpcyBhIHZhcmlhYmxlIG5hbWUgYW5kIHRoaXMgbmFtZSBjb250YWlucyBhIHByZWZpeC48L2xpPgorICAgPGxpPlJlbGV2YW5jZSBvZiBhIHByb3Bvc2FsIGlzIGhpZ2hlciBpZiB0aGUgcHJvcG9zYWwgaXMgYSB2YXJpYWJsZSBuYW1lIGFuZCB0aGlzIG5hbWUgY29udGFpbnMgYSBzdWZmaXguPC9saT4KKyAgIDwvdWw+Cis8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEwNyI+MzIxMDc8L2E+CitJbmRleCBzaWduYXR1cmUgY2hhbmdlIGlzbid0IGhvbm91cmVkIGFueSBsb25nZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk5NyI+MzE5OTc8L2E+CitSZWZhY3RvcmluZyBkLm4uIHdvcmsgZm9yIHByb2plY3RzIHdpdGggYnJhY2tldHMgaW4gbmFtZS4gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0MTciPjMxNDE3PC9hPgorV2hlcmUgaGFzIHRoZSAiUm9vdCBQYXRoIiBmaWVsZCBnb25lPyBbZG9jXSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjAwMCI+MzIwMDA8L2E+CitJSmF2YU1vZGVsLmNvbnRhaW5zKCkgcmV0dXJucyB0cnVlIGZvciByZXNvdXJjZXMgY29waWVkIGludG8gYmluIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTQ3Ij4zMTk0NzwvYT4KK05QRSBvbiBzaHV0ZG93biBpbiBCbG9ja3NJbmRleElucHV0LmNsb3NlKCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk4NSI+MzE5ODU8L2E+CitOUEUgc2VhcmNoaW5nIG5vbi1xdWFsaWZpZWQgYW5kIGNhc2UgaW5zZW5zaXRpdmUgdHlwZSByZWYgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2MzciPjI4NjM3PC9hPgorW1ByZWZlcmVuY2VzXSBJbXBvcnQgUHJlZmVyZW5jZXM6IENvbnNvbGUgTWVzc2FnZTogQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiBQcm9sb2cgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NDgiPjMxNzQ4PC9hPgorW3NlYXJjaF0gc2VhcmNoIGZvciByZWZlcmVuY2UgaXMgYnJva2VuIDIuMSBNNSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk5MCI+MzE5OTA8L2E+CitXb3JraW5nIGNvcHkgb3BlcmF0aW9ucyBzaG91bGQgbm90IHRha2Ugd29ya3NwYWNlIGxvY2sgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MTEiPjMxODExPC9hPgorVmVyaWZ5RXJyb3Igd2l0aCBodWdlIHN3aXRjaCBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NzgzIj41NzgzPC9hPgorUHJvYmxlbSBjb3VudHMgYXJlIG5vdCBhY2N1bXVsYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjUyIj4zMTY1MjwvYT4KK05hbWluZ0NvbnZlbnRpb24uc3VnZ2VzdFhYTmFtZXM6IFB1dCB0aGUgbW9zdCByZWxldmFudCBmaXJzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjI4Ij4zMTYyODwvYT4KK1JlZHVuZGFudCBpbXBvcnQgbmVlZCBhIHdhcm5pbmcgKG1hdGNoaW5nIHBhY2thZ2UgZGVjbGFyYXRpb24pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NjciPjMxODY3PC9hPgorTm8gdW51c2VkIGltcG9ydCBkaWFnbm9zaXMgb24gZHVwbGljYXRlIGltcG9ydAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDk1Ij4zMTQ5NTwvYT4KK1Nob3VsZCB3cml0ZU9iamVjdC9yZWFkT2JqZWN0IGJlIGEgY29tcGlsZXIgd2FybmluZz8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTUzOCI+MzE1Mzg8L2E+CitzZXJpYWxWZXJzaW9uVUlEIGJlaW5nIGZsYWdnZWQgYXMgYW4gInVudXNlZCIgZmllbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc1NyI+MzE3NTc8L2E+CitGb2xkZXIgd2l0aCBpbnZhbGlkIHBrZyBuYW1lIHNob3VsZCBiZSBub24tSmF2YSByZXNvdXJjZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIwNCI+MjUyMDQ8L2E+CitFY2xpcHNlIGNvbXBpbGVyIG9wdGlvbjogVW51c2VkIHBhcmFtZXRlcnMgKGkuZS4gbmV2ZXIgcmVhZCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzI1MSI+MjcyNTE8L2E+CitDb21waWxlciBwcmVmZXJlbmNlczogVW51c2VkIHBhcmFtZXRlcnMgLSBpZ25vcmUgbWFpbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzgzIj4zMTM4MzwvYT4KK1N0cmFuZ2UgcmVuZGVyaW5nIG9mIG9mIGxpbmsgcmVzb3VyY2VzIHdoZW4gbGluayBwb2ludHMgdG8gRWNsaXBzZSB3b3Jrc3BhY2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NTYiPjMxNzU2PC9hPgorQ29kZSBhc3Npc3Q6IGZhaWxzIGluc2lkZSBhbiBhcnJheSB3aGljaCBpbnNpZGUgYSBmdW5jdGlvbiBjYWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMjQ4Ij4zMTI0ODwvYT4KK0phdmEgQ29tcGlsZXIgcHJvZ3Jlc3MgbW9uaXRvciB0ZWxscyBhYm91dCBwcm9iZWxtcyBmb3VuZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NzkwIj4yOTc5MDwvYT4KK09PTSBFeGNlcHRpb24gaW4gc2VhcmNoIGNhdXNlIElERSBmcmVlemUKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwODMiPjMyMDgzPC9hPgorb3ZlcnJpZGRlbiBtZXRob2RzIHRoYXQgY2hhbmdlIHZpc2liaWxpdHkgY2F1c2UgY29tcGlsZXIgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA0NCI+MzIwNDQ8L2E+CitQcmUgYXV0byBidWlsZCBub3RpZmljYXRpb24gZmlyZWQgd2hlbiBjbG9zaW5nIG9yIG9wZW5pbmcgYSBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5MDMiPjMxOTAzPC9hPgorTnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBsb2FkaW5nIGZyb20gcmVzcG9zaXRvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk2OCI+MzE5Njg8L2E+CitOb3RpZmllciBsb29zZSBuZXN0ZWQgbGV2ZWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5NDIiPjMxOTQyPC9hPgorQnVnIHdpdGggU2VsZWN0aW9uIFN0YXRlbWVudCBzd2l0Y2goKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTE2Ij4zMTkxNjwvYT4KK001IENyYXNoaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5MjMiPjMxOTIzPC9hPgorU291cmNlIGZvbGRlciBzcGVjaWZpYyBjb21waWxlciBzZXR0aW5ncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTE3Ij4zMTkxNzwvYT4KK1VudXNlZCBwcml2YXRlIG1ldGhvZCB3YXJuaW5nIGRvZXNuJ3Qga25vdyBhYm91dCByZWFkL3dyaXRlT2JqZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ1MiI+ODQ1MjwvYT4KK1dyb25nIHBvc2l0aW9uIGluIEZpZWxkUmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3OTciPjEyNzk3PC9hPgorQ2FuJ3QgYWRkIGRpcmVjdG9yeSBwb2ludGluZyB0byBjbGFzcy1maWxlcyB0byBwcm9qZWN0IGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDIzIj4xMTAyMzwvYT4KK0ZpbHRlciBjb2RlIGFzc2lzdCBjaG9pY2VzIGJhc2VkIG9uIGNvbnRleHQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjkzIj43MjkzPC9hPgorU2NydWJiaW5nIE91dHB1dCBEaXJlY3RvcnkgQ2FuIENhdXNlIEhhdm9jCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA5NiI+NjA5NjwvYT4KK0V4Y2VwdGlvbiB1c2luZyBjb2RlIGFzc2lzdCBhZnRlciBwYWNrYWdlIHJlbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNDMiPjUwNDM8L2E+CitGZWF0dXJlIFJlcXVlc3Q6IHNvdXJjZSBmb2xkZXJzIGluIG90aGVyIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ4OCI+NjQ4ODwvYT4KK0NsYXNzcGF0aCBWYXJpYWJsZXMgKGFsbG93IHBsdWdpbnMgdG8gcmVzZXJ2ZSBzb21lKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODA5Ij4zMTgwOTwvYT4KK0VjbGlwc2UgcmVwb3J0cyBlcnJvciBpbiB0YXNrIHZpZXcgLSBidXQgaXQncyBubyBlcnJvciEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODMxOSI+MjgzMTk8L2E+CitVbnVzZWQgcGFyYW1ldGVyIHNob3VsZCBiZSBsaW1pdGVkIHRvIGN1cnJlbnQgbWV0aG9kL2NsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEyNDMiPjMxMjQzPC9hPgorV2FybiBvZiB1bnVzZWQgcGFyYW1ldGVyczogU2hvdWxkIG5vdCB3YXJuIHdoZW4gbWV0aG9kIG92ZXJyaWRlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTM5Ij4yODEzOTwvYT4KK0hpZ2hsaWdodCB1bnVzZWQgbWV0aG9kIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IGluaGVyaXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzgwIj4zMTM4MDwvYT4KK05QRSBzZXR0aW5nIGNsYXNzcGF0aAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDEzdGggRmVicnVhcnkgMjAwMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTcKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5UbyBoZWxwIGZpeGluZyBidWcgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExMzUgIj4zMTEzNTwvYT4sCisgICAgICBhZGRlZCBuZXcgZmxhZyA8Y29kZT5GX1JFT1JERVI8L2NvZGU+IG9uIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPi4gVGhpcyBmbGFnIGlzIAorICAgICAgcG9zaXRpb25lZCBpZiBhIG1lbWJlciBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGNoYW5nZWQgaXRzIHBvc2l0aW9uIHJlbGF0aXZlbHkgdG8gaXRzIHNpYmxpbmdzLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NzYiPjMxNDc2PC9hPgorQ1UgaXMgb24gYnVpbGQgcGF0aCBhbHNvIGl0IGlzIGxvY2F0ZWQgaW4gYSBleGNsdWRlZCBmb2xkZXIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMDMiPjMxMzAzPC9hPgorY29weSBvZiByZWFkLW9ubHkgcGFja2FnZSBkb2Vzbid0IHByZXNlcnZlIHJlYWQtb25seSBmbGFnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQwNDUiPjI0MDQ1PC9hPgorRXJyb3IgZGVsZXRpbmcgcGFyZW50IGZvbGRlciBvZiBzb3VyY2UgZm9sZGVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjUzIj4zMTY1MzwvYT4KK3R5cG9zIGluIGphdmFkb2Mgb2YgTmFtaW5nQ29udmVudGlvbnMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA2MjMiPjMwNjIzPC9hPgorU3RyYW5nZSBqYXZhIGRlbHRhIHdoZW4gY3JlYXRpbmcgYSBuZXcgY2xhc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NDYiPjMxNDQ2PC9hPgorQ2Fubm90IGNhbmNlbCAnQ2xlYW5pbmcgb2Ygb3V0cHV0IGZvZGVyJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzU3Ij4zMDc1NzwvYT4KK091dCBvZiBtZW1vcnkgZXhjZXB0aW9uIGR1cmluZyBoaWVyYXJjaHkgc2NvcGVkIHNlYXJjaCAKKyAgIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0ODUiPjMwNDg1PC9hPgorQXJyYXlPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcgc2h1dGRvd24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDYwOSI+MzA2MDk8L2E+CitPdXRwdXQgZm9sZGVyIHNjcnViYmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDk3Ij4zMTQ5NzwvYT4KK0ludGVybmFsIGNvbXBpbGVyIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE1OTEiPjMxNTkxPC9hPgorYWJzdHJhY3QgbWV0aG9kIGluIGJhc2UgY2xhc3MsIGRlZmluZWQgaW4gYSBzdWJjbGFzcyByZXN1bHRzIGluIGNvbXBpbGUgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTYwNSI+MzE2MDU8L2E+CitTaW5nbGUgbGluZSBjb21tZW50IG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIHByb2R1Y2VzIGEgc3ludGF4IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE2MjYiPjMxNjI2PC9hPgorZ2V0SmF2YWRvYygpIG9uIFR5cGVEZWNsYXJhdGlvbiByZXR1cm5pbmcgaW5jb3JyZWN0IGNvbW1lbnQKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMXRoIEZlYnJ1YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjk2Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzc3Ij4zMTM3NzwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIG9uIGJpbmFyeSBpbXBvcnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NDEiPjMxNDQxPC9hPgorTWF0Y2ggaW4gamFyIG1pc3Npbmcgc2VhcmNoaW5nIGZvciByZWZlcmVuY2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzk4Ij4zMTM5ODwvYT4KK001IGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggcGFja2FnZSBhYnN0cmFjdCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEyMzAiPjMxMjMwPC9hPgorQ29kZSBhc3Npc3Qgb24gdmFyaWFibGUgbmFtZXM6IHVzZXMgcHJlZml4IGFuZCBzdWZmaXggdG9nZXRoZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTQ0MCI+MzE0NDA8L2E+CitDbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVyIGdldERlc2NyaXB0aW9uIHNob3VsZCBhbHNvIHRha2UgYSBwcm9qZWN0IGluIGFyZ3VtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEyNDIiPjMxMjQyPC9hPgorZXhjZXB0aW9uIG5hbWVzIHNob3VsZCB1c2UgTG9jYWwgVmFyIHN1ZmZpeC9wcmVmaXgsIG5vdCBNZXRob2QgUGFyYW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTE2OCI+MzExNjg8L2E+CitUcnlpbmcgdG8gb3BlbiBKYXZhLXNvdXJjZSBmaWxlIHdpdGggSmF2YSBlZGl0b3IgZmFpbHMgd2l0aCBJL08gRXhjZXB0aW9uLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMjYxIj4zMTI2MTwvYT4KK1N0cmFuZ2UgYmVoYXZpb3Igd2hlbiB0aGVyZSBpcyBtb3JlIGVycm9ycyB0aGFuIG1heCBlcnJvcnMgcGVyIGNvbXBpbGF0aW9uIHVuaXQKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NTAiPjMxNDUwPC9hPgorQ29tcGlsZXIgYnVnIHdpdGggb3ZlcnJpZGluZyBwcm90ZWN0ZWQgYWJzdHJhY3QgbWV0aG9kcywgd2hlcmUgYSBwYXJlbnQgY2xhc3MgaGFzIHBhY2thZ2UtcHJpdmF0ZSBhYnN0cmFjdCBtZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTQ3NSI+MzE0NzU8L2E+CitjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCwgYnV0IGNhbm5vdCBvdmVycmlkZSBpdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzIwIj4zMDcyMDwvYT4KK2xpbmtlZCByZXNvdXJjZXMgYW5kIGV4Y2x1c2lvbiBmaWx0ZXJzOiBjb21waWxlciBtYXJrZXJzIG5vdCBmbHVzaGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0NjciPjMxNDY3PC9hPgorc3B1cmlvdXMgIkluY29tcGF0aWJsZSBjb25kaXRpb25hbCBvcGVyYW5kIHR5cGVzIiBvbiA/OiB3aGVuIGFzc2lnbmluZyB0byBhYnN0cmFjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODAwIj4zMDgwMDwvYT4KK1NlYXJjaCAtIGRvZXNuJ3QgZmluZCBkZWNsYXJhdGlvbiBvZiBmaWVsZCB3aXRoIHVuaWNvZGUgbmFtZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTIyNSI+MzEyMjU8L2E+CitTb3VyY2UgYXR0YWNobWVudCBub3QgZm91bmQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTE0OCI+MzExNDg8L2E+CitmcmVlemVzIHdoZW4gZWRpdGluZyBhIGphdmEgZmlsZSBhbmQgYWRkaW5nIHdoaWxlKHN0Lmhhc01vcmVUb2tlcygpKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzMxIj4zMDczMTwvYT4KK0NsYXNzIG1vdmUgcmVmYWN0b3JpbmcgY2hhbmdlcyB0aGUgdW5saW5rZWQgcHJvamVjdHMgaW4gdGhlIHNhbWUgd29ya3BsYWNlCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gNnRoIEZlYnJ1YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjk1IC0gMi4xIE1JTEVTVE9ORS01IChha2EgMi4xIFJFTEVBU0UgQ0FORElEQVRFIDApCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgQVBJIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmdldERlc2NyaXB0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpPC9jb2RlPiBzbyBhcyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5CitvZiBvdXIgbWVzc2FnZXMgaW52b2x2aW5nIGNsYXNzcGF0aCBjb250YWluZXJzIChlLmcuIHVuYm91bmQgY29udGFpbmVyIGNsYXNzcGF0aCBwcm9ibGVtcykuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gYW5zd2VycwordGhlIG9yaWdpbmFsIGNvbnRhaW5lciBwYXRoLgorPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5NDYiPjMwOTQ2PC9hPgorRGVhZGxvY2sgaW4gY29kZSBwYXJzZXIKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5OTkiPjMwOTk5PC9hPgorSGFuZy9EZWFkbG9jayB3aGlsZSBpbnNlcnRpbmcgYnJhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDk0OSI+MzA5NDk8L2E+CitXaGVuIGNvbXBpbGVkIGZyb20gZWNsaXBzZSwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgaW4gdHJ5IC0gZmluYWxseSBibG9jayBhcmUgbm90IGRldGVjdGVkLgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDV0aCBGZWJydWFyeSAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5NAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBDbGFzc3BhdGggcHJvYmxlbSBtYXJrZXJzIGdlbmVyYXRlZCBmb3IgdW5ib3VuZCB2YXJpYWJsZSBvciBjb250YWluZXIgd2lsbCBoYXZlIGFuIGV4dHJhIGF0dHJpYnV0ZQorKHJlc3BlY3RpdmVseSBJSmF2YU1vZGVsTWFya2VyLlVOQk9VTkRfVkFSSUFCTEUgb3IgSUphdmFNb2RlbE1hcmtlci5VTkJPVU5EX0NPTlRBSU5FUikgd2hpY2ggdmFsdWUgaXMKK3RoZSB1bmJvdW5kIHZhcmlhYmxlIG9yIGNvbnRhaW5lciBuYW1lcy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byByZWNvZ25pemUgdGhlc2UgcHJvYmxlbXMsIGFuZCBjb250cmlidXRlIAorc3VpdGFibGUgcmVjb3ZlcnkgYWN0aW9ucyBmb3IgdGhlc2UuCis8L2xpPgorPGxpPiBQcm9qZWN0IGN5Y2xlcyBjYW4gbm93IGJlIGJ1aWx0IGFzIHNvb24gYXMgdGhlIGNvbXBpbGVyIHNldmVyaXR5IGZvciBjaXJjdWxhcgorZGVwZW5kZW5jaWVzIGlzIGxvd2VyZWQgdG8gYSB3YXJuaW5nIChzZWUgUHJlZmVyZW5jZXM+SmF2YT5Db21waWxlcj5PdGhlcj5DaXJjdWxhciBkZXBlbmRlbmNpZXM+V2FybmluZykuCis8L2xpPgorPGxpPiBTdXJmYWNlZCBjb21waWxlciBvcHRpb25zIGZvciByZXBvcnRpbmcgdXNhZ2Ugb2YgY2hhcltdIGluIFN0cmluZyBjb25jYXRlbmF0aW9ucyAoZGVmYXVsdCBpcyBzdGlsbCB3YXJuaW5nKS4KKzxwcmU+CisqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVzYWdlIG9mIGNoYXJbXSBFeHByZXNzaW9ucyBpbiBTdHJpbmcgQ29uY2F0ZW5hdGlvbnMKKyogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBjaGFyW10gZXhwcmVzc2lvbgorKiAgICBpcyB1c2VkIGluIFN0cmluZyBjb25jYXRlbmF0aW9ucyAoZS5nLiAiaGVsbG8iICsgbmV3IGNoYXJbXXsndycsJ28nLCdyJywnbCcsJ2QnfSkuCisqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiIKKyogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKKzwvcHJlPgorPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SUphdmFNb2RlbC5jb250YWlucygpPC9jb2RlPiB0byBmaW5kIG91dCBpZiBhbiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+IGlzIHZpc2libGUgaW4KKyAgICAgdGhlIEphdmEgbW9kZWwuCis8L2xpPgorPGxpPiAyLjEgQVBJIENoYW5nZSBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5OYW1pbmdDb252ZW50aW9uczogZGVwcmVjYXRlZCAnc3VnZ2VzdFNldHRlck5hbWUnIG1ldGhvZHMgcmVtb3ZlZC4KKwk8dWw+CisJPGxpPjxjb2RlPnN1Z2dlc3RTZXR0ZXJOYW1lKElKYXZhUHJvamVjdCxjaGFyW10saW50LGNoYXJbXVtdKTwvY29kZT4KKwk8L2xpPgorCTxsaT48Y29kZT5zdWdnZXN0U2V0dGVyTmFtZShJSmF2YVByb2plY3QsU3RyaW5nLGludCxTdHJpbmdbXSk8L2NvZGU+CisJPC9saT4KKwk8L3VsPgorPC9saT4KKzxsaT5BZGRlZCBBUEkgZm9yIHNvcnRpbmcgdGhlIG1lbWJlcnMgb2YgdHlwZXMgaW4gYSBjb21waWxhdGlvbi4KICAgPHVsPgotCTxsaT48Y29kZT5JSmF2YVByb2plY3QjZ2V0Q2xhc3NwYXRoKC4uLikgLS0mZ3Q7IElKYXZhUHJvamVjdCNnZXRSYXdDbGFzc3BhdGgoLi4uKSA8L2NvZGU+PC9saT4KLQk8bGk+PGNvZGU+SUphdmFQcm9qZWN0I3NldENsYXNzcGF0aCguLi4pIC0tJmd0OyBJSmF2YVByb2plY3Qjc2V0UmF3Q2xhc3NwYXRoKC4uLikgPC9jb2RlPjwvbGk+Ci0JPGxpPjxjb2RlPklKYXZhUHJvamVjdCNuZXdQcm9qZWN0RW50cnkoLi4uKSAtLSZndDsgSmF2YUNvcmUjbmV3UHJvamVjdEVudHJ5KC4uLikgPC9jb2RlPjwvbGk+Ci0JPGxpPjxjb2RlPklKYXZhUHJvamVjdCNuZXdMaWJyYXJ5RW50cnkoLi4uKSAtLSZndDsgSmF2YUNvcmUjbmV3TGlicmFyeUVudHJ5KC4uLikgPC9jb2RlPjwvbGk+Ci0JPGxpPjxjb2RlPklKYXZhUHJvamVjdCNuZXdTb3VyY2VFbnRyeSguLi4pIC0tJmd0OyBKYXZhQ29yZSNuZXdTb3VyY2VFbnRyeSguLi4pIDwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNvbXBpbGF0aW9uVW5pdFNvcnRlcjwvY29kZT4KKyAgICA8cHJlPgorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJVkVfT1JERVIgPSAicmVsYXRpdmVPcmRlciI7CitwdWJsaWMgc3RhdGljIHZvaWQgc29ydChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKKwlpbnRbXSBwb3NpdGlvbnMsCisJQ29tcGFyYXRvciBjb21wYXJhdG9yLAorCWludCBvcHRpb25zLAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKyAgICA8L3ByZT4KKyAgICA8L2xpPgogICA8L3VsPgogPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5NDciPjMwOTQ3PC9hPgorQ29kZUFzc2lzdCAtIHRvcCBsZXZlbCB0eXBlcyBhcmUgbm90IHByb3Bvc2VkIGlmIHR5cGUgaXMgcXVhbGlmaWVkIHdpdGggcGFja2FnZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTA3Ij4zMDkwNzwvYT4KK0NvZGUgYXNzaXN0IGRvZXNuJ3Qgd29yayBpbiBmaXJzdCBjYXNlIHN0YXRlbWVudCBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDkyMCI+MzA5MjA8L2E+CitTdGFjayBvdmVyZmxvdyB3aGVuIGNvbnRhaW5lciByZXNvbHZlZCB0byBudWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4NTUiPjMwODU1PC9hPgorV3JvbiBlcnJvciBtZXNzYWdlIHdoZW4gbmVzdGluZyBzb3VyY2UgZm9sZGVyIGluIGNsYXNzIGZvbGRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDg1NyI+MzA4NTc8L2E+CitJUGFja2FnZUZyYWdtZW50Um9vdDogY29weSByZW1vdmVzIHNvdXJjZSBmb2xkZXJzIGZyb20gY2xhc3NwYXRoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzU2Ij4yMjc1NjwvYT4KK1JlZmVyZW5jZSBzZWFyY2ggZG9lcyBub3QgcmVzcGVjdCBwYWNrYWdlIGZyYWdtZW50cyBzY29wZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDg2MCI+MzA4NjA8L2E+CitDb2RlQXNzaXN0IC0gUmVsZXZhbmNlIGlzIG5vdCBjb3JyZWN0IGZvciBtZW1iZXIgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4NTYiPjMwODU2PC9hPgorMS40IGNvbXBsaWFudCBtb2RlIHNob3VsZCBjb25zaWRlciBhYnN0cmFjdCBtZXRob2QgbWF0Y2hlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODI1Ij4zMDgyNTwvYT4KK01pc3NpbmcgUkVPUkRFUkVEX0lOX0NMQVNTUEFUSCBub3RpZmljYXRpb25zIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTA5Ij4yNjkwOTwvYT4KK05QRSBvcGVuaW5nIHR5cGUgaGllcmFyY2h5IGZvciBiaW5hcnkgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODMyIj4yOTgzMjwvYT4KK0JvZ3VzIHF1aWNrZml4ZXMgYWZ0ZXIgcmVtb3ZpbmcvYWRkaW5nIGNvcmUgcGx1Z2lucyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY5OSI+MzA2OTk8L2E+CitFeHRlcm5hbCBKQVI6IG5vIHJlZnJlc2ggaW4gSmF2YU1vZGVsIGlmIGZ1bGwgYnVpbGQgb2NjdXJyZWQgYmVmb3JlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjk3Ij4zMDY5NzwvYT4KK0NsYXNzcGF0aCBtYXJrZXIgdXBkYXRlIGNvdWxkIHRyaWdnZXIgYXV0b21hdGljIHJlZnJlc2ggZm9yIGV4dGVybmFsIEpBUnMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA4MDUiPjMwODA1PC9hPgorQWJzdHJhY3Qgbm9uLXZpc2libGUgbWV0aG9kIGRpYWdub3NpcyBmb29sZWQgYnkgaW50ZXJtZWRpYXRlIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTk3Ij4xNDU5NzwvYT4KK3JlYXJyYW5nZSBzb3VyY2UgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDE3Ij4zMDQxNzwvYT4KK0lDb2RlRm9ybWF0dGVyIGZvcm1hdCBtZXRob2Qgc2hvdWxkIHNwZWNpZnkgdGhhdCB0aGUgcG9zaXRpb25zIGFyZSBzb3J0ZWQgZnJvbSB0aGUgbG93ZXN0IHRvIHRoZSBiaWdnZXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDkiPjMwNzA5PC9hPgorUmV0dXJuIHZhbHVlIG9mIElQYWNrYWdlRnJhZ2VtZW50Um9vdC5nZXRFbGVtZW50TmFtZSgpIGhhcyBjaGFuZ2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDUiPjMwNzA1PC9hPgorU2ltcGxlIG5hbWUgc2hvdWxkIGNvbnNpZGVyIG1lbWJlciB0eXBlcyBiZWZvcmUgdG9wbGV2ZWwgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDcwNCI+MzA3MDQ8L2E+CiswMWUwZiBzaG91bGQgYmUgYWNjZXB0ZWQgYXMgdmFsaWQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTExIj4zMDUxMTwvYT4KK0lQYWNrYWdlRnJhZ21lbnRSb290Om1vdmUgaWdub3JlcyBGT1JDRSBmbGFnIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTE2Ij4zMDUxNjwvYT4KK3R5cG8gaW4gamF2YWRvYyBvZiBJUGFja2FnZUZyYWdtZW50Um9vdDppc0FyY2hpdmUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MDYiPjMwNTA2PC9hPgorSVBhY2thZ2VGcmFnbWVudFJvb3Q6ZGVsZXRlIGRvZXMgbm90IGhhbmRsZSBleHRlcm5hbCBqYXJzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjE0Ij4yMDYxNDwvYT4KK0ZhaWx1cmUgY29tcGlsaW5nIGEgcHJvamVjdCB3aXRoIGN5Y2xpYyBkZXBlbmRlbmNpZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIyNyI+MzAyMjc8L2E+Citjb21waWxlckFkYXB0ZXIgamFyIHNob3VsZCBub3QgYmUgaW5jbHVkZSBpbiB0aGUgcmVwbworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjc0Ij4zMDI3NDwvYT4KK05lZWQgbWV0aG9kIHRvIGZpZ3VyZSBvdXQgaWYgYW4gSVJlc291cmNlIGlzIHZpc2libGUgdGhyb3VnaCB0aGUgSmF2YSBNb2RlbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzAyNyI+MjcwMjc8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gZnJvbSBjb2RlYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MDMiPjMwNTAzPC9hPgorSVBhY2thZ2VGcmFnbWVudFJvb3Q6bW92ZSwgY29weSBzaG91bGQgYWNjZXB0IG51bGwgYXMgc2libGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDQ5NiI+MzA0OTY8L2E+CitDVS9jbGFzc2ZpbGUgbmFtZSB2YWxpZGF0aW9uIHNob3VsZG4ndCBzY2FuIGlmIHN1ZmZpeCBpc24ndCB0aGUgcHJvcGVyIG9uZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDcxIj4zMDQ3MTwvYT4KK0FTVC5wYXJzZUNvbXBpbGF0aW9uVW5pdChJQ2xhc3NGaWxlLCBib29sZWFuKSB0aHJvd3MgSUFFIGV2ZW4gaWYgY2xhc3MgZmlsZSBoYXMgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0ODciPjMwNDg3PC9hPgorTlBFIGR1cmluZyBzaHV0ZG93biBpbiBwYXRoIGNhbm9uaWNhbGl6YXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjkxMiI+MjY5MTI8L2E+CisnbnVsbCA9PSBudWxsJyBmb29saW5nIGJsYW5rIGZpbmFsIGFuYWx5c2lzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyODAiPjMwMjgwPC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gYXQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5yZXNvbHZlVHlwZShRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhOjIyNSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDM5MyI+MzAzOTM8L2E+CitJdHMgYmFjazogQ29yZSBFeGNlcHRpb24gW2NvZGUgMzgwXSBUaGUgcmVzb3VyY2UgdHJlZSBpcyBsb2NrZWQgZm9yIG1vZGlmaWNhdGlvbnMgCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNDciPjUzNDc8L2E+CitjbGFzcyBmaWxlcyBub3QgdXBkYXRlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODM4Ij45ODM4PC9hPgorV3JvbmcgZGlhZ25vc2lzIGNvbXBpbGluZyBpbm5lciBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA2MDAiPjMwNjAwPC9hPgoraW5jb3JyZWN0IGNvZGUgYXNzaXN0IGFmdGVyICd0aHJvdyBuZXcnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3OTkiPjMwNzk5PC9hPgorQ29yZSBkdW1wIHdpdGggSjJTREsgMS40LjFfMDEgaW4gamF2YS51dGlsLnppcC5aaXBGaWxlLmdldE5leHRFbnRyeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzM5Ij4zMDczOTwvYT4KK1x1NDEwMCBpcyByZWplY3RlZCBhcyBhbiBpZGVudGlmaWVyIGNoYXJhY3RlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzgyIj4zMDc4MjwvYT4KK0Nhbid0IHJlbmFtZSBhIHBhY2thZ2UgdG8gdGhlIHNhbWUgbmFtZSB3aXRoIGRpZmZlcmVudCBjYXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA1MjIiPjMwNTIyPC9hPgorSVBhY2thZ2VGcmFnbWVudFJvb3Q6IG1vdmUsIGNvcHkgdXBkYXRlQ2xhc3NwYXRoIHNlbWFudGljcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU2NyI+MzA1Njc8L2E+CitHQjE4MDMwOiBDbGFzcyBuYW1lLCBtZXRob2QgbmFtZSwgdmFyaWFibGUgbmFtZSBjYW4gbm90IGNvbnRhaW4gR0IxODAzMCBjaGFyYWN0ZXIgaW4gc29tZSB2ZXJzaW9uIG9mIEVjbGlwc2UgZm9yIExpbnV4LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjI5Ij4zMDYyOTwvYT4KK3NlYXJjaDogbm8gb2NjdXJyZW5jZXMgdG8gdHlwZSBmb3VuZCBpZiB0eXBlIGluIGRlZmF1bHQgcGFja2FnZSBpbiBuZXN0ZWQgc291cmNlIGZvbGRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc3MCI+Mjc3NzA8L2E+CitSZWJ1aWxkIGFsbCBkb2Vzbid0IGZvbGxvdyBwcm9qZWN0IGRlcGVuZGVuY2llcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODMyIj4yNDgzMjwvYT4KK1JlY3VyZW5jeSBiZXR3ZWVuIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3NTAiPjI3NzUwPC9hPgorW3N0YXJ0dXBdIHN0YXJ0aW5nIGphdmFjb3JlIHRha2VzIDEzJSBvZiBlbXB0eSB3b3JzcGFjZSBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3MTAiPjIyNzEwPC9hPgorc2ltcGxlIHNhdmUgdGFrZXMgNDAgc2Vjb25kcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDcwIj4zMDQ3MDwvYT4KK0lKYXZhTW9kZWxTdGF0dXMuZ2V0TWVzc2FnZSBub3QgdGhlIHNhbWUgYXMgZ2V0U3RyaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDY1Ij4zMDQ2NTwvYT4KK1BERSBiaW5hcnkgcHJvamVjdCBpbXBvcnQgZmlsbHMgbG9nIHdpdGggY29yZSBleGNlcHRpb25zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyMjQiPjI4MjI0PC9hPgorSW52YWxpZCAiVW51c2VkIEltcG9ydHMiIHdhcm5pbmcgd2hlbiBpbXBvcnRpbmcgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTgzIj4yNzU4MzwvYT4KK3JlY29uY2lsaW5nIGFsbG9jYXRlcyBtZWdhYnl0ZXMgb2YgbWVtb3J5IGluIHNlY29uZHMgb2YgdHlwaW5nCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjh0aCBKYW51YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjkzCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IEJ5IGRlZmF1bHQsIEpEVC9Db3JlIHdpbGwgY29uc2lkZXIgYSBkZWZhdWx0IHRhc2sgdGFnICJUT0RPIiAod2l0aCBub3JtYWwgcHJpb3JpdHkpLiBJbiB0aGUgcGFzdCwgZGVmYXVsdCB3YXMgbm8gdGFzayByZXBvcnRlZC4gCis8bGk+IEFkZGVkIEFQSXMgdG8gc2F2ZS9yZXN0b3JlIHR5cGUgaGllcmFyY2hpZXMuIE5vdGUgdGhhdCB0aGUgY2xpZW50IHN0aWxsIGhhcyB0byByZWdpc3RlciBhcyBhIDxjb2RlPklUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyPC9jb2RlPiBvbmNlCityZXN0b3JhdGlvbiBoYXMgb2NjdXJyZWQuCisgIDx1bD4KKyAgICAgPGxpPiA8Y29kZT5JVHlwZUhpZXJhcmNoeS5zdG9yZShPdXRwdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPiBmb3Igc2F2aW5nIGEgdHlwZSBoaWVyYXJjaHkuCisJIDwvbGk+CisgICAgIDxsaT4gPGNvZGU+SVR5cGUubG9hZChJbnB1dFN0cmVhbSwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+IGZvciByZXN0b3JpbmcgYSBwcmV2aW91c2x5IHNhdmVkIGhpZXJhcmNoeS4KKwkgPC9saT4KKyAgPC91bD4KKzwvbGk+IAorPGxpPiBBZGRlZCBBUElzIHRvIG1hbmlwdWxhdGUgcGFja2FnZSBmcmFnbWVudCByb290czoKKwk8dWw+CisJPGxpPjxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LmNvcHkoSVBhdGgsIGludCwgYm9vbGVhbiwgSUNsYXNzcGF0aEVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4KKwk8L2xpPgorCTxsaT48Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5kZWxldGUoaW50LCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4KKwk8L2xpPgorCTxsaT48Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5tb3ZlKElQYXRoLCBpbnQsIGJvb2xlYW4sIElDbGFzc3BhdGhFbnRyeSwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+CisJPC9saT4KKwk8L3VsPgorCU5vdGUgdGhhdCB0aGVzZSBBUElzIGFyZSB2ZXJ5IGNsb3NlIHRvIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gQVBJcyBleGNlcHQgdGhhdAorCXRoZXkgZmlsdGVyIG91dCBuZXN0ZWQgc291cmNlIGZvbGRlcnMsIGFuZCB0aGF0IHRoZXkgdXBkYXRlIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRocyBpZiBzcGVjaWZpZWQuCis8L2xpPgorPGxpPiBFeHRlbmRlZCBjb21waWxlciBvcHRpb25hbCB3YXJuaW5nIGZvciBpbnRlcmZhY2UgbWV0aG9kcyBpbmNvbXBhdGlibGUgd2l0aCBPYmplY3QKK25vbiBwdWJsaWMgbWV0aG9kcyB0byBzY2VuYXJpbyB3aGVyZSB0aHJvd24gZXhjZXB0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUgKHByb2JsZW0gSUQ6Cis8Y29kZT5JUHJvYmxlbS5JbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZUZvck5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZDwvY29kZT4pLgorVGhpcyBwcm9ibGVtIGlzIG9wdGlvbmFsLCBhbmQgaXRzIHNldmVyaXR5IGlzIGFsc28gY29udHJvbGxlZCBieSB0aGUgPGNvZGU+SmF2YUNvcmU8L2NvZGU+CitwcmVmZXJlbmNlIDxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCI8L2NvZGU+LgorPC9saT4KKzxsaT4gMi4xIEFQSSBDaGFuZ2UgaW4gb3JnLmVjbGlwc2UuamR0LmNvcmUuTmFtaW5nQ29udmVudGlvbnM6IGEgbmV3IGJvb2xlYW4gcGFyYW1ldGVyICdpc0Jvb2xlYW4nIGFkZGVkLiBUaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpZWxkJ3MgdHlwZSBpcyBib29sZWFuLgorCTx1bD4KKwk8bGk+PGNvZGU+c3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0LGNoYXJbXSxpbnQsY2hhcltdW10pPC9jb2RlPiBiZWNvbWUgPGNvZGU+c3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0LGNoYXJbXSxpbnQsYm9vbGVhbixjaGFyW11bXSk8L2NvZGU+CisJPC9saT4KKwk8bGk+PGNvZGU+c3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0LFN0cmluZyxpbnQsU3RyaW5nW10pPC9jb2RlPiBiZWNvbWUgPGNvZGU+c3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0LFN0cmluZyxpbnQsYm9vbGVhbixTdHJpbmdbXSk8L2NvZGU+CisJPC9saT4KKwk8L3VsPgorCVByZXZpb3VzIEFQSXMgZ290IGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIDIuMS4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMDQ5Ij4yMjA0OTwvYT4KK0hpZXJhcmNoeSBWaWV3IHNsb3cgdG8gY2FsY3VsYXRlIGhpZXJhcmNoeSBbdHlwZSBoaWVyYXJjaHldCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0MTEiPjI5NDExPC9hPgorUHJvamVjdHMgcmVidWlsdCBhZnRlciByZXN0YXJ0IG9mIEVjbGlwc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDI4MiI+MzAyODI8L2E+CitUT0RPIHRhc2sgbWVzc2FnZSBzaG91bGRuJ3QgYmUgbXVsdGlsaW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxMDIiPjMwMTAyPC9hPgorTmFtaW5nQ29udmVudGlvbjogVGVzdHMgZmFpbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDExMyI+MzAxMTM8L2E+CitXcm9uZyBwb3NpdGlvbnMgaW4gdGhlIG91dGxpbmVyIGZvciBhIGZpZWxkIHRoYXQgZm9sbG93cyBhbiBpbml0aWFsaXplciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIyNCI+MzAyMjQ8L2E+CitObyBKYXZhRWxlbWVudCBkZWx0YSB3aGVuIHJlbmFtaW5nIG5vbi1KYXZhIHByb2plY3QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAxMDgiPjMwMTA4PC9hPgorbm90IGNsZWFyIHdoYXQgJ21vZGlmaWVycycgaW4gTmFtaW5nQ29udmVudGlvbnMgbWVhbnMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwOTkiPjMwMDk5PC9hPgorTmFtaW5nQ29udmVudGlvbi5zdWdnZXN0QXJndW1lbnROYW1lczogTm8gZ3Vlc3MgcmV0dXJuZWQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyOTEiPjI3MjkxPC9hPgorW0RpYWxvZ3NdIEVycm9yIGRpYWxvZyBsb29rcyBiYWQgaWYgc3RhdHVzIG1lc3NhZ2UgaXMgbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY2NiI+Mjg2NjY8L2E+CitVbmNsZWFyIGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgb3V0cHV0IGZvbGRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM2NiI+MjkzNjY8L2E+CitTZWFyY2ggcmVwb3J0aW5nIGludmFsaWQgaW5hY2N1cmF0ZSBtYXRjaCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg2NCI+Mjk4NjQ8L2E+CitVbmFibGUgdG8gcmVzdG9yZSB3b3JraW5nIHNldCBpdGVtIC0gY2Fubm90IGluc3RhbnRpYXRlIGl0ZW06IG9yZy5lY2xpcHNlLmpkdC51aS5QZXJzaXN0YWJsZUphdmFFbGVtZW50RmFjdG9yeSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA0NCI+MjgwNDQ8L2E+Cit3ZWlyZCBlcnJvcnMgbm90IHJlcG9ydGVkIGFueXdoZXJlIGJ1dCBpbiB0ZXh0IGFuZCBvdmVydmlldyBydWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDEzIj4zMDAxMzwvYT4KK1Byb2plY3QgY29tcGlsZXIgc2V0dGluZyB3b3Jrc3BhY2UgfCBwcm9qZWN0IGRvIG5vdCBwZXJzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkxNTEiPjI5MTUxPC9hPgorTlBFIGluIFN1cnJvdW5kIHdpdGggdHJ5L2NhdGNoIGJsb2NrIFtyZWZhY3RvcmluZ10KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTk2OSI+Mjk5Njk8L2E+CitDb2RlQXNzaXN0OiB0b28gbXVjaCBwcm9wb3NhbHMganVzdCBhZnRlciAnc3dpdGNoJworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5OTU1Ij4yOTk1NTwvYT4KK1Nob3VsZCBub3QgcmVwb3J0IGluY29tcGF0aWJsZSB0aHJvd3MgY2xhdXNlIGZvciBpbnRlcmZhY2UgaWYgT2JqZWN0IG5vbiBwdWJsaWMgcmVmIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODk0Ij4yOTg5NDwvYT4KK1BhdGggbWF0Y2hpbmcgZmFpbHVyZSAoQ2hhck9wZXJhdGlvbikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc2MSI+Mjk3NjE8L2E+CitSZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbiBleGNsdXNpb24gZmlsdGVyIGlzIHRvbyBncmVlZHkgaW4gTTQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc2MSI+Mjk4MDM8L2E+CitTb3VyY2UgcGF0aCBleGNsdXNpb24gZmlsdGVyIG5vdCByZWxhdGl2ZSBzb3VyY2UgZm9sZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMzQiPjIzMTM0PC9hPgorT2RkIGJlaGF2aW9yIGZyb20gY29kZSBmb3JtYXR0ZXIKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAzNTciPjMwMzU3PC9hPgorSW5jb21wYXRpYmlsaXR5IG9mIHNlcmlhbGl6YXRpb24gd2l0aCBzdW4gamRrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAzNzAiPjMwMzcwPC9hPgorV2FybmluZyAiaW1wb3J0IG5ldmVyIHVzZWQiIGluIHNwaXRlIG9mIHVzZSBieSBhIGphdmFkb2MgQGxpbmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIwOSI+MzAyMDk8L2E+CitKRFQgY29tcGlsZXIgYnl0ZWNvZGUgaW5jb21wYXRpYmlsaXR5IHdpdGggSkRLIGJ5dGVjb2RlICByZXN1bHRzIGluIHNlcmlhbGl6YXRpb24gZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ5NyI+Mjc0OTc8L2E+CitDb21waWxlIG9ubHkgb24gY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODI2MyI+MjgyNjM8L2E+CitCZXR0ZXIgc3BlY2lmaWNhdGlvbiBvZiBzb3VyY2UgZm9sZGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMjMyIj4zMDIzMjwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIGNvbXBpbGF0aW9uIHVuaXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDE2MCI+MzAxNjA8L2E+CitDb2RlQXNzaXN0IC0gbm8gY29tcGxldGlvbiBiZWhpbmQgalByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg2MiI+Mjk4NjI8L2E+CitHQjE4MDMwOkNvdWxkIG5vdCBzZXQgYSBHQjE4MDMwIGNoYXJhY3RlciBhcyB3b3JrYmVuY2ggY2xhc3NwYXRoIHZhcmlhYmxlLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODYzIj4yOTg2MzwvYT4KK0dCMTgwMzA6IENvdWxkIG5vdCBjcmVhdGUgYSBjbGFzcyB2YXJpYWJsZSB3aG9zZSBuYW1lIGNvbnRhaW5zIGEgR0IxODAzMCBjaGFyYWN0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzYxNiI+Mjc2MTY8L2E+CitbQ29tcGlsZXJdIHN0YWNrIG92ZXJmbG93IHdoaWxlIGVkaXRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI5OSI+MjMyOTk8L2E+CitFbmhhbmNlIENvZGUgY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjM5Ij4yOTIzOTwvYT4gIAorUmVmYWN0b3JpbmcgdGhyb3dzIGV4Y2VwdGlvbiBpZiAucHJvamVjdCBvciAuY2xhc3NwYXRoIHJlYWQtb25seSBpbiAyLjEgTTQgCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjFzdCBKYW51YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjkyYQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg3MiI+Mjk4NzI8L2E+CitJbXBvcnRPcmdhbml6ZVRlc3QgZmFpbGluZyBkdWUgdG8gZmlsZSBtaXNzaW5nIGZyb20gaW5kZXggCisgICAgICAKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyMXN0IEphbnVhcnkgMjAwMworPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gTmV3IGNvbXBpbGVyIHNldHRpbmcgZ290IGFkZGVkIHRvIGNvbnRyb2wgc2V2ZXJpdHkgb2YgaW5jb21wYXRpYmxlIGludGVyZmFjZSBtZXRob2Qgd2l0aCBPYmplY3Qgbm9uIHB1YmxpYyBtZXRob2QuCitUaGlzIHVzZWQgdG8gYmUgcmVwb3J0ZWQgaW5jb3JyZWN0bHkgYXMgYW4gZXJyb3IgYnkgb3VyIGNvbXBpbGVyIChlLmcuIDxjb2RlPmludGVyZmFjZSBJIHsgaW50IGNsb25lKCk7IH08L2NvZGU+KSwgYW5kCitpcyBub3cgYW4gb3B0aW9uYWwgcHJvYmxlbSAoZGVmYXVsdCBzZXZlcml0eSBpcyBXQVJOSU5HKS4gQ29ycmVzcG9uZGluZyBwcm9ibGVtIElEIGlzOiA8Y29kZT5JUHJvYmxlbS5JbmNvbXBhdGlibGVSZXR1cm5UeXBlRm9yTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPC9jb2RlPi4KKzxwcmU+CisqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEludGVyZmFjZSBNZXRob2Qgbm90IENvbXBhdGlibGUgd2l0aCBub24tSW5oZXJpdGVkIE1ldGhvZHMKKyogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYW4gaW50ZXJmYWNlCisqICAgIGRlZmluZXMgYSBtZXRob2QgaW5jb21wYXRpYmxlIHdpdGggYSBub24taW5oZXJpdGVkIE9iamVjdCBvbmUuCisqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QiCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCis8L3ByZT4KKzwvbGk+Cis8bGk+IE5ldyBjb21waWxlciBwcm9ibGVtcyBnb3QgYWRkZWQgdG8gcmVwb3J0IGRlY2xhcmF0aW9ucyBvZiB1bnVzZWQgcHJpdmF0ZSBtZW1iZXJzIChmaWVsZC9tZXRob2QvdHlwZSkuIEEgSmF2YUNvcmUgc2V0dGluZworZ290IGFkZGVkIHRvIGNvbnRyb2wgdGhlIHNldmVyaXR5IG9mIHRoZXNlIG5ldyBwcm9ibGVtcyAoZGVmYXVsdCBzZXZlcml0eSBpcyBJR05PUkUpLiBOb3RlIHRoYXQgY3VycmVudGx5IG9ubHkgYSB2YWxpZCBsb2NhbCB1c2FnZSAKK2lzIGNvbnNpZGVyZWQgYXMgYSB0cnVlIHVzYWdlIChlLmcuIGlmIGEgbWVzc2FnZSBzZW5kIHRhcmdldHMgdGhpcyBtZXRob2QsIGJ1dCBjYW5ub3Qgc2VlIGl0LCB0aGVuIHRoZSB0YXJnZXQgbWV0aG9kIHdpbGwgc3RpbGwgYmUgCityZXBvcnRlZCBhcyB1bnVzZWQpLiBDb3JyZXNwb25kaW5nIHByb2JsZW0gSURzIGFyZTogPGNvZGU+SVByb2JsZW0uVW51c2VkUHJpdmF0ZU1ldGhvZDwvY29kZT4sIDxjb2RlPklQcm9ibGVtLlVudXNlZFByaXZhdGVGaWVsZDwvY29kZT4sIAorPGNvZGU+SVByb2JsZW0uVW51c2VkUHJpdmF0ZVR5cGU8L2NvZGU+IGFuZCA8Y29kZT5JUHJvYmxlbS5VbnVzZWRQcml2YXRlQ29uc3RydWN0b3I8L2NvZGU+LgorPHByZT4KKyogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFByaXZhdGUgTWVtYmVycworKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhIHByaXZhdGUgCisqICAgIG1ldGhvZCBvciBmaWVsZCBpcyBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZCB3aXRoaW4gdGhlIHNhbWUgdW5pdC4KKyogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXIiCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKKzwvcHJlPgorPC9saT4KKzxsaT5Db2RlQXNzaXN0IG5vdyBhbnN3ZXJzIGtleXdvcmQgY29tcGxldGlvbnMuIE5vdGUgdGhhdCB0aGVyZSB3YXMgYWxyZWFkeSBhbiBBUEkgZm9yIHRoZXNlOiA8Y29kZT5JQ29tcGxldGlvblJlcXVlc3RvciNhY2NlcHRLZXl3b3JkKGNoYXJbXSBrZXl3b3JkTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpPC9jb2RlPgord2hpY2ggd2Fzbid0IGludm9rZWQgdW50aWwgbm93LiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGluIGJldHdlZW4gYSAnc3luY2hyb25pemVkJyBrZXl3b3JkIHVzZWQgYXMgYSBtb2RpZmllciBvciBhcyBhIHN0YXRlbWVudC4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MzYzIj4yNjM2MzwvYT4KK1thc3QvZG9tXSB0eXBlIGJpbmRpbmdzIHRoYXQgcmV0dXJuIG51bGwgZm9yIHN1cGVyY2xhc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjM4MSI+MjIzODE8L2E+CitTaG93IHVudXNlZCBmaWVsZHMgYW5kIHZhcmlhYmxlcyBbcmVmYWN0b3JpbmddIFtzZWFyY2hdCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNjMiPjE5MDYzPC9hPgorY29kZSBhc3Npc3QgcHJvcG9zYWxzIGZvciBrZXl3b3JkcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NzcxIj4yOTc3MTwvYT4KK05vIHJlZmVyZW5jZSBmb3VuZCB0byBJUmVzb3VyY2UuZ2V0TG9jYXRpb24gd2hlbiBubyBjYXNlIHNlbnNpdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MjM2Ij4yODIzNjwvYT4KK1NlYXJjaCBmb3IgcmVmcyB0byBjbGFzcyBpbiBoaWVyYXJjaHkgbWF0Y2hlcyBjbGFzcyBvdXRzaWRlIGhpZXJhcmNoeSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODk1MSI+Mjg5NTE8L2E+CitTb3VyY2UgYXR0YWNobWVudCByb290cGF0aCBmaWVsZCBtaXNzaW5nIGluIFVJIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTM2Ij4yOTUzNjwvYT4KK0NoZWNrIHVzZSBvZiBJUmVzb3VyY2UuZ2V0TG9jYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzMzciPjI5MzM3PC9hPgorUG9vciB3b3JkaW5nIGluIHRhc2sgbWVzc2FnZSAiVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIGRlcHJlY2F0ZWQuLi4iCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2MDEiPjI5NjAxPC9hPgorVHlwZUhpZXJhcmNoeTogQXZvaWQgdG8gdXNlICdpc0ludGVyZmFjZScgLyAnaXNDbGFzcycgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1NDAiPjI5NTQwPC9hPgorU2VhcmNoIEVuZ2luZSByZXR1cm4gZXh0cmEgcmVzdWx0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTUyNCI+Mjk1MjQ8L2E+CitTZWFyY2ggZm9yIGRlY2xhcmF0aW9uIHZpYSBwYXR0ZXJucyBhZGRzICciKiIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNjAiPjI2MjYwPC9hPgordGFzayBtYXJrZXJzOiBsaW1pdHRpbmcgdGhlIG51bWJlciBvZiBwcm9ibGVtcyBwZXIgQ1UgbGltaXRzIHRoZSBudW1iZXIgb2YgdGFza3MvbWFya2VycyAoaW4gZ2VuZXJhbCkgcGVyIENVCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzMDYiPjI5MzA2PC9hPgorQ2FuJ3QgZ2V0IGNvbnRlbnQgb2YgQ1Ugbm90IG9uIGNsYXNzcGF0aCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzMxIj4zMzMxPC9hPgorRENSOiBDb2RlIEZvcm1hdHRlciBzaG91bGQgb2ZmZXIgY2FzdCB3aXRob3V0IHNwYWNlICgxR0k3NEdaKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjkwIj4yOTY5MDwvYT4KK0xvY2tlZCBSZXNvdXJjZSBUcmVlIChKYXZhTW9kZWxFeGNlcHRpb24pIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTg1Ij4yOTU4NTwvYT4KK0NvcmUgRXhjZXB0aW9uIGFzIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkIGluaXRpYWxpemluZyBjbGFzc3BhdGggY29udGFpbmVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NDg3Ij4yOTQ4NzwvYT4KK0ludGVybmFsIGNvbXBpbGVyIGVycm9yOiBmaW5hbCBmaWVsZCBzZXQgaW4gbG9vcCAoaW4gY29uc3RydWN0b3IpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1NDYiPjI5NTQ2PC9hPgorUHJvamVjdCByZWJ1aWxkIGNhbm5vdCB3cml0ZSBvdmVyIC5jbGFzcyBmaWxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjM2Ij4yOTYzNjwvYT4KK0ZpcnN0IGFub255bW91cyB0eXBlIHNob3VsZCBiZSBuYW1lZCBYJDEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTYzOCI+Mjk2Mzg8L2E+CitObyBmaWVsZCBpbml0aWFsaXphdGlvbnMgb24gT2JqZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc0MTMiPjI3NDEzPC9hPgorU2hvdWxkIHdlIHJlamVjdCB0aGF0IGNvZGU/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMTEiPjI5MjExPC9hPgorU2hvdWxkIGNoZWNrIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBhcnJheSB0eXBlIGJlZm9yZSBhY2Nlc3NpbmcgaXRzIGxlbmd0aCBmaWVsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjEzIj4yOTIxMzwvYT4KK1Nob3VsZCBjaGVjayB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYXJyYXkgdHlwZSBiZWZvcmUgY2FsbGluZyBhIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjIxIj4yOTYyMTwvYT4KK1dyb25nIERlbHRhIFdoZW4gQWRkaW5nIHRvIEZpbHRlcmVkIEZvbGRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTYzNyI+Mjk2Mzc8L2E+CitEZWZhdWx0IGRlYnVnIGF0dHJpYnV0ZXMgZG9uJ3QgbWF0Y2ggd2l0aCBqYXZhYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTM4Ij4yOTUzODwvYT4KK0V4dGVybmFsIGphciBub3QgaW5kZXhlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDg5Ij4yODQ4OTwvYT4KK1BhY2thZ2VGcmFnbWVudFJvb3QuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpIGNvdWxkIGJlIG9wdGltaXplZCBmb3Igbm9uLXNvdXJjZSByb290cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5OCI+MjkyOTg8L2E+CitTaW1wbGlmeSBBU1QgY3JlYXRpb24gZm9yIGFuIElDbGFzc0ZpbGUgKG1pbm9yKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5Mzc0Ij4yOTM3NDwvYT4KK0V4Y2x1ZGVkIGZvbGRlciBvbiBwcm9qZWN0IG5vdCByZXR1cm5lZCBieSBKYXZhIE1vZGVsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDg1Ij4yNzQ4NTwvYT4KK1NlYXJjaEVuZ2luZSByZXR1cm5zIHdyb25nIGphdmEgZWxlbWVudCB3aGVuIHNlYXJjaGluZyBpbiBhbiBhcmNoaXZlIHRoYXQgaXMgaW5jbHVkZWQgYnkgdHdvIGRpc3RpbmN0IGphdmEgcHJvamVjdHMuIAorIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMDAiPjIzMzAwPC9hPgorQ29udGV4dCBzZW5zaXRpdmUgQ29kZSBDb21wbGV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1NDEiPjI5NTQxPC9hPgorU2NydWJiaW5nIHdpcGVzIG91dCBlbnRpcmUgYnVpbGQgZGlyZWN0b3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzOTMiPjI4MzkzPC9hPgorRHVwbGljYXRlICdtaXNzaW5nIHJlcXVpcmUgcHJvamVjdCcgbWFya2VyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU5NzYiPjI1OTc2PC9hPgorQnVnIGluIGNvZGUgZm9ybWF0dGVyOiBjYW4ndCBiZSBjYWxsZWQgdHdpY2UgaW4gYSByb3cuLi4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg5NiI+MjU4OTY8L2E+Cit3ZWlyZCBmb3JtYXR0aW5nIG9mIGltcG9ydCBkZWNsYXJhdGlvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjQyNiI+MjY0MjY8L2E+CitBZGQgcHJlZmVyZW5jZSB0byBzb3J0IG1ldGhvZCBpbiB0aGUgc291cmNlIGZpbGUuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4NzUiPjI1ODc1PC9hPgoraW1wb3J0IHNwbGl0dGluZyBiZWhhdmlvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTkyIj4yMzk5MjwvYT4KK0FkZGluZyBwYXJ0aWFsIGNvbXBpbGF0aW9uIGZvciBKQVZBCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MDEiPjE5NTAxPC9hPgorRm91bmQgTlBFIGluIGxvZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDI5Ij4xMzAyOTwvYT4KKyJCdWlsZCIgc29tZXRpbWVzIGJ1aWxkcyBmaWxlcyB0aGF0IGhhdmUgbm90IGNoYW5nZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzAwOCI+MTMwMDg8L2E+CitNb3ZlIGEgSmF2YSBmaWxlLCBlcnJvcnMgcmVtYWluCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NzIiPjExNTcyPC9hPgorQ2Fubm90IHJlZnJlc2ggYSBqYXIgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3MjAiPjg3MjA8L2E+CitpbmNsdWRlIGFuIGV4dGVybmFsIGRpcmVjdG9yeSBvZiBjbGFzc2VzIGluIEphdmEgYnVpbGQgcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTkiPjMzNTk8L2E+CitHZXQgcmlkIG9mIHNvdXJjZSBhdHRhY2htZW50IHJvb3QgKDFHSk9OM1EpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNzMiPjI4MDczPC9hPgorW3N0YXJ0dXBdIG9uIHN0YXJ0dXAsIGpDb3JlIGxvYWRzIGxhdW5jaGluZyBwbHVnaW5zIHdoaWNoIGxvYWRzIGRlYnVnIHBsdWdpbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTY1MiI+Mjk2NTI8L2E+CitDYW4ndCBhdHRhY2ggc291cmNlIHRvIHNvbWUgWklQIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMjkiPjI5MjI5PC9hPgorSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg4MDEiPjI4ODAxPC9hPgorSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyMzkiPjE4MjM5PC9hPgorU3RhcnR1cCB0YWtlcyB0b28gbG9uZyB3aXRoIGphdmEgZWRpdG9yIG9wZW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODgxOSI+Mjg4MTk8L2E+CitOdWxscG9pbnRlciBleGNlcHRpb24gd2hlbiBidWlsZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODIwIj4yODgyMDwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIGNvbXBpbGVyIGluIE00Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5NTMiPjI4OTUzPC9hPgoraW50ZXJuYWwgY29tcGlsZXIgZXJyb3I6IE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGZpbGUgd2l0aCBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTU0Ij4yODk1NDwvYT4KK0ludGVybmFsIGNvbXBpbGVyIGVycm9yIC0tIGFzc2VydCBzdGF0ZW1lbnRzIGluIGlubmVyIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5ODAiPjI4OTgwPC9hPgorTnVsbC1wb2ludGVyIGV4Y2VwdGlvbiBvbiBuZXN0ZWQgY2xhc3MgYXNzZXJ0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjY3Ij4yOTI2NzwvYT4KK051bGxQb2ludGVyRXhjLiBvY2N1cmVkIHdoZW4gYnVpbGRpbmcgcHJvamVjdCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTA4OCI+MjkwODg8L2E+CitJbnRlcm5hbCBjb21waWxlciBlcnJvciBjb21waWxpbmcgY29kZSBpbiBNNCBlZGl0aW9uIG9mIGVjbGlwc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTAzMSI+MjkwMzE8L2E+CitJbnRlcm5hbCBjb21waWxlciBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MjAiPjU1MjA8L2E+CitDbGFzcyBmaWxlcyB3aGljaCBhcmUgc291cmNlIG5vdCBzaG93bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1MzEiPjM1MzE8L2E+CitOZXdDbGFzcyhJbnRlcmZhY2UpV2l6YXJkIC0gc2hvd3Mgbm90LXZpc2libGUgdHlwZXMgKDFHNEdOSDMpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwMzMiPjIzMDMzPC9hPgorW1Rhc2tzXSBDcmVhdGUgc2VwZXJhdGUgc2V0dGluZyBmb3Igc3RvcHBpbmcgYnVpbGQgb24gYSBjaXJjdWxhciBkZXBlbmRlbmN5IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNzYiPjI4MDc2PC9hPgorTlBFIGR1cmluZyBxdWljayBzaHV0ZG93bgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTQ0Ij4yOTE0NDwvYT4KK01pc3NpbmcgY29kZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY29tcGlsZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTUyNyI+Mjk1Mjc8L2E+CitPcmdhbml6ZSBpbXBvcnRzIGZhaWxzIG9uIGluY2x1ZGVkIGNvZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTUwMSI+Mjk1MDE8L2E+CitVbmluaXRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmcgZG9lcyBub3QgYW5hbHl6ZSB0aGUgcHJvZ3JhbSB0aG9yb3VnaGx5IGVub3VnaAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5Mzk0Ij4yOTM5NDwvYT4KK3N1Ym9wdGltYWwgaGFuZGxpbmcgY2xvc2luZy9vcGVuaW5nIHByb2plY3RzIGluIGF1dG9idWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MDA5Ij4yOTAwOTwvYT4KK0NsYXNzQ2lyY3VsYXJpdHlFcnJvciBpbiBSZXF1aXJlZFBsdWdpbnNJbml0aWFsaXplcgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE1dGggSmFudWFyeSAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI5MWEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1MTYiPjI5NTE2PC9hPgorU2VhcmNoRW5naW5lIHJlZ3Jlc3Npb25zIGluIDIwMDMwMTE0IAorICAgICAgCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTR0aCBKYW51YXJ5IDIwMDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjkxCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTQ1Ij4yODU0NTwvYT4KK0phdmFQcm9qZWN0LmV4aXN0cygpIHJldHVybnMgdHJ1ZSBpZiBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBKYXZhIG5hdHVyZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTQwNCI+Mjk0MDQ8L2E+CitKYXZhQ29yZS5jcmVhdGUoSVByb2plY3QpIHJldHVybnMgIT0gbnVsbCBmb3Igbm9uIEphdmEgUHJvamVjdHMuIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NzUyIj4yODc1MjwvYT4KK0ogU2VhcmNoIHJlc3BvcnRzIG5vbi1leGlzdGVudCBKYXZhIGVsZW1lbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3ODMiPjIyNzgzPC9hPgorVW5leHBlY3RlZCBudWxsIGluIGNvbXBpbGVyIGVycm9yIG1lc3NhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTM2NSI+MjkzNjU8L2E+CitTeW50YXggZXJyb3IgaW5zaWRlIG1ldGhvZCBib2R5IGlzIGZvb2xpbmcgTkxTIHN0cmluZyBkZXRlY3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI3NyI+MjkyNzc8L2E+CitUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyOiBSZXRyaWV2aW5nIG9mIGNsYXNzZmlsZSBsb2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5Mzc2Ij4yOTM3NjwvYT4KK1JlbW92ZSA2NWsgbGltaXQgb24gc3RhdGljIGRhdGEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE3NiI+MjkxNzY8L2E+ICAKK1tET00vQVNUXSBTdGF0ZW1lbnQuZ2V0L3NldExlYWRpbmdDb21tZW50IHNob3VsZCBiZSBkZWxldGVkIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5Mjc0Ij4yOTI3NDwvYT4KK1N1cmZhY2Ugbm9uLWphdmEgcHJvamVjdHMgYXMgbW9kZWwgbm9uLWphdmEgcmVzb3VyY2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTMxIj4yODUzMTwvYT4KK0NsYXNzcGF0aCBFbnRyeTogT3V0cHV0IGZvbGRlciBjYW4gbm90IGJlIHNldCB0byBwcm9qZWN0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODI0Ij4yODgyNDwvYT4KK1F1aWNrIEZpeDogVHlwZSBNaXNtYXRjaCAtPiBDYXN0IGJ1ZyBbcXVpY2sgZml4XQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTk5Ij4yODU5OTwvYT4KK3ZhbGlkYXRlQ2xhc3NwYXRoIHJlbmRlcmluZyBvZiBwYXRocyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTA3OSI+MjkwNzk8L2E+CitCdWlsZHBhdGggdmFsaWRhdGlvbjogTm8gY2hlY2sgdGhhdCBvdXRwdXQgZm9sZGVyIGlzIGluc2lkZSBwcm9qZWN0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTU5Ij4yOTE1OTwvYT4KK0RlbHRhUHJvY2Vzc29yIHdhbGtzIHJlbW92ZWQgcHJvamVjdCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODgyMiI+Mjg4MjI8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gaW4gUHJvYmxlbUJpbmRpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg1OTYiPjI4NTk2PC9hPgorRGVmYXVsdCBvdXRwdXQgZm9sZGVyIGNhdXNlIG9mIHZhbGlkYXRpb24gZXJyb3IgZXZlbiBpZiBub3QgdXNlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODY3MiI+Mjg2NzI8L2E+CitCYXRjaCBjb21waWxlciBzaG91bGQgc3VwcG9ydCBhcmd1bWVudCBleHBhbnNpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODYxNyI+Mjg2MTc8L2E+CitRdWFsaWZpZWQgc3VwZXIgcmVmZXJlbmNlIGNhbm5vdCBiZSBzdXJyb3VuZGVkIHdpdGggcGFyZW50aGVzZXMuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyOTgiPjI3Mjk4PC9hPgorTXVzdCByZXR1cm4gcmVzdWx0IGVycm9yIGNvdWxkIGJlIG1vcmUgYWNjdXJhdGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg2OSI+Mjg4Njk8L2E+CitQYXJzZSBlcnJvciB3aXRoIGZpbmFsIGxvY2FsIHZhcnMgd2l0aG91dCBpbW1lZGlhdGUgYXNzaWdubWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjgyIj4yODY4MjwvYT4KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Gb3JTdGF0ZW1lbnQncyBib2R5IHBvc2l0aW9uIGlzIGluY29ycmVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjIyIj4yODYyMjwvYT4KK0NoZWNrIGRlcHJlY2F0aW9uIHNob3VsZCBoYW5kbGUgdW5pY29kZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODU1OSI+Mjg1NTk8L2E+CitAZGVwcmVjYXRlZCBoYXMgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tbWVudCBsaW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDQiPjIwODQ0PC9hPgorSW5kZXhpbmcgc3BhY2UgdXNhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjgyMCI+MjY4MjA8L2E+CitPdXQgb2YgTWVtb3J5IGluZGV4aW5nIG5ldyBwbHVnaW5zCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyODkiPjI3Mjg5PC9hPgorQ2xhc3NDaXJjdWxhcml0eUVycm9yIGZvcmNlcyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uJ3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQwMSI+Mjc0MDE8L2E+Citbc3RhcnR1cF0gUmV2aWV3IEphdmFDb3JlLnN0YXJ0dXAoKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTU3Ij4yODU1NzwvYT4KK0RlcHJlY2F0aW9uIGlzIG5vdCBjaGVja2VkIHdoZW4gc3ViY2xhc3NpbmcgYSBkZXByZWNhdGVkIG1lbWJlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2MTUiPjI4NjE1PC9hPgorQ2Fubm90IG9wdGltaXplIG91dCAtMC4wIGluIGFycmF5IGluaXRpYWxpemVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NzUwIj4yODc1MDwvYT4KK0NvbXBpbGVyIGNyYXNoZXMgd2l0aCBNNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjQxIj4yNzI0MTwvYT4KK01pc3NpbmcgY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgcXVhbGlmaWVyIG9mIGEgc3RhdGljIG1ldGhvZCBpbnZvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MyI+MzE3MzwvYT4KK0NvbnN0YW50IGZpZWxkIGNvZGUgZ2VuZXJhdGlvbiAoMUZFV1haVykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODU4MyI+Mjg1ODM8L2E+CitNaXNzaW5nIG9uZSB1bml0IGluIHBhY2thZ2UgdmlldyAKKyAgIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5MzQiPjI4OTM0PC9hPgorVXNpbmcgYXNzZXJ0IGtleXdvcmQgaW4gbWV0aG9kcyBvZiBuZXN0ZWQgY2xhc3NlcyBjYXVzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTk4MCI+MjU5ODA8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBkdXJpbmcgUmVmYWN0b3IvTW92ZSBvcGVyYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNDMiPjI5MzQzPC9hPgorW000XSBTY3JpYmJsaW5nIG9uIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBuZWVkcyB0byBnbyBvbiBhIGRpZXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE5NyI+MjkxOTc8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBDbGFzcyB3aXRoIGFuIGFzc2VydCBpbiBhIG1ldGhvZCBvZiBhbiBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MDgyIj4yOTA4MjwvYT4KK0Nhbid0IGFjY2VzcyBJbm5lciBjbGFzcyBzdGF0aWMgZmllbGQgdGhyb3VnaCBhbiBpbnN0YW5jZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Njc1Ij4yODY3NTwvYT4KK05QRSBpbiBpbmRleGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg5MDgiPjI4OTA4PC9hPgorQ2xhc3NDYXN0RXhjZXB0aW9uIGluIEphdmFQcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDMwIj4yNzQzMDwvYT4KK0phdmEgbW9kZWwgaGFuZ3Mgb250byBtYW55IENsYXNzRmlsZSBvYmplY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkwMzAiPjI5MDMwPC9hPgorQ29tcGlsZXIgQnVnIC0tIGluY29ycmVjdCB2aXNpYmlsaXR5IG9mIHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODgzMCI+Mjg4MzA8L2E+CitGbGV4aWJsZSBwcm9qZWN0cyBjYW5ub3Qgc2hhcmUgb3V0cHV0IGRpcmVjdG9yeQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE3dGggRGVjZW1iZXIgMjAwMiAtIDIuMSBNSUxFU1RPTkUtNAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yOTAKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5BZGRlZCBuZXcgSmF2YUNvcmUgb3B0aW9ucworCTx1bD4KKwk8bGk+Q09ERUFTU0lTVCAvIERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIEZpZWxkIE5hbWU8YnI+CisJCVdoZW4gdGhlIHByZWZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkJb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy48YnI+CisJCTx1bD4KKwkJPGxpPm9wdGlvbiBpZDogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzIjwvbGk+CisJCTxsaT5wb3NzaWJsZSB2YWx1ZXM6IHsgIiZsdDtwcmVmaXgmZ3Q7WywmbHQ7cHJlZml4Jmd0O10qIiB9IHdoZXJlIDxwcmVmaXg+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvbGk+CisJCTxsaT5kZWZhdWx0OiAiIjwvbGk+CisJIAk8L3VsPgorCTwvbGk+CisJPGxpPkNPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBTdGF0aWMgRmllbGQgTmFtZTxicj4KKwkJV2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBzdGF0aWMgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkJb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy48YnI+CisJCTx1bD4KKwkJPGxpPm9wdGlvbiBpZDogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzIjwvbGk+CisJCTxsaT5wb3NzaWJsZSB2YWx1ZXM6IHsgIiZsdDtwcmVmaXgmZ3Q7WywmbHQ7cHJlZml4Jmd0O10qIiB9IHdoZXJlIDxwcmVmaXg+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZDwvbGk+CisJCTxsaT5kZWZhdWx0OiAiIjwvbGk+CisJIAk8L3VsPgorCTwvbGk+CisJPGxpPkNPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBMb2NhbCBWYXJpYWJsZSBOYW1lPGJyPgorCQlXaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIG5hbWUgd2lsbCBiZWdpbiB3aXRoCisJCW9uZSBvZiB0aGUgcHJvcG9zZWQgcHJlZml4ZXMuPGJyPgorCQk8dWw+CisJCTxsaT5vcHRpb24gaWQ6ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcyI8L2xpPgorCQk8bGk+cG9zc2libGUgdmFsdWVzOiB7ICImbHQ7cHJlZml4Jmd0O1ssJmx0O3ByZWZpeCZndDtdKiIgfSB3aGVyZSA8cHJlZml4PiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQ8L2xpPgorCQk8bGk+ZGVmYXVsdDogIiI8L2xpPgorCSAJPC91bD4KKwk8L2xpPgorCTxsaT5DT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgQXJndW1lbnQgTmFtZTxicj4KKwkJV2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBhcmd1bWVudCBuYW1lIHdpbGwgYmVnaW4gd2l0aAorCQlvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLjxicj4KKwkJPHVsPgorCQk8bGk+b3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXMiPC9saT4KKwkJPGxpPnBvc3NpYmxlIHZhbHVlczogeyAiJmx0O3ByZWZpeCZndDtbLCZsdDtwcmVmaXgmZ3Q7XSoiIH0gd2hlcmUgPHByZWZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkPC9saT4KKwkJPGxpPmRlZmF1bHQ6ICIiPC9saT4KKwkgCTwvdWw+CisJPC9saT4KKwk8bGk+Q09ERUFTU0lTVCAvIERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIEZpZWxkIE5hbWU8YnI+CisJCVdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgZmllbGQgbmFtZSB3aWxsIGVuZCB3aXRoCisJCW9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuPGJyPgorCQk8dWw+CisJCTxsaT5vcHRpb24gaWQ6ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcyI8L2xpPgorCQk8bGk+cG9zc2libGUgdmFsdWVzOiB7ICImbHQ7c3VmZml4Jmd0O1ssJmx0O3N1ZmZpeCZndDtdKiIgfSB3aGVyZSA8c3VmZml4PiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQgPC9saT4KKwkJPGxpPmRlZmF1bHQ6ICIiPC9saT4KKwkgCTwvdWw+CisJPC9saT4KKwk8bGk+T0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgU3RhdGljIEZpZWxkIE5hbWU8YnI+CisJCVdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3Igc3RhdGljIGZpZWxkIG5hbWUgd2lsbCBlbmQgd2l0aAorCQlvbmUgb2YgdGhlIHByb3Bvc2VkIHN1ZmZpeGVzLjxicj4KKwkJPHVsPgorCQk8bGk+b3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXMiPC9saT4KKwkJPGxpPnBvc3NpYmxlIHZhbHVlczogeyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH0gd2hlcmUgPHN1ZmZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIDwvbGk+CisJCTxsaT5kZWZhdWx0OiAiIjwvbGk+CisJIAk8L3VsPgorCTwvbGk+CisJPGxpPkNPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBMb2NhbCBWYXJpYWJsZSBOYW1lPGJyPgorCQlXaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIG5hbWUgd2lsbCBlbmQgd2l0aAorCQlvbmUgb2YgdGhlIHByb3Bvc2VkIHN1ZmZpeGVzLjxicj4KKwkJPHVsPgorCQk8bGk+b3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXMiPC9saT4KKwkJPGxpPnBvc3NpYmxlIHZhbHVlczogeyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH0gd2hlcmUgPHN1ZmZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIDwvbGk+CisJCTxsaT5kZWZhdWx0OiAiIjwvbGk+CisJIAk8L3VsPgorCTwvbGk+CisJPGxpPkNPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBBcmd1bWVudCBOYW1lPGJyPgorCQlXaGVuIHRoZSBzdWZmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGFyZ3VtZW50IG5hbWUgd2lsbCBlbmQgd2l0aAorCQlvbmUgb2YgdGhlIHByb3Bvc2VkIHN1ZmZpeGVzLjxicj4KKwkJPHVsPgorCQk8bGk+b3B0aW9uIGlkOiAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXMiPC9saT4KKwkJPGxpPnBvc3NpYmxlIHZhbHVlczogeyAiJmx0O3N1ZmZpeCZndDtbLCZsdDtzdWZmaXgmZ3Q7XSoiIH0gd2hlcmUgPHN1ZmZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIDwvbGk+CisJCTxsaT5kZWZhdWx0OiAiIjwvbGk+CisJIAk8L3VsPgorCTwvbGk+CisJPC91bD4KKzwvbGk+Cis8bGk+TmV3IEFQSSBjbGFzcyA6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLk5hbWluZ0NvbnZlbnRpb25zPGJyPgorVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBjb21wdXRpbmcgSmF2YS1zcGVjaWZpYyBuYW1lcy4KKzxwcmU+CitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOworcHVibGljIGZpbmFsIGNsYXNzIE5hbWluZ0NvbnZlbnRpb25zIHsKKwlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JBcmd1bWVudE5hbWUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gYXJndW1lbnROYW1lKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckFyZ3VtZW50TmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBhcmd1bWVudE5hbWUpIHsuLi59CisJcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycykgey4uLn0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JGaWVsZE5hbWUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckxvY2FsVmFyaWFibGVOYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGxvY2FsTmFtZSkgey4uLn0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JMb2NhbFZhcmlhYmxlTmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBsb2NhbE5hbWUpIHsuLi59CisJcHVibGljIHN0YXRpYyBjaGFyW11bXSBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3VnZ2VzdEFyZ3VtZW50TmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgU3RyaW5nW10gZXhjbHVkZWROYW1lcykgey4uLn0KKwlwdWJsaWMgc3RhdGljIGNoYXJbXVtdIHN1Z2dlc3RGaWVsZE5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIGludCBtb2RpZmllcnMsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpIHsuLi59CisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0RmllbGROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBpbnQgbW9kaWZpZXJzLCBTdHJpbmdbXSBleGNsdWRlZE5hbWVzKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBTdHJpbmdbXSBleGNsdWRlZE5hbWVzKSB7Li4ufQorCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1Z2dlc3RHZXR0ZXJOYW1lKElKYXZhUHJvamVjdCBwcm9qZWN0LCBjaGFyW10gZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQm9vbGVhbiwgY2hhcltdW10gZXhjbHVkZWROYW1lcykgey4uLn0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdWdnZXN0R2V0dGVyTmFtZShJSmF2YVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBpc0Jvb2xlYW4sIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsuLi59CisJcHVibGljIHN0YXRpYyBjaGFyW10gc3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0IHByb2plY3QsIGNoYXJbXSBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpIHsuLi59CisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMsIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsuLi59Cit9Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDM0Ij4yODQzNDwvYT4KK09wZW4gVHlwZSBicm9rZW4gd2hlbiB3b3Jrc3BhY2UgaGFzIGJ1aWxkIHBhdGggcHJvYmxlbXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzMjYiPjI4MzI2PC9hPgorIk9wZW4gVHlwZSIgZGlhbG9nIGNvdWxkIG5vdCBvcGVuIHNlbGVjdGVkIHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg0NzYiPjI4NDc2PC9hPgorSlJFIGNvbnRhaW5lciBkZXNjcmlwdGlvbiB3cm9uZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NDQ3Ij4yODQ0NzwvYT4KK1VucmVhZGFibGUgZXJyb3IgbWVzc2FnZSBmcm9tIGJ1aWxkIGNsYXNzIHBhdGggdmFsaWRhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzIxMCI+MjMyMTA8L2E+CitNZW1iZXIgdmFyaWFibGUgbmFtZSBwcm9wb3NhbAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzkyNSI+Mjc5MjU8L2E+CitPcGVuYWJsZS5oYXNDaGlsZHJlbiBpcyBzbG93IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MjQ2Ij4yODI0NjwvYT4KK0NsYXNzIGZpbGVzIHdyaXR0ZW4gdG8gY3VzdG9tIG91dHB1dCBhbmQgZGVmYXVsdCBvdXRwdXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzI3NSI+MjcyNzU8L2E+CitSYW5kb20gY3JhY2hlcyB3aXRoIGNvcnVwdCBqYXIgaW4gbGlicmFyeSBwYXRoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzNTciPjI4MzU3PC9hPgorTlBFIG9uIGltcG9ydGluZyBwbHVnaW5zCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTZ0aCBEZWNlbWJlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4OQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODMxNiI+MjgzMTY8L2E+CitNaXNzaW5nIHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODEwNCI+MjgxMDQ8L2E+CiszMyBQYXJzZXJzIGFuZCAzNSBTY2FubmVycyBjcmVhdGVkIHdoZW4gb3BlbmluZyBhIHR5cGUgaGllYXJjaHkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyOTgiPjI4Mjk4PC9hPgorU0FOSVRZIENIRUNLIGVycm9yIHdoZW4gY29tcGlsaW5nIGEgc3BlY2lmaWMgc3dpdGNoIHN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4Mjk2Ij4yODI5NjwvYT4KK3BhcnNlciBnaXZlcyBjYXN0IGV4cHJlc3Npb24gYW4gaW5jb3JyZWN0IGxlbmd0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MDAwIj4yODAwMDwvYT4KK1RvbyBtYW55IGRlbHRhcyBvbiBzdGFydHVwLCB3aGVuIHJlc29sdmluZyBjcCB2YXJpYWJsZXMvY29udGFpbmVycworCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTN0aCBEZWNlbWJlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4OAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODEwOSI+MjgxMDk8L2E+CitFeGNsdWRpbmcgYSBzb3VyY2UgZmlsZSBkb2Vzbid0IHJlbW92ZSBpdHMgSmF2YSBwcm9ibGVtcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTE1Ij4yODExNTwvYT4KK1ViaXF1aXRvdXMgcmVzb3VyY2UgaW4gdGhlIEphdmFNb2RlbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA2NCI+MjgwNjQ8L2E+CitTdGFjayBvdmVyZmxvdyBpbiBqYXZhIGVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTUwIj4yODE1MDwvYT4gIAorQ2xhc3NDYXN0RXhjZXB0aW9uIGluIGNvbXBsZXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjEzOSI+MjIxMzk8L2E+CitBcnJheSBpbml0aWFsaXplciB1c2VkIGlubGluZSBjYXVzZXMgc3ludGF4IGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5NDEiPjI3OTQxPC9hPiAgCitDbGFzc0Nhc3RFeGNlcHRpb24gaW4gQ29tcGxldGlvblBhcnNlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Mjg0Ij4yNzI4NDwvYT4gIAorbWlzc3BlbGxlZCB2YXJpYWJsZSBuYW1lIHByb3Bvc2FscyBmb3IgYXJyYXkgd2l0aCB0eXBlIG5hbWUgZW5kaW5nIGluICd5JworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODUyIj4yNzg1MjwvYT4gIAorV2Ugc2hvdWxkIG5vdCByZWplY3QgYSBjbGFzcyBuYW1lZCBqYXZhIGlmIGl0IGlzIGluIHRoZSB1bm5hbWVkIHBhY2thZ2UKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyMDgiPjI4MjA4PC9hPgorSUNsYXNzcGF0aEVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm46IFN0cmluZ1tdIHdvdWxkIGJlIGJldHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTE0Ij4yODExNDwvYT4KK01pc3NpbmcgdHlwZSBpZiBkZWZpbmVkIGluIG5lc3RlZCBzb3VyY2UgZm9sZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczNzEiPjI3MzcxPC9hPgorY29kZSBhc3Npc3QgLyBhdXRvIGluc2VydGluZyAiKCkiIGJyb2tlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MDg3Ij4yODA4NzwvYT4KK29uIGJ1aWxkLCBmaW5kTWFya2VycyBjYWxsZWQgMyB0aW1lcyBmb3IgZWFjaCBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5OTIiPjI3OTkyPC9hPgorSW5jcmVtZW50YWwgY29tcGlsZSB0aW1lID0gY29tcGxldGUgYnVpbGQgdGltZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MDk1Ij4yODA5NTwvYT4KK0pEVENvbXBpbGVyQWRhcHRlciByZWZlcmVuY2VzIG9sZCBNYWluIGNvbnN0cnVjdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzEiPjIzMjMxPC9hPiAgCitbcmVzb3VyY2VzXSBBYmlsaXR5IHRvIGhpZGUgcmVzb3VyY2VzIGZyb20gdGhlIGJ1aWxkZXJzCisgIAorPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMXRoIERlY2VtYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjg3YQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODA2OSI+MjgwNjk8L2E+CitKRFRDb21waWxlckFkYXB0ZXIgYW5kIGNvbXBpbGVyLmJhdGNoLk1haW4gb3V0IG9mIHN5bmMgaW4gSTIwMDIxMjEwIGJ1aWxkCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMHRoIERlY2VtYmVyIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4NworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPiAKKzxsaT5BZGRlZCBBUEkgPGNvZGU+SUphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgoSVJlc291cmNlKTwvY29kZT4gdGhhdCByZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiByZXNvdXJjZSBpcyBvbiB0aGUgCisgICAgIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdCBhbmQgd2hldGhlciBpdCBpcyBleGNsdWRlZC4KKzwvbGk+Cis8bGk+QWRkZWQgbWVjaGFuaXNtIHRvIGFsbG93IGdlbmVyaWMgY29udGFpbmVyIHVzZXIgdG8gcmVxdWVzdCB1cGRhdGluZyBkZWZpbml0aW9ucyBoZWxkIGJ5Citjb250YWluZXIgaW5pdGlhbGl6ZXJzLCBvbnRvIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPjoKKworPHByZT4KKy8qKgorICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRhaW5lciBpbml0aWFsaXplciBjYW4gYmUgcmVxdWVzdGVkIHRvIHBlcmZvcm0gdXBkYXRlcyAKKyAqIG9uIGl0cyBvd24gY29udGFpbmVyIHZhbHVlcy4gSWYgc28sIHRoZW4gYW4gdXBkYXRlIHJlcXVlc3Qgd2lsbCBiZSBwZXJmb3JtZWQgdXNpbmcKKyAqIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI3JlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGU8L2NvZGU+LworICogCisgKiBAcGFyYW0gY29udGFpbmVyUGF0aCAtIHRoZSBwYXRoIG9mIHRoZSBjb250YWluZXIgd2hpY2ggcmVxdWlyZXMgdG8gYmUgdXBkYXRlZAorICogQHBhcmFtIHByb2plY3QgLSB0aGUgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGNvbnRhaW5lciBpcyB0byBiZSB1cGRhdGVkCisgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250YWluZXIgY2FuIGJlIHVwZGF0ZWQKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJLy8gQnkgZGVmYXVsdCwgY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplcnMgZG8gbm90IGFjY2VwdCB1cGRhdGluZyBjb250YWluZXJzCisgICAJcmV0dXJuIGZhbHNlOyAKK308L3ByZT4KKzxwcmU+CisvKioKKyAqIFJlcXVlc3QgYSByZWdpc3RlcmVkIGNvbnRhaW5lciBkZWZpbml0aW9uIHRvIGJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIGEgY29udGFpbmVyIHN1Z2dlc3Rpb24uIFRoZSBjb250YWluZXIgc3VnZ2VzdGlvbiAKKyAqIG9ubHkgYWN0cyBhcyBhIHBsYWNlLWhvbGRlciB0byBwYXNzIGFsb25nIHRoZSBpbmZvcm1hdGlvbiB0byB1cGRhdGUgdGhlIG1hdGNoaW5nIGNvbnRhaW5lciBkZWZpbml0aW9uKHMpIGhlbGQgYnkgdGhlIAorICogY29udGFpbmVyIGluaXRpYWxpemVyLiBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBub3QgZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNvbnRhaW5lciBzdWdnZXN0aW9uIGFzIGlzLCBidXQgcmF0aGVyIGFkanVzdCAKKyAqIHRoZSBhY3R1YWwgY29udGFpbmVyIGRlZmluaXRpb24gYmFzZWQgb24gc3VnZ2VzdGVkIGNoYW5nZXMuCisgKiAKKyAqIElNUE9SVEFOVDogSW4gcmVhY3Rpb24gdG8gcmVjZWl2aW5nIGFuIHVwZGF0ZSByZXF1ZXN0LCBhIGNvbnRhaW5lciBpbml0aWFsaXplciB3aWxsIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZworICogY29udGFpbmVyIGRlZmluaXRpb24gKGFmdGVyIHJlY29uY2lsaW5nIGNoYW5nZXMpIGF0IGl0cyBlYXJsaWVzdCBjb252ZW5pZW5jZSwgdXNpbmcgCisgKiA8Y29kZT5KYXZhQ29yZSNzZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdFtdLCBJQ2xhc3NwYXRoQ29udGFpbmVyW10sIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4gCisgKiBVbnRpbCBpdCBkb2VzIHNvLCB0aGUgdXBkYXRlIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgSmF2YSBNb2RlbC4KKyAqIAorICogSW4gb3JkZXIgdG8gYW50aWNpcGF0ZSB3aGV0aGVyIHRoZSBjb250YWluZXIgaW5pdGlhbGl6ZXIgYWxsb3dzIHRvIHVwZGF0ZSBpdHMgY29udGFpbmVycywgdGhlIHByZWRpY2F0ZQorICogPGNvZGU+SmF2YUNvcmUjY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiBzaG91bGQgYmUgdXNlZC4KKyAqIAorICogQHBhcmFtIGNvbnRhaW5lclBhdGggLSB0aGUgcGF0aCBvZiB0aGUgY29udGFpbmVyIHdoaWNoIHJlcXVpcmVzIHRvIGJlIHVwZGF0ZWQKKyAqIEBwYXJhbSBwcm9qZWN0IC0gdGhlIHByb2plY3QgZm9yIHdoaWNoIHRoZSBjb250YWluZXIgaXMgdG8gYmUgdXBkYXRlZAorICogQHBhcmFtIGNvbnRhaW5lclN1Z2dlc3Rpb24gLSBhIHN1Z2dlc3Rpb24gdG8gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRhaW5lciBkZWZpbml0aW9uCisgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gd2hlbiA8Y29kZT5KYXZhQ29yZSNzZXRDbGFzc3BhdGhDb250YWluZXI8L2NvZGU+IHdvdWxkIHRocm93IGFueS4KKyAqIEBzZWUgSmF2YUNvcmUjc2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3RbXSwgSUNsYXNzcGF0aENvbnRhaW5lcltdLCBJUHJvZ3Jlc3NNb25pdG9yKQorICogQHNlZSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCkKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJLy8gQnkgZGVmYXVsdCwgY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplcnMgZG8gbm90IGFjY2VwdCB1cGRhdGluZyBjb250YWluZXJzCit9PC9wcmU+Cis8L2xpPgorPGxpPkFkZGVkIGhlbHBlciBtZXRob2QgdG8gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU8L2NvZGU+IHNvIGFzIHRvIHJldHJpZXZlIGEgcmVnaXN0ZXJlZCAKK2NsYXNzcGF0aCBjb250YWluZXIgaW5pdGlhbGl6ZXI6Cis8cHJlPi8qKgorICogSGVscGVyIG1ldGhvZCBmaW5kaW5nIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVyIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gY2xhc3NwYXRoIGNvbnRhaW5lciBJRCAKKyAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIGZvdW5kIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBjb250cmlidXRpb25zIHRvIGV4dGVuc2lvbiBwb2ludCB0bworICogdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLgorICogCisgKiBBIGNvbnRhaW5lcklEIGlzIHRoZSBmaXJzdCBzZWdtZW50IG9mIGFueSBjb250YWluZXIgcGF0aCwgdXNlZCB0byBpZGVudGlmeSB0aGUgcmVnaXN0ZXJlZCBjb250YWluZXIgaW5pdGlhbGl6ZXIuCisgKiAKKyAqIEByZXR1cm4gQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgLSB0aGUgcmVnaXN0ZXJlZCBjbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorICogbm9uZSB3YXMgZm91bmQuCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoU3RyaW5nIGNvbnRhaW5lcklEKTwvcHJlPgorPC9saT4KKzwvdWw+IAorIAorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzg5MCI+Mjc4OTA8L2E+CitCYXRjaCBjb21waWxlciBvcHRpb24gLW5vd2FybiBvciAtd2Fybjpub25lIGRvZXNuJ3QgcmVtb3ZlIHRoZSB3YXJuaW5nIGZvciBjb252ZXJzaW9uIGZyb20gY2hhcltdIHRvIFN0cmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NjcwIj4yNzY3MDwvYT4KK0NsYXNzcGF0aEVudHJ5LnJvb3RJRCBhbGxvY2F0ZXMgYSBsb3Qgb2YgdGhyb3ctYXdheSBvYmplY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1OTUiPjI3NTk1PC9hPgorQWRkIGlzT25DbGFzc3BhdGgoSVJlc291cmNlKSBhcyBBUEkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2NTIiPjI3NjUyPC9hPgorRENSIC0gTmVlZCBhIHdheSB0byByZXF1ZXN0IGNvbnRhaW5lciBpbml0aWFsaXplcnMgdG8gdXBkYXRlIHRoZWlyIGNvbnRhaW5lciBkZWZpbml0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTU1Ij4yNzU1NTwvYT4KK1tzdGFydHVwXSBQYWNrYWdlRnJhZ21lbnRSb290IC0gc291cmNlIGF0dGFjaGVkIHRvbyBlYXJseSAoPykgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4NjEiPjI3ODYxPC9hPgorVmVyaWZ5RXJyb3Igbm90IGJlaW5nIGNhdWdodCBpbiBqZHQgY29yZSB0ZXN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3OTE0Ij4yNzkxNDwvYT4KK0luZmluaXRlIGxvb3Agc2V0dGluZyBicmVha3BvaW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4NTMiPjI3ODUzPC9hPgorSW5jb3JyZWN0IGludmFsaWQgdW5pY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODQwIj4yNzg0MDwvYT4KK0NvbXB1dGluZyBub24tamF2YSByZXNvdXJjZXMgb24gYSBwcm9qZWN0IHNob3VsZCBub3QgY3JlYXRlIGEgTmFtZUxvb2t1cCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY5MCI+Mjc2OTA8L2E+CitTb3VyY2VFbGVtZW50UGFyc2VyIGRvZXNuJ3QgcGFyc2UgbG9jYWwgZGVjbGFyYXRpb25zIGV2ZW4gaWYgaXQgaXMgcmVxdWVzdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTI5NSI+NTI5NTwvYT4KK1NlZ21lbnRlZCB2aWV3IG1pc3NlcyBmaWVsZCBjb21tZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3MTQiPjI3NzE0PC9hPgorSmF2YUVsZW1lbnQubmV3Tm90UHJlc2VudEV4Y2VwdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzczNSI+Mjc3MzU8L2E+CitDb2RlQXNzaXN0IC0gTm8gY29tcGxldGlvbiBmb3IgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MzcwIj4yNzM3MDwvYT4KK2NvZGUgYXNzaXN0IG5vdCB3b3JraW5nIHdpdGggIm5ldyAuLiIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY1OCI+Mjc2NTg8L2E+CitJbmZpbml0ZSBsb29wIHdoZW4gY2hlY2tpbmcgY3ljbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY4MyI+Mjc2ODM8L2E+CitJbmRleCBzaG91bGQgYmUgc2F2ZWQgcmlnaHQgYWZ0ZXIgYSBwcm9qZWN0IHdhcyBpbmRleGVkIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MzMwIj4yNzMzMDwvYT4KK1NpZ25ldHVyZSBzaG91bGQgcmV1c2UgU2Nhbm5lciBvYmplY3QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyOTQiPjI3Mjk0PC9hPgorUGVyZm9ybWFuY2UgLSBnZXRUeXBlU2lnbmF0dXJlIHNob3VsZCBub3QgcmVzY2FuIGVsZW1lbnQgbmFtZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2MDQiPjI2NjA0PC9hPgorRm9yd2FyZCByZWZlcmVuY2VzIHVuaWxhdGVyYWxseSBkaXNzYWxsb3dlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTMyIj4yNzUzMjwvYT4KK1JlYnVpbGQgc29tZXRpbWVzIGludHJvZHVjZXMgaW52YWxpZCBlcnJvcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzU5NyI+Mjc1OTc8L2E+CitBbnQgYWRhcHRlciBvbiBhIDEuNCBKVk0gc2V0cyB0aGUgdGFyZ2V0IHRvIGJlIDEuNAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDk0Ij4yNzQ5NDwvYT4KK1NvdXJjZSBmb2xkZXIgb3V0cHV0IGZvbGRlciBzaG93biBpbiBQYWNrYWdlIGV4cGxvcmVyIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc4MyI+Mjc3ODM8L2E+CitCdWlsZCBvdXRwdXQgZm9sZGVyIHNob3VsZCBub3QgYWx3YXlzIGJlIGluIHRoZSBwcm9qZWN0IHN1YmRpcmVjdG9yaWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2MDAiPjI3NjAwPC9hPgorTlBFIHdoaWxlIHNlYXJjaGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NjAyIj4yNjYwMjwvYT4KK0luY3JlbWVudGFsIGNvbXBpbGUvYnVpbGQgcHJvZHVjZXMgaW52YWxpZCBoZWFkZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzUyIj4yNTc1MjwvYT4KK1JlZmVyZW5jZXMgbGlzdCBkaXNwbGF5cyBudWxscyBmb3IgcGFja2FnZSBuYW1lIHBhcnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTY3Ij4yNjk2NzwvYT4KK1Vwb24gZXhpdCBhbHdheXMgcmVjZWl2ZSAiSlZNIFRlcm1pbmF0ZWQgbWVzc2FnZSIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc0OCI+Mjc3NDg8L2E+CitKVW5pdCBpbXBvcnQgZmFpbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY2MCI+Mjc2NjA8L2E+CitTdGFjayBvdmVyZmxvdyBjYXVzZXMgc3RhcnR1cCBjcmFzaCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzIzNiI+MjcyMzY8L2E+CitzZWFyY2g6IHJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzIC0gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciByZXBvcnRlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzYwMyI+Mjc2MDM8L2E+CitOUEUgaW4gQWJzdHJhY3RJbWFnZUJ1aWxkZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ0OCI+Mjc0NDg8L2E+Cit1c2luZyBTZWFyY2hFbmdpbmUgdGhlIGNvbnN0cnVjdG9ycywgaW5uZXIgY2xhc3NlcyBvciBwYWNrYWdlcyBhcmUgbm90IGZvdW5kIAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDNyZCBEZWNlbWJlciAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4gCis8bGk+PGI+Q29kZSBjb21wbGV0aW9uIGVuaGFuY2VtZW50OjwvYj4KKyAgIDx1bD4KKyAgIDxsaT5SZWxldmFuY2Ugb2YgYSBwcm9wb3NhbCBpcyBoaWdoZXIgaWYgdGhlIHByb3Bvc2FsIGlzIGFmdGVyIGFuIG9wZXJhdG9yIGFuZCB0aGUgdHlwZSBvZgorICAgcHJvcG9zYWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcGVyYXRvci4KKyAgIDxicj5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgPGNvZGU+dmFyMTwvY29kZT4gaXMgbW9yZSByZWxldmFudCB0aGFuIDxjb2RlPnZhcjI8L2NvZGU+LjxwcmU+CisgICBwdWJsaWMgY2xhc3MgWCB7CisgICAgICBpbnQgdmFyMTsKKyAgICAgIE9iamVjdCB2YXIyOworICAgICAgdm9pZCBmb28oKSB7CisgICAgICAgICBpbnQgaSA9IDEgKyB2YXImbHQ7Y3Vyc29yJmd0OworICAgICAgfQorICAgfTwvcHJlPgorICAgPC9saT4KKyAgIDwvdWw+Cis8L2xpPgorPC91bD4gCisgCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDg3Ij4yNzQ4NzwvYT4KK0J1aWxkZXIgZG9lc24ndCBoYW5kbGUgbW92ZSB0byBuZXN0ZWQgc291cmNlIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDk5Ij4yNzQ5OTwvYT4KK0JvZ3VzIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgaXMgZm91bmQgaW4gSmF2YU1vZGVsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMDM5Ij4yMjAzOTwvYT4KK1Byb3ZpZGUgZmFjaWxpdHkgdG8gZXhjbHVkZSBmaWxlcyBmcm9tIGNvbXBpbGF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNTEiPjI2MjUxPC9hPgorcHJvamVjdCBjb21waWxlciBzZXR0aW5ncyA6IHNvbWUgYXJlIG5vdCBzZXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTUzOCI+MjU1Mzg8L2E+CitDb25mbGljdCBvZiBjbGFzc2ZvbGRlciBhbmQgb3V0cHV0Zm9sZGVyIG5vdCByZXBvcnRlZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzMxMCI+MjczMTA8L2E+CitDb21waWxhdGlvblVuaXQjbGluZU51bWJlciguLikgZG9jIHNlZW1zIGZsYXdlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjM1Ij4yNzIzNTwvYT4gIAorQnVnIHdpdGggYXNzaWduZW1lbnQgd2l0aCBubyBlZmZlY3QgbWFzaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTI4Ij4yNTkyODwvYT4KK0Nhbm5vdCBuZXN0IGVudHJpZXMgaW4gSmF2YSBCdWlsZCBQYXRoIC0gUmVxdWVzdCBmb3IgRmVhdHVyZSBSZW1vdmFsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODA2Ij4yNjgwNjwvYT4KK1NvdXJjZSBidWlsZCBwYXRoIHNob3VsZCBhbGxvdyBzdWJkaXJlY3RvcmllcyBvZiBkaXJlY3RvcmllcyBhbHJlYWR5IG9uIHBhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzMyMiI+MjczMjI8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gZHVyaW5nIGNvZGUgYXNzaXN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyNDciPjI3MjQ3PC9hPiAgCitNaXNzaW5nIGdlbmVyYXRpb24gZm9yIHRoZSBxdWFsaWZpZXIgaW4gMS40IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQwNyI+MjI0MDc8L2E+ICAKK0Nhbid0IHNldCBKYXZhIHByb2plY3QgYnVpbGQgb3V0cHV0IGZvbGRlciB0byBkaWZmZXJlbnQgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjUwIj4yNzI1MDwvYT4gIAorV2Fsa2JhY2sgYXNraW5nIGZvciBhIGZ1bGwgcmVidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTczIj4yNzE3MzwvYT4gIAorQVBJOiBhZGQgbWV0aG9kSW52b2NhdGlvbi5yZXNvbHZlTWV0aG9kQmluZGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDEyMyI+MjQxMjM8L2E+CitTdXBwb3J0IGZvciBtdWx0aXBsZSBvdXRwdXQgZGlycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTUxIj4yNzE1MTwvYT4KK05QRSBzZWFyY2hpbmcgaW4gaGllcmFyY2h5IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzA4Ij4yNDMwODwvYT4KK1BlcmZvcm1hbmNlIC0gT3B0aW1pemF0aW9uIG9mIHNlYXJjaCBpbiBoaWVyYXJjaHkgCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjA0Ij4yNzIwNDwvYT4KK0FTVC5saW5lTnVtYmVyKHBvc2l0aW9uKSBpcyBub3Qgd29ya2luZywgaWYgdGhlIGNsYXNzIGRpZG4ndCBoYXZlIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiBmaWxlLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Mzc0Ij4yNzM3NDwvYT4KK3Byb2plY3Qgc3BlY2lmaWMgSlJFIHNldHRpbmdzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyOTUiPjI3Mjk1PC9hPgorUmVsZXZhbmNlIG9mIG1lbWJlciB0eXBlIGluIHR5cGUgY2FzdCBzaG91bGQgYmUgaGlnaGVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MjU0Ij4yNzI1NDwvYT4KK0luZXhhY3QgbWF0Y2hlcyBmb3VuZCB3aGVuIHNlYXJjaCByZWZlcmVuY2VzIHRvIFVuY29uZGl0aW9uYWxGbG93Q29udGV4dCNtYXhGaWVsZENvdW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTM4Ij4yNjkzODwvYT4KK0J1aWxkIFByb2plY3QtY29tbWFuZCByZW1vdmVzIGFsbCBmcm9tIGJ1aWxkLWRpcgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI2dGggTm92ZW1iZXIgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjg1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+IAorPGxpPjxiPlNvdXJjZSBhdHRhY2htZW50IGVuaGFuY2VtZW50czo8L2I+IAorCTx1bD4KKwk8bGk+PGI+U291cmNlIGZvbGRlciBhdHRhY2htZW50OjwvYj4gVGhlIHNvdXJjZSBhdHRhY2htZW50IG1lY2hhbmlzbSBnb3QgZ2VuZXJhbGl6ZWQgdG8gYWxsIGJpbmFyeSAKKwkJICBwYWNrYWdlIGZyYWdtZW50IHJvb3QuIEluIHRoZSBwYXN0LCBvbmx5IGFyY2hpdmVzIGRpZCBzdXBwb3J0IHRvIGNhcnJ5IGEgc291cmNlIGF0dGFjaG1lbnQsIGluIHRoZSAKKwkJICBmb3JtIG9mIGEgc291cmNlIGFyY2hpdmUuIE5vdywgYm90aCBiaW5hcnkgZm9sZGVyIG9yIGFyY2hpdmUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2VzLCB3aGljaCAKKwkJICBjYW4gYmUgZWl0aGVyIGEgc291cmNlIGFyY2hpdmUgb3IgYSBzb3VyY2UgZm9sZGVyLiBJbiBwYXJ0aWN1bGFyLCBtaXhlZCBtb2RlcyBhcmUgc3VwcG9ydGVkIChiaW5hcnkgCisJCSAgYXJjaGl2ZSBhc3NvY2lhdGVkIHRvIHNvdXJjZSBmb2xkZXIgYW5kIHJlY2lwcm9jYWxseSkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSAKKwkJICA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5hdHRhY2hTb3VyY2UoSVBhdGgsIElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4gYW5kIAorCQkgIDxjb2RlPkphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSguLi4pPC9jb2RlPi4KKwk8L2xpPgorCTxsaT48Yj5BdXRvbWF0aWMgcm9vdCBwYXRoIGRldGVjdGlvbjo8L2I+IElmIG51bGwgaXMgc3BlY2lmaWVkIGFzIHRoZSByb290IHBhdGggKHNlZSAKKwkJICA8Y29kZT5KYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoLi4uKTwvY29kZT4gYW5kIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LmF0dGFjaFNvdXJjZSguLi4pPC9jb2RlPiksIAorCQkgIHRoZW4gdGhlIEphdmEgTW9kZWwgd2lsbCBkbyBpdHMgYmVzdCB0byBjb21wdXRlIHRoaXMgcm9vdCBwYXRoIGF1dG9tYXRpY2FsbHkuIFRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobSAKKwkJICBmaW5kcyB0aGUgZmlyc3QgLmphdmEgZmlsZSwgcGFyc2VzIGl0LCBhbmQgZXh0cmFjdCB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiB0byBjb21wdXRlIHRoZSByb290IHBhdGguCisJPC9saT4KKwk8bGk+PGI+Um9vdCBwYXRoIGRldGVjdGlvbjo8L2I+IFRoZSBuZXcgQVBJIAorCQkgIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LmNvbXB1dGVTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgpPC9jb2RlPiAKKwkJICBhbGxvd3MgdG8gZGV0ZWN0IHRoZSByb290IHBhdGggZm9yIGEgZ2l2ZW4gc291cmNlIGF0dGFjaG1lbnQgYW5kIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KKwk8L2xpPgorCTwvdWw+Cis8L2xpPgorPGxpPjxiPkNvZGUgY29tcGxldGlvbiBlbmhhbmNlbWVudDo8L2I+CisgICA8dWw+CisgICA8bGk+UmVsZXZhbmNlIG9mIGEgcHJvcG9zYWwgaXMgbGVzc2VyIGlmIHRoZSBwcm9wb3NhbCBpcyBpbiBhIHZhcmlhYmxlIGluaXRpYWxpemVyIGFuZCB0aGUgcHJvcG9zYWwgaXMgdGhlIHZhcmlhYmxlLgorICAgPGJyPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSA8Y29kZT52YXIyPC9jb2RlPiBpcyBsZXNzIHJlbGV2YW50IHRoYW4gPGNvZGU+dmFyMTwvY29kZT4uPHByZT4KKyAgIHB1YmxpYyBjbGFzcyBYIHsKKyAgICAgIGludCB2YXIxOworICAgICAgaW50IHZhcjIgPSB2YXImbHQ7Y3Vyc29yJmd0OworICAgfTwvcHJlPgorICAgPC9saT4KKyAgIDxsaT5SZWxldmFuY2Ugb2YgYSBwcm9wb3NhbCBpcyBsZXNzZXIgaWYgdGhlIHByb3Bvc2FsIGlzIHN0YXRpYyBhbmQgdGhlIHF1YWxpZmllZCBleHByZXNzaW9uIGlzIG5vbi1zdGF0aWMuCisgICA8YnI+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIDxjb2RlPnZhcjI8L2NvZGU+IGlzIG1vcmUgcmVsZXZhbnQgdGhhbiA8Y29kZT52YXIxPC9jb2RlPi48cHJlPgorICAgcHVibGljIGNsYXNzIFggeworICAgICAgc3RhdGljIGludCB2YXIxOworICAgICAgaW50IHZhcjI7CisgICAgICB2b2lkIGZvbygpIHsKKyAgICAgICAgIHRoaXMudmFyJmx0O2N1cnNvciZndDsKKyAgICAgIH0KKyAgIH08L3ByZT4KKyAgIDwvbGk+CisgICA8bGk+UmVsZXZhbmNlIG9mIGEgcHJvcG9zYWwgaXMgaGlnaGVyIGlmIHRoZSBjb21wbGV0aW9uIGlzIG5vdCBxdWFsaWZpZWQgb3IgaXMgYSBsb2NhbCB2YXJpYWJsZS4KKyAgIDxicj5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdGhlIGZpZWxkIDxjb2RlPnZhcjI8L2NvZGU+IGFuZCB0aGUgcGFyYW1ldGVyIDxjb2RlPnZhcjE8L2NvZGU+IGFyZSBtb3JlIHJlbGV2YW50CisgICB0aGFuIGZpZWxkIDxjb2RlPnZhcjE8L2NvZGU+LjxwcmU+CisgICBwdWJsaWMgY2xhc3MgWCB7CisgICAgICBpbnQgdmFyMTsKKyAgICAgIGludCB2YXIyOworICAgICAgdm9pZCBmb28oaW50IHZhcjEpIHsKKyAgICAgICAgIHZhciZsdDtjdXJzb3ImZ3Q7CisgICAgICB9CisgICB9PC9wcmU+CisgICA8L2xpPgorICAgPGxpPlJlbGV2YW5jZSBvZiBhIHByb3Bvc2FsIGlzIGhpZ2hlciBpZiB0aGUgcHJvcG9zYWwgaXMgZXF1YWxzIHRvIHRoZSBjdXJyZW50IHRva2VuLgorICAgPGJyPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0aGUgZmllbGQgPGNvZGU+dmFyPC9jb2RlPiBpcyBtb3JlIHJlbGV2YW50IHRoYW4gZmllbGQgPGNvZGU+dmFyUGx1czwvY29kZT4uPHByZT4KKyAgIHB1YmxpYyBjbGFzcyBYIHsKKyAgICAgIGludCB2YXI7CisgICAgICBpbnQgdmFyUGx1czsKKyAgICAgIHZvaWQgZm9vKCkgeworICAgICAgICAgdmFyJmx0O2N1cnNvciZndDsKKyAgICAgIH0KKyAgIH08L3ByZT4KKyAgIDwvbGk+CisgICA8L3VsPgorPC9saT4KIDwvdWw+IAogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MzAzIj4xOTMwMzwvYT4gIAotT3BlbiB0eXBlIGRvZXMgbm90IHNob3cgYWxsIHR5cGUuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMDkiPjE0MTA5PC9hPiAgCi1EZWFkbG9jayBiZXR3ZWVuIFByb2JsZW1UcmVlVmlld2VyIHJlZnJlc2ggYW5kIHJlY29uY2lsZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI1NCI+MTkyNTQ8L2E+ICAKLVNvbWUgbG9jYWwgdmFyaWFibGUgY29tcGxldGlvbiBwcm9wb3NhbHMgYXJlIG1pc3NlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MTMxIj4xOTEzMTwvYT4gIAotTlBFIHdoZW4gcmVtb3ZpbmcgYSBwcm9qZWN0IGNvbnRhaW5pbmcgbWlzc2luZyBjbGFzc2ZpbGUgZm9sZGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNTgiPjE5MDU4PC9hPiAgCi1DbG9zaW5nIG5vbi1qYXZhIHByb2plY3QgZG9lc24ndCByZW1vdmUgcm9vdCBmcm9tIGphdmEgcHJvamVjdCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1ODQiPjE4NTg0PC9hPiAgCi1OZXcgMi4wIEFQSXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY5OCI+MTg2OTg8L2E+ICAKLVNlZWluZyBub24tamF2YSBwcm9qZWN0cyBpbiBwYWNrYWdlIHZpZXcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODkyMCI+MTg5MjA8L2E+ICAKLU5QRSBzZWFyY2hpbmcgZm9yIHJlZmVyZW5jZXMgdG8gYSBtZXNzYWdlICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODc0OSI+MTg3NDk8L2E+Ci1NaXNzaW5nIGphdmEgZG9jIGZvciBJQ29uc3RhbnRQb29sRW50cnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU4MyI+MTg1ODM8L2E+ICAKLU5ldyBjb25zdGFudHMgbm90IHRhZ2dlZCB3aXRoIEBzaW5jZSAyLjAgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NzA4Ij4xODcwODwvYT4KLURPTSBBU1QgLSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb3JnYW5pemluZyBpbXBvcnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwMzkiPjE4MDM5PC9hPgotT3BlbmluZyAuY2xhc3MgZmlsZSBmYWlscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjIxIj4xODYyMTwvYT4KLVF1ZXJ5IGFsbCB0eXBlcyB3aGVuIHByb2plY3QgaXMgY2xvc2VkIHByZXZlbnRzIHJlaW5kZXhpbmcgd2hlbiBwcm9qZWN0IGlzIG9wZW4gIAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MTYiPjI0OTE2PC9hPgorcXVpY2sgZml4OiBkb2VzIG5vdCBoYW5kbGUgYWRkaXRpb25hbCBkaW1lbnRpb25zIHNvbWV0aW1lcyBbcXVpY2sgZml4XQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTAzIj4yNjkwMzwvYT4KK1ZlcmlmeUVycm9yIHdoZW4gY2FzdGluZyBudWxsIHRvIGFuIGFycmF5IHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwMDIiPjI3MDAyPC9hPgorU2Nhbm5lciAgYWxsb2NhdGVzIG5ldyBBcnJheUxpc3QoMTApIGV2ZXJ5dGltZSBpdCdzIGNyZWF0ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjkxMiI+MjY5MTI8L2E+CisnbnVsbCA9PSBudWxsJyBmb29saW5nIGJsYW5rIGZpbmFsIGFuYWx5c2lzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4MTciPjI2ODE3PC9hPgorQ2xhc3MgRmlsZSBFZGl0b3Igc2hvd3Mgd29yZHMgdHJhbnNsYXRlZCB3aGljaCBzaG91bGRuJ3QgYmUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0NTIiPjI2NDUyPC9hPgorV3JvbmcgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW1wb3J0IHN0YXRlbWVudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4ODEiPjI2ODgxPC9hPgorWW95byBpbiB0aGUgZGVidWdnZXIgYWdhaW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MyI+MjY3NTM8L2E+CitTdXNwaWNpb3VzIHlveW8gYmVoYXZpb3Igd2hlbiBzdGVwcGluZyB0aHJvdWdoIGlmIGNvbmRpdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTQ4Ij4yNTE0ODwvYT4KK0Nhbid0IGhhdmUgZGlmZmVyZW50IGNhc2UgcGFja2FnZSBuYW1lcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODgzIj4yNjg4MzwvYT4KK1Nob3VsZCByZXBvcnQgdW5pdGlhbGl6ZWQgYmxhbmsgZmluYWwgZmllbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkzMiI+MjA5MzI8L2E+CitDYW5ub3QgYWRkIGEgc291cmNlIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIG9mIGEgSkFSIGZpbGUuIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3MTkiPjg3MTk8L2E+CitEQ1IgLSBBdHRhYyBoIEphdmEgU291cmNlOiBhbGxvdyB1bi1qYXJyZWQgc291cmNlIHRyZWU/IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MTIiPjY5MTI8L2E+CitBdHRhY2ggU291cmNlIFJlcXVpcmVzIEpBUi9aSVAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNTUiPjI2MjU1PC9hPgorcHJvamVjdCBjb21waWxlciBzZXR0aW5ncyA6IGNhbm5vdCBnbyBiYWNrIHRvIHdvcnNwYWNlIHNldHRpbmdzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4NDEiPjI2ODQxPC9hPgorQ29tcGlsZXIgLSBEb2VzIG5vdCBkZXRlY3Qgbm9uLXZpc2libGUgbWVtYmVyIHR5cGUgaW4gaW1wb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3ODQiPjI2Nzg0PC9hPgorcHJvYmxlbSBNMyBzb3VyY2VidWlsZCwgbGludXgvZ3RrIC0gYnVpbGQgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjcwNiI+MjY3MDY8L2E+CitDYW5ub3QgY3JlYXRlIHByb2plY3Qgd2l0aCBjb21tYSBjaGFyYWN0ZXJzIGluIHByb2plY3QgcGF0aCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE5NSI+MjYxOTU8L2E+CitKRFQgY29tcGlsZXIgZG9lc24ndCByZXBvcnQgcmVjdXJzaXZlIGNvbnN0cnVjdG9yIGludm9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc0NyI+MjY3NDc8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcmVhZGluZyBidWlsZCBzdGF0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDMiPjMyNDM8L2E+CitTb3VyY2VBdHRhY2htZW50IC0gYXV0b21hdGljIGNvbXB1dGF0aW9uIG9mIHRoZSBwYWNrYWdlIHJvb3QgZG9lcyBub3Qgd29yayAoMUdDTVRMUCkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3ODUiPjI2Nzg1PC9hPgorVW5yZWFjaGFibGUgZW1wdHkgYmxvY2tzIHNob3VsZCBiZSByZXBvcnRlZCBpbiAxLjQgY29tcGxpYW50IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjY2NCI+MjY2NjQ8L2E+CitkZXByZWNhdGVkIGludGVyZmFjZXMgYXJlIG5vdCBhbGx3YXlzIHJlY29nbml6ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1OSI+MjY3NTk8L2E+CitDYXN0IENvbXBpbGVyIEVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxMzQiPjI2MTM0PC9hPgorSkFDS1MgLSBWZXJpZnlFcnJvciBydW5uaW5nIGludmFsaWQgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjUzIj4yNjI1MzwvYT4KK3Rhc2sgdGFnczogdHdvIHRhZ3Mgb24gb25lIGxpbmUgY3JlYXRlcyBvbmUgdGFzayBmb3IgZmlyc3QgdGFnCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NzciPjI2Njc3PC9hPgorQ29kZSBBc3Npc3QgLSBleHBlY3RlZCB0eXBlIG11c3QgYmUgcXVhbGlmaWVkLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTQyIj4yMzU0MjwvYT4KK0NvZGVBc3Npc3QgcHJvcG9zYWwgc2hvdWxkIG9mZmVyIG5vbi1xdWFsaWZpZWQgb25lcyBmaXJzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODkwIj4yNTg5MDwvYT4KK2NvZGUgYXNzaXN0IGRpc3BsYXlzIHN0YXRpYyBtZW1iZXJzIG9uIG5vbi1zdGF0aWMgZXhwcmVzc2lvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjAyNSI+MjYwMjU8L2E+CitTZWFyY2ggc2hvdWxkIG5vdCB1c2UgYSBmaWxlIGJhc2VkIG5hbWUgZW52aXJvbm1lbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxMzgiPjI2MTM4PC9hPgorSkFDS1MgLSBUaGUgbnVsbCBsaXRlcmFsIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhcyBhIGNvbnN0YW50IGV4cHJlc3Npb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjU4NSI+MjY1ODU8L2E+CitXcm9uZyBjb2RlIGdlbmVyYXRpb24gaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NTg4Ij4yNjU4ODwvYT4KK0NvZGUgQXNzaXN0IC0gdmFyaWFibGUgbXVzdCBiZSBsZXNzIHJlbGV2YW50IGluIGluaXRpYWxpemF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxNDIiPjI2MTQyPC9hPgorSkFDS1M6IE11c3QgcmVqZWN0IGludmFsaWQgY2hhcmFjdGVyIGFmdGVyIGNsYXNzIGRlZmluaXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE0MSI+MjYxNDE8L2E+CitKQUNLUzogU2hvdWxkIHJlcG9ydCB1bnRlcm1pbmF0ZWQgY29tbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTI5Ij4yNjEyOTwvYT4KK0pBQ0tTOiBWZXJpZnlFcnJvciwgYmVjYXVzZSBvcGNvZGUganNyX3cgbm90IHVzZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg4OCI+MjU4ODg8L2E+CitPcGVuIG9uIHNlbGVjdGlvbiBmYWlscyBvbiBwcml2YXRlIGJpbmFyeSBpbm5lciBjbGFzcyBjb250cnVjdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMjYiPjIzMTI2PC9hPgorYWxsb3cgc2VsZWN0aW5nIGRpcmVjdG9yaWVzIHdoZW4gYXR0YWNoaW5nIHNvdXJjZSB0byBqYXIncyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE0NSI+MjIxNDU8L2E+CitBdHRhY2ggc291cmNlIGRpcmVjdG9yeSBpbiBhZGRpdGlvbiB0byBhcmNoaXZlIGZpbGUgW2J1aWxkIHBhdGhdIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDU5Ij4yNjQ1OTwvYT4gIAorVW51c2VkIE5vblZvaWRNZXRob2RSZXF1ZXN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjEyMiI+MjYxMjI8L2E+ICAKK0pBQ0tTOiBWZXJpZnlFcnJvciB3aGVuIGFmZmVjdGluZyBmaW5hbCBsb2NhbCBpbiBhbm9ueW1vdXMgY2xhc3MgaGVhZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxMjQiPjI2MTI0PC9hPiAgCitKQUNLUyAtIENvbXBpbGUgZXJyb3Igbm90IHJlcG9ydGVkIHdoZW4gYnJlYWs7IHVzZWQgaW4gYSBsYWJlbGVkIHN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTM0Ij4yNDkzNDwvYT4KK01vdmUgdG9wIGxldmVsIGRvZXNuJ3Qgb3B0aW1pemUgdGhlIGltcG9ydHNbcmVmYWN0b3JpbmddIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjUwIj4yNTI1MDwvYT4KK1NjcmFwYm9vayBzaG93cyB3cm9uZyBlcnJvciBtZXNzYWdlCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjcxIj4xOTI3MTwvYT4gICAgCi1JT0V4Y2VwdGlvbiB3aGVuIHNlYXJjaGluZyBmb3IgcGFja2FnZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MTYiPjc5MTY8L2E+ICAKLUNvZGUgYXNzaXN0IGRvZXMgbm90IGZpbmQgY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQyNCI+MTk0MjQ8L2E+ICAKLUpEVCBwcm9jZXNzaW5nIGRlbHRhcyBmb3Igbm9uLWphdmEgZmlsZXMgaW4gbm9uLWphdmEgcHJvamVjdHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYzMyI+MTg2MzM8L2E+ICAKLUJ1aWxkIGZhaWxlZDogQ2FuIG5vdCBmaW5kIHRoZSBjbGFzcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Jbml0aWFsaXplcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTc1Ij4xODE3NTwvYT4gIAotUXVpY2tmaXggZmFsc2UgcG9zaXRpdmVzIGZvciBub24tcHVibGljIGNsYXNzZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTI5MyI+MTkyOTM8L2E+ICAKLWNhbmNlbGxpbmcgY29tcGlsaW5nIGRvZXMgbm90IGFsd2F5cyBjYW5jZWwKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODUzOSI+MTg1Mzk8L2E+ICAKLXVuYWJsZSB0byBydW4gSkRCQyBwcm9ncmFtLCBjbGFzcyBub3QgZm91bmQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjkyIj4zMjkyPC9hPiAgCi1BZGRpbmcgbmV3IGNsYXNzIHRha2VzIHZlcnkgbG9uZyAoPjIwcykgKDFHRVVHRlEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzMyI+MzMzMzwvYT4gIAotSmF2YUNvcmUgZG9lcyBub3QgcmVjb2duaXplIGRvdCBub3RhdGlvbiBmb3IgaW5uZXIgY2xhc3NlcyAoMUdJN0daRykgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTA3Ij4xODUwNzwvYT4KLW92ZXJ3cml0dGluZyBleGl0aW5nIGZpbGUgZG9lcyBub3Qgd29yawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDE0Ij4xODQxNDwvYT4KLU5MUyBUb29sczogRmluZCBzdHJpbmdzIGFuZCBjb21waWxlciB3YXJuaW5nIG91dCBvZiBzeW5jaCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjA1Ij41NjA1PC9hPiAgICAKLU5QRSByZXN0YXJ0aW5nIHdvcmtzcGFjZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTIiPjMyNTI8L2E+ICAgIAotQ29kZSBhc3Npc3QgbGlzdCBjb3VsZCBiZSBuYXJyb3dlciBpbiB0aHJvd3MgY29tcGxldGlvbiAoMUdEMDc0QykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODcyNCI+MTg3MjQ8L2E+ICAgIAotQ29kZSBmb3IgdGhlIHN0YXRpYyBpbml0aWFsaXplciBpcyBleGNlZWRpbmcgdGhlIDY1NTM1IGJ5dGVzIGxpbWl0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3MiI+MzI3MjwvYT4gICAgCi1Db2RlQ29tcGxldGlvbiAtIHNob3VsZCBvbmx5IHJlc29sdmUgaW50ZXJmYWNlcyAoMUdFNUI4WCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjU5Ij42MjU5PC9hPiAgICAKLURDUjogSUNsYXNzcGF0aEVudHJ5IHdpdGggSmF2YURvYyBsb2NhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDA3Ij4xMDAwNzwvYT4gICAgCi1OUEUgYW5kIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIHJlbmFtaW5nIGNsYXNzIG5hbWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIyIj4zMjIyPC9hPiAgICAKLUpNIC0gUmVtaW5kZXIgLSByZS1lbmFibGUgdHJhbnNpZW50IHJlY29uY2lsaW5nIG1hcmtlciAgKDFHQUo5RlEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2NyI+MzI2NzwvYT4gICAgCi1EZWFkbG9jayB3aGlsZSByZWZyZXNoaW5nIGZvcm0gbG9jYWwgKDFHRFRVU0QpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU4MyI+NTU4MzwvYT4gICAgCi1nZXROb25KYXZhUmVzb3VyY2VzIGRvZXMgbm90IHJldHVybiAuY2xhc3MgZmlsZXMgZm9yIHNvdXJjZSBmb2xkZXJzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzEiPjE2MzcxPC9hPiAgICAKLUphdmEgTW9kZWwgRXhjZXB0aW9uIHVzaW5nIGNvZGUgYXNzaXN0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MjYiPjE3NjI2PC9hPiAgICAKLUF1dG8tZm9ybWF0IHNvdXJjZSByZW1vdmVkIG5ld2xpbmUgYXQgZW5kIG9mIHJhbmdlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg2MyI+ODg2MzwvYT4gICAgCi0uY2xhc3NwYXRoIGdldHMgb3ZlcndyaXR0ZW4gaWYgdGhlcmUncyBhbiBYTUwgZXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM1Ij4zMzM1PC9hPiAgICAKLUphdmEgRWxlbWVudCBEZWx0YXM6IFBlcmZvcm1hbmNlIGlzc3VlcyB3aXRoIGRlbHRhcyBmcm9tIFdvcmtpbmcgQ29weSAoMUdJRTM2SikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUzIj4zMjUzPC9hPiAgICAKLVNFVkVSRTogTm90IGFsbCBleHRlcm5hbCBKQVJzIHNob3cgdXAgaW4gcGFja2FnZXMgdmlldyAoMUdEMEpaTykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM0Ij4xODM0PC9hPiAgICAKLUNhbmNlbCBidWlsZCB3aXRoIDEwMDAwKyBwcm9ibGVtcyB0YWtlcyBmb3JldmVyIHRvIHVwZGF0ZSAoMUcyUTlZWikKLQotPGgxPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY1ODAiPjI2NTgwPC9hPgoramF2YSBlbGVtZW50IGRlbHRhcyBub3Qgc2VudCBvdXQ/IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODM3Ij4yMTgzNzwvYT4KK0VjbGlwc2UgaGFuZ3MgdHJ5aW5nIHRvIHNldCBhIGJyZWFrcG9pbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0MDYiPjI1NDA2PC9hPgorUGFja2FnZSBuYW1lIGNoYW5nZSBkaXNhbGxvd2VkICBiZWNhdXNlIG9mIGNhc2UgaW5zZW5zaXRpdml0eQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODg1Ij4yNjg4NTwvYT4KK2JpbmFyeSByZXByZXNlbnRhdGlvbiB3cm9uZ2x5IGZsYWdnZWQgYXMgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjUyNiI+MjY1MjY8L2E+CitJbm5lciBjbGFzcyBpbXBvcnRzIGZsYWdnZWQgYXMgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NTIiPjI2NjUyPC9hPgorRW5jb3VudGVyZWQgICJjYXNlIHN0YXRlbWVudCBtdXN0IGJlIGNvbnN0YW50IiBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDc2Ij4yMzA3NjwvYT4KK2NvbXBpbGF0aW9uIGRvZXMgbm90IGNyZWF0ZSBjbGFzcyBmaWxlcyEhIQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDE1Ij4yNDAxNTwvYT4KK0NWUyBzeW5jaHJvbml6ZSB3aXRoIG91dGdvaW5nIGNoYW5nZXMgb25seSBjYXVzZXMgSmF2YSByZWJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0NzgiPjI1NDc4PC9hPgorVW5yZXNvbHZhYmxlIGltcG9ydCBzdGF0ZW1lbnRzIFByb2JsZW0gTWFya2VyIG1hbGZ1bmN0aW9uaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NTgiPjI2NjU4PC9hPgorTm8gZGVwcmVjYXRpb24gd2FybmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTMyIj4yNjEzMjwvYT4KK0pBQ0tTIC0gQmxhbmsgZmluYWwgaW5zdGFuY2UgbXVzdCBiZSBhc3NpZ25lZCBiZWZvcmUgdGhlIGVuZCBvZiBjb25zdHJ1Y3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MzQwIj4yNjM0MDwvYT4KK1VzaW5nIGphdmFkb2MgY29tbWVudHMgdG8gZ2VuZXJhdGUgYW5kIG1hbmFnZSBib29rbWFya3MuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAyMCI+OTAyMDwvYT4KK01vcmUgaW50ZWxsaWdlbnQgY29kZSBhc3Npc3QuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU5NjIiPjI1OTYyPC9hPgorT3V0cHV0IGNsYXNzZXMgaXMgc2NydWJiZWQgZHVlIHRvIGVycm9yIGluIGNvbXBpbGluZyBhIHNvdXJjZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjE2NiI+MjYxNjY8L2E+Citjb21waWxlIHNpbmdsZSBmaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2ODQiPjI1Njg0PC9hPgorU2VsZWN0aW9uRW5naW5lIHRvIGJlIG1hZGUgQVBJPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDU0Ij4yNjQ1NDwvYT4gIAorRENSOiBJU2Nhbm5lci5zZXRTb3VyY2VSZWFkZXIKKyAgCis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjAxIC0gMXN0IEp1bmUgMjAwMiAtIEZSRUVaRSAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NAorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTR0aCBOb3ZlbWJlciAyMDAyIC0gMi4xIE1JTEVTVE9ORS0zCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI4NAogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPlRoZSByZXNvdXJjZSBjb3B5IGV4Y2x1c2lvbiBmaWx0ZXIgbm93IHRvbGVyYXRlcyB3aGl0ZXNwYWNlcyBpbnNpZGUgdGhlIGZpbHRlciBwYXR0ZXJuLCB0aGV5IHdpbGwgYmUgdHJpbW1lZAotd2hlbiB1c2VkLiBlLmcuICIgIC4qICAgLCAgZm9vLyAiIGlzIG5vdyBhY2NlcHRlZC48L2xpPgogPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ0NiI+MTg0NDY8L2E+ICAKLUphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciBvbiBub3QgeWVzdCBjcmVhdGVkIHByb2plY3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQxMSI+MTg0MTE8L2E+ICAKLUV4dGVybmFsIEpBUiByZWZyZXNoIC0gY2FjaGluZyBwcm9ibGVtCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0NTMiPjE4NDUzPC9hPiAgCi1EZWxldGluZyBwcm9qZWN0IGRvZXNuJ3QgcmVtb3ZlIHBrZyBmcmFnbWVudCByb290IGluIGFub3RoZXIgcHJvamVjdCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMzEiPjE4MzMxPC9hPiAgICAKLUphdmEgTW9kZWwgbm90IGZsdXNoZWQgd2hlbiB1cGdyYWRpbmcgYmluYXJ5IHByb2plY3RzICAKKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjU5Ij4yNjI1OTwvYT4gIAorRXJyb3JzIHJlcG9ydGVkIG9uIHNhdmUgd2hpY2ggZ28gYXdheXMgb24gcmVidWlsZAogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CiAKLTxoMT4KKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MzEgLSAzMXN0IE1heSAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTMKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDEzdGggTm92ZW1iZXIgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODMKIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLTxsaT5DaGFuZ2luZyAyLjAgQVBJIGZvciByZWZyZXNoaW5nIGV4dGVybmFsIEpBUnMgc28gYXMgdG8gcGFzcyBpbiBhIGNvbGxlY3Rpb24gb2YgKmVsZW1lbnRzKiB0byByZXN0cmFpbiB0aGUgc2NvcGUKLW9mIHRoZSB1cGRhdGUgKHNlZSA8Y29kZT5JSmF2YU1vZGVsI3JlZnJlc2hFeHRlcm5hbEFyY2hpdmVzKElKYXZhRWxlbWVudFtdLElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4gRWxlbWVudHMgCi1jYW4gZWl0aGVyIGJlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMsIHByb2plY3RzIG9yIEphdmEgbW9kZWwuPC9saT4KIDwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MTgiPjE4NDE4PC9hPiAgCi0gc2VhcmNoOiBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyByZXBvcnRzIGltcG9ydCBkZWNsYXJhdGlvbnMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Mjg3Ij4xODI4NzwvYT4gIAotJmx0O0NsaW5pdCZndDsgY2hhbmdlIGlzIHRyZWF0ZWQgYXMgYSBzdHJ1Y3R1cmFsIGNoYW5nZSBieSBpbmNyZW1lbnRhbCBidWlsZGVyCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjEyOCI+MjYxMjg8L2E+ICAKK3BhY2thZ2VzIGRvbid0IGFwcGVhciBpbiBwYWNrYWdlIGV4cGxvcmVyIHZpZXcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNDQiPjI2MDQ0PC9hPgorVW5leHBlY3RlZCBmdWxsIGJ1aWxkcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDk4Ij4yNjA5ODwvYT4KK1dyb25nIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUxNyI+MjQ1MTc8L2E+Cit0eXBlIHZpZXcgZG9lcyBub3Qgbm90aWNlIHdoZW4gamFyIGRpc2FwcGVhcnMgCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzY2Ij4xNzc2NjwvYT4KLVN0cmFuZ2UgZXJyb3Igd2hlbiBsYXVuY2hpbmcgRWNsaXBzZSBmcm9tIGluc2lkZSBFY2xpcHNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Mzk2Ij4xODM5NjwvYT4KLWFudCBqYXZhYyB0YXJnZXQgaWdub3JlcyBzb3VyY2U9IjEuNCIgc2V0dGluZyBpbnNpZGUgZWNsaXBzZSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE4NyI+MTQxODc8L2E+ICAKLWVycm9yIHJlYnVpbGRpbmcgcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjA3Ij4xNDYwNzwvYT4gIAotUmVmYWN0b3I6IHJlbmFtZSBpc24ndCB1cGRhdGluZyByZWZlcmVuY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzIiPjE2MTcyPC9hPiAgCi1OYW1lbG9va3VwIHNsb3cgdG8gcmV0cmlldmUgcGFja2FnZSBmcmFnbWVudHMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNTciPjE4MTU3PC9hPiAgICAKLUludGVybmFsIEVycm9yIHdoZW4gZGVsZXRpbmcgcHJvamVjdCAgCi0gPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjU5Ij4xODI1OTwvYT4gIAotY2hhbmdpbmcgY2xhc3NwYXRoIGNhdXNlcyBzaWduaWZpY2FudCByZWNvbXBpbGF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzOTQiPjEwMzk0PC9hPiAgCi1zeW1ib2xpYyBsaW5rcyB1cHNldCBKUkUgcGF0aCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTMwMiI+OTMwMjwvYT4KLUFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhcyBiZWVuIGRldGVjdGVkIGluIG5hdGl2ZSBjb2RlIG91dHNpZGUgdGhlIFZNCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjA2MyI+MjYwNjM8L2E+ICAKK01hY09TIFg6IEVycm9yIHNhdmluZyBmaWxlcwogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMwIC0gMzB0aCBNYXkgMjAwMiAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUyCitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMnRoIE5vdmVtYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjgyYgogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPkNvbXBpbGVyIGNhbiBub3cgb3B0aW9uYWxseSByZXBvcnQgdW51c2VkIGltcG9ydHMuIFNlZSBvcHRpb24gbmFtZWQgIiIgb24gPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+IGNvbW1lbnQKLTxwcmU+Ci0JICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIEltcG9ydAotCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgaW1wb3J0IAotCSAqICAgIHJlZmVyZW5jZSAKLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6CQkiaWdub3JlIgotPC9wcmU+Ci1Ob3RlIHRoYXQgaWYgaW1wb3J0IHByb2JsZW1zIChzZXBhcmF0ZSBzZXR0aW5ncykgYXJlIGRpc2FibGVkLCB1bnVzZWQgaW1wb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCBlaXRoZXIuCi1UaGlzIG9wdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB0byB0aGUgYmF0Y2ggY29tcGlsZXIgKCItd2Fybjp1bnVzZWRJbXBvcnRzIikuIEltcGxlbWVudGF0aW9ucyBvZiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4KLWNhbiBpZGVudGlmeSB0aGlzIG5ldyBwcm9ibGVtIHRocm91Z2ggaXRzIElEIDxjb2RlPklQcm9ibGVtI1VudXNlZEltcG9ydDwvY29kZT4uCis8bGk+SW4gY2FzZSBzb21lb25lIGRlbGV0ZXMgdGhlIC5jbGFzc3BhdGggYW5kIG5vIGNvcnJlc3BvbmRpbmcgY2xhc3NwYXRoIGV4aXN0cyBpbiBtZW1vcnksCisgICAgICBhIGRlZmF1bHQgLmNsYXNzcGF0aCBpcyBub3QgYXV0b21hdGljYWxseSBjcmVhdGVkIGFueSBsb25nZXIgYnV0IGEgbWFya2VyIGlzIGNyZWF0ZWQgb24gdGhlCisgICAgICBwcm9qZWN0IHByZXZlbnRpbmcgdGhpcyBwcm9qZWN0IGZyb20gYmVpbmcgYnVpbHQuCisgICAgICBUaGlzIGNvdmVycyB0aGUgZm9sbG93aW5nIHNjZW5hcmlpOgorICAgICAgPHVsPgorICAgICAgPGxpPlNvbWVvbmUgY2hlY2tzIGluIGEgLnByb2plY3QgZmlsZSB3aXRoIHRoZSBKYXZhIG5hdHVyZSBidXQgZG9lc24ndCBjaGVjayBpbiB0aGUgLmNsYXNzcGF0aCBmaWxlLgorICAgICAgICAgICAgV2hlbiB0aGUgcHJvamVjdCBpcyBjaGVja2VkIG91dCwgYSBtYXJrZXIgaXMgY3JlYXRlZCBpbmRpY2F0aW5nIHRoZSAuY2xhc3NwYXRoIGZpbGUgY291bGQgbm90IAorICAgICAgICAgICAgYmUgcmVhZC48L2xpPgorICAgICAgPGxpPlNvbWVvbmUgc2h1dHMgZG93biB0aGUgd29ya2JlbmNoLCBkZWxldGVzIHRoZSAuY2xhc3NwYXRoIGFuZCByZXN0YXJ0IHRoZSB3b3Jrc3BhY2UuCisgICAgICAgICAgICBXaGVuIGF0dGVtcHRpbmcgdG8gYnVpbHQgdGhlIHByb2plY3QsICBhIG1hcmtlciBpcyBjcmVhdGVkIGluZGljYXRpbmcgdGhlIC5jbGFzc3BhdGggZmlsZSBjb3VsZCAKKyAgICAgICAgICAgIG5vdCBiZSByZWFkIGFuZCB0aGUgcHJvamVjdCBpcyBub3QgYnVpbHQuPC9saT4KKyAgICAgICA8bGk+VGhlIEphdmEgbmF0dXJlIGlzIGFkZGVkIHRvIGEgcHJvamVjdCB3aXRob3V0IGEgLmNsYXNzcGF0aCBmaWxlLiBBIG1hcmtlciBpcyBjcmVhdGVkIGluZGljYXRpbmcgCisgICAgICAgCQl0aGUgLmNsYXNzcGF0aCBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgorICAgICAgPC91bD4KIDwvbGk+Ci08bGk+QWRkZWQgQVBJIG9uIElUeXBlIHNvIGFzIHRvIHRlbGwgd2hldGhlciBhIHR5cGUgaXMgYW5vbnltb3VzLCBsb2NhbCBvciBtZW1iZXIuPC9saT4KLTxsaT5DaGFuZ2luZyAyLjAgQVBJIGZvciByZWZyZXNoaW5nIGV4dGVybmFsIEpBUnMgc28gYXMgdG8gcGFzcyBpbiBhIGNvbGxlY3Rpb24gb2YgcHJvamVjdHMgdG8gcmVzdHJhaW4gdGhlIHNjb3BlCi1vZiB0aGUgdXBkYXRlIChzZWUgPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxKQVJzKElKYXZhUHJvamVjdFtdLElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4gPC9saT4KLTwvdWw+Ci0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDYiPjE3OTA2PC9hPgotUmVuYW1lIHBhY2thZ2UgZmFpbHMgd2hlbiBpbm5lciBjbGFzc2VzIGFyZSBpbXBvcnRlZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyNTUiPjE4MjU1PC9hPgotTlBFIGR1cmluZyBPcmdhbml6ZSBpbXBvcnRzLi4uLiBTZWUgdGVzdDUgaW4gVUkgdGVzdHMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNjkiPjE4MTY5PC9hPgotYXN0OiBpbmNvcnJlY3QgbGVuZ3RoIG9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZm9yIHNvbWUgYXJyYXkgZGVjbGFyYXRpb25zIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTM4Ij4xODEzODwvYT4KLVJlc29sdmluZyBmYWlsdXJlIGluIHZhcmlhYmxlIGRlY2xhcmF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTM1Ij4xODEzNTwvYT4KLWltcG9ydGluZyBwbHVnaW5zIHJlc3VsdGVkIGluIDlNQiBvZiBlcnJvcnMgYWRkZWQgdG8gbG9nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxOTAiPjE4MTkwPC9hPgotYWRkIGEgbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QgZG9lcyBub3QgdXBkYXRlIHRoZSBuYW1lIGxvb2t1cCBvZiBkZXBlbmRlbnQgcHJvamVjdHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0MSI+MTU0NDE8L2E+Ci1JbXBvcnRhbnQ6IFByb2JsZW0gaGlnaGxpZ2h0IGlzIG91dCBvZiBzeW5jIHdpdGggY29tcGlsZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY0OSI+MTI2NDk8L2E+Ci1NaXNzaW5nIGltcG9ydCBhZnRlciBtb3ZlICAKLSAgIAotPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNDIiPjE4MDQyPC9hPgotQVNUOiBSZXNvbHZpbmcgZmFpbGVzIHdpdGggc2VtaWNvbG9uIHdoaWxlIGxvb3AgYm9keSAKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTI5IC0gMjl0aCBNYXkgMjAwMiAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUxCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDc4Ij4xODA3ODwvYT4KLW1lbW9yeSBsZWFrIC0gZGVzdHJveSBhIFdvcmtpbmdDb3B5IHJlbW92ZSBhbmQgcmUtYWRkIGhpcyBidWZmZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE4NyI+MTYxODc8L2E+Ci1Qcm9ibGVtcyBvY2N1cmVkIGJ1aWxkaW5nIHNlbGV0ZWQgcmVzb3VyY2VzLiBNZW1iZXJUeXBlQmluZGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDI5Ij4xODAyOTwvYT4KLWRpc2Fzc2VtYmxlZCBjb2RlIHZpZXdlciBoYW5kbGVzIFxuIGluY29ycmVjdGx5IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTIyIj4xNzkyMjwvYT4KLUNsYXNzQ2FzdEV4Y2VwdGlvbiBvbiByZW5hbWUgdGVtcCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA1NCI+MTgwNTQ8L2E+Ci1KRFQvQ29yZSBpcyB1c2luZyB0aGUgcGxhdGZvcm0gZW5jb2RpbmcgaW5zdGVhZCBvZiB0aGUgZW5jb2Rpbmcgc2V0IGluIHRoZSBVSQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTIzIj4xNzkyMzwvYT4KLUNhbid0IGZpbmQgcmVmcyB0byBiaW5hcnkgZmllbGRzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgyMyI+MTE4MjM8L2E+Ci1ucGUgd2hlbiB0cnlpbmcgdG8gc2V0IHNvdXJjZSB0byBydC5qYXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYwOSI+MTc2MDk8L2E+Ci1kZWxldGluZyBhIHJlc291cmNlIHJlc3VsdHMgZG9lcyBub3QgY2hhbmdlIGxvY2FsIGhpc3RvcnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjEyMCI+MTYxMjA8L2E+Ci1TZWxlY3Rpb25QYXJzZXIgYnVpbGQgd3JvbmcgQVNUIGZvciBpbnN0YW5jZW9mIHN0YXRlbWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDY4Ij4xNDQ2ODwvYT4KLUYzIGRvZXNuJ3Qgd29yayBvbiBEZWZhdWx0RXhjZXB0aW9uSGFuZGxlcgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3MyI+MTQzNzM8L2E+Ci1OdW1iZXIgb2Ygc3BhY2VzIHJlcHJlc2VudGluZyBhIHRhYiBpcyBhbHdheSA0IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjkiPjYxNjk8L2E+Ci1DcmVhdGluZyB0aGUgdGFza3MgdmlldyBoYW5ncyB0aGUgVUkgdGhyZWFkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNzAiPjE4MDcwPC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gZHVyaW5nIGJ1aWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3MyI+OTE3MzwvYT4KLUV4Y2VwdGlvbiBhYm91dCBtaXNzaW5nIG9yZy5lY2xpcHNlLmNvcmUuYm9vdFwuY2xhc3NwYXRoIGZpbGU/Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDIiPjE1NjAyPC9hPgotT3V0T2ZNZW1vcnlFcnJvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzExIj4xNTMxMTwvYT4KLUltcG9ydGluZyBleHRlcm5hbCBwbHVnLWlucyBmcm9tIGZpbGUgc3lzdGVtIGZhaWxzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NTIiPjEzODUyPC9hPgotQ2Fubm90IGdlbmVyYXRlIEVKQiBpbmhlcml0YW5jZSBkZXBsb3llZCBjb2RlIHdpdGhvdXQgZGVidWcgaW5mbwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MDQ2Ij4xNzA0NjwvYT4KLUlubmVyIGNsYXNzIHJlZmVyZW5jZSB0byBPdXRlciBjbGFzcyBtZXRob2Qgbm90IHJlY29nbml6ZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk1MyI+MTc5NTM8L2E+Ci1OdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBjb2Nvb24yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MzAiPjE3OTMwPC9hPgotTW92aW5nIHNlY29uZGFyeSB0eXBlcyBpcyBmb29saW5nIHRoZSBqYXZhIGluY3JlbWVudGFsIGJ1aWxkZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzg3MyI+MTc4NzM8L2E+Ci1TeW5jaHJvbml6ZSBDb21wYXJpc29uIGRvZXMgcG9vciBqb2Igb24gLmNsYXNzcGF0aCBmaWxlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzM2Ij4xNjczNjwvYT4KLUNvbW1lbnQgYmVmb3JlIHBhY2thZ2Ugc3RhdGVtZW50IG5vdCBhc3NvY2lhdGVkIHdpdGggaXQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NTEiPjEyNTUxPC9hPgotU2VhcmNoIGZpbmRzIHNvbWUgYnV0IG5vdCBhbGwgbWV0aG9kIHJlZnMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjU0Ij4xNzI1NDwvYT4KLUNvdWxkIG5vdCBmaW5kIC5jbGFzc3BhdGguCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyNyAtIDI3dGggTWF5IDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1MAotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPkFkZGVkIEFQSSB0byByZXRyaWV2ZSBjYWNoZWQgZmxhZ3Mgb24gdHlwZSBoaWVyYXJjaGllcyAoc2VlIDxjb2RlPklUeXBlSGllcmFyY2h5I2dldENhY2hlZEZsYWdzKElUeXBlKTwvY29kZT4pLiBOb3RlIHRoYXQgdGhlc2UKLWZsYWdzIGNhbiBoZWxwIGFuc3dlcmluZyBib3RoIGlzQ2xhc3MvaXNJbnRlcmZhY2UgcXVlcmllcyBhcyB3ZWxsIChzZWUgPGNvZGU+RmxhZ3MuaXNJbnRlcmZhY2UoaW50KTwvY29kZT48L2xpPgotPGxpPkFkZGVkIEFQSSB0byB0cmlnZ2VyIGEgSmF2YSBtb2RlbCByZWZyZXNoIHdpdGggcmVzcGVjdCB0byBleHRlcm5hbCBKQVJzOiA8Y29kZT5JSmF2YU1vZGVsI3JlZnJlc2hFeHRlcm5hbEpBUnM8L2NvZGU+LiA8L2xpPgorPGxpPjxiPlNlbGVjdGl2aXR5IEFQSTwvYj4gLSBTb3VyY2UgZm9sZGVycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGZpbHRlcnMgYWxsb3dpbmcgdG8gZXhjbHVkZQorc3BlY2lmaWVkIHBvcnRpb25zIG9mIHRoZSByZXNvdXJjZSB0cmVlIHJvb3RlZCBhdCB0aGlzIHNvdXJjZSBlbnRyeSdzIHBhdGguIEV4Y2x1c2lvbiBwYXR0ZXJucyAKK2FyZSBleHByZXNzZWQgdXNpbmcgdGhlIEFudCBmaWxlIHBhdHRlcm4gc3ludGF4IChpLmUuICoqLCAqLCA/IHdpbGQtY2FyZHM7IHdoZXJlICoqIGNhbiBzdGFuZCBmb3IKK29uZSBvciBtYW55IGZvbGRlciBuYW1lcykuCisgICA8dWw+CisgICA8bGk+QWRkZWQgPGNvZGU+SmF2YUNvcmUubmV3U291cmNlRW50cnkoSVBhdGggcGF0aCwgPGI+SVBhdGhbXSBleGNsdXNpb25QYXR0ZXJuczwvYj4pPC9jb2RlPgorICAgPC9saT4KKyAgIDxsaT5BZGRlZCA8Y29kZT5JQ2xhc3NwYXRoRW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKTwvY29kZT4KKyAgIDwvbGk+CisgICA8L3VsPgorICAgRnVsbCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBieSAyLjEgbWlsZXN0b25lLTQuCis8L2xpPgorPGxpPjxiPk11bHRpcGxlIG91dHB1dCBmb2xkZXIgQVBJPC9iPiAtIFNvdXJjZSBmb2xkZXJzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBvdXRwdXQKK2xvY2F0aW9uLiBUaGUgcHJvamVjdCBvdXRwdXQgbG9jYXRpb24gaXMgbm93IGNvcnJlc3BvbmRpbmcgdG8gYSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbi4KKyAgIDx1bD4KKyAgIDxsaT5BZGRlZCA8Y29kZT5KYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShJUGF0aCBwYXRoLCBJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zLCA8Yj5JUGF0aCBzcGVjaWZpY091dHB1dExvY2F0aW9uPC9iPik8L2NvZGU+CisgICA8L2xpPgorICAgPGxpPkFkZGVkIDxjb2RlPklDbGFzc3BhdGhFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpPC9jb2RlPgorICAgPC9saT4KKyAgIDwvdWw+CisgICBGdWxsIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGJ5IDIuMSBtaWxlc3RvbmUtNC4KKzwvbGk+Cis8bGk+VGhlIEphdmEgYnVpbGRlciBub3cgaXRlcmF0ZXMgb3ZlciB0aGUgcmVzb3VyY2UgdHJlZSwgYWxsb3dpbmcgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgZm9ydGhjb21pbmcgCit3b3Jrc3BhY2Ugc3RydWN0dXJlIGVuaGFuY2VtZW50cyAoaW4gcGFydGljdWxhcjogbGlua2VkIGZvbGRlcnMpLiBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgSmF2YSBidWlsZGVyCit3aWxsIG9ubHkgY29uc2lkZXIgdGhlIHJlc291cmNlcyBvZmZpY2lhbGx5IHJlZmxlY3RlZCBpbiB0aGUgcmVzb3VyY2UgdHJlZSAoYXMgb3Bwb3NlZCB0byBleGlzdGluZyAKK3VuZGVybHlpbmcgZmlsZXMgbm90IHlldCByZWZsZWN0ZWQgd2hlbiB0aGUgcmVzb3VyY2UgdHJlZSBpcyBvdXQgb2Ygc3luYykuCitOb3RlIHRoYXQgdGhlIGJ1aWxkIHN0YXRlIGZvcm1hdCBoYXMgY2hhbmdlZCB0byByZWZsZWN0IHRoaXMgZXZvbHV0aW9uLCBhcyBhIGNvbnNlcXVlbmNlLCBpZiByZXVzaW5nIGFuIGV4aXN0aW5nCit3b3Jrc3BhY2UsIHRoZSBmaXJzdCBidWlsZCBhY3Rpb24gd2lsbCBoYXZlIHRvIGJlIGEgcmVidWlsZC1hbGwgcHJvamVjdHMsIHNpbmNlIGluY3JlbWVudGFsbHkgaXQgd2lsbAorbm90IGJlIGFibGUgdG8gcmUtcmVhZCBvbGQgYnVpbGQgc3RhdGVzIGFzc29jaWF0ZWQgd2l0aCBwcmVyZXF1aXNpdGUgcHJvamVjdHMgKGFuZCBhbiBpbmNyZW1lbnRhbCBidWlsZAorY2Fubm90IHRlbGwgdGhlIGJ1aWxkIG1hbmFnZXIgYSBmdWxsIHJlYnVpbGQgaXMgbmVjZXNzYXJ5KS4gCis8L2xpPgorPGxpPkFuIG9wdGlvbiBhbGxvd3MgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBKYXZhIGJ1aWxkZXIgc2hvdWxkIGNsZWFuIHRoZSBvdXRwdXQgZm9sZGVyKHMpLiBTaW5jZQorb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIG9uIGEgcGVyIHByb2plY3QgYmFzaXMsIGVhY2ggaW5kaXZpZHVhbCBwcm9qZWN0IGNhbiBiZSB0b2dnbGVkIGZvciBjbGVhbmluZwordGhlIG91dHB1dCBmb2xkZXIgb3Igbm90IChkZWZhdWx0IGlzIHRvIGNsZWFuKS4gQWxzbywgInNjcnViYmluZyIgb3V0cHV0IGZvbGRlciBnb3QgcmVuYW1lZCBpbnRvIAorImNsZWFuaW5nIiBvdXRwdXQgZm9sZGVyLiAKIDxwcmU+Ci0vKioKLSAqIFRyaWdnZXJzIGFuIHVwZGF0ZSBvZiB0aGUgSmF2YU1vZGVsIHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlZCBleHRlcm5hbCBKQVJzLgotICogVGhpcyBvcGVyYXRpb24gd2lsbCBpc3N1ZSBhIEphdmFNb2RlbCBkZWx0YSBkZXNjcmliaW5nIHRoZSBkaXNjb3ZlcmVkIGNoYW5nZXMsIGluIHRlcm0KLSAqIG9mIEphdmEgZWxlbWVudCBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGFkZGVkLCByZW1vdmVkIG9yIGNoYW5nZWQuCi0gKiAKLSAqIEBwYXJhbSBtb25pdG9yIC0gYSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpbiBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2l0dWF0aW9uOgotICogICAgLSBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBwcm9qZWN0IHJlc291cmNlcyAKLSAqIAotICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQotICogQHNpbmNlIDIuMAotICovCi12b2lkIHJlZnJlc2hFeHRlcm5hbEpBUnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworKiBCVUlMREVSIC8gQ2xlYW5pbmcgT3V0cHV0IEZvbGRlcihzKQorKiAgICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBKYXZhQnVpbGRlciBpcyBhbGxvd2VkIHRvIGNsZWFuIHRoZSBvdXRwdXQgZm9sZGVycworKiAgICB3aGVuIHBlcmZvcm1pbmcgZnVsbCBidWlsZCBvcGVyYXRpb25zLgorKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyIgorKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6IHsgImNsZWFuIiwgImlnbm9yZSIgfQorKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICJjbGVhbiIKIDwvcHJlPgotPGxpPkFkZGVkIGZsYWcgZm9yIG5vdGlmeWluZyBhIEpBUiBjb250ZW50IGNoYW5nZSBkdXJpbmcgSmF2YSBkZWx0YSBub3RpZmljYXRpb246IDxjb2RlPklKYXZhRWxlbWVudERlbHRhI0ZfQVJDSElWRV9DT05URU5UX0NIQU5HRUQ8L2NvZGU+PC9saT4KKzwvbGk+Cis8bGk+SW50ZWdyYXRlZCBwYXRjaCBmcm9tIEdlbmFkeSBCZXJpb3praW4gZm9yIGJ1ZyA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA5MiI+MjUwOTI8L2E+LgorVGhlIGNvbXBpbGVyIHdpbGwgbm93IG9wdGlvbmFsbHkgZGlhZ25vc2UgYXNzaWdubWVudHMgaGF2aW5nIG5vIGVmZmVjdCAoZS5nLiB4ID0geCkuCitBZGRlZCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBjb250cm9sIHRoaXMgYmVoYXZpb3IuCis8cHJlPgorKiBDT01QSUxFUiAvIFJlcG9ydGluZyBBc3NpZ25tZW50IHdpdGggbm8gZWZmZWN0CisqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIGFzc2lnbm1lbnQKKyogICAgaGFzIG5vIGVmZmVjdCAoZS5nICd4ID0geCcpLgorKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50IgorKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKyogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgorPC9wcmU+Cis8L2xpPgogPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA5NyI+MTcwOTc8L2E+Ci1TZWFyY2hpbmcgZm9yICIqIiBpbiBqYXZhIGdpdmVzIGEgY3J5cHRpYyBlcnJvciBtZXNzYWdlIGRpYWxvZy4gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTYyIj4xNTE2MjwvYT4KLUFzc2VydGlvbiBmYWlsdXJlIGR1cmluZyBzaHV0ZG93biAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxNDUiPjE3MTQ1PC9hPgotTlBFICB3aGlsZSBjb21waWxpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzgwNyI+MTc4MDc8L2E+Ci1JbmNyZW1lbnRhbCBidWlsZCBwcm9ibGVtcyBkZWxldGluZyBzZWNvbmRhcnkgdHlwZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU2NCI+MTc1NjQ8L2E+Ci1SZWdpc3RlciBqYXZhIGZpbGUgdHlwZXMgd2l0aCB0aGUgdGVhbSBwbHVnaW4KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyMiI+MTc0MjI8L2E+Ci1KRFQgQ29tcGlsZXIgQWRhcHRlciBhbmQgY29tcGF0aWJpbGl0eSB3aXRoIEFudCAxLjUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDEiPjE3MTAxPC9hPgotQXNzZXJ0aW9uIGZhaWx1cmUgZHVyaW5nIHNodXRkb3duICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzU2MiI+MTc1NjI8L2E+Ci1SYWNlIGNvbmRpdGlvbiBvbiBzdGFydHVwIGxlYWRzIHRvIDIgSmF2YU1vZGVsIGluc3RhbmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mzk1Ij4xNTM5NTwvYT4KLUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIG5ldyBKYXZhIHByb2plY3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Nzk3Ij4xNzc5NzwvYT4KLU51bGxQb2ludGVyRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MjciPjE3ODI3PC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gYXQgIENvbXBpbGF0aW9uUmVzdWx0LmNvbXB1dGVQcmlvcml0eQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzYxIj4xNjc2MTwvYT4KLU5QRSB3aGVuIGRvaW5nIFByb2plY3QgLT4gUmVidWlsZCBBbGwKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI5Ij4zMzI5PC9hPgotU3BlY2lmaWNhdGlvbiBmb3IgSUphdmFFbGVtZW50RGVsdGEgbmVlZGVkICgxR0hWVzVNKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTMiPjE2NzUzPC9hPgotRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxNTkiPjEyMTU5PC9hPgotQ29kZSBGb3JtYXQgaXMgZ2VuZXJhdGluZyBib2d1cyBvdXRwdXQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTEiPjE2NzUxPC9hPgotUmVuYW1pbmcgYSBjbGFzcyBkb2Vzbid0IHVwZGF0ZSBhbGwgcmVmZXJlbmNlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3ODkiPjE2Nzg5PC9hPgotSW5jb21wbGV0ZSBwcm9qZWN0IGVsZW1lbnQgaWYgLmNsYXNzcGF0aCBmaWxlIGlzbid0IHJlYWRhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNzkiPjE2Mjc5PC9hPgotY29tcGlsZXIgY3JlYXRlcyBjb2RlIHRoYXQgY2F1c2VzIHZlcmlmaWVyIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTMiPjE0MTEzPC9hPgotU2hvdWxkIGxpc3RlbiB0byBGX1NPVVJDRUFUVEFDSEVEIGFuZCBGX1NPVVJDRURFVEFDSEVEIGphdmEgZGVsdGFzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI1MCI+MTUyNTA8L2E+Ci1OZWVkIGEgYmV0dGVyIG1hcHBpbmcgZm9yIHRoZSBtZXRob2QgZnJlZSByZXR1cm4gb3Bjb2RlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDkxIj4xNjA5MTwvYT4KLU5lZWQgd2F5IHRvIHJlZnJlc2ggSkFSIGZpbGVzCi0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MzU0Ij4xNjM1NDwvYT4KLUNvZGUgQXNzaXN0IGhhcyB0b28gbWFueSBpdGVtcyBhZnRlciB0aHJvd3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg2MyI+MTY4NjM8L2E+Ci10eXBlIGhpZXJhcmNoeSBtaXNzZXMgdHlwZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODkyIj4xNDg5MjwvYT4KLUZhaWxlZCBwYWNrYWdlIGltcG9ydCBsZWFkcyB0byBPdXRPZk1lbW9yeSBlcnJvcnMgYXQgY29tcGlsZSB0aW1lICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE5NyI+MTcxOTc8L2E+Ci1GMSAtICJBZGQgSmFycyIgdG8gYnVpbGQgcGF0aCBsb2NrcyB1cCBlY2xpcHNlIC0gd2luMmsKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTIxMSI+MTUyMTE8L2E+Ci1OUEUgd2hpbGUgc2VhcmNoaW5nIGZvciBhIGZpZWxkICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQ5NCI+MTY0OTQ8L2E+Ci1uZXdTdXBlclR5cGVIaWVyYXJjaHkgb24gYmluYXJ5IHR5cGUgcmV0dXJucyBlbXB0eSBoaWVyYXJjaHkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTI3Ij4xNzEyNzwvYT4KLUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBTaW1wbGVOYW1lLnNldElkZW50aWZpZXIoU2ltcGxlTmFtZS5qYXZhOjEzNikgaW4gTTUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NTciPjE2ODU3PC9hPgotRW1wdHkgZm9sZGVyIGNyZWF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMDkiPjE2MjA5PC9hPgotU3VwcG9ydCBkZWNsYXJlZCBwYWNrYWdlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBkaXJlY3RvcnkgbG9jYXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDY4Ij42MDY4PC9hPgotV2Fsa2JhY2sgZHVyaW5nIHBsdWdpbiBpbXBvcnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjk4NSI+MTI5ODU8L2E+Ci1VbmV4cGVjdGVkIGZ1bGwgYnVpbGQgaW4gaW5jcmVtZW50YWwgbW9kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDIyIj4xMTAyMjwvYT4KLVVuZXhwZWN0ZWQgZnVsbCBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NDM2Ij4xNjQzNjwvYT4KLUNvcmVFeGNlcHRpb24gaW1wb3J0aW5nIG9yZy5lY2xpcHNlLnVpLndpbjMyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1MjAiPjEyNTIwPC9hPgotSkRUQ29tcGlsZXJBZGFwdGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgLWV4dGRpcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA0NyI+MTAwNDc8L2E+Ci1KRFRDb21waWxlckFkYXB0ZXIgIGlnbm9yZXMgLW5vd2FybiBhbmQgZGVwcmVjYXRpb24gb2ZmLgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MjEgLSAyMXN0IE1heSAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDkgLSBNSUxFU1RPTkUgNiAvIEZSRUVaRSAxCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+Jy5jbGFzc3BhdGgnIGZpbGUgaXMgbm93IHdyaXR0ZW4gdXNpbmcgcGxhdGZvcm0gbGluZSBkZWxpbWl0ZXJzICh1c2VkIHRvIGJlIG9ubHkgdXNpbmcgTEZzKS4gSXQgaXMgcmVjb21tYW5kZWQgdG8gY29udmVydCBpdCB0byAndGV4dCcgZm9ybWF0Ci1zbyBhcyB0byBhdm9pZCBzdXJmYWNpbmcgZGVsaW1pdGVyIGRpZmZlcmVuY2VzIGluIGJldHdlZW4gaW5jb21wYXRpYmxlIHBsYXRmb3Jtcy4gPC9saT4KLTxsaT5UaGUgc2V0dGluZyBhbGxvd2luZyBmb3IgZmlsdGVyaW5nIHJlc291cmNlIGNvcHkgbm93IGFsc28gc3VwcG9ydHMgZm9sZGVyIGZpbHRlcmluZy4gRm9sZGVyIG5hbWVzIGFyZQotcmVjb2duaXplZCBieSB0aGVpciAnLycgc3VmZml4LCBlLmcuICJNRVRBLUlORi8iIHNwZWNpZmllcyBmaWx0ZXJpbmcgb3V0IGFsbCBmb2xkZXIgbmFtZWQgJ01FVEEtSU5GJyAoYW5kIHRoZWlyIGNvbnRlbnRzKTwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDQiPjMyNDQ8L2E+Ci1DbGFzc3BhdGggaXMgbm90IHNhdmVkIHVzaW5nIFVURjggKDFHQ1Y0NjcpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NzgiPjEzODc4PC9hPgotUmVxdWVzdCB0byBzdXBwb3J0IGZvbGRlcnMgZm9yIHJlc291cmNlIGNvcHkgZmlsdGVycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTM1Ij4xNjEzNTwvYT4KLVVuZXhwZWN0ZWQgZXJyb3JzIHdoaWxlIHJlY29uY2lsaW5nCi0KLTxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE4IC0gMTh0aCBNYXkgMjAwMiAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ4Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+PGxpPkFkZGVkIDxjb2RlPlRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoSUNsYXNzRmlsZSBjbGFzc2ZpbGUsIGludCBkZWNvZGluZ0ZsYWcpPC9jb2RlPiBhcyBhbiBoZWxwZXIgbWV0aG9kIHRvCi0JY3JlYXRlIGEgY2xhc3NmaWxlIHJlYWRlciBmb3IgY2xhc3NmaWxlIGVsZW1lbnRzLjwvbGk+Ci08L3VsPgotCi08aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTMwIj4xNjEzMDwvYT4KLWJ1aWxkIHhlcmNlcy9wbHVnaW4ucHJvcGVydGllcyBzbG93Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzUiPjE2MTc1PC9hPgotTlBFIGluIEluZGV4TWFuYWdlciNjaGVja0luZGV4Q29uc2lzdGVuY3kgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTYzIj4xNTU2MzwvYT4KLUNvbXBsZXRpb25FbmdpbmUgZG9lcyBub3QgcmVwb3J0IHR5cGUgcGFja2FnZXMgb2YgbG9jYWwgdmFyaWFibGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNzQiPjEyMzc0PC9hPgotTlBFIGluIFJlc3VsdENvbGxlY3RvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTc3Ij4xNTk3NzwvYT4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDUzIj4yNjA1MzwvYT4KK2J1aWxkZXIgb3V0IG9mIG9yZGVyIGluIEktMjAwMjExMTIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg1OSI+MjU4NTk8L2E+CitFcnJvciBkb2luZyBKYXZhIFNlYXJjaCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA5MiI+MjUwOTI8L2E+ICAKK0RldGVjdC9XYXJuIG9uIHBvc3NpYmxlIHVzZXIgdHlwb3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg5NCI+MjU4OTQ8L2E+ICAKK01lbW9yeSBsZWFrIC0gR2xvYmFsIFRoaXNSZWZlcmVuY2UgaXMgbGVha2luZyBiaW5kaW5ncworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODg1Ij4yNTg4NTwvYT4gIAorQ29kZSBBc3Npc3QgLSBleGFjdCBleHBlY3RlZCB0eXBlIHNob3VsZCBiZSBtb3JlIHJlbGV2YW50IHRoYW4gc3VidHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTg0Ij4yNTE4NDwvYT4gIAorT3BlcmF0aW9ucyBvbiBjdSBvdXRzaWRlIGNsYXNzcGF0aCBzaG91bGQgZmFpbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg3NiI+MjU4NzY8L2E+ICAKK0NvZGUgQXNzaXN0IC0gdm9pZCBtZXRob2QgYXJlIHByb3Bvc2VkIGluIGFzc2lnbm1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU4NiI+MjM1ODY8L2E+ICAKK0NyZWF0aW5nIGEgbmV3IHByb2plY3QgZGVsZXRlcyBmaWxlcyBpbiB0aGUgcGFyZW50IGZvbGRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgxNSI+MjU4MTU8L2E+CitDb2RlIEFzc2lzdCBkb2VzIG5vdCBwcm9wb3NlIG1lbWJlciB0eXBlLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODIwIj4yNTgyMDwvYT4KIE5QRSBpbiBDb2RlIEFzc2lzdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDM3Ij4xNDAzNzwvYT4KLUludGVybmFsIEVycm9yIGRvaW5nIGphdmEgc2VhcmNoIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTI2Ij4xNjEyNjwvYT4KLUFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcgY29tcGlsYXRpb24gCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzIiPjE2MTMyPC9hPgotRXJyb3Igb24gRXh0cmFjdCBNZXRob2QgUmVmYWN0b3JpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNTIiPjE2MDUyPC9hPgotTlBFIHdoZW4gc2VhcmNoIHJlZmVyZW5jZSBvZiBhIGNvbnN0cnVjdG9yICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk0NSI+MTU5NDU8L2E+Ci1DcmVhdGluZyBuZXcgY2xhc3MgY2F1c2VzIG1vc3QgcHJvamVjdHMgdG8gYmUgcmVjb21waWxlZAotCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4MTEiPjI1ODExPC9hPgorQ29kZSBBc3Npc3QgZm9yIHZhcmlhYmxlIG5hbWUgc3VnZ2VzdGlvbiBpcyBub3QgcGVyZmVjdC4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDAxMCI+MjQwMTA8L2E+CitJVHlwZTo6cmVzb2x2ZVR5cGUgcmV0dXJucyBudWxsIGZvciBpbm5lciB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzM1Ij4yNTczNTwvYT4KK05vbi1OTFMgc3RyaW5ncyBhcmUgbm90IHJlcG9ydGVkIHByb3Blcmx5IHdoZW4gdGhlIGVuZGluZyB0YWcgaXMgbWlzc2luZworICAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNDQiPjkyNDQ8L2E+Ci1TZWFyY2ggR2VuZXJhdGVzIE91dE9mTWVtb3J5RXJyb3IgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDIzIj4xNTQyMzwvYT4KLUpSRV9MSUIgc291cmNlIGF0dGFjaG1lbnQgdmlhIHByb3BlcnRpZXMgZG9lcyBub3Qgd29yawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTMxIj4xNTkzMTwvYT4KLVByb3Bvc2VkIHJlc3VsdHMgdG8gbGltaXRlZC9pbnZhbGlkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzEiPjE2MTMxPC9hPgotSmF2YSBzZWFyY2ggZmFpbHMgdG8gZmluZCBhbGwgcmVmZXJlbmNlcyB0byBzdGF0aWMgZmluYWwgTUJfQURESVRJT05TCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxOTIiPjE1MTkyPC9hPgotUGFja2FnZUZyYWdtZW50Ojpjb3B5IG5ldmVyIG92ZXJ3cml0ZXMKLQotPGgxPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI1MDkiPjIyNTA5PC9hPiAgCitVbmFibGUgdG8gc3RhcnQgc29tZSBKYXZhIGFwcGxpY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4NjQiPjIxODY0PC9hPiAgCitBc3NvY2lhdGUgcGFja2FnZSBoaWVyYXJjaHkgd2l0aCB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTU3Ij4xMjk1NzwvYT4gIAorQ29waWVkIHJlc291cmNlcyBvdXQgb2Ygc3luY2gKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDI3NiI+MjQyNzY8L2E+ICAKK2phdmFkb2MgLSBJbXBvcnRzIG1hcmtlZCBhcyB1bnVzZWQgd2hlbiB0aGV5IGFyZSByZWFsbHkgbmVjZXNzYXJ5LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzIwIj4xODMyMDwvYT4gIAorQ29tcGlsZXIgV2FybmluZy9FcnJvci9JZ25vcmUgd2hlbiBBc3NpZ25pbmcgdG8gYSBQYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTk5NCI+MjU5OTQ8L2E+ICAKK01hcmtlciBmb3IgInN0YXRpYyBtZXRob2Qgc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheSIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTk5NSI+MjU5OTU8L2E+ICAKK01hcmtlciBmb3IgInN0YXRpYyBtZXRob2Qgc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheSIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU4MiI+MjU1ODI8L2E+ICAKK0Nhbm5vdCBzcGVjaWZ5IGphdmEgc291cmNlIHBhdGggZm9yIHJlc291cmNlICEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY2NSI+MjU2NjU8L2E+ICAKK0FTVCBhZGRzIGltcGxpY2l0IHN1cGVyIGNhbGwgKFBSIDIyMzA2IG5lZWRlZCBvbiAyLjAuMiBzdHJlYW0pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUzMDQiPjI1MzA0PC9hPiAgCitDb2RlIGFzc2lzdCBhbmQgcGFyYW1ldGVyIGFzc2lzdGFuY2UuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3ODMiPjI0NzgzPC9hPiAgCittZXRob2QgcGFyYW1ldGVyIG5hbWUgY29kZSBjb21wbGV0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODcyIj4yNTg3MjwvYT4gIAorRWNsaXBzZSBjb25zaWRlcnMgdGhlIFVuaWNvZGUgY2hhciAnXHUwMDBBJyBhbiBpbnZhbGlkIGNoYXJhY3RlciBjb25zdGFudC4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1NSI+MjUyNTU8L2E+ICAKK0lDb21waWxhdGlvblVuaXQ6OmdldFVuZGVybHlpbmdSZXNvdXJjZSB0aHJvd3MgYW4gZXhjZXB0aW9uIAorICAgCis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE1IC0gMTV0aCBNYXkgMjAwMiAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ3CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSA1dGggTm92ZW1iZXIgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yODEKIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLSAgICA8bGk+IE5ldyBjb21waWxlciBvcHRpb24gYWRkZWQgdG8gY29udHJvbCBtYXggbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGEgdW5pdC4gRGVmYXVsdCBpcyAxMDAuIFNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPiA8L2xpPgotICAgIDxwcmU+Ci0JICogQ09NUElMRVIgLyBNYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBwZXIgY29tcGlsYXRpb24gdW5pdAotCSAqICAgIFNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGVhY2ggY29tcGlsYXRpb24gdW5pdC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJIjxuPiIgd2hlcmUgPG4+IGlzIHplcm8gb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIChpZiB6ZXJvIHRoZW4gYWxsIHByb2JsZW1zIGFyZSByZXBvcnRlZCkuCi0JICogICAgIC0gZGVmYXVsdDoJCQkiMTAwIgotICAgIDwvcHJlPgotICAgIDxsaT5CeSBkZWZhdWx0LCB0aGUgSmF2YSBidWlsZGVyIGlzIG5vdyBhYm9ydGluZyBidWlsZCBwcm9jZXNzIG9uIHByb2plY3RzIHdpdGggY2xhc3NwYXRoIHByb2JsZW1zLiBUaGlzIG9wdGlvbiBjYW4gYmUgZGlzYWJsZWQgdGhyb3VnaCB0aGUgSmF2YSBwcmVmZXJlbmNlczoKLSAgICBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtCdWlsZGVyJmd0OzwvbGk+Cis8bGk+Q29kZSBjb21wbGV0aW9uIGVuaGFuY2VtZW50OgorICAgPHVsPgorICAgPGxpPlJlbGV2YW5jZSBvZiBhIHByb3Bvc2FsIGlzIGhpZ2hlciBpZiB0aGUgcHJvcG9zYWwgaXMgaW4gYSB2YXJpYWJsZSBpbml0aWFsaXplciBhbmQgaXRzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSB2YXJpYWJsZSB0eXBlLgorICAgPGJyPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSA8Y29kZT52YXIyPC9jb2RlPiBpcyBtb3JlIHJlbGV2YW50IHRoYW4gPGNvZGU+dmFyMTwvY29kZT4uPHByZT4KKyAgIHB1YmxpYyBjbGFzcyBYIHsKKyAgICAgIE9iamVjdCB2YXIxOworICAgICAgaW50IHZhcjI7CisgICAgICB2b2lkIGZvbygpIHsKKyAgICAgICAgIGludCBpID0gdmFyJmx0O2N1cnNvciZndDsKKyAgICAgIH0KKyAgIH08L3ByZT4KKyAgIDwvbGk+CisgICA8bGk+UmVsZXZhbmNlIG9mIGEgcHJvcG9zYWwgaXMgaGlnaGVyIGlmIHRoZSBwcm9wb3NhbCBpcyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgYW5kIGl0cyB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgbGVmdCBoYW5kIHNpZGUgdHlwZS4KKyAgIDxicj5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgPGNvZGU+dmFyMjwvY29kZT4gaXMgbW9yZSByZWxldmFudCB0aGFuIDxjb2RlPnZhcjE8L2NvZGU+LjxwcmU+CisgICBwdWJsaWMgY2xhc3MgWCB7CisgICAgICBPYmplY3QgdmFyMTsKKyAgICAgIGludCB2YXIyOworICAgICAgdm9pZCBmb28oKSB7CisgICAgICAgICBpbnQgaTsKKyAgICAgICAgIGkgPSB2YXImbHQ7Y3Vyc29yJmd0OworICAgICAgfQorICAgfTwvcHJlPgorICAgPC9saT4KKyAgIDwvdWw+Cis8L2xpPgogPC91bD4KIAogPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjA1MSI+MTYwNTE8L2E+Ci1ET00vQVNUOiB3cm9uZyBwb3NpdGlvbiBpbiBpZiBzdGF0ZW1lbnQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3ODgiPjE1Nzg4PC9hPgotV2Fsa2JhY2tzIGF0IHN0YXJ0dXAgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDIxIj4xNjAyMTwvYT4KLUluZmluaXRlIGxvb3AgaW4gSmF2YUNvcmUuaXNSZWZlcmVuY2VkQnkoLi4uKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDY3Ij4xNDQ2NzwvYT4KLU91dGxpbmVyIGRvZXNuJ3QgaGlnaGxpZ2h0IG1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDE3Ij4xNjAxNzwvYT4KLUphdmFCdWlsZGVyIHJlcG9ydHMgIGJ1aWxkIGZhaWx1cmVzIG9uIGRlcGVuZGVuY2llcyBvbnRvIGludGVybmFsIEpBUnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU2OCI+MTU1Njg8L2E+Ci1XYXRjaHBvaW50cywgbWV0aG9kIGJyZWFrcG9pbnRzIGluIGludGVyZXN0aW5nIGxvY2F0aW9ucyBub3Qgc2hvd2luZyBpbiBlZGl0b3IgcnVsZXIKLQorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2MjYiPjI0NjI2PC9hPgorY29kZVNlbGVjdCAtIGRvZXMgbm90IHdvcmsgaW4gY2F0Y2ggY2xhdXNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2ODgiPjI1Njg4PC9hPgorTm9uIE5MUyBzdHJpbmdzIGltcHJvcGVybHkgcmVwb3J0ZWQgd2hlbiB0aGUgbGluZSBzZXBhcmF0b3IgaXMgXHIgb25seQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1Njg3Ij4yNTY4NzwvYT4KK2NvZGVTZWxlY3QgLSBmYWlscyB3aXRoIGlubmVyIGNsYXNzIGFzIG1ldGhvZCBwYXJhbWV0ZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTYwNSI+MjU2MDU8L2E+CitbQVBJXSBzb21lSmF2YVByb2plY3QuZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKTsgQVBJIHNob3VsZCBzcGVjaWZ5IHRoYXQgdGhlIGFycmF5IGlzIHJldHVybmVkIGluIENsYXNzUGF0aCBvcmRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTM1OCI+MjUzNTg8L2E+CitDcmVhdGluZyBhIG5ldyBKYXZhIGNsYXNzIC0gQnJvd3NlIGZvciBwYXJlbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0OTUiPjI1NDk1PC9hPgorQW50IGNvbXBpbGVyIGFkYXB0ZXIgc2hvdWxkIHRyZWF0IGJvZ3VzIGltcG9ydHMgYXMgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5NTciPjIxOTU3PC9hPiAgCisncmVmYWN0b3IgcmVuYW1lJyBhbGxvd3Mgc3VicGFja2FnZSBuYW1lIHRvIHN0YXJ0IHdpdGggYSBzcGFjZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU5MSI+MjU1OTE8L2E+ICAKK0NsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBDb21wbGV0aW9uRW5naW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MzkiPjI1NTM5PC9hPiAgCitVbmV4cGVjdGVkIGluYWNjdXJhdGUgc2VhcmNoIHJlc3VsdHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1NzgiPjI1NTc4PC9hPgorQWJzdHJhY3QgbWV0aG9kIGRlY2xhcmF0aW9uIGNvbXBsZXRpb24gc2hvdWxkIGJlIG1vcmUgcmVsZXZhbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIyMSI+MjUyMjE8L2E+CitDb2RlIGFzc2lzdCBhZnRlciBuZXcga2V5d29yZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MzQ3Ij4yNTM0NzwvYT4KK0RlcHJlY2F0aW9uLUZsYWcgaW4gQW50IGRvZXNuJ3Qgd29yayB3aXRoIEVjbGlwc2UgQ29tcGlsZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTU1MSI+MjU1NTE8L2E+CitBbnQgamF2YWMgYWRhcHRlciBhbHdheXMgcmVwb3J0cyBidWlsZCBzdWNjZXNzZnVsIGV2ZW4gaWYgdGhlcmUgYXJlIGNvbXBpbGVyIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0OTM5Ij4yNDkzOTwvYT4gIAorQ29kZSBBc3Npc3QgZG9lc24ndCBmaW5kIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBmb3IgYW5vbnltb3VzIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzcxNyI+MzcxNzwvYT4gIAorU21va2UgMTE0OiBQcm9ncmVzcyByZXBvcnRpbmcgd2hlbiBzd2l0Y2hpbmcgdG8gZGlmZmVyZW50IGRlZmF1bHQgVk0gKDFHRUhYTVYpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTY1Ij4yNDU2NTwvYT4KK0NvZGVBc3Npc3QgcHJvcG9zaW5nIHR3aWNlIHRoZSBzYW1lIG1ldGhvZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTIwIj4yNTUyMDwvYT4KK1Bvc3NpYmxlIHByb2JsZW0gaW4gSmF2YVByb2plY3QjZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKElDbGFzc3BhdGhFbnRyeSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUxOCI+MjQ1MTg8L2E+CitQdWJsaWMgZmxhZyBub3Qgc2V0IGZvciBpbnRlcmZhY2UgbWV0aG9kIAorICAgICAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODAxIj4xNjgwMTwvYT4KLUNvbXBpbGVyIHByb2JsZW0gd2hlbiAqLyBhcHBlYXJzIGluIGNvbW1lbnRlZCBTdHJpbmcuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NTUiPjEyOTU1PC9hPgotUHJvYmxlbSB3aXRoIFR5cGUgRGlhbG9nIGFuZCBIaWVyYXJjaHlTY29wZXMgLSBidWlsZCAyMDAyMDIxNCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMTYiPjE2MDE2PC9hPgotT3BlbmluZyBhIHByb2plY3QgYWZ0ZXIgc3RhcnRpbmcgRWNsaXBzZSBtaXNzZXMgcHJvamVjdCBpbmRleGVzIChvciBvdGhlciBpbnRlcm5hbCBzdHVmZikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE5MCI+MTUxOTA8L2E+Ci1KYXZhIEJ1aWxkIGVycm9ycyBhZnRlciBzYXZlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMDgiPjE2MDA4PC9hPgotSGFuZyBkdXJpbmcgc2h1dGRvd24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM5MiI+MTIzOTI8L2E+Ci1Qcm9ibGVtcyB0byBhZGQgUHJvamVjdCBmcm9tIHJlcG9zaXRvcnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTEwMyI+MTUxMDM8L2E+Ci1TZWFyY2ggcmVzdWx0cyBhcmUgbWlzc2luZyBxdWFsaWZpY2F0aW9uCi0KLTxoMT4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjEyIj4xODIxMjwvYT4gIAorSmF2YSBCdWlsZCBQYXRocyBubyB1cGRhdGVkIGNvcnJlY3RseSB3aGVuIGNoZWNraW5nIG91dCBtdWx0aXBsZSBwcm9qZWN0cyAKKyAgIAorPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUxNCAtIDE0dGggTWF5IDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0NgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMjl0aCBPY3RvYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjgwCiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci0gICAgPGxpPkphdmEgY29tcGlsZXIgbmV2ZXIgcmVjb3JkIG1vcmUgdGhhbiAxMDAgbWFya2VycyBmb3IgY29tcGlsYXRpb24gcHJvYmxlbXMuIEFsbCBBUElzIHVzaW5nIElQcm9ibGVtUmVxdWVzdG9yIHN0aWxsCi0gICAgCXNlZSB0aGVtIGFsbC4gVGhpcyBjaGFuZ2UgaXMgaW50ZW5kZWQgdG8gcHJldmVudCB0aGUgdGFzayBsaXN0IGZyb20gYmVpbmcgb3ZlcmhlbG1lZCB3aXRoIHRvbnMgb2Ygc2Vjb25kYXJ5IHByb2JsZW1zLiA8L2xpPgotCTxsaT5BZGRlZCBBUElzIHRoYXQgYWxsb3cgdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgd2l0aCBhIHNldCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VuZGVuY2UKLQkgICAgICBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQ6Ci0JICAgICAgPHVsPgotCSAgICAgIAk8bGk+PGNvZGU+SVR5cGUubmV3U3VwZXJUeXBlSGllcmFyY2h5KElXb3JraW5nQ29weVtdLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgotCSAgICAgIAk8bGk+PGNvZGU+SVR5cGUubmV3VHlwZUhpZXJhcmNoeShJV29ya2luZ0NvcHlbXSwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KLQkgICAgICA8L3VsPgotCSAgICAgIE5vdGUgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCByZWZyZXNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlc2UgaGllcmFyY2hpZXMuCi0JPC9saT4KKzxsaT5JbiAxLjQgY29tcGxpYW50IG1vZGUsIHRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBlcnJvcnMgZm9yIHVudGVybWluYXRlZCBsaW5lIGNvbW1lbnRzIChpLmUuIG5vdCBjbG9zZWQgd2l0aCBhIGxpbmUgYnJlYWspLiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb24sCit0aGUgc3RyaWN0ZXIgY2hlY2sgaXNuJ3QgcGVyZm9ybWVkIGluIDEuMyBjb21wbGlhbnQgbW9kZS4gU2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDk2Ij4yMzA5NjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlscy4KK0Fsc28gbm90ZSB0aGF0IGZyb20gbm93IG9uLCB0aGUgdHJhaWxpbmcgbGluZSBicmVhayBpcyBwYXJ0IG9mIHRoZSBsaW5lIGNvbW1lbnQgc291cmNlIHJhbmdlLgorPC9saT4KKzxsaT5UaGUgQVBJIHNldExlYWRpbmdDb21tZW50KFN0cmluZykgb24gb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0YXRlbWVudCBjbGFzcyBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgbWFkZSBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwOTYiPjIzMDk2PC9hPi4KK1RoaXMgQVBJIHN0cmljdGx5IGZpdHMgdG8gdGhlIEpMUy4gSXQgZG9lc24ndCB1c2UgdGhlIGNvbXBsaWFuY2UgbW9kZSBzZXR0aW5ncy4gU28gYSBsaW5lIGNvbW1lbnQgbmVlZHMgdG8gYmUgY2xvc2VkIHdpdGggYSBsaW5lIGJyZWFrIGluCitvcmRlciB0byBiZSB2YWxpZC4KK1NlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIwNiI+MjUyMDY8L2E+IGZvciBmdXJ0aGVyIGRldGFpbHMuPC9saT4KIDwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNTEiPjE0MDUxPC9hPgotVGhlIGltcGxlbWVudGF0aW9uIGZvciBJVHlwZS5yZXNvbHZlVHlwZShTdHJpbmcpIGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBub3RlZCBpbiB0aGUgSmF2YURvYyBzcGVjcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzIyIj4xNTMyMjwvYT4KLW5lZWQgYSB3YXkgdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgdGhhdCBjb25zaWRlcnMgd29ya2luZyBjb3BpZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTQyIj4xNTE0MjwvYT4KLUNDRSBpbiBTb3VyY2VDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzQ5Ij4xNTM0OTwvYT4KLUphdmFNb2RlbEV4Y2VwdGlvbiBvdXQgb2YgQ29udGVudCBhc3Npc3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njc3Ij4xNTY3NzwvYT4KLUV4Y2VwdGlvbiBjYWxsaW5nIHNvdXJjZVR5cGUuZ2V0RmllbGRzIG9uIHdvcmtpbmcgY29weSBvZiBuZXcgY2xhc3MgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjU3Ij4xNTY1NzwvYT4KLUlET01NZXRob2QuZ2V0UmV0dXJuVHlwZSByZXR1cm5zIG51bGwgZm9yIGFsbCBtZXRob2RzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODA0Ij4xNTgwNDwvYT4KLURPTS9BU1Q6IHdyb25nIExlbmd0aCBpbiBjYXNjYWRpbmcgaWYvdGhlbi9lbHNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDAwIj4xNTQwMDwvYT4KLUNvbXBpbGVyIGdlbmVyYXRlcyB3YXkgdG9vIG1hbnkgZXJyb3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTciPjE1ODU3PC9hPgotRGVhZGxvY2sgaW4gdGhlIGluZGV4ZXIuc2h1dGRvd24oKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzU2Ij4xNTc1NjwvYT4KLU9yZ2FuaXppbmcgaW1wb3J0cyBkb2Vzbid0IHBpY2sgdXAgdGhlIHJpZ2h0IHR5cGUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MzAiPjE1NDMwPC9hPgotaGFuZyB1cCBlY2xpcHNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NjUiPjE0OTY1PC9hPgotU2VhcmNoIHJlc3VsdHMgaW4gLmNsYXNzIGZpbGVzIGRvbid0IHNlbGVjdCByZWZlcmVuY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY5MCI+MTU2OTA8L2E+Ci1DbGFzc3BhdGggYmVpbmcgc2V0IGluIHdyb25nIG5vdGlmaWNhdGlvbiBsaWZlY3ljbGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTgxMCI+MTU4MTA8L2E+Ci1DbGFzc3BhdGhDb250YWluZXIgcXVlc3Rpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxNyI+MTU3MTc8L2E+Ci1JIGNhbnQgaG9sZCBKREsgQ29tcGlsZXIgQ29tcGxpYW5jZSBsZXZlbCBzZXR0aW5nLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ4Ij4xNTQ0ODwvYT4KLWkga2VlcCBsb29zaW5nIHByZWZlcmVuY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTMiPjE1MTEzPC9hPgotZXh0cmFjdCBtZXRob2Q6IGFzc2VydGlvbiBmYWlsdXJlIAotCis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjM1OCI+MjIzNTg8L2E+CitbYXBpXSBXb3VsZCBsaWtlIENoYXJPcGVyYXRpb24gbWFkZSBBUEkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzIwNyI+MjMyMDc8L2E+ICAKK0ZsYWdzLmlzRGVwcmVjYXRlZChJTWV0aG9kLmdldEZsYWdzKCkpIGRvZXNuJ3Qgd29yayAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk4NCI+MjM5ODQ8L2E+Cit2YWxpZGF0ZUVkaXQgbm90IGNhbGxlZCB3aGVuIGNoYW5naW5nIC5jbGFzc3BhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTQzOSI+MjU0Mzk8L2E+Cit0b1N0cmluZygpIG9uIElCaW5kaW5nIHN1YmNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTM0NyI+MjUzNDc8L2E+CitEZXByZWNhdGlvbi1GbGFnIGluIEFudCBkb2Vzbid0IHdvcmsgd2l0aCBFY2xpcHNlIENvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUzOTYiPjI1Mzk2PC9hPgorTlBFIGltcG9ydGluZyBleHRlcm5hbCBwbHVnLWlucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NDMzIj4yNTQzMzwvYT4KKyNmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1Mzc3Ij4yNTM3NzwvYT4KK0Vycm9yIGxvY2F0aW9uIGlzIG5vdCBjb3JyZWN0IGZvciBlbXB0eSBhcnJheSBpbml0aWFsaXplcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTc0Ij4yNTE3NDwvYT4KK1dyb25nIGNvZGUgZ2VuZXJhdGlvbiBvZiB0aGUgZWNsaXBzZSBqYXZhIGNvbXBpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyOTgiPjI1Mjk4PC9hPgorT25lIG91dCBvZiB0d28gbm9uLWV4dGVybmFsaXplZCBzdHJpbmdzIHJlcG9ydGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxODgiPjI1MTg4PC9hPgorRGVidWdnZXIgd29uJ3Qgc3RvcCBvbiBtZXRob2QgZmlyc3Qgc3RhdGVtZW50IGJyZWFrcG9pbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIzMyI+MjUyMzM8L2E+CitOUEUgaW4gQ29tcGxldGlvblBhcnNlci5idWlsZE1vcmVDb21wbGV0aW9uQ29udGV4dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjA2Ij4yNTIwNjwvYT4KK0RPTS9BU1Q6IFN0YXRlbWVudC5zZXRMZWFkaW5nQ29tbWVudCBzcGVjaWZpY2F0aW9uIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBKTFMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIyOSI+MjUyMjk8L2E+CitDb21waWxlciBzaG91bGQgbm90IHJlamVjdCBpbm5lcmNsYXNzIHNjZW5hcmlvCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxODMiPjI1MTgzPC9hPgorQVNUOiBJVHlwZUJpbmRpbmcgb2YgaW50ZXJmYWNlIHJldHVybnMgY29uc3RydWN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMyI+MjQ4MzM8L2E+CitUT0RPOiBub3QgZGV0ZWN0ZWQgaWYgdGhlcmUgaXMgb25seSBhIGNvbW1lbnQgaW4gLmphdmEgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzQ0Ij4yNDc0NDwvYT4KK1RPRE86IFRhc2sgbm90IGZvdW5kIGlmIGNvbW1lbnQgYWZ0ZXIgbGFzdCBjbG9zaW5nIGJyYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwOTYiPjIzMDk2PC9hPgorQ29tcGlsZXIgZG9lcyBub3QgcmVwb3J0IGVuZCBvZiBsaW5lIGNvbW1lbnQgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU1OSI+MjQ1NTk8L2E+CitUT0RPOiBpdGVtcyBkaXNhcHBlYXIgd2hlbiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvciBpbiBhIG1ldGhvZCBib2R5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MDciPjEzOTA3PC9hPgorU2Nhbm5lciBkb2VzIG5vdCByZXBvcnQgd2hpdGVzcGFjZSB0b2tlbnMgYXQgZW5kIG9mIGlucHV0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxODUiPjI1MTg1PC9hPgorQ2xhc3NGb3JtYXRFcnJvciBjb21waWxpbmcgYSBtZXRob2Qgd2l0aCBhIGNvbXBpbGF0aW9uIHByb2JsZW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTEyNCI+MjUxMjQ8L2E+CitBU1Q6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvbiBjcmVhdGlvbgorICAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxMzciPjgxMzc8L2E+Ci1Db2RlIGFzc2lzdCBmb3IgYW5vbnltb3VzIGlubmVyIHR5cGUgdG9vIGxhdGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc2MSI+MTU3NjE8L2E+Ci1Mb2cgbWVzc2FnZSBhZnRlciBpbXBvcnRpbmcgcGx1Z2lucyBmYWlscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODUyIj4xNTg1MjwvYT4KLW5lZWQgc2V0IGFwaSBvbiBJQ2xhc3NwYXRoRW50cnkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU3OSI+MTU1Nzk8L2E+Ci1JbmNvbXBsZXRlIEphdmEgRXJyb3IgTWVzc2FnZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNzU2Ij4xMzc1NjwvYT4KLUNvZGUgQ29tcGxldGlvbiArIFR5cGUgSW50cm9zcGVjdGlvbiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5OCI+MzE5ODwvYT4KLUNhbGxlciBvZiBTaWduYXR1cmUudG9TdHJpbmcoU3RyaW5nKSBzaG91bGQgYmUgYXdhcmUgdGhhdCBpdCB3b24ndCB3b3JrIGZvciAnJCcgc2VwYXJhdGVkIHRvcC1sZXZlbCB0eXBlcyAoMUc0UUIyUykgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMzIiPjE1MzMyPC9hPgotUHJvYmxlbSB3aXRoICJcXCIgaW4gZWRpdG9yL2NvbXBpbGVyIAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMDgiPjIzMjA4PC9hPiAgCitUaGUgamF2YWRvYyBzaG93biBieSBFY2xpcHNlIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgamF2YWRvYyBwcm9kdWNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NDY0Ij4yNTQ2NDwvYT4gIAorTlBFIGR1cmluZyBpbXBvcnQgcGx1Z2lucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTcwIj4yNTE3MDwvYT4gIAorb3BlbmluZyAuamF2YSBmaWxlcyBmcm9tIG91dHNpZGUgb2YgY2xhc3NwYXRoIGlzIG11Y2ggc2xvd2VyIHRoZW4gb3RoZXIgZmlsZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMDciPjIzMzA3PC9hPgorUmVmYWN0b3JpbmcgYW5kIFNlYXJjaCBhcmUgYXBwbGllZCBvbmx5IG9uIG9wZW4gZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk4NSI+MjA5ODU8L2E+CitbR00xXSBSRUdSRVNTSU9OOiBlY2xpcHNlIHdhbnRzIHRvIGltcG9ydCBjbGFzcyBhbHJlYWR5IGltcG9ydGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MDYiPjI0OTA2PC9hPgorbmV3IG5vbi1ubHMgc3RyaW5ncyBub3Qgbm90aWNlZCBvbiB0eXBpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTM3OCI+MjUzNzg8L2E+CitTd2l0Y2hpbmcgZnJvbSBqZGsxLjMuMSB0byBqZGsxLjQuMSBsZWF2ZXMgbWUgd2l0aG91dCBDVlMgc3VwcG9ydAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzA0Ij4yMjMwNDwvYT4KK0phdmFNb2RlbDogaW5uZXIgTm9kZSBDb25zdHJ1Y3RvciBzaG93cyBzeW50ZXRpYyBhcmd1bWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MzczIj4yNTM3MzwvYT4KK29wdGlvbnMgbm93IHdpdGggJ01hcCcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI5NyI+MjUyOTc8L2E+CitBU1Q6IERDUjogQWxsb3cgc3ViY2xhc3NlcyBvZiBBU1ROb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA3NTEiPjIwNzUxPC9hPgorW0YzXSBEaXNjcmVwZW5jeSBiZXR3ZWVuIGxpZ2h0IGJ1bGJzIGFuZCBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTYzIj4yNTE2MzwvYT4KK0FTVCBEQ1I6IFBhcmFtZXRlciBuYW1lcyBpbiBJTWV0aG9kQmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTAzIj4yNTEwMzwvYT4KK0Zvcm1hdHRlciBpbmRlbnRhdGlvbgogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTA3IC0gN3RoIE1heSAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDUKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDIzcmQgT2N0b2JlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3OWEKIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLQk8bGk+QWRkZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lc3NhZ2UjTWVzc2FnZShTdHJpbmcsIGludCwgaW50KS4gVGhpcyBuZXcgY29uc3RydWN0b3IgYWxsb3dzIHRvIHNldCB0aGUgbGVuZ3RoIGZpZWxkLiBUaGUgY29uc3RydWN0b3IKLQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNNZXNzYWdlKFN0cmluZywgaW50KSBzdGlsbCBleGlzdHMgYW5kIHNldCB0aGUgbGVuZ3RoIHRvIDAuIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSBuZXcgY29uc3RydWN0b3IgaWYgdGhlIGxlbmd0aAotCWlzIG5ldmVyIHVzZWQuPC9saT4KLQk8bGk+UmVuYW1lZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNnZXRTb3VyY2VQb3NpdGlvbigpIHRvIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXNzYWdlI2dldFN0YXJ0UG9zaXRpb24oKS4gVGhpcwotCWlzIG1vcmUgY29uc2lzdGVudCB3aXRoIHRoZSBET00vQVNUIEFQSS4gVGhlIG9sZCBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgY2xvc2UgZnV0dXJlLjwvbGk+Ci0JPGxpPkFkZGVkIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXNzYWdlI2dldExlbmd0aCgpIGFsbG93aW5nIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIG5vZGUgb24gd2hpY2gKLQl0aGUgbWVzc2FnZSBoYXMgYmVlbiByZXBvcnRlZC48L2xpPgotCTxsaT4gQWRkZWQgPGNvZGU+SmF2YUNvcmUjZ2V0U2hhcmVkV29ya2luZ0NvcGllcyhJQnVmZmVyRmFjdG9yeSk8L2NvZGU+IGFsbG93aW5nIHRvIHJldHJpZXZlIGFsbCByZWdpc3RlcmVkIHdvcmtpbmcKLQkJY29waWVzIGZvciBhIGdpdmVuIGJ1ZmZlciBmYWN0b3J5LiA8L2xpPgotCTxsaT4gSmF2YUJ1aWxkZXIgbm8gbG9uZ2VyIGJ1aWxkIHByb2plY3RzIGZvciB3aGljaCBwcmVyZXF1aXNpdGUgcHJvamVjdHMgYWJvcnRlZCB0aGUgYnVpbGQgcHJvY2Vzcy4gVGhpcyBjb25zaWRlcmFibHkKLQkJcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHNlY29uZGFyeSBlcnJvcnMgd2hlbiBkZWFsaW5nIHdpdGggd29ya3NwYWNlIHNldHVwIHByb2JsZW1zLjwvbGk+Ci0JPGxpPiBBZGRlZCA8Y29kZT5JV29ya2luZ0NvcHkjcmVjb25jaWxlKGJvb2xlYW4gZm9yY2VQcm9ibGVtRGV0ZWN0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC9jb2RlPiBhbGxvd2luZyB0byBmb3JjZQotCQlwcm9ibGVtIHJlZnJlc2ggZXZlbiBpZiB3b3JraW5nIGNvcHkgd2FzIGFscmVhZHkgY29uc2lzdGVudC4KLSAgICA8bGk+IEFkZGVkIDxjb2RlPklDbGFzc3BhdGhDb250YWluZXI8L2NvZGU+IG5ldyBraW5kIGNvbnN0YW50IDxjb2RlPktfREVGQVVMVF9TWVNURU08L2NvZGU+IHRvIGRlbm90ZSBzeXN0ZW0gbGlicmFyaWVzIGltcGxpY2l0ZWx5IGNvbnRyaWJ1dGVkCi0gICAgCWJ5IGEgcnVudGltZS4gPC9saT4KLSAgICA8bGk+IENsYXNzcGF0aCBjb250YWluZXIgcGF0aCBjYW4gaGF2ZSBtb3JlIHRoYW4gMiBzZWdtZW50cy4gRmlyc3Qgb25lIGlzIHN0aWxsIHRoZSBjb250YWluZXIgSUQsIHRoZSByZW1haW5pbmcgb25lcyBhcmUgZm9ybWluZyB0aGUgaGludHMKLSAgICAJcGFzc2VkIHRvIHRoZSByZXNvbHV0aW9uIHBoYXNlICg8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4gPC9saT4KLSAgICA8bGk+IENsYXNzcGF0aCBjb250YWluZXJzIGNhbiBubyBsb25nZXIgY29udGFpbiB2YXJpYWJsZSBlbnRyaWVzIDwvbGk+Ci0JPGxpPkphdmFDb3JlIG5vdyBwZXJzaXN0cyBpdHMgb3B0aW9ucyAoPGNvZGU+SmF2YUNvcmUjZ2V0T3B0aW9uczwvY29kZT4pIHVzaW5nIGl0cyBwbHVnaW4gcHJvcGVydHkgc3RvcmUuIENsaWVudHMgbm8gbG9uZ2VyIG5lZWQgdG8gc2F2ZSB0aGVtLiA8L2xpPgotCTxsaT5KYXZhQ29yZSBub3cgcHJvdmlkZXMgY29uc3RhbnRzIGZvciBhbGwgc3VwcG9ydGVkIG9wdGlvbiBJRHMgYW5kIHZhbHVlcy48L2xpPgotCTxsaT5KYXZhQ29yZSBvcHRpb24gYWRkZWQsIHRvIGFsbG93IGJ1aWxkIHRvIGFib3J0IGluIHByZXNlbmNlIG9mIGludmFsaWQgY2xhc3NwYXRoLiAKLQk8bGk+TGV2ZXJhZ2VkIG5ldyBlbmNvZGluZyBzdXBwb3J0IGZyb20gUGxhdGZvcm0vQ29yZS4gVGhlIEphdmFDb3JlIG9wdGlvbiAib3JnLmVjbGlwc2UuamR0LmNvcmUuZW5jb2RpbmciIGlzIG5vdyBlcXVpdmFsZW50IHRvIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpPC9jb2RlPi4KLQk8cHJlPgotCSAqIEJVSUxERVIgLyBBYm9ydCBpZiBJbnZhbGlkIENsYXNzcGF0aAotCSAqICAgIEFsbG93IHRvIHRvZ2dsZSB0aGUgYnVpbGRlciB0byBhYm9ydCBpZiB0aGUgY2xhc3NwYXRoIGlzIGludmFsaWQKLQkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogIHsgImFib3J0IiwgImlnbm9yZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICJpZ25vcmUiCi0JPC9wcmU+CiA8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDE2Ij4xNTQxNjwvYT4KLUNsYXNzcGF0aCBjb250YWluZXIgLSBuZWVkIHRvIHNldCB2YWx1ZSBldmVuIGlmIG5vdCByZWZlcmVuY2VkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MTgiPjE1NDE4PC9hPgotQ2xhc3NwYXRoIGNvbnRhaW5lciAtIG1heSBnZXQgdGhlIGluaXQtaW4tcHJvZ3Jlc3MgdmFsdWUgYmFjawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzM0Ij4xNTMzNDwvYT4KLWFzdDogTWVzc2FnZSBzaG91bGQgaGF2ZSBsZW5ndGggCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzNjQiPjE1MzY0PC9hPgotc2VhcmNoIGZvciByZWZlcmVuY2VzIG9mIERlYnVnVUlQbHVnaW4uc2V0QXR0cmlidXRlcyguLi4pIGZhaWxzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE3NSI+MTUxNzU8L2E+Ci1OZWVkIEFQSSB0byByZXRyaWV2ZSBhbGwgc2hhcmVkIHdvcmtpbmcgY29waWVzIGZvciBhIGJ1ZmZlciBmYWN0b3J5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNTQiPjE1MjU0PC9hPgotSmF2YU1vZGVsTWFuYWdlciB0aGlua3MgSmF2YVByb2plY3QgaXMgY2xvc2VkIHdoZW4gaXQgaXMgb3BlbiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NiI+MzM1NjwvYT4KLUFQSSAtIHNob3VsZCBwcm92aWRlIEFQSSBmb3IgcnVubmluZyBiYXRjaCBjb21waWxlciAoMUdKSVdEUCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI0NCI+MTUyNDQ8L2E+Ci1OUEUgaW4gSkRUQ29tcGlsZXJBZGFwdGVyIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Mjg5Ij4xNTI4OTwvYT4KLVdoeSBpcyBhbiBpbmNvcnJlY3QgcGFja2FnZSBkZWNsYXJhdGlvbiBub3QgcmVwb3J0ZWQgZHVyaW5nIHJlY29uY2lsaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMjUiPjEzMjI1PC9hPgotcXVpY2sgZml4OiBzaG93cyB1cCBvbmx5IGFmdGVyIEkgc2F2ZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDgxIj4xNTA4MTwvYT4KLUphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aCBhbGxvd3MgbmVzdGluZyBzb3VyY2UgZm9sZGVycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDQ0Ij4xNTA0NDwvYT4KLVVuYWJsZSB0byB2aWV3IHNvbWUgbm9uLWphdmEgZmlsZXMgaW4gZXh0ZXJuYWwgamFycyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNzciPjE1MTc3PC9hPgotQ2xhc3NwYXRoIG1hcmtlcnMgbm90IGNvcnJlY3RseSB1cGRhdGVkICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE2OCI+MTUxNjg8L2E+Ci1jaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTciPjEzOTU3PC9hPgotTGF1bmNoaW5nUGx1Z2luIHNwZWNpZmljYXRpb24gb2YgcmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NzciPjEyOTc3PC9hPgotQWRkaW5nIEphdmEgbmF0dXJlIHRvIGEgcHJvamVjdCBkb2VzIG5vdCBicmluZyBpdCB0byBsaWtlIGluIHBhY2thZ2UgdmlldyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMDciPjE1MTA3PC9hPgotSW50ZXJuYWwgRXJyb3Igb3JnYW5pemluZyBpbXBvcnRzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDMwIj4xNTAzMDwvYT4KLU5QRSB0cnlpbmcgdG8gb3BlbiBvciBlZGl0IHNvdXJjZSBmaWxlcyB0aGF0IHJlZmVyZW5jZSBqYnVpbGRlci5qYXIgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzgiPjE0ODM4PC9hPgotU2NyYXBib29rIGVkaXRvcjogYmFkIGhhbmRsaW5nIG9mIC8vIGNvbW1lbnQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NDMiPjEyNTQzPC9hPgotQ29kZSBhc3Npc3QgdG8gaW5zZXJ0IG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlcmUgYXJlIGV4dHJhIHRvcC1sZXZlbCBzdGF0ZW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwNjEiPjE1MDYxPC9hPgotSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIEFTVE5vZGUuc2V0U291cmNlUmFuZ2UgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwMzYiPjE1MDM2PC9hPgotQVNUVmlzaXRvci5wcmVWaXNpdCBhbmQgQVNUVmlzaXRvci5wb3N0VmlzaXQgbm90IGNhbGxlZCBjb3JyZWN0bHkgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5MyI+MzE5MzwvYT4KLUpNIC0gSVNvdXJjZU1hbmlwdWxhdGlvbi5kZWxldGUgc2VuZCByZXBsYWNlLUJ1ZmZlckNoYW5nZWRFdmVudCAoMUZZRThYSSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDkxIj4xNTA5MTwvYT4KLVRvbyBtYW55IGN5Y2xlIG1hcmtlcnMgZ2VuZXJhdGVkIHdoZW4gY3ljbGUgaXMgZGV0ZWN0ZWQgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzU0Ij4xNDc1NDwvYT4KLUNvZGVBc3Npc3QgLSBEdXBsaWNhdGUgbWV0aG9kIGRlY2xhcmF0aW9uIHByb3Bvc2FsIGluc2lkZSBhbm9ueW1vdXMgdHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDUxIj4xNTA1MTwvYT4KLVN5bnRoZXRpYyBhY2Nlc3MgbWV0aG9kcyBhcmUgbm90IHJlcG9ydGVkIHRvIGJlIHN5bnRoZXRpYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTkiPjMwNTk8L2E+Ci1KUkVfTElCIG5vdCBhcHBlbmRlZCB0byBidWlsZFBhdGggKDFHRjdUQVopCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwNTAiPjE1MDUwPC9hPgotQ2xlYW51cCBKYXZhZG9jIEBleGNlcHRpb24gdGFncyBpbiBET00vQVNUCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNTEiPjE0MTUxPC9hPgotVGhlIGNvZGUgZm9ybWF0dGVyIGRvZXMgbm90IHJlc3BlY3QgdGhlICJtYXhpbXVtIGxpbmUgbGVuZ3RoIiBwcm9wZXJ0eSB3aGVuIHRoZSBpbmRlbnRhdGlvbiBpcyBzZXQgdG8gdGFidWxhdGlvbi4gCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NzQiPjE0OTc0PC9hPgotQmFkIGdlbmVyYXRlZCBjb2RlIGZvciAnKz0nIGFuZCAnLT0nIG9wZXJhdG9ycworPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxOTciPjI1MTk3PC9hPiAgCitOUEUgaW1wb3J0aW5nIGV4dGVybmFsIHBsdWdpbnMgIAogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxOSI+MTU3MTk8L2E+Ci1FcnJvcnMgZHVyaW5nIGJ1aWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwODciPjE1MDg3PC9hPgotTlBFIHdoZW4gbWV0aG9kcyBmcm9tIHRoZSBvdXRlcm1vc3QgZW5jbG9zaW5nIGNsYXNzIGlzIGludm9rZWQgaW4gYSBhbm9ueW1vdXMgY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA1NyI+MTMwNTc8L2E+Ci1OUEUgaW4gSmF2YUVsZW1lbnRSZXF1ZXN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE1NSI+MTExNTU8L2E+Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHMgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHdvcmtiZW5jaCB0byBmcmVlemUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkyMSI+MTI5MjE8L2E+Ci1CdWlsZCBzb21ldGltZXMgYnVpbGRzIGZpbGVzIHRoYXQgaGF2ZSBub3QgY2hhbmdlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTYyIj4xNDk2MjwvYT4KLUpEVCBTZWFyY2ggcmV0dXJuaW5nIGltcHJvcGVyIHR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkyOSI+MTQ5Mjk8L2E+Ci1FeHRlcm5hbCBMb2NhdGlvbnMgZm9yIE91dHB1dCBGaWxlcwogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDMwIC0gMzB0aCBBcHJpbCAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDMKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDIybmQgT2N0b2JlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3OQogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotCTxsaT5Qcmlvcml0eSBvZiB0aGUgYmFja2dyb3VuZCBpbmRleGVyIGhhcyBiZWVuIGxvd2VyZWQgc28gdGhhdAotCSAgICBpdCBkb2Vzbid0IGludGVyZmVyIHdpdGggb3RoZXIgdGhyZWFkcyAoZS5nLiB3aGVuIHN3aXRjaGluZyBKUkUKLQkgICAgdGhlIGluZGV4aW5nIHdpbGwgbm90IHN0YXJ0IGJlZm9yZSB0aGUgc3dpdGNoIGhhcyBjb21wbGV0ZWQpCi0JPC9saT4KLQk8bGk+UmV2aXNlZCBDbGFzc3BhdGggQ29udGFpbmVyIHByb3Bvc2FsIChhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9jbGFzc3BhdGglMjBjb250YWluZXIvY2xhc3NwYXRoQ29udGFpbmVyLmh0bWwiPm5vdGVzPC9hPik6Ci0JPHVsPgotCTxsaT48Y29kZT5jbGFzc3BhdGhDb250YWluZXJDaGFuZ2VkKCk8L2NvZGU+IGdvdCByZXBsYWNlZCB3aXRoIHNldHRlciBtZXRob2QgPGNvZGU+SmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdFtdIGFmZmVjdGVkUHJvamVjdHMsIElDbGFzc3BhdGhDb250YWluZXIgcmVzcGVjdGl2ZUNvbnRhaW5lcnMpIDwvY29kZT48L2xpPgotCTxsaT48Y29kZT5DbGFzc3BhdGhDb250YWluZXJSZXNvbHZlcjwvY29kZT4gZ290IHJlbmFtZWQgaW50byA8Y29kZT5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT48L2xpPgotCTxsaT4gQ29udGFpbmVyIGNhbiBubyBsb25nZXIgY29udGFpbiBhbnkgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4gZW50cnkuCi0JPGxpPiBhZGRlZCBjb250YWluZXIgaW50ZXJmYWNlIDxjb2RlPiBJQ2xhc3NwYXRoQ29udGFpbmVyIDwvY29kZT4gaW4gb3JkZXIgdG8gYWxsb3cgY29udGFpbmVycyB0byBiZSBwcmVzZW50ZWQgaW4gYSBVSS4KLQkJICA8dWw+Ci0JCSAgPGxpPklDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSA8L2xpPgotCQkgIDxsaT5TdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSA8L2xpPgotCQkgIDxsaT5pbnQgZ2V0S2luZCgpIDwvbGk+Ci0JCSAgPGxpPlBhdGggZ2V0UGF0aCgpIDwvbGk+Ci0JCSA8L3VsPgotCTwvdWw+Ci0JPC9saT4KLQk8bGk+SWYgdGhlIGNvbXBsZXRpb24gaXMgaW5zaWRlIGEgc3VwZXIgdHlwZSBpbiB0eXBlIGRlY2xhcmF0aW9uIGhlYWRlciB0aGVuIHRoZSByZWxldmFuY2UgZ3JvdwotCQl3aGVuIHRoZSB0eXBlIGhhdmUgdGhlIGNvcnJlY3QgbmF0dXJlIDoKLQkJPHVsPgotCQkJPGxpPiBBZnRlciA8Y29kZT5leHRlbmRzPC9jb2RlPiBrZXl3b3JkIG9mIGEgY2xhc3MgaGVhZGVyIHRoZSByZWxldmFuY2UgZ3JvdyBpZiB0aGUgdHlwZSBpcyBhIGNsYXNzLgotCQkJPC9saT4KLQkJCTxsaT4gQWZ0ZXIgPGNvZGU+aW1wbGVtZW50czwvY29kZT4ga2V5d29yZCBvZiBhIGNsYXNzIGhlYWRlciB0aGUgcmVsZXZhbmNlIGdyb3cgaWYgdGhlIHR5cGUgaXMgYW4gaW50ZXJmYWNlLgotCQkJPC9saT4KLQkJCTxsaT4gQWZ0ZXIgPGNvZGU+ZXh0ZW5kczwvY29kZT4ga2V5d29yZCBvZiBhbiBpbnRlcmZhY2UgaGVhZGVyIHRoZSByZWxldmFuY2UgZ3JvdyBpZiB0aGUgdHlwZSBpcyBhbiBpbnRlcmZhY2UuCi0JCQk8L2xpPgotCQk8L3VsPgotCTwvbGk+Ci0JPGxpPiBJZiB0aGUgY29tcGxldGlvbiBpcyBpbnNpZGUgYSB0eXBlIGluIGEgY2F0Y2ggb3IgdGhyb3dzIGNsYXVzZSB0aGUgcmVsZXZhbmNlIGdyb3cgd2hlbiB0aGUgdHlwZSBpcyBhbiBleGNlcHRpb24KLQkJKGlmIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGNvbnRhaW4gPGNvZGU+ZXhjZXB0aW9uPC9jb2RlPiBvciA8Y29kZT5lcnJvcjwvY29kZT4pLgotCTwvbGk+Ci0JPGxpPiBJZiB0aGUgY29tcGxldGlvbiBpcyBpbnNpZGUgYSB0aHJvdyBzdGF0ZW1lbnQgdGhlIHJlbGV2YW5jZSBncm93IHdoZW4gdGhlIHByb3Bvc2FsIGlzIGFuIGV4Y2VwdGlvbi4KLQk8L2xpPgotCTxsaT5UaGUgYmFja2dyb3VuZCBpbmRleGVyIG5vdyByZWNvdmVycyBmcm9tIGludGVybmFsIGNyYXNoLiBJZiB0aGlzIGhhcHBlbnMsIAotCSAgICBhIG5ldyB0aHJlYWQgaXMgY3JlYXRlZCBhbmQgYSBjb25zaXN0ZW5jeSBjaGVjayBpcyBkb25lIG9uIGFsbCBpbmRleGVzLgotCTwvbGk+Ci0JPGxpPkFuIGludGVybmFsIGJ1ZmZlciBmYWN0b3J5IGlzIG5vdyB1c2VkIHRvIGNyZWF0ZSBidWZmZXJzIHdoZW4KLQkgICAgY2xpZW50cyBkb24ndCBwcm92aWRlIG9uZS4KLQk8L2xpPgotCTxsaT5TcGVjaWFsIGhhbmRsaW5nIGluIHRoZSBmb3JtYXR0ZXIgZm9yIC8vJE5PTi1OTFMtIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UuIFdoZW4gYSBsaW5lIGNvbnRhaW5zIHN1Y2ggY29tbWVudHMKLQlpdCBpcyBub3QgZm9ybWF0dGVkIGFueW1vcmUuIFRoZSB1c2VyIHdpbGwgbmVlZCB0byBtYW51YWxseSBmb3JtYXQgaXQuIFNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM4NyI+MTQzODc8L2E+IGFuZAotCTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NDAiPjEyNTQwPC9hPi4KLQk8L2xpPgorPGxpPkJ5IGRlZmF1bHQsIHRoZSBjb21waWxlciB3aWxsIHByb2R1Y2Ugd2FybmluZ3MgZm9yIHVudXNlZCBpbXBvcnRzIGFuZCBub24tc3RhdGljIHJlZmVyZW5jZXMgdG8gc3RhdGljIG1lbWJlcnMuCis8L2xpPgorPGxpPkNvZGUgY29tcGxldGlvbiBlbmhhbmNlbWVudDoKKyAgIDx1bD4KKyAgIDxsaT5SZWxldmFuY2Ugb2YgYSBwcm9wb3NhbCBpcyBoaWdoZXIgaWYgdGhlIHByb3Bvc2FsIGlzIGluIGEgcmV0dXJuIHN0YXRlbWVudCBhbmQgaXRzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZXR1cm4gdHlwZS4KKyAgIDxicj5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgPGNvZGU+dmFyMjwvY29kZT4gaXMgbW9yZSByZWxldmFudCB0aGFuIDxjb2RlPnZhcjE8L2NvZGU+LjxwcmU+CisgICBwdWJsaWMgY2xhc3MgWCB7CisgICAgICBPYmplY3QgdmFyMTsKKyAgICAgIGludCB2YXIyOworICAgICAgaW50IGZvbygpIHsKKyAgICAgICAgIHJldHVybiB2YXImbHQ7Y3Vyc29yJmd0OworICAgICAgfQorICAgfTwvcHJlPgorICAgPC9saT4KKyAgIDxsaT5SZWxldmFuY2Ugb2YgYSBwcm9wb3NhbCBpcyBoaWdoZXIgaWYgdGhlIHByb3Bvc2FsIGlzIGluIGEgY2FzdCBzdGF0ZW1lbnQgYW5kIGl0cyB0eXBlIGlzIGluIHRoZSBoaWVyYWNoeSBvZiB0aGUgY2FzdCB0eXBlLgorICAgPGJyPkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSA8Y29kZT52YXIyPC9jb2RlPiBpcyBtb3JlIHJlbGV2YW50IHRoYW4gPGNvZGU+dmFyMTwvY29kZT4uPHByZT4KKyAgIHB1YmxpYyBjbGFzcyBYIHsKKyAgICAgIE9iamVjdCB2YXIxOworICAgICAgaW50IHZhcjI7CisgICAgICBsb25nIGZvbygpIHsKKyAgICAgICAgIHJldHVybiAoaW50KXZhciZsdDtjdXJzb3ImZ3Q7CisgICAgICB9CisgICB9PC9wcmU+CisgICA8L2xpPgorICAgPGxpPlJlbGV2YW5jZSBvZiBhIHByb3Bvc2FsIGlzIGhpZ2hlciBpZiB0aGUgcHJvcG9zYWwgaXMgYW4gYXJndW1lbnQgb2YgYSBzZW50IG1lc3NhZ2UgYW5kIGl0cyB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVyIHR5cGUuCisgICA8YnI+SW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIDxjb2RlPnZhcjI8L2NvZGU+IGlzIG1vcmUgcmVsZXZhbnQgdGhhbiA8Y29kZT52YXIxPC9jb2RlPi48cHJlPgorICAgcHVibGljIGNsYXNzIFggeworICAgICAgT2JqZWN0IHZhcjE7CisgICAgICBpbnQgdmFyMjsKKyAgICAgIHZvaWQgZm9vKGludCBpKSB7CisgICAgICAgICBmb28odmFyJmx0O2N1cnNvciZndDsKKyAgICAgIH0KKyAgIH08L3ByZT4KKyAgIDwvbGk+CisgICA8L3VsPgorPC9saT4KIDwvdWw+CiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MzMiPjE0OTMzPC9hPgotQVNUOiBObyBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBmb3IgdW5yZWFjaGFibGUgY29kZSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkyMSI+MTQ5MjE8L2E+Ci1ObyBlcnJvciBtZXNzYWdlIGZyb20gaW5uZXIgdHlwZSBpbnN0YW50aWF0aW9uIGluIHN0YXRpYyBjb250ZXh0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MTkiPjEzOTE5PC9hPgotRGVjbGFyYXRpb24gZm9yIHBhY2thZ2Ugbm90IGZvdW5kIGlmIHNjb3BlIGlzIG5vdCBwcm9qZWN0ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg1MiI+MTQ4NTI8L2E+Ci1Pcmdhbml6ZSBJbXBvcnQ6IG1pc3NpbmcgaW1wb3J0IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTMxIj4xMzUzMTwvYT4KLUphdmEgaW5kZXhpbmcgdGhyZWFkIGZpbmRzICJCb25qb3VyLCBsZSBtb25kZSEiIHRvbyBpbnRlcmVzdGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODc4Ij4xNDg3ODwvYT4KLXN0YXRpYyBmaW5hbCBjaGFyIE5lZ1RocmVlPSAoY2hhciktMywgLTMgPT0gTmVnVGhyZWUgcmV0dXJucyB0cnVlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMzEiPjE0MzMxPC9hPgotSUNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQgZG9zIG5vdCBmaW5kIGltcG9ydCBkZWNsICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAzOCI+MTQwMzg8L2E+Ci1DbGFzc0Nhc3RFeGNlcHRpb24gZHVyaW5nIEphdmFSZWNvbmNpbGluZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDExIj4xNDAxMTwvYT4KLUFTVE5vZGUuY2hlY2tOZXdDaGlsZChBU1ROb2RlLCBBU1ROb2RlLCBib29sZWFuLCBDbGFzcykgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM1NzciPjEzNTc3PC9hPgotUHJvYmxlbSBoaWdobGlnaHRlciBpcyB1bmFibGUgdG8gaW1wb3J0IGZyb20gSmF2YTNEIGxpYnJhcnkuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzEiPjE0ODMxPC9hPgotTlBFIHdpdGggaGllcmFyY2h5IHNlYXJjaCBvZiBhIGxvY2FsIHZhcmlhYmxlICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDI0MyI+MTQyNDM8L2E+Ci1BcHBsZXQgVmlld2VyIEludGVncmF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNDAiPjE0MTQwPC9hPgotQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIG9wZW4gSmF2YSBlZGl0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgzNCI+MTQ4MzQ8L2E+Ci1zbWFsbHRhbGstaXNoIGVycm9yIG1lc3NhZ2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MSI+MTE2NTE8L2E+Ci1BdXRvLWNvbXBsZXRlIHNob3dzIGFsbCBPYmplY3Qgc3ViY2xhc3NlcyBhZnRlciAidGhyb3dzIiBrZXl3b3JkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk3MCI+NDk3MDwvYT4KLUF1dG9tYXRpYyBDb2RlIEFzc2lzdCBuZWVkcyB0byBiZSBzbWFydGVyICM2Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY1MSI+ODY1MTwvYT4KLUNvZGUgYXNzaXN0IHNob3VsZCBvZmZlciBleGNlcHRpb24gaW5zdGVhZCBvZiBhbnkgY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc2NyI+MTQ3Njc8L2E+Ci1idWcgaW4gSUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjQyIj4xNDY0MjwvYT4KLVN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHZpZXcgc29tZSBjbGFzc2VzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTU4Ij4xNDU1ODwvYT4KLUFkZGluZyBiaW5hcnkgcHJvamVjdCBkb2Vzbid0IGZpeCBjbGFzc3BhdGggcHJvYmxlbXMuICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU4OCI+MTQ1ODg8L2E+Ci1OdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBVdGlsLmVxdWFsQXJyYXlzT3JOdWxsICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQ5MiI+MTM0OTI8L2E+Ci1TaG91bGQgaGFuZGxlIEphdmFNb2RlbEV4Y2VwdGlvbnMgdGhhdCBjb250YWlucyBDb3JlRXhjZXB0aW9uIG1vcmUgZ3JhY2VmdWxseSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1NDAiPjEyNTQwPC9hPgotQ29kZSBmb3JtYXR0ZXIgc2hvdWxkIGxlYXZlIGNvbW1lbnRzIGF0IGVuZCBvZiBsaW5lIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzg3Ij4xNDM4NzwvYT4KLUZvcm1hdHRlciBpc24ndCAvLyROT04tTkxTLTEkIGF3YXJlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMTMiPjE0MzEzPC9hPgotRENSOiBBU1QgaW4gbWV0aG9kcyB3aXRoIG1pc3NpbmcgcmV0dXJuIHR5cGUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwOTQiPjE0MDk0PC9hPgotSW5kZXhlcjogRGVhZGxvY2sgb24gZGVsZXRlIHByb2plY3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTk0Ij4xNDU5NDwvYT4KLSJPcGVuIHR5cGUiIGRvZXNuJ3QgZmluZCB0eXBlcyBpbiBwcm9qZWN0IHdpdGggSmF2YSBuYXR1cmUgYWRkZWQgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjAyIj4xNDYwMjwvYT4KLWFzdDogbGVuZ3RoIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTkyIj4xNDU5MjwvYT4KLUlUeXBlI2dldFR5cGVzIGFuZCBJVHlwZSNnZXREZWNsYXJpbmdUeXBlIGFyZSBub3QgY29oZXJlbnQgd2l0aCBIYXN0YWJsZSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg2OCI+MTM4Njg8L2E+Ci1KYXZhIE1vZGVsIG5vdCB1cGRhdGVkIHByb3Blcmx5ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzNCI+MTMyMzQ8L2E+Ci1DYW4ndCBvcGVuIHR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mjk2Ij45Mjk2PC9hPgotSGFuZyBvbiBvcGVuIHR5cGUgZHVyaW5nIGluZGV4aW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MTYiPjEzOTE2PC9hPgotYXBpOiBJU2Nhbm5lciAtIFNjYW5uZXIubGluZVB0cgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTI2Ij4xNDUyNjwvYT4KLU5QRSB3aGVuIHJlc29sdmluZyBhIFNpbXBsZU5hbWUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjkiPjExNTI5PC9hPgotYXN0OiBtaXNzaW5nICg/KSBiaW5kaW5nIG9uIHNpbXBsZU5hbWUgaW4gVmFyaWFibGVEZWNsYXJhdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ1MyI+MTQ0NTM8L2E+Ci1SZW1vdmUgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLklOU1RBTkNFT0Ygb3BlcmF0b3IgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0OTAiPjE0NDkwPC9hPgotUG9zc2libGUgY29uY3VycmVuY3kgaG9sZSB3aGVuIHNhdmluZyBpbmRleCBiZWZvcmUgcXVlcnkgIAorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwNDAiPjI1MDQwPC9hPiAgCitnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhDUCBlbnRyeSkgaW1wbGVtZW50YXRpb24gZG9lc24ndCBtYXRjaCBzcGVjICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA0MSI+MjUwNDE8L2E+ICAKK0lKYXZhRWxlbWVudCNnZXRVbmRlcmx5aW5nUmVzb3VyY2UgLSBzaG91bGQgZmFpbCBpZiBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTA1Ij4yNDUwNTwvYT4gIAorUmVmYWN0b3JpbmcgYW4gZW1wdHkgcGFja2FnZSBtYWtlcyBpdCBkaXNhcHBlYXJzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDc3NSI+MjQ3NzU8L2E+ICAKK1dyb25nIGRlbHRhIHdoZW4gcmVwbGFjaW5nIGJpbmFyeSBwcm9qZWN0IHdpdGggc291cmNlIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDE4Ij4yNTAxODwvYT4KK3BhcnNlQ29tcGlsYXRpb25Vbml0KC4uKSBkb2VzIG5vdCByZXBvcnQgYSBjb21waWxlIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NzMiPjI0NzczPC9hPgorQ29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zOiBub3QgYWxsIHByb2JsZW1zPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzQ3Ij4yNDc0NzwvYT4KK2luY29ycmVjdCBjb21waWxlIGVycm9yIG1lc3NhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDk3NCI+MjQ5NzQ8L2E+CitCcm9rZW4gbGluayBpbiBKRFQgUGx1Z2luLWluIERldmVsb3BlcidzIEd1aWRlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2OTEiPjI0NjkxPC9hPiAgCitNaXNzaW5nIGludGVyZmFjZSBtYWtlcyBoaWVyYXJjaHkgaW5jb21wbGV0ZSAgCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODQ0Ij4xNDg0NDwvYT4KLU5QRSBjcmVhdGluZyBiaW5hcnkgcHJvamVjdHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDkwOCI+MTQ5MDg8L2E+Ci0xMDAlIENQVSB1dGlsaXphdGlvbiwgaGFuZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzMzIj4xNDczMzwvYT4KLU5QRSBzZXR0aW5nIG1hcmtlciBhdHRyaWJ1dGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NDMiPjEzNzQzPC9hPgotKE5QRSkgRWNsaXBzZSBmcm96ZSBkdXJpbmcgIm9wZW4gdHlwZSIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA3NCI+MTQwNzQ8L2E+Ci1TZWFyY2g6IE5vdCBhbGwgcmVmcyB0byBUd29QYW5lRWxlbWVudFNlbGVjdG9yIGNvbnN0cnVjdG9yIGZvdW5kICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg4OSI+MTQ4ODk8L2E+Ci1idWcgaW4gSUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDM5Ij4xMjQzOTwvYT4KLWF1dG8gY29tcGxldGlvbiBkb2Vzbid0IGNvbnNpc3RlbnRseSB3b3JrCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MTgiPjE0ODE4PC9hPgotbm8gbWVzc2FnZSBmb3IgdW5jYXVnaHQgZXhjZXB0aW9uIGluIHRyeSBibG9jayB3aGVuIHJldHVybiBpbiBmaW5hbGx5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MTAiPjEzODEwPC9hPgotQ2xhc3NDYXN0RXhjZXB0aW9uIGluIGluZGV4ZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzUyNyI+MTM1Mjc8L2E+Ci1OUEUgKyBHUCBzd2l0Y2hpbmcgSlJFCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwOTYiPjE0MDk2PC9hPgotSVdvcmtpbmdDb3B5LmZpbmRFbGVtZW50cyBzaG91bGQgbm90IHJldHVybiBudWxsICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk0MyI+MTM5NDM8L2E+Ci1FY2xpcHNlIGNyYXNoZXMgd2hlbiBkb2luZyBhICJyZWJ1aWxkIGFsbCIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ0MCI+MTQ0NDA8L2E+Ci1Qb3NzaWJsZSBidWcgaW4gY29tcGlsaW5nIGlubmVyIGNsYXNzZXMKKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjEzIj4yNDIxMzwvYT4gIAorW00xXSBkZXBlbmRlbmN5IGNoZWNraW5nIHRvbyBjb25zZXJ2YXRpdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY3MSI+MjQ2NzE8L2E+ICAKK0F0dGFjaGluZyBzb3VyY2UgdG8gSkFSIHRyaWdnZXJzIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMzkiPjI1MDM5PC9hPiAgCitOb24tZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290cyBzaG91bGQgbm90IGJlIG9wZW5hYmxlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzMxMSI+MjMzMTE8L2E+ICAKK05lZWQgYSB3YXkgdG8gaW5jbHVkZSBleHRlcm5hbCBKQVJzIGluIHRoZSBpbmRleGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NTYiPjI0OTU2PC9hPiAgCitDb21waWxlciBtaXNkaWFnbm9zZXMgZXhjZXB0aW9uIHNlcXVlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQwMTkiPjI0MDE5PC9hPiAgCitKYXIgUmVmcmVzaCBQcm9ibGVtCiAKLTxoMT4KKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MDgtTTVwYXRjaCIgLSA4dGggTWF5IDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0MmIKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE1dGggT2N0b2JlciAyMDAyIC0gMi4xIE1JTEVTVE9ORS0yCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3OAogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotCTxsaT5KYXZhIGJ1aWxkZXIgaXMgbG9nZ2luZyBpdHMgaW50ZXJuYWwgZXJyb3JzIDwvbGk+Cis8bGk+IEFkZGVkIHNvZnQgZGVwZW5kZW5jeSBvbiBwbHVnLWluICJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiIHRvIGFjY291bnQgZm9yIGZpbGVUeXBlcyBjb250cmlidXRpb24KKzwvbGk+CisgPGxpPiBKYXZhQ29yZSBvcHRpb24gYWRkZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHRhc2sgcHJpb3JpdGllcyAoZGVmYXVsdCBpcyA8Y29kZT4iIjwvY29kZT4gbWVhbmluZyAKKyB0YXNrcyBoYXZlIG5vcm1hbCBwcmlvcml0eSkuCis8cHJlPgorICogQ09NUElMRVIgLyBEZWZpbmUgdGhlIEF1dG9tYXRpYyBUYXNrIFByaW9yaXRpZXMKKyAqICAgIEluIHBhcmFsbGVsIHdpdGggdGhlIEF1dG9tYXRpYyBUYXNrIFRhZ3MsIHRoaXMgbGlzdCBkZWZpbmVzIHRoZSBwcmlvcml0aWVzIChoaWdoLCBub3JtYWwgb3IgbG93KQorICogICAgb2YgdGhlIHRhc2sgbWFya2VycyBpc3N1ZWQgYnkgdGhlIGNvbXBpbGVyLgorICogICAgSWYgdGhlIGRlZmF1bHQgaXMgc3BlY2lmaWVkLCB0aGUgcHJpb3JpdHkgb2YgZWFjaCB0YXNrIG1hcmtlciBpcyAiTk9STUFMIi4KKyAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1ByaW9yaXRpZXMiCisgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgInByaW9yaXR5Wyxwcmlvcml0eV0qIiB9IHdoZXJlIHByaW9yaXR5IGlzIG9uZSBvZiAiSElHSCIsICJOT1JNQUwiIG9yICJMT1ciCisgKiAgICAgLSBkZWZhdWx0OgkJCSIiCis8L3ByZT4JIAorIDwvbGk+CiA8L3VsPgorCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjcyIj4yMzI3MjwvYT4gIAorUGx1Z2luIGRlcGVuZGVuY2UgcHJvYmxlbQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzQxIj4yNDc0MTwvYT4gIAorU2VhcmNoIGRvZXMgbm90IGZpbmQgcGF0dGVybmVkIHR5cGUgcmVmZXJlbmNlIGluIGJpbmFyeSBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzgxMiI+MjM4MTI8L2E+ICAKK0NvbmZpZ3VyYWJsZSAoVE9ETykgTWFya2VycyBwcmlvcml0eSBpbiB0YWtzbGlzdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4NDAiPjIyODQwPC9hPiAgCitSZWZhY3Rvci0+TW92ZSBkb2Vzbid0IHVwZGF0ZSBMb2NhbCBIaXN0b3J5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY4NSI+MjQ2ODU8L2E+ICAKK0lubmVyIHBhY2thZ2UgZnJhZ21lbnRzIGdldHMgZGVsZXRlZCAtIG1vZGVsIG91dCBvZiBzeW5jaCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0OTgiPjI0NDk4PC9hPiAgCitEdXBsaWNhdGUgZW50cmllcyBvbiBjbGFzc3BhdGggY2F1c2UgQ1AgbWFya2VyIHRvIG5vIGxvbmdlciByZWZyZXNoICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDYzMCI+MjQ2MzA8L2E+CitOUEUgaW4gTWV0aG9kQmluZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIyIj4yNDYyMjwvYT4KK2FzdDogcHJvYmxlbXMgd2l0aCBtaXNzaW5nIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGVzICMyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MjkiPjI0NTI5PC9hPgorY29tcGlsZXIgbXVzdCBhY2NlcHQgZW1wdHkgc291cmNlIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MDIiPjI0NTAyPC9hPgorQVNUOiBObyBiaW5kaW5nIGZvciB0eXBlIGFjY2Vzc2VzIHRvIGEgbm9uLXZpc2libGUgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTExIj4yNDUxMTwvYT4KK0FTVDogUmVzb2x2ZSBvbiBub24tdmlzaWJsZSBpbXBvcnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMSI+MjQ1MDE8L2E+CitBU1Q6IE5vIGJpbmRpbmcgZm9yIGZpZWxkcyBhY2Nlc3NlcyBvZiBub24tdmlzaWJsZSBmaWVsZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMCI+MjQ1MDA8L2E+CitBU1Q6IE5vIGJpbmRpbmcgZm9yIGZpZWxkIGluc3RhbmNlIGFjY2VzcyBpbiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0OTkiPjI0NDk5PC9hPiAgCitBU1Q6IE5vIGJpbmRpbmcgZm9yIGluc3RhbmNlIGFjY2VzcyBpbiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMDQiPjE3MTA0PC9hPiAgCitDb21waWxlciBkb2VzIG5vdCBjb21wbGFpbiBidXQgIlF1aWNrIEZpeCIgPz8/IGNvbXBsYWlucyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4OTMiPjIxODkzPC9hPgorSVR5cGU6OmlzTWVtYmVyIHdvcmtzIHRoZSBvdGhlciB3YXkgcm91bmQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjU4MSI+MjI1ODE8L2E+CitJZ25vcmUgdW5yZWFjaGFibGUgY29kZSBmb3IgdW5yZWFkIHZhcmlhYmxlcwogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE3NSI+MjExNzU8L2E+ICAKK0luY29ycmVjdGx5IGlkZW50aWZpZWQ6IENhdGNoIGJsb2NrIGlzIGhpZGRlbiBieSBhbm90aGVyIG9uZSBpbiB0aGUgc2FtZSB0cnkgc3RhdGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1MjMiPjIzNTIzPC9hPiAgCitPdWxpbmVyIG5vdCB1cGRhdGVkIGFmdGVyIGNhdGNoLXVwIGZyb20gcmVwb3NpdG9yeSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyMzAiPjI0MjMwPC9hPiAgCitzZWFyY2g6IGRvZXMgbm90IGZpbmQgYSByZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9yIGluIGFub255bW91cyB0eXBlIGNyZWF0aW9ucyBub2RlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MjIiPjI0NTIyPC9hPiAgCitOZXcgQ2xhc3MgRGlhbG9nOiBObyBpbnRlcmZhY2UgbWV0aG9kIHN0dWJzIGdlbmVyYXRlZCBmb3IgbmVzdGVkIGNsYXNzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU2NyI+MjQ1Njc8L2E+ICAKK3Byb2JsZW0gd2l0aCBoaWVyYXJjaHkgaW4gd29ya2luZyBjb3B5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTkwMSI+MjE5MDE8L2E+CitKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIgaXMgbm90IGdlbmVyaWMgZW5vdWdoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2MjMiPjI0NjIzPC9hPgorQVNUOiBObyBtZXRob2QgYm9keSB3aGVuIGFic3RyYWN0IG1vZGlmaWVyIGlzIGV4aXN0aW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1NTgiPjI0NTU4PC9hPgorY29tcGlsZXIgZXJyb3IsIG1ldGhvZCBkZWNsYXJhdGlvbiBpbiBpbnRlcmZhY2UgLT4gTnVsbFBvaW50ZXJFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDYyMSI+MjQ2MjE8L2E+CitDYW5ub3Qgc3BlY2lmaWVkIEpSRSBmb3IgZWFjaCBwcm9qZWN0IHNlcGFyZWx5IC4uLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjAwIj4yNDYwMDwvYT4KK0VDTElQU0VfSE9NRSBub3Qgc2V0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxOTQiPjE0MTk0PC9hPgorSmF2YSBzb3VyY2UgZmlsZXMgc2hvdWxkbid0IHNob3cgZXJyb3JzIHdoZW4gaW4gc3JjIGRpciwgYnV0IG5vdCBqYXZhIHJlc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MTQiPjI0NTE0PC9hPgorZGVwZW5kZW5jeSBhbmFseXplciBpcyBicm9rZW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQwMCI+MjQ0MDA8L2E+CitDb21waWxlciBidWcgb3IgamF2YSAnZmVhdHVyZScgPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MjQzIj4yNDI0MzwvYT4KK0hldXJpc3RpYyB0byBkaWZmZXIgYmV0d2VlbiBpbnRlcm5hbCBKQVIgYW5kIGV4dGVybmFsIEpBUi4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzc2OSI+MjM3Njk8L2E+CitqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcgogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDIzIC0gMjNyZCBBcHJpbCAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDJhCitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSA4dGggT2N0b2JlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3NwogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotCTxsaT5KYXZhIG1vZGVsIEFQSSBhZGRpdGlvbnM6Ci0JCTx1bD4KLQkJCTxsaT48Y29kZT5JSmF2YVByb2plY3QuZmluZFR5cGUoU3RyaW5nKTwvY29kZT48L2xpPgotCQkJPGxpPjxjb2RlPklKYXZhUHJvamVjdC5maW5kVHlwZShTdHJpbmcsIFN0cmluZyk8L2NvZGU+PC9saT4KLQkJCTxsaT48Y29kZT5JTWV0aG9kLmlzTWFpbk1ldGhvZCgpPC9jb2RlPjwvbGk+Ci0JCQk8bGk+PGNvZGU+SU1ldGhvZC5pc1NpbWlsYXIoSU1ldGhvZCk8L2NvZGU+PC9saT4KLQkJCTxsaT48Y29kZT5JVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcik8L2NvZGU+PC9saT4KLQkJCTxsaT48Y29kZT5JVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyKTwvY29kZT48L2xpPgotCQk8L3VsPgotCTwvbGk+Ci0JPGxpPkFQSSBjaGFuZ2U6IDxjb2RlPklXb3JraW5nQ29weS5maW5kU2hhcmVkV29ya2luZ0NvcHkoKTwvY29kZT4gaXMgbm93IHRha2luZyBhbiBleHRyYSBhcmd1bWVudDogdGhlIGJ1ZmZlciBmYWN0b3J5IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyBlbnN1cmVzIHRoYXQKLQkJd29ya2luZyBjb3BpZXMgY2FuIG9ubHkgYmUgcmV1c2VkIGZvciB0aGUgc2FtZSBidWZmZXIgZmFjdG9yaWVzLgotCTwvbGk+Ci0JPGxpPiBKYXZhTW9kZWxPcGVyYXRpb25zIG5vdyBndWFyYW50ZWUgdGhlIEphdmFNb2RlbCBpcyB1cCB0byBkYXRlIHdoZW4gbm90aWZ5aW5nIHRoZSBKYXZhIG1vZGVsIGNoYW5nZSBsaXN0ZW5lcnMuIEluIHBhcnRpY3VsYXIsCi0JYSBidWlsZGVyIHJ1bm5pbmcgYWZ0ZXIgdGhlIEphdmEgYnVpbGRlciB3aWxsIGJlIGFibGUgdG8gcXVlcnkgdGhlIEphdmEgbW9kZWwgd2l0aCByZXNwZWN0IHRvIHRoZSBjaGFuZ2VzIGludHJvZHVjZWQgdGhyb3VnaCBKYXZhIG1vZGVsCi0Jb3BlcmF0aW9ucyAoZXhjZXB0IGZvciBpbmRleCBxdWVyaWVzKS4gVGhpcyB3YXMgbmV2ZXIgZ3VhcmFudGVlZCBpbiAxLjAsIGJ1dCBpbmRpcmVjdGx5IG9jY3VycmVkIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBwcmV2aW91cyBKYXZhCi0JYnVpbGRlciBpbXBsZW1lbnRhdGlvbiBkaWQgZm9yY2UgdG8gcmVmcmVzaCB0aGUgSmF2YSBtb2RlbCB3aGlsZSBidWlsZGluZy4gPC9saT4KLQk8bGk+Q2xhc3NwYXRoIENvbnRhaW5lciBFbmhhbmNlbWVudCAoYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9+Y2hlY2tvdXR+L29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvY2xhc3NwYXRoJTIwY29udGFpbmVyL2NsYXNzcGF0aENvbnRhaW5lci5odG1sIj5ub3RlczwvYT4pOgotCTxicj5BZGRlZCBuZXcgdHlwZSBvZiBjbGFzc3BhdGggZW50cnkgKDxjb2RlPkNQRV9DT05UQUlORVI8L2NvZGU+KSwgKHNlZSBwcm9wb3NhbCBoZXJlKSBzbyBhcyB0byBiZXR0ZXIgZW5jYXBzdWxhdGUgY2xpZW50IGRlZmluZWQgbGlicmFyaWVzLgotCVR5cGljYWxseSwgVk0gaW5zdGFsbHMgd291bGQgdXNlIGNsYXNzcGF0aCBjb250YWluZXJzIGluc3RlYWQgb2YgY2xhc3NwYXRoIHZhcmlhYmxlcyAoPGNvZGU+SlJFX0xJQjwvY29kZT4pIHNvIGFzIHRvIGJldHRlciBkZXNjcmliZSB0aGUgY29ycmVzcG9uZGluZwotCXNldCBvZiBsaWJyYXJpZXMgKGluY2x1ZGluZyBleHRlbnNpb24gZGlycykgdG8gYmUgcGxhY2VkIG9uIHRoZSBidWlsZCBwYXRoLiAKLQk8cD5OZXcgQVBJcyBhZGRlZCB0byByZWZsZWN0IHRoaXMgYWRkaXRpb246Ci0JPHVsPgotCTxsaT48Y29kZT5KYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShJUGF0aCBjb250YWluZXJQYXRoKTwvY29kZT48L2xpPgotCTxsaT48Y29kZT5KYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShJUGF0aCBjb250YWluZXJQYXRoLCBib29sZWFuIGlzRXhwb3J0ZWQpPC9jb2RlPjwvbGk+Ci0JPGxpPjxjb2RlPkphdmFDb3JlLmNsYXNzcGF0aENvbnRhaW5lckNoYW5nZWQoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFFbGVtZW50IHNjb3BlKSA8L2NvZGU+PC9saT4KLQk8bGk+PGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVyUmVzb2x2ZXIgPC9jb2RlPjwvbGk+Ci0JPC91bD4KLQk8L2xpPgotCTxsaT5ET00vQVNUOjxicj5BIG5ldyB0eXBlIG9mIG5vZGUgaGFzIGJlZW4gYWRkZWQgdG8gaGFuZGxlIHByb3Blcmx5IHRoZSBpbnN0YW5jZW9mIGV4cHJlc3Npb24uIFNvIHRoZSBuZXcgSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSAKLQlyZXBsYWNlZCB0aGUgdXNhZ2Ugb2YgSW5maXhFeHByZXNzaW9uIHdpdGggdGhlIG9wZXJhdG9yIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTlNUQU5DRU9GLiBUaGlzIG9wZXJhdG9yIGhhcyBiZWVuCi0JZGVwcmVjYXRlZCBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgcmVtb3ZlZCBmb3IgdGhlIG5leHQgaW50ZWdyYXRpb24gYnVpbGQuIFNlZSBidWcgPEEgSFJFRj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ1MyI+MTQ0NTM8L2E+LjwvbGk+Cis8bGk+U2VhcmNoIGZvciBjb25zdHJ1Y3RvciByZWZlcmVuY2VzIG5vdyBmaW5kcyBpbXBsaWNpdCBjb25zdHJ1Y3RvciBjYWxscy4gSW5kZXhlcyBpbiBvbGQgd29ya3NwYWNlcyBhcmUgcmVjb21wdXRlZCB3aGVuIHJlc3RhcnRlZCB3aGljaCBtYXkgcmVzdWx0IGluIGxvbmdlciBzdGFydHVwIHRpbWVzLiAKKzwvbGk+CiA8L3VsPgogCiA8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ij4xMzgwNzwvYT4KLW51bGwgYmluZGluZyByZXR1cm5lZCBmb3IgZnVsbHkgcXVhbGlmaWVkIGFycmF5IGRlY2xhcmF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDAzIj4xNDQwMzwvYT4KLWFzdDogZXhjZXB0aW9uIG9uIGNyZWF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjI5Ij4xNDIyOTwvYT4KLUZhaWx1cmUgd3JpdGluZyB0byBhIHJlYWQgb25seSAucHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTA1Ij4xMzkwNTwvYT4KLWNoYW5nZXMgdG8gcmVhZC1vbmx5IC5jbGFzc3BhdGggZmlsZSBhcmUgbm90IHRocm93biBvdXQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTY1Ij42MTY1PC9hPgotaGFuZGxlIHJlYWQtb25seSBjbGFzcyBwYXRoIGZpbGUgaW4gYSBncmFjZWZ1bCB3YXkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMyMiI+MTQzMjI8L2E+Ci1BU1QvRE9NIDogSVZhcmlhYmxlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpIGZvciAnbGVuZ3RoJyBmaWVsZCBvZiBhbiBhcnJheSByZXR1cm4gbnVsbCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM0MyI+MTQzNDM8L2E+Ci1DbGFzc0ZpbGVSZWFkZXIuZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSBzaG91bGQgcmV0dXJuIG51bGwgZm9yIGFub255bW91cyB0eXBlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNjMiPjEyMzYzPC9hPgotQmV0dGVyIGludGVncmF0aW9uIG9mIHRoZSBiYXRjaCBjb21waWxlciB3aXRoIGFudCBqYXZhYyB0YXNrIG9wdGlvbiAtZXh0ZGlycyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDIxNyI+MTQyMTc8L2E+Ci1ET00vQVNUOiB3cm9uZyBzdGFydCBwb3NpdGlvbiBmb3IgZXhwcmVzc2lvbiBzdGF0ZW1lbnQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMDYiPjE0MTA2PC9hPgotRGVjbGFyYXRpb25zIGluIEhpZXJhcmNoeSBkb2VzIG5vdCBmaW5kIGRlY2xhcmF0aW9ucyBpbiBoaWVyYXJjaHkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDYwIj4xMzA2MDwvYT4gCi1UeXBlIGhpZXJhcmNoeSBvbiByZWdpb24gcG9wdWxhdGVzIEphdmEgTW9kZWwgY2FjaGUgZm9yIHR5cGVzIGluIHRoZSByZWdpb24gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTE3Ij4xNDExNzwvYT4KLU5QRSBpbXBvcnRpbmcgYmluYXJ5IHByb2plY3RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNzIiPjE0MTcyPC9hPgotQnVpbGRlciBpcyBzZXR0aW5nIHNvdXJjZSByZXNvdXJjZXMgYXMgZGVyaXZlZCEKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY2Ij4zMjY2PC9hPgotQ2hhbmdpbmcga2luZCBvZiBjbGFzc3BhdGggZW50cnkgcmVwb3J0cyAxIGRlbHRhICgxR0RUUlRQKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzEiPjEzMjMxPC9hPgotUXVpY2sgRml4OiB3cm9uZyBwcm9wb3NhbCAKLQotPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxNDEiPjE0MTQxPC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gZHVyaW5nIHNlYXJjaCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MzEiPjEzODMxPC9hPgotTlBFIGluIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MTQiPjEyOTE0PC9hPgotQ29tcGlsZXIgY2Fubm90IHJlc29sdmUgamF2YXgubmV0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NjQiPjEzOTY0PC9hPgotRXhjZXB0aW9uIG9uIHN0YXJ0dXAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE5OCI+MTQxOTg8L2E+Ci1BU1Q6IENhc3RFeHByZXNzaW9uLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpIGlzIG51bGwKKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDQ5Ij4yNDQ0OTwvYT4KK0FTVDogUmVzb2x2ZSBvbiBmaWVsZCBhY2Nlc3MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ1MyI+MjQ0NTM8L2E+Cithc3Q6IHByb2JsZW1zIHdpdGggbWlzc2luZyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTEyIj4yMzExMjwvYT4gIAorc2VhcmNoOiBuZWVkIGEgd2F5IHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlcyB0byB0aGUgaW1wbGljaXQgbm9uLWFyZyBjb25zdHJ1Y3RvciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NDAiPjI0NDQwPC9hPgorTlBFIHdoZW4gY29tcGxldGUgcXVhbGlmaWVkIGFsbG9jYXRpb24gZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDA2Ij4yNDQwNjwvYT4KK0FTVDogUmVzb2x2ZSBvbiBtZXRob2QgaW52b2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0Mzc2Ij4yNDM3NjwvYT4gIAorQXR0ZW1wdCB0byBjaGFuZ2UgcmVzb3VyY2Ugd2hpbGUgdHJlZSBsb2NrZWQgZHVyaW5nIGNvbnRhaW5lciBpbml0aWFsaXphdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzQ2Ij4yNDM0NjwvYT4gIAorTWV0aG9kIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBpbiBmaWVsZCBpbml0aWFsaXplciAgCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MzkiPjEzOTM5PC9hPgotREJDUzogbm8gZXJyb3IgbWVzc2FnZSB0byBpbnZhbGlkIGNoYXJhY3RlciBpbiBqYXZhIHNvdXJjZSAKLTxoMT4KK0RCQ1M6IG5vIGVycm9yIG1lc3NhZ2UgdG8gREJDUyB3aGl0ZXNwYWNlIGluIGphdmEgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4MjkiPjIzODI5PC9hPiAgCitJVHlwZTo6cmVzb2x2ZVR5cGUgaW5jb3JyZWN0bHkgcmV0dXJucyBudWxsICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjU0MSI+MjI1NDE8L2E+ICAKK0pEVCBjb3JlIHRlc3Qgc3VpdGVzIHNob3VsZCBiZSBvbiBkZXYuZWNsaXBzZS5vcmcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTciPjI4NTc8L2E+ICAKK1JlbmFtaW5nIC5qYXZhIGNsYXNzIHdpdGggZXJyb3JzIHRvIC50eHQgbGVhdmVzIGVycm9ycyBpbiBUYXNrIGxpc3QgKDFHSzA2UjMpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDI0NSI+MjQyNDU8L2E+ICAKK0lKYXZhU2VhcmNoU2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzIGRvYyBtaXNsZWFkaW5nLCBoYXJkIHRvIHVzZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxNDAiPjI0MTQwPC9hPiAgCitTZWFyY2hpbmcgZm9yIHJlZmVyZW5jZXMgdG8gYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBoZWlyYXJjaHkgc2VlbXMgdmVyeSBzbG93ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDI2OCI+MjQyNjg8L2E+CitET006IE5QRSBpbiBOYWl2ZUFTVEZsYXR0ZW5lciN2aXNpdChTd2l0Y2hDYXNlIG5vZGUpCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjQ0Ij4yMzY0NDwvYT4gIAoraGllcmFyY2h5OiBnZXRBbGxTdXBlclR5cGVzIGRvZXMgbm90IGluY2x1ZGUgYWxsIHN1cGVyaW50ZXJmYWNlcz8gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTkzIj4yMzU5MzwvYT4gIAorc2VhcmNoOiBzdHJhbmdlIG1ldGhvZCByZWZlcmVuY2UgbWF0Y2ggZm91bmQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0ODkiPjg0ODk8L2E+CitzcGFjZSBpbnN0ZWFkIG9mIHRhYgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzcwIj4yNDM3MDwvYT4gIAorU2VyaWFsVUlECis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyMDUiPjI0MjA1PC9hPiAgCitUeXBlSGllcmFyY2h5IG9taXRzIHN1YnR5cGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM3NSI+MjQzNzU8L2E+CitDYXN0aW5nIG9mIHByaW1pdGl2ZSBmaW5hbCBmaWVsZHMgdG8gaXRzIG93biB0eXBlIGNhdXNlcyBWZXJpZnlFcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTQ4Ij4yMjU0ODwvYT4KK0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZHVyaW5nIGpkdCBpbmRleGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzQ3Ij4yNDM0NzwvYT4KK0FTVDogUmVzb2x2ZSBvbiB0eXBlIG5hbWUgcXVhbGlmaWVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMTEiPjIzMjExPC9hPiAgCitCdWcgd2l0aCBzZWFyY2gvcmVmZXJlbmNlICEgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODk0Ij4yMjg5NDwvYT4gIAorSW1wcm9wZXJseSBmb3JtZWQgSUNvbXBpbGF0aW9uVW5pdD8gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI0Ij4yNDMyNDwvYT4gIAorQVNUOiBJVmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycyBub3Qgc2FtZSBhcyBpbiBzb3VyY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzkzMCI+MjM5MzA8L2E+CitFY2xpcHNlIGNyYXNoIHdoZW4gYSByZWJ1aWxkIHByb2plY3QgIT8/PworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTA1Ij4yMTkwNTwvYT4KK0NsYXNzIGZpbGUgZWRpdG9yIHNob3VsZCBpbmRpY2F0ZSB0aGF0IC5jbGFzcyBmaWxlIGlzIG1pc3NpbmcgZGVidWcgYXR0cmlidXRlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzQxIj4yMTc0MTwvYT4KK0Vycm9yIHdoaWxlIEJ1aWxkIGFuZCBkb2Vzbid0IGFsbG93IHRvIGNyZWF0ZSBTZXJ2ZXJQcm9qZWN0IGFsc28KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjM3NiI+MjIzNzY8L2E+CitQYXJlbnQgb2YgSmFyRW50cnlGaWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyNzQiPjI0Mjc0PC9hPgorQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGZyb20gc291cmNlIG1hcHBlciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2NzciPjIzNjc3PC9hPgoramF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3Igd2hlbiBzZXR0aW5nIGNsYXNzIHBhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDIzMyI+MjQyMzM8L2E+CitJbXBvc3NpYmxlIHRvIGNvbXBpbGUgcHJvamVjdHMgLSBmb2xsb3dpbmYgb2YgQlVHIDIyNTA5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyMzMiPjI0MjMzPC9hPgorSW5zdGFsbGVkIEpSRSBkZXRlY3Rpb24gZG9lc250IHdvcmsgY29ycmVjdGx5CisKKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTggLSAxOHRoIEFwcmlsIDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0MWEKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDFzdCBPY3RvYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjc2CiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci0JPGxpPkNoYW5naW5nIHRoZSBzb3VyY2UgYXR0YWNoZW1lbnQgb2YgYSBqYXIgd2lsbCBub3cgY29ycmVjdGx5IGZpcmUgc291cmNlCi0JCWF0dGFjaG1lbnQgamF2YSBkZWx0YXMuIFRoZSBmbGFncyBvZiB0aGVzZSBkZWx0YXMgYXJlOgotCQk8dWw+Ci0JCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VBVFRBQ0hFRDwvY29kZT4gaWYgYSBzb3VyY2UKLQkJCQloYXMgYmVlbiBhdHRhY2hlZCB0byBhIGphciBhbmQgbm8gc291cmNlIHByZXZpb3VzbHkgZXhpc3RlZC4KLQkJCTwvbGk+Ci0JCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VERVRBQ0hFRDwvY29kZT4gaWYgYSBzb3VyY2UKLQkJCQloYXMgYmVlbiBkZXRhY2hlZCBmcm9tIGEgamFyIGFuZCBubyBvdGhlciBzb3VyY2UgaGFzIGJlZW4gYXR0YWNoZWQuCi0JCQk8L2xpPgotCQkJPGxpPjxjb2RlPklKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFREVUQUNIRUQgfCBKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQ8L2NvZGU+IAotCQkJCWlmIGFuIGF0dGFjaGVkIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotCQkJPC9saT4KLQkJPC91bD4KLQk8L2xpPgorPGxpPlJlZ2lzdGVyZWQgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycyBhcmUgbm93IHRha2luZyBwcmVjZWRlbmNlIG9uIHZhbHVlcyBwZXJzaXN0ZWQgZHVyaW5nIHByZXZpb3VzIHNlc3Npb24uIFRoaXMgYWxsb3dzCitpbml0aWFsaXplcnMgdG8gcmViaW5kIHRoZWlyIHZhcmlhYmxlcyB3aGVuIHJlc3RhcnRpbmcgYSB3b3Jrc3BhY2UsIGFuZCB0aHVzIGZpeCB1cCB0aGVpciB2YWx1ZXMuIDwvbGk+CiA8L3VsPgogCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMjMiPjE0MDIzPC9hPgotTlBFIGluIGJ1aWxkIG5vdGlmaWVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTUiPjE0MTE1PC9hPgotQ2hhbmdpbmcgc291cmNlIGF0dGFjaG1lbnQgc2hvdWxkIG5vdCBmaXJlIGEgRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIIGRlbHRhICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA1NSI+MTQwNTU8L2E+Ci1OUEUgaW4gSmF2YU1vZGVsTWFuYWdlci5nZXRWYXJpYWJsZUFzWE1MU3RyaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMDciPjE0MDA3PC9hPgotU3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUgZG9lcyBub3QgZG8gVW5pY29kZSBlc2NhcGluZyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxMyI+MTQwMTM8L2E+Ci1Db21waWxlciBzaG91bGQgbm90IGNvbnNpZGVyICd0aGlzLkNPTlNUJyBhcyBjb25zdGFudCBleHByZXNzaW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMDgiPjE0MDA4PC9hPgotVmFyaWFibGVCaW5kaW5nLmdldFZhcmlhYmxlSWQgY29udGFpbnMgc3VzcGljaW91cyBjb2RlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTg5Ij4xMzk4OSA8L2E+Ci1QYWNrYWdlIHZpZXcgZG9lc24ndCByZWZyZXNoIGFmdGVyIEpSRSBzd2l0Y2hpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjU4OCI+MTI1ODg8L2E+Ci1Hb29kIG1hdGNoIG1hcmtlZCBhcyBwb3RlbnRpYWwgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMTQzIj4xMzE0MzwvYT4KLUJpbmFyeSBjb25zdHJ1Y3RvciBzZWFyY2ggZG9lcyBub3Qgd29yayAocmVmICYgZGVjbCkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ij4xMzgwNzwvYT4KLW51bGwgYmluZGluZyByZXR1cm5lZCBmb3IgZnVsbHkgcXVhbGlmaWVkIGFycmF5IGRlY2xhcmF0aW9uCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTAzIj4xNDEwMzwvYT4KLVRvbyBtYW55IGRlcGVuZGVudHMgZm91bmQgd2hlbiBpbmNyZW1lbnRhbGx5IHJlY29tcGlsaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4NCI+NDM4NDwvYT4KLVNldHRpbmcgY2xhc3NwYXRoIHZhcmlhYmxlcyBkb2VzIHR3byBidWlsZHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODUiPjMyODU8L2E+Ci1XaHkgZG9lcyBjaGFuZ2UgdGhlIHNvdXJjZSBhdHRhY2htZW50IHRyaWdnZXIgYSBidWlsZCAoMUdFSFhXMykgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTA2Ij4xMzkwNjwvYT4KLUNvbXBpbGVyIGRpZCBub3QgZGV0ZWN0IHVuY2F1Z2h0IGV4Y2VwdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDE5Ij4xNDAxOTwvYT4KLU5QRSB3aXRoIGNvZGUgYXNzaXN0IHdvcmtpbmcgaW4gYW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTI2MyI+OTI2MzwvYT4KLUNvZGUgYXNzaXN0IGNhbid0IHNlZSBvdGhlciBwcm9qZWN0J3MgY2xhc3MgZm9sZGVycyAgCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTk0Ij4yMzU5NDwvYT4gIAorY29kZSByZXNvbHZlOiBpbmNvcnJlY3RseSByZXNvbHZpbmcgbWV0aG9kIGludm9jYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTc2MyI+MjE3NjM8L2E+ICAKK1Byb2JsZW0gaW4gSmF2YSBzZWFyY2ggW3NlYXJjaF0gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODQ2Ij4yMjg0NjwvYT4gIAorQ2Fubm90IGFkZCBpbiBhIG5ldyBjbGFzc3BhdGggZW50cnkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTk3Ij4yMDE5NzwvYT4gIAorQ2xhc3NwYXRoIFZhcmlhYmxlcyBwcmVmIHBhZ2UgZG9lcyBub3QgcmVmcmVzaCB3aXRoIGxhdGVzdCB2YXJpYWJsZXMgW2J1aWxkIHBhdGhdICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDEzNCI+MjQxMzQ8L2E+CitKRFRDb21waWxlcnRBZGFwdGVyIGRvZXNuJ3QgdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gY29tcGlsZSBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MDAxIj4yNDAwMTwvYT4KK0NsYXNzcGF0aCB2YXJpYWJsZS9jb250YWluZXIgaW5pdGlhbGl6ZXIgc2hvdWxkIGFjdGl2YXRlIAogCi08aDE+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzY1NiI+MjM2NTY8L2E+ICAKK2hpZXJhcmNoeTogdHlwZSBoaWVyYXJjaHkgb24gaW50ZXJmYWNlcyBkb2VzIG5vdCBjb250YWluIE9iamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4OTAiPjIzODkwPC9hPiAgCitDaGFuZ2luZyBQYWNrYWdlIERlY2xhcmF0aW9ucyB0cmlnZ2VycyBmdWxsIHByb2plY3QgcmVidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTcyIj4yNDE3MjwvYT4gIAorU3RyYW5nZSBiZWhhdmlvciB3aXRoIHdyb25nIHBhY2thZ2UgZGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDA5MyI+MjQwOTM8L2E+CitOUEUgaW4gSmF2YSBCdWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0NDUiPjIyNDQ1PC9hPgorQ29tcGlsZXIgaW5jb25zaXN0ZW50IHdpdGggamF2YWMgd2hlbiBjb2RlIHJldHVybnMgZnJvbSBpbnNpZGUgYSBmaW5hbGx5IHt9IGJsb2NrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQxODkiPjI0MTg5PC9hPgorbmVlZCBhIHdheSB0byAgdmVyaWZ5IHRoYXQgYSBzdHJpbmcgY2FuIGJlIGEgdHlwZSBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5MjUiPjIzOTI1PC9hPgorQ2xhc3MgcGF0aCB2YXJzIG1pc3NpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDIxMCI+MjQyMTA8L2E+CitOUEUgcmVuYW1pbmcgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTY0Ij4yNDE2NDwvYT4KK0Nhbm5vdCB1c2UgYSBzcGVjaWYgcnQuamFyIGZvciBhIHNwZWNpZmljIEphdmEgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTg5Ij4yMzk4OTwvYT4KK0J1aWxkIFBhdGggcGFnZSByZXBvcnRzIGN5Y2xlIGV2ZW4gaWYgdGhlcmUgaXMgbm9uZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzU0Ij4yMjc1NDwvYT4KK0pSRS1TZXR0aW5ncyBpbmRlcGVuZGVudCBmb3IgZWFjaCBwcm9qZWN0CisKKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTYgLSAxNnRoIEFwcmlsIDIwMDIgLSBNSUxFU1RPTkUgNQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDAKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDI2dGggU2VwdGVtYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjc1CiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08bGk+IENoYW5nZWQgdGhlIHBhY2thZ2UgZnJhZ21lbnQgY2FjaGluZyBwb2xpY3kgc28gYXMgdG8gYWNjb21vZGF0ZSBsYXJnZSB3b3Jrc3BhY2VzLiBJdCB1c2VkIHRvIGJlIGFuIG92ZXJmbG93aW5nIExSVSBjYWNoZSBvZiBzaXplIDEwMDAKLXBhY2thZ2UgZnJhZ21lbnRzLiBJdCBub3cgaXMgYSBzaW1wbGUgdGFibGUsIHdoaWNoIGlzIG5ldmVyIGVtcHRpZWQgaW1wbGljaXRseSBhbnkgbG9uZ2VyLiBNZW1vcnkgb3ZlcmhlYWQgbG9va3MgbmVnbGlnZWFibGUsIGFuZCBpdCBhbGxvd3MgdG8KLWRlYWwgbXVjaCBiZXR0ZXIgd2l0aCB2ZXJ5IGxhcmdlIHdvcmtzcGFjZXMuIE90aGVyIHNpbWlsYXIgaW1wcm92ZW1lbnRzIHdlcmUgbWFkZSBvbiB0aGUgc2FtZSBmcm9udCBzbyBhcyB0byBpbXByb3ZlIEpSRSBzd2l0Y2hpbmcgd2l0aCBzdWNoCi13b3Jrc3BhY2VzLgorPC91bD4KIAorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDA4MyI+MjQwODM8L2E+CitOUEUgYWNjZXNzaW5nIEphdmFQcm9qZWN0IHByZWZlcmVuY2VzCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAyNHRoIFNlcHRlbWJlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3NAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIG5ldyBBUEkgZmluZERlY2xhcmluZ05vZGUoU3RyaW5nKSBvbiBDb21waWxhdGlvblVuaXQuIFRoaXMgbmV3IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byByZXRyaWV2ZSBBU1ROb2RlCitkZWNsYXJlZCBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQuIFNlZSBqYXZhZG9jIGZvciBmdXJ0aGVyIGRldGFpbHMgb3IgYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzM0Ij4yMzczNDwvYT4uCiA8L2xpPgotPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50IGdvdCBhZGRlZCBub3Rpb24gb2YgdHlwZSAoc2ltaWxhciB0byBJUmVzb3VyY2VDaGFuZ2VFdmVudCksIHNvIGFzIHRvIGJldHRlcgotYWxsb3cgY2xpZW50cyB0byByZWFjdCB0byBKYXZhTW9kZWwgY2hhbmdlczogCi0JPHVsPiAKLQkJPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIDogIAorPGxpPiBOZXcgQVBJcyBhZGRlZCBvbnRvIElKYXZhUHJvamVjdCB0byBlbmFibGUgcHJvamVjdCBjdXN0b20gb3B0aW9ucy4gUHJvamVjdCBjdXN0b20gb3B0aW9ucyBhcmUgcGVyc2lzdGVkIGludG8gYSBmaWxlICIuanByZWZzIiAKK2xvY2F0ZWQgaW5zaWRlIHRoZSBwcm9qZWN0IG1ldGFkYXRhIEpEVC9Db3JlIHBsdWdpbiBsb2NhdGlvbi4gUHJvamVjdCBjYW4gYmUgc3BlY2lmaWVkIGN1c3RvbSBvcHRpb25zLCBhbmQgaW5oZXJpdCBnbG9iYWwgb25lcyBmcm9tIEphdmFDb3JlLgorQXQgdGhpcyBwb2ludCwgaXQgaXMgdW5jbGVhciB3aGV0aGVyIHdlIHdpbGwgYXR0ZW1wdCB0byBzaGFyZSB0aGVzZSBjdXN0b20gcHJvcGVydGllcyAobGlrZSAuY2xhc3NwYXRoIGZpbGUpLgorCTx1bD4KKwkJPGxpPgogPHByZT4KIAkvKioKLQkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdCAKLQkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCi0JICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAotCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCi0JICoKLQkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIFBPU1RfQ0hBTkdFCi0JICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiwgYW5kIGNvbnRhaW5zIGEgZnVsbCBkZWx0YSBhY2NvdW50aW5nIGZvcgotCSAqIGFueSBKYXZhTW9kZWwgb3BlcmF0aW9uICBhbmQvb3IgcmVzb3VyY2UgY2hhbmdlLgotCSAqCi0JICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlRXZlbnQKLQkgKiBAc2VlICNnZXREZWx0YQotCSAqIEBzaW5jZSAyLjAKKwkgKiBIZWxwZXIgbWV0aG9kIGZvciByZXR1cm5pbmcgb25lIG9wdGlvbiB2YWx1ZSBvbmx5LiBFcXVpdmFsZW50IHRvIDxjb2RlPihTdHJpbmcpdGhpcy5nZXRPcHRpb25zKGluaGVyaXRKYXZhQ29yZU9wdGlvbnMpLmdldChvcHRpb25OYW1lKTwvY29kZT4KKwkgKiBOb3RlIHRoYXQgaXQgbWF5IGFuc3dlciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wdGlvbiBkb2VzIG5vdCBleGlzdCwgb3IgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIHZhbHVlIGZvciBpdC4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogPC9wPgorCSAqIEBwYXJhbSBvcHRpb25OYW1lIHRoZSBuYW1lIG9mIGFuIG9wdGlvbgorCSAqIEBwYXJhbSBpbmhlcml0SmF2YUNvcmVPcHRpb25zIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgSmF2YUNvcmUgb3B0aW9ucyBzaG91bGQgYmUgaW5oZXJpdGVkIGFzIHdlbGwKKwkgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgb2YgYSBnaXZlbiBvcHRpb24KKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfQ0hBTkdFID0gMTsKLTwvcHJlPgotCQk8L2xpPgotCi0JCTxsaT4gRWxlbWVudENoYW5nZWRFdmVudC5QUkVfQVVUT19CVUlMRCAKLTxwcmU+Ci0JLyoqCi0JICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCi0JICogcmVwb3J0IG9mIGNyZWF0aW9ucywgZGVsZXRpb25zLCBhbmQgbW9kaWZpY2F0aW9ucwotCSAqIHRvIG9uZSBvciBtb3JlIEphdmEgZWxlbWVudChzKSBleHByZXNzZWQgYXMgYSBoaWVyYXJjaGljYWwKLQkgKiBqYXZhIGVsZW1lbnQgZGVsdGEgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0RGVsdGE8L2NvZGU+LgotCSAqCi0JICogTm90ZTogdGhpcyBub3RpZmljYXRpb24gb2NjdXJzIGR1cmluZyB0aGUgY29ycmVzcG9uZGluZyBQUkVfQVVUT19CVUlMRAotCSAqIHJlc291cmNlIGNoYW5nZSBub3RpZmljYXRpb24uIFRoZSBkZWx0YSB3aGljaCBpcyBub3RpZmllZCBoZXJlIG9ubHkgY29udGFpbnMKLQkgKiBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgSmF2YU1vZGVsIG9wZXJhdGlvbnMgKGkuZS4gaWdub3JlcyB0aGUKLQkgKiBwb3NzaWJsZSByZXNvdXJjZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkIG91dHNpZGUgSmF2YSBvcGVyYXRpb25zKS4gSW4KLQkgKiBwYXJ0aWN1bGFyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBKYXZhTW9kZWwgYmUgaW5jb25zaXN0ZW50IHdpdGggcmVzcGVjdCB0bwotCSAqIHJlc291cmNlcyB3aGljaCBnb3QgbW9kaWZpZWQgb3V0c2lkZSBKYXZhTW9kZWwgb3BlcmF0aW9ucyAoaXQgd2lsbCBvbmx5IGJlCi0JICogZnVsbHkgY29uc2lzdGVudCBvbmNlIHRoZSBQT1NUX0NIQU5HRSBub3RpZmljYXRpb24gaGFzIG9jY3VyZWQpLgotCSAqIAotCSAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUV2ZW50Ci0JICogQHNlZSAjZ2V0RGVsdGEKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX0FVVE9fQlVJTEQgPSAyOwotPC9wcmU+Ci0JCTwvbGk+Ci0KLQkJPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50LlJFQ09OQ0lMRSAKLTxwcmU+Ci0JLyoqCi0JICogRXZlbnQgdHlwZSBjb25zdGFudCAoYml0IG1hc2spIGluZGljYXRpbmcgYW4gYWZ0ZXItdGhlLWZhY3QgCi0JICogcmVwb3J0IG9mIGNyZWF0aW9ucywgZGVsZXRpb25zLCBhbmQgbW9kaWZpY2F0aW9ucwotCSAqIHRvIG9uZSBvciBtb3JlIEphdmEgZWxlbWVudChzKSBleHByZXNzZWQgYXMgYSBoaWVyYXJjaGljYWwKLQkgKiBqYXZhIGVsZW1lbnQgZGVsdGEgYXMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0RGVsdGE8L2NvZGU+LgotCSAqCi0JICogTm90ZTogdGhpcyBub3RpZmljYXRpb24gb2NjdXJzIGFzIGEgcmVzdWx0IG9mIGEgd29ya2luZyBjb3B5IHJlY29uY2lsZQotCSAqIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKLQkgKiBAc2VlIElSZXNvdXJjZUNoYW5nZUV2ZW50Ci0JICogQHNlZSAjZ2V0RGVsdGEKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9SRUNPTkNJTEUgPSA0OwkKLTwvcHJlPgotCQk8L2xpPgotCTwvdWw+Ci08L2xpPgkKLTxsaT4JCi0JQWxzbyBhZGRlZCBhIGNvcnJlc3BvbmRpbmcgQVBJIG9uIEphdmFDb3JlIHNvIGFzIHRvIGFsbG93IHJlZ2lzdGVyaW5nIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBldmVudC4KLQk8cHJlPgotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIEFmdGVyIGNvbXBsZXRpb24gb2YgdGhpcyBtZXRob2QsIHRoZSBnaXZlbiBsaXN0ZW5lciB3aWxsIGJlIHJlZ2lzdGVyZWQgZm9yIGV4YWN0bHkgdGhlCi0JICogdGhlIHNwZWNpZmllZCBldmVudHMuICBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSByZWdpc3RlcmVkIGZvciBvdGhlciBldmVudHMsIHRoZXkKLQkgKiB3aWxsIGJlIGRlcmVnaXN0ZXJlZC4gIAotCSAqCi0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgdG8KLQkgKiBqYXZhIGVsZW1lbnRzIGluIHRoZSBtb2RlbC4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlIAotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVwbGFjZWQgb3IgcmVtb3ZlZC4gCi0JICogCi0JICogTGlzdGVuZXJzIGNhbiBsaXN0ZW4gZm9yIHNldmVyYWwgdHlwZXMgb2YgZXZlbnQgYXMgZGVmaW5lZCBpbiA8Y29kZT5FbGVtZW50Q2hhbmdlRXZlbnQ8L2NvZGU+LgotCSAqIENsaWVudHMgYXJlIGZyZWUgdG8gcmVnaXN0ZXIgZm9yIGFueSBudW1iZXIgb2YgZXZlbnQgdHlwZXMgaG93ZXZlciBpZiB0aGV5IHJlZ2lzdGVyCi0JICogZm9yIG1vcmUgdGhhbiBvbmUsIGl0IGlzIHRoZWlyIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGV5IGNvcnJlY3RseSBoYW5kbGUgdGhlCi0JICogY2FzZSB3aGVyZSB0aGUgc2FtZSBqYXZhIGVsZW1lbnQgY2hhbmdlIHNob3dzIHVwIGluIG11bHRpcGxlIG5vdGlmaWNhdGlvbnMuICAKLQkgKiBDbGllbnRzIGFyZSBndWFyYW50ZWVkIHRvIHJlY2VpdmUgb25seSB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLgotCSAqCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGJpdC13aXNlIE9SIG9mIGFsbCBldmVudCB0eXBlcyBvZiBpbnRlcmVzdCB0byB0aGUgbGlzdGVuZXIKLQkgKiBAc2VlIElFbGVtZW50Q2hhbmdlTGlzdGVuZXIKLQkgKiBAc2VlIEVsZW1lbnRDaGFuZ2VFdmVudAotCSAqIEBzZWUgI3JlbW92ZUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcgotCSAqCUBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykKLQk8L3ByZT4KLQotPC9saT4JCi08L3VsPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNTMiPjEyMzUzPC9hPgotRG9jdW1lbnRBZGFwdGVyIGNhbiBuZXZlciBiZSBjbG9zZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjI4Ij45NjI4PC9hPgotU3dpdGNoaW5nIEpSRSBpcyBzbG93Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1ODUiPjExNTg1PC9hPgotTGFyZ2UgIyBvZiBwcm9qZWN0cyBsb2NrIGVzc2VudGlhbCBvcGVyYXRpb25zIGluIHRoZSBXb3Jrc3BhY2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM5MyI+MTMzOTM8L2E+Ci1FeHRyZW1lbHkgcG9vciBqYXZhIGVkaXRvciBwZXJmb3JtYW5jZSBpbiAyMDAyMDQweAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjMzIj4xMzIzMzwvYT4KLUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiBldmFsdWF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNjI1Ij4xMzYyNTwvYT4KLVJlbW92ZSBkZXByZWNhdGVkIG1ldGhvZCBmcm9tIEFTVC9ET00gCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTkzIj4xMzU5MzwvYT4KLUNvZGUgRm9ybWF0dGVyIGZvcm1hdHMgc3luY2hyb25pemVkIGluY29ycmVjdGx5LiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkyMSI+MTI5MjE8L2E+Ci1CdWlsZCBzb21ldGltZXMgYnVpbGRzIGZpbGVzIHRoYXQgaGF2ZSBub3QgY2hhbmdlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTIyIj4xMzUyMjwvYT4KLU5QRSBvbiBhbm9ueW1vdXMgY2xhc3MgY29kZSBhc3Npc3QuCi0KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDExIC0gMTF0aCBBcHJpbCAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzkKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5BZGRlZCBhIGZpcnN0IHByb3Bvc2FsIGZvciAuY2xhc3MgZmlsZSByZWFkaW5nIEFQSXMuIFRoaXMgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtaWdodCBjaGFuZ2Ugc2xpZ2h0bHkuCi1TZWUgbmV3IEFQSSBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLgotPHVsPgotPGxpPkJ5dGVDb2RlVmlzaXRvckFkYXB0ZXI8L2xpPgotPGxpPkNsYXNzRm9ybWF0RXhjZXB0aW9uPC9saT4KLTxsaT5EZWNvZGluZ0ZsYWc8L2xpPgotPGxpPklBdHRyaWJ1dGVOYW1lc0NvbnN0YW50czwvbGk+Ci08bGk+SUJ5dGVjb2RlVmlzaXRvcjwvbGk+Ci08bGk+SUNsYXNzRmlsZUF0dHJpYnV0ZTwvbGk+Ci08bGk+SUNsYXNzRmlsZURpc2Fzc2VtYmxlciBhbmQgVG9vbEZhY3RvcnkjY3JlYXRlRGVmYXVsdENsYXNzRmlsZURpc2Fzc2VtYmxlcjwvbGk+IAotPGxpPklDbGFzc0ZpbGVSZWFkZXI8L2xpPgotPGxpPklDb2RlQXR0cmlidXRlPC9saT4KLTxsaT5JQ29uc3RhbnRQb29sPC9saT4KLTxsaT5JQ29uc3RhbnRQb29sQ29uc3RhbnQ8L2xpPgotPGxpPklDb25zdGFudFBvb2xFbnRyeTwvbGk+Ci08bGk+SUNvbnN0YW50VmFsdWVBdHRyaWJ1dGU8L2xpPgotPGxpPklFeGNlcHRpb25BdHRyaWJ1dGU8L2xpPgotPGxpPklFeGNlcHRpb25UYWJsZUVudHJ5PC9saT4KLTxsaT5JRmllbGRJbmZvPC9saT4KLTxsaT5JSW5uZXJDbGFzc2VzQXR0cmlidXRlPC9saT4KLTxsaT5JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnk8L2xpPgotPGxpPklMaW5lTnVtYmVyQXR0cmlidXRlPC9saT4KLTxsaT5JTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZTwvbGk+Ci08bGk+SUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5PC9saT4KLTxsaT5JTWV0aG9kSW5mbzwvbGk+Ci08bGk+SU1vZGlmaWVyQ29uc3RhbnRzPC9saT4KLTxsaT5JT3Bjb2RlTW5lbW9uaWNzPC9saT4KLTxsaT5JU291cmNlQXR0cmlidXRlPC9saT4KLTxsaT5PcGNvZGVTdHJpbmdWYWx1ZXM8L2xpPgotPC91bD4KLVRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBhcmUgaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC4gQW55IGNvbW1lbnQgaXMgd2VsY29tZSBhbmQgcmVsYXRlZCBidWdzIAotc2hvdWxkIGJlIGVudGVyZWQgaW4gSkRUL0NvcmUuCi08bGk+QWRkZWQgY2hhciBhcnJheSBiYXNlZCBBUElzIG9uIFNpZ25hdHVyZS4gVGhpcyBBUElzIGF2b2lkIGNyZWF0aW5nIG5lZWRsZXNzIFN0cmluZ3MgYW5kCi0JYXJlIHRodXMgbXVjaCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB0aGVpciBTdHJpbmcgYmFzZWQgZXF1aXZhbGVudC4KLQk8dWw+Ci0JCTxsaT48Y29kZT5jcmVhdGVBcnJheVNpZ25hdHVyZShjaGFyW10sIGludCBhcnJheUNvdW50KTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+Y3JlYXRlQ2hhckFycmF5VHlwZVNpZ25hdHVyZShjaGFyW10sIGJvb2xlYW4pPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5jcmVhdGVNZXRob2RTaWduYXR1cmUoY2hhcltdW10sIGNoYXJbXSkgPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5nZXRBcnJheUNvdW50KGNoYXJbXSk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPmdldEVsZW1lbnRUeXBlKGNoYXJbXSk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPmdldFBhcmFtZXRlckNvdW50KGNoYXJbXSk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPmdldFBhcmFtZXRlclR5cGVzKGNoYXJbXSk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPmdldFF1YWxpZmllcihjaGFyW10pPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5nZXRSZXR1cm5UeXBlKGNoYXJbXSk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPmdldFNpbXBsZU5hbWUoY2hhcltdKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+Z2V0U2ltcGxlTmFtZXMoY2hhcltdKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+dG9DaGFyQXJyYXkoY2hhcltdLCBjaGFyW10sIGNoYXJbXVtdLCBib29sZWFuLCBib29sZWFuKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+dG9DaGFyQXJyYXkoY2hhcltdKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+dG9RdWFsaWZpZWROYW1lKGNoYXJbXVtdKTwvY29kZT48L2xpPgotCTwvdWw+Ci08L2xpPgotPGxpPlJlbW92ZWQgdGVtcG9yYXJ5IDIuMCBBUEkgd2hpY2ggd2VyZSBkZXByZWNhdGVkIGluIHByZXZpb3VzIGJ1aWxkczoKLQk8dWw+Ci0JCTxsaT48Y29kZT5JV29ya2luZ0NvcHkjZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPiwgdXNlIEFQSSB3aXRoIGV4dHJhIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5JV29ya2luZ0NvcHkjZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPiwgdXNlIEFQSSB3aXRoIGV4dHJhIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5JV29ya2luZ0NvcHkjcmVjb25jaWxlKElQcm9ibGVtUmVxdWVzdG9yKTwvY29kZT4sIHVzZSBBUEkgd2l0aCBubyA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT48L2xpPgotCTwvdWw+Ci08L2xpPgkKLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc2MiI+MTI3NjI8L2E+Ci1QZXJmb3JtYW5jZSAtIFNpZ25hdHVyZSNjcmVhdGVUeXBlU2lnbmF0dXJlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0ZXJtIG9mIGNoYXJbXSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2ODgiPjEyNjg4PC9hPgotTlBFIHdpdGggY29kZSBhc3Npc3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQwOCI+MTM0MDg8L2E+Ci1TdWJmb2xkZXJzIG9mIGJ1aWxkIGZvbGRlciBhcmUgbm90IG1hcmtlZCBhcyBkZXJpdmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzNTUiPjEzMzU1PC9hPgotTlBFIGR1cmluZyBjb2RlIGNvbXBsZXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM5MSI+MTMzOTE8L2E+Ci1OUEUgZG9pbmcgY29kZSBhc3Npc3QKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzQ4NyI+MTM0ODc8L2E+Ci1OUEUgaW4gQ29tcGxldGlvbkVuaWdlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzOTUiPjEzMzk1PC9hPgotbG9hZGluZyBzd3QrZXhhbXBsZXMgd2l0aCBhdXRvLWJ1aWxkIG9uIGNhdXNlcyBkZWFkbG9jayAob3IgdGFrZXMgYSB2ZXJ5IGxvbmcgdGltZSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA2MyI+MTMwNjM8L2E+Ci1OUEUgaW4gZXh0cmFjdCBtZXRob2QgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNDciPjEzMjQ3PC9hPgotSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFTVCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM4NiI+MTMzODY8L2E+Ci0nbm90IGltcGxlbWVudGVkIHlldCcgc3VyZmFjZWQgb24gRGlzcGxheSBpbiBkZWJ1ZyAKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2MTciPjEyNjE3PC9hPgotY29kZSBhc3Npc3Q6IFByb3Bvc2FscyBpbnNpZGUgbWV0aG9kIHBhcmFtZXRlcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjMzOCI+MTIzMzg8L2E+Ci1Vbm5lY2Vzc2FyeSByZWNvbXBpbGF0aW9uIHdoZW4gYWRkaW5nIHBhY2thZ2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIyNjIiPjEyMjYyPC9hPgotQ29tcGlsZXIgQnVnIHdpdGggaW1wb3J0IFN0YXRlbWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwODIiPjcwODI8L2E+Ci1OUEUgZHVyaW5nIGJ1aWxkCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQwOSAtIDl0aCBBcHJpbCAyMDAyIAotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzhhCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+QWRkaW5nIGEgbmV3IGVtcHR5IHNvdXJjZSBmb2xkZXIgbm8gbG9uZ2VyIGNhdXNlcyBhIGZ1bGwgYnVpbGQuIE9ubHkgYW4gaW5jcmVtZW50YWwgYnVpbGQgaXMgbmVlZGVkIG5vdy4KLTwvbGk+Ci08bGk+SmF2YSBtb2RlbCBBUEkgYWRkaXRpb25zOgotCTx1bD4KLQkJPGxpPjxjb2RlPklKYXZhRWxlbWVudC5nZXRBbmNlc3RvcihpbnQpPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5JSmF2YUVsZW1lbnQuZ2V0T3BlbmFibGUoKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50LmdldFBhdGgoKTwvY29kZT48L2xpPgotCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50LmdldFJlc291cmNlKCk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPklKYXZhUHJvamVjdC5pc09uQ2xhc3NwYXRoKElKYXZhRWxlbWVudCk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPklUeXBlLmZpbmRNZXRob2RzKElNZXRob2QpPC9jb2RlPjwvbGk+Ci0JCTxsaT48Y29kZT5JV29ya2luZ0NvcHkuZmluZEVsZW1lbnRzKElKYXZhRWxlbWVudCk8L2NvZGU+PC9saT4KLQkJPGxpPjxjb2RlPklXb3JraW5nQ29weS5maW5kUHJpbWFyeVR5cGUoKTwvY29kZT48L2xpPgotCTwvdWw+Ci08L2xpPgotPGxpPklDb21wbGV0aW9uUmVxdWVzdG9yIEFQSSBjaGFuZ2UgOgotCTx1bD4KLQkJPGxpPiBBZGRlZCAjYmVnaW5SZXBvcnRpbmcoKSBhbmQgI2VuZFJlcG9ydGluZygpIEFQSSBvbiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4uICNiZWdpblJlcG9ydGluZyBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSByZXN0YXJ0aW5nIGVycm9yIGRldGVjdGlvbi4gI2VuZFJlcG9ydGluZyBpcyBhbHdheXMgY2FsbGVkIGF0IHRoZQotCQkJCWVuZCBvZiBkZXRlY3Rpb24uCi0JCTwvbGk+Ci0JCTxsaT4gQWRkZWQgQVBJIGZvciBzZXR0aW5nIG11bHRpcGxlIGNsYXNzcGF0aCB2YXJpYWJsZXMgYXQgb25jZSAoPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoVmFyaWFibGVzPC9jb2RlPiwgdGhpcyBhbGxvd3MgdG8gdXBkYXRlCi0JCQlhbGwgYWZmZWN0ZWQgcHJvamVjdHMgZXhhY3RseSBvbmNlLCBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBtdWx0aXBsZSB0aW1lcyBvbiBlYWNoIHByb2plY3QgKGlmIGl0IHJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlKS4gVGhpcyBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJd2hlbiBzZXR0aW5nIEpSRSB2YXJpYWJsZXMuCi0JCTwvbGk+Ci0JCTxsaT4gQWRkZWQgYSBuZXcgcGFyYW1ldGVyIDxjb2RlPnJlbGV2YW5jZTwvY29kZT4gdG8gYmUgYWJsZSB0byBzb3J0IHByb3Bvc2FsIGJ5IGRlZ3JlZSBvZiByZWxldmFuY2UuCi0JCTxjb2RlPnJlbGV2YW5jZTwvY29kZT4gaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4KLQkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlCi0JCXZhbHVlIGlzIGhpZ2hlci4KLQkJPGJyPgotCQk8YnI+PHR0PklDb21wbGV0aW9uUmVxdWVzdG9yezwvdHQ+Ci0JCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+Ci0JCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRDbGFzcyguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgotCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0RXJyb3IoLi4uKTs8L3R0PgotCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0RmllbGQoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KLQkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdEludGVyZmFjZSguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgotCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0S2V5d29yZCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgotCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TGFiZWwoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KLQkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KLQkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdE1ldGhvZCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgotCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KLQkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdE1vZGlmaWVyKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+Ci0JCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRQYWNrYWdlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+Ci0JCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRUeXBlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+Ci0JCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KLQkJPGJyPjx0dD59PC90dD4KLQkJPGJyPgotCQk8YnI+CisJU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zKTsKKzwvcHJlPgkJCiAJCTwvbGk+CiAJCTxsaT4KLQkJSWYgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhbmQgcHJvcG9zYWwgYXJlIGVxdWFsIGFuZCB0aGUgY2FzZSBtYXRjaCB0aGVuIHRoZSBwcm9wb3NhbCByZWxldmFuY2UgZ3Jvdy4gTm90ZSB0aGF0IHRoaXMgaXNuJ3QgYSAxLjAgYnJlYWtpbmcgQVBJIGNoYW5nZSwgaXQKLQkJb25seSBhZmZlY3RzIHRoZSAyLjAgbmV3IGNvZGUgYXNzaXN0IEFQSSAoaS5lLiBzdGlsbCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggMS4wIGNsaWVudHMpIHdoaWNoIGhhc24ndCB5ZXQgcmVhY2hlZCBzdGFiaWxpdHksIHRob3VnaCBpdCBzaG91bGQgYmUgY2xvc2UgdG8gbm93LgotCQk8L2xpPgotCTwvdWw+Ci08L2xpPgkKLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYxNCI+MTI2MTQ8L2E+Ci1Jbml0aWFsaXppbmcgSlJFIHZhcmlhYmxlcyBzbG93IG9uIHBsdWctaW4gYWN0aXZhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTg2Ij4xMjk4NjwvYT4KLUNyZWF0aW5nIGEgd29ya2luZyBjb3B5IGRvZXMgbm90IGludm9sdmUgdGhlIHByb2JsZW0gcmVxdWVzdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4NTgiPjEyODU4PC9hPgotQ29tcGlsZXIgQnVnIDogSW52YWxpZCBCeXRlIENvZGU6IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzM5Ij4xMTczOTwvYT4KLURlYWQgYnJhbmNoZXMgaW4gcGFja2FnZS9wcm9qZWN0IEhpZXJhcmNoeSBWaWV3ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg3MyI+MTI4NzM8L2E+Ci1Db2RlQXNzaXN0IDogbWlzc2luZyAgcHJvcG9zYWwgb2YgbWV0aG9kIGRlY2xhcmF0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMDciPjEyMDA3PC9hPgotU291cmNlIGZvbGRlciBlbmRpbmcgd2l0aCAuamFyIGNvbnNpZGVyZWQgYXMgSkFSIGFyY2hpdmUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTA4Ij4xMjkwODwvYT4KLUJ1aWxkIGFuZCBzYXZlIGF0dGVtcHQgZmFpbCB3aXRoIE5QRSBhbmQgdHJ5aW5nIGl0IG1hbnkgdGltZXMgY3Jhc2hzIEVjbGlwc2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI0NiI+MTIyNDY8L2E+Ci1QYWNrYWdlcyB2aWV3IHNob3dzIC5jbGFzcyBhbmQgLmphdmEgZmlsZXMgd2hlbiBKQVIgaGFzIHNvdXJjZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0OSI+MzM0OTwvYT4KLU5lZWQgYSBJSmF2YUVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlIHRoYXQgZG9lcyBub3QgZG8gdGhlIGV4aXN0cyB0ZXN0ICgxR0o2OUdQKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTc1Ij4xMjk3NTwvYT4KLWphY2tzIC0gcXVhbGlmaWVkIGFzc2lnbm1lbnQgdG8gZmluYWwgZmllbGQgc2hvdWxkIGJlIHJlamVjdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NjkiPjEyOTY5PC9hPgotamFja3MgLSBzeW5jaHJvbml6ZWQgKHZvaWQgZXhwcmVzc2lvbikgc2hvdWxkIGJlIHJlamVjdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3MDUiPjEyNzA1PC9hPgotUHJvZ3Jlc3MgbW9uaXRvciBjdXRzIG9mZiBwYWNrYWdlIG5hbWUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc2NyI+MTI3Njc8L2E+Ci1BU1QgTWV0aG9kQmluZGluZyBxdWVzdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzkiPjkxNzk8L2E+Ci1EQ1I6IE5lZWQgSUphdmFTZWFyY2hTY29wZSBlcXVhbHMgb3IgZW5jbG9zZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ0Ij4xMjQ0NDwvYT4KLXN0cmFuZ2UgdHlwZXMgbmFtZXMgaW4gUmVvcmRlclBhcmFtZXRlcnMgZXJyb3IgZGlhbG9nIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzgxIj4xMjc4MTwvYT4KLUFTVCBpbnN0YW5jZW9mLUluZml4RXhwcmVzc2lvbjogQ2FudCByZXNvbHZlIHR5cGUgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NzgiPjEyNzc4PC9hPgotVHlwbyBpbiBjb21tZW50OiBJbmZpeEV4cHJlc3Npb24uUklHSFRfU0hJRlRfVU5TSUdORUQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjgiPjEyNzY4PC9hPgotSVNjYW5uZXIgZG9lc24ndCBsZXQgdXNlciBzdGF0ZSB3aGV0aGVyIGxpbmUgc2VwYXJhdG9ycyBhcmUgdG8gYmUgcmVjb3JkZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY1MSI+MTI2NTE8L2E+Ci1OUEUgb3V0IG9mIHRoZSBDb21wbGV0aW9uRW5naW5lCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjEiPjEyNzYxPC9hPgotQ2xvc2luZyBhIHRvcCBsZXZlbCBiaW5hcnkgdHlwZSBkb2Vzbid0IGNsb3NlIHRoZSBjbGFzcyBmaWxlcyBvZiBpdHMgaW5uZXIgdHlwZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzYwIj4xMjc2MDwvYT4KLVR5cGUgaGllcmFyY2h5IG1pc3NpbmcgYW5vbnltb3VzIGJpbmFyeSB0eXBlIGlmIGNsb3NlZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2NzQiPjEyNjc0PC9hPgotVG9vIG1hbnkgcHJvYmxlbXMgd2hpbGUgcmVjb25jaWxpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM3MyI+MTIzNzM8L2E+Ci1Bc3NlcnQkQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGVycm9yIHdoaWxlIHJlY29uY2lsaW5nCi0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNTkiPjEzMDU5PC9hPgotaW5jb3JyZWN0ICg/KSBjb2RlIGNvbXBpbGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4ODAiPjEyODgwPC9hPgotU1FMSiBTdXBwb3J0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2MDMiPjEyNjAzPC9hPgotQ291bGQgbm90IGRlbGV0ZSBlbXB0eSBqYXZhIGZpbGUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MDAiPjk2MDA8L2E+Ci1GaWVsZCByZWZlcmVuY2UgaW4gd29ya2luZyBjb3B5IG5vdCBmb3VuZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5OTUiPjEyOTk1PC9hPgotVG9vbEZhY3Rvcnk6OmNyZWF0ZVNjYW5uZXIgLSBpbmNvcnJlY3QgamF2YWRvYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTMzIj4xMjkzMzwvYT4KLSJOZXZlciB1c2VkIiB2YXJpYWJsZSB3YXJuaW5ncyBjYW4ndCBkZXRlY3QgYWNyb3NzIHNjb3BlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTEzNSI+NTEzNTwvYT4KLU9wZW4gSmF2YSBlZGl0b3Igb24gSVJlc291cmNlLmNsYXNzIGRvIGFuIGVycm9yICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjgwOSI+MTI4MDk8L2E+Ci1VbmltcGxlbWVudGVkIG1ldGhvZHMgc2hvdWxkIG5vdCBwcmV2ZW50IGNsYXNzIGZyb20gcnVubmluZyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQyMSI+MTA0MjE8L2E+Ci1XU0FEIGhhbmcgd2hpbGUgc2V0dGluZyBidWlsZHBhdGggIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTkwIj4xMjU5MDwvYT4KLVJldHVybmluZyB0aGUgdHlwZSB3aGVuIGxvY2FsIHZhciBpcyBzZWxlY3RlZCBicmVha3MgcmVmYWN0b3JpbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjcxMCI+MTI3MTA8L2E+Ci1JbmNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIHRoZSBtZXRob2QgSVR5cGUuY3JlYXRlRmllbGQoKQotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MDIgLSAybmQgQXByaWwgMjAwMiAKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjM3Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+SW1wcm92ZWQgc3BlY2lmaWNhdGlvbiBvZiA8Y29kZT5JQnVmZmVyPC9jb2RlPiBieSBzYXlpbmcgdGhhdDoKLQk8dWw+Ci0JCTxsaT4gSmF2YSBtb2RlbCBvcGVyYXRpb25zIHRoYXQgbWFuaXB1bGF0ZSBhbiA8Y29kZT5JQnVmZmVyPC9jb2RlPiAoZS5nLiAKLQkJCTxjb2RlPklUeXBlLmNyZWF0ZU1ldGhvZCguLi4pPC9jb2RlPikgZW5zdXJlcyB0aGF0IHRoZSBzYW1lIGxpbmUgZGVsaW1pdGVyIAotCQkJKGkuZS4gZWl0aGVyIDxjb2RlPiJcbiI8L2NvZGU+IG9yIDxjb2RlPiJcciI8L2NvZGU+IG9yIDxjb2RlPiJcclxuIjwvY29kZT4pIGlzIAotCQkJdXNlZCBhY2Nyb3NzIHRoZSB3aG9sZSBidWZmZXIuIFRodXMgdGhlc2Ugb3BlcmF0aW9ucyBtYXkgY2hhbmdlIHRoZSBsaW5lIGRlbGltaXRlcihzKSAKLQkJCWluY2x1ZGVkIGluIHRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kLCBvciByZXBsYWNlZC4KLQkJCUhvd2V2ZXIgaW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBhd2FyZSB0aGF0IG90aGVyIGNsaWVudHMgb2YgPGNvZGU+SUJ1ZmZlcjwvY29kZT4KLQkJCW1pZ2h0IG5vdCBkbyBzdWNoIHRyYW5zZm9ybWF0aW9ucyBiZWZvcmVoYW5kLjwvbGk+Ci0JCTxsaT4gPGNvZGU+YWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyPC9jb2RlPiBhbmQgPGNvZGU+cmVtb3ZlQnVmZmVyQ2hhbmdlZExpc3RlbmVyPC9jb2RlPgotCQkJaGF2ZSBubyBlZmZlY3QgaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGNsb3NlZC48L2xpPgotCQk8bGk+IE90aGVyIG9wZXJhdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHRoZSBidWZmZXIgKGxpa2UgPGNvZGU+c2V0Q29udGVudDwvY29kZT4KLQkJCW1pZ2h0IHRocm93IGEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4gaWYgY2FsbGVkIGFmdGVyIHRoZSBidWZmZXIKLQkJCWhhcyBiZWVuIGNsb3NlZC48L2xpPgorPHByZT4KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0YWJsZSBvZiB0aGUgY3VycmVudCBjdXN0b20gb3B0aW9ucyBmb3IgdGhpcyBwcm9qZWN0LiBQcm9qZWN0cyByZW1lbWJlciB0aGVpciBjdXN0b20gb3B0aW9ucywKKwkgKiBpLmUuIG9ubHkgdGhlIG9wdGlvbnMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBKYXZhQ29yZSBnbG9iYWwgb3B0aW9ucyBmb3IgdGhlIHdvcmtzcGFjZS4KKwkgKiBBIGJvb2xlYW4gYXJndW1lbnQgYWxsb3dzIHRvIGRpcmVjdGx5IG1lcmdlIHRoZSBwcm9qZWN0IG9wdGlvbnMgd2l0aCBnbG9iYWwgb25lcyBmcm9tIDxjb2RlPkphdmFDb3JlPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBpbmhlcml0SmF2YUNvcmVPcHRpb25zIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgSmF2YUNvcmUgb3B0aW9ucyBzaG91bGQgYmUgaW5oZXJpdGVkIGFzIHdlbGwKKwkgKiBAcmV0dXJuIHRhYmxlIG9mIGN1cnJlbnQgc2V0dGluZ3Mgb2YgYWxsIG9wdGlvbnMgCisJICogICAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlNYXAgZ2V0T3B0aW9ucyhib29sZWFuIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMpOworPC9wcmU+CisJCTwvbGk+CQkKKwkJPGxpPgorPHByZT4KKwkvKioKKwkgKiBTZXRzIHRoZSBwcm9qZWN0IGN1c3RvbSBvcHRpb25zLiBBbGwgYW5kIG9ubHkgdGhlIG9wdGlvbnMgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gdGFibGUgCisJICogYXJlIHJlbWVtYmVyZWQ7IGFsbCBwcmV2aW91cyBvcHRpb24gc2V0dGluZ3MgYXJlIGZvcmdvdHRlbiwgaW5jbHVkaW5nIG9uZXMgbm90IGV4cGxpY2l0bHkKKwkgKiBtZW50aW9uZWQuCisJICogPHA+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3T3B0aW9ucyB0aGUgbmV3IG9wdGlvbnMgKGtleSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+OyB2YWx1ZSB0eXBlOiA8Y29kZT5TdHJpbmc8L2NvZGU+KSwKKwkgKiAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGZsdXNoIGFsbCBjdXN0b20gb3B0aW9ucyAoY2xpZW50cyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHRoZSBnbG9iYWwgSmF2YUNvcmUgb3B0aW9ucykuCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwl2b2lkIHNldE9wdGlvbnMoTWFwIG5ld09wdGlvbnMpOworPC9wcmU+CisJCTwvbGk+CQkKIAk8L3VsPgogPC9saT4KLTxsaT4gSVNjYW5uZXIgQVBJIDoKLQk8dWw+Ci0JCTxsaT4gYWRkZWQgPGNvZGU+SVNjYW5uZXIjZ2V0U291cmNlPC9jb2RlPiBzbyBhcyB0byByZXRyaWV2ZSB0aGUgc2Nhbm5lciBvcmlnaW5hbCBzb3VyY2UKLQkJPGxpPiByZW5hbWVkIDxjb2RlPklTY2FubmVyI3NldFNvdXJjZUJ1ZmZlcjwvY29kZT4gaW50byA8Y29kZT5JU2Nhbm5lciNzZXRTb3VyY2U8L2NvZGU+Ci0JPC91bD4KLTwvbGk+CQorCTxsaT5BZGRlZCA8Y29kZT5KYXZhQ29yZS5ydW4oSVdvcmtzcGFjZVJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4gdGhhdCBhbGxvd3MgYmF0Y2hpbmcKKwkJICBvZiBqYXZhIG1vZGVsIG9wZXJhdGlvbnMuIE9ubHkgb25lIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IGlzIHJlcG9ydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJhdGNoLgorCQkgIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IG5vdGlmaWVzIGxpc3RlbmVycyB0d2ljZToKKwk8cHJlPgorCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IC4uLjsKKwl1bml0LmNyZWF0ZVR5cGUoImNsYXNzIEIge30iLCBudWxsLCBmYWxzZSwgbW9uaXRvcik7CisJdW5pdC5nZXRUeXBlKCJBIikuY3JlYXRlRmllbGQoImludCBpOyIsIG51bGwsIGZhbHNlLCBtb25pdG9yKTsKKwk8L3ByZT4KKwkJICBUbyBiZSBub3RpZmllZCBvbmx5IG9uY2UsIHVzZSB0aGUgZm9sbG93aW5nOgorCTxwcmU+CisJSmF2YUNvcmUucnVuKAorCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IC4uLjsKKwkJCQl1bml0LmNyZWF0ZVR5cGUoImNsYXNzIEIge30iLCBudWxsLCBmYWxzZSwgbW9uaXRvcik7CisJCQkJdW5pdC5nZXRUeXBlKCJBIikuY3JlYXRlRmllbGQoImludCBpOyIsIG51bGwsIGZhbHNlLCBtb25pdG9yKTsKKwkJCX0KKwkJfSwKKwkJbW9uaXRvcik7CisJPC9wcmU+CisJPC9saT4KIDwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTc3Ij4yMzk3NzwvYT4KKy5jbGFzc3BhdGggY29ycnVwdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzM0Ij4yMzczNDwvYT4KK0FTVDogQ29tcGlsYXRpb25Vbml0LmZpbmREZWNsYXJpbmdOb2RlIG9ubHkgZmluZHMgYmluZGluZ3MgZnJvbSBpdHMgb3duIGFzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTc5Ij4yMzk3OTwvYT4KK0J1aWxkIFBhdGggcGFnZSByZXBvcnRzIGN5Y2xlIGV2ZW4gaWYgdGhlcmUgaXMgbm9uZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODgxIj4yMDg4MTwvYT4KKyJvcmdhbml6ZSBpbXBvcnRzIiBkb2VzIG5vdCBmaW5kIGFuIGltcG9ydCBzdGF0ZW1lbnQgImFkZCBpbXBvcnQiIGRvZXMuIFtjb2RlIG1hbmlwdWxhdGlvbl0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDkxIj43MDkxPC9hPgordHVybiBvZmYgdGhlIGRlYnVnIGluZm8gb24gYSBwcm9qZWN0IGJ5IHByb2plY3QgYmFzaXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTY2MyI+MTk2NjM8L2E+CitKYXZhfENvbXBpbGVyfE90aGVyfEZpbHRlcmVkIHJlc291cmNlcyBuZWVkcyB0byBiZSBwcm9qZWN0L3RlYW0gc3BlY2lmaWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA2MiI+MTQwNjI8L2E+CitKREsgQ29tcGxpYW5jZSBhZ2FpbnN0IGEgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjg5Ij4yMjI4OTwvYT4KK1RvIGhhdmUgZmlsZSBlbmNvZGluZyBieSBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NSI+NzM5NTwvYT4KK1NldCB0aGUgY29tcGlsZXIgb3B0aW9ucyBwZXIgcHJvamVjdCBpbnN0ZWFkIG9mIHBlciB3b3Jrc3BhY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg5NCI+MjM4OTQ8L2E+CitFeHRyYSAoVE9ETykgTWFya2VycyA6IFRoZXJlIGlzIG5vIHRvZG8gdGFzayB3aGVuIHRoZXJlIGlzIG5vIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxNjIiPjIzMTYyPC9hPgorRE9NOiBjbGllbnRzIHNob3VsZCBiZSBhYmxlIHRvIGNvbnRyb2wgaWYgYmluZGluZ3MgYXJlIGF2YWlsYWJsZSBldmVuIGlmIEFTVCBpcyBtb2RpZmllZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTAxIj4yMzkwMTwvYT4KK0NDRSBpbiBEZWZhdWx0QmluZGluZ1Jlc29sdmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1OTciPjIzNTk3PC9hPgorY2Fubm90IHJlc29sdmUgYSBjYWxsIHRvIGEgcHJvdGVjdGVkIHN1cGVyY2xhc3MgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NzMiPjIzNTczPC9hPgorQVNUOiBjbG9uZSAmIHNvdXJjZSBsb2NhdGlvbnMKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDU0Ij4xMjQ1NDwvYT4KLUFTVC9ET006IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBnZW5lcmF0ZWQgYnkgYmFkIHNvdXJjZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDMxIj4xMjQzMTwvYT4KLVVuY2xlYXIgY29tcGlsZXIgZXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxNiI+MTI0MTY8L2E+Ci1TZXBhcmF0ZSBjYWNoaW5nIG9mIHByb2plY3QgYW5kIHBrZyBmcmFnbWVudCByb290IGZyb20gY2FjaGluZyBvZiBvcGVuYWJsZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDU3Ij4xMjQ1NzwvYT4KLU5lZWQgdG8gc3luY2hyb25pemUgSm9iTWFuYWdlci5kaXNjYXJkSm9icyguLi4pICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0NSI+MTI0NDU8L2E+Ci1Db21waWxlciBGYWlsdXJlIG9uIHJlZmVyZW5jZSB0byBhYnN0cmFjdCBpbnRlcmZhY2UgbWV0aG9kCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MTciPjEyNDE3PC9hPgotYXBpOiBJU2Nhbm5lciwgSVRlcm1pbmFsU3ltYm9scyAtIG5vIHdheSB0byBnZXQgc29tZSB0b2tlbnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxOSI+MTI0MTk8L2E+Ci1XZWlyZCBzZWNvbmRhcnkgZXJyb3IgaW4gY29uc3RydWN0b3IgcmVjb25jaWxpYXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxOSI+MTI0MTk8L2E+Ci1hcGk6IElTY2FubmVyIC0gbWlzc2luZyAoPykgZ2V0U291cmNlQnVmZmVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzODAiPjEyMzgwPC9hPgotQVNUL0RPTTogcmVzb2x2ZVR5cGVCaW5kaW5nKCkgb24gdGhlIHNlY29uZCBvcGVyYW5kIG9mIGEgaW5zdGFuY2VvZiBleHByZXNzaW9uIHJldHVybiBudWxsIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3OTAiPjk3OTA8L2E+Ci1BZGQgY29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzcyBpbnNlcnRzIGluIHdyb25nIHBsYWNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzg3Ij4xMjM4NzwvYT4KLU91dCBPZiBNZW1vcnkgZXJyb3IgaW1wb3J0aW5nIGZpbGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDIzIj4zNDIzPC9hPgotTmVlZCBJQ29uc3RhbnRzICgxR0tNNTFPKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTgzIj4xMTU4MzwvYT4KLUluZmluaXRlIGxvb3AgaW4gT3ZlcmZsb3dpbmdMUlVDYWNoZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzQ2Ij4xMjM0NjwvYT4KLUxlYWtpbmcgY2xvc2VkIGJ1ZmZlcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQzMSI+MTE0MzE8L2E+Ci1TdGVwcGluZyBmcm9tIG9uZSBjYXNlIHN0YXRlbWVudCdzIGJyZWFrIGVuZHMgdXAgaW4gbmV4dCBjYXNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzI2Ij4xMjMyNjwvYT4KLUJhZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIENvbXBpbGF0aW9uVW5pdCB3aXRoIG5vIHRyYWlsaW5nIG5ld2xpbmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzEzIj4zMzEzPC9hPgotU2V2ZXJlIC0gUGVyZm9ybWFuY2UgLSBKYXZhIE1vZGVsIHJlZHVuZGFuY2llcyAoMUdGS1RVTikgIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI2MTgiPjIyNjE4PC9hPgoraW5jb3JyZWN0IHdhcm5pbmcgYWJvdXQgdW5yZWFkIHZhcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM5Ij4zMjM5PC9hPgorQ29kZUZvcm1hdHRlcjogbmVlZCB0byBiZSBhYmxlIHRvIHNldCBsaW5lZGVsaW1pdGVyIHVzZWQgKDFHQzBMRkspCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5NzkiPjIyOTc5PC9hPgordXNpbmcgSVNjYW5uZXIgaW5zaWRlIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NTAiPjIzNTUwPC9hPgorTWljcm8tamF2YSwgZW1iZWRkZWQgamF2YQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzODMzIj4yMzgzMzwvYT4gIAorSmF2YSBzb3VyY2UgYXR0YWNobWVudCBkb2VzIG5vdCB3b3JrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM0MDIiPjIzNDAyPC9hPiAgCitDYW5jZWwgb24gY29tcGlsZSBoYXMgbm8gZWZmZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2MzUiPjIzNjM1PC9hPiAgCitDb21waWxhdGlvbiBFcnJvcnMgSW5jb25zaXN0ZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1MjAiPjIxNTIwPC9hPiAgCisnRXJyb3JzIGR1cmluZyBidWlsZDogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZycgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE0OCI+MjIxNDg8L2E+ICAKK1FsZmQuIHZzLiB1bnFsZmQuIE5hbWUgZnJvbSBJRmllbGQuZ2V0VHlwZVNpZ25hdHVyZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NzUiPjIxNDc1PC9hPgorTm8gc291cmNlIGZvciBjbGFzc2VzIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24gW2dlbmVyYWwgaXNzdWVdCiAKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NzAiPjEyNDcwPC9hPgotMDIxNCAtIFdhbGtiYWNrIGR1cmluZyBlbmNhcHN1bGF0ZSBtZXRob2QgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3OSI+OTE3OTwvYT4KLURDUjogTmVlZCBJSmF2YVNlYXJjaFNjb3BlIGVxdWFscyBvciBlbmNsb3NlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzA3Ij4xMDMwNzwvYT4KLUNvZGUgYXNzaXN0IGZhaWxlZCB0byBzZWFyY2ggd2hvbGUgY2xhc3MgcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzkiPjcwNzk8L2E+Ci1Db2RlIGZvcm1hdHRpbmcgZmFpbHMgd2l0aCBqYXZhLmxhbmcuRXJyb3IgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NSI+MzI1NTwvYT4KLVJlbWluZGVyIC0gcmUtZW5hYmxlIHRyYW5zaWVudCBtYXJrZXIgZ2VuZXJhdGlvbiBkdXJpbmcgY29kZS1hc3Npc3QgKDFHRENYTEIpCi0KLTxoMT4KKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MjYgLSAyNnRoIEFwcmlsIDIwMDIgCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNgorRWNsaXBzZSBTREsgMi4xIEJ1aWxkIC0gMTl0aCBTZXB0ZW1iZXIgMjAwMiAtIDIuMSBNSUxFU1RPTkUtMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNzNhCiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08bGk+IFJlY29uY2lsaW5nIHdpdGggZXJyb3JzIHByb3ZpZGUgdHlwZSBlcnJvcnMgaW4gYWRkaXRpb24gdG8gc3ludGF4IG9uZXMuIFRoaXMgaXMgc3RpbGwgZXhwZXJpbWVudGFsLAotCWFuZCBjYW4gYmUgZGlzYWJsZWQgYnkgdW5jaGVja2luZyB0aGUgZWRpdG9yIHByZWZlcmVuY2UgZm9yIHRyYW5zaWVudCBwcm9ibGVtcy4KLTwvbGk+CQotPGxpPlBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIGluZGV4IHF1ZXJpZXMgd2l0aCB0aGUgPGNvZGU+V2FpdFVudGlsUmVhZHk8L2NvZGU+IHBvbGljeS4gCi0JVGhlIGJhY2tncm91bmQgaW5kZXhlciBub3cgdGFrZXMgYWxsIHRoZSBDUFUgd2hlbiBhbm90aGVyIHRocmVhZCBpcyB3YWl0aW5nIGZvciBpdCB0byAKLQlmaW5pc2ggaW5kZXhpbmcuCi0gICAgVXNlciB3aWxsIG5vdGljZSB0aGlzIGltcHJvdmVtZW50IHdoZW4gZG9pbmcgYSBzZWFyY2ggb3Igb3BlbmluZyBhIHR5cGUgYW5kIHRoZXJlIGFyZSAKLSAgICBzdGlsbCBmaWxlcyB0byBpbmRleC4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NTgiPjIzNTU4PC9hPiAgCitFeHRyZW1seSBzbG93IHN0YXJ0dXAgIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzc4OCI+MjM3ODg8L2E+ICAKK0phdmEgY29tcGlsZXIgZG9lc24ndCBwcm9wZXJseSBmbGFnIGludmFsaWQgcHJvdGVjdGVkIGFjY2VzcyAoZm9yIGphdmFjIDEuNCBjb21wYXRpYmlsaXR5KQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDE2dGggU2VwdGVtYmVyIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjczCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+VGhlIHNvdXJjZSBsb29rdXAgZm9yIC5jbGFzcyBmaWxlcyBpbnNpZGUgamFyIGZpbGVzIGhhcyBiZWVuIGltcHJvdmVkLiBCZWZvcmUgaXQgd29ya2VkIG9ubHkgaWYgdGhlIC5jbGFzcyBmaWxlcworaGFkIGEgc291cmNlIGZpbGUgYXR0cmlidXRlLiBUaGlzIHdhcyB0b28gbGltaXRpbmcgaW4gY2FzZSBvZiB0aGUgdXNhZ2Ugb2YgYSBsaWJyYXJ5IHdoaWNoIGhhcyBub3QgYmVlbiBjb21waWxlZCBpbgorZGVidWcgbW9kZS4gTm93IGluIGNhc2UgdGhlcmUgaXMgbm8gc3VjaCBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUsIGFuIGhldXJpc3RpYyBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvcGVyIGVudHJ5LiBXZQorYXNzdW1lIHRoYXQgYSBjbGFzcyBuYW1lZCBBIGluIGEgcGFja2FnZSBwIGhhcyBiZWVuIGNvbXBpbGVkIGZyb20gYSBjbGFzcyBBLmphdmEgaW4gYSBmb2xkZXIgcC4gRm9yIC5jbGFzcyBmaWxlcwordGhhdCBjb3JyZXNwb25kIHRvIG1lbWJlciBvciBsb2NhbCBjbGFzc2VzIHRoZSBzb3VyY2UgbWFwcGluZyBpcyB1c2luZyB0aGUgdG9wIGxldmVsIGNsYXNzIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIGlzIGRlZmluZWQuCitUaGUgb25seSBsaW1pdGlhdGlvbiB0aGF0IHN0aWxsIGV4aXN0cyBpcyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSB0aGUgc291cmNlIGZvciBzZWNvbmRhcnkgdHlwZXMgKHR5cGVzCit0aGF0IGFyZSBkZWZpbmVkIGluIGEgZmlsZSB3aGljaCBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgbmFtZSkuIFNlZSBidWcgPEEgSFJFRj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ3NSI+MjE0NzU8L2E+Citmb3IgZnVydGhlciBkZXRhaWxzLjwvbGk+Cis8L3VsPgorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ3NSI+MjE0NzU8L2E+CitBdHRhY2hpbmcgU291cmNlLUNvZGUgdG8gYSBsaWJyYXJ5IHdoaWNoIGlzIG5vdCBjb21waWxlZCB3aXRoIGRlYnVnIGluZm8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ2NiI+MjM0NjY8L2E+CitDb21waWxlciB2aW9sYXRlcyBKTFMgOC4zLjIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTAyMiI+MjEwMjI8L2E+Cit3YXJuaW5nIG9uIGltcG9ydHMgd2hpbGUgdHlwaW5nIGFuZCB3YXJuaW5nIG9uIHVudXNlZCBpbXBvcnRzIGlzIG9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMjkiPjIzMzI5PC9hPiAgCitzZWFyY2g6IGluY29ycmVjdCByYW5nZSBmb3IgdHlwZSByZWZlcmVuY2VzIGluIGJyYWNrZXRzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4NCI+MjMyODQ8L2E+CitBU1Q6IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbmVlZHMgZXh0cmEgZGltZW5zaW9ucz8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ2NCI+MjM0NjQ8L2E+Cithc3Q6IChTdXBlcilDb25zdHJ1Y3Rvckludm9jYXRpb24gc2hvdWxkIGJlIHdyYXBwZWQgaW4gRXhwcmVzc2lvblN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTYwIj4yMjU2MDwvYT4KKyJBZGQgcmV0dXJuIHR5cGUiIGNvcnJlY3Rpb24gY291bGQgYmUgc21hcnRlciBbcXVpY2sgZml4XQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNDkyIj4yMzQ5MjwvYT4KK1tET00vQVNUXSBsYXp5IGluaXQgc2hvdWxkIG5vdCBjb3VudCBhcyBhIG1vZGlmaWNhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjkyIj4yMzI5MjwvYT4gIAorTXVzdCByZXN0YXJ0IEVjbGlwc2UgYWZ0ZXIgZGVidWcgb2Ygc291cmNlIGluIC56aXAgaXMgdXBkYXRlZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzMDYiPjIyMzA2PC9hPgorQVNUOiBDb25zdHJ1Y3RvciBjb250YWlucyBzeW50ZXRpYyBTdXBlckNvbnN0cnVjdG9yQ2FsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODMyIj4yMjgzMjwvYT4KK3NlbGVjdCBkb2VzIG5vdCB3b3JrIHdoZW4gY2FyZXQgaXMgYXQgdGhlIGJlZ2luaW5nIG9mIGFuIGlkZW50aWZpZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI0MiI+MjMyNDI8L2E+CitCYWQgbGluZSBudW1iZXIgaW5mbyB3aGVuIG11bHRpcGxlIHN0YXRlbWVudHMgb24gc2FtZSBsaW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzNjIiPjIzMzYyPC9hPgorRE9NOiBpbmNvcnJlY3QgbGVuZ3RoIGZvciBJbmZpeEV4cHJlc3Npb24uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzNTciPjIzMzU3PC9hPiAgCitCdWlsZCBub3QgdHJpZ2dlcmVkIG9uIGJ1aWxkIHBhdGggY2hhbmdlCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTU0Ij4yMTk1NDwvYT4gIAorY29tcGlsZSAvIGRlYnVnIFZNIG1pc21hdGNoCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1NTgiPjIzNTU4PC9hPiAgCitFeHRyZW1seSBzbG93IHN0YXJ0dXAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTk1MiI+MjE5NTI8L2E+ICAKK0NpcmN1bGFyIERlcGVuZGVuY2llcyBNZXNzYWdlIC0gRXJyb3IgdnMuIFdhcm5pbmcgTWVzc2FnZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzNzUiPjIzMzc1PC9hPiAgCitjeWNsZSBkZXRlY3Rpb24gYWxnb3JpdGhtIGlzIE8ocG93KG4gLSAxLCBuIC0gMSkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MDAiPjIyOTAwPC9hPgoraW1wb3J0IG9mIGEuYi5DIGZhaWxzIGlmIHBhY2thZ2UgYSBleGlzdHMKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMHRoIFNlcHRlbWJlciAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI3MgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorICA8bGk+SmF2YUNvcmUgb3B0aW9uIGFkZGVkIGZvciB0aGUgZXJyb3IgbGV2ZWwgKHdhcm5pbmcgb3IgZXJyb3IpIG9mIGluY29tcGxldGUgY2xhc3NwYXRoIG9yIHByb2plY3RzIGludm9sdmVkCisgICAgICAgIGluIGEgY3ljbGUuCisgICAgICAgIDxwcmU+CisqIEpBVkFDT1JFIC8gUmVwb3J0aW5nIEluY29tcGxldGUgQ2xhc3NwYXRoCisqICAgIEFuIGVudHJ5IG9uIHRoZSBjbGFzc3BhdGggZG9lc24ndCBleGlzdCBvciBpcyBub3QgdmlzaWJsZSAoZS5nLiBhIHJlZmVyZW5jZWQgcHJvamVjdCBpcyBjbG9zZWQpLgorKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGgiCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyJ9CisqICAgICAtIGRlZmF1bHQ6CQkJImVycm9yIgorKiAKKyogSkFWQUNPUkUgLyBSZXBvcnRpbmcgQ2xhc3NwYXRoIEN5Y2xlCisqICAgIEEgcHJvamVjdCBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xlLgorKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoIgorKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciIH0KKyogICAgIC0gZGVmYXVsdDoJCQkiZXJyb3IiCisgICAgICAgIDwvcHJlPgorICA8L2xpPgorPGxpPk5ldyBvcHRpb24gLWJvb3RjbGFzc3BhdGggaXMgYWRkZWQgZm9yIHRoZSBiYXRjaCBjb21waWxlci4gVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24gb2YgYm9vdHN0cmFwCitjbGFzcyBmaWxlcy4gSWYgb21pdHRlZCwgdGhlIGJhdGNoIGNvbXBpbGVyIHdpbGwgcmV0cmlldmUgdGhlIGxpYnJhcmllcyB1c2VkIGJ5IGl0cyBKVk0uIFNvIHRoZXJlIGlzIG5vIG1vcmUgbmVlZCB0byBzcGVjaWZ5IHRoZQorcnQuamFyIGZpbGUgdXNpbmcgdGhlIC1jbGFzc3BhdGggb3B0aW9uLiBUaGUgYmF0Y2ggY29tcGlsZXIgYWxzbyByZXRyaWV2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9wZXJ0eSAiamF2YS5jbGFzcy5wYXRoIiBpZiBubyAKKy1jbGFzc3BhdGggb3B0aW9uIGlzIHNwZWNpZmllZC4KIDwvbGk+Ci08bGk+U2Nhbm5lciBBUEkKLQk8dWw+Ci0JCTxsaT5kZWZpbmVkIHNjYW5uZXIgQVBJIChzZWUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVNjYW5uZXI8L2NvZGU+KS4gPC9saT4KLQkJPGxpPmFkZGVkIHRvb2wgZmFjdG9yeSBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeSNjcmVhdGVTY2FubmVyPC9jb2RlPiksIGFsbG93aW5nIHRvIG9idGFpbgotCQkJYSBzY2FubmVyIChpbXBsZW1lbnRpbmcgPGNvZGU+SVNjYW5uZXI8L2NvZGU+IEFQSSkuIDwvbGk+Ci0JPC91bD4KKzxsaT4gRGVwcmVjYXRpb24gd2FybmluZyBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlIGFyZSBub3cgaWdub3JlZCBieSBkZWZhdWx0LiBBIG5ldyBKYXZhQ29yZSBvcHRpb24KK2FsbG93cyB0byByZXBvcnQgdGhlbSBhbGwuCis8cHJlPgorKglDT01QSUxFUiAvIFJlcG9ydGluZyBEZXByZWNhdGlvbiBJbnNpZGUgRGVwcmVjYXRlZCBDb2RlCisqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCB1c2Ugb2YgZGVwcmVjYXRlZCBBUEkgaW5zaWRlIGRlcHJlY2F0ZWQgY29kZS4KKyogICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIi4KKyogICAgIAkJLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGUiCisqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisqICAgICAJCS0gZGVmYXVsdDoJCQkiZGlzYWJsZWQiCis8L3ByZT4KIDwvbGk+Ci08bGk+IENvZGUgZm9ybWF0dGVyIEFQSQotCTx1bD4KLQkJPGxpPmRlZmluZWQgY29kZSBmb3JtYXR0ZXIgQVBJIChzZWUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVGb3JtYXR0ZXI8L2NvZGU+KS4gPC9saT4KLQkJPGxpPmFkZGVkIHRvb2wgZmFjdG9yeSBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeSNjcmVhdGVDb2RlRm9ybWF0dGVyPC9jb2RlPiksIGFsbG93aW5nIHRvIG9idGFpbgotCQkJYSBjb2RlIGZvcm1hdHRlciAoaW1wbGVtZW50aW5nIDxjb2RlPklDb2RlRm9ybWF0dGVyPC9jb2RlPiBBUEkpLiBOb3RlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IHdhcyBhbHNvIGFkZGVkCi0JCQl0byBhbGxvdyBjbGllbnQgY29kZSB0byBjb250cmlidXRlIGEgY29kZSBmb3JtYXR0ZXIgaW1wbGVtZW50YXRpb24uIFRoZSBjb2RlIGZvcm1hdHRlciBleHRlbnNpb24gcG9pbnQgaXMgbmFtZWQKLQkJCTxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVGb3JtYXR0ZXI8L2NvZGU+LCBhbHNvIHNlZSBhc3NvY2lhdGUgY29tbWVudCBpbiBwbHVnaW4ueG1sLjwvbGk+Ci0JCTxsaT5hZGRlZCB0b29sIGZhY3RvcnkgQVBJIChzZWUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuVG9vbEZhY3RvcnkjY3JlYXRlRGVmYXVsdENvZGVGb3JtYXR0ZXI8L2NvZGU+KSwgYWxsb3dpbmcgdG8gb2J0YWluCi0JCQlhIGRlZmF1bHQgY29kZSBmb3JtYXR0ZXIgKGltcGxlbWVudGluZyA8Y29kZT5JQ29kZUZvcm1hdHRlcjwvY29kZT4gQVBJKS4gPC9saT4KLQk8L3VsPgorPGxpPiBDb21waWxlciBjYW4gbm93IG9wdGlvbmFsbHkgY29sbGVjdCB0YXNrcyBmcm9tIHRoZSBzb3VyY2UgY29kZS4gT2NjdXJyZW5jZXMgb2YKK2EgZ2l2ZW4gdGFzayB0YWcgYXJlIGxvb2tlZCBmb3IgaW5zaWRlIGFueSB0eXBlIG9mIGNvbW1lbnRzLCBhbmQgcmVwb3J0ZWQgYXMgY3VzdG9tIHRhc2sgbWFya2VycworKDxjb2RlPiJvcmcuZWNsaXBzZS5qZHQuY29yZS50YXNrIjwvY29kZT4pLgorIDx1bD4KKyA8bGk+IE5ldyBwcm9ibGVtIElEIGdvdCBjcmVhdGVkOiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbSNUYXNrPC9jb2RlPi4gTm90ZSB0aGF0CisgY2xpZW50cyBvZiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4gd2lsbCBnZXQgZGV0ZWN0ZWQgdGFza3MgYXMgd2FybmluZ3Mgd2l0aCB0aGlzIG5ldyBJRCwgdGhleQorIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaWYgbmVlZGVkLgorIDwvbGk+CisgPGxpPiBKYXZhQ29yZSBvcHRpb24gYWRkZWQgZm9yIHNwZWNpZnlpbmcgdGhlIHRhc2sgdGFnIHZhbHVlcyAoZGVmYXVsdCBpcyA8Y29kZT4iIjwvY29kZT4gbWVhbmluZyBubworIHRhc2sgaXMgZGV0ZWN0ZWQpLgorPHByZT4KKyogQ09NUElMRVIgLyBEZWZpbmUgdGhlIEF1dG9tYXRpYyBUYXNrIFRhZ3MKKyogICAgV2hlbiB0aGUgdGFnIGlzIG5vbiBlbXB0eSwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYSB0YXNrIG1hcmtlciB3aGVuZXZlciBpdCBlbmNvdW50ZXJzCisqICAgIG9uZSBvZiB0aGUgY29ycmVzcG9uZGluZyB0YWcgaW5zaWRlIGFueSBjb21tZW50IGluIEphdmEgc291cmNlIGNvZGUuCisqICAgIEdlbmVyYXRlZCB0YXNrIG1lc3NhZ2VzIHdpbGwgaW5jbHVkZSB0aGUgdGFnLCBhbmQgcmFuZ2UgdW50aWwgdGhlIG5leHQgbGluZSBzZXBhcmF0b3Igb3IgY29tbWVudCBlbmRpbmcsIGFuZCB3aWxsIGJlIHRyaW1tZWQuCisqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUudGFza1RhZ3MiCisqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiPHRhZz5bLDx0YWc+XSoiIH0gd2hlcmUgPHRhZz4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIAorKiAgICAgLSBkZWZhdWx0OgkJCSIiCis8L3ByZT4JIAorIDwvbGk+CisgPC91bD4KIDwvbGk+Ci08bGk+IFdvcmtpbmcgQ29weSBBUEkgOiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBwcm9ibGVtIHJlcXVlc3RvciAoPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+KSB0byB3b3JraW5nIGNvcHkgI3JlY29uY2lsZSguLi4pCi1vcGVyYXRpb24uIFRoZSBwcm9ibGVtIHJlcXVlc3RvciBpcyBwYXNzZWQgYWxvbmcgYXQgY3JlYXRpb24gdGltZS4gCi0JPHVsPgotCTxsaT5hZGRlZCBJV29ya2luZ0NvcHkuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKTwvbGk+Ci0JPGxpPmFkZGVkIElXb3JraW5nQ29weS5nZXRTaGFyZWRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSwgSVByb2JsZW1SZXF1ZXN0b3IpPC9saT4KLQk8L3VsPgotCVByZXZpb3VzIEFQSSB0YWtpbmcgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+IGdvdCBkZXByZWNhdGVkLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIHN1YnNlcXVlbnQgYnVpbGQuCi08L2xpPgkKLTxsaT5Tb21lIGludGVybmFsIGNsYXNzZXMgZ290IGRlcHJlY2F0ZWQgKGFzIGNsaWVudCBjb2RlIHJlbGllcyBvbiB0aGVtKSwgc2luY2UgYmVpbmcgc3VyZmFjZWQ6Ci0JPHVsPgotCQk8bGk+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnBhcnNlci5JbnZhbGlkSW5wdXRFeGNlcHRpb248L2NvZGU+IDxicj49PT4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uPC9jb2RlPiA8L2xpPgotCQk8bGk+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnBhcnNlci5UZXJtaW5hbFN5bWJvbHM8L2NvZGU+IDxicj49PT4gPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczwvY29kZT4gPC9saT4KLQk8L3VsPgotCVRoZXkgd2lsbCBiZSByZW1vdmVkIGluIGEgc3Vic2VxdWVudCBidWlsZC4KLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUzIj4zMzUzPC9hPgotQVBJIC0gU2hvdWxkIHByb3ZpZGUgYXBpIGZvciBmb3JtYXR0aW5nIHNvdXJjZSAoMUdKSVdDRikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc5Ij4zMTc5PC9hPgotQ29tcGlsZXIgLSBMRiBjYW5ub3QgcnVuIGNsYXNzZXMgdGhhdCBtaXNzIGltcGxlbWVudGF0aW9ucyBvZiBhbiBpbnRlcmZhY2UgKDFGTkZWWTgpIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTk5Ij4xMjE5OTwvYT4KLUdlbmVyYXRlZCBjbGFzc2ZpbGVzIHNob3VsZCBiZSB0YWdnZWQgYXMgZGVyaXZlZCByZXNvdXJjZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY0MCI+MTE2NDA8L2E+Ci1CdWcgaW4gdGhlIGNvZGUgZm9ybWF0dGVyIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTQ0Ij4xMDU0NDwvYT4KLUludGVybmFsIGVycm9yIGNyZWF0aW5nIGxvbmcgcGFja2FnZSBuYW1lIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTQwIj4xMjE0MDwvYT4KLXR5cG8gaW4gSVBhY2thZ2VGcmFnbWVudFJvb3Q6OmNyZWF0ZVBhY2thZ2VGcmFnbWVudCBqYXZhZG9jIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDIyIj4xMTQyMjwvYT4KLUF0dGFjaGluZyBzb3VyY2Ugd2hlbiB1c2luZyB2YXJpYWJsZXMgdG8gcG9pbnQgdG8gamFycyB2ZXJ5IHVuaW50dWl0aXZlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMDAiPjEyMDAwPC9hPgotTWFpbi5jb21waWxlIGRvZXMgbm90IGNsb3NlIGxvZyBmaWxlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1NTgiPjY1NTg8L2E+Ci1NaXNzaW5nIGNsYXNzIHBhdGggZW50cmllcyBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGFuIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NCI+MzM1NDwvYT4KLUFQSSAtIHNob3VsZCBwcm92aWRlIGFwaSBmb3IgU2Nhbm5pbmcgKDFHSklXQ1QpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NiI+NzQ5NjwvYT4KLUludGVyZmFjZSBzaG93cyBhcyBjbGFzcyB1bmRlciBjb250ZW50IGFzc2lzdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDc1Ij4xMTQ3NTwvYT4KLUNvZGUgcmVzb2x2ZSByZXBvcnRzIHR5cGVzIGluIHNlY3VyaXR5IHBhY2thZ2UKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg5OSI+MTA4OTk8L2E+Ci1DYW4ndCBvcGVuIG9uIHNlbGVjdGlvbiBmb3IgbWVtYmVyIHR5cGUgaW4gYmluYXJ5IGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMTMiPjEyMDEzPC9hPgotSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUgZmFpbHMgb24gZW1wdHkgdmFyaWFibGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4NDUiPjExODQ1PC9hPgotSW50ZXJuYWwgQ29tcGlsZXIgRXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkyMiI+MTE5MjI8L2E+Ci1pcyB0aGlzIGNvZGUgcmVhY2hhYmxlIG9yIG5vdD8KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjExOSI+MTIxMTk8L2E+Ci1FY2xpcHNlIGJ1aWxkIHNsb3cgb24gbmV0d29yawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4ODEiPjc4ODE8L2E+Ci1JVHlwZS5tb3ZlKCkgY2xvYmJlcnMgZWRpdGluZyBidWZmZXIgb2YgZGVzdGluYXRpb24gZWxlbWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzAzIj4xMDcwMzwvYT4KLWFzdDogbm8gQVBJIHRvIGZpZ3VyZSBvdXQgdGhlIHNvdXJjZSByYW5nZSBvZiAnc3VwZXInIGtleXdvcmRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODMiPjEwOTgzPC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gSmF2YUJ1aWxkZXIgZHVyaW5nIFNhdmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU1Ij4zMzU1PC9hPgotQVBJIC0gc2hvdWxkIHByb3ZpZGUgQVBJIGZvciBzb3VyY2UgZWxlbWVudCBwYXJzaW5nICgxR0pJV0Q4KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTU1Ij4xMDk1NTwvYT4KLURDUiAtIHNlYXJjaDogdG9vIGxpbWl0aW5nIGFwaSBvZiBJSmF2YVNlYXJjaFNjb3BlICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODE5Ij44ODE5PC9hPgotU2VsZiBob3N0aW5nIHRvb2wgZG9lc24ndCB1cGRhdGUgc2VhcmNoIGluZGV4Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0OTciPjExNDk3PC9hPgotUmVuYW1pbmcgcHJvamVjdCBmYWlsZWQgd2l0aCBKYXZhIE1vZGVsIEV4Y2VwdGlvbjogSmF2YSBNb2RlbCBTdGF0dXMgW05hbWUgY29sbGlzaW9uLl0KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjA1OSI+MTIwNTk8L2E+Ci1hcGk6IEphdmFDb3JlOjpnZXRPcHRpb25zIHNob3VsZCByZXR1cm4gTWFwLCBub3QgSGFzaHRhYmxlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNDQiPjEyMDQ0PC9hPgotU2VhcmNoIGZvciBmaWVsZCByZWZlcmVuY2UgYnJva2VuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDUiPjExOTA1PC9hPgotRENSIC0gcHJvdmlkZSBzY2FubmluZyBBUEkKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzIxIC0gMjFzdCBNYXJjaCAyMDAyIC0gTUlMRVNUT05FIDQKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjM1YQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMTQiPjEyMDE0PC9hPgotTm8gZGVsdGEgd2hlbiBhZGRpbmcgcGFja2FnZSB3aGVyZSBzcmM9YmluIGFuZCBzcmMhPXByb2ogIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzU1Ij4xMTc1NTwvYT4KLXJlc291cmNlIGNvcHkgZmlsdGVyIGFuZCBkdXBsaWNhdGVkIHJlc291cmNlIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDAiPjExNjQwPC9hPgotQnVnIGluIHRoZSBjb2RlIGZvcm1hdHRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODYwIj4xMTg2MDwvYT4KLUNhbm5vdCBtb3ZlIGEgY29tcGlsYXRpb24gdW5pdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjI3Ij4xMTYyNzwvYT4KLVJlZmFjdG9yaW5nOiBDQ0UgaW4gUHVsbHVwIG1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzM1Ij4xMTczNTwvYT4KLU5QRSBzZWxlY3RpbmcgRjMgaW4gZWRpdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4NTQiPjExODU0PC9hPgotTlBFIG9uIHNhdmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgwNSI+MTE4MDU8L2E+Ci1idWlsZCBvdXRwdXQgZmlsdGVyIGlzIGlnbm9yZWQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTU2OCI+MTE1Njg8L2E+Ci1Db2RlIHJlc29sdmUgZG9lcyBub3Qgd29yayBmb3IgY2hhbmdlZCBjb25zdHJ1Y3RvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjU2Ij4xMTY1NjwvYT4KLVBsZWFzZSBhZGQgYSBJQ29tcGxldGlvblJlcXVlc3RvckFkYXB0ZXIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjcxIj45MjcxPC9hPgotTlBFIGluc3BlY3RpbmcgIm51bGwiIGluIHRoZSBleHByZXNzaW9ucyB2aWV3IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjM4Ij4xMTYzODwvYT4KLWFzdDogQ29tcGlsYXRpb25Vbml0OjpmaW5kRGVjbGFyaW5nTm9kZSBmYWlscyAKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzIiPjExMjcyPC9hPgotc2xvdyBjb250ZXh0IGFzc2lzdCBvbiBtZXRob2QvZmllbGQtcmljaCBjbGFzc2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNDAiPjExMzQwPC9hPgotb3BlbiBvbiBzZWxlY3Rpb24gZG9lcyBub3Qgd29yayBmb3IgYmluYXJ5IHR5cGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTQiPjExNjU0PC9hPgotTlBFIGR1cmluZyBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjU5Ij4xMTY1OTwvYT4KLWFzdDogQ29tcGlsYXRpb25Vbml0OjpmaW5kRGVjbGFyaW5nTm9kZSBmYWlscyAjMiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTA4NiI+MTEwODY8L2E+Ci1DbGFzc0ZpbGVDb21waWxhdGlvblVuaXQgc2hvdWxkIGltcGxlbWVudCBJQ2xhc3NGaWxlCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxOSAtIDE5dGggTWFyY2ggMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzQKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT4gTmV3IEFQSSBvbiBJVHlwZSBmb3IgY29tcGxldGUgc25pcHBldCBpbiBjdXJyZW50IHR5cGUgY29udGV4dC4gQ29kZSBjb21wbGV0ZSBpcyBwZXJmb3JtZWQgYWdhaW5zdAotIHNvdXJjZSAoaWYgYXZhaWxhYmxlKSBvciBhZ2FpbnN0IHR5cGUgc3RydWN0dXJlCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDx0dD52b2lkIGNvZGVDb21wbGV0ZSg8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHNuaXBwZXQsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBpbnNlcnRpb24sPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBwb3NpdGlvbiw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzU3RhdGljLDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247PC90dD4KLTxicj4mbmJzcDsKKzxsaT4gQ3JlYXRpbmcgYSB3b3JraW5nIGNvcHkgb24gYSBub24tZXhpc3RpbmcgSUNvbXBpbGF0aW9uVW5pdCBpcyBub3cgYWxsb3dlZC4gCisgICAgICAgU3VjaCBhIHdvcmtpbmcgY29weSB3aWxsIGhhdmUgaXRzIGNvbnRlbnRzIGluaXRpYWxpemVkIHRvIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICBDb21taXRpbmcgdGhpcyB3b3JraW5nIGNvcHkgY3JlYXRlcyB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0LgogPC9saT4KLTwvdWw+Cis8L3VsPiAKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyNTciPjIzMjU3PC9hPgorSUluaXRpYWxpemVyOjpnZXROYW1lUmFuZ2UgcmV0dXJucyBpbmNvcnJlY3QgcmVzdWx0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzMTgiPjIzMzE4PC9hPiAgCitSZXNvbHV0aW9uIG9mIENpcmN1bGFyIERlcC4gcHJlZmVyZW5jZS9lcnJvciBtZXNzYWdlIGZpbHRlcmluZyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMTMiPjIzMTEzPC9hPgorUmVxdWVzdCB0byBlbnJpY2ggbWVzc2FnZXMgcHJvdmlkZWQgYnkgQVNUIHdpdGggZXJyb3JzIGRlZmluZWQgaW4gSVByb2JsZW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE1NCI+MjIxNTQ8L2E+CitQcm9wb3NlZCBtZXRob2QgZm9yIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzE4MSI+MjMxODE8L2E+CitJU2Nhbm5lciByZXR1cm5zIGluY29ycmVjdCB3aGl0ZXNwYWNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjU5Ij4yMzI1OTwvYT4KK0FTVDogU3dpdGNoQ2FzZSB3cm9uZyBsZW5ndGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzExNyI+MjMxMTc8L2E+CitET006IG5vIGVycm9yIG1lc3NhZ2UgZm9yIG1ldGhvZCB3aXRoIHdyb25nIHJldHVybiB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyMTUiPjIwMjE1PC9hPgorQmF0Y2ggY29tcGlsZXIgaWdub3JlcyB0aGUgQ0xBU1NQQVRIIGVudiB2YXJpYWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDU0Ij4yMzA1NDwvYT4KK0RPTSAtIFR5cGVEZWNsYXJhdGlvbi5nZXRKYXZhZG9jKCkgY2FuIGZpbmQgaW5jb3JyZWN0IGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjA1NCI+MjIwNTQ8L2E+CitDYW4ndCBleHRyYWN0IGxvY2FsIHZhcmlhYmxlIGZyb20gc3VwZXIgc2VuZCBbcmVmYWN0b3JpbmddCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNjEiPjIyMTYxPC9hPgorQVNUOiBJbm5lcmNsYXNzIG5hbWU6IFBvc2l0aW9ucyB3cm9uZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTI2Ij4yMjUyNjwvYT4KK1dhcm5pbmcgZ2l2ZW4gd2hlbiBpbXBsZW1lbnRpbmcgZGVwcmVjYXRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNTAiPjIzMDUwPC9hPgorRE9NIC0gSVZhcmlhYmxlQmluZGluZy5nZXRNb2RpZmllcnMoKSBkb2Vzbid0IGdpdmUgZmluYWwgbW9kaWZpZXIgZm9yIGxvY2FsIHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyOTM5Ij4yMjkzOTwvYT4KK2FzdDogaW5jb3JyZWN0IHJhbmdlIGZvciBhIG5hbWUgaW4gYnJhY2tldHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQ1OCI+MjI0NTg8L2E+ICAKK1JlZmFjdG9yaW5nIGEgcGFja2FnZSBkb2VzIG5vdCBtb3ZlIHRoZSBwYWNrYWdlJ3MgZGlyZWN0b3J5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTc2Ij42OTc2PC9hPgorQXV0byBjb2xsZWN0IHRhc2tzIGZyb20gY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDUyIj4yMzA1MjwvYT4KK0RPTSAtIENDRSBjYWxsaW5nIHJlc29sdmVCaW5kaW5nIG9uIGFuIG9uLWRlbWFuZCBpbXBvcnQgZnJvbSBhIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjYzNSI+MjI2MzU8L2E+CityZWNvbXBpbGUgZG9lc24ndCBoYXBwZW4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzExOCI+MjMxMTg8L2E+CitBU1Q6IEJyZWFrU3RhdGVtZW50ICYgQ29udGludWVTdGF0ZW1lbnQ6IHdyb25nIGxlbmd0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDQ4Ij4yMzA0ODwvYT4KK0RPTSAtIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgZW1wdHkgbG9vcCBib2RpZXMgY2F1c2VzIGJpbmRpbmcgcmVzb2x1dGlvbiB0byBmYWlsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyMDMiPjIyMjAzPC9hPgorTW9yZSBkZXBlbmRlbmNpZXMgaW5jcmVhc2UgR1VJIHdhaXRpbmcgdGltZSBbYnVpbGQgcGF0aF0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUyOSI+MTE1Mjk8L2E+Cithc3Q6IG1pc3NpbmcgKD8pIGJpbmRpbmcgb24gc2ltcGxlTmFtZSBpbiBWYXJpYWJsZURlY2xhcmF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5MjEiPjg5MjE8L2E+ICAKK0RDUiAtIE5lZWQgYSB3YXkgdG8gY3JlYXRlIGEgd29ya2luZyBjb3B5IGlnbm9yaW5nIGV4aXN0aW5nIGZpbGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjY3MyI+MjI2NzM8L2E+ICAKK1ZlcmlmeUVycm9yIGluIGNoYXIgY2FzdCBvZiBzdGF0aWMgZmluYWwgY2hhciByZWZlcmVuY2VkIHRocm91Z2ggaW5zdGFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA3NSI+MjMwNzU8L2E+ICAKK1dyb25nIGNvbXBpbGluZyBvZiBpbm5lciBjbGFzc2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNzciPjIzMDc3PC9hPiAgCitzZWFyY2g6IGRvZXMgbm90IGZpbmQgdHlwZSByZWZlcmVuY2VzIGluIHNvbWUgaW1wb3J0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjk0MiI+MjI5NDI8L2E+ICAKK0phdmFQcm9qZWN0LmV4aXN0cyByZXR1cm5zIHRydWUgd2hlbiBpdCBzaG91bGQgbm90ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjUxNyI+MjI1MTc8L2E+ICAKK0Nhbm5vdCBjcmVhdGUgdHlwZSBYIGluIHByb2plY3QgVGVzdCBpZiBkOlx0ZXN0XFguamF2YSBleGlzdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4Njg0Ij4xODY4NDwvYT4gIAorT3JnYW5pemUgSW1wb3J0cyBkb2Vzbid0IHdvcmsgb24gZXh0ZXJuYWwgSmFycyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5NDYiPjIyOTQ2PC9hPiAgCitzZWFyY2g6IE5QRSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI2MzciPjIyNjM3PC9hPiAgCitBU1Q6IFR5cG9zIGluIEphdmFkb2MgQXNzaWdubWVudC5PcGVyYXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MjEwIj4xNzIxMDwvYT4gIAorTm8gbWF0Y2ggZm91bmQgd2hlbiBxdWVyeSBjb250YWlucyAnPycgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDIwIj4yMTQyMDwvYT4gIAorQ2hhbmdpbmcgLmNsYXNzcGF0aCBkb2Vzbid0IHVwZGF0ZSBKRFQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDg1Ij4yMTQ4NTwvYT4gIAorTlBFIHdoZW4gZG9pbmcgYSByZWZlcmVuY2Ugc2VhcmNoIHRvIGEgcGFja2FnZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0MjgiPjIyNDI4PC9hPgorQ29tcGlsZXIgMS40IC0gc2hvdWxkIHJlcG9ydCB2aXNpYmlsaXR5IGlzc3VlIGZvciBzaGFkb3dlZCBwcm90ZWN0ZWQgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0MTgiPjIyNDE4PC9hPgorU2hvdWxkIG5vdCBjb21wbGFpbiBhYm91dCBwYWNrYWdlIGZvciBlbXB0eSB1bml0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTAyIj4yMjEwMjwvYT4gIAorTm90IGFsbCBpbXBsZW1lbnRvcnMgZm91bmQgZm9yIElQYXJ0TGlzdGVuZXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjMxIj4yMDYzMTwvYT4gIAorRGVjbGFyYXRpb24gb2YgbG9jYWwgYmluYXJ5IHR5cGUgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDQzNSI+MjA0MzU8L2E+ICAKK05QRSB3aGVuIHNlYXJjaGluZyBqYXZhIG1ldGhvZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzMzQiPjIyMzM0PC9hPgorQ29tcGlsZXIgZ2VuZXJhdGVzIGNvcnJ1cHQgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzYxIj4yMjM2MTwvYT4KK0Vycm9yIGluIGphdmFkb2MgZm9yIEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTc0OSI+MjE3NDk8L2E+CitFeHBvcnRlZCBsaWJyYXJpZXMgYW5kIHNvdXJjZSBmb2xkZXJzCiAKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMxOCI+MTAzMTg8L2E+Ci1GZWF0dXJlIFJlcXVlc3Q6IG5ldyBDb2RlIEFzc2lzdCBBUEkgcmVxdWlyZWQKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyODMwIj4yMjgzMDwvYT4KK1N1YnRsZSB2aXNpYmlsaXR5IHByb2JsZW06IGNsYXNzIGRlY2xhcmF0aW9uIHJlc29sdmVkIGltcHJvcGVybHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI2NCI+MjMyNjQ8L2E+Cithc3Q6IGluY29ycmVjdCBub2RlIGhpZXJhcmNoeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTE2Ij4yMzExNjwvYT4KK0RDUjogTW9kaWZpZXJOb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNTUiPjIzMDU1PC9hPgorRE9NIC0gU3VwZXJNZXRob2RJbnZvY2F0aW9uLnJlc29sdmVUeXBlQmluZGluZygpIHJldHVybnMgbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg0MyI+MjE4NDM8L2E+ICAKK1F1YWxpZmllciBpbiAiVHlwZSBIaWVyYXJjaHkiIFZpZXcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMTU4Ij4yMTE1ODwvYT4gIAorRGVhZGxvY2sgb24gc3RhcnR1cCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI4ODMiPjIyODgzPC9hPiAgCitJSmF2YVByb2plY3Q6OmZpbmQoU3RyaW5nKSByZXR1cm5zIG51bGwgZm9yIG5vbi1wcmltYXJ5IHRvcC1sZXZlbCB0eXBlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxMjMiPjIyMTIzPC9hPiAgCitJbmFiaWxpdHkgdG8gcHV0IGEgY2xhc3NwYXRoIHZhciBwb2ludGluZyB0byBhIGRpciBpbnNpZGUgdGhlIHByb2plY3Qgd2hpY2ggaXMgb25lIGRpciB1cCBmcm9tIG91dHB1dCBkaXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDk2Ij4xMjQ5NjwvYT4gIAorQ3JlYXRpbmcgYSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgbm90IHBvcHVsYXRlIGphdmEgbW9kZWwgY2FjaGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNDUzIj4yMjQ1MzwvYT4KK0NvbXBpbGVyIFByb2JsZW0KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE0OSI+MjIxNDk8L2E+CitqZGsgY29tcGlsZXMgYnV0IGVjbGlwc2UgZG9lcyBub3QKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci0KLTxoMT4KKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMTggLSAxOHRoIE1hcmNoIDIwMDIKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjMzCitFY2xpcHNlIFNESyAyLjAgQnVpbGQgLSAxc3QgQXVndXN0IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjcwCiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08bGk+IEFkZGVkIG9wdGlvbiB0byB0cmFjZSBqYXZhIHNlYXJjaCBhY3Rpdml0eS4KLSAgICBUbyBlbmFibGUgaXQsIHNlZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zIGZpbGU6Ci0gICAgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoPXRydWU8L2NvZGU+Cis8L3VsPiAKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIwOTMiPjIyMDkzPC9hPgorVmVyaWZ5RXJyb3IgZHVlIHRvIGR1cGxpY2F0ZSBhY2Nlc3MgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MTYiPjIxOTE2PC9hPgorVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MTEiPjIxOTExPC9hPgorTlBFIGluIHRoZSBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MTciPjc1MTc8L2E+CitObyBjb250cm9sIG9mIGZvcm1hdHRpbmcgZm8gZG8ge30gd2hpbGUgYmxvY2tzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIwNzgiPjIyMDc4PC9hPgorSW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UKKworCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDMwdGggSnVseSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2OQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZCBhIG5ldyBBUEkgZ2V0UmF3VG9rZW5Tb3VyY2UoKSBvbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lci4gSXQgc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHVzZXIgZG9lc24ndAord2FudCB0aGUgVW5pY29kZSBjaGFyYWN0ZXJzIHRvIGJlIHByb2Nlc3NlZCwgb3RoZXJ3aXNlIHVzZSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKS48L2xpPgorPC91bD4gCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTEyIj4yMTkxMjwvYT4KK0NvbXBpbGVyIHByb2JsZW1lOiBjb250aW51ZSBzdGF0ZW1lbnQgd2l0aCBsYWJlbCBpZGVudGlmaWVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNTgiPjIxMzU4PC9hPgorRE9NL0FTVDogc2V0TGVhZGluZ0NvbW1lbnQgYW5kIHNldEphdmFkb2NDb21tZW50IGRvZXNuJ3Qgc3VwcG9ydCBVbmljb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4MjgiPjIxODI4PC9hPgorUG9zc2libGUgcHJvYmxlbSBpbiBEb1N0YXRlbWVudCNhY2NlcHQwKC4uLikKKyAgCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDU4Ij4zNDU4PC9hPgorUmVzb3VyY2UgZm9sZGVycyBjb250YWluaW5nIHNvdXJjZSAoMUc0Q0tHOSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTYyNyI+MjE2Mjc8L2E+CitDb21waWxlZCBjbGFzcyBlcnJvciBvbiBpU2VyaWVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3MjMiPjIxNzIzPC9hPgorR2V0dGluZyBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTc2Ij4xNjE3NjwvYT4KK1JlZmVyZW5jZXMgdG8gcHJpdmF0ZSBmaWVsZHMgY291bGQgYmUgb3B0aW1pemVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExMDkiPjIxMTA5PC9hPgorSGF2ZSBvcHRpb24gZm9yIGNvbXBpbGVyIHdhcm5pbmcgb24gdXNlIG9mIHN0YXRpYyBmaWVsZC9tZXRob2QgdGhyb3VnaCByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU3Ij4zMzU3PC9hPgorRENSIC0gQWRkIGNvbXBpbGVyIG9wdGlvbiAoMUdKSlFBRCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg3OSI+MjE4Nzk8L2E+CitTZWFyY2ggY291bGQgYmUgb3B0aW1pemVkIGJhc2VkIG9uIHZpc2liaWxpdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg2OCI+MjE4Njg8L2E+CitObyByZXR1cm4gc3RhdGVtZW50IGZvciBjb2RlIHdpdGggaW5maW5pdGUgbG9vcAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODIwIj4yMDgyMDwvYT4KK1NxdWlnZ2x5IGxpbmUgaXMgYXQgYSBiYWQgcGxhY2UgZm9yIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMCBCdWlsZCAtIDIzcmQgSnVseSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2OAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIG9wdGlvbmFsIGNvbXBpbGVyIHByb2JsZW0gZm9yIHNpZ25hbGxpbmcgbm9uLXN0YXRpYyBpbnZvY2F0aW9ucyBvZiBzdGF0aWMgZmllbGQvbWV0aG9kcworKHNlZSA8Y29kZT5KYXZhQ29yZS5DT01QSUxFUl9QQl9TVEFUSUNfQUNDRVNTX1JFQ0VJVkVSKCk8L2NvZGU+KQogPC9saT4KLTxsaT5BZGRlZCBBUEkgPGNvZGU+Q29ycmVjdGlvbkVuZ2luZSNjb21wdXRlQ29ycmVjdGlvbnMoSVByb2JsZW0sIElDb21waWxhdGlvblVuaXQsIElDb3JyZWN0aW9uUmVxdWVzdG9yKTwvY29kZT4sIGFsbG93aW5nLgotdG8gY29tcHV0ZSByZXBsYWNlbWVudCBjb3JyZWN0aW9ucyBmb3IgSVByb2JsZW0ocykgZGV0ZWN0ZWQgd2hpbGUgcmVjb25jaWxpbmcuPC9saT4KLTxsaT5BZGRlZCBBUEkgPGNvZGU+SVNvdXJjZVJlZmVyZW5jZSNleGlzdHMoKTwvY29kZT4sIGFsbG93aW5nLgotdG8gY2hlY2sgZXhpc3RlbmN5IGJlZm9yZSBpbnZva2luZyA8Y29kZT5JU291cmNlUmVmZXJlbmNlPC9jb2RlPiBiZWhhdmlvci4gQWxsIGltcGxlbWVudGF0aW9ucyBkaWQgYWxyZWFkeSBwcm92aWRlCi1hbiA8Y29kZT5leGlzdHMoKTwvY29kZT4gbWV0aG9kIHNpbmNlIHRoZXkgYWxzbyBhcmUgaW1wbGVtZW50aW5nIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4uPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUyNCI+MTE1MjQ8L2E+Ci1hcGk6IElXb3JraW5nQ29weTo6IGdldFdvcmtpbmdDb3B5KCkgamF2YWRvYwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExIj4xMTUxMTwvYT4KLUNvbXBpbGVyIDEuNCBmb29sZWQgYnkgZXh0cmEgaW50ZXJmYWNlIG1ldGhvZHMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM4OSI+MTEzODk8L2E+Ci1VbnVzZWQgcGFyYW1ldGVycyBub3Qgc2hvd2luZyB1cCBhcyBjb21waWxlciB3YXJuaW5ncyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQxMCI+MTE0MTA8L2E+Ci1FeGNlcHRpb24gaW4gSmF2YSBCdWlsZGVyIHdoZW4gZGVidWcgb3B0aW9ucyB0dXJuZWQgb2ZmIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjg1Ij4xMTI4NTwvYT4KLVBvdGVudGlhbCBOUEUgaW4gQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24ucHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDQwIj4xMTQ0MDwvYT4KLW5wZSBpbiByZW5hbWUgdGVtcCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ2OCI+MTE0Njg8L2E+Ci1OUEUgZGVsZXRpbmcgcHJvamVjdCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzUiPjExNDM1PC9hPgotY29tcGlsZXIgYnVnOiBvdmVyd3JpdGluZyBpbXBsaWNpdGVseSBhYnN0cmFjdCBtZXRob2QgaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNTAiPjExMjUwPC9hPgotTlBFIGluIGxvZyBhZnRlciBpbXBvcnRpbmcgcGx1Z2lucyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzEiPjExMjcxPC9hPgotVW5hYmxlIHRvIGRlbGV0ZSBhIGJpbmFyeSBwcm9qZWN0IGluIEphdmEgcGVyc3BlY3RpdmUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjEwIj4xMTIxMDwvYT4KLVJlc291cmNlRGVsdGFzIGFyZSBsb3N0IHdoZW4gbWVyZ2luZyBkZWx0YXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzcxIj4xMTM4MDwvYT4KLWFzdDogbWlzc2luZyBiaW5kaW5nIGZvciBDb25kaXRpb25hbEV4cHJlc3Npb24gCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNzEiPjExMzcxPC9hPgotRE9NL0FTVDogbm9kZSBtaXNzaW5nIGZvciBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNDMiPjYyNDM8L2E+Ci1hbiBJU291cmNlUmVmZXJlbmNlIEFQSSBpc3N1ZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjk2Ij4xMTI5NjwvYT4KLU5QRSBkdXJpbmcgYnVpbGQKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzOCI+MzQzODwvYT4KLU9wZW5PblNlbGVjdGlvbiAtIHNob3VsZCBiZSBhYmxlIHRvIGxvY2F0ZSBtaXNzaW5nIG1ldGhvZCBieSBndWVzc2luZyAoMUdMMTg2UCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQwNiI+MTE0MDY8L2E+Ci1BY3Rpb25QZXJmb3JtZWQoKSBtZXRob2QgaW4gQWJzdHJhY3RBY3Rpb24gbm90IGZvdW5kIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjEiPjMyMjE8L2E+Ci1KTSAtIERlYWRsb2NrIHdoaWxlIHNhdmluZyBpbiBFZGl0b3IgKDFHQUo2N1cpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMDEiPjExMjAxPC9hPgotQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBidWlsZCBwcm9jZXNzCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxNCAtIDE0dGggTWFyY2ggMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzIKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT5BZGRlZCBBUEkgPGNvZGU+SURPTUZhY3RvcnkuY3JlYXRlSW50ZXJmYWNlKCk8L2NvZGU+IGFuZCA8Y29kZT5JRE9NRmFjdG9yeS5jcmVhdGVDbGFzcygpPC9jb2RlPi4KLVNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4MCI+MTA5ODA8L2E+IGZvciBkZXRhaWxzLjwvbGk+Ci08L3VsPgotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU1Ij4xMTM1NTwvYT4KLU9wZW5PblNlbGVjdGlvbiB1bmFibGUgdG8gcGVyZm9ybSBpbiBzaW5nbGUtdHlwZSBpbXBvcnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjMyIj45MjMyPC9hPgotSUNvbXBpbGF0aW9uVW5pdC5kZWxldGUoKSBmYWlscyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNzYiPjExMTc2PC9hPgotT3JnYW5pemUgaW1wb3J0cyBtaXNzZXMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjQiPjMyMjQ8L2E+Ci1UZXN0cyAtIFJlLWVuYWJsZSByZWNvbmNpbGVyIHRlc3RzICgxR0FLWFpNKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTgwIj4xMDk4MDwvYT4KLUpEVCAvIGZhY3RvcnkgZm9yIG5ldyBpbnRlcmZhY2VzIHdvdWxkIGJlIG5pY2UgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5OTYiPjEwOTk2PC9hPgotY3JlYXRlQ29tcGlsYXRpb25Vbml0IGRvZXNuJ3QgYmVoYXZlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEyNSI+MTExMjU8L2E+Ci1ET00vQVNUOiBBUEkgcmVxdWVzdCA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzciPjExMjc3PC9hPgotRGlmZmVyZW5jZSBpbiBiZXR3ZWVuIG91dGxpbmVyIGNvbnRlbnQgYW5kIHVuaXQgY29udGVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODMzIj4xMDgzMzwvYT4KLU9wZW4gdHlwZSBkb2Vzbid0IHByb3Bvc2UgYWxsIHR5cGUgYWZ0ZXIgYSBjaGVja291dCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwNjciPjExMDY3PC9hPgotQWRkaW5nIHVzZWZ1bCB0b1N0cmluZygpIG1ldGhvZCBmb3IgZWFjaCBuZXcgRE9NL0FTVCBub2RlcyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTMzIj45OTMzPC9hPgotRm9ybWF0IGRvZXMgbm90IGhhbmRsZSBzeW5jaHJvbml6ZWQga2V5d29yZCBjb3JyZWN0bHkgCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NzUiPjg2NzU8L2E+Ci1EQ1IgLSBDb2RlIGNvcnJlY3Rpb24gY291bGQgc3VnZ2VzdCBuZXcgZWxlbWVudCBjcmVhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzQxIj4xMTM0MTwvYT4KLWluY29ycmVjdCBvdXRsaW5lIChpIHNlZSBvbmx5IGltcG9ydHMpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMTciPjExMjE3PC9hPgotaXMgZG91YmxlICI7ICIgb24gYSByZXR1cm4gc3RhdGVtZW50IGFuIGVycm9yPwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDMxIj4xMDAzMTwvYT4KLVNFRiBDbGFzc0Nhc3RFeGNlcHRpb24gCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxMiAtIDEydGggTWFyY2ggMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzEKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6Ci0gICAgIDx1bD4KLSAgICAgCTxsaT4gU2VhcmNoIGRvZXNuJ3QgcG9wdWxhdGUgdGhlIEphdmEgTW9kZWwgYW55IGxvbmdlci4gVGh1cyB0aGUgbWVtb3J5Ci0gICAgIAkgICAgdXNlZCBieSBhIHNlYXJjaCBvcGVyYXRpb24gY2FuIGJlIHJlY2xhaW1lZCBhdCB0aGUgZW5kLiA8L2xpPgotICAgICAJPGxpPiBBY2Nlc3MgdG8gemlwIGFuZCBqYXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQsIHdoaWNoIHNob3VsZCByZXN1bHQKLSAgICAgCSAgICAgaW4gYmV0dGVyIHBlcmZvcm1hbmNlIG9uIGEgc2xvdyBuZXR3b3JrLiA8L2xpPgotICAgICA8L3VsPgotICAgICA8L2xpPgotPGxpPiBBZGRlZCBmbGFnIDxjb2RlPklKYXZhRWxlbWVudERlbHRhLkZfRklORV9HUkFJTkVEPC9jb2RlPiB0aGF0IGluZGljYXRlcwotICAgICB0aGF0IGEgZmluZS1ncmFpbmVkIGRlbHRhIHdhcyBjb21wdXRlZCBmb3IgYSBnaXZlbiBkZWx0YS4KLSAgICAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgZmxhZyB0byBmaW5kIG91dCBpZiBhIGNvbXBpbGF0aW9uIHVuaXQgCi0gICAgIHRoYXQgaGF2ZSBhIDxjb2RlPkZfQ09OVEVOVDwvY29kZT4gY2hhbmdlIHNob3VsZCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgCi0gICAgIG5vIGZpbmVyIGdyYWluZWQgY2hhbmdlcyAoPGNvZGU+Rl9GSU5FX0dSQUlORUQ8L2NvZGU+IGlzIHNldCkgb3IgaWYgCi0gICAgIGZpbmVyIGdyYWluZWQgY2hhbmdlcyB3ZXJlIG5vdCBjb25zaWRlcmVkICg8Y29kZT5GX0ZJTkVfR1JBSU5FRDwvY29kZT4gCi0gICAgIGlzIG5vdCBzZXQpLiAKLSAgICAgPC9saT4KLTxsaT4gU3VyZmFjaW5nIElQcm9ibGVtICg8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTwvY29kZT4pIAotCTxicj5UaGlzIGFsbG93cyBzb21lIEphdmEgQVBJIHRvIHJlcG9ydCBmYWlsdXJlcyBpbiBhIGxpZ2h0ZXIgd2F5IHRoYW4gZ2VuZXJhdGluZyBtYXJrZXJzLiBNYXJrZXIgYmFzZWQgQVBJIGhhdmUgYmVlbgotCWRlcHJlY2F0ZWQgKG5vdGUgdGhhdCBkdWUgdG8gc29tZSBkZWFkbG9jayBpbiBjbGllbnQgY29kZSwgc29tZSBvZiB0aGVzZSBBUEkgZGlkIG5vdCBldmVuIHByb2R1Y2UgbWFya2VycywgZS5nLiByZWNvbmNpbGluZykuIEluIGFkZGl0aW9uIHRvCi0Jc3VyZmFjaW5nIHByb2JsZW0gZGVzY3JpcHRpb25zLCBJUHJvYmxlbSBleHBvc2VzIGFsbCB0aGUgSURzIGZvciB0aGUgSmF2YSBwcm9ibGVtIG1hcmtlcnMgKGF0dHJpYnV0ZSAiaWQiIG9uIG1hcmtlcnMgb2YgdHlwZSAib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSIpPC9saT4KLTxsaT4gQ2hhbmdlZCBlcnJvciByZXBvcnRpbmcgbWV0aG9kIGZvciA8Y29kZT5JQ29tcGxldGlvblJlcXVlc3RvcjwvY29kZT4gdG8gc3VyZmFjZSBJUHJvYmxlbXMgaW5zdGVhZCBvZiBJTWFya2Vycy48L2xpPgotPC91bD4KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE5MSI+MTExOTE8L2E+Ci1TdHJhbmdlIGFub255bW91cyB0eXBlcyBpbiBvdXRsaW5lIHN0cnVjdHVyZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTUxIj4xMTE1MTwvYT4KLWFzdDogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9uIEFTVCBjcmVhdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDUzOCI+MTA1Mzg8L2E+Ci1Qb3NzaWJsZSBtZW1vcnkgbGVhaz8KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDYxNiI+MTA2MTY8L2E+Ci1TdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9wZW5pbmcgdHlwZSBzZWxlY3Rpb24gZGlhbG9nCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTIiPjExMTUyPC9hPgotQ29kZSBTZWxlY3QgLSBkb2VzIG5vdCB3b3JrIHdpdGggZW1wdHkgc2VsZWN0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMjkiPjExMTI5PC9hPgotRE9NL0FTVDogQ2FsbCByZXNvbHZlVHlwZUJpbmRpbmcoKSBvbiBhIENhc3RFeHByZXNzaW9uIG9iamVjdCB0aHJvd3MgYSBOdWxsUG9pdG5lckV4Y2VwdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU2Ij4zMjU2PC9hPgotU2VhcmNoYWJsZUVudmlyb25tZW50IC0gY29udmVydHMgY2hhcltdIHRvIFN0cmluZywgd2hpY2ggYWZmZWN0cyBwZXJmb3JtYW5jZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTg0Ij4xMDk4NDwvYT4KLURPTS9BU1Q6IENVIHdpdGggc3ludGF4IGVycm9ycyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwNiI+MTExMDY8L2E+Ci1ET00vQVNUOiBkbyBzdGF0ZW1lbnQgZG9lc24ndCBjb250YWluIHRyYWlsaW5nIHNlbWljb2xvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEwNCI+MTExMDQ8L2E+Ci1ET00vQVNUOiBOdW1iZXJMaXRlcmFsIGNvbnRhaW5zIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGNvbW1lbnRzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjEzIj4xMDIxMzwvYT4KLVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoKElKYXZhRWxlbWVudFtdKSBkb2VzIG5vdCB3b3JrIGZvciBiaW5hcnkgZWxlbWVudHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNDAiPjkyNDA8L2E+Ci1TZWFyY2ggZmluZHMgZGVsZXRlZCBjbGFzc2VzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTAxMSI+MTEwMTE8L2E+Ci1pbmNvcnJlY3QgJ3ZhcmlhYmxlIG5ldmVyIHVzZWQnIHdhcm5pbmcKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTAyNSI+MTEwMjU8L2E+Ci1leHRyYWN0IG1ldGhvZDogaW5jb3JyZWN0bHkgZGlzYWxsb3dlZCBvbiBzb21lIGJvb2xlYW4gZXhwcmVzc2lvbnMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTciPjEwNjk3PC9hPgotUGVyZm9ybWFuY2UgLSBCaW5hcnkgbW9kZWwgc2hvdWxkIG5vdCBjYWNoZSB0aGUgY2xhc3NmaWxlIGJ5dGVzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDM3Ij4xMTAzNzwvYT4KLURPTS9BU1Q6IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGNyZWF0aW4gQVNUIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjM1Ij4xMDYzNTwvYT4KLU92ZXJyaWRlIG1ldGhvZHMgbm90IHNob3dpbmcgbWlzc2luZyBtZXRob2RzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTMwIj43OTMwPC9hPgotQ29kZSBBc3Npc3QgLSBObyBjb21wbGV0aW9uIGluIHN3aXRjaCBzdGF0ZW1lbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk3OSI+MTA5Nzk8L2E+Ci1KRE9NL2FkZCBzdXBlcmludGVyZmFjZSBmb3JtYXQgcHJvYmxlbSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4NiI+MTA5ODY8L2E+Ci1ET00vQVNUOiBOUEUgd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBhIGJpbmRpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1ODAiPjEwNTgwPC9hPgotdHlwZSBoaWVyYXJjaHkgaW5jb3JyZWN0IGZvciBuZXN0ZWQgdHlwZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTM1Ij4xMDkzNTwvYT4KLURPTS9BU1Q6IHdyb25nIGxlbmd0aCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTExIj42MTExPC9hPgotTWlzc2luZyBjb21wbGV0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODk4Ij4xMDg5ODwvYT4KLURPTS9BU1Q6IE51bGxQb2ludGVyRXhjZXB0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjEiPjMyNjE8L2E+Ci1TZWFyY2ggLSBNZW1vcnkgcGVhayBkdXJpbmcgc2VhcmNoICgxR0VOMTdMKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NyI+NjY2NzwvYT4KLVNlYXJjaDogT3V0T2ZNZW1vcnlFcnJvciBzZWFyY2hpbmcgd2lsZGNhcmRlZCBmaWVsZCByZWYgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODc0Ij4xMDg3NDwvYT4KLURPTS9BU1Q6IENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjb250YWlucyB0cmFpbGluZyBjb21tZW50IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODgxIj4xMDg4MTwvYT4KLURPTS9BU1Q6IFN3aXRjaENhc2UuaXNEZWZhdWx0IGFsd2F5cyByZXR1cm5zIGZhbHNlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODY1Ij4xMDg2NTwvYT4KLURPTS9BU1Q7IEFTVC5yZXNvbHZlV2VsbEtub3duVHlwZSgidm9pZCIpIHJldHVybnMgbnVsbCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg2MSI+MTA4NjE8L2E+Ci1ET00vQVNUOiBUeXBlTGl0ZXJhbC5yZXNvbHZlVHlwZUJpbmRpbmcgZG9lc24ndCByZXR1cm4gY2xhc3MgQ2xhc3MgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTkiPjEwODE5PC9hPgotSW5jb21wbGV0ZSB0YXNrIGRlc2NyaXB0aW9uIGFmdGVyIGJ1aWxkIHdpdGggaW5jb21wbGV0ZSBjbGFzc3BhdGgKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ2OCI+MTA0Njg8L2E+Ci1ET00vQVNUOiBUeXBlRGVjbGFyYXRpb24jaXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBkb2Vzbid0IGNvbnNpZGVyIGFub255bW91cyB0eXBlcyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ5OSI+MTA0OTk8L2E+Ci1ET00vQVNUOiBuZWVkIGEgd2F5IHRvIGFjY2VzcyB0aGUgSU1ldGhvZEJpbmRpbmcgb2YgYSBDbGFzc0luc3RhbmNlQ3JlYXRpb24gCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0OTYiPjEwNDk2PC9hPgotRE9NL0FTVDogbmVlZCBmb3IgYSBub2RlIHRoYXQgaG9sZHMgdGhlIGJvZHkgc3RhdGVtZW50cyBvZiBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc4MSI+MTA3ODE8L2E+Ci1hc3Q6IGluY29ycmVjdCBwb3NpdGlvbiBhbmQgbGVuZ3RoIGZvciBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQzIj4xMDg0MzwvYT4KLURPTS9BU1Q6IHdyb25nIHN0cnVjdHVyZSBmb3IgZm9yIHN0YXRlbWVudHMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NjMiPjEwNjYzPC9hPgotYXN0OiBleGNlcHRpb24gaW4gQVNUIGNvbnZlcnRlciAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc1OSI+MTA3NTk8L2E+Ci1hc3Q6IGluY29ycmVjdCBsZW5ndGggb2YgU2ltcGxlTmFtZSAoc3Vic3Vibm9kZSBvZiBBcnJheVR5cGUpIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTAwIj4xMDUwMDwvYT4KLVNob3VsZG4ndCBpZ25vcmUgaW5oZXJpdGVkIG1ldGhvZCB3aXRoIHdyb25nIGFyZ3VtZW50IHR5cGVzCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjI3Ij4xMDYyNzwvYT4KLVJlYnVpbGQgRGVsZXRlcyBub24tQ2xhc3MgUmVzb3VyY2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMyI+MzIzMzwvYT4KLUpNIC0gQ3JlYXRlRWxlbWVudEluQ3VPcGVyYXRpb24gc2hvdWxkIG5vdCBzYXZlIHdvcmtpbmcgY29weSAoMUdCRUtBVykgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDUiPjM0NDU8L2E+Ci1zZWFyY2g6IHR5cGUgaGllcmFyY2h5IHNjb3BlIGluY29ycmVjdCAoMUdMQzhWUykgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTU0Ij4xMDk1NDwvYT4KLUlNZW1iZXI6OmdldEZsYWdzIHNlbWFudGljcyBvbiBpbnRlcmZhY2UgbWVtYmVycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTUiPjMxOTU8L2E+Ci1Vbm5lY2Vzc2FyeSBwcm9wb3NhbHMgaW4gT3BlbiBvbiBzZWxlY3Rpb24gd2hpdGggc3ludGF4IGVycm9yICgxRzBFSUJCKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTMzIj4xMDkzMzwvYT4KLURPTS9BU1Q6IHBvc2l0aW9uIG9mIEFub255bW91c1R5cGVEZWNsYXJhdGlvbiBpcyBbLTEsMF0gCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MTUiPjEwODE1PC9hPgotRXJyb3IgbWVzc2FnZSBmb3IgImluY29tcGxldGUgcGF0aCIgbGFja3MgZGV0YWlscwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTEzIj4xMDkxMzwvYT4KLURPTS9BU1Q6IHJlc29sdmVCaW5kaW5nKCkgZm9yIHN0YXRpYyBmaWVsZCBhY2Nlc3MgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTgiPjEwNjk4PC9hPgotRE9NL0FTVDogZXhjZXB0aW9uIHdoZW4gY3JlYXRpbmcgQVNUIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NDYiPjQ5NDY8L2E+Ci1Dcm9zcy1wcm9qZWN0IGJ1aWxkZXIgZWZmaWNpZW5jeSBpc3N1ZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEzIj4zMjEzPC9hPgotTm8gY29tcGlsZSBlcnJvciBmb3IgYmFkIGludGVyZmFjZSAoMUc3RzZNMSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY2NyI+MTA2Njc8L2E+Ci1OUEUgaW4gc2VsZiBlbmNhcHN1bGF0ZSBmaWVsZCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM4OSI+MTAzODk8L2E+Ci1FZGl0aW5nIG5vbi1KYXZhIGZpbGVzIGNhdXNlcyBhIHJlY29tcGlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzEzIj4xMDMxMzwvYT4KLUNhbiBub3QgY3JlYXRlIEphdmEgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZSAoMTAwMCsgSmF2YSBmaWxlcykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc5NCI+MTA3OTQ8L2E+Ci1OUEUgZnJvbSBzZWFyY2ggZHVyaW5nIHJlZmFjdG9yLCBwdWxsIHVwIG1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjk5Ij4xMDY5OTwvYT4KLWFzdDogbm90aGluZyBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBpcyBjcmVhdGVkIAotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMDUgLSA1dGggTWFyY2ggMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzAKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT4gQWRkZWQgQVBJIDxjb2RlPklDbGFzc0ZpbGUuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPgotCSBmb3IgY29uc2lzdGVuY2Ugd2l0aCA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+LgotICAgICBUaGUgcmV0dXJuZWQgd29ya2luZyBjb3B5IGlzIGp1c3QgYSB3cmFwcGVyIG9uIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyLgotICAgICBUaHVzIG9ubHkgdGhlIDxjb2RlPmdldEJ1ZmZlcigpPC9jb2RlPiBvcGVyYXRpb24gaXMgdmFsaWQgb24gdGhpcyB3b3JraW5nCi0gICAgIGNvcHkuCis8bGk+Q29tcGlsYXRpb24gcHJvYmxlbSBkZXNjcmlwdGlvbnMgYXJlIG5vdyBzaG9ydGVuZWQgKHF1YWxpZmllZCB0eXBlIGFyZ3VtZW50cworYXJlIGRlcXVhbGlmaWVkIGluIHRoZSBwcm9ibGVtIG1lc3NhZ2UsIHByb2JsZW0gYXJndW1lbnRzIGFyZSBsZWZ0IGZ1bGx5IHF1YWxpZmllZCkuCiA8L2xpPgotPGxpPiBBZGRlZCB0aGUgbm90aW9uIG9mIHNoYXJlZCB3b3JraW5nIGNvcGllcy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byBhbHdheXMKLSAgICAgZ2V0IHRoZSBzYW1lIDxjb2RlPklXb3JraW5nQ29weTwvY29kZT4gaW5zdGFuY2Ugd2hlbiBhc2tpbmcgZm9yIGEgd29ya2luZyBjb3B5LgotICAgICBTZWUgPGNvZGU+SVdvcmtpbmdDb3B5LmdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5KTwvY29kZT4sCi0gICAgIDxjb2RlPklXb3JraW5nQ29weS5maW5kU2hhcmVkV29ya2luZ0NvcHkoKTwvY29kZT4KLSAgICAgYW5kIDxjb2RlPklXb3JraW5nQ29weS5kZXN0cm95KCk8L2NvZGU+IGZvciBtb3JlIGRldGFpbC4KLTwvbGk+Ci08bGk+IEFkZGVkIG9wdGlvbiB0byB0cmFjZSB1c2Ugb2Ygc2hhcmVkIHdvcmtpbmcgY29waWVzLgotICAgIFRvIGVuYWJsZSBpdCwgc2VlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUgb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMgZmlsZToKLSAgICA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zaGFyZWR3b3JraW5nY29weT10cnVlPC9jb2RlPgotPC9saT4KLTxsaT4gQWRkZWQgZXh0ZW5zaW9uIHBvaW50IHRvIGpkdGNvcmUgc28gYXMgdG8gYWxsb3cgY2xpZW50IHBsdWdpbnMgdG8gcmVnaXN0ZXIgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycy4KLSAgRXh0ZW5zaW9uIHBvaW50IGlzICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIi4KLSAgKGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvfmNoZWNrb3V0fi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlJTIwaW5pdC91bmluaXQtY2xhc3NwYXRoLXZhcnMuaHRtbCI+ZGVzaWduIG5vdGVzPC9hPikKLSAgTm90ZSB0aGF0IGVhY2ggY2xhc3NwYXRoIHZhcmlhYmxlLCBpZiB1bmJvdW5kLCB3aWxsIHRyaWdnZXIgaXRzIHJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXIgZXhhY3RseSBvbmNlIHBlciBzZXNzaW9uLiBJZiB1bnN1Y2Nlc3NmdWwsIGl0IHdpbGwgc3RheSB1bmJvdW5kLgorPC91bD4gCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDAyIj4yMDQwMjwvYT4KK0Vycm9yIERlc2NyaXB0aW9uIHRvbyBsb25nLCBzaG91bGQgbm90IGxpc3QgZnVsbCBjbGFzcyBuYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3NzgiPjIxNzc4PC9hPgorQ2xhc3NGaWxlUmVhZGVyIGZhaWxzIG9uIEdub21lIFR3YWluIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3ODciPjIxNzg3PC9hPgorUHJvdmlkZSBjb21waWxlciB3YXJuaW5nIG9mIHVzaW5nIHN0YXRpYyBtZXRob2QgdmlhIG5vbi1zdGF0aWMgc3R5bGUuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE3NjgiPjIxNzY4PC9hPgorYXN0OiBpbmNvcnJlY3QgbGVuZ3RoIG9mIFNpbXBsZU5hbWUgaW4gTWV0aG9kRGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTc1NyI+MjE3NTc8L2E+Cithc3Q6IGluY29ycmVjdCByYW5nZSBmb3IgTmFtZSBpbiBUeXBlRGVjbGFyYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTc1NCI+MjE3NTQ8L2E+Cit0eXBvIGluIElUeXBlOjpnZXRTdXBlckludGVyZmFjZU5hbWVzIGphdmFkb2MKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY3MiI+MjE2NzI8L2E+CitXcm9uZyBsb2NhdGlvbiBmb3IgdGhlIGxhc3QgJ3JldHVybicgYnl0ZWNvZGUgY29tbWFuZAogCi08L2xpPgotPGxpPiBBZGRlZCBvcHRpb24gdG8gdHJhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucy4KLSAgICBUbyBlbmFibGUgaXQsIHNlZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zIGZpbGU6Ci0gICAgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3B2YXJpYWJsZT10cnVlPC9jb2RlPgotPC9saT4KLTxsaT5BZGRlZCBvcHRpb24gdG8gdHJhY2UgYWNjZXNzIHRvIHppcCBhbmQgamFyIGZpbGVzIGZyb20gdGhlIEphdmEgbW9kZWwuCi0gICAgVG8gZW5hYmxlIGl0LCBzZWUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBmaWxlOgotICAgIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2Vzcz10cnVlPC9jb2RlPgotPC9saT4KLTxsaT5SZXN1cnJlY3Qgc29tZSBjb2RlIGZvciBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQotCTx1bD4KLQk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25maWd1cmFibGVPcHRpb24gKGFsbCB0aGUgY2xhc3MpLgotCTxsaT4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyIChzb21lIG1ldGhvZHMpIDoKLQkJPHVsPgotCQk8bGk+IHB1YmxpYyBDb2RlRm9ybWF0dGVyKENvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzKQotCQk8bGk+IHByaXZhdGUgc3RhdGljIE1hcCBjb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncykKLQkJPGxpPiBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldERlZmF1bHRPcHRpb25zKExvY2FsZSBsb2NhbGUpCi0JCTxsaT4gcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBzb3VyY2VTdHJpbmcsIGludCBpbml0aWFsSW5kZW50YXRpb25MZXZlbCwgQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucykKLQkJPC91bD4KLQk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuT3B0aW9ucy5wcm9wZXJ0aWVzIChhbGwgdGhlIGZpbGUpCi0JPC91bD4KLTwvbGk+Ci08L3VsPgotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDMiPjMzMDM8L2E+Ci1NYW55IGVycm9ycyB3aGVuIGFkZGluZyBwcm9qZWN0cyBmcm9tIHJlcG9zaXRvcnkgaW4gYSBmcmVzaCBpbnN0YWxsICgxR0Y1UFU3KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyODUiPjUyODU8L2E+Ci1Db21waWxlIGVycm9ycyBvbiBsb2FkIHdoZW4gSmF2YSBQZXJzcGVjdGl2ZSBub3Qgb3BlbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwODUiPjcwODU8L2E+Ci1CdWlsZCBlcnJvcnMgd2hlbiBhZGRpbmcgdGhlIEpVbml0IGV4YW1wbGUgcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzAwIj4xMDcwMDwvYT4KLWFzdDogcmVzb2x2ZUJpbmRpbmcgcmV0dXJucyBudWxsIG9uIHBhcmFtZXRlciByZWZlcmVuY2UgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzYiPjEwNjc2PC9hPgotU3RyaW5nTGl0ZXJhbC5yZXNvbHZlVHlwZUJpbmRpbmcoKSByZXR1cm4gbnVsbCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY3OSI+MTA2Nzk8L2E+Ci1DbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBjYWxsaW5nIHJlc29sdmVUeXBlQmluZGluZygpIHdpdGggYW4gZXJyb3IgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzQiPjEwNjM0PC9hPgotUHJvYmxlbSB3aXRoIGNvbXBpbGluZyBzb21lIGphdmEgY2xhc3NlczsgY2xhc3Mgbm90IHZpc2libGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM0MCI+MTAzNDA8L2E+Ci1OUEUgd2hlbiBzZWxlY3RpbmcgbXVsdGlwbGUgbWV0aG9kcyB0byAiUHVsbCB1cCIgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjYyIj4xMDY2MjwvYT4KLUNhc3RpbmcgdG8gQnVmZmVyIG1ha2VzIGl0IGltcG9zc2libGUgZm9yIGNsaWVudHMgdG8gaW1wbGVtZW50IElCdWZmZXIgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkyIj4xMDU5MjwvYT4gCi1hc3Q6IE5QRSBpbiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOjpyZXNvbHZlQmluZGluZyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTgzIj45NTgzPC9hPgotRE9NIDogU2VsZiBlbmNhcHN1bGF0ZSBmaWVsZDogTlBFIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTcwIj4xMDU3MDwvYT4KLWFzdDogQ2F0Y2hDbGF1c2UgaGFzIGluY29ycmVjdCBzdGFydGluZ1BvaW50IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg3Ij4xMDU4NzwvYT4KLWFzdDogbWlzc2luZyBub2RlIGZvciBhIHZhcmlhYmxlIGJpbmRpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU4OCI+OTU4ODwvYT4KLUludmFsaWQgZGVsdGEgd2hlbiByZXBsYWNpbmcgamFyIGFuZCBwcm9qPXNyYz1iaW4gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDk1Ij4xMDQ5NTwvYT4KLXR5cG8gaW4gQVNUTm9kZTo6TUFMRk9STUVEIGphdmFkb2MgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0NzIiPjEwNDcyPC9hPgotQ29kZUFzc2lzdCAtIE5vIGNvbXBsZXRpb24gYmV0d2VlbiBkb3QgYW5kIG51bWJlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjMiPjMzMjM8L2E+Ci1PcGVuT25TZWxlY3Rpb24gLSBubyBzZWxlY3Rpb24gaW5zaWRlIENvZGVGb3JtYXR0ZXJQcmVmZXJlbmNlUGFnZS5mVGV4dExpc3RlbmVyIGluaXRpYWxpemVyICgxR0dORDNTKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDY2Ij4xMDQ2NjwvYT4KLSJDYW5ub3QgcmVmZXJlbmNlIGEgZmllbGQgYmVmb3JlIGl0IGlzIGRlZmluZWQiIC0gY29tcGlsZXIgYnVnPwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzg2Ij4xMDM4NjwvYT4KLU5QRSBpbiBNYXRjaExvY2F0b3IubG9va3VwVHlwZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNzgiPjEwMzc4PC9hPgotcGVyZiBwcm9ibGVtIHdpdGggZXh0ZXJuYWwgSkFScyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5MyI+OTU5MzwvYT4KLVNlbGVjdGlvbkVuZ2luZSBnaXZlIG1vcmUgcmVzdWx0cyB0aGFuIGV4cGVjdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk2OSI+OTk2OTwvYT4KLUNvZGVGb3JtYXR0ZXI6IEJ1ZyB3aGVuIGZvcm1hdHRpbmcgdHJ5L2NhdGNoIEJsb2NrIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzEiPjMyMzE8L2E+Ci0xLjQgLSB0YXJnZXQgaXMgbm93IDEuMiAoMUdIVzBERikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTk4Ij45OTk4PC9hPgotUGVyZm9ybWFuY2UgLSBCZXR0ZXIgcHJ1bmluZyBtZWFuaW5nbGVzcyBBU1Qgbm9kZXMgdXBvbiBjb21wbGV0aW9uCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDAiPjEwMjQwPC9hPgotSkRUQ29tcGlsZXJBZGFwdGVyIGRvZXNuJ3QgdW5kZXJzdGFuZCAiZGVwcmVjYXRpb24iIGZyb20gQW50IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc0Ij4xMDI3NDwvYT4KLURPTS9BU1Q6IHdyb25nIGltcGxlbWVudGF0aW9uIG9mIFR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZHMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDEiPjEwMjQxPC9hPgotUmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gY29tLmlibSAKLTxoMz4gCi1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzUzIj4xMDc1MzwvYT4KLUNvbXBpbGVyIGJhcmZzIG9uIGM6XHViaXplbiB3aXRoIGludmFsaWQgdW5pY29kZSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc0OSI+MTA3NDk8L2E+Ci1CdWcgaXMgY29kZSBmb3JtYXR0ZXIgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MDEiPjEwNzAxPC9hPgotVW5kZWZpbmVkIG1ldGhvZCB3aGVuIGNvbXBpbGluZyB1c2luZyBKREsgMS40Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzQiPjEwNjc0PC9hPgotQVNUIEFQSSByZXF1ZXN0IDogbWV0aG9kIGJpbmRpbmcgZm9yIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MyI+MTA1ODM8L2E+Ci1DYW4gbm90IHNhdmUgYW55IGphdmEgZmlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc1Ij4xMDI3NTwvYT4KLVNlYXJjaDogcmVmZXJlbmNlIHRvIGNsYXNzIG5vdCBmb3VuZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNyI+MzQzNzwvYT4KLUNvZGUgQXNzaXN0IGZhaWxzIHdoZW4gbWV0aG9kIGhhcyB1bmtub3duIHJldHVybiB0eXBlICgxR0wxMkVHKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1NzkiPjk1Nzk8L2E+Ci1TZWFyY2g6IGRlY2xhcmF0aW9uIGluIGhpZXJhcmNoeSAtIHdyb25nIG1hdGNoZXMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDYwIj4xMDQ2MDwvYT4KLVRoZSBDb21waWxlciBjYW4gbm90IHJlc29sdmUgcGFja2FnZSBsZXZlbCBjbGFzcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjQ0Ij4xMDI0NDwvYT4KLURPTS9BU1Q6IE1ldGhvZEludm9jYXRpb24gc2hvdWxkIGhhdmUgcmVzb2x2ZUJpbmRpbmcoKSBtZXRob2QgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE1NyI+OTE1NzwvYT4KLU15IGV4aXN0aW5nIC5jbGFzcyBmaWxlcyBhcmUgZGVsZXRlZCEKLSAKLTxoMT4KKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPHA+PGhyPjxoMT4KIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CiBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIyNiAtIDI2dGggRmVicnVhcnkgMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjkKK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAtIDIybmQgSnVseSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2NwogPGgyPgogV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgogPHVsPgotPGxpPkphdmEgdG9vbGluZyBub3cgcGVyZm9ybXMgbm9ybWFsbHkgaW5zaWRlIG1ldGhvZCBib2RpZXMgd2hvc2Ugc2lnbmF0dXJlIGNvdWxkIG5vdAotYmUgcmVzb2x2ZWQuCi08L2xpPgotPGxpPiBTcGVjaWZpZWQgdGhhdCB3aGVuIGFuIDxjb2RlPklCdWZmZXI8L2NvZGU+IGlzIGNyZWF0ZWQgdGhyb3VnaCBhbiAKLSAgICAgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+LCBpdHMgY29udGVudCBpcyBzZXQgd2l0aCB0aGUgb3JpZ2luYWwKLSAgICAgZWxlbWVudCdzIGNvbnRlbnQuCi08L3VsPgotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTEwIj4xMDExMDwvYT4KLVByb2plY3Qgbm90IGJ1aWxkIHNpbmNlIGl0IHdhcyBpbmNvbnNpc3RlbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjQyIj45NjQyPC9hPgotU2VhcmNoIC0gbWlzc2luZyBpbmFjY3VyYXRlIHR5cGUgbWF0Y2hlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk5MiI+OTk5MjwvYT4KLU1lbWJlciBjbGFzcyBkZWNsYXJhdGlvbiBub3QgZm91bmQgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIxIj4xMDIyMTwvYT4KLU5vIHZhcmlhYmxlIG5hbWUgc3VnZ2VzdGlvbiBvbiBhcnJheSB0eXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNjYiPjEwMTY2PC9hPgotSW50ZXJmYWNlIGhpZGVzIE9iamVjdCBtZXRob2RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkzNCI+NzkzNDwvYT4KLUJ1aWxkZXIgYWx3YXlzIHJlYnVpbGRzIHdoZW4gd29ya2JlbmNoIHJlc3RhcnRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0NTYiPjc0NTY8L2E+Ci1FcnJvciBtZXNzYWdlIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGlzIGNvbmZ1c2luZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTUyIj4xMDE1MjwvYT4KLUNvbXB1dGluZyBoaWVyYXJjaHkgb2YgSVJlc291cmNlIGlzIHNsb3cgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4MDkiPjg4MDk8L2E+Ci1Db2RlIGFzc2lzdCB3aXRoIGNsYXNzIGZvbGRlcnMgZG9lcyBub3Qgd29yawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3NjMiPjk3NjM8L2E+Ci1Db2RlIGFzc2lzdCBmYWlsdXJlIGR1ZSB0byBlcnJvciBpbiBtZXRob2Qgc2lnbmF0dXJlOjFHUlZONVIKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTg1Ij45OTg1PC9hPgotQnVpbHQgaW4gY29tcGlsZXIgd2lsbCBzb21ldGltZXMgbm90IGFsbG93IE9iamVjdCBtZXRob2QgY2FsbHMgb24gSW50ZXJmYWNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDA4Ij4xMDAwODwvYT4KLUludGVybmFsIGNvbXBpbGVyIGVycm9yIHdoZW4gY29tcGlsaW5nIHN3aXRjaCBzdGF0ZW1lbnQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTEyIj45OTEyPC9hPgotQmF0Y2ggY29tcGlsZXIgZG9lc24ndCBwdXQgYmluYXJpZXMgaW4gdGhlIHJpZ2h0IGZvbGRlciB3aGVuIC1kIGlzIG1pc3NpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA1OSI+NjA1OTwvYT4KLU5QRSBpbiBKYXZhTW9kZWxTdGF0dXMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM1MSI+OTM1MTwvYT4KLUNvcHlpbmcgYSBjb21waWxhdGlvbiB1bml0IG9udG8gaXRzZWxmIGRlc3Ryb3lzIGNvbXBpbGF0aW9uIHVuaXQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTgxMyI+OTgxMzwvYT4KLVZlcmlmeUVycm9yIHdpdGggSW5uZXIgQ2xhc3MgaGF2aW5nIHByaXZhdGUgY29uc3RydWN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDkyIj45NDkyPC9hPgotV2Fsa2JhY2sgd2hpbGUgc2VhcmNoaW5nICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODM3Ij45ODM3PC9hPgotSW5jb25zaXN0ZW50IGJlaGF2aW9yIHdoZW4gY29tcGlsaW5nIGZyb20gc291cmNlIG9yIHVzaW5nIGJpbmFyaWVzIGZvciBjb25zdGFudCBleHByZXNzaW9ucworPC91bD4gCiAKLTxoMz4gCi1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTEiPjY5NTE8L2E+Ci1EQ1IgLSBCdWlsZGVyIHNob3VsZCBpZ25vcmUgZmlsdGVyZWQgb3V0IHJlc291cmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MDkiPjU4MDk8L2E+Ci1EdXBsaWNhdGUgY2xhc3MgbmFtZXMgaW4gc2VwYXJhdGUgcGFja2FnZSBpbXBvcnRzIGNhdXNlIGNvbXBpbGUgZXJyb3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODg4Ij45ODg4PC9hPgotSkFSIGV4b3J0ZXIgcHJvYmxlbXMgd2l0aCBNRVRBLUlORiBpbiBwcm9qZWN0cyB3aXRoIG5vIHNvdXJjZSBmb2xkZXIgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTA0Ij4xMDEwNDwvYT4KLUNhbGN1bGF0ZWQgc2VyaWFsVmVyc2lvbklEJ3MgYXJlIGluY29tcGF0aWJsZSB3aXRoIFN1bidzIEpESworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTYwNiI+MjE2MDY8L2E+CitJbWFnZUJ1aWxkZXIgZGVsZXRlcyAmIGFkZHMgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcKIAotPGgxPgorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEyODIiPjIxMjgyPC9hPgorSVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgcHJvYmxlbXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTE4MiI+MjExODI8L2E+Cit1bmltcGxlbWVudGVkIG1ldGhvZCBlcnJvciBhZnRlciBpbXBsZW1lbnRpbmcgaW4gc3VwZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTY4MiI+MjE2ODI8L2E+CittYXJraW5nIGEgbWV0aG9kIGRlcHJlY2F0ZWQgZG9lc24ndCBlbGVtaW5hdGUgZGVwcmVjYXRlZCB3YXJuaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1NTYiPjIxNTU2PC9hPgorIk1pc3NpbmcgY29kZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY29tcGlsZXIiCisKKzxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAyMTQgLSAxNHRoIEZlYnJ1YXJ5IDIwMDIgLSBNSUxFU1RPTkUgMwotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjgKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk0NzkiPjk0Nzk8L2E+Ci1leGNlcHRpb24gb24gcGFja2FnZSBjcmVhdGlvbiAoZGlzY291cmFnZWQgbmFtZSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5OTkiPjU5OTk8L2E+Ci1JVHlwZS5yZXNvbHZlVHlwZSByZXR1cm5zIG11bHRpcGxlIG1hdGNoZXMgYWxzbyB0aGUgdHlwZSBpcyB1bmFtYmlnaW91cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0ODUiPjc0ODU8L2E+Ci1JVHlwZSByZXNvbHZlIGZhaWxzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc4NSI+OTc4NTwvYT4gIAotUHJvYmxlbSBpbiBJVHlwZS5yZXNvbHZlVHlwZSgpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIzOSI+OTIzOTwvYT4KLXNlYXJjaCBmb3IgbWV0aG9kIGRlY2xhcmF0aW9uIC0gc3RyYW5nZSBiZWhhdmlvciAgCi0KLTxoMz4gCi1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2NDciPjU2NDc8L2E+Ci1TZWFyY2ggcmVzdWx0cyBkaWZmZXIgd2hlbiB1c2luZyBvdXRsaW5lciBjb250ZXh0IG1lbnUgdnMuIGRpYWxvZyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIzOSI+NTIzOTwvYT4KLW91dGxpbmVyIGdldHMgb3V0IG9mIHN5bmNoICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDI5Ij41MDI5PC9hPgotSW50ZXJuYWwgRXJyb3Igc2F2aW5nIGphdmEgZmlsZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU4NiI+OTU4NjwvYT4gIAotSmF2YSAxLjQgZmVhdHVyZSBhc3NlcnQgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1MDQiPjk1MDQ8L2E+ICAKLTFHUlUxTDM6U2VhcmNoIHJlZmVyZW5jZSB3b3JrcyBvbmx5IGluIG91dGxpbmUgdmlldyBhbmQgbm90IGluIGVkaXRvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk0NzYiPjk0NzY8L2E+ICAKLUFycmF5SW5kZXhPdXRPZkJvdW5kcyBpbiBKYXZhQnVpbGRlciAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2MiI+MzI2MjwvYT4KLVN0cmFuZ2Ugb3V0cHV0IGZpbGUgZGVsZXRpb24gKDFHRFMySVgpCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDIxMiAtIDEydGggRmVicnVhcnkgMjAwCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNworRWNsaXBzZSBTREsgMi4wIEJ1aWxkIC0gMTV0aCBKdWx5IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjY2CiA8aDI+CiBXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CiA8dWw+Ci08bGk+UmVzb3VyY2UgY29weSBmaWx0ZXJzIDogQSBuZXcgc2V0dGluZyBhbGxvd3MgdG8gc3BlY2lmeSBleGNsdXNpb24gZmlsdGVycyBmb3IgcmVzb3VyY2UgYmVpbmcgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLi4KLQk8dWw+Ci0JPGxpPm9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXJzIgotCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIjxuYW1lPlssPG5hbWU+XSogfSB3aGVyZSA8bmFtZT4gaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAob25seSAqIHdpbGQtY2FyZHMgYWxsb3dlZCkKLQk8bGk+ZGVmYXVsdDoJCQkiIiAKLQk8L3VsPgotPC9saT4KLTxsaT5FbmNvZGluZyBzdXBwb3J0IDogQmF0Y2ggY29tcGlsZXIgY2FuIGJlIHNwZWNpZmllZCB0aGUgc291cmNlIGVuY29kaW5nIGZvcm1hdCB1c2luZyAnLWVuY29kaW5nIG15RW5jb2RpbmcnIGNvbW1hbmQgbGluZSBvcHRpb24uCi1JbiBjYXNlIG9mIG5lY2Vzc2l0eSwgZWFjaCBpbmRpdmlkdWFsIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGN1c3RvbSBlbmNvZGluZwotYnkgc3VmZml4aW5nIGl0cyBuYW1lIHdpdGggJ1tteUVuY29kaW5nXScgKGlmIGFwcGxpZWQgdG8gYSBmb2xkZXIsIHRoZW4gYWxsIGZpbGVzIGluIGl0IHdpbGwgYmUgc2hhcmluZyB0aGUgY3VzdG9tCi1lbmNvZGluZykuIFdoZW4gbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGlzIHVzZWQgKGFzIGJlZm9yZSkuIFNpbWlsYXJpbHksIGEgSmF2YUNvcmUgb3B0aW9uIGdvdCBhZGRlZCB0bwotY29udHJvbCB0aGUgZGVmYXVsdCBlbmNvZGluZyAobm8gc3VwcG9ydCB5ZXQgZm9yIHBlciBmaWxlIGN1c3RvbSBlbmNvZGluZykuCi0JPHVsPgotCTxsaT5vcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIgotCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIiIgZm9yIHBsYXRmb3JtIGRlZmF1bHQsIG9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIGVuY29kaW5nIG5hbWUgfS4KLQk8bGk+ZGVmYXVsdDoJCQkiIiAKLQk8L3VsPgotPC9saT4KLTxsaT4gRml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTgzIj45MTgzPC9hPiByZXF1aXJlZCB0byBpbmNyZW1lbnQgdGhlIGluZGV4IHNpZ25hdHVyZSAKLXZlcnNpb24gc28gYXMgdG8gdHJpZ2dlciBhdXRvbWF0aWMgcmVpbmRleGluZyBvbiB3b3Jrc3BhY2Ugc3RhcnR1cCAoYW5kIHRodXMgYWRkIHNvbW1lIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHdlcmUgcHJldmlvdXNseQotbWlzc2luZyBmcm9tIHRoZSBiaW5hcnkgaW5kZXggZmlsZXMpLiBTdWJzZXF1ZW50IHN0YXJ0dXBzIHdpbGwgbm90IHJlaW5kZXggYW55IGZ1cnRoZXIgKG9ubHkgaWYgaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZCwgCi1lLmcuIHNpZ25hdHVyZSB2ZXJzaW9uIGlzIGRpZmZlcmVudCkuCi08L2xpPgotPGxpPiBUaGUgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+IHVzZWQgd2hlbiBjcmVhdGluZyBhbiA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+Ci0oc2VlIDxjb2RlPklDb21waWxhdGlvblVuaXQuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5KTwvY29kZT4pCi1pcyBub3cgcmVtZW1iZXJlZCBhbmQgd2lsbCBiZSByZXVzZWQgaWYgdGhlIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW4uCi08L2xpPgotPGxpPk9sZCBKYXZhIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZ290IHJlbW92ZWQ8L2xpPgotPGxpPlByb2plY3QgZGVwZW5kZW5jeSBjeWNsZSBkZXRlY3Rpb24gcmVlbmFibGVkPC9saT4KLTxsaT4gT3BlbiBvbiBzZWxlY3Rpb24gbm8gbG9uZ2VyIG5lZWQgYSBub24tZW1wdHkgc2VsZWN0aW9uIHRvIHBlcmZvcm0gKHdoZW4gZW1wdHkgaXQgd2lsbCB1c2UgdGhlIHRva2VuCi1pbiB3aGljaCB0aGUgc2VsZWN0aW9uIHN0YXJ0IHBvc2l0aW9uIGlzIGxvY2F0ZWQpLgotPGxpPkltcHJvdmVkIHByb2dyZXNzIHJlcG9ydGluZyB3aGlsZSBzZWFyY2hpbmcgYWxsIHR5cGVzIGluIHRoZSB3b3Jrc3BhY2UuPC9saT4KLTwvdWw+Cis8L3VsPiAKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk0NTIiPjk0NTI8L2E+ICAKLUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIGFuIEFTVCBmb3IgVGVzdENhc2UuamF2YSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM5MCI+NzM5MDwvYT4KLUVkaXRpbmcgYW5kIHNhdmluZyByZWFkLW9ubHkgLmphdmEgc291cmNlIGZpbGUgbWF5IGNhdXNlIGxvc3Qgb2YgZGF0YQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MjYiPjc5MjY8L2E+Ci1Db2RlIEFzc2lzdCAtIE5vIGNvbXBsZXRpb24gZm9yIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGFmdGVyIGlubmVyIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNiI+NzYzNjwvYT4KLUNhbid0IGRvIGNvZGUgYXNzaXN0IGFmdGVyIGZpZWxkIHdpdGggbG9jYWwgY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzY5Ij44MzY5PC9hPgotQ29kZSBhc3Npc3Qgc3RvcHMgdG8gd29yayBhZnRlciBhbm9ueW1vdXMgY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mzk4Ij45Mzk4PC9hPgotQ29tcGlsZXIgZXJyb3Igd2l0aCBkb3VibGUgYXJyYXkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05Mzk1Ij45Mzk1PC9hPgotQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxODUiPjkxODU8L2E+Ci1TZXZlcmUgc2h1dGRvd24gcGVyZm9ybWFuY2UgcHJvYmxlbSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE2NyI+NjE2NzwvYT4KLUluZGV4ZXIgbm90IHN0b3BlZCBvbiBleGl0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MiI+NzM2MjwvYT4KLU92ZXJyaWRlIE1ldGhvZHMgZG9lc24ndCBoYW5kbGUgdW5pY29kZXMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NSI+NzI5NTwvYT4KLUluZGVuZGF0aW9uIGluIGdlbmVyYXRlZCBnZXR0ZXJzL3NldHRlcnMgb2YgaW5uZXIgY2xhc3NlcyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Njc4Ij42Njc4PC9hPgotSW5jb3JyZWN0IG91dHB1dCBhZnRlciBBZGQgVW5pbXBsZW1lbnRlZCBNZXRob2QgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc1OCI+ODc1ODwvYT4KLW51bGwgcG9pbnRlciBleGNlcHRpb24gaW4gZWNsaXBzZSBjb3JlIHdoaWxlIGNvbXBpbGluZyBKYXZhIGNvZGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MjM2Ij42MjM2PC9hPgotUmVuYW1lZCBmaWxlIGlzIG5vdCBleGNsdWRlZCBmcm9tIHByb2plY3QgYnVpbGQgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2OTYiPjg2OTY8L2E+Ci1Db2RlIGFzc2lzdCBkb2Vzbid0IHdvcmsgaW4gaW5pdGlhbGl6ZXIgb2YgYW5vbnltb3VzIGlubmVyIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA2NCI+NjA2NDwvYT4KLU9wZW4gb24gc2VsZWN0aW9uIHNob3VsZG4ndCByZXF1aXJlIHNlbGVjdGlvbi4KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjIzIj45MjIzPC9hPgotQ29kZUFzc2lzdCBmYWlsdXJlIGluIGlubmVyIHR5cGUgZnJvbSBjbGFzcyBmaWxlLgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4NDciPjY4NDc8L2E+Ci1EQ1IgLSBGaWx0ZXJpbmcgb3V0cHV0IHRvIGJ1aWxkIGRpcmVjdG9yeQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMDkiPjkzMDk8L2E+Ci1ET00vQVNUOiBOUEUgd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBhIGJpbmRpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTMwOCI+OTMwODwvYT4KLURPTS9BU1Q6IHR3byBlcXVhbCBoYXNoIHRhYmxlIGFjY2Vzc2VzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMDEiPjkxMDE8L2E+Ci1QYXJzZSBlcnJvciB3aGlsZSB0eXBpbmcgaW4gSmF2YSBlZGl0b3IgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMzEiPjkwMzE8L2E+Ci1OUEUgaW4gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5jb21waWxhdGlvblJlc3VsdCBkdXJpbmcgc2VhcmNoICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDg0Ij45MDg0PC9hPgotTlBFIGluIHBhcnNlciBkdXJpbmcgYnVpbGQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAwOCI+OTAwODwvYT4KLUNvZGUgYXNzaXN0IG9uIG1ldGhvZCBkZWNsYXJhdGlvbiBnaXZlcyB3cm9uZyB0aHJvdyBleGNlcHRpb24KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODc4Ij44ODc4PC9hPgotQ29kZSBhc3Npc3QgcHJvdmlkZXMgYXJiaXRyYXJ5LCBpbnZhbGlkIGNob2ljZSBhZnRlciBhIHNwYWNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE5OCI+OTEyODwvYT4KLU5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIHN0YXJ0aW5nIHdvcmtiZW5jaCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAzNSI+OTAzNTwvYT4KLUkgZ290IGFuIE5QRSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTgzIj45MTgzPC9hPgotQmluYXJ5SW5kZXhlciBkb2Vzbid0IGluZGV4IGFsbCB0eXBlIHJlZmVyZW5jZXMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyMSI+MzMyMTwvYT4KLUFkZGluZyBtaXNzaW5nIHNvdXJjZSBmb2xkZXIgZG9lc24ndCByZW1vdmUgd2FybmluZyAoMUdHQ0M0UCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE5Ij4zMjE5PC9hPgotSk0gLSAnQ3ljbGUgZGV0ZWN0ZWQnIHNob3VsZCBub3QgYmUgYSBtYXJrZXIgYXR0cmlidXRlICgxRzhWVFNBKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNjkiPjkxNjk8L2E+Ci1Xcm9uZyBjb2RlIGdlbmVyYXRpb24gZm9yIGNvbXBhcmlzb24gb2Ygc3RyaW5nIGNvbnN0YW50cyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njg1Ij44Njg1PC9hPgotRXhjZXB0aW9uIHdoaWxlIGRlbGV0aW5nIGEgbWV0aG9kICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00MDIxIj40MDIxPC9hPgotamR0OiBKYXZhIGVsZW1lbnRzIGFuZCByZXNvdXJjZXM6IGVycm9yIGluIHNvdXJjZSBjb2RlICgxR0c4N1M5KSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg3OCI+Nzg3ODwvYT4KLU9uIFBhY2thZ2UgY3JlYXRpb246IE5vIHdhcm5pbmcgZm9yIHVuY29udmVudGlvbmFsIG5hbWVzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDQxIj45MDQxPC9hPgotc2VhcmNoOiBjYW5ub3QgY3JlYXRlIGEgc3ViLWN1IHNjb3BlICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDg4Ij45MDg4PC9hPgotVW5yZWFjaGFibGUgY2F0Y2ggYmxvY2sgd2hlbiBlcnJvciBpbiByZWZlcmVuY2VkIGNsYXNzJ3MgZmllbGRzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTkiPjMyOTk8L2E+Ci1BdXRvYnVpbGQgcHJvZHVjZXMgZXJyb3JzIHdoZW4gcmVuYW1pbmcgc291cmNlIGZvbGRlcnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDA5Ij45MDA5PC9hPgotQ2xhc3NDYXN0RXhjZXB0aW9uIGNyZWF0aW5nIGFuIGludmFsaWQgbWV0aG9kIAorPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU4MCI+MjE1ODA8L2E+CitWZXJpZnlFcnJvciBpbiAxLjQgY29tcGxpYW50IG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU1NyI+MjE1NTc8L2E+CitWTSBidWcgcHJldmVudHMgdmFsaWQgSmF2YSBjb2RlIHRvIGJlIGV4ZWN1dGVkIG9uIFZNIDwgMS4zLjEKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTkwIj4zMTkwPC9hPgotSk0gLSB1c2Ugb2YgIm9wZW4iIGluIGphdmEgbW9kZWwgaW5jb25zaXN0ZW50IHdpdGggY29yZSAoMUZXMkVZUSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY4Ij4zMjY4PC9hPgotY3JlYXRlKElQcm9qZWN0KSBzdHJhbmdlIGZvciBub3JtYWwgcHJvamVjdHMgKDFHRFZURVIpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUyNyI+ODUyNzwvYT4KLURlbGV0ZSBpbm5lciBjbGFzcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzciPjMwMzc8L2E+Ci1Db3JlIGVycm9yIGNvbXBpbGluZyBhIGphdmEgY2xhc3MgKDFHRUpLOFEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM4NiI+OTM4NjwvYT4KLWNhbm5vdCBpbXBvcnQgamFyIGZpbGVzIGludG8gcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5NzYiPjc5NzY8L2E+Ci1KRFQgbWlzc2VzIHRoZSBuZXcgSmF2YSBmaWxlcyBjcmVhdGVkIGJ5IFBERSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcxMyI+NTcxMzwvYT4KLU5QRSB3aGVuIHNlYXJjaGluZyBmb3IgcmVmZXJlbmNlcyBpbiBhIEpBUiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3NyI+OTE3NzwvYT4KLUJ1aWxkZXIgdHJlYXRzIGJ1aWxkIGVycm9ycyBhcyBKYXZhRXJyb3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MCI+ODA0MDwvYT4KLWphdmEgc291cmNlIHdpdGggJCBpbiByZWZlcmVuY2Ugd29uJ3QgY29tcGlsZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwMzYiPjUwMzY8L2E+Ci1hc3NlcnRpb24gZmFpbHMgb24gYnVpbGQKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk4Ij44NDk4PC9hPgotZGVwcmVjYXRlZCBtZXRob2RzIGFyZSBub3QgZGlzcGxheWVkIGluIHRoZSB0YXNrIGNvbnNvbGUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzEiPjMzNzE8L2E+Ci1Bc3NlcnRpb24gZmFpbGVkIGV4Y2VwdGlvbiBkdXJpbmcgYnVpbGQgKDFHSzE4M08pCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOSI+MzQxOTwvYT4KLWFzc2VyaW9uIGZhaWxlZCBpbiBidWlsZCAoMUdLQjlDSCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODk1Ij43ODk1PC9hPgotV2llcmQgc3RhdGU6IFByb2plY3Qgbm90IGJ1aWx0IGJlY2F1c2UgaW5jb25zaXN0ZW50LgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MzAiPjc4MzA8L2E+Ci1EZWxldGluZyBtb3JlIHRoYW4gb25lIG1ldGhvZCBjb25zZWN1dGl2ZWx5IGZyb20gdGhlIGhpZXJhcmNoeSB2aWV3IGNhdXNlcyB1bmV4cGVjdGVkIGNvcnJ1cHRpb24gb2Ygb3RoZSBtZXRob2RzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxOTAiPjkxOTA8L2E+Ci1SZW1vdmluZyBhIGxpYnJhcnkgZnJvbSBjbGFzc3BhdGggZ2l2ZXMgbm90IGEgcmVtb3ZlIGRlbHRhICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTA0Ij45MTA0PC9hPgotY29weSBwYWNrYWdlIHByb2dyZXNzIGRpYWxvZyBoYXMgbWlzc2luZyBzdHJpbmcgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcwNiI+NTcwNjwvYT4gIAotQ2Fubm90IGFkZCB0d28gZm9sZGVycyB3LyBzYW1lIG5hbWUgYnV0IGRpZmYgcHJvamVjdHMgdG8gYnVpbGQgcGF0aCBvZiBKYXZhIHByb2plY3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMDMiPjkxMDM8L2E+Ci1TZWFyY2ggcmVwb3J0cyBubyByZWZlcmVuY2VzIHRvIFNXVC5IZWxwICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDE4Ij42NDE4PC9hPgotU2NyYXBib29rOiAiVW5leHBlY3RlZCBFbmQgT2YgRmlsZSIgZXhwZWN0ZWQgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTEiPjMxOTE8L2E+Ci1KTSAtIG5vbi1leGlzdGluZyBleHRlcm5hbCBqYXJzIHdpbGwgbm90IGNvbWUgdG8gbGlmZSB3aGVuIGNyZWF0ZWQgKDFGV0k1QzQpICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgwIj44OTgwPC9hPgotVW5wcmVkaWN0YWJsZSBlcnJvciBjYXRjaGluZyBvbiBvdmVycmlkZGVuIG1ldGhvZHMgd2l0aCBsZXNzIHZpc2liaWxpdHkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDI0Ij45MDI0PC9hPgotRG8gbm90IGZpbmQgcmVmZXJlbmNlIHRvIGFuIGludGVyZmFjZSBpbiBKQVIgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MCI+OTA0MDwvYT4KLURPTS9BU1Q6IHdoeSBpcyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBhbiBleHByZXNzaW9uIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgogCi08aDE+Cis8cD48aHI+PGgxPgogRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KIEphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjA1IC0gNXRoIEZlYnJ1YXJ5IDIwMDIKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI2CitFY2xpcHNlIFNESyAyLjEgQnVpbGQgLSAxMnRoIEp1bHkgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjUKIDxoMj4KIFdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KIDx1bD4KLTxsaT4gVGhlIEphdmFNb2RlbCBubyBsb25nZXIgbm90aWZpZXMgY2hhbmdlcyBmb3IgZ2VuZXJhdGVkIGNsYXNzZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIHRoZXNlIAotd2VyZSBuZXZlciBzdXBwb3NlZCB0byBiZSBzaWduYWxlZC4gPC9saT4KLTwvdWw+Cis8bGk+Q2hhbmdlZCBBU0NJSS9iaW5hcnkgcHJvcGVydHkgZm9yIGVudGlyZSBwcm9qZWN0LjwvbGk+Cis8L3VsPiAKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDgiPjM0NDg8L2E+Ci1ObyBlcnJvciBmb3IgcGFja2FnZSBhbmQgdHlwZSBjb2xsaXNpb24gaW4gZGVmYXVsdCBwYWNrYWdlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAxNiI+OTAxNjwvYT4KLURPTS9BU1Q6IFByb2JsZW1zIHdpdGggYXJyYXkubGVuZ3RoIGFjY2VzcyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDE0Ij45MDE0PC9hPgotRE9NL0FTVDogTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiByZXNvbHZpbmcgU3lzdGVtLmVyci5wcmludGxuIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMTgiPjkwMTg8L2E+Ci1ET00vQVNUOiB3aHkgZG9lcyB0aGUga2V5IG9mIGEgdmFyaWFibGUgYmluZGluZyBpbmNsdWRlIHRoZSB0eXBlIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNTUiPjUzNTU8L2E+Ci1zZWFyY2g6IE5QRSBpbiBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODkyOCI+ODkyODwvYT4KLVVuYWJsZSB0byBmaW5kIHJlZmVyZW5jZXMgb3IgZGVjbGFyYXRpb25zIG9mIG1ldGhvZHMgdGhhdCB1c2Ugc3RhdGljIGlubmVyIGNsYXNzZXMgaW4gdGhlIHNpZ25hdHVyZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MSI+MzI5MTwvYT4KLUV4Y2VwdGlvbiBhZGRpbmcgLmNsYXNzIGZpbGUgdG8gZm9sZGVyIGluIHBhY2thZ2UgdmlldyAoMUdFVUYzSSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5MDAiPjg5MDA8L2E+Ci1TZWFyY2ggY2F1c2luZyBpbnRlcm5hbCBlcnJvciAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgxMiI+ODgxMjwvYT4KLUNoYW5naW5nIGV4cG9ydCBzdGF0ZSBub3QgcHJvcGFnYXRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NTYiPjg4NTY8L2E+Ci1ET00gQVNUOiBwb3NpdGlvbnMgYW5kIGJpbmRpbmdzIG1pc3Npbmcgb24gUXVhbGlmaWVkTmFtZSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ2Ij4zNDQ2PC9hPgotdHlwZSBoaWVyYXJjaHk6IGluY29ycmVjdCBiZWhhdmlvciB3cnQgd29ya2luZyBjb3BpZXMgKDFHTERIT0EpICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjEwIj4zMjEwPC9hPgotU2VhcmNoIC0gbWV0aG9kIGRlY2xhcmF0aW9ucyB3aXRoaW4gVHlwZUhpZXJhcmNoeSBnaXZlcyBubyBtYXRjaGVzICgxRzU0Qk1SKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE0NSI+ODE0NTwvYT4KLVR5cGVEZWNsYXJhdGlvbiBzb3VyY2VFbmQgY29udGFpbnMgdHJhaWxpbmcgY29tbWVudCAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODMyIj44ODMyPC9hPgotU2FuaXR5IGNoZWNrIGVycm9yIChpbnRlcm5hbCBlcnJvcikgd2hlbiB1bnVzZWQgdmFyaWFibGVzIGluc2lkZSBpbml0aWFsaXplcnMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwNzgiPjgwNzg8L2E+Ci1NaXNzaW5nIHJlc291cmNlIGluIGNvcHkgQ1UgZGlhbG9nICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzY0Ij44NzY0PC9hPgotTlBFIHdoaWxlIGNsb3NpbmcgcHJvamVjdHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgzNTkiPjgzNTk8L2E+Ci1JbmRleCBvdXQgb2YgZGF0ZSB3aGVuIHJlcGxhY2luZyBhIEpBUiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODc3MyI+ODc3MzwvYT4gCi1WZXJpZnlFcnJvciA6IEEgLmNsYXNzIGZpbGUgZXhwb3J0ZWQgZnJvbSBWQUogZG9lcyBub3QgcnVuIGluIEpESyAxLjIuMiAoMUdQUEVUMCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njk3Ij44Njk3PC9hPiAKLTIgY29tcGlsZXIgYnVnczogdGhlIG9wZXJhdG9yIHVua293biBvcGVyYXRvciBpcyB1bmRlZmluZWQgYW5kIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3MDYiPjg3MDY8L2E+IAotQ29tcGlsZSBlcnJvciB3aGVuIGNvbXBpbGluZyBhbiBhbm9ueW1vdXMgY2xhc3Mgd2hpY2ggZXh0ZW5kcyBqYXZhLmF3dC5GcmFtZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3MDkiPjg3MDk8L2E+IAotRXJyb3IgY29tcGlsaW5nIEpESzEuNCBjbGFzc2VzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM0MCI+ODM0MDwvYT4KLWluYWNjdXJhdGUgZXJyb3IgbWVzc2FnZSB3aGVuIGRlcGVuZGVudCBwcm9qZWN0IGlzIGNsb3NlZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NCI+MzM0NDwvYT4KLUphdmFFbGVtZW50RGVsdGEgcmVwb3J0cyBjaGFuZ2VkIGNsYXNzIGZpbGVzICgxR0lWOElLKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM4NCI+ODM4NDwvYT4gCi1VbmV4cGVjdGVkIGNvbXBpbGUgZXJyb3JzIHdoZW4gYWJzdHJhY3QgbWV0aG9kIG1pc3NpbmcgcmV0dXJuIHR5cGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Nzg5Ij44Nzg5PC9hPiAKLUNvbXBpbGVyIGluY29ycmVjdGx5IHJlcG9ydHMgdGhhdCBhYnN0cmFjdCBtZXRob2QgaGFzIGEgYm9keSAgCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMjMwIj4yMTIzMDwvYT4KK1JlYnVpbGRpbmcgcHJvamVjdCBmYWlscyB3aXRoIENvbnRleHRTdGFja092ZXJmbG93IChDb21waWxhdGlvblJlc3VsdC5xdWlja1ByaW9yaXRpemUpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEyMDMiPjIxMjAzPC9hPgorQ29tcGlsZSB0aW1lIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhdGNoIGJsb2NrcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDQ3Ij4yMTQ0NzwvYT4KK1dyb25nIG1ldGhvZCBpbnZva2VkIGF0IHJ1bnRpbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTQ4MiI+MjE0ODI8L2E+CitFcnJvciBpbiBnZW5lcmF0ZWQgYnl0ZSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0ODAiPjIxNDgwPC9hPgorQnl0ZWNvZGUgZGlzYXNzZW1ibGVyIGRvZXNuJ3QgaGFuZGxlICNpbnZva2VzcGVjaWFsIGNvcnJlY3RseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNzI1Ij4yMDcyNTwvYT4KK0phdmFCdWlsZGVyLnRvU3RyaW5nIGNhbiB0aHJvdyBOUEUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg2NSI+MjA4NjU8L2E+CitudWxsUG9pbnRlckV4Y2VwdGlvbiBiZWluZyB0aHJvd24gYnkgQ2xhc3MgVHlwZS5yZXNvbHZlQmluZGluZygpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjExMTYiPjIxMTE2PC9hPiAgCitDYW4ndCBjb21waWxlIGJlY2F1c2UgZWNsaXBzZSBzYXlzIHRoYXQgdGhlIG1ldGhvZCBpcyBub3QgdmlzaWJsZQogCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5ODciPjc5ODc8L2E+Ci1GaWVsZCByZWZlcmVuY2Ugc2VhcmNoIHNob3VsZCBkbyBsb29rdXAgaW4gMS40IG1vZGUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NjMiPjg4NjM8L2E+Ci0uY2xhc3NwYXRoIGdldHMgb3ZlcndyaXR0ZW4gaWYgdGhlcmUncyBhbiBYTUwgZXJyb3IgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxNjIiPjcxNjI8L2E+Ci1KYXZhIE1vZGVsIEV4Y2VwdGlvbnMgaW4gbG9nIGZyb20gVHlwZUhpZXJhcmNoeUxpZmVDeWNsZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY5OSI+ODY5OTwvYT4gCi1Db21waWxlciBlcnJvciBtZXNzYWdlIGluY29tcGxldGU6IFN5bnRheCBlcnJvciBvbiB0b2tlbiAnJwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjQiPjMzMjQ8L2E+IAotQmFkIGNvbXBpbGVyIGVycm9yICgxR0hGMjVQKSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQxIj4zNDQxPC9hPiAgCi1JbnRlcm5hbCBlcnJvciByZW5hbWluZyBhIGNsYXNzICgxR0wyWENXKSAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODQxIj43ODQxPC9hPiAKLU92ZXJyaWRlbiBtZXRob2RzIGluc2VydGVkIHBhc3QgdGhlIGVuZCBvZiBzb3VyY2UKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEyOSAtIDI5dGggSmFudWFyeSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyNQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPiBKYXZhIGNvbXBpbGVyIGlzIEpDSyAxLjQgY29tcGxpYW50LiBXaGVuIHRvZ2dsZWQgaW4gMS40IG1vZGUgKGJhdGNoOiAtMS40IC1zb3VyY2UgMS40KSwgdGhlIEphdmEgY29tcGlsZXIgaXMgZnVsbHkgSkNLIDEuNCBjb21wbGlhbnQgCi1hcyBvZiBKQ0sgMS40IDIwMDEtMTAtMDEgdXBkYXRlLiBXaGVuIGluIDEuMyBtb2RlIChkZWZhdWx0KSwgaXQgaXMgSkNLIDEuM2EgY29tcGxpYW50LgotPC9saT4KLTxsaT4gQnkgZGVmYXVsdCwgd2hlbiB0b2dnbGVkIGludG8gMS40IG1vZGUsIHRoZSBiYXRjaCBjb21waWxlciB3aWxsIGVuYWJsZSBhc3NlcnRpb24gc3VwcG9ydCAoZS5nLiAtc291cmNlIDEuNCkuIEl0IGNhbiBzdGlsbCBtYW51YWxseQotYmUgdG9nZ2xlZCBmb3IgMS4zIHNvdXJjZSBsZXZlbCBjb21wYXRpYmlsaXR5ICgtc291cmNlIDEuMykuCi08L2xpPgotPGxpPiBBZGRlZCBjb25zdHJ1Y3RvciA8Y29kZT5TZWFyY2hFbmdpbmUoSVdvcmtpbmdDb3B5W10pPC9jb2RlPgotICAgICB3aGljaCB0YWtlcyBhIGxpc3Qgb2Ygd29ya2luZyBjb3BpZXMgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZSAKLSAgICAgb3ZlciB0aGVpciBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgc3Vic2VxdWVudCBzZWFyY2ggCi0gICAgIG9wZXJhdGlvbnMgb24gdGhpcyBzZWFyY2ggZW5naW5lLgotICAgICA8YnI+Ci0gICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIHNvbWUKLSAgICAgcGFydHMgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBGZWVkYmFjayBpcyB3ZWxjb21lLgotPC9saT4KLTxsaT4gTmV3IGZlYXR1cmUgdG8gYWNoaWV2ZSBwcm9ibGVtcyBjb3JyZWN0aW9ucyA6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvcnJlY3Rpb25FbmdpbmUuCi0gICAgIENvcnJlY3Rpb24gcmVzdWx0cyBhcmUgYW5zd2VyZWQgdGhyb3VnaCBhIHJlcXVlc3RvciAob3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvcnJlY3Rpb25SZXF1ZXN0b3IpLgotPC9saT4KLTxsaT4gSmF2YUNvcmUgd2lsbCBubyBsb25nZXIgYWRkIGluZGlyZWN0bHkgcHJlcmVxJ2VkIHByb2plY3QgYW1vbmdzdCBwcm9qZWN0IHJlZmVyZW5jZXMuCi08L2xpPgotPGxpPiBOZXcgSkRPTSBBU1QgQVBJIGF2YWlsYWJsZSAoYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9+Y2hlY2tvdXR+L29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tJTIwYXN0L2FzdC5odG1sP3Jldj0xLjEmY29udGVudC10eXBlPXRleHQvaHRtbCI+ZGVzaWduCi1ub3RlPC9hPikuIFRoaXMgQVBJIGhhcyBub3QgeWV0IHJlYWNoZWQgZnVsbCBzdGFiaWxpdHksIGFuZCBmZWVkYmFjayBpcyB2ZXJ5IHdlbGNvbWUuCi08L2xpPgotPC91bD4KKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDQ5Ij4yMTA0OTwvYT4gIAorU2F2ZSAoQnVpbGQgLyBDb21waWxlPykgcGVyZm9ybWFuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDk2MSI+MjA5NjE8L2E+ICAKK0Nhbid0IGdldCBjb21wbGV0ZSBjbGFzc3BhdGggZm9yIHByb2plY3QuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0MjgiPjIxNDI4PC9hPiAgCitET00vQVNUOiBBU1QgY2xhc3MgdW5uZWNlc3NhcmlseSBwbHVnLWluIGRlcGVuZGVudD8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA1OSI+MjAwNTk8L2E+ICAKK3Byb2plY3QuaXNPbkNsYXNzUGF0aChwcm9qZWN0KSByZXN1bHQgcmFuZG9tICAKIAotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NDEiPjg2NDE8L2E+Ci1DYW4ndCBmaW5kIHJlZmVyZW5jZXMgaW4gaGllcmFyY2h5IGluIGJpbmFyeSBwcm9qZWN0cyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY1OSI+ODY1OTwvYT4gIAotVW5leHBlY3RlZCBjaGFuZ2VzIGluIHByb2plY3QgcmVmZXJlbmNlcyAoLnZjbS1tZXRhKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1OCI+ODM1ODwvYT4KLVNlYXJjaDogZG9lc24ndCBmaW5kIHJlZmVyZW5jZSBhbHRob3VnaCB0aGVyZSBhcmUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3OTkiPjY3OTk8L2E+Ci1EdXBsaWNhdGUgdHlwZSBjb2xsaXNpb25zCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQxNCI+ODQxNDwvYT4KLUluY29ycmVjdCAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5nPwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg0ODQiPjg0ODQ8L2E+Ci1JbnRlcm5hbCBlcnJvciBzZWFyY2hpbmcgZm9yIHdyaXRlIGFjY2VzcyB0byBhIHZhcmlhYmxlICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTM2Ij44NTM2PC9hPgotQnVnIG9uICJPcGVuIHR5cGUgaGllcmFyY2h5IiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODU3NSI+ODU3NTwvYT4KLVZhcmlhYmxlIG5hbWUgY29kZSBjb21wbGV0aW9uIHNob3VsZCBoYW5kbGUgYXJyYXlzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMCI+ODUzMDwvYT4KLUludGVybmFsIGVycm9yIHVzaW5nIGFzc2VydGlvbnMgKDEuNCBmZWF0dXJlKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MzEiPjg1MzE8L2E+Ci1WZXJpZnlFcnJvciBpbiBjb2RlIGNvbnRhaW5pbmcgYXNzZXJ0aW9ucwotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MDkiPjc1MDk8L2E+Ci0xR1E2RFVDOiBXU1dCOldJTjIwMDAgLSBDdHJsLXNwYWNlIENvZGUgQ29tcGxldGlvbiBkb2VzIG5vdCB3b3JrCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA2MCI+ODA2MDwvYT4KLUhpZXJhcmNoeSBvbmx5IHNob3dzIE9iamVjdCB3aGVuIG9wZW5pbmcgdHlwZSBpbiBiaW5hcnkgcHJvamVjdCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwOCI+MzQwODwvYT4KLUpDSyAxLjQgLSBOQU1FIC0gcXVhbGlmaWVkIEFtYmlndW91c05hbWUgYW5kIGFuIEV4cHJlc3Npb25OYW1lICgxR0s3TTlCKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1ODQiPjg1ODQ8L2E+Ci1JbnZhbGlkIHN5bnRheCBlcnJvciBnZW5lcmF0ZWQgYnkgY29tcGlsZXIKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTI0IC0gMjR0aCBKYW51YXJ5IDIwMDIgLSBNSUxFU1RPTkUgMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjQKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU0Ij4xMTM1NDwvYT4KLVVuYWJsZSB0byBlZGl0IEphdmEgY29kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwMTYiPjgwMTY8L2E+Ci1nZXR0ZXIvc2V0dGVyIG91dGxpbmVyIHJlY29uY2lsaW5nIGJyb2tlbiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1MiI+ODM1MjwvYT4KLU5vIGhpZXJhcmNoeSB3aGVuIHVzaW5nIEhpZXJhY2h5VHlwZSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MiI+ODA0MjwvYT4KLUNsYXNzQ2FzdEV4Y2VwdGlvbiBob3ZlcmluZyBpbiBqYXZhIGVkaXRvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMTYiPjgyMTY8L2E+Ci1JbmNvbXBsZXRlIHN1cGVyIHR5cGUgaGllcmFyY2h5IGZvciBiaW5hcmllcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODEyNSI+ODEyNTwvYT4KLSdDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSB0eXBlIG5hbWUnIG1lc3NhZ2Ugb3BlbmluZyB0eXBlICAKLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjIxIj43MjIxPC9hPgotSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHJlbmFtaW5nIHBhY2thZ2UgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNDEiPjUzNDE8L2E+Ci1FcnJvciBtZXNzYWdlIHNob3VsZG4ndCBleHBvc2UgZXhjZXB0aW9uIGNsYXNzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDM4Ij44MDM4PC9hPgotTnVsbCBQb2ludGVyIEV4Y2VwdGlvbiBBZGRpbmcgVW5pbXBsZW1lbnRlZCAgCi0KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTIzIC0gMjNyZCBKYW51YXJ5IDIwMDIKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjIzCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+QWRkZWQgd29ya2Fyb3VuZCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2NCI+Nzc2NDwvYT4KLVVJIERlYWQgTG9jayAtIElERSBmcm96ZW4gIAotPC91bD4KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDAiPjMyMDA8L2E+Ci1KYXZhQnVpbGRlciAtIEJ1aWxkIHByb2dyZXNzIG1lc3NhZ2UgY291bGQgYmUgc2hvcnRlbmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA4NyI+ODA4NzwvYT4KLU5QRSB3aGVuIGhpZXJhcmNoeSB2ZXJib3NlIG9uIGFuZCBoaWVyYXJjaHkgb24gYSByZWdpb24gIAotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLQotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMjIgLSAyMm5kIEphbnVhcnkgMjAwMgotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjIKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT4gVGhlIHNlbGVjdGlvbiBlbmdpbmUgbm93IG9ubHkgc2VsZWN0cyBpZGVudGlmaWVyIGJldHdlZW4gc2VsZWN0aW9uIHN0YXJ0IGFuZCBzZWxlY3Rpb24gZW5kLgotUHJldmlvdXMgYmVoYXZpb3VyIHdhcyB0byBzZWxlY3QgaWRlbnRpZmllciBiZXR3ZWVuIHNlbGVjdGlvbiBzdGFydCBhbmQgaWRlbnRpZmllciBlbmQuCi0oZS5nLiBpZiB5b3Ugc2VsZWN0IDxiPkZpbGU8L2I+IGluIDxiPkZpbGU8L2I+SW5wdXQsIG5vdyB0aGUgc2VsZWN0aW9uIGVuZ2luZSBzZWxlY3QgdGhlIGNsYXNzIEZpbGUgYW5kIG5vdCBGaWxlSW5wdXQpCi08bGk+IEZpeCBmb3IgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgzOSI+NjgzOTwvYT4gcmVxdWlyZWQgdG8gaW5jcmVtZW50IHRoZSBpbmRleCBzaWduYXR1cmUgCi12ZXJzaW9uIHNvIGFzIHRvIHRyaWdnZXIgYXV0b21hdGljIHJlaW5kZXhpbmcgb24gd29ya3NwYWNlIHN0YXJ0dXAgKGFuZCB0aHVzIGdldCByaWQgb2YgdW5kZXNpcmVkIGFub255bW91cyB0eXBlIGVudHJpZXMKLWluIHRoZSBpbmRleCBmaWxlcykuIFN1YnNlcXVlbnQgc3RhcnR1cHMgd2lsbCBub3QgcmVpbmRleCBhbnkgZnVydGhlciAob25seSBpZiBpbmNvbnNpc3RlbmN5IGlzIGRldGVjdGVkLCBlLmcuIHNpZ25hdHVyZSB2ZXJzaW9uCi1pcyBkaWZmZXJlbnQpLgotPC91bD4KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5OTMiPjc5OTM8L2E+Ci1OUEUgd2hlbiBjcmVhdGluZyB0eXBlIGhpZXJhcmNoeSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNyI+MzQxNzwvYT4gCi1KQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgbWV0aG9kIGlzIGEgc3RhdGljIChyZXNwZWN0aXZlbHkgaW5zdGFuY2UpIG1ldGhvZC4gKDFHSzdXQ1ApCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNiI+MzQxNjwvYT4gCi1KQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgbWV0aG9kIGlzIGxlc3MgYWNjZXNzaWJsZSB0aGFuIHRoZSBvbGQgb25lICgxR0s3VlhEKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTUiPjM0MTU8L2E+IAotSkNLIDEuNCAtIEJJTkMgLSB0aGUgbmV3IGZpZWxkIGlzIGEgc3RhdGljIChyZXNwZWN0aXZlbHkgaW5zdGFuY2UpIGZpZWxkICgxR0s3VlNOKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTQiPjM0MTQ8L2E+IAotSkNLIDEuNCAtIEJJTkMgLSB0aGUgbmV3IGZpZWxkIGlzIGxlc3MgYWNjZXNzaWJsZSB0aGFuIHRoZSBvbGQgb25lICgxR0s3Vk1EKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTMiPjM0MTM8L2E+IAotSkNLIDEuNCAtIEJJTkMgLSBkZXRlY3Rpb24gb2YgYW4gSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciAoMUdLN1ZDQSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDEyIj4zNDEyPC9hPiAKLUpDSyAxLjQgLSBCSU5DIC0gSW52b2tlIG92ZXJyaWRpbmcgY2xhc3MgbWV0aG9kcyAoMUdLN1VHUSkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDEwIj4zNDEwPC9hPiAKLUpDSyAxLjQgLSBCSU5DIC0gQWRkaW5nIGEgU3RyaW5nIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBTdHJpbmcgZmllbGQgb2YgYSBzdXBlcmNsYXNzICgxR0s3TUhPKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MjAiPjc5MjA8L2E+Ci1KYXZhUHJvamVjdC5jYW5vbmljYWxpemVkUGF0aCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NyI+NzU5NzwvYT4KLVBhY2thZ2VGcmFnbWVudFJvb3Qgd2hpY2ggYXJlIGFyY2hpdmVzIGxvb3NlIGFzc29jaWF0ZWQgcmVzb3VyY2UgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MjciPjc4Mjc8L2E+Ci1udWxsIHJldHVybmVkIGZyb20gZ2V0T3JpZ2luYWwoSUphdmFFbGVtZW50IHdvcmtpbmdDb3B5RWxlbWVudCkgZm9yIElNUE9SVF9DT05UQUlORVIgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxNDQiPjcxNDQ8L2E+Ci1IaWVyYXJjaHkgaW5jb3JyZWN0IHdoZW4gdXNpbmcgYmluYXJ5IHByb2plY3RzICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDExIj4zNDExPC9hPgotSkNLIDEuNCAtIEJJTkMgLSBPdmVycmlkaW5nIGluc3RhbmNlIGFuZCBjbGFzcyBtZXRob2RzICgxR0s3VTZDKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOCI+MzQxODwvYT4KLUpDSyAxLjQgLSBFWFBSIC0gYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gcnVuIHRpbWUgKDFHSzdXSEEpICA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0MSI+NzQ0MTwvYT4KLU9wZW4gYSB0eXBlIGlzIGV4dHJlbWVseSBzbG93ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjE2Ij43NjE2PC9hPgotVW5uZWNlc3NhcnkgaW5kZXhpbmcgd2hlbiBwcm9qZWN0IGlzIG9wZW5lZCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyOSI+MzIyOTwvYT4KLU9wZW5PblNlbGVjdGlvbiAtIHN0cmFuZ2UgYmVoYXZpb3VyIG9mIGNvZGUgcmVzb2x2ZSAoMUdBVkwwOCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTUzIj42OTUzPC9hPgotTm8gY29kZSBhc3Npc3QgcHJvcG9zYWxzIGZvciBpbnRlcmZhY2UgY29uc3RydWN0b3IKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTgzIj43NTgzPC9hPgotRE9NTm9kZSNnZXRDaGlsZChTdHJpbmcpIG5lZWRzIHRvIGhhbmRsZSBjaGlsZHJlbiB3aXRoIG51bGwgbmFtZXMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzU4NCI+NzU4NDwvYT4KLUNvbW1lbnRzIG9uIElET01NZXRob2QjZ2V0UmV0dXJuVHlwZSgpIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDciPjMyNDc8L2E+IAotU2VsZWN0aW9uRW5naW5lIG1vdmVzIHNlbGVjdGlvbiB0byBlbmNsb3NpbmcgdG9rZW4gKDFHQ1NEOEQpCi0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk1NiI+Nzk1NjwvYT4KLU5vIHJlZmVyZW5jZSBmb3VuZCB0byBCbG9ja1Njb3BlLmFuYWx5c2lzSW5kZXggIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODMiPjMyODM8L2E+IAotT3Blbk9uU2VsZWN0aW9uIC0gQ29kZSByZXNvbHZlIGRvZXNuJ3Qgd29yayBpbiBzb21lIHNpdHVhdGlvbnMgKDFHRUk1UVQpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ1MyI+NTQ1MzwvYT4gCi1EQ1I6IENvZGUgQXNzaXN0IGZvciBhbm9ueW1vdXMgdHlwZXMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NjE3Ij43NjE3PC9hPiAKLU5QRSBpbiBCdWlsZGVyIHdpdGggZHVwbGljYXRlZCB0eXBlIG5hbWVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ2NiI+NjQ2NjwvYT4gCi1Db2RlIEZvcm1hdHRlciAgCi0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDExNSAtIDE1dGggSmFudWFyeSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotPHVsPgotPGxpPiBUaGUgY29tcGlsZXIgd2lsbCBub3cgZm9sbG93IEpMUyA4LjYgd2l0aCByZXNwZWN0IHRvIGFub255bW91cyBjbGFzcyAKLWNvbnN0cnVjdG9ycyAoaS5lLiBhbGxvdyB0aGVtIHRvIHRocm93IGFueSBleGNlcHRpb25zKS4KLTxsaT4gVGhlIGNvbXBpbGVyIG5vdyBlbmZvcmNlcyB0aGF0IGludGVyZmFjZSBtZXRob2RzIGJlIGNvbXBhdGlibGUgd2l0aCBPYmplY3Qgb25lcy4KLTxsaT4gVGhlIGJhdGNoIGNvbXBpbGVyIHdpbGwgbm8gbG9uZ2VyIGNyZWF0ZSBwYWNrYWdlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW55bW9yZSB3aGVuIHRoZSBjb21tYW5kIGxpbmUKLWFyZ3VtZW50ICctZCcgPHR0PjxkZXN0aW5hdGlvbj48L3R0PiBpcyBvbWl0dGVkIChjb21wbGlhbnQgd2l0aCBzdGFuZGFyZCBiYXRjaCBjb21waWxlcnMpLgotPGxpPiBBIHR5cGUgaGllcmFyY2h5IHRoYXQgbWlzc2VzIGEgc3VwZXIgdHlwZSBpcyBub3Qgcm9vdGVkIGF0IE9iamVjdCBhbnkgbG9uZ2VyLAotICAgICBidXQgdGhlIHN1YnR5cGUgKG9mIHRoZSBtaXNzaW5nIHR5cGUpIHdpbGwgYmUgYSByb290ICh0aGlzIGlzIHRoZSBiZWhhdmlvciBvZgotICAgICBWQS9KYXZhIGFuZCBWQU1FLikKLTxsaT4gQWRkaW5nIGEgdHlwZSB0aGF0IHdhcyBtaXNzaW5nIGZyb20gYSBoaWVyYXJjaHkgd2lsbCB1cGRhdGUgdGhlIGhpZXJhcmNoeSBjb3JyZWN0bHkuCi08bGk+IE5ldyBBUEkgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IgZm9yIHN1Z2dlc3QgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb246PC9saT4KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPHR0PnZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZSg8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gc3VwZXJUeXBlTmFtZSw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBjb21wbGV0aW9uTmFtZSw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IG1vZGlmaWVycyw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOzwvdHQ+Ci08YnI+Jm5ic3A7Ci08L3VsPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNSI+NzYyNTwvYT4KLU5vIHR5cGVoaWVyYXJjaHkgaW4gd29ya2luZyBjb3B5ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTk1Ij43NTk1PC9hPgotTmV3IGJ1aWxkZXIgcGVyZm9ybXMgaW50ZW1wZXN0aXZlIGZ1bGwgYnVpbGQgb24gbWV0aG9kIGJvZHkgY2hhbmdlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MjgiPjc1Mjg8L2E+Ci1JbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBwYXRoIGNhbm9uaWNhbGlzYXRpb24gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMzQiPjcwMzQ8L2E+Ci1jb2RlIGFzc2lzdCBwZXJmb3JtYW5jZSBwcm9ibGVtIGluIHNjcmFwYm9vawotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMTkiPjcxMTk8L2E+Ci1Db250ZW50IEFzc2lzdCBkb2VzIG5vdCBjb21wbGV0ZSBzb21lIGNvZGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDAwIj43MDAwPC9hPgotU3dpdGNoIGFuZCBUcnkgc3RhdGVtZW50IGRvZXNuJ3QgaW5jbHVkZSB0cmFpbGluZyB9IAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MzIiPjY5MzI8L2E+Ci1JbmNyZW1lbnQgc3RhdGVtZW50IGluIGZvciBsb29wIGNvbnRhaW5zIHRyYWlsaW5nIGNvbW1lbnRzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNDIiPjYzNDI8L2E+Ci1Db2RlIGFzc2lzdCBvbiBJbnRyZWZhY2UtJ0NvbnN0cnVjdG9ycycgaW5jb21wbGV0ZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNDQiPjczNDQ8L2E+Ci1TZWFyY2ggLSB3cml0ZSBhY2NlcyBnaXZlIHdyb25nIHJlc3VsdCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NSI+NzQ1NTwvYT4gIAotQnVpbGQgcHJvYmxlbXMgd2hlbiBpbnN0YW5jZSB2YXJpYWJsZSBuYW1lIG1hdGNoZXMgY29uc3RydWN0b3IgcGFyYW1ldGVyIG5hbWUgYW5kIGFzc2lnbm1lbnQgdG8gdGhpcy5uYW1lIGluIHRyeSBibG9jayAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgzOSI+NjgzOTwvYT4KLUFsbFR5cGVzU2VhcmNoRW5naW5lIHJldHVybnMgYW5vbnltb3VzIGNsYXNzZXMgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NSI+NzQ0NTwvYT4KLWNoYXIvc3RyaW5nIGNvbmNhdCBidWcgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTIiPjMxOTI8L2E+Ci1JbnZhbGlkIHR5cGUgaGllcmFyY2h5IHdoZW4gbWlzc2luZyB0eXBlKHMpIGluIGhpZXJhcmNoeSAoMUdGNVJONCkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDQiPjMzMDQ8L2E+Ci1IaWVyYXJjaHkgbm90IHVwZGF0ZWQgd2hlbiBjaGFuZ2luZyBjbGFzc3BhdGggKDFHRjVRU1cpICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDIyIj43NDIyPC9hPgotTWlzc2luZyBwcm9qZWN0IHJlZmVyZW5jZXMgb24gc29tZSBpbXBvcnRlZCBKYXZhIHByb2plY3RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA2NyI+NTA2NzwvYT4KLUNvZGVBc3Npc3QgLSBubyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb24gZm9yIGJhc2UgdHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjMiPjczNjM8L2E+Ci1SZWJ1aWxkIFByb2plY3QgYWN0aW9uIGlzIG5vdCBjb21waWxpbmcgYWxsIEphdmEgc291cmNlIGZpbGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMyNSI+NzMyNTwvYT4KLUJ1aWxkIGNvbGxpc2lvbnMgc2hvdWxkIGJlIG5vbi1mYXRhbD8KLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzI0Ij43MzI0PC9hPgotQW1iaWd1b3VzIG11bHRpcGxlIHByb2JsZW0gZGVzY3JpcHRpb25zIHdoZW4gY29sbGlzaW9uIG9mIGJ1aWxkIGZpbGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NSI+MzM4NTwvYT4KLUpDSyAxLjQgLSBJTlRGIC0gaWxsZWdhbCBtZXRob2QgZGVjbGFyYXRpb24gZm9yIGludGVyZmFjZSAoMUdLMkFXUykKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE4Ij4zMzE4PC9hPgotSkRPTSAtIElEb21Ob2RlIHJlZGVmaW5lcyBjbG9uZSgpIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZSAoMUdGVlUyVikKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTAxIj42MTAxPC9hPgotVW5leHBlY3RlZCBlcnJvciBpbiBpbm5lciBjbGFzcyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzMzIj43MzMzPC9hPgotdHlwbyBpbiB0eXBlIG5hbWU6IFJlc2V0U2F0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvciAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzU0Ij43MzU0PC9hPgotQ29tcGF0aWJpbGl0eSB3aXRoIGphdmFjIHdoZW4gbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ3MyI+NjQ3MzwvYT4KLUphdmFDb252ZW50aW9ucyBzaG91bGQgdXNlIElXb3Jrc3BhY2UgdmFsaWRhdGUgbWV0aG9kcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyOSI+NzEyOTwvYT4KLVByb2JsZW1zIHdpdGggcmVwbGFjaW5nIGEgcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODYiPjMzODY8L2E+Ci1KQ0sgMS40IC0gRVhDUCAtIGNoZWNrZWQgZXhjZXB0aW9uIGluIHZhcmlhYmxlIGluaXRpYWxpemVyIG9mIGFub255bW91cyBjbGFzcyAoMUdLN0I1TCkKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY3Ij4zMzY3PC9hPgotSkNLIDEuNCAtIElDTFMgLSBBbiBpbnN0YW5jZSBpbml0aWFsaXplciBpbiBhbiBhbm9ueW1vdXMgY2xhc3MgbWF5IHRocm93IGFueSBleGNlcHRpb24gKDFHSzdMWUYpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE4NCI+NzE4NDwvYT4KLUJ1aWx0IGluIGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IGFub255bW91cyBjbGFzcyBpbml0aWFsaXplcnMgdG8gdGhyb3cgZXhjZXB0aW9ucyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTA0Ij42NTA0PC9hPgotVHlwZSBoaWVyYXJjaHk6IFN1YnR5cGVzIGluIGphciBvZiBhbm90aGVyIHByb2plY3Qgbm90IGZvdW5kICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM0Ij4zMzM0PC9hPgotVHlwZXMgaGllcmFyY2h5IHZpZXcgZG9lcyBub3Qgc2hvdyBhbGwgc3ViY2xhc3Nlcy4gKDFHSTkwMVEpICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODY2Ij42ODY2PC9hPiAgCi1Db2RlLUFzc2lzdCAoY3RybCtzcGFjZSkgdG8gc2xvdyB3aXRoIGpyZS1zcmMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDcxIj43MDcxPC9hPiAgCi1BcnJheVN0b3JlRXhjZXB0aW9uIGdldHRpbmcgaG92ZXJoZWxwIGluIEphdmEgZWRpdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE2NSI+NzE2NTwvYT4gIAotZXJyb25lb3VzIHdhcm5pbmcgb2YgdW51c2VkIHZhcmlhYmxlcyAgCi0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNyI+MzIxNzwvYT4KLUpNIC0gZGVsZXRpbmcgZGVmYXVsdCBwYWNrYWdlICgxRzg0MTdaKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NSI+NzM3NTwvYT4KLW5ldyBjbGFzc2VzIHdpdGggZnVubnkgbmFtZXMgZG9uJ3QgYXBwZWFyIGluIHBhY2thZ2UgdmlldyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMiI+NzMwMjwvYT4KLU5lZWQgdmlzaWJpbGl0eSBpbiBzZWFyY2ggcmVzdWx0cyAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzA1Ij43MzA1PC9hPgotaW50ZXJmYWNlIG1ldGhvZHMgYXJlIG1hcmtlZCBhYnN0cmFjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyOTAiPjcyOTA8L2E+Ci1Qcm9qZWN0IHNpemUgbGltaXRhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMzIiPjYyMzI8L2E+Ci1CdWlsZCBwcm9ibGVtczogSW50ZXJuYWwgZXJyb3I6IG51bGwgd2hlbiBjb21waWxpbmcgSkRLIHNvdXJjZSBjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MCI+NzM4MDwvYT4KLVdyb25nIHNjb3BlIGZvciB0cmF2ZXJzZSBtZXRob2RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEzNyI+NzEzNzwvYT4KLUludmFsaWQgdHlwZSBub3QgZmxhZ2dlZCBieSBjb21waWxlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MjQiPjY5MjQ8L2E+Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBidWlsZCBwYXRoLgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAxMDggLSA4dGggSmFudWFyeSAyMDAyCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMGEKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLTx1bD4KLTxsaT4KLUFkZGVkIG5ldyBjb21waWxlciBvcHRpb24gdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbGV2ZWwgKGNhbiBiZSBlaXRoZXIKLSIxLjMiIG9yICIxLjQiIC0gMS4zIGJlaW5nIHRoZSBkZWZhdWx0KSwgYW5kIGl0IHdpbGwgYWZmZWN0IHRoZSBiZWhhdmlvcgotb2YgdGhlIGNvbXBpbGVyIHdpdGggcmVzcGVjdCB0byBKTFMgOC4xLjUgKGluaGVyaXRlZCBtZW1iZXIgc2hhZG93cyBlbmNsb3NpbmcKLW9uZSkuIE9wdGlvbiBpcyBsb2NhdGVkIG9uIDx0dD5KYXZhQ29yZSNnZXRPcHRpb25zKCk8L3R0PiBhbmQgbmFtZWQgPHR0PiJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIjwvdHQ+Ci1BY2NvcmRpbmdseSwgdGhlIGJhdGNoIGNvbXBpbGVyIGFjY2VwdHMgYW4gZXh0cmEgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ci0iLTEuMyIgb3IgIi0xLjQiICgxLjMgY29tcGxpYW5jZSBiZWluZyB0aGUgZGVmYXVsdCkuPC9saT4KLTwvdWw+Ci08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzMCI+MzMzMDwvYT4gIAotSkNLIDEuNCAtIGlsbGVnYWwgc2ltcGxlIG5hbWUgaW1wb3J0cyAoMUdIVzBHMSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzAiPjcwNzA8L2E+Ci1tb3ZlZCBjbGFzc2VzIGxvc3QhICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Nzg1Ij42Nzg1PC9hPgotTlBFIGluIElUeXBlLnJlc29sdmUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Nzc5Ij42Nzc5PC9hPgotc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZWQgLSBtaXNzaW5nIGV4Y2VwdGlvbiB0eXBlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNSI+NzAzNTwvYT4gCi1OZXcgYnVpbGRlciAtIGJ1aWxkZXIgZG9lcyBub3QgY2xvc2UgYWxsIEpBUnMKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDMzIj43MDMzPC9hPgotU3RhbGUgcGFja2FnZXMgdmlldyBhZnRlciBtb3ZpbmcgY29tcGlsYXRpb24gdW5pdHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MjciPjY5Mjc8L2E+Ci1TdGF0aWMgaW5uZXIgY2xhc3Mgd29uJ3QgY29tcGlsZSAoZG9lc24ndCBtYXRjaCBKREsgYmVoYXZpb3IpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMCI+NzAzMDwvYT4KLUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiByZW5hbWluZyBwcm9qZWN0ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI5Ij43MDI5PC9hPgotUmVuYW1pbmcgYSBKYXZhIHByb2plY3QgZG9lc24ndCByZWZyZXNoIHRoZSBwYWNrYWdlcyB2aWV3ICAKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI3Ij43MDI3PC9hPgotcHJvamVjdCBnb25lIGFmdGVyIHJlbmFtaW5nIGluIHRoZSBuYXZpZ2F0b3IgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMjYiPjcwMjY8L2E+Ci13YWxrYmFjayBvbiByZW5hbWUgcHJvamVjdCAtIGNvdWxkIG5vdCByZXByb2R1Y2UgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4ODkiPjY4ODk8L2E+Ci1ObyB0eXBlaGllcmFyY2h5IGZvciBpbm5lciB0eXBlcyAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MyI+MzM0MzwvYT4KLU1pc3NpbmcgamF2YS5sYW5nLk9iamVjdCBzaG91bGQgcHJvZHVjZSBhIG1vcmUgcHJvbWluZW50IGNvbXBpbGVyIGVycm9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk0OCI+Njk0ODwvYT4KLU5ldyBidWlsZGVyIC0gYnVpbGRlciBkb2VzIG5vdCByZXVzZSBvcGVuZWQgSkFScwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTQiPjMzMTQ8L2E+Ci1SZXNvdXJjZXMgbm90IGFwcGVhcmluZyBpbiBKYXZhIHBlcnNwZWN0aXZlIG9yIEphciBleHBvcnQgd2l6YXJkICgxR0ZMMFFUKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MCI+Njg5MDwvYT4KLU1FVEEtSU5GIGhpZGRlbiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk5MyI+Njk5MzwvYT4KLUphdmFNb2RlbCBpbmNvbnNpc3RlbmNpZXMgd2l0aCB1bml0cyBvdXRzaWRlIGNsYXNzcGF0aCAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MCI+MzM2MDwvYT4gCi1Db2RlIGFzc2lzdCBkb2VzIG5vdCB3b3JrIGluIGlubmVyIGNsYXNzZXMgKDFHSk9WVDYpCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MyI+Njg5MzwvYT4gCi1Mb2NhbFR5cGVEZWNsYXJhdGlvbiBpbmNsdWRlcyBwcmVjZWVkaW5nIGNvbW1lbnQgZXZlbiBpZiB0aGVyZSBhcmUgc3RhdGVtZW50cyBpbiBiZXR3ZWVuCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MiI+MzM3MjwvYT4gCi1NYXJrZXJzIGZvciBidWlsZCBwYXRoIG5vdCB1cGRhdGVkIG9uIChyZS0pIGJ1aWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQxMyI+NTQxMzwvYT4gCi1pbmNvcnJlY3QgY2xhc3Mgc291cmNlIHJhbmdlCi08YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQyOSI+NjQyOTwvYT4KLWRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBpbmNvcnJlY3Qgb24gbG9jYWwgdmFyaWFibGUKLTxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDMzIj42NDMzPC9hPgotZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGluY29ycmVjdCBvbiBsb2NhbCB2YXJpYWJsZSAjMgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNSI+MzIzNTwvYT4KLVBhY2thZ2VGcmFnbWVudFJvb3QgZXhpc3RlbmN5IGNoZWNrIG5lZWQgdG8gYmUgcmV2aXNpdGVkICgxR0NVTk83KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NSI+Njg2NTwvYT4KLW9wZW4gb24gc2VsZWN0aW9uIGluIEJ1aWxkTm90aWZpZXIgb25seSBmaW5kcyBjb250ZW50cyBvZiBydC5qYXIgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjAzNyI+NjAzNzwvYT4KLUphclBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgYWx3YXlzIHJldHVybnMgbnVsbAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc1MCI+Njc1MDwvYT4KLUJhdGNoIGNvbXBpbGVyIC0gQ2xhc3NwYXRoIGhhbmRsaW5nIGlzIHRvbyBzdHJpY3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwOSI+MzQwOTwvYT4KLUpDSyAxLjQgLSBTVE1UIC0gbnVsbCBsaXRlcmFsIGluIHRocm93IHN0YXRlbWVudCAoMUdLN01FUSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MTUiPjQ5MTU8L2E+Ci1KQ0sgMS40IC0gbmVlZCBhIG1ham9yIGNvbXBpbGVyIHN3aXRjaCBmb3IgMS4zIC8gMS40IG1vZGUKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NzgiPjY2Nzg8L2E+Ci1JbmNvcnJlY3Qgb3V0cHV0IGFmdGVyIEFkZCBVbmltcGxlbWVudGVkIE1ldGhvZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MSI+MzM2MTwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHB1YmxpYyBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdMQUEpIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MCI+MzM1MDwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RFZKKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUxIj4zMzUxPC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RFpWKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzUyIj4zMzUyPC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RUI5KSAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjIiPjMzNjI8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdMQ1gpICAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzYzIj4zMzYzPC9hPgotSkNLIDEuNCAtIElDTFMgLSBBbiBpbmhlcml0ZWQgdmFyaWFibGUgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xIUikgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NCI+MzM2NDwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIG1ldGhvZCB0aGF0IHNoYWRvd3MgYSBuYW1lIGZyb20gYW4gZW5jbG9zaW5nIG5vbi1wYWNrYWdlIHNjb3BlICgxR0s3TEtWKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY1Ij4zMzY1PC9hPgotSkNLIDEuNCAtIElDTFMgLSBBbiBpbmhlcml0ZWQgY2xhc3MgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xUQSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NiI+MzM2NjwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIGludGVyZmFjZSB0aGF0IHNoYWRvd3MgYSBuYW1lIGZyb20gYW4gZW5jbG9zaW5nIG5vbi1wYWNrYWdlIHNjb3BlICgxR0s3TFcyKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NSI+MzM3NTwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RkxDKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NiI+MzM3NjwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3Rk9UKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NyI+MzM3NzwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGVEEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc4Ij4zMzc4PC9hPgotSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdGWDcpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc5Ij4zMzc5PC9hPgotSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdHMkEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgwIj4zMzgwPC9hPgotSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0c1QSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODEiPjMzODE8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHByb3RlY3RlZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RzhFKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MiI+MzM4MjwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdHQzEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgzIj4zMzgzPC9hPgotSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3R1FBKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NCI+MzM4NDwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MuICgxR0s3Q1RWKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NyI+MzM4NzwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwdWJsaWMgZmllbGQgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0gwQikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODgiPjMzODg8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3QkdQKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4OSI+MzM4OTwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0QyUCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTAiPjMzOTA8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdEN1EpIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5MSI+MzM5MTwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0RCRCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTIiPjMzOTI8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VSRSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTMiPjMzOTM8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VWQikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTQiPjMzOTQ8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VaQikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTUiPjMzOTU8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RjRTKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5NiI+MzM5NjwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0Y4TCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTciPjMzOTc8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGQ04pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk4Ij4zMzk4PC9hPgotSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGSEIpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk5Ij4zMzk5PC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIMlopCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAwIj4zNDAwPC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHByb3RlY3RlZCBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3R1c2KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMSI+MzQwMTwvYT4KLUpDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIRUYpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAyIj4zNDAyPC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHByb3RlY3RlZCBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdISDEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDAzIj4zNDAzPC9hPgotSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHJvdGVjdGVkIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdINVgpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA0Ij4zNDA0PC9hPgotSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHVibGljIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIQkopCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA1Ij4zNDA1PC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHB1YmxpYyBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdIS0UpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA2Ij4zNDA2PC9hPgotSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIGZpZWxkIGluIG5lc3RlZCBjbGFzcyAoMUdLN0hNTikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDciPjM0MDc8L2E+Ci1KQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwcm90ZWN0ZWQgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3TDc5KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MSI+NjA2MTwvYT4KLXVucmVhY2hhYmxlIGNvZGUvdW51c2VkIHRlbXAgPyAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NDMiPjY0NDM8L2E+Ci1JbmNyZW1lbnRhbCBqYXZhIGJ1aWxkZXIgZG9lc24ndCBoYW5kbGUgZm9sZGVyIGNyZWF0ZS9kZWxldGUgbmljZWx5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzE3Ij41MzE3PC9hPgotUmVwYXJlbnRpbmcgY2xhc3Mgc2hvdWxkIHJlZnJlc2ggaGllcmFyY2h5ICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NDAiPjY3NDA8L2E+Ci1Qcm9ibGVtcyB3aXRoIGRlbGV0aW5nIHByb2plY3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0OTEiPjY0OTE8L2E+Ci1Ob24tamF2YSByZXNvdXJjZSBmb2xkZXIgZG9lc24ndCBhcHBlYXIgdW5kZXIgcGtnIGZyYWdtZW50IHJvb3QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0NSI+MzI0NTwvYT4KLXN1YiBmb2xkZXJzIHdpdGggZG90IG5vdCB2aXNpYmxlIGluIHBhY2thZ2VzIHZpZXcgKDFHQ09IMTcpICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4MDYiPjY4MDY8L2E+Ci1OdWxsUG9pbnRlckV4Y2VwdGlvbiBtb3ZpbmcgZW5wdHkgY3Ugb3V0IG9mIGRlZmF1bHQgcGFja2FnZSAgCi0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDY1Ij43MDY1PC9hPgotTlBFIHdoZW4gc2F2aW5nIGEgSmF2YSBzb3VyY2UKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTYiPjY5NTY8L2E+Ci1pbmNvcnJlY3QgY29tcGlsZXIgZXJyb3IgcmVwb3J0ZWQgb24gZXh0cmFjdCBtZXRob2QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNzIiPjcwNzI8L2E+Ci1Qcm90ZWN0ZWQgbWVtYmVyIGluIHN1cGVyY2xhc3Mgbm90IHZpc2libGUgaW4gc3ViY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwNjYiPjcwNjY8L2E+Ci1TdWJjbGFzcyBjYW4ndCBzZWUgcHJvdGVjdGVkIGlubmVyIGNsYXNzIG9mIHN1cGVyY2xhc3MgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4NCI+MzI4NDwvYT4KLVByb2plY3QgZG9lc24ndCBhbHdheXMgcmVidWlsZCBhZnRlciBjaGFuZ2luZyB0aGUgSmF2YSBidWlsZCBwYXRoCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU3Ij42OTU3PC9hPgotQ0NFIGluIEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOjp0cmF2ZXJzZSAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTgiPjY5NTg8L2E+Ci1OUEUgaW4gRGVsdGFQcm9jZXNzb3IgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMCI+NjkwMDwvYT4KLVJlYnVpbGQgcHJvamVjdCBmYWlscyB3aXRoIGVycm9yICIxMDAwIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4MiI+NDM4MjwvYT4KLU51bGxQb2ludGVyRXhjZXB0aW9uIGluIEphdmFCdWlsZGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk5Ij4zMTk5PC9hPgotTWlzc2luZyBjbGFzc3BhdGggdmFyaWFibGVzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODQ4Ij42ODQ4PC9hPgotSW5kZXggb3V0IG9mIHJhbmdlIGV4Y2VwdGlvbiB3aXRoIE5ldyBidWlsZGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTEzIj40OTEzPC9hPgotbnVsbCBhcmd1bWVudCBpbiBJbmNyZW1lbnRhbEltYWdlQnVpbGRlci5nZXRCdWlsZGVyVHlwZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MCI+Njc2MDwvYT4KLXBhY2thZ2UgbmFtZXMgdHJ1bmNhdGVkIGluIGNvbXBpbGF0aW9uIGRpYWxvZwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5NSI+MzI5NTwvYT4KLUVycm9ycyBmcm9tIG1pc3NpbmcgcmVmZXJlbmNlIHRvIGEgamFyIGRvIG5vdCBnbyBhd2F5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUwIj4zNDUwPC9hPgotQnVnIGluIEphdmFTZWFyY2hTY29wZSAoMUdMRTFHQykKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjE4IC0gMTh0aCBEZWNlbWJlciAyMDAxIC0gTUlMRVNUT05FIDEKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjE5YQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotCi08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMTciPjYxMTc8L2E+Ci1Db2RlRm9ybWF0dGVyIC0gaW1wb3NzaWJsZSB0byBzZXQgaW5kZW50YXRpb24gbGV2ZWwgYW5kIHBvc2l0aW9uIG1hcHBpbmcgdy9vIGRlcHJlY2F0ZWQgbWV0aG9kcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjcxOSI+NjcxOTwvYT4KLUxvY2FsVHlwZURlY2xhcmF0aW9uOjp0cmF2ZXJzZQotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQzMiI+NTQzMjwvYT4KLWNvbXBpbGVyIHN5bnRheCBlcnJvciBpcyBpbmNvcnJlY3QKLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjExIC0gMTF0aCBEZWNlbWJlciAyMDAxCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxOAotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08dWw+Ci08bGk+IEphdmEgZWxlbWVudCBkZWx0YXMgYXJlIGJhdGNoZWQuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBtb2RpZmllcwotCSBhIHJlc291cmNlLCB0aGVuIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGFzIGFyZSBtZXJnZWQgYW5kIGZpcmVkIGR1cmluZyAKLQkgdGhlIHJlc291cmNlIGRlbHRhIHByb2Nlc3NpbmcuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBkb2Vzbid0IAotCSBtb2RpZnkgYW55IHJlc291cmNlIChlLmcuIElXb3JraW5nQ29weS5yZWNvbmNpbGUoKSksIHRoZW4gdGhlIGphdmEKLQkgZWxlbWVudCBkZWx0YSBpcyBmaXJlZCByaWdodCBhd2F5LgotPC91bD4KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci0KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNSI+MzIxNTwvYT4KLUpNIC0gQ3JlYXRpbmcgYSBuZXcgY2xhc3Mgc2VuZHMgb3V0IG1hbnkgbm90aWZpY2F0aW9ucyAoMUdEMkdUMCkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5NSI+NjY5NTwvYT4KLUNoYW5naW5nIEphdmEgcHJlZmVyZW5jZSBpbiBidWlsZCAyMDAxMTIwNiB0aHJvd3MgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWx0YVByb2Nlc3Nvci5pbml0aWFsaXplUm9vdHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MSI+Njc2MTwvYT4KLU51bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZyByZXBsYWNlICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTAiPjMyOTA8L2E+Ci1KYXZhQnVpbGRlciAtIE9sZCBjbGFzcyBmaWxlcyByZW1haW4gYWZ0ZXIgY2hhbmdlIG9mIG91dHB1dCBsb2NhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4OCI+MzE4ODwvYT4KLUphdmFCdWlsZGVyIC0gRGVsZXRpbmcgc291cmNlIGRvZXNuJ3QgZGVsZXRlIGJpbmFyeSBmb2xkZXJzICgxRlZQVFRLKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg1Ij4zMTg1PC9hPgotSmF2YUJ1aWxkZXIgLSBFcnJvcnMgZG9uJ3QgZGlzYXBwZWFyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg5Ij4zMTg5PC9hPgotSmF2YUJ1aWxkZXIgLSBNaXNzaW5nIGxpYnJhcmllcyByZXN1bHRzIGluIGluc3VmZmljaWVudCBkZXBlbmRlbmN5IGluZm8KLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDQiPjMyMDQ8L2E+Ci1JbWFnZUJ1aWxkZXIgc2hvdWxkIHNob3cgZXJyb3IgY291bnQgaW4gdGhlIHByb2dyZXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI3Ij4zMjI3PC9hPgotSkNMIGRldiAtIEJ1aWxkZXIgZGlkIG5vdCByZWZyZXNoIHByb2JsZW1zIGluIGV4Y2VwdGlvbiBoaWVyYXJjaHkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjgiPjMyMjg8L2E+Ci1EaXNjYXJkaW5nIHJ0LmphciBmcm9tIGJ1aWxkIHBhdGggdHJpZ2dlcnMgdG9vIG1hbnkgcmVjb21waWxhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMiI+MzIzMjwvYT4KLUluY3JlbWVudGFsIGJ1aWxkZXIgdW5hYmxlIHRvIGhhbmRsZSBlZmZpY2llbnRseSBtaXNzaW5nIHJ0LmphciBzY2VuYXJpbwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNCI+MzIzNDwvYT4KLUluY3JlbWVudGFsIGJ1aWxkZXIgZG9lcyBub3Qgbm90aWNlIGFkZGl0aW9uIG9mIGphdmEubGFuZy5PYmplY3QgaW5zaWRlIHNhbWUgcHJvamVjdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MSI+MzI0MTwvYT4KLUJ1aWxkIGRvZXNuJ3QgaG9ub3IgY2FuY2VsCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYwIj4zMjYwPC9hPgotTlBFIHdoZW4gZG9pbmcgaW5jcmVtZW50YWwgcHJvamVjdCBidWlsZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3OCI+MzI3ODwvYT4KLUphdmFCdWlsZGVyIC0gUHJvYmxlbSBDb3VudCByYXJlbHkgdXBkYXRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4NyI+MzI4NzwvYT4KLUJ1aWx0IHN0YXRlIGRvZXMgbm90IHJlbWVtYmVyIG9sZCBwa2cgZnJhZ21lbnQgcm9vdHMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDEiPjMzMDE8L2E+Ci1JbmNyZW1lbnRhbCBidWlsZCBkb2Vzbid0IGRldGVjdCBkaXNhcHBlYXJhbmNlIG9mIGZpZWxkCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA1Ij4zMzA1PC9hPgotSW5jcmVtZW50YWwgYnVpbGQgZG9lc24ndCBkZXRlY3QgYWJzdHJhY3QgbWV0aG9kIHRvIGltcGxlbWVudHMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTEiPjMzMTE8L2E+Ci1wZXJmb3JtYW5jZTogdGFzayBsaXN0IHN0aWxsIGRvZXMgbm90IHNjYWxlIGF0IGFsbAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMiI+MzMxMjwvYT4KLUludGVybmFsIGVycm9ycyBpbiBpbWFnZSBidWlsZGVyIGR1ZSB0byBkdXBsaWNhdGUgcGFja2FnZSBmcmFnbWVudAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxNyI+MzMxNzwvYT4KLUZ1bGxidWlsZCBhZnRlciBzdGFydHVwCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIyIj4zMzIyPC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gZHVyaW5nIGJ1aWxkIGluIFN0YXRlSW1wbC5nZXRTb3VyY2VFbGVtZW50RW50cmllcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNiI+MzMyNjwvYT4KLUluY3JlbWVudGFsIGJ1aWxkIGRvZXNuJ3Qgd29yayBpZiBiaW4gZGVsZXRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MCI+MzM3MDwvYT4KLUluY3JlbWVudGFsIGNvbXBpbGVyIGlzIGNvbXBpbGluZyBwcm9qZWN0IHdoZW4gaXQgc2hvdWxkIG5vdAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQyMiI+MzQyMjwvYT4KLU5QRSBpbiBKYXZhIGJ1aWxkZXIgZHVyaW5nIGNhdGNodXAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjkiPjM0Mjk8L2E+Ci1JbmNyZW1lbnRhbCBjb21waWxhdGlvbiBidWcgb24gbmFtZXNwYWNlIGNoYW5nZSBpbiBwcml2YXRlIGxvY2FsIGNsYXNzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ0Ij4zNDQ0PC9hPgotQnVpbGQgcHJvYmxlbXM6IE1hcmtlciBzZXQgb24gRm9sZGVyPwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTAwNyI+NTAwNzwvYT4KLVByb2plY3QgY2xhc3NwYXRoIHJlZmVyZW5jZXMgZG8gbm90IGZvbGxvdyBjbGFzcyBmb2xkZXJzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTA5Ij41MTA5PC9hPgotQWRkaW5nIHByb2plY3QgZG9lc24ndCBmaXggYnVpbGQgZXJyb3JzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzIwIj41MzIwPC9hPgotTlBFIGR1cmluZyBjYXRjaHVwCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjQxIj41NjQxPC9hPgotTlBFIG9uIHJlYnVpbGQgd2hlbiByZXBsYWNpbmcgaW50ZXJuYWwgamFyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTM4Ij42NTM4PC9hPgotc2VhcmNoRGVjbGFyYXRpb25zT2YqIGluY29ycmVjdCAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2OTAiPjY2OTA8L2E+Ci1Db2RlQXNzaXN0IGZpbmRzIHR5cGVzIG91dHNpZGUgdGhlIGNsYXNzcGF0aCAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2ODciPjY2ODc8L2E+Ci1Xcm9uZyBKYXZhTW9kZWwgcmVmcmVzaCBhZnRlciBkcmFnIGFuZCBkcm9wIG91dHNpZGUgZm9sZGVyIHdpdGggZG90IGluIG5hbWUgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5MyI+NjY5MzwvYT4KLUFic3RyYWN0SW1hZ2VCdWlsZGVyLmNvbXBpbGUgdGhyb3dzIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBsaW5lIDE2NiBpbiBidWlsZCAyMDAxMTIwNgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MCI+NjY3MDwvYT4KLUNvZGUgQXNzaXN0OiBDYW5ub3QgcmVzb2x2ZSBpbiBtZXRob2QgYm9keQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NCI+NjY3NDwvYT4KLUNhbm5vdCBhZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjI5Ij42NjI5PC9hPgotT3BlbiBPbiBTZWxlY3Rpb24gZG9lcyBub3Qgd29yayBvbiBMaW51eAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MiI+NTU0MjwvYT4KLVRvbyBtYW55IGRlbHRhcyBhcmUgZmlyZWQgb24gZWFjaCBKYXZhTW9kZWwgb3BlcmF0aW9uICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjkiPjMyNjk8L2E+IAotVXBkYXRpbmcgdGhlIEphdmEgcGFja2FnZXMgdmlldyBvbiBwcm9qZWN0IGNyZWF0aW9uICgxR0RXMFU5KSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjAyIj4zMjAyPC9hPgotRENSIC0gSk0gLSBNZXJnZSBKYXZhIEVsZW1lbnQgRGVsdGFzIHdpdGggUmVzb3VyY2UgRGVsdGFzICgxRzJCNjBaKSAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjIxIj42NjIxPC9hPgotTlBFIGluIERlbHRhIFByb2Nlc3NvciAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4Ij4zMzY4PC9hPgotSkNLIDEuNCAtIElOVEYgLSBUaGUgZmllbGQgb2YgcHJvdGVjdGVkIGludGVyZmFjZSBpcyB1c2VkIGluIG90aGVyIHBhY2thZ2UgKDFHSzdNMjUpICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1OTYiPjY1OTY8L2E+Ci1KYXZhIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBpbnZhbGlkIGJ5dGVjb2RlCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg2Ij42NTg2PC9hPgotTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiByZXNvdXJjZSBtb2RpZmljYXRpb24gZG9uZSBiZWZvcmUgamF2YSBtb2RlbCBpcyBvcGVuCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTQyIj42NTQyPC9hPgotZXh0cmFjdCBtZXRob2Q6IGluY29ycmVjdCBlcnJvciBtZXNzYWdlICAKLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NDUiPjY2NDU8L2E+Ci1CdWlsZC9SZWJ1aWxkIGRvZXMgbm90IHJlY29tcGlsZSBjb2RlICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NjkiPjY2Njk8L2E+Ci1TZWFyY2ggZG9lc24ndCBmaW5kIHJlZmVyZW5jZSB0byBhIGZpZWxkIHRoYXQgaXMgb25seSB1c2VkIGluIGFuIGluaXRpYWxpemF0aW9uICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzODUiPjUzODU8L2E+Ci1zZWFyY2g6IG5hbWUgc2VhcmNoRGVjbGFyYXRpb25zT2ZTZW50TWVzc2FnZXMgaXMgbm90IGdvb2QgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MyI+MzE4MzwvYT4KLUpNIC0gQnVpbGRlcnMgYW5kIG5lc3RlZCBvcGVyYXRpb25zIHVzaW5nIEphdmEgbW9kZWwgY2FuIGdldCBpbmNvbnNpc3RlbnQgcmVzdWx0cyAoMUZVQlY5MCkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MCI+MzI1MDwvYT4KLUphdmFQcm9qZWN0LnJldHJpZXZlUmVzb3VyY2UgcGlja3MgZmlyc3QgcmVtb3ZlZCBjaGlsZCBkZWx0YSAoMUdDVjdQUSkgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM3OCI+NjM3ODwvYT4KLUNsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBpbm5lciBjbGFzcyBlbXVsYXRpb24gIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NyI+NjY3NzwvYT4KLVx1IGluIGNvbW1lbnQgZ2l2ZXMgSW52YWxpZCB1bmljb2RlIGVycm9yCi0gICAKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTIwNiAtIDA2dGggRGVjZW1iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTcKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NCI+NjU2NDwvYT4KLU5ldyBidWlsZGVyIC0gSW5jcmVtZW50YWwgcmVjb21waWxhdGlvbiBkZXRlY3RlZCBwYWNrYWdlIHByb2JsZW1zIGluY29ycmVjdGx5ICAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1NjMiPjY1NjM8L2E+Ci1QYWNrYWdlIHZpZXcgZG9lcyBub3QgcmVmcmVzaCBvayB3aGVuIGFkZGluZyBib3RoIHBhY2thZ2UgYW5kIHVuaXQgYXQgb25jZSAgCi0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQyIj4zMjQyPC9hPgotVHlwZVJlZi5nZXRUeXBlIGRvZXMgbm90IHdvcmsgZm9yIGlubmVyIHR5cGVzICgxR0NGVU5UKQotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMDQgLSA0dGggRGVjZW1iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTZjCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci08dWw+Ci08bGk+IE5ldyBpbmNyZW1lbnRhbCBidWlsZGVyIGltcGxlbWVudGF0aW9uIGVuYWJsZWQgYnkgZGVmYXVsdCAoY2FuIHJlZW5hYmxlIHRoZSAKLW9sZCBpbXBsZW1lbnRhdGlvbiBieSBjaGFuZ2luZyB0aGUgYnVpbGRlciBleHRlbnNpb24gaW4gdGhlIHBsdWdpbi54bWwpCi08bGk+IERlbHRhIHByb2Nlc3NpbmcgaW1wcm92ZW1lbnQ6Ci0JPHVsPgotCTxsaT4gTm8gbG9uZ2VyIGNyZWF0ZXMgdW5uZWNlc3NhcnkgSmF2YSBlbGVtZW50cyB3aGVuIHRyYXZlcnNpbmcgdGhlIHJlc291cmNlIGRlbHRhLgotCTxsaT4gSGFuZGxlcyBjaGFuZ2VzIGluIGJpbmFyeSBmb2xkZXIgbGlicmFyaWVzLgotCTxsaT4gUHJvamVjdHMgdGhhdCBzaGFyZSBsaWJyYXJpZXMgYXJlIG5vdGlmaWVkIGluZGl2aWR1YWxseS4KLQk8bGk+IERvZXNuJ3Qgbm90aWZ5IGVtcHR5IGRlbHRhcyBhbnkgbG9uZ2VyLgotCTwvdWw+Ci08bGk+IFNvdXJjZSBmb2xkZXIgcmVzb3VyY2UgY29weWluZyBubyBsb25nZXIgcGVyZm9tIGFueSBjb3BpZXMgYXMgc29vbiBhcwotb25lIHNvdXJjZSBmb2xkZXIgY29pbmNpZGF0ZXMgd2l0aCB0aGUgb3V0cHV0IGxvY2F0aW9uLgotPGxpPiBPcGVuIG9uIHNlbGVjdGlvbiBpcyBtb3JlIGZhdWx0LXRvbGVyYW50OiB3aWxsIG5vdyB0cnkgdG8gbG9jYXRlIGEKLXNlbGVjdGVkIG1ldGhvZCBmb3Igd2hpY2ggYXJndW1lbnQgdHlwZXMgYXJlIGluY29ycmVjdC4KLTxsaT4gQ29tcGlsZXIgbm8gbG9uZ2VyIHJlamVjdHMgY29ycmVjdCBjb2RlIHdpdGggcmVzcGVjdCB0byBhY2Nlc3MgdG8gcHJvdGVjdGVkCi1tZW1iZXJzIGRlZmluZWQgaW4gZW5jbG9zaW5nIHR5cGVzICh3YXMgb25seSBhY2NlcHRpbmcgYSBzdWJzZXQgb2YgY29ycmVjdCBzY2VuYXJpaSkuCi08L3VsPgotPGgzPgotUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KLQotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTI4Ij42NTI4PC9hPjoKLUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdHJ5aW5nIHRvIHNlYXJjaCAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0OTQiPjY0OTQ8L2E+OgotTmV3IGJ1aWxkZXI6IEludmFsaWQgZXJyb3IgZm91bmQgKFRoZSBkZWNsYXJlZCBwYWNrYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBwYWNrYWdlKSAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0NjEiPjY0NjE8L2E+OgotTmV3QnVpbGRlciAtIGRvZXNuJ3QgZGV0ZWN0IGluY29ycmVjdGx5IGxvY2F0ZWQgY29tcGlsYXRpb24gdW5pdHMgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ1NiI+NjQ1NjwvYT46Ci1JbnZhbGlkIGVycm9yIHdoZW4gY29tcGlsaW5nIGFjY2VzcyB0byBwcm90ZWN0ZWQgbWVtYmVyIGluc2lkZSBpbm5lcmNsYXNzIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1OCI+MzM1ODwvYT46Ci1QZXJmb3JtYW5jZTogaW5kZXhlciBkb2luZyB0b28gbXVjaCB3b3JrPyAoMUdKTERONykgIAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46IAotQ29kZUZvcm1hdHRlciBtYXBwZWQgcG9zaXRpb25zIGJyb2tlbiBmb3IgbXVsdGktbGluZSBjb21tZW50cwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQzMSI+NjQzMTwvYT46Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gdGhlIFNvdXJjZUluZGV4ZXIgcmVxdWVzdG9yCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDIyIj42NDIyPC9hPjoKLVJlc291cmNlIGNvcHkgc2hvdWxkIG5vdCBvY2N1ciBhcyBzb29uIGFzIG9uZSBzb3VyY2UgZm9sZGVyIG92ZXJsYXAgdGhlCi1iaW5hcnkgb3V0cHV0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDE2Ij42NDE2PC9hPjoKLUNvZGUgcmVzb2x2ZSBkb2Vzbid0IHdvcmsgb24gbWVzc2FnZSBzZW5kIHdoZW4gcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3MDUiPjU3MDU8L2E+OgotV3JvbmcgcG9zaXRpb25zIGZvciBDbGFzc0Nhc3RMaXRlcmFsCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQyMyI+NjQyMzwvYT46ICAKLVNlYXJjaCAtIGRvZXMgbm90IGZpbmQgZGVjbGFyYXRpb25zIG9mIG1ldGhvZCAidG8qU3RyaW5nIiAgCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ2Ij4zMjQ2PC9hPjogCi1Db2RlQ29tcGxldGlvbiAtIE5vIGNvbXBsZXRpb24gb24gbWVtYmVyIGFjY2VzcyBvbiBhbm9ueW1vdXMgY2xhc3MgKDFHRDNPR0EpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDU0Ij41NDU0PC9hPjoKLUNvZGUgQXNzaXN0IGFkZHMgcXVhbGlmaWVkIGNvZGUgaW5zaWRlIGlubmVyIGNsYXNzZXMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MzciPjU4Mzc8L2E+OgotQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIGluZGV4IG1lcmdpbmcKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTEyNyAtIDI3dGggTm92ZW1iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTVhCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTx1bD4KLTxsaT4KLUJldHRlciBoaWdobGlnaHRpbmcgb2YgbXVsdGktbGluZSBtZXNzYWdlIHNlbmRpbmc8L2xpPgotCi08bGk+Ci1Db2RlIGFzc2lzdCBvbmx5IHF1YWxpZmllcyBpbXBsaWNpdCBtZW1iZXJzIHdoZW4gbmVjZXNzYXJ5PC9saT4KLQotPGxpPgotTmV3IEFQSSBmb3Igc2V0dGluZyBib3RoIGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIGF0IHRoZSBzYW1lIHRpbWUKLShhbGxvd2luZyB0byBhdm9pZCBjbGFzc3BhdGggdmFsaWRhdGlvbiBmYWlsdXJlcyBpbiBjYXNlIHRoZXJlIGlzIG5vIHdheQotdG8gY2hhbmdlIGJvdGggaW5kZXBlbmRhbnRseSk6PC9saT4KLQotPGJyPjx0dD5JSmF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGgKLW5ld091dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC90dD48L3VsPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzM5Ij42MzM5PC9hPiBBc3NlcnRpb24KLWZhaWxlZCBpbiBTb3VyY2VUeXBlCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjE4Ij41NjE4PC9hPgotVW5jYXVnaHQgQ29tcGxldGlvbk5vZGVGb3VuZCBleGNlcHRpb24gZG9pbmcgY29kZSBhc3Npc3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyOTQiPjYyOTQ8L2E+Ci1FeGNlcHRpb24gZHVyaW5nIHNldHRpbmcgdGhlIGNsYXNzcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjMwMiI+NjMwMjwvYT4KLUFzc2VydGlvbkZhaWx1cmUgaW4gb3BlbiBvbiBzZWxlY3Rpb24KLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwOTQiPjYwOTQ8L2E+Ci1TZWFyY2ggLSBkb2VzIG5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gSmF2YVByb2plY3Quc2V0UHJvamVjdCguLi4pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIwIj4zMzIwPC9hPiIKLVNlYXJjaCAtIE1hdGNoIHRocm91Z2ggc3VwZXIgdHlwZSBub3QgZm91bmQgaWYgaW4gZGlmZmVyZW50IHByb2plY3QgKDFHR0FPRlQpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTU4Ij42MTU4PC9hPiIKLVNlYXJjaCAtIFByZWZpeCBhbmQgcG9zdGZpeCBleHByZXNzaW9uIG5vdCBmb3VuZCBhcyB3cml0ZSByZWZlcmVuY2UKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzQiPjQ5NzQ8L2E+OgotU2V0IGNsYXNzcGF0aCAvIG91dHB1dCBsb2NhdGlvbiBzaG91bGQgYmUgb25lIG9wZXJhdGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE3NiI+NjE3NjwvYT46Ci1FY2xpcHNlIHRvb2xzIGluZGV4IG91dCBvZiBib3VuZHMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjAiPjYxNjA8L2E+OgotSW5kZXggb3V0IG9mIGJvdW5kcyBpbiB1cGRhdGUgcmVmZXJlbmNlcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE1MSI+NjE1MTwvYT46Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gT2JqZWN0U2V0Ci08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTQzIj41OTQzPC9hPjoKLWludGVybmFsIGVycm9yIGluIHNldHRpbmcgYnVpbGRwYXRoIChuYW1lIGNvbGxzaW9uKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46Ci1Db2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTA3Ij41OTA3PC9hPjoKLUluZGV4ZXIgZXJyb3JzIHdoZW4gZGlzayBmdWxsCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODg0Ij41ODg0PC9hPjoKLUNvZGUgYXNzaXN0IHNob3VsZCBvbmx5IGZ1bGx5IHF1YWxpZnkgaWYgbmVlZGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTE0Ij41NTE0PC9hPjoKLVNlbGVjdCBhIGRlY2xhcmF0aW9uIGRvZXMgbm90IHdvcmsgaW4gdW5zYXZlZCB3b3JraW5nIGNvcGllcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQxNCI+NTQxNDwvYT46Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gU2lnbmF0dXJlCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mzg0Ij41Mzg0PC9hPjoKLXNlYXJjaCBlbmdpbmU6IGJlaGF2aW9yIGRpZmZlcmVudCB0aGFuIGV4cGVjdGVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTA0Ij42MTA0PC9hPjoKLVVub3B0aW1hbCBkZWJ1Z2dlciBoaWdobGlnaHQgZm9yIG11bHRpLWxpbmUgbWVzc2FnZSBleHByZXNzaW9uCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIxMCI+NjIxMDwvYT46IENyZWF0aW9uCi1mYWlsZWQgZXJyb3Igd2hlbiBjcmVhdGluZyBhIHNvdXJjZSBmb2xkZXIKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjUiPjM0MjU8L2E+OgotSmF2YUNvcmUuY3JlYXRlKFN0cmluZyBoYW5kbGUpIGxvb3NlcyBpbmZvcm1hdGlvbiAoMUdMQTBRRykKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMjciPjYxMjc8L2E+OgotUmVmZXJlbmNlIGJ5IGxvY2FsIGNsYXNzIG5vdCBmb3VuZCB3aGVuIHNlYXJjaGluZyBmb3IgaW50ZXJmYWNlIHJlZnMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5OTAiPjQ5OTA8L2E+OgotRXJyb3Igc3RhcnRpbmcgRWNsaXBzZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MSI+MzQ3MTwvYT46Ci1MZWFkaW5nICcvJyBpbiBzcmMgcGFnZSBvZiBKYXZhIHdpemFyZCBpcyBtaXNsZWFkaW5nICgxRzg0MlRIKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYxOSI+MzYxOTwvYT46Ci1pbmNvbnNpc3RlbnQgc2VhcmNoIGZvciBtZXRob2QgZGVjbGFyYXRpb25zICgxR0NaWlMxKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU1NyI+NTU1NzwvYT46Ci1JbmNvcnJlY3QgaGllcmFyY2h5IHNob3duIChub3Qgcm9vdGVkIGF0IE9iamVjdCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMDAiPjYxMDA8L2E+OgotQnVnIGluIE9iamVjdFNldC5FbnVtZXJhdGlvbi5uZXh0RWxlbWVudAotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMTIwIC0gMjB0aCBOb3ZlbWJlciAyMDAxCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxMwotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08dWw+Ci08bGk+Ci1Db2RlQXNzaXN0IG5vIGxvbmdlciBmaW5kIHN5bnRoZXRpYyBjb21wbGV0aW9ucy48L2xpPgotCi08bGk+Ci1SZWR1Y2VkIHN0YXJ0dXAgdGltZSBvZiBKYXZhIHBlcnNwZWN0aXZlPC9saT4KLQotPGxpPgotQ29kZUFzc2lzdCBvcHRpb24gYWRkZWQgdG8gZm9yY2UgZnVsbCBxdWFsaWZpY2F0aW9uIG9mIGltcGxpY2l0IGZpZWxkL21ldGhvZAotcmVmZXJlbmNlcyAoc2VlIEphdmFDb3JlIG9wdGlvbjogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiIpLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTgyIj41OTgyPC9hPjogY29udGVudAotYXNzaXN0IGRpc3BsYXlzIGFjY2Vzc29ycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk1NSI+NTk1NTwvYT46Ci1OUEUgaW4gTG9va3VwRW52aXJvbm1lbnQKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MjMiPjU5MjM8L2E+OgotU2VhcmNoIGZvciAibGVuZ3RoIiBmaWVsZCByZWZzIGZpbmRzIFtdLmxlbmd0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkxNiI+NTkxNjwvYT46Ci1TZWFyY2ggLSB0b28gbWFueSBtYXRjaGVzIGZvciByZWZzIHRvIE5hbWVMb29rdXAuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NTciPjU5NTc8L2E+OgotSW50ZXJuYWwgZXJyb3IgaW4gUmVjb3ZlcmVkTWV0aG9kLmFkZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk3MiI+NTk3MjwvYT46Ci1JbmNyZW1lbnRhbCBidWlsZGVyIChuZXcpIHJlY29tcGlsaW5nIGRlcGVuZGVudHMgb2YgUGFyc2VyIGZvciBubyBhcHBhcmVudAotcmVhc29uCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTQwIj41OTQwPC9hPjoKLUluc3RhbmNlIGluaXRpYWxpemVyIGluIGFub24gaW5uZXIgY2xhc3MgZ2VuZXJhdGVzIGVycm9ycwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTkxMyI+NTkxMzwvYT46Ci1QZXJmb3JtYW5jZSAtIGNyZWF0aW5nIHRvbnMgb2YgY2xhc3NmaWxlIGVsZW1lbnRzIGF0IHN0YXJ0dXAKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4NjIiPjU4NjI8L2E+Ogotc2VhcmNoIDogdG9vIG1hbnkgbWF0Y2hlcyBvbiBzZWFyY2ggd2l0aCBPclBhdHRlcm4KLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNzAiPjYwNzA8L2E+OgotTmV3IEJ1aWxkZXI6IEJ1aWxkZXIgb3JkZXIgcHJvYmxlbQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTg1MiI+NTg1MjwvYT46Ci1Qcm9qZWN0IHJlZmVyZW5jZXMgbm90IHVwZGF0ZWQgYWNjb3JkaW5nIHRvIGJ1aWxkcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46Ci1Db2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTYzIj41NTYzPC9hPjoKLVdyaXRlIHJlZmVyZW5jZSBvbiBkZWNsYXJhdGlvbiBub3QgcmVwb3J0ZWQKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU3Ij4zMjU3PC9hPjogSU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcwotZm9yIENsYXNzRmlsZXMgc2hvdWxkIHVzZSBuYW1lcyBmcm9tIHNvdXJjZSAoMUdER04zRykKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDUiPjMyNDU8L2E+Ogotc3ViIGZvbGRlcnMgd2l0aCBkb3Qgbm90IHZpc2libGUgaW4gcGFja2FnZXMgdmlldyAoMUdDT0gxNykKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMyAtIDEzdGggTm92ZW1iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTFiCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MjEiPjU4MjE8L2E+OiBSZWZhY3RvcgotUmVuYW1lIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgaW5zdGVhZCBvZiBtZW1iZXIgaW4gY2FzZSBvZiBuYW1lIGNsYXNoCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDAzPjUwMDM8L2E+OiAgICAgUmV2aWV3IEphdmFCdWlsZGVyIGNhbmNlbGF0aW9uIGhhbmRsaW5nIDxicj48YSBocmVmPSIgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0iNTc5MCI+NTc5MDwvYT46Ci1JSmF2YVByb2plY3QuaGFzQnVpbGRTdGF0ZSgpIGZhaWxzIHdpdGggbmV3IGJ1aWxkZXIKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3OTQiPjU3OTQ8L2E+OgotUG9seW1vcnBoaWMgc2VhcmNoIGRvZXNuJ3Qgd29yayBpbiBkZXBlbmRlbnQgcHJvamVjdHMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU3ODEiPjU3ODE8L2E+OgotTlBFIHVzaW5nIG5ldyBpbWFnZSBidWlsZGVyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODM0Ij41ODM0PC9hPjoKLUluY3JlbWVudGFsIGJ1aWxkIHJlY29tcGlsZWQgdW5yZWxhdGVkIHByb2plY3QKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjE1Ij41MjE1PC9hPjogc2VhcmNoOgotbWlzc2luZyBmaWVsZCByZWZlcmVuY2UKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMiAtIDEydGggTm92ZW1iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTBfMDEKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPHVsPgotPGxpPgotUHJvamVjdCByZWZlcmVuY2VzIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBKYXZhQ29yZSwgaW4gcGFyYWxsZWwgd2l0aCBidWlsZAotcGF0aC48L2xpPgotCi08bGk+Ci1SZXN1cnJlY3RlZCBkZXByZWNhdGVkIEFQSXMgZnJvbSAwLjkgd2hpY2ggd2VyZSBkaXNjYXJkZWQgcHJldmlvdXNseS48L2xpPgotCi08bGk+Ci1JQ29kZUNvbXBsZXRpb24gcmV2ZXJ0ZWQgdG8gMS4wIHZlcnNpb24sIGFuZCBnb3QgZGVwcmVjYXRlZC4gVXNlIElDb21wbGV0aW9uUmVxdWVzdG9yCi1pbnN0ZWFkLjwvbGk+Ci0KLTxsaT4KLUNyb3NzLXByb2plY3QgaW5jcmVtZW50YWwgcmVjb21waWxhdGlvbiBpbiBwcmVzZW5jZSBvZiBzdHJ1Y3R1cmFsIGNoYW5nZXMKLWluIHByb2R1Y2VkIGJpbmFyaWVzLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzYyIj41MzYyPC9hPjogRGVlcGVyCi10aGFuIG5lY2Vzc2FyeSBKYXZhRWxlbWVudERlbHRhIHdoZW4gcGFja2FnZSBhZGRlZAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNSI+NTUyNTwvYT46Ci1JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgaXNuJ3QgMS4wIGNvbXBhdGlibGUKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2MTYiPjU2MTY8L2E+OgotTlBFIHdoZW4gY29tcGlsaW5nIGludmFsaWQgY29kZSBkZWZpbmluZyBhIGFycmF5IG9mIHN0cmluZ3MKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTciPjUyMTc8L2E+OgotamF2YSBzZWFyY2ggc2NvcGU6IG1pc3NpbmcgZW5jbG9zaW5nIHByb2plY3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MjciPjU1Mjc8L2E+OgotVW5leHBlY3RlZCBpbmFjY3VyYXRlIG1hdGNoZXMgZm9yICNjbG9zZSgpIGRlY2xhcmF0aW9ucwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyMiI+NTUyMjwvYT46Ci1UeXBlIGhpZXJhcmNoeSAtIG1pc3Npbmcgc3VidHlwZXMgb2YgSmF2YUVsZW1lbnQKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MDgiPjU1MDg8L2E+OgotSkRUIGNhbm5vdCBzdXBwb3J0IHBlcmlvZHMgaW4gdGhlIGZvbGRlcnMgYWJvdmUgdGhlIHBhY2thZ2UgbmFtZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MSI+NTU0MTwvYT46Ci1ObyByZWZyZXNoIHdoZW4gYWRkaW5nIGEgY29tcGlsYXRpb24gdW5pdCBpbnNpZGUgYSBkb3QgbmFtZWQgc291cmNlIGZvbGRlcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUzMiI+NTUzMjwvYT46Ci1JbmNyZW1lbnRhbCBjb21waWxlIG1pc3NlZCBhIHJldHVybiB0eXBlIGNoYW5nZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUxNSI+NTUxNTwvYT46Ci1BYm9ydENvbXBpbGF0aW9uIGR1cmluZyBwb2x5bW9ycGhpYyBzZWFyY2gKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNzUiPjUyNzU8L2E+OgotQ3Jvc3MtcHJvamVjdCByZWNvbXBpbGF0aW9uIERlZmVjdCAxODYyNDkgLSBPVEkgUFIjIDFHTEVZVDEKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNjciPjUyNjc8L2E+OgotRGVwZW5kZW50IFByb2plY3RzIG5vdCBjb21waWxlZCB3aGVuIHByb2plY3QgaXMgc2F2ZWQKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MjUiPjU0MjU8L2E+OgotRXhjZXB0aW9uIG9uIENvZGVBc3Npc3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTQiPjMxOTQ8L2E+OgotRENSIC0gSk0gLSBCdWZmZXIgY29udGVudHMgaXMgZHVwbGljYXRlZCAoMUcwM0hDUCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MzAiPjU0MzA8L2E+OgotTXVzdCByZXN1cnJlY3QgMC45IGRlcHJlY2F0ZWQgQVBJcwotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkyMyI+NDkyMzwvYT46Ci1JSmF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMgcmV0dXJucyByb290cyBmcm9tIG90aGVyIHByb2plY3RzCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA4Ij4zMzA4PC9hPjoKLVByb2plY3RzIG5vdCBidWlsZCBpbiBjb3JyZWN0IG9yZGVyIGFmdGVyIGxvYWQgKDFHRjYwVE4pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM1Ij4zNDM1PC9hPjoKLWtlZXBpbmcgdGhlIHByb2plY3QgcmVmZXJlbmNlcyBhbmQgcmVxdWlyZWQgcHJvamVjdCBpbiBzeW5jaCAoMUdMMEwzNCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMDMiPjUyMDM8L2E+OgotUHJvamVjdCBpbmRleGluZyBkb2VzIG5vdCByZXN0cmFpbiB0byBzb3VyY2UgZmlsZXMgb24gdGhlIGNsYXNzcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MyI+MzI5MzwvYT46Ci1zZWFyY2ggZG9lcyBub3Qgd29yayBpbiBpbm5lciBjbGFzcyAoMUdFVVFISikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDkiPjMyNDk8L2E+OgotRXJyb3IgbWVzc2FnZSBpcyBjb25mdXNpbmc6IHVzaW5nIHRva2VuIGluc3RlYWQgb2YgaWRlbnRpZmllciAoMUdDVERZTSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTQiPjUyMTQ8L2E+OgotVFZUOiBBcG9zdHJvcGhlIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIGluIEphdmEgZXJyb3IgbWVzc2FnZXMgaW4gc29tZQotdHJhbnNsYXRpb25zIChpdGFsaWFuKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTI2MyI+NTI2MzwvYT46Ci1UVlQ6IENvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIGFyZSBoYXJkIGZvciB0cmFuc2xhdG9ycyB0byB1bmRlcnN0YW5kCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUxIj4zMjUxPC9hPjoKLVR5cGVzIG5vdCBpbmNsdWRlZCBpbiBjb2RlIGFzc2lzdCBsaXN0IGZvciBpbXBvcnQgKDFHRDA2VzkpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mjc3Ij41Mjc3PC9hPjoKLUNvZGUgYXNzaXN0IG9uIGFzc2VydCBtZXRob2QgZG8gYW4gQWJvcnRFeGNlcHRpb24KLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNzAiPjUwNzA8L2E+Ogotc2VhcmNoOiBtaXNzaW5nIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY5Ij41MDY5PC9hPjoKLXNlYXJjaDogbWV0aG9kIHJlZmVyZW5jZSBpbiBzdXBlciBtaXNzaW5nCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY4Ij41MDY4PC9hPjoKLXNlYXJjaDogbWlzc2luZyBtZXRob2QgcmVmZXJlbmNlCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNiI+NTUyNjwvYT46IE51bGxQb2ludGVyRXhjZXB0aW9uCi1zZWFyY2hpbmcgZGVjbGFyYXRpb25zIG9mICNjbG9zZSgpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDk4Ij41NDk4PC9hPjoKLUphdmEgQ29tcGlsZSAtIGNvZGUgZG9lcyBub3QgY29tcGlsZSBjb3JyZWN0bHkgaW4gSkRULCBidXQgZG9lcyB3aXRoIGphdmFjCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDkzIj41NDkzPC9hPjoKLUFkZGluZyBwcm9qZWN0IHJlZmVyZW5jZXMgZG9lc24ndCB1cGRhdGUgdGhlIGNsYXNzcGF0aAotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQyNiI+NTQyNjwvYT46Ci1Db2RlQXNzaXN0IHJldHVybnMgZW1wdHkgY29tcGxldGlvbgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5MCI+MTY5MDwvYT46Ci1Mb2NhbCB2YXJpYWJsZXMgbm90IGFsd2F5cyBkaXNwbGF5ZWQgd2hlbiBpbiBzY29wZSAoMUdKOFBYNCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQzNjgiPjQzNjg8L2E+OgotV3JvbmcgbWF0Y2ggaW4gSmF2YSBTZWFyY2gKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzgiPjMyMzg8L2E+OgotQ29kZUFzc2lzdCAtIG5vIGNvbXBsZXRpb24gaWYgY3Vyc29yIGF0IHN0cmluZyBiZWdpbm5pbmcgKDFHSTNCWU8pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcxIj4zMjcxPC9hPjoKLVVuYWJsZSB0byBkZWxldGUgYXR0YWNoZWQgaW50ZXJuYWwgc291cmNlIGphciAoMUdEWDIxNSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDkiPjMyMDk8L2E+OgotRENSIC0gSk0gLUludmFsaWQgcmVmZXJlbmNlcyB0byBJUGF0aC5nZXREZXZpY2UoKSBwb3RlbnRpYWxseSBicmVha2luZwotb24gTGludXggKDFHNFUxUjcpCi08YnI+Jm5ic3A7Ci08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEwMjUgLSAyNXRoIE9jdG9iZXIgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDYKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPHVsPgotPGxpPgotSmF2YU1vZGVsIGlzIG5vIGxvbmdlciBwZXJmb3JtaW5nIHNtYXJ0IGNsYXNzcGF0aCB1cGRhdGVzIHdoZW4gSmF2YSBwYWNrYWdlCi1mcmFnbWVudCByb290cyBhcmUgZWl0aGVyIG1vdmVkIG9yIHJlbW92ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NjgiPjM1Njg8L2E+OiBubwotaG92ZXJoZWxwIG92ZXIgY29uc3RydWN0b3IgcmVmZXJyZW5jZXMgKDFHQUowS1ApCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjE4Ij41MjE4PC9hPjoKLUFjY1N1cGVyIGlzIG5vdCBzZXQgcHJvcGVybHkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMDAiPjUyMDA8L2E+OgotU2V0Q2xhc3NwYXRoT3BlcmF0aW9uIG11c3QgY2xvc2Ugcm9vdCBvbmx5IHdoZW4gcm9vdCBpcyByZW1vdmVkCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ5Ij4zNDQ5PC9hPjoKLUNvZGVBc3Npc3QgLSB0d28gdHlwZSB3aXRoIHNhbWUgbmFtZSBtdXN0IGJlIHF1YWxpZmllZCAoMUdMRE4zWikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzMiPjQ5NzM8L2E+OgotUmVuYW1lIHBhY2thZ2UgcmVtb3ZlcyBmaXJzdCBsZXR0ZXIgb2YgaW1wb3J0IHN0YXRlbWVudHMKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzkiPjMyNzk8L2E+OgotU2V2ZXJlIC0gSk0gLSBTb3VyY2UgZm91bmQsIGV2ZW4gdGhvdWdoIHNvdXJjZXBhdGggaXMgZmFsc2UgKDFHRUxBVkIpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM0Ij4zNDM0PC9hPjoKLURlbGV0aW5nIGEgcHJvamVjdCBmcm9tIHRoZSB3cyByZW1vdmVzIGl0IGZyb20gdGhlIGJ1aWxkcGF0aCEgKDFHS1pOQlMpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDIxIj41MDIxPC9hPjoKLVJlZmFjdG9yaW5nIHRyYXNoZWQgbXkgY29kZQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTEzNiI+NTEzNjwvYT46Ci1BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBhIGZpZWxkIGRlY2xhcmF0aW9uIGlzIGFuIGFub255bW91cwotY2xhc3MKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDAiPjM0NDA8L2E+OgotQ2xhc3NmaWxlIGNvbXBhcmF0b3Igc2hvdWxkIGJlIGFibGUgdG8gaWdub3JlIG9yZGVyICgxR0wySTdFKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzOSI+MzQzOTwvYT46Ci1DbGFzc2ZpbGUgY29tcGFyYXRvciBzaG91bGQgYmUgYWJsZSB0byBpZ25vcmUgc3ludGhldGljcyAoMUdMMkkzTikKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDIiPjM0NDI8L2E+OgotTlBFIGluIFNvdXJjZUVsZW1lbnRQYXJzZXIgKDFHTDQ5NkkpCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2OSI+MzM2OTwvYT46IENsYXNzcGF0aAotZ2V0cyBvdXQgb2Ygc3luYyAoMUdKVTg1MykKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODEiPjMyODE8L2E+OgotY2hhbmdlIGphdmEgcHJvamVjdCBiaW5hcnkgb3V0cHV0IGNyZWF0ZSBuZXcgcGFja2FnZSAoMUdFSEswNykKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTgiPjMyOTg8L2E+OgotSW5jb3JyZWN0IGNvbXBpbGUgZXJyb3Igb24gdmFsaWQgY2FzZSBzdGF0ZW1lbnQgKDFHRVlXRVQpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTYyIj4zNTYyPC9hPjoKLU91dGxpbmVyIGJ1ZyBmb3IgaW5pdGlhbGl6ZXJzICgxRzkzQ1MzKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0NyI+MzQ0NzwvYT46Ci1zZWFyY2g6IGNvdWxkIGF1dG9tYXRpY2FsbHkgbmFycm93IGRvd24gc2NvcGUgKDFHTERKVk4pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg4Ij4zMjg4PC9hPjoKLUNvZGVBc3Npc3QgLSBDb2RlIGFzc2lzdCBkb2Vzbid0IHdvcmsgaW4gc29tZSBtZXRob2RzICgxR0VMRUJIKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA3MyI+NTA3MzwvYT46Ci1kZWxldGUgZG9lcyBub3Qgd29yayBvbiBkZWZhdWx0IHBhY2thZ2UKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDMiPjM0NDM8L2E+OgotVW51c2VkIGFyZ3VtZW50L3ZhcmlhYmxlIHdhcm5pbmdzIHNob3duIHR3aWNlICgxR0w0T1c3KQotPGJyPiZuYnNwOwotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KLUphdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMDE4IC0gMTh0aCBPY3RvYmVyIDIwMDEKLTxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjA1Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTx1bD4KLTxsaT4KLUNvZGVBc3Npc3QgcHJvdmlkZXMgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucy48L2xpPgotCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChicmVha2luZykgQVBJIENoYW5nZXMgb24gPHR0PklDb21wbGV0aW9uUmVxdWVzdG9yPC90dD4KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgPGI+KzwvYj4gPHU+QWRkZWQ8L3U+IEFQSSBmb3Igc3VnZ2VzdCB2YXJpYWJsZSBuYW1lOgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8dHQ+dm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSB0eXBlTmFtZSw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIG5hbWUsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBjb21wbGV0aW9uTmFtZSw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOzwvdHQ+Ci08YnI+Jm5ic3A7Ci08bGk+Ci1IZWxwZXIgbWV0aG9kIGZvciBjb21wdXRpbmcgYSByZXNvbHZlZCBhbmQgZXhwYW5kZWQgcGF0aCAoYWxsIGV4cG9ydHMgZnJvbQotcHJlcmVxdWlzaXRlcykgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gMjA0LCBnb3QgPHU+cmVtb3ZlZDwvdT4uIFRoaXMgaXMKLW5vdCBhbiBBUEkgY2hhbmdlLCBpdCBuZXZlciBtYWRlIGl0IG91dCBvZmZpY2lhbGx5LjwvbGk+Ci0KLTxicj4mbmJzcDsmbmJzcDsgPGI+LTwvYj4gPHR0PklKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKTwvdHQ+Ci08cD48dHQ+U2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L3R0PiBoYXMgYmVlbiBkZXByZWNhdGVkLgotVXNlIDx0dD5TZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKTwvdHQ+IGluc3RlYWQuCi1UaGUgcmF0aW9uYWwgaXMgdGhhdCA8dHQ+Y3JlYXRlSmF2YVNlYXJjaFNjb3BlKElSZXNvdXJjZVtdKTwvdHQ+IHdhcyBub3QKLXdlbGwgZGVmaW5lZCBmb3IgcHJvamVjdHMsIGFuZCBpdCBjb3VsZCBub3QgZGVmaW5lIGEgc2VhcmNoIHNjb3BlIGZvciBqYXZhCi1lbGVtZW50cyB0aGF0IGRpZG4ndCBoYXZlIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZSAoZS5nLiBleHRlcm5hbCBqYXJzKS4KLVRoaXMgZGVwcmVjYXRlZCBBUEkncyBiZWhhdmlvciBoYXMgYWxzbyByZXZlcnRlZCB0byB0aGUgMS4wIHN0YXRlIGZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eS4gVGhlIHNwZWNpZmljYXRpb24gb2YgPHR0PmNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSk8L3R0PgotaXMgYXMgZm9sbG93czoKLTx1bD4KLTxsaT4KLUlmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklKYXZhUHJvamVjdDwvdHQ+LCB0aGVuIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlcnMsCi1pdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgaXRzIHJlZmVyZW5jZXMgcHJvamVjdHMgKHdpdGggdGhlaXIKLXNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC48L2xpPgotCi08bGk+Ci1JZiBhbiBlbGVtZW50IGlzIGFuIDx0dD5JUGFja2FnZUZyYWdtZW50Um9vdDwvdHQ+LCB0aGVuIG9ubHkgdGhlIHBhY2thZ2UKLWZyYWdtZW50cyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aWxsIGJlIGluY2x1ZGVkLjwvbGk+Ci0KLTxsaT4KLUlmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklQYWNrYWdlRnJhZ21lbnQ8L3R0PiwgdGhlbiBvbmx5IHRoZSBjb21waWxhdGlvbgotdW5pdCBhbmQgY2xhc3MgZmlsZXMgb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHdpbGwgYmUgaW5jbHVkZWQuIFN1YnBhY2thZ2VzCi13aWxsIE5PVCBiZSBpbmNsdWRlZC48L2xpPgotPC91bD4KLTwvdWw+Ci0KLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNjUiPjUwNjU8L2E+OiBOdWxsUG9pbnRlckV4Y2VwdGlvbgotaW4gQ29kZSBBc3Npc3QKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MjEiPjQ5MjE8L2E+OgotU2VyYWNoIGRvZXMgbm90IGZpbmQgdHlwZXMgaW4gaW50ZXJuYWwgamFyCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTE3Ij40OTE3PC9hPjoKLUxhdGVzdCBidWlsZCBmYWlscyB1cGRhdGluZyBUeXBlSGllcmFyY2h5Ci08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk2Ij4zMjk2PC9hPjoKLUNvZGVBc3Npc3QgLSBzaG91bGQgZmlsdGVyIG91dCBkdXBsaWNhdGVzIGlmIGFueSAoMUdFV0RMNykKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjUiPjMzMjU8L2E+OgotVG9vIG11Y2ggY29kZWFzc2lzdCBtYXRjaCBvbiBpbnRlcmZhY2UgKDFHSDBHVjEpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDI0Ij4zNDI0PC9hPjoKLURDUjogY29kZSBhc3Npc3Qgc3VwcG9ydCBmb3IgdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9ucyAoMUdLTTZPUSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODIiPjMyODI8L2E+OgotSkNLIDEuNCAtIERBU0cgLSBhc3NpZ25lZCB2YXJpYWJsZSBiZWZvcmUgY2F0Y2ggYmxvY2sgYWZ0ZXIgcmV0dXJuIHN0YXRlbWVudAotKDFHSzJBSFgpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDUyIj4zNDUyPC9hPjoKLU5QRSBkb2luZyBEaXNwbGF5IGZyb20gQmluYXJ5ICgxR0xFRzVLKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3NCI+MzM3NDwvYT46Ci1TZWFyY2hQYXR0ZXIuY3JlYXRlUGF0dGVybiguLi4pIGRvZXNuJ3Qgd29yayB3aXRoIHVuaWNvZGVzICgxR0pZQlJZKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwOSI+MzMwOTwvYT46Ci1EQ1IgLSBKTSAtIGNvdWxkIElDb21waWxhdGlvblVuaXQ6OmdldFR5cGUgdGhyb3cgSk1FPyAoMUdGOUFMOSkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTAiPjMzMTA8L2E+OgotU21va2UgMTI0OiBDb21waWxlIGVycm9ycyBpbnRyb2R1Y2VkIHdpdGggcmVuYW1lIHJlZmFjdG9yaW5nICgxR0ZCSzJHKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNiI+MzQzNjwvYT46Ci1OUFcgaW4gVHlwZUhpZXJhcmNoeSAoMUdMMEw4RCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MTkiPjQ5MTk8L2E+OgotQ2Fubm90IGR1cGxpY2F0ZSBsb2NhbCB2YXJpYWJsZSBpbiBmaW5hbGx5IGJsb2NrCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTQzIj40OTQzPC9hPjoKLVZlcmlmaWNhdGlvbiBlcnJvcgotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDM4NSI+NDM4NTwvYT46Ci1RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5zb3VyY2VFbmQgaW5jb3JyZWN0IGlmIHR5cGUgaXMgYW4gQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24KLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzAiPjMyMzA8L2E+OgotU2VhcmNoIC0gVG9vIG1hbnkgdHlwZSByZWZlcmVuY2VzIGZvciBxdWVyeSBlbmRpbmcgd2l0aCAqICgxR0FaVkdJKQotPGgzPgotUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzQiPjMxNzQ8L2E+OiBPcGVuLW9uLXNlbGVjdGlvbgotZG9lc24ndCB3b3JrIG9uIE1vdXNlQWRhcHRlciAoMUdGNjlUSCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzciPjMzMzc8L2E+OgotT3BlbiBvbiBzZWxlY3Rpb24gZmFpbGVkIHdpdGggZG91YmxlIG1lc3NhZ2UgKDFHSUZBODApCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjA3Ij4zMjA3PC9hPjoKLUpNIC0gU21hcnQgc2F2ZSB3aGVuIGVtcHR5IENVICgxRzRFVkhNKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MiI+MTY3MjwvYT46Ci1DYW5ub3QgZXZhbHVhdGUgY2xhc3NlcyBpbiBhIHNlYWxlZCBqYXIgKDFHSFU2WUspCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjIwIj4zMjIwPC9hPjoKLUZvcm1hdHRlciB0ZXN0cyByZWZlciB0byBoYXJkY29kZWQgcGF0aCBvbiBkaXNrICgxRzlSNUc0KQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1OCI+MzI1ODwvYT46Ci1leGNlcHRpb24gZG9pbmcgaW1wb3J0IGFzc2lzdCAoMUdESUo5RCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDAiPjMyNDA8L2E+OgotbmVlZCB0byBmaW5kIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gYW5vbnltb3VzIGlubmVyIHR5cGVzICgxR0NCUFJJKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NCI+MzI1NDwvYT46Ci1JbmRleGVyIC0gU2hvdWxkIG5lc3QgaW5kZXggc291cmNlIHJldHJpZXZhbCBpbiBJV29ya3NwYWNlUnVubmFibGUgKDFHRDdKNkYpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI1Ij4zMjI1PC9hPjoKLUlKYXZhUHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50IHN0cmFuZ2Ugc2VtYW50aWMgKDFHQU9MV1EpCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE4Ij4zMjE4PC9hPjoKLU5vIGludGVyZmFjZSB0byBwb2x5bW9ycGhpY2FsbHkgYWNlc3MgSUNvbXBpbGF0aW9uVW5pdCAoMUc4RDJaUCkKLTxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDUiPjMyMDU8L2E+OgotUHJvYmxlbXMgd2l0aCBJSmF2YU1vZGVsLmZpbmRQYWNrYWdlRnJhZ21lbnQgKDFHNDU2RE8pCi08YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk3Ij4zMTk3PC9hPjoKLURDUiAtIE9wZW5PblNlbGVjdGlvbiAtIENvZGUgcmVzb2x2ZSBkb2Vzbid0IHdvcmsgb24gZGVjbGFyYXRpb25zICgxRzBVWDlWKQotPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NyI+MzE3NzwvYT46Ci02NGtiIG1ldGhvZCBzaG91bGQgYmUgYSBjb25maWd1cmFibGUgcHJvYmxlbSAoMUZKSEdWRikKLTxicj4mbmJzcDsKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTAxMSAtIE9jdG9iZXIgMTF0aCwgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDQKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPHVsPgotPGxpPgotQ2xhc3NwYXRoIGVudHJpZXMgKGV4Y2VwdCBmb3Igc291cmNlIGZvbGRlcnMpIGNhbiBiZSB0YWdnZWQgYXMgZXhwb3J0ZWQKLXVwb24gY3JlYXRpb24uIFdoZW4gZXhwb3J0ZWQsIGFuIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cwotYWxvbmcgd2l0aCBpdHMgb3V0cHV0IGxvY2F0aW9uLjwvbGk+Ci0KLTxsaT4KLUFkZGVkIEFQSXM6PC9saT4KLQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBUZXN0aW5nIHN0YXR1cyBvZiBhIGdpdmVuIGVudHJ5Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgSUNsYXNzcGF0aEVudHJ5LmlzRXhwb3J0ZWQoKTwvdWw+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ3JlYXRpbmcKLWVudHJpZXMgd2l0aCBleHBvcnQgZmxhZwotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoSVBhdGgsIGJvb2xlYW4pCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0rIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKyBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KElQYXRoLCBib29sZWFuKQotPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEhlbHBlcgotbWV0aG9kIGNvbXB1dGluZyBhIHJlc29sdmVkIGFuZCBleHBhbmRlZCBwYXRoIChhbGwgZXhwb3J0cyBmcm9tIHByZXJlcXVpc2l0ZXMpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0rIElKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKQotPHVsPgotPGxpPgotQ29kZUFzc2lzdCBpbnNlcnRzIHF1YWxpZmljYXRpb24gb24gZmllbGQvbWV0aG9kIHJlZmVyZW5jZXMgaW4gY2FzZSBvZgotYW1iaWd1aXRpZXMuPC9saT4KLQotPGxpPgotQ29kZUFzc2lzdCBwcm92aWRlcyBwYXJhbWV0ZXIgbmFtZXMgb24gbWV0aG9kIGNvbXBsZXRpb25zLjwvbGk+Ci0KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQVBJIENoYW5nZXMgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IKLTxicj4mbmJzcDsmbmJzcDsgKyBBZGRlZCBBUEkgZm9yIGFuc3dlcmluZyBtZXRob2QgZGVjbGFyYXRpb24gY29tcGxldGlvbnM6Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHNlbGVjdG9yLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgQWRkZWQgcGFyYW1ldGVyTmFtZXMgdG8gbm9ybWFsIG1ldGhvZCByZXN1bHRzCi1BUEk6Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kKAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBzZWxlY3RvciwKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsKLUFEREVECi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Ci08YnI+Jm5ic3A7Ci08bGk+Ci1Db2RlQXNzaXN0IG9wdGlvbmFsbHkgcGVyZm9ybXMgdmlzaWJpbGl0eSBjaGVja3MgKHNlZSBKYXZhQ29yZSBvcHRpb246Ci0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayIpLjwvbGk+Ci0KLTxsaT4KLVNlYXJjaCBmb3IgZmllbGQgcmVhZCBhbmQgZmllbGQgd3JpdGUgcmVmZXJlbmNlcy4gVHdvIG5ldyBjb25zdGFudHMgaGF2ZQotYmVlbiBhZGRlZDwvbGk+Ci0KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb24gSUphdmFTZWFyY2hDb25zdGFudHMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nCi1hIGZpZWxkIHJlZmVyZW5jZSBzZWFyY2ggcGF0dGVybjoKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBSRUFEX1JFRkVSRU5DRVM6IHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluICpvbmx5KgotcmVhZCBhY2Nlc3MgdG8gYSBmaWVsZC4KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBXUklURV9SRUZFUkVOQ0VTOiB0aGUgc2VhcmNoIHJlc3VsdHMgY29udGFpbiAqb25seSoKLXdyaXRlIGFjY2VzcyB0byBhIGZpZWxkLgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBOb3RlIHRoYXQgaWYgUkVGRVJFTkNFUyBpcyB1c2VkLCB0aGVuIHNlYXJjaCByZXN1bHRzCi1jb250YWluIGJvdGggcmVhZCBhbmQgd3JpdGUKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYWNjZXNzcyB0byBhIGZpZWxkLgotPGxpPgotT3Blbk9uU2VsZWN0aW9uIGNhbiBub3cgbG9jYXRlIHNlbGVjdGVkIGRlY2xhcmF0aW9ucyB3aGljaCBoYXZlIGEgY29ycmVzcG9uZGluZzwvbGk+Ci0KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgSmF2YSBlbGVtZW50IChpLmUuIG5vIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGZvdW5kKSwKLWFuZCBpcyBtb3JlIHRvbGVyYW50IG9mCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGluY29ycmVjdCBjb2RlLjwvdWw+Ci0KLTxoMj4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDI+Ci0mbmJzcDsgMzQzMCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cyAoMUdLWVhLNSkKLTxicj4mbmJzcDsgMzQzMSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBVbnJlYWNoYWJsZSBjb2RlIGluIEpDb3JlCi0oMUdMMlY2SykKLTxicj4mbmJzcDsgMzE3NSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKQ0sxLjNhIC0gSUNMUyAtIENvbXBhcmluZwotY3VycmVudCBpbnN0YW5jZSBhZ2FpbnN0IGVuY2xvc2luZyBpbnN0YW5jZSBpbnNpZGUgb2YgYW5vbnltb3VzIGNsYXNzLgotKDFHTERTQlMpCi08YnI+Jm5ic3A7IDFHTEJPSlo6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBVbmFyeUV4cHJlc3Npb24gZG9lc24ndCBzdG9yZQotZXhwcmVzc2lvbiB0eXBlIGluIGJpdCBtYXNrCi08YnI+Jm5ic3A7IDFHRFM3SVA6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBWZXJpZnlFcnJvciByZWxhdGVkIHRvIGEgbG9jYWwKLWluZGV4IGNvbXB1dGF0aW9uCi08YnI+Jm5ic3A7IDFHTEFCUTc6IElUUEpDT1JFOldJTjIwMDAgLSBKYXZhQ29yZS5jcmVhdGUoU3RyaW5nKSB0aHJvd3MgYW4KLXVuZXhwZWN0ZWQgZXhjZXB0aW9uCi08YnI+Jm5ic3A7IDFHTDBQR1Y6IElUUEpDT1JFOldJTk5UIC0gQmF0Y2ggY29tcGlsZXIgbGVhdmluZyBKQVJzIG9wZW4KLTxicj4mbmJzcDsgNTI2OCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJVFBKQ09SRTpBTEwgLSBWZXJpZnlFcnJvciB3aGVuIHJ1bm5pbmcgYXBwICgxR0w0UUtJKQotPGJyPiZuYnNwOyAxR0xCUDY1OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiB0eXBlIHJlZnMgLSBpbmNvcnJlY3QgbWF0Y2gKLTxicj4mbmJzcDsgMUdLWENPTTogSVRQSkNPUkU6V0lOMjAwMCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBkdXJpbmcgaW5uZXIKLWNsYXNzIGVtdWxhdGlvbgotPGJyPiZuYnNwOyAxR0QwN0dLOiBJVFBKVUk6V0lOOTggLSBDb2RlIGFzc2lzdCBzaG91bGQgcXVhbGlmeSBtZXRob2RzIGlmCi1uZWVkZWQuCi08YnI+Jm5ic3A7IDFHTDFIRjg6IElUUEpDT1JFOldJTjIwMDAgLSBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBjb21waWxlcgotY29tcGlsaW5nIGludmFsaWQgY29kZQotPGJyPiZuYnNwOyAxR0wxM09UOiBJVFBKQ09SRTpBTEwgLSBJTmFtZUxvb2t1cCBzaG91bGQgYmUgcmVtb3ZlZAotPGJyPiZuYnNwOyAxR0wxSTlGOiBJVFBKQ09SRTpXSU4yMDAwIC0gV3Jvbmcgc291cmNlIG1hcHBpbmcgZm9yIGJpbmFyeQotbWV0aG9kcyB3aXRoIHBhcmFtZXRlcnMgd2l0aCBpZGVudGljYWwgc2ltcGxlIG5hbWVzCi08YnI+Jm5ic3A7IDFHNENJUDA6IElUUEpVSTpXSU4gLSBTb3VyY2UgZm9yIGJpbmFyaWVzIGRvZXNuJ3Qgd29yayBmb3IgYW5vbnltb3VzCi1pbm5lciBjbGFzc2VzCi08YnI+Jm5ic3A7IDFHRDc5WE06IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gc2VhcmNoIGZvciBmaWVsZCByZWZlcmVuY2VzCi0tIG5vdCBhbGwgZm91bmQKLTxicj4mbmJzcDsgMUdMQTYwVzogSVRQSkNPUkU6V0lOTlQgLSBDb2RlQXNzaXN0IC0gc2hvdWxkIG5vdCBwcm9wb3NlIGRlY2xhcmF0aW9ucwotb2YgbWV0aG9kIGFscmVhZHkgbG9jYWxseSBpbXBsZW1lbnRlZAotPGJyPiZuYnNwOyAxR0xBRVpCOiBJVFBKQ09SRTpXSU5OVCAtIENvZGVBc3Npc3QgZG9lcyBub3QgZGlzYW1iaWd1YXRlIG1ldGhvZAotcmVmZXJlbmNlcwotPGJyPiZuYnNwOyAxR0w0RjNKOiBJVFBKQ09SRTpXSU5OVCAtIENvbXBsZXRpb24gb24gZGVjbGFyYXRpb24gc2hvdWxkIGFsc28KLXByb3ZpZGUgdGhyb3duIGV4Y2VwdGlvbnMKLTxicj4mbmJzcDsgMUdMMTFKNjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBmaWVsZCByZWZlcmVuY2VzCi0obmVzdGVkIHR5cGVzKQotPGJyPiZuYnNwOyAxR0wxMlhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMKLWluIGlubmVyIGNsYXNzCi08YnI+Jm5ic3A7IDFHTDBYODI6IElUUEpDT1JFOkFMTCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBzZXR0aW5nIGFyZ3Mgb24gY2xhc3MKLWZpbGUKLTxicj4mbmJzcDsgMUdLQVFKUzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogaW5jb3JyZWN0IHJlc3VsdHMgZm9yIG5lc3RlZAotdHlwZXMKLTxicj4mbmJzcDsgMUdLWjhWWjogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBkaWQgbm90IGZpbmQgcmVmZXJlbmNlcyB0bwotbWVtYmVyIGNvbnN0cnVjdG9yCi08YnI+Jm5ic3A7IDFHS1lTN1k6IElUUEpDT1JFOldJTk5UIC0gTWFpbiBub3QgZm91bmQKLTxicj4mbmJzcDsgMUdFTFNEUTogSVRQSlVJOldJTk5UIC0gSkRPTTogSVR5cGUuY3JlYXRlTWV0aG9kIGRvZXMgbm90IGluc2VydAotbmljZWx5IGZvciBpbm5lciB0eXBlcwotPGJyPiZuYnNwOyAxR0Y2N1ZMOiBJVFBKVUk6V0lOOTggLSBEQ1IgLSBDb2RlQ29tcGxldGlvbiAtIENvZGUtYXNzaXN0IGZvcgotbGlzdGVuZXIgbWV0aG9kcwotPGJyPiZuYnNwOyAxR0ZLOFlUOiBJVFBKVUk6QUxMIC0gUmVuYW1lIENVIEEuQi5qYXZhIHRvIEFCLmphdmEgZmFpbHMgKE5QRSkKLTxicj4mbmJzcDsgMUdEMDZKNjogSVRQSlVJOldJTjk4IC0gQ29kZSBhc3Npc3Qgc2hvdWxkIHF1YWxpZnkgZmllbGRzIGlmCi1uZWVkZWQuCi08YnI+Jm5ic3A7IDFGWldHTUc6IElUUENPTTpXSU45OCAtIERDUiAtIENvZGVBc3Npc3QgLSBjb2RlIGFzc2lzdCBzaG91bGQKLXByb3ZpZGUgbWV0aG9kIHNpZ25hdHVyZSBjb21wbGV0aW9ucwotPGJyPiZuYnNwOyAxR0hWT1FFOiBJVFBKQ09SRTpXSU5OVCAtIEFtYmlndW91cyBjb21wbGV0aW9uIGluIENvZGVBc3Npc3QKLTxicj4mbmJzcDsgMUc4REVBQjogSVRQSlVJOldJTk5UIC0gRENSOiBjb2RlIGFzc2lzdCBzdXBlciBtZXRob2RzIHdoZW4KLWRlZmluaW5nIG1ldGhvZAotPGJyPiZuYnNwOyAxR0dOTkRaOiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vbiB2aXNpYmxlIHRhcmdldAotaXMgZXF1aXZhbGVudCB0byBubyB0YXJnZXQKLTxicj4mbmJzcDsgMUdFMTROTjogSVRQSlVJOldJTk5UIC0gVW5hYmxlIHRvIGZpbmQvc2VhcmNoIGZvciAuY2xhc3MgZmlsZXMKLTxicj4mbmJzcDsgMUdKWUZVTzogSVRQRFVJOkFMTCAtIEV2YWx1YXRpb24gaGFuZ3MsIGV2YWx1YXRpb24gdGhyZWFkIGlzCi1zdXNwZW5kZWQKLTxicj4mbmJzcDsgMUZXRzQ1MzogSVRQSkNPUkU6V0lOOTggLSBPcGVuT25TZWxlY3Rpb24gLSBmYWlscyBmb3IgZGVmYXVsdAotY29uc3RydWN0b3JzCi08YnI+Jm5ic3A7IDFHRFFEMzc6IElUUEpVSTpXSU4yMDAwIC0gT3Blbk9uU2VsZWN0aW9uIC0gT3BlbiBvbiBzZWxlY3Rpb24KLWZhaWx1cmUKLTxicj4mbmJzcDsgMUdHWjJSNzogSVRQSlVJOldJTjIwMDAgLSBTZWFyY2ggZm9yIG1ldGhvZCByZWZzIGZhaWxlZAotPGJyPiZuYnNwOyAxR0tOWFg2OiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vIHNlbGVjdGlvbiBpZgotdGFyZ2V0aW5nIG1lbWJlciB0eXBlIGluIGRlZmF1bHQgcGFja2FnZQotPGJyPiZuYnNwOyAxR0UzNEVFOiBJVFBKVUk6V0lOMjAwMCAtIE9wZW5PblNlbGVjdGlvbiAtIGluaXRpYWwgc2VsZWN0aW9uCi13cm9uZwotPGJyPiZuYnNwOyAxR0tFRzczOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoICgxMzYpOiBtaXNzaW5nIGZpZWxkIGRlY2xhcmF0aW9uCi08YnI+Jm5ic3A7IDFHS0I5WUg6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2ggZm9yIGZpZWxkIHJlZnMgLSBpbmNvcnJlY3QKLXJlc3VsdHMKLTxicj4mbmJzcDsgMUdKTDZFSjogSVRQSkNPUkU6V0lOTlQgLSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGg6Ci1Db21wYXJlcyBhZ2FpbnN0IHZhcmlhYmxlIG5hbWUKLTxicj4mbmJzcDsgMUdEUUVBUzogSVRQSlVJOkFMTCAtIEluZGV4ZXIgLSBkZWxldGUgdW51c2VkIGluZGV4ZXMgb24gSmF2YQotY29yZSBwbHVnLWluIHNodXRkb3duCi08YnI+Jm5ic3A7IDFHS000TTk6IElUUEpDT1JFOldJTk5UIC0gRENSOiBjb2RlIHNlbGVjdCBzaG91bGQgd29yayBvbiBkZWNsYXJhdGlvbnMKLTxicj4mbmJzcDsgMUcyTlpWVDogSVRQSlVJOldJTjIwMDAgLSBEQ1IgLSBPcGVuT25TZWxlY3Rpb24gLSBDb2RlIHJlc29sdmUKLWRvZXNuJ3Qgd29yayBmb3IgZGVjbGFyYXRpb25zCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLSZuYnNwOyAzMjIzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNlYXJjaCBmcm9tIGVkaXRvcidzIGNvbnRleHQKLW1lbnUgZG9lc24ndCB3b3JrICgxR0FKQ0Q4KQotPGJyPiZuYnNwOyAzNDMzJm5ic3A7IHNlYXJjaDogbWlzc2luZyBmaWVsZCBvY2N1cnJlY25jZXMgKDFHS1o4SjYpCi08YnI+Jm5ic3A7IDMxNzYmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSkNLMS4zYSAtIFNUTVQgLSBTaW5nbGUgZGVjbGFyYXRpb24KLWluIHRyeSBibG9jayAoMUdMRFNIOSkKLTxicj4mbmJzcDsgMUdMME1OOTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbm90IGNvbnNpc3RlbnQgcmVzdWx0cyBmb3IKLW5lc3RlZCB0eXBlcwotPGJyPiZuYnNwOyAxR0w5VU1IOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHR5cGUgb2NjdXJyZW5jZXMKLTxicj4mbmJzcDsgMUdLWVhLNTogSVRQSlVJOldJTjIwMDAgLSB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cwotPGJyPiZuYnNwOyAxR0VWNzhFOiBJVFBKVUk6V0lOMjAwMCAtIENvZGUgYXNzaXN0OiBwcml2YXRlIHN1cGVyY2xhc3MgbWV0aG9kcwotc2hvdyB1cCwgYnV0IG90aGVycyBkb24ndAotPGJyPiZuYnNwOyAxR0RLS1RTOiBJVFBKVUk6V0lOTlQgLSBDb2RlQ29tcGxldGlvbiAtIGltcG9ydCBhc3Npc3Qgc2hvd3MKLWludmlzaWJsZSB0eXBlcwotPGJyPiZuYnNwOyAxRzczMTdPOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29kZUFzc2lzdCAtIGNvZGUgYXNzaXN0IHNob3dzCi1pbnZpc2libGUgbWVtYmVycwotPGJyPiZuYnNwOyAxR0tLOTMwOiBJVFBKQ09SRTpXSU5OVCAtIE5vIGNvZGUgYXNzaXN0IGZvciBJbm5lciB0eXBlCi08YnI+Jm5ic3A7IDFHSUlER1g6IElUUEpVSTpXSU5OVCAtIG9wZW4gb24gdHlwZTogZG9lcyBub3Qgd29yayBvbiBzb21lCi10eXBlcwotPGJyPiZuYnNwOyAxR0tPRk82OiBJVFBKQ09SRTpXSU5OVCAtIEludGVybmFsIGVycm9yIHNlYXJjaGluZyBmb3IgY2xhc3MKLXJlZmVyZW5jZXMKLTxicj4mbmJzcDsgMUdLOTZBMDogSVRQSkNPUkU6V0lOTlQgLSBOUEUgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb24KLTxicj4mbmJzcDsgMUdLOUI1UTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzcyByZWZlcmVuY2Ugc2VhcmNoIGJyb2tlbgotPGJyPiZuYnNwOyAxR0JPRks1OiBJVFBKVUk6QUxMIC0gIlJlZmVyZW5jZXMgdG8iIG9uIG1ldGhvZHMgaW4gamFycwotPGJyPiZuYnNwOyAxR0tFQ1dDOiBJVFBKQ09SRTpXSU5OVCAtIE9yZ2FuaXplIEltcG9ydHMgZmFpbHM6IFR5cGVyZWZzIG5vdAotY29tcGxldGUKLTxicj4mbmJzcDsgMUdLQ0gzTjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWV0aG9kIHJlZnMgLSBzdXBlciBjYWxsCi1ub3QgZm91bmQKLTxicj4mbmJzcDsgMUdLQjQ3NTogSVRQSkNPUkU6V0lOTlQgLSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uCi1zZWFyY2hmb3IgbWV0aG9kcwotPGJyPiZuYnNwOyAxR0pMNlYwOiBJVFBKQ09SRTpXSU5OVCAtIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aDoKLUlTdGF0dXMgdXNhZ2UKLTxicj4mbmJzcDsgMUdLTTFNVTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc3BhdGggdmFsaWRhdGlvbjogT3ZlcmxhcHBpbmcKLWFjY2VwdGVkCi08YnI+Jm5ic3A7IDFHSkw3UlM6IElUUEpDT1JFOldJTk5UIC0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoOgotbmVzdGVkIHNvdXJjZWZvbGRlcnMKLTxicj4mbmJzcDsgMUdLOU5CMDogSVRQSkNPUkU6V0lOMjAwMCAtIEFub3RoZXIgY29yZSBkdW1wIC0gc29ycnkKLTxicj4mbmJzcDsgMUdKWUczMzogSVRQSlVJOldJTjIwMDAgLSBDb3JlIGR1bXAgaW4gcnVuIHRpbWUgd29ya2JlbmNoIGluCi1TZWFyY2gKLTxicj4mbmJzcDsgMUdLOVM1OTogSVRQSlVJOldJTjIwMDAgLSBJbnRlcm5hbCBlcnJvciB3aGVuIHN5bmNocm9uaXppbmcKLTxicj4mbmJzcDsgMUdMMlRaWTogSVRQSlVJOldJTjIwMDAgLSBDb2RlIENvbXBsZXRpb24gc2hvdWxkIG9ubHkgc2hvdyB2aXNpYmxlCi1pdGVtcwotPGJyPiZuYnNwOyAxR0tSTFo0OiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgb3ZlcnplYWxvdXMgd2l0aCBjb21tYXMKLTxicj4mbmJzcDsgMUdGOThSNDogSVRQSlVJOldJTk5UIC0gSk0gLSB3aHkgaXMgYSBmaWxlIEEuQi5qYXZhIHNlZW4gYXMKLWEgY29tcGlsYXRpb24gdW5pdD8KLTxicj4mbmJzcDsgMUc5OFhSNzogSVRQSkNPUkU6V0lOMjAwMCAtIEZlYXR1cmUgUmVxdWVzdCBmb3IgSmF2YURvYyBDb2RlQXNzaXN0Ci08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgotSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMC4yMDIgLSBTcGV0ZW1iZXIgMjd0aCwgMjAwMQotPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDIKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPHVsPgotPGxpPgotTmV3IEFTVCBub2RlIGZvciBlbXB0eSBzdGF0ZW1lbnRzIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkVtcHR5U3RhdGVtZW50KTwvbGk+Ci0KLTxicj4mbmJzcDsmbmJzcDsgaS5lLiAyIG1vcmUgQVBJcyBvbiB0aGUgQVNUIHZpc2l0b3IuIE5vdGU6IHRoaXMgd2FzIG5vdAotYW4gb2ZmaWNpYWwgQVBJCi08bGk+Ci1JU291cmNlRWxlbWVudFJlcXVlc3RvciBub3RpZmllcyBlbnRlci9leGl0IGluaXRpYWxpemVycyBpbnN0ZWFkIG9mIGp1c3QKLWFjY2VwdEluaXRpYWxpemVyLiBOb3RlOiB0aGlzIHdhcyBub3QgYW4gb2ZmaWNpYWwgQVBJPC9saT4KLQotPGxpPgotU2VhcmNoIGluIGlubmVyLWNsYXNzZXMgbm93IHdvcmtzLiBJbmRleGVzIGFyZSByZWNvbXB1dGVkIGF1dG9tYXRpY2FsbHkKLW9uIHN0YXJ0LXVwLjwvbGk+Ci0KLTxsaT4KLSZuYnNwOyBSZW1vdmVkIENvZGVBc3Npc3Qgb3B0aW9uIGZvciBodW5ncnkgbW9kZSAob3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmVudGlyZVdvcmRSZXBsYWNlbWVudCk8L2xpPgotCi08YnI+Jm5ic3A7Jm5ic3A7IENsaWVudCBjb2RlIGNhbiBkZWNpZGUgd2hldGhlciB1c2luZyBpbmZlcnJlZCBlbmQgcG9zaXRpb24KLShodW5ncnkgYmVoYXZpb3IpIG9yIG9yaWdpbmFsIGN1cnNvciBsb2NhdGlvbiAoaW5zZXJ0IGJlaGF2aW9yKQotPGJyPiZuYnNwOyZuYnNwOyBiYXNlZCBvbiB0aGUga2V5c3Ryb2tlIChlbnRlci9pbnNlcnQ/KS4KLTxsaT4KLSZuYnNwOyBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3Igbm93IGNsZWFybHkKLXN0YXRlcyB0aGF0PC9saT4KLQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgb3JkZXIgb2YgdGhlIHNlYXJjaCByZXN1bHQgaXMgdW5zcGVjaWZpZWQuPC91bD4KLQotPGgyPgotUHJvYmxlbSByZXBvcnRzIGZpeGVkPC9oMj4KLSZuYnNwOyAxR0syQTQ1OiBJVFBKQ09SRTpXSU4yMDAwIC0gSkNLIDEuNCAtIHBvc3NpYmx5IGFzc2lnbmVkIHZhcmlhYmxlCi1hZnRlciBhc3NpZ25tZW50IGV4cHJlc3Npb24gd2hlbiB0cnVlCi08YnI+Jm5ic3A7IDFHSzI5UTg6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gcG9zc2libHkgYXNzaWduZWQgdmFsdWUKLW9mIGEgZmluYWwgaW5zdGFuY2UgdmFyaWFibGUgYWZ0ZXIgYSBjb25zdGFudCBib29sZWFuIGV4cHJlc3Npb24gd2hlbiBmYWxzZQotPGJyPiZuYnNwOyAxRzUyRjdQOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIGZpbmRzIGJvZ3VzIHJlZmVyZW5jZXMgdG8KLWNsYXNzCi08YnI+Jm5ic3A7IDFHNFROWDE6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gTm8gc2VhcmNoIGFub255bW91cyByZXN1bHRzCi1pbiBpbm5lciBjbGFzc2VzCi08YnI+Jm5ic3A7IDFHSFcwQVo6IElUUEpDT1JFOldJTk5UIC0gSkNLIDEuNCAtIHVucmVhY2hhYmxlIGVtcHR5IHN0YXRlbWVudHMKLTxicj4mbmJzcDsgMUdLMkJMTTogSVRQSkNPUkU6V0lOMjAwMCAtIEpDSyAxLjQgLSBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhbHVlCi1hZnRlciB0aGUgYm9vbGVhbiBvcGVyYXRvciA/IDogd2hlbiB0cnVlCi08YnI+Jm5ic3A7IDFHS0IyOEE6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxlciBhY2NlcHRzIGluY29ycmVjdCBjb2RlCi08YnI+Jm5ic3A7IDFGTDRUMVE6IExGQ09NOldJTk5UIC0gSkNLIDEuNCAtIFZlcmlmeUVycm9yIGR1ZSB0byBhbiBpbGxlZ2FsCi1qdW1wCi08YnI+Jm5ic3A7IDFHSzJCNkQ6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gZGVmaW5pdGVseSBhc3NpZ25lZCB2YWx1ZQotYmVmb3JlIHRoZSBzZWNvbmQgb3BlcmFuZCBvZiB0aGUgYm9vbGVhbiBvcGVyYXRvciAmYW1wOyZhbXA7Ci08YnI+Jm5ic3A7IDFHSzJBT0Y6IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gYXNzaWduZWQgdmFyaWFibGUgYmVmb3JlCi1maW5hbGx5IGJsb2NrIGFmdGVyIHJldHVybiBzdGF0ZW1lbnQKLTxicj4mbmJzcDsgMUdLNldEMzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDpubyBmdWxseSBxdWFsaWZpZWQgcmVmZXJlbmNlcwotYXJlIGZvdW5kCi08YnI+Jm5ic3A7IDFHSzcyMzE6IElUUEpDT1JFOldJTjIwMDAgLSB0eXBvcyBpbiBjb21tZW50cwotPGJyPiZuYnNwOyAxR0s3N0hBOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIG1pc3NpbmcgYmFzZSB0eXBlIHJlZmVyZW5jZXMKLTxicj4mbmJzcDsgMUdKWTJYTjogSVRQSlVJOldJTjIwMDAgLSByZW5hbWUgdHlwZTogZXJyb3Igd2hlbiB3aXRoIHJlZmVyZW5jZQotPGJyPiZuYnNwOyAxR0sxSTJKOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnJva2VuIFNvdXJjZUVuZCBpbiBGb3JTdGF0ZW1lbnQKLWFuZCBXaGlsZVN0YXRlbWVudAotPGJyPiZuYnNwOyAxR0sxSFdZOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnJva2VuIHNvdXJjZUVuZCBpbiBmb3IgQXNzaWdubWVudAotYW5kIENvbXBvdW5kQXNzaWdubWVudAotPGJyPiZuYnNwOyAxR0lJQkMzOiBJVFBKQ09SRTpXSU5OVCAtIHNlYXJjaCBmb3IgbWV0aG9kIHJlZmVyZW5jZXMgLSBtaXNzaW5nCi1tYXRjaGVzCi08YnI+Jm5ic3A7IDFHR05PVEY6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIGRvZXNuJ3QgZmluZCBtZXRob2QgcmVmZXJlbmNlZAotaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCi08YnI+Jm5ic3A7IDFHSzFHSkU6IElUUEpDT1JFOkFMTCAtIFNlYXJjaCAtIFN0cmluZ091dEJvdW5kc0V4Y2VwdGlvbiB3aGVuCi1zZWFyY2hpbmcgcmVmZXJlbmNlcyBpbiBKQVIKLTxoMz4KLVByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgotJm5ic3A7MUdKWTNLRzogSVRQSlVJOldJTjIwMDAgLSBOUEUgaW4gamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlSW5mbwotPGJyPiZuYnNwOyAxR0s5MEg0OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHBhY2thZ2UgcmVmZXJlbmNlCi08YnI+Jm5ic3A7IDFHSzhUWEU6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgZmllbGQgcmVmZXJlbmNlCi08YnI+Jm5ic3A7IDFHSzdLMTc6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgdHlwZSByZWZlcmVuY2UKLTxicj4mbmJzcDsgMUdLQ0pJTDogSVRQSkNPUkU6V0lOMjAwMCAtIGJ1aWxkIGV4Y2VwdGlvbiBpbiAxMzUKLTxicj4mbmJzcDsgMUdLNldQOTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYWNoOiBtaXNzaW5nIHR5cGUgcmVmZXJlbmNlCi08YnI+Jm5ic3A7IDFHSlpTQkU6IElUUEpDT1JFOldJTk5UIC0gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGR1cmluZwotcmVidWlsZAotPGJyPiZuYnNwOyAxR0s3RTZTOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBTdHJpbmdJbmRleE91Zk9mQm91bmQKLTxicj4mbmJzcDsgMUdJVDg1NzogSVRQSkNPUkU6V0lOMjAwMCAtIFBlcmZvcm1hbmNlIC0gQ3RybCtTIHRyaWdnZXJzIGZpdmUKLXBhcnNlciBydW5zCi08YnI+Jm5ic3A7IDFHRUhDWUw6IElUUFVJOldJTk5UIC0gTWlub3I6IENvbG9uIGF0IHdyb25nIHBsYWNlIGluIGJ1aWxkCi1kaWFsb2cKLTxicj4mbmJzcDsgMUZMVUJSUjogSlJJREU6V0lOTlQgLSBQcm9ibGVtczogaW5zdGFudGlhdGluZyBpbm5lciBjbGFzc2VzCi08YnI+Jm5ic3A7IDFGTFVPSkk6IEpSSURFOldJTk5UIC0gUHJvYmxlbXM6IHZhZ3VlIGVycm9yIG1lc3NhZ2Ugd2l0aCBpbGxlZ2FsCi1jb25zdHJ1Y3RvciBpbnZvY2F0aW9uCi08YnI+Jm5ic3A7IDFGTFpVRzU6IEpSSURFOldJTk5UIC0gUHJvYmxlbXM6IGludmFsaWQgZXhwcmVzc2lvbiBhcyBzdGF0ZW1lbnQKLWlzIG5vdCByZXBvcnRlZAotPGJyPiZuYnNwOyAxRkxaVjRNOiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiBpbnZhbGlkIGhleGEgbGl0ZXJhbCBudW1iZXIKLW5vdCByZXBvcnRlZAotPGJyPiZuYnNwOyAxRkxaWUVTOiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiB0aGUgaW50ZXJmYWNlIGNhbm5vdCBkZWZpbmUKLWFuIGluaXRpYWxpemVyIGlzIG5vdCByZXBvcnRlZAotPGJyPiZuYnNwOyAxRlFWVEkxOiBMRkNPTTpXSU5OVCAtIENvbXBpbGVyIC0gTm8gaW1wbGljaXQgY29udmVyc2lvbiBzaG91bGQKLW5vdCBnZW5lcmF0ZSBhY29uc3RudWxsCi08YnI+Jm5ic3A7IDFGVVpZWFQ6IElUUEpDT1JFOldJTk5UIC0gSk0gLSBTb3VyY2UgZm9yIEJpbmFyaWVzIGlzc3VlCi08YnI+Jm5ic3A7IDFGWDBMWjA6IElUUENPTTpBTEwgLSBSZXF1ZXN0IGZvciBjb21tZW50cyBwcmVjZWVkaW5nIGltcG9ydHMKLSZhbXA7IHBhY2thZ2UgZGVjbHMKLTxicj4mbmJzcDsgMUZXOEVOUDogSVRQSlVJOldJTjk4IC0gSkRPTSAtIERlbGV0aW5nIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20KLU91dGxpbmUgb2JsaXRlcmF0ZXMgaW50ZXJ2ZW5pbmcgY29tbWVudHMKLTxicj4mbmJzcDsgMUc0UFdDNzogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBObyBtYXRjaGVzIHdpdGggY2xhc3MgZmlsZXMKLTxicj4mbmJzcDsgMUc4M1pLTDogSVRQSlVJOldJTk5UIC0gQ29tcGlsZXIgLSB1bmNsZWFyIGVycm9yIG1lc3NhZ2UgZm9yCi1hIHJlc2VydmVkIHdvcmQgdXNlZCBhcyBhbiBpZGVudGlmaWVyCi08YnI+Jm5ic3A7IDFHRjVXMVM6IElUUEpVSTpXSU4yMDAwIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIGluIExvb2t1cEVudmlyb25tZW50Ci08YnI+Jm5ic3A7IDFHS0YwMVM6IElUUEpDT1JFOldJTk5UIC0gU2V2ZXJlOiBpbnRlcm5hbCBlcnJvciBkdXJpbmcgc2VhcmNoCi08YnI+Jm5ic3A7IDFHRFZGUlg6IElUUEpVSTpXSU4yMDAwIC0gQ29kZUNvbXBsZXRpb24gLSBlYXRzIHRoZSBmb2xsb3dpbmcKLXdvcmQKLTxicj4mbmJzcDsgMUdGNjdKTTogSVRQSlVJOldJTjk4IC0gQ29kZUNvbXBsZXRpb24gLSBDb2RlLWFzc2lzdCBjb25zdW1lcwotbmV4dCB0b2tlbgotPGJyPiZuYnNwOyAxR0NTSEFDOiBJVFBKQ09SRTpJbmNvbnNpc3RlbnQgY29kZWFzc2lzdCBiZWhhdmlvcgotPGJyPiZuYnNwOyAxR0NOQlRMOiBJVFBKQ09SRTpBTEwgLSBEQ1IgLSBKTSAtIFByb3ZpZGUgYSB3YXkgdG8gcmVhZCBKYXZhQ29yZQotZGVmYXVsdCBvcHRpb25zIGZyb20gdGhlIHBsdWdpbi54bWwgZmlsZQotPGJyPiZuYnNwOyAxR0FKQk9VOiBJVFBKVUk6V0lOTlQgLSBDb2RlIEFzc2lzdCBzaG93cyBtYXRjaGVzIGFmdGVyICgpCi08YnI+Jm5ic3A7IDFGVzhOVjY6IElUUEpDT1JFOkFMTCAtIERDUiAtIEpNIC0gTmVlZCBBUEkgZm9yIGNvbXBpbGVyIG9wdGlvbnMKLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+Ci1KYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+Ci1CdWlsZCAwLjIwMCAtIFNlcHRlbWJlciAxM3RoLCAyMDAxCi08YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIwMAotPGgyPgotV2hhdCBpcyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPHVsPgotPGxpPgotSkNLMS4zYSBjb21wbGlhbnQuPC9saT4KLQotPGxpPgotQWRkZWQgMiBuZXcgQVBJcyBvbiBKYXZhQ29udmVudGlvbnMgZm9yIGNsYXNzcGF0aCB2YWxpZGF0aW9uLjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUlKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdCi1jbGFzc3BhdGgsIElQYXRoIG91dHB1dExvY2F0aW9uKTwvbGk+Ci0KLTxsaT4KLUlKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5Ci1lbnRyeSwgYm9vbGVhbiBjaGVja1NvdXJjZUF0dGFjaG1lbnQpPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUFudCBFY2xpcHNlIGNvbXBpbGVyIHRhc2sgYWRkZWQgKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFudC5KZHRjb20pPC9saT4KLQotPGxpPgotQXNzZXJ0aW9ucyBzdXBwb3J0IGVuYWJsZWQ6IGJ5IGRlZmF1bHQgdGhlIGNvbXBpbGVyIGlzIDEuMyBjb21wbGlhbnQsIGJ1dAotaXQgY2FuIG9wdGlvbmFsbHkgYmUgdHVybmVkIGludG8gc291cmNlIDEuNCBtb2RlIGNmLiBKYXZhQ29yZSBvcHRpb25zLjwvbGk+Ci0KLTxsaT4KLU1vcmUgb3B0aW9ucyBhcmUgc3VyZmFjZWQgb24gSmF2YUNvcmUuIFNlZSBKYXZhQ29yZS5nZXREZWZhdWx0T3B0aW9ucygpCi1mb3IgZGVzY3JpcHRpb24uPC9saT4KLQotPHVsPgotPGxpPgotLi4uaW50ZXJuYWwuLi5Db25maWd1cmFibGVPcHRpb24gaGFzIGRpc2FwcGVhcmVkLjwvbGk+Ci0KLTxsaT4KLUV2YWx1YXRpb24gaW4gYmluYXJpZXMgaXMgZnVuY3Rpb25hbDwvbGk+Ci08L3VsPgotCi08bGk+Ci1TZWFyY2ggZm9yIHJlZmVyZW5jZXMgbm93IGZpbmRzIHJlc3VsdHMgaW4gYmluYXJpZXMuIEluZGV4ZXMgaW4gb2xkIHdvcmtzcGFjZXMKLWFyZSByZWNvbXB1dGVkIHdoZW4gcmVzdGFydGVkIHdoaWNoIG1heSByZXN1bHQgaW4gbG9uZ2VyIHN0YXJ0dXAgdGltZXMuPC9saT4KLTwvdWw+Cis8cD48aHI+CitGb3IgZWFybGllciBidWlsZCBub3RlcywgYWxzbyBzZWUgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9SMjBfYnVpbGRub3Rlc19qZHQtY29yZS5odG1sIj5idWlsZCBub3RlcyB1cCB0byBSZWxlYXNlIDIuMDwvYT4uCiAKLTxoMj4KLVByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDI+Ci0xR0VLS1VPOiBJVFBKQ09SRTpBTEwgLSBKTSAtIFV0aWwucmVhZENvbnRlbnRzQXNCeXRlcyhJbnB1dFN0cmVhbSkgZG9lc24ndAotYWxsb3cgZm9yIHNpemUgaGludAotPGJyPjFHQlJQU0o6IElUUEpDT1JFOk9wdGlvbnMgLSBzaG91bGQgc3VyZmFjZSB0aGUgY29kZSBmb3JtYXR0ZXIgb3B0aW9ucwotb24gSmF2YUNvcmUKLTxicj4xR0pVM1lWOiBJVFBKQ09SRTpBTEwgLSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gc2Nhbm5lcgotPGJyPjFHSkwxUjU6IElUUEpDT1JFOkFMTCAtIE5QRSBpbiBDbGFzc0ZpbGUuZ2V0U291cmNlUmFuZ2UKLTxicj4xR0g0OVhSOiBJVFBKVUk6V0lOMjAwMCAtIE9yZ2FuaXplIEltcG9ydHMgaW5zZXJ0cyBib2d1cyBpbXBvcnQKLTxicj4xR0pVM084OiBJVFBKQ09SRTpXSU5OVCAtIHR5cGUgaGllcmFyY2h5OiBOUEUKLTxicj4xR0pJWUtQOiBJVFBKQ09SRTpXSU5OVCAtIHR5cGUgaGllcmFyY2h5IC0gY29udGFpbnMgdW5yZWxhdGVkIHR5cGVzCi08YnI+MUdJVEZRUjogSVZKSURUOldJTjIwMDAgLSBXcm9uZyBieXRlIGNvZGUgZ2VuZXJhdGlvbiwgSW5jb25zaXN0ZW50Ci1zdGFjayBoZWlnaHQgMSAhPSAwIGVycm9yCi08YnI+MUdJSFVRUDogSVRQSkNPUkU6V0lOTlQgLSBzZWFyY2ggZm9yIHN0YXRpYyBmaWVsZCBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZQotPGJyPjFHSVQ2Nlg6IElUUEpDT1JFOldJTk5UIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gY2FsbGluZyBDb2RlQXNzaXN0Ci08YnI+MUdKQTBXRzogSVRQSkNPUkU6V0lOTlQgLSBBYm9ydENvbXBpbGF0aW9uVW5pdCB3aGVuIGRvaW5nIGEgU2VhcmNoCi08YnI+MUdINDlIVzogSVRQSlVJOldJTk5UIC0gU2VhcmNoIGZ1bmN0aW9uYWxpdHkgaXMgbWlzbGVhZGluZyB3aGVuIHZpZXdpbmcKLXNvdXJjZSBmcm9tIGphcgotPGJyPjFHRlhQRTU6IElUUEpVSTpBTEwgLSBTZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIGJyb2tlbgotPGJyPjFHRk0zWDM6IElUUEpVSTpXSU5OVCAtIFdyb25nIGNvZGUgZm9ybWF0dGVyIGRlZmF1bHQgZm9yIGtlZXBpbmcgZWxzZQotb24gc2FtZSBsaW5lCi08YnI+MUdIU003QjogSVRQSlVJOkFMTCAtIGZvcm1hdHRpbmcgb2YgYW5vbnltb3VzIGNsYXNzZXMKLTxicj4xR0dQVkhOOiBJVFBKVUk6V0lOMjAwMCAtIE5vdCBnZXR0aW5nIGhvdmVyIEphdmFkb2MgZm9yIElTZWxlY3Rpb24KLTxicj4xR0UyTE8yOiBJVFBKQ09SRTpXSU4yMDAwIC0gU291cmNlU3RhcnQgYW5kIFNvdXJjZUVuZCBvZiBzeW5jaHJvbml6ZWQKLXN0YXRlbWVudAotPGJyPjFHSVVUSVo6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IGNhc2Ugc3RhdGVtZW50IGRvZXNuJ3QgY292ZXIgY2FzZQota2V5d29yZAotPGJyPjFHSVRDQ1k6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IHN0cmFuZ2UgTG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZAotPGJyPjFHSVJRRlc6IElUUEpDT1JFOldJTjIwMDAgLSBBU1Q6IHdyb25nIHNvdXJjZSBlbmQgaWYgc3Vibm9kZSBpcyBvZgotdHlwZSBBbm5vbnltb3VzVHlwZURlY2xhcmF0aW9uCi08YnI+MUdJUkhSUDogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogd3Jvbmcgc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBpbgotU3luY2hyb25pemVkU3RhdGVtZW50Ci08YnI+MUdIVUFVTzogSVRQSkNPUkU6QUxMIC0gUmVuYW1pbmcgYW4gZWxlbWVudCBpbiBhIHdvcmtpbmcgY29weSBjb3JydXB0cwotdGhlIHdvcmtpbmcgY29weQotPGJyPjFHSFVBTTE6IElUUEpDT1JFOkFMTCAtIE5QRSB3aGVuIHJlbmFtaW5nIGFuIGVsZW1lbnQgaW4gYSB3b3JraW5nIGNvcHkKLTxicj4xR0hEQTJWOiBJVFBKQ09SRTpXSU5OVCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGRvaW5nIGEgc2VhcmNoCi08YnI+MUdGWTAyQjogSVRQSlVJOkFMTCAtIERlbGV0ZSBhIG1ldGhvZCBhbmQgc2F2aW5nIGludHJvZHVjZXMgZXh0cmEgbGluZXMKLTxicj4xR0ZPRk1EOiBJVFBKVUk6V0lOMjAwMCAtIE5ldyBjbGFzcyBzaG91bGQgaGF2ZSBzcGFjZSBiZXR3ZWVuIHBhY2thZ2UKLWFuZCBjbGFzcyBkZWNscwotPGJyPjFHSTNSMUk6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxhdGlvbiBlcnJvciBldmFsdWF0aW5nIHN1cGVyIGV4cHJlc3Npb24KLWluIGRlYnVnZ2VyCi08YnI+MUdJSTA3VjogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnRyYXZlcnNlIGRvZXNuJ3QKLWNhbGwgdmlzaXRvci5lbmRWaXNpdAotPGJyPjFHSVIzNDU6IElUUEpDT1JFOkFMTCAtIEluZGV4ZXI6IE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCi08YnI+MUdJUkMyMzogSVRQSkNPUkU6QUxMIC0gQ29kZUZvcm1hdHRlciBicmFjZSBvbiBuZXcgbGluZSBwcm9ibGVtCi08YnI+MUdJVDhTQTogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogd3Jvbmcgc291cmNlRW5kIGlmIGFjdGlvbiBpcyBCbG9jawotPGJyPjFHSVVRVkw6IElUUEpDT1JFOldJTk5UIC0gSUNsYXNzUGF0aEVudHJ5OiBqYXZhIGRvYyBpbmNvcnJlY3QKLTxicj4xR0lWR01IOiBJVFBKVUk6QUxMIC0gRUM6IEphdmFkb2MgaG92ZXJoZWxwIGluY29ycmVjdGx5IHVzZXMgZmlyc3QKLW9mIG11bHRpcGxlIGNvbW1lbnRzCi08YnI+MUdJWUtTUjogSVRQSkNPUkU6V0lOMjAwMCAtIEFzdDogRmllbGREZWNsYXJhdGlvbi50cmF2ZXJzZSBpbXBsZW1ldGVkCi1kaWZmZXJlbnRseQotPGJyPjFHSTNORDU6IElUUEpDT1JFOldJTk5UIC0gUG90ZW50aWFsIG9wdGltaXphdGlvbiBkdXJpbmcgSUIgcHJvYmxlbQotZ2VuZXJhdGlvbgotPGJyPjFHRkJWWkg6IElUUFVJOldJTjIwMDAgLSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IEphdmEgZWRpdG9yCi08YnI+MUdJNTA5RTogSVRQSkNPUkU6V0lOTlQgLSBJSmF2YVByb2plY3QuZ2V0Tm9uSmF2YVJlc291cmNlcyByZXR1cm5zCi1qYXZhIGFuZCBjbGFzcyBmaWxlcwotPGJyPjFHSTJXQVc6IElUUEpDT1JFOldJTk5UIC0gVG9vIG1hbnkgcmVzdWx0cyBmb3IgZGVmYXVsdCBwYWNrYWdlCi08YnI+MUdIUVo5SDogSVRQSlVJOkFMTCAtIFdhbGtiYWNrIGRvaW5nIGEgc2VhcmNoCi08YnI+MUdHWVQzUzogSVRQSkNPUkU6V0lOTlQgLSBqYXZhY29udmVudGlvbnM6OnZhbGlkYXRlUGFja2FnZU5hbWUgYW5kCi1kZWZhdWx0IHBhY2thZ2UKLTxicj4xR0Y5ODU2OiBJVFBKQ09SRTpXSU5OVCAtIEpNIC0gSmF2YUNvbnZlbnRpb25zOjp2YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUKLTxicj4xR0Y4MjJQOiBJVFBKQ09SRTpXSU4yMDAwIC0gTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24gaW4gUGFyc2VyCi08YnI+MUdJNlQ0WTogSVRQSkNPUkU6V0lOTlQgLSBOUEUgaW4gSmF2YU1vZGVNYW5hZ2VyIHJldHJpZXZpbmcgd29ya3NwYWNlCi1vcHRpb25zCi08YnI+MUdFNElMUjogSVRQSkNPUkU6QUxMIC0gRXZhbCAtIEV2YWx1YXRpb24gaW4gQmluYXJ5IFByb2plY3QgZmFpbHMKLTxicj4xR0kzTExDOiBJVFBKQ09SRTpBTEwgLSBJbmNvcnJlY3QgZm9ybWF0dGluZyBmb3IgdGhlIG5ldyBrZXl3b3JkCi08YnI+MUdIVTZPNTogSVRQSkNPUkU6V0lOTlQgLSBSTUlDIHRlc3QgZmFpbAotPGJyPjFHSEg2Tzc6IElUUEpDT1JFOkFMTCAtIE5lZWQgdG8gdHVuZSB0aGUgZXhjZXB0aW9uIGFuYWx5c2lzIGZvciBBc3NlcnRTdGF0ZW1lbnQKLTxicj4xR0hVVzdUOiBJVFBKQ09SRTpXSU4yMDAwIC0gQnVpbGQgUHJvYmxlbQotPGJyPjFHSTNJRzk6IElUUEpDT1JFOkFMTCAtIGludGVybmFsIGNvbXBpbGVyIGVycm9yIGludm9sdmluZyBib2d1cyBtZXRob2QvZmllbGQKLWRlY2xhcmF0aW9uCi08YnI+MUdIVTRQSzogSVRQSkNPUkU6V0lOTlQgLSBOb1N1Y2hNZXRob2RFcnJvciB3aGVuIHJ1bm5pbmcgcHJvZ3JhbQotPGJyPjFHSE9OQVg6IElUUEpDT1JFOldJTjIwMDAgLSBDb21waWxlciB1c2VzIGRpZmZlcmVudCBuYW1lIGxvb2t1cCBmb3IKLXJlZmFjdG9yaW5nCi08YnI+MUdFSllBSjogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGVyIC0gQmluZGluZyBvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlCi1pcyBudWxsCi08YnI+MUdIRkhXUjogSVRQSkNPUkU6QUxMIC0gQXNzZXJ0aW9uczogQ29kZUFzc2lzdCBhbmQgU2VsZWN0aW9uIG5lZWQgdG8KLWJlIHVwZGF0ZWQKLTxicj4xR0hGSFhHOiBJVFBKQ09SRTpBTEwgLSBBc3NlcnRpb25zOiBBZGQgb3B0aW9uYWwgd2FybmluZyBvbiBhc3NlcnQKLWlkZW50aWZpZXIKLTxicj4xR0NaOVZNOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29tcGlsZXIgLSBCYXRjaCBjb21waWxlciBzaG91bGQKLWJlIEFQSQotPGJyPjFHSE82UVI6IElUUEpDT1JFOldJTk5UIC0gQ29kZSBBc3Npc3QgLSBubyBtZXRob2QgY29tcGxldGlvbiB3aGVuIHJldHVybgotdHlwZSBpcyBzZWNvbmRhcnkgb25lCi08YnI+MUdIMEFVNzogSVRQSkNPUkU6QUxMIC0gRXZhbCAtIFZlcmlmeUVycm9yIGluIHNjcmFwYm9vayBwYWdlCi08YnI+MUdIMlI2MjogSVRQSkNPUkU6V0lOMjAwMCAtIFR5cG8gaW4gcHJvZ3Jlc3MgbWVzc2FnZQotPGJyPjFHR1lMMzI6IElUUEpDT1JFOkFMTCAtIERlZmF1bHQgc3VwZXJ0eXBlcyBhcmUgbm90IHZpc2libGUgd2hlbiBxdWFsaWZpZWQKLTxicj4xR0RGSkswOiBJVkpJRFQ6V0lOMjAwMCAtIFVzaW5nICdzeW5jaHJvbml6ZWQnIHByb2R1Y2VzIGludmFsaWQgZXhjZXB0aW9uCi10YWJsZSB2YWx1ZXMgaW4gY2xhc3MsIGNhdXNlcyAiSWxsZWdhbCBleGNlcHRpb24gdGFibGUgcmFuZ2UiIGV4Y2VwdGlvbiwKLVZBSiAzLjUrCi08YnI+MUdHQUs2RzogSVRQSkNPUkU6QUxMIC0gSW5jb3JyZWN0IGphdmFkb2MgY29tbWVudCBpbiBKYXZhRWxlbWVudAotPGJyPjFHRjlMM0s6IElUUERVSTpBTEwgLSBFdmFsIC0gUHJpdmF0ZSBhcnJheSByZXNvbHV0aW9uIGZhaWx1cmUKLTxicj4xR0Y4S0hYOiBJVFBKVUk6QUxMIC0gSW52YWxpZCBwcm9qZWN0IGJ1aWxkIHBhdGggc2hvdWxkIGJlIHdhcm5pbmcsCi1ub3QgZXJyb3IKLTxicj4xR0Y3SklIOiBJVFBKQ09SRTpBTEwgLSBFeGNlcHRpb24gd2hlbiByZW1vdmluZyBuZXR3b3JrIGRyaXZlCi08YnI+MUdFWUJMOTogSVRQSlVJOldJTk5UIC0gQWRkaW5nIHNvdXJjZSBmb2xkZXJzIG9uIENQIGlzIHZlcnkgY29uZnVzaW5nCi08YnI+MUdFSkFPVDogSVRQSlVJOldJTk5UIC0gSlJFIFNvdXJjZSBhdHRhY2htZW50IHNldCB0byBwYXRoIHRvIGRvZXMgbm90Ci1leGlzdAotPGJyPjFHRUhaTkI6IElUUEpVSTpXSU5OVCAtIHNtb2tlIDExNDogZm9ybWF0dGVyIGluc2VydHMgZXh0cmEgdGFiIGluIGZpcnN0Ci1saW5lCi08YnI+MUdDWlpUNDogSVRQSkNPUkU6RmF1bHQtdG9sZXJhbmNlIC0gbWlzc2luZyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCi1jb3VsZCBzdGlsbCBhbnN3ZXIgdGhlIGFsbG9jYXRlZCB0eXBlCi08YnI+MUdBVTk2UDogSVRQSkNPUkU6V0lOTlQgLSBEQ1IgLSBKTSAtIEphdmFQcm9qZWN0IHNob3VsZCBwcm92aWRlIGEgY2xhc3MKLXBhdGggdmFsaWRhdGlvbiBtZXRob2QKLTxicj4xRzdBMVRMOiBJVFBKQ09SRTpXSU5OVCAtIERDUiAtIEpNIC0gUnVsZXMgZm9yIGNsYXNzcGF0aCBub3Qgc3BlY2lmaWVkCi08YnI+MUZWVldaVDogSVRQSkNPUkU6QUxMIC0gSk0gLSBJQmluYXJ5VHlwZSBzaG91bGQgaW1wbGVtZW50IGdldFNvdXJjZUZpbGVOYW1lKCkKIDxicj4mbmJzcDsKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvQ29tcGxldGlvbkVuZ2luZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKaW5kZXggN2NmMTIxMC4uYTg1YmQ5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9Db21wbGV0aW9uRW5naW5lLmphdmEKQEAgLTEsMzggKzEsNDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdDsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuKjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5Bc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5FbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC5LZXl3b3JkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkJhc2ljQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc291cmNlIGNvbXBsZXRpb25zLgpAQCAtNDEsMTkgKzQ4LDMyIEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wbGV0aW9uRW5naW5lCiAJZXh0ZW5kcyBFbmdpbmUKLQlpbXBsZW1lbnRzIElTZWFyY2hSZXF1ZXN0b3IsIFR5cGVDb25zdGFudHMgLCBJVGVybWluYWxTeW1ib2xzICwgUmVsZXZhbmNlQ29uc3RhbnRzIHsKKwlpbXBsZW1lbnRzIElTZWFyY2hSZXF1ZXN0b3IsIFR5cGVDb25zdGFudHMgLCBUZXJtaW5hbFRva2VucyAsIFJlbGV2YW5jZUNvbnN0YW50cyB7CiAJCiAJcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gRVJST1JfUEFUVEVSTiA9ICIqZXJyb3IqIi50b0NoYXJBcnJheSgpOyAgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBFWENFUFRJT05fUEFUVEVSTiA9ICIqZXhjZXB0aW9uKiIudG9DaGFyQXJyYXkoKTsgIC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0VNSUNPTE9OID0gbmV3IGNoYXJbXSB7ICc7JyB9OwotCVR5cGVCaW5kaW5nW10gZXhwZWN0ZWRUeXBlczsKKwkKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1VQRVJUWVBFID0gMTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1VCVFlQRSA9IDI7CisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJRUxEID0gMDsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTE9DQUwgPSAxOworCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBBUkdVTUVOVCA9IDI7CisJCisJaW50IGV4cGVjdGVkVHlwZXNQdHIgPSAtMTsKKwlUeXBlQmluZGluZ1tdIGV4cGVjdGVkVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbMV07CisJaW50IGV4cGVjdGVkVHlwZXNGaWx0ZXI7CisJaW50IHVuaW50ZXJlc3RpbmdCaW5kaW5nc1B0ciA9IC0xOworCUJpbmRpbmdbXSB1bmludGVyZXN0aW5nQmluZGluZ3MgPSBuZXcgQmluZGluZ1sxXTsKIAkKIAlib29sZWFuIGFzc2lzdE5vZGVJc0NsYXNzOwogCWJvb2xlYW4gYXNzaXN0Tm9kZUlzRXhjZXB0aW9uOwogCWJvb2xlYW4gYXNzaXN0Tm9kZUlzSW50ZXJmYWNlOwogCQorCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKIAlDb21wbGV0aW9uUGFyc2VyIHBhcnNlcjsKIAlJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3I7CiAJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKQEAgLTYxLDYgKzgxLDggQEAKIAljaGFyW10gdG9rZW47CiAJYm9vbGVhbiByZXNvbHZpbmdJbXBvcnRzID0gZmFsc2U7CiAJYm9vbGVhbiBpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSBmYWxzZTsKKwlib29sZWFuIG5vUHJvcG9zYWwgPSB0cnVlOworCUlQcm9ibGVtIHByb2JsZW0gPSBudWxsOwogCWludCBzdGFydFBvc2l0aW9uLCBhY3R1YWxDb21wbGV0aW9uUG9zaXRpb24sIGVuZFBvc2l0aW9uLCBvZmZzZXQ7CiAJSGFzaHRhYmxlT2ZPYmplY3Qga25vd25Qa2dzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKIAlIYXNodGFibGVPZk9iamVjdCBrbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKQEAgLTEzNiw5ICsxNTgsMTEgQEAKIAlwdWJsaWMgQ29tcGxldGlvbkVuZ2luZSgKIAkJSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50LAogCQlJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCU1hcCBzZXR0aW5ncykgeworCQlNYXAgc2V0dGluZ3MsCisJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewogCiAJCXN1cGVyKHNldHRpbmdzKTsKKwkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwogCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKIAkJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuYW1lRW52aXJvbm1lbnQ7CiAKQEAgLTE0NiwxOCArMTcwLDUzIEBACiAJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksCiAJCQkJdGhpcy5jb21waWxlck9wdGlvbnMsCiAJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJlY29yZChJUHJvYmxlbSBwcm9ibGVtLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0LCBSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQpIHsKLQkJCQkJCWlmIChwcm9ibGVtLmlzRXJyb3IoKSAmJiAocHJvYmxlbS5nZXRJRCgpICYgSVByb2JsZW0uU3ludGF4KSAhPSAwKSB7Ci0JCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnJlcXVlc3Rvci5hY2NlcHRFcnJvcihwcm9ibGVtKTsKKwkJCQkJaW50IGxhc3RFcnJvclN0YXJ0OworCQkJCQkKKwkJCQkJcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJCQkJCQljaGFyW10gb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJCQkJCWludCBwcm9ibGVtSWQsCisJCQkJCQlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLAorCQkJCQkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKKwkJCQkJCWludCBzZXZlcml0eSwKKwkJCQkJCWludCBzdGFydFBvc2l0aW9uLAorCQkJCQkJaW50IGVuZFBvc2l0aW9uLAorCQkJCQkJaW50IGxpbmVOdW1iZXIpIHsKKwkJCQkJCQorCQkJCQkJSVByb2JsZW0gcHJvYmxlbSA9IHN1cGVyLmNyZWF0ZVByb2JsZW0oCisJCQkJCQkJb3JpZ2luYXRpbmdGaWxlTmFtZSwKKwkJCQkJCQlwcm9ibGVtSWQsCisJCQkJCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJCQltZXNzYWdlQXJndW1lbnRzLAorCQkJCQkJCXNldmVyaXR5LAorCQkJCQkJCXN0YXJ0UG9zaXRpb24sCisJCQkJCQkJZW5kUG9zaXRpb24sCisJCQkJCQkJbGluZU51bWJlcik7CisJCQkJCQkKKwkJCQkJCWlmKGFjdHVhbENvbXBsZXRpb25Qb3NpdGlvbiA+IHN0YXJ0UG9zaXRpb24KKwkJCQkJCQkmJiBsYXN0RXJyb3JTdGFydCA8IHN0YXJ0UG9zaXRpb24KKwkJCQkJCQkmJiBwcm9ibGVtLmlzRXJyb3IoKQorCQkJCQkJCSYmIChwcm9ibGVtLmdldElEKCkgJiBJUHJvYmxlbS5TeW50YXgpID09IDApIHsKKwkJCQkJCQkJCisJCQkJCQkJQ29tcGxldGlvbkVuZ2luZS50aGlzLnByb2JsZW0gPSBwcm9ibGVtOworCQkJCQkJCWxhc3RFcnJvclN0YXJ0ID0gc3RhcnRQb3NpdGlvbjsKIAkJCQkJCX0KKwkJCQkJCQorCQkJCQkJcmV0dXJuIHByb2JsZW07CiAJCQkJCX0KKwogCQkJCX0pOwogCQl0aGlzLnBhcnNlciA9Ci0JCQluZXcgQ29tcGxldGlvblBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIHRoaXMuY29tcGlsZXJPcHRpb25zLmFzc2VydE1vZGUpOworCQkJbmV3IENvbXBsZXRpb25QYXJzZXIocHJvYmxlbVJlcG9ydGVyLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KTsKIAkJdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9CiAJCQluZXcgTG9va3VwRW52aXJvbm1lbnQodGhpcywgdGhpcy5jb21waWxlck9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgbmFtZUVudmlyb25tZW50KTsKIAkJdGhpcy5uYW1lU2Nhbm5lciA9Ci0JCQluZXcgU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5hc3NlcnRNb2RlKTsKKwkJCW5ldyBTY2FubmVyKAorCQkJCWZhbHNlIC8qY29tbWVudCovLCAKKwkJCQlmYWxzZSAvKndoaXRlc3BhY2UqLywgCisJCQkJZmFsc2UgLypubHMqLywgCisJCQkJdGhpcy5jb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCAvKmFzc2VydCovLCAKKwkJCQludWxsIC8qdGFza1RhZ3MqLywgCisJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CiAJfQogCiAJLyoqCkBAIC0xNzcsNyArMjM2LDkgQEAKIAogCQl0aGlzLmtub3duVHlwZXMucHV0KGNvbXBsZXRpb25OYW1lLCB0aGlzKTsKIAkJCi0JCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCWJvb2xlYW4gaXNRdWFsaWZpZWQgPSB0cnVlOworCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CiAJCWlmIChyZXNvbHZpbmdJbXBvcnRzKSB7CiAJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNvbXBsZXRpb25OYW1lLCBTRU1JQ09MT04pOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIGZ1bGx5UXVhbGlmaWVkTmFtZSk7CkBAIC0xODUsMTggKzI0NiwyMSBAQAogCQkJaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKIAkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7CiAJCQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwKQotCQkJCQkJaWYgKHVuaXRTY29wZSAhPSBudWxsICYmIHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUgIT0gTm9DaGFyQ2hhcikKKwkJCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKQogCQkJCQkJCXJldHVybjsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQKIAkJCQl9IGVsc2UgewogCQkJCQljb21wbGV0aW9uTmFtZSA9IGNsYXNzTmFtZTsKKwkJCQkJaXNRdWFsaWZpZWQgPSBmYWxzZTsKIAkJCQl9CiAJCQl9CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgY2xhc3NOYW1lKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKGNsYXNzTmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oaXNRdWFsaWZpZWQpOwogCQl9CiAKKwkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQlwYWNrYWdlTmFtZSwKIAkJCWNsYXNzTmFtZSwKQEAgLTIyNyw3ICsyOTEsOSBAQAogCiAJCXRoaXMua25vd25UeXBlcy5wdXQoY29tcGxldGlvbk5hbWUsIHRoaXMpOwogCi0JCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCWJvb2xlYW4gaXNRdWFsaWZpZWQgPSB0cnVlOworCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CiAJCWlmIChyZXNvbHZpbmdJbXBvcnRzKSB7CiAJCQljb21wbGV0aW9uTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KGNvbXBsZXRpb25OYW1lLCBuZXcgY2hhcltdIHsgJzsnIH0pOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIGZ1bGx5UXVhbGlmaWVkTmFtZSk7CkBAIC0yMzUsMTcgKzMwMSwyMCBAQAogCQkJaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UpIHsKIAkJCQlpZiAobXVzdFF1YWxpZnlUeXBlKHBhY2thZ2VOYW1lLCBpbnRlcmZhY2VOYW1lKSkgewogCQkJCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkKLQkJCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IE5vQ2hhckNoYXIpCisJCQkJCQlpZiAodW5pdFNjb3BlICE9IG51bGwgJiYgdW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKIAkJCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CiAJCQkJfSBlbHNlIHsKIAkJCQkJY29tcGxldGlvbk5hbWUgPSBpbnRlcmZhY2VOYW1lOworCQkJCQlpc1F1YWxpZmllZCA9IGZhbHNlOwogCQkJCX0KIAkJCX0KIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBpbnRlcmZhY2VOYW1lKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShwYWNrYWdlTmFtZSwgaW50ZXJmYWNlTmFtZSk7CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZmFjZSgpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGlzUXVhbGlmaWVkKTsKIAkJfQogCQkKKwkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAogCQkJcGFja2FnZU5hbWUsCiAJCQlpbnRlcmZhY2VOYW1lLApAQCAtMjY5LDkgKzMzOCwxMSBAQAogCiAJCXRoaXMua25vd25Qa2dzLnB1dChwYWNrYWdlTmFtZSwgdGhpcyk7CiAJCQotCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CiAJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBwYWNrYWdlTmFtZSk7CiAKKwkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZSgKIAkJCXBhY2thZ2VOYW1lLAogCQkJcmVzb2x2aW5nSW1wb3J0cwpAQCAtMjk5LDcgKzM3MCw5IEBACiAKIAkJdGhpcy5rbm93blR5cGVzLnB1dChjb21wbGV0aW9uTmFtZSwgdGhpcyk7CiAKLQkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJYm9vbGVhbiBpc1F1YWxpZmllZCA9IHRydWU7CisJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKIAkJaWYgKHJlc29sdmluZ0ltcG9ydHMpIHsKIAkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoY29tcGxldGlvbk5hbWUsIG5ldyBjaGFyW10geyAnOycgfSk7CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgZnVsbHlRdWFsaWZpZWROYW1lKTsKQEAgLTMwNywxNiArMzgwLDE5IEBACiAJCQlpZiAoIWluc2lkZVF1YWxpZmllZFJlZmVyZW5jZSkgewogCQkJCWlmIChtdXN0UXVhbGlmeVR5cGUocGFja2FnZU5hbWUsIHR5cGVOYW1lKSkgewogCQkJCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkKLQkJCQkJCWlmICh1bml0U2NvcGUgIT0gbnVsbCAmJiB1bml0U2NvcGUuZlBhY2thZ2UuY29tcG91bmROYW1lICE9IE5vQ2hhckNoYXIpCisJCQkJCQlpZiAodW5pdFNjb3BlICE9IG51bGwgJiYgdW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKIAkJCQkJCQlyZXR1cm47IC8vIGlnbm9yZSB0eXBlcyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2UgZnJvbSBvdXRzaWRlIGl0CiAJCQkJfSBlbHNlIHsKIAkJCQkJY29tcGxldGlvbk5hbWUgPSB0eXBlTmFtZTsKKwkJCQkJaXNRdWFsaWZpZWQgPSBmYWxzZTsKIAkJCQl9CiAJCQl9CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgdHlwZU5hbWUpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oaXNRdWFsaWZpZWQpOwogCQl9CiAJCQorCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCXJlcXVlc3Rvci5hY2NlcHRUeXBlKAogCQkJcGFja2FnZU5hbWUsCiAJCQl0eXBlTmFtZSwKQEAgLTMyNiwyMyArNDAyLDI0IEBACiAJCQlyZWxldmFuY2UpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjb21wbGV0ZShBc3ROb2RlIGFzdE5vZGUsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKKwlwcml2YXRlIHZvaWQgY29tcGxldGUoQXN0Tm9kZSBhc3ROb2RlLCBBc3ROb2RlIGFzdE5vZGVQYXJlbnQsIEJpbmRpbmcgcXVhbGlmaWVkQmluZGluZywgU2NvcGUgc2NvcGUpIHsKIAogCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCk7CiAJCQotCQlpZihwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7Ci0JCQljb21wdXRlRXhwZWN0ZWRUeXBlcyhwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCwgc2NvcGUpOworCQljb21wdXRlVW5pbnRlcmVzdGluZ0JpbmRpbmdzKGFzdE5vZGVQYXJlbnQsIHNjb3BlKTsKKwkJaWYoYXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7CisJCQljb21wdXRlRXhwZWN0ZWRUeXBlcyhhc3ROb2RlUGFyZW50LCBzY29wZSk7CiAJCX0KLQotCQkvLyBkZWZhdWx0cy4uLiBzb21lIG5vZGVzIHdpbGwgY2hhbmdlIHRoZXNlCisJCQogCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkZpZWxkVHlwZSkgewogCiAJCQlDb21wbGV0aW9uT25GaWVsZFR5cGUgZmllbGQgPSAoQ29tcGxldGlvbk9uRmllbGRUeXBlKSBhc3ROb2RlOwogCQkJQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSB0eXBlID0gKENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UpIGZpZWxkLnR5cGU7CiAJCQl0b2tlbiA9IHR5cGUudG9rZW47CiAJCQlzZXRTb3VyY2VSYW5nZSh0eXBlLnNvdXJjZVN0YXJ0LCB0eXBlLnNvdXJjZUVuZCk7Ci0JCQkvLwkJZmluZEtleXdvcmRzKHRva2VuLCBtb2RpZmllcnMsIHNjb3BlKTsgLy8gY291bGQgYmUgdGhlIHN0YXJ0IG9mIGEgZmllbGQsIG1ldGhvZCBvciBtZW1iZXIgdHlwZQorCQkJCiAJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOworCQkJZmluZEtleXdvcmRzRm9yTWVtYmVyKHRva2VuLCBmaWVsZC5tb2RpZmllcnMpOwogCQkJCiAJCQlpZighZmllbGQuaXNMb2NhbFZhcmlhYmxlICYmIGZpZWxkLm1vZGlmaWVycyA9PSBDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0KSB7CiAJCQkJZmluZE1ldGhvZHModG9rZW4sbnVsbCxzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksc2NvcGUsbmV3IE9iamVjdFZlY3RvcigpLGZhbHNlLGZhbHNlLHRydWUsbnVsbCxudWxsLGZhbHNlKTsKQEAgLTM1NSwxNSArNDMyLDE2IEBACiAJCQkJdG9rZW4gPSB0eXBlLnRva2VuOwogCQkJCXNldFNvdXJjZVJhbmdlKHR5cGUuc291cmNlU3RhcnQsIHR5cGUuc291cmNlRW5kKTsKIAkJCQlmaW5kVHlwZXNBbmRQYWNrYWdlcyh0b2tlbiwgc2NvcGUpOwotCQkJCQorCQkJCWZpbmRLZXl3b3Jkc0Zvck1lbWJlcih0b2tlbiwgbWV0aG9kLm1vZGlmaWVycyk7CisJCQkKIAkJCQlpZihtZXRob2QubW9kaWZpZXJzID09IENvbXBpbGVyTW9kaWZpZXJzLkFjY0RlZmF1bHQpIHsKIAkJCQkJZmluZE1ldGhvZHModG9rZW4sbnVsbCxzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCksc2NvcGUsbmV3IE9iamVjdFZlY3RvcigpLGZhbHNlLGZhbHNlLHRydWUsbnVsbCxudWxsLGZhbHNlKTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCQogCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgewotCQotCQkJCQl0b2tlbiA9ICgoQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSkgYXN0Tm9kZSkudG9rZW47CisJCQkJCUNvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2Ugc2luZ2xlTmFtZVJlZmVyZW5jZSA9IChDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKSBhc3ROb2RlOworCQkJCQl0b2tlbiA9IHNpbmdsZU5hbWVSZWZlcmVuY2UudG9rZW47CiAJCQkJCWZpbmRWYXJpYWJsZXNBbmRNZXRob2RzKAogCQkJCQkJdG9rZW4sCiAJCQkJCQlzY29wZSwKQEAgLTM3MSw3ICs0NDksMTYgQEAKIAkJCQkJCXNjb3BlKTsKIAkJCQkJLy8gY2FuIGJlIHRoZSBzdGFydCBvZiBhIHF1YWxpZmllZCB0eXBlIG5hbWUKIAkJCQkJZmluZFR5cGVzQW5kUGFja2FnZXModG9rZW4sIHNjb3BlKTsKLQkKKwkJCQkJZmluZEtleXdvcmRzKHRva2VuLCBzaW5nbGVOYW1lUmVmZXJlbmNlLnBvc3NpYmxlS2V5d29yZHMpOworCQkJCQlpZihzaW5nbGVOYW1lUmVmZXJlbmNlLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3Rvcil7CisJCQkJCQlpZihDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgS2V5d29yZHMuVEhJUywgZmFsc2UpKSB7CisJCQkJCQkJUmVmZXJlbmNlQmluZGluZyByZWYgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CisJCQkJCQkJZmluZEV4cGxpY2l0Q29uc3RydWN0b3JzKEtleXdvcmRzLlRISVMsIHJlZiwgKE1ldGhvZFNjb3BlKXNjb3BlLCBzaW5nbGVOYW1lUmVmZXJlbmNlKTsKKwkJCQkJCX0gZWxzZSBpZihDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgS2V5d29yZHMuU1VQRVIsIGZhbHNlKSkgeworCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQkJCQkJCWZpbmRFeHBsaWNpdENvbnN0cnVjdG9ycyhLZXl3b3Jkcy5TVVBFUiwgcmVmLnN1cGVyY2xhc3MoKSwgKE1ldGhvZFNjb3BlKXNjb3BlLCBzaW5nbGVOYW1lUmVmZXJlbmNlKTsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCiAJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZSkgewpAQCAtNDIwLDYgKzUwNywxMiBAQAogCQkJCQkJCQkJZmluZE1lbWJlclR5cGVzKHRva2VuLCByZWNlaXZlclR5cGUsIHNjb3BlLCBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpOwogCQogCQkJCQkJCQkJZmluZENsYXNzRmllbGQodG9rZW4sIChUeXBlQmluZGluZykgcXVhbGlmaWVkQmluZGluZywgc2NvcGUpOworCQkJCQkJCQkJCisJCQkJCQkJCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSA9IG51bGw7CisJCQkJCQkJCQlpZigoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSAmJiAhKChNZXRob2RTY29wZSlzY29wZSkuaXNTdGF0aWMpCisJCQkJCQkJCQkJfHwgKChtZXRob2RTY29wZSA9IHNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCkpICE9IG51bGwgJiYgIW1ldGhvZFNjb3BlLmlzU3RhdGljKSkgeworCQkJCQkJCQkJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgbmV3IGNoYXJbXVtde0tleXdvcmRzLlRISVN9KTsKKwkJCQkJCQkJCX0KIAkKIAkJCQkJCQkJCWZpbmRGaWVsZHMoCiAJCQkJCQkJCQkJdG9rZW4sCkBAIC00OTQsMTMgKzU4NywxNSBAQAogCQkJCQkJCX0gZWxzZSB7CiAJCiAJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzKSB7Ci0JCisJCQkJCQkJCQlpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgPSB0cnVlOwogCQkJCQkJCQkJQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzIGFjY2VzcyA9IChDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3MpIGFzdE5vZGU7CiAJCQkJCQkJCQlsb25nIGNvbXBsZXRpb25Qb3NpdGlvbiA9IGFjY2Vzcy5uYW1lU291cmNlUG9zaXRpb247CiAJCQkJCQkJCQlzZXRTb3VyY2VSYW5nZSgoaW50KSAoY29tcGxldGlvblBvc2l0aW9uID4+PiAzMiksIChpbnQpIGNvbXBsZXRpb25Qb3NpdGlvbik7CiAJCQkJCQogCQkJCQkJCQkJdG9rZW4gPSBhY2Nlc3MudG9rZW47Ci0JCisJCQkJCQkJCQkKKwkJCQkJCQkJCWZpbmRLZXl3b3Jkcyh0b2tlbiwgbmV3IGNoYXJbXVtde0tleXdvcmRzLk5FV30pOworCQkJCQkJCQkJCiAJCQkJCQkJCQlmaW5kRmllbGRzQW5kTWV0aG9kcygKIAkJCQkJCQkJCQl0b2tlbiwKIAkJCQkJCQkJCQkoVHlwZUJpbmRpbmcpIHF1YWxpZmllZEJpbmRpbmcsCkBAIC01MTIsNyArNjA3LDggQEAKIAkJCQkJCQkJfSBlbHNlIHsKIAkKIAkJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQpIHsKLQkKKwkJCQkJCQkJCQlzZXRTb3VyY2VSYW5nZShhc3ROb2RlLnNvdXJjZVN0YXJ0LCBhc3ROb2RlLnNvdXJjZUVuZCwgZmFsc2UpOworCQkJCQkJCQkJCQogCQkJCQkJCQkJCUNvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kKSBhc3ROb2RlOwogCQkJCQkJCQkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPQogCQkJCQkJCQkJCQljb21wdXRlVHlwZXMobWVzc2FnZVNlbmQuYXJndW1lbnRzLCAoQmxvY2tTY29wZSkgc2NvcGUpOwpAQCAtNTM5LDcgKzYzNSw4IEBACiAJCQkJCQkJCQl9IGVsc2UgewogCQogCQkJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKLQkKKwkJCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKKwkJCQkJCQkJCQkJCiAJCQkJCQkJCQkJCUNvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNvbnN0cnVjdG9yQ2FsbCA9CiAJCQkJCQkJCQkJCQkoQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGFzdE5vZGU7CiAJCQkJCQkJCQkJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMgPQpAQCAtNTU0LDcgKzY1MSw4IEBACiAJCQkJCQkJCQkJfSBlbHNlIHsKIAkKIAkJCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbikgewotCQorCQkJCQkJCQkJCQkJc2V0U291cmNlUmFuZ2UoYXN0Tm9kZS5zb3VyY2VTdGFydCwgYXN0Tm9kZS5zb3VyY2VFbmQsIGZhbHNlKTsKKwkJCQkJCQkJCQkJCQogCQkJCQkJCQkJCQkJQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2NFeHByZXNzaW9uID0KIAkJCQkJCQkJCQkJCQkoQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24pIGFzdE5vZGU7CiAJCQkJCQkJCQkJCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0KQEAgLTYwMiw3ICs3MDAsNyBAQAogCQkJCQkJCQkJCQkJCQkKIAkJCQkJCQkJCQkJCQkJdG9rZW4gPSBtZXRob2Quc2VsZWN0b3I7CiAJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJCQlmaW5kVmFyaWFibGVOYW1lcyh0b2tlbiwgbWV0aG9kLnJldHVyblR5cGUsIGV4Y2x1ZGVOYW1lcyk7CisJCQkJCQkJCQkJCQkJCWZpbmRWYXJpYWJsZU5hbWVzKHRva2VuLCBtZXRob2QucmV0dXJuVHlwZSwgZXhjbHVkZU5hbWVzLCBGSUVMRCwgbWV0aG9kLm1vZGlmaWVycyk7CiAJCQkJCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQkJCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25GaWVsZE5hbWUpIHsKIAkJCQkJCQkJCQkJCQkJCUNvbXBsZXRpb25PbkZpZWxkTmFtZSBmaWVsZCA9IChDb21wbGV0aW9uT25GaWVsZE5hbWUpIGFzdE5vZGU7CkBAIC02MTUsNyArNzEzLDcgQEAKIAkJCQkJCQkJCQkJCQkJCQogCQkJCQkJCQkJCQkJCQkJdG9rZW4gPSBmaWVsZC5yZWFsTmFtZTsKIAkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJCQkJZmluZFZhcmlhYmxlTmFtZXMoZmllbGQucmVhbE5hbWUsIGZpZWxkLnR5cGUsIGV4Y2x1ZGVOYW1lcyk7CisJCQkJCQkJCQkJCQkJCQlmaW5kVmFyaWFibGVOYW1lcyhmaWVsZC5yZWFsTmFtZSwgZmllbGQudHlwZSwgZXhjbHVkZU5hbWVzLCBGSUVMRCwgZmllbGQubW9kaWZpZXJzKTsKIAkJCQkJCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQkJCQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTG9jYWxOYW1lIHx8CiAJCQkJCQkJCQkJCQkJCQkJYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSl7CkBAIC02MzMsMTAgKzczMSwxNyBAQAogCQkJCQkJCQkJCQkJCQkJCQogCQkJCQkJCQkJCQkJCQkJCWlmKHZhcmlhYmxlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uTG9jYWxOYW1lKXsKIAkJCQkJCQkJCQkJCQkJCQkJdG9rZW4gPSAoKENvbXBsZXRpb25PbkxvY2FsTmFtZSkgdmFyaWFibGUpLnJlYWxOYW1lOworCQkJCQkJCQkJCQkJCQkJCQlmaW5kVmFyaWFibGVOYW1lcyh0b2tlbiwgdmFyaWFibGUudHlwZSwgZXhjbHVkZU5hbWVzLCBMT0NBTCwgdmFyaWFibGUubW9kaWZpZXJzKTsKIAkJCQkJCQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQkJCQkJCQl0b2tlbiA9ICgoQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKSB2YXJpYWJsZSkucmVhbE5hbWU7CisJCQkJCQkJCQkJCQkJCQkJCUNvbXBsZXRpb25PbkFyZ3VtZW50TmFtZSBhcmcgPSAoQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKSB2YXJpYWJsZTsKKwkJCQkJCQkJCQkJCQkJCQkJdG9rZW4gPSBhcmcucmVhbE5hbWU7CisJCQkJCQkJCQkJCQkJCQkJCWZpbmRWYXJpYWJsZU5hbWVzKHRva2VuLCB2YXJpYWJsZS50eXBlLCBleGNsdWRlTmFtZXMsIGFyZy5pc0NhdGNoQXJndW1lbnQgPyBMT0NBTCA6IEFSR1VNRU5ULCB2YXJpYWJsZS5tb2RpZmllcnMpOwogCQkJCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQlmaW5kVmFyaWFibGVOYW1lcyh0b2tlbiwgdmFyaWFibGUudHlwZSwgZXhjbHVkZU5hbWVzKTsKKwkJCQkJCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJCQkJaWYoYXN0Tm9kZSBpbnN0YW5jZW9mIENvbXBsZXRpb25PbktleXdvcmQpIHsKKwkJCQkJCQkJCQkJCQkJCQkJQ29tcGxldGlvbk9uS2V5d29yZCBrZXl3b3JkID0gKENvbXBsZXRpb25PbktleXdvcmQpYXN0Tm9kZTsKKwkJCQkJCQkJCQkJCQkJCQkJZmluZEtleXdvcmRzKGtleXdvcmQuZ2V0VG9rZW4oKSwga2V5d29yZC5nZXRQb3NzaWJsZUtleXdvcmRzKCkpOworCQkJCQkJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJCQkJCX0KIAkJCQkJCQkJCQkJCQkJfQogCQkJCQkJCQkJCQkJCX0KQEAgLTY1NCw4ICs3NTksNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCBjb21wbGV0ZShJVHlwZSB0eXBlLCBjaGFyW10gc25pcHBldCwgaW50IHBvc2l0aW9uLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlVHlwZU5hbWVzLCBjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMsIGludFtdIGxvY2FsVmFyaWFibGVNb2RpZmllcnMsIGJvb2xlYW4gaXNTdGF0aWMpewkKLQkJVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgVHlwZUNvbnZlcnRlcigpOwotCQkKKwogCQlJVHlwZSB0b3BMZXZlbFR5cGUgPSB0eXBlOwogCQl3aGlsZSh0b3BMZXZlbFR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwpIHsKIAkJCXRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CkBAIC02NjYsNyArNzcwLDcgQEAKIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgY29tcGlsYXRpb25SZXN1bHQsIDApOwogCQogCQl0cnkgewotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGNvbnZlcnRlci5idWlsZFR5cGVEZWNsYXJhdGlvbih0eXBlLCBjb21waWxhdGlvblVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0LCBwcm9ibGVtUmVwb3J0ZXIpOworCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IFR5cGVDb252ZXJ0ZXIuYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZSwgY29tcGlsYXRpb25Vbml0LCBjb21waWxhdGlvblJlc3VsdCk7CiAJCQogCQkJaWYodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsJCiAJCQkJLy8gYnVpbGQgQVNUIGZyb20gc25pcHBldApAQCAtNjk3LDEwICs4MDEsMTMgQEAKIAkJCQkJCS8vCQkJCQljb21wbGV0aW9uTm9kZUZvdW5kID0gdHJ1ZTsKIAkJCQkJCWlmIChlLmFzdE5vZGUgIT0gbnVsbCkgewogCQkJCQkJCS8vIGlmIG51bGwgdGhlbiB3ZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIGNvbXBsZXRpb24gbm9kZQotCQkJCQkJCWNvbXBsZXRlKGUuYXN0Tm9kZSwgZS5xdWFsaWZpZWRCaW5kaW5nLCBlLnNjb3BlKTsKKwkJCQkJCQljb21wbGV0ZShlLmFzdE5vZGUsIHBhcnNlci5hc3Npc3ROb2RlUGFyZW50LCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQorCQkJCWlmKG5vUHJvcG9zYWwgJiYgcHJvYmxlbSAhPSBudWxsKSB7CisJCQkJCXJlcXVlc3Rvci5hY2NlcHRFcnJvcihwcm9ibGVtKTsKKwkJCQl9CiAJCQl9CiAJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCS8vIERvIG5vdGhpbmcKQEAgLTcyNiw3ICs4MzMsNyBAQAogCQljaGFyW10gZmFrZVNvdXJjZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeC50b1N0cmluZygpLnRvQ2hhckFycmF5KCksIHNuaXBwZXQsICJ9fSIudG9DaGFyQXJyYXkoKSk7Ly8kTk9OLU5MUy0xJCAKIAkJb2Zmc2V0ID0gcHJlZml4Lmxlbmd0aCgpOwogCQkKLQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworCQlTdHJpbmcgZW5jb2RpbmcgPSB0aGlzLmNvbXBpbGVyT3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmc7CiAJCUJhc2ljQ29tcGlsYXRpb25Vbml0IGZha2VVbml0ID0gbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAogCQkJZmFrZVNvdXJjZSwgCiAJCQludWxsLApAQCAtNzg0LDYgKzg5MSw5IEBACiAJCQkJLy8gc2NhbiB0aGUgcGFja2FnZSAmIGltcG9ydCBzdGF0ZW1lbnRzIGZpcnN0CiAJCQkJaWYgKHBhcnNlZFVuaXQuY3VycmVudFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlKSB7CiAJCQkJCWZpbmRQYWNrYWdlcygoQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZSkgcGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSk7CisJCQkJCWlmKG5vUHJvcG9zYWwgJiYgcHJvYmxlbSAhPSBudWxsKSB7CisJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0RXJyb3IocHJvYmxlbSk7CisJCQkJCX0KIAkJCQkJcmV0dXJuOwogCQkJCX0KIApAQCAtNzkzLDYgKzkwMywxNyBAQAogCQkJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IGltcG9ydHNbaV07CiAJCQkJCQlpZiAoaW1wb3J0UmVmZXJlbmNlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKSB7CiAJCQkJCQkJZmluZEltcG9ydHMoKENvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZSkgaW1wb3J0UmVmZXJlbmNlKTsKKwkJCQkJCQlpZihub1Byb3Bvc2FsICYmIHByb2JsZW0gIT0gbnVsbCkgeworCQkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0RXJyb3IocHJvYmxlbSk7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybjsKKwkJCQkJCX0gZWxzZSBpZihpbXBvcnRSZWZlcmVuY2UgaW5zdGFuY2VvZiBDb21wbGV0aW9uT25LZXl3b3JkKSB7CisJCQkJCQkJc2V0U291cmNlUmFuZ2UoaW1wb3J0UmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCBpbXBvcnRSZWZlcmVuY2Uuc291cmNlRW5kKTsKKwkJCQkJCQlDb21wbGV0aW9uT25LZXl3b3JkIGtleXdvcmQgPSAoQ29tcGxldGlvbk9uS2V5d29yZClpbXBvcnRSZWZlcmVuY2U7CisJCQkJCQkJZmluZEtleXdvcmRzKGtleXdvcmQuZ2V0VG9rZW4oKSwga2V5d29yZC5nZXRQb3NzaWJsZUtleXdvcmRzKCkpOworCQkJCQkJCWlmKG5vUHJvcG9zYWwgJiYgcHJvYmxlbSAhPSBudWxsKSB7CisJCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRFcnJvcihwcm9ibGVtKTsKKwkJCQkJCQl9CiAJCQkJCQkJcmV0dXJuOwogCQkJCQkJfQogCQkJCQl9CkBAIC04MTksMTQgKzk0MCwyMCBAQAogCQkJCQkJCWlmKERFQlVHKSB7CiAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIkNPTVBMRVRJT04gLSBDb21wbGV0aW9uIG5vZGUgOiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5hc3ROb2RlLnRvU3RyaW5nKCkpOworCQkJCQkJCQlpZihwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7CisJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJDT01QTEVUSU9OIC0gUGFyZW50IE5vZGUgOiAiKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwYXJzZXIuYXNzaXN0Tm9kZVBhcmVudCk7CisJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQkJLy8gaWYgbnVsbCB0aGVuIHdlIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgY29tcGxldGlvbiBub2RlCi0JCQkJCQkJY29tcGxldGUoZS5hc3ROb2RlLCBlLnF1YWxpZmllZEJpbmRpbmcsIGUuc2NvcGUpOworCQkJCQkJCWNvbXBsZXRlKGUuYXN0Tm9kZSwgcGFyc2VyLmFzc2lzdE5vZGVQYXJlbnQsIGUucXVhbGlmaWVkQmluZGluZywgZS5zY29wZSk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0KKwkJCWlmKG5vUHJvcG9zYWwgJiYgcHJvYmxlbSAhPSBudWxsKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEVycm9yKHByb2JsZW0pOworCQkJfQogCQkJLyogSWdub3JlIHBhY2thZ2UsIGltcG9ydCwgY2xhc3MgJiBpbnRlcmZhY2Uga2V5d29yZHMgZm9yIG5vdy4uLgogCQkJCQlpZiAoIWNvbXBsZXRpb25Ob2RlRm91bmQpIHsKIAkJCQkJCWlmIChwYXJzZWRVbml0ID09IG51bGwgfHwgcGFyc2VkVW5pdC50eXBlcyA9PSBudWxsKSB7CkBAIC04NTUsNyArOTgyLDcgQEAKIAkJaW50IGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogCQlUeXBlQmluZGluZ1tdIGFyZ1R5cGVzID0gbmV3IFR5cGVCaW5kaW5nW2FyZ3NMZW5ndGhdOwogCQlmb3IgKGludCBhID0gYXJnc0xlbmd0aDsgLS1hID49IDA7KQotCQkJYXJnVHlwZXNbYV0gPSBhcmd1bWVudHNbYV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkJYXJnVHlwZXNbYV0gPSBhcmd1bWVudHNbYV0ucmVzb2x2ZWRUeXBlOwogCQlyZXR1cm4gYXJnVHlwZXM7CiAJfQogCQpAQCAtODY2LDI0ICs5OTMsMjcgQEAKIAkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKIAogCQlpZiAoY3VycmVudFR5cGUuaXNJbnRlcmZhY2UoKSkgewotCQkJY2hhcltdIGNvbXBsZXRpb24gPSBUeXBlQ29uc3RhbnRzLk5vQ2hhcjsKKwkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCQkJLy8gbm90aGluZyB0byBpbnNlcnQgLSBkbyBub3Qgd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBzZWxlY3RvciAmIGFyZ3VtZW50cwogCQkJaWYgKHNvdXJjZSA9PSBudWxsCiAJCQkJfHwgc291cmNlLmxlbmd0aCA8PSBlbmRQb3NpdGlvbgogCQkJCXx8IHNvdXJjZVtlbmRQb3NpdGlvbl0gIT0gJyknKQogCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsgJyknIH07CisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwogCQkJCisJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQlyZXF1ZXN0b3IuYWNjZXB0QW5vbnltb3VzVHlwZSgKIAkJCQljdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAogCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKLQkJCQlUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXIsCi0JCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyLAotCQkJCVR5cGVDb25zdGFudHMuTm9DaGFyQ2hhciwKKwkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKKwkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUiwKIAkJCQljb21wbGV0aW9uLAogCQkJCUlDb25zdGFudHMuQWNjUHVibGljLAogCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAogCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAotCQkJCVJfREVGQVVMVCk7CisJCQkJcmVsZXZhbmNlKTsKIAkJfSBlbHNlIHsKIAkJCWZpbmRDb25zdHJ1Y3RvcnMoCiAJCQkJY3VycmVudFR5cGUsCkBAIC05MDIsMTYgKzEwMzIsMTggQEAKIAkJaWYgKHRva2VuLmxlbmd0aCA8PSBjbGFzc0ZpZWxkLmxlbmd0aAogCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGNsYXNzRmllbGQsIGZhbHNlIC8qIGlnbm9yZSBjYXNlICovCiAJCSkpIHsKLQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIGNsYXNzRmllbGQpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHNjb3BlLmdldEphdmFMYW5nQ2xhc3MoKSk7Ci0JCQkJCisJCQkKKwkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKLQkJCQlOb0NoYXIsCi0JCQkJTm9DaGFyLAorCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKKwkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCiAJCQkJY2xhc3NGaWVsZCwKLQkJCQlOb0NoYXIsCi0JCQkJTm9DaGFyLAorCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKKwkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCiAJCQkJY2xhc3NGaWVsZCwKIAkJCQlDb21waWxlck1vZGlmaWVycy5BY2NTdGF0aWMgfCBDb21waWxlck1vZGlmaWVycy5BY2NQdWJsaWMsCiAJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKQEAgLTkyMCw2ICsxMDUyLDcwIEBACiAJCX0KIAl9CiAKKwlwcml2YXRlIHZvaWQgZmluZEV4cGxpY2l0Q29uc3RydWN0b3JzKAorCQljaGFyW10gbmFtZSwKKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSwKKwkJTWV0aG9kU2NvcGUgc2NvcGUsCisJCUludm9jYXRpb25TaXRlIGludm9jYXRpb25TaXRlKSB7CisJCQkKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJTWV0aG9kQmluZGluZyBlbmNsb3NpbmdDb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYmluZGluZzsKKworCQkvLyBObyB2aXNpYmlsaXR5IGNoZWNrcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgdGhlIHNjb3BlICYgaW52b2NhdGlvblNpdGUKKwkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5hdmFpbGFibGVNZXRob2RzKCk7CisJCWlmKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJbmV4dCA6IGZvciAoaW50IGYgPSBtZXRob2RzLmxlbmd0aDsgLS1mID49IDA7KSB7CisJCQkJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvciA9IG1ldGhvZHNbZl07CisJCQkJaWYgKGNvbnN0cnVjdG9yICE9IGVuY2xvc2luZ0NvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCQkKKwkJCQkJaWYgKGNvbnN0cnVjdG9yLmlzU3ludGhldGljKCkpIGNvbnRpbnVlIG5leHQ7CisJCQkJCQkKKwkJCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5CisJCQkJCQkmJiAhY29uc3RydWN0b3IuY2FuQmVTZWVuQnkoaW52b2NhdGlvblNpdGUsIHNjb3BlKSkJY29udGludWUgbmV4dDsKKwkKKwkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IucGFyYW1ldGVyczsKKwkJCQkJaW50IHBhcmFtTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CisJCisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW3BhcmFtTGVuZ3RoXVtdOworCQkJCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltwYXJhbUxlbmd0aF1bXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUxlbmd0aDsgaSsrKSB7CisJCQkJCQlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVyc1tpXTsKKwkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpOworCQkJCQl9CisJCQkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yLHBhcmFtZXRlclR5cGVOYW1lcyk7CisJCQkJCQorCQkJCQljaGFyW10gY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJCQkJaWYgKHNvdXJjZSAhPSBudWxsCisJCQkJCQkmJiBzb3VyY2UubGVuZ3RoID4gZW5kUG9zaXRpb24KKwkJCQkJCSYmIHNvdXJjZVtlbmRQb3NpdGlvbl0gPT0gJygnKQorCQkJCQkJY29tcGxldGlvbiA9IG5hbWU7CisJCQkJCWVsc2UKKwkJCQkJCWNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChuYW1lLCBuZXcgY2hhcltdIHsgJygnLCAnKScgfSk7CisJCQkJCQorCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBuYW1lKTsKKwkJCQkJCisJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZCgKKwkJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCisJCQkJCQljdXJyZW50VHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCisJCQkJCQluYW1lLAorCQkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorCQkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzLAorCQkJCQkJcGFyYW1ldGVyTmFtZXMsCisJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCQkJCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVIsCisJCQkJCQljb21wbGV0aW9uLAorCQkJCQkJY29uc3RydWN0b3IubW9kaWZpZXJzLAorCQkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCWVuZFBvc2l0aW9uIC0gb2Zmc2V0LAorCQkJCQkJcmVsZXZhbmNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CiAJcHJpdmF0ZSB2b2lkIGZpbmRDb25zdHJ1Y3RvcnMoCiAJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUsCiAJCVR5cGVCaW5kaW5nW10gYXJnVHlwZXMsCkBAIC05MzgsNyArMTEzNCwxMCBAQAogCQkJCQlpZiAoY29uc3RydWN0b3IuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dDsKIAkJCQkJCQogCQkJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKLQkJCQkJCSYmICFjb25zdHJ1Y3Rvci5jYW5CZVNlZW5CeShpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0OworCQkJCQkJJiYgIWNvbnN0cnVjdG9yLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCBzY29wZSkpIHsKKwkJCQkJCWlmKCFmb3JBbm9ueW1vdXNUeXBlIHx8ICFjb25zdHJ1Y3Rvci5pc1Byb3RlY3RlZCgpKQorCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KIAkKIAkJCQkJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3IucGFyYW1ldGVyczsKIAkJCQkJaW50IHBhcmFtTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGg7CkBAIC05NDYsNyArMTE0NSw3IEBACiAJCQkJCQljb250aW51ZSBuZXh0OwogCQkJCQlmb3IgKGludCBhID0gbWluQXJnTGVuZ3RoOyAtLWEgPj0gMDspCiAJCQkJCQlpZiAoYXJnVHlwZXNbYV0gIT0gbnVsbCkgLy8gY2FuIGJlIG51bGwgaWYgaXQgY291bGQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5Ci0JCQkJCQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoYXJnVHlwZXNbYV0sIGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbYV0pKQorCQkJCQkJCWlmICghYXJnVHlwZXNbYV0uaXNDb21wYXRpYmxlV2l0aChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2FdKSkKIAkJCQkJCQkJY29udGludWUgbmV4dDsKIAkKIAkJCQkJY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzID0gbmV3IGNoYXJbcGFyYW1MZW5ndGhdW107CkBAIC05NTgsNyArMTE1Nyw3IEBACiAJCQkJCX0KIAkJCQkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBmaW5kTWV0aG9kUGFyYW1ldGVyTmFtZXMoY29uc3RydWN0b3IscGFyYW1ldGVyVHlwZU5hbWVzKTsKIAkJCQkJCi0JCQkJCWNoYXJbXSBjb21wbGV0aW9uID0gVHlwZUNvbnN0YW50cy5Ob0NoYXI7CisJCQkJCWNoYXJbXSBjb21wbGV0aW9uID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCQkJCQkvLyBub3RoaW5nIHRvIGluc2VydCAtIGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNlbGVjdG9yICYgYXJndW1lbnRzCiAJCQkJCWlmIChzb3VyY2UgPT0gbnVsbAogCQkJCQkJfHwgc291cmNlLmxlbmd0aCA8PSBlbmRQb3NpdGlvbgpAQCAtOTY2LDYgKzExNjUsMTAgQEAKIAkJCQkJCWNvbXBsZXRpb24gPSBuZXcgY2hhcltdIHsgJyknIH07CiAJCQkJCQogCQkJCQlpZihmb3JBbm9ueW1vdXNUeXBlKXsKKwkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJCQkKKwkJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQkJCXJlcXVlc3Rvci5hY2NlcHRBbm9ueW1vdXNUeXBlKAogCQkJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCiAJCQkJCQkJY3VycmVudFR5cGUucXVhbGlmaWVkU291cmNlTmFtZSgpLApAQCAtOTc2LDggKzExNzksMTIgQEAKIAkJCQkJCQljb25zdHJ1Y3Rvci5tb2RpZmllcnMsCiAJCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCiAJCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCi0JCQkJCQkJUl9ERUZBVUxUKTsKKwkJCQkJCQlyZWxldmFuY2UpOwogCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKKwkJCQkJCQorCQkJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZCgKIAkJCQkJCQljdXJyZW50VHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAogCQkJCQkJCWN1cnJlbnRUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKQEAgLTk4NSwxMyArMTE5MiwxMyBAQAogCQkJCQkJCXBhcmFtZXRlclBhY2thZ2VOYW1lcywKIAkJCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMsCiAJCQkJCQkJcGFyYW1ldGVyTmFtZXMsCi0JCQkJCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXIsCi0JCQkJCQkJVHlwZUNvbnN0YW50cy5Ob0NoYXIsCisJCQkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSLAorCQkJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKIAkJCQkJCQljb21wbGV0aW9uLAogCQkJCQkJCWNvbnN0cnVjdG9yLm1vZGlmaWVycywKIAkJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKIAkJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKLQkJCQkJCQlSX0RFRkFVTFQpOworCQkJCQkJCXJlbGV2YW5jZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0xMDQwLDkgKzEyNDcsMTIgQEAKIAkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGQubmFtZSwgb3RoZXJGaWVsZC5uYW1lLCB0cnVlKSkgewogCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaXNTdXBlcmNsYXNzT2Yob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcykpCiAJCQkJCQljb250aW51ZSBuZXh0OwotCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKQorCQkJCQlpZiAob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MgPT0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OwogCQkJCQkJaWYgKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJGaWVsZC5kZWNsYXJpbmdDbGFzcywgdHJ1ZSkpCiAJCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQkJfQogCQkJCQlpZiAoZmllbGQuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSkKIAkJCQkJCWlmIChvdGhlckZpZWxkLmRlY2xhcmluZ0NsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UoZmllbGQuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQogCQkJCQkJCWNvbnRpbnVlIG5leHQ7CkBAIC0xMDcyLDEwICsxMjgyLDE0IEBACiAJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeCxjb21wbGV0aW9uLCcuJyk7CiAJCQl9CiAKLQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChmaWVsZCk7CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhmaWVsZE5hbWUsIGZpZWxkLm5hbWUpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGZpZWxkLnR5cGUpOworCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JTdGF0aWMob25seVN0YXRpY0ZpZWxkcywgZmllbGQuaXNTdGF0aWMoKSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOwogCisJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQlyZXF1ZXN0b3IKIAkJCQkuYWNjZXB0RmllbGQoCiAJCQkJCWZpZWxkLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCkBAIC0xMjEwLDE2ICsxNDI0LDE4IEBACiAJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIGxlbmd0aEZpZWxkLCBmYWxzZSAvKiBpZ25vcmUgY2FzZSAqLwogCQkJKSkgewogCQkJCQotCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CiAJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sbGVuZ3RoRmllbGQpOwogCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShCYXNlVHlwZXMuSW50QmluZGluZyk7CiAJCQkJCisJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKLQkJCQkJTm9DaGFyLAotCQkJCQlOb0NoYXIsCisJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKKwkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSLAogCQkJCQlsZW5ndGhGaWVsZCwKLQkJCQkJTm9DaGFyLAotCQkJCQlOb0NoYXIsCisJCQkJCUNoYXJPcGVyYXRpb24uTk9fQ0hBUiwKKwkJCQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSLAogCQkJCQlsZW5ndGhGaWVsZCwKIAkJCQkJQ29tcGlsZXJNb2RpZmllcnMuQWNjUHVibGljLAogCQkJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LApAQCAtMTI3OSwyMCArMTQ5NSwxMTMgQEAKIAogCS8vIHdoYXQgYWJvdXQgb25EZW1hbmQgdHlwZXM/IElnbm9yZSB0aGVtIHNpbmNlIGl0IGRvZXMgbm90IGhhcHBlbiEKIAkvLyBpbXBvcnQgcDEucDIuQS4qOwotCXByaXZhdGUgdm9pZCBmaW5kS2V5d29yZHMoY2hhcltdIGtleXdvcmQsIGNoYXJbXVtdIGNob2ljZXMsIFNjb3BlIHNjb3BlKSB7Ci0KKwlwcml2YXRlIHZvaWQgZmluZEtleXdvcmRzKGNoYXJbXSBrZXl3b3JkLCBjaGFyW11bXSBjaG9pY2VzKSB7CisJCWlmKGNob2ljZXMgPT0gbnVsbCB8fCBjaG9pY2VzLmxlbmd0aCA9PSAwKSByZXR1cm47CisJCQogCQlpbnQgbGVuZ3RoID0ga2V5d29yZC5sZW5ndGg7CiAJCWlmIChsZW5ndGggPiAwKQogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQogCQkJCWlmIChsZW5ndGggPD0gY2hvaWNlc1tpXS5sZW5ndGgKIAkJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoa2V5d29yZCwgY2hvaWNlc1tpXSwgZmFsc2UgLyogaWdub3JlIGNhc2UgKi8KIAkJCQkpKXsKLQkJCQkJaW50IHJlbGV2YW5jZSA9IFJfREVGQVVMVDsKKwkJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwogCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhrZXl3b3JkLCBjaG9pY2VzW2ldKTsKIAkJCQkJCisJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQkJcmVxdWVzdG9yLmFjY2VwdEtleXdvcmQoY2hvaWNlc1tpXSwgc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwgZW5kUG9zaXRpb24gLSBvZmZzZXQscmVsZXZhbmNlKTsKIAkJCQl9CiAJfQorCQorCXByaXZhdGUgdm9pZCBmaW5kS2V5d29yZHNGb3JNZW1iZXIoY2hhcltdIHRva2VuLCBpbnQgbW9kaWZpZXJzKSB7CisJCWNoYXJbXVtdIGtleXdvcmRzID0gbmV3IGNoYXJbS2V5d29yZHMuQ09VTlRdW107CisJCWludCBjb3VudCA9IDA7CisJCQkJCisJCS8vIHZpc2liaWxpdHkKKwkJaWYoKG1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY1ByaXZhdGUpID09IDAKKwkJCSYmIChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NQcm90ZWN0ZWQpID09IDAKKwkJCSYmIChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NQdWJsaWMpID09IDApIHsKKwkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFJPVEVDVEVEOworCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5QVUJMSUM7CisJCQlpZigobW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjQWJzdHJhY3QpID09IDApIHsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlBSSVZBVEU7CisJCQl9CisJCX0KKwkJCisJCWlmKChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NBYnN0cmFjdCkgPT0gMCkgeworCQkJLy8gYWJ0cmFjdAorCQkJaWYoKG1vZGlmaWVycyAmIH4oQ29tcGlsZXJNb2RpZmllcnMuQWNjVmlzaWJpbGl0eU1BU0sgfCBDb21waWxlck1vZGlmaWVycy5BY2NTdGF0aWMpKSA9PSAwKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5BQlNUQVJDVDsKKwkJCX0KKwkJCQorCQkJLy8gZmluYWwKKwkJCWlmKChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NGaW5hbCkgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuRklOQUw7CisJCQl9CisJCQkKKwkJCS8vIHN0YXRpYworCQkJaWYoKG1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY1N0YXRpYykgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuU1RBVElDOworCQkJfQorCQkJCisJCQlib29sZWFuIGNhbkJlRmllbGQgPSB0cnVlOworCQkJYm9vbGVhbiBjYW5CZU1ldGhvZCA9IHRydWU7CisJCQlib29sZWFuIGNhbkJlVHlwZSA9IHRydWU7CisJCQlpZigobW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjTmF0aXZlKSAhPSAwCisJCQkJfHwgKG1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY1N0cmljdGZwKSAhPSAwCisJCQkJfHwgKG1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY1N5bmNocm9uaXplZCkgIT0gMCkgeworCQkJCWNhbkJlRmllbGQgPSBmYWxzZTsKKwkJCQljYW5CZVR5cGUgPSBmYWxzZTsKKwkJCX0KKwkJCQorCQkJaWYoKG1vZGlmaWVycyAmIENvbXBpbGVyTW9kaWZpZXJzLkFjY1RyYW5zaWVudCkgIT0gMAorCQkJCXx8IChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NWb2xhdGlsZSkgIT0gMCkgeworCQkJCWNhbkJlTWV0aG9kID0gZmFsc2U7CisJCQkJY2FuQmVUeXBlID0gZmFsc2U7CisJCQl9CisJCQkKKwkJCWlmKGNhbkJlRmllbGQpIHsKKwkJCQkvLyB0cmFuc2llbnQKKwkJCQlpZigobW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjVHJhbnNpZW50KSA9PSAwKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuVFJBTlNJRU5UOworCQkJCX0KKwkJCQkKKwkJCQkvLyB2b2xhdGlsZQorCQkJCWlmKChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NWb2xhdGlsZSkgPT0gMCkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlZPTEFUSUxFOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYoY2FuQmVNZXRob2QpIHsKKwkJCQkvLyBuYXRpdmUKKwkJCQlpZigobW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjTmF0aXZlKSA9PSAwKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuTkFUSVZFOworCQkJCX0KKwkKKwkJCQkvLyBzdHJpY3RmcAorCQkJCWlmKChtb2RpZmllcnMgJiBDb21waWxlck1vZGlmaWVycy5BY2NTdHJpY3RmcCkgPT0gMCkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLlNUUklDVEZQOworCQkJCX0KKwkJCQkKKwkJCQkvLyBzeW5jaHJvbml6ZWQKKwkJCQlpZigobW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjU3luY2hyb25pemVkKSA9PSAwKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuU1lOQ0hST05JWkVEOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYoY2FuQmVUeXBlKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5DTEFTUzsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLklOVEVSRkFDRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGNsYXNzCisJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkNMQVNTOworCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5JTlRFUkZBQ0U7CisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShrZXl3b3JkcywgMCwga2V5d29yZHMgPSBuZXcgY2hhcltjb3VudF1bXSwgMCwgY291bnQpOworCQkKKwkJZmluZEtleXdvcmRzKHRva2VuLCBrZXl3b3Jkcyk7CisJfQogCiAJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1lbWJlclR5cGVzKGNoYXJbXSwgUmVmZXJlbmNlQmluZGluZywgU2NvcGUpCiAJcHJpdmF0ZSB2b2lkIGZpbmRNZW1iZXJUeXBlcygKQEAgLTEzNDYsMTIgKzE2NTUsMTYgQEAKIAogCQkJdHlwZXNGb3VuZC5hZGQobWVtYmVyVHlwZSk7CiAKLQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodHlwZU5hbWUsIG1lbWJlclR5cGUuc291cmNlTmFtZSk7CiAJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobWVtYmVyVHlwZSk7CiAKIAkJCWlmIChtZW1iZXJUeXBlLmlzQ2xhc3MoKSkgewogCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4Y2VwdGlvbihtZW1iZXJUeXBlLnNvdXJjZU5hbWUpOworCQkJCQorCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJbWVtYmVyVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCkBAIC0xMzYzLDYgKzE2NzYsOCBAQAogCiAJCQl9IGVsc2UgewogCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJCisJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCiAJCQkJCW1lbWJlclR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJbWVtYmVyVHlwZS5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCkBAIC0xNjQxLDcgKzE5NTYsOCBAQAogCiAJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dDsKIAotCQkJLy8JCWlmIChub1ZvaWRSZXR1cm5UeXBlICYmIG1ldGhvZC5yZXR1cm5UeXBlID09IEJhc2VUeXBlcy5Wb2lkQmluZGluZykgY29udGludWUgbmV4dDsKKwkJCWlmIChleHBlY3RlZFR5cGVzUHRyID4gLTEgJiYgbWV0aG9kLnJldHVyblR5cGUgPT0gQmFzZVR5cGVzLlZvaWRCaW5kaW5nKSBjb250aW51ZSBuZXh0OworCQkJCiAJCQlpZiAob25seVN0YXRpY01ldGhvZHMgJiYgIW1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZSBuZXh0OwogCiAJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHkKQEAgLTE2NjcsNyArMTk4Myw3IEBACiAKIAkJCWZvciAoaW50IGEgPSBtaW5BcmdMZW5ndGg7IC0tYSA+PSAwOyl7CiAJCQkJaWYgKGFyZ1R5cGVzW2FdICE9IG51bGwpeyAvLyBjYW4gYmUgbnVsbCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgcHJvcGVybHkKLQkJCQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoYXJnVHlwZXNbYV0sIG1ldGhvZC5wYXJhbWV0ZXJzW2FdKSkgeworCQkJCQlpZiAoIWFyZ1R5cGVzW2FdLmlzQ29tcGF0aWJsZVdpdGgobWV0aG9kLnBhcmFtZXRlcnNbYV0pKSB7CiAJCQkJCQljb250aW51ZSBuZXh0OwogCQkJCQl9CiAJCQkJfQpAQCAtMTY4OCwxMSArMjAwNCwxNSBAQAogCQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzU3VwZXJjbGFzc09mKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzKSkKIAkJCQkJCWNvbnRpbnVlIG5leHQ7CiAKLQkJCQkJaWYgKG90aGVyTWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCisJCQkJCWlmIChvdGhlck1ldGhvZC5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQlpZihtZXRob2QuZGVjbGFyaW5nQ2xhc3MgPT0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSkKKwkJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQkJCiAJCQkJCQlpZiAobWV0aG9kCiAJCQkJCQkJLmRlY2xhcmluZ0NsYXNzCiAJCQkJCQkJLmltcGxlbWVudHNJbnRlcmZhY2Uob3RoZXJNZXRob2QuZGVjbGFyaW5nQ2xhc3MsIHRydWUpKQogCQkJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJCX0KIAogCQkJCQlpZiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkpCiAJCQkJCQlpZihvdGhlck1ldGhvZApAQCAtMTcxNSw3ICsyMDM1LDcgQEAKIAkJCX0KIAkJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzID0gZmluZE1ldGhvZFBhcmFtZXRlck5hbWVzKG1ldGhvZCxwYXJhbWV0ZXJUeXBlTmFtZXMpOwogCi0JCQljaGFyW10gY29tcGxldGlvbiA9IFR5cGVDb25zdGFudHMuTm9DaGFyOworCQkJY2hhcltdIGNvbXBsZXRpb24gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQkKIAkJCWludCBwcmV2aW91c1N0YXJ0UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOwogCQkJCkBAIC0xNzQwLDEwICsyMDYwLDE0IEBACiAJCQkJY29tcGxldGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0KHByZWZpeCxjb21wbGV0aW9uLCcuJyk7CiAJCQl9CiAKLQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOwogCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcobWV0aG9kTmFtZSwgbWV0aG9kLnNlbGVjdG9yKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShtZXRob2QucmV0dXJuVHlwZSk7Ci0KKwkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKG9ubHlTdGF0aWNNZXRob2RzLCBtZXRob2QuaXNTdGF0aWMoKSk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24ocHJlZml4UmVxdWlyZWQpOworCQkJCisJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQlyZXF1ZXN0b3IuYWNjZXB0TWV0aG9kKAogCQkJCW1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAogCQkJCW1ldGhvZC5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCkBAIC0xNzYyLDExICsyMDg2LDE1IEBACiAJCX0KIAl9CiAJCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyhjaGFyW10gdG9rZW4sIGNoYXJbXSBwcm9wb3NhbE5hbWUpeworCWludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKGNoYXJbXSB0b2tlbiwgY2hhcltdIHByb3Bvc2FsTmFtZSl7CiAJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyh0b2tlbiwgcHJvcG9zYWxOYW1lLCB0cnVlIC8qIGRvIG5vdCBpZ25vcmUgY2FzZSAqLykpIHsKLQkJCXJldHVybiAgUl9DQVNFOworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHModG9rZW4sIHByb3Bvc2FsTmFtZSwgdHJ1ZSAvKiBkbyBub3QgaWdub3JlIGNhc2UgKi8pKSB7CisJCQkJcmV0dXJuIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIFJfQ0FTRTsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCXJldHVybiBSX0RFRkFVTFQ7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKXsKQEAgLTE3NzksNyArMjEwNywxOSBAQAogCQlpZihhc3Npc3ROb2RlSXNJbnRlcmZhY2UpIHsKIAkJCXJldHVybiBSX0lOVEVSRkFDRTsKIAkJfQotCQlyZXR1cm4gUl9ERUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJcHJpdmF0ZSBpbnQgY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oYm9vbGVhbiBwcmVmaXhSZXF1aXJlZCkgeworCQlpZighcHJlZml4UmVxdWlyZWQpIHsKKwkJCXJldHVybiBSX1VOUVVBTElGSUVEOworCQl9CisJCXJldHVybiAwOworCX0KKwlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yU3RhdGljKGJvb2xlYW4gb25seVN0YXRpYywgYm9vbGVhbiBpc1N0YXRpYykgeworCQlpZihpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgJiYgIW9ubHlTdGF0aWMgJiYgIWlzU3RhdGljKSB7CisJCQlyZXR1cm4gUl9OT05fU1RBVElDOworCQl9CisJCXJldHVybiAwOwogCX0KIAlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKGNoYXJbXSBwcm9wb3NhbE5hbWUpewogCQkKQEAgLTE3ODgsMzAgKzIxMjgsNTggQEAKIAkJCUNoYXJPcGVyYXRpb24ubWF0Y2goRVJST1JfUEFUVEVSTiwgcHJvcG9zYWxOYW1lLCBmYWxzZSkpKSB7IAogCQkJcmV0dXJuIFJfRVhDRVBUSU9OOwogCQl9Ci0JCXJldHVybiBSX0RFRkFVTFQ7CisJCXJldHVybiAwOwogCX0KIAlwcml2YXRlIGludCBjb21wdXRlUmVsZXZhbmNlRm9yRXhwZWN0aW5nVHlwZShUeXBlQmluZGluZyBwcm9wb3NhbFR5cGUpewogCQlpZihleHBlY3RlZFR5cGVzICE9IG51bGwgJiYgcHJvcG9zYWxUeXBlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmKFNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShwcm9wb3NhbFR5cGUsIGV4cGVjdGVkVHlwZXNbaV0pKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBleHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhleHBlY3RlZFR5cGVzW2ldLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksIHByb3Bvc2FsVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpKSAmJgorCQkJCQlDaGFyT3BlcmF0aW9uLmVxdWFscyhleHBlY3RlZFR5cGVzW2ldLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwgcHJvcG9zYWxUeXBlLnF1YWxpZmllZFNvdXJjZU5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIFJfRVhBQ1RfRVhQRUNURURfVFlQRTsKKwkJCQl9CisJCQkJaWYoKGV4cGVjdGVkVHlwZXNGaWx0ZXIgJiBTVUJUWVBFKSAhPSAwCisJCQkJCSYmIHByb3Bvc2FsVHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cGVjdGVkVHlwZXNbaV0pKSB7CisJCQkJCQlyZXR1cm4gUl9FWFBFQ1RFRF9UWVBFOworCQkJCX0KKwkJCQlpZigoZXhwZWN0ZWRUeXBlc0ZpbHRlciAmIFNVUEVSVFlQRSkgIT0gMAorCQkJCQkmJiBleHBlY3RlZFR5cGVzW2ldLmlzQ29tcGF0aWJsZVdpdGgocHJvcG9zYWxUeXBlKSkgewogCQkJCQlyZXR1cm4gUl9FWFBFQ1RFRF9UWVBFOwogCQkJCX0KIAkJCX0KIAkJfSAKLQkJcmV0dXJuIFJfREVGQVVMVDsKKwkJcmV0dXJuIDA7CiAJfQogCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lKXsKIAkJaWYoZXhwZWN0ZWRUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGV4cGVjdGVkVHlwZXNQdHI7IGkrKykgewogCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKGV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwgcGFja2FnZU5hbWUpICYmCiAJCQkJCUNoYXJPcGVyYXRpb24uZXF1YWxzKGV4cGVjdGVkVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpLCB0eXBlTmFtZSkpIHsKLQkJCQkJcmV0dXJuIFJfRVhQRUNURURfVFlQRTsKKwkJCQkJcmV0dXJuIFJfRVhBQ1RfRVhQRUNURURfVFlQRTsKIAkJCQl9CiAJCQl9CiAJCX0gCi0JCXJldHVybiBSX0RFRkFVTFQ7CisJCXJldHVybiAwOwogCX0KLQorCWludCBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpeworCQlyZXR1cm4gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwobnVsbCk7CisJfQorCXByaXZhdGUgaW50IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKEJpbmRpbmcgYmluZGluZyl7CisJCWlmKHVuaW50ZXJlc3RpbmdCaW5kaW5ncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8PSB1bmludGVyZXN0aW5nQmluZGluZ3NQdHI7IGkrKykgeworCQkJCWlmKHVuaW50ZXJlc3RpbmdCaW5kaW5nc1tpXSA9PSBiaW5kaW5nKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gUl9JTlRFUkVTVElORzsKKwl9CisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVVbmludGVyZXN0aW5nQmluZGluZ3MoQXN0Tm9kZSBwYXJlbnQsIFNjb3BlIHNjb3BlKXsKKwkJaWYocGFyZW50IGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkJYWRkVW5pbnRlcmVzdGluZ0JpbmRpbmdzKCgoTG9jYWxEZWNsYXJhdGlvbilwYXJlbnQpLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCWFkZFVuaW50ZXJlc3RpbmdCaW5kaW5ncygoKEZpZWxkRGVjbGFyYXRpb24pcGFyZW50KS5iaW5kaW5nKTsKKwkJfSAKKwl9CiAJLy8gSGVscGVyIG1ldGhvZCBmb3IgZmluZE1ldGhvZHMoY2hhcltdLCBNZXRob2RCaW5kaW5nW10sIFNjb3BlLCBPYmplY3RWZWN0b3IsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIFR5cGVCaW5kaW5nKQogCXByaXZhdGUgdm9pZCBmaW5kTG9jYWxNZXRob2REZWNsYXJhdGlvbnMoCiAJCWNoYXJbXSBtZXRob2ROYW1lLApAQCAtMTk0Niw5ICsyMzE0LDEyIEBACiAJCQkJfQogCQkJfQogCi0JCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOworCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKIAkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKG1ldGhvZE5hbWUsIG1ldGhvZC5zZWxlY3Rvcik7CisJCQlpZihtZXRob2QuaXNBYnN0cmFjdCgpKSByZWxldmFuY2UgKz0gUl9BQlNUUkFDVF9NRVRIT0Q7CiAKKwkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCXJlcXVlc3Rvci5hY2NlcHRNZXRob2REZWNsYXJhdGlvbigKIAkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQltZXRob2QuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLApAQCAtMjEwMSw3ICsyNDcyLDcgQEAKIAkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7CiAKIAkJaWYgKGxlbmd0aCA9PSAwKXsKLQkJCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXI7CisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJCX0KIAkJLy8gbG9vayBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgaWYgaXQgaXMgYXZhaWxhYmxlCiAJCWlmIChiaW5kaW5nVHlwZSBpbnN0YW5jZW9mIFNvdXJjZVR5cGVCaW5kaW5nKXsKQEAgLTIxODEsMTEgKzI1NTIsMTUgQEAKIAkJCQkJCQkJCSkpCiAJCQkJCQkJCQljb250aW51ZSBuZXh0OwogCi0JCQkJCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckludGVyZXN0aW5nUHJvcG9zYWwoKTsKIAkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodHlwZU5hbWUsIGxvY2FsVHlwZS5zb3VyY2VOYW1lKTsKIAkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKGxvY2FsVHlwZSk7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKGxvY2FsVHlwZS5zb3VyY2VOYW1lKTsKIAkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwogCQkJCQkJCQkKKwkJCQkJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQkJCQkJCQlsb2NhbFR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJCQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lLApAQCAtMjI0MSwxMiArMjYxNiwxNyBAQAogCQkJCQogCQkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHModG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSwgZmFsc2UpKQljb250aW51ZTsKIAotCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJaW50IHJlbGV2YW5jZSA9IGNvbXB1dGVCYXNlUmVsZXZhbmNlKCk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CiAJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDYXNlTWF0Y2hpbmcodG9rZW4sIHNvdXJjZVR5cGUuc291cmNlTmFtZSk7CiAJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHNvdXJjZVR5cGUpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihmYWxzZSk7CiAKIAkJCQlpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpewogCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNsYXNzKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yRXhjZXB0aW9uKHNvdXJjZVR5cGUuc291cmNlTmFtZSk7CisJCQkJCQorCQkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCXJlcXVlc3Rvci5hY2NlcHRDbGFzcygKIAkJCQkJCXNvdXJjZVR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJCXNvdXJjZVR5cGUuc291cmNlTmFtZSgpLApAQCAtMjI1Nyw2ICsyNjM3LDggQEAKIAkJCQkJCXJlbGV2YW5jZSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQkJCisJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgKIAkJCQkJCXNvdXJjZVR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJCXNvdXJjZVR5cGUuc291cmNlTmFtZSgpLApAQCAtMjI2OCwxMyArMjY1MCw3MSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCi0JCWlmICh0b2tlbi5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlmaW5kS2V5d29yZHModG9rZW4sIGJhc2VUeXBlcywgc2NvcGUpOwotCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHRva2VuLCB0aGlzKTsKLQkJbmFtZUVudmlyb25tZW50LmZpbmRQYWNrYWdlcyh0b2tlbiwgdGhpcyk7CisJCQorCQlpZiAodG9rZW4ubGVuZ3RoID09IDApIHsKKwkJCWlmKGV4cGVjdGVkVHlwZXNQdHIgPiAtMSkgeworCQkJCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8PSBleHBlY3RlZFR5cGVzUHRyOyBpKyspIHsKKwkJCQkJaWYoZXhwZWN0ZWRUeXBlc1tpXSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKWV4cGVjdGVkVHlwZXNbaV07CisJCQkJCQlib29sZWFuIGluU2FtZVVuaXQgPSB1bml0U2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZCaW5kaW5nKTsKKwkJCQkJCQorCQkJCQkJLy8gdG9wIGxldmVsIHR5cGVzIG9mIHRoZSBjdXJyZW50IHVuaXQgYXJlIGFscmVhZHkgcHJvcG9zZWQuCisJCQkJCQlpZighaW5TYW1lVW5pdCB8fCAoaW5TYW1lVW5pdCAmJiByZWZCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKSkgeworCQkJCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSA9IHJlZkJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKKwkJCQkJCQljaGFyW10gdHlwZU5hbWUgPSByZWZCaW5kaW5nLnNvdXJjZU5hbWUoKTsKKwkJCQkJCQljaGFyW10gY29tcGxldGlvbk5hbWUgPSB0eXBlTmFtZTsKKwkJCQkJCQkKKwkJCQkJCQlib29sZWFuIGlzUXVhbGlmaWVkID0gZmFsc2U7CisJCQkJCQkJaWYgKCFpbnNpZGVRdWFsaWZpZWRSZWZlcmVuY2UgJiYgIXJlZkJpbmRpbmcuaXNNZW1iZXJUeXBlKCkpIHsKKwkJCQkJCQkJaWYgKG11c3RRdWFsaWZ5VHlwZShwYWNrYWdlTmFtZSwgdHlwZU5hbWUpKSB7CisJCQkJCQkJCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGggPT0gMCkKKwkJCQkJCQkJCQlpZiAodW5pdFNjb3BlICE9IG51bGwgJiYgdW5pdFNjb3BlLmZQYWNrYWdlLmNvbXBvdW5kTmFtZSAhPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUikKKwkJCQkJCQkJCQkJY29udGludWUgbmV4dDsgLy8gaWdub3JlIHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBmcm9tIG91dHNpZGUgaXQKKwkJCQkJCQkJCWNvbXBsZXRpb25OYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpOworCQkJCQkJCQkJaXNRdWFsaWZpZWQgPSB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCB0eXBlTmFtZSk7CisJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeHBlY3RpbmdUeXBlKHJlZkJpbmRpbmcpOworCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yUXVhbGlmaWNhdGlvbihpc1F1YWxpZmllZCk7CisJCQkJCQkJCisJCQkJCQkJaWYocmVmQmluZGluZy5pc0NsYXNzKCkpIHsKKwkJCQkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JDbGFzcygpOworCQkJCQkJCQkKKwkJCQkJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOworCQkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCisJCQkJCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCQkJY29tcGxldGlvbk5hbWUsCisJCQkJCQkJCQlyZWZCaW5kaW5nLm1vZGlmaWVycywKKwkJCQkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsIAorCQkJCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJCX0gZWxzZSBpZiAocmVmQmluZGluZy5pc0ludGVyZmFjZSgpKSB7CisJCQkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJmYWNlKCk7CisJCQkJCQkJCQorCQkJCQkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CisJCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCisJCQkJCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJCQkJCXR5cGVOYW1lLAorCQkJCQkJCQkJY29tcGxldGlvbk5hbWUsCisJCQkJCQkJCQlyZWZCaW5kaW5nLm1vZGlmaWVycywKKwkJCQkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsIAorCQkJCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQkJCQlyZWxldmFuY2UpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gCisJCX0gZWxzZSB7CisJCQlmaW5kS2V5d29yZHModG9rZW4sIGJhc2VUeXBlcyk7CisJCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHRva2VuLCB0aGlzKTsKKwkJCW5hbWVFbnZpcm9ubWVudC5maW5kUGFja2FnZXModG9rZW4sIHRoaXMpOworCQl9CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGZpbmRUeXBlc0FuZFN1YnBhY2thZ2VzKApAQCAtMjI5NCw2ICsyNzM0LDU0IEBACiAJCQkJbGVuZ3RoKTsKIAkJCXF1YWxpZmllZE5hbWVbbGVuZ3RoXSA9ICcuJzsKIAkJfQorCQkKKwkJaWYgKHVuaXRTY29wZSAhPSBudWxsKSB7CisJCQlpbnQgdHlwZUxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoOworCQkJU291cmNlVHlwZUJpbmRpbmdbXSB0eXBlcyA9IHVuaXRTY29wZS50b3BMZXZlbFR5cGVzOworCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gdHlwZXNbaV07IAorCQorCQkJCWNoYXJbXSBxdWFsaWZpZWRTb3VyY2VUeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChzb3VyY2VUeXBlLmNvbXBvdW5kTmFtZSwgJy4nKTsKKwkJCQkKKwkJCQlpZiAodHlwZUxlbmd0aCA+IHF1YWxpZmllZFNvdXJjZVR5cGVOYW1lLmxlbmd0aCkJY29udGludWU7CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhxdWFsaWZpZWROYW1lLCBxdWFsaWZpZWRTb3VyY2VUeXBlTmFtZSwgZmFsc2UpKQljb250aW51ZTsKKworCQkJCWludCByZWxldmFuY2UgPSBjb21wdXRlQmFzZVJlbGV2YW5jZSgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbCgpOworCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHF1YWxpZmllZE5hbWUsIHF1YWxpZmllZFNvdXJjZVR5cGVOYW1lKTsKKwkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUoc291cmNlVHlwZSk7CisJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JRdWFsaWZpY2F0aW9uKGZhbHNlKTsKKworCQkJCWlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSl7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2xhc3MoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JFeGNlcHRpb24oc291cmNlVHlwZS5zb3VyY2VOYW1lKTsKKwkJCQkJCisJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAorCQkJCQkJc291cmNlVHlwZS5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAorCQkJCQkJc291cmNlVHlwZS5zb3VyY2VOYW1lKCksCisJCQkJCQlzb3VyY2VUeXBlLnNvdXJjZU5hbWUoKSwKKwkJCQkJCXNvdXJjZVR5cGUubW9kaWZpZXJzLAorCQkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwgCisJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmZhY2UoKTsKKwkJCQkJCisJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKKwkJCQkJcmVxdWVzdG9yLmFjY2VwdEludGVyZmFjZSgKKwkJCQkJCXNvdXJjZVR5cGUucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKKwkJCQkJCXNvdXJjZVR5cGUuc291cmNlTmFtZSgpLAorCQkJCQkJc291cmNlVHlwZS5zb3VyY2VOYW1lKCksCisJCQkJCQlzb3VyY2VUeXBlLm1vZGlmaWVycywKKwkJCQkJCXN0YXJ0UG9zaXRpb24gLSBvZmZzZXQsCisJCQkJCQllbmRQb3NpdGlvbiAtIG9mZnNldCwKKwkJCQkJCXJlbGV2YW5jZSk7CisJCQkJfQorCQkJfQorCQl9CisJCQogCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKHF1YWxpZmllZE5hbWUsIHRoaXMpOwogCQluYW1lRW52aXJvbm1lbnQuZmluZFBhY2thZ2VzKHF1YWxpZmllZE5hbWUsIHRoaXMpOwogCX0KQEAgLTIzNTYsMTQgKzI4NDQsMTcgQEAKIAkJCQkJCX0KIAkJCQkJCWxvY2Fsc0ZvdW5kLmFkZChsb2NhbCk7CiAKLQkJCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7CisJCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9ySW50ZXJlc3RpbmdQcm9wb3NhbChsb2NhbCk7CiAJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckNhc2VNYXRjaGluZyh0b2tlbiwgbG9jYWwubmFtZSk7CiAJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvckV4cGVjdGluZ1R5cGUobG9jYWwudHlwZSk7CisJCQkJCQlyZWxldmFuY2UgKz0gY29tcHV0ZVJlbGV2YW5jZUZvclF1YWxpZmljYXRpb24oZmFsc2UpOwogCQkJCQkJCisJCQkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0TG9jYWxWYXJpYWJsZSgKIAkJCQkJCQlsb2NhbC5uYW1lLAogCQkJCQkJCWxvY2FsLnR5cGUgPT0gbnVsbCAKLQkJCQkJCQkJPyBOb0NoYXIKKwkJCQkJCQkJPyBDaGFyT3BlcmF0aW9uLk5PX0NIQVIKIAkJCQkJCQkJOiBsb2NhbC50eXBlLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCiAJCQkJCQkJbG9jYWwudHlwZSA9PSBudWxsCiAJCQkJCQkJCT8gbG9jYWwuZGVjbGFyYXRpb24udHlwZS50b1N0cmluZygpLnRvQ2hhckFycmF5KCkKQEAgLTI0MjgsMTE1ICsyOTE5LDEyMSBAQAogCQkJY3VycmVudFNjb3BlID0gY3VycmVudFNjb3BlLnBhcmVudDsKIAkJfQogCX0KLQotCS8vIEhlbHBlciBtZXRob2QgZm9yIHByaXZhdGUgdm9pZCBmaW5kVmFyaWFibGVOYW1lcyhjaGFyW10gbmFtZSwgVHlwZVJlZmVyZW5jZSB0eXBlICkKLQlwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZShjaGFyW10gdG9rZW4sIGNoYXJbXSBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFNvdXJjZU5hbWUsIGNoYXJbXSBzb3VyY2VOYW1lLCBjaGFyW11bXSBleGNsdWRlTmFtZXMsIGludCBkaW0pewotCQkJaWYoc291cmNlTmFtZSA9PSBudWxsIHx8IHNvdXJjZU5hbWUubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCQkJCQotCQkJY2hhcltdIG5hbWUgPSBudWxsOworCQkvLyBIZWxwZXIgbWV0aG9kIGZvciBwcml2YXRlIHZvaWQgZmluZFZhcmlhYmxlTmFtZXMoY2hhcltdIG5hbWUsIFR5cGVSZWZlcmVuY2UgdHlwZSApCisJcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWUoCisJCWNoYXJbXSB0b2tlbiwKKwkJY2hhcltdIHF1YWxpZmllZFBhY2thZ2VOYW1lLAorCQljaGFyW10gcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJY2hhcltdIHNvdXJjZU5hbWUsCisJCWNoYXJbXVtdIGV4Y2x1ZGVOYW1lcywKKwkJaW50IGRpbSwKKwkJaW50IGtpbmQsCisJCWludCBtb2RpZmllcnMpewogCQkJCi0JCQkvLyBjb21wdXRlIHZhcmlhYmxlIG5hbWUgZm9yIGJhc2UgdHlwZQotCQkJdHJ5ewotCQkJCW5hbWVTY2FubmVyLnNldFNvdXJjZShzb3VyY2VOYW1lKTsKLQkJCQlzd2l0Y2ggKG5hbWVTY2FubmVyLmdldE5leHRUb2tlbigpKSB7Ci0JCQkJCWNhc2UgVG9rZW5OYW1laW50IDoKLQkJCQkJY2FzZSBUb2tlbk5hbWVieXRlIDoKLQkJCQkJY2FzZSBUb2tlbk5hbWVzaG9ydCA6Ci0JCQkJCWNhc2UgVG9rZW5OYW1lY2hhciA6Ci0JCQkJCWNhc2UgVG9rZW5OYW1lbG9uZyA6Ci0JCQkJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOgotCQkJCQljYXNlIFRva2VuTmFtZWRvdWJsZSA6Ci0JCQkJCWNhc2UgVG9rZW5OYW1lYm9vbGVhbiA6Ci0JCQkJCQlpZih0b2tlbiAhPSBudWxsICYmIHRva2VuLmxlbmd0aCAhPSAwKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCW5hbWUgPSBjb21wdXRlQmFzZU5hbWVzKHNvdXJjZU5hbWVbMF0sIGV4Y2x1ZGVOYW1lcyk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYobmFtZSAhPSBudWxsKSB7Ci0JCQkJCWludCByZWxldmFuY2UgPSBSX0RFRkFVTFQ7Ci0JCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBuYW1lKTsKLQkJCQkJCisJCWlmKHNvdXJjZU5hbWUgPT0gbnVsbCB8fCBzb3VyY2VOYW1lLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCisJCS8vIGNvbXB1dGUgdmFyaWFibGUgbmFtZSBmb3Igbm9uIGJhc2UgdHlwZQorCQlmaW5hbCBjaGFyW10gZGlzcGxheU5hbWU7CisJCWlmIChkaW0gPiAwKXsKKwkJCWludCBsID0gcXVhbGlmaWVkU291cmNlTmFtZS5sZW5ndGg7CisJCQlkaXNwbGF5TmFtZSA9IG5ldyBjaGFyW2wrKDIqZGltKV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KHF1YWxpZmllZFNvdXJjZU5hbWUsIDAsIGRpc3BsYXlOYW1lLCAwLCBsKTsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBkaW07IGkrKyl7CisJCQkJZGlzcGxheU5hbWVbbCsoaSoyKV0gPSAnWyc7CisJCQkJZGlzcGxheU5hbWVbbCsoaSoyKSsxXSA9ICddJzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRpc3BsYXlOYW1lID0gcXVhbGlmaWVkU291cmNlTmFtZTsKKwkJfQorCQkKKwkJZmluYWwgY2hhcltdIHQgPSB0b2tlbjsKKwkJZmluYWwgY2hhcltdIHEgPSBxdWFsaWZpZWRQYWNrYWdlTmFtZTsKKwkJSU5hbWluZ1JlcXVlc3RvciBuYW1pbmdSZXF1ZXN0b3IgPSBuZXcgSU5hbWluZ1JlcXVlc3RvcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGJvb2xlYW4gaXNGaXJzdFN1ZmZpeCkgeworCQkJCWFjY2VwdCgJbmFtZSwKKwkJCQkJKGlzRmlyc3RQcmVmaXggPyBSX05BTUVfRklSU1RfUFJFRklYIDogUl9OQU1FX1BSRUZJWCkgKyAoaXNGaXJzdFN1ZmZpeCA/IFJfTkFNRV9GSVJTVF9TVUZGSVggOiBSX05BTUVfU1VGRklYKSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgpIHsKKwkJCQlhY2NlcHQobmFtZSwgaXNGaXJzdFByZWZpeCA/IFJfTkFNRV9GSVJTVF9QUkVGSVggOiAgUl9OQU1FX1BSRUZJWCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RTdWZmaXgpIHsKKwkJCQlhY2NlcHQobmFtZSwgaXNGaXJzdFN1ZmZpeCA/IFJfTkFNRV9GSVJTVF9TVUZGSVggOiBSX05BTUVfU1VGRklYKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgYWNjZXB0TmFtZVdpdGhvdXRQcmVmaXhBbmRTdWZmaXgoY2hhcltdIG5hbWUpIHsKKwkJCQlhY2NlcHQobmFtZSwgMCk7CisJCQl9CisJCQl2b2lkIGFjY2VwdChjaGFyW10gbmFtZSwgaW50IHByZWZpeEFuZFN1ZmZpeFJlbGV2YW5jZSl7CisJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHQsIG5hbWUsIGZhbHNlKSkgeworCQkJCQlpbnQgcmVsZXZhbmNlID0gY29tcHV0ZUJhc2VSZWxldmFuY2UoKTsKKwkJCQkJcmVsZXZhbmNlICs9IGNvbXB1dGVSZWxldmFuY2VGb3JJbnRlcmVzdGluZ1Byb3Bvc2FsKCk7CisJCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHQsIG5hbWUpOworCQkJCQlyZWxldmFuY2UgKz0gcHJlZml4QW5kU3VmZml4UmVsZXZhbmNlOworCiAJCQkJCS8vIGFjY2VwdCByZXN1bHQKKwkJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCQlyZXF1ZXN0b3IuYWNjZXB0VmFyaWFibGVOYW1lKAotCQkJCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUsCi0JCQkJCQlxdWFsaWZpZWRTb3VyY2VOYW1lLAorCQkJCQkJcSwKKwkJCQkJCWRpc3BsYXlOYW1lLAogCQkJCQkJbmFtZSwKIAkJCQkJCW5hbWUsCiAJCQkJCQlzdGFydFBvc2l0aW9uIC0gb2Zmc2V0LAogCQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCiAJCQkJCQlyZWxldmFuY2UpOwotCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CiAJCQl9Ci0JCQkKLQkJCS8vIGNvbXB1dGUgdmFyaWFibGUgbmFtZSBmb3Igbm9uIGJhc2UgdHlwZQotCQkJY2hhcltdW10gbmFtZXMgPSBjb21wdXRlTmFtZXMoc291cmNlTmFtZSwgZGltID4gMCk7Ci0JCQljaGFyW10gZGlzcGxheU5hbWU7Ci0JCQlpZiAoZGltID4gMCl7Ci0JCQkJaW50IGwgPSBxdWFsaWZpZWRTb3VyY2VOYW1lLmxlbmd0aDsKLQkJCQlkaXNwbGF5TmFtZSA9IG5ldyBjaGFyW2wrKDIqZGltKV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShxdWFsaWZpZWRTb3VyY2VOYW1lLCAwLCBkaXNwbGF5TmFtZSwgMCwgbCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IGRpbTsgaSsrKXsKLQkJCQkJZGlzcGxheU5hbWVbbCsoaSoyKV0gPSAnWyc7Ci0JCQkJCWRpc3BsYXlOYW1lW2wrKGkqMikrMV0gPSAnXSc7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5TmFtZSA9IHF1YWxpZmllZFNvdXJjZU5hbWU7Ci0JCQl9Ci0JCQluZXh0IDogZm9yKGludCBpID0gMCA7IGkgPCBuYW1lcy5sZW5ndGggOyBpKyspewotCQkJCW5hbWUgPSBuYW1lc1tpXTsKLQkJCQkKLQkJCQlpZiAoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHRva2VuLCBuYW1lLCBmYWxzZSkpCi0JCQkJCWNvbnRpbnVlIG5leHQ7Ci0JCQkJCi0JCQkJLy8gY29tcGxldGlvbiBtdXN0IGJlIGFuIGlkZW50aWZpZXIgKG5vdCBhIGtleXdvcmQsIC4uLikuCi0JCQkJdHJ5ewotCQkJCQluYW1lU2Nhbm5lci5zZXRTb3VyY2UobmFtZSk7Ci0JCQkJCWlmKG5hbWVTY2FubmVyLmdldE5leHRUb2tlbigpICE9IFRva2VuTmFtZUlkZW50aWZpZXIpCi0JCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpewotCQkJCQljb250aW51ZSBuZXh0OwotCQkJCX0KLQkJCQkKLQkJCQlpbnQgY291bnQgPSAyOwotCQkJCWNoYXJbXSBvcmlnaW5hbE5hbWUgPSBuYW1lOwotCQkJCWZvcihpbnQgaiA9IDAgOyBqIDwgZXhjbHVkZU5hbWVzLmxlbmd0aCA7IGorKyl7Ci0JCQkJCWlmKENoYXJPcGVyYXRpb24uZXF1YWxzKG5hbWUsIGV4Y2x1ZGVOYW1lc1tqXSwgZmFsc2UpKSB7Ci0JCQkJCQluYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQob3JpZ2luYWxOYW1lLCBTdHJpbmcudmFsdWVPZihjb3VudCsrKS50b0NoYXJBcnJheSgpKTsKLQkJCQkJCWogPSAwOwotCQkJCQl9CQotCQkJCX0KLQkJCQkKLQkJCQlpbnQgcmVsZXZhbmNlID0gUl9ERUZBVUxUOwotCQkJCXJlbGV2YW5jZSArPSBjb21wdXRlUmVsZXZhbmNlRm9yQ2FzZU1hdGNoaW5nKHRva2VuLCBuYW1lKTsKLQkJCQkKLQkJCQkvLyBhY2NlcHQgcmVzdWx0Ci0JCQkJcmVxdWVzdG9yLmFjY2VwdFZhcmlhYmxlTmFtZSgKKwkJfTsKKwkJCisJCXN3aXRjaCAoa2luZCkgeworCQkJY2FzZSBGSUVMRCA6CisJCQkJSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcygKKwkJCQkJamF2YVByb2plY3QsCiAJCQkJCXF1YWxpZmllZFBhY2thZ2VOYW1lLAotCQkJCQlkaXNwbGF5TmFtZSwKLQkJCQkJbmFtZSwKLQkJCQkJbmFtZSwKLQkJCQkJc3RhcnRQb3NpdGlvbiAtIG9mZnNldCwKLQkJCQkJZW5kUG9zaXRpb24gLSBvZmZzZXQsCi0JCQkJCXJlbGV2YW5jZSk7Ci0JCQl9CisJCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUsCisJCQkJCWRpbSwKKwkJCQkJbW9kaWZpZXJzLAorCQkJCQlleGNsdWRlTmFtZXMsCisJCQkJCW5hbWluZ1JlcXVlc3Rvcik7CisJCQkJYnJlYWs7CisJCQljYXNlIExPQ0FMIDoKKwkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RMb2NhbFZhcmlhYmxlTmFtZXMoCisJCQkJCWphdmFQcm9qZWN0LAorCQkJCQlxdWFsaWZpZWRQYWNrYWdlTmFtZSwKKwkJCQkJcXVhbGlmaWVkU291cmNlTmFtZSwKKwkJCQkJZGltLAorCQkJCQlleGNsdWRlTmFtZXMsCisJCQkJCW5hbWluZ1JlcXVlc3Rvcik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFSR1VNRU5UIDoKKwkJCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RBcmd1bWVudE5hbWVzKAorCQkJCQlqYXZhUHJvamVjdCwKKwkJCQkJcXVhbGlmaWVkUGFja2FnZU5hbWUsCisJCQkJCXF1YWxpZmllZFNvdXJjZU5hbWUsCisJCQkJCWRpbSwKKwkJCQkJZXhjbHVkZU5hbWVzLAorCQkJCQluYW1pbmdSZXF1ZXN0b3IpOworCQkJCWJyZWFrOworCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZpbmRWYXJpYWJsZU5hbWVzKGNoYXJbXSBuYW1lLCBUeXBlUmVmZXJlbmNlIHR5cGUgLCBjaGFyW11bXSBleGNsdWRlTmFtZXMpeworCXByaXZhdGUgdm9pZCBmaW5kVmFyaWFibGVOYW1lcyhjaGFyW10gbmFtZSwgVHlwZVJlZmVyZW5jZSB0eXBlICwgY2hhcltdW10gZXhjbHVkZU5hbWVzLCBpbnQga2luZCwgaW50IG1vZGlmaWVycyl7CiAKIAkJaWYodHlwZSAhPSBudWxsICYmCi0JCQl0eXBlLmJpbmRpbmcgIT0gbnVsbCAmJgotCQkJdHlwZS5iaW5kaW5nLnByb2JsZW1JZCgpID09IEJpbmRpbmcuTm9FcnJvcil7Ci0JCQlUeXBlQmluZGluZyB0YiA9IHR5cGUuYmluZGluZzsKKwkJCXR5cGUucmVzb2x2ZWRUeXBlICE9IG51bGwgJiYKKwkJCXR5cGUucmVzb2x2ZWRUeXBlLnByb2JsZW1JZCgpID09IEJpbmRpbmcuTm9FcnJvcil7CisJCQlUeXBlQmluZGluZyB0YiA9IHR5cGUucmVzb2x2ZWRUeXBlOwogCQkJZmluZFZhcmlhYmxlTmFtZSgKIAkJCQluYW1lLAogCQkJCXRiLmxlYWZDb21wb25lbnRUeXBlKCkucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQl0Yi5sZWFmQ29tcG9uZW50VHlwZSgpLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKIAkJCQl0Yi5sZWFmQ29tcG9uZW50VHlwZSgpLnNvdXJjZU5hbWUoKSwKIAkJCQlleGNsdWRlTmFtZXMsCi0JCQkJdHlwZS5kaW1lbnNpb25zKCkpOworCQkJCXR5cGUuZGltZW5zaW9ucygpLAorCQkJCWtpbmQsCisJCQkJbW9kaWZpZXJzKTsKIAkJfS8qCWVsc2UgewogCQkJY2hhcltdW10gdHlwZU5hbWUgPSB0eXBlLmdldFR5cGVOYW1lKCk7CiAJCQlmaW5kVmFyaWFibGVOYW1lKApAQCAtMjU2MCwxMDEgKzMwNTcsMzM2IEBACiAJCXRoaXMua25vd25Qa2dzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKIAkJdGhpcy5rbm93blR5cGVzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0KLQkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnQ7Ci0JCXRoaXMuZW5kUG9zaXRpb24gPSBlbmQgKyAxOwotCX0KIAkKLQlwcml2YXRlIGNoYXJbXSBjb21wdXRlQmFzZU5hbWVzKGNoYXIgZmlyc3ROYW1lLCBjaGFyW11bXSBleGNsdWRlTmFtZXMpewotCQljaGFyW10gbmFtZSA9IG5ldyBjaGFyW117Zmlyc3ROYW1lfTsKLQkJCi0JCWZvcihpbnQgaSA9IDAgOyBpIDwgZXhjbHVkZU5hbWVzLmxlbmd0aCA7IGkrKyl7Ci0JCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhuYW1lLCBleGNsdWRlTmFtZXNbaV0sIGZhbHNlKSkgewotCQkJCW5hbWVbMF0rKzsKLQkJCQlpZihuYW1lWzBdID4gJ3onKQotCQkJCQluYW1lWzBdID0gJ2EnOwotCQkJCWlmKG5hbWVbMF0gPT0gZmlyc3ROYW1lKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpID0gMDsKLQkJCX0JCisJcHJpdmF0ZSB2b2lkIHNldFNvdXJjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgeworCQl0aGlzLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQsIHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gZW1wdHlUb2tlbkFkanN0bWVudCkgewkJCisJCXRoaXMuc3RhcnRQb3NpdGlvbiA9IHN0YXJ0OworCQlpZihlbXB0eVRva2VuQWRqc3RtZW50KSB7CisJCQlpbnQgZW5kT2ZFbXB0eVRva2VuID0gKChDb21wbGV0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuZW5kT2ZFbXB0eVRva2VuOworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IGVuZE9mRW1wdHlUb2tlbiA+IGVuZCA/IGVuZE9mRW1wdHlUb2tlbiArIDEgOiBlbmQgKyAxOworCQl9IGVsc2UgeworCQkJdGhpcy5lbmRQb3NpdGlvbiA9IGVuZCArIDE7CiAJCX0KLQkJCi0JCXJldHVybiBuYW1lOworCX0KKwlpbnQgY29tcHV0ZUJhc2VSZWxldmFuY2UoKXsKKwkJcmV0dXJuIFJfREVGQVVMVDsKIAl9CiAJcHJpdmF0ZSB2b2lkIGNvbXB1dGVFeHBlY3RlZFR5cGVzKEFzdE5vZGUgcGFyZW50LCBTY29wZSBzY29wZSl7Ci0JCWludCBleHBlY3RlZFR5cGVDb3VudCA9IDA7Ci0JCWV4cGVjdGVkVHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbMV07CiAJCQorCQkvLyBkZWZhdWx0IGZpbHRlcgorCQlleHBlY3RlZFR5cGVzRmlsdGVyID0gU1VCVFlQRTsKKwkJCisJCS8vIGZpbmQgdHlwZXMgZnJvbSBwYXJlbnQKIAkJaWYocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB7Ci0JCQlUeXBlQmluZGluZyBiaW5kaW5nID0gKChBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pcGFyZW50KS50eXBlLmJpbmRpbmc7CisJCQlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUgPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmVudDsKKwkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB2YXJpYWJsZS50eXBlLnJlc29sdmVkVHlwZTsKIAkJCWlmKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJCWV4cGVjdGVkVHlwZXNbZXhwZWN0ZWRUeXBlQ291bnQrK10gPSBiaW5kaW5nOworCQkJCWlmKCEodmFyaWFibGUuaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheUluaXRpYWxpemVyKSkgeworCQkJCQlhZGRFeHBlY3RlZFR5cGUoYmluZGluZyk7CisJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgQXNzaWdubWVudCkgewotCQkJVHlwZUJpbmRpbmcgYmluZGluZyA9ICgoQXNzaWdubWVudClwYXJlbnQpLmxoc1R5cGU7CisJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gKChBc3NpZ25tZW50KXBhcmVudCkucmVzb2x2ZWRUeXBlOwogCQkJaWYoYmluZGluZyAhPSBudWxsKSB7Ci0JCQkJZXhwZWN0ZWRUeXBlc1tleHBlY3RlZFR5cGVDb3VudCsrXSA9IGJpbmRpbmc7CisJCQkJYWRkRXhwZWN0ZWRUeXBlKGJpbmRpbmcpOwogCQkJfQogCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KSB7Ci0JCQlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHNjb3BlLm1ldGhvZFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCkuYmluZGluZzsKLQkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2RCaW5kaW5nICA9PSBudWxsID8gbnVsbCA6IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZTsKLQkJCWlmKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJCWV4cGVjdGVkVHlwZXNbZXhwZWN0ZWRUeXBlQ291bnQrK10gPSBiaW5kaW5nOworCQkJaWYoc2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgeworCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9ICgoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgc2NvcGUubWV0aG9kU2NvcGUoKS5yZWZlcmVuY2VDb250ZXh0KS5iaW5kaW5nOworCQkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2RCaW5kaW5nICA9PSBudWxsID8gbnVsbCA6IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZTsKKwkJCQlpZihiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJYWRkRXhwZWN0ZWRUeXBlKGJpbmRpbmcpOworCQkJCX0KIAkJCX0KKwkJfSBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB7CisJCQlFeHByZXNzaW9uIGUgPSAoKENhc3RFeHByZXNzaW9uKXBhcmVudCkudHlwZTsKKwkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBlLnJlc29sdmVkVHlwZTsKKwkJCWlmKGJpbmRpbmcgIT0gbnVsbCl7CisJCQkJYWRkRXhwZWN0ZWRUeXBlKGJpbmRpbmcpOworCQkJCWV4cGVjdGVkVHlwZXNGaWx0ZXIgPSBTVUJUWVBFIHwgU1VQRVJUWVBFOworCQkJfQorCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgTWVzc2FnZVNlbmQpIHsKKwkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBwYXJlbnQ7CisKKwkJCWlmKG1lc3NhZ2VTZW5kLnJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZyltZXNzYWdlU2VuZC5yZWNlaXZlclR5cGU7CisJCQkJYm9vbGVhbiBpc1N0YXRpYyA9IG1lc3NhZ2VTZW5kLnJlY2VpdmVyLmlzVHlwZVJlZmVyZW5jZSgpOworCQkJCQorCQkJCXdoaWxlKGJpbmRpbmcgIT0gbnVsbCkgewkKKwkJCQkJY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JNZXNzYWdlU2VuZCgKKwkJCQkJCWJpbmRpbmcsCisJCQkJCQltZXNzYWdlU2VuZC5zZWxlY3RvciwKKwkJCQkJCW1lc3NhZ2VTZW5kLmFyZ3VtZW50cywKKwkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKW1lc3NhZ2VTZW5kLnJlY2VpdmVyVHlwZSwKKwkJCQkJCXNjb3BlLAorCQkJCQkJbWVzc2FnZVNlbmQsCisJCQkJCQlpc1N0YXRpYyk7CisJCQkJCWNvbXB1dGVFeHBlY3RlZFR5cGVzRm9yTWVzc2FnZVNlbmRGb3JJbnRlcmZhY2UoCisJCQkJCQliaW5kaW5nLAorCQkJCQkJbWVzc2FnZVNlbmQuc2VsZWN0b3IsCisJCQkJCQltZXNzYWdlU2VuZC5hcmd1bWVudHMsCisJCQkJCQkoUmVmZXJlbmNlQmluZGluZyltZXNzYWdlU2VuZC5yZWNlaXZlclR5cGUsCisJCQkJCQlzY29wZSwKKwkJCQkJCW1lc3NhZ2VTZW5kLAorCQkJCQkJaXNTdGF0aWMpOworCQkJCQliaW5kaW5nID0gYmluZGluZy5zdXBlcmNsYXNzKCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKKwkJCUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gKEFsbG9jYXRpb25FeHByZXNzaW9uKSBwYXJlbnQ7CisJCQkKKwkJCVJlZmVyZW5jZUJpbmRpbmcgYmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKWFsbG9jYXRpb25FeHByZXNzaW9uLnR5cGUucmVzb2x2ZWRUeXBlOworCisJCQlpZihiaW5kaW5nICE9IG51bGwpIHsJCisJCQkJY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JBbGxvY2F0aW9uRXhwcmVzc2lvbigKKwkJCQkJYmluZGluZywKKwkJCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24uYXJndW1lbnRzLAorCQkJCQlzY29wZSwKKwkJCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24pOworCQkJfQorCQl9IGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgT3BlcmF0b3JFeHByZXNzaW9uKSB7CisJCQlpbnQgb3BlcmF0b3IgPSAocGFyZW50LmJpdHMgJiBBc3ROb2RlLk9wZXJhdG9yTUFTSykgPj4gQXN0Tm9kZS5PcGVyYXRvclNISUZUOworCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxFeHByZXNzaW9uKSB7CisJCQkJLy8gZm9yIGZ1dHVyZSB1c2UKKwkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBJbnN0YW5jZU9mRXhwcmVzc2lvbikgeworCQkJCUluc3RhbmNlT2ZFeHByZXNzaW9uIGUgPSAoSW5zdGFuY2VPZkV4cHJlc3Npb24pIHBhcmVudDsKKwkJCQlUeXBlQmluZGluZyBiaW5kaW5nID0gZS5leHByZXNzaW9uLnJlc29sdmVkVHlwZTsKKwkJCQlpZihiaW5kaW5nICE9IG51bGwpeworCQkJCQlhZGRFeHBlY3RlZFR5cGUoYmluZGluZyk7CisJCQkJCWV4cGVjdGVkVHlwZXNGaWx0ZXIgPSBTVUJUWVBFIHwgU1VQRVJUWVBFOworCQkJCX0KKwkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisJCQkJc3dpdGNoKG9wZXJhdG9yKSB7CisJCQkJCWNhc2UgT3BlcmF0b3JJZHMuUExVUyA6CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLlNob3J0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkludEJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Mb25nQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkZsb2F0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkRvdWJsZUJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5DaGFyQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkJ5dGVCaW5kaW5nKTsKKwkJCQkJCWFkZEV4cGVjdGVkVHlwZShzY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE9wZXJhdG9ySWRzLkFORF9BTkQgOgorCQkJCQljYXNlIE9wZXJhdG9ySWRzLk9SX09SIDoKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5YT1IgOgorCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Cb29sZWFuQmluZGluZyk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLlNob3J0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkludEJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Mb25nQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkZsb2F0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkRvdWJsZUJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5DaGFyQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkJ5dGVCaW5kaW5nKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsKKwkJCQlzd2l0Y2gob3BlcmF0b3IpIHsKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5OT1QgOgorCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Cb29sZWFuQmluZGluZyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5UV0lERExFIDoKKwkJCQkJCWFkZEV4cGVjdGVkVHlwZShCYXNlVHlwZXMuU2hvcnRCaW5kaW5nKTsKKwkJCQkJCWFkZEV4cGVjdGVkVHlwZShCYXNlVHlwZXMuSW50QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkxvbmdCaW5kaW5nKTsKKwkJCQkJCWFkZEV4cGVjdGVkVHlwZShCYXNlVHlwZXMuQ2hhckJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5CeXRlQmluZGluZyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5QTFVTIDoKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VUyA6CisJCQkJCWNhc2UgT3BlcmF0b3JJZHMuUExVU19QTFVTIDoKKwkJCQkJY2FzZSBPcGVyYXRvcklkcy5NSU5VU19NSU5VUyA6CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLlNob3J0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkludEJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Mb25nQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkZsb2F0QmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkRvdWJsZUJpbmRpbmcpOworCQkJCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5DaGFyQmluZGluZyk7CisJCQkJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkJ5dGVCaW5kaW5nKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFycmF5UmVmZXJlbmNlKSB7CisJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLlNob3J0QmluZGluZyk7CisJCQlhZGRFeHBlY3RlZFR5cGUoQmFzZVR5cGVzLkludEJpbmRpbmcpOworCQkJYWRkRXhwZWN0ZWRUeXBlKEJhc2VUeXBlcy5Mb25nQmluZGluZyk7CiAJCX0KIAkJCi0JCVN5c3RlbS5hcnJheWNvcHkoZXhwZWN0ZWRUeXBlcywgMCwgZXhwZWN0ZWRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tleHBlY3RlZFR5cGVDb3VudF0sIDAsIGV4cGVjdGVkVHlwZUNvdW50KTsKKwkJaWYoZXhwZWN0ZWRUeXBlc1B0ciArIDEgIT0gZXhwZWN0ZWRUeXBlcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZXhwZWN0ZWRUeXBlcywgMCwgZXhwZWN0ZWRUeXBlcyA9IG5ldyBUeXBlQmluZGluZ1tleHBlY3RlZFR5cGVzUHRyICsgMV0sIDAsIGV4cGVjdGVkVHlwZXNQdHIgKyAxKTsKKwkJfQogCX0KLQlwcml2YXRlIGNoYXJbXVtdIGNvbXB1dGVOYW1lcyhjaGFyW10gc291cmNlTmFtZSwgYm9vbGVhbiBmb3JBcnJheSl7Ci0JCWNoYXJbXVtdIG5hbWVzID0gbmV3IGNoYXJbNV1bXTsKLQkJaW50IG5hbWVDb3VudCA9IDA7Ci0JCWJvb2xlYW4gcHJldmlvdXNJc1VwcGVyQ2FzZSA9IGZhbHNlOwotCQlmb3IoaW50IGkgPSBzb3VyY2VOYW1lLmxlbmd0aCAtIDEgOyBpID49IDAgOyBpLS0pewotCQkJYm9vbGVhbiBpc1VwcGVyQ2FzZSA9IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzb3VyY2VOYW1lW2ldKTsKLQkJCWlmKGlzVXBwZXJDYXNlICYmICFwcmV2aW91c0lzVXBwZXJDYXNlKXsKLQkJCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSxpLHNvdXJjZU5hbWUubGVuZ3RoKTsKLQkJCQlpZihuYW1lLmxlbmd0aCA+IDEpewotCQkJCQlpZihuYW1lQ291bnQgPT0gbmFtZXMubGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBuYW1lcyA9IG5ldyBjaGFyW25hbWVDb3VudCAqIDJdW10sIDAsIG5hbWVDb3VudCk7Ci0JCQkJCX0KLQkJCQkJbmFtZVswXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lWzBdKTsKLQkJCQkJCi0JCQkJCWlmKGZvckFycmF5KSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGg7Ci0JCQkJCQlpZiAobmFtZVtsZW5ndGgtMV0gPT0gJ3MnKXsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWUsIDAsIG5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAyXSwgMCwgbGVuZ3RoKTsKLQkJCQkJCQluYW1lW2xlbmd0aF0gPSAnZSc7Ci0JCQkJCQkJbmFtZVtsZW5ndGgrMV0gPSAncyc7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobmFtZSwgMCwgbmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOwotCQkJCQkJCW5hbWVbbGVuZ3RoXSA9ICdzJzsKKwkKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JBbGxvY2F0aW9uRXhwcmVzc2lvbigKKwkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nLAorCQlFeHByZXNzaW9uW10gYXJndW1lbnRzLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKKwkJCQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGJpbmRpbmcuYXZhaWxhYmxlTWV0aG9kcygpOworCQluZXh0TWV0aG9kIDogZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkKKwkJCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQorCQkJaWYgKG1ldGhvZC5pc1N5bnRoZXRpYygpKSBjb250aW51ZSBuZXh0TWV0aG9kOworCQkJCisJCQlpZiAob3B0aW9ucy5jaGVja1Zpc2liaWxpdHkgJiYgIW1ldGhvZC5jYW5CZVNlZW5CeShpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0TWV0aG9kOworCQkJCisJCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBtZXRob2QucGFyYW1ldGVyczsKKwkJCWlmKHBhcmFtZXRlcnMubGVuZ3RoIDwgYXJndW1lbnRzLmxlbmd0aCkKKwkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCQorCQkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOworCQkJCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJRXhwcmVzc2lvbiBhcmd1bWVudCA9IGFyZ3VtZW50c1tqXTsKKwkJCQlUeXBlQmluZGluZyBhcmdUeXBlID0gYXJndW1lbnQucmVzb2x2ZWRUeXBlOworCQkJCWlmKGFyZ1R5cGUgIT0gbnVsbCAmJiAhYXJnVHlwZS5pc0NvbXBhdGlibGVXaXRoKHBhcmFtZXRlcnNbal0pKQorCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJfQorCQkJCisJCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1thcmd1bWVudHMubGVuZ3RoIC0gMV07CisJCQlpZihleHBlY3RlZFR5cGUgIT0gbnVsbCkgeworCQkJCWFkZEV4cGVjdGVkVHlwZShleHBlY3RlZFR5cGUpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wdXRlRXhwZWN0ZWRUeXBlc0Zvck1lc3NhZ2VTZW5kRm9ySW50ZXJmYWNlKAorCQlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcsCisJCWNoYXJbXSBzZWxlY3RvciwKKwkJRXhwcmVzc2lvbltdIGFyZ3VtZW50cywKKwkJUmVmZXJlbmNlQmluZGluZyByZWNlaXZlclR5cGUsCisJCVNjb3BlIHNjb3BlLAorCQlJbnZvY2F0aW9uU2l0ZSBpbnZvY2F0aW9uU2l0ZSwKKwkJYm9vbGVhbiBpc1N0YXRpYykgeworCisJCVJlZmVyZW5jZUJpbmRpbmdbXSBpdHNJbnRlcmZhY2VzID0gYmluZGluZy5zdXBlckludGVyZmFjZXMoKTsKKwkJaWYgKGl0c0ludGVyZmFjZXMgIT0gTm9TdXBlckludGVyZmFjZXMpIHsKKwkJCVJlZmVyZW5jZUJpbmRpbmdbXVtdIGludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbNV1bXTsKKwkJCWludCBsYXN0UG9zaXRpb24gPSAwOworCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGxhc3RQb3NpdGlvbjsgaSsrKSB7CisJCQkJUmVmZXJlbmNlQmluZGluZ1tdIGludGVyZmFjZXMgPSBpbnRlcmZhY2VzVG9WaXNpdFtpXTsKKworCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBpbnRlcmZhY2VzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBpbnRlcmZhY2VzW2pdOworCisJCQkJCWlmICgoY3VycmVudFR5cGUudGFnQml0cyAmIFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZCkgPT0gMCkgeworCQkJCQkJLy8gaWYgaW50ZXJmYWNlIGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZAorCQkJCQkJY3VycmVudFR5cGUudGFnQml0cyB8PSBUYWdCaXRzLkludGVyZmFjZVZpc2l0ZWQ7CisJCisJCQkJCQljb21wdXRlRXhwZWN0ZWRUeXBlc0Zvck1lc3NhZ2VTZW5kKAorCQkJCQkJCWN1cnJlbnRUeXBlLAorCQkJCQkJCXNlbGVjdG9yLAorCQkJCQkJCWFyZ3VtZW50cywKKwkJCQkJCQlyZWNlaXZlclR5cGUsCisJCQkJCQkJc2NvcGUsCisJCQkJCQkJaW52b2NhdGlvblNpdGUsCisJCQkJCQkJaXNTdGF0aWMpOworCisJCQkJCQlpdHNJbnRlcmZhY2VzID0gY3VycmVudFR5cGUuc3VwZXJJbnRlcmZhY2VzKCk7CisJCQkJCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCisJCQkJCQkJaWYgKCsrbGFzdFBvc2l0aW9uID09IGludGVyZmFjZXNUb1Zpc2l0Lmxlbmd0aCkKKwkJCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0LAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0ID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGFzdFBvc2l0aW9uICogMl1bXSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQlsYXN0UG9zaXRpb24pOworCQkJCQkJCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSBpdHNJbnRlcmZhY2VzOwogCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQkJbmFtZXNbbmFtZUNvdW50KytdID0gbmFtZTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCXByZXZpb3VzSXNVcHBlckNhc2UgPSBpc1VwcGVyQ2FzZTsKLQkJfQotCQlpZihuYW1lQ291bnQgPT0gMCl7Ci0JCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2Uoc291cmNlTmFtZSk7Ci0JCQlpZihmb3JBcnJheSkgewotCQkJCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aDsKLQkJCQlpZiAobmFtZVtsZW5ndGgtMV0gPT0gJ3MnKXsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMl0sIDAsIGxlbmd0aCk7Ci0JCQkJCW5hbWVbbGVuZ3RoXSA9ICdlJzsKLQkJCQkJbmFtZVtsZW5ndGgrMV0gPSAncyc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7Ci0JCQkJCW5hbWVbbGVuZ3RoXSA9ICdzJzsKLQkJCQl9Ci0JCQl9CQkJCQkKLQkJCW5hbWVzW25hbWVDb3VudCsrXSA9IG5hbWU7CiAJCQkKKwkJCS8vIGJpdCByZWluaXRpYWxpemF0aW9uCisJCQlmb3IgKGludCBpID0gMDsgaSA8PSBsYXN0UG9zaXRpb247IGkrKykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlc1RvVmlzaXRbaV07CisKKwkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoID0gaW50ZXJmYWNlcy5sZW5ndGg7IGogPCBsZW5ndGg7IGorKyl7CisJCQkJCWludGVyZmFjZXNbal0udGFnQml0cyAmPSB+VGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkOworCQkJCX0KKwkJCX0KIAkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBuYW1lcyA9IG5ldyBjaGFyW25hbWVDb3VudF1bXSwgMCwgbmFtZUNvdW50KTsKLQkJcmV0dXJuIG5hbWVzOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUV4cGVjdGVkVHlwZXNGb3JNZXNzYWdlU2VuZCgKKwkJUmVmZXJlbmNlQmluZGluZyBiaW5kaW5nLAorCQljaGFyW10gc2VsZWN0b3IsCisJCUV4cHJlc3Npb25bXSBhcmd1bWVudHMsCisJCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlLAorCQlTY29wZSBzY29wZSwKKwkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUsCisJCWJvb2xlYW4gaXNTdGF0aWMpIHsKKwkJCQorCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGJpbmRpbmcuYXZhaWxhYmxlTWV0aG9kcygpOworCQluZXh0TWV0aG9kIDogZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlNZXRob2RCaW5kaW5nIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkKKwkJCWlmIChtZXRob2QuaXNTeW50aGV0aWMoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaWYgKG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQljb250aW51ZSBuZXh0TWV0aG9kOworCisJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKworCQkJaWYgKGlzU3RhdGljICYmICFtZXRob2QuaXNTdGF0aWMoKSkgY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQorCQkJaWYgKG9wdGlvbnMuY2hlY2tWaXNpYmlsaXR5ICYmICFtZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgc2NvcGUpKSBjb250aW51ZSBuZXh0TWV0aG9kOworCQkJCisJCQlpZighQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBzZWxlY3RvcikpIGNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQkKKwkJCVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZC5wYXJhbWV0ZXJzOworCQkJaWYocGFyYW1ldGVycy5sZW5ndGggPCBhcmd1bWVudHMubGVuZ3RoKQorCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQkJCisJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7CisJCQkKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQlFeHByZXNzaW9uIGFyZ3VtZW50ID0gYXJndW1lbnRzW2pdOworCQkJCVR5cGVCaW5kaW5nIGFyZ1R5cGUgPSBhcmd1bWVudC5yZXNvbHZlZFR5cGU7CisJCQkJaWYoYXJnVHlwZSAhPSBudWxsICYmICFhcmdUeXBlLmlzQ29tcGF0aWJsZVdpdGgocGFyYW1ldGVyc1tqXSkpCisJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQl9CisJCQkJCisJCQlUeXBlQmluZGluZyBleHBlY3RlZFR5cGUgPSBtZXRob2QucGFyYW1ldGVyc1thcmd1bWVudHMubGVuZ3RoIC0gMV07CisJCQlpZihleHBlY3RlZFR5cGUgIT0gbnVsbCkgeworCQkJCWFkZEV4cGVjdGVkVHlwZShleHBlY3RlZFR5cGUpOworCQkJfQorCQl9CisJfQorCXByaXZhdGUgdm9pZCBhZGRFeHBlY3RlZFR5cGUoVHlwZUJpbmRpbmcgdHlwZSl7CisJCWlmKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5pc1ZhbGlkQmluZGluZygpKSByZXR1cm47CisJCQorCQl0cnkgeworCQkJdGhpcy5leHBlY3RlZFR5cGVzWysrdGhpcy5leHBlY3RlZFR5cGVzUHRyXSA9IHR5cGU7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJaW50IG9sZExlbmd0aCA9IHRoaXMuZXhwZWN0ZWRUeXBlcy5sZW5ndGg7CisJCQlUeXBlQmluZGluZyBvbGRUeXBlc1tdID0gdGhpcy5leHBlY3RlZFR5cGVzOworCQkJdGhpcy5leHBlY3RlZFR5cGVzID0gbmV3IFR5cGVCaW5kaW5nW29sZExlbmd0aCAqIDJdOworCQkJU3lzdGVtLmFycmF5Y29weShvbGRUeXBlcywgMCwgdGhpcy5leHBlY3RlZFR5cGVzLCAwLCBvbGRMZW5ndGgpOworCQkJdGhpcy5leHBlY3RlZFR5cGVzW3RoaXMuZXhwZWN0ZWRUeXBlc1B0cl0gPSB0eXBlOworCQl9CisJfQorCXByaXZhdGUgdm9pZCBhZGRVbmludGVyZXN0aW5nQmluZGluZ3MoQmluZGluZyBiaW5kaW5nKXsKKwkJaWYoYmluZGluZyA9PSBudWxsKSByZXR1cm47CisJCXRyeSB7CisJCQl0aGlzLnVuaW50ZXJlc3RpbmdCaW5kaW5nc1srK3RoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzUHRyXSA9IGJpbmRpbmc7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJaW50IG9sZExlbmd0aCA9IHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzLmxlbmd0aDsKKwkJCUJpbmRpbmcgb2xkQmluZGluZ3NbXSA9IHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzOworCQkJdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3MgPSBuZXcgQmluZGluZ1tvbGRMZW5ndGggKiAyXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob2xkQmluZGluZ3MsIDAsIHRoaXMudW5pbnRlcmVzdGluZ0JpbmRpbmdzLCAwLCBvbGRMZW5ndGgpOworCQkJdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NbdGhpcy51bmludGVyZXN0aW5nQmluZGluZ3NQdHJdID0gYmluZGluZzsKKwkJfQogCX0KIAkKIAlwcml2YXRlIGNoYXJbXSBjb21wdXRlUHJlZml4KFNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmF0aW9uVHlwZSwgU291cmNlVHlwZUJpbmRpbmcgaW52b2NhdGlvblR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpewpAQCAtMjY4NiwxNyArMzQxOCw0IEBACiAJCQogCQlyZXR1cm4gY29tcGxldGlvbi50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CiAJfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0VuY2xvc2VkKFJlZmVyZW5jZUJpbmRpbmcgcG9zc2libGVFbmNsb3NpbmdUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGUpewotCQlpZih0eXBlLmlzTmVzdGVkVHlwZSgpKXsKLQkJCVJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQl3aGlsZShlbmNsb3NpbmcgIT0gbnVsbCApewotCQkJCWlmKHBvc3NpYmxlRW5jbG9zaW5nVHlwZSA9PSBlbmNsb3NpbmcpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVuY2xvc2luZyA9IGVuY2xvc2luZy5lbmNsb3NpbmdUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hSZXF1ZXN0b3IuamF2YQppbmRleCA4YTE0Mjg1Li4zMDU2MmRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0OwogCiAvKioKQEAgLTU3LDQgKzU3LDQgQEAKIAkgKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5LgogCSAqLwogCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQuamF2YQppbmRleCBmN2MxZjQ0Li4yN2U5MTFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CkBAIC00NSw0ICs0NSw0IEBACiAJICogdHlwZXMgYXJlIGZvdW5kIHJlbGF0aXZlIHRvIHRoZWlyIGVuY2xvc2luZyB0eXBlLgogCSAqLwogCXZvaWQgZmluZFR5cGVzKGNoYXJbXSBwcmVmaXgsIElTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L0lTZWxlY3Rpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGIwMDNkYWUuLjQ1YWQ4M2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvSVNlbGVjdGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKQEAgLTE0Miw0ICsxNDIsNCBAQAogCSAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuCiAJICovCiAJdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9SZWxldmFuY2VDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKaW5kZXggZmE1ZTE4ZS4uMzhkZTUzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9SZWxldmFuY2VDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1JlbGV2YW5jZUNvbnN0YW50cy5qYXZhCkBAIC0xLDIxICsxLDMzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Q7CiAKIHB1YmxpYyBpbnRlcmZhY2UgUmVsZXZhbmNlQ29uc3RhbnRzIHsKIAkKIAlpbnQgUl9ERUZBVUxUID0gMDsKKwlpbnQgUl9JTlRFUkVTVElORyA9IDU7CiAJaW50IFJfQ0FTRSA9IDEwOworCWludCBSX0VYQUNUX05BTUUgPSA0OwogCWludCBSX0VYUEVDVEVEX1RZUEUgPSAyMDsKKwlpbnQgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFID0gMzA7CiAJaW50IFJfSU5URVJGQUNFID0gMjA7CiAJaW50IFJfQ0xBU1MgPSAyMDsKIAlpbnQgUl9FWENFUFRJT04gPSAyMDsKKwlpbnQgUl9BQlNUUkFDVF9NRVRIT0QgPSAyMDsKKwlpbnQgUl9OT05fU1RBVElDID0gMTA7CisJaW50IFJfVU5RVUFMSUZJRUQgPSAzOworCWludCBSX05BTUVfRklSU1RfUFJFRklYID0gNjsKKwlpbnQgUl9OQU1FX1BSRUZJWCA9IDU7CisJaW50IFJfTkFNRV9GSVJTVF9TVUZGSVggPSA0OworCWludCBSX05BTUVfU1VGRklYID0gMzsKKwkKKwkKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvU2VsZWN0aW9uRW5naW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L1NlbGVjdGlvbkVuZ2luZS5qYXZhCmluZGV4IDY5ZDFlZGUuLjg1YzM0YjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvU2VsZWN0aW9uRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9TZWxlY3Rpb25FbmdpbmUuamF2YQpAQCAtMSwyMCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0OwogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CkBAIC0yMyw3ICsyMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIAogLyoqCkBAIC01Myw2ICs1MCw5IEBACiAJcHJpdmF0ZSBjaGFyW11bXVtdIGFjY2VwdGVkSW50ZXJmYWNlczsKIAlpbnQgYWNjZXB0ZWRDbGFzc2VzQ291bnQ7CiAJaW50IGFjY2VwdGVkSW50ZXJmYWNlc0NvdW50OworCQorCWJvb2xlYW4gbm9Qcm9wb3NhbCA9IHRydWU7CisJSVByb2JsZW0gcHJvYmxlbSA9IG51bGw7CiAKIAkvKioKIAkgKiBUaGUgU2VsZWN0aW9uRW5naW5lIGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgdGhlIHNlbGVjdGVkIG9iamVjdC4KQEAgLTg2LDEyICs4NiwzNyBAQAogCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAogCQkJCXRoaXMuY29tcGlsZXJPcHRpb25zLAogCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpIHsKLQkJCXB1YmxpYyB2b2lkIHJlY29yZChJUHJvYmxlbSBwcm9ibGVtLCBDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0LCBSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQpIHsKLQkJCQl1bml0UmVzdWx0LnJlY29yZChwcm9ibGVtLCByZWZlcmVuY2VDb250ZXh0KTsKLQkJCQlTZWxlY3Rpb25FbmdpbmUudGhpcy5yZXF1ZXN0b3IuYWNjZXB0RXJyb3IocHJvYmxlbSk7CisJCQkJCQorCQkJcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCisJCQkJY2hhcltdIGZpbGVOYW1lLAorCQkJCWludCBwcm9ibGVtSWQsCisJCQkJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwkJCQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAorCQkJCWludCBzZXZlcml0eSwKKwkJCQlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sCisJCQkJaW50IHByb2JsZW1FbmRQb3NpdGlvbiwKKwkJCQlpbnQgbGluZU51bWJlciwKKwkJCQlSZWZlcmVuY2VDb250ZXh0IHJlZmVyZW5jZUNvbnRleHQsCisJCQkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgeworCQkJCUlQcm9ibGVtIHByb2JsZW0gPSAgc3VwZXIuY3JlYXRlUHJvYmxlbSgKKwkJCQkJZmlsZU5hbWUsCisJCQkJCXByb2JsZW1JZCwKKwkJCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJbWVzc2FnZUFyZ3VtZW50cywKKwkJCQkJc2V2ZXJpdHksCisJCQkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAorCQkJCQlwcm9ibGVtRW5kUG9zaXRpb24sCisJCQkJCWxpbmVOdW1iZXIsCisJCQkJCXJlZmVyZW5jZUNvbnRleHQsCisJCQkJCXVuaXRSZXN1bHQpOworCQkJCQlpZihTZWxlY3Rpb25FbmdpbmUudGhpcy5wcm9ibGVtID09IG51bGwgJiYgcHJvYmxlbS5pc0Vycm9yKCkgJiYgKHByb2JsZW0uZ2V0SUQoKSAmIElQcm9ibGVtLlN5bnRheCkgPT0gMCkgeworCQkJCQkJU2VsZWN0aW9uRW5naW5lLnRoaXMucHJvYmxlbSA9IHByb2JsZW07CisJCQkJCX0KKworCQkJCQlyZXR1cm4gcHJvYmxlbTsKIAkJCX0KIAkJfTsKLQkJdGhpcy5wYXJzZXIgPSBuZXcgU2VsZWN0aW9uUGFyc2VyKHByb2JsZW1SZXBvcnRlciwgdGhpcy5jb21waWxlck9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJCXRoaXMucGFyc2VyID0gbmV3IFNlbGVjdGlvblBhcnNlcihwcm9ibGVtUmVwb3J0ZXIsIHRoaXMuY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpOwogCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0KIAkJCW5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCB0aGlzLmNvbXBpbGVyT3B0aW9ucywgcHJvYmxlbVJlcG9ydGVyLCBuYW1lRW52aXJvbm1lbnQpOwogCX0KQEAgLTEzMiw2ICsxNTcsNyBAQAogCQkJCWFjY2VwdGVkQ2xhc3Nlc1thY2NlcHRlZENsYXNzZXNDb3VudCsrXSA9IGFjY2VwdGVkQ2xhc3M7CiAJCQkJCiAJCQl9IGVsc2UgeworCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQkJCXBhY2thZ2VOYW1lLAogCQkJCQljbGFzc05hbWUsCkBAIC0xNzgsNiArMjA0LDcgQEAKIAkJCQlhY2NlcHRlZEludGVyZmFjZXNbYWNjZXB0ZWRJbnRlcmZhY2VzQ291bnQrK10gPSBhY2NlcHRlZEludGVyZmFjZTsKIAkJCQkKIAkJCX0gZWxzZSB7CisJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCiAJCQkJCXBhY2thZ2VOYW1lLAogCQkJCQlpbnRlcmZhY2VOYW1lLApAQCAtMjAyLDYgKzIyOSw3IEBACiAJCWlmKGFjY2VwdGVkQ2xhc3NlcyAhPSBudWxsKXsKIAkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXB0ZWRDbGFzc2VzQ291bnQ7IGkrKykgeworCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQkJCWFjY2VwdGVkQ2xhc3Nlc1tpXVswXSwKIAkJCQkJYWNjZXB0ZWRDbGFzc2VzW2ldWzFdLApAQCAtMjEzLDYgKzI0MSw3IEBACiAJCWlmKGFjY2VwdGVkSW50ZXJmYWNlcyAhPSBudWxsKXsKIAkJCWFjY2VwdGVkQW5zd2VyID0gdHJ1ZTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXB0ZWRJbnRlcmZhY2VzQ291bnQ7IGkrKykgeworCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0SW50ZXJmYWNlKAogCQkJCQlhY2NlcHRlZEludGVyZmFjZXNbaV1bMF0sCiAJCQkJCWFjY2VwdGVkSW50ZXJmYWNlc1tpXVsxXSwKQEAgLTI1OCw3ICsyODcsNyBAQAogCQkJaW50IG5leHRDaGFyYWN0ZXJQb3NpdGlvbiA9IHNlbGVjdGlvblN0YXJ0OwogCQkJY2hhciBjdXJyZW50Q2hhcmFjdGVyID0gJyAnOwogCQkJdHJ5IHsKLQkJCQl3aGlsZShjdXJyZW50UG9zaXRpb24gPiAwIHx8IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJyB8fCBjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpeworCQkJCXdoaWxlKGN1cnJlbnRQb3NpdGlvbiA+IDApewogCQkJCQkKIAkJCQkJaWYoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJyAmJiBzb3VyY2VbY3VycmVudFBvc2l0aW9uKzFdID09ICd1JykgewogCQkJCQkJaW50IHBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIDI7CkBAIC0yODksMjkgKzMxOCwyOCBAQAogCQkJCQl9CiAJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOwogCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCQkKIAkJCS8vIGNvbXB1dGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbGFzdCB0b2tlbgotCQkJc2Nhbm5lci5yZXNldFRvKG5leHRDaGFyYWN0ZXJQb3NpdGlvbiwgc2VsZWN0aW9uRW5kKTsKKwkJCXNjYW5uZXIucmVzZXRUbyhuZXh0Q2hhcmFjdGVyUG9zaXRpb24sIHNlbGVjdGlvbkVuZCArIDEpOwogCQkJZG8gewogCQkJCXRyeSB7CiAJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQotCQkJCWlmKCh0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXRoaXMgfHwKLQkJCQkJdG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzdXBlciB8fAotCQkJCQl0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXIpICYmCisJCQkJaWYoKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXRoaXMgfHwKKwkJCQkJdG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXIgfHwKKwkJCQkJdG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgJiYKIAkJCQkJc2Nhbm5lci5zdGFydFBvc2l0aW9uIDw9IHNlbGVjdGlvblN0YXJ0ICYmCiAJCQkJCXNlbGVjdGlvblN0YXJ0IDw9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKSB7CiAJCQkJCWxhc3RJZGVudGlmaWVyU3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CiAJCQkJCWxhc3RJZGVudGlmaWVyRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCQkJCQlsYXN0SWRlbnRpZmllciA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CiAJCQkJfQotCQkJfSB3aGlsZSAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpOworCQkJfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKIAkJfSBlbHNlIHsKIAkJCXNjYW5uZXIucmVzZXRUbyhzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKIAkKQEAgLTMyNCw5ICszNTIsOSBAQAogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQogCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXRoaXMgOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc3VwZXIgOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllciA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1ldGhpcyA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc3VwZXIgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgOgogCQkJCQkJaWYgKCFleHBlY3RpbmdJZGVudGlmaWVyKQogCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCWxhc3RJZGVudGlmaWVyID0gc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKQEAgLTM0MSwyMCArMzY5LDIwIEBACiAJCQkJCQlpZGVudENvdW50Kys7CiAJCQkJCQlleHBlY3RpbmdJZGVudGlmaWVyID0gZmFsc2U7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVCA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UIDoKIAkJCQkJCWlmIChleHBlY3RpbmdJZGVudGlmaWVyKQogCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCWVudGlyZVNlbGVjdGlvbi5hcHBlbmQoJy4nKTsKIAkJCQkJCWV4cGVjdGluZ0lkZW50aWZpZXIgPSB0cnVlOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRiA6CiAJCQkJCQlpZiAoZXhwZWN0aW5nSWRlbnRpZmllcikKIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdCA6CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJfQotCQkJfSB3aGlsZSAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpOworCQkJfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKIAkJfQogCQlpZiAobGFzdElkZW50aWZpZXJTdGFydCA+IDApIHsKIAkJCWFjdHVhbFNlbGVjdGlvblN0YXJ0ID0gbGFzdElkZW50aWZpZXJTdGFydDsKQEAgLTQxNyw2ICs0NDUsNyBAQAogCQkJCWlmIChwYXJzZWRVbml0LmN1cnJlbnRQYWNrYWdlIGluc3RhbmNlb2YgU2VsZWN0aW9uT25QYWNrYWdlUmVmZXJlbmNlKSB7CiAJCQkJCWNoYXJbXVtdIHRva2VucyA9CiAJCQkJCQkoKFNlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZSkgcGFyc2VkVW5pdC5jdXJyZW50UGFja2FnZSkudG9rZW5zOworCQkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJykpOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtNDI2LDYgKzQ1NSw3IEBACiAJCQkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmZXJlbmNlID0gaW1wb3J0c1tpXTsKIAkJCQkJCWlmIChpbXBvcnRSZWZlcmVuY2UgaW5zdGFuY2VvZiBTZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZSkgewogCQkJCQkJCWNoYXJbXVtdIHRva2VucyA9ICgoU2VsZWN0aW9uT25JbXBvcnRSZWZlcmVuY2UpIGltcG9ydFJlZmVyZW5jZSkudG9rZW5zOworCQkJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQkJCQlyZXF1ZXN0b3IuYWNjZXB0UGFja2FnZShDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgodG9rZW5zLCAnLicpKTsKIAkJCQkJCQluYW1lRW52aXJvbm1lbnQuZmluZFR5cGVzKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0b2tlbnMsICcuJyksIHRoaXMpOwogCQkJCQkJCS8vIGFjY2VwdCBxdWFsaWZpZWQgdHlwZXMgb25seSBpZiBubyB1bnF1YWxpZmllZCB0eXBlIHdhcyBhY2NlcHRlZApAQCAtNDM5LDYgKzQ2OSw5IEBACiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9CisJCQkJCQkJaWYobm9Qcm9wb3NhbCAmJiBwcm9ibGVtICE9IG51bGwpIHsKKwkJCQkJCQkJcmVxdWVzdG9yLmFjY2VwdEVycm9yKHByb2JsZW0pOworCQkJCQkJCX0KIAkJCQkJCQlyZXR1cm47CiAJCQkJCQl9CiAJCQkJCX0KQEAgLTQ3OSw2ICs1MTIsOSBAQAogCQkJCQlhY2NlcHRRdWFsaWZpZWRUeXBlcygpOwogCQkJCX0KIAkJCX0KKwkJCWlmKG5vUHJvcG9zYWwgJiYgcHJvYmxlbSAhPSBudWxsKSB7CisJCQkJcmVxdWVzdG9yLmFjY2VwdEVycm9yKHByb2JsZW0pOworCQkJfQogCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsgLy8gd29yay1hcm91bmQgaW50ZXJuYWwgZmFpbHVyZSAtIDFHRU1GNkQJCQogCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIGZvciBub3cgc2luY2UgaXQgdHlwaWNhbGx5IG1lYW5zIHdlIGNhbm5vdCBmaW5kIGphdmEubGFuZy5PYmplY3QKIAkJfSBmaW5hbGx5IHsKQEAgLTQ5NCw2ICs1MzAsNyBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJCWlmICh0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7CisJCQkJbm9Qcm9wb3NhbCA9IGZhbHNlOwogCQkJCXJlcXVlc3Rvci5hY2NlcHRJbnRlcmZhY2UoCiAJCQkJCXR5cGVCaW5kaW5nLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCiAJCQkJCXR5cGVCaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKQEAgLTUwNSwxMiArNTQyLDEzIEBACiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJUmVmZXJlbmNlQmluZGluZyBvcmlnaW5hbCA9IChSZWZlcmVuY2VCaW5kaW5nKSBwcm9ibGVtQmluZGluZy5vcmlnaW5hbDsKLQorCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQlyZXF1ZXN0b3IuYWNjZXB0Q2xhc3MoCiAJCQkJCW9yaWdpbmFsLnF1YWxpZmllZFBhY2thZ2VOYW1lKCksCiAJCQkJCW9yaWdpbmFsLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKIAkJCQkJZmFsc2UpOwogCQkJfSBlbHNlIHsKKwkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJcmVxdWVzdG9yLmFjY2VwdENsYXNzKAogCQkJCQl0eXBlQmluZGluZy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAogCQkJCQl0eXBlQmluZGluZy5xdWFsaWZpZWRTb3VyY2VOYW1lKCksCkBAIC01MjgsNiArNTY2LDcgQEAKIAkJCQkJcGFyYW1ldGVyUGFja2FnZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkUGFja2FnZU5hbWUoKTsKIAkJCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVyVHlwZXNbaV0ucXVhbGlmaWVkU291cmNlTmFtZSgpOwogCQkJCX0KKwkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJcmVxdWVzdG9yLmFjY2VwdE1ldGhvZCgKIAkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5xdWFsaWZpZWRQYWNrYWdlTmFtZSgpLAogCQkJCQltZXRob2RCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnF1YWxpZmllZFNvdXJjZU5hbWUoKSwKQEAgLTU0Miw2ICs1ODEsNyBAQAogCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nKSB7CiAJCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOwogCQkJCQlpZiAoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwpIHsgLy8gYXJyYXlsZW5ndGgKKwkJCQkJCW5vUHJvcG9zYWwgPSBmYWxzZTsKIAkJCQkJCXJlcXVlc3Rvci5hY2NlcHRGaWVsZCgKIAkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkUGFja2FnZU5hbWUoKSwKIAkJCQkJCQlmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MucXVhbGlmaWVkU291cmNlTmFtZSgpLApAQCAtNTU5LDYgKzU5OSw3IEBACiAJCQkJCQl9IGVsc2UKIAkJCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFBhY2thZ2VCaW5kaW5nKSB7CiAJCQkJCQkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gKFBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nOworCQkJCQkJCQlub1Byb3Bvc2FsID0gZmFsc2U7CiAJCQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRQYWNrYWdlKHBhY2thZ2VCaW5kaW5nLnJlYWRhYmxlTmFtZSgpKTsKIAkJCQkJCQkJYWNjZXB0ZWRBbnN3ZXIgPSB0cnVlOwogCQkJCQkJCX0gZWxzZQpAQCAtNTc4LDEwICs2MTksMTMgQEAKIAkgKiAgICAgIGEgdHlwZSBuYW1lIHdoaWNoIGlzIHRvIGJlIHJlc29sdmVkIGluIHRoZSBjb250ZXh0IG9mIGEgY29tcGlsYXRpb24gdW5pdC4KIAkgKgkJTk9URTogdGhlIHR5cGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZSBjb3JyZWN0bHkgcmVkdWNlZCAobm8gd2hpdGVzcGFjZXMsIG5vIHVuaWNvZGVzIGxlZnQpCiAJICogCisJICogQHBhcmFtIHRvcExldmVsVHlwZXMgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZVtdCisJICogICAgICBhIHNvdXJjZSBmb3JtIG9mIHRoZSB0b3AgbGV2ZWwgdHlwZXMgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaW4gd2hpY2ggY29kZSBhc3Npc3QgaXMgaW52b2tlZC4KKwogCSAqICBAcGFyYW0gc2VhcmNoSW5FbnZpcm9ubWVudAogCSAqIAlpZiA8Y29kZT50cnVlPC9jb2RlPiBhbmQgbm8gc2VsZWN0aW9uIGNvdWxkIGJlIGZvdW5kIGluIGNvbnRleHQgdGhlbiBzZWFyY2ggdHlwZSBpbiBlbnZpcm9ubWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RUeXBlKElTb3VyY2VUeXBlIHNvdXJjZVR5cGUsIGNoYXJbXSB0eXBlTmFtZSwgYm9vbGVhbiBzZWFyY2hJbkVudmlyb25tZW50KSB7CisJcHVibGljIHZvaWQgc2VsZWN0VHlwZShJU291cmNlVHlwZSBzb3VyY2VUeXBlLCBjaGFyW10gdHlwZU5hbWUsIElTb3VyY2VUeXBlW10gdG9wTGV2ZWxUeXBlcywgYm9vbGVhbiBzZWFyY2hJbkVudmlyb25tZW50KSB7CiAJCXRyeSB7CiAJCQlhY2NlcHRlZEFuc3dlciA9IGZhbHNlOwogCkBAIC01OTUsMTMgKzYzOSwxMyBAQAogCQkJLy8gY29tcHV0ZSBwYXJzZSB0cmVlIGZvciB0aGlzIG1vc3Qgb3V0ZXIgdHlwZQogCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KG91dGVyVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLmNvbXBpbGVyT3B0aW9ucy5tYXhQcm9ibGVtc1BlclVuaXQpOwogCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9Ci0JCQkJU291cmNlVHlwZUNvbnZlcnRlcgotCQkJCQkuYnVpbGRDb21waWxhdGlvblVuaXQoCi0JCQkJCQluZXcgSVNvdXJjZVR5cGVbXSB7IG91dGVyVHlwZSB9LAotCQkJCQkJZmFsc2UsCi0JCQkvLyBkb24ndCBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCi0JCQl0cnVlLCAvLyBieSBkZWZhdWx0IGdldCBtZW1iZXIgdHlwZXMKLQkJCXRoaXMucGFyc2VyLnByb2JsZW1SZXBvcnRlcigpLCByZXN1bHQpOworCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQkJCQl0b3BMZXZlbFR5cGVzLAorCQkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCQl0cnVlLCAvLyBuZWVkIG1lbWJlciB0eXBlcworCQkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCisJCQkJCQl0aGlzLnBhcnNlci5wcm9ibGVtUmVwb3J0ZXIoKSwgCisJCQkJCQlyZXN1bHQpOwogCiAJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsICYmIHBhcnNlZFVuaXQudHlwZXMgIT0gbnVsbCkgewogCQkJCWlmKERFQlVHKSB7CkBAIC02MzMsOCArNjc3LDcgQEAKIAkJCQkJCWZpZWxkLnR5cGUgPSBuZXcgU2VsZWN0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlKHR5cGVOYW1lLCAtMSk7CiAJCQkJCQkvLyBwb3NpdGlvbiBub3QgdXNlZAogCQkJCQl9IGVsc2UgewotCQkJCQkJcXVhbGlmaWVkU2VsZWN0aW9uID0gdHlwZU5hbWU7Ci0JCQkJCQljaGFyW11bXSBwcmV2aW91c0lkZW50aWZpZXJzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdHlwZU5hbWUsIDAsIGRvdCAtIDEpOworCQkJCQkJY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVOYW1lLCAwLCBkb3QpOwogCQkJCQkJY2hhcltdIHNlbGVjdGlvbklkZW50aWZpZXIgPQogCQkJCQkJCUNoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZU5hbWUsIGRvdCArIDEsIHR5cGVOYW1lLmxlbmd0aCk7CiAJCQkJCQl0aGlzLnNlbGVjdGVkSWRlbnRpZmllciA9IHNlbGVjdGlvbklkZW50aWZpZXI7CkBAIC02ODMsOSArNzI2LDExIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCQlpZihub1Byb3Bvc2FsICYmIHByb2JsZW0gIT0gbnVsbCkgeworCQkJCXJlcXVlc3Rvci5hY2NlcHRFcnJvcihwcm9ibGVtKTsKKwkJCX0KIAkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7IC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBmb3Igbm93IHNpbmNlIGl0IHR5cGljYWxseSBtZWFucyB3ZSBjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0CiAJCX0gZmluYWxseSB7Ci0JCQlxdWFsaWZpZWRTZWxlY3Rpb24gPSBudWxsOwogCQkJcmVzZXQoKTsKIAkJfQogCX0KQEAgLTczNSw0ICs3ODAsNCBAQAogCQl9CiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZURldGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTM4ZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworCisvKioKKyAqIERldGVjdCB0aGUgcHJlc2VuY2Ugb2YgYSBub2RlIGluIGV4cHJlc3Npb24KKyAqLworcHVibGljIGNsYXNzIENvbXBsZXRpb25Ob2RlRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlciB7CisJcHJpdmF0ZSBBc3ROb2RlIHNlYXJjaGVkTm9kZTsKKwlwcml2YXRlIEFzdE5vZGUgcGFyZW50OworCXByaXZhdGUgYm9vbGVhbiByZXN1bHQ7CisJCisJcHVibGljIENvbXBsZXRpb25Ob2RlRGV0ZWN0b3IoQXN0Tm9kZSBzZWFyY2hlZE5vZGUsIEFzdE5vZGUgdmlzaXRlZEFzdCl7CisJCXRoaXMuc2VhcmNoZWROb2RlID0gc2VhcmNoZWROb2RlOworCQl0aGlzLnJlc3VsdCA9IGZhbHNlOworCQkKKwkJaWYoc2VhcmNoZWROb2RlICE9IG51bGwgJiYgdmlzaXRlZEFzdCAhPSBudWxsKSB7CisJCQl2aXNpdGVkQXN0LnRyYXZlcnNlKHRoaXMsIG51bGwpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXB1YmxpYyBBc3ROb2RlIGdldENvbXBsZXRpb25Ob2RlUGFyZW50KCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChhbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFORF9BTkRfRXhwcmVzc2lvbiBhbmRfYW5kX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoYW5kX2FuZF9FeHByZXNzaW9uKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoYXJyYXlJbml0aWFsaXplcik7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChhcnJheVJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5VHlwZVJlZmVyZW5jZSBhcnJheVR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoYXJyYXlUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChhcnJheVR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoYXNzaWdubWVudCk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChiaW5hcnlFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoY2FzdEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb21wb3VuZEFzc2lnbm1lbnQgY29tcG91bmRBc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KGNvbXBvdW5kQXNzaWdubWVudCk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoY29uZGl0aW9uYWxFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoRXF1YWxFeHByZXNzaW9uIGVxdWFsRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChlcXVhbEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KGV4cGxpY2l0Q29uc3RydWN0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChmaWVsZFJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KGluc3RhbmNlT2ZFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQobWVzc2FnZVNlbmQpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChPUl9PUl9FeHByZXNzaW9uIG9yX29yX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQob3Jfb3JfRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KHBvc3RmaXhFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KHByZWZpeEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChxdWFsaWZpZWROYW1lUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQocXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHF1YWxpZmllZFRoaXNSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQocXVhbGlmaWVkVGhpc1JlZmVyZW5jZSk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChxdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KHF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJZW5kVmlzaXQoc2luZ2xlTmFtZVJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChzaW5nbGVUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCWVuZFZpc2l0KHNpbmdsZVR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlclJlZmVyZW5jZSBzdXBlclJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdChzdXBlclJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdCh0aGlzUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIHZvaWQgZW5kVmlzaXQoVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQllbmRWaXNpdCh1bmFyeUV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChhbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEFORF9BTkRfRXhwcmVzc2lvbiBhbmRfYW5kX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoYW5kX2FuZF9FeHByZXNzaW9uKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoYXJyYXlJbml0aWFsaXplcik7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoYXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChhcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVJlZmVyZW5jZSBhcnJheVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChhcnJheVJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZVJlZmVyZW5jZSBhcnJheVR5cGVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoYXJyYXlUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5VHlwZVJlZmVyZW5jZSwgQ2xhc3NTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChhcnJheVR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoYXNzaWdubWVudCk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChiaW5hcnlFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoY2FzdEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb21wb3VuZEFzc2lnbm1lbnQgY29tcG91bmRBc3NpZ25tZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KGNvbXBvdW5kQXNzaWdubWVudCk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoY29uZGl0aW9uYWxFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoRXF1YWxFeHByZXNzaW9uIGVxdWFsRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChlcXVhbEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KGV4cGxpY2l0Q29uc3RydWN0b3IpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChmaWVsZFJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KGluc3RhbmNlT2ZFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQobWVzc2FnZVNlbmQpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChPUl9PUl9FeHByZXNzaW9uIG9yX29yX0V4cHJlc3Npb24sIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQob3Jfb3JfRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KHBvc3RmaXhFeHByZXNzaW9uKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KHByZWZpeEV4cHJlc3Npb24pOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChxdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbik7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChxdWFsaWZpZWROYW1lUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UgcXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQocXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHF1YWxpZmllZFRoaXNSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQocXVhbGlmaWVkVGhpc1JlZmVyZW5jZSk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcXVhbGlmaWVkVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChxdWFsaWZpZWRUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KHF1YWxpZmllZFR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UsIEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJcmV0dXJuIHRoaXMudmlzaXQoc2luZ2xlTmFtZVJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVR5cGVSZWZlcmVuY2Ugc2luZ2xlVHlwZVJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChzaW5nbGVUeXBlUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiB0aGlzLnZpc2l0KHNpbmdsZVR5cGVSZWZlcmVuY2UpOworCX0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlclJlZmVyZW5jZSBzdXBlclJlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdChzdXBlclJlZmVyZW5jZSk7CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNSZWZlcmVuY2UgdGhpc1JlZmVyZW5jZSwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdCh0aGlzUmVmZXJlbmNlKTsKKwl9CisJcHVibGljIGJvb2xlYW4gdmlzaXQoVW5hcnlFeHByZXNzaW9uIHVuYXJ5RXhwcmVzc2lvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQlyZXR1cm4gdGhpcy52aXNpdCh1bmFyeUV4cHJlc3Npb24pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZW5kVmlzaXQoQXN0Tm9kZSBhc3ROb2RlKSB7CisJCWlmKHJlc3VsdCAmJiBwYXJlbnQgPT0gbnVsbCAmJiBhc3ROb2RlICE9IHNlYXJjaGVkTm9kZSkgeworCQkJaWYoIShhc3ROb2RlIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24gJiYgKChBbGxvY2F0aW9uRXhwcmVzc2lvbikgYXN0Tm9kZSkudHlwZSA9PSBzZWFyY2hlZE5vZGUpCisJCQkJJiYgIShhc3ROb2RlIGluc3RhbmNlb2YgQ29uZGl0aW9uYWxFeHByZXNzaW9uICYmICgoQ29uZGl0aW9uYWxFeHByZXNzaW9uKSBhc3ROb2RlKS52YWx1ZUlmVHJ1ZSA9PSBzZWFyY2hlZE5vZGUpCisJCQkJJiYgIShhc3ROb2RlIGluc3RhbmNlb2YgQ29uZGl0aW9uYWxFeHByZXNzaW9uICYmICgoQ29uZGl0aW9uYWxFeHByZXNzaW9uKSBhc3ROb2RlKS52YWx1ZUlmRmFsc2UgPT0gc2VhcmNoZWROb2RlKSkgeworCQkJCXBhcmVudCA9IGFzdE5vZGU7CQorCQkJfQorCQl9CisJfQorCXByaXZhdGUgYm9vbGVhbiB2aXNpdChBc3ROb2RlIGFzdE5vZGUpIHsKKwkJaWYoYXN0Tm9kZSA9PSBzZWFyY2hlZE5vZGUpIHsKKwkJCXJlc3VsdCA9IHRydWU7CisJCX0KKwkJcmV0dXJuICFyZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uTm9kZUZvdW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQppbmRleCA4N2ZjMmE3Li42NTFhNjI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Ob2RlRm91bmQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Bcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQXJndW1lbnROYW1lLmphdmEKaW5kZXggMGM4MzY0ZC4uNWNjYWNhZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Bcmd1bWVudE5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkFyZ3VtZW50TmFtZS5qYXZhCkBAIC0xLDI2ICsxLDI3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lIGV4dGVuZHMgQXJndW1lbnQgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBGQUtFTkFNRVNVRkZJWCA9ICIgIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIGNoYXJbXSByZWFsTmFtZTsKKwlwdWJsaWMgYm9vbGVhbiBpc0NhdGNoQXJndW1lbnQgPSBmYWxzZTsKIAlwdWJsaWMgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKGNoYXJbXSBuYW1lICwgbG9uZyBwb3NOb20gLCBUeXBlUmVmZXJlbmNlIHRyICwgaW50IG1vZGlmaWVycyl7CiAJCXN1cGVyKENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIEZBS0VOQU1FU1VGRklYKSwgcG9zTm9tLCB0ciwgbW9kaWZpZXJzKTsKIAkJdGhpcy5yZWFsTmFtZSA9IG5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQppbmRleCAxMzM4N2ExLi5lNzk4ODYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uQ2xhc3NSZWZlcmVuY2UuamF2YQppbmRleCA0MWM5MTIwLi5iN2I5YTAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkNsYXNzUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIHB1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKaW5kZXggZjMzYjExNi4uNjJjZTA2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4Y2VwdGlvblJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKaW5kZXggOTEyNTgzMS4uODliNTA0OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiAvKgpAQCAtNDEsNiArNDEsMTIgQEAKIH0KIHB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewogCVJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gc2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOworCQorCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgeworCQlpbnQgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CisJCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspCisJCQlhcmd1bWVudHNbYV0ucmVzb2x2ZVR5cGUoc2NvcGUpOworCX0KIAogCWlmIChhY2Nlc3NNb2RlICE9IFRoaXMgJiYgcmVjZWl2ZXJUeXBlICE9IG51bGwpIHsKIAkJaWYgKHJlY2VpdmVyVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25GaWVsZE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGROYW1lLmphdmEKaW5kZXggOWIwYzRkYy4uNmIyYTI0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25GaWVsZE5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkTmFtZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uRmllbGROYW1lIGV4dGVuZHMgRmllbGREZWNsYXJhdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEZBS0VOQU1FU1VGRklYID0gIiAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkZpZWxkVHlwZS5qYXZhCmluZGV4IDk2OWNjMGQuLmJlNGVkNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uRmllbGRUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25GaWVsZFR5cGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiAvKgpAQCAtMzEsNiArMzEsNyBAQAogICogYmVmb3JlIHRoZSBjdXJzb3IuCiAgKi8KICAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKQEAgLTQyLDcgKzQzLDcgQEAKIAl0aGlzLnNvdXJjZVN0YXJ0ID0gdHlwZS5zb3VyY2VTdGFydDsKIAl0aGlzLnNvdXJjZUVuZCA9IHR5cGUuc291cmNlRW5kOwogCXRoaXMudHlwZSA9IHR5cGU7Ci0JdGhpcy5uYW1lID0gTm9DaGFyOworCXRoaXMubmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAl0aGlzLmlzTG9jYWxWYXJpYWJsZSA9IGlzTG9jYWxWYXJpYWJsZTsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKaW5kZXggMGU2NDIyMC4uY2FiZGZlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25JbnRlcmZhY2VSZWZlcmVuY2UuamF2YQppbmRleCA1ZjdkNDNmLi4xZjAzYzE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uSW50ZXJmYWNlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkludGVyZmFjZVJlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFhMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkLmphdmEKQEAgLTAsMCArMSwxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKKworcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uT25LZXl3b3JkIHsKKwljaGFyW10gZ2V0VG9rZW4oKTsKKwljaGFyW11bXSBnZXRQb3NzaWJsZUtleXdvcmRzKCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1OGYwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDEuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKKworcHVibGljIGNsYXNzIENvbXBsZXRpb25PbktleXdvcmQxIGV4dGVuZHMgU2luZ2xlVHlwZVJlZmVyZW5jZSBpbXBsZW1lbnRzIENvbXBsZXRpb25PbktleXdvcmQgeworCXByaXZhdGUgY2hhcltdW10gcG9zc2libGVLZXl3b3JkczsKKwlwdWJsaWMgQ29tcGxldGlvbk9uS2V5d29yZDEoY2hhcltdIHRva2VuLCBsb25nIHBvcywgY2hhcltdIHBvc3NpYmxlS2V5d29yZCkgeworCQl0aGlzKHRva2VuLCBwb3MsIG5ldyBjaGFyW11bXXtwb3NzaWJsZUtleXdvcmR9KTsKKwl9CisJcHVibGljIENvbXBsZXRpb25PbktleXdvcmQxKGNoYXJbXSB0b2tlbiwgbG9uZyBwb3MsIGNoYXJbXVtdIHBvc3NpYmxlS2V5d29yZHMpIHsKKwkJc3VwZXIodG9rZW4sIHBvcyk7CisJCXRoaXMucG9zc2libGVLZXl3b3JkcyA9IHBvc3NpYmxlS2V5d29yZHM7CisJfQorCXB1YmxpYyBjaGFyW10gZ2V0VG9rZW4oKSB7CisJCXJldHVybiB0b2tlbjsKKwl9CisJcHVibGljIGNoYXJbXVtdIGdldFBvc3NpYmxlS2V5d29yZHMoKSB7CisJCXJldHVybiBwb3NzaWJsZUtleXdvcmRzOworCX0KKwlwdWJsaWMgdm9pZCBhYm91dFRvUmVzb2x2ZShTY29wZSBzY29wZSkgeworCQlnZXRUeXBlQmluZGluZyhzY29wZSk7CisJfQorCXB1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgeworCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBzY29wZSk7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKGludCB0YWIpeworCQlyZXR1cm4gIjxDb21wbGV0ZU9uS2V5d29yZDoiK25ldyBTdHJpbmcodG9rZW4pKyI+IjsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbktleXdvcmQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhNmNiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25LZXl3b3JkMiBleHRlbmRzIEltcG9ydFJlZmVyZW5jZSBpbXBsZW1lbnRzIENvbXBsZXRpb25PbktleXdvcmQgeworCXByaXZhdGUgY2hhcltdIHRva2VuOworCXByaXZhdGUgbG9uZyBwb3M7CisJcHJpdmF0ZSBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzOworCXB1YmxpYyBDb21wbGV0aW9uT25LZXl3b3JkMihjaGFyW10gdG9rZW4sIGxvbmcgcG9zLCBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzKSB7CisJCXN1cGVyKG5ldyBjaGFyW11bXXt0b2tlbn0sIG5ldyBsb25nW117cG9zfSwgZmFsc2UpOworCQl0aGlzLnRva2VuID0gdG9rZW47CisJCXRoaXMucG9zID0gcG9zOworCQl0aGlzLnBvc3NpYmxlS2V5d29yZHMgPSBwb3NzaWJsZUtleXdvcmRzOworCX0KKwlwdWJsaWMgY2hhcltdIGdldFRva2VuKCkgeworCQlyZXR1cm4gdG9rZW47CisJfQorCXB1YmxpYyBjaGFyW11bXSBnZXRQb3NzaWJsZUtleXdvcmRzKCkgeworCQlyZXR1cm4gcG9zc2libGVLZXl3b3JkczsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiLCBib29sZWFuIHdpdGhPbkRlbWFuZCkgeworCQlyZXR1cm4gIjxDb21wbGV0ZU9uS2V5d29yZDoiICsgbmV3IFN0cmluZyh0b2tlbikgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uS2V5d29yZDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGZhMDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25LZXl3b3JkMy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CisKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25LZXl3b3JkMyBleHRlbmRzIFNpbmdsZU5hbWVSZWZlcmVuY2UgaW1wbGVtZW50cyBDb21wbGV0aW9uT25LZXl3b3JkeworCXByaXZhdGUgY2hhcltdIHRva2VuOworCXByaXZhdGUgbG9uZyBwb3M7CisJcHJpdmF0ZSBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzOworCXB1YmxpYyBDb21wbGV0aW9uT25LZXl3b3JkMyhjaGFyW10gdG9rZW4sIGxvbmcgcG9zLCBjaGFyW10gcG9zc2libGVLZXl3b3JkKSB7CisJCXRoaXModG9rZW4sIHBvcywgbmV3IGNoYXJbXVtde3Bvc3NpYmxlS2V5d29yZH0pOworCX0KKwlwdWJsaWMgQ29tcGxldGlvbk9uS2V5d29yZDMoY2hhcltdIHRva2VuLCBsb25nIHBvcywgY2hhcltdW10gcG9zc2libGVLZXl3b3JkcykgeworCQlzdXBlcih0b2tlbiwgcG9zKTsKKwkJdGhpcy50b2tlbiA9IHRva2VuOworCQl0aGlzLnBvcyA9IHBvczsKKwkJdGhpcy5wb3NzaWJsZUtleXdvcmRzID0gcG9zc2libGVLZXl3b3JkczsKKwl9CisJcHVibGljIGNoYXJbXSBnZXRUb2tlbigpIHsKKwkJcmV0dXJuIHRva2VuOworCX0KKwlwdWJsaWMgY2hhcltdW10gZ2V0UG9zc2libGVLZXl3b3JkcygpIHsKKwkJcmV0dXJuIHBvc3NpYmxlS2V5d29yZHM7CisJfQorCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHNjb3BlKTsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisJCXJldHVybiAiPENvbXBsZXRlT25LZXl3b3JkOiIgKyBuZXcgU3RyaW5nKHRva2VuKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Mb2NhbE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTG9jYWxOYW1lLmphdmEKaW5kZXggMDdmMTE4NS4uZWNmMWQ0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25Mb2NhbE5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PbkxvY2FsTmFtZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxvY2FsRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25PbkxvY2FsTmFtZSBleHRlbmRzIExvY2FsRGVjbGFyYXRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVtYmVyQWNjZXNzLmphdmEKaW5kZXggOTliMTRlOS4uMmU4ZjZmYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZW1iZXJBY2Nlc3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lbWJlckFjY2Vzcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCkBAIC01NSw0ICs1NSw0IEBACiAJCXJldHVybiAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6IiAvLyROT04tTkxTLTEkCiAJCQkJCQkrIHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpICsgIj4iOyAvLyROT04tTkxTLTEkCiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWVzc2FnZVNlbmQuamF2YQppbmRleCA1OWQ0ZTU2Li5jZmY2MDY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25NZXNzYWdlU2VuZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCkBAIC0zOCw3ICszOCwxMyBAQAogcHVibGljIGNsYXNzIENvbXBsZXRpb25Pbk1lc3NhZ2VTZW5kIGV4dGVuZHMgTWVzc2FnZVNlbmQgewogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkJaWYgKHJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KQorCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGEgPSBhcmdzTGVuZ3RoOyAtLWEgPj0gMDspCisJCQkJYXJndW1lbnRzW2FdLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJfQorCQkKKwkJaWYgKHJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkpCiAJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCBudWxsLCBzY29wZSk7CiAKIAkJVHlwZUJpbmRpbmcgcmVjZWl2ZXJUeXBlID0gcmVjZWl2ZXIucmVzb2x2ZVR5cGUoc2NvcGUpOwpAQCAtNTMsNyArNTksNyBAQAogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgewogCiAJCVN0cmluZyBzID0gIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVjZWl2ZXIgIT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpCisJCWlmICghcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkKIAkJCXMgPSBzICsgcmVjZWl2ZXIudG9TdHJpbmdFeHByZXNzaW9uKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQKIAkJcyA9IHMgKyBuZXcgU3RyaW5nKHNlbGVjdG9yKSArICIoIjsgLy8kTk9OLU5MUy0xJAogCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKQEAgLTY3LDQgKzczLDQgQEAKIAkJcyA9IHMgKyAiKT4iOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kTmFtZS5qYXZhCmluZGV4IGRhZmNmOWQuLjI1YzBmZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kTmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kTmFtZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CkBAIC01OCw0ICs1OCw0IEBACiAJCXMgKz0gIj4iOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25Pbk1ldGhvZFJldHVyblR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCmluZGV4IDFkMDllOWUuLjIwNjcyNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZS5qYXZhCkBAIC0xLDE5ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5NZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwogCiBwdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZSBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uIHsKIAlwdWJsaWMgQ29tcGxldGlvbk9uTWV0aG9kUmV0dXJuVHlwZShUeXBlUmVmZXJlbmNlIHJldHVyblR5cGUsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KXsKQEAgLTIzLDEyICsyMiwxMiBAQAogCQl0aGlzLnNvdXJjZUVuZCA9IHJldHVyblR5cGUuc291cmNlRW5kOwogCX0KIAkKLQlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cyhDbGFzc1Njb3BlIHVwcGVyU2NvcGUpIHsKLQkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKHRoaXMsIHVwcGVyU2NvcGUpOworCXB1YmxpYyB2b2lkIHJlc29sdmVTdGF0ZW1lbnRzKCkgeworCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdGhpcy5zY29wZSk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgewogCQlyZXR1cm4gcmV0dXJuVHlwZS50b1N0cmluZyh0YWIpOwogCX0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKaW5kZXggMDE2YTJhOS4uMWVkZGU0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25QYWNrYWdlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCA3MmViNzU1Li4zMGViZDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCkBAIC0zOSwyNSArMzksMjkgQEAKIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGV4dGVuZHMgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24gewogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG51bGw7CisJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCWludCBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKKwkJZm9yIChpbnQgYSA9IGFyZ3NMZW5ndGg7IC0tYSA+PSAwOykKKwkJCWFyZ3VtZW50c1thXS5yZXNvbHZlVHlwZShzY29wZSk7CisJfQorCQogCWlmIChlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7CiAJCVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmICghKGVuY2xvc2luZ1R5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFByaW1pdGl2ZU9yQXJyYXlUeXBlRm9yRW5jbG9zaW5nSW5zdGFuY2UoZW5jbG9zaW5nVHlwZSwgZW5jbG9zaW5nSW5zdGFuY2UpOworCQlpZiAoZW5jbG9zaW5nVHlwZSA9PSBudWxsIHx8ICEoZW5jbG9zaW5nVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKSB7CiAJCQl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCgpOwogCQl9Ci0JCXR5cGVCaW5kaW5nID0gKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlKS5yZXNvbHZlVHlwZUVuY2xvc2luZyhzY29wZSwgKFJlZmVyZW5jZUJpbmRpbmcpIGVuY2xvc2luZ1R5cGUpOwotCQlpZiAoISh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKQorCQl0aGlzLnJlc29sdmVkVHlwZSA9ICgoU2luZ2xlVHlwZVJlZmVyZW5jZSkgdHlwZSkucmVzb2x2ZVR5cGVFbmNsb3Npbmcoc2NvcGUsIChSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdUeXBlKTsKKwkJaWYgKCEodGhpcy5yZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSkKIAkJCXRocm93IG5ldyBDb21wbGV0aW9uTm9kZUZvdW5kKCk7IC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgaXRzIGFuIGFycmF5IG9yIGJhc2UgdHlwZQotCQlpZiAodHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgLy8gaGFuZGxlIHRoZSBhbm9ueW1vdXMgY2xhc3MgZGVmaW5pdGlvbiBjYXNlCi0JCQl0eXBlQmluZGluZyA9IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCk7CisJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5pc0ludGVyZmFjZSgpKSAvLyBoYW5kbGUgdGhlIGFub255bW91cyBjbGFzcyBkZWZpbml0aW9uIGNhc2UKKwkJCXRoaXMucmVzb2x2ZWRUeXBlID0gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKIAl9IGVsc2UgewotCQl0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQlpZiAoISh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKQorCQl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoISh0aGlzLnJlc29sdmVkVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpKQogCQkJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQoKTsgLy8gbm8gbmVlZCB0byBjb250aW51ZSBpZiBpdHMgYW4gYXJyYXkgb3IgYmFzZSB0eXBlCiAJfQogCi0JdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgdHlwZUJpbmRpbmcsIHNjb3BlKTsKKwl0aHJvdyBuZXcgQ29tcGxldGlvbk5vZGVGb3VuZCh0aGlzLCB0aGlzLnJlc29sdmVkVHlwZSwgc2NvcGUpOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYikgewogCXJldHVybiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQ2xhc3NSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkQ2xhc3NSZWZlcmVuY2UuamF2YQppbmRleCA3NjMyMzhlLi4yOThiMDZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZENsYXNzUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRDbGFzc1JlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIHB1YmxpYyBjbGFzcyBDb21wbGV0aW9uT25RdWFsaWZpZWRDbGFzc1JlZmVyZW5jZSBleHRlbmRzIENvbXBsZXRpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlLmphdmEKaW5kZXggYmI4MmIyOS4uZjEzMzQxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEV4Y2VwdGlvblJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRJbnRlcmZhY2VSZWZlcmVuY2UuamF2YQppbmRleCBlNzg2ZGM3Li5mNGYzODcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkSW50ZXJmYWNlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25PblF1YWxpZmllZEludGVyZmFjZVJlZmVyZW5jZSAgZXh0ZW5kcyBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggNzdlMzQ1YS4uMjU3ZGExZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKaW5kZXggNmQ0YjRkOC4uNzg0NjljMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggZWZmYWEzNi4uN2M3YjlkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKQEAgLTM1LDggKzM1LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBTaW5nbGVOYW1lUmVmZXJlbmNlIHsKK3B1YmxpYyBjaGFyW11bXSBwb3NzaWJsZUtleXdvcmRzOworcHVibGljIGJvb2xlYW4gY2FuQmVFeHBsaWNpdENvbnN0cnVjdG9yOwogcHVibGljIENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSwgbG9uZyBwb3MpIHsKKwl0aGlzKHNvdXJjZSwgcG9zLCBudWxsLCBmYWxzZSk7Cit9CitwdWJsaWMgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZShjaGFyW10gc291cmNlLCBsb25nIHBvcywgY2hhcltdW10gcG9zc2libGVLZXl3b3JkcywgYm9vbGVhbiBjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IpIHsKIAlzdXBlcihzb3VyY2UsIHBvcyk7CisJdGhpcy5wb3NzaWJsZUtleXdvcmRzID0gcG9zc2libGVLZXl3b3JkczsKKwl0aGlzLmNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9IGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvcjsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJdGhyb3cgbmV3IENvbXBsZXRpb25Ob2RlRm91bmQodGhpcywgc2NvcGUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQppbmRleCAyOGVlMGQyLi4xODkxZTcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiAvKgpAQCAtNjAsNCArNjAsNyBAQAogCiAJcmV0dXJuICI8Q29tcGxldGVPblR5cGU6IiArIG5ldyBTdHJpbmcodG9rZW4pICsgIj4iIDsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiB9CitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCXJldHVybiB0aGlzLnRvU3RyaW5nRXhwcmVzc2lvbigwKTsKK30KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uUGFyc2VyLmphdmEKaW5kZXggMmIyYTIwYy4uYTkwZTEzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uUGFyc2VyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5jb21wbGV0ZTsKIAogLyoKQEAgLTI1LDM3ICsyNSw2NSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuKjsKIAogcHVibGljIGNsYXNzIENvbXBsZXRpb25QYXJzZXIgZXh0ZW5kcyBBc3Npc3RQYXJzZXIgeworCS8vIE9XTkVSCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVElPTl9QQVJTRVIgPSAxMDI0OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiA9IEFTU0lTVF9QQVJTRVIgKyBDT01QTEVUSU9OX1BBUlNFUjsKKwkKKwkvLyBLSU5EIDogYWxsIHZhbHVlcyBrbm93biBieSBDb21wbGV0aW9uUGFyc2VyIGFyZSBiZXR3ZWVuIDEwMjUgYW5kIDE1NDkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JMT0NLX0RFTElNSVRFUiA9IENPTVBMRVRJT05fUEFSU0VSICsgMTsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgYmxvY2sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSA9IENPTVBMRVRJT05fUEFSU0VSICsgMjsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgbWVzc2FnZSBzZW5kCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19TRUxFQ1RPUl9RVUFMSUZJRVIgPSBDT01QTEVUSU9OX1BBUlNFUiArIDM7IC8vIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIG1lc3NhZ2Ugc2VuZAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4gPSBDT01QTEVUSU9OX1BBUlNFUiArIDQ7IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ2NhdGNoJyBhbmQgdGhlIGZvbGxvd2luZyAnKScKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX05FWFRfVFlQRVJFRl9JU19DTEFTUyA9IENPTVBMRVRJT05fUEFSU0VSICsgNTsgLy8gd2hldGhlciB0aGUgbmV4dCB0eXBlIHJlZmVyZW5jZSBpcyBhIGNsYXNzCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19ORVhUX1RZUEVSRUZfSVNfSU5URVJGQUNFID0gQ09NUExFVElPTl9QQVJTRVIgKyA2OyAvLyB3aGV0aGVyIHRoZSBuZXh0IHR5cGUgcmVmZXJlbmNlIGlzIGFuIGludGVyZmFjZQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfTkVYVF9UWVBFUkVGX0lTX0VYQ0VQVElPTiA9IENPTVBMRVRJT05fUEFSU0VSICsgNzsgLy8gd2hldGhlciB0aGUgbmV4dCB0eXBlIHJlZmVyZW5jZSBpcyBhbiBleGNlcHRpb24KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDg7IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ25ldycgYW5kIHRoZSBmb2xsb3dpbmcgbGVmdCBicmFrZXQsIGllLiAnWycsICcoJyBvciAneycKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0lOU0lERV9USFJPV19TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDk7IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ3Rocm93JyBhbmQgdGhlIGVuZCBvZiBhIHRocm93IHN0YXRlbWVudAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfSU5TSURFX1JFVFVSTl9TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDEwOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuIHRoZSBrZXl3b3JkICdyZXR1cm4nIGFuZCB0aGUgZW5kIG9mIGEgcmV0dXJuIHN0YXRlbWVudAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQ0FTVF9TVEFURU1FTlQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDExOyAvLyB3aGV0aGVyIHdlIGFyZSBiZXR3ZWVuICcpJyBhbmQgdGhlIGVuZCBvZiBhIGNhc3Qgc3RhdGVtZW50CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19MT0NBTF9JTklUSUFMSVpFUl9ERUxJTUlURVIgPSBDT01QTEVUSU9OX1BBUlNFUiArIDEyOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQVJSQVlfSU5JVElBTElaRVIgPSBDT01QTEVUSU9OX1BBUlNFUiArIDEzOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQVJSQVlfQ1JFQVRJT04gPSBDT01QTEVUSU9OX1BBUlNFUiArIDE0OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfVU5BUllfT1BFUkFUT1IgPSBDT01QTEVUSU9OX1BBUlNFUiArIDE1OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQklOQVJZX09QRVJBVE9SID0gQ09NUExFVElPTl9QQVJTRVIgKyAxNjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0FTU0lTR05NRU5UX09QRVJBVE9SID0gQ09NUExFVElPTl9QQVJTRVIgKyAxNzsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0NPTkRJVElPTkFMX09QRVJBVE9SID0gQ09NUExFVElPTl9QQVJTRVIgKyAxODsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JFVFdFRU5fSUZfQU5EX1JJR0hUX1BBUkVOID0gQ09NUExFVElPTl9QQVJTRVIgKyAxOTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JFVFdFRU5fV0hJTEVfQU5EX1JJR0hUX1BBUkVOID0gQ09NUExFVElPTl9QQVJTRVIgKyAyMDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTiA9IENPTVBMRVRJT05fUEFSU0VSICsgMjE7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU4gPSBDT01QTEVUSU9OX1BBUlNFUiArIDIyOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQkVUV0VFTl9TWU5DSFJPTklaRURfQU5EX1JJR0hUX1BBUkVOID0gQ09NUExFVElPTl9QQVJTRVIgKyAyMzsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0lOU0lERV9BU1NFUlRfU1RBVEVNRU5UID0gQ09NUExFVElPTl9QQVJTRVIgKyAyNDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX1NXSVRDSF9MQUJFTD0gQ09NUExFVElPTl9QQVJTRVIgKyAyNTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04gPSBDT01QTEVUSU9OX1BBUlNFUiArIDI2OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfQkVUV0VFTl9ERUZBVUxUX0FORF9DT0xPTiA9IENPTVBMRVRJT05fUEFSU0VSICsgMjc7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19CRVRXRUVOX0xFRlRfQU5EX1JJR0hUX0JSQUNLRVQgPSBDT01QTEVUSU9OX1BBUlNFUiArIDI4OworCQogCiAJLyogcHVibGljIGZpZWxkcyAqLwogCiAJcHVibGljIGludCBjdXJzb3JMb2NhdGlvbjsKLQlwdWJsaWMgY2hhcltdW10gbGFiZWxzOyAvLyB0aGUgdmlzaWJsZSBsYWJlbHMgdXAgdG8gdGhlIGN1cnNvciBsb2NhdGlvbgogCXB1YmxpYyBBc3ROb2RlIGFzc2lzdE5vZGVQYXJlbnQ7IC8vIHRoZSBwYXJlbnQgbm9kZSBvZiBhc3Npc3Qgbm9kZQogCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpbnRlcm5hbCBmbGFncyAqLwogCQotCWJvb2xlYW4gYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQ7IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ25ldycgYW5kIHRoZSBmb2xsb3dpbmcgbGVmdCBicmFrZXQsIGllLiAnWycsICcoJyBvciAneycKLQlib29sZWFuIGJldHdlZW5DYXRjaEFuZFJpZ2h0UGFyZW47IC8vIHdoZXRoZXIgd2UgYXJlIGJldHdlZW4gdGhlIGtleXdvcmQgJ2NhdGNoJyBhbmQgdGhlIGZvbGxvd2luZyAnKScKLQlib29sZWFuIGNvbXBsZXRpb25CZWhpbmREb3Q7IC8vIHRydWUgd2hlbiBjb21wbGV0aW9uIGlkZW50aWZpZXIgaW1tZWRpYXRlbHkgZm9sbG93cyBhIGRvdAorCS8vIGJsb2NrIGtpbmQKKwlzdGF0aWMgZmluYWwgaW50IElGID0gMTsKKwlzdGF0aWMgZmluYWwgaW50IFRSWSA9IDI7CisJc3RhdGljIGZpbmFsIGludCBDQVRDSCA9IDM7CisJc3RhdGljIGZpbmFsIGludCBXSElMRSA9IDQ7CisJc3RhdGljIGZpbmFsIGludCBTV0lUQ0ggPSA1OworCXN0YXRpYyBmaW5hbCBpbnQgRk9SID0gNjsKKwlzdGF0aWMgZmluYWwgaW50IERPID0gNzsKKwlzdGF0aWMgZmluYWwgaW50IFNZTkNIUk9OSVpFRCA9IDg7CisJc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSA5OwogCQotCWJvb2xlYW4gbmV4dFR5cGVSZWZlcmVuY2VJc0NsYXNzOwotCWJvb2xlYW4gbmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbjsKLQlib29sZWFuIG5leHRUeXBlUmVmZXJlbmNlSXNJbnRlcmZhY2U7CisJLy8gbGFiZWwga2luZAorCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVCA9IDE7CiAJCi0JaW50IGJyYWNrZXREZXB0aDsKLQlpbnQgdGhyb3dCcmFja2V0RGVwdGg7Ci0KLQkvLyB0aGUgc3RhY2tzIG9mIHR5cGVzIGFuZCBxdWFsaWZpZXJzIGZvciBpbnZvY2F0aW9ucyAoaWUuIG1ldGhvZCBpbnZvY2F0aW9ucywgYWxsb2NhdGlvbiBleHByZXNzaW9ucyBhbmQKLQkvLyBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucykuIFRoZXkgdXNlIHRoZSBzYW1lIHN0YWNrIHBvaW50ZXIgYXMgdGhlIHNlbGVjdG9yIHN0YWNrIChpZS4gaW52b2NhdGlvblB0cikKLQkvLyB0aGUgaW52b2NhdGlvbiB0eXBlIHN0YWNrIGNvbnRhaW5zIG9uZSBvZiB0aGUgaW52b2NhdGlvbiB0eXBlIGNvbnN0YW50cyBiZWxvdwotCS8vIHRoZSBxdWFsaWZpZXIgc3RhY2sgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGV4cHJlc3Npb24gc3RhY2sgb3IgLTEgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVyCi0JLy8gKGEgcXVhbGlmaWVyIGlzIHRoZSBleHByZXNzaW9uIHRoYXQgcXVhbGlmaWVzIGEgJ25ldycsIGEgJ3N1cGVyJyBjb25zdHJ1Y3RvciBvciBhICd0aGlzJyBjb25zdHJ1Y3RvcgotCS8vICBvciBpdCBpcyB0aGUgcmVjZWl2ZXIgb2YgYSBtZXNzYWdlIHNlbmQpCi0JaW50W10gaW52b2NhdGlvblR5cGVTdGFjayA9IG5ldyBpbnRbU3RhY2tJbmNyZW1lbnRdOwotCWludFtdIHF1YWxpZmllclN0YWNrID0gbmV3IGludFtTdGFja0luY3JlbWVudF07Ci0KIAkvLyBpbnZvY2F0aW9uIHR5cGUgY29uc3RhbnRzCiAJc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVF9SRUNFSVZFUiA9IDA7CiAJc3RhdGljIGZpbmFsIGludCBOT19SRUNFSVZFUiA9IC0xOwpAQCAtNjMsNiArOTEsOSBAQAogCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9SRUNFSVZFUiA9IC0zOwogCXN0YXRpYyBmaW5hbCBpbnQgQUxMT0NBVElPTiA9IC00OwogCXN0YXRpYyBmaW5hbCBpbnQgUVVBTElGSUVEX0FMTE9DQVRJT04gPSAtNTsKKwkKKwlzdGF0aWMgZmluYWwgaW50IFFVRVNUSU9OID0gMTsKKwlzdGF0aWMgZmluYWwgaW50IENPTE9OID0gMjsKIAogCS8vIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24gKG9uZSBvZiB0aGUgaW52b2NhdGlvbiB0eXBlIGNvbnN0YW50cykKIAlpbnQgaW52b2NhdGlvblR5cGU7CkBAIC03MCwyMyArMTAxLDIwIEBACiAJLy8gYSBwb2ludGVyIGluIHRoZSBleHByZXNzaW9uIHN0YWNrIHRvIHRoZSBxdWFsaWZpZXIgb2YgYSBpbnZvY2F0aW9uCiAJaW50IHF1YWxpZmllcjsKIAotCS8vIGEgc3RhY2sgb2YgbGFiZWwgY291bnRlcnMKLQkvLyBhIG5ldyBjb3VudGVyIGlzIHB1c2hlZCBvbiB0aGUgc3RhY2sgZWFjaCB0aW1lIHdoZW4gYSBtZXRob2QgKG9yIGEgY29uc3RydWN0b3IpIGlzIGVudGVyZWQsIAotCS8vIGl0IGlzIHBvcGVkIHdoZW4gdGhlIG1ldGhvZCAob3IgY29uc3RydWN0b3IpIGlzIGV4aXRlZCwKLQkvLyBpdCBpcyBpbmNyZW1lbnRlZCB3aGVuIGEgbmV3IGxhYmVsIGlzIGRlZmluZWQKLQlpbnQgbGFiZWxDb3VudGVyUHRyOwotCWludFtdIGxhYmVsQ291bnRlclN0YWNrID0gbmV3IGludFtTdGFja0luY3JlbWVudF07Ci0KLQkvLyBhIHN0YWNrIG9mIGludm9jYXRpb25QdHI6IGNvbnRhaW5zIHRoZSBmaXJzdCBpbnZvY2F0aW9uUHRyIG9mIGEgYmxvY2sKLQkvLyB0aGUgY3VycmVudCBpbnZvY2F0aW9uUHRyKzEgaXMgcHVzaGVkIHdoZW4gYSBibG9jayBpcyBlbnRlcmVkCi0JLy8gaXQgaXMgcG9wZWQgd2hlbiBhIGJsb2NrIGlzIGV4aXRlZCAKLQlpbnQgYmxvY2tJbnZvY2F0aW9uUHRyOwotCWludFtdIGJsb2NrSW52b2NhdGlvblN0YWNrID0gbmV3IGludFtTdGFja0luY3JlbWVudF07Ci0JCiAJLy8gbGFzdCBtb2RpZmllcnMgaW5mbwogCWludCBsYXN0TW9kaWZpZXJzID0gQWNjRGVmYXVsdDsKIAlpbnQgbGFzdE1vZGlmaWVyc1N0YXJ0ID0gLTE7CiAJCisJLy8gZGVwdGggb2YgJygnLCAneycgYW5kICdbXScKKwlpbnQgYnJhY2tldERlcHRoOworCQorCS8vIHNob3cgaWYgdGhlIGN1cnJlbnQgdG9rZW4gY2FuIGJlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yCisJaW50IGNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9IE5POworCXN0YXRpYyBmaW5hbCBpbnQgTk8gPSAwOworCXN0YXRpYyBmaW5hbCBpbnQgTkVYVFRPS0VOID0gMTsKKwlzdGF0aWMgZmluYWwgaW50IFlFUyA9IDI7CisJCisJCiBwdWJsaWMgQ29tcGxldGlvblBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBib29sZWFuIGFzc2VydE1vZGUpIHsKIAlzdXBlcihwcm9ibGVtUmVwb3J0ZXIsIGFzc2VydE1vZGUpOwogfQpAQCAtOTQsMTAgKzEyMiwxOCBAQAogCXJldHVybiAoKENvbXBsZXRpb25TY2FubmVyKXNjYW5uZXIpLmNvbXBsZXRpb25JZGVudGlmaWVyOwogfQogcHJvdGVjdGVkIHZvaWQgYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKXsKKwlpZihhc3Npc3ROb2RlID09IG51bGwpIHJldHVybjsKKwkKIAlpZiAodGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlKSB7CiAJCUFzdE5vZGUgb3JwaGFuID0gdGhpcy5hc3Npc3ROb2RlOwogCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSBmYWxzZTsKIAkJCisJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpeworCQkJaWYgKG9ycGhhbiBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSl7CisJCQkJY3VycmVudEVsZW1lbnQuYWRkKChJbXBvcnRSZWZlcmVuY2Upb3JwaGFuLCAwKTsKKwkJCX0KKwkJfQorCQkKIAkJLyogaWYgaW4gY29udGV4dCBvZiBhIHR5cGUsIHRoZW4gcGVyc2lzdHMgdGhlIGlkZW50aWZpZXIgaW50byBhIGZha2UgZmllbGQgcmV0dXJuIHR5cGUgKi8KIAkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CiAJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKQEAgLTE1MiwzNCArMTg4LDMyNCBAQAogCX0KIAkKIAkvLyB0aGUgZm9sbG93aW5nIGNvZGUgYXBwbGllcyBvbmx5IGluIG1ldGhvZHMsIGNvbnN0cnVjdG9ycyBvciBpbml0aWFsaXplcnMKLQlpZiAoKCF0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gJiYgIXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHJdKSkgeyAKKwlpZiAoKCFpc0luc2lkZU1ldGhvZCgpICYmICFpc0luc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkpIHsgCiAJCXJldHVybjsKIAl9CiAJCiAJLy8gcHVzaCB0b3AgZXhwcmVzc2lvbiBvbiBhc3Qgc3RhY2sgaWYgaXQgY29udGFpbnMgdGhlIGNvbXBsZXRpb24gbm9kZQogCUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQlpZiAodGhpcy5leHByZXNzaW9uUHRyID4gLTEgJiYgY29udGFpbnNDb21wbGV0aW9uTm9kZShleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSkpIHsKLQkJLyogY2hlY2sgZm9yIGNvbXBsZXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBtZXRob2QgYm9keQotCQkJYmVoaW5kIGFuIGludmFsaWQgc2lnbmF0dXJlCi0JCSAqLwotCQlSZWNvdmVyZWRNZXRob2QgbWV0aG9kID0gY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nTWV0aG9kKCk7Ci0JCWlmIChtZXRob2QgIT0gbnVsbCl7Ci0JCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBtZXRob2QubWV0aG9kRGVjbGFyYXRpb247Ci0JCQlpZiAoKG1ldGhvZERlY2wuYm9keVN0YXJ0ID09IG1ldGhvZERlY2wuc291cmNlRW5kKzEpIC8vIHdhcyBtaXNzaW5nIG9wZW5pbmcgYnJhY2UKLQkJCQkmJiAoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKGV4cHJlc3Npb24uc291cmNlU3RhcnQpID09IHNjYW5uZXIuZ2V0TGluZU51bWJlcihtZXRob2REZWNsLnNvdXJjZUVuZCkpKXsKLQkJCQlyZXR1cm47CisJaWYgKHRoaXMuZXhwcmVzc2lvblB0ciA+IC0xKSB7CisJCWV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb25TdGFja1t0aGlzLmV4cHJlc3Npb25QdHJdOworCQlDb21wbGV0aW9uTm9kZURldGVjdG9yIGRldGVjdG9yID0gbmV3IENvbXBsZXRpb25Ob2RlRGV0ZWN0b3IoYXNzaXN0Tm9kZSwgZXhwcmVzc2lvbik7CisJCWlmKGRldGVjdG9yLmNvbnRhaW5zQ29tcGxldGlvbk5vZGUoKSkgeworCQkJLyogY2hlY2sgZm9yIGNvbXBsZXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBtZXRob2QgYm9keQorCQkJCWJlaGluZCBhbiBpbnZhbGlkIHNpZ25hdHVyZQorCQkJICovCisJCQlSZWNvdmVyZWRNZXRob2QgbWV0aG9kID0gY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nTWV0aG9kKCk7CisJCQlpZiAobWV0aG9kICE9IG51bGwpeworCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IG1ldGhvZC5tZXRob2REZWNsYXJhdGlvbjsKKwkJCQlpZiAoKG1ldGhvZERlY2wuYm9keVN0YXJ0ID09IG1ldGhvZERlY2wuc291cmNlRW5kKzEpIC8vIHdhcyBtaXNzaW5nIG9wZW5pbmcgYnJhY2UKKwkJCQkJJiYgKHNjYW5uZXIuZ2V0TGluZU51bWJlcihleHByZXNzaW9uLnNvdXJjZVN0YXJ0KSA9PSBzY2FubmVyLmdldExpbmVOdW1iZXIobWV0aG9kRGVjbC5zb3VyY2VFbmQpKSl7CisJCQkJCXJldHVybjsKKwkJCQl9CiAJCQl9Ci0JCX0KLQkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBbGxvY2F0aW9uRXhwcmVzc2lvbikgewotCQkJLy8ga2VlcCB0aGUgY29udGV4dCBpZiBpdCBpcyBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24KLQkJCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KXdyYXBXaXRoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxJZk5lZWRlZChleHByZXNzaW9uKTsKLQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKHN0YXRlbWVudCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCl3cmFwV2l0aEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsSWZOZWVkZWQodGhpcy5hc3Npc3ROb2RlKTsKLQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKHN0YXRlbWVudCwgMCk7CisJCQlpZihleHByZXNzaW9uID09IGFzc2lzdE5vZGUKKwkJCQl8fCAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFsbG9jYXRpb25FeHByZXNzaW9uCisJCQkJCSYmICgoQWxsb2NhdGlvbkV4cHJlc3Npb24pZXhwcmVzc2lvbikudHlwZSA9PSBhc3Npc3ROb2RlKSl7CisJCQkJYnVpbGRNb3JlQ29tcGxldGlvbkNvbnRleHQoZXhwcmVzc2lvbik7CisJCQl9IGVsc2UgeworCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBkZXRlY3Rvci5nZXRDb21wbGV0aW9uTm9kZVBhcmVudCgpOworCQkJCWlmKGFzc2lzdE5vZGVQYXJlbnQgIT0gbnVsbCkgeworCQkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZCgoU3RhdGVtZW50KWFzc2lzdE5vZGVQYXJlbnQsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGV4cHJlc3Npb24sIDApOworCQkJCX0KKwkJCX0KIAkJfQogCX0KIH0KK3ByaXZhdGUgdm9pZCBidWlsZE1vcmVDb21wbGV0aW9uQ29udGV4dChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZXhwcmVzc2lvbjsKKwlpbnQga2luZCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKTsKKwlpZihraW5kICE9IDApIHsKKwkJaW50IGluZm8gPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CisJCW5leHRFbGVtZW50IDogc3dpdGNoIChraW5kKSB7CisJCQljYXNlIEtfU0VMRUNUT1JfUVVBTElGSUVSIDoKKwkJCQlpbnQgc2VsZWN0b3IgPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMik7CisJCQkJaWYoc2VsZWN0b3IgPT0gVEhJU19DT05TVFJVQ1RPUiB8fCBzZWxlY3RvciA9PSBTVVBFUl9DT05TVFJVQ1RPUikgeworCQkJCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjYWxsID0gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKAorCQkJCQkJKHNlbGVjdG9yID09IFRISVNfQ09OU1RSVUNUT1IpID8gCisJCQkJCQkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyA6IAorCQkJCQkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyCisJCQkJCSk7CisJCQkJCWNhbGwuYXJndW1lbnRzID0gbmV3IEV4cHJlc3Npb25bXSB7ZXhwcmVzc2lvbn07CisJCQkJCWNhbGwuc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OworCQkJCQljYWxsLnNvdXJjZUVuZCA9IGV4cHJlc3Npb24uc291cmNlRW5kOworCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gY2FsbDsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaW52b2NhdGlvblR5cGUgPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwxKTsKKwkJCQkJaW50IHF1YWxpZmllckV4cHJQdHIgPSBpbmZvOworCQkJCQkKKwkJCQkJLy8gZmluZCBhcmd1bWVudHMKKwkJCQkJaW50IGxlbmd0aCA9IGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyXTsKKwkJCQkJCisJCQkJCS8vIHNlYXJjaCBwcmV2aW91cyBhcmd1bWVudHMgaWYgbWlzc2luZworCQkJCQlpZihleHByZXNzaW9uTGVuZ3RoUHRyID4gMCAmJiBsZW5ndGggPT0gMSkgeworCQkJCQkJaW50IHN0YXJ0ID0gKGludCkgKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW3NlbGVjdG9yXSA+Pj4gMzIpOworCQkJCQkJaWYodGhpcy5leHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0xXSAhPSBudWxsICYmIHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItMV0uc291cmNlU3RhcnQgPiBzdGFydCkgeworCQkJCQkJCWxlbmd0aCArPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0ci0xXTs7CQorCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJCisJCQkJCUV4cHJlc3Npb25bXSBhcmd1bWVudHMgPSBudWxsOworCQkJCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCQkJCWFyZ3VtZW50cyA9IG5ldyBFeHByZXNzaW9uW2xlbmd0aF07CisJCQkJCQlleHByZXNzaW9uUHRyIC09IGxlbmd0aDsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXhwcmVzc2lvblN0YWNrLCBleHByZXNzaW9uUHRyICsgMSwgYXJndW1lbnRzLCAwLCBsZW5ndGgtMSk7CisJCQkJCQlhcmd1bWVudHNbbGVuZ3RoLTFdID0gZXhwcmVzc2lvbjsKKwkJCQkJfTsKKwkJCQkJCisJCQkJCWlmKGludm9jYXRpb25UeXBlICE9IEFMTE9DQVRJT04gJiYgaW52b2NhdGlvblR5cGUgIT0gUVVBTElGSUVEX0FMTE9DQVRJT04pIHsKKwkJCQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gbmV3IE1lc3NhZ2VTZW5kKCk7CisJCQkJCQltZXNzYWdlU2VuZC5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tzZWxlY3Rvcl07CisJCQkJCQltZXNzYWdlU2VuZC5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisJCisJCQkJCQkvLyBmaW5kIHJlY2VpdmVyCisJCQkJCQlzd2l0Y2ggKGludm9jYXRpb25UeXBlKSB7CisJCQkJCQkJY2FzZSBOT19SRUNFSVZFUjoKKwkJCQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLmltcGxpY2l0VGhpcygpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIE5BTUVfUkVDRUlWRVI6CisJCQkJCQkJCS8vIHJlbW92ZSBzcGVjaWFsIGZsYWdzIGZvciBwcmltaXRpdmUgdHlwZXMKKwkJCQkJCQkJd2hpbGUgKHRoaXMuaWRlbnRpZmllckxlbmd0aFB0ciA+PSAwICYmIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gPCAwKSB7CisJCQkJCQkJCQl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHItLTsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJLy8gcmVtb3ZlIHNlbGVjdG9yIAorCQkJCQkJCQl0aGlzLmlkZW50aWZpZXJQdHItLTsgCisJCQkJCQkJCXRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0tLTsKKwkJCQkJCQkJLy8gY29uc3VtZSB0aGUgcmVjZWl2ZXIKKwkJCQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSB0aGlzLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgU1VQRVJfUkVDRUlWRVI6CisJCQkJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gbmV3IFN1cGVyUmVmZXJlbmNlKDAsIDApOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIEVYUExJQ0lUX1JFQ0VJVkVSOgorCQkJCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3F1YWxpZmllckV4cHJQdHJdOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0IDoKKwkJCQkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLmltcGxpY2l0VGhpcygpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBtZXNzYWdlU2VuZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmKGludm9jYXRpb25UeXBlID09IEFMTE9DQVRJT04pIHsKKwkJCQkJCQlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhbGxvY2F0aW9uRXhwciA9IG5ldyBBbGxvY2F0aW9uRXhwcmVzc2lvbigpOworCQkJCQkJCWFsbG9jYXRpb25FeHByLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKwkJCQkJCQlhbGxvY2F0aW9uRXhwci50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwkJCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHI7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByID0gbmV3IFF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKCk7CisJCQkJCQkJYWxsb2NhdGlvbkV4cHIuZW5jbG9zaW5nSW5zdGFuY2UgPSB0aGlzLmV4cHJlc3Npb25TdGFja1txdWFsaWZpZXJFeHByUHRyXTsKKwkJCQkJCQlhbGxvY2F0aW9uRXhwci5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisJCQkJCQkJYWxsb2NhdGlvbkV4cHIudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJCQkJCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGFsbG9jYXRpb25FeHByOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX0lOU0lERV9SRVRVUk5fU1RBVEVNRU5UIDoKKwkJCQlpZihpbmZvID09IGJyYWNrZXREZXB0aCkgeworCQkJCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gbmV3IFJldHVyblN0YXRlbWVudChleHByZXNzaW9uLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCk7CisJCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSByZXR1cm5TdGF0ZW1lbnQ7CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX0NBU1RfU1RBVEVNRU5UIDoKKwkJCQlFeHByZXNzaW9uIGNhc3RUeXBlOworCQkJCWlmKHRoaXMuZXhwcmVzc2lvblB0ciA+IDAKKwkJCQkJJiYgKChjYXN0VHlwZSA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0ci0xXSkgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlCisJCQkJCQl8fCBjYXN0VHlwZSBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpKSB7CisJCQkJCUNhc3RFeHByZXNzaW9uIGNhc3QgPSBuZXcgQ2FzdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZ2V0VHlwZVJlZmVyZW5jZShjYXN0VHlwZSkpOworCQkJCQljYXN0LnNvdXJjZVN0YXJ0ID0gY2FzdFR5cGUuc291cmNlU3RhcnQ7CisJCQkJCWNhc3Quc291cmNlRW5kPSBleHByZXNzaW9uLnNvdXJjZUVuZDsKKwkJCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGNhc3Q7CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX1VOQVJZX09QRVJBVE9SIDoKKwkJCQlpZihleHByZXNzaW9uUHRyID4gLTEpIHsKKwkJCQkJRXhwcmVzc2lvbiBvcGVyYXRvckV4cHJlc3Npb24gPSBudWxsOworCQkJCQlzd2l0Y2ggKGluZm8pIHsKKwkJCQkJCWNhc2UgUExVU19QTFVTIDoKKwkJCQkJCQlvcGVyYXRvckV4cHJlc3Npb24gPSBuZXcgUHJlZml4RXhwcmVzc2lvbihleHByZXNzaW9uLEludExpdGVyYWwuT25lLCBQTFVTLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgTUlOVVNfTUlOVVMgOgorCQkJCQkJCW9wZXJhdG9yRXhwcmVzc2lvbiA9IG5ldyBQcmVmaXhFeHByZXNzaW9uKGV4cHJlc3Npb24sSW50TGl0ZXJhbC5PbmUsIE1JTlVTLCBleHByZXNzaW9uLnNvdXJjZVN0YXJ0KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCW9wZXJhdG9yRXhwcmVzc2lvbiA9IG5ldyBVbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgaW5mbyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYob3BlcmF0b3JFeHByZXNzaW9uICE9IG51bGwpIHsKKwkJCQkJCWFzc2lzdE5vZGVQYXJlbnQgPSBvcGVyYXRvckV4cHJlc3Npb247CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfQklOQVJZX09QRVJBVE9SIDoKKwkJCQlpZihleHByZXNzaW9uUHRyID4gMCkgeworCQkJCQlFeHByZXNzaW9uIG9wZXJhdG9yRXhwcmVzc2lvbiA9IG51bGw7CisJCQkJCXN3aXRjaCAoaW5mbykgeworCQkJCQkJY2FzZSBBTkRfQU5EIDoKKwkJCQkJCQlvcGVyYXRvckV4cHJlc3Npb24gPSBuZXcgQU5EX0FORF9FeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItMV0sIGV4cHJlc3Npb24sIGluZm8pOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBPUl9PUiA6CisJCQkJCQkJb3BlcmF0b3JFeHByZXNzaW9uID0gbmV3IE9SX09SX0V4cHJlc3Npb24odGhpcy5leHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0xXSwgZXhwcmVzc2lvbiwgaW5mbyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEVRVUFMX0VRVUFMIDoKKwkJCQkJCWNhc2UgTk9UX0VRVUFMIDoKKwkJCQkJCQlvcGVyYXRvckV4cHJlc3Npb24gPSBuZXcgRXF1YWxFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItMV0sIGV4cHJlc3Npb24sIGluZm8pOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJTlNUQU5DRU9GIDoKKwkJCQkJCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCW9wZXJhdG9yRXhwcmVzc2lvbiA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItMV0sIGV4cHJlc3Npb24sIGluZm8pOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmKG9wZXJhdG9yRXhwcmVzc2lvbiAhPSBudWxsKSB7CisJCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gb3BlcmF0b3JFeHByZXNzaW9uOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX0FSUkFZX0lOSVRJQUxJWkVSIDoKKwkJCQlBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBuZXcgQXJyYXlJbml0aWFsaXplcigpOworCQkJCWFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltde2V4cHJlc3Npb259OworCQkJCWV4cHJlc3Npb25QdHIgLT0gZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV07CisJCQkJCisJCQkJaWYoZXhwcmVzc2lvbkxlbmd0aFB0ciA+IC0xCisJCQkJCSYmIGV4cHJlc3Npb25QdHIgPiAtMQorCQkJCQkmJiB0aGlzLmV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSAhPSBudWxsCisJCQkJCSYmIHRoaXMuZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdLnNvdXJjZVN0YXJ0ID4gaW5mbykgeworCQkJCQlleHByZXNzaW9uTGVuZ3RoUHRyLS07CQorCQkJCX0KKwkJCQkJCisJCQkJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKKwkJCQkKKwkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUiwgMSkgPT0gS19BUlJBWV9DUkVBVElPTikgeworCQkJCQlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gbmV3IEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwkJCQkJYWxsb2NhdGlvbkV4cHJlc3Npb24udHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJCQkJCWludCBsZW5ndGggPSBleHByZXNzaW9uTGVuZ3RoU3RhY2tbZXhwcmVzc2lvbkxlbmd0aFB0cl07CisJCQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLmRpbWVuc2lvbnMgPSBuZXcgRXhwcmVzc2lvbltsZW5ndGhdOworCisJCQkJCWFsbG9jYXRpb25FeHByZXNzaW9uLmluaXRpYWxpemVyID0gYXJyYXlJbml0aWFsaXplcjsKKwkJCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGFsbG9jYXRpb25FeHByZXNzaW9uOworCQkJCX0gZWxzZSBpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkKSB7CisJCQkJCVJlY292ZXJlZEZpZWxkIHJlY292ZXJlZEZpZWxkID0gKFJlY292ZXJlZEZpZWxkKSBjdXJyZW50RWxlbWVudDsKKwkJCQkJaWYocmVjb3ZlcmVkRmllbGQuZmllbGREZWNsYXJhdGlvbi50eXBlLmRpbWVuc2lvbnMoKSA9PSAwKSB7CisJCQkJCQlCbG9jayBibG9jayA9IG5ldyBCbG9jaygwKTsKKwkJCQkJCWJsb2NrLnNvdXJjZVN0YXJ0ID0gaW5mbzsKKwkJCQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGJsb2NrLCAxKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0YXRlbWVudCA9IGFycmF5SW5pdGlhbGl6ZXI7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSB7CisJCQkJCVJlY292ZXJlZExvY2FsVmFyaWFibGUgcmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSA9IChSZWNvdmVyZWRMb2NhbFZhcmlhYmxlKSBjdXJyZW50RWxlbWVudDsKKwkJCQkJaWYocmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5sb2NhbERlY2xhcmF0aW9uLnR5cGUuZGltZW5zaW9ucygpID09IDApIHsKKwkJCQkJCUJsb2NrIGJsb2NrID0gbmV3IEJsb2NrKDApOworCQkJCQkJYmxvY2suc291cmNlU3RhcnQgPSBpbmZvOworCQkJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoYmxvY2ssIDEpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhdGVtZW50ID0gYXJyYXlJbml0aWFsaXplcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXN0YXRlbWVudCA9IGFycmF5SW5pdGlhbGl6ZXI7CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX0FSUkFZX0NSRUFUSU9OIDoKKwkJCQlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jYXRpb25FeHByZXNzaW9uID0gbmV3IEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwkJCQlhbGxvY2F0aW9uRXhwcmVzc2lvbi5kaW1lbnNpb25zID0gbmV3IEV4cHJlc3Npb25bXXtleHByZXNzaW9ufTsKKwkJCQkKKwkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYWxsb2NhdGlvbkV4cHJlc3Npb247CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfQVNTSVNHTk1FTlRfT1BFUkFUT1IgOgorCQkJCWlmKGV4cHJlc3Npb25QdHIgPiAwICYmIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyIC0gMV0gIT0gbnVsbCkgeworCQkJCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQ7CisJCQkJCWlmKGluZm8gPT0gRVFVQUwpIHsKKwkJCQkJCWFzc2lnbm1lbnQgPSBuZXcgQXNzaWdubWVudCgKKwkJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ciAtIDFdLAorCQkJCQkJCWV4cHJlc3Npb24sCisJCQkJCQkJZXhwcmVzc2lvbi5zb3VyY2VFbmQKKwkJCQkJCSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhc3NpZ25tZW50ID0gbmV3IENvbXBvdW5kQXNzaWdubWVudCgKKwkJCQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ciAtIDFdLAorCQkJCQkJCWV4cHJlc3Npb24sCisJCQkJCQkJaW5mbywKKwkJCQkJCQlleHByZXNzaW9uLnNvdXJjZUVuZAorCQkJCQkJKTsKKwkJCQkJfQorCQkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYXNzaWdubWVudDsKKwkJCQl9CisJCQkJYnJlYWsgbmV4dEVsZW1lbnQ7CisJCQljYXNlIEtfQ09ORElUSU9OQUxfT1BFUkFUT1IgOgorCQkJCWlmKGluZm8gPT0gUVVFU1RJT04pIHsKKwkJCQkJaWYoZXhwcmVzc2lvblB0ciA+IDApIHsKKwkJCQkJCWV4cHJlc3Npb25QdHItLTsKKwkJCQkJCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzFdOworCQkJCQkJcG9wRWxlbWVudChLX0NPTkRJVElPTkFMX09QRVJBVE9SKTsKKwkJCQkJCWJ1aWxkTW9yZUNvbXBsZXRpb25Db250ZXh0KGV4cHJlc3Npb24pOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYoZXhwcmVzc2lvblB0ciA+IDEpIHsKKwkJCQkJCWV4cHJlc3Npb25QdHIgPSBleHByZXNzaW9uUHRyIC0gMjsKKwkJCQkJCWV4cHJlc3Npb25MZW5ndGhQdHIgPSBleHByZXNzaW9uTGVuZ3RoUHRyIC0gMjsKKwkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzJdOworCQkJCQkJcG9wRWxlbWVudChLX0NPTkRJVElPTkFMX09QRVJBVE9SKTsKKwkJCQkJCWJ1aWxkTW9yZUNvbXBsZXRpb25Db250ZXh0KGV4cHJlc3Npb24pOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrIG5leHRFbGVtZW50OworCQkJY2FzZSBLX0JFVFdFRU5fTEVGVF9BTkRfUklHSFRfQlJBQ0tFVCA6CisJCQkJQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWZlcmVuY2U7CisJCQkJaWYoaWRlbnRpZmllclB0ciA8IDAgJiYgZXhwcmVzc2lvblB0ciA+IDAgJiYgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdID09IGV4cHJlc3Npb24pIHsKKwkJCQkJYXJyYXlSZWZlcmVuY2UgPQorCQkJCQkJbmV3IEFycmF5UmVmZXJlbmNlKAorCQkJCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLTFdLAorCQkJCQkJCWV4cHJlc3Npb24pOworCQkJCX0gZWxzZSB7CisJCQkJCWFycmF5UmVmZXJlbmNlID0KKwkJCQkJCW5ldyBBcnJheVJlZmVyZW5jZSgKKwkJCQkJCQlnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpLAorCQkJCQkJCWV4cHJlc3Npb24pOworCQkJCX0KKwkJCQlhc3Npc3ROb2RlUGFyZW50ID0gYXJyYXlSZWZlcmVuY2U7CisJCQkJYnJlYWs7CisJCQkJCisJCX0KKwl9CisJaWYoYXNzaXN0Tm9kZVBhcmVudCAhPSBudWxsKSB7CisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKChTdGF0ZW1lbnQpYXNzaXN0Tm9kZVBhcmVudCwgMCk7CisJfSBlbHNlIHsKKwkJaWYoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZAorCQkJJiYgKChSZWNvdmVyZWRGaWVsZCkgY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgeworCQkJCisJCQlhc3Npc3ROb2RlUGFyZW50ID0gKChSZWNvdmVyZWRGaWVsZCkgY3VycmVudEVsZW1lbnQpLmZpZWxkRGVjbGFyYXRpb247CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQl9IGVsc2UgaWYoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRMb2NhbFZhcmlhYmxlCisJCQkmJiAoKFJlY292ZXJlZExvY2FsVmFyaWFibGUpIGN1cnJlbnRFbGVtZW50KS5sb2NhbERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uID09IG51bGwpIHsKKwkJCQorCQkJYXNzaXN0Tm9kZVBhcmVudCA9ICgoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSkgY3VycmVudEVsZW1lbnQpLmxvY2FsRGVjbGFyYXRpb247CisJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LmFkZChzdGF0ZW1lbnQsIDApOworCQl9IGVsc2UgeworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoZXhwcmVzc2lvbiwgMCk7CisJCX0KKwl9Cit9CisKIHB1YmxpYyBpbnQgYm9keUVuZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCl7CiAJcmV0dXJuIGN1cnNvckxvY2F0aW9uOwogfQpAQCAtMTkxLDEwICs1MTcsMTIgQEAKICAqIFJldHVybnMgd2hldGhlciB3ZSBmb3VuZCBhIGNvbXBsZXRpb24gbm9kZS4KICAqLwogcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2F0Y2hDbGF1c2UoKSB7Ci0JaWYgKHRoaXMuYmV0d2VlbkNhdGNoQW5kUmlnaHRQYXJlbiAmJiB0aGlzLmlkZW50aWZpZXJQdHIgPiAtMSkgeyAKKwlpZiAoKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOKSAmJiB0aGlzLmlkZW50aWZpZXJQdHIgPiAtMSkgeyAKIAkJLy8gTkI6IGlmIHRoZSBjdXJzb3IgaXMgb24gdGhlIHZhcmlhYmxlLCB0aGVuIGl0IGhhcyBiZWVuIHJlZHVjZWQgKHNvIGlkZW50aWZpZXJQdHIgaXMgLTEpLCAKIAkJLy8gICAgIHRodXMgdGhpcyBjYW4gb25seSBiZSBhIGNvbXBsZXRpb24gb24gdGhlIHR5cGUgb2YgdGhlIGNhdGNoIGNsYXVzZQorCQlwdXNoT25FbGVtZW50U3RhY2soS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKIAkJdGhpcy5hc3Npc3ROb2RlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwkJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04pOwogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CiAJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CiAJCXJldHVybiB0cnVlOwpAQCAtMjA2LDE0ICs1MzQsMTggQEAKICAqIFJldHVybnMgd2hldGhlciB3ZSBmb3VuZCBhIGNvbXBsZXRpb24gbm9kZS4KICAqLwogcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkgewotCWlmICh0aGlzLmJldHdlZW5OZXdBbmRMZWZ0QnJha2V0KSB7CisJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQpIHsKIAkJLy8gY29tcGxldGlvbiBvbiB0eXBlIGluc2lkZSBhbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24KIAkJCi0JCWlmKHRoaXMudGhyb3dCcmFja2V0RGVwdGggIT0gLTEgJiYgdGhpcy50aHJvd0JyYWNrZXREZXB0aCA9PSB0aGlzLmJyYWNrZXREZXB0aCkgewotCQkJdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzRXhjZXB0aW9uID0gdHJ1ZTsJCisJCVR5cGVSZWZlcmVuY2UgdHlwZTsKKwkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSBLX0lOU0lERV9USFJPV19TVEFURU1FTlQKKwkJCSYmIHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKSA9PSB0aGlzLmJyYWNrZXREZXB0aCkgeworCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfTkVYVF9UWVBFUkVGX0lTX0VYQ0VQVElPTik7CisJCQl0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKKwkJCXBvcEVsZW1lbnQoS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKDApOwogCQl9Ci0JCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7Ci0JCXRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbiA9IGZhbHNlOwogCQl0aGlzLmFzc2lzdE5vZGUgPSB0eXBlOwogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gdHlwZS5zb3VyY2VFbmQgKyAxOwogCQlpZiAodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBBTExPQ0FUSU9OKSB7CkBAIC0yMzQsNiArNTY2LDcgQEAKIAkJCXRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMucXVhbGlmaWVyXSA9IGFsbG9jRXhwcjsgLy8gYXR0YWNoIGl0IG5vdyAoaXQgcmVwbGFjZXMgdGhlIHF1YWxpZmllciBleHByZXNzaW9uKQogCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CiAJCX0KKwkJcG9wRWxlbWVudChLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJcmV0dXJuIGZhbHNlOwpAQCAtMjk2LDYgKzYyOSw4OSBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9Citwcml2YXRlIGJvb2xlYW4gY2hlY2tLZXl3b3JkKCkgeworCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpIHsKKwkJUmVjb3ZlcmVkVW5pdCB1bml0ID0gKFJlY292ZXJlZFVuaXQpIGN1cnJlbnRFbGVtZW50OworCQlpbnQgaW5kZXggPSAtMTsKKwkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgeworCQkJY2hhcltdIGlkZW50ID0gaWRlbnRpZmllclN0YWNrW2luZGV4XTsKKwkJCWxvbmcgcG9zID0gaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdOworCQkJCisJCQljaGFyW11bXSBrZXl3b3JkcyA9IG5ldyBjaGFyW0tleXdvcmRzLkNPVU5UXVtdOworCQkJaW50IGNvdW50ID0gMDsKKwkJCWlmKHVuaXQudHlwZUNvdW50ID09IDAKKwkJCQkmJiBsYXN0TW9kaWZpZXJzID09IEFjY0RlZmF1bHQKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhpZGVudGlmaWVyU3RhY2tbaW5kZXhdLCBLZXl3b3Jkcy5JTVBPUlQpKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5JTVBPUlQ7CisJCQl9CisJCQlpZih1bml0LnR5cGVDb3VudCA9PSAwCisJCQkJJiYgdW5pdC5pbXBvcnRDb3VudCA9PSAwCisJCQkJJiYgbGFzdE1vZGlmaWVycyA9PSBBY2NEZWZhdWx0CisJCQkJJiYgY29tcGlsYXRpb25Vbml0LmN1cnJlbnRQYWNrYWdlID09IG51bGwKKwkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhpZGVudGlmaWVyU3RhY2tbaW5kZXhdLCBLZXl3b3Jkcy5QQUNLQUdFKSkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUEFDS0FHRTsKKwkJCX0KKwkJCWlmKChsYXN0TW9kaWZpZXJzICYgQWNjUHVibGljKSA9PSAwCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW2luZGV4XSwgS2V5d29yZHMuUFVCTElDKSkgeworCQkJCWJvb2xlYW4gaGFzTm9QdWJsaWNUeXBlID0gdHJ1ZTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXQudHlwZUNvdW50OyBpKyspIHsKKwkJCQkJaWYoKHVuaXQudHlwZXNbaV0udHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkgeworCQkJCQkJaGFzTm9QdWJsaWNUeXBlID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYoaGFzTm9QdWJsaWNUeXBlKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuUFVCTElDOworCQkJCX0KKwkJCX0KKwkJCWlmKChsYXN0TW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpID09IDAKKwkJCQkmJiAobGFzdE1vZGlmaWVycyAmIEFjY0ZpbmFsKSA9PSAwCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW2luZGV4XSwgS2V5d29yZHMuQUJTVEFSQ1QpKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5BQlNUQVJDVDsKKwkJCX0KKwkJCWlmKChsYXN0TW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpID09IDAKKwkJCQkmJiAobGFzdE1vZGlmaWVycyAmIEFjY0ZpbmFsKSA9PSAwCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW2luZGV4XSwgS2V5d29yZHMuRklOQUwpKSB7CisJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5GSU5BTDsKKwkJCX0KKwkJCWlmKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGlkZW50aWZpZXJTdGFja1tpbmRleF0sIEtleXdvcmRzLkNMQVNTKSkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuQ0xBU1M7CisJCQl9CisJCQlpZigobGFzdE1vZGlmaWVycyAmIEFjY0ZpbmFsKSA9PSAwCisJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW2luZGV4XSwgS2V5d29yZHMuSU5URVJGQUNFKSkgeworCQkJCWtleXdvcmRzW2NvdW50KytdID0gS2V5d29yZHMuSU5URVJGQUNFOworCQkJfQorCQkJaWYoY291bnQgIT0gMCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoa2V5d29yZHMsIDAsIGtleXdvcmRzID0gbmV3IGNoYXJbY291bnRdW10sIDAsIGNvdW50KTsKKwkJCQkKKwkJCQl0aGlzLmFzc2lzdE5vZGUgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDIoaWRlbnQsIHBvcywga2V5d29yZHMpOworCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBhc3Npc3ROb2RlLnNvdXJjZUVuZCArIDE7CisJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9Citwcml2YXRlIGJvb2xlYW4gY2hlY2tJbnN0YW5jZW9mS2V5d29yZCgpIHsKKwlpZihpc0luc2lkZU1ldGhvZCgpKSB7CisJCWludCBraW5kID0gdG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpOworCQlpbnQgaW5kZXg7CisJCWlmKGtpbmQgIT0gS19CTE9DS19ERUxJTUlURVIKKwkJCSYmIChpbmRleCA9IGluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpID4gLTEKKwkJCSYmIGV4cHJlc3Npb25QdHIgPiAtMQorCQkJJiYgZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25QdHJdID09IDEKKwkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGlkZW50aWZpZXJTdGFja1tpbmRleF0sIEtleXdvcmRzLklOU1RBTkNFT0YpKSB7CisJCQl0aGlzLmFzc2lzdE5vZGUgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDMoCisJCQkJCWlkZW50aWZpZXJTdGFja1tpbmRleF0sCisJCQkJCWlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2luZGV4XSwKKwkJCQkJS2V5d29yZHMuSU5TVEFOQ0VPRik7CisJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxOworCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KIC8qKgogICogQ2hlY2tzIGlmIHRoZSBjb21wbGV0aW9uIGlzIGluc2lkZSBhIG1ldGhvZCBpbnZvY2F0aW9uIG9yIGEgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KICAqIFJldHVybnMgd2hldGhlciB3ZSBmb3VuZCBhIGNvbXBsZXRpb24gbm9kZS4KQEAgLTMwNiw4ICs3MjIsNyBAQAogCQludWxsOwogCWJvb2xlYW4gaXNFbXB0eU5hbWVDb21wbGV0aW9uID0gZmFsc2U7CiAJYm9vbGVhbiBpc0VtcHR5QXNzaXN0SWRlbnRpZmllciA9IGZhbHNlOwotCWludCBzdGFydEludm9jYXRpb25QdHIgPSB0aGlzLmJsb2NrSW52b2NhdGlvblB0ciA+PSAwID8gdGhpcy5ibG9ja0ludm9jYXRpb25TdGFja1t0aGlzLmJsb2NrSW52b2NhdGlvblB0cl0gOiAwOwotCWlmICh0aGlzLmludm9jYXRpb25QdHIgPj0gc3RhcnRJbnZvY2F0aW9uUHRyCisJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX1NFTEVDVE9SX1FVQUxJRklFUgogCQkmJiAoKGlzRW1wdHlOYW1lQ29tcGxldGlvbiA9IHRvcEV4cHJlc3Npb24gPT0gdGhpcy5hc3Npc3ROb2RlICYmIHRoaXMuaXNFbXB0eU5hbWVDb21wbGV0aW9uKCkpIC8vIGVnLiBpdCBpcyBzb21ldGhpbmcgbGlrZSAidGhpcy5mcmVkKFtjdXJzb3JdIiBidXQgaXQgaXMgbm90IHNvbWV0aGluZyBsaWtlICJ0aGlzLmZyZWQoMSArIFtjdXJzb3JdIgogCQkJfHwgKGlzRW1wdHlBc3Npc3RJZGVudGlmaWVyID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpID49IDAgJiYgdGhpcy5pZGVudGlmaWVyU3RhY2tbdGhpcy5pZGVudGlmaWVyUHRyXS5sZW5ndGggPT0gMCkpKSB7IC8vIGVnLiBpdCBpcyBzb21ldGhpbmcgbGlrZSAidGhpcy5mcmVkKDEgW2N1cnNvcl0iCiAJCQkJCkBAIC0zMjEsOCArNzM2LDggQEAKIAkJfQogCiAJCS8vIGZpbmQgcmVjZWl2ZXIgYW5kIHF1YWxpZmllcgotCQlpbnQgaW52b2NhdGlvblR5cGUgPSB0aGlzLmludm9jYXRpb25UeXBlU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXTsKLQkJaW50IHF1YWxpZmllckV4cHJQdHIgPSB0aGlzLnF1YWxpZmllclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl07CisJCWludCBpbnZvY2F0aW9uVHlwZSA9IHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAxKTsKKwkJaW50IHF1YWxpZmllckV4cHJQdHIgPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CiAKIAkJLy8gZmluZCBhcmd1bWVudHMKIAkJaW50IG51bUFyZ3MgPSB0aGlzLmV4cHJlc3Npb25QdHIgLSBxdWFsaWZpZXJFeHByUHRyOwpAQCAtMzQ5LDcgKzc2NCw3IEBACiAJCQlzd2l0Y2ggKGludm9jYXRpb25UeXBlKSB7CiAJCQkJY2FzZSBOT19SRUNFSVZFUjoKIAkJCQkJLy8gaW1wbGljaXQgdGhpcwotCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciA9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0OworCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciA9IFRoaXNSZWZlcmVuY2UuaW1wbGljaXRUaGlzKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgTkFNRV9SRUNFSVZFUjoKIAkJCQkJLy8gcmVtb3ZlIHNwZWNpYWwgZmxhZ3MgZm9yIHByaW1pdGl2ZSB0eXBlcwpAQCAtMzY0LDE0ICs3NzksMTQgQEAKIAkJCQkJbWVzc2FnZVNlbmQucmVjZWl2ZXIgPSB0aGlzLmdldFVuc3BlY2lmaWVkUmVmZXJlbmNlKCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgU1VQRVJfUkVDRUlWRVI6Ci0JCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gU3VwZXJSZWZlcmVuY2UuU3VwZXI7CisJCQkJCW1lc3NhZ2VTZW5kLnJlY2VpdmVyID0gbmV3IFN1cGVyUmVmZXJlbmNlKDAsIDApOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEVYUExJQ0lUX1JFQ0VJVkVSOgogCQkJCQltZXNzYWdlU2VuZC5yZWNlaXZlciA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3F1YWxpZmllckV4cHJQdHJdOwogCQkJfQogCiAJCQkvLyBzZXQgc2VsZWN0b3IKLQkJCWludCBzZWxlY3RvclB0ciA9IHRoaXMuc2VsZWN0b3JTdGFja1t0aGlzLmludm9jYXRpb25QdHJdOworCQkJaW50IHNlbGVjdG9yUHRyID0gdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIsIDIpOwogCQkJbWVzc2FnZVNlbmQuc2VsZWN0b3IgPSB0aGlzLmlkZW50aWZpZXJTdGFja1tzZWxlY3RvclB0cl07CiAJCQkvLyByZW1vdmUgc2VsZWN0b3IKIAkJCWlmICh0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgPj0wICYmIHRoaXMuaWRlbnRpZmllckxlbmd0aFN0YWNrW3RoaXMuaWRlbnRpZmllckxlbmd0aFB0cl0gPT0gMSkgewpAQCAtMzg5LDcgKzgwNCw3IEBACiAJCQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwogCQkJcmV0dXJuIHRydWU7CiAJCX0gZWxzZSB7Ci0JCQlpbnQgc2VsZWN0b3JQdHIgPSB0aGlzLnNlbGVjdG9yU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXTsKKwkJCWludCBzZWxlY3RvclB0ciA9IHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSLCAyKTsKIAkJCWlmIChzZWxlY3RvclB0ciA9PSBUSElTX0NPTlNUUlVDVE9SIHx8IHNlbGVjdG9yUHRyID09IFNVUEVSX0NPTlNUUlVDVE9SKSB7CiAJCQkJLy8gY3JlYXRlcyBhbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsCiAJCQkJQ29tcGxldGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCA9IG5ldyBDb21wbGV0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCgKQEAgLTUyNiwxMyArOTQxLDE1IEBACiAgKiByZXN1bHRpbmcgcGFyc2VkIHN0cnVjdHVyZS4KICAqLwogcHVibGljIHZvaWQgY29tcGxldGlvbklkZW50aWZpZXJDaGVjaygpeworCS8vaWYgKGFzc2lzdE5vZGUgIT0gbnVsbCkgcmV0dXJuOyAKIAorCWlmIChjaGVja0tleXdvcmQoKSkgcmV0dXJuOwogCWlmIChjaGVja1JlY292ZXJlZFR5cGUoKSkgcmV0dXJuOwogCWlmIChjaGVja1JlY292ZXJlZE1ldGhvZCgpKSByZXR1cm47CiAKIAkvLyBpZiBub3QgaW4gYSBtZXRob2QgaW4gbm9uIGRpZXQgbW9kZSBhbmQgaWYgbm90IGluc2lkZSBhIGZpZWxkIGluaXRpYWxpemVyLCBvbmx5IHJlY29yZCByZWZlcmVuY2VzIGF0dGFjaGVkIHRvIHR5cGVzCi0JaWYgKCEodGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdICYmICF0aGlzLmRpZXQpCi0JCSYmICFpbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkpIHJldHVybjsgCisJaWYgKCEoaXNJbnNpZGVNZXRob2QoKSAmJiAhdGhpcy5kaWV0KQorCQkmJiAhaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpKSByZXR1cm47IAogCiAJLyoKIAkgCUluIHNvbWUgY2FzZXMsIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgbWF5IG5vdCBoYXZlIHlldCBiZWVuIGNvbnN1bWVkLApAQCAtNTY2LDUwICs5ODMsMTYwIEBACiAJCWlmIChjaGVja0NhdGNoQ2xhdXNlKCkpIHJldHVybjsKIAkJaWYgKGNoZWNrTWVtYmVyQWNjZXNzKCkpIHJldHVybjsKIAkJaWYgKGNoZWNrQ2xhc3NMaXRlcmFsQWNjZXNzKCkpIHJldHVybjsKLQorCQlpZiAoY2hlY2tJbnN0YW5jZW9mS2V5d29yZCgpKSByZXR1cm47CisJCQogCQkvLyBpZiB0aGUgY29tcGxldGlvbiB3YXMgbm90IG9uIGFuIGVtcHR5IG5hbWUsIGl0IGNhbiBzdGlsbCBiZSBpbnNpZGUgYW4gaW52b2NhdGlvbiAoZWcuIHRoaXMuZnJlZCgiYWJjIltjdXJzb3JdKQogCQkvLyAoTkI6IFB1dCB0aGlzIGNoZWNrIGJlZm9yZSBjaGVja05hbWVDb21wbGV0aW9uKCkgYmVjYXVzZSB0aGUgc2VsZWN0b3Igb2YgdGhlIGludm9jYXRpb24gY2FuIGJlIG9uIHRoZSBpZGVudGlmaWVyIHN0YWNrKQogCQlpZiAoY2hlY2tJbnZvY2F0aW9uKCkpIHJldHVybjsKIAogCQlpZiAoY2hlY2tOYW1lQ29tcGxldGlvbigpKSByZXR1cm47CiAJfSBmaW5hbGx5IHsKLQkJc3RvcmVMYWJlbHNJZk5lZWRlZCgpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpIHsKKwlzdXBlci5jb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRoSW5pdGlhbGl6ZXIoKTsKKwlwb3BFbGVtZW50KEtfQVJSQVlfQ1JFQVRJT04pOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aG91dEluaXRpYWxpemVyKCkgeworCXN1cGVyLmNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOworCXBvcEVsZW1lbnQoS19BUlJBWV9DUkVBVElPTik7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXNzaWdubWVudCgpIHsKKwlwb3BFbGVtZW50KEtfQVNTSVNHTk1FTlRfT1BFUkFUT1IpOworCXN1cGVyLmNvbnN1bWVBc3NpZ25tZW50KCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKGludCBwb3MpIHsKKwlzdXBlci5jb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKHBvcyk7CisJcHVzaE9uRWxlbWVudFN0YWNrKEtfQVNTSVNHTk1FTlRfT1BFUkFUT1IsIHBvcyk7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihpbnQgb3ApIHsKKwlzdXBlci5jb25zdW1lQmluYXJ5RXhwcmVzc2lvbihvcCk7CisJcG9wRWxlbWVudChLX0JJTkFSWV9PUEVSQVRPUik7CisJCisJaWYoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworCQlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJCWlmKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAucmlnaHQgPT0gYXNzaXN0Tm9kZSkgeworCQkJYXNzaXN0Tm9kZVBhcmVudCA9IGV4cDsKKwkJfQogCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXNlTGFiZWwoKSB7Ci0JRXhwcmVzc2lvbiBjYXNlRXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvblN0YWNrW3RoaXMuZXhwcmVzc2lvblB0cl07Ci0JaWYgKGNhc2VFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSB8fCBjYXNlRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKLQkJLy8gbGFiZWwgY291bnRlciB3YXMgd3JvbmdseSBpbmNyZW1lbnRlZCBpbiBjb25zdW1lVG9rZW4KLQkJaWYgKHRoaXMubGFiZWxDb3VudGVyUHRyID49IDApIHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdLS07Ci0JfQogCXN1cGVyLmNvbnN1bWVDYXNlTGFiZWwoKTsKKwlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgIT0gS19TV0lUQ0hfTEFCRUwpIHsKKwkJcHVzaE9uRWxlbWVudFN0YWNrKEtfU1dJVENIX0xBQkVMKTsKKwl9Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKSB7CisJcG9wRWxlbWVudChLX0NBU1RfU1RBVEVNRU5UKTsKKwkKKwlFeHByZXNzaW9uIGV4cCwgY2FzdCwgY2FzdFR5cGU7CisJZXhwcmVzc2lvblB0ci0tOworCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKKwlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBjYXN0ID0gbmV3IENhc3RFeHByZXNzaW9uKGV4cCA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzFdLCBjYXN0VHlwZSA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSk7CisJY2FzdC5zb3VyY2VTdGFydCA9IGNhc3RUeXBlLnNvdXJjZVN0YXJ0IC0gMTsKKwljYXN0LnNvdXJjZUVuZCA9IGV4cC5zb3VyY2VFbmQ7Cit9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKSB7CisJcG9wRWxlbWVudChLX0NBU1RfU1RBVEVNRU5UKTsKKwlzdXBlci5jb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpIHsKKwlwb3BFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwlzdXBlci5jb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlvcHQoKSB7CisJcG9wRWxlbWVudChLX1NFTEVDVE9SX1FVQUxJRklFUik7CisJcG9wRWxlbWVudChLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSk7CisJc3VwZXIuY29uc3VtZUNsYXNzQm9keW9wdCgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSGVhZGVyTmFtZSgpIHsKKwlzdXBlci5jb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCk7CisKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbAorCQkmJiBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gc2Nhbm5lci5zdGFydFBvc2l0aW9uCisJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CisJCXRoaXMucHVzaElkZW50aWZpZXIoKTsKKworCQlpbnQgaW5kZXggPSAtMTsKKwkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KKwkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgeworCisJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KKwkJCWlmICghcmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJCWNoYXJbXVtdIGtleXdvcmRzID0gbmV3IGNoYXJbS2V5d29yZHMuQ09VTlRdW107CisJCQkJaW50IGNvdW50ID0gMDsKKwkJCQkKKwkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHJlY292ZXJlZFR5cGUudHlwZURlY2xhcmF0aW9uOworCQkJCWlmKHR5cGUuc3VwZXJJbnRlcmZhY2VzID09IG51bGwpIHsKKwkJCQkJaWYodHlwZS5zdXBlcmNsYXNzID09IG51bGwpIHs7CisJCQkJCQlrZXl3b3Jkc1tjb3VudCsrXSA9IEtleXdvcmRzLkVYVEVORFM7CisJCQkJCX0KKwkJCQkJa2V5d29yZHNbY291bnQrK10gPSBLZXl3b3Jkcy5JTVBMRU1FTlRTOworCQkJCX0KKwkJCQkKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGtleXdvcmRzLCAwLCBrZXl3b3JkcyA9IG5ldyBjaGFyW2NvdW50XVtdLCAwLCBjb3VudCk7CisJCQkJCisJCQkJaWYoY291bnQgPiAwKSB7CisJCQkJCXR5cGUuc3VwZXJjbGFzcyA9IG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMSgKKwkJCQkJCWlkZW50aWZpZXJTdGFja1tpbmRleF0sCisJCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpbmRleF0sCisJCQkJCQlrZXl3b3Jkcyk7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZSA9IHR5cGUuc3VwZXJjbGFzczsKKwkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGUuc3VwZXJjbGFzcy5zb3VyY2VFbmQgKyAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKSB7Ci0JdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzQ2xhc3MgPSB0cnVlOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CiAJc3VwZXIuY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOwotCXRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0NsYXNzID0gZmFsc2U7CisJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19DTEFTUyk7CisJCisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwKKwkJJiYgY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIKKwkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbisxID49IHNjYW5uZXIuc3RhcnRQb3NpdGlvbgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCQl0aGlzLnB1c2hJZGVudGlmaWVyKCk7CisJCQorCQlpbnQgaW5kZXggPSAtMTsKKwkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KKwkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgeworCisJCQlSZWNvdmVyZWRUeXBlIHJlY292ZXJlZFR5cGUgPSAoUmVjb3ZlcmVkVHlwZSljdXJyZW50RWxlbWVudDsKKwkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KKwkJCWlmICghcmVjb3ZlcmVkVHlwZS5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gcmVjb3ZlcmVkVHlwZS50eXBlRGVjbGFyYXRpb247CisJCQkJaWYodHlwZS5zdXBlckludGVyZmFjZXMgPT0gbnVsbCkgeworCQkJCQl0eXBlLnN1cGVyY2xhc3MgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDEoCisJCQkJCQlpZGVudGlmaWVyU3RhY2tbaW5kZXhdLAorCQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdLAorCQkJCQkJS2V5d29yZHMuSU1QTEVNRU5UUyk7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZSA9IHR5cGUuc3VwZXJjbGFzczsKKwkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IHR5cGUuc3VwZXJjbGFzcy5zb3VyY2VFbmQgKyAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc1R5cGVFbHQoKSB7Ci0JdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzRXhjZXB0aW9uID0gdHJ1ZTsKKwlwdXNoT25FbGVtZW50U3RhY2soS19ORVhUX1RZUEVSRUZfSVNfRVhDRVBUSU9OKTsKIAlzdXBlci5jb25zdW1lQ2xhc3NUeXBlRWx0KCk7Ci0JdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzRXhjZXB0aW9uID0gZmFsc2U7CisJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04pOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihpbnQgb3ApIHsKLQlFeHByZXNzaW9uIHZhbHVlSWZUcnVlID0gdGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyIC0gMV07Ci0JaWYgKHZhbHVlSWZUcnVlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSB8fCB2YWx1ZUlmVHJ1ZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKLQkJLy8gbGFiZWwgY291bnRlciB3YXMgd3JvbmdseSBpbmNyZW1lbnRlZCBpbiBjb25zdW1lVG9rZW4KLQkJaWYgKHRoaXMubGFiZWxDb3VudGVyUHRyID49IDApIHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdLS07Ci0JfQorCXBvcEVsZW1lbnQoS19DT05ESVRJT05BTF9PUEVSQVRPUik7CiAJc3VwZXIuY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihvcCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ29uc3RydWN0b3JCb2R5KCkgeworCXBvcEVsZW1lbnQoS19CTE9DS19ERUxJTUlURVIpOwogCXN1cGVyLmNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKTsKLQl0aGlzLmxhYmVsQ291bnRlclB0ci0tOwotCWlmICh0aGlzLmJsb2NrSW52b2NhdGlvblB0ciA+PSAwKSB0aGlzLmJsb2NrSW52b2NhdGlvblB0ci0tOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyKCkgewogCXN1cGVyLmNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOwotCXB1c2hCbG9ja0ludm9jYXRpb25QdHIoKTsKKwlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpIHsKIApAQCAtNjI1LDYgKzExNTIsMTggQEAKIAl9CiAJdGhpcy5yZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZURlZmF1bHRMYWJlbCgpIHsKKwlzdXBlci5jb25zdW1lRGVmYXVsdExhYmVsKCk7CisJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfU1dJVENIX0xBQkVMKSB7CisJCXBvcEVsZW1lbnQoS19TV0lUQ0hfTEFCRUwpOworCX0KKwlwdXNoT25FbGVtZW50U3RhY2soS19TV0lUQ0hfTEFCRUwsIERFRkFVTFQpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgeworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9RVUFMSUZJRVIpOworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9JTlZPQ0FUSU9OX1RZUEUpOworCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyVmFyaWFibGUoKSB7CiAJaWRlbnRpZmllclB0ci0tOwogCWlkZW50aWZpZXJMZW5ndGhQdHItLTsKQEAgLTY0MCwzMiArMTE3OSw2OSBAQAogCX0gZWxzZSB7CiAJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CiAJCQorLy8JCXByaXZhdGUgYm9vbGVhbiBjaGVja0tleXdvcmQoKSB7CisvLwkJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQpIHsKKy8vCQkJCVJlY292ZXJlZFVuaXQgdW5pdCA9IChSZWNvdmVyZWRVbml0KSBjdXJyZW50RWxlbWVudDsKKy8vCQkJCWludCBpbmRleCA9IC0xOworLy8JCQkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgeworLy8JCQkJCWlmKHVuaXQudHlwZUNvdW50ID09IDAKKy8vCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoaWRlbnRpZmllclN0YWNrW2luZGV4XSwgS2V5d29yZHMuSU1QT1JUKSkgeworLy8JCQkJCQlDb21wbGV0aW9uT25LZXl3b3JkMiBjb21wbGV0aW9uT25JbXBvcnRLZXl3b3JkID0gbmV3IENvbXBsZXRpb25PbktleXdvcmQyKEtleXdvcmRzLklNUE9SVCwgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdKTsKKy8vCQkJCQkJdGhpcy5hc3Npc3ROb2RlID0gY29tcGxldGlvbk9uSW1wb3J0S2V5d29yZDsKKy8vCQkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGNvbXBsZXRpb25PbkltcG9ydEtleXdvcmQuc291cmNlRW5kICsgMTsKKy8vCQkJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKy8vCQkJCQkJcmV0dXJuIHRydWU7CisvLwkJCQkJfSBlbHNlIGlmKHVuaXQudHlwZUNvdW50ID09IDAKKy8vCQkJCQkJJiYgdW5pdC5pbXBvcnRDb3VudCA9PSAwCisvLwkJCQkJCSYmIENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGlkZW50aWZpZXJTdGFja1tpbmRleF0sIEtleXdvcmRzLlBBQ0tBR0UpKSB7CisvLwkJCQkJCUNvbXBsZXRpb25PbktleXdvcmQyIGNvbXBsZXRpb25PbkltcG9ydEtleXdvcmQgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDIoS2V5d29yZHMuUEFDS0FHRSwgaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdKTsKKy8vCQkJCQkJdGhpcy5hc3Npc3ROb2RlID0gY29tcGxldGlvbk9uSW1wb3J0S2V5d29yZDsKKy8vCQkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGNvbXBsZXRpb25PbkltcG9ydEtleXdvcmQuc291cmNlRW5kICsgMTsKKy8vCQkJCQkJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKy8vCQkJCQkJcmV0dXJuIHRydWU7CisvLwkJCQkJfQorLy8JCQkJfQorLy8JCQl9CisvLwkJCXJldHVybiBmYWxzZTsKKy8vCQl9CisJCQogCQkvLyByZWNvdmVyeQogCQlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaW50IG5hbWVTb3VyY2VTdGFydCA9IChpbnQpKGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHJdID4+PiAzMik7Ci0JCQlpbnRQdHItLTsKLQkJCQotCQkJVHlwZVJlZmVyZW5jZSB0eXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOwotCQkJaW50UHRyLS07Ci0JCQkKLQkJCWlmICghKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSkKLQkJCQkmJiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZURPVAotCQkJCQl8fCAoc2Nhbm5lci5nZXRMaW5lTnVtYmVyKHR5cGUuc291cmNlU3RhcnQpCi0JCQkJCQkJIT0gc2Nhbm5lci5nZXRMaW5lTnVtYmVyKG5hbWVTb3VyY2VTdGFydCkpKSl7Ci0JCQkJbGFzdENoZWNrUG9pbnQgPSBuYW1lU291cmNlU3RhcnQ7Ci0JCQkJcmVzdGFydFJlY292ZXJ5ID0gdHJ1ZTsKLQkJCQlyZXR1cm47CisJCQlpZighY2hlY2tLZXl3b3JkKCkgJiYgIShjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFVuaXQgJiYgKChSZWNvdmVyZWRVbml0KWN1cnJlbnRFbGVtZW50KS50eXBlQ291bnQgPT0gMCkpIHsKKwkJCQlpbnQgbmFtZVNvdXJjZVN0YXJ0ID0gKGludCkoaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaWRlbnRpZmllclB0cl0gPj4+IDMyKTsKKwkJCQlpbnRQdHItLTsKKwkJCQkKKwkJCQlUeXBlUmVmZXJlbmNlIHR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGludFN0YWNrW2ludFB0ci0tXSk7CisJCQkJaW50UHRyLS07CisJCQkJCisJCQkJaWYgKCEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlKQorCQkJCQkmJiAoY3VycmVudFRva2VuID09IFRva2VuTmFtZURPVAorCQkJCQkJfHwgKHNjYW5uZXIuZ2V0TGluZU51bWJlcih0eXBlLnNvdXJjZVN0YXJ0KQorCQkJCQkJCQkhPSBzY2FubmVyLmdldExpbmVOdW1iZXIobmFtZVNvdXJjZVN0YXJ0KSkpKXsKKwkJCQkJbGFzdENoZWNrUG9pbnQgPSBuYW1lU291cmNlU3RhcnQ7CisJCQkJCXJlc3RhcnRSZWNvdmVyeSA9IHRydWU7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJCisJCQkJRmllbGREZWNsYXJhdGlvbiBjb21wbGV0aW9uRmllbGREZWNsID0gbmV3IENvbXBsZXRpb25PbkZpZWxkVHlwZSh0eXBlLCBmYWxzZSk7CisJCQkJY29tcGxldGlvbkZpZWxkRGVjbC5tb2RpZmllcnMgPSBpbnRTdGFja1tpbnRQdHItLV07CisJCQkJYXNzaXN0Tm9kZSA9IGNvbXBsZXRpb25GaWVsZERlY2w7CisJCQkJbGFzdENoZWNrUG9pbnQgPSB0eXBlLnNvdXJjZUVuZCArIDE7CisJCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoY29tcGxldGlvbkZpZWxkRGVjbCwgMCk7CisJCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQkJfQotCQkJCi0JCQlGaWVsZERlY2xhcmF0aW9uIGNvbXBsZXRpb25GaWVsZERlY2wgPSBuZXcgQ29tcGxldGlvbk9uRmllbGRUeXBlKHR5cGUsIGZhbHNlKTsKLQkJCWNvbXBsZXRpb25GaWVsZERlY2wubW9kaWZpZXJzID0gaW50U3RhY2tbaW50UHRyLS1dOwotCQkJYXNzaXN0Tm9kZSA9IGNvbXBsZXRpb25GaWVsZERlY2w7Ci0JCQlsYXN0Q2hlY2tQb2ludCA9IHR5cGUuc291cmNlRW5kICsgMTsKLQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGNvbXBsZXRpb25GaWVsZERlY2wsIDApOwotCQkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwogCQl9CiAJfQogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihpbnQgb3ApIHsKKwlzdXBlci5jb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKG9wKTsKKwlwb3BFbGVtZW50KEtfQklOQVJZX09QRVJBVE9SKTsKKwkKKwlCaW5hcnlFeHByZXNzaW9uIGV4cCA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5yaWdodCA9PSBhc3Npc3ROb2RlKSB7CisJCWFzc2lzdE5vZGVQYXJlbnQgPSBleHA7CisJfQorfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpIHsKIAlzdXBlci5jb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCk7CiAJCkBAIC02NzQsOSArMTI1MCwxNSBAQAogCWlmIChjdXJzb3JMb2NhdGlvbiArIDEgPCB2YXJpYWJsZS5pbml0aWFsaXphdGlvbi5zb3VyY2VTdGFydCB8fAogCQljdXJzb3JMb2NhdGlvbiA+IHZhcmlhYmxlLmluaXRpYWxpemF0aW9uLnNvdXJjZUVuZCkgewogCQl2YXJpYWJsZS5pbml0aWFsaXphdGlvbiA9IG51bGw7CisJfSBlbHNlIGlmIChhc3Npc3ROb2RlICE9IG51bGwgJiYgYXNzaXN0Tm9kZSA9PSB2YXJpYWJsZS5pbml0aWFsaXphdGlvbikgeworCQlhc3Npc3ROb2RlUGFyZW50ID0gdmFyaWFibGU7CiAJfQogfQotCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oaW50IGZsYWcsIGludCByZWNGbGFnKSB7CisJcG9wRWxlbWVudChLX1NFTEVDVE9SX1FVQUxJRklFUik7CisJcG9wRWxlbWVudChLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSk7CisJc3VwZXIuY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGZsYWcsIHJlY0ZsYWcpOwkKK30KIC8qCiAgKiBDb3B5IG9mIGNvZGUgZnJvbSBzdXBlcmNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2U6CiAgKiBJZiB0aGUgY3Vyc29yIGxvY2F0aW9uIGlzIG9uIHRoZSBmaWVsZCBhY2Nlc3MsIHRoZW4gY3JlYXRlIGEgCkBAIC02OTUsNyArMTI3NywxMiBAQAogCQl0aGlzLnB1c2hDb21wbGV0aW9uT25NZW1iZXJBY2Nlc3NPbkV4cHJlc3Npb25TdGFjayhpc1N1cGVyQWNjZXNzKTsKIAl9CiB9Ci0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JjZU5vRGlldCgpIHsKKwlzdXBlci5jb25zdW1lRm9yY2VOb0RpZXQoKTsKKwlpZiAoaXNJbnNpZGVNZXRob2QoKSkgeworCQlwdXNoT25FbGVtZW50U3RhY2soS19MT0NBTF9JTklUSUFMSVpFUl9ERUxJTUlURVIpOworCX0KK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKSB7CiAJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKIAkJc3VwZXIuY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpOwpAQCAtNzA2LDEyICsxMjkzLDE0IEBACiAJCWxvbmcgbmFtZVBvc2l0aW9ucyA9IGlkZW50aWZpZXJQb3NpdGlvblN0YWNrW2lkZW50aWZpZXJQdHItLV07CiAJCVR5cGVSZWZlcmVuY2UgdHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoaW50U3RhY2tbaW50UHRyLS1dICsgaW50U3RhY2tbaW50UHRyLS1dKTsKIAkJaW50UHRyIC09IDI7Ci0JCUFyZ3VtZW50IGFyZyA9IAorCQlDb21wbGV0aW9uT25Bcmd1bWVudE5hbWUgYXJnID0gCiAJCQluZXcgQ29tcGxldGlvbk9uQXJndW1lbnROYW1lKAogCQkJCW5hbWUsIAogCQkJCW5hbWVQb3NpdGlvbnMsIAogCQkJCXR5cGUsIAogCQkJCWludFN0YWNrW2ludFB0ciArIDFdICYgfkFjY0RlcHJlY2F0ZWQpOyAvLyBtb2RpZmllcnMKKwkJCQkKKwkJYXJnLmlzQ2F0Y2hBcmd1bWVudCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JFVFdFRU5fQ0FUQ0hfQU5EX1JJR0hUX1BBUkVOOwogCQlwdXNoT25Bc3RTdGFjayhhcmcpOwogCQkKIAkJYXNzaXN0Tm9kZSA9IGFyZzsKQEAgLTcyMywxMCArMTMxMiw3NyBAQAogCQlsaXN0TGVuZ3RoKys7CiAJfSAJCiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKSB7CisJaW50IGVuZCA9IGludFN0YWNrW2ludFB0ci0tXTsKKwlFeHByZXNzaW9uIGNhc3RUeXBlID0gZ2V0VHlwZVJlZmVyZW5jZShpbnRTdGFja1tpbnRQdHItLV0pOworCWNhc3RUeXBlLnNvdXJjZUVuZCA9IGVuZCAtIDE7CisJY2FzdFR5cGUuc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV0gKyAxOworCXB1c2hPbkV4cHJlc3Npb25TdGFjayhjYXN0VHlwZSk7CisJCisJcHVzaE9uRWxlbWVudFN0YWNrKEtfQ0FTVF9TVEFURU1FTlQpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uTEwxKCkgeworCXN1cGVyLmNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSgpOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX0NBU1RfU1RBVEVNRU5UKTsKK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihpbnQgb3ApIHsKKwlzdXBlci5jb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24ob3ApOworCXBvcEVsZW1lbnQoS19CSU5BUllfT1BFUkFUT1IpOworCQorCUluc3RhbmNlT2ZFeHByZXNzaW9uIGV4cCA9IChJbnN0YW5jZU9mRXhwcmVzc2lvbikgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOworCWlmKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAudHlwZSA9PSBhc3Npc3ROb2RlKSB7CisJCWFzc2lzdE5vZGVQYXJlbnQgPSBleHA7CisJfQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUoKSB7CisJc3VwZXIuY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUoKTsKKwkKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbAorCQkmJiBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lSWRlbnRpZmllcgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uKzEgPj0gc2Nhbm5lci5zdGFydFBvc2l0aW9uCisJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24gPCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbil7CisJCXRoaXMucHVzaElkZW50aWZpZXIoKTsKKwkJCisJCWludCBpbmRleCA9IC0xOworCQkvKiBjaGVjayBpZiBjdXJyZW50IGF3YWl0aW5nIGlkZW50aWZpZXIgaXMgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciAqLworCQlpZiAoKGluZGV4ID0gdGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpKSA+IC0xKSB7CisKKwkJCVJlY292ZXJlZFR5cGUgcmVjb3ZlcmVkVHlwZSA9IChSZWNvdmVyZWRUeXBlKWN1cnJlbnRFbGVtZW50OworCQkJLyogZmlsdGVyIG91dCBjYXNlcyB3aGVyZSBzY2FubmVyIGlzIHN0aWxsIGluc2lkZSB0eXBlIGhlYWRlciAqLworCQkJaWYgKCFyZWNvdmVyZWRUeXBlLmZvdW5kT3BlbmluZ0JyYWNlKSB7CisJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGUgPSByZWNvdmVyZWRUeXBlLnR5cGVEZWNsYXJhdGlvbjsKKwkJCQlpZih0eXBlLnN1cGVySW50ZXJmYWNlcyA9PSBudWxsKSB7CisJCQkJCUNvbXBsZXRpb25PbktleXdvcmQxIGNvbXBsZXRpb25PbktleXdvcmQgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDEoCisJCQkJCQlpZGVudGlmaWVyU3RhY2tbaW5kZXhdLAorCQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdLAorCQkJCQkJS2V5d29yZHMuRVhURU5EUyk7CisJCQkJCXR5cGUuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFR5cGVSZWZlcmVuY2VbXXtjb21wbGV0aW9uT25LZXl3b3JkfTsKKwkJCQkJdGhpcy5hc3Npc3ROb2RlID0gY29tcGxldGlvbk9uS2V5d29yZDsKKwkJCQkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IGNvbXBsZXRpb25PbktleXdvcmQuc291cmNlRW5kICsgMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlVHlwZSgpIHsKLQl0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNJbnRlcmZhY2UgPSB0cnVlOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX05FWFRfVFlQRVJFRl9JU19JTlRFUkZBQ0UpOwogCXN1cGVyLmNvbnN1bWVJbnRlcmZhY2VUeXBlKCk7Ci0JdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzSW50ZXJmYWNlID0gZmFsc2U7CisJcG9wRWxlbWVudChLX05FWFRfVFlQRVJFRl9JU19JTlRFUkZBQ0UpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25OYW1lKCkgeworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9RVUFMSUZJRVIpOworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9JTlZPQ0FUSU9OX1RZUEUpOworCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCkgeworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9RVUFMSUZJRVIpOworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUl9JTlZPQ0FUSU9OX1RZUEUpOworCXN1cGVyLmNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOworfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsKKwlwb3BFbGVtZW50KEtfU0VMRUNUT1JfUVVBTElGSUVSKTsKKwlwb3BFbGVtZW50KEtfU0VMRUNUT1JfSU5WT0NBVElPTl9UWVBFKTsKKwlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZSgpIHsKIAlpZih0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkgPCAwKSB7CkBAIC04MTIsMTcgKzE0NjgsNzcgQEAKIAkJfQogCX0KIH0KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJQYXJhbWV0ZXJzKCkgeworCXN1cGVyLmNvbnN1bWVNZXRob2RIZWFkZXJQYXJhbWV0ZXJzKCk7CisJCisJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwKKwkJJiYgY3VycmVudFRva2VuID09IFRva2VuTmFtZUlkZW50aWZpZXIKKwkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbisxID49IHNjYW5uZXIuc3RhcnRQb3NpdGlvbgorCQkmJiB0aGlzLmN1cnNvckxvY2F0aW9uIDwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24peworCQl0aGlzLnB1c2hJZGVudGlmaWVyKCk7CisJCQorCQlpbnQgaW5kZXggPSAtMTsKKwkJLyogY2hlY2sgaWYgY3VycmVudCBhd2FpdGluZyBpZGVudGlmaWVyIGlzIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIgKi8KKwkJaWYgKChpbmRleCA9IHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSkgPiAtMSkgewogCisJCQlSZWNvdmVyZWRNZXRob2QgcmVjb3ZlcmVkTWV0aG9kID0gKFJlY292ZXJlZE1ldGhvZCljdXJyZW50RWxlbWVudDsKKwkJCS8qIGZpbHRlciBvdXQgY2FzZXMgd2hlcmUgc2Nhbm5lciBpcyBzdGlsbCBpbnNpZGUgdHlwZSBoZWFkZXIgKi8KKwkJCWlmICghcmVjb3ZlcmVkTWV0aG9kLmZvdW5kT3BlbmluZ0JyYWNlKSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSByZWNvdmVyZWRNZXRob2QubWV0aG9kRGVjbGFyYXRpb247CisJCQkJaWYobWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgPT0gbnVsbAorCQkJCQkmJiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhpZGVudGlmaWVyU3RhY2tbaW5kZXhdLCBLZXl3b3Jkcy5USFJPV1MpKSB7CisJCQkJCUNvbXBsZXRpb25PbktleXdvcmQxIGNvbXBsZXRpb25PbktleXdvcmQgPSBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDEoCisJCQkJCQlpZGVudGlmaWVyU3RhY2tbaW5kZXhdLAorCQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbaW5kZXhdLAorCQkJCQkJS2V5d29yZHMuVEhST1dTKTsKKwkJCQkJbWV0aG9kLnRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZVJlZmVyZW5jZVtde2NvbXBsZXRpb25PbktleXdvcmR9OworCQkJCQlyZWNvdmVyZWRNZXRob2QuZm91bmRPcGVuaW5nQnJhY2UgPSB0cnVlOworCQkJCQl0aGlzLmFzc2lzdE5vZGUgPSBjb21wbGV0aW9uT25LZXl3b3JkOworCQkJCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gY29tcGxldGlvbk9uS2V5d29yZC5zb3VyY2VFbmQgKyAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKSB7CisJc3VwZXIuY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpOworCQorCWlmIChjdXJyZW50RWxlbWVudCAhPSBudWxsCisJCSYmIGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCisJCSYmIHRoaXMuY3Vyc29yTG9jYXRpb24rMSA+PSBzY2FubmVyLnN0YXJ0UG9zaXRpb24KKwkJJiYgdGhpcy5jdXJzb3JMb2NhdGlvbiA8IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uKXsKKwkJdGhpcy5wdXNoSWRlbnRpZmllcigpOworCQkKKwkJaW50IGluZGV4ID0gLTE7CisJCS8qIGNoZWNrIGlmIGN1cnJlbnQgYXdhaXRpbmcgaWRlbnRpZmllciBpcyB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyICovCisJCWlmICgoaW5kZXggPSB0aGlzLmluZGV4T2ZBc3Npc3RJZGVudGlmaWVyKCkpID4gLTEpIHsKIAotcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEJvZHkoKSB7Ci0Jc3VwZXIuY29uc3VtZU1ldGhvZEJvZHkoKTsKLQl0aGlzLmxhYmVsQ291bnRlclB0ci0tOwotCWlmICh0aGlzLmJsb2NrSW52b2NhdGlvblB0ciA+PSAwKSB0aGlzLmJsb2NrSW52b2NhdGlvblB0ci0tOworCQkJUmVjb3ZlcmVkTWV0aG9kIHJlY292ZXJlZE1ldGhvZCA9IChSZWNvdmVyZWRNZXRob2QpY3VycmVudEVsZW1lbnQ7CisJCQkvKiBmaWx0ZXIgb3V0IGNhc2VzIHdoZXJlIHNjYW5uZXIgaXMgc3RpbGwgaW5zaWRlIHR5cGUgaGVhZGVyICovCisJCQlpZiAoIXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSkgeworCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gcmVjb3ZlcmVkTWV0aG9kLm1ldGhvZERlY2xhcmF0aW9uOworCQkJCWlmKG1ldGhvZC50aHJvd25FeGNlcHRpb25zID09IG51bGwpIHsKKwkJCQkJQ29tcGxldGlvbk9uS2V5d29yZDEgY29tcGxldGlvbk9uS2V5d29yZCA9IG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMSgKKwkJCQkJCWlkZW50aWZpZXJTdGFja1tpbmRleF0sCisJCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpbmRleF0sCisJCQkJCQlLZXl3b3Jkcy5USFJPV1MpOworCQkJCQltZXRob2QudGhyb3duRXhjZXB0aW9ucyA9IG5ldyBUeXBlUmVmZXJlbmNlW117Y29tcGxldGlvbk9uS2V5d29yZH07CisJCQkJCXJlY292ZXJlZE1ldGhvZC5mb3VuZE9wZW5pbmdCcmFjZSA9IHRydWU7CisJCQkJCXRoaXMuYXNzaXN0Tm9kZSA9IGNvbXBsZXRpb25PbktleXdvcmQ7CisJCQkJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBjb21wbGV0aW9uT25LZXl3b3JkLnNvdXJjZUVuZCArIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQogfQogCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kQm9keSgpIHsKKwlwb3BFbGVtZW50KEtfQkxPQ0tfREVMSU1JVEVSKTsKKwlzdXBlci5jb25zdW1lTWV0aG9kQm9keSgpOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlcigpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyKCk7Ci0JcHVzaEJsb2NrSW52b2NhdGlvblB0cigpOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUik7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTW9kaWZpZXJzKCkgewogCXN1cGVyLmNvbnN1bWVNb2RpZmllcnMoKTsKQEAgLTgzMCwxNyArMTU0Niw3MyBAQAogCXRoaXMubGFzdE1vZGlmaWVyc1N0YXJ0ID0gaW50U3RhY2tbaW50UHRyXTsKIAl0aGlzLmxhc3RNb2RpZmllcnMgPSAJaW50U3RhY2tbaW50UHRyLTFdOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVJlc3RvcmVEaWV0KCkgeworCXN1cGVyLmNvbnN1bWVSZXN0b3JlRGlldCgpOworCWlmIChpc0luc2lkZU1ldGhvZCgpKSB7CisJCXBvcEVsZW1lbnQoS19MT0NBTF9JTklUSUFMSVpFUl9ERUxJTUlURVIpOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRTd2l0Y2goKSB7CisJc3VwZXIuY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpOworCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX1NXSVRDSF9MQUJFTCkgeworCQlwb3BFbGVtZW50KEtfU1dJVENIX0xBQkVMKTsKKwl9Cit9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTmVzdGVkTWV0aG9kKCkgewogCXN1cGVyLmNvbnN1bWVOZXN0ZWRNZXRob2QoKTsKLQl0aGlzLnB1c2hOZXdMYWJlbENvdW50ZXIoKTsKKwlpZighKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSBLX0JMT0NLX0RFTElNSVRFUikpIHB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUik7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSB7Ci0Jc3VwZXIuY29uc3VtZVN0YXRlbWVudExhYmVsKCk7Ci0JaWYgKHRoaXMubGFiZWxDb3VudGVyUHRyID49IDApIHRoaXMubGFiZWxDb3VudGVyU3RhY2tbdGhpcy5sYWJlbENvdW50ZXJQdHJdLS07Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUHVzaFBvc2l0aW9uKCkgeworCXN1cGVyLmNvbnN1bWVQdXNoUG9zaXRpb24oKTsKKwlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CSU5BUllfT1BFUkFUT1IpIHsKKwkJaW50IGluZm8gPSB0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUik7CisJCXBvcEVsZW1lbnQoS19CSU5BUllfT1BFUkFUT1IpOworCQlwdXNoT25FbGVtZW50U3RhY2soS19VTkFSWV9PUEVSQVRPUiwgaW5mbyk7CisJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVRva2VuKGludCB0b2tlbikgeworCWlmKGlzRmlyc3QpIHsKKwkJc3VwZXIuY29uc3VtZVRva2VuKHRva2VuKTsKKwkJcmV0dXJuOworCX0KKwlpZihjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPT0gTkVYVFRPS0VOKSB7CisJCWNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvciA9IFlFUzsKKwl9IGVsc2UgeworCQljYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSBOTzsKKwl9CisJCiAJaW50IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1Rva2VuOwogCWludCBwcmV2aW91c0lkZW50aWZpZXJQdHIgPSB0aGlzLnByZXZpb3VzSWRlbnRpZmllclB0cjsKKwkKKwlpZiAoaXNJbnNpZGVNZXRob2QoKSB8fCBpc0luc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkgeworCQlzd2l0Y2godG9rZW4pIHsKKwkJCWNhc2UgVG9rZW5OYW1lTFBBUkVOOgorCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX05FV19BTkRfTEVGVF9CUkFDS0VUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTEJSQUNFOgorCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX05FV19BTkRfTEVGVF9CUkFDS0VUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCkgeworCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9ORVdfQU5EX0xFRlRfQlJBQ0tFVCk7CisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0FSUkFZX0NSRUFUSU9OKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZVJCUkFDRToKKwkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CTE9DS19ERUxJTUlURVIpIHsKKwkJCQkJcG9wRWxlbWVudChLX0JMT0NLX0RFTElNSVRFUik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcG9wRWxlbWVudChLX0FSUkFZX0lOSVRJQUxJWkVSKTsJCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0tFVDoKKwkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19CRVRXRUVOX0xFRlRfQU5EX1JJR0hUX0JSQUNLRVQpIHsKKwkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fTEVGVF9BTkRfUklHSFRfQlJBQ0tFVCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCX0KKwl9CiAJc3VwZXIuY29uc3VtZVRva2VuKHRva2VuKTsKIAogCS8vIGlmIGluIGZpZWxkIGluaXRpYWxpemVyIChkaXJlY3RseSBvciBub3QpLCBvbiB0aGUgY29tcGxldGlvbiBpZGVudGlmaWVyIGFuZCBub3QgaW4gcmVjb3ZlcnkgbW9kZSB5ZXQKQEAgLTg0OSwxMiArMTYyMSwxMiBAQAogCWlmICh0b2tlbiA9PSBUb2tlbk5hbWVJZGVudGlmaWVyCiAJCQkmJiB0aGlzLmlkZW50aWZpZXJTdGFja1t0aGlzLmlkZW50aWZpZXJQdHJdID09IGFzc2lzdElkZW50aWZpZXIoKQogCQkJJiYgdGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsCi0JCQkmJiB0aGlzLmluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkgeworCQkJJiYgdGhpcy5pc0luZGlyZWN0bHlJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkpIHsKIAkJdGhpcy5zY2FubmVyLmVvZlBvc2l0aW9uID0gY3Vyc29yTG9jYXRpb24gPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IGN1cnNvckxvY2F0aW9uKzEgOiBjdXJzb3JMb2NhdGlvbjsKIAl9CiAJCiAJLy8gaWYgaW4gYSBtZXRob2Qgb3IgaWYgaW4gYSBmaWVsZCBpbml0aWFsaXplciAKLQlpZiAodGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdIHx8IHRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHJdKSB7CisJaWYgKGlzSW5zaWRlTWV0aG9kKCkgfHwgaXNJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkpIHsKIAkJc3dpdGNoICh0b2tlbikgewogCQkJY2FzZSBUb2tlbk5hbWVET1Q6CiAJCQkJc3dpdGNoIChwcmV2aW91cykgewpAQCAtODY1LDcgKzE2MzcsNyBAQAogCQkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IFNVUEVSX1JFQ0VJVkVSOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjogLy8gZWcuIGJhclsuXWZyZWQoKQotCQkJCQkJaWYgKCF0aGlzLmJldHdlZW5OZXdBbmRMZWZ0QnJha2V0KSB7IC8vIGVnLiBub3QgbmV3IHoueVsuXVgoKQorCQkJCQkJaWYgKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSAhPSBLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQpIHsKIAkJCQkJCQlpZiAodGhpcy5pZGVudGlmaWVyUHRyICE9IHByZXZpb3VzSWRlbnRpZmllclB0cikgeyAvLyBpZiBpZGVudGlmaWVyIGhhcyBiZWVuIGNvbnN1bWVkLCBlZy4gdGhpcy54Wy5dZnJlZCgpCiAJCQkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBFWFBMSUNJVF9SRUNFSVZFUjsKIAkJCQkJCQl9IGVsc2UgewpAQCAtODc3LDEwICsxNjQ5LDYgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjoKIAkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lRE9UKSB7IC8vIGVnLiBmb28oKS5bZnJlZF0oKQotCQkJCQkvLyBpZiBjdXJyZW50IGlkZW50aWZpZXIgaXMgdGhlIGVtcHR5IGNvbXBsZXRpb24gb25lCi0JCQkJCWlmIChpZGVudGlmaWVyU3RhY2tbaWRlbnRpZmllclB0cl0gPT0gQ29tcGxldGlvblNjYW5uZXIuRW1wdHlDb21wbGV0aW9uSWRlbnRpZmllcil7Ci0JCQkJCQl0aGlzLmNvbXBsZXRpb25CZWhpbmREb3QgPSB0cnVlOwotCQkJCQl9CiAJCQkJCWlmICh0aGlzLmludm9jYXRpb25UeXBlICE9IFNVUEVSX1JFQ0VJVkVSIC8vIGVnLiBub3Qgc3VwZXIuW2ZyZWRdKCkKIAkJCQkJCSYmIHRoaXMuaW52b2NhdGlvblR5cGUgIT0gTkFNRV9SRUNFSVZFUiAvLyBlZy4gbm90IGJhci5bZnJlZF0oKQogCQkJCQkJJiYgdGhpcy5pbnZvY2F0aW9uVHlwZSAhPSBBTExPQ0FUSU9OIC8vIGVnLiBub3QgbmV3IGZvby5bQmFyXSgpCkBAIC04OTIsNyArMTY2MCw3IEBACiAJCQkJfQogCQkJCWJyZWFrOwkKIAkJCWNhc2UgVG9rZW5OYW1lbmV3OgotCQkJCXRoaXMuYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQgPSB0cnVlOworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fTkVXX0FORF9MRUZUX0JSQUNLRVQpOwogCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOyAvLyBOQjogZXZlbiBpZiB0aGVyZSBpcyBubyBxdWFsaWZpY2F0aW9uLCBzZXQgaXQgdG8gdGhlIGV4cHJlc3Npb24gcHRyIHNvIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlIGNvcnJlY3RseSBjb21wdXRlZAogCQkJCWlmIChwcmV2aW91cyA9PSBUb2tlbk5hbWVET1QpIHsgLy8gZWcuIGZyZWQoKS5bbmV3XSBYKCkKIAkJCQkJdGhpcy5pbnZvY2F0aW9uVHlwZSA9IFFVQUxJRklFRF9BTExPQ0FUSU9OOwpAQCAtOTEzLDExOSArMTY4MSwyODkgQEAKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZWNhdGNoOgotCQkJCXRoaXMuYmV0d2VlbkNhdGNoQW5kUmlnaHRQYXJlbiA9IHRydWU7CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUb2tlbk5hbWVMUEFSRU46Ci0JCQkJdGhpcy5iZXR3ZWVuTmV3QW5kTGVmdEJyYWtldCA9IGZhbHNlOwotCQkJCXRoaXMuYnJhY2tldERlcHRoKys7CiAJCQkJaWYgKHRoaXMuaW52b2NhdGlvblR5cGUgPT0gTk9fUkVDRUlWRVIgfHwgdGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBOQU1FX1JFQ0VJVkVSKSB7CiAJCQkJCXRoaXMucXVhbGlmaWVyID0gdGhpcy5leHByZXNzaW9uUHRyOyAvLyByZW1lbmJlciB0aGUgbGFzdCBleHByZXNzaW9uIHNvIHRoYXQgYXJndW1lbnRzIGFyZSBjb3JyZWN0bHkgY29tcHV0ZWQKIAkJCQl9CiAJCQkJc3dpdGNoIChwcmV2aW91cykgewogCQkJCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXI6IC8vIGVnLiBmcmVkWyhdKSBvciBmb28uZnJlZFsoXSkKLQkJCQkJCXRoaXMucHVzaE9uSW52b2NhdGlvblN0YWNrcyh0aGlzLmludm9jYXRpb25UeXBlLCB0aGlzLnF1YWxpZmllcik7CisJCQkJCQlpZiAodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfU0VMRUNUT1IpIHsKKwkJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SX0lOVk9DQVRJT05fVFlQRSwgdGhpcy5pbnZvY2F0aW9uVHlwZSk7CisJCQkJCQkJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soS19TRUxFQ1RPUl9RVUFMSUZJRVIsIHRoaXMucXVhbGlmaWVyKTsKKwkJCQkJCX0KIAkJCQkJCXRoaXMuaW52b2NhdGlvblR5cGUgPSBOT19SRUNFSVZFUjsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFRva2VuTmFtZXRoaXM6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiB0aGlzWyhdMSwgMikKLQkJCQkJCXRoaXMucHVzaE9uSW52b2NhdGlvblN0YWNrcygKLQkJCQkJCQkodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBRVUFMSUZJRURfQUxMT0NBVElPTikgPyBRVUFMSUZJRURfQUxMT0NBVElPTiA6IEFMTE9DQVRJT04sIAotCQkJCQkJCXRoaXMucXVhbGlmaWVyKTsKKwkJCQkJCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19TRUxFQ1RPUikgeworCQkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1JfSU5WT0NBVElPTl9UWVBFLCAodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBRVUFMSUZJRURfQUxMT0NBVElPTikgPyBRVUFMSUZJRURfQUxMT0NBVElPTiA6IEFMTE9DQVRJT04pOworCQkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1JfUVVBTElGSUVSLCB0aGlzLnF1YWxpZmllcik7CisJCQkJCQl9CiAJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHN1cGVyWyhdMSwgMikKLQkJCQkJCXRoaXMucHVzaE9uSW52b2NhdGlvblN0YWNrcygKLQkJCQkJCQkodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBRVUFMSUZJRURfQUxMT0NBVElPTikgPyBRVUFMSUZJRURfQUxMT0NBVElPTiA6IEFMTE9DQVRJT04sIAotCQkJCQkJCXRoaXMucXVhbGlmaWVyKTsKKwkJCQkJCWlmICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gS19TRUxFQ1RPUikgeworCQkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1JfSU5WT0NBVElPTl9UWVBFLCAodGhpcy5pbnZvY2F0aW9uVHlwZSA9PSBRVUFMSUZJRURfQUxMT0NBVElPTikgPyBRVUFMSUZJRURfQUxMT0NBVElPTiA6IEFMTE9DQVRJT04pOworCQkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1JfUVVBTElGSUVSLCB0aGlzLnF1YWxpZmllcik7CisJCQkJCQl9CiAJCQkJCQl0aGlzLmludm9jYXRpb25UeXBlID0gTk9fUkVDRUlWRVI7CiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZUxCUkFDRToKLQkJCQl0aGlzLmJldHdlZW5OZXdBbmRMZWZ0QnJha2V0ID0gZmFsc2U7CiAJCQkJdGhpcy5icmFja2V0RGVwdGgrKzsKLQkJCQl0aGlzLnB1c2hCbG9ja0ludm9jYXRpb25QdHIoKTsKKwkJCQlpbnQga2luZDsKKwkJCQlpZigoa2luZCA9IHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSkgPT0gS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIKKwkJCQkJfHwga2luZCA9PSBLX0xPQ0FMX0lOSVRJQUxJWkVSX0RFTElNSVRFUgorCQkJCQl8fCBraW5kID09IEtfQVJSQVlfQ1JFQVRJT04pIHsKKwkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQVJSQVlfSU5JVElBTElaRVIsIGVuZFBvc2l0aW9uKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzd2l0Y2gocHJldmlvdXMpIHsKKwkJCQkJCWNhc2UgVG9rZW5OYW1lUlBBUkVOIDoKKwkJCQkJCQlzd2l0Y2gocHJldmlvdXNLaW5kKSB7CisJCQkJCQkJCWNhc2UgS19CRVRXRUVOX0lGX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIElGKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4gOgorCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBDQVRDSCk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSBLX0JFVFdFRU5fV0hJTEVfQU5EX1JJR0hUX1BBUkVOIDoKKwkJCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUiwgV0hJTEUpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU4gOgorCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBTV0lUQ0gpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgS19CRVRXRUVOX0ZPUl9BTkRfUklHSFRfUEFSRU4gOgorCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBGT1IpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgS19CRVRXRUVOX1NZTkNIUk9OSVpFRF9BTkRfUklHSFRfUEFSRU4gOgorCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSLCBTWU5DSFJPTklaRUQpOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVG9rZW5OYW1ldHJ5IDoKKwkJCQkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CTE9DS19ERUxJTUlURVIsIFRSWSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFRva2VuTmFtZWRvOgorCQkJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JMT0NLX0RFTElNSVRFUiwgRE8pOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkxPQ0tfREVMSU1JVEVSKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lTEJSQUNLRVQ6Ci0JCQkJdGhpcy5iZXR3ZWVuTmV3QW5kTGVmdEJyYWtldCA9IGZhbHNlOworCQkJCWlmKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSAhPSBLX0FSUkFZX0NSRUFUSU9OKSB7CisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JFVFdFRU5fTEVGVF9BTkRfUklHSFRfQlJBQ0tFVCk7CisJCQkJfQogCQkJCXRoaXMuYnJhY2tldERlcHRoKys7CiAJCQkJYnJlYWs7IAogCQkJY2FzZSBUb2tlbk5hbWVSQlJBQ0U6CiAJCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKLQkJCQlpZiAodGhpcy5ibG9ja0ludm9jYXRpb25QdHIgPj0gMCkgdGhpcy5ibG9ja0ludm9jYXRpb25QdHItLTsKIAkJCQlicmVhazsKIAkJCWNhc2UgVG9rZW5OYW1lUkJSQUNLRVQ6CiAJCQkJdGhpcy5icmFja2V0RGVwdGgtLTsKIAkJCQlicmVhazsgCiAJCQljYXNlIFRva2VuTmFtZVJQQVJFTjoKLQkJCQl0aGlzLmJldHdlZW5DYXRjaEFuZFJpZ2h0UGFyZW4gPSBmYWxzZTsKLQkJCQl0aGlzLmJyYWNrZXREZXB0aC0tOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUb2tlbk5hbWVDT0xPTjoKLQkJCQlpZiAocHJldmlvdXMgPT0gVG9rZW5OYW1lSWRlbnRpZmllcikgewotCQkJCQlpZiAodGhpcy5sYWJlbENvdW50ZXJQdHIgPj0gMCkgdGhpcy5sYWJlbENvdW50ZXJTdGFja1t0aGlzLmxhYmVsQ291bnRlclB0cl0rKzsKKwkJCQlzd2l0Y2godG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpKSB7CisJCQkJCWNhc2UgS19CRVRXRUVOX0NBVENIX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQlwb3BFbGVtZW50KEtfQkVUV0VFTl9DQVRDSF9BTkRfUklHSFRfUEFSRU4pOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgS19CRVRXRUVOX0lGX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fSUZfQU5EX1JJR0hUX1BBUkVOKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEtfQkVUV0VFTl9XSElMRV9BTkRfUklHSFRfUEFSRU4gOgorCQkJCQkJaWYodG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IGJyYWNrZXREZXB0aCkgeworCQkJCQkJCXBvcEVsZW1lbnQoS19CRVRXRUVOX1dISUxFX0FORF9SSUdIVF9QQVJFTik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fRk9SX0FORF9SSUdIVF9QQVJFTik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0JFVFdFRU5fU1dJVENIX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fU1dJVENIX0FORF9SSUdIVF9QQVJFTik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0JFVFdFRU5fU1lOQ0hST05JWkVEX0FORF9SSUdIVF9QQVJFTiA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gYnJhY2tldERlcHRoKSB7CisJCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fU1lOQ0hST05JWkVEX0FORF9SSUdIVF9QQVJFTik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRva2VuTmFtZXRocm93OgotCQkJCXRoaXMudGhyb3dCcmFja2V0RGVwdGg9IGJyYWNrZXREZXB0aDsKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfVEhST1dfU1RBVEVNRU5ULCBicmFja2V0RGVwdGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVTRU1JQ09MT046CisJCQkJc3dpdGNoKHRvcEtub3duRWxlbWVudEtpbmQoQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSkgeworCQkJCQljYXNlIEtfSU5TSURFX1RIUk9XX1NUQVRFTUVOVCA6CisJCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgPT0gdGhpcy5icmFja2V0RGVwdGgpIHsKKwkJCQkJCQlwb3BFbGVtZW50KEtfSU5TSURFX1RIUk9XX1NUQVRFTUVOVCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0lOU0lERV9SRVRVUk5fU1RBVEVNRU5UIDoKKwkJCQkJCWlmKHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSB0aGlzLmJyYWNrZXREZXB0aCkgeworCQkJCQkJCXBvcEVsZW1lbnQoS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBLX0lOU0lERV9BU1NFUlRfU1RBVEVNRU5UIDoKKwkJCQkJCWlmKHRvcEtub3duRWxlbWVudEluZm8oQ09NUExFVElPTl9PUl9BU1NJU1RfUEFSU0VSKSA9PSB0aGlzLmJyYWNrZXREZXB0aCkgeworCQkJCQkJCXBvcEVsZW1lbnQoS19JTlNJREVfQVNTRVJUX1NUQVRFTUVOVCk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZXJldHVybjoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfUkVUVVJOX1NUQVRFTUVOVCwgdGhpcy5icmFja2V0RGVwdGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWToKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIE1VTFRJUExZKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lRElWSURFOgorCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgRElWSURFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lUkVNQUlOREVSOgorCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgUkVNQUlOREVSKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lUExVUzoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIFBMVVMpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVNSU5VUzoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIE1JTlVTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTEVGVF9TSElGVDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIExFRlRfU0hJRlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIFJJR0hUX1NISUZUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lVU5TSUdORURfUklHSFRfU0hJRlQ6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBVTlNJR05FRF9SSUdIVF9TSElGVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZUxFU1M6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBMRVNTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUjoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIEdSRUFURVIpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMOgorCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgTEVTU19FUVVBTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZUdSRUFURVJfRVFVQUw6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBHUkVBVEVSX0VRVUFMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lQU5EOgorCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgQU5EKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lWE9SOgorCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0JJTkFSWV9PUEVSQVRPUiwgWE9SKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lT1I6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBPUik7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZUFORF9BTkQ6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBBTkRfQU5EKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lT1JfT1I6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBPUl9PUik7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZVBMVVNfUExVUzoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19VTkFSWV9PUEVSQVRPUiwgUExVU19QTFVTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lTUlOVVNfTUlOVVM6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfVU5BUllfT1BFUkFUT1IsIE1JTlVTX01JTlVTKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lVFdJRERMRToKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19VTkFSWV9PUEVSQVRPUiwgVFdJRERMRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZU5PVDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19VTkFSWV9PUEVSQVRPUiwgTk9UKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUw6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBFUVVBTF9FUVVBTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZU5PVF9FUVVBTDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CSU5BUllfT1BFUkFUT1IsIE5PVF9FUVVBTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZWluc3RhbmNlb2Y6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQklOQVJZX09QRVJBVE9SLCBJTlNUQU5DRU9GKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT046CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQ09ORElUSU9OQUxfT1BFUkFUT1IsIFFVRVNUSU9OKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lQ09MT046CisJCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQ09ORElUSU9OQUxfT1BFUkFUT1IKKwkJCQkJJiYgdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IFFVRVNUSU9OKSB7CisJCQkJCXBvcEVsZW1lbnQoS19DT05ESVRJT05BTF9PUEVSQVRPUik7CisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX0NPTkRJVElPTkFMX09QRVJBVE9SLCBDT0xPTik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkVUV0VFTl9DQVNFX0FORF9DT0xPTikgeworCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fQ0FTRV9BTkRfQ09MT04pOworCQkJCQl9IGVsc2UgeworCQkJCQkJcG9wRWxlbWVudChLX0JFVFdFRU5fREVGQVVMVF9BTkRfQ09MT04pOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVpZjoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX0lGX0FORF9SSUdIVF9QQVJFTiwgYnJhY2tldERlcHRoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1ld2hpbGU6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9XSElMRV9BTkRfUklHSFRfUEFSRU4sIGJyYWNrZXREZXB0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZWZvcjoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX0ZPUl9BTkRfUklHSFRfUEFSRU4sIGJyYWNrZXREZXB0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZXN3aXRjaDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX1NXSVRDSF9BTkRfUklHSFRfUEFSRU4sIGJyYWNrZXREZXB0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZXN5bmNocm9uaXplZDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX1NZTkNIUk9OSVpFRF9BTkRfUklHSFRfUEFSRU4sIGJyYWNrZXREZXB0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRva2VuTmFtZWFzc2VydDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19JTlNJREVfQVNTRVJUX1NUQVRFTUVOVCwgdGhpcy5icmFja2V0RGVwdGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBUb2tlbk5hbWVjYXNlIDoKKwkJCQlwdXNoT25FbGVtZW50U3RhY2soS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVG9rZW5OYW1lZGVmYXVsdCA6CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfQkVUV0VFTl9ERUZBVUxUX0FORF9DT0xPTik7CiAJCQkJYnJlYWs7CiAJCX0KIAl9CiB9Ci0vKioKLSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBhc3Qgbm9kZSBjb250YWlucyB0aGUgY29tcGxldGlvbiBub2RlLgotICovCi1wcml2YXRlIGJvb2xlYW4gY29udGFpbnNDb21wbGV0aW9uTm9kZShBc3ROb2RlIGFzdCkgewotCWlmICh0aGlzLmFzc2lzdE5vZGUgPT0gbnVsbCB8fCBhc3QgaW5zdGFuY2VvZiBMaXRlcmFsKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKHRoaXMuYXNzaXN0Tm9kZSA9PSBhc3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCWlmIChhc3QgaW5zdGFuY2VvZiBSZWZlcmVuY2UgfHwgYXN0IGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgewotCQlyZXR1cm4gYXN0ID09IHRoaXMuYXNzaXN0Tm9kZTsKLQl9Ci0JaWYgKGFzdCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHsKLQkJQXNzaWdubWVudCBhc3NpZ24gPSAoQXNzaWdubWVudClhc3Q7Ci0JCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGFzc2lnbi5saHMpIHx8IGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoYXNzaWduLmV4cHJlc3Npb24pOwotCX0KLQlpZiAoYXN0IGluc3RhbmNlb2YgVW5hcnlFeHByZXNzaW9uKSB7Ci0JCVVuYXJ5RXhwcmVzc2lvbiB1bmFyeSA9IChVbmFyeUV4cHJlc3Npb24pYXN0OwotCQlyZXR1cm4gY29udGFpbnNDb21wbGV0aW9uTm9kZSh1bmFyeS5leHByZXNzaW9uKTsKLQl9Ci0JaWYgKGFzdCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKLQkJQmluYXJ5RXhwcmVzc2lvbiBiaW5hcnkgPSAoQmluYXJ5RXhwcmVzc2lvbilhc3Q7Ci0JCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGJpbmFyeS5sZWZ0KSB8fCBjb250YWluc0NvbXBsZXRpb25Ob2RlKGJpbmFyeS5yaWdodCk7Ci0JfQotCWlmIChhc3QgaW5zdGFuY2VvZiBJbnN0YW5jZU9mRXhwcmVzc2lvbikgewotCQlJbnN0YW5jZU9mRXhwcmVzc2lvbiBpbnN0YW5jZU9mRXhwciA9IChJbnN0YW5jZU9mRXhwcmVzc2lvbilhc3Q7Ci0JCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGluc3RhbmNlT2ZFeHByLmV4cHJlc3Npb24pIHx8IGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoaW5zdGFuY2VPZkV4cHIudHlwZSk7Ci0JfQotCWlmIChhc3QgaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsKLQkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsID0gKENvbmRpdGlvbmFsRXhwcmVzc2lvbilhc3Q7Ci0JCXJldHVybiBjb250YWluc0NvbXBsZXRpb25Ob2RlKGNvbmRpdGlvbmFsLmNvbmRpdGlvbikgfHwgY29udGFpbnNDb21wbGV0aW9uTm9kZShjb25kaXRpb25hbC52YWx1ZUlmVHJ1ZSkgfHwgY29udGFpbnNDb21wbGV0aW9uTm9kZShjb25kaXRpb25hbC52YWx1ZUlmRmFsc2UpOwotCX0KLQlpZiAoYXN0IGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLQkJQWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQWxsb2NhdGlvbkV4cHJlc3Npb24pYXN0OwotCQlyZXR1cm4gY29udGFpbnNDb21wbGV0aW9uTm9kZShhbGxvYy50eXBlKTsKLQl9Ci0JaWYgKGFzdCBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKSB7Ci0JCUNhc3RFeHByZXNzaW9uIGNhc3QgPSAoQ2FzdEV4cHJlc3Npb24pYXN0OwotCQlyZXR1cm4gY29udGFpbnNDb21wbGV0aW9uTm9kZShjYXN0LmV4cHJlc3Npb24pIHx8IGNvbnRhaW5zQ29tcGxldGlvbk5vZGUoY2FzdC50eXBlKTsKLQl9Ci0JaWYgKGFzdCBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB7Ci0JCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNhbGwgPSAoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpYXN0OwotCQlFeHByZXNzaW9uW10gYXJndW1lbnRzID0gY2FsbC5hcmd1bWVudHM7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY29udGFpbnNDb21wbGV0aW9uTm9kZShhcmd1bWVudHNbaV0pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oaW50IG9wKSB7CisJc3VwZXIuY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihvcCk7CisJcG9wRWxlbWVudChLX1VOQVJZX09QRVJBVE9SKTsKKwkKKwlpZihleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gaW5zdGFuY2VvZiBVbmFyeUV4cHJlc3Npb24pIHsKKwkJVW5hcnlFeHByZXNzaW9uIGV4cCA9IChVbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwkJaWYoYXNzaXN0Tm9kZSAhPSBudWxsICYmIGV4cC5leHByZXNzaW9uID09IGFzc2lzdE5vZGUpIHsKKwkJCWFzc2lzdE5vZGVQYXJlbnQgPSBleHA7CiAJCX0KIAl9Ci0JcmV0dXJuIGZhbHNlOwogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihpbnQgb3AsIGJvb2xlYW4gcG9zdCkgeworCXN1cGVyLmNvbnN1bWVVbmFyeUV4cHJlc3Npb24ob3AsIHBvc3QpOworCXBvcEVsZW1lbnQoS19VTkFSWV9PUEVSQVRPUik7CisJCisJaWYoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdIGluc3RhbmNlb2YgVW5hcnlFeHByZXNzaW9uKSB7CisJCVVuYXJ5RXhwcmVzc2lvbiBleHAgPSAoVW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJCWlmKGFzc2lzdE5vZGUgIT0gbnVsbCAmJiBleHAuZXhwcmVzc2lvbiA9PSBhc3Npc3ROb2RlKSB7CisJCQlhc3Npc3ROb2RlUGFyZW50ID0gZXhwOworCQl9CisJfQorfQorCiBwdWJsaWMgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUFzc2lzdEltcG9ydFJlZmVyZW5jZShjaGFyW11bXSB0b2tlbnMsIGxvbmdbXSBwb3NpdGlvbnMpewogCXJldHVybiBuZXcgQ29tcGxldGlvbk9uSW1wb3J0UmVmZXJlbmNlKHRva2VucywgcG9zaXRpb25zKTsKIH0KQEAgLTEwMzksMzcgKzE5NzcsMTEwIEBACiAJCQkJCXBvc2l0aW9ucyk7IAkKIH0KIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVF1YWxpZmllZEFzc2lzdFR5cGVSZWZlcmVuY2UoY2hhcltdW10gcHJldmlvdXNJZGVudGlmaWVycywgY2hhcltdIG5hbWUsIGxvbmdbXSBwb3NpdGlvbnMpewotCXJldHVybiB0aGlzLmJldHdlZW5DYXRjaEFuZFJpZ2h0UGFyZW4gfHwgdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzRXhjZXB0aW9uIC8vIGNoZWNrIGZvciBleGNlcHRpb24gc2NlbmFyaW8gCi0JCQkJPyBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkRXhjZXB0aW9uUmVmZXJlbmNlKAotCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLCAgCi0JCQkJCW5hbWUsIAotCQkJCQlwb3NpdGlvbnMpCi0JCQkJOiB0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNJbnRlcmZhY2UKLQkJCQkJPyBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkSW50ZXJmYWNlUmVmZXJlbmNlKAotCQkJCQkJcHJldmlvdXNJZGVudGlmaWVycywgCi0JCQkJCQluYW1lLCAKLQkJCQkJCXBvc2l0aW9ucykKLQkJCQkJOiB0aGlzLm5leHRUeXBlUmVmZXJlbmNlSXNDbGFzcwotCQkJCQkJPyBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkQ2xhc3NSZWZlcmVuY2UoCi0JCQkJCQkJcHJldmlvdXNJZGVudGlmaWVycywgCi0JCQkJCQkJbmFtZSwgCi0JCQkJCQkJcG9zaXRpb25zKQotCQkJCQkJOiBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSgKLQkJCQkJCQlwcmV2aW91c0lkZW50aWZpZXJzLCAKLQkJCQkJCQluYW1lLCAKLQkJCQkJCQlwb3NpdGlvbnMpOyAJCisJc3dpdGNoICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKKwkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04gOgorCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25RdWFsaWZpZWRFeGNlcHRpb25SZWZlcmVuY2UocHJldmlvdXNJZGVudGlmaWVycywgbmFtZSwgcG9zaXRpb25zKTsKKwkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19DTEFTUyA6CisJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblF1YWxpZmllZENsYXNzUmVmZXJlbmNlKHByZXZpb3VzSWRlbnRpZmllcnMsIG5hbWUsIHBvc2l0aW9ucyk7CisJCWNhc2UgS19ORVhUX1RZUEVSRUZfSVNfSU5URVJGQUNFIDoKKwkJCXJldHVybiBuZXcgQ29tcGxldGlvbk9uUXVhbGlmaWVkSW50ZXJmYWNlUmVmZXJlbmNlKHByZXZpb3VzSWRlbnRpZmllcnMsIG5hbWUsIHBvc2l0aW9ucyk7CisJCWRlZmF1bHQgOgorCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHByZXZpb3VzSWRlbnRpZmllcnMsIG5hbWUsIHBvc2l0aW9ucyk7IAorCX0KIH0KIHB1YmxpYyBOYW1lUmVmZXJlbmNlIGNyZWF0ZVNpbmdsZUFzc2lzdE5hbWVSZWZlcmVuY2UoY2hhcltdIG5hbWUsIGxvbmcgcG9zaXRpb24pIHsKLQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pOworCWludCBraW5kID0gdG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpOworCWlmKCFpc0luc2lkZU1ldGhvZCgpKSB7CisJCXJldHVybiBuZXcgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbik7CisJfSBlbHNlIHsKKwkJYm9vbGVhbiBjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisJCWlmKGtpbmQgPT0gS19CTE9DS19ERUxJTUlURVIKKwkJCSYmIHByZXZpb3VzS2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUgorCQkJJiYgcHJldmlvdXNJbmZvID09IERPKSB7CisJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PbktleXdvcmQzKG5hbWUsIHBvc2l0aW9uLCBLZXl3b3Jkcy5XSElMRSk7CisJCX0gZWxzZSBpZihraW5kID09IEtfQkxPQ0tfREVMSU1JVEVSCisJCQkmJiBwcmV2aW91c0tpbmQgPT0gS19CTE9DS19ERUxJTUlURVIKKwkJCSYmIHByZXZpb3VzSW5mbyA9PSBUUlkpIHsKKwkJCXJldHVybiBuZXcgQ29tcGxldGlvbk9uS2V5d29yZDMobmFtZSwgcG9zaXRpb24sIG5ldyBjaGFyW11bXXtLZXl3b3Jkcy5DQVRDSCwgS2V5d29yZHMuRklOQUxMWX0pOworCQl9IGVsc2UgaWYoa2luZCA9PSBLX0JMT0NLX0RFTElNSVRFUgorCQkJJiYgdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IFNXSVRDSCkgeworCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25LZXl3b3JkMyhuYW1lLCBwb3NpdGlvbiwgbmV3IGNoYXJbXVtde0tleXdvcmRzLkNBU0UsIEtleXdvcmRzLkRFRkFVTFR9KTsKKwkJfSBlbHNlIHsKKwkJCWNoYXJbXVtdIGtleXdvcmRzID0gbmV3IGNoYXJbS2V5d29yZHMuQ09VTlRdW107CisJCQlpbnQgY291bnQgPSAwOworCQkJCisJCQlpZigobGFzdE1vZGlmaWVycyAmIEFjY1N0YXRpYykgPT0gMCkgeworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5TVVBFUjsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuVEhJUzsKKwkJCX0KKwkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5ORVc7CisJCQkKKwkJCWlmKGtpbmQgPT0gS19CTE9DS19ERUxJTUlURVIpIHsKKwkJCQlpZihjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPT0gWUVTKSB7CisJCQkJCWNhbkJlRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSB0cnVlOworCQkJCX0KKwkJCQkKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQVNTRVJUOworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5ETzsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuRk9SOworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5JRjsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuUkVUVVJOOworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5TV0lUQ0g7CisJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLlNZTkNIUk9OSVpFRDsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuVEhST1c7CisJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLlRSWTsKKwkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuV0hJTEU7CisJCQkJCisJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkZJTkFMOworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5DTEFTUzsKKwkJCQkKKwkJCQlpZihwcmV2aW91c0tpbmQgPT0gS19CTE9DS19ERUxJTUlURVIpIHsKKwkJCQkJc3dpdGNoIChwcmV2aW91c0luZm8pIHsKKwkJCQkJCWNhc2UgSUYgOgorCQkJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5FTFNFOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBDQVRDSCA6CisJCQkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkNBVENIOworCQkJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5GSU5BTExZOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmKGlzSW5zaWRlTG9vcCgpKSB7CisJCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5DT05USU5VRTsKKwkJCQl9CisJCQkJaWYoaXNJbnNpZGVCcmVha2FibGUoKSkgeworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQlJFQUs7CisJCQkJfQorCQkJfSBlbHNlIGlmKGtpbmQgIT0gS19CRVRXRUVOX0NBU0VfQU5EX0NPTE9OICYmIGtpbmQgIT0gS19CRVRXRUVOX0RFRkFVTFRfQU5EX0NPTE9OKSB7CisJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLlRSVUU7CisJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkZBTFNFOworCQkJCWtleXdvcmRzW2NvdW50KytdPSBLZXl3b3Jkcy5OVUxMOworCQkJCisJCQkJaWYoa2luZCA9PSBLX1NXSVRDSF9MQUJFTCkgeworCQkJCQlpZih0b3BLbm93bkVsZW1lbnRJbmZvKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgIT0gREVGQVVMVCkgeworCQkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkRFRkFVTFQ7CisJCQkJCX0KKwkJCQkJa2V5d29yZHNbY291bnQrK109IEtleXdvcmRzLkJSRUFLOworCQkJCQlrZXl3b3Jkc1tjb3VudCsrXT0gS2V5d29yZHMuQ0FTRTsKKwkJCQl9CisJCQl9CisJCQlTeXN0ZW0uYXJyYXljb3B5KGtleXdvcmRzLCAwICwga2V5d29yZHMgPSBuZXcgY2hhcltjb3VudF1bXSwgMCwgY291bnQpOworCQkJCisJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24sIGtleXdvcmRzLCBjYW5CZUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKTsKKwkJfQorCX0KIH0KIHB1YmxpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVNpbmdsZUFzc2lzdFR5cGVSZWZlcmVuY2UoY2hhcltdIG5hbWUsIGxvbmcgcG9zaXRpb24pIHsKLQlyZXR1cm4gdGhpcy5iZXR3ZWVuQ2F0Y2hBbmRSaWdodFBhcmVuIHx8IHRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0V4Y2VwdGlvbiAvLyBjaGVjayBmb3IgZXhjZXB0aW9uIHNjZW5hcmlvIAotCQk/IG5ldyBDb21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pIAotCQk6IHRoaXMubmV4dFR5cGVSZWZlcmVuY2VJc0ludGVyZmFjZQotCQkJPyBuZXcgQ29tcGxldGlvbk9uSW50ZXJmYWNlUmVmZXJlbmNlKG5hbWUsIHBvc2l0aW9uKSAKLQkJCTogdGhpcy5uZXh0VHlwZVJlZmVyZW5jZUlzQ2xhc3MKLQkJCQk/IG5ldyBDb21wbGV0aW9uT25DbGFzc1JlZmVyZW5jZShuYW1lLCBwb3NpdGlvbikgCi0JCQkJOiBuZXcgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbik7CisJc3dpdGNoICh0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikpIHsKKwkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19FWENFUFRJT04gOgorCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25FeGNlcHRpb25SZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pIDsKKwkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19DTEFTUyA6CisJCQlyZXR1cm4gbmV3IENvbXBsZXRpb25PbkNsYXNzUmVmZXJlbmNlKG5hbWUsIHBvc2l0aW9uKTsKKwkJY2FzZSBLX05FWFRfVFlQRVJFRl9JU19JTlRFUkZBQ0UgOgorCQkJcmV0dXJuIG5ldyBDb21wbGV0aW9uT25JbnRlcmZhY2VSZWZlcmVuY2UobmFtZSwgcG9zaXRpb24pOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBuZXcgQ29tcGxldGlvbk9uU2luZ2xlVHlwZVJlZmVyZW5jZShuYW1lLCBwb3NpdGlvbik7IAorCX0KIH0KIHB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBkaWV0UGFyc2UoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCwgaW50IGN1cnNvckxvY2F0aW9uKSB7CiAKQEAgLTEwODYsNiArMjA5Nyw3IEBACiAKIAlzdXBlci5mbHVzaEFzc2lzdFN0YXRlKCk7CiAJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CisJYXNzaXN0Tm9kZVBhcmVudCA9IG51bGw7CiAJQ29tcGxldGlvblNjYW5uZXIgY29tcGxldGlvblNjYW5uZXIgPSAoQ29tcGxldGlvblNjYW5uZXIpdGhpcy5zY2FubmVyOwogCWNvbXBsZXRpb25TY2FubmVyLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCA9IDA7CiAJY29tcGxldGlvblNjYW5uZXIuY29tcGxldGVkSWRlbnRpZmllckVuZCA9IC0xOwpAQCAtMTA5NywyMCArMjEwOSw5IEBACiAJfQogCXJldHVybiBzdXBlci5nZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpOwogfQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYXN0IG5vZGUgaGFzIGluZm9ybWF0aW9uIGludGVycmVzdGluZyBmb3IgY29kZSBjb21wbGV0aW9uLgotICovCi1wcml2YXRlIGJvb2xlYW4gaGFzQ29tcGxldGlvbkluZm9ybWF0aW9uKEFzdE5vZGUgYXN0KSB7Ci0JcmV0dXJuICgKLQkJYXN0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB8fAotCQlhc3QgaW5zdGFuY2VvZiBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gfHwKLQkJYXN0IGluc3RhbmNlb2YgTGFiZWxlZFN0YXRlbWVudCB8fAotCQlhc3QgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOwotfQogcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAlzdXBlci5pbml0aWFsaXplKCk7CiAJdGhpcy5pbml0aWFsaXplRm9yQmxvY2tTdGF0ZW1lbnRzKCk7Ci0JdGhpcy5sYWJlbENvdW50ZXJQdHIgPSAtMTsKIH0KIC8qCiAgKiBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciB0aGF0IGlzIGFib3V0IHRvIGdvIGZvciBCbG9ja1N0YXRlbWVudHMuCkBAIC0xMTE4LDE0ICsyMTE5LDEzIEBACiBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvckJsb2NrU3RhdGVtZW50cygpIHsKIAl0aGlzLnByZXZpb3VzVG9rZW4gPSAtMTsKIAl0aGlzLnByZXZpb3VzSWRlbnRpZmllclB0ciA9IC0xOwotCXRoaXMuY29tcGxldGlvbkJlaGluZERvdCA9IGZhbHNlOwotCXRoaXMuYmV0d2Vlbk5ld0FuZExlZnRCcmFrZXQgPSBmYWxzZTsKLQl0aGlzLmJldHdlZW5DYXRjaEFuZFJpZ2h0UGFyZW4gPSBmYWxzZTsKIAl0aGlzLmJyYWNrZXREZXB0aCA9IDA7Ci0JdGhpcy50aHJvd0JyYWNrZXREZXB0aCA9IC0xOwogCXRoaXMuaW52b2NhdGlvblR5cGUgPSBOT19SRUNFSVZFUjsKIAl0aGlzLnF1YWxpZmllciA9IC0xOwotCXRoaXMuYmxvY2tJbnZvY2F0aW9uUHRyID0gLTE7CisJcG9wVW50aWxFbGVtZW50KEtfU1dJVENIX0xBQkVMKTsKKwlpZih0b3BLbm93bkVsZW1lbnRLaW5kKENPTVBMRVRJT05fT1JfQVNTSVNUX1BBUlNFUikgIT0gS19TV0lUQ0hfTEFCRUwpIHsKKwkJdGhpcy5wb3BVbnRpbEVsZW1lbnQoS19CTE9DS19ERUxJTUlURVIpOworCX0KIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7CiAJdGhpcy5zY2FubmVyID0gbmV3IENvbXBsZXRpb25TY2FubmVyKHRoaXMuYXNzZXJ0TW9kZSk7CkBAIC0xMTQ5LDYgKzIxNDksODIgQEAKIAkJdGhpcy5hc3Npc3ROb2RlIGluc3RhbmNlb2YgQ29tcGxldGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZSAmJgogCQkoKChDb21wbGV0aW9uT25TaW5nbGVOYW1lUmVmZXJlbmNlKXRoaXMuYXNzaXN0Tm9kZSkudG9rZW4ubGVuZ3RoID09IDApOwogfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRpcmVjdGx5SW5zaWRlQmxvY2soKXsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCWlmKGVsZW1lbnRLaW5kU3RhY2tbaV0gPT0gS19CTE9DS19ERUxJTUlURVIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaS0tOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3Byb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlQmxvY2soKXsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCXN3aXRjaCAoZWxlbWVudEtpbmRTdGFja1tpXSkgeworCQkJY2FzZSBLX1RZUEVfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX0JMT0NLX0RFTElNSVRFUiA6IHJldHVybiB0cnVlOworCQl9CisJCWktLTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnNpZGVCcmVha2FibGUoKXsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCXN3aXRjaCAoZWxlbWVudEtpbmRTdGFja1tpXSkgeworCQkJY2FzZSBLX1RZUEVfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX1NXSVRDSF9MQUJFTCA6IHJldHVybiB0cnVlOworCQkJY2FzZSBLX0JMT0NLX0RFTElNSVRFUiA6CisJCQkJc3dpdGNoKGVsZW1lbnRJbmZvU3RhY2tbaV0pIHsKKwkJCQkJY2FzZSBGT1IgOgorCQkJCQljYXNlIERPIDoKKwkJCQkJY2FzZSBXSElMRSA6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCX0KKwkJaS0tOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9Citwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc2lkZUxvb3AoKXsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCXN3aXRjaCAoZWxlbWVudEtpbmRTdGFja1tpXSkgeworCQkJY2FzZSBLX1RZUEVfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX01FVEhPRF9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX0JMT0NLX0RFTElNSVRFUiA6CisJCQkJc3dpdGNoKGVsZW1lbnRJbmZvU3RhY2tbaV0pIHsKKwkJCQkJY2FzZSBGT1IgOgorCQkJCQljYXNlIERPIDoKKwkJCQkJY2FzZSBXSElMRSA6CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCX0KKwkJaS0tOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9Citwcm90ZWN0ZWQgYm9vbGVhbiBpc0luc2lkZVJldHVybigpeworCWludCBpID0gZWxlbWVudFB0cjsKKwl3aGlsZShpID4gLTEpIHsKKwkJc3dpdGNoIChlbGVtZW50S2luZFN0YWNrW2ldKSB7CisJCQljYXNlIEtfVFlQRV9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfTUVUSE9EX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKKwkJCWNhc2UgS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfQkxPQ0tfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX0lOU0lERV9SRVRVUk5fU1RBVEVNRU5UIDogcmV0dXJuIHRydWU7CisJCX0KKwkJaS0tOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2UoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCwgaW50IGN1cnNvckxvY2F0aW9uKSB7CiAKIAl0aGlzLmN1cnNvckxvY2F0aW9uID0gY3Vyc29yTG9jYXRpb247CkBAIC0xMTU3LDI0ICsyMjMzLDIyIEBACiAJY29tcGxldGlvblNjYW5uZXIuY3Vyc29yTG9jYXRpb24gPSBjdXJzb3JMb2NhdGlvbjsKIAlyZXR1cm4gdGhpcy5wYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7CiB9CitwdWJsaWMgdm9pZCBwYXJzZUJsb2NrU3RhdGVtZW50cygKKwlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkLAorCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKKwljYW5CZUV4cGxpY2l0Q29uc3RydWN0b3IgPSAxOworCXN1cGVyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKGNkLCB1bml0KTsKK30KIC8qCiAgKiBQcmVwYXJlcyB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciB0byBnbyBmb3IgQmxvY2tTdGF0ZW1lbnRzLgogICovCiBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRm9yQmxvY2tTdGF0ZW1lbnRzKCkgewotCXN1cGVyLnByZXBhcmVGb3JCbG9ja1N0YXRlbWVudHMoKTsKKwl0aGlzLm5lc3RlZE1ldGhvZFt0aGlzLm5lc3RlZFR5cGUgPSAwXSA9IDE7CisJdGhpcy52YXJpYWJsZXNDb3VudGVyW3RoaXMubmVzdGVkVHlwZV0gPSAwOworCXRoaXMucmVhbEJsb2NrU3RhY2tbdGhpcy5yZWFsQmxvY2tQdHIgPSAxXSA9IDA7CisKIAl0aGlzLmluaXRpYWxpemVGb3JCbG9ja1N0YXRlbWVudHMoKTsKIH0KLXByb3RlY3RlZCB2b2lkIHB1c2hCbG9ja0ludm9jYXRpb25QdHIoKSB7Ci0JdHJ5IHsKLQkJdGhpcy5ibG9ja0ludm9jYXRpb25TdGFja1srK3RoaXMuYmxvY2tJbnZvY2F0aW9uUHRyXSA9IHRoaXMuaW52b2NhdGlvblB0cisxOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrLmxlbmd0aDsKLQkJaW50W10gb2xkU3RhY2sgPSB0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrOwotCQl0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgdGhpcy5ibG9ja0ludm9jYXRpb25TdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmJsb2NrSW52b2NhdGlvblN0YWNrW3RoaXMuYmxvY2tJbnZvY2F0aW9uUHRyXSA9IHRoaXMuaW52b2NhdGlvblB0cisxOwotCX0KLX0KIC8qKgogICogQ3JlYXRlcyBhIGNvbXBsZXRpb24gb24gbWVtYmVyIGFjY2VzcyBub2RlIGFuZCBwdXNoIGl0CiAgKiBvbiB0aGUgZXhwcmVzc2lvbiBzdGFjay4KQEAgLTExOTcsMzggKzIyNzEsNiBAQAogCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0gPSBmcjsKIAl9CiB9Ci1wcm90ZWN0ZWQgdm9pZCBwdXNoTmV3TGFiZWxDb3VudGVyKCkgewotCXRyeSB7Ci0JCXRoaXMubGFiZWxDb3VudGVyU3RhY2tbKyt0aGlzLmxhYmVsQ291bnRlclB0cl0gPSAwOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmxhYmVsQ291bnRlclN0YWNrLmxlbmd0aDsKLQkJaW50W10gb2xkU3RhY2sgPSB0aGlzLmxhYmVsQ291bnRlclN0YWNrOwotCQl0aGlzLmxhYmVsQ291bnRlclN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgdGhpcy5sYWJlbENvdW50ZXJTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmxhYmVsQ291bnRlclN0YWNrW3RoaXMubGFiZWxDb3VudGVyUHRyXSA9IDA7Ci0JfQotfQotLyoqCi0gKiBQdXNoZXMgdGhlIGdpdmVuIGludm9jYXRpb24gdHlwZSAob25lIG9mIHRoZSBpbnZvY2F0aW9uIHR5cGUgY29uc3RhbnRzKSBvbiB0aGUgaW52b2NhdGlvbiB0eXBlIHN0YWNrLAotICogYW5kIHRoZSBnaXZlbiBxdWFsaWZpZXIgKGFuIGV4cHJlc3Npb24gcG9pbnRlciB0byB0aGUgZXhwcmVzc2lvbiBzdGFjaykgb24gdGhlIHF1YWxpZmllciBzdGFjay4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcHVzaE9uSW52b2NhdGlvblN0YWNrcyhpbnQgaW52b2NhdGlvblR5cGUsIGludCBxdWFsaWZpZXJFeHByUHRyKSB7Ci0JLy8gTkI6IGludm9jYXRpb25QdHIgaGFzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBieSBhIGNhbGwgdG8gcHVzaE9uU2VsZWN0b3JTdGFjaygpCi0JdHJ5IHsKLQkJdGhpcy5pbnZvY2F0aW9uVHlwZVN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl0gPSBpbnZvY2F0aW9uVHlwZTsKLQkJdGhpcy5xdWFsaWZpZXJTdGFja1t0aGlzLmludm9jYXRpb25QdHJdID0gcXVhbGlmaWVyRXhwclB0cjsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pbnZvY2F0aW9uVHlwZVN0YWNrLmxlbmd0aDsKLQkJaW50IG9sZEludm9jYXRpb25UeXBlU3RhY2tbXSA9IHRoaXMuaW52b2NhdGlvblR5cGVTdGFjazsKLQkJaW50IG9sZFF1YWxpZmllclN0YWNrW10gPSB0aGlzLnF1YWxpZmllclN0YWNrOwotCQl0aGlzLmludm9jYXRpb25UeXBlU3RhY2sgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgU3RhY2tJbmNyZW1lbnRdOwotCQl0aGlzLnF1YWxpZmllclN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRJbnZvY2F0aW9uVHlwZVN0YWNrLCAwLCB0aGlzLmludm9jYXRpb25UeXBlU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRRdWFsaWZpZXJTdGFjaywgMCwgdGhpcy5xdWFsaWZpZXJTdGFjaywgMCwgb2xkU3RhY2tMZW5ndGgpOwotCQl0aGlzLmludm9jYXRpb25UeXBlU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXSA9IGludm9jYXRpb25UeXBlOwotCQl0aGlzLnF1YWxpZmllclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl0gPSBxdWFsaWZpZXJFeHByUHRyOwotCX0KLX0KIHB1YmxpYyB2b2lkIHJlY29yZENvbXBsZXRpb25PblJlZmVyZW5jZSgpewogCiAJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSl7CkBAIC0xMjQ1LDYgKzIyODcsNDggQEAKIAlpZiAoIWRpZXQpIHJldHVybjsgLy8gb25seSByZWNvcmQgcmVmZXJlbmNlcyBhdHRhY2hlZCB0byB0eXBlcwogCiB9CitwdWJsaWMgdm9pZCByZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKSB7CisJaWYoY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZExvY2FsVmFyaWFibGUpIHsKKwkJUmVjb3ZlcmVkRWxlbWVudCBvbGRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7CisJCXN1cGVyLnJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOworCQlpZihvbGRFbGVtZW50ICE9IGN1cnJlbnRFbGVtZW50KSB7CisJCQlwb3BFbGVtZW50KEtfTE9DQUxfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKKwkJfQorCX0gZWxzZSB7CisJCXN1cGVyLnJlY292ZXJ5RXhpdEZyb21WYXJpYWJsZSgpOworCX0KK30KK3B1YmxpYyB2b2lkIHJlY292ZXJ5VG9rZW5DaGVjaygpIHsKKwlSZWNvdmVyZWRFbGVtZW50IG9sZEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKKwlzd2l0Y2ggKGN1cnJlbnRUb2tlbikgeworCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6CisJCQlzdXBlci5yZWNvdmVyeVRva2VuQ2hlY2soKTsKKwkJCWlmKGN1cnJlbnRFbGVtZW50ICE9IG9sZEVsZW1lbnQgJiYgb2xkRWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEJsb2NrKSB7CisJCQkJcG9wRWxlbWVudChLX0JMT0NLX0RFTElNSVRFUik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVjYXNlIDoKKwkJCXN1cGVyLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkxPQ0tfREVMSU1JVEVSCisJCQkJJiYgdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IFNXSVRDSCkgeworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX1NXSVRDSF9MQUJFTCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUb2tlbk5hbWVkZWZhdWx0IDoKKwkJCXN1cGVyLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQkJaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfQkxPQ0tfREVMSU1JVEVSCisJCQkJJiYgdG9wS25vd25FbGVtZW50SW5mbyhDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IFNXSVRDSCkgeworCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX1NXSVRDSF9MQUJFTCwgREVGQVVMVCk7CisJCQl9IGVsc2UgaWYodG9wS25vd25FbGVtZW50S2luZChDT01QTEVUSU9OX09SX0FTU0lTVF9QQVJTRVIpID09IEtfU1dJVENIX0xBQkVMKSB7CisJCQkJcG9wRWxlbWVudChLX1NXSVRDSF9MQUJFTCk7CisJCQkJcHVzaE9uRWxlbWVudFN0YWNrKEtfU1dJVENIX0xBQkVMLCBERUZBVUxUKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXN1cGVyLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQkJYnJlYWs7CisJfQorfQogcHJvdGVjdGVkIHZvaWQgcmVwb3J0U3ludGF4RXJyb3IoaW50IGFjdCwgaW50IGN1cnJlbnRLaW5kLCBpbnQgc3RhdGVTdGFja1RvcCkgewogCiAJLyogSW50ZXJjZXB0IGVycm9yIHN0YXRlIG9uIEVPRiBpbnNpZGUgbWV0aG9kIGJvZGllcywgZHVlIHRvIApAQCAtMTI4Myw3ICsyMzY3LDcgQEAKIAkJCXRoZSBlbmQgb2YgdGhlIG1ldGhvZCBib2R5IG9yIGNvbXBpbGF0aW9uIHVuaXQgKi8KIAkJaWYgKChzY2FubmVyLmVvZlBvc2l0aW9uID09IGN1cnNvckxvY2F0aW9uKzEpCiAJCQkmJiAoIShyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pIAotCQkJCXx8IGluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSkpIHsKKwkJCQl8fCBpc0luZGlyZWN0bHlJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkpKSB7CiAKIAkJCS8qCWRpc2FibGVkIHNpbmNlIGRvZXMgbm90IGhhbmRsZSBwb3NzaWJsZSBmaWVsZC9tZXNzYWdlIHJlZnMsIGkuZS4gT2JqW0FTU0lTVCBIRVJFXWVjdC5yZWdpc3Rlck5hdGl2ZXMoKQkJICAgIAogCQkJLy8gY29uc3VtZSBleHRyYSB0b2tlbnMgd2hpY2ggd2VyZSBwYXJ0IG9mIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlCkBAIC0xMzA5LDggKzIzOTMsMTIgQEAKIAkJCX0KIAkJCSovCQkJCiAJCQkvKiByZXN0YXJ0IGluIGRpZXQgbW9kZSBmb3IgZmluZGluZyBzaWJsaW5nIGNvbnN0cnVjdHMgKi8KLQkJCWlmIChjdXJyZW50RWxlbWVudC5lbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCl7Ci0JCQkJbGFzdENoZWNrUG9pbnQgPSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kKzE7CisJCQlpZiAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRUeXBlCisJCQkJfHwgY3VycmVudEVsZW1lbnQuZW5jbG9zaW5nVHlwZSgpICE9IG51bGwpeworCQkJCQkKKwkJCQlpZihsYXN0Q2hlY2tQb2ludCA8PSB0aGlzLmFzc2lzdE5vZGUuc291cmNlRW5kKSB7CisJCQkJCWxhc3RDaGVja1BvaW50ID0gdGhpcy5hc3Npc3ROb2RlLnNvdXJjZUVuZCsxOworCQkJCX0KIAkJCQlpbnQgZW5kID0gY3VycmVudEVsZW1lbnQudG9wRWxlbWVudCgpLnNvdXJjZUVuZCgpOwogCQkJCXNjYW5uZXIuZW9mUG9zaXRpb24gPSBlbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IGVuZCArIDEgOiBlbmQ7CiAJCQl9IGVsc2UgewpAQCAtMTMyNCwxOCArMjQxMiwyMSBAQAogcHVibGljIHZvaWQgc2V0QXNzaXN0SWRlbnRpZmllcihjaGFyW10gYXNzaXN0SWRlbnQpewogCSgoQ29tcGxldGlvblNjYW5uZXIpc2Nhbm5lcikuY29tcGxldGlvbklkZW50aWZpZXIgPSBhc3Npc3RJZGVudDsKIH0KLS8qKgotICogU3RvcmVzIHRoZSBsYWJlbHMgbGVmdCBvbiB0aGUgaWRlbnRpZmllciBzdGFjayBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc3RvcmVkIHlldC4KLSAqLwotcHJpdmF0ZSB2b2lkIHN0b3JlTGFiZWxzSWZOZWVkZWQoKSB7Ci0vLwlpbnQgY291bnRlciA9IHRoaXMubGFiZWxDb3VudGVyUHRyID49IDAgPyB0aGlzLmxhYmVsQ291bnRlclN0YWNrW3RoaXMubGFiZWxDb3VudGVyUHRyXSA6IDA7Ci0vLwlpZiAodGhpcy5sYWJlbHMgPT0gbnVsbCAmJiB0aGlzLmlkZW50aWZpZXJQdHIgPj0gMCkgewotLy8JCXRoaXMubGFiZWxzID0gbmV3IGNoYXJbY291bnRlcl1bXTsKLS8vCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaWRlbnRpZmllclN0YWNrLCB0aGlzLmlkZW50aWZpZXJQdHIgLSBjb3VudGVyICsgMSwgdGhpcy5sYWJlbHMsIDAsIGNvdW50ZXIpOwotLy8JfQotLy8JdGhpcy5pZGVudGlmaWVyUHRyIC09IGNvdW50ZXI7Ci0vLwl0aGlzLmlkZW50aWZpZXJMZW5ndGhQdHIgLT0gY291bnRlcjsgLy8gbGFiZWxzIGhhdmUgbm90IGJlZW4gY29uY2F0ZW5hdGVkIHlldAorcHVibGljICBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCXMgPSBzICsgImVsZW1lbnRLaW5kU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7CisJCXMgPSBzICsgU3RyaW5nLnZhbHVlT2YoZWxlbWVudEtpbmRTdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX07CisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAorCXMgPSBzICsgImVsZW1lbnRJbmZvU3RhY2sgOiBpbnRbXSA9IHsiOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPD0gZWxlbWVudFB0cjsgaSsrKSB7CisJCXMgPSBzICsgU3RyaW5nLnZhbHVlT2YoZWxlbWVudEluZm9TdGFja1tpXSkgKyAiLCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX07CisJcyA9IHMgKyAifVxuIjsgLy8kTk9OLU5MUy0xJAorCXJldHVybiBzICsgc3VwZXIudG9TdHJpbmcoKTsKIH0KKwogLyoKICAqIFVwZGF0ZSByZWNvdmVyeSBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHBhcnNlci9zY2FubmVyIHN0YXRlCiAgKi8KQEAgLTEzNTksNiArMjQ1MCw4IEBACiAJCWdvdCBhY3RpdmF0ZWQgb25jZS4gCiAJKi8KIAl0aGlzLnJlY292ZXJ5VG9rZW5DaGVjaygpOworCQorCXRoaXMucmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCk7CiB9CiAKIHByb3RlY3RlZCBMb2NhbERlY2xhcmF0aW9uIGNyZWF0ZUxvY2FsRGVjbGFyYXRpb24oRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiwgY2hhcltdIG5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewpAQCAtMTM3Myw3ICsyNDY2LDcgQEAKIH0KIAogcHJvdGVjdGVkIEZpZWxkRGVjbGFyYXRpb24gY3JlYXRlRmllbGREZWNsYXJhdGlvbihFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uLCBjaGFyW10gbmFtZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7Ci0JaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKKwlpZiAodGhpcy5pbmRleE9mQXNzaXN0SWRlbnRpZmllcigpIDwgMCB8fCAoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRVbml0ICYmICgoUmVjb3ZlcmVkVW5pdCljdXJyZW50RWxlbWVudCkudHlwZUNvdW50ID09IDApKSB7CiAJCXJldHVybiBzdXBlci5jcmVhdGVGaWVsZERlY2xhcmF0aW9uKGluaXRpYWxpemF0aW9uLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIAl9IGVsc2UgewogCQlDb21wbGV0aW9uT25GaWVsZE5hbWUgZmllbGQgPSBuZXcgQ29tcGxldGlvbk9uRmllbGROYW1lKGluaXRpYWxpemF0aW9uLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKQEAgLTEzODIsNSArMjQ3NSw0IEBACiAJCXJldHVybiBmaWVsZDsKIAl9CiB9Ci0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvQ29tcGxldGlvblNjYW5uZXIuamF2YQppbmRleCA1OTE2ZTdkLi44NWNiNWFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0NvbXBsZXRpb25TY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9Db21wbGV0aW9uU2Nhbm5lci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGU7CiAKIC8qCkBAIC0yMCw2ICsyMCw3IEBACiAgKgkwICBtZWFucyBjb21wbGV0aW9uIGJlaGluZCB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgKiAgbiAgbWVhbnMgY29tcGxldGlvbiBiZWhpbmQgdGhlIG4tdGggY2hhcmFjdGVyCiAgKi8KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CiAKQEAgLTI3LDYgKzI4LDcgQEAKIAogCXB1YmxpYyBjaGFyW10gY29tcGxldGlvbklkZW50aWZpZXI7CiAJcHVibGljIGludCBjdXJzb3JMb2NhdGlvbjsKKwlwdWJsaWMgaW50IGVuZE9mRW1wdHlUb2tlbiA9IC0xOwogCQkKIAkvKiBTb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBjb21wbGV0ZWRJZGVudGlmaWVyCiAJICogaWYgaW5zaWRlIGFjdHVhbCBpZGVudGlmaWVyLCBlbmQgZ29lcyB0byB0aGUgYWN0dWFsIGlkZW50aWZpZXIgCkBAIC0zNyw3ICszOSwxMyBAQAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRW1wdHlDb21wbGV0aW9uSWRlbnRpZmllciA9IHt9OwogcHVibGljIENvbXBsZXRpb25TY2FubmVyKGJvb2xlYW4gYXNzZXJ0TW9kZSkgewotCXN1cGVyKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGFzc2VydE1vZGUpOworCXN1cGVyKAorCQlmYWxzZSAvKmNvbW1lbnQqLywgCisJCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKKwkJZmFsc2UgLypubHMqLywgCisJCWFzc2VydE1vZGUgLyphc3NlcnQqLywgCisJCW51bGwgLyp0YXNrVGFncyovLCAKKwkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CiB9CiAvKiAKICAqIFRydW5jYXRlIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgaWYgaXQgaXMgY29udGFpbmluZyB0aGUgY3Vyc29yIGxvY2F0aW9uLiBTaW5jZSBjb21wbGV0aW9uIGlzIHBlcmZvcm1lZApAQCAtMTczLDcgKzE4MSw3IEBACiAJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQogCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKIAkJCQkJaXNXaGl0ZVNwYWNlID0gCi0JCQkJCQkoY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY3VycmVudENoYXJhY3Rlcik7IAorCQkJCQkJKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnKSB8fCBDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsgCiAJCQkJfQogCQkJCS8qIGNvbXBsZXRpb24gcmVxdWVzdGluZyBzdHJpY3RseSBpbnNpZGUgYmxhbmtzICovCiAJCQkJaWYgKCh3aGl0ZVN0YXJ0ICE9IGN1cnJlbnRQb3NpdGlvbikKQEAgLTE5Nyw2ICsyMDUsMTEgQEAKIAkJCQkvKiBtaWdodCBiZSBjb21wbGV0aW5nIGF0IGVvZiAoZS5nLiBiZWhpbmQgYSBkb3QpICovCiAJCQkJaWYgKGNvbXBsZXRpb25JZGVudGlmaWVyID09IG51bGwgJiYgCiAJCQkJCXN0YXJ0UG9zaXRpb24gPT0gY3Vyc29yTG9jYXRpb24gKyAxKXsKKwkJCQkJLy8gY29tcHV0ZSBlbmQgb2YgZW1wdHkgaWRlbnRpZmllci4KKwkJCQkJLy8gaWYgdGhlIGVtcHR5IGlkZW50aWZpZXIgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbmV4dCB0b2tlbiB0aGUgZW5kIG9mCisJCQkJCS8vIGVtcHR5IGlkZW50aWZpZXIgaXMgdGhlIGVuZCBvZiB0aGUgbmV4dCB0b2tlbiAoZWcuICI8ZW1wdHkgdG9rZW4+bmV4dCIpLgorCQkJCSAJd2hpbGUoZ2V0TmV4dENoYXJBc0phdmFJZGVudGlmaWVyUGFydCgpKSB7fQorCQkJCSAJZW5kT2ZFbXB0eVRva2VuID0gY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQkJY3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsgLy8gZm9yIGJlaW5nIGRldGVjdGVkIGFzIGVtcHR5IGZyZWUgaWRlbnRpZmllcgogCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKIAkJCQl9CQkJCQpAQCAtNTQyLDkgKzU1NSwxMSBAQAogCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kCiAJCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUVOVF9MSU5FOwogCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7IC8vYW4gZW9mIHdpbGwgdGhlbSBiZSBnZW5lcmF0ZWQKKwkJCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJcmVjb3JkQ29tbWVudChmYWxzZSk7CisJCQkJCQkJCWlmICh0aGlzLnRhc2tUYWdzICE9IG51bGwpIGNoZWNrVGFza1RhZyh0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuY3VycmVudFBvc2l0aW9uLTEpOwogCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgewotCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kCisJCQkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbi0tOyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAogCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvSW52YWxpZEN1cnNvckxvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2NvbXBsZXRlL0ludmFsaWRDdXJzb3JMb2NhdGlvbi5qYXZhCmluZGV4IGQ2MjRlY2EuLmZiMWY2MGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvY29tcGxldGUvSW52YWxpZEN1cnNvckxvY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9jb21wbGV0ZS9JbnZhbGlkQ3Vyc29yTG9jYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0T3B0aW9ucy5qYXZhCmluZGV4IDcwZDdhYjAuLjgzNjE1YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdE9wdGlvbnMuamF2YQpAQCAtMSwxNyArMSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CisKIHB1YmxpYyBjbGFzcyBBc3Npc3RPcHRpb25zIHsKIAkvKioKIAkgKiBPcHRpb24gSURzCkBAIC0yMCwxMSArMjMsMzUgQEAKIAkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS52aXNpYmlsaXR5Q2hlY2siOyAJLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Gb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiA9CiAJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iOyAJLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9GaWVsZFByZWZpeGVzID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU3RhdGljRmllbGRQcmVmaXhlcyA9CisJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcyI7IAkvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0xvY2FsUHJlZml4ZXMgPQorCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXMiOyAJLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Bcmd1bWVudFByZWZpeGVzID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRmllbGRTdWZmaXhlcyA9CisJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcyI7IAkvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1N0YXRpY0ZpZWxkU3VmZml4ZXMgPQorCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXMiOyAJLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Mb2NhbFN1ZmZpeGVzID0KKwkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzIjsgCS8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fQXJndW1lbnRTdWZmaXhlcyA9CisJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcyI7IAkvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEID0gImRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIGJvb2xlYW4gY2hlY2tWaXNpYmlsaXR5ID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24gPSBmYWxzZTsKKwlwdWJsaWMgY2hhcltdW10gZmllbGRQcmVmaXhlcyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIHN0YXRpY0ZpZWxkUHJlZml4ZXMgPSBudWxsOworCXB1YmxpYyBjaGFyW11bXSBsb2NhbFByZWZpeGVzID0gbnVsbDsKKwlwdWJsaWMgY2hhcltdW10gYXJndW1lbnRQcmVmaXhlcyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIGZpZWxkU3VmZml4ZXMgPSBudWxsOworCXB1YmxpYyBjaGFyW11bXSBzdGF0aWNGaWVsZFN1ZmZpeGVzID0gbnVsbDsKKwlwdWJsaWMgY2hhcltdW10gbG9jYWxTdWZmaXhlcyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIGFyZ3VtZW50U3VmZml4ZXMgPSBudWxsOwogCiAJLyoqIAogCSAqIEluaXRpYWxpemluZyB0aGUgYXNzaXN0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHNldHRpbmdzCkBAIC00MCw5ICs2Nyw5IEBACiAJCQlyZXR1cm47CiAKIAkJLy8gZmlsdGVyIG9wdGlvbnMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIGFzc2lzdCBjb21wb25lbnQKLQkJT2JqZWN0W10gZW50cmllcyA9IHNldHRpbmdzLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW50cmllcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllc1tpXTsKKwkJSXRlcmF0b3IgZW50cmllcyA9IHNldHRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7CisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOwogCQkJaWYgKCEoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBTdHJpbmcpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpCkBAIC02Niw3ICs5Myw2MyBAQAogCQkJCQkJdGhpcy5mb3JjZUltcGxpY2l0UXVhbGlmaWNhdGlvbiA9IGZhbHNlOwogCQkJCQl9CiAJCQkJY29udGludWU7Ci0JCQl9IAorCQkJfSBlbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fRmllbGRQcmVmaXhlcykpeworCQkJCWlmIChvcHRpb25WYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXRoaXMuZmllbGRQcmVmaXhlcyA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5maWVsZFByZWZpeGVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsIG9wdGlvblZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1N0YXRpY0ZpZWxkUHJlZml4ZXMpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl0aGlzLnN0YXRpY0ZpZWxkUHJlZml4ZXMgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuc3RhdGljRmllbGRQcmVmaXhlcyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCBvcHRpb25WYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9Mb2NhbFByZWZpeGVzKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdGhpcy5sb2NhbFByZWZpeGVzID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmxvY2FsUHJlZml4ZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgb3B0aW9uVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fQXJndW1lbnRQcmVmaXhlcykpeworCQkJCWlmIChvcHRpb25WYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXRoaXMuYXJndW1lbnRQcmVmaXhlcyA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5hcmd1bWVudFByZWZpeGVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsIG9wdGlvblZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0ZpZWxkU3VmZml4ZXMpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl0aGlzLmZpZWxkU3VmZml4ZXMgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuZmllbGRTdWZmaXhlcyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCBvcHRpb25WYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9TdGF0aWNGaWVsZFN1ZmZpeGVzKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdGhpcy5zdGF0aWNGaWVsZFN1ZmZpeGVzID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnN0YXRpY0ZpZWxkU3VmZml4ZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgb3B0aW9uVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fTG9jYWxTdWZmaXhlcykpeworCQkJCWlmIChvcHRpb25WYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXRoaXMubG9jYWxTdWZmaXhlcyA9IG51bGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5sb2NhbFN1ZmZpeGVzID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsIG9wdGlvblZhbHVlLnRvQ2hhckFycmF5KCkpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX0FyZ3VtZW50U3VmZml4ZXMpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl0aGlzLmFyZ3VtZW50U3VmZml4ZXMgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuYXJndW1lbnRTdWZmaXhlcyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCBvcHRpb25WYWx1ZS50b0NoYXJBcnJheSgpKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0Fzc2lzdFBhcnNlci5qYXZhCmluZGV4IDk3OGNiODYuLjk5YTEyODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9Bc3Npc3RQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvQXNzaXN0UGFyc2VyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsOwogCiAvKgpAQCAtMzcsMTIgKzM3LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyZWRJbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJlZE1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlJlY292ZXJlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5SZWNvdmVyZWRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzaXN0UGFyc2VyIGV4dGVuZHMgUGFyc2VyIHsKLQogCXB1YmxpYyBBc3ROb2RlIGFzc2lzdE5vZGU7CiAJcHVibGljIGJvb2xlYW4gaXNPcnBoYW5Db21wbGV0aW9uTm9kZTsKIAkJCkBAIC01NSwzMSArNTMsMjkgQEAKIAkvLyB0aGUgaW5kZXggaW4gdGhlIGlkZW50aWZpZXIgc3RhY2sgb2YgdGhlIHByZXZpb3VzIGlkZW50aWZpZXIKIAlwcm90ZWN0ZWQgaW50IHByZXZpb3VzSWRlbnRpZmllclB0cjsKIAkKLQkvLyB0aGUgc3RhY2tzIG9mIHNlbGVjdG9ycyBmb3IgaW52b2NhdGlvbnMgKGllLiBtZXRob2QgaW52b2NhdGlvbnMsIGFsbG9jYXRpb24gZXhwcmVzc2lvbnMgYW5kCi0JLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbnMpCi0JLy8gdGhlIHNlbGVjdG9yIHN0YWNrIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBpZGVudGlmaWVyIHN0YWNrIG9yIG9uZSBvZiB0aGUgc2VsZWN0b3IgY29uc3RhbnRzIGJlbG93Ci0JcHJvdGVjdGVkIGludCBpbnZvY2F0aW9uUHRyOwotCXByb3RlY3RlZCBpbnRbXSBzZWxlY3RvclN0YWNrID0gbmV3IGludFtTdGFja0luY3JlbWVudF07Ci0KKwkvLyBlbGVtZW50IHN0YWNrCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRWxlbWVudFN0YWNrSW5jcmVtZW50ID0gMTAwOworCXByb3RlY3RlZCBpbnQgZWxlbWVudFB0cjsKKwlwcm90ZWN0ZWQgaW50W10gZWxlbWVudEtpbmRTdGFjayA9IG5ldyBpbnRbRWxlbWVudFN0YWNrSW5jcmVtZW50XTsKKwlwcm90ZWN0ZWQgaW50W10gZWxlbWVudEluZm9TdGFjayA9IG5ldyBpbnRbRWxlbWVudFN0YWNrSW5jcmVtZW50XTsKKwlwcm90ZWN0ZWQgaW50IHByZXZpb3VzS2luZDsKKwlwcm90ZWN0ZWQgaW50IHByZXZpb3VzSW5mbzsKKwkKKwkvLyBPV05FUgorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFTU0lTVF9QQVJTRVIgPSA1MTI7CisJCisJLy8gS0lORCA6IGFsbCB2YWx1ZXMga25vd24gYnkgQXNzaXN0UGFyc2VyIGFyZSBiZXR3ZWVuIDUxMyBhbmQgMTAyMworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfU0VMRUNUT1IgPSBBU1NJU1RfUEFSU0VSICsgMTsgLy8gd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgbWVzc2FnZSBzZW5kCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19UWVBFX0RFTElNSVRFUiA9IEFTU0lTVF9QQVJTRVIgKyAyOyAvLyB3aGV0aGVyIHdlIGFyZSBpbnNpZGUgYSB0eXBlIGRlY2xhcmF0aW9uCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS19NRVRIT0RfREVMSU1JVEVSID0gQVNTSVNUX1BBUlNFUiArIDM7IC8vIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIG1ldGhvZCBkZWNsYXJhdGlvbgorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSID0gQVNTSVNUX1BBUlNFUiArIDQ7IC8vIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIGZpZWxkIGluaXRpYWxpemVyCisJCiAJLy8gc2VsZWN0b3IgY29uc3RhbnRzCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEhJU19DT05TVFJVQ1RPUiA9IC0xOwogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNVUEVSX0NPTlNUUlVDVE9SID0gLTI7CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXJzdCA9IGZhbHNlOwogCi0JLy8gd2hldGhlciB0aGUgcGFyc2VyIGlzIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIKLQkvLyAoZmFsc2UgaXMgcHVzaGVkIGVhY2ggdGltZSBhIG5ldyB0eXBlIGlzIGVudGVyZWQsCi0JLy8gIGl0IGlzIGNoYW5nZWQgdG8gdHJ1ZSB3aGVuIHRoZSBpbml0aWFsaXplciBpcyBlbnRlcmVkLAotCS8vICBpdCBpcyBjaGFuZ2VkIGJhY2sgdG8gZmFsc2Ugd2hlbiB0aGUgaW5pdGlhbGl6ZXIgaXMgZXhpdGVkLAotCS8vICBhbmQgaXQgaXMgcG9wZWQgd2hlbiB0aGUgdHlwZSBpcyBleGl0ZWQpCi0JcHJvdGVjdGVkIGludCBpbkZpZWxkSW5pdGlhbGl6YXRpb25QdHI7Ci0JcHJvdGVjdGVkIGJvb2xlYW5bXSBpbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFjayA9IG5ldyBib29sZWFuW1N0YWNrSW5jcmVtZW50XTsKLQotCS8vIHdoZXRoZXIgdGhlIHBhcnNlciBpcyBpbiBhIG1ldGhvZCwgY29uc3RydWN0b3Igb3IgaW5pdGlhbGl6ZXIKLQkvLyAoZmFsc2UgaXMgcHVzaGVkIGVhY2ggdGltZSBhIG5ldyB0eXBlIGlzIGVudGVyZWQsCi0JLy8gIGl0IGlzIGNoYW5nZWQgdG8gdHJ1ZSB3aGVuIHRoZSBtZXRob2QgaXMgZW50ZXJlZCwKLQkvLyAgaXQgaXMgY2hhbmdlZCBiYWNrIHRvIGZhbHNlIHdoZW4gdGhlIG1ldGhvZCBpcyBleGl0ZWQsCi0JLy8gIGFuZCBpdCBpcyBwb3BlZCB3aGVuIHRoZSB0eXBlIGlzIGV4aXRlZCkKLQlwcm90ZWN0ZWQgaW50IGluTWV0aG9kUHRyOwotCXByb3RlY3RlZCBib29sZWFuW10gaW5NZXRob2RTdGFjayA9IG5ldyBib29sZWFuW1N0YWNrSW5jcmVtZW50XTsKIHB1YmxpYyBBc3Npc3RQYXJzZXIoUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwgYm9vbGVhbiBhc3NlcnRNb2RlKSB7CiAJc3VwZXIocHJvYmxlbVJlcG9ydGVyLCB0cnVlLCBhc3NlcnRNb2RlKTsKIH0KQEAgLTk1LDEyICs5MSwxMSBAQAogICogUmVjb3Zlcnkgc3RhdGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2VyIChyZWR1Y2VkIG5vZGUgc3RhY2spLgogICovCiBwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBidWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCl7Ci0KIAkvKiByZWNvdmVyeSBpbiB1bml0IHN0cnVjdHVyZSAqLwogCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pewogCQlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSBzdXBlci5idWlsZEluaXRpYWxSZWNvdmVyeVN0YXRlKCk7CiAJCWZsdXNoQXNzaXN0U3RhdGUoKTsKLQkJaW5pdEluTWV0aG9kQW5kSW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2soZWxlbWVudCk7CisJCWZsdXNoRWxlbWVudFN0YWNrKCk7CiAJCXJldHVybiBlbGVtZW50OwogCX0KIApAQCAtMTE3LDcgKzExMiw4IEBACiAJCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pIHJlZmVyZW5jZUNvbnRleHQ7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsKIAkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdHlwZS5maWVsZHNbaV07CQkJCQkKLQkJCQlpZiAoIWZpZWxkLmlzRmllbGQoKQorCQkJCWlmIChmaWVsZCAhPSBudWxsCisJCQkJCQkmJiAhZmllbGQuaXNGaWVsZCgpCiAJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uCiAJCQkJCQkmJiBzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZAogCQkJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsKQEAgLTIzOCw3NSArMjM0LDYwIEBACiAJCX0KIAl9CiAJCi0JaW5pdEluTWV0aG9kQW5kSW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2soZWxlbWVudCk7CiAJcmV0dXJuIGVsZW1lbnQ7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCkgewotCXN1cGVyLmNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsKLQl0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0ci0tOwotCXRoaXMuaW5NZXRob2RQdHItLTsKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpIHsKKwlwb3BFbGVtZW50KEtfTUVUSE9EX0RFTElNSVRFUik7CisJc3VwZXIuY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2xhc3NCb2R5b3B0KCkgewogCXN1cGVyLmNvbnN1bWVDbGFzc0JvZHlvcHQoKTsKLQl0aGlzLmludm9jYXRpb25QdHItLTsgLy8gTkI6IFRoaXMgY2FuIGJlIGRlY3JlbWVudGVkIGJlbG93IC0xIG9ubHkgaWYgaW4gZGlldCBtb2RlIGFuZCBub3QgaW4gZmllbGQgaW5pdGlhbGl6ZXIKKwlwb3BFbGVtZW50KEtfU0VMRUNUT1IpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzSGVhZGVyKCkgewogCXN1cGVyLmNvbnN1bWVDbGFzc0hlYWRlcigpOwotCXRoaXMucHVzaE5vdEluSW5pdGlhbGl6ZXIoKTsKLQl0aGlzLnB1c2hOb3RJbk1ldGhvZCgpOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX1RZUEVfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKSB7CiAJc3VwZXIuY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpOwotCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IGZhbHNlOworCXBvcEVsZW1lbnQoS19NRVRIT0RfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpIHsKIAlzdXBlci5jb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKTsKLQl0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0gPSB0cnVlOwotfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVtcHR5Q2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCkgewotCXN1cGVyLmNvbnN1bWVFbXB0eUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOwotCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyLS07Ci0JdGhpcy5pbk1ldGhvZFB0ci0tOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX01FVEhPRF9ERUxJTUlURVIpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUVudGVyQW5vbnltb3VzQ2xhc3NCb2R5KCkgewogCXN1cGVyLmNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOwotCXRoaXMuaW52b2NhdGlvblB0ci0tOyAvLyBOQjogVGhpcyBjYW4gYmUgZGVjcmVtZW50ZWQgYmVsb3cgLTEgb25seSBpZiBpbiBkaWV0IG1vZGUgYW5kIG5vdCBpbiBmaWVsZCBpbml0aWFsaXplcgotCXRoaXMucHVzaE5vdEluSW5pdGlhbGl6ZXIoKTsKLQl0aGlzLnB1c2hOb3RJbk1ldGhvZCgpOworCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7CisJcHVzaE9uRWxlbWVudFN0YWNrKEtfVFlQRV9ERUxJTUlURVIpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKGludCBmbGFnLCBpbnQgcmVjRmxhZykgewogCXN1cGVyLmNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihmbGFnLCByZWNGbGFnKTsKLQl0aGlzLmludm9jYXRpb25QdHItLTsgLy8gTkI6IFRoaXMgY2FuIGJlIGRlY3JlbWVudGVkIGJlbG93IC0xIG9ubHkgaWYgaW4gZGlldCBtb2RlIGFuZCBub3QgaW4gZmllbGQgaW5pdGlhbGl6ZXIKKwlwb3BFbGVtZW50KEtfU0VMRUNUT1IpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUZvcmNlTm9EaWV0KCkgewogCXN1cGVyLmNvbnN1bWVGb3JjZU5vRGlldCgpOwogCS8vIGlmIHdlIGFyZSBub3QgaW4gYSBtZXRob2QgKGllLiB3ZSBhcmUgbm90IGluIGEgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXIpCiAJLy8gdGhlbiB3ZSBhcmUgZW50ZXJpbmcgYSBmaWVsZCBpbml0aWFsaXplcgotCWlmICghdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdKSB7Ci0JCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHJdID0gdHJ1ZTsKKwlpZiAoIWlzSW5zaWRlTWV0aG9kKCkpIHsKKwkJcHVzaE9uRWxlbWVudFN0YWNrKEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKIAl9CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW50ZXJmYWNlSGVhZGVyKCkgewogCXN1cGVyLmNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKTsKLQl0aGlzLnB1c2hOb3RJbkluaXRpYWxpemVyKCk7Ci0JdGhpcy5wdXNoTm90SW5NZXRob2QoKTsKLX0KLXByb3RlY3RlZCB2b2lkIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKSB7Ci0Jc3VwZXIuY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOwotCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyLS07Ci0JdGhpcy5pbk1ldGhvZFB0ci0tOworCXB1c2hPbkVsZW1lbnRTdGFjayhLX1RZUEVfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RCb2R5KCkgewogCXN1cGVyLmNvbnN1bWVNZXRob2RCb2R5KCk7Ci0JdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdID0gZmFsc2U7CisJcG9wRWxlbWVudChLX01FVEhPRF9ERUxJTUlURVIpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEhlYWRlcigpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSGVhZGVyKCk7Ci0JdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdID0gdHJ1ZTsKKwlwdXNoT25FbGVtZW50U3RhY2soS19NRVRIT0RfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsKLQl0aGlzLmludm9jYXRpb25QdHItLTsgLy8gTkI6IFRoaXMgY2FuIGJlIGRlY3JlbWVudGVkIGJlbG93IC0xIG9ubHkgaWYgaW4gZGlldCBtb2RlIGFuZCBub3QgaW4gZmllbGQgaW5pdGlhbGl6ZXIKKwlwb3BFbGVtZW50KEtfU0VMRUNUT1IpOwogCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKIAlpZiAobWVzc2FnZVNlbmQgPT0gYXNzaXN0Tm9kZSl7CiAJCXRoaXMubGFzdENoZWNrUG9pbnQgPSBtZXNzYWdlU2VuZC5zb3VyY2VFbmQgKyAxOwpAQCAtMzE0LDcgKzI5NSw3IEBACiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKSB7CiAJc3VwZXIuY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7Ci0JdGhpcy5pbnZvY2F0aW9uUHRyLS07IC8vIE5COiBUaGlzIGNhbiBiZSBkZWNyZW1lbnRlZCBiZWxvdyAtMSBvbmx5IGlmIGluIGRpZXQgbW9kZSBhbmQgbm90IGluIGZpZWxkIGluaXRpYWxpemVyCisJcG9wRWxlbWVudChLX1NFTEVDVE9SKTsKIAlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZClleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CiAJaWYgKG1lc3NhZ2VTZW5kID09IGFzc2lzdE5vZGUpewogCQl0aGlzLmxhc3RDaGVja1BvaW50ID0gbWVzc2FnZVNlbmQuc291cmNlRW5kICsgMTsKQEAgLTMyMiw3ICszMDMsNyBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpIHsKIAlzdXBlci5jb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7Ci0JdGhpcy5pbnZvY2F0aW9uUHRyLS07IC8vIE5COiBUaGlzIGNhbiBiZSBkZWNyZW1lbnRlZCBiZWxvdyAtMSBvbmx5IGlmIGluIGRpZXQgbW9kZSBhbmQgbm90IGluIGZpZWxkIGluaXRpYWxpemVyIAorCXBvcEVsZW1lbnQoS19TRUxFQ1RPUik7CiAJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwogCWlmIChtZXNzYWdlU2VuZCA9PSBhc3Npc3ROb2RlKXsKIAkJdGhpcy5sYXN0Q2hlY2tQb2ludCA9IG1lc3NhZ2VTZW5kLnNvdXJjZUVuZCArIDE7CkBAIC0zMzAsNyArMzExLDcgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVOZXN0ZWRNZXRob2QoKSB7CiAJc3VwZXIuY29uc3VtZU5lc3RlZE1ldGhvZCgpOwotCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IHRydWU7CisJaWYoIWlzSW5zaWRlTWV0aG9kKCkpIHB1c2hPbkVsZW1lbnRTdGFjayhLX01FVEhPRF9ERUxJTUlURVIpOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZU9wZW5CbG9jaygpIHsKIAkvLyBPcGVuQmxvY2sgOjo9ICRlbXB0eQpAQCAtMzk5LDggKzM4MCw4IEBACiAJc3VwZXIuY29uc3VtZVJlc3RvcmVEaWV0KCk7CiAJLy8gaWYgd2UgYXJlIG5vdCBpbiBhIG1ldGhvZCAoaWUuIHdlIHdlcmUgbm90IGluIGEgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6ZXIpCiAJLy8gdGhlbiB3ZSBhcmUgZXhpdGluZyBhIGZpZWxkIGluaXRpYWxpemVyCi0JaWYgKCF0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0cl0pIHsKLQkJdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1t0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0gPSBmYWxzZTsKKwlpZiAoIWlzSW5zaWRlTWV0aG9kKCkpIHsKKwkJcG9wRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CkBAIC00NTYsMjYgKzQzNyw0MyBAQAogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCkgewogCXN1cGVyLmNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOwotCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IGZhbHNlOworCXBvcEVsZW1lbnQoS19NRVRIT0RfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0aWNPbmx5KCkgewogCXN1cGVyLmNvbnN1bWVTdGF0aWNPbmx5KCk7Ci0JdGhpcy5pbk1ldGhvZFN0YWNrW3RoaXMuaW5NZXRob2RQdHJdID0gdHJ1ZTsKKwlwdXNoT25FbGVtZW50U3RhY2soS19NRVRIT0RfREVMSU1JVEVSKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVUb2tlbihpbnQgdG9rZW4pIHsKIAlzdXBlci5jb25zdW1lVG9rZW4odG9rZW4pOworCQorCWlmKGlzRmlyc3QpIHsKKwkJaXNGaXJzdCA9IGZhbHNlOworCQlyZXR1cm47CisJfQogCS8vIHJlZ2lzdGVyIG1lc3NhZ2Ugc2VuZCBzZWxlY3RvciBvbmx5IGlmIGluc2lkZSBhIG1ldGhvZCBvciBpZiBsb29raW5nIGF0IGEgZmllbGQgaW5pdGlhbGl6ZXIgCiAJLy8gYW5kIGlmIHRoZSBjdXJyZW50IHRva2VuIGlzIGFuIG9wZW4gcGFyZW50aGVzaXMKLQlpZiAoKHRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSB8fCB0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrW3RoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyXSkgJiYgdG9rZW4gPT0gVG9rZW5OYW1lTFBBUkVOKSB7Ci0JCXN3aXRjaCAodGhpcy5wcmV2aW91c1Rva2VuKSB7Ci0JCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXI6Ci0JCQkJdGhpcy5wdXNoT25TZWxlY3RvclN0YWNrKHRoaXMuaWRlbnRpZmllclB0cik7CisJaWYgKGlzSW5zaWRlTWV0aG9kKCkgfHwgaXNJbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkpIHsKKwkJc3dpdGNoICh0b2tlbikgeworCQkJY2FzZSBUb2tlbk5hbWVMUEFSRU4gOgorCQkJCXN3aXRjaCAodGhpcy5wcmV2aW91c1Rva2VuKSB7CisJCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJCXRoaXMucHVzaE9uRWxlbWVudFN0YWNrKEtfU0VMRUNUT1IsIHRoaXMuaWRlbnRpZmllclB0cik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWV0aGlzOiAvLyBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCBlZy4gdGhpcygxLCAyKQorCQkJCQkJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soS19TRUxFQ1RPUiwgVEhJU19DT05TVFJVQ1RPUik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHN1cGVyKDEsIDIpCisJCQkJCQl0aGlzLnB1c2hPbkVsZW1lbnRTdGFjayhLX1NFTEVDVE9SLCBTVVBFUl9DT05TVFJVQ1RPUik7CisJCQkJCQlicmVhazsKKwkJCQl9CiAJCQkJYnJlYWs7Ci0JCQljYXNlIFRva2VuTmFtZXRoaXM6IC8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIGVnLiB0aGlzKDEsIDIpCi0JCQkJdGhpcy5wdXNoT25TZWxlY3RvclN0YWNrKFRISVNfQ09OU1RSVUNUT1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUb2tlbk5hbWVzdXBlcjogLy8gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZWcuIHN1cGVyKDEsIDIpCi0JCQkJdGhpcy5wdXNoT25TZWxlY3RvclN0YWNrKFNVUEVSX0NPTlNUUlVDVE9SKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQlpZih0b3BLbm93bkVsZW1lbnRLaW5kKEFTU0lTVF9QQVJTRVIpID09IEtfVFlQRV9ERUxJTUlURVIpIHsKKwkJCQkJcG9wRWxlbWVudChLX1RZUEVfREVMSU1JVEVSKTsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC01NTAsNiArNTQ4LDExIEBACiAJdGhpcy5pc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gZmFsc2U7CiAJdGhpcy5zZXRBc3Npc3RJZGVudGlmaWVyKG51bGwpOwogfQorcHJvdGVjdGVkIHZvaWQgZmx1c2hFbGVtZW50U3RhY2soKSB7CisJdGhpcy5lbGVtZW50UHRyID0gLTE7CisJdGhpcy5wcmV2aW91c0tpbmQgPSAwOworCXRoaXMucHJldmlvdXNJbmZvID0gMDsKK30KIC8qCiAgKiBCdWlsZCBzcGVjaWZpYyB0eXBlIHJlZmVyZW5jZSBub2RlcyBpbiBjYXNlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZCBpbnNpZGUgdGhlIHR5cGUgcmVmZXJlbmNlCiAgKi8KQEAgLTY0NCwxMiArNjQ3LDI4IEBACiAKIAlmaXJzdFRva2VuID0gVG9rZW5OYW1lVFdJRERMRTsKIAlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKKwkKKwlpc0ZpcnN0ID0gdHJ1ZTsKIH0KIHB1YmxpYyB2b2lkIGdvRm9yQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQoKSB7CiAJLy90ZWxscyB0aGUgc2Nhbm5lciB0byBnbyBmb3IgY29uc3RydWN0b3IgYmxvY2sgc3RhdGVtZW50cyBvcHQgcGFyc2luZwogCiAJZmlyc3RUb2tlbiA9IFRva2VuTmFtZU5PVDsKIAlzY2FubmVyLnJlY29yZExpbmVTZXBhcmF0b3IgPSBmYWxzZTsKKwkKKwlpc0ZpcnN0ID0gdHJ1ZTsKK30KK3B1YmxpYyB2b2lkIGdvRm9ySGVhZGVycygpeworCXN1cGVyLmdvRm9ySGVhZGVycygpOworCWlzRmlyc3QgPSB0cnVlOworfQorcHVibGljIHZvaWQgZ29Gb3JDb21waWxhdGlvblVuaXQoKXsKKwlzdXBlci5nb0ZvckNvbXBpbGF0aW9uVW5pdCgpOworCWlzRmlyc3QgPSB0cnVlOworfQorcHVibGljIHZvaWQgZ29Gb3JCbG9ja1N0YXRlbWVudHNPck1ldGhvZEhlYWRlcnMoKSB7CisJc3VwZXIuZ29Gb3JCbG9ja1N0YXRlbWVudHNPck1ldGhvZEhlYWRlcnMoKTsKKwlpc0ZpcnN0ID0gdHJ1ZTsKIH0KIC8qCiAgKiBSZXRyaWV2ZSBhIHBhcnRpYWwgc3Vic2V0IG9mIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIHVwIHRvIHRoZSBjb21wbGV0aW9uIHBvaW50LgpAQCAtNzAwLDY0ICs3MTksODIgQEAKIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJc3VwZXIuaW5pdGlhbGl6ZSgpOwogCXRoaXMuZmx1c2hBc3Npc3RTdGF0ZSgpOwotCXRoaXMuaW52b2NhdGlvblB0ciA9IC0xOwotCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyID0gMF0gPSBmYWxzZTsKLQl0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrW3RoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyID0gMF0gPSBmYWxzZTsKKwl0aGlzLmZsdXNoRWxlbWVudFN0YWNrKCk7CiAJdGhpcy5wcmV2aW91c0lkZW50aWZpZXJQdHIgPSAtMTsKIH0KKwogcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVNjYW5uZXIoKTsKLQotcHJvdGVjdGVkIHZvaWQgaW5pdEluTWV0aG9kQW5kSW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2soUmVjb3ZlcmVkRWxlbWVudCBjdXJyZW50RWxlbWVudCkgewotCi0JaW50IGxlbmd0aCA9IGN1cnJlbnRFbGVtZW50LmRlcHRoKCkgKyAxOwotCWludCBwdHIgPSBsZW5ndGg7Ci0JYm9vbGVhbltdIG1ldGhvZFN0YWNrID0gbmV3IGJvb2xlYW5bbGVuZ3RoXTsKLQlib29sZWFuW10gZmllbGRJbml0aWFsaXphdGlvblN0YWNrID0gbmV3IGJvb2xlYW5bbGVuZ3RoXTsKLQlib29sZWFuIGluTWV0aG9kID0gZmFsc2U7Ci0JYm9vbGVhbiBpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKLQkKLQlSZWNvdmVyZWRFbGVtZW50IGVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKLQl3aGlsZShlbGVtZW50ICE9IG51bGwpewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkTWV0aG9kIHx8Ci0JCQllbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpIHsKLQkJCWlmKGVsZW1lbnQucGFyZW50ID09IG51bGwpIHsKLQkJCQltZXRob2RTdGFja1stLXB0cl0gPSB0cnVlOwotCQkJCWZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1twdHJdID0gZmFsc2U7Ci0JCQl9Ci0JCQlpbk1ldGhvZCA9IHRydWU7Ci0JCX0gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkRmllbGQpewotCQkJaW5GaWVsZEluaXRpYWxpemVyID0gZWxlbWVudC5zb3VyY2VFbmQoKSA9PSAwOwotCQl9IGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpewotCQkJbWV0aG9kU3RhY2tbLS1wdHJdID0gaW5NZXRob2Q7Ci0JCQlmaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbcHRyXSA9IGluRmllbGRJbml0aWFsaXplcjsKLQkKLQkJCWluTWV0aG9kID0gZmFsc2U7Ci0JCQlpbkZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKLQkJfSBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRVbml0KSB7Ci0JCQltZXRob2RTdGFja1stLXB0cl0gPSBmYWxzZTsKLQkJCWZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1twdHJdID0gZmFsc2U7Ci0JCX0KLQkJZWxlbWVudCA9IGVsZW1lbnQucGFyZW50OwotCX0KLQkKLQlpbk1ldGhvZFB0ciA9IGxlbmd0aCAtIHB0ciAtIDE7Ci0JaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyID0gaW5NZXRob2RQdHI7Ci0JU3lzdGVtLmFycmF5Y29weShtZXRob2RTdGFjaywgcHRyLCBpbk1ldGhvZFN0YWNrLCAwLCBpbk1ldGhvZFB0ciArIDEpOwotCVN5c3RlbS5hcnJheWNvcHkoZmllbGRJbml0aWFsaXphdGlvblN0YWNrLCBwdHIsIGluRmllbGRJbml0aWFsaXphdGlvblN0YWNrLCAwLCBpbkZpZWxkSW5pdGlhbGl6YXRpb25QdHIgKyAxKTsKLQkKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgd2UgYXJlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5zaWRlIGEgZmllbGQgaW5pdGlhbGl6ZXIuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGluc2lkZUZpZWxkSW5pdGlhbGl6YXRpb24oKSB7Ci0JZm9yIChpbnQgaSA9IHRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyOyBpID49IDA7IGktLSkgewotCQlpZiAodGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFja1tpXSkgeworcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpeworCWludCBpID0gZWxlbWVudFB0cjsKKwl3aGlsZShpID4gLTEpIHsKKwkJaWYoZWxlbWVudEtpbmRTdGFja1tpXSA9PSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUikKIAkJCXJldHVybiB0cnVlOwotCQl9CisJCWktLTsKIAl9CiAJcmV0dXJuIGZhbHNlOwogfQorcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRpcmVjdGx5SW5zaWRlTWV0aG9kKCl7CisJaW50IGkgPSBlbGVtZW50UHRyOworCXdoaWxlKGkgPiAtMSkgeworCQlpZihlbGVtZW50S2luZFN0YWNrW2ldID09IEtfTUVUSE9EX0RFTElNSVRFUikKKwkJCXJldHVybiB0cnVlOworCQlpLS07CisJfQorCXJldHVybiBmYWxzZTsKK30KK3Byb3RlY3RlZCBib29sZWFuIGlzSW5kaXJlY3RseUluc2lkZVR5cGUoKXsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCWlmKGVsZW1lbnRLaW5kU3RhY2tbaV0gPT0gS19UWVBFX0RFTElNSVRFUikKKwkJCXJldHVybiB0cnVlOworCQlpLS07CisJfQorCXJldHVybiBmYWxzZTsKK30KK3Byb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpeworCWludCBpID0gZWxlbWVudFB0cjsKKwl3aGlsZShpID4gLTEpIHsKKwkJc3dpdGNoIChlbGVtZW50S2luZFN0YWNrW2ldKSB7CisJCQljYXNlIEtfVFlQRV9ERUxJTUlURVIgOiByZXR1cm4gZmFsc2U7CisJCQljYXNlIEtfTUVUSE9EX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKKwkJCWNhc2UgS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIgOiByZXR1cm4gdHJ1ZTsKKwkJfQorCQlpLS07CisJfQorCXJldHVybiBmYWxzZTsKK30KK3Byb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlTWV0aG9kKCl7CisJaW50IGkgPSBlbGVtZW50UHRyOworCXdoaWxlKGkgPiAtMSkgeworCQlzd2l0Y2ggKGVsZW1lbnRLaW5kU3RhY2tbaV0pIHsKKwkJCWNhc2UgS19UWVBFX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKKwkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIHRydWU7CisJCQljYXNlIEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQl9CQorCQlpLS07CisJfQorCXJldHVybiBmYWxzZTsKK30KK3Byb3RlY3RlZCBib29sZWFuIGlzSW5zaWRlVHlwZSgpeworCWludCBpID0gZWxlbWVudFB0cjsKKwl3aGlsZShpID4gLTEpIHsKKwkJc3dpdGNoIChlbGVtZW50S2luZFN0YWNrW2ldKSB7CisJCQljYXNlIEtfVFlQRV9ERUxJTUlURVIgOiByZXR1cm4gdHJ1ZTsKKwkJCWNhc2UgS19NRVRIT0RfREVMSU1JVEVSIDogcmV0dXJuIGZhbHNlOworCQkJY2FzZSBLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUiA6IHJldHVybiBmYWxzZTsKKwkJfQorCQlpLS07CisJfQorCXJldHVybiBmYWxzZTsKK30KK3Byb3RlY3RlZCBpbnQgbGFzdEluZGV4T2ZFbGVtZW50KGludCBraW5kKSB7CisJaW50IGkgPSBlbGVtZW50UHRyOworCXdoaWxlKGkgPiAtMSkgeworCQlpZihlbGVtZW50S2luZFN0YWNrW2ldID09IGtpbmQpIHJldHVybiBpOworCQlpLS07CQorCX0KKwlyZXR1cm4gLTE7Cit9CiAvKioKICAqIFBhcnNlIHRoZSBibG9jayBzdGF0ZW1lbnRzIGluc2lkZSB0aGUgZ2l2ZW4gbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCB0cnkgdG8gY29tcGxldGUgYXQgdGhlCiAgKiBjdXJzb3IgbG9jYXRpb24uCkBAIC04NTcsNiArODk0LDMyIEBACiAJCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlXS0tOwkJCiAJfQogfQorcHJvdGVjdGVkIHZvaWQgcG9wRWxlbWVudChpbnQga2luZCl7CisJaWYoZWxlbWVudFB0ciA8IDAgfHwgZWxlbWVudEtpbmRTdGFja1tlbGVtZW50UHRyXSAhPSBraW5kKSByZXR1cm47CisJCisJcHJldmlvdXNLaW5kID0gZWxlbWVudEtpbmRTdGFja1tlbGVtZW50UHRyXTsKKwlwcmV2aW91c0luZm8gPSBlbGVtZW50SW5mb1N0YWNrW2VsZW1lbnRQdHJdOworCQorCXN3aXRjaCAoa2luZCkgeworCQlkZWZhdWx0IDoKKwkJCWVsZW1lbnRQdHItLTsKKwkJCWJyZWFrOworCX0KK30KK3Byb3RlY3RlZCB2b2lkIHBvcFVudGlsRWxlbWVudChpbnQga2luZCl7CisJaWYoZWxlbWVudFB0ciA8IDApIHJldHVybjsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUgKGkgPj0gMCAmJiBlbGVtZW50S2luZFN0YWNrW2ldICE9IGtpbmQpIHsKKwkJaS0tOworCX0KKwlpZihpID49IDApIHsKKwkJaWYoaSA8IGVsZW1lbnRQdHIpIHsKKwkJCXByZXZpb3VzS2luZCA9IGVsZW1lbnRLaW5kU3RhY2tbaSsxXTsKKwkJCXByZXZpb3VzSW5mbyA9IGVsZW1lbnRJbmZvU3RhY2tbaSsxXTsKKwkJfQorCQllbGVtZW50UHRyID0gaTsJCisJfQorfQogLyoKICAqIFByZXBhcmVzIHRoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHRvIGdvIGZvciBCbG9ja1N0YXRlbWVudHMuCiAgKi8KQEAgLTg2NCw0NyArOTI3LDk4IEBACiAJdGhpcy5uZXN0ZWRNZXRob2RbdGhpcy5uZXN0ZWRUeXBlID0gMF0gPSAxOwogCXRoaXMudmFyaWFibGVzQ291bnRlclt0aGlzLm5lc3RlZFR5cGVdID0gMDsKIAl0aGlzLnJlYWxCbG9ja1N0YWNrW3RoaXMucmVhbEJsb2NrUHRyID0gMV0gPSAwOwotCXRoaXMuaW52b2NhdGlvblB0ciA9IC0xOwotfQotLyoKLSAqIFB1c2hlcyAnZmFsc2UnIG9uIHRoZSBpbkluaXRpYWxpemVyU3RhY2suCi0gKi8KLXByb3RlY3RlZCB2b2lkIHB1c2hOb3RJbkluaXRpYWxpemVyKCkgewotCXRyeSB7Ci0JCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbKyt0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblB0cl0gPSBmYWxzZTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJLy9leGNlcHQgaW4gdGVzdCdzIGNhc2VzLCBpdCBzaG91bGQgbmV2ZXIgcmFpc2UKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFjay5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFjayAsIDAsICh0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrID0gbmV3IGJvb2xlYW5bb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0pLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCXRoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uU3RhY2tbdGhpcy5pbkZpZWxkSW5pdGlhbGl6YXRpb25QdHJdID0gZmFsc2U7CisJCisJLy8gaW5pdGlhbGl6ZSBlbGVtZW50IHN0YWNrCisJaW50IGZpZWxkSW5pdGlhbGl6ZXJJbmRleCA9IGxhc3RJbmRleE9mRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CisJaW50IG1ldGhvZEluZGV4ID0gbGFzdEluZGV4T2ZFbGVtZW50KEtfTUVUSE9EX0RFTElNSVRFUik7CisJaWYobWV0aG9kSW5kZXggPT0gZmllbGRJbml0aWFsaXplckluZGV4KSB7CisJCS8vIHRoZXJlIGlzIG5vIG1ldGhvZCBhbmQgbm8gZmllbGQgaW5pdGlhbGl6ZXIKKwkJZmx1c2hFbGVtZW50U3RhY2soKTsKKwl9IGVsc2UgaWYobWV0aG9kSW5kZXggPiBmaWVsZEluaXRpYWxpemVySW5kZXgpIHsKKwkJcG9wVW50aWxFbGVtZW50KEtfTUVUSE9EX0RFTElNSVRFUik7CisJfSBlbHNlIHsKKwkJcG9wVW50aWxFbGVtZW50KEtfRklFTERfSU5JVElBTElaRVJfREVMSU1JVEVSKTsKIAl9CiB9CiAvKgotICogUHVzaGVzICdmYWxzZScgb24gdGhlIGluTWV0aG9kU3RhY2suCisgKiBQcmVwYXJlcyB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciB0byBnbyBmb3IgSGVhZGVycy4KICAqLwotcHJvdGVjdGVkIHZvaWQgcHVzaE5vdEluTWV0aG9kKCkgeworcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckhlYWRlcnMoKSB7CisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGUgPSAwXSA9IDA7CisJdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSA9IDA7CisJcmVhbEJsb2NrU3RhY2tbcmVhbEJsb2NrUHRyID0gMF0gPSAwOworCQorCXBvcFVudGlsRWxlbWVudChLX1RZUEVfREVMSU1JVEVSKTsKK30KK3Byb3RlY3RlZCB2b2lkIHB1c2hPbkVsZW1lbnRTdGFjayhpbnQga2luZCl7CisJdGhpcy5wdXNoT25FbGVtZW50U3RhY2soa2luZCwgMCk7Cit9Citwcm90ZWN0ZWQgdm9pZCBwdXNoT25FbGVtZW50U3RhY2soaW50IGtpbmQsIGludCBpbmZvKXsKKwlpZiAodGhpcy5lbGVtZW50UHRyIDwgLTEpIHJldHVybjsKKwkKKwl0aGlzLnByZXZpb3VzS2luZCA9IDA7CisJdGhpcy5wcmV2aW91c0luZm8gPSAwOworCQogCXRyeSB7Ci0JCXRoaXMuaW5NZXRob2RTdGFja1srK3RoaXMuaW5NZXRob2RQdHJdID0gZmFsc2U7CisJCXRoaXMuZWxlbWVudFB0cisrOworCQl0aGlzLmVsZW1lbnRLaW5kU3RhY2tbdGhpcy5lbGVtZW50UHRyXSA9IGtpbmQ7CisJCXRoaXMuZWxlbWVudEluZm9TdGFja1t0aGlzLmVsZW1lbnRQdHJdID0gaW5mbzsKIAl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJLy9leGNlcHQgaW4gdGVzdCdzIGNhc2VzLCBpdCBzaG91bGQgbmV2ZXIgcmFpc2UKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5pbk1ldGhvZFN0YWNrLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmluTWV0aG9kU3RhY2sgLCAwLCAodGhpcy5pbk1ldGhvZFN0YWNrID0gbmV3IGJvb2xlYW5bb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF0pLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCXRoaXMuaW5NZXRob2RTdGFja1t0aGlzLmluTWV0aG9kUHRyXSA9IGZhbHNlOworCQlpbnQgb2xkU3RhY2tMZW5ndGggPSB0aGlzLmVsZW1lbnRLaW5kU3RhY2subGVuZ3RoOworCQlpbnQgb2xkRWxlbWVudFN0YWNrW10gPSB0aGlzLmVsZW1lbnRLaW5kU3RhY2s7CisJCWludCBvbGRFbGVtZW50SW5mb1N0YWNrW10gPSB0aGlzLmVsZW1lbnRJbmZvU3RhY2s7CisJCXRoaXMuZWxlbWVudEtpbmRTdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCXRoaXMuZWxlbWVudEluZm9TdGFjayA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyBTdGFja0luY3JlbWVudF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkRWxlbWVudFN0YWNrLCAwLCB0aGlzLmVsZW1lbnRLaW5kU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRFbGVtZW50SW5mb1N0YWNrLCAwLCB0aGlzLmVsZW1lbnRJbmZvU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJdGhpcy5lbGVtZW50S2luZFN0YWNrW3RoaXMuZWxlbWVudFB0cl0gPSBraW5kOworCQl0aGlzLmVsZW1lbnRJbmZvU3RhY2tbdGhpcy5lbGVtZW50UHRyXSA9IGluZm87CiAJfQogfQotLyoqCi0gKiBQdXNoZXMgdGhlIGdpdmVuIHRoZSBnaXZlbiBzZWxlY3RvciAoYW4gaWRlbnRpZmllciBwb2ludGVyIHRvIHRoZSBpZGVudGlmaWVyIHN0YWNrKSBvbiB0aGUgc2VsZWN0b3Igc3RhY2suCi0gKi8KLXByb3RlY3RlZCB2b2lkIHB1c2hPblNlbGVjdG9yU3RhY2soaW50IHNlbGVjdG9ySWRQdHIpIHsKLQlpZiAodGhpcy5pbnZvY2F0aW9uUHRyIDwgLTEpIHJldHVybjsKLQl0cnkgewotCQl0aGlzLnNlbGVjdG9yU3RhY2tbKyt0aGlzLmludm9jYXRpb25QdHJdID0gc2VsZWN0b3JJZFB0cjsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5zZWxlY3RvclN0YWNrLmxlbmd0aDsKLQkJaW50IG9sZFNlbGVjdG9yU3RhY2tbXSA9IHRoaXMuc2VsZWN0b3JTdGFjazsKLQkJdGhpcy5zZWxlY3RvclN0YWNrID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIFN0YWNrSW5jcmVtZW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTZWxlY3RvclN0YWNrLCAwLCB0aGlzLnNlbGVjdG9yU3RhY2ssIDAsIG9sZFN0YWNrTGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3RvclN0YWNrW3RoaXMuaW52b2NhdGlvblB0cl0gPSBzZWxlY3RvcklkUHRyOworcHVibGljIHZvaWQgcmVjb3ZlcnlFeGl0RnJvbVZhcmlhYmxlKCkgeworCWlmKGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRGaWVsZAorCQkmJiAhKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpKSB7CisJCVJlY292ZXJlZEVsZW1lbnQgb2xkRWxlbWVudCA9IGN1cnJlbnRFbGVtZW50OworCQlzdXBlci5yZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKTsKKwkJaWYob2xkRWxlbWVudCAhPSBjdXJyZW50RWxlbWVudCkgeworCQkJcG9wRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CisJCX0KKwl9IGVsc2UgeworCQlzdXBlci5yZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKTsKKwl9Cit9CitwdWJsaWMgdm9pZCByZWNvdmVyeVRva2VuQ2hlY2soKSB7CisJUmVjb3ZlcmVkRWxlbWVudCBvbGRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7CisJc3dpdGNoIChjdXJyZW50VG9rZW4pIHsKKwkJY2FzZSBUb2tlbk5hbWVMQlJBQ0UgOgorCQkJc3VwZXIucmVjb3ZlcnlUb2tlbkNoZWNrKCk7CisJCQlpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEluaXRpYWxpemVyKSB7CisJCQkJaWYob2xkRWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkKSB7CisJCQkJCXBvcFVudGlsRWxlbWVudChLX0ZJRUxEX0lOSVRJQUxJWkVSX0RFTElNSVRFUik7CisJCQkJCXBvcEVsZW1lbnQoS19GSUVMRF9JTklUSUFMSVpFUl9ERUxJTUlURVIpOworCQkJCX0KKwkJCQlpZihjdXJyZW50RWxlbWVudCAhPSBvbGRFbGVtZW50CisJCQkJCSYmIHRvcEtub3duRWxlbWVudEtpbmQoQVNTSVNUX1BBUlNFUikgIT0gS19NRVRIT0RfREVMSU1JVEVSKSB7CisJCQkJCXB1c2hPbkVsZW1lbnRTdGFjayhLX01FVEhPRF9ERUxJTUlURVIpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRva2VuTmFtZVJCUkFDRSA6CisJCQlzdXBlci5yZWNvdmVyeVRva2VuQ2hlY2soKTsKKwkJCWlmKGN1cnJlbnRFbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKKwkJCQlpZihvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIKKwkJCQkJfHwgb2xkRWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZE1ldGhvZCkgeworCQkJCQlwb3BVbnRpbEVsZW1lbnQoS19NRVRIT0RfREVMSU1JVEVSKTsKKwkJCQkJcG9wRWxlbWVudChLX01FVEhPRF9ERUxJTUlURVIpOworCQkJCX0gZWxzZSBpZihvbGRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkVHlwZSkgeworCQkJCQlwb3BVbnRpbEVsZW1lbnQoS19UWVBFX0RFTElNSVRFUik7CisJCQkJCXBvcEVsZW1lbnQoS19UWVBFX0RFTElNSVRFUik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJc3VwZXIucmVjb3ZlcnlUb2tlbkNoZWNrKCk7CisJCQlicmVhazsKIAl9CiB9CiBwdWJsaWMgdm9pZCByZXNldCgpewpAQCAtOTEyLDE0ICsxMDI2LDYgQEAKIH0KIC8qCiAgKiBSZXNldCBjb250ZXh0IHNvIGFzIHRvIHJlc3VtZSB0byByZWd1bGFyIHBhcnNlIGxvb3AKLSAqLwotcHJvdGVjdGVkIHZvaWQgcmVzZXRTdGFja3MoKSB7Ci0Jc3VwZXIucmVzZXRTdGFja3MoKTsKLQl0aGlzLmluRmllbGRJbml0aWFsaXphdGlvblN0YWNrW3RoaXMuaW5GaWVsZEluaXRpYWxpemF0aW9uUHRyID0gMF0gPSBmYWxzZTsKLQl0aGlzLmluTWV0aG9kU3RhY2tbdGhpcy5pbk1ldGhvZFB0ciA9IDBdID0gZmFsc2U7Ci19Ci0vKgotICogUmVzZXQgY29udGV4dCBzbyBhcyB0byByZXN1bWUgdG8gcmVndWxhciBwYXJzZSBsb29wCiAgKiBJZiB1bmFibGUgdG8gcmVzZXQgZm9yIHJlc3VtaW5nLCBhbnN3ZXJzIGZhbHNlLgogICoKICAqIE1vdmUgY2hlY2twb2ludCBsb2NhdGlvbiwgcmVzZXQgaW50ZXJuYWwgc3RhY2tzIGFuZApAQCAtOTQ0LDIyICsxMDUwLDE3IEBACiAJLyogYXR0ZW1wdCB0byBtb3ZlIGNoZWNrcG9pbnQgbG9jYXRpb24gKi8KIAlpZiAoIXRoaXMubW92ZVJlY292ZXJ5Q2hlY2twb2ludCgpKSByZXR1cm4gZmFsc2U7CiAKLQlpbml0SW5NZXRob2RBbmRJbkZpZWxkSW5pdGlhbGl6YXRpb25TdGFjayhjdXJyZW50RWxlbWVudCk7Ci0KIAkvLyBvbmx5IGxvb2sgZm9yIGhlYWRlcnMKIAlpZiAocmVmZXJlbmNlQ29udGV4dCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uCiAJCXx8IHRoaXMuYXNzaXN0Tm9kZSAhPSBudWxsKXsKLQkJCi0JCWlmKGluTWV0aG9kU3RhY2tbaW5NZXRob2RQdHJdICYmCi0JCQlpbnNpZGVGaWVsZEluaXRpYWxpemF0aW9uKCkgJiYKKwkJaWYoaXNJbnNpZGVNZXRob2QoKSAmJgorCQkJaXNJbmRpcmVjdGx5SW5zaWRlRmllbGRJbml0aWFsaXphdGlvbigpICYmCQkKIAkJCXRoaXMuYXNzaXN0Tm9kZSA9PSBudWxsCiAJCQkpeyAKIAkJCXRoaXMucHJlcGFyZUZvckJsb2NrU3RhdGVtZW50cygpOwogCQkJZ29Gb3JCbG9ja1N0YXRlbWVudHNPck1ldGhvZEhlYWRlcnMoKTsKIAkJfSBlbHNlIHsKLQkJCW5lc3RlZE1ldGhvZFtuZXN0ZWRUeXBlID0gMF0gPSAwOwotCQkJdmFyaWFibGVzQ291bnRlcltuZXN0ZWRUeXBlXSA9IDA7Ci0JCQlyZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHIgPSAwXSA9IDA7CisJCQl0aGlzLnByZXBhcmVGb3JIZWFkZXJzKCk7CiAJCQlnb0ZvckhlYWRlcnMoKTsKIAkJCWRpZXQgPSB0cnVlOyAvLyBwYXNzZWQgdGhpcyBwb2ludCwgd2lsbCBub3QgY29uc2lkZXIgbWV0aG9kIGJvZGllcwogCQl9CkBAIC05NjksOSArMTA3MCw3IEBACiAJCXx8IHJlZmVyZW5jZUNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pewogCQkJCiAJCWlmIChjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZFR5cGUpewotCQkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGUgPSAwXSA9IDA7Ci0JCQl2YXJpYWJsZXNDb3VudGVyW25lc3RlZFR5cGVdID0gMDsKLQkJCXJlYWxCbG9ja1N0YWNrW3JlYWxCbG9ja1B0ciA9IDBdID0gMDsKKwkJCXRoaXMucHJlcGFyZUZvckhlYWRlcnMoKTsKIAkJCWdvRm9ySGVhZGVycygpOwogCQl9IGVsc2UgewogCQkJdGhpcy5wcmVwYXJlRm9yQmxvY2tTdGF0ZW1lbnRzKCk7CkBAIC05ODMsNiArMTA4MiwzNCBAQAogCXJldHVybiBmYWxzZTsKIH0KIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEFzc2lzdElkZW50aWZpZXIoY2hhcltdIGFzc2lzdElkZW50KTsKK3Byb3RlY3RlZCBpbnQgdG9wS25vd25FbGVtZW50SW5mbyhpbnQgb3duZXIpIHsKKwlyZXR1cm4gdG9wS25vd25FbGVtZW50SW5mbyhvd25lciwgMCk7Cit9Citwcm90ZWN0ZWQgaW50IHRvcEtub3duRWxlbWVudEluZm8oaW50IG93bmVyLCBpbnQgb2ZmU2V0KSB7CisJaW50IGkgPSBlbGVtZW50UHRyOworCXdoaWxlKGkgPiAtMSkgeworCQlpZigoZWxlbWVudEtpbmRTdGFja1tpXSAmIG93bmVyKSAhPSAwKSB7CisJCQlpZihvZmZTZXQgPD0gMCkgcmV0dXJuIGVsZW1lbnRJbmZvU3RhY2tbaV07CisJCQlvZmZTZXQtLTsKKwkJfQorCQlpLS07CisJfQorCXJldHVybiAwOworfQorcHJvdGVjdGVkIGludCB0b3BLbm93bkVsZW1lbnRLaW5kKGludCBvd25lcikgeworCXJldHVybiB0b3BLbm93bkVsZW1lbnRLaW5kKG93bmVyLCAwKTsKK30KK3Byb3RlY3RlZCBpbnQgdG9wS25vd25FbGVtZW50S2luZChpbnQgb3duZXIsIGludCBvZmZTZXQpIHsKKwlpbnQgaSA9IGVsZW1lbnRQdHI7CisJd2hpbGUoaSA+IC0xKSB7CisJCWlmKChlbGVtZW50S2luZFN0YWNrW2ldICYgb3duZXIpICE9IDApIHsKKwkJCWlmKG9mZlNldCA8PSAwKSByZXR1cm4gZWxlbWVudEtpbmRTdGFja1tpXTsKKwkJCW9mZlNldC0tOworCQl9CisJCWktLTsKKwl9CisJcmV0dXJuIDA7Cit9CiAvKioKICAqIElmIHRoZSBnaXZlbiBhc3Qgbm9kZSBpcyBpbnNpZGUgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbAogICogdGhlbiB3cmFwIGl0IHdpdGggYSBmYWtlIGNvbnN0cnVjdG9yIGNhbGwuCkBAIC05OTAsOCArMTExNyw4IEBACiAgKi8KIHByb3RlY3RlZCBBc3ROb2RlIHdyYXBXaXRoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxJZk5lZWRlZChBc3ROb2RlIGFzdCkgewogCWludCBzZWxlY3RvcjsKLQlpZiAoYXN0ICE9IG51bGwgJiYgdGhpcy5pbnZvY2F0aW9uUHRyID49IDAgJiYgYXN0IGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJgotCQkJKCgoc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yU3RhY2tbdGhpcy5pbnZvY2F0aW9uUHRyXSkgPT0gVEhJU19DT05TVFJVQ1RPUikgfHwKKwlpZiAoYXN0ICE9IG51bGwgJiYgdG9wS25vd25FbGVtZW50S2luZChBU1NJU1RfUEFSU0VSKSA9PSBLX1NFTEVDVE9SICYmIGFzdCBpbnN0YW5jZW9mIEV4cHJlc3Npb24gJiYKKwkJCSgoKHNlbGVjdG9yID0gdG9wS25vd25FbGVtZW50SW5mbyhBU1NJU1RfUEFSU0VSKSkgPT0gVEhJU19DT05TVFJVQ1RPUikgfHwKIAkJCShzZWxlY3RvciA9PSBTVVBFUl9DT05TVFJVQ1RPUikpKSB7CiAJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGNhbGwgPSBuZXcgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoCiAJCQkoc2VsZWN0b3IgPT0gVEhJU19DT05TVFJVQ1RPUikgPyAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9FbmdpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9FbmdpbmUuamF2YQppbmRleCBhMDBlNWQyLi5jMzNhNzQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L2ltcGwvRW5naW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0VuZ2luZS5qYXZhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9LZXl3b3Jkcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9pbXBsL0tleXdvcmRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOTRiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3QvaW1wbC9LZXl3b3Jkcy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbDsKKworcHVibGljIGludGVyZmFjZSBLZXl3b3JkcyB7CisJaW50IENPVU5UID0gNDE7CisJCisJY2hhcltdIEFCU1RBUkNUID0gImFic3RyYWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEFTU0VSVCA9ICJhc3NlcnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQlJFQUsgPSAiYnJlYWsiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gQ0FTRSA9ICJjYXNlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIENBVENIID0gImNhdGNoIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIENMQVNTID0gImNsYXNzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIENPTlRJTlVFID0gImNvbnRpbnVlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIERFRkFVTFQgPSAiZGVmYXVsdCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBETyA9ICJkbyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBFTFNFID0gImVsc2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gRVhURU5EUyA9ICJleHRlbmRzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEZJTkFMID0gImZpbmFsIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIEZJTkFMTFkgPSAiZmluYWxseSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBGT1IgPSAiZm9yIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIElGID0gImlmIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIElNUExFTUVOVFMgPSAiaW1wbGVtZW50cyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBJTVBPUlQgPSAiaW1wb3J0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIElOU1RBTkNFT0YgPSAiaW5zdGFuY2VvZiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBJTlRFUkZBQ0UgPSAiaW50ZXJmYWNlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIE5BVElWRSA9ICJuYXRpdmUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gTkVXID0gIm5ldyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBQQUNLQUdFID0gInBhY2thZ2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gUFJJVkFURSA9ICJwcml2YXRlIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFBST1RFQ1RFRCA9ICJwcm90ZWN0ZWQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gUFVCTElDID0gInB1YmxpYyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBSRVRVUk4gPSAicmV0dXJuIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFNUQVRJQyA9ICJzdGF0aWMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU1RSSUNURlAgPSAic3RyaWN0ZnAiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU1VQRVIgPSAic3VwZXIiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gU1dJVENIID0gInN3aXRjaCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBTWU5DSFJPTklaRUQgPSAic3luY2hyb25pemVkIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFRISVMgPSAidGhpcyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBUSFJPVyA9ICJ0aHJvdyIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBUSFJPV1MgPSAidGhyb3dzIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJY2hhcltdIFRSQU5TSUVOVCA9ICJ0cmFuc2llbnQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gVFJZID0gInRyeSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBWT0xBVElMRSA9ICJ2b2xhdGlsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBXSElMRSA9ICJ3aGlsZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWNoYXJbXSBUUlVFID0gInRydWUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gRkFMU0UgPSAiZmFsc2UiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwljaGFyW10gTlVMTCA9ICJudWxsIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Ob2RlRm91bmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk5vZGVGb3VuZC5qYXZhCmluZGV4IDMzMWRjYzUuLjVhNWQ5NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk5vZGVGb3VuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk5vZGVGb3VuZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uQXJndW1lbnROYW1lLmphdmEKaW5kZXggYzc5ZmY1Ny4uM2Y3NWU5NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Bcmd1bWVudE5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkFyZ3VtZW50TmFtZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQppbmRleCA2NDMzODhiLi5mZmUyNTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZS5qYXZhCmluZGV4IGQ1NTRkZjcuLmFlY2M1ZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25GaWVsZFR5cGUuamF2YQppbmRleCAzNzBhZjNiLi5jYjc2NTg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkZpZWxkVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uRmllbGRUeXBlLmphdmEKQEAgLTEsMTUgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CiAKQEAgLTE5LDcgKzIwLDcgQEAKIAkJdGhpcy5zb3VyY2VTdGFydCA9IHR5cGUuc291cmNlU3RhcnQ7CiAJCXRoaXMuc291cmNlRW5kID0gdHlwZS5zb3VyY2VFbmQ7CiAJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMubmFtZSA9IE5vQ2hhcjsKKwkJdGhpcy5uYW1lID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKIAkJcmV0dXJuIHR5cGUudG9TdHJpbmcodGFiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkltcG9ydFJlZmVyZW5jZS5qYXZhCmluZGV4IDVmNmFkMjYuLjNjOTk5NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uSW1wb3J0UmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25JbXBvcnRSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKIAogLyoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTG9jYWxOYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PbkxvY2FsTmFtZS5qYXZhCmluZGV4IDUyMDRkNDkuLmZiYjEzN2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTG9jYWxOYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25Mb2NhbE5hbWUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTWVzc2FnZVNlbmQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uTWVzc2FnZVNlbmQuamF2YQppbmRleCBkMGQ4ODExLi5lYjczZGMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25NZXNzYWdlU2VuZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpAQCAtMzAsMTQgKzMwLDY3IEBACiAgKi8KIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UYWdCaXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiAKIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Pbk1lc3NhZ2VTZW5kIGV4dGVuZHMgTWVzc2FnZVNlbmQgewogCisJLyoKKwkgKiBDYW5ub3QgYW5zd2VyIGRlZmF1bHQgYWJzdHJhY3QgbWF0Y2gsIGl0ZXJhdGUgaW4gc3VwZXJpbnRlcmZhY2VzIG9mIGRlY2xhcmluZyBjbGFzcworCSAqIGZvciBhIGJldHRlciBtYXRjaCAoZGVmYXVsdCBhYnN0cmFjdCBtYXRjaCBjYW1lIGZyb20gc2NvcGUgbG9va3VwcykuCisJICovCisJcHJpdmF0ZSBNZXRob2RCaW5kaW5nIGZpbmROb25EZWZhdWx0QWJzdHJhY3RNZXRob2QoTWV0aG9kQmluZGluZyBiaW5kaW5nKSB7CisKKwkJUmVmZXJlbmNlQmluZGluZ1tdIGl0c0ludGVyZmFjZXMgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnN1cGVySW50ZXJmYWNlcygpOworCQlpZiAoaXRzSW50ZXJmYWNlcyAhPSBOb1N1cGVySW50ZXJmYWNlcykgeworCQkJUmVmZXJlbmNlQmluZGluZ1tdW10gaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XVtdOworCQkJaW50IGxhc3RQb3NpdGlvbiA9IDA7CisJCQlpbnRlcmZhY2VzVG9WaXNpdFtsYXN0UG9zaXRpb25dID0gaXRzSW50ZXJmYWNlczsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGFzdFBvc2l0aW9uOyBpKyspIHsKKwkJCQlSZWZlcmVuY2VCaW5kaW5nW10gaW50ZXJmYWNlcyA9IGludGVyZmFjZXNUb1Zpc2l0W2ldOworCisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aCA9IGludGVyZmFjZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyBqKyspIHsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGludGVyZmFjZXNbal07CisKKwkJCQkJaWYgKChjdXJyZW50VHlwZS50YWdCaXRzICYgVGFnQml0cy5JbnRlcmZhY2VWaXNpdGVkKSA9PSAwKSB7CisJCQkJCQkvLyBpZiBpbnRlcmZhY2UgYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkCisJCQkJCQljdXJyZW50VHlwZS50YWdCaXRzIHw9IFRhZ0JpdHMuSW50ZXJmYWNlVmlzaXRlZDsKKworCQkJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKGJpbmRpbmcuc2VsZWN0b3IpOzsKKwkJCQkJCWlmKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbWV0aG9kcy5sZW5ndGg7IGsrKykgeworCQkJCQkJCQlpZihiaW5kaW5nLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2tdKSkgeworCQkJCQkJCQkJcmV0dXJuIG1ldGhvZHNba107CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCWl0c0ludGVyZmFjZXMgPSBjdXJyZW50VHlwZS5zdXBlckludGVyZmFjZXMoKTsKKwkJCQkJCWlmIChpdHNJbnRlcmZhY2VzICE9IE5vU3VwZXJJbnRlcmZhY2VzKSB7CisKKwkJCQkJCQlpZiAoKytsYXN0UG9zaXRpb24gPT0gaW50ZXJmYWNlc1RvVmlzaXQubGVuZ3RoKQorCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXQgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1tsYXN0UG9zaXRpb24gKiAyXVtdLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCWxhc3RQb3NpdGlvbik7CisJCQkJCQkJaW50ZXJmYWNlc1RvVmlzaXRbbGFzdFBvc2l0aW9uXSA9IGl0c0ludGVyZmFjZXM7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGJpbmRpbmc7CisJfQorCQogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisKIAkJc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOwogCiAJCS8vIHRvbGVyYXRlIHNvbWUgZXJyb3IgY2FzZXMKQEAgLTQ5LDEzICsxMDIsMTggQEAKIAkJCQkJCXx8IGJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0KSkgewogCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZCgpOwogCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFNlbGVjdGlvbk5vZGVGb3VuZChiaW5kaW5nKTsKKwkJCWlmKGJpbmRpbmcuaXNEZWZhdWx0QWJzdHJhY3QoKSkgeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoZmluZE5vbkRlZmF1bHRBYnN0cmFjdE1ldGhvZChiaW5kaW5nKSk7IC8vIDIzNTk0CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCQl9CiAJCX0KIAl9Ci0KKwkKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKKwogCQlTdHJpbmcgcyA9ICI8U2VsZWN0T25NZXNzYWdlU2VuZDoiOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCkKKwkJaWYgKCFyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpKQogCQkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSArICIuIjsgLy8kTk9OLU5MUy0xJAogCQlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiOyAvLyROT04tTkxTLTEkCiAJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtNjksNCArMTI3LDQgQEAKIAkJcyA9IHMgKyAiKT4iOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblBhY2thZ2VSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhCmluZGV4IDAyOWI1MjguLmE3YzM1ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUGFja2FnZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCmluZGV4IGU3ODI0MjEuLmMwZGNiNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDZhM2UxMzUuLjYyMTI3NzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpAQCAtMzEsNiArMzEsNyBAQAogICoKICAqLwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZE5hbWVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwpAQCAtMzgsNyArMzksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25PblF1YWxpZmllZE5hbWVSZWZlcmVuY2UgZXh0ZW5kcyBRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHsKIAlwdWJsaWMgbG9uZ1tdIHNvdXJjZVBvc2l0aW9uczsgLy8gcG9zaXRpb25zIG9mIGVhY2ggdG9rZW4sIHRoZSBsYXN0IG9uZSBiZWluZyB0aGUgcG9zaXRpb25zIG9mIHRoZSBjb21wbGV0aW9uIGlkZW50aWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQppbmRleCBhZWQ5ZmUxLi5lYjFjYjQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCAyNDRlOTA2Li43OWJlZTJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKIAogLyoKQEAgLTIyLDEyICsyMiwxMiBAQAogICoKICAqLwogIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5RdWFsaWZpZWRUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWFzb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlIGV4dGVuZHMgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSB7CiBwdWJsaWMgU2VsZWN0aW9uT25RdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHByZXZpb3VzSWRlbnRpZmllcnMsIGNoYXJbXSBzZWxlY3Rpb25JZGVudGlmaWVyLCBsb25nW10gcG9zaXRpb25zKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmluZGV4IDEwOTk4YmIuLmUyYzg5YzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TaW5nbGVUeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQppbmRleCA5ZTk1NWFiLi5hNDI1MzNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblNpbmdsZVR5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKIAogLyoKQEAgLTUxLDEyICs1MSwxMiBAQAogCXN1cGVyLnJlc29sdmVUeXBlRW5jbG9zaW5nKHNjb3BlLCBlbmNsb3NpbmdUeXBlKTsKIAogCQkvLyB0b2xlcmF0ZSBzb21lIGVycm9yIGNhc2VzCi0JCWlmIChiaW5kaW5nID09IG51bGwgfHwgCi0JCQkJIShiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkgfHwgCi0JCQkJCWJpbmRpbmcucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCisJCWlmICh0aGlzLnJlc29sdmVkVHlwZSA9PSBudWxsIHx8IAorCQkJCSEodGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSB8fCAKKwkJCQkJdGhpcy5yZXNvbHZlZFR5cGUucHJvYmxlbUlkKCkgPT0gUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSkpCiAJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoKTsKIAllbHNlCi0JCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQoYmluZGluZyk7CisJCXRocm93IG5ldyBTZWxlY3Rpb25Ob2RlRm91bmQodGhpcy5yZXNvbHZlZFR5cGUpOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvbk9uU3VwZXJSZWZlcmVuY2UuamF2YQppbmRleCA2ZGJlMTM1Li4zN2NiM2QxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25PblN1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uT25TdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0OwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YQppbmRleCAxYjMxYjUyLi4zYjZhYmJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25QYXJzZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdDsKIAogLyoKQEAgLTIzLDEzICsyMywxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuaW1wbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uUGFyc2VyIGV4dGVuZHMgQXNzaXN0UGFyc2VyIHsKIApAQCAtMTQzLDEyICsxNDMsMjcgQEAKIAkJc3VwZXIuY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGFsd2F5c1F1YWxpZmllZCk7CiAJfQogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aG91dEluaXRpYWxpemVyKCkgeworCS8vIEFycmF5Q3JlYXRpb25XaXRob3V0QXJyYXlJbml0aWFsaXplciA6Oj0gJ25ldycgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMKKwkvLyBBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycwogCi1wcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKSB7Ci0JLy8gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzIEFycmF5SW5pdGlhbGl6ZXJvcHQKLQkvLyBBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NPckludGVyZmFjZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzIEFycmF5SW5pdGlhbGl6ZXJvcHQKKwlzdXBlci5jb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRob3V0SW5pdGlhbGl6ZXIoKTsKIAotCXN1cGVyLmNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOworCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYWxsb2MgPSAoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbilleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl07CisJaWYgKGFsbG9jLnR5cGUgPT0gYXNzaXN0Tm9kZSl7CisJCWlmICghZGlldCl7CisJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQkJdGhpcy5sYXN0SWdub3JlZFRva2VuID0gLTE7CQorCQl9CisJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7CisJfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRoSW5pdGlhbGl6ZXIoKSB7CisJLy8gQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyCisJLy8gQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcgorCisJc3VwZXIuY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aEluaXRpYWxpemVyKCk7CiAKIAlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFsbG9jID0gKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdOwogCWlmIChhbGxvYy50eXBlID09IGFzc2lzdE5vZGUpewpAQCAtMTcxLDcgKzE4Niw3IEBACiAJCW5ldyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7IAogCWFsbG9jID0gCiAJCWFub255bW91c1R5cGUuYWxsb2NhdGlvbiA9IG5ldyBTZWxlY3Rpb25PblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uKGFub255bW91c1R5cGUpOyAKLQltYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKTsKKwltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOwogCXB1c2hPbkFzdFN0YWNrKGFub255bW91c1R5cGUpOwogCiAJYWxsb2Muc291cmNlRW5kID0gclBhcmVuUG9zOyAvL3RoZSBwb3NpdGlvbiBoYXMgYmVlbiBzdG9yZWQgZXhwbGljaXRseQpAQCAtMjAxLDE2ICsyMTYsMTggQEAKIAl0aGlzLmxhc3RDaGVja1BvaW50ID0gYWxsb2Muc291cmNlRW5kICsgMTsKIAlpZiAoIWRpZXQpewogCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQotCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCisJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOworCQljdXJyZW50VG9rZW4gPSAwOyAvLyBvcGVuaW5nIGJyYWNlIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50CisJCWhhc1JlcG9ydGVkRXJyb3IgPSB0cnVlOwogCX0KLQl0aGlzLmlzT3JwaGFuQ29tcGxldGlvbk5vZGUgPSB0cnVlOwotCQkKLQlhbm9ueW1vdXNUeXBlLmJvZHlTdGFydCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwkKKworCWFub255bW91c1R5cGUuYm9keVN0YXJ0ID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CiAJbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcwogCS8vIHJlY292ZXJ5Ci0JaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKKwlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCl7CiAJCWxhc3RDaGVja1BvaW50ID0gYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQ7Ci0JCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOyAvLyB0aGUgcmVjb3ZlcnlUb2tlbkNoZWNrIHdpbGwgZGVhbCB3aXRoIHRoZSBvcGVuIGJyYWNlCisJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQuYWRkKGFub255bW91c1R5cGUsIDApOworCQljdXJyZW50VG9rZW4gPSAwOyAvLyBvcGVuaW5nIGJyYWNlIGFscmVhZHkgdGFrZW4gaW50byBhY2NvdW50CiAJCWxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCQogCX0KIH0KQEAgLTI3Nyw2ICsyOTQsMTQgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKSB7CiAJaWYgKHRoaXMuaW5kZXhPZkFzc2lzdElkZW50aWZpZXIoKSA8IDApIHsKIAkJc3VwZXIuY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpOworCQlpZigoIWRpZXQgfHwgZGlldEludCAhPSAwKSAmJiBhc3RQdHIgPiAtMSkgeworCQkJQXJndW1lbnQgYXJndW1lbnQgPSAoQXJndW1lbnQpIGFzdFN0YWNrW2FzdFB0cl07CisJCQlpZihhcmd1bWVudC50eXBlID09IGFzc2lzdE5vZGUpIHsKKwkJCQlpc09ycGhhbkNvbXBsZXRpb25Ob2RlID0gdHJ1ZTsKKwkJCQl0aGlzLnJlc3RhcnRSZWNvdmVyeQk9IHRydWU7CS8vIGZvcmNlIHRvIHJlc3RhcnQgaW4gcmVjb3ZlcnkgbW9kZQorCQkJCXRoaXMubGFzdElnbm9yZWRUb2tlbiA9IC0xOwkKKwkJCX0KKwkJfQogCX0gZWxzZSB7CiAKIAkJaWRlbnRpZmllckxlbmd0aFB0ci0tOwpAQCAtNTQ0LDcgKzU2OSw3IEBACiAJCQl0aGlzLmxhc3RJZ25vcmVkVG9rZW4gPSAtMTsJCQogCQl9CiAJCXRoaXMuaXNPcnBoYW5Db21wbGV0aW9uTm9kZSA9IHRydWU7Ci0JCXJldHVybiBuZXcgU2luZ2xlTmFtZVJlZmVyZW5jZShuZXcgY2hhclswXSwgMCk7IC8vIGR1bW15IHJlZmVyZW5jZQorCQlyZXR1cm4gbmV3IFNpbmdsZU5hbWVSZWZlcmVuY2UoQ2hhck9wZXJhdGlvbi5OT19DSEFSLCAwKTsgLy8gZHVtbXkgcmVmZXJlbmNlCiAJfQogCU5hbWVSZWZlcmVuY2UgbmFtZVJlZmVyZW5jZTsKIAkvKiByZXRyaWV2ZSBpZGVudGlmaWVycyBzdWJzZXQgYW5kIHdob2xlIHBvc2l0aW9ucywgdGhlIGNvbXBsZXRpb24gbm9kZSBwb3NpdGlvbnMKQEAgLTY3Nyw2ICs3MDIsMTIgQEAKIAl0aGlzLnNlbGVjdGlvbklkZW50aWZpZXJDaGVjaygpOwogCXRoaXMuYXR0YWNoT3JwaGFuQ29tcGxldGlvbk5vZGUoKTsKIAkKKwkvLyBpZiBhbiBhc3Npc3Qgbm9kZSBoYXMgYmVlbiBmb3VuZCBhbmQgYSByZWNvdmVyZWQgZWxlbWVudCBleGlzdHMsCisJLy8gbWFyayBlbmNsb3NpbmcgYmxvY2tzIGFzIHRvIGJlIHByZXNlcnZlZAorCWlmICh0aGlzLmFzc2lzdE5vZGUgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsKKwkJY3VycmVudEVsZW1lbnQucHJlc2VydmVFbmNsb3NpbmdCbG9ja3MoKTsKKwl9CisJCiAJLyogY2hlY2sgYW5kIHVwZGF0ZSByZWNvdmVyZWQgc3RhdGUgYmFzZWQgb24gY3VycmVudCB0b2tlbiwKIAkJdGhpcyBhY3Rpb24gaXMgYWxzbyBwZXJmb3JtZWQgd2hlbiBzaGlmdGluZyB0b2tlbiBhZnRlciByZWNvdmVyeQogCQlnb3QgYWN0aXZhdGVkIG9uY2UuIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29kZWFzc2lzdC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29kZWFzc2lzdC9zZWxlY3QvU2VsZWN0aW9uU2Nhbm5lci5qYXZhCmluZGV4IDczN2Y4N2UuLmFhYjlhZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvZGVhc3Npc3Qvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvZGVhc3Npc3Qvc2VsZWN0L1NlbGVjdGlvblNjYW5uZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb2RlYXNzaXN0L29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb2RlYXNzaXN0L3NlbGVjdC9TZWxlY3Rpb25TY2FubmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3Q7CiAKIC8qCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KICAKIHB1YmxpYyBTZWxlY3Rpb25TY2FubmVyKGJvb2xlYW4gYXNzZXJ0TW9kZSkgewotCXN1cGVyKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGFzc2VydE1vZGUpOworCXN1cGVyKGZhbHNlIC8qY29tbWVudCovLCBmYWxzZSAvKndoaXRlc3BhY2UqLywgZmFsc2UgLypubHMqLywgYXNzZXJ0TW9kZSAvKmFzc2VydCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CiB9CiAKIHB1YmxpYyBjaGFyW10gZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9DaGFyT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9DaGFyT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1ZjM4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0NoYXJPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDI1NzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBjaGFyIGFycmF5cy4KKyAqIAorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2hhck9wZXJhdGlvbiB7CisKKwkvKioKKwkgKiBDb25zdGFudCBmb3IgYW4gZW1wdHkgY2hhciBhcnJheQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIE5PX0NIQVIgPSBuZXcgY2hhclswXTsKKworCS8qKgorCSAqIENvbnN0YW50IGZvciBhbiBlbXB0eSBjaGFyIGFycmF5IHdpdGggdHdvIGRpbWVuc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBOT19DSEFSX0NIQVIgPSBuZXcgY2hhclswXVtdOworCQorCS8qKgorCSAqIEFuc3dlcnMgYSBuZXcgYXJyYXkgd2l0aCBhcHBlbmRpbmcgdGhlIHN1ZmZpeCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZTo8YnI+CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0geyAnYScsICdiJyB9CisJICogICAgc3VmZml4ID0gJ2MnCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICdiJyAsICdjJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IG51bGwKKwkgKiAgICBzdWZmaXggPSAnYycKKwkgKiAgICA9PiByZXN1bHQgPSB7ICdjJyB9CisJICogPC9wcmU+PC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdGhhdCBpcyBjb25jYW5hdGVkIHdpdGggdGhlIHN1ZmZpeCBjaGFyYWN0ZXIKKwkgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgbmV3IGFycmF5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gYXBwZW5kKGNoYXJbXSBhcnJheSwgY2hhciBzdWZmaXgpIHsKKwkJaWYgKGFycmF5ID09IG51bGwpCisJCQlyZXR1cm4gbmV3IGNoYXJbXSB7IHN1ZmZpeCB9OworCQlpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBhcnJheSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdLCAwLCBsZW5ndGgpOworCQlhcnJheVtsZW5ndGhdID0gc3VmZml4OworCQlyZXR1cm4gYXJyYXk7CisJfQorCS8qKgorCSAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3ViYXJyYXkgdG8gdGhlIHRhcmdldCBhcnJheSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHRhcmdldCBhcnJheS4KKwkgKiBUaGUgc3RhcnQgb2YgdGhlIHN1YmFycmF5IGlzIGluY2x1c2l2ZSwgdGhlIGVuZCBpcyBleGNsdXNpdmUuCisJICogQW5zd2VycyBhIG5ldyB0YXJnZXQgYXJyYXkgaWYgaXQgbmVlZHMgdG8gZ3Jvdywgb3RoZXJ3aXNlIGFuc3dlcnMgdGhlIHNhbWUgdGFyZ2V0IGFycmF5LgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZTo8YnI+CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRhcmdldCA9IHsgJ2EnLCAnYicsICcwJyB9CisJICogICAgaW5kZXggPSAyCisJICogICAgYXJyYXkgPSB7ICdjJywgJ2QnIH0KKwkgKiAgICBzdGFydCA9IDAKKwkgKiAgICBlbmQgPSAxCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICdiJyAsICdjJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0YXJnZXQgPSB7ICdhJywgJ2InIH0KKwkgKiAgICBpbmRleCA9IDIKKwkgKiAgICBhcnJheSA9IHsgJ2MnLCAnZCcgfQorCSAqICAgIHN0YXJ0ID0gMAorCSAqICAgIGVuZCA9IDEKKwkgKiAgICA9PiByZXN1bHQgPSB7ICdhJywgJ2InICwgJ2MnLCAnMCcsICcwJyAsICcwJyB9IChuZXcgYXJyYXkpCisJICogPC9wcmU+PC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0YXJnZXQgPSB7ICdhJywgJ2InLCAnYycgfQorCSAqICAgIGluZGV4ID0gMQorCSAqICAgIGFycmF5ID0geyAnYycsICdkJywgJ2UnLCAnZicgfQorCSAqICAgIHN0YXJ0ID0gMQorCSAqICAgIGVuZCA9IDQKKwkgKiAgICA9PiByZXN1bHQgPSB7ICdhJywgJ2QnICwgJ2UnLCAnZicsICcwJywgJzAnLCAnMCcsICcwJyB9IChuZXcgYXJyYXkpCisJICogPC9wcmU+PC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIGdpdmVuIHRhcmdldAorCSAqIEBwYXJhbSBpbmRleCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydCBpbmRleAorCSAqIEBwYXJhbSBlbmQgdGhlIGdpdmVuIGVuZCBpbmRleAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5ldyBhcnJheQorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBhcnJheSBpcyBudWxsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gYXBwZW5kKGNoYXJbXSB0YXJnZXQsIGludCBpbmRleCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaW50IHRhcmdldExlbmd0aCA9IHRhcmdldC5sZW5ndGg7CisJCWludCBzdWJMZW5ndGggPSBlbmQtc3RhcnQ7CisJCWludCBuZXdUYXJnZXRMZW5ndGggPSBzdWJMZW5ndGgraW5kZXg7CisJCWlmIChuZXdUYXJnZXRMZW5ndGggPiB0YXJnZXRMZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGFyZ2V0LCAwLCB0YXJnZXQgPSBuZXcgY2hhcltuZXdUYXJnZXRMZW5ndGgqMl0sIDAsIGluZGV4KTsKKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgdGFyZ2V0LCBpbmRleCwgc3ViTGVuZ3RoKTsKKwkJcmV0dXJuIHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzLiBJdCBhbnN3ZXJzIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCisJICogSWYgdGhlIGZpcnN0IGFycmF5IGlzIG51bGwsIHRoZW4gdGhlIHNlY29uZCBhcnJheSBpcyByZXR1cm5lZC4KKwkgKiBJZiB0aGUgc2Vjb25kIGFycmF5IGlzIG51bGwsIHRoZW4gdGhlIGZpcnN0IGFycmF5IGlzIHJldHVybmVkLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0gbnVsbAorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICA9PiByZXN1bHQgPSBudWxsCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgeyAnIGEnIH0gfQorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICA9PiByZXN1bHQgPSB7IHsgJyBhJyB9IH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0gbnVsbAorCSAqICAgIHNlY29uZCA9IHsgeyAnIGEnIH0gfQorCSAqICAgID0+IHJlc3VsdCA9IHsgeyAnIGEnIH0gfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7IHsgJyBiJyB9IH0KKwkgKiAgICBzZWNvbmQgPSB7IHsgJyBhJyB9IH0KKwkgKiAgICA9PiByZXN1bHQgPSB7IHsgJyBiJyB9LCB7ICcgYScgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzLCBvciBudWxsIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gYXJyYXlDb25jYXQoY2hhcltdW10gZmlyc3QsIGNoYXJbXVtdIHNlY29uZCkgeworCQlpZiAoZmlyc3QgPT0gbnVsbCkKKwkJCXJldHVybiBzZWNvbmQ7CisJCWlmIChzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBmaXJzdDsKKworCQlpbnQgbGVuZ3RoMSA9IGZpcnN0Lmxlbmd0aDsKKwkJaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOworCQljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGgxICsgbGVuZ3RoMl1bXTsKKwkJU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKKwkJU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQW5zd2VycyBhIG5ldyBhcnJheSBhZGRpbmcgdGhlIHNlY29uZCBhcnJheSBhdCB0aGUgZW5kIG9mIGZpcnN0IGFycmF5LgorCSAqIEl0IGFuc3dlcnMgbnVsbCBpZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmUgbnVsbC4KKwkgKiBJZiB0aGUgZmlyc3QgYXJyYXkgaXMgbnVsbCwgdGhlbiBhIG5ldyBhcnJheSBjaGFyW11bXSBpcyBjcmVhdGVkIHdpdGggc2Vjb25kLgorCSAqIElmIHRoZSBzZWNvbmQgYXJyYXkgaXMgbnVsbCwgdGhlbiB0aGUgZmlyc3QgYXJyYXkgaXMgcmV0dXJuZWQuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSBudWxsCisJICogICAgc2Vjb25kID0geyAnYScgfQorCSAqICAgID0+IHJlc3VsdCA9IHsgeyAnIGEnIH0gfQorCSAqIDwvcHJlPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyB7ICcgYScgfSB9CisJICogICAgc2Vjb25kID0gbnVsbAorCSAqICAgID0+IHJlc3VsdCA9IHsgeyAnIGEnIH0gfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7IHsgJyBhJyB9IH0KKwkgKiAgICBzZWNvbmQgPSB7ICcgYicgfQorCSAqICAgID0+IHJlc3VsdCA9IHsgeyAnIGEnIH0gLCB7ICcgYicgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcGFyYW0gc2Vjb25kIHRoZSBhcnJheSB0byBhZGQgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgYXJyYXkKKwkgKiBAcmV0dXJuIGEgbmV3IGFycmF5IGFkZGluZyB0aGUgc2Vjb25kIGFycmF5IGF0IHRoZSBlbmQgb2YgZmlyc3QgYXJyYXksIG9yIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBhcnJheUNvbmNhdChjaGFyW11bXSBmaXJzdCwgY2hhcltdIHNlY29uZCkgeworCQlpZiAoc2Vjb25kID09IG51bGwpCisJCQlyZXR1cm4gZmlyc3Q7CisJCWlmIChmaXJzdCA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBjaGFyW11bXSB7IHNlY29uZCB9OworCisJCWludCBsZW5ndGggPSBmaXJzdC5sZW5ndGg7CisJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aCArIDFdW107CisJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKKwkJcmVzdWx0W2xlbmd0aF0gPSBzZWNvbmQ7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdGhlIHR3byBhcnJheXMgYXJyYXkgYW5kIHByZWZpeCBhbmQgYW5zd2VyczoKKwkgKiA8dWw+CisJICogPGxpPnplcm8gaWYgdGhlIGFycmF5IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXggY29udGVudHM8L2xpPgorCSAqIDxsaT50aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgZXF1YWwgPC9saT4KKwkgKiA8bGk+b25lIGlmIGFycmF5IGxlbmd0aCBpcyBsb3dlciB0aGFuIHRoZSBwcmVmaXggbGVuZ3RoIGFuZCB0aGF0IHRoZSBwcmVmaXggc3RhcnRzIHdpdGggdGhlIAorCSAqIGFycmF5IGNvbnRlbnRzLjwvbGk+CisJICogPC91bD4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0gbnVsbAorCSAqICAgIHByZWZpeCA9IG51bGwKKwkgKiAgICA9PiByZXN1bHQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbgorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnIH0KKwkgKiAgICBwcmVmaXggPSB7ICdhJywgJ2InLCAnYyd9CisJICogICAgPT4gcmVzdWx0ID0gMAorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnIH0KKwkgKiAgICBwcmVmaXggPSB7ICdhJywgJ0InLCAnYyd9CisJICogICAgPT4gcmVzdWx0ID0gMzIKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0geyAnZCcsICdiJywgJ2MnLCAnZCcsICdlJyB9CisJICogICAgcHJlZml4ID0geyAnYScsICdiJywgJ2MnfQorCSAqICAgID0+IHJlc3VsdCA9IDMKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJyB9CisJICogICAgcHJlZml4ID0geyAnZCcsICdiJywgJ2MnfQorCSAqICAgID0+IHJlc3VsdCA9IC0zCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgJ2EnLCAnYScsICdjJywgJ2QnLCAnZScgfQorCSAqICAgIHByZWZpeCA9IHsgJ2EnLCAnZScsICdjJ30KKwkgKiAgICA9PiByZXN1bHQgPSAtNAorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHByZWZpeCB0aGUgZ2l2ZW4gcHJlZml4CisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgYXJyYXkgb3IgcHJlZml4IGlzIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wYXJlV2l0aChjaGFyW10gYXJyYXksIGNoYXJbXSBwcmVmaXgpIHsKKwkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCQlpbnQgcHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDsKKwkJaW50IG1pbiA9IE1hdGgubWluKGFycmF5TGVuZ3RoLCBwcmVmaXhMZW5ndGgpOworCQlpbnQgaSA9IDA7CisJCXdoaWxlIChtaW4tLSAhPSAwKSB7CisJCQljaGFyIGMxID0gYXJyYXlbaV07CisJCQljaGFyIGMyID0gcHJlZml4W2krK107CisJCQlpZiAoYzEgIT0gYzIpCisJCQkJcmV0dXJuIGMxIC0gYzI7CisJCX0KKwkJaWYgKHByZWZpeExlbmd0aCA9PSBpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxOwkKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzLiBJdCBhbnN3ZXJzIG51bGwgaWYgdGhlIHR3byBhcnJheXMgYXJlIG51bGwuCisJICogSWYgdGhlIGZpcnN0IGFycmF5IGlzIG51bGwsIHRoZW4gdGhlIHNlY29uZCBhcnJheSBpcyByZXR1cm5lZC4KKwkgKiBJZiB0aGUgc2Vjb25kIGFycmF5IGlzIG51bGwsIHRoZW4gdGhlIGZpcnN0IGFycmF5IGlzIHJldHVybmVkLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0gbnVsbAorCSAqICAgIHNlY29uZCA9IHsgJ2EnIH0KKwkgKiAgICA9PiByZXN1bHQgPSB7ICcgYScgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICcgYScgfQorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICA9PiByZXN1bHQgPSB7ICcgYScgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICcgYScgfQorCSAqICAgIHNlY29uZCA9IHsgJyBiJyB9CisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnICwgJyBiJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzLCBvciBudWxsIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQpIHsKKwkJaWYgKGZpcnN0ID09IG51bGwpCisJCQlyZXR1cm4gc2Vjb25kOworCQlpZiAoc2Vjb25kID09IG51bGwpCisJCQlyZXR1cm4gZmlyc3Q7CisKKwkJaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7CisJCWludCBsZW5ndGgyID0gc2Vjb25kLmxlbmd0aDsKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aDEgKyBsZW5ndGgyXTsKKwkJU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKKwkJU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGhyZWUgYXJyYXlzLiBJdCBhbnN3ZXJzIG51bGwgaWYgdGhlIHRocmVlIGFycmF5cyBhcmUgbnVsbC4KKwkgKiBJZiBmaXJzdCBpcyBudWxsLCBpdCBhbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHNlY29uZCBhbmQgdGhpcmQuCisJICogSWYgc2Vjb25kIGlzIG51bGwsIGl0IGFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgZmlyc3QgYW5kIHRoaXJkLgorCSAqIElmIHRoaXJkIGlzIG51bGwsIGl0IGFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgZmlyc3QgYW5kIHNlY29uZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSB7ICdhJyB9CisJICogICAgdGhpcmQgPSB7ICdiJyB9CisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnLCAnYicgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICdhJyB9CisJICogICAgc2Vjb25kID0gbnVsbAorCSAqICAgIHRoaXJkID0geyAnYicgfQorCSAqICAgID0+IHJlc3VsdCA9IHsgJyBhJywgJ2InIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnYScgfQorCSAqICAgIHNlY29uZCA9IHsgJ2InIH0KKwkgKiAgICB0aGlyZCA9IG51bGwKKwkgKiAgICA9PiByZXN1bHQgPSB7ICcgYScsICdiJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgdGhpcmQgPSBudWxsCisJICogICAgPT4gcmVzdWx0ID0gbnVsbAorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICdhJyB9CisJICogICAgc2Vjb25kID0geyAnYicgfQorCSAqICAgIHRoaXJkID0geyAnYycgfQorCSAqICAgID0+IHJlc3VsdCA9IHsgJ2EnLCAnYicsICdjJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBmaXJzdCB0aGUgZmlyc3QgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgYXJyYXkgdG8gY29uY2F0ZW5hdGUKKwkgKiBAcGFyYW0gdGhpcmQgdGhlIHRoaXJkIGFycmF5IHRvIGNvbmNhdGVuYXRlCisJICogCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGhyZWUgYXJyYXlzLCBvciBudWxsIGlmIHRoZSB0aHJlZSBhcnJheXMgYXJlIG51bGwuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KAorCQljaGFyW10gZmlyc3QsCisJCWNoYXJbXSBzZWNvbmQsCisJCWNoYXJbXSB0aGlyZCkgeworCQlpZiAoZmlyc3QgPT0gbnVsbCkKKwkJCXJldHVybiBjb25jYXQoc2Vjb25kLCB0aGlyZCk7CisJCWlmIChzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBjb25jYXQoZmlyc3QsIHRoaXJkKTsKKwkJaWYgKHRoaXJkID09IG51bGwpCisJCQlyZXR1cm4gY29uY2F0KGZpcnN0LCBzZWNvbmQpOworCisJCWludCBsZW5ndGgxID0gZmlyc3QubGVuZ3RoOworCQlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJCWludCBsZW5ndGgzID0gdGhpcmQubGVuZ3RoOworCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzXTsKKwkJU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKKwkJU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSwgbGVuZ3RoMik7CisJCVN5c3RlbS5hcnJheWNvcHkodGhpcmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSArIGxlbmd0aDIsIGxlbmd0aDMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHR3byBhcnJheXMgaW5zZXJ0aW5nIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIGJldHdlZW4gdGhlIHR3byBhcnJheXMuCisJICogSXQgYW5zd2VycyBudWxsIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBudWxsLgorCSAqIElmIHRoZSBmaXJzdCBhcnJheSBpcyBudWxsLCB0aGVuIHRoZSBzZWNvbmQgYXJyYXkgaXMgcmV0dXJuZWQuCisJICogSWYgdGhlIHNlY29uZCBhcnJheSBpcyBudWxsLCB0aGVuIHRoZSBmaXJzdCBhcnJheSBpcyByZXR1cm5lZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSB7ICdhJyB9CisJICogICAgc2VwYXJhdG9yID0gJy8nCisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnIGEnIH0KKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgc2VwYXJhdG9yID0gJy8nCisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnIGEnIH0KKwkgKiAgICBzZWNvbmQgPSB7ICcgYicgfQorCSAqICAgIHNlcGFyYXRvciA9ICcvJworCSAqICAgID0+IHJlc3VsdCA9IHsgJyBhJyAsICcvJywgJ2InIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheSB0byBjb25jYXRlbmF0ZQorCSAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheSB0byBjb25jYXRlbmF0ZQorCSAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGNoYXJhY3RlciB0byBpbnNlcnQKKwkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzIGluc2VydGluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciAKKwkgKiBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzICwgb3IgbnVsbCBpZiB0aGUgdHdvIGFycmF5cyBhcmUgbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBjb25jYXQoCisJCWNoYXJbXSBmaXJzdCwKKwkJY2hhcltdIHNlY29uZCwKKwkJY2hhciBzZXBhcmF0b3IpIHsKKwkJaWYgKGZpcnN0ID09IG51bGwpCisJCQlyZXR1cm4gc2Vjb25kOworCQlpZiAoc2Vjb25kID09IG51bGwpCisJCQlyZXR1cm4gZmlyc3Q7CisKKwkJaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7CisJCWlmIChsZW5ndGgxID09IDApCisJCQlyZXR1cm4gc2Vjb25kOworCQlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJCWlmIChsZW5ndGgyID09IDApCisJCQlyZXR1cm4gZmlyc3Q7CisKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aDEgKyBsZW5ndGgyICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7CisJCXJlc3VsdFtsZW5ndGgxXSA9IHNlcGFyYXRvcjsKKwkJU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSArIDEsIGxlbmd0aDIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHRocmVlIGFycmF5cyBpbnNlcnRpbmcgdGhlIHNlcDEgY2hhcmFjdGVyIGJldHdlZW4gdGhlIAorCSAqIHR3byBhcnJheXMgYW5kIHNlcDIgYmV0d2VlbiB0aGUgbGFzdCB0d28uCisJICogSXQgYW5zd2VycyBudWxsIGlmIHRoZSB0aHJlZSBhcnJheXMgYXJlIG51bGwuCisJICogSWYgdGhlIGZpcnN0IGFycmF5IGlzIG51bGwsIHRoZW4gaXQgYW5zd2VycyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBzZWNvbmQgYW5kIHRoaXJkIGluc2VydGluZworCSAqIHRoZSBzZXAyIGNoYXJhY3RlciBiZXR3ZWVuIHRoZW0uCisJICogSWYgdGhlIHNlY29uZCBhcnJheSBpcyBudWxsLCB0aGVuIHRoZSBmaXJzdCBhcnJheSBpcyByZXR1cm5lZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSB7ICdhJyB9CisJICogICAgc2VwYXJhdG9yID0gJy8nCisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnIGEnIH0KKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgc2VwYXJhdG9yID0gJy8nCisJICogICAgPT4gcmVzdWx0ID0geyAnIGEnIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnIGEnIH0KKwkgKiAgICBzZWNvbmQgPSB7ICcgYicgfQorCSAqICAgIHNlcGFyYXRvciA9ICcvJworCSAqICAgID0+IHJlc3VsdCA9IHsgJyBhJyAsICcvJywgJ2InIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheSB0byBjb25jYXRlbmF0ZQorCSAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheSB0byBjb25jYXRlbmF0ZQorCSAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGNoYXJhY3RlciB0byBpbnNlcnQKKwkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB0d28gYXJyYXlzIGluc2VydGluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciAKKwkgKiBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzICwgb3IgbnVsbCBpZiB0aGUgdHdvIGFycmF5cyBhcmUgbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBjb25jYXQoCisJCWNoYXJbXSBmaXJzdCwKKwkJY2hhciBzZXAxLAorCQljaGFyW10gc2Vjb25kLAorCQljaGFyIHNlcDIsCisJCWNoYXJbXSB0aGlyZCkgeworCQlpZiAoZmlyc3QgPT0gbnVsbCkKKwkJCXJldHVybiBjb25jYXQoc2Vjb25kLCB0aGlyZCwgc2VwMik7CisJCWlmIChzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBjb25jYXQoZmlyc3QsIHRoaXJkLCBzZXAxKTsKKwkJaWYgKHRoaXJkID09IG51bGwpCisJCQlyZXR1cm4gY29uY2F0KGZpcnN0LCBzZWNvbmQsIHNlcDEpOworCisJCWludCBsZW5ndGgxID0gZmlyc3QubGVuZ3RoOworCQlpbnQgbGVuZ3RoMiA9IHNlY29uZC5sZW5ndGg7CisJCWludCBsZW5ndGgzID0gdGhpcmQubGVuZ3RoOworCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsgMl07CisJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7CisJCXJlc3VsdFtsZW5ndGgxXSA9IHNlcDE7CisJCVN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLCAwLCByZXN1bHQsIGxlbmd0aDEgKyAxLCBsZW5ndGgyKTsKKwkJcmVzdWx0W2xlbmd0aDEgKyBsZW5ndGgyICsgMV0gPSBzZXAyOworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXJkLCAwLCByZXN1bHQsIGxlbmd0aDEgKyBsZW5ndGgyICsgMiwgbGVuZ3RoMyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQW5zd2VycyBhIG5ldyBhcnJheSB3aXRoIHByZXBlbmRpbmcgdGhlIHByZWZpeCBjaGFyYWN0ZXIgYW5kIGFwcGVuZGluZyB0aGUgc3VmZml4IAorCSAqIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4gSWYgYXJyYXkgaXMgbnVsbCwgaXQgYW5zd2VycyBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSAKKwkgKiBwcmVmaXggYW5kIHRoZSBzdWZmaXggY2hhcmFjdGVycy4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOjxicj4KKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgcHJlZml4ID0gJ2EnCisJICogICAgYXJyYXkgPSB7ICdiJyB9CisJICogICAgc3VmZml4ID0gJ2MnCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICdiJyAsICdjJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBwcmVmaXggPSAnYScKKwkgKiAgICBhcnJheSA9IG51bGwKKwkgKiAgICBzdWZmaXggPSAnYycKKwkgKiAgICA9PiByZXN1bHQgPSB7ICdhJywgJ2MnIH0KKwkgKiA8L3ByZT48L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IGNoYXJhY3RlcgorCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdGhhdCBpcyBjb25jYW5hdGVkIHdpdGggdGhlIHByZWZpeCBhbmQgc3VmZml4IGNoYXJhY3RlcnMKKwkgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggY2hhcmFjdGVyCisJICogQHJldHVybiB0aGUgbmV3IGFycmF5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0KGNoYXIgcHJlZml4LCBjaGFyW10gYXJyYXksIGNoYXIgc3VmZml4KSB7CisJCWlmIChhcnJheSA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBjaGFyW10geyBwcmVmaXgsIHN1ZmZpeCB9OworCisJCWludCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CisJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggKyAyXTsKKwkJcmVzdWx0WzBdID0gcHJlZml4OworCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDEsIGxlbmd0aCk7CisJCXJlc3VsdFtsZW5ndGggKyAxXSA9IHN1ZmZpeDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoqCisJICogQW5zd2VycyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2gKKwkgKiBwYXJ0IGFuZCBhcHBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGVuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOjxicj4KKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgbmFtZSA9IHsgJ2MnIH0KKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogICAgc2VwYXJhdG9yID0gJy4nCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICcuJywgJ2InICwgJy4nLCAnYycgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgbmFtZSA9IG51bGwKKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogICAgc2VwYXJhdG9yID0gJy4nCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICcuJywgJ2InIH0KKwkgKiA8L3ByZT48L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIG5hbWUgPSB7ICcgYycgfQorCSAqICAgIGFycmF5ID0gbnVsbAorCSAqICAgIHNlcGFyYXRvciA9ICcuJworCSAqICAgID0+IHJlc3VsdCA9IHsgJ2MnIH0KKwkgKiA8L3ByZT48L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2gKKwkgKiBwYXJ0IGFuZCBhcHBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGVuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdFdpdGgoCisJCWNoYXJbXSBuYW1lLAorCQljaGFyW11bXSBhcnJheSwKKwkJY2hhciBzZXBhcmF0b3IpIHsKKwkJaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGg7CisJCWlmIChuYW1lTGVuZ3RoID09IDApCisJCQlyZXR1cm4gY29uY2F0V2l0aChhcnJheSwgc2VwYXJhdG9yKTsKKworCQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCXJldHVybiBuYW1lOworCisJCWludCBzaXplID0gbmFtZUxlbmd0aDsKKwkJaW50IGluZGV4ID0gbGVuZ3RoOworCQl3aGlsZSAoLS1pbmRleCA+PSAwKQorCQkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPiAwKQorCQkJCXNpemUgKz0gYXJyYXlbaW5kZXhdLmxlbmd0aCArIDE7CisJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzaXplXTsKKwkJaW5kZXggPSBzaXplOworCQlmb3IgKGludCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWludCBzdWJMZW5ndGggPSBhcnJheVtpXS5sZW5ndGg7CisJCQlpZiAoc3ViTGVuZ3RoID4gMCkgeworCQkJCWluZGV4IC09IHN1Ykxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5W2ldLCAwLCByZXN1bHQsIGluZGV4LCBzdWJMZW5ndGgpOworCQkJCXJlc3VsdFstLWluZGV4XSA9IHNlcGFyYXRvcjsKKwkJCX0KKwkJfQorCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWUsIDAsIHJlc3VsdCwgMCwgbmFtZUxlbmd0aCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2gKKwkgKiBwYXJ0IGFuZCBhcHBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGVuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOjxicj4KKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgbmFtZSA9IHsgJ2MnIH0KKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogICAgc2VwYXJhdG9yID0gJy4nCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICcuJywgJ2InICwgJy4nLCAnYycgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgbmFtZSA9IG51bGwKKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogICAgc2VwYXJhdG9yID0gJy4nCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICcuJywgJ2InIH0KKwkgKiA8L3ByZT48L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIG5hbWUgPSB7ICcgYycgfQorCSAqICAgIGFycmF5ID0gbnVsbAorCSAqICAgIHNlcGFyYXRvciA9ICcuJworCSAqICAgID0+IHJlc3VsdCA9IHsgJ2MnIH0KKwkgKiA8L3ByZT48L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2gKKwkgKiBwYXJ0IGFuZCBhcHBlbmRpbmcgdGhlIGdpdmVuIG5hbWUgYXQgdGhlIGVuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdFdpdGgoCisJCWNoYXJbXVtdIGFycmF5LAorCQljaGFyW10gbmFtZSwKKwkJY2hhciBzZXBhcmF0b3IpIHsKKwkJaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGg7CisJCWlmIChuYW1lTGVuZ3RoID09IDApCisJCQlyZXR1cm4gY29uY2F0V2l0aChhcnJheSwgc2VwYXJhdG9yKTsKKworCQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCXJldHVybiBuYW1lOworCisJCWludCBzaXplID0gbmFtZUxlbmd0aDsKKwkJaW50IGluZGV4ID0gbGVuZ3RoOworCQl3aGlsZSAoLS1pbmRleCA+PSAwKQorCQkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPiAwKQorCQkJCXNpemUgKz0gYXJyYXlbaW5kZXhdLmxlbmd0aCArIDE7CisJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzaXplXTsKKwkJaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpbnQgc3ViTGVuZ3RoID0gYXJyYXlbaV0ubGVuZ3RoOworCQkJaWYgKHN1Ykxlbmd0aCA+IDApIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5W2ldLCAwLCByZXN1bHQsIGluZGV4LCBzdWJMZW5ndGgpOworCQkJCWluZGV4ICs9IHN1Ykxlbmd0aDsKKwkJCQlyZXN1bHRbaW5kZXgrK10gPSBzZXBhcmF0b3I7CisJCQl9CisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCByZXN1bHQsIGluZGV4LCBuYW1lTGVuZ3RoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGJldHdlZW4gZWFjaCBwYXJ0LgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6PGJyPgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogICAgc2VwYXJhdG9yID0gJy4nCisJICogICAgPT4gcmVzdWx0ID0geyAnYScsICcuJywgJ2InIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0gbnVsbAorCSAqICAgIHNlcGFyYXRvciA9ICcuJworCSAqICAgID0+IHJlc3VsdCA9IHsgfQorCSAqIDwvcHJlPjwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHNlcGFyYXRvciB0aGUgZ2l2ZW4gc2VwYXJhdG9yCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIGVhY2ggcGFydAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdFdpdGgoY2hhcltdW10gYXJyYXksIGNoYXIgc2VwYXJhdG9yKSB7CisJCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKworCQlpbnQgc2l6ZSA9IGxlbmd0aCAtIDE7CisJCWludCBpbmRleCA9IGxlbmd0aDsKKwkJd2hpbGUgKC0taW5kZXggPj0gMCkgeworCQkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPT0gMCkKKwkJCQlzaXplLS07CisJCQllbHNlCisJCQkJc2l6ZSArPSBhcnJheVtpbmRleF0ubGVuZ3RoOworCQl9CisJCWlmIChzaXplIDw9IDApCisJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07CisJCWluZGV4ID0gbGVuZ3RoOworCQl3aGlsZSAoLS1pbmRleCA+PSAwKSB7CisJCQlsZW5ndGggPSBhcnJheVtpbmRleF0ubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlhcnJheVtpbmRleF0sCisJCQkJCTAsCisJCQkJCXJlc3VsdCwKKwkJCQkJKHNpemUgLT0gbGVuZ3RoKSwKKwkJCQkJbGVuZ3RoKTsKKwkJCQlpZiAoLS1zaXplID49IDApCisJCQkJCXJlc3VsdFtzaXplXSA9IHNlcGFyYXRvcjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFuIG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgY2hhcmFjdGVyID0gJ2MnCisJICogICAgYXJyYXkgPSB7IHsgJyBhJyB9LCB7ICcgYicgfSB9CisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBjaGFyYWN0ZXIgPSAnYScKKwkgKiAgICBhcnJheSA9IHsgeyAnIGEnIH0sIHsgJyBiJyB9IH0KKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gY2hhcmFjdGVyIHRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoCisJICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0aGUgc2VhcmNoIGlzIGRvbmUKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwuCisJICogCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBhcnJheSBjb250YWlucyBhbiBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb250YWlucyhjaGFyIGNoYXJhY3RlciwgY2hhcltdW10gYXJyYXkpIHsKKwkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KSB7CisJCQljaGFyW10gc3ViYXJyYXkgPSBhcnJheVtpXTsKKwkJCWZvciAoaW50IGogPSBzdWJhcnJheS5sZW5ndGg7IC0taiA+PSAwOykKKwkJCQlpZiAoc3ViYXJyYXlbal0gPT0gY2hhcmFjdGVyKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0cnVlIGlmIHRoZSBhcnJheSBjb250YWlucyBhbiBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLgorCSAqIAorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGNoYXJhY3RlciA9ICdjJworCSAqICAgIGFycmF5ID0geyAnIGInICB9CisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBjaGFyYWN0ZXIgPSAnYScKKwkgKiAgICBhcnJheSA9IHsgJyBhJyAsICcgYicgfQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBjaGFyYWN0ZXIgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IGluIHdoaWNoIHRoZSBzZWFyY2ggaXMgZG9uZQorCSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGFuIG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnRhaW5zKGNoYXIgY2hhcmFjdGVyLCBjaGFyW10gYXJyYXkpIHsKKwkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKGFycmF5W2ldID09IGNoYXJhY3RlcikKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXJzIGEgZGVlcCBjb3B5IG9mIHRoZSB0b0NvcHkgYXJyYXkuCisJICogCisJICogQHBhcmFtIHRvQ29weSB0aGUgYXJyYXkgdG8gY29weQorCSAqIEByZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhlIHRvQ29weSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIGRlZXBDb3B5KGNoYXJbXVtdIHRvQ29weSkgeworCQlpbnQgdG9Db3B5TGVuZ3RoID0gdG9Db3B5Lmxlbmd0aDsKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbdG9Db3B5TGVuZ3RoXVtdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQ29weUxlbmd0aDsgaSsrKSB7CisJCQljaGFyW10gdG9FbGVtZW50ID0gdG9Db3B5W2ldOworCQkJaW50IHRvRWxlbWVudExlbmd0aCA9IHRvRWxlbWVudC5sZW5ndGg7CisJCQljaGFyW10gcmVzdWx0RWxlbWVudCA9IG5ldyBjaGFyW3RvRWxlbWVudExlbmd0aF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRvRWxlbWVudCwgMCwgcmVzdWx0RWxlbWVudCwgMCwgdG9FbGVtZW50TGVuZ3RoKTsKKwkJCXJlc3VsdFtpXSA9IHJlc3VsdEVsZW1lbnQ7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiBhcnJheSBlbmRzIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRvQmVGb3VuZCwgCisJICogb3RoZXJ3aXNlIGZhbHNlLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGFycmF5ID0geyAnYScsICdiJywgJ2MnLCAnZCcgfQorCSAqICAgIHRvQmVGb3VuZCA9IHsgJ2InLCAnYycgfQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJywgJ2InLCAnYycgfQorCSAqICAgIHRvQmVGb3VuZCA9IHsgJ2InLCAnYycgfQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gY2hlY2sKKwkgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBhcnJheSB0byBmaW5kCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsIG9yIHRvQmVGb3VuZCBpcyBudWxsCisJICogQHJldHVybiB0cnVlIGlmIGFycmF5IGVuZHMgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBjb250YWluZWQgaW4gdG9CZUZvdW5kLCAKKwkgKiBvdGhlcndpc2UgZmFsc2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuZHNXaXRoKGNoYXJbXSBhcnJheSwgY2hhcltdIHRvQmVGb3VuZCkgeworCQlpbnQgaSA9IHRvQmVGb3VuZC5sZW5ndGg7CisJCWludCBqID0gYXJyYXkubGVuZ3RoIC0gaTsKKworCQlpZiAoaiA8IDApCisJCQlyZXR1cm4gZmFsc2U7CisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWlmICh0b0JlRm91bmRbaV0gIT0gYXJyYXlbaSArIGpdKQorCQkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlLgorCSAqIFRoZSBlcXVhbGl0eSBpcyBjYXNlIHNlbnNpdGl2ZS4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgcmVzdWx0ID0+IHRydWUKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyB7IH0gfQorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICByZXN1bHQgPT4gZmFsc2UKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyB7ICdhJyB9IH0KKwkgKiAgICBzZWNvbmQgPSB7IHsgJ2EnIH0gfQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgeyAnQScgfSB9CisJICogICAgc2Vjb25kID0geyB7ICdhJyB9IH0KKwkgKiAgICByZXN1bHQgPT4gZmFsc2UKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheQorCSAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBmYWxzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdW10gZmlyc3QsIGNoYXJbXVtdIHNlY29uZCkgeworCQlpZiAoZmlyc3QgPT0gc2Vjb25kKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJZm9yIChpbnQgaSA9IGZpcnN0Lmxlbmd0aDsgLS1pID49IDA7KQorCQkJaWYgKCFlcXVhbHMoZmlyc3RbaV0sIHNlY29uZFtpXSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBJZiBpc0Nhc2VTZW5zaXRlIGlzIHRydWUsIGFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlcgorCSAqIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlLgorCSAqIElmIGl0IGlzIGZhbHNlLCBhbnN3ZXJzIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbCBjaGFyYWN0ZXIgYnkgCisJICogY2hhcmFjdGVyIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGNhc2UsIG90aGVyd2lzZSBmYWxzZS4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgeyB9IH0KKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7IHsgJ0EnIH0gfQorCSAqICAgIHNlY29uZCA9IHsgeyAnYScgfSB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7IHsgJ0EnIH0gfQorCSAqICAgIHNlY29uZCA9IHsgeyAnYScgfSB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gZmFsc2UKKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5CisJICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIGFycmF5CisJICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgZXF1YWxpdHkgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlCisJICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCisJICogb2YgaXNDYXNlU2Vuc2l0aXZlLCBvdGhlcndpc2UgZmFsc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKAorCQljaGFyW11bXSBmaXJzdCwKKwkJY2hhcltdW10gc2Vjb25kLAorCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCXJldHVybiBlcXVhbHMoZmlyc3QsIHNlY29uZCk7CisJCX0KKwkJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICghZXF1YWxzKGZpcnN0W2ldLCBzZWNvbmRbaV0sIGZhbHNlKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIsIG90aGVyd2lzZSBmYWxzZS4KKwkgKiBUaGUgZXF1YWxpdHkgaXMgY2FzZSBzZW5zaXRpdmUuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSBudWxsCisJICogICAgc2Vjb25kID0gbnVsbAorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgfQorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICByZXN1bHQgPT4gZmFsc2UKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGZpcnN0ID0geyAnYScgfQorCSAqICAgIHNlY29uZCA9IHsgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICdhJyB9CisJICogICAgc2Vjb25kID0geyAnQScgfQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiBAcGFyYW0gZmlyc3QgdGhlIGZpcnN0IGFycmF5CisJICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIGFycmF5CisJICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQpIHsKKwkJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmIChmaXJzdFtpXSAhPSBzZWNvbmRbaV0pCisJCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBJZiBpc0Nhc2VTZW5zaXRlIGlzIHRydWUsIGFuc3dlcnMgdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlcgorCSAqIGJ5IGNoYXJhY3Rlciwgb3RoZXJ3aXNlIGZhbHNlLgorCSAqIElmIGl0IGlzIGZhbHNlLCBhbnN3ZXJzIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbCBjaGFyYWN0ZXIgYnkgCisJICogY2hhcmFjdGVyIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGNhc2UsIG90aGVyd2lzZSBmYWxzZS4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IG51bGwKKwkgKiAgICBzZWNvbmQgPSBudWxsCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgfQorCSAqICAgIHNlY29uZCA9IG51bGwKKwkgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlCisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmaXJzdCA9IHsgJ0EnIH0KKwkgKiAgICBzZWNvbmQgPSB7ICdhJyB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZmlyc3QgPSB7ICdBJyB9CisJICogICAgc2Vjb25kID0geyAnYScgfQorCSAqICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlCisJICogICAgcmVzdWx0ID0+IHRydWUKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBhcnJheQorCSAqIEBwYXJhbSBzZWNvbmQgdGhlIHNlY29uZCBhcnJheQorCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgY2hlY2sgd2hldGhlciBvciBub3QgdGhlIGVxdWFsaXR5IHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZQorCSAqIG9mIGlzQ2FzZVNlbnNpdGl2ZSwgb3RoZXJ3aXNlIGZhbHNlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscygKKwkJY2hhcltdIGZpcnN0LAorCQljaGFyW10gc2Vjb25kLAorCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCXJldHVybiBlcXVhbHMoZmlyc3QsIHNlY29uZCk7CisJCX0KKwkJaWYgKGZpcnN0ID09IHNlY29uZCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoZmlyc3RbaV0pCisJCQkJIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlY29uZFtpXSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogSWYgaXNDYXNlU2Vuc2l0ZSBpcyB0cnVlLCB0aGUgZXF1YWxpdHkgaXMgY2FzZSBzZW5zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBjYXNlIGluc2Vuc2l0aXZlLgorCSAqIAorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgbmFtZSBjb250YWlucyB0aGUgZnJhZ21lbnQgYXQgdGhlIHN0YXJ0aW5nIGluZGV4IHN0YXJ0SW5kZXgsIG90aGVyd2lzZSBmYWxzZS4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmcmFnbWVudCA9IHsgJ2InLCAnYycgLCAnZCcgfQorCSAqICAgIG5hbWUgPSB7ICdhJywgJ2InLCAnYycgLCAnZCcgfQorCSAqICAgIHN0YXJ0SW5kZXggPSAxCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmcmFnbWVudCA9IHsgJ2InLCAnYycgLCAnZCcgfQorCSAqICAgIG5hbWUgPSB7ICdhJywgJ2InLCAnQycgLCAnZCcgfQorCSAqICAgIHN0YXJ0SW5kZXggPSAxCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgZnJhZ21lbnQgPSB7ICdiJywgJ2MnICwgJ2QnIH0KKwkgKiAgICBuYW1lID0geyAnYScsICdiJywgJ0MnICwgJ2QnIH0KKwkgKiAgICBzdGFydEluZGV4ID0gMAorCSAqICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlCisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBmcmFnbWVudCA9IHsgJ2InLCAnYycgLCAnZCcgfQorCSAqICAgIG5hbWUgPSB7ICdhJywgJ2InfQorCSAqICAgIHN0YXJ0SW5kZXggPSAwCisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIGZyYWdtZW50IHRvIGNoZWNrCisJICogQHBhcmFtIHNlY29uZCB0aGUgYXJyYXkgdG8gY2hlY2sKKwkgKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgc3RhcnRpbmcgaW5kZXgKKwkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBlcXVhbGl0eSBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgY29udGFpbnMgdGhlIGZyYWdtZW50IGF0IHRoZSBzdGFydGluZyBpbmRleCBzdGFydEluZGV4IGFjY29yZGluZyB0byB0aGUgCisJICogdmFsdWUgb2YgaXNDYXNlU2Vuc2l0aXZlLCBvdGhlcndpc2UgZmFsc2UuCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBmcmFnbWVudCBvciBuYW1lIGlzIG51bGwuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGZyYWdtZW50RXF1YWxzKAorCQljaGFyW10gZnJhZ21lbnQsCisJCWNoYXJbXSBuYW1lLAorCQlpbnQgc3RhcnRJbmRleCwKKwkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCQlpbnQgbWF4ID0gZnJhZ21lbnQubGVuZ3RoOworCQlpZiAobmFtZS5sZW5ndGggPCBtYXggKyBzdGFydEluZGV4KQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoaXNDYXNlU2Vuc2l0aXZlKSB7CisJCQlmb3IgKGludCBpID0gbWF4OworCQkJCS0taSA+PSAwOworCQkJCSkgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQorCQkJCWlmIChmcmFnbWVudFtpXSAhPSBuYW1lW2kgKyBzdGFydEluZGV4XSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJZm9yIChpbnQgaSA9IG1heDsKKwkJCS0taSA+PSAwOworCQkJKSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCisJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGZyYWdtZW50W2ldKQorCQkJCSE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lW2kgKyBzdGFydEluZGV4XSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIGEgaGFzaGNvZGUgZm9yIHRoZSBhcnJheQorCSAqIAorCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgZm9yIHdoaWNoIGEgaGFzaGNvZGUgaXMgcmVxdWlyZWQKKwkgKiBAcmV0dXJuIHRoZSBoYXNoY29kZQorCSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGNoYXJbXSBhcnJheSkgeworCQlpbnQgaGFzaCA9IDA7CisJCWludCBvZmZzZXQgPSAwOworCQlpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOworCQlpZiAobGVuZ3RoIDwgMTYpIHsKKwkJCWZvciAoaW50IGkgPSBsZW5ndGg7IGkgPiAwOyBpLS0pCisJCQkJaGFzaCA9IChoYXNoICogMzcpICsgYXJyYXlbb2Zmc2V0KytdOworCQl9IGVsc2UgeworCQkJLy8gb25seSBzYW1wbGUgc29tZSBjaGFyYWN0ZXJzCisJCQlpbnQgc2tpcCA9IGxlbmd0aCAvIDg7CisJCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpID4gMDsgaSAtPSBza2lwLCBvZmZzZXQgKz0gc2tpcCkKKwkJCQloYXNoID0gKGhhc2ggKiAzOSkgKyBhcnJheVtvZmZzZXRdOworCQl9CisJCXJldHVybiBoYXNoICYgMHg3RkZGRkZGRjsKKwl9CisJLyoqCisJICogQW5zd2VycyB0cnVlIGlmIGMgaXMgYSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byB0aGUgSkxTICgmIzkyO3UwMDBhLCAmIzkyO3UwMDBjLCAmIzkyO3UwMDBkLCAmIzkyO3UwMDA5KSwgb3RoZXJ3aXNlIGZhbHNlLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGMgPSAnICcKKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYyA9ICcmIzkyO3UzMDAwJworCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gYyB0aGUgY2hhcmFjdGVyIHRvIGNoZWNrCisJICogQHJldHVybiB0cnVlIGlmIGMgaXMgYSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byB0aGUgSkxTLCBvdGhlcndpc2UgZmFsc2UuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKKwkJc3dpdGNoIChjKSB7CisJCQljYXNlIDEwIDogLyogXCB1MDAwYTogTElORSBGRUVEICAgICAgICAgICAgICAgKi8KKwkJCWNhc2UgMTIgOiAvKiBcIHUwMDBjOiBGT1JNIEZFRUQgICAgICAgICAgICAgICAqLworCQkJY2FzZSAxMyA6IC8qIFwgdTAwMGQ6IENBUlJJQUdFIFJFVFVSTiAgICAgICAgICovCisJCQljYXNlIDMyIDogLyogXCB1MDAyMDogU1BBQ0UgICAgICAgICAgICAgICAgICAgKi8KKwkJCWNhc2UgOSA6IC8qIFwgdTAwMDk6IEhPUklaT05UQUwgVEFCVUxBVElPTiAgICovCisJCQkJcmV0dXJuIHRydWU7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJLyoqCisJICogQW5zd2VycyB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIGFycmF5IGZvciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaXMKKwkgKiBlcXVhbCB0byB0b0JlRm91bmQuIEFuc3dlcnMgLTEgaWYgbm8gb2NjdXJyZW5jZSBvZiB0aGlzIGNoYXJhY3RlciBpcyBmb3VuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyB9CisJICogICAgcmVzdWx0ID0+IDIKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRvQmVGb3VuZCA9ICdlJworCSAqICAgIGFycmF5ID0geyAnIGEnLCAnYicsICdjJywgJ2QnIH0KKwkgKiAgICByZXN1bHQgPT4gLTEKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIHRvQmVGb3VuZCB0aGUgY2hhcmFjdGVyIHRvIHNlYXJjaAorCSAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdG8gYmUgc2VhcmNoZWQKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpcworCSAqIGVxdWFsIHRvIHRvQmVGb3VuZCwgLTEgb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKQorCQkJCXJldHVybiBpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIGFycmF5IGZvciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaXMKKwkgKiBlcXVhbCB0byB0b0JlRm91bmQgc3RhcnRpbmcgdGhlIHNlYXJjaCBhdCBpbmRleCBzdGFydC4KKwkgKiBBbnN3ZXJzIC0xIGlmIG5vIG9jY3VycmVuY2Ugb2YgdGhpcyBjaGFyYWN0ZXIgaXMgZm91bmQuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2MnCisJICogICAgYXJyYXkgPSB7ICcgYScsICdiJywgJ2MnLCAnZCcgfQorCSAqICAgIHN0YXJ0ID0gMgorCSAqICAgIHJlc3VsdCA9PiAyCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyB9CisJICogICAgc3RhcnQgPSAzCisJICogICAgcmVzdWx0ID0+IC0xCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnZScKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyB9CisJICogICAgc3RhcnQgPSAxCisJICogICAgcmVzdWx0ID0+IC0xCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkCisJICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IGluZGV4IGluIHRoZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGlzCisJICogZXF1YWwgdG8gdG9CZUZvdW5kLCAtMSBvdGhlcndpc2UKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKKwkgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAgc3RhcnQgaXMgbG93ZXIgdGhhbiAwCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnQpIHsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKQorCQkJCXJldHVybiBpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0aGUgbGFzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpcworCSAqIGVxdWFsIHRvIHRvQmVGb3VuZCBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorCSAqIEFuc3dlcnMgLTEgaWYgbm8gb2NjdXJyZW5jZSBvZiB0aGlzIGNoYXJhY3RlciBpcyBmb3VuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyAsICdjJywgJ2UnIH0KKwkgKiAgICByZXN1bHQgPT4gNAorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2UnCisJICogICAgYXJyYXkgPSB7ICcgYScsICdiJywgJ2MnLCAnZCcgfQorCSAqICAgIHJlc3VsdCA9PiAtMQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKgorCSAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkCisJICogQHJldHVybiB0aGUgbGFzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpcworCSAqIGVxdWFsIHRvIHRvQmVGb3VuZCBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5LCAtMSBvdGhlcndpc2UKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7CisJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCisJCQkJcmV0dXJuIGk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBsYXN0IGluZGV4IGluIHRoZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGlzCisJICogZXF1YWwgdG8gdG9CZUZvdW5kIHN0b3BwaW5nIGF0IHRoZSBpbmRleCBzdGFydEluZGV4LgorCSAqIEFuc3dlcnMgLTEgaWYgbm8gb2NjdXJyZW5jZSBvZiB0aGlzIGNoYXJhY3RlciBpcyBmb3VuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyB9CisJICogICAgc3RhcnRJbmRleCA9IDIKKwkgKiAgICByZXN1bHQgPT4gMgorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2MnCisJICogICAgYXJyYXkgPSB7ICcgYScsICdiJywgJ2MnLCAnZCcsICdlJyB9CisJICogICAgc3RhcnRJbmRleCA9IDMKKwkgKiAgICByZXN1bHQgPT4gLTEKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRvQmVGb3VuZCA9ICdlJworCSAqICAgIGFycmF5ID0geyAnIGEnLCAnYicsICdjJywgJ2QnIH0KKwkgKiAgICBzdGFydEluZGV4ID0gMAorCSAqICAgIHJlc3VsdCA9PiAtMQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKgorCSAqIEBwYXJhbSB0b0JlRm91bmQgdGhlIGNoYXJhY3RlciB0byBzZWFyY2gKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHNlYXJjaGVkCisJICogQHBhcmFtIHN0YXJ0SW5kZXggdGhlIHN0b3BwaW5nIGluZGV4CisJICogQHJldHVybiB0aGUgbGFzdCBpbmRleCBpbiB0aGUgYXJyYXkgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlciBpcworCSAqIGVxdWFsIHRvIHRvQmVGb3VuZCBzdG9wcGluZyBhdCB0aGUgaW5kZXggc3RhcnRJbmRleCwgLTEgb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCisJICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3RhcnRJbmRleCBpcyBsb3dlciB0aGFuIDAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZigKKwkJY2hhciB0b0JlRm91bmQsCisJCWNoYXJbXSBhcnJheSwKKwkJaW50IHN0YXJ0SW5kZXgpIHsKKwkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IHN0YXJ0SW5kZXg7KQorCQkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKKwkJCQlyZXR1cm4gaTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGFycmF5IGZvciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgaXMKKwkgKiBlcXVhbCB0byB0b0JlRm91bmQgc3RhcnRpbmcgZnJvbSBlbmRJbmRleCB0byBzdGFydEluZGV4LgorCSAqIEFuc3dlcnMgLTEgaWYgbm8gb2NjdXJyZW5jZSBvZiB0aGlzIGNoYXJhY3RlciBpcyBmb3VuZC4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICB0b0JlRm91bmQgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyBhJywgJ2InLCAnYycsICdkJyB9CisJICogICAgc3RhcnRJbmRleCA9IDIKKwkgKiAgICBlbmRJbmRleCA9IDIKKwkgKiAgICByZXN1bHQgPT4gMgorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2MnCisJICogICAgYXJyYXkgPSB7ICcgYScsICdiJywgJ2MnLCAnZCcsICdlJyB9CisJICogICAgc3RhcnRJbmRleCA9IDMKKwkgKiAgICBlbmRJbmRleCA9IDQKKwkgKiAgICByZXN1bHQgPT4gLTEKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRvQmVGb3VuZCA9ICdlJworCSAqICAgIGFycmF5ID0geyAnIGEnLCAnYicsICdjJywgJ2QnIH0KKwkgKiAgICBzdGFydEluZGV4ID0gMAorCSAqICAgIGVuZEluZGV4ID0gMworCSAqICAgIHJlc3VsdCA9PiAtMQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoCisJICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0byBiZSBzZWFyY2hlZAorCSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBzdG9wcGluZyBpbmRleAorCSAqIEBwYXJhbSBlbmRJbmRleCB0aGUgc3RhcnRpbmcgaW5kZXgKKwkgKiBAcmV0dXJuIHRoZSBsYXN0IGluZGV4IGluIHRoZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGlzCisJICogZXF1YWwgdG8gdG9CZUZvdW5kIHN0YXJ0aW5nIGZyb20gZW5kSW5kZXggdG8gc3RhcnRJbmRleCwgLTEgb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhcnJheSBpcyBudWxsCisJICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZW5kSW5kZXggaXMgZ3JlYXRlciBvciBlcXVhbHMgdG8gYXJyYXkgbGVuZ3RoIG9yIHN0YXJ0aW5nIGlzIGxvd2VyIHRoYW4gMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhc3RJbmRleE9mKAorCQljaGFyIHRvQmVGb3VuZCwKKwkJY2hhcltdIGFycmF5LAorCQlpbnQgc3RhcnRJbmRleCwKKwkJaW50IGVuZEluZGV4KSB7CisJCWZvciAoaW50IGkgPSBlbmRJbmRleDsgLS1pID49IHN0YXJ0SW5kZXg7KQorCQkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKKwkJCQlyZXR1cm4gaTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBsYXN0IHBvcnRpb24gb2YgYSBuYW1lIGdpdmVuIGEgc2VwYXJhdG9yLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGUsCisJICogPHByZT4KKwkgKiAJbGFzdFNlZ21lbnQoImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCksJy4nKSAtLT4gT2JqZWN0CisJICogPC9wcmU+CisJICogCisJICogQHBhcmFtIGFycmF5IHRoZSBhcnJheQorCSAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGdpdmVuIHNlcGFyYXRvcgorCSAqIEByZXR1cm4gdGhlIGxhc3QgcG9ydGlvbiBvZiBhIG5hbWUgZ2l2ZW4gYSBzZXBhcmF0b3IKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKKwkgKi8KKwlmaW5hbCBzdGF0aWMgcHVibGljIGNoYXJbXSBsYXN0U2VnbWVudChjaGFyW10gYXJyYXksIGNoYXIgc2VwYXJhdG9yKSB7CisJCWludCBwb3MgPSBsYXN0SW5kZXhPZihzZXBhcmF0b3IsIGFycmF5KTsKKwkJaWYgKHBvcyA8IDApCisJCQlyZXR1cm4gYXJyYXk7CisJCXJldHVybiBzdWJhcnJheShhcnJheSwgcG9zICsgMSwgYXJyYXkubGVuZ3RoKTsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLiBUaGlzIGNoYXJbXSBwYXR0ZXJuIG1hdGNoaW5nCisJICogYWNjZXB0cyB3aWxkLWNhcmRzICcqJyBhbmQgJz8nLgorCSAqCisJICogV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBsb3dlcmNhc2VkLCB0aGUKKwkgKiBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyIGNoYXJhY3RlciBhcyBjb21wYXJpbmcuCisJICogSWYgbmFtZSBpcyBudWxsLCB0aGUgYW5zd2VyIGlzIGZhbHNlLgorCSAqIElmIHBhdHRlcm4gaXMgbnVsbCwgdGhlIGFuc3dlciBpcyB0cnVlIGlmIG5hbWUgaXMgbm90IG51bGwuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgcGF0dGVybiA9IHsgJz8nLCAnYicsICcqJyB9CisJICogICAgbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBwYXR0ZXJuID0geyAnPycsICdiJywgJz8nIH0KKwkgKiAgICBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0KKwkgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlCisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBwYXR0ZXJuID0geyAnYicsICcqJyB9CisJICogICAgbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiBmYWxzZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gcGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBmbGFnIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gbWF0Y2goCisJCWNoYXJbXSBwYXR0ZXJuLAorCQljaGFyW10gbmFtZSwKKwkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJCWlmIChwYXR0ZXJuID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbnVsbCBwYXR0ZXJuIGlzIGVxdWl2YWxlbnQgdG8gJyonCisKKwkJcmV0dXJuIG1hdGNoKAorCQkJcGF0dGVybiwKKwkJCTAsCisJCQlwYXR0ZXJuLmxlbmd0aCwKKwkJCW5hbWUsCisJCQkwLAorCQkJbmFtZS5sZW5ndGgsCisJCQlpc0Nhc2VTZW5zaXRpdmUpOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgYSBzdWItcGF0dGVybiBtYXRjaGVzIHRoZSBzdWJwYXJ0IG9mIHRoZSBnaXZlbiBuYW1lLCBmYWxzZSBvdGhlcndpc2UuCisJICogY2hhcltdIHBhdHRlcm4gbWF0Y2hpbmcsIGFjY2VwdGluZyB3aWxkLWNhcmRzICcqJyBhbmQgJz8nLiBDYW4gbWF0Y2ggb25seSBzdWJzZXQgb2YgbmFtZS9wYXR0ZXJuLgorCSAqIGVuZCBwb3NpdGlvbnMgYXJlIG5vbi1pbmNsdXNpdmUuCisJICogVGhlIHN1YnBhdHRlcm4gaXMgZGVmaW5lZCBieSB0aGUgcGF0dGVyblN0YXJ0IGFuZCBwYXR0dGVybkVuZCBwb3NpdGlvbnMuCisJICogV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBsb3dlcmNhc2VkLCB0aGUKKwkgKiBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyIGNoYXJhY3RlciBhcyBjb21wYXJpbmcuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgcGF0dGVybiA9IHsgJz8nLCAnYicsICcqJyB9CisJICogICAgcGF0dGVyblN0YXJ0ID0gMQorCSAqICAgIHBhdHRlcm5FbmQgPSAzCisJICogICAgbmFtZSA9IHsgJ2EnLCAnYicsICdjJyAsICdkJyB9CisJICogICAgbmFtZVN0YXJ0ID0gMQorCSAqICAgIG5hbWVFbmQgPSA0CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZQorCSAqICAgIHJlc3VsdCA9PiB0cnVlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBwYXR0ZXJuID0geyAnPycsICdiJywgJyonIH0KKwkgKiAgICBwYXR0ZXJuU3RhcnQgPSAxCisJICogICAgcGF0dGVybkVuZCA9IDIKKwkgKiAgICBuYW1lID0geyAnYScsICdiJywgJ2MnICwgJ2QnIH0KKwkgKiAgICBuYW1lU3RhcnQgPSAxCisJICogICAgbmFtZUVuZCA9IDIKKwkgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlCisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBnaXZlbiBwYXR0ZXJuCisJICogQHBhcmFtIHBhdHRlcm5TdGFydCB0aGUgZ2l2ZW4gcGF0dGVybiBzdGFydAorCSAqIEBwYXJhbSBwYXR0ZXJuRW5kIHRoZSBnaXZlbiBwYXR0ZXJuIGVuZAorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHBhcmFtIG5hbWVTdGFydCB0aGUgZ2l2ZW4gbmFtZSBzdGFydAorCSAqIEBwYXJhbSBuYW1lRW5kIHRoZSBnaXZlbiBuYW1lIGVuZAorCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgZmxhZyB0byBrbm93IGlmIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGEgc3ViLXBhdHRlcm4gbWF0Y2hlcyB0aGUgc3VicGFydCBvZiB0aGUgZ2l2ZW4gbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIG1hdGNoKAorCQljaGFyW10gcGF0dGVybiwKKwkJaW50IHBhdHRlcm5TdGFydCwKKwkJaW50IHBhdHRlcm5FbmQsCisJCWNoYXJbXSBuYW1lLAorCQlpbnQgbmFtZVN0YXJ0LAorCQlpbnQgbmFtZUVuZCwKKwkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKworCQlpZiAobmFtZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOyAvLyBudWxsIG5hbWUgY2Fubm90IG1hdGNoCisJCWlmIChwYXR0ZXJuID09IG51bGwpCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbnVsbCBwYXR0ZXJuIGlzIGVxdWl2YWxlbnQgdG8gJyonCisJCWludCBpUGF0dGVybiA9IHBhdHRlcm5TdGFydDsKKwkJaW50IGlOYW1lID0gbmFtZVN0YXJ0OworCisJCWlmIChwYXR0ZXJuRW5kIDwgMCkKKwkJCXBhdHRlcm5FbmQgPSBwYXR0ZXJuLmxlbmd0aDsKKwkJaWYgKG5hbWVFbmQgPCAwKQorCQkJbmFtZUVuZCA9IG5hbWUubGVuZ3RoOworCisJCS8qIGNoZWNrIGZpcnN0IHNlZ21lbnQgKi8KKwkJY2hhciBwYXR0ZXJuQ2hhciA9IDA7CisJCXdoaWxlICgoaVBhdHRlcm4gPCBwYXR0ZXJuRW5kKQorCQkJJiYgKHBhdHRlcm5DaGFyID0gcGF0dGVybltpUGF0dGVybl0pICE9ICcqJykgeworCQkJaWYgKGlOYW1lID09IG5hbWVFbmQpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKHBhdHRlcm5DaGFyCisJCQkJIT0gKGlzQ2FzZVNlbnNpdGl2ZQorCQkJCQk/IG5hbWVbaU5hbWVdCisJCQkJCTogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaU5hbWVdKSkKKwkJCQkmJiBwYXR0ZXJuQ2hhciAhPSAnPycpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpTmFtZSsrOworCQkJaVBhdHRlcm4rKzsKKwkJfQorCQkvKiBjaGVjayBzZXF1ZW5jZSBvZiBzdGFyK3NlZ21lbnQgKi8KKwkJaW50IHNlZ21lbnRTdGFydDsKKwkJaWYgKHBhdHRlcm5DaGFyID09ICcqJykgeworCQkJc2VnbWVudFN0YXJ0ID0gKytpUGF0dGVybjsgLy8gc2tpcCBzdGFyCisJCX0gZWxzZSB7CisJCQlzZWdtZW50U3RhcnQgPSAwOyAvLyBmb3JjZSBpTmFtZSBjaGVjaworCQl9CisJCWludCBwcmVmaXhTdGFydCA9IGlOYW1lOworCQljaGVja1NlZ21lbnQgOiB3aGlsZSAoaU5hbWUgPCBuYW1lRW5kKSB7CisJCQlpZiAoaVBhdHRlcm4gPT0gcGF0dGVybkVuZCkgeworCQkJCWlQYXR0ZXJuID0gc2VnbWVudFN0YXJ0OyAvLyBtaXNtYXRjaCAtIHJlc3RhcnQgY3VycmVudCBzZWdtZW50CisJCQkJaU5hbWUgPSArK3ByZWZpeFN0YXJ0OworCQkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKKwkJCX0KKwkJCS8qIHNlZ21lbnQgaXMgZW5kaW5nICovCisJCQlpZiAoKHBhdHRlcm5DaGFyID0gcGF0dGVybltpUGF0dGVybl0pID09ICcqJykgeworCQkJCXNlZ21lbnRTdGFydCA9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcnQKKwkJCQlpZiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5FbmQpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXByZWZpeFN0YXJ0ID0gaU5hbWU7CisJCQkJY29udGludWUgY2hlY2tTZWdtZW50OworCQkJfQorCQkJLyogY2hlY2sgY3VycmVudCBuYW1lIGNoYXJhY3RlciAqLworCQkJaWYgKChpc0Nhc2VTZW5zaXRpdmUgPyBuYW1lW2lOYW1lXSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lW2lOYW1lXSkpCisJCQkJCQkhPSBwYXR0ZXJuQ2hhcgorCQkJCQkmJiBwYXR0ZXJuQ2hhciAhPSAnPycpIHsKKwkJCQlpUGF0dGVybiA9IHNlZ21lbnRTdGFydDsgLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgc2VnbWVudAorCQkJCWlOYW1lID0gKytwcmVmaXhTdGFydDsKKwkJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7CisJCQl9CisJCQlpTmFtZSsrOworCQkJaVBhdHRlcm4rKzsKKwkJfQorCisJCXJldHVybiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5FbmQpCisJCQl8fCAoaU5hbWUgPT0gbmFtZUVuZCAmJiBpUGF0dGVybiA9PSBwYXR0ZXJuRW5kKQorCQkJfHwgKGlQYXR0ZXJuID09IHBhdHRlcm5FbmQgLSAxICYmIHBhdHRlcm5baVBhdHRlcm5dID09ICcqJyk7CisJfQorCisJLyoqCisJICogQW5zd2VycyB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGZpbGVwYXRoIHVzaW5nIHRoZSBwYXRoU2VwYXRhdG9yLCBmYWxzZSBvdGhlcndpc2UuCisJICogCisJICogUGF0aCBjaGFyW10gcGF0dGVybiBtYXRjaGluZywgYWNjZXB0aW5nIHdpbGQtY2FyZHMgJyoqJywgJyonIGFuZCAnPycgKHVzaW5nIEFudCBkaXJlY3RvcnkgdGFza3MKKwkgKiBjb252ZW50aW9ucywgYWxzbyBzZWUgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50L21hbnVhbC9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyIpLgorCSAqIFBhdGggcGF0dGVybiBtYXRjaGluZyBpcyBlbmhhbmNpbmcgcmVndWxhciBwYXR0ZXJuIG1hdGNoaW5nIGluIHN1cHBvcnRpbmcgZXh0cmEgcnVsZSB3aGVyZSAnKionIHJlcHJlc2VudAorCSAqIGFueSBmb2xkZXIgY29tYmluYXRpb24uCisJICogU3BlY2lhbCBydWxlczogCisJICogLSBmb29cICBpcyBlcXVpdmFsZW50IHRvIGZvb1wqKiAgIAorCSAqIC0gKi5qYXZhIGlzIGVxdWl2YWxlbnQgdG8gKipcKi5qYXZhCisJICogV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBsb3dlcmNhc2VkLCB0aGUKKwkgKiBuYW1lIHdpbGwgYmUgbG93ZXJjYXNlZCBjaGFyYWN0ZXIgcGVyIGNoYXJhY3RlciBhcyBjb21wYXJpbmcuCisJICogCisJICogQHBhcmFtIHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4KKwkgKiBAcGFyYW0gZmlsZXBhdGggdGhlIGdpdmVuIHBhdGggCisJICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSB0byBmaW5kIG91dCB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0Y2hpbmcgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlCisJICogQHBhcmFtIHBhdGhTZXBhcmF0b3IgdGhlIGdpdmVuIHBhdGggc2VwYXJhdG9yCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIGZpbGVwYXRoIHVzaW5nIHRoZSBwYXRoU2VwYXRhdG9yLCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGF0aE1hdGNoKAorCQljaGFyW10gcGF0dGVybiwKKwkJY2hhcltdIGZpbGVwYXRoLAorCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwKKwkJY2hhciBwYXRoU2VwYXJhdG9yKSB7CisKKwkJaWYgKGZpbGVwYXRoID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7IC8vIG51bGwgbmFtZSBjYW5ub3QgbWF0Y2gKKwkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKKwkJCXJldHVybiB0cnVlOyAvLyBudWxsIHBhdHRlcm4gaXMgZXF1aXZhbGVudCB0byAnKicKKworCQkvLyBzcGVjaWFsIGNhc2U6IHBhdHRlcm4gZm9vIGlzIGVxdWl2YWxlbnQgdG8gKipcZm9vIChub3QgYWJzb2x1dGUpCisJCWJvb2xlYW4gZnJlZUxlYWRpbmdEb3VibGVTdGFyOworCisJCS8vIG9mZnNldHMgaW5zaWRlIHBhdHRlcm4KKwkJaW50IHBTZWdtZW50U3RhcnQsIHBMZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDsKKworCQlpZiAoZnJlZUxlYWRpbmdEb3VibGVTdGFyID0gcGF0dGVyblswXSAhPSBwYXRoU2VwYXJhdG9yKXsKKwkJCXBTZWdtZW50U3RhcnQgPSAwOworCQl9IGVsc2UgeworCQkJcFNlZ21lbnRTdGFydCA9IDE7CisJCX0KKwkJaW50IHBTZWdtZW50RW5kID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIHBhdHRlcm4sIHBTZWdtZW50U3RhcnQrMSk7CisJCWlmIChwU2VnbWVudEVuZCA8IDApIHBTZWdtZW50RW5kID0gcExlbmd0aDsKKworCQkvLyBzcGVjaWFsIGNhc2U6IHBhdHRlcm4gZm9vXCBpcyBlcXVpdmFsZW50IHRvIGZvb1wqKgorCQlib29sZWFuIGZyZWVUcmFpbGluZ0RvdWJsZVN0YXIgPSBwYXR0ZXJuW3BMZW5ndGggLSAxXSA9PSBwYXRoU2VwYXJhdG9yOworCisJCS8vIG9mZnNldHMgaW5zaWRlIGZpbGVwYXRoCisJCWludCBmU2VnbWVudFN0YXJ0LCBmTGVuZ3RoID0gZmlsZXBhdGgubGVuZ3RoOworCQlpZiAoZmlsZXBhdGhbMF0gIT0gcGF0aFNlcGFyYXRvcil7CisJCQlmU2VnbWVudFN0YXJ0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZTZWdtZW50U3RhcnQgPSAxOworCQl9CisJCWlmIChmU2VnbWVudFN0YXJ0ICE9IHBTZWdtZW50U3RhcnQpIHsKKwkJCXJldHVybiBmYWxzZTsgLy8gYm90aCBtdXN0IHN0YXJ0IHdpdGggYSBzZXBhcmF0b3Igb3Igbm9uZS4KKwkJfQorCQlpbnQgZlNlZ21lbnRFbmQgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YocGF0aFNlcGFyYXRvciwgZmlsZXBhdGgsIGZTZWdtZW50U3RhcnQrMSk7CisJCWlmIChmU2VnbWVudEVuZCA8IDApIGZTZWdtZW50RW5kID0gZkxlbmd0aDsKKworCQkvLyBmaXJzdCBzZWdtZW50cworCQl3aGlsZSAocFNlZ21lbnRTdGFydCA8IHBMZW5ndGgKKwkJCSYmICFmcmVlTGVhZGluZ0RvdWJsZVN0YXIKKwkJCSYmICEocFNlZ21lbnRFbmQgPT0gcExlbmd0aCAmJiBmcmVlVHJhaWxpbmdEb3VibGVTdGFyCisJCQkJCXx8IChwU2VnbWVudEVuZCA9PSBwU2VnbWVudFN0YXJ0ICsgMgorCQkJCQkJCSYmIHBhdHRlcm5bcFNlZ21lbnRTdGFydF0gPT0gJyonCisJCQkJCQkJJiYgcGF0dGVybltwU2VnbWVudFN0YXJ0ICsgMV0gPT0gJyonKSkpIHsKKworCQkJaWYgKGZTZWdtZW50U3RhcnQgPj0gZkxlbmd0aCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoIUNoYXJPcGVyYXRpb24KKwkJCQkubWF0Y2goCisJCQkJCXBhdHRlcm4sCisJCQkJCXBTZWdtZW50U3RhcnQsCisJCQkJCXBTZWdtZW50RW5kLAorCQkJCQlmaWxlcGF0aCwKKwkJCQkJZlNlZ21lbnRTdGFydCwKKwkJCQkJZlNlZ21lbnRFbmQsCisJCQkJCWlzQ2FzZVNlbnNpdGl2ZSkpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIGp1bXAgdG8gbmV4dCBzZWdtZW50CQkKKwkJCXBTZWdtZW50RW5kID0KKwkJCQlDaGFyT3BlcmF0aW9uLmluZGV4T2YoCisJCQkJCXBhdGhTZXBhcmF0b3IsCisJCQkJCXBhdHRlcm4sCisJCQkJCXBTZWdtZW50U3RhcnQgPSBwU2VnbWVudEVuZCArIDEpOworCQkJLy8gc2tpcCBzZXBhcmF0b3IKKwkJCWlmIChwU2VnbWVudEVuZCA8IDApCisJCQkJcFNlZ21lbnRFbmQgPSBwTGVuZ3RoOworCisJCQlmU2VnbWVudEVuZCA9CisJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKAorCQkJCQlwYXRoU2VwYXJhdG9yLAorCQkJCQlmaWxlcGF0aCwKKwkJCQkJZlNlZ21lbnRTdGFydCA9IGZTZWdtZW50RW5kICsgMSk7CisJCQkvLyBza2lwIHNlcGFyYXRvcgorCQkJaWYgKGZTZWdtZW50RW5kIDwgMCkgZlNlZ21lbnRFbmQgPSBmTGVuZ3RoOworCQl9CisKKwkJLyogY2hlY2sgc2VxdWVuY2Ugb2YgZG91YmxlU3RhcitzZWdtZW50ICovCisJCWludCBwU2VnbWVudFJlc3RhcnQ7CisJCWlmICgocFNlZ21lbnRTdGFydCA+PSBwTGVuZ3RoICYmIGZyZWVUcmFpbGluZ0RvdWJsZVN0YXIpCisJCQkJfHwgKHBTZWdtZW50RW5kID09IHBTZWdtZW50U3RhcnQgKyAyCisJCQkJCSYmIHBhdHRlcm5bcFNlZ21lbnRTdGFydF0gPT0gJyonCisJCQkJCSYmIHBhdHRlcm5bcFNlZ21lbnRTdGFydCArIDFdID09ICcqJykpIHsKKwkJCXBTZWdtZW50RW5kID0KKwkJCQlDaGFyT3BlcmF0aW9uLmluZGV4T2YoCisJCQkJCXBhdGhTZXBhcmF0b3IsCisJCQkJCXBhdHRlcm4sCisJCQkJCXBTZWdtZW50U3RhcnQgPSBwU2VnbWVudEVuZCArIDEpOworCQkJLy8gc2tpcCBzZXBhcmF0b3IKKwkJCWlmIChwU2VnbWVudEVuZCA8IDApIHBTZWdtZW50RW5kID0gcExlbmd0aDsKKwkJCXBTZWdtZW50UmVzdGFydCA9IHBTZWdtZW50U3RhcnQ7CisJCX0gZWxzZSB7CisJCQlpZiAocFNlZ21lbnRTdGFydCA+PSBwTGVuZ3RoKSByZXR1cm4gZlNlZ21lbnRTdGFydCA+PSBmTGVuZ3RoOyAvLyB0cnVlIGlmIGZpbGVwYXRoIGlzIGRvbmUgdG9vLgorCQkJcFNlZ21lbnRSZXN0YXJ0ID0gMDsgLy8gZm9yY2UgZlNlZ21lbnRTdGFydCBjaGVjaworCQl9CisJCWludCBmU2VnbWVudFJlc3RhcnQgPSBmU2VnbWVudFN0YXJ0OworCQljaGVja1NlZ21lbnQgOiB3aGlsZSAoZlNlZ21lbnRTdGFydCA8IGZMZW5ndGgpIHsKKwkJCQkKKwkJCWlmIChwU2VnbWVudFN0YXJ0ID49IHBMZW5ndGgpIHsKKwkJCQlpZiAoZnJlZVRyYWlsaW5nRG91YmxlU3RhcikgcmV0dXJuIHRydWU7CisJCQkJLy8gbWlzbWF0Y2ggLSByZXN0YXJ0IGN1cnJlbnQgcGF0aCBzZWdtZW50CisJCQkJcFNlZ21lbnRFbmQgPQorCQkJCQlDaGFyT3BlcmF0aW9uLmluZGV4T2YocGF0aFNlcGFyYXRvciwgcGF0dGVybiwgcFNlZ21lbnRTdGFydCA9IHBTZWdtZW50UmVzdGFydCk7CisJCQkJaWYgKHBTZWdtZW50RW5kIDwgMCkgcFNlZ21lbnRFbmQgPSBwTGVuZ3RoOworCisJCQkJZlNlZ21lbnRSZXN0YXJ0ID0gCisJCQkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZihwYXRoU2VwYXJhdG9yLCBmaWxlcGF0aCwgZlNlZ21lbnRSZXN0YXJ0ICsgMSk7CisJCQkJLy8gc2tpcCBzZXBhcmF0b3IKKwkJCQlpZiAoZlNlZ21lbnRSZXN0YXJ0IDwgMCkgeworCQkJCQlmU2VnbWVudFJlc3RhcnQgPSBmTGVuZ3RoOworCQkJCX0gZWxzZSB7CisJCQkJCWZTZWdtZW50UmVzdGFydCsrOworCQkJCX0KKwkJCQlmU2VnbWVudEVuZCA9CisJCQkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZihwYXRoU2VwYXJhdG9yLCBmaWxlcGF0aCwgZlNlZ21lbnRTdGFydCA9IGZTZWdtZW50UmVzdGFydCk7CisJCQkJaWYgKGZTZWdtZW50RW5kIDwgMCkgZlNlZ21lbnRFbmQgPSBmTGVuZ3RoOworCQkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKKwkJCX0KKwkJCQorCQkJLyogcGF0aCBzZWdtZW50IGlzIGVuZGluZyAqLworCQkJaWYgKHBTZWdtZW50RW5kID09IHBTZWdtZW50U3RhcnQgKyAyCisJCQkJJiYgcGF0dGVybltwU2VnbWVudFN0YXJ0XSA9PSAnKicKKwkJCQkmJiBwYXR0ZXJuW3BTZWdtZW50U3RhcnQgKyAxXSA9PSAnKicpIHsKKwkJCQlwU2VnbWVudEVuZCA9CisJCQkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZihwYXRoU2VwYXJhdG9yLCBwYXR0ZXJuLCBwU2VnbWVudFN0YXJ0ID0gcFNlZ21lbnRFbmQgKyAxKTsKKwkJCQkvLyBza2lwIHNlcGFyYXRvcgorCQkJCWlmIChwU2VnbWVudEVuZCA8IDApIHBTZWdtZW50RW5kID0gcExlbmd0aDsKKwkJCQlwU2VnbWVudFJlc3RhcnQgPSBwU2VnbWVudFN0YXJ0OworCQkJCWZTZWdtZW50UmVzdGFydCA9IGZTZWdtZW50U3RhcnQ7CisJCQkJaWYgKHBTZWdtZW50U3RhcnQgPj0gcExlbmd0aCkgcmV0dXJuIHRydWU7CisJCQkJY29udGludWUgY2hlY2tTZWdtZW50OworCQkJfQorCQkJLyogY2hlY2ggY3VycmVudCBwYXRoIHNlZ21lbnQgKi8KKwkJCWlmICghQ2hhck9wZXJhdGlvbi5tYXRjaCgKKwkJCQkJCQkJcGF0dGVybiwKKwkJCQkJCQkJcFNlZ21lbnRTdGFydCwKKwkJCQkJCQkJcFNlZ21lbnRFbmQsCisJCQkJCQkJCWZpbGVwYXRoLAorCQkJCQkJCQlmU2VnbWVudFN0YXJ0LAorCQkJCQkJCQlmU2VnbWVudEVuZCwKKwkJCQkJCQkJaXNDYXNlU2Vuc2l0aXZlKSkgeworCQkJCS8vIG1pc21hdGNoIC0gcmVzdGFydCBjdXJyZW50IHBhdGggc2VnbWVudAorCQkJCXBTZWdtZW50RW5kID0KKwkJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKHBhdGhTZXBhcmF0b3IsIHBhdHRlcm4sIHBTZWdtZW50U3RhcnQgPSBwU2VnbWVudFJlc3RhcnQpOworCQkJCWlmIChwU2VnbWVudEVuZCA8IDApIHBTZWdtZW50RW5kID0gcExlbmd0aDsKKworCQkJCWZTZWdtZW50UmVzdGFydCA9IAorCQkJCQlDaGFyT3BlcmF0aW9uLmluZGV4T2YocGF0aFNlcGFyYXRvciwgZmlsZXBhdGgsIGZTZWdtZW50UmVzdGFydCArIDEpOworCQkJCS8vIHNraXAgc2VwYXJhdG9yCisJCQkJaWYgKGZTZWdtZW50UmVzdGFydCA8IDApIHsKKwkJCQkJZlNlZ21lbnRSZXN0YXJ0ID0gZkxlbmd0aDsKKwkJCQl9IGVsc2UgeworCQkJCQlmU2VnbWVudFJlc3RhcnQrKzsKKwkJCQl9CisJCQkJZlNlZ21lbnRFbmQgPQorCQkJCQlDaGFyT3BlcmF0aW9uLmluZGV4T2YocGF0aFNlcGFyYXRvciwgZmlsZXBhdGgsIGZTZWdtZW50U3RhcnQgPSBmU2VnbWVudFJlc3RhcnQpOworCQkJCWlmIChmU2VnbWVudEVuZCA8IDApIGZTZWdtZW50RW5kID0gZkxlbmd0aDsKKwkJCQljb250aW51ZSBjaGVja1NlZ21lbnQ7CisJCQl9CisJCQkvLyBqdW1wIHRvIG5leHQgc2VnbWVudAkJCisJCQlwU2VnbWVudEVuZCA9CisJCQkJQ2hhck9wZXJhdGlvbi5pbmRleE9mKAorCQkJCQlwYXRoU2VwYXJhdG9yLAorCQkJCQlwYXR0ZXJuLAorCQkJCQlwU2VnbWVudFN0YXJ0ID0gcFNlZ21lbnRFbmQgKyAxKTsKKwkJCS8vIHNraXAgc2VwYXJhdG9yCisJCQlpZiAocFNlZ21lbnRFbmQgPCAwKQorCQkJCXBTZWdtZW50RW5kID0gcExlbmd0aDsKKworCQkJZlNlZ21lbnRFbmQgPQorCQkJCUNoYXJPcGVyYXRpb24uaW5kZXhPZigKKwkJCQkJcGF0aFNlcGFyYXRvciwKKwkJCQkJZmlsZXBhdGgsCisJCQkJCWZTZWdtZW50U3RhcnQgPSBmU2VnbWVudEVuZCArIDEpOworCQkJLy8gc2tpcCBzZXBhcmF0b3IKKwkJCWlmIChmU2VnbWVudEVuZCA8IDApCisJCQkJZlNlZ21lbnRFbmQgPSBmTGVuZ3RoOworCQl9CisKKwkJcmV0dXJuIChwU2VnbWVudFJlc3RhcnQgPj0gcFNlZ21lbnRFbmQpCisJCQl8fCAoZlNlZ21lbnRTdGFydCA+PSBmTGVuZ3RoICYmIHBTZWdtZW50U3RhcnQgPj0gcExlbmd0aCkKKwkJCXx8IChwU2VnbWVudFN0YXJ0ID09IHBMZW5ndGggLSAyCisJCQkJJiYgcGF0dGVybltwU2VnbWVudFN0YXJ0XSA9PSAnKicKKwkJCQkmJiBwYXR0ZXJuW3BTZWdtZW50U3RhcnQgKyAxXSA9PSAnKicpCisJCQl8fCAocFNlZ21lbnRTdGFydCA9PSBwTGVuZ3RoICYmIGZyZWVUcmFpbGluZ0RvdWJsZVN0YXIpOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGluIHRoZSBnaXZlbiBhcnJheSwgMCBpZiBhbnkuCisJICogCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2InCisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4gMworCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgdG9CZUZvdW5kID0gJ2MnCisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4gMAorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gdG9CZUZvdW5kIHRoZSBnaXZlbiBjaGFyYWN0ZXIKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIGFycmF5LCAwIGlmIGFueQorCSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJyYXkgaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9jY3VyZW5jZXNPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7CisJCWludCBjb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKQorCQkJCWNvdW50Kys7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcKKwkgKiBhdCB0aGUgZ2l2ZW4gaW5kZXgsIDAgaWYgYW55LgorCSAqIAorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRvQmVGb3VuZCA9ICdiJworCSAqICAgIGFycmF5ID0geyAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9CisJICogICAgc3RhcnQgPSAyCisJICogICAgcmVzdWx0ID0+IDIKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHRvQmVGb3VuZCA9ICdjJworCSAqICAgIGFycmF5ID0geyAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9CisJICogICAgc3RhcnQgPSAwCisJICogICAgcmVzdWx0ID0+IDAKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIHRvQmVGb3VuZCB0aGUgZ2l2ZW4gY2hhcmFjdGVyCisJICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGluIHRoZSBnaXZlbiBhcnJheSwgMCBpZiBhbnkKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFycmF5IGlzIG51bGwKKwkgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBzdGFydCBpcyBsb3dlciB0aGFuIDAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvY2N1cmVuY2VzT2YoCisJCWNoYXIgdG9CZUZvdW5kLAorCQljaGFyW10gYXJyYXksCisJCWludCBzdGFydCkgeworCQlpbnQgY291bnQgPSAwOworCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKKwkJCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCisJCQkJY291bnQrKzsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCisJICogVGhlIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgcHJlZml4ID0geyAnYScgLCAnYicgfQorCSAqICAgIG5hbWUgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgcHJlZml4ID0geyAnYScgLCAnYycgfQorCSAqICAgIG5hbWUgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4gZmFsc2UKKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogCisJICogQHBhcmFtIHByZWZpeCB0aGUgZ2l2ZW4gcHJlZml4CisJICogQHBhcmFtIG5hbWUgdGhlIGdpdmVuIG5hbWUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBudWxsIG9yIGlmIHRoZSBnaXZlbiBwcmVmaXggaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcmVmaXhFcXVhbHMoY2hhcltdIHByZWZpeCwgY2hhcltdIG5hbWUpIHsKKworCQlpbnQgbWF4ID0gcHJlZml4Lmxlbmd0aDsKKwkJaWYgKG5hbWUubGVuZ3RoIDwgbWF4KQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gbWF4OworCQkJLS1pID49IDA7CisJCQkpIC8vIGFzc3VtZXMgdGhlIHByZWZpeCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIG5hbWUKKwkJCWlmIChwcmVmaXhbaV0gIT0gbmFtZVtpXSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBmYWxzZSBvdGhlcndpc2UuCisJICogaXNDYXNlU2Vuc2l0aXZlIGlzIHVzZWQgdG8gZmluZCBvdXQgd2hldGhlciBvciBub3QgdGhlIGNvbXBhcmlzb24gc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIHByZWZpeCA9IHsgJ2EnICwgJ0InIH0KKwkgKiAgICBuYW1lID0geyAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9CisJICogICAgaXNDYXNlU2Vuc2l0aXZlID0gZmFsc2UKKwkgKiAgICByZXN1bHQgPT4gdHJ1ZQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgcHJlZml4ID0geyAnYScgLCAnQicgfQorCSAqICAgIG5hbWUgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlCisJICogICAgcmVzdWx0ID0+IGZhbHNlCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBwcmVmaXggdGhlIGdpdmVuIHByZWZpeAorCSAqIEBwYXJhbSBuYW1lIHRoZSBnaXZlbiBuYW1lCisJICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSB0byBmaW5kIG91dCB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcGFyaXNvbiBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBudWxsIG9yIGlmIHRoZSBnaXZlbiBwcmVmaXggaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcmVmaXhFcXVhbHMoCisJCWNoYXJbXSBwcmVmaXgsCisJCWNoYXJbXSBuYW1lLAorCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworCisJCWludCBtYXggPSBwcmVmaXgubGVuZ3RoOworCQlpZiAobmFtZS5sZW5ndGggPCBtYXgpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChpc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCWZvciAoaW50IGkgPSBtYXg7CisJCQkJLS1pID49IDA7CisJCQkJKSAvLyBhc3N1bWVzIHRoZSBwcmVmaXggaXMgbm90IGxhcmdlciB0aGFuIHRoZSBuYW1lCisJCQkJaWYgKHByZWZpeFtpXSAhPSBuYW1lW2ldKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSBtYXg7CisJCQktLWkgPj0gMDsKKwkJCSkgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQorCQkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShwcmVmaXhbaV0pCisJCQkJIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaV0pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlbXBsYWNlbWVudCBjaGFyYWN0ZXIgaW4gdGhlCisJICogZ2l2ZW4gYXJyYXkuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICB0b0JlUmVwbGFjZWQgPSAnYicKKwkgKiAgICByZXBsYWNlbWVudENoYXIgPSAnYScKKwkgKiAgICByZXN1bHQgPT4gTm8gcmV0dXJuZWQgdmFsdWUsIGJ1dCBhcnJheSBpcyBub3cgZXF1YWxzIHRvIHsgJ2EnICwgJ2EnLCAnYScsICdhJywgJ2EnLCAnYScgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICB0b0JlUmVwbGFjZWQgPSAnYycKKwkgKiAgICByZXBsYWNlbWVudENoYXIgPSAnYScKKwkgKiAgICByZXN1bHQgPT4gTm8gcmV0dXJuZWQgdmFsdWUsIGJ1dCBhcnJheSBpcyBub3cgZXF1YWxzIHRvIHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHRvQmVSZXBsYWNlZCB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlcGxhY2VkCisJICogQHBhcmFtIHJlcGxhY2VtZW50Q2hhciB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZXBsYWNlKAorCQljaGFyW10gYXJyYXksCisJCWNoYXIgdG9CZVJlcGxhY2VkLAorCQljaGFyIHJlcGxhY2VtZW50Q2hhcikgeworCQlpZiAodG9CZVJlcGxhY2VkICE9IHJlcGxhY2VtZW50Q2hhcikgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGFycmF5Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKGFycmF5W2ldID09IHRvQmVSZXBsYWNlZCkKKwkJCQkJYXJyYXlbaV0gPSByZXBsYWNlbWVudENoYXI7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IG9mIGNoYXJhY3RlcnMgd2l0aCBzdWJzdGl0dXRpb25zLiBObyBzaWRlLWVmZmVjdCBpcyBvcGVyYXRlZCBvbiB0aGUgb3JpZ2luYWwKKwkgKiBhcnJheSwgaW4gY2FzZSBubyBzdWJzdGl0dXRpb24gaGFwcGVuZWQsIHRoZW4gdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB0aGUKKwkgKiBvcmlnaW5hbCBvbmUuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICB0b0JlUmVwbGFjZWQgPSB7ICdiJyB9CisJICogICAgcmVwbGFjZW1lbnRDaGFyID0geyAnYScsICdhJyB9CisJICogICAgcmVzdWx0ID0+IHsgJ2EnLCAnYScsICdhJywgJ2EnLCAnYScsICdhJywgJ2EnLCAnYScsICdhJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorCSAqICAgIHRvQmVSZXBsYWNlZCA9IHsgJ2MnIH0KKwkgKiAgICByZXBsYWNlbWVudENoYXIgPSB7ICdhJyB9CisJICogICAgcmVzdWx0ID0+IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHRvQmVSZXBsYWNlZCBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkCisJICogQHBhcmFtIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXJzCisJICogQHJldHVybiBhIG5ldyBhcnJheSBvZiBjaGFyYWN0ZXJzIHdpdGggc3Vic3RpdHV0aW9ucyBvciB0aGUgZ2l2ZW4gYXJyYXkgaWYgbm9uZQorCSAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFycmF5IGlzIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSByZXBsYWNlKAorCQljaGFyW10gYXJyYXksCisJCWNoYXJbXSB0b0JlUmVwbGFjZWQsCisJCWNoYXJbXSByZXBsYWNlbWVudENoYXJzKSB7CisKKwkJaW50IG1heCA9IGFycmF5Lmxlbmd0aDsKKwkJaW50IHJlcGxhY2VkTGVuZ3RoID0gdG9CZVJlcGxhY2VkLmxlbmd0aDsKKwkJaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnRDaGFycy5sZW5ndGg7CisKKwkJaW50W10gc3RhcnRzID0gbmV3IGludFs1XTsKKwkJaW50IG9jY3VycmVuY2VDb3VudCA9IDA7CisKKwkJaWYgKCFlcXVhbHModG9CZVJlcGxhY2VkLCByZXBsYWNlbWVudENoYXJzKSkgeworCisJCQluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJCWludCBqID0gMDsKKwkJCQl3aGlsZSAoaiA8IHJlcGxhY2VkTGVuZ3RoKSB7CisJCQkJCWlmIChpICsgaiA9PSBtYXgpCisJCQkJCQljb250aW51ZSBuZXh0OworCQkJCQlpZiAoYXJyYXlbaSArIGpdICE9IHRvQmVSZXBsYWNlZFtqKytdKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQl9CisJCQkJaWYgKG9jY3VycmVuY2VDb3VudCA9PSBzdGFydHMubGVuZ3RoKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlzdGFydHMsCisJCQkJCQkwLAorCQkJCQkJc3RhcnRzID0gbmV3IGludFtvY2N1cnJlbmNlQ291bnQgKiAyXSwKKwkJCQkJCTAsCisJCQkJCQlvY2N1cnJlbmNlQ291bnQpOworCQkJCX0KKwkJCQlzdGFydHNbb2NjdXJyZW5jZUNvdW50KytdID0gaTsKKwkJCX0KKwkJfQorCQlpZiAob2NjdXJyZW5jZUNvdW50ID09IDApCisJCQlyZXR1cm4gYXJyYXk7CisJCWNoYXJbXSByZXN1bHQgPQorCQkJbmV3IGNoYXJbbWF4CisJCQkJKyBvY2N1cnJlbmNlQ291bnQgKiAocmVwbGFjZW1lbnRMZW5ndGggLSByZXBsYWNlZExlbmd0aCldOworCQlpbnQgaW5TdGFydCA9IDAsIG91dFN0YXJ0ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvY2N1cnJlbmNlQ291bnQ7IGkrKykgeworCQkJaW50IG9mZnNldCA9IHN0YXJ0c1tpXSAtIGluU3RhcnQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpblN0YXJ0LCByZXN1bHQsIG91dFN0YXJ0LCBvZmZzZXQpOworCQkJaW5TdGFydCArPSBvZmZzZXQ7CisJCQlvdXRTdGFydCArPSBvZmZzZXQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXJlcGxhY2VtZW50Q2hhcnMsCisJCQkJMCwKKwkJCQlyZXN1bHQsCisJCQkJb3V0U3RhcnQsCisJCQkJcmVwbGFjZW1lbnRMZW5ndGgpOworCQkJaW5TdGFydCArPSByZXBsYWNlZExlbmd0aDsKKwkJCW91dFN0YXJ0ICs9IHJlcGxhY2VtZW50TGVuZ3RoOworCQl9CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluU3RhcnQsIHJlc3VsdCwgb3V0U3RhcnQsIG1heCAtIGluU3RhcnQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyIGFuZCB0cmltaW5nIGVhY2ggc3ViYXJyYXkgdG8gcmVtb3ZlCisJICogd2hpdGVzcGFjZXMgZXF1YWxzIHRvICcgJy4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBkaXZpZGVyID0gJ2InCisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4geyB7ICdhJyB9LCB7ICB9LCB7ICdhJyB9LCB7ICdhJyB9IH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGRpdmlkZXIgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorCSAqICAgIHJlc3VsdCA9PiB7IHsgJ2EnLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9IH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGRpdmlkZXIgPSAnYicKKwkgKiAgICBhcnJheSA9IHsgJ2EnICwgJyAnLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9CisJICogICAgcmVzdWx0ID0+IHsgeyAnYScgfSwgeyAgfSwgeyAnYScgfSwgeyAnYScgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBkaXZpZGVyID0gJ2MnCisJICogICAgYXJyYXkgPSB7ICcgJywgJyAnLCAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJywgJyAnIH0KKwkgKiAgICByZXN1bHQgPT4geyB7ICdhJywgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBkaXZpZGVyIHRoZSBnaXZlbiBkaXZpZGVyCisJICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQorCSAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlciBhbmQgdHJpbWluZyBlYWNoIHN1YmFycmF5IHRvIHJlbW92ZQorCSAqIHdoaXRlc3BhY2VzIGVxdWFscyB0byAnICcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIHNwbGl0QW5kVHJpbU9uKGNoYXIgZGl2aWRlciwgY2hhcltdIGFycmF5KSB7CisJCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIE5PX0NIQVJfQ0hBUjsKKworCQlpbnQgd29yZENvdW50ID0gMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKQorCQkJCXdvcmRDb3VudCsrOworCQljaGFyW11bXSBzcGxpdCA9IG5ldyBjaGFyW3dvcmRDb3VudF1bXTsKKwkJaW50IGxhc3QgPSAwLCBjdXJyZW50V29yZCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKSB7CisJCQkJaW50IHN0YXJ0ID0gbGFzdCwgZW5kID0gaSAtIDE7CisJCQkJd2hpbGUgKHN0YXJ0IDwgaSAmJiBhcnJheVtzdGFydF0gPT0gJyAnKQorCQkJCQlzdGFydCsrOworCQkJCXdoaWxlIChlbmQgPiBzdGFydCAmJiBhcnJheVtlbmRdID09ICcgJykKKwkJCQkJZW5kLS07CisJCQkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbZW5kIC0gc3RhcnQgKyAxXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlhcnJheSwKKwkJCQkJc3RhcnQsCisJCQkJCXNwbGl0W2N1cnJlbnRXb3JkKytdLAorCQkJCQkwLAorCQkJCQllbmQgLSBzdGFydCArIDEpOworCQkJCWxhc3QgPSBpICsgMTsKKwkJCX0KKwkJfQorCQlpbnQgc3RhcnQgPSBsYXN0LCBlbmQgPSBsZW5ndGggLSAxOworCQl3aGlsZSAoc3RhcnQgPCBsZW5ndGggJiYgYXJyYXlbc3RhcnRdID09ICcgJykKKwkJCXN0YXJ0Kys7CisJCXdoaWxlIChlbmQgPiBzdGFydCAmJiBhcnJheVtlbmRdID09ICcgJykKKwkJCWVuZC0tOworCQlzcGxpdFtjdXJyZW50V29yZF0gPSBuZXcgY2hhcltlbmQgLSBzdGFydCArIDFdOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJYXJyYXksCisJCQlzdGFydCwKKwkJCXNwbGl0W2N1cnJlbnRXb3JkKytdLAorCQkJMCwKKwkJCWVuZCAtIHN0YXJ0ICsgMSk7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlci4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBkaXZpZGVyID0gJ2InCisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnIH0KKwkgKiAgICByZXN1bHQgPT4geyB7ICdhJyB9LCB7ICB9LCB7ICdhJyB9LCB7ICdhJyB9IH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGRpdmlkZXIgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJ2EnICwgJ2InLCAnYicsICdhJywgJ2InLCAnYScgfQorCSAqICAgIHJlc3VsdCA9PiB7IHsgJ2EnLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9IH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGRpdmlkZXIgPSAnYycKKwkgKiAgICBhcnJheSA9IHsgJyAnLCAnICcsICdhJyAsICdiJywgJ2InLCAnYScsICdiJywgJ2EnLCAnICcgfQorCSAqICAgIHJlc3VsdCA9PiB7IHsgJyAnLCAnYScsICdiJywgJ2InLCAnYScsICdiJywgJ2EnLCAnICcgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBkaXZpZGVyIHRoZSBnaXZlbiBkaXZpZGVyCisJICogQHBhcmFtIGFycmF5IHRoZSBnaXZlbiBhcnJheQorCSAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3BsaXRPbihjaGFyIGRpdmlkZXIsIGNoYXJbXSBhcnJheSkgeworCQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCXJldHVybiBOT19DSEFSX0NIQVI7CisKKwkJaW50IHdvcmRDb3VudCA9IDE7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikKKwkJCQl3b3JkQ291bnQrKzsKKwkJY2hhcltdW10gc3BsaXQgPSBuZXcgY2hhclt3b3JkQ291bnRdW107CisJCWludCBsYXN0ID0gMCwgY3VycmVudFdvcmQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikgeworCQkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2kgLSBsYXN0XTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlhcnJheSwKKwkJCQkJbGFzdCwKKwkJCQkJc3BsaXRbY3VycmVudFdvcmQrK10sCisJCQkJCTAsCisJCQkJCWkgLSBsYXN0KTsKKwkJCQlsYXN0ID0gaSArIDE7CisJCQl9CisJCX0KKwkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbbGVuZ3RoIC0gbGFzdF07CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGxhc3QsIHNwbGl0W2N1cnJlbnRXb3JkXSwgMCwgbGVuZ3RoIC0gbGFzdCk7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgdGhlIHNwbGl0IG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgZ2l2ZW4gZGl2aWRlci4gVGhlIGdpdmVuIGVuZCAKKwkgKiBpcyBleGNsdXNpdmUgYW5kIHRoZSBnaXZlbiBzdGFydCBpcyBpbmNsdXNpdmUuCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgZGl2aWRlciA9ICdiJworCSAqICAgIGFycmF5ID0geyAnYScgLCAnYicsICdiJywgJ2EnLCAnYicsICdhJyB9CisJICogICAgc3RhcnQgPSAyCisJICogICAgZW5kID0gNQorCSAqICAgIHJlc3VsdCA9PiB7IHsgIH0sIHsgIH0sIHsgJ2EnIH0gfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gZGl2aWRlciB0aGUgZ2l2ZW4gZGl2aWRlcgorCSAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIGdpdmVuIHN0YXJ0aW5nIGluZGV4CisJICogQHBhcmFtIGVuZCB0aGUgZ2l2ZW4gZW5kaW5nIGluZGV4CisJICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyB0aGUgc3BsaXQgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBnaXZlbiBkaXZpZGVyCisJICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3RhcnQgaXMgbG93ZXIgdGhhbiAwIG9yIGVuZCBpcyBncmVhdGVyIHRoYW4gdGhlIGFycmF5IGxlbmd0aAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3BsaXRPbigKKwkJY2hhciBkaXZpZGVyLAorCQljaGFyW10gYXJyYXksCisJCWludCBzdGFydCwKKwkJaW50IGVuZCkgeworCQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCB8fCBzdGFydCA+IGVuZCkKKwkJCXJldHVybiBOT19DSEFSX0NIQVI7CisKKwkJaW50IHdvcmRDb3VudCA9IDE7CisJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKQorCQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpCisJCQkJd29yZENvdW50Kys7CisJCWNoYXJbXVtdIHNwbGl0ID0gbmV3IGNoYXJbd29yZENvdW50XVtdOworCQlpbnQgbGFzdCA9IHN0YXJ0LCBjdXJyZW50V29yZCA9IDA7CisJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisJCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikgeworCQkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2kgLSBsYXN0XTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlhcnJheSwKKwkJCQkJbGFzdCwKKwkJCQkJc3BsaXRbY3VycmVudFdvcmQrK10sCisJCQkJCTAsCisJCQkJCWkgLSBsYXN0KTsKKwkJCQlsYXN0ID0gaSArIDE7CisJCQl9CisJCX0KKwkJc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbZW5kIC0gbGFzdF07CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGxhc3QsIHNwbGl0W2N1cnJlbnRXb3JkXSwgMCwgZW5kIC0gbGFzdCk7CisJCXJldHVybiBzcGxpdDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0IGFuZCAKKwkgKiBlbmRpbmcgYXQgdGhlIGdpdmVuIGVuZC4gVGhlIGdpdmVuIHN0YXJ0IGlzIGluY2x1c2l2ZSBhbmQgdGhlIGdpdmVuIGVuZCBpcyBleGNsdXNpdmUuCisJICogQW5zd2VycyBudWxsIGlmIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiBlbmQsIGlmIHN0YXJ0IGlzIGxvd2VyIHRoYW4gMCBvciBpZiBlbmQgaXMgZ3JlYXRlciAKKwkgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5LiBJZiBlbmQgIGVxdWFscyAtMSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBhcnJheSBsZW5ndGguCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7IHsgJ2EnIH0gLCB7ICdiJyB9IH0KKwkgKiAgICBzdGFydCA9IDAKKwkgKiAgICBlbmQgPSAxCisJICogICAgcmVzdWx0ID0+IHsgeyAnYScgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSAsIHsgJ2InIH0gfQorCSAqICAgIHN0YXJ0ID0gMAorCSAqICAgIGVuZCA9IC0xCisJICogICAgcmVzdWx0ID0+IHsgeyAnYScgfSwgeyAnYicgfSB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqICAKKwkgKiBAcGFyYW0gYXJyYXkgdGhlIGdpdmVuIGFycmF5CisJICogQHBhcmFtIHN0YXJ0IHRoZSBnaXZlbiBzdGFydGluZyBpbmRleAorCSAqIEBwYXJhbSBlbmQgdGhlIGdpdmVuIGVuZGluZyBpbmRleAorCSAqIEByZXR1cm4gYSBuZXcgYXJyYXkgd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBhcnJheSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RhcnQgYW5kIAorCSAqIGVuZGluZyBhdCB0aGUgZ2l2ZW4gZW5kCisJICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbnVsbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3ViYXJyYXkoY2hhcltdW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgeworCQlpZiAoZW5kID09IC0xKQorCQkJZW5kID0gYXJyYXkubGVuZ3RoOworCQlpZiAoc3RhcnQgPiBlbmQpCisJCQlyZXR1cm4gbnVsbDsKKwkJaWYgKHN0YXJ0IDwgMCkKKwkJCXJldHVybiBudWxsOworCQlpZiAoZW5kID4gYXJyYXkubGVuZ3RoKQorCQkJcmV0dXJuIG51bGw7CisKKwkJY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdW107CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCByZXN1bHQsIDAsIGVuZCAtIHN0YXJ0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIGEgbmV3IGFycmF5IHdoaWNoIGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0IGFuZCAKKwkgKiBlbmRpbmcgYXQgdGhlIGdpdmVuIGVuZC4gVGhlIGdpdmVuIHN0YXJ0IGlzIGluY2x1c2l2ZSBhbmQgdGhlIGdpdmVuIGVuZCBpcyBleGNsdXNpdmUuCisJICogQW5zd2VycyBudWxsIGlmIHN0YXJ0IGlzIGdyZWF0ZXIgdGhhbiBlbmQsIGlmIHN0YXJ0IGlzIGxvd2VyIHRoYW4gMCBvciBpZiBlbmQgaXMgZ3JlYXRlciAKKwkgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGFycmF5LiBJZiBlbmQgIGVxdWFscyAtMSwgaXQgaXMgY29udmVydGVkIHRvIHRoZSBhcnJheSBsZW5ndGguCisJICogPGJyPgorCSAqIDxicj4KKwkgKiBGb3IgZXhhbXBsZToKKwkgKiA8b2w+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdhJyAsICdiJyB9CisJICogICAgc3RhcnQgPSAwCisJICogICAgZW5kID0gMQorCSAqICAgIHJlc3VsdCA9PiB7ICdhJyB9CisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgJ2EnLCAnYicgfQorCSAqICAgIHN0YXJ0ID0gMAorCSAqICAgIGVuZCA9IC0xCisJICogICAgcmVzdWx0ID0+IHsgJ2EnICwgJ2InIH0KKwkgKiA8L3ByZT4KKwkgKiA8L2xpPgorCSAqIDwvb2w+CisJICogIAorCSAqIEBwYXJhbSBhcnJheSB0aGUgZ2l2ZW4gYXJyYXkKKwkgKiBAcGFyYW0gc3RhcnQgdGhlIGdpdmVuIHN0YXJ0aW5nIGluZGV4CisJICogQHBhcmFtIGVuZCB0aGUgZ2l2ZW4gZW5kaW5nIGluZGV4CisJICogQHJldHVybiBhIG5ldyBhcnJheSB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdGFydCBhbmQgCisJICogZW5kaW5nIGF0IHRoZSBnaXZlbiBlbmQKKwkgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcnJheSBpcyBudWxsCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gc3ViYXJyYXkoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaWYgKGVuZCA9PSAtMSkKKwkJCWVuZCA9IGFycmF5Lmxlbmd0aDsKKwkJaWYgKHN0YXJ0ID4gZW5kKQorCQkJcmV0dXJuIG51bGw7CisJCWlmIChzdGFydCA8IDApCisJCQlyZXR1cm4gbnVsbDsKKwkJaWYgKGVuZCA+IGFycmF5Lmxlbmd0aCkKKwkJCXJldHVybiBudWxsOworCisJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CisJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCByZXN1bHQsIDAsIGVuZCAtIHN0YXJ0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyoqCisJICogQW5zd2VycyB0aGUgcmVzdWx0IG9mIGEgY2hhcltdIGNvbnZlcnNpb24gdG8gbG93ZXJjYXNlLiBBbnN3ZXJzIG51bGwgaWYgdGhlIGdpdmVuIGNoYXJzIGFycmF5IGlzIG51bGwuCisJICogPGJyPgorCSAqIE5PVEU6IElmIG5vIGNvbnZlcnNpb24gd2FzIG5lY2Vzc2FyeSwgdGhlbiBhbnN3ZXJzIGJhY2sgdGhlIGFyZ3VtZW50IG9uZS4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBjaGFycyA9IHsgJ2EnICwgJ2InIH0KKwkgKiAgICByZXN1bHQgPT4geyAnYScgLCAnYicgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdBJywgJ2InIH0KKwkgKiAgICByZXN1bHQgPT4geyAnYScgLCAnYicgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIHRvIGNvbnZlcnQKKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYSBjaGFyW10gY29udmVyc2lvbiB0byBsb3dlcmNhc2UKKwkgKi8KKwlmaW5hbCBzdGF0aWMgcHVibGljIGNoYXJbXSB0b0xvd2VyQ2FzZShjaGFyW10gY2hhcnMpIHsKKwkJaWYgKGNoYXJzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJaW50IGxlbmd0aCA9IGNoYXJzLmxlbmd0aDsKKwkJY2hhcltdIGxvd2VyQ2hhcnMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBjaGFyc1tpXTsKKwkJCWNoYXIgbGMgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyk7CisJCQlpZiAoKGMgIT0gbGMpIHx8IChsb3dlckNoYXJzICE9IG51bGwpKSB7CisJCQkJaWYgKGxvd2VyQ2hhcnMgPT0gbnVsbCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJY2hhcnMsCisJCQkJCQkwLAorCQkJCQkJbG93ZXJDaGFycyA9IG5ldyBjaGFyW2xlbmd0aF0sCisJCQkJCQkwLAorCQkJCQkJaSk7CisJCQkJfQorCQkJCWxvd2VyQ2hhcnNbaV0gPSBsYzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbG93ZXJDaGFycyA9PSBudWxsID8gY2hhcnMgOiBsb3dlckNoYXJzOworCX0KKworCS8qKgorCSAqIEFuc3dlcnMgYSBuZXcgYXJyYXkgcmVtb3ZpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzICgnICcpLiBBbnN3ZXJzIHRoZSBnaXZlbiBhcnJheSBpZiB0aGVyZSBpcyBubworCSAqIHNwYWNlIGNoYXJhY3RlcnMgdG8gcmVtb3ZlLgorCSAqIDxicj4KKwkgKiA8YnI+CisJICogRm9yIGV4YW1wbGU6CisJICogPG9sPgorCSAqIDxsaT48cHJlPgorCSAqICAgIGNoYXJzID0geyAnICcsICdhJyAsICdiJywgJyAnLCAgJyAnIH0KKwkgKiAgICByZXN1bHQgPT4geyAnYScgLCAnYicgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7ICdBJywgJ2InIH0KKwkgKiAgICByZXN1bHQgPT4geyAnQScgLCAnYicgfQorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPC9vbD4KKwkgKiAKKwkgKiBAcGFyYW0gY2hhcnMgdGhlIGdpdmVuIGFycmF5CisJICogQHJldHVybiBhIG5ldyBhcnJheSByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgKCcgJykKKwkgKi8KKwlmaW5hbCBzdGF0aWMgcHVibGljIGNoYXJbXSB0cmltKGNoYXJbXSBjaGFycykgeworCisJCWlmIChjaGFycyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gY2hhcnMubGVuZ3RoLCBlbmQgPSBsZW5ndGggLSAxOworCQl3aGlsZSAoc3RhcnQgPCBsZW5ndGggJiYgY2hhcnNbc3RhcnRdID09ICcgJykgeworCQkJc3RhcnQrKzsKKwkJfQorCQl3aGlsZSAoZW5kID4gc3RhcnQgJiYgY2hhcnNbZW5kXSA9PSAnICcpIHsKKwkJCWVuZC0tOworCQl9CisJCWlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBsZW5ndGggLSAxKSB7CisJCQlyZXR1cm4gc3ViYXJyYXkoY2hhcnMsIHN0YXJ0LCBlbmQgKyAxKTsKKwkJfQorCQlyZXR1cm4gY2hhcnM7CisJfQorCisJLyoqCisJICogQW5zd2VycyBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZ2l2ZW4gYXJyYXkgdXNpbmcgdGhlICcuJyBhcyBhIHNlcGFyYXRvci4KKwkgKiA8YnI+CisJICogPGJyPgorCSAqIEZvciBleGFtcGxlOgorCSAqIDxvbD4KKwkgKiA8bGk+PHByZT4KKwkgKiAgICBhcnJheSA9IHsgeyAnYScgfSAsIHsgJ2InIH0gfQorCSAqICAgIHJlc3VsdCA9PiAiYS5iIgorCSAqIDwvcHJlPgorCSAqIDwvbGk+CisJICogPGxpPjxwcmU+CisJICogICAgYXJyYXkgPSB7IHsgJyAnLCAgJ2EnIH0gLCB7ICdiJyB9IH0KKwkgKiAgICByZXN1bHQgPT4gIiBhLmIiCisJICogPC9wcmU+CisJICogPC9saT4KKwkgKiA8L29sPgorCSAqIAorCSAqIEBwYXJhbSBjaGFycyB0aGUgZ2l2ZW4gYXJyYXkKKwkgKiBAcmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSB1c2luZyB0aGUgJy4nIGFzIGEgc2VwYXJhdG9yCisJICovCisJZmluYWwgc3RhdGljIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoY2hhcltdW10gYXJyYXkpIHsKKwkJY2hhcltdIHJlc3VsdCA9IGNvbmNhdFdpdGgoYXJyYXksICcuJyk7CisJCXJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lQcm9ibGVtLmphdmEKaW5kZXggNjgyMGMyYS4uOGZiMzA4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVByb2JsZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JUHJvYmxlbS5qYXZhCkBAIC0xLDE0ICsxLDM3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCi2gCi1Db250cmlidXRvcnM6Ci0gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25TdGF0aWNBY2Nlc3NUb1N0YXRpY0ZpZWxkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljTWV0aG9kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2sKKyAqIAkJCQkJCQkJICAgRXhwcmVzc2lvblNob3VsZEJlQVZhcmlhYmxlCisgKiAJCQkJCQkJCSAgIEFzc2lnbm1lbnRIYXNOb0VmZmVjdAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKiAJCQkJCQkJCSAgIFRvb01hbnlTeW50aGV0aWNBcmd1bWVudFNsb3RzCisgKiAJCQkJCQkJCSAgIFRvb01hbnlBcnJheURpbWVuc2lvbnMKKyAqIAkJCQkJCQkJICAgVG9vTWFueUJ5dGVzRm9yU3RyaW5nQ29uc3RhbnQKKyAqIAkJCQkJCQkJICAgVG9vTWFueU1ldGhvZHMKKyAqIAkJCQkJCQkJICAgVG9vTWFueUZpZWxkcworICogCQkJCQkJCQkgICBOb25CbGFua0ZpbmFsTG9jYWxBc3NpZ25tZW50CisgKiAJCQkJCQkJCSAgIE9iamVjdENhbm5vdEhhdmVTdXBlclR5cGVzCisgKiAJCQkJCQkJCSAgIE1pc3NpbmdTZW1pQ29sb24KKyAqCQkJCQkJCQkgICBJbnZhbGlkUGFyZW50aGVzaXplZEV4cHJlc3Npb24KKyAqCQkJCQkJCQkgICBFbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsCisgKgkJCQkJCQkJICAgQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXRGb3JDb25zdHJ1Y3RvcgorICoJCQkJCQkJCSAgIEluY29tcGF0aWJsZVJldHVyblR5cGVGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QKKyAqCQkJCQkJCQkgICBVbnVzZWRQcml2YXRlTWV0aG9kCisgKgkJCQkJCQkJICAgVW51c2VkUHJpdmF0ZUNvbnN0cnVjdG9yCisgKgkJCQkJCQkJICAgVW51c2VkUHJpdmF0ZVR5cGUKKyAqCQkJCQkJCQkgICBVbnVzZWRQcml2YXRlRmllbGQKKyAqCQkJCQkJCQkgICBJbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZUZvck5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOwogIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CkBAIC0xNjIsNyArMTg1LDkgQEAKIAlpbnQgQW1iaWd1b3VzVHlwZSA9IFR5cGVSZWxhdGVkICsgNDsKIAlpbnQgVXNpbmdEZXByZWNhdGVkVHlwZSA9IFR5cGVSZWxhdGVkICsgNTsKIAlpbnQgSW50ZXJuYWxUeXBlTmFtZVByb3ZpZGVkID0gVHlwZVJlbGF0ZWQgKyA2OwotCisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgVW51c2VkUHJpdmF0ZVR5cGUgPSBJbnRlcm5hbCArIFR5cGVSZWxhdGVkICsgNzsKKwkKIAlpbnQgSW5jb21wYXRpYmxlVHlwZXNJbkVxdWFsaXR5T3BlcmF0b3IgPSBUeXBlUmVsYXRlZCArIDE1OwogCWludCBJbmNvbXBhdGlibGVUeXBlc0luQ29uZGl0aW9uYWxPcGVyYXRvciA9IFR5cGVSZWxhdGVkICsgMTY7CiAJaW50IFR5cGVNaXNtYXRjaCA9IFR5cGVSZWxhdGVkICsgMTc7CkBAIC0xNzgsNiArMjAzLDggQEAKIAlpbnQgT3V0ZXJMb2NhbE11c3RCZUZpbmFsID0gSW50ZXJuYWwgKyAyNTsKIAlpbnQgQ2Fubm90RGVmaW5lSW50ZXJmYWNlSW5Mb2NhbFR5cGUgPSBJbnRlcm5hbCArIDI2OwogCWludCBJbGxlZ2FsUHJpbWl0aXZlT3JBcnJheVR5cGVGb3JFbmNsb3NpbmdJbnN0YW5jZSA9IFR5cGVSZWxhdGVkICsgMjc7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgRW5jbG9zaW5nSW5zdGFuY2VJbkNvbnN0cnVjdG9yQ2FsbCA9IEludGVybmFsICsgMjg7CiAJaW50IEFub255bW91c0NsYXNzQ2Fubm90RXh0ZW5kRmluYWxDbGFzcyA9IFR5cGVSZWxhdGVkICsgMjk7CiAKIAkvLyB2YXJpYWJsZXMKQEAgLTE4OSw4ICsyMTYsMTAgQEAKIAkvLyBsb2NhbCB2YXJpYWJsZXMKIAlpbnQgUmVkZWZpbmVkTG9jYWwgPSBJbnRlcm5hbCArIDU1OwogCWludCBSZWRlZmluZWRBcmd1bWVudCA9IEludGVybmFsICsgNTY7Ci0JaW50IER1cGxpY2F0ZUZpbmFsTG9jYWxJbml0aWFsaXphdGlvbiA9IEludGVybmFsICsgNTc7CiAJLy8gZmluYWwgbG9jYWwgdmFyaWFibGVzCisJaW50IER1cGxpY2F0ZUZpbmFsTG9jYWxJbml0aWFsaXphdGlvbiA9IEludGVybmFsICsgNTc7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgTm9uQmxhbmtGaW5hbExvY2FsQXNzaWdubWVudCA9IEludGVybmFsICsgNTg7CiAJaW50IEZpbmFsT3V0ZXJMb2NhbEFzc2lnbm1lbnQgPSBJbnRlcm5hbCArIDYwOwogCWludCBMb2NhbFZhcmlhYmxlSXNOZXZlclVzZWQgPSBJbnRlcm5hbCArIDYxOwogCWludCBBcmd1bWVudElzTmV2ZXJVc2VkID0gSW50ZXJuYWwgKyA2MjsKQEAgLTE5OCw2ICsyMjcsMTIgQEAKIAlpbnQgQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXRGb3JDbGluaXQgPSBJbnRlcm5hbCArIDY0OwogCWludCBUb29NYW55QXJndW1lbnRTbG90cyA9IEludGVybmFsICsgNjU7CiAJaW50IFRvb01hbnlMb2NhbFZhcmlhYmxlU2xvdHMgPSBJbnRlcm5hbCArIDY2OworCS8qKiBAc2luY2UgMi4xICovCisJaW50IFRvb01hbnlTeW50aGV0aWNBcmd1bWVudFNsb3RzID0gSW50ZXJuYWwgKyA2NzsKKwkvKiogQHNpbmNlIDIuMSAqLworCWludCBUb29NYW55QXJyYXlEaW1lbnNpb25zID0gSW50ZXJuYWwgKyA2ODsKKwkvKiogQHNpbmNlIDIuMSAqLworCWludCBCeXRlY29kZUV4Y2VlZHM2NEtMaW1pdEZvckNvbnN0cnVjdG9yID0gSW50ZXJuYWwgKyA2OTsKIAogCS8vIGZpZWxkcwogCWludCBVbmRlZmluZWRGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDcwOwpAQCAtMjA2LDcgKzI0MSwxMSBAQAogCWludCBVc2luZ0RlcHJlY2F0ZWRGaWVsZCA9IEZpZWxkUmVsYXRlZCArIDczOwogCWludCBOb25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uID0gRmllbGRSZWxhdGVkICsgNzQ7CiAJaW50IFJlZmVyZW5jZVRvRm9yd2FyZEZpZWxkID0gRmllbGRSZWxhdGVkICsgSW50ZXJuYWwgKyA3NTsKLQorCS8qKiBAc2luY2UgMi4xICovCisJaW50IE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljRmllbGQgPSBJbnRlcm5hbCArIEZpZWxkUmVsYXRlZCArIDc2OworCS8qKiBAc2luY2UgMi4xICovCisJaW50IFVudXNlZFByaXZhdGVGaWVsZCA9IEludGVybmFsICsgRmllbGRSZWxhdGVkICsgNzc7CisJCiAJLy8gYmxhbmsgZmluYWwgZmllbGRzCiAJaW50IEZpbmFsRmllbGRBc3NpZ25tZW50ID0gRmllbGRSZWxhdGVkICsgODA7CiAJaW50IFVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQgPSBGaWVsZFJlbGF0ZWQgKyA4MTsKQEAgLTIyOSwxMiArMjY4LDE4IEBACiAJaW50IE5vTWVzc2FnZVNlbmRPbkJhc2VUeXBlID0gTWV0aG9kUmVsYXRlZCArIDExNDsKIAlpbnQgUGFyYW1ldGVyTWlzbWF0Y2ggPSBNZXRob2RSZWxhdGVkICsgMTE1OwogCWludCBOb01lc3NhZ2VTZW5kT25BcnJheVR5cGUgPSBNZXRob2RSZWxhdGVkICsgMTE2OwotICAgIAorCS8qKiBAc2luY2UgMi4xICovCisgICAgaW50IE5vblN0YXRpY0FjY2Vzc1RvU3RhdGljTWV0aG9kID0gSW50ZXJuYWwgKyBNZXRob2RSZWxhdGVkICsgMTE3OworCS8qKiBAc2luY2UgMi4xICovCisJaW50IFVudXNlZFByaXZhdGVNZXRob2QgPSBJbnRlcm5hbCArIE1ldGhvZFJlbGF0ZWQgKyAxMTg7CisJICAgIAogCS8vIGNvbnN0cnVjdG9ycwogCWludCBVbmRlZmluZWRDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMDsKIAlpbnQgTm90VmlzaWJsZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTMxOwogCWludCBBbWJpZ3VvdXNDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yUmVsYXRlZCArIDEzMjsKIAlpbnQgVXNpbmdEZXByZWNhdGVkQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxMzM7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgVW51c2VkUHJpdmF0ZUNvbnN0cnVjdG9yID0gSW50ZXJuYWwgKyBNZXRob2RSZWxhdGVkICsgMTM0OwogCS8vIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGxzCiAJaW50IEluc3RhbmNlRmllbGREdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb24gPSBDb25zdHJ1Y3RvclJlbGF0ZWQgKyAxMzU7CiAJaW50IEluc3RhbmNlTWV0aG9kRHVyaW5nQ29uc3RydWN0b3JJbnZvY2F0aW9uID0gQ29uc3RydWN0b3JSZWxhdGVkICsgMTM2OwpAQCAtMjkwLDcgKzMzNSwxMCBAQAogCWludCBJbnZhbGlkTnVsbFRvU3luY2hyb25pemVkID0gSW50ZXJuYWwgKyAxNzY7CiAJLy8gdGhyb3cKIAlpbnQgQ2Fubm90VGhyb3dOdWxsID0gSW50ZXJuYWwgKyAxNzc7Ci0KKwkvLyBhc3NpZ25tZW50CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgQXNzaWdubWVudEhhc05vRWZmZWN0ID0gSW50ZXJuYWwgKyAxNzg7CisJCiAJLy8gaW5uZXIgZW11bGF0aW9uCiAJaW50IE5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MgPSBGaWVsZFJlbGF0ZWQgKyAxOTA7CiAJaW50IE5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzID0gRmllbGRSZWxhdGVkICsgMTkxOwpAQCAtMzIwLDYgKzM2OCwxMiBAQAogCWludCBVbm1hdGNoZWRCcmFja2V0ID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMjA7CiAJaW50IE5vRmllbGRPbkJhc2VUeXBlID0gRmllbGRSZWxhdGVkICsgMjIxOwogCWludCBJbnZhbGlkRXhwcmVzc2lvbkFzU3RhdGVtZW50ID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMjI7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgRXhwcmVzc2lvblNob3VsZEJlQVZhcmlhYmxlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyMjM7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgTWlzc2luZ1NlbWlDb2xvbiA9IFN5bnRheCArIEludGVybmFsICsgMjI0OworCS8qKiBAc2luY2UgMi4xICovCisJaW50IEludmFsaWRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IFN5bnRheCArIEludGVybmFsICsgMjI1OwogICAgIAogCS8vIHNjYW5uZXIgZXJyb3JzCiAJaW50IEVuZE9mU291cmNlID0gU3ludGF4ICsgSW50ZXJuYWwgKyAyNTA7CkBAIC0zNjQsNiArNDE4LDggQEAKIAlpbnQgTXVzdFNwZWNpZnlQYWNrYWdlID0gMzI2OwogCWludCBIaWVyYXJjaHlIYXNQcm9ibGVtcyA9IFR5cGVSZWxhdGVkICsgMzI3OwogCWludCBQYWNrYWdlSXNOb3RFeHBlY3RlZFBhY2thZ2UgPSAzMjg7CisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgT2JqZWN0Q2Fubm90SGF2ZVN1cGVyVHlwZXMgPSAzMjk7CiAKIAkvLyBpbnQgSW52YWxpZFN1cGVyY2xhc3NCYXNlID0gVHlwZVJlbGF0ZWQgKyAzMjk7IC8vIHJlc2VydmVkIHRvIDMzNCBpbmNsdWRlZAogCWludCBTdXBlcmNsYXNzTm90Rm91bmQgPSAgVHlwZVJlbGF0ZWQgKyAzMjkgKyBQcm9ibGVtUmVhc29ucy5Ob3RGb3VuZDsgLy8gVHlwZVJlbGF0ZWQgKyAzMzAKQEAgLTQ2NCw3ICs1MjAsMTEgQEAKIAlpbnQgT3ZlcnJpZGluZ05vblZpc2libGVNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgNDEwOwogCWludCBBYnN0cmFjdE1ldGhvZENhbm5vdEJlT3ZlcnJpZGRlbiA9IE1ldGhvZFJlbGF0ZWQgKyA0MTE7CiAJaW50IE92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDQxMjsKLQorCS8qKiBAc2luY2UgMi4xICovCisJaW50IEluY29tcGF0aWJsZVJldHVyblR5cGVGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgPSBNZXRob2RSZWxhdGVkICsgNDEzOworCS8qKiBAc2luY2UgMi4xICovCisJaW50IEluY29tcGF0aWJsZUV4Y2VwdGlvbkluVGhyb3dzQ2xhdXNlRm9yTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kID0gTWV0aG9kUmVsYXRlZCArIDQxNDsKKwkKIAkvLyBjb2RlIHNuaXBwZXQgc3VwcG9ydAogCWludCBDb2RlU25pcHBldE1pc3NpbmdDbGFzcyA9IEludGVybmFsICsgNDIwOwogCWludCBDb2RlU25pcHBldE1pc3NpbmdNZXRob2QgPSBJbnRlcm5hbCArIDQyMTsKQEAgLTQ3Myw4ICs1MzMsMjAgQEAKIAkKIAkvL2NvbnN0YW50IHBvb2wKIAlpbnQgVG9vTWFueUNvbnN0YW50c0luQ29uc3RhbnRQb29sID0gSW50ZXJuYWwgKyA0MzA7Ci0JCisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgVG9vTWFueUJ5dGVzRm9yU3RyaW5nQ29uc3RhbnQgPSBJbnRlcm5hbCArIDQzMTsKKworCS8vIHN0YXRpYyBjb25zdHJhaW50cworCS8qKiBAc2luY2UgMi4xICovCisJaW50IFRvb01hbnlGaWVsZHMgPSBJbnRlcm5hbCArIDQzMjsKKwkvKiogQHNpbmNlIDIuMSAqLworCWludCBUb29NYW55TWV0aG9kcyA9IEludGVybmFsICsgNDMzOyAKKwkJCiAJLy8gMS40IGZlYXR1cmVzCiAJLy8gYXNzZXJ0aW9uIHdhcm5pbmcKIAlpbnQgVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIgPSBJbnRlcm5hbCArIDQ0MDsKKwkKKwkvLyBkZXRlY3RlZCB0YXNrCisJLyoqIEBzaW5jZSAyLjEgKi8KKwlpbnQgVGFzayA9IEludGVybmFsICsgNDUwOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQppbmRleCA0NmZlZDU4Li42NDkzMGE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JbnZhbGlkSW5wdXRFeGNlcHRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUNvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAotoAotQ29udHJpYnV0b3JzOgotICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI7CiAKQEAgLTE3LDE2ICsxNywxNiBAQAogcHVibGljIGNsYXNzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAKIAkvKioKLQkgKiBJbnZhbGlkSW5wdXRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIG5vIGRldGFpbCBtZXNzYWdlLgogCSAqLwogCXB1YmxpYyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKSB7CiAJCXN1cGVyKCk7CiAJfQogCS8qKgotCSAqIEludmFsaWRJbnB1dEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKKwkgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgbWVzc2FnZS4KKwkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSW52YWxpZElucHV0RXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOworCXB1YmxpYyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0Fic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQppbmRleCAwMGJiYzQ4Li44MGJlNWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEKaW5kZXggNTFlNDU2Ni4uNTZhYTExYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NsYXNzRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9DbGFzc0ZpbGUuamF2YQpAQCAtMSwyNSArMSwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlN0cmluZ0NvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIC8qKgogICogUmVwcmVzZW50cyBhIGNsYXNzIGZpbGUgd3JhcHBlciBvbiBieXRlcywgaXQgaXMgYXdhcmUgb2YgaXRzIGFjdHVhbApAQCAtNjIsNyArNjUsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfSEVBREVSX1NJWkUgPSAxMDAwOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9TSVpFID0gMTAwMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk5FUl9DTEFTU0VTX1NJWkUgPSA1OwotCXByb3RlY3RlZCBIYXNodGFibGVPZlR5cGUgbmFtZVVzYWdlOwogCXB1YmxpYyBDb2RlU3RyZWFtIGNvZGVTdHJlYW07CiAJcHJvdGVjdGVkIGludCBwcm9ibGVtTGluZTsJLy8gdXNlZCB0byBjcmVhdGUgbGluZSBudW1iZXIgYXR0cmlidXRlcyBmb3IgcHJvYmxlbSBtZXRob2RzCiAKQEAgLTE0OCwxNSArMTUwLDcgQEAKIAkJCiAJCXRoaXMuZW5jbG9zaW5nQ2xhc3NGaWxlID0gZW5jbG9zaW5nQ2xhc3NGaWxlOwogCQkvLyBpbm5lcmNsYXNzZXMgZ2V0IHRoZWlyIG5hbWVzIGNvbXB1dGVkIGF0IGNvZGUgZ2VuIHRpbWUKLQkJaWYgKGFUeXBlLmlzTG9jYWxUeXBlKCkpIHsKLQkJCSgoTG9jYWxUeXBlQmluZGluZykgYVR5cGUpLmNvbnN0YW50UG9vbE5hbWUoCi0JCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIGFUeXBlKSk7Ci0JCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSBhVHlwZS5tZW1iZXJUeXBlcygpOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJKChMb2NhbFR5cGVCaW5kaW5nKSBtZW1iZXJUeXBlc1tpXSkuY29uc3RhbnRQb29sTmFtZSgKLQkJCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKSk7Ci0JCQl9Ci0JCX0KKwogCQljb250ZW50cyA9IG5ldyBieXRlW0lOSVRJQUxfQ09OVEVOVFNfU0laRV07CiAJCS8vIG5vdyB3ZSBjb250aW51ZSB0byBnZW5lcmF0ZSB0aGUgYnl0ZXMgaW5zaWRlIHRoZSBjb250ZW50cyBhcnJheQogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoYWNjZXNzRmxhZ3MgPj4gOCk7CkBAIC00NDIsOCArNDM2LDcgQEAKIAkJaW50IGZpZWxkQXR0cmlidXRlT2Zmc2V0ID0gY29udGVudHNPZmZzZXQ7CiAJCWNvbnRlbnRzT2Zmc2V0ICs9IDI7CiAJCS8vIDQuNy4yIG9ubHkgc3RhdGljIGNvbnN0YW50IGZpZWxkcyBnZXQgYSBDb25zdGFudEF0dHJpYnV0ZQotCQlpZiAoZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudAotCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50LnR5cGVJRCgpICE9IFRfbnVsbCkgeworCQlpZiAoZmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCl7CiAJCQkvLyBOb3cgd2UgZ2VuZXJhdGUgdGhlIGNvbnN0YW50IGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZEJpbmRpbmcKIAkJCWludCBjb25zdGFudFZhbHVlTmFtZUluZGV4ID0KIAkJCQljb25zdGFudFBvb2wubGl0ZXJhbEluZGV4KEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLkNvbnN0YW50VmFsdWVOYW1lKTsKQEAgLTU2MSw2ICs1NTQsOSBAQAogCQkJCSsgKHN5bnRoZXRpY0ZpZWxkcyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0ZpZWxkcy5sZW5ndGgpOwogCiAJCS8vIHdyaXRlIHRoZSBudW1iZXIgb2YgZmllbGRzCisJCWlmIChmaWVsZENvdW50ID4gMHhGRkZGKSB7CisJCQlyZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnRvb01hbnlGaWVsZHMocmVmZXJlbmNlQmluZGluZy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOworCQl9CiAJCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChmaWVsZENvdW50ID4+IDgpOwogCQljb250ZW50c1tjb250ZW50c09mZnNldCsrXSA9IChieXRlKSBmaWVsZENvdW50OwogCkBAIC04NzQsMjAgKzg3MCwyMSBAQAogCQkJCXN3aXRjaCAoYWNjZXNzTWV0aG9kQmluZGluZy5hY2Nlc3NUeXBlKSB7CiAJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5GaWVsZFJlYWRBY2Nlc3MgOgogCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIHJlYWRpbmcgYWNjZXNzIHRvCi0JCQkJCQkvLyBhIHByaXZhdGUgZmllbGQKKwkJCQkJCS8vIGEgbm9uLWFjY2Vzc2libGUgZmllbGQKIAkJCQkJCWFkZFN5bnRoZXRpY0ZpZWxkUmVhZEFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuRmllbGRXcml0ZUFjY2VzcyA6CiAJCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gd3JpdGluZyBhY2Nlc3MgdG8KLQkJCQkJCS8vIGEgcHJpdmF0ZSBmaWVsZAorCQkJCQkJLy8gYSBub24tYWNjZXNzaWJsZSBmaWVsZAogCQkJCQkJYWRkU3ludGhldGljRmllbGRXcml0ZUFjY2Vzc01ldGhvZChzeW50aGV0aWNBY2Nlc3NNZXRob2RzW2ldKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuTWV0aG9kQWNjZXNzIDoKLQkJCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiBhY2Nlc3MgdG8gYSBwcml2YXRlIG1ldGhvZAorCQkJCQljYXNlIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcuU3VwZXJNZXRob2RBY2Nlc3MgOgorCQkJCQkJLy8gZ2VuZXJhdGUgYSBtZXRob2QgaW5mbyB0byBlbXVsYXRlIGFuIGFjY2VzcyB0byBhIG5vbi1hY2Nlc3NpYmxlIG1ldGhvZCAvIHN1cGVyLW1ldGhvZAogCQkJCQkJYWRkU3ludGhldGljTWV0aG9kQWNjZXNzTWV0aG9kKHN5bnRoZXRpY0FjY2Vzc01ldGhvZHNbaV0pOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5Db25zdHJ1Y3RvckFjY2VzcyA6Ci0JCQkJCQkvLyBnZW5lcmF0ZSBhIG1ldGhvZCBpbmZvIHRvIGVtdWxhdGUgYW4gYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QKKwkJCQkJCS8vIGdlbmVyYXRlIGEgbWV0aG9kIGluZm8gdG8gZW11bGF0ZSBhbiBhY2Nlc3MgdG8gYSBub24tYWNjZXNzaWJsZSBjb25zdHJ1Y3RvcgogCQkJCQkJYWRkU3ludGhldGljQ29uc3RydWN0b3JBY2Nlc3NNZXRob2Qoc3ludGhldGljQWNjZXNzTWV0aG9kc1tpXSk7CiAJCQkJfQogCQkJfQpAQCAtMTQ1OSw3ICsxNDU2LDggQEAKIAkJCQkJCTAsCiAJCQkJCQljb250ZW50c0xlbmd0aCk7CiAJCQkJfQotCQkJCWxvY2FsQ29udGVudHNPZmZzZXQgKz0gMjsgLy8gdGhlIHN0YXJ0UEMgZm9yIHRoaXMgaXMgYWx3YXlzIDAKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOyAvLyB0aGUgc3RhcnRQQyBmb3IgdGhpcyBpcyBhbHdheXMgMAorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CiAJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChjb2RlX2xlbmd0aCA+PiA4KTsKIAkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAoYnl0ZSkgY29kZV9sZW5ndGg7CiAJCQkJbmFtZUluZGV4ID0gY29uc3RhbnRQb29sLmxpdGVyYWxJbmRleChRdWFsaWZpZWROYW1lc0NvbnN0YW50cy5UaGlzKTsKQEAgLTE0NzAsNyArMTQ2OCw4IEBACiAJCQkJCQljb2RlU3RyZWFtLm1ldGhvZERlY2xhcmF0aW9uLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3Muc2lnbmF0dXJlKCkpOwogCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSAoZGVzY3JpcHRvckluZGV4ID4+IDgpOwogCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBkZXNjcmlwdG9ySW5kZXg7Ci0JCQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyB0aGUgcmVzb2x2ZWQgcG9zaXRpb24gZm9yIHRoaXMgaXMgYWx3YXlzIDAKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOy8vIHRoZSByZXNvbHZlZCBwb3NpdGlvbiBmb3IgdGhpcyBpcyBhbHdheXMgMAorCQkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CiAJCQl9CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGVTdHJlYW0uYWxsTG9jYWxzQ291bnRlcjsgaSsrKSB7CiAJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxWYXJpYWJsZSA9IGNvZGVTdHJlYW0ubG9jYWxzW2ldOwpAQCAtMTYyMSw3ICsxNjIwLDggQEAKIAkJCWxvY2FsQ29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IChieXRlKSBoYW5kbGVyUEM7CiAJCQlpZiAoZXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25UeXBlID09IG51bGwpIHsKIAkJCQkvLyBhbnkgZXhjZXB0aW9uIGhhbmRsZXIKLQkJCQlsb2NhbENvbnRlbnRzT2Zmc2V0ICs9IDI7CisJCQkJbG9jYWxDb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJCQlsb2NhbENvbnRlbnRzW2xvY2FsQ29udGVudHNPZmZzZXQrK10gPSAwOwogCQkJfSBlbHNlIHsKIAkJCQlpbnQgbmFtZUluZGV4OwogCQkJCWlmIChleGNlcHRpb25IYW5kbGVyLmV4Y2VwdGlvblR5cGUgPT0gVHlwZUJpbmRpbmcuTnVsbEJpbmRpbmcpIHsKQEAgLTE4NjUsNiArMTg2NSwxNCBAQAogCiAJCS8vIGZpcnN0IHdlIGhhbmRsZSB0aGUgbGluZW51bWJlciBhdHRyaWJ1dGUKIAkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykgeworCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQljb250ZW50cywKKwkJCQkJMCwKKwkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJMCwKKwkJCQkJY29udGVudHNMZW5ndGgpOworCQkJfQkJCQogCQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSAKIAkJCSAgICAqIEJ1aWxkIHRoZSBwYWlycyBvZjoKIAkJCSAgICAqIChieXRlY29kZVBDIGxpbmVOdW1iZXIpCkBAIC0xOTk3LDYgKzIwMDUsMTQgQEAKIAkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOyAvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGxpbmVudW1iZXIgYXR0cmlidXRlCiAKIAkJaWYgKGNvZGVTdHJlYW0uZ2VuZXJhdGVMaW5lTnVtYmVyQXR0cmlidXRlcykgeworCQkJaWYgKGxvY2FsQ29udGVudHNPZmZzZXQgKyAyMCA+PSAoY29udGVudHNMZW5ndGggPSBsb2NhbENvbnRlbnRzLmxlbmd0aCkpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQljb250ZW50cywKKwkJCQkJMCwKKwkJCQkJKGxvY2FsQ29udGVudHMgPSBjb250ZW50cyA9IG5ldyBieXRlW2NvbnRlbnRzTGVuZ3RoICsgSU5DUkVNRU5UX1NJWkVdKSwKKwkJCQkJMCwKKwkJCQkJY29udGVudHNMZW5ndGgpOworCQkJfQkJCQogCQkJLyogQ3JlYXRlIGFuZCBhZGQgdGhlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSAodXNlZCBmb3IgZGVidWdnaW5nKSAKIAkJCSAgICAqIEJ1aWxkIHRoZSBwYWlycyBvZjoKIAkJCSAgICAqIChieXRlY29kZVBDIGxpbmVOdW1iZXIpCkBAIC0yMDc2LDcgKzIwOTIsNyBAQAogCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzOwogCQkJCWlmIChkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKSkgewogCQkJCQlOZXN0ZWRUeXBlQmluZGluZyBtZXRob2REZWNsYXJpbmdDbGFzcyA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJCWFyZ1NpemUgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNBcmd1bWVudHNPZmZzZXQ7CisJCQkJCWFyZ1NpemUgPSBtZXRob2REZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdJbnN0YW5jZXNTbG90U2l6ZTsKIAkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzOwogCQkJCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50cyA9IG1ldGhvZERlY2xhcmluZ0NsYXNzLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpKQogCQkJCQkJIT0gbnVsbCkgewpAQCAtMjIyOCw3ICsyMjQ0LDggQEAKIAkJfQogCQkvLyB0aGVyZSBpcyBubyBleGNlcHRpb24gdGFibGUsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IGJ5IDIgdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBtb3ZlIAogCQkvLyBvbiB0aGUgYXR0cmlidXRlIGdlbmVyYXRpb24KLQkJbG9jYWxDb250ZW50c09mZnNldCArPSAyOworCQljb250ZW50c1tsb2NhbENvbnRlbnRzT2Zmc2V0KytdID0gMDsKKwkJY29udGVudHNbbG9jYWxDb250ZW50c09mZnNldCsrXSA9IDA7CiAJCS8vIGRlYnVnIGF0dHJpYnV0ZXMKIAkJaW50IGNvZGVBdHRyaWJ1dGVBdHRyaWJ1dGVPZmZzZXQgPSBsb2NhbENvbnRlbnRzT2Zmc2V0OwogCQlpbnQgYXR0cmlidXRlTnVtYmVyID0gMDsKQEAgLTIzNjUsNjcgKzIzODIsNiBAQAogCQljb250ZW50c1ttZXRob2RBdHRyaWJ1dGVPZmZzZXRdID0gKGJ5dGUpIGF0dHJpYnV0ZU51bWJlcjsKIAl9CiAKLQkvKgotCSAqIElOVEVSTkFMIFVTRS1PTkxZCi0JICogSW5uZXJjbGFzc2VzIGdldCB0aGVpciBuYW1lIGNvbXB1dGVkIGFzIHRoZXkgYXJlIGdlbmVyYXRlZCwgc2luY2Ugc29tZSBtYXkgbm90Ci0JICogYmUgYWN0dWFsbHkgb3V0cHV0ZWQgaWYgc2l0dGluZyBpbnNpZGUgdW5yZWFjaGFibGUgY29kZS4KLQkgKgotCSAqIEBwYXJhbSBsb2NhbFR5cGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFR5cGVCaW5kaW5nCi0JICovCi0JcHVibGljIGNoYXJbXSBjb21wdXRlQ29uc3RhbnRQb29sTmFtZShMb2NhbFR5cGVCaW5kaW5nIGxvY2FsVHlwZSkgewotCQlpZiAobG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoKTsKLQkJfQotCQkvLyBkZWxlZ2F0ZXMgdG8gdGhlIG91dGVybW9zdCBlbmNsb3NpbmcgY2xhc3NmaWxlLCBzaW5jZSBpdCBpcyB0aGUgb25seSBvbmUgd2l0aCBhIGdsb2JhbCB2aXNpb24gb2YgaXRzIGlubmVydHlwZXMuCi0JCWlmIChlbmNsb3NpbmdDbGFzc0ZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMub3V0ZXJNb3N0RW5jbG9zaW5nQ2xhc3NGaWxlKCkuY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUobG9jYWxUeXBlKTsKLQkJfQotCQlpZiAobmFtZVVzYWdlID09IG51bGwpCi0JCQluYW1lVXNhZ2UgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKCk7Ci0KLQkJLy8gZW5zdXJlIHRoZXJlIGlzIG5vdCBhbHJlYWR5IHN1Y2ggYSBsb2NhbCB0eXBlIG5hbWUgZGVmaW5lZCBieSB0aGUgdXNlcgotCQlpbnQgaW5kZXggPSAwOwotCQljaGFyW10gY2FuZGlkYXRlTmFtZTsKLQkJd2hpbGUodHJ1ZSkgewotCQkJaWYgKGxvY2FsVHlwZS5pc01lbWJlclR5cGUoKSl7Ci0JCQkJaWYgKGluZGV4ID09IDApewotCQkJCQljYW5kaWRhdGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQlsb2NhbFR5cGUuZW5jbG9zaW5nVHlwZSgpLmNvbnN0YW50UG9vbE5hbWUoKSwKLQkJCQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lLAotCQkJCQkJJyQnKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpbiBjYXNlIG9mIGNvbGxpc2lvbiwgdGhlbiBtZW1iZXIgbmFtZSBnZXRzIGV4dHJhICQxIGluc2VydGVkCi0JCQkJCS8vIGUuZy4gY2xhc3MgWCB7IHsgY2xhc3MgTHt9IG5ldyBYKCl7IGNsYXNzIEx7fSB9IH0gfQotCQkJCQljYW5kaWRhdGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQkJCQlsb2NhbFR5cGUuZW5jbG9zaW5nVHlwZSgpLmNvbnN0YW50UG9vbE5hbWUoKSwKLQkJCQkJCSckJywKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZGV4KS50b0NoYXJBcnJheSgpLAotCQkJCQkJJyQnLAotCQkJCQkJbG9jYWxUeXBlLnNvdXJjZU5hbWUpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobG9jYWxUeXBlLmlzQW5vbnltb3VzVHlwZSgpKXsKLQkJCQkJY2FuZGlkYXRlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAotCQkJCQkJcmVmZXJlbmNlQmluZGluZy5jb25zdGFudFBvb2xOYW1lKCksCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmRleCsxKS50b0NoYXJBcnJheSgpLAotCQkJCQkJJyQnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKLQkJCQkJCXJlZmVyZW5jZUJpbmRpbmcuY29uc3RhbnRQb29sTmFtZSgpLAotCQkJCQkJJyQnLAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5kZXgrMSkudG9DaGFyQXJyYXkoKSwKLQkJCQkJCSckJywKLQkJCQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lKTsKLQkJCX0JCQkJCQkKLQkJCWlmIChuYW1lVXNhZ2UuZ2V0KGNhbmRpZGF0ZU5hbWUpICE9IG51bGwpIHsKLQkJCQlpbmRleCArKzsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZVVzYWdlLnB1dChjYW5kaWRhdGVOYW1lLCBsb2NhbFR5cGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYW5kaWRhdGVOYW1lOwotCX0KLQogCS8qKgogCSAqIElOVEVSTkFMIFVTRS1PTkxZCiAJICogUmVxdWVzdCB0aGUgY3JlYXRpb24gb2YgYSBDbGFzc0ZpbGUgY29tcGF0aWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHByb2JsZW1hdGljIHR5cGUKQEAgLTI0MzksNiArMjM5NSw4IEBACiAJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLmJpbmRpbmc7CiAJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBuZXcgQ2xhc3NGaWxlKHR5cGVCaW5kaW5nLCBudWxsLCB0cnVlKTsKIAorCQkvLyBUT0RPOiAob2xpdmllcikgaGFuZGxlIGNhc2VzIHdoZXJlIGEgZmllbGQgY2Fubm90IGJlIGdlbmVyYXRlZCAobmFtZSB0b28gbG9uZykKKwkJLy8gVE9ETzogKG9saXZpZXIpIGhhbmRsZSB0b28gbWFueSBtZXRob2RzCiAJCS8vIGlubmVyIGF0dHJpYnV0ZXMKIAkJaWYgKHR5cGVCaW5kaW5nLmlzTWVtYmVyVHlwZSgpKQogCQkJY2xhc3NGaWxlLnJlY29yZEVuY2xvc2luZ1R5cGVBdHRyaWJ1dGVzKHR5cGVCaW5kaW5nKTsKQEAgLTI0NDgsNyArMjQwNiw3IEBACiAJCWlmICgoZmllbGRzICE9IG51bGwpICYmIChmaWVsZHMgIT0gTm9GaWVsZHMpKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkJaWYgKGZpZWxkc1tpXS5jb25zdGFudCA9PSBudWxsKSB7Ci0JCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkc1tpXSwgZmFsc2UsIG51bGwsIG51bGwsIDApOworCQkJCQlGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZHNbaV0sIG51bGwsIGZhbHNlLCBudWxsKTsKIAkJCQl9CiAJCQl9CiAJCQljbGFzc0ZpbGUuYWRkRmllbGRJbmZvcygpOwpAQCAtMjQ2NCw3ICsyNDIyLDcgQEAKIAkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwogCQlpbnQgbWF4TWV0aG9kRGVjbCA9IG1ldGhvZERlY2xhcmF0aW9ucyA9PSBudWxsID8gMCA6IG1ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGg7CiAJCWludCBwcm9ibGVtc0xlbmd0aDsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHVuaXRSZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHVuaXRSZXN1bHQuZ2V0RXJyb3JzKCk7CiAJCWlmIChwcm9ibGVtcyA9PSBudWxsKSB7CiAJCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVswXTsKIAkJfQpAQCAtMjk1Niw0ICsyOTE0LDQgQEAKIAkJCW91dHB1dC5jbG9zZSgpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxhdGlvblJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGF0aW9uUmVzdWx0LmphdmEKaW5kZXggMTBlOWQ1Mi4uM2JjYmFjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGF0aW9uUmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbXBpbGF0aW9uUmVzdWx0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CiAKIC8qKgpAQCAtNDEsMTEgKzQxLDEyIEBACiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25SZXN1bHQgewogCQogCXB1YmxpYyBJUHJvYmxlbSBwcm9ibGVtc1tdOworCXB1YmxpYyBJUHJvYmxlbSB0YXNrc1tdOwogCXB1YmxpYyBpbnQgcHJvYmxlbUNvdW50OworCXB1YmxpYyBpbnQgdGFza0NvdW50OwogCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKIAlwcml2YXRlIE1hcCBwcm9ibGVtc01hcDsKIAlwcml2YXRlIE1hcCBmaXJzdEVycm9yc01hcDsKLQlwcml2YXRlIEhhc2hTZXQgZHVwbGljYXRlUHJvYmxlbXM7CiAJcHJpdmF0ZSBpbnQgbWF4UHJvYmxlbVBlclVuaXQ7CiAJcHVibGljIGNoYXJbXVtdW10gcXVhbGlmaWVkUmVmZXJlbmNlczsKIAlwdWJsaWMgY2hhcltdW10gc2ltcGxlTmFtZVJlZmVyZW5jZXM7CkBAIC01NiwyMzcgKzU3LDM3MSBAQAogCXB1YmxpYyBib29sZWFuIGhhc0JlZW5BY2NlcHRlZCA9IGZhbHNlOwogCXB1YmxpYyBjaGFyW10gZmlsZU5hbWU7CiAJCi1wdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQoCi0JY2hhcltdIGZpbGVOYW1lLAotCWludCB1bml0SW5kZXgsIAotCWludCB0b3RhbFVuaXRzS25vd24sCi0JaW50IG1heFByb2JsZW1QZXJVbml0KXsKLQotCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQl0aGlzLnVuaXRJbmRleCA9IHVuaXRJbmRleDsKLQl0aGlzLnRvdGFsVW5pdHNLbm93biA9IHRvdGFsVW5pdHNLbm93bjsKLQl0aGlzLm1heFByb2JsZW1QZXJVbml0ID0gbWF4UHJvYmxlbVBlclVuaXQ7Ci0KLX0KLQotcHVibGljIENvbXBpbGF0aW9uUmVzdWx0KAotCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCWludCB1bml0SW5kZXgsIAotCWludCB0b3RhbFVuaXRzS25vd24sCi0JaW50IG1heFByb2JsZW1QZXJVbml0KXsKLQotCXRoaXMuZmlsZU5hbWUgPSBjb21waWxhdGlvblVuaXQuZ2V0RmlsZU5hbWUoKTsKLQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKLQl0aGlzLnVuaXRJbmRleCA9IHVuaXRJbmRleDsKLQl0aGlzLnRvdGFsVW5pdHNLbm93biA9IHRvdGFsVW5pdHNLbm93bjsKLQl0aGlzLm1heFByb2JsZW1QZXJVbml0ID0gbWF4UHJvYmxlbVBlclVuaXQ7Ci0KLX0KLXByaXZhdGUgaW50IGNvbXB1dGVQcmlvcml0eShJUHJvYmxlbSBwcm9ibGVtKXsKLQotCWZpbmFsIGludCBQX1NUQVRJQyA9IDEwMDA7Ci0JZmluYWwgaW50IFBfT1VUU0lERV9NRVRIT0QgPSA0MDAwOwotCWZpbmFsIGludCBQX0ZJUlNUX0VSUk9SID0gMjAwMDsKLQlmaW5hbCBpbnQgUF9FUlJPUiA9IDEwMDAwOworCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCgKKwkJY2hhcltdIGZpbGVOYW1lLAorCQlpbnQgdW5pdEluZGV4LCAKKwkJaW50IHRvdGFsVW5pdHNLbm93biwKKwkJaW50IG1heFByb2JsZW1QZXJVbml0KXsKIAkKLQlpbnQgcHJpb3JpdHkgPSAxMDAwIC0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7IC8vIGVhcmx5IHByb2JsZW1zIGZpcnN0Ci0JaWYgKHByaW9yaXR5IDwgMCkgcHJpb3JpdHkgPSAwOwotCWlmIChwcm9ibGVtLmlzRXJyb3IoKSl7Ci0JCXByaW9yaXR5ICs9IFBfRVJST1I7CisJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKwkJdGhpcy51bml0SW5kZXggPSB1bml0SW5kZXg7CisJCXRoaXMudG90YWxVbml0c0tub3duID0gdG90YWxVbml0c0tub3duOworCQl0aGlzLm1heFByb2JsZW1QZXJVbml0ID0gbWF4UHJvYmxlbVBlclVuaXQ7CiAJfQotCVJlZmVyZW5jZUNvbnRleHQgY29udGV4dCA9IHByb2JsZW1zTWFwID09IG51bGwgPyBudWxsIDogKFJlZmVyZW5jZUNvbnRleHQpIHByb2JsZW1zTWFwLmdldChwcm9ibGVtKTsKLQlpZiAoY29udGV4dCAhPSBudWxsKXsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIGNvbnRleHQ7Ci0JCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKLQkJCQlwcmlvcml0eSArPSBQX1NUQVRJQzsKKwkKKwlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQoCisJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAorCQlpbnQgdW5pdEluZGV4LCAKKwkJaW50IHRvdGFsVW5pdHNLbm93biwKKwkJaW50IG1heFByb2JsZW1QZXJVbml0KXsKKwkKKwkJdGhpcy5maWxlTmFtZSA9IGNvbXBpbGF0aW9uVW5pdC5nZXRGaWxlTmFtZSgpOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKKwkJdGhpcy51bml0SW5kZXggPSB1bml0SW5kZXg7CisJCXRoaXMudG90YWxVbml0c0tub3duID0gdG90YWxVbml0c0tub3duOworCQl0aGlzLm1heFByb2JsZW1QZXJVbml0ID0gbWF4UHJvYmxlbVBlclVuaXQ7CisJfQorCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVByaW9yaXR5KElQcm9ibGVtIHByb2JsZW0peworCQorCQlmaW5hbCBpbnQgUF9TVEFUSUMgPSAxMDAwOworCQlmaW5hbCBpbnQgUF9PVVRTSURFX01FVEhPRCA9IDQwMDA7CisJCWZpbmFsIGludCBQX0ZJUlNUX0VSUk9SID0gMjAwMDsKKwkJZmluYWwgaW50IFBfRVJST1IgPSAxMDAwMDsKKwkJCisJCWludCBwcmlvcml0eSA9IDEwMDAgLSBwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKTsgLy8gZWFybHkgcHJvYmxlbXMgZmlyc3QKKwkJaWYgKHByaW9yaXR5IDwgMCkgcHJpb3JpdHkgPSAwOworCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpeworCQkJcHJpb3JpdHkgKz0gUF9FUlJPUjsKKwkJfQorCQlSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQgPSBwcm9ibGVtc01hcCA9PSBudWxsID8gbnVsbCA6IChSZWZlcmVuY2VDb250ZXh0KSBwcm9ibGVtc01hcC5nZXQocHJvYmxlbSk7CisJCWlmIChjb250ZXh0ICE9IG51bGwpeworCQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBjb250ZXh0OworCQkJCWlmIChtZXRob2QuaXNTdGF0aWMoKSkgeworCQkJCQlwcmlvcml0eSArPSBQX1NUQVRJQzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJcHJpb3JpdHkgKz0gUF9PVVRTSURFX01FVEhPRDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJcHJpb3JpdHkgKz0gUF9PVVRTSURFX01FVEhPRDsKKwkJCXByaW9yaXR5ICs9IFBfT1VUU0lERV9NRVRIT0Q7CiAJCX0KLQl9IGVsc2UgewotCQlwcmlvcml0eSArPSBQX09VVFNJREVfTUVUSE9EOworCQlpZiAoZmlyc3RFcnJvcnNNYXAuY29udGFpbnNLZXkocHJvYmxlbSkpeworCQkJcHJpb3JpdHkgKz0gUF9GSVJTVF9FUlJPUjsKKwkJfQorCQlyZXR1cm4gcHJpb3JpdHk7CiAJfQotCWlmIChmaXJzdEVycm9yc01hcC5jb250YWluc0tleShwcm9ibGVtKSl7Ci0JCXByaW9yaXR5ICs9IFBfRklSU1RfRVJST1I7Ci0JfQotCXJldHVybiBwcmlvcml0eTsKLX0KLXB1YmxpYyBDbGFzc0ZpbGVbXSBnZXRDbGFzc0ZpbGVzKCkgewotCUVudW1lcmF0aW9uIGVudW0gPSBjb21waWxlZFR5cGVzLmVsZW1lbnRzKCk7Ci0JQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IG5ldyBDbGFzc0ZpbGVbY29tcGlsZWRUeXBlcy5zaXplKCldOwotCWludCBpbmRleCA9IDA7Ci0Jd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpewotCQljbGFzc0ZpbGVzW2luZGV4KytdID0gKENsYXNzRmlsZSllbnVtLm5leHRFbGVtZW50KCk7Ci0JfQotCXJldHVybiBjbGFzc0ZpbGVzOwkKLX0KLS8qKgotICogQW5zd2VyIHRoZSBpbml0aWFsIGNvbXBpbGF0aW9uIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlc2VudCBjb21waWxhdGlvbiByZXN1bHQKLSAqLwotcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCl7Ci0JcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKLX0KLS8qKgotICogQW5zd2VyIHRoZSBpbml0aWFsIGZpbGUgbmFtZQotICovCi1wdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCl7Ci0JcmV0dXJuIGZpbGVOYW1lOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIHByb2JsZW1zIChlcnJvcnMgYW5kIHdhcm5pbmdzKSBlbmNvdW50ZXJlZCBkdXJpbmcgY29tcGlsYXRpb24uCi0gKgotICogVGhpcyBpcyBub3QgYSBjb21waWxlciBpbnRlcm5hbCBBUEkgLSBpdCBoYXMgc2lkZS1lZmZlY3RzICEKLSAqIEl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBvbmNlIGFsbCBwcm9ibGVtcyBoYXZlIGJlZW4gZGV0ZWN0ZWQsCi0gKiBhbmQgbWFrZXMgc3VyZSB0aGUgcHJvYmxlbXMgc2xvdCBhcyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgbnVtYmVyIG9mCi0gKiBwcm9ibGVtcy4KLSAqLwotcHVibGljIElQcm9ibGVtW10gZ2V0UHJvYmxlbXMoKSB7CisKIAkKLQkvLyBSZS1hZGp1c3QgdGhlIHNpemUgb2YgdGhlIHByb2JsZW1zIGlmIG5lY2Vzc2FyeS4KLQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgewotCi0JCWlmICh0aGlzLnByb2JsZW1Db3VudCAhPSBwcm9ibGVtcy5sZW5ndGgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIChwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVtwcm9ibGVtQ291bnRdKSwgMCwgcHJvYmxlbUNvdW50KTsKKwlwdWJsaWMgSVByb2JsZW1bXSBnZXRBbGxQcm9ibGVtcygpIHsKKwkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHRoaXMuZ2V0UHJvYmxlbXMoKTsKKwkJaW50IHByb2JsZW1Db3VudCA9IHByb2JsZW1zICE9IG51bGwgPyBwcm9ibGVtcy5sZW5ndGggOiAwOworCQlJUHJvYmxlbVtdIHRhc2tzID0gdGhpcy5nZXRUYXNrcygpOworCQlpbnQgdGFza0NvdW50ID0gdGFza3MgIT0gbnVsbCA/IHRhc2tzLmxlbmd0aCA6IDA7CisJCWlmICh0YXNrQ291bnQgPT0gMCkgeworCQkJcmV0dXJuIHByb2JsZW1zOworCQl9CisJCWlmIChwcm9ibGVtQ291bnQgPT0gMCkgeworCQkJcmV0dXJuIHRhc2tzOwogCQl9CiAKLQkJaWYgKHRoaXMubWF4UHJvYmxlbVBlclVuaXQgPiAwICYmIHRoaXMucHJvYmxlbUNvdW50ID4gdGhpcy5tYXhQcm9ibGVtUGVyVW5pdCl7Ci0JCQlxdWlja1ByaW9yaXRpemUocHJvYmxlbXMsIDAsIHByb2JsZW1Db3VudCAtIDEpOwotCQkJdGhpcy5wcm9ibGVtQ291bnQgPSB0aGlzLm1heFByb2JsZW1QZXJVbml0OwotCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgKHByb2JsZW1zID0gbmV3IElQcm9ibGVtW3Byb2JsZW1Db3VudF0pLCAwLCBwcm9ibGVtQ291bnQpOworCQlpbnQgdG90YWxOdW1iZXJPZlByb2JsZW0gPSBwcm9ibGVtQ291bnQgKyB0YXNrQ291bnQ7CisJCUlQcm9ibGVtW10gYWxsUHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bdG90YWxOdW1iZXJPZlByb2JsZW1dOworCQlpbnQgYWxsUHJvYmxlbUluZGV4ID0gMDsKKwkJaW50IHRhc2tJbmRleCA9IDA7CisJCWludCBwcm9ibGVtSW5kZXggPSAwOworCQl3aGlsZSAodGFza0luZGV4ICsgcHJvYmxlbUluZGV4IDwgdG90YWxOdW1iZXJPZlByb2JsZW0pIHsKKwkJCUlQcm9ibGVtIG5leHRUYXNrID0gbnVsbDsKKwkJCUlQcm9ibGVtIG5leHRQcm9ibGVtID0gbnVsbDsKKwkJCWlmICh0YXNrSW5kZXggPCB0YXNrQ291bnQpIHsKKwkJCQluZXh0VGFzayA9IHRhc2tzW3Rhc2tJbmRleF07CisJCQl9CisJCQlpZiAocHJvYmxlbUluZGV4IDwgcHJvYmxlbUNvdW50KSB7CisJCQkJbmV4dFByb2JsZW0gPSBwcm9ibGVtc1twcm9ibGVtSW5kZXhdOworCQkJfQorCQkJLy8gc2VsZWN0IHRoZSBuZXh0IHByb2JsZW0KKwkJCUlQcm9ibGVtIGN1cnJlbnRQcm9ibGVtID0gbnVsbDsKKwkJCWlmIChuZXh0UHJvYmxlbSAhPSBudWxsKSB7CisJCQkJaWYgKG5leHRUYXNrICE9IG51bGwpIHsKKwkJCQkJaWYgKG5leHRQcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgPCBuZXh0VGFzay5nZXRTb3VyY2VTdGFydCgpKSB7CisJCQkJCQljdXJyZW50UHJvYmxlbSA9IG5leHRQcm9ibGVtOworCQkJCQkJcHJvYmxlbUluZGV4Kys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljdXJyZW50UHJvYmxlbSA9IG5leHRUYXNrOworCQkJCQkJdGFza0luZGV4Kys7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQljdXJyZW50UHJvYmxlbSA9IG5leHRQcm9ibGVtOworCQkJCQlwcm9ibGVtSW5kZXgrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChuZXh0VGFzayAhPSBudWxsKSB7CisJCQkJCWN1cnJlbnRQcm9ibGVtID0gbmV4dFRhc2s7CisJCQkJCXRhc2tJbmRleCsrOworCQkJCX0KKwkJCX0KKwkJCWFsbFByb2JsZW1zW2FsbFByb2JsZW1JbmRleCsrXSA9IGN1cnJlbnRQcm9ibGVtOwogCQl9Ci0KLQkJLy8gU29ydCBwcm9ibGVtcyBwZXIgc291cmNlIHBvc2l0aW9ucy4KLQkJcXVpY2tzb3J0KHByb2JsZW1zLCAwLCBwcm9ibGVtcy5sZW5ndGgtMSk7CisJCXJldHVybiBhbGxQcm9ibGVtczsKIAl9Ci0JcmV0dXJuIHByb2JsZW1zOwotfQotCi1wdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0JaWYgKHByb2JsZW1zICE9IG51bGwpCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbUNvdW50OyBpKyspIHsKLQkJCWlmIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkpCi0JCQkJcmV0dXJuIHRydWU7CisJCisJcHVibGljIENsYXNzRmlsZVtdIGdldENsYXNzRmlsZXMoKSB7CisJCUVudW1lcmF0aW9uIGVudW0gPSBjb21waWxlZFR5cGVzLmVsZW1lbnRzKCk7CisJCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBuZXcgQ2xhc3NGaWxlW2NvbXBpbGVkVHlwZXMuc2l6ZSgpXTsKKwkJaW50IGluZGV4ID0gMDsKKwkJd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpeworCQkJY2xhc3NGaWxlc1tpbmRleCsrXSA9IChDbGFzc0ZpbGUpZW51bS5uZXh0RWxlbWVudCgpOwogCQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGJvb2xlYW4gaGFzUHJvYmxlbXMoKSB7Ci0JcmV0dXJuIHByb2JsZW1Db3VudCAhPSAwOwotfQotcHVibGljIGJvb2xlYW4gaGFzV2FybmluZ3MoKSB7Ci0JaWYgKHByb2JsZW1zICE9IG51bGwpCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbUNvdW50OyBpKyspIHsKLQkJCWlmIChwcm9ibGVtc1tpXS5pc1dhcm5pbmcoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCXJldHVybiBmYWxzZTsKLX0KLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja3NvcnQoSVByb2JsZW0gYXJyW10sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQlpbnQgaSwgbGFzdCwgcG9zOwotCi0JaWYgKGxlZnQgPj0gcmlnaHQpIHsKLQkJLyogZG8gbm90aGluZyBpZiBhcnJheSBjb250YWlucyBmZXdlciB0aGFuIHR3byAqLwotCQlyZXR1cm47Ci0JCS8qIHR3byBlbGVtZW50cyAqLworCQlyZXR1cm4gY2xhc3NGaWxlczsJCiAJfQogCi0Jc3dhcChhcnIsIGxlZnQsIChsZWZ0ICsgcmlnaHQpIC8gMik7Ci0JbGFzdCA9IGxlZnQ7Ci0JcG9zID0gYXJyW2xlZnRdLmdldFNvdXJjZVN0YXJ0KCk7CisJLyoqCisJICogQW5zd2VyIHRoZSBpbml0aWFsIGNvbXBpbGF0aW9uIHVuaXQgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlc2VudCBjb21waWxhdGlvbiByZXN1bHQKKwkgKi8KKwlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKXsKKwkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKKwl9CiAKLQlmb3IgKGkgPSBsZWZ0ICsgMTsgaSA8PSByaWdodDsgaSsrKSB7Ci0JCWlmIChhcnJbaV0uZ2V0U291cmNlU3RhcnQoKSA8IHBvcykgewotCQkJc3dhcChhcnIsICsrbGFzdCwgaSk7CisJLyoqCisJICogQW5zd2VyIHRoZSBpbml0aWFsIGZpbGUgbmFtZQorCSAqLworCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKXsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KKwkKKwkvKioKKwkgKiBBbnN3ZXIgdGhlIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgY29tcGlsYXRpb24uCisJICovCisJcHVibGljIElQcm9ibGVtW10gZ2V0RXJyb3JzKCkgeworCQorCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gZ2V0UHJvYmxlbXMoKTsKKwkJaW50IGVycm9yQ291bnQgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJvYmxlbUNvdW50OyBpKyspIHsKKwkJCWlmIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkpIGVycm9yQ291bnQrKzsKIAkJfQotCX0KLQotCXN3YXAoYXJyLCBsZWZ0LCBsYXN0KTsKLQlxdWlja3NvcnQoYXJyLCBsZWZ0LCBsYXN0IC0gMSk7Ci0JcXVpY2tzb3J0KGFyciwgbGFzdCArIDEsIHJpZ2h0KTsKLX0KLQotcHJpdmF0ZSB2b2lkIHF1aWNrUHJpb3JpdGl6ZShJUHJvYmxlbSBhcnJbXSwgaW50IGxlZnQsIGludCByaWdodCkgewotCWludCBpLCBsYXN0LCBwcmlvOwotCi0JaWYgKGxlZnQgPj0gcmlnaHQpIHsKLQkJLyogZG8gbm90aGluZyBpZiBhcnJheSBjb250YWlucyBmZXdlciB0aGFuIHR3byAqLwotCQlyZXR1cm47Ci0JCS8qIHR3byBlbGVtZW50cyAqLwotCX0KLQotCXN3YXAoYXJyLCBsZWZ0LCAobGVmdCArIHJpZ2h0KSAvIDIpOwotCWxhc3QgPSBsZWZ0OwotCXByaW8gPSBjb21wdXRlUHJpb3JpdHkoYXJyW2xlZnRdKTsKLQotCWZvciAoaSA9IGxlZnQgKyAxOyBpIDw9IHJpZ2h0OyBpKyspIHsKLQkJaWYgKGNvbXB1dGVQcmlvcml0eShhcnJbaV0pID4gcHJpbykgewotCQkJc3dhcChhcnIsICsrbGFzdCwgaSk7CisJCWlmIChlcnJvckNvdW50ID09IHRoaXMucHJvYmxlbUNvdW50KSByZXR1cm4gcHJvYmxlbXM7CisJCUlQcm9ibGVtW10gZXJyb3JzID0gbmV3IElQcm9ibGVtW2Vycm9yQ291bnRdOworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJvYmxlbUNvdW50OyBpKyspIHsKKwkJCWlmIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkpIGVycm9yc1tpbmRleCsrXSA9IHByb2JsZW1zW2ldOwogCQl9CisJCXJldHVybiBlcnJvcnM7CisJfQorCQorCS8qKgorCSAqIEFuc3dlciB0aGUgcHJvYmxlbXMgKGVycm9ycyBhbmQgd2FybmluZ3MpIGVuY291bnRlcmVkIGR1cmluZyBjb21waWxhdGlvbi4KKwkgKgorCSAqIFRoaXMgaXMgbm90IGEgY29tcGlsZXIgaW50ZXJuYWwgQVBJIC0gaXQgaGFzIHNpZGUtZWZmZWN0cyAhCisJICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IG9uY2UgYWxsIHByb2JsZW1zIGhhdmUgYmVlbiBkZXRlY3RlZCwKKwkgKiBhbmQgbWFrZXMgc3VyZSB0aGUgcHJvYmxlbXMgc2xvdCBhcyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgbnVtYmVyIG9mCisJICogcHJvYmxlbXMuCisJICovCisJcHVibGljIElQcm9ibGVtW10gZ2V0UHJvYmxlbXMoKSB7CisJCQorCQkvLyBSZS1hZGp1c3QgdGhlIHNpemUgb2YgdGhlIHByb2JsZW1zIGlmIG5lY2Vzc2FyeS4KKwkJaWYgKHByb2JsZW1zICE9IG51bGwpIHsKKwkKKwkJCWlmICh0aGlzLnByb2JsZW1Db3VudCAhPSBwcm9ibGVtcy5sZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCAocHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bcHJvYmxlbUNvdW50XSksIDAsIHByb2JsZW1Db3VudCk7CisJCQl9CisJCisJCQlpZiAodGhpcy5tYXhQcm9ibGVtUGVyVW5pdCA+IDAgJiYgdGhpcy5wcm9ibGVtQ291bnQgPiB0aGlzLm1heFByb2JsZW1QZXJVbml0KXsKKwkJCQlxdWlja1ByaW9yaXRpemUocHJvYmxlbXMsIDAsIHByb2JsZW1Db3VudCAtIDEpOworCQkJCXRoaXMucHJvYmxlbUNvdW50ID0gdGhpcy5tYXhQcm9ibGVtUGVyVW5pdDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCAocHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bcHJvYmxlbUNvdW50XSksIDAsIHByb2JsZW1Db3VudCk7CisJCQl9CisJCisJCQkvLyBTb3J0IHByb2JsZW1zIHBlciBzb3VyY2UgcG9zaXRpb25zLgorCQkJcXVpY2tTb3J0KHByb2JsZW1zLCAwLCBwcm9ibGVtcy5sZW5ndGgtMSk7CisJCX0KKwkJcmV0dXJuIHByb2JsZW1zOwogCX0KIAotCXN3YXAoYXJyLCBsZWZ0LCBsYXN0KTsKLQlxdWlja1ByaW9yaXRpemUoYXJyLCBsZWZ0LCBsYXN0IC0gMSk7Ci0JcXVpY2tQcmlvcml0aXplKGFyciwgbGFzdCArIDEsIHJpZ2h0KTsKLX0KKwkvKioKKwkgKiBBbnN3ZXIgdGhlIHRhc2tzIChUTy1ETywgLi4uKSBlbmNvdW50ZXJlZCBkdXJpbmcgY29tcGlsYXRpb24uCisJICoKKwkgKiBUaGlzIGlzIG5vdCBhIGNvbXBpbGVyIGludGVybmFsIEFQSSAtIGl0IGhhcyBzaWRlLWVmZmVjdHMgIQorCSAqIEl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBvbmNlIGFsbCBwcm9ibGVtcyBoYXZlIGJlZW4gZGV0ZWN0ZWQsCisJICogYW5kIG1ha2VzIHN1cmUgdGhlIHByb2JsZW1zIHNsb3QgYXMgdGhlIGV4YWN0IHNpemUgb2YgdGhlIG51bWJlciBvZgorCSAqIHByb2JsZW1zLgorCSAqLworCXB1YmxpYyBJUHJvYmxlbVtdIGdldFRhc2tzKCkgeworCQkKKwkJLy8gUmUtYWRqdXN0IHRoZSBzaXplIG9mIHRoZSB0YXNrcyBpZiBuZWNlc3NhcnkuCisJCWlmICh0aGlzLnRhc2tzICE9IG51bGwpIHsKKwkKKwkJCWlmICh0aGlzLnRhc2tDb3VudCAhPSB0aGlzLnRhc2tzLmxlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50YXNrcywgMCwgKHRoaXMudGFza3MgPSBuZXcgSVByb2JsZW1bdGhpcy50YXNrQ291bnRdKSwgMCwgdGhpcy50YXNrQ291bnQpOworCQkJfQorCQkJcXVpY2tTb3J0KHRhc2tzLCAwLCB0YXNrcy5sZW5ndGgtMSk7CisJCX0KKwkJcmV0dXJuIHRoaXMudGFza3M7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKIAotLyoqCi0gKiBGb3Igbm93LCByZW1lbWJlciB0aGUgY29tcGlsZWQgdHlwZSB1c2luZyBpdHMgY29tcG91bmQgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgcmVjb3JkKGNoYXJbXSB0eXBlTmFtZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgewotCWNvbXBpbGVkVHlwZXMucHV0KHR5cGVOYW1lLCBjbGFzc0ZpbGUpOwotfQotcHVibGljIHZvaWQgcmVjb3JkKElQcm9ibGVtIG5ld1Byb2JsZW0sIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCkgewotCWlmIChwcm9ibGVtQ291bnQgPT0gMCkgewotCQlwcm9ibGVtcyA9IG5ldyBJUHJvYmxlbVs1XTsKLQl9IGVsc2UgewotCQlpZiAocHJvYmxlbUNvdW50ID09IHByb2JsZW1zLmxlbmd0aCkKKwkJaWYgKHByb2JsZW1zICE9IG51bGwpCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1Db3VudDsgaSsrKSB7CisJCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtcygpIHsKKworCQlyZXR1cm4gcHJvYmxlbUNvdW50ICE9IDA7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzU3ludGF4RXJyb3IoKXsKKworCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbUNvdW50OyBpKyspIHsKKwkJCQlJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXNbaV07CisJCQkJaWYgKChwcm9ibGVtLmdldElEKCkgJiBJUHJvYmxlbS5TeW50YXgpICE9IDAgJiYgcHJvYmxlbS5pc0Vycm9yKCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzVGFza3MoKSB7CisJCXJldHVybiB0aGlzLnRhc2tDb3VudCAhPSAwOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNXYXJuaW5ncygpIHsKKworCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbUNvdW50OyBpKyspIHsKKwkJCQlpZiAocHJvYmxlbXNbaV0uaXNXYXJuaW5nKCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KElQcm9ibGVtW10gbGlzdCwgaW50IGxlZnQsIGludCByaWdodCkgeworCisJCWlmIChsZWZ0ID49IHJpZ2h0KSByZXR1cm47CisJCisJCS8vIHNvcnQgdGhlIHByb2JsZW1zIGJ5IHRoZWlyIHNvdXJjZSBzdGFydCBwb3NpdGlvbi4uLiBzdGFydGluZyB3aXRoIDAKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJaW50IG1pZCA9IGxpc3RbKGxlZnQgKyByaWdodCkgLyAyXS5nZXRTb3VyY2VTdGFydCgpOworCQlkbyB7CisJCQl3aGlsZSAobGlzdFtsZWZ0XS5nZXRTb3VyY2VTdGFydCgpIDwgbWlkKQorCQkJCWxlZnQrKzsKKwkJCXdoaWxlIChtaWQgPCBsaXN0W3JpZ2h0XS5nZXRTb3VyY2VTdGFydCgpKQorCQkJCXJpZ2h0LS07CisJCQlpZiAobGVmdCA8PSByaWdodCkgeworCQkJCUlQcm9ibGVtIHRtcCA9IGxpc3RbbGVmdF07CisJCQkJbGlzdFtsZWZ0XSA9IGxpc3RbcmlnaHRdOworCQkJCWxpc3RbcmlnaHRdID0gdG1wOworCQkJCWxlZnQrKzsKKwkJCQlyaWdodC0tOworCQkJfQorCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwkJaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkKKwkJCXF1aWNrU29ydChsaXN0LCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpCisJCQlxdWlja1NvcnQobGlzdCwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcXVpY2tQcmlvcml0aXplKElQcm9ibGVtW10gbGlzdCwgaW50IGxlZnQsIGludCByaWdodCkgeworCQkKKwkJaWYgKGxlZnQgPj0gcmlnaHQpIHJldHVybjsKKwkKKwkJLy8gc29ydCB0aGUgcHJvYmxlbXMgYnkgdGhlaXIgcHJpb3JpdHkuLi4gc3RhcnRpbmcgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eQorCQlpbnQgb3JpZ2luYWxfbGVmdCA9IGxlZnQ7CisJCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OworCQlpbnQgbWlkID0gY29tcHV0ZVByaW9yaXR5KGxpc3RbKGxlZnQgKyByaWdodCkgLyAyXSk7CisJCWRvIHsKKwkJCXdoaWxlIChjb21wdXRlUHJpb3JpdHkobGlzdFtyaWdodF0pIDwgbWlkKQorCQkJCXJpZ2h0LS07CisJCQl3aGlsZSAobWlkIDwgY29tcHV0ZVByaW9yaXR5KGxpc3RbbGVmdF0pKQorCQkJCWxlZnQrKzsKKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJSVByb2JsZW0gdG1wID0gbGlzdFtsZWZ0XTsKKwkJCQlsaXN0W2xlZnRdID0gbGlzdFtyaWdodF07CisJCQkJbGlzdFtyaWdodF0gPSB0bXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQorCQkJcXVpY2tQcmlvcml0aXplKGxpc3QsIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkKKwkJCXF1aWNrUHJpb3JpdGl6ZShsaXN0LCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7CisJfQorCQorCS8qKgorCSAqIEZvciBub3csIHJlbWVtYmVyIHRoZSBjb21waWxlZCB0eXBlIHVzaW5nIGl0cyBjb21wb3VuZCBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHJlY29yZChjaGFyW10gdHlwZU5hbWUsIENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKworCQljb21waWxlZFR5cGVzLnB1dCh0eXBlTmFtZSwgY2xhc3NGaWxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmQoSVByb2JsZW0gbmV3UHJvYmxlbSwgUmVmZXJlbmNlQ29udGV4dCByZWZlcmVuY2VDb250ZXh0KSB7CisKKwkJaWYgKG5ld1Byb2JsZW0uZ2V0SUQoKSA9PSBJUHJvYmxlbS5UYXNrKSB7CisJCQlyZWNvcmRUYXNrKG5ld1Byb2JsZW0pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChwcm9ibGVtQ291bnQgPT0gMCkgeworCQkJcHJvYmxlbXMgPSBuZXcgSVByb2JsZW1bNV07CisJCX0gZWxzZSBpZiAocHJvYmxlbUNvdW50ID09IHByb2JsZW1zLmxlbmd0aCkgewogCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgKHByb2JsZW1zID0gbmV3IElQcm9ibGVtW3Byb2JsZW1Db3VudCAqIDJdKSwgMCwgcHJvYmxlbUNvdW50KTsKLQl9OwotCXByb2JsZW1zW3Byb2JsZW1Db3VudCsrXSA9IG5ld1Byb2JsZW07Ci0JaWYgKHJlZmVyZW5jZUNvbnRleHQgIT0gbnVsbCl7Ci0JCWlmIChwcm9ibGVtc01hcCA9PSBudWxsKSBwcm9ibGVtc01hcCA9IG5ldyBIYXNodGFibGUoNSk7Ci0JCWlmIChmaXJzdEVycm9yc01hcCA9PSBudWxsKSBmaXJzdEVycm9yc01hcCA9IG5ldyBIYXNodGFibGUoNSk7Ci0JCWlmIChuZXdQcm9ibGVtLmlzRXJyb3IoKSAmJiAhcmVmZXJlbmNlQ29udGV4dC5oYXNFcnJvcnMoKSkgZmlyc3RFcnJvcnNNYXAucHV0KG5ld1Byb2JsZW0sIG5ld1Byb2JsZW0pOwotCQlwcm9ibGVtc01hcC5wdXQobmV3UHJvYmxlbSwgcmVmZXJlbmNlQ29udGV4dCk7CisJCX0KKwkJcHJvYmxlbXNbcHJvYmxlbUNvdW50KytdID0gbmV3UHJvYmxlbTsKKwkJaWYgKHJlZmVyZW5jZUNvbnRleHQgIT0gbnVsbCl7CisJCQlpZiAocHJvYmxlbXNNYXAgPT0gbnVsbCkgcHJvYmxlbXNNYXAgPSBuZXcgSGFzaHRhYmxlKDUpOworCQkJaWYgKGZpcnN0RXJyb3JzTWFwID09IG51bGwpIGZpcnN0RXJyb3JzTWFwID0gbmV3IEhhc2h0YWJsZSg1KTsKKwkJCWlmIChuZXdQcm9ibGVtLmlzRXJyb3IoKSAmJiAhcmVmZXJlbmNlQ29udGV4dC5oYXNFcnJvcnMoKSkgZmlyc3RFcnJvcnNNYXAucHV0KG5ld1Byb2JsZW0sIG5ld1Byb2JsZW0pOworCQkJcHJvYmxlbXNNYXAucHV0KG5ld1Byb2JsZW0sIHJlZmVyZW5jZUNvbnRleHQpOworCQl9CiAJfQotfQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBzd2FwKElQcm9ibGVtIGFycltdLCBpbnQgaSwgaW50IGopIHsKLQlJUHJvYmxlbSB0bXA7Ci0JdG1wID0gYXJyW2ldOwotCWFycltpXSA9IGFycltqXTsKLQlhcnJbal0gPSB0bXA7Ci19Ci1Db21waWxhdGlvblJlc3VsdCB0YWdBc0FjY2VwdGVkKCl7Ci0JdGhpcy5oYXNCZWVuQWNjZXB0ZWQgPSB0cnVlOwotCXRoaXMucHJvYmxlbXNNYXAgPSBudWxsOyAvLyBmbHVzaAotCXJldHVybiB0aGlzOwotfQogCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlpZiAodGhpcy5maWxlTmFtZSAhPSBudWxsKXsKLQkJYnVmZmVyLmFwcGVuZCgiRmlsZW5hbWUgOiAiKS5hcHBlbmQodGhpcy5maWxlTmFtZSkuYXBwZW5kKCdcbicpOyAvLyROT04tTkxTLTEkCi0JfQotCWlmICh0aGlzLmNvbXBpbGVkVHlwZXMgIT0gbnVsbCl7Ci0JCWJ1ZmZlci5hcHBlbmQoIkNPTVBJTEVEIHR5cGUocykJXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24gdHlwZU5hbWVzID0gdGhpcy5jb21waWxlZFR5cGVzLmtleXMoKTsKLQkJd2hpbGUgKHR5cGVOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJY2hhcltdIHR5cGVOYW1lID0gKGNoYXJbXSkgdHlwZU5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcdCAtICIpLmFwcGVuZCh0eXBlTmFtZSkuYXBwZW5kKCdcbicpOyAgIC8vJE5PTi1OTFMtMSQKLQkJCQorCXByaXZhdGUgdm9pZCByZWNvcmRUYXNrKElQcm9ibGVtIG5ld1Byb2JsZW0pIHsKKwkJaWYgKHRoaXMudGFza0NvdW50ID09IDApIHsKKwkJCXRoaXMudGFza3MgPSBuZXcgSVByb2JsZW1bNV07CisJCX0gZWxzZSBpZiAodGhpcy50YXNrQ291bnQgPT0gdGhpcy50YXNrcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy50YXNrcywgMCwgKHRoaXMudGFza3MgPSBuZXcgSVByb2JsZW1bdGhpcy50YXNrQ291bnQgKiAyXSksIDAsIHRoaXMudGFza0NvdW50KTsKIAkJfQotCX0gZWxzZSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIk5vIENPTVBJTEVEIHR5cGVcbiIpOyAgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnRhc2tzW3RoaXMudGFza0NvdW50KytdID0gbmV3UHJvYmxlbTsKIAl9Ci0JaWYgKHByb2JsZW1zICE9IG51bGwpewotCQlidWZmZXIuYXBwZW5kKHRoaXMucHJvYmxlbUNvdW50KS5hcHBlbmQoIiBQUk9CTEVNKHMpIGRldGVjdGVkIFxuIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtQ291bnQ7IGkrKyl7Ci0JCQlidWZmZXIuYXBwZW5kKCJcdCAtICIpLmFwcGVuZCh0aGlzLnByb2JsZW1zW2ldKS5hcHBlbmQoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQgdGFnQXNBY2NlcHRlZCgpeworCisJCXRoaXMuaGFzQmVlbkFjY2VwdGVkID0gdHJ1ZTsKKwkJdGhpcy5wcm9ibGVtc01hcCA9IG51bGw7IC8vIGZsdXNoCisJCXJldHVybiB0aGlzOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaWYgKHRoaXMuZmlsZU5hbWUgIT0gbnVsbCl7CisJCQlidWZmZXIuYXBwZW5kKCJGaWxlbmFtZSA6ICIpLmFwcGVuZCh0aGlzLmZpbGVOYW1lKS5hcHBlbmQoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKIAkJfQotCX0gZWxzZSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIk5vIFBST0JMRU1cbiIpOyAvLyROT04tTkxTLTEkCi0JfSAKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19CisJCWlmICh0aGlzLmNvbXBpbGVkVHlwZXMgIT0gbnVsbCl7CisJCQlidWZmZXIuYXBwZW5kKCJDT01QSUxFRCB0eXBlKHMpCVxuIik7ICAvLyROT04tTkxTLTEkCisJCQlFbnVtZXJhdGlvbiB0eXBlTmFtZXMgPSB0aGlzLmNvbXBpbGVkVHlwZXMua2V5cygpOworCQkJd2hpbGUgKHR5cGVOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCWNoYXJbXSB0eXBlTmFtZSA9IChjaGFyW10pIHR5cGVOYW1lcy5uZXh0RWxlbWVudCgpOworCQkJCWJ1ZmZlci5hcHBlbmQoIlx0IC0gIikuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoJ1xuJyk7ICAgLy8kTk9OLU5MUy0xJAorCQkJCQorCQkJfQorCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZCgiTm8gQ09NUElMRUQgdHlwZVxuIik7ICAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKHByb2JsZW1zICE9IG51bGwpeworCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnByb2JsZW1Db3VudCkuYXBwZW5kKCIgUFJPQkxFTShzKSBkZXRlY3RlZCBcbiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW1Db3VudDsgaSsrKXsKKwkJCQlidWZmZXIuYXBwZW5kKCJcdCAtICIpLmFwcGVuZCh0aGlzLnByb2JsZW1zW2ldKS5hcHBlbmQoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIk5vIFBST0JMRU1cbiIpOyAvLyROT04tTkxTLTEkCisJCX0gCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29tcGlsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhCmluZGV4IGI5MmUxMzIuLjYwN2E5OTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db21waWxlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKQEAgLTI0LDE0ICsyNCwxNCBAQAogCiBwdWJsaWMgY2xhc3MgQ29tcGlsZXIgaW1wbGVtZW50cyBJVHlwZVJlcXVlc3RvciwgUHJvYmxlbVNldmVyaXRpZXMgewogCXB1YmxpYyBQYXJzZXIgcGFyc2VyOwotCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3I7CisJcHVibGljIElDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3I7CiAJcHVibGljIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogCXB1YmxpYyBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyOwogCiAJLy8gbWFuYWdlbWVudCBvZiB1bml0IHRvIGJlIHByb2Nlc3NlZAogCS8vcHVibGljIENvbXBpbGF0aW9uVW5pdFJlc3VsdCBjdXJyZW50Q29tcGlsYXRpb25Vbml0UmVzdWx0OwotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW10gdW5pdHNUb1Byb2Nlc3M7Ci0JaW50IHRvdGFsVW5pdHM7IC8vICh0b3RhbFVuaXRzLTEpIGdpdmVzIHRoZSBsYXN0IHVuaXQgaW4gdW5pdFRvUHJvY2VzcworCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbltdIHVuaXRzVG9Qcm9jZXNzOworCXB1YmxpYyBpbnQgdG90YWxVbml0czsgLy8gKHRvdGFsVW5pdHMtMSkgZ2l2ZXMgdGhlIGxhc3QgdW5pdCBpbiB1bml0VG9Qcm9jZXNzCiAKIAkvLyBuYW1lIGxvb2t1cAogCXB1YmxpYyBMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudDsKQEAgLTExMyw3ICsxMTMsNyBAQAogCQkJbmV3IFBhcnNlcigKIAkJCQlwcm9ibGVtUmVwb3J0ZXIsIAogCQkJCXRoaXMub3B0aW9ucy5wYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzLCAKLQkJCQl0aGlzLm9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KTsKIAl9CiAJCiAJLyoqCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJCW5ldyBQYXJzZXIoCiAJCQkJcHJvYmxlbVJlcG9ydGVyLCAKIAkJCQlwYXJzZUxpdGVyYWxFeHByZXNzaW9uc0FzQ29uc3RhbnRzLCAKLQkJCQl0aGlzLm9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJCQkJdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpOwogCX0KIAkKIAkvKioKQEAgLTIxMiwxMiArMjEyLDEzIEBACiAJCQl9CiAKIAkJCWlmIChvcHRpb25zLnZlcmJvc2UpIHsKKwkJCQlTdHJpbmcgY291bnQgPSBTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSk7CiAJCQkJU3lzdGVtLm91dC5wcmludGxuKAogCQkJCQlVdGlsLmJpbmQoCiAJCQkJCQkiY29tcGlsYXRpb24ucmVxdWVzdCIgLCAvLyROT04tTkxTLTEkCiAJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCVN0cmluZy52YWx1ZU9mKHRvdGFsVW5pdHMgKyAxKSwKLQkJCQkJCQlTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzICsgMSksCisJCQkJCQkJY291bnQsCisJCQkJCQkJY291bnQsCiAJCQkJCQkJbmV3IFN0cmluZyhzb3VyY2VVbml0LmdldEZpbGVOYW1lKCkpfSkpOwogCQkJfQogCkBAIC00MTYsMTYgKzQxNywxOSBAQAogCQkJaW50ZXJuYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CiAJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gc3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpOwogCisJCQlTdHJpbmdbXSBwYkFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7CisJCQkJVXRpbC5iaW5kKCJjb21waWxhdGlvbi5pbnRlcm5hbEVycm9yIiApIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyAiXG4iICAvLyROT04tTkxTLTEkCisJCQkJCSsgYnVmZmVyLnRvU3RyaW5nKCl9OworCiAJCQlyZXN1bHQKIAkJCQkucmVjb3JkKAogCQkJCQlwcm9ibGVtUmVwb3J0ZXIKIAkJCQkJLmNyZWF0ZVByb2JsZW0oCiAJCQkJCQlyZXN1bHQuZ2V0RmlsZU5hbWUoKSwKIAkJCQkJCUlQcm9ibGVtLlVuY2xhc3NpZmllZCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJVXRpbC5iaW5kKCJjb21waWxhdGlvbi5pbnRlcm5hbEVycm9yIiApIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiXG4iICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgYnVmZmVyLnRvU3RyaW5nKCl9LAorCQkJCQkJcGJBcmd1bWVudHMsCisJCQkJCQlwYkFyZ3VtZW50cywKIAkJCQkJCUVycm9yLCAvLyBzZXZlcml0eQogCQkJCQkJMCwgLy8gc291cmNlIHN0YXJ0CiAJCQkJCQkwLCAvLyBzb3VyY2UgZW5kCkBAIC00NzcsNiArNDgxLDcgQEAKIAkJCQkJCQlyZXN1bHQuZ2V0RmlsZU5hbWUoKSwKIAkJCQkJCQlhYm9ydEV4Y2VwdGlvbi5wcm9ibGVtSWQsCiAJCQkJCQkJYWJvcnRFeGNlcHRpb24ucHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJCQlhYm9ydEV4Y2VwdGlvbi5tZXNzYWdlQXJndW1lbnRzLAogCQkJCQkJCUVycm9yLCAvLyBzZXZlcml0eQogCQkJCQkJCTAsIC8vIHNvdXJjZSBzdGFydAogCQkJCQkJCTAsIC8vIHNvdXJjZSBlbmQKQEAgLTUxNyw3ICs1MjIsNyBAQAogCS8qKgogCSAqIFByb2Nlc3MgYSBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgcGFyc2VkIGFuZCBidWlsZC4KIAkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2VzcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBpbnQgaSkgeworCXB1YmxpYyB2b2lkIHByb2Nlc3MoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IGkpIHsKIAogCQlnZXRNZXRob2RCb2RpZXModW5pdCwgaSk7CiAKQEAgLTU1Myw5ICs1NTgsMTQgQEAKIAl9CiAKIAkvKioKLQkgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgY29tcGlsYXRpb24gdW5pdCBtaW5pbWFsbHkgZm9yIGNvZGUgYXNzaXN0IGVuZ2luZQorCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBnaXZlbiBjb21waWxhdGlvbiB1bml0LiBDYW4gcnVuIGEgc3Vic2V0IG9mIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzCiAJICovCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlc29sdmUoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0KSB7CisJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlc29sdmUoCisJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIAorCQkJYm9vbGVhbiB2ZXJpZnlNZXRob2RzLAorCQkJYm9vbGVhbiBhbmFseXplQ29kZSwKKwkJCWJvb2xlYW4gZ2VuZXJhdGVDb2RlKSB7CisJCQkJCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOwogCQl0cnkgewogCQkJLy8gYnVpbGQgYW5kIHJlY29yZCBwYXJzZWQgdW5pdHMKQEAgLTU2Nyw4ICs1NzcsMTkgQEAKIAkJCWlmICh1bml0LnNjb3BlICE9IG51bGwpIHsKIAkJCQkvLyBmYXVsdCBpbiBmaWVsZHMgJiBtZXRob2RzCiAJCQkJdW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKKwkJCQlpZiAodW5pdC5zY29wZSAhPSBudWxsICYmIHZlcmlmeU1ldGhvZHMpIHsKKwkJCQkJLy8gaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzExNworIAkJCQkJLy8gdmVyaWZ5IGluaGVyaXRlZCBtZXRob2RzCisJCQkJCXVuaXQuc2NvcGUudmVyaWZ5TWV0aG9kcyhsb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsKKwkJCQl9CiAJCQkJLy8gdHlwZSBjaGVja2luZwotCQkJCXVuaXQucmVzb2x2ZSgpOworCQkJCXVuaXQucmVzb2x2ZSgpOwkJCisKKwkJCQkvLyBmbG93IGFuYWx5c2lzCisJCQkJaWYgKGFuYWx5emVDb2RlKSB1bml0LmFuYWx5c2VDb2RlKCk7CisJCQorCQkJCS8vIGNvZGUgZ2VuZXJhdGlvbgorCQkJCWlmIChnZW5lcmF0ZUNvZGUpIHVuaXQuZ2VuZXJhdGVDb2RlKCk7CiAJCQl9CiAJCQl1bml0c1RvUHJvY2Vzc1swXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCB1bml0IGRlY2xhcmF0aW9uCiAJCQlyZXF1ZXN0b3IuYWNjZXB0UmVzdWx0KHVuaXQuY29tcGlsYXRpb25SZXN1bHQudGFnQXNBY2NlcHRlZCgpKTsKQEAgLTU5Miw0ICs2MTMsNCBAQAogCQkJLy8gdGhpcy5yZXNldCgpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Db25maWd1cmFibGVPcHRpb24uamF2YQppbmRleCBjMGE3NGQyLi5jODA2ZWQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvQ29uZmlndXJhYmxlT3B0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0NvbmZpZ3VyYWJsZU9wdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiAvKioKQEAgLTU0LDcgKzU0LDcgQEAKIAlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IG51bGw7CiAJdHJ5IHsKIAkJU3RyaW5nIGxvY2F0aW9uID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQkJcmVzb3VyY2UgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUobG9jYXRpb24gKyAiLk9wdGlvbnMiLCBsb2MpOyAvLyROT04tTkxTLTEkCisJCXJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGxvY2F0aW9uICsgIi5vcHRpb25zIiwgbG9jKTsgLy8kTk9OLU5MUy0xJAogCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CiAJCWNhdGVnb3J5ID0gIk1pc3NpbmcgcmVzc291cmNlcyBlbnRyaWVzIGZvciIgKyBjb21wb25lbnROYW1lICsgIiBvcHRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCW5hbWUgPSAiTWlzc2luZyByZXNzb3VyY2VzIGVudHJpZXMgZm9yIisgY29tcG9uZW50TmFtZSArICIgb3B0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmphdmEKaW5kZXggMjUwMDI4MS4uNjAyOTI1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiBwdWJsaWMgY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcyB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvRG9jdW1lbnRFbGVtZW50UGFyc2VyLmphdmEKaW5kZXggZDU3ZmI5MS4uMjRiNjE2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0RvY3VtZW50RWxlbWVudFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Eb2N1bWVudEVsZW1lbnRQYXJzZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogLyoKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKIAogcHVibGljIGNsYXNzIERvY3VtZW50RWxlbWVudFBhcnNlciBleHRlbmRzIFBhcnNlciB7CiAJSURvY3VtZW50RWxlbWVudFJlcXVlc3RvciByZXF1ZXN0b3I7CkBAIC02NCw3ICs2Myw3IEBACiAJCX0KIAl9LAogCWZhbHNlLAotCW9wdGlvbnMuYXNzZXJ0TW9kZSk7CisJb3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KTsKIAl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKIAlpbnRBcnJheVN0YWNrID0gbmV3IGludFszMF1bXTsKIAl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwpAQCAtOTAsNDcgKzg5LDM0IEBACiAJcHVzaE9uSW50QXJyYXlTdGFjayh0aGlzLmdldEphdmFEb2NQb3NpdGlvbnMoKSk7CiAJYm9vbGVhbiBkZXByZWNhdGVkID0gZmFsc2U7CiAJaW50IGxhc3RBbm5vdGF0aW9uSW5kZXggPSAtMTsKKwlpbnQgY29tbWVudFB0ciA9IHNjYW5uZXIuY29tbWVudFB0cjsKIAogCS8vc2luY2UgamRrMS4yIGxvb2sgb25seSBpbiB0aGUgbGFzdCBqYXZhIGRvYyBjb21tZW50Li4uCi0JZm91bmQgOiB7Ci0JCWlmICgobGFzdEFubm90YXRpb25JbmRleCA9IHNjYW5uZXIuY29tbWVudFB0cikgPj0gMCkgeyAvL2xvb2sgZm9yIEBkZXByZWNhdGVkCi0JCQlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKLQkJCS8vIHJlc2V0IHRoZSBjb21tZW50IHN0YWNrLCBzaW5jZSBub3QgbmVjZXNzYXJ5IGFmdGVyIGhhdmluZyBjaGVja2VkCi0JCQlpbnQgY29tbWVudFNvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jb21tZW50U3RhcnRzW2xhc3RBbm5vdGF0aW9uSW5kZXhdOwotCQkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucy4pCi0JCQlpbnQgY29tbWVudFNvdXJjZUVuZCA9IHNjYW5uZXIuY29tbWVudFN0b3BzW2xhc3RBbm5vdGF0aW9uSW5kZXhdIC0gMTsKLQkJCS8vc3RvcCBpcyBvbmUgb3ZlcgotCQkJY2hhcltdIGNvbW1lbnQgPSBzY2FubmVyLnNvdXJjZTsKLQotCQkJZm9yIChpbnQgaSA9IGNvbW1lbnRTb3VyY2VTdGFydCArIDM7IGkgPCBjb21tZW50U291cmNlRW5kIC0gMTA7IGkrKykgewotCQkJCWlmICgoY29tbWVudFtpXSA9PSAnQCcpCi0JCQkJCSYmIChjb21tZW50W2kgKyAxXSA9PSAnZCcpCi0JCQkJCSYmIChjb21tZW50W2kgKyAyXSA9PSAnZScpCi0JCQkJCSYmIChjb21tZW50W2kgKyAzXSA9PSAncCcpCi0JCQkJCSYmIChjb21tZW50W2kgKyA0XSA9PSAncicpCi0JCQkJCSYmIChjb21tZW50W2kgKyA1XSA9PSAnZScpCi0JCQkJCSYmIChjb21tZW50W2kgKyA2XSA9PSAnYycpCi0JCQkJCSYmIChjb21tZW50W2kgKyA3XSA9PSAnYScpCi0JCQkJCSYmIChjb21tZW50W2kgKyA4XSA9PSAndCcpCi0JCQkJCSYmIChjb21tZW50W2kgKyA5XSA9PSAnZScpCi0JCQkJCSYmIChjb21tZW50W2kgKyAxMF0gPT0gJ2QnKSkgewotCQkJCQkvLyBlbnN1cmUgdGhlIHRhZyBpcyBwcm9wZXJseSBlbmRlZDogZWl0aGVyIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGxpbmUgZW5kIG9yIGFzdGVyaXNrLgotCQkJCQlpbnQgbmV4dFBvcyA9IGkgKyAxMTsKLQkJCQkJZGVwcmVjYXRlZCA9IAotCQkJCQkJKGNvbW1lbnRbbmV4dFBvc10gPT0gJyAnKQotCQkJCQkJCXx8IChjb21tZW50W25leHRQb3NdID09ICdcbicpCi0JCQkJCQkJfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJ1xyJykKLQkJCQkJCQl8fCAoY29tbWVudFtuZXh0UG9zXSA9PSAnKicpOyAKLQkJCQkJYnJlYWsgZm91bmQ7Ci0JCQkJfQotCQkJfQorCW5leHRDb21tZW50IDogZm9yIChsYXN0QW5ub3RhdGlvbkluZGV4ID0gc2Nhbm5lci5jb21tZW50UHRyOyBsYXN0QW5ub3RhdGlvbkluZGV4ID49IDA7IGxhc3RBbm5vdGF0aW9uSW5kZXgtLSl7CisJCS8vbG9vayBmb3IgQGRlcHJlY2F0ZWQgaW50byB0aGUgZmlyc3QgamF2YWRvYyBjb21tZW50IHByZWNlZWRpbmcgdGhlIGRlY2xhcmF0aW9uCisJCWludCBjb21tZW50U291cmNlU3RhcnQgPSBzY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdEFubm90YXRpb25JbmRleF07CisJCS8vIGphdmFkb2Mgb25seSAobm9uIGphdmFkb2MgY29tbWVudCBoYXZlIG5lZ2F0aXZlIGVuZCBwb3NpdGlvbnMuKQorCQlpZiAobW9kaWZpZXJzU291cmNlU3RhcnQgIT0gLTEgJiYgbW9kaWZpZXJzU291cmNlU3RhcnQgPCBjb21tZW50U291cmNlU3RhcnQpIHsKKwkJCWNvbnRpbnVlIG5leHRDb21tZW50OwogCQl9CisJCWlmIChzY2FubmVyLmNvbW1lbnRTdG9wc1tsYXN0QW5ub3RhdGlvbkluZGV4XSA8IDApIHsKKwkJCWNvbnRpbnVlIG5leHRDb21tZW50OworCQl9CisJCWludCBjb21tZW50U291cmNlRW5kID0gc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdEFubm90YXRpb25JbmRleF0gLSAxOyAvL3N0b3AgaXMgb25lIG92ZXIKKwkJY2hhcltdIGNvbW1lbnQgPSBzY2FubmVyLnNvdXJjZTsKKworCQlkZXByZWNhdGVkID0KKwkJCWNoZWNrRGVwcmVjYXRpb24oCisJCQkJY29tbWVudFNvdXJjZVN0YXJ0LAorCQkJCWNvbW1lbnRTb3VyY2VFbmQsCisJCQkJY29tbWVudCk7CisJCWJyZWFrIG5leHRDb21tZW50OwogCX0KIAlpZiAoZGVwcmVjYXRlZCkgewogCQljaGVja0FuZFNldE1vZGlmaWVycyhBY2NEZXByZWNhdGVkKTsKIAl9CiAJLy8gbW9kaWZ5IHRoZSBtb2RpZmllciBzb3VyY2Ugc3RhcnQgdG8gcG9pbnQgYXQgdGhlIGZpcnN0IGNvbW1lbnQKLQlpZiAobGFzdEFubm90YXRpb25JbmRleCA+PSAwKSB7CisJaWYgKGNvbW1lbnRQdHIgPj0gMCkgewogCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc2Nhbm5lci5jb21tZW50U3RhcnRzWzBdOwogCX0KIH0KQEAgLTI0OSw3ICsyMzUsNyBAQAogCX0gZWxzZSB7CiAJCS8vIFJlY29yZCB0aGF0IHRoZSBibG9jayBoYXMgYSBkZWNsYXJhdGlvbiBmb3IgbG9jYWwgdHlwZXMKIAkJdHlwZURlY2wgPSBuZXcgTG9jYWxUeXBlRGVjbGFyYXRpb24odGhpcy5jb21waWxhdGlvblVuaXQuY29tcGlsYXRpb25SZXN1bHQpOwotCQltYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKTsKKwkJbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsKIAkJYmxvY2tSZWFsKCk7CiAJfQogCkBAIC02NTIsNyArNjM4LDcgQEAKIAl9IGVsc2UgewogCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCiAJCXR5cGVEZWNsID0gbmV3IExvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJCW1hcmtFbmNsb3NpbmdNZW1iZXJXaXRoTG9jYWxUeXBlKCk7CiAJCWJsb2NrUmVhbCgpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YQppbmRleCBjYTFiNTBiLi5kNzAyOTFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUNvbXBpbGVyUmVxdWVzdG9yLmphdmEKaW5kZXggNDAyNjQ0Yi4uYjg3OWMyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lDb21waWxlclJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JQ29tcGlsZXJSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURlYnVnUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURlYnVnUmVxdWVzdG9yLmphdmEKaW5kZXggNGE5YWI2OC4uN2RiNjk5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEZWJ1Z1JlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRGVidWdSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogcHVibGljIGludGVyZmFjZSBJRGVidWdSZXF1ZXN0b3IgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRG9jdW1lbnRFbGVtZW50UmVxdWVzdG9yLmphdmEKaW5kZXggYzJmZGMwMS4uYjljZDIwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSURvY3VtZW50RWxlbWVudFJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSUVycm9ySGFuZGxpbmdQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRXJyb3JIYW5kbGluZ1BvbGljeS5qYXZhCmluZGV4IGRiOTZkMmQuLmQ1ZTA0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRXJyb3JIYW5kbGluZ1BvbGljeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JRXJyb3JIYW5kbGluZ1BvbGljeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiAvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lQcm9ibGVtRmFjdG9yeS5qYXZhCmluZGV4IDhmMzgxZmUuLmQ1ZTM2YmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9JUHJvYmxlbUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVByb2JsZW1GYWN0b3J5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwpAQCAtMjgsNyArMjgsOCBAQAogCUlQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCiAJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAogCQlpbnQgcHJvYmxlbUlkLAotCQlTdHJpbmdbXSBhcmd1bWVudHMsCisJCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsIC8vIHNob3J0ZXIgdmVyc2lvbnMgb2YgdGhlIHByb2JsZW1Bcmd1bWVudHMKIAkJaW50IHNldmVyaXR5LAogCQlpbnQgc3RhcnRQb3NpdGlvbiwKIAkJaW50IGVuZFBvc2l0aW9uLApAQCAtMzYsNSArMzcsNSBAQAogCQkKIAlMb2NhbGUgZ2V0TG9jYWxlKCk7CiAJCi0JU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoaW50IHByb2JsZW1JZCwgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCVN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKGludCBwcm9ibGVtSWQsIFN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL0lTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQppbmRleCBlZDNhNWVhLi4wMWQ0YzAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwpAQCAtMTIzLDE2ICsxMjMsMTAgQEAKIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpOwogdm9pZCBleGl0Q29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uRW5kKTsKIC8qCi0gKiAtIE5vIGluaXRpYWxpemF0aW9uIHNvdXJjZSBmb3Igbm93IC0KLSAqIGluaXRpYWxpemF0aW9uU291cmNlIGRlbm90ZXMgdGhlIHNvdXJjZSBvZiB0aGUgZXhwcmVzc2lvbiB1c2VkIGZvciBpbml0aWFsaXppbmcKLSAqIHRoZSBmaWVsZCBpZiBhbnkgKGlmIG5vIHNvdXJjZSwgdGhlbiBpdCBpcyBudWxsKS4KLSAqCi0gKiBOb3RlOiB0aGUgaW5pdGlhbGl6YXRpb25Tb3VyY2Ugd2lsbCBiZSB1c2VkIGluIGNhc2Ugd2UgZG8gbmVlZCB0byB0eXBlIGNoZWNrCi0gKglhZ2FpbnN0IHNvdXJjZSBtb2RlbHMsIGFuZCB0aHVzIHRoZSBvbmx5IGludGVyZXN0aW5nIHVzZSBmb3IgaXQgaXMgZmllbGQKLSAqICBjb25zdGFudCBwcm9wYWdhdGlvbi4gVGhlcmVmb3JlLCB0aGUgaW5pdGlhbGl6YXRpb25Tb3VyY2Ugd2lsbCBvbmx5IGJlIG5vbgotICogIG51bGwgZm9yIGZpbmFsIGZpZWxkcyAoc28gYXMgdG8gbWluaW1pemUgY2hhcltdIGFsbG9jYXRpb25zKS4KKyAqIGluaXRpYWxpemF0aW9uU3RhcnQgZGVub3RlcyB0aGUgc291cmNlIHN0YXJ0IG9mIHRoZSBleHByZXNzaW9uIHVzZWQgZm9yIGluaXRpYWxpemluZworICogdGhlIGZpZWxkIGlmIGFueSAoLTEgaWYgbm8gaW5pdGlhbGl6YXRpb24pLgogICovCi12b2lkIGV4aXRGaWVsZCgvKmNoYXJbXSBpbml0aWFsaXphdGlvblNvdXJjZSwgKi9pbnQgZGVjbGFyYXRpb25FbmQpOwordm9pZCBleGl0RmllbGQoaW50IGluaXRpYWxpemF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kKTsKIHZvaWQgZXhpdEluaXRpYWxpemVyKGludCBkZWNsYXJhdGlvbkVuZCk7CiB2b2lkIGV4aXRJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uRW5kKTsKIHZvaWQgZXhpdE1ldGhvZChpbnQgZGVjbGFyYXRpb25FbmQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9Tb3VyY2VFbGVtZW50UGFyc2VyLmphdmEKaW5kZXggMWI2YWU2Mi4uYWQxNzRhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFBhcnNlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyOwogCiAvKioKQEAgLTM2LDI0ICszNiwyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgU291cmNlRWxlbWVudFBhcnNlciBleHRlbmRzIFBhcnNlciB7CiAJCiAJSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgcmVxdWVzdG9yOwotCXByaXZhdGUgaW50IGZpZWxkQ291bnQ7Ci0JcHJpdmF0ZSBpbnQgbG9jYWxJbnRQdHI7Ci0JcHJpdmF0ZSBpbnQgbGFzdEZpZWxkRW5kUG9zaXRpb247Ci0JcHJpdmF0ZSBJU291cmNlVHlwZSBzb3VyY2VUeXBlOwotCXByaXZhdGUgYm9vbGVhbiByZXBvcnRSZWZlcmVuY2VJbmZvOwotCXByaXZhdGUgY2hhcltdW10gdHlwZU5hbWVzOwotCXByaXZhdGUgY2hhcltdW10gc3VwZXJUeXBlTmFtZXM7Ci0JcHJpdmF0ZSBpbnQgbmVzdGVkVHlwZUluZGV4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBKQVZBX0xBTkdfT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE5hbWVSZWZlcmVuY2VbXSB1bmtub3duUmVmczsKLQlwcml2YXRlIGludCB1bmtub3duUmVmc0NvdW50ZXI7Ci0JcHJpdmF0ZSBMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBsb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKKwlpbnQgZmllbGRDb3VudDsKKwlpbnQgbG9jYWxJbnRQdHI7CisJaW50IGxhc3RGaWVsZEVuZFBvc2l0aW9uOworCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGU7CisJYm9vbGVhbiByZXBvcnRSZWZlcmVuY2VJbmZvOworCWNoYXJbXVtdIHR5cGVOYW1lczsKKwljaGFyW11bXSBzdXBlclR5cGVOYW1lczsKKwlpbnQgbmVzdGVkVHlwZUluZGV4OworCXN0YXRpYyBmaW5hbCBjaGFyW10gSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJTmFtZVJlZmVyZW5jZVtdIHVua25vd25SZWZzOworCWludCB1bmtub3duUmVmc0NvdW50ZXI7CisJTG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgbG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgPSBudWxsOworCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zOwogCQogLyoqCiAgKiBBbiBhc3QgdmlzaXRvciB0aGF0IHZpc2l0cyBsb2NhbCB0eXBlIGRlY2xhcmF0aW9ucy4KQEAgLTkyLDcgKzkxLDcgQEAKIAkJfQogCX0sCiAJdHJ1ZSwKLQlvcHRpb25zLmFzc2VydE1vZGUpOworCW9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCk7CiAJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CiAJdHlwZU5hbWVzID0gbmV3IGNoYXJbNF1bXTsKIAlzdXBlclR5cGVOYW1lcyA9IG5ldyBjaGFyWzRdW107CkBAIC0yMDMsNiArMjAyLDcgQEAKIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKSB7CiAJLy8gRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKIAkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwlzdXBlci5jb25zdW1lRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uKCk7CiAJaWYgKGlzTG9jYWxEZWNsYXJhdGlvbigpIHx8ICgoY3VycmVudFRva2VuICE9IFRva2VuTmFtZUNPTU1BKSAmJiAoY3VycmVudFRva2VuICE9IFRva2VuTmFtZVNFTUlDT0xPTikpKQogCQlyZXR1cm47CiAJKChTb3VyY2VGaWVsZERlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdKS5maWVsZEVuZFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwpAQCAtNzU3LDEwICs3NTcsMTIgQEAKIAkJc2VsZWN0b3JTb3VyY2VFbmQgPSAKIAkJCSgoU291cmNlTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5zZWxlY3RvclNvdXJjZUVuZDsgCiAJfQotCWlmIChpc0luUmFuZ2UpeworCWlmIChpc0luUmFuZ2UpIHsKKwkJaW50IG1vZGlmaWVycyA9IG1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVyczsKKwkJYm9vbGVhbiBkZXByZWNhdGVkID0gKG1vZGlmaWVycyAmIEFjY0RlcHJlY2F0ZWQpICE9IDA7IC8vIHJlbWVtYmVyIGRlcHJlY2F0aW9uIHNvIGFzIHRvIG5vdCBsb3NlIGl0IGJlbG93CiAJCXJlcXVlc3Rvci5lbnRlck1ldGhvZCgKIAkJCW1ldGhvZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAotCQkJbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQWNjSnVzdEZsYWcsIAorCQkJZGVwcmVjYXRlZCA/IChtb2RpZmllcnMgJiBBY2NKdXN0RmxhZykgfCBBY2NEZXByZWNhdGVkIDogbW9kaWZpZXJzICYgQWNjSnVzdEZsYWcsIAogCQkJcmV0dXJuVHlwZU5hbWUoKChNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb24pLnJldHVyblR5cGUpLCAKIAkJCW1ldGhvZERlY2xhcmF0aW9uLnNlbGVjdG9yLCAKIAkJCW1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCAKQEAgLTc5NSw5ICs3OTcsMTEgQEAKIAkJCX0KIAkJfQogCQlpZiAoaXNJblJhbmdlKSB7CisJCQlpbnQgbW9kaWZpZXJzID0gZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnM7CisJCQlib29sZWFuIGRlcHJlY2F0ZWQgPSAobW9kaWZpZXJzICYgQWNjRGVwcmVjYXRlZCkgIT0gMDsgLy8gcmVtZW1iZXIgZGVwcmVjYXRpb24gc28gYXMgdG8gbm90IGxvc2UgaXQgYmVsb3cKIAkJCXJlcXVlc3Rvci5lbnRlckZpZWxkKAogCQkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgCi0JCQkJZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBBY2NKdXN0RmxhZywgCisJCQkJZGVwcmVjYXRlZCA/IChtb2RpZmllcnMgJiBBY2NKdXN0RmxhZykgfCBBY2NEZXByZWNhdGVkIDogbW9kaWZpZXJzICYgQWNjSnVzdEZsYWcsIAogCQkJCXJldHVyblR5cGVOYW1lKGZpZWxkRGVjbGFyYXRpb24udHlwZSksIAogCQkJCWZpZWxkRGVjbGFyYXRpb24ubmFtZSwgCiAJCQkJZmllbGREZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgCkBAIC04MDUsNyArODA5LDIxIEBACiAJCX0KIAkJdGhpcy52aXNpdElmTmVlZGVkKGZpZWxkRGVjbGFyYXRpb24pOwogCQlpZiAoaXNJblJhbmdlKXsKLQkJCXJlcXVlc3Rvci5leGl0RmllbGQoZmllbGRFbmRQb3NpdGlvbik7CisJCQlyZXF1ZXN0b3IuZXhpdEZpZWxkKAorCQkJCS8vIGZpbHRlciBvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgYXJlIG5vdCBhIGNvbnN0YW50IChzaW1wbGUgY2hlY2spCisJCQkJKGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gPT0gbnVsbCAKKwkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheUluaXRpYWxpemVyCisJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24KKwkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uCisJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXNzaWdubWVudAorCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIENsYXNzTGl0ZXJhbEFjY2VzcworCQkJCQkJfHwgZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kCisJCQkJCQl8fCBmaWVsZERlY2xhcmF0aW9uLmluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQXJyYXlSZWZlcmVuY2UKKwkJCQkJCXx8IGZpZWxkRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBUaGlzUmVmZXJlbmNlKSA/IAorCQkJCQktMSA6ICAKKwkJCQkJZmllbGREZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbi5zb3VyY2VTdGFydCwgCisJCQkJZmllbGRFbmRQb3NpdGlvbiwKKwkJCQlmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTg4MCw5ICs4OTgsMTEgQEAKIAkJfQogCQlpZiAoaXNJbnRlcmZhY2UpIHsKIAkJCWlmIChpc0luUmFuZ2UpeworCQkJCWludCBtb2RpZmllcnMgPSB0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzOworCQkJCWJvb2xlYW4gZGVwcmVjYXRlZCA9IChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwOyAvLyByZW1lbWJlciBkZXByZWNhdGlvbiBzbyBhcyB0byBub3QgbG9zZSBpdCBiZWxvdwogCQkJCXJlcXVlc3Rvci5lbnRlckludGVyZmFjZSgKIAkJCQkJdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAotCQkJCQl0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgQWNjSnVzdEZsYWcsIAorCQkJCQlkZXByZWNhdGVkID8gKG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnKSB8IEFjY0RlcHJlY2F0ZWQgOiBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZywgCiAJCQkJCXR5cGVEZWNsYXJhdGlvbi5uYW1lLCAKIAkJCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCAKIAkJCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwgCkBAIC05OTYsMTEgKzEwMTYsMTUgQEAKIAkJdW5rbm93blJlZnMgPSBuZXcgTmFtZVJlZmVyZW5jZVsxMF07CiAJCXVua25vd25SZWZzQ291bnRlciA9IDA7CiAJfQorCQogCXRyeSB7CiAJCWRpZXQgPSB0cnVlOwogCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblVuaXRSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQodW5pdCwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZSh1bml0LCBjb21waWxhdGlvblVuaXRSZXN1bHQsIHN0YXJ0LCBlbmQpOwotCQlpZiAobmVlZFJlZmVyZW5jZUluZm8peworCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCQl9CisJCWlmICh0aGlzLmxvY2FsRGVjbGFyYXRpb25WaXNpdG9yICE9IG51bGwgfHwgbmVlZFJlZmVyZW5jZUluZm8pewogCQkJZGlldCA9IGZhbHNlOwogCQkJdGhpcy5nZXRNZXRob2RCb2RpZXMocGFyc2VkVW5pdCk7CiAJCX0JCQpAQCAtMTAwOCw5ICsxMDMyLDYgQEAKIAkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihwYXJzZWRVbml0KTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAl9IGZpbmFsbHkgewotCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7Ci0JCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOwotCQl9CiAJCWRpZXQgPSBvbGQ7CiAJfQogfQpAQCAtMTAyMiwxOSArMTA0MywxOCBAQAogCQl1bmtub3duUmVmcyA9IG5ldyBOYW1lUmVmZXJlbmNlWzEwXTsKIAkJdW5rbm93blJlZnNDb3VudGVyID0gMDsKIAl9Ci0JCQorCiAJdHJ5IHsKLS8qCQlkaWV0ID0gIW5lZWRSZWZlcmVuY2VJbmZvOwotCQlyZXBvcnRSZWZlcmVuY2VJbmZvID0gbmVlZFJlZmVyZW5jZUluZm87Ci0JCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uVW5pdFJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCh1bml0LCAwLCAwKTsKLQkJcGFyc2UodW5pdCwgY29tcGlsYXRpb25Vbml0UmVzdWx0KTsJCQotKi8JCWRpZXQgPSB0cnVlOworCQlkaWV0ID0gdHJ1ZTsKIAkJcmVwb3J0UmVmZXJlbmNlSW5mbyA9IG5lZWRSZWZlcmVuY2VJbmZvOwogCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblVuaXRSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQodW5pdCwgMCwgMCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSBwYXJzZSh1bml0LCBjb21waWxhdGlvblVuaXRSZXN1bHQpOworCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOworCQl9CiAJCWludCBpbml0aWFsU3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uOwogCQlpbnQgaW5pdGlhbEVuZCA9IHRoaXMuc2Nhbm5lci5lb2ZQb3NpdGlvbjsKLQkJaWYgKG5lZWRSZWZlcmVuY2VJbmZvKXsKKwkJaWYgKHRoaXMubG9jYWxEZWNsYXJhdGlvblZpc2l0b3IgIT0gbnVsbCB8fCBuZWVkUmVmZXJlbmNlSW5mbyl7CiAJCQlkaWV0ID0gZmFsc2U7CiAJCQl0aGlzLmdldE1ldGhvZEJvZGllcyhwYXJzZWRVbml0KTsKIAkJfQpAQCAtMTA0Miw5ICsxMDYyLDYgQEAKIAkJbm90aWZ5U291cmNlRWxlbWVudFJlcXVlc3RvcihwYXJzZWRVbml0KTsKIAl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKIAl9IGZpbmFsbHkgewotCQlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7Ci0JCQlyZXF1ZXN0b3IuYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhzY2FubmVyLmdldExpbmVFbmRzKCkpOwotCQl9CiAJCWRpZXQgPSBvbGQ7CiAJfQogfQpAQCAtMTA2OCw4ICsxMDg1LDkgQEAKIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IAogCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKIAkJCQluZXcgSVNvdXJjZVR5cGVbXXtzb3VyY2VUeXBlfSwgCi0JCQkJZmFsc2UsCi0JCQkJZmFsc2UsIAorCQkJCWZhbHNlLCAvLyBubyBuZWVkIGZvciBmaWVsZCBhbmQgbWV0aG9kcworCQkJCWZhbHNlLCAvLyBubyBuZWVkIGZvciBtZW1iZXIgdHlwZXMKKwkJCQlmYWxzZSwgLy8gbm8gbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KIAkJCQlwcm9ibGVtUmVwb3J0ZXIoKSwgCiAJCQkJY29tcGlsYXRpb25Vbml0UmVzdWx0KTsgCiAJCWlmICgodW5pdCA9PSBudWxsKSB8fCAodW5pdC50eXBlcyA9PSBudWxsKSB8fCAodW5pdC50eXBlcy5sZW5ndGggIT0gMSkpCkBAIC0xMTE5LDYgKzExMzcsOCBAQAogCQkvKiBzY2FubmVyIGluaXRpYWxpemF0aW9uICovCiAJCXNjYW5uZXIuc2V0U291cmNlKGNvbnRlbnRzKTsKIAkJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CisJCXNjYW5uZXIudGFza1RhZ3MgPSBudWxsOworCQlzY2FubmVyLnRhc2tQcmlvcml0aWVzID0gbnVsbDsKIAkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwogCiAJCS8qIHVuaXQgY3JlYXRpb24gKi8KQEAgLTExOTksNjMgKzEyMTksNiBAQAogCX0KIAl0aGlzLnVua25vd25SZWZzW3RoaXMudW5rbm93blJlZnNDb3VudGVyKytdID0gbmFtZVJlZjsKIH0KLXByaXZhdGUgVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlKAotCWludCBkaW0sIAotCWludCBsb2NhbElkZW50aWZpZXJQdHIsIAotCWludCBsb2NhbElkZW50aWZpZXJMZW5ndGhQdHIpIHsKLQkvKiBidWlsZCBhIFJlZmVyZW5jZSBvbiBhIHZhcmlhYmxlIHRoYXQgbWF5IGJlIHF1YWxpZmllZCBvciBub3QKLQkgKiBUaGlzIHZhcmlhYmxlIGlzIGEgdHlwZSByZWZlcmVuY2UgYW5kIGRpbSB3aWxsIGJlIGl0cyBkaW1lbnNpb25zLgotCSAqIFdlIGRvbid0IGhhdmUgYW55IHNpZGUgZWZmZWN0IG9uIHRoZSBzdGFja3MnIHBvaW50ZXJzLgotCSAqLwotCi0JaW50IGxlbmd0aDsKLQlUeXBlUmVmZXJlbmNlIHJlZjsKLQlpZiAoKGxlbmd0aCA9IGlkZW50aWZpZXJMZW5ndGhTdGFja1tsb2NhbElkZW50aWZpZXJMZW5ndGhQdHJdKSA9PSAxKSB7Ci0JCS8vIHNpbmdsZSB2YXJpYWJsZSByZWZlcmVuY2UKLQkJaWYgKGRpbSA9PSAwKSB7Ci0JCQlyZWYgPSAKLQkJCQluZXcgU2luZ2xlVHlwZVJlZmVyZW5jZSgKLQkJCQkJaWRlbnRpZmllclN0YWNrW2xvY2FsSWRlbnRpZmllclB0cl0sIAotCQkJCQlpZGVudGlmaWVyUG9zaXRpb25TdGFja1tsb2NhbElkZW50aWZpZXJQdHItLV0pOyAKLQkJfSBlbHNlIHsKLQkJCXJlZiA9IAotCQkJCW5ldyBBcnJheVR5cGVSZWZlcmVuY2UoCi0JCQkJCWlkZW50aWZpZXJTdGFja1tsb2NhbElkZW50aWZpZXJQdHJdLCAKLQkJCQkJZGltLCAKLQkJCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2tbbG9jYWxJZGVudGlmaWVyUHRyLS1dKTsKLQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsJCQkgCi0JCX0KLQl9IGVsc2UgewotCQlpZiAobGVuZ3RoIDwgMCkgeyAvL2ZsYWcgZm9yIHByZWNvbXBpbGVkIHR5cGUgcmVmZXJlbmNlIG9uIGJhc2UgdHlwZXMKLQkJCXJlZiA9IFR5cGVSZWZlcmVuY2UuYmFzZVR5cGVSZWZlcmVuY2UoLWxlbmd0aCwgZGltKTsKLQkJCXJlZi5zb3VyY2VTdGFydCA9IGludFN0YWNrW2xvY2FsSW50UHRyLS1dOwotCQkJaWYgKGRpbSA9PSAwKSB7Ci0JCQkJcmVmLnNvdXJjZUVuZCA9IGludFN0YWNrW2xvY2FsSW50UHRyLS1dOwotCQkJfSBlbHNlIHsKLQkJCQlsb2NhbEludFB0ci0tOwotCQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKLQkJCX0JCi0JCX0gZWxzZSB7IC8vUXVhbGlmaWVkIHZhcmlhYmxlIHJlZmVyZW5jZQotCQkJY2hhcltdW10gdG9rZW5zID0gbmV3IGNoYXJbbGVuZ3RoXVtdOwotCQkJbG9jYWxJZGVudGlmaWVyUHRyIC09IGxlbmd0aDsKLQkJCWxvbmdbXSBwb3NpdGlvbnMgPSBuZXcgbG9uZ1tsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShpZGVudGlmaWVyU3RhY2ssIGxvY2FsSWRlbnRpZmllclB0ciArIDEsIHRva2VucywgMCwgbGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJaWRlbnRpZmllclBvc2l0aW9uU3RhY2ssIAotCQkJCWxvY2FsSWRlbnRpZmllclB0ciArIDEsIAotCQkJCXBvc2l0aW9ucywgCi0JCQkJMCwgCi0JCQkJbGVuZ3RoKTsgCi0JCQlpZiAoZGltID09IDApICB7Ci0JCQkJcmVmID0gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UodG9rZW5zLCBwb3NpdGlvbnMpOwotCQkJfSBlbHNlIHsKLQkJCQlyZWYgPSBuZXcgQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKHRva2VucywgZGltLCBwb3NpdGlvbnMpOwotCQkJCXJlZi5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKLQkJCX0KLQkJfQotCX07Ci0JcmV0dXJuIHJlZjsKLX0KIAogcHJpdmF0ZSB2b2lkIHZpc2l0SWZOZWVkZWQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKIAlpZiAodGhpcy5sb2NhbERlY2xhcmF0aW9uVmlzaXRvciAhPSBudWxsIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL1NvdXJjZUVsZW1lbnRSZXF1ZXN0b3JBZGFwdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIuamF2YQppbmRleCBhYTc4YThhLi5hZWVlZDE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJLyoKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2V4aXRGaWVsZChpbnQpCiAJICovCi0JcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgeworCXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BTkRfQU5EX0V4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQU5EX0FORF9FeHByZXNzaW9uLmphdmEKaW5kZXggZjFmYzgyNi4uZDAxOGUxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BTkRfQU5EX0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FORF9BTkRfRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTMxLDMzICszMSw0MSBAQAogCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAotCQlDb25zdGFudCBvcENvbnN0YW50ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCk7Ci0JCWlmIChvcENvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewotCQkJaWYgKG9wQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJCS8vIFRSVUUgJiYgYW55dGhpbmcKLQkJCQkgLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgotCQkJCS8vCQkoeCAmJiB5KSAmJiAheiwgaWYgcGFzc2luZyB0aGUgbGVmdCBpbmZvIHRvIHRoZSByaWdodCwgaXQgd291bGQgYmUgc3dhcHBlZCBieSB0aGUgIQotCQkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsgCi0JCQkJbWVyZ2VkSW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOwotCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KLQkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7Ci0JCQkJcmV0dXJuIG1lcmdlZEluZm87Ci0JCQl9CisJCUNvbnN0YW50IGNzdCA9IHRoaXMubGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBpc0xlZnRPcHRpbWl6ZWRUcnVlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJYm9vbGVhbiBpc0xlZnRPcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCisJCWlmIChpc0xlZnRPcHRpbWl6ZWRUcnVlKSB7CisJCQkvLyBUUlVFICYmIGFueXRoaW5nCisJCQkgLy8gbmVlZCB0byBiZSBjYXJlZnVsIG9mIHNjZW5hcmlvOgorCQkJLy8JCSh4ICYmIHkpICYmICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZCBiZSBzd2FwcGVkIGJ5IHRoZSAhCisJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7IAorCQkJbWVyZ2VkSW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOworCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQorCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOworCQkJcmV0dXJuIG1lcmdlZEluZm87CiAJCX0KKwkJCiAJCUZsb3dJbmZvIGxlZnRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCSAvLyBuZWVkIHRvIGJlIGNhcmVmdWwgb2Ygc2NlbmFyaW86CiAJCS8vCQkoeCAmJiB5KSAmJiAheiwgaWYgcGFzc2luZyB0aGUgbGVmdCBpbmZvIHRvIHRoZSByaWdodCwgaXQgd291bGQgYmUgc3dhcHBlZCBieSB0aGUgIQogCQlGbG93SW5mbyByaWdodEluZm8gPSBsZWZ0SW5mby5pbml0c1doZW5UcnVlKCkudW5jb25kaXRpb25hbEluaXRzKCkuY29weSgpOwotCQlpZiAob3BDb25zdGFudCAhPSBOb3RBQ29uc3RhbnQgJiYgb3BDb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgcmlnaHRJbmZvLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7Ci0KIAkJcmlnaHRJbml0U3RhdGVJbmRleCA9CiAJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyaWdodEluZm8pOworCisJCWludCBwcmV2aW91c01vZGUgPSByaWdodEluZm8ucmVhY2hNb2RlKCk7CisJCWlmIChpc0xlZnRPcHRpbWl6ZWRGYWxzZSl7CisJCQlyaWdodEluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsgCisJCX0KIAkJcmlnaHRJbmZvID0gcmlnaHQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgcmlnaHRJbmZvKTsKLQkJRmxvd0luZm8gbWVyZ2VkSW5mbyA9CisJCUZsb3dJbmZvIHRydWVNZXJnZWRJbmZvID0gcmlnaHRJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCk7CisJCXJpZ2h0SW5mby5zZXRSZWFjaE1vZGUocHJldmlvdXNNb2RlKTsgLy8gcmVzZXQgYWZ0ZXIgdHJ1ZU1lcmdlZEluZm8gZ290IGV4dHJhY3RlZAorCQkKKwkJRmxvd0luZm8gbWVyZ2VkSW5mbyA9IAogCQkJRmxvd0luZm8uY29uZGl0aW9uYWwoCi0JCQkJcmlnaHRJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCksCisJCQkJdHJ1ZU1lcmdlZEluZm8sCiAJCQkJbGVmdEluZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKLQkJCQkJcmlnaHRJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKSk7CisJCQkJCQlyaWdodEluZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkpKTsKIAkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwpAQCAtMTEwLDcgKzExOCw4IEBACiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CiAJCX0KLQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQogCX0KIAogCS8qKgpAQCAtMTIzLDEzICsxMzIsMTMgQEAKIAkJTGFiZWwgdHJ1ZUxhYmVsLAogCQlMYWJlbCBmYWxzZUxhYmVsLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkJaWYgKChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmIChjb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCQkKKwkJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQkJc3VwZXIuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCXJldHVybjsKIAkJfQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlDb25zdGFudCBjb25kQ29uc3Q7Ci0JCWlmICgoY29uZENvbnN0ID0gbGVmdC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+ICYmIHgKIAkJCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKQEAgLTE2OSw4ICsxNzgsOSBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQorCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLApAQCAtMTc4LDcgKzE4OCw3IEBACiAJCQl9CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKChjb25kQ29uc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQlpZiAoKGNvbmRDb25zdCA9IHJpZ2h0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewogCQkJCS8vIHggJiYgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+CiAJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CkBAIC0yMDIsMTUgKzIxMiwxNyBAQAogCQkJCQlmYWxzZSk7CiAJCQl9IGVsc2UgewogCQkJCS8vIHggJiYgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPgorCQkJCUxhYmVsIGludGVybmFsVHJ1ZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pOwogCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAogCQkJCQljdXJyZW50U2NvcGUsCiAJCQkJCWNvZGVTdHJlYW0sCi0JCQkJCXRydWVMYWJlbCwKLQkJCQkJZmFsc2VMYWJlbCwKKwkJCQkJaW50ZXJuYWxUcnVlTGFiZWwsIC8vIHdpbGwgYmUgZmFsc2UgaW4gdGhlIGVuZAorCQkJCQludWxsLAogCQkJCQlmYWxzZSk7CiAJCQkJaWYgKHJpZ2h0SW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCByaWdodEluaXRTdGF0ZUluZGV4KTsKIAkJCQl9CisJCQkJaW50ZXJuYWxUcnVlTGFiZWwucGxhY2UoKTsKIAkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkJY29kZVN0cmVhbSwKQEAgLTIyNyw4ICsyMzksOSBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQorCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLApAQCAtMjc1LDcgKzI4OCw2IEBACiAJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgogCQkJfQogCQl9Ci0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCWlmIChtZXJnZWRJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJY3VycmVudFNjb3BlLApAQCAtMjk0LDQgKzMwNiw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKaW5kZXggMTRjZTBiNC4uZTY5Yzg2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsMjAgKzEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKQEAgLTM4LDcgKzM5LDcgQEAKIAlwdWJsaWMgTWV0aG9kQmluZGluZyBiaW5kaW5nOwogCXB1YmxpYyBib29sZWFuIGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gbmVlZEZyZWVSZXR1cm4gPSBmYWxzZTsKLQorCQogCXB1YmxpYyBpbnQgYm9keVN0YXJ0OwogCXB1YmxpYyBpbnQgYm9keUVuZCA9IC0xOwogCXB1YmxpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdDsKQEAgLTcxLDYxICs3Miw5IEBACiAJCX0KIAl9CiAKLQlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZSgKLQkJQ2xhc3NTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgeworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFuYWx5c2VDb2RlKENsYXNzU2NvcGUgc2NvcGUsIEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6YXRpb25Db250ZXh0LCBGbG93SW5mbyBpbmZvKTsKIAotCQkvLyBzdGFydGluZyBvZiB0aGUgY29kZSBhbmFseXNpcyBmb3IgbWV0aG9kcwotCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAoYmluZGluZyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vIG1heSBiZSBpbiBhIG5vbiBuZWNlc3NhcnkgPGNsaW5pdD4gZm9yIGlubmVyY2xhc3Mgd2l0aCBzdGF0aWMgZmluYWwgY29uc3RhbnQgZmllbGRzCi0JCQlpZiAoYmluZGluZy5pc0Fic3RyYWN0KCkgfHwgYmluZGluZy5pc05hdGl2ZSgpKQotCQkJCXJldHVybjsKLQotCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBtZXRob2RDb250ZXh0ID0KLQkJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKLQkJCQkJZmxvd0NvbnRleHQsCi0JCQkJCXRoaXMsCi0JCQkJCWJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywKLQkJCQkJc2NvcGUsCi0JCQkJCUZsb3dJbmZvLkRlYWRFbmQpOwotCi0JCQkvLyBwcm9wYWdhdGUgdG8gc3RhdGVtZW50cwotCQkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlTdGF0ZW1lbnQgc3RhdDsKLQkJCQkJaWYgKCFmbG93SW5mby5jb21wbGFpbklmVW5yZWFjaGFibGUoKHN0YXQgPSBzdGF0ZW1lbnRzW2ldKSwgc2NvcGUpKSB7Ci0JCQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUoc2NvcGUsIG1ldGhvZENvbnRleHQsIGZsb3dJbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGNoZWNrIGZvciBtaXNzaW5nIHJldHVybmluZyBwYXRoCi0JCQlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gYmluZGluZy5yZXR1cm5UeXBlOwotCQkJaWYgKChyZXR1cm5UeXBlID09IFZvaWRCaW5kaW5nKSB8fCBpc0Fic3RyYWN0KCkpIHsKLQkJCQluZWVkRnJlZVJldHVybiA9Ci0JCQkJCSEoKGZsb3dJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZsb3dJbmZvICE9IEZsb3dJbmZvLkRlYWRFbmQpIHsKLQkJCQkJLy8gc3BlY2lhbCB0ZXN0IGZvciBlbXB0eSBtZXRob2RzIHRoYXQgc2hvdWxkIHJldHVybiBzb21ldGhpbmcKLQkJCQkJaWYgKChzdGF0ZW1lbnRzID09IG51bGwpICYmIChyZXR1cm5UeXBlICE9IFZvaWRCaW5kaW5nKSkgewotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKHJldHVyblR5cGUsIHRoaXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKAotCQkJCQkJCXJldHVyblR5cGUsCi0JCQkJCQkJc3RhdGVtZW50c1tzdGF0ZW1lbnRzLmxlbmd0aCAtIDFdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgewotCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKKwkJLyoqCiAJICogQmluZCBhbmQgYWRkIGFyZ3VtZW50J3MgYmluZGluZyBpbnRvIHRoZSBzY29wZSBvZiB0aGUgbWV0aG9kCiAJICovCiAJcHVibGljIHZvaWQgYmluZEFyZ3VtZW50cygpIHsKQEAgLTE1MCw5ICs5OSwzNCBAQAogCQlpZiAodGhpcy50aHJvd25FeGNlcHRpb25zICE9IG51bGwKIAkJCSYmIHRoaXMuYmluZGluZyAhPSBudWxsCiAJCQkmJiB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQlpbnQgdGhyb3duRXhjZXB0aW9uTGVuZ3RoID0gdGhpcy50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKIAkJCWludCBsZW5ndGggPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldLmJpbmRpbmcgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9uc1tpXTsKKwkJCWlmIChsZW5ndGggPT0gdGhyb3duRXhjZXB0aW9uTGVuZ3RoKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQl0aGlzLnRocm93bkV4Y2VwdGlvbnNbaV0ucmVzb2x2ZWRUeXBlID0gdGhpcy5iaW5kaW5nLnRocm93bkV4Y2VwdGlvbnNbaV07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpbnQgYmluZGluZ0luZGV4ID0gMDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbkxlbmd0aCAmJiBiaW5kaW5nSW5kZXggPCBsZW5ndGg7IGkrKykgeworCQkJCQlUeXBlUmVmZXJlbmNlIHRocm93bkV4Y2VwdGlvbiA9IHRoaXMudGhyb3duRXhjZXB0aW9uc1tpXTsKKwkJCQkJUmVmZXJlbmNlQmluZGluZyB0aHJvd25FeGNlcHRpb25CaW5kaW5nID0gdGhpcy5iaW5kaW5nLnRocm93bkV4Y2VwdGlvbnNbYmluZGluZ0luZGV4XTsKKwkJCQkJY2hhcltdW10gYmluZGluZ0NvbXBvdW5kTmFtZSA9IHRocm93bkV4Y2VwdGlvbkJpbmRpbmcuY29tcG91bmROYW1lOworCQkJCQlpZiAodGhyb3duRXhjZXB0aW9uIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJCQkJLy8gc2luZ2xlIHR5cGUgcmVmZXJlbmNlCisJCQkJCQlpbnQgbGVuZ3RoTmFtZSA9IGJpbmRpbmdDb21wb3VuZE5hbWUubGVuZ3RoOworCQkJCQkJY2hhcltdIHRocm93bkV4Y2VwdGlvblR5cGVOYW1lID0gdGhyb3duRXhjZXB0aW9uLmdldFR5cGVOYW1lKClbMF07CisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhyb3duRXhjZXB0aW9uVHlwZU5hbWUsIGJpbmRpbmdDb21wb3VuZE5hbWVbbGVuZ3RoTmFtZSAtIDFdKSkgeworCQkJCQkJCXRocm93bkV4Y2VwdGlvbi5yZXNvbHZlZFR5cGUgPSB0aHJvd25FeGNlcHRpb25CaW5kaW5nOworCQkJCQkJCWJpbmRpbmdJbmRleCsrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlCisJCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModGhyb3duRXhjZXB0aW9uLmdldFR5cGVOYW1lKCksIGJpbmRpbmdDb21wb3VuZE5hbWUpKSB7CisJCQkJCQkJdGhyb3duRXhjZXB0aW9uLnJlc29sdmVkVHlwZSA9IHRocm93bkV4Y2VwdGlvbkJpbmRpbmc7CisJCQkJCQkJYmluZGluZ0luZGV4Kys7CisJCQkJCQl9CQkJCQkJCisJCQkJCX0KKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC0xOTgsNyArMTcyLDcgQEAKIAkJCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlMikgewogCQkJCQlpbnQgcHJvYmxlbXNMZW5ndGg7CiAJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPQotCQkJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJCQkJCXNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7CiAJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgcHJvYmxlbXNDb3B5LCAwLCBwcm9ibGVtc0xlbmd0aCk7CiAJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKHRoaXMsIGJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOwpAQCAtMjA3LDcgKzE4MSw3IEBACiAJCQkJLy8gcHJvZHVjZSBhIHByb2JsZW0gbWV0aG9kIGFjY291bnRpbmcgZm9yIHRoaXMgZmF0YWwgZXJyb3IKIAkJCQlpbnQgcHJvYmxlbXNMZW5ndGg7CiAJCQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9Ci0JCQkJCXNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmdldFByb2JsZW1zKCk7CisJCQkJCXNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7CiAJCQkJSVByb2JsZW1bXSBwcm9ibGVtc0NvcHkgPSBuZXcgSVByb2JsZW1bcHJvYmxlbXNMZW5ndGggPSBwcm9ibGVtcy5sZW5ndGhdOwogCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvYmxlbXMsIDAsIHByb2JsZW1zQ29weSwgMCwgcHJvYmxlbXNMZW5ndGgpOwogCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtTWV0aG9kKHRoaXMsIGJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOwpAQCAtMjI2LDcgKzIwMCw3IEBACiAJCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0gPSBjbGFzc0ZpbGUuY29kZVN0cmVhbTsKIAkJCWNvZGVTdHJlYW0ucmVzZXQodGhpcywgY2xhc3NGaWxlKTsKIAkJCS8vIGluaXRpYWxpemUgbG9jYWwgcG9zaXRpb25zCi0JCQlzY29wZS5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucyhiaW5kaW5nLmlzU3RhdGljKCkgPyAwIDogMSwgY29kZVN0cmVhbSk7CisJCQl0aGlzLnNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKGJpbmRpbmcuaXNTdGF0aWMoKSA/IDAgOiAxLCBjb2RlU3RyZWFtKTsKIAogCQkJLy8gYXJndW1lbnRzIGluaXRpYWxpemF0aW9uIGZvciBsb2NhbCB2YXJpYWJsZSBkZWJ1ZyBhdHRyaWJ1dGVzCiAJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKQEAgLTI0MCwxNCArMjE0LDE2IEBACiAJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspCiAJCQkJCXN0YXRlbWVudHNbaV0uZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KLQkJCWlmIChuZWVkRnJlZVJldHVybikgeworCQkJaWYgKHRoaXMubmVlZEZyZWVSZXR1cm4pIHsKIAkJCQljb2RlU3RyZWFtLnJldHVybl8oKTsKIAkJCX0KIAkJCS8vIGxvY2FsIHZhcmlhYmxlIGF0dHJpYnV0ZXMKIAkJCWNvZGVTdHJlYW0uZXhpdFVzZXJTY29wZShzY29wZSk7Ci0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20oMCwgdGhpcy5ib2R5RW5kKTsKKwkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbSgwLCB0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKIAkJCWNsYXNzRmlsZS5jb21wbGV0ZUNvZGVBdHRyaWJ1dGUoY29kZUF0dHJpYnV0ZU9mZnNldCk7CiAJCQlhdHRyaWJ1dGVOdW1iZXIrKzsKKwkJfSBlbHNlIHsKKwkJCWNoZWNrQXJndW1lbnRzU2l6ZSgpOwogCQl9CiAJCWNsYXNzRmlsZS5jb21wbGV0ZU1ldGhvZEluZm8obWV0aG9kQXR0cmlidXRlT2Zmc2V0LCBhdHRyaWJ1dGVOdW1iZXIpOwogCkBAIC0yNTcsNiArMjMzLDIyIEBACiAJCX0KIAl9CiAKKwlwcml2YXRlIHZvaWQgY2hlY2tBcmd1bWVudHNTaXplKCkgeworCQlUeXBlQmluZGluZ1tdIHBhcmFtZXRlcnMgPSBiaW5kaW5nLnBhcmFtZXRlcnM7CisJCWludCBzaXplID0gMTsgLy8gYW4gYWJzdGFjdCBtZXRob2Qgb3IgYSBuYXRpdmUgbWV0aG9kIGNhbm5vdCBiZSBzdGF0aWMKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVR5cGVCaW5kaW5nIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07CisJCQlpZiAocGFyYW1ldGVyID09IExvbmdCaW5kaW5nIHx8IHBhcmFtZXRlciA9PSBEb3VibGVCaW5kaW5nKSB7CisJCQkJc2l6ZSArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlzaXplKys7CisJCQl9CisJCQlpZiAoc2l6ZSA+IDB4RkYpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckFyZ3VtZW50KHNjb3BlLmxvY2Fsc1tpXSwgc2NvcGUubG9jYWxzW2ldLmRlY2xhcmF0aW9uKTsKKwkJCX0KKwkJfQorCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CiAJCXJldHVybiB0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uOwogCX0KQEAgLTMxOCwxMyArMzEwLDEzIEBACiAJCXRyeSB7CiAJCQliaW5kQXJndW1lbnRzKCk7IAogCQkJYmluZFRocm93bkV4Y2VwdGlvbnMoKTsKLQkJCXJlc29sdmVTdGF0ZW1lbnRzKHVwcGVyU2NvcGUpOworCQkJcmVzb2x2ZVN0YXRlbWVudHMoKTsKIAkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgewkvLyA9PT09PT09PT0gYWJvcnQgb24gZmF0YWwgZXJyb3IgPT09PT09PT09PT09PQogCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCX0gCiAJfQogCi0JcHVibGljIHZvaWQgcmVzb2x2ZVN0YXRlbWVudHMoQ2xhc3NTY29wZSB1cHBlclNjb3BlKSB7CisJcHVibGljIHZvaWQgcmVzb2x2ZVN0YXRlbWVudHMoKSB7CiAKIAkJaWYgKHN0YXRlbWVudHMgIT0gbnVsbCkgewogCQkJaW50IGkgPSAwLCBsZW5ndGggPSBzdGF0ZW1lbnRzLmxlbmd0aDsKQEAgLTM5NSw0ICszODcsNCBAQAogCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLAogCQlDbGFzc1Njb3BlIGNsYXNzU2NvcGUpIHsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEKaW5kZXggNDUxYWNmYy4uNjVjZGRmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDE1ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKKwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIFN0YXRlbWVudCB7CiAJcHVibGljIGludCBtb2RpZmllcnM7CiAKQEAgLTIxLDEwICsyNSwxNyBAQAogCXB1YmxpYyBpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKIAlwdWJsaWMgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kOwogCXB1YmxpYyBpbnQgbW9kaWZpZXJzU291cmNlU3RhcnQ7Ci0JcHVibGljIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbigpIHsKLQl9Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBuYW1lKCk7CiAJCisJcHVibGljIEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbigpIHt9CisKKwlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dDb250ZXh0IGZsb3dDb250ZXh0LCBGbG93SW5mbyBmbG93SW5mbykgeworCQlyZXR1cm4gZmxvd0luZm87CisJfQorCisJcHVibGljIGFic3RyYWN0IFN0cmluZyBuYW1lKCk7CisKKwlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHt9CisJCQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgewogCiAJCVN0cmluZyBzID0gdGFiU3RyaW5nKHRhYik7CkBAIC0zNiw0ICs0Nyw0IEBACiAJCQlzICs9ICIgPSAiICsgaW5pdGlhbGl6YXRpb24udG9TdHJpbmdFeHByZXNzaW9uKHRhYik7IC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIHM7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQppbmRleCA0NTE2Y2JiLi4xNGI5ODg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTI2LDcgKzI2LDYgQEAKIAlNZXRob2RCaW5kaW5nIHN5bnRoZXRpY0FjY2Vzc29yOwogCiAJcHVibGljIEFsbG9jYXRpb25FeHByZXNzaW9uKCkgewotCQlzdXBlcigpOwogCX0KIAogCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKQEAgLTM0LDcgKzMzLDggQEAKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKLQkJLy8gbXVzdCB2ZXJpZnkgdGhhdCBleGNlcHRpb25zIHBvdGVudGlhbGx5IHRocm93biBieSB0aGlzIGV4cHJlc3Npb24gYXJlIGNhdWdodCBpbiB0aGUgbWV0aG9kCisJCS8vIGNoZWNrIGNhcHR1cmVkIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gY3VycmVudCBjb250ZXh0ICgyNjEzNCkKKwkJY2hlY2tDYXB0dXJlZExvY2FsSW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwogCiAJCS8vIHByb2Nlc3MgYXJndW1lbnRzCiAJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewpAQCAtNDcsNyArNDcsNyBAQAogCQl9CiAJCS8vIHJlY29yZCBzb21lIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIGV4Y2VwdGlvbiB0eXBlcwogCQlSZWZlcmVuY2VCaW5kaW5nW10gdGhyb3duRXhjZXB0aW9uczsKLQkJaWYgKCgodGhyb3duRXhjZXB0aW9ucyA9IGJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoKSAhPSAwKSB7CisJCWlmICgoKHRocm93bkV4Y2VwdGlvbnMgPSB0aGlzLmJpbmRpbmcudGhyb3duRXhjZXB0aW9ucykubGVuZ3RoKSAhPSAwKSB7CiAJCQkvLyBjaGVjayBleGNlcHRpb24gaGFuZGxpbmcKIAkJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCiAJCQkJdGhyb3duRXhjZXB0aW9ucywKQEAgLTU3LDkgKzU3LDMwIEBACiAJCX0KIAkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOwogCQltYW5hZ2VTeW50aGV0aWNBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCQkKIAkJcmV0dXJuIGZsb3dJbmZvOwogCX0KIAorCXB1YmxpYyB2b2lkIGNoZWNrQ2FwdHVyZWRMb2NhbEluaXRpYWxpemF0aW9uSWZOZWNlc3NhcnkoUmVmZXJlbmNlQmluZGluZyBjaGVja2VkVHlwZSwgQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJaWYgKGNoZWNrZWRUeXBlLmlzTG9jYWxUeXBlKCkgCisJCQkJJiYgIWNoZWNrZWRUeXBlLmlzQW5vbnltb3VzVHlwZSgpCisJCQkJJiYgIWN1cnJlbnRTY29wZS5pc0RlZmluZWRJblR5cGUoY2hlY2tlZFR5cGUpKSB7IC8vIG9ubHkgY2hlY2sgZXh0ZXJuYWwgYWxsb2NhdGlvbnMKKwkJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGNoZWNrZWRUeXBlOworCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRzID0gbmVzdGVkVHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CisJCQlpZiAoc3ludGhldGljQXJndW1lbnRzICE9IG51bGwpIAorCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKXsKKwkJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZ3VtZW50ID0gc3ludGhldGljQXJndW1lbnRzW2ldOworCQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyB0YXJnZXRMb2NhbDsKKwkJCQkJaWYgKCh0YXJnZXRMb2NhbCA9IHN5bnRoZXRpY0FyZ3VtZW50LmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgPT0gbnVsbCkgY29udGludWU7CisJCQkJCWlmICh0YXJnZXRMb2NhbC5kZWNsYXJhdGlvbiAhPSBudWxsICYmICFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZCh0YXJnZXRMb2NhbCkpeworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKHRhcmdldExvY2FsLCB0aGlzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkJCQorCQl9CisJfQorCQogCXB1YmxpYyBFeHByZXNzaW9uIGVuY2xvc2luZ0luc3RhbmNlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC03OSw5ICsxMDAsOSBAQAogCQkvLyBiZXR0ZXIgaGlnaGxpZ2h0IGZvciBhbGxvY2F0aW9uOiBkaXNwbGF5IHRoZSB0eXBlIGluZGl2aWR1YWxseQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHR5cGUuc291cmNlU3RhcnQpOwogCi0JCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbgorCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gLSBlbmNsb3NpbmcgaW5zdGFuY2UgYXJndW1lbnRzCiAJCWlmIChhbGxvY2F0ZWRUeXBlLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljQXJndW1lbnRWYWx1ZXMoCisJCQljb2RlU3RyZWFtLmdlbmVyYXRlU3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VWYWx1ZXMoCiAJCQkJY3VycmVudFNjb3BlLAogCQkJCWFsbG9jYXRlZFR5cGUsCiAJCQkJZW5jbG9zaW5nSW5zdGFuY2UoKSwKQEAgLTkzLDYgKzExNCwxMyBAQAogCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJCX0KIAkJfQorCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gLSBvdXRlciBsb2NhbCBhcmd1bWVudHMKKwkJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNPdXRlckFyZ3VtZW50VmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCXRoaXMpOworCQl9CiAJCS8vIGludm9rZSBjb25zdHJ1Y3RvcgogCQlpZiAoc3ludGhldGljQWNjZXNzb3IgPT0gbnVsbCkgewogCQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKGJpbmRpbmcpOwpAQCAtMTM1LDE0ICsxNjMsMTEgQEAKIAkJCSYmIGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuaXNMb2NhbFR5cGUoKSkgewogCiAJCQlpZiAoYWxsb2NhdGVkVHlwZS5pc0xvY2FsVHlwZSgpKSB7Ci0JCQkJKChMb2NhbFR5cGVCaW5kaW5nKSBhbGxvY2F0ZWRUeXBlKS5hZGRJbm5lckVtdWxhdGlvbkRlcGVuZGVudCgKLQkJCQkJY3VycmVudFNjb3BlLAotCQkJCQlmYWxzZSwKLQkJCQkJZmFsc2UpOworCQkJCSgoTG9jYWxUeXBlQmluZGluZykgYWxsb2NhdGVkVHlwZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoY3VycmVudFNjb3BlLCBmYWxzZSk7CiAJCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCiAJCQl9IGVsc2UgewogCQkJCS8vIGxvY2FsbHkgcHJvcGFnYXRlLCBzaW5jZSB3ZSBhbHJlYWR5IG5vdyB0aGUgZGVzaXJlZCBzaGFwZSBmb3Igc3VyZQotCQkJCWN1cnJlbnRTY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbihhbGxvY2F0ZWRUeXBlLCBmYWxzZSwgZmFsc2UpOworCQkJCWN1cnJlbnRTY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbihhbGxvY2F0ZWRUeXBlLCBmYWxzZSk7CiAJCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCiAJCQl9CiAJCX0KQEAgLTE2MSw3ICsxODYsNyBAQAogCQkJCS8vIGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGR1bXBlZCBhcyBwcml2YXRlLCBubyBlbXVsYXRpb24gcmVxdWlyZWQgdGh1cwogCQkJfSBlbHNlIHsKIAkJCQlzeW50aGV0aWNBY2Nlc3NvciA9Ci0JCQkJCSgoU291cmNlVHlwZUJpbmRpbmcpIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nKTsKKwkJCQkJKChTb3VyY2VUeXBlQmluZGluZykgYmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcsIGlzU3VwZXJBY2Nlc3MoKSk7CiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoYmluZGluZywgdGhpcyk7CiAJCQl9CiAJCX0KQEAgLTE3MSw3ICsxOTYsNyBAQAogCiAJCS8vIFByb3BhZ2F0ZSB0aGUgdHlwZSBjaGVja2luZyB0byB0aGUgYXJndW1lbnRzLCBhbmQgY2hlY2sgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCiAJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwotCQlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOworCQl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOwogCQkvLyB3aWxsIGNoZWNrIGZvciBudWxsIGFmdGVyIGFyZ3MgYXJlIHJlc29sdmVkCiAKIAkJLy8gYnVmZmVyaW5nIHRoZSBhcmd1bWVudHMnIHR5cGVzCkBAIC0xODQsMjIgKzIwOSwyMiBAQAogCQkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IGFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCiAJCQkJCWFyZ0hhc0Vycm9yID0gdHJ1ZTsKIAkJCWlmIChhcmdIYXNFcnJvcikKLQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQl9Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKQorCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCi0JCWlmICghdHlwZUJpbmRpbmcuY2FuQmVJbnN0YW50aWF0ZWQoKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodHlwZSwgdHlwZUJpbmRpbmcpOwotCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQlpZiAoIXRoaXMucmVzb2x2ZWRUeXBlLmNhbkJlSW5zdGFudGlhdGVkKCkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluc3RhbnRpYXRlKHR5cGUsIHRoaXMucmVzb2x2ZWRUeXBlKTsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJfQotCQlSZWZlcmVuY2VCaW5kaW5nIGFsbG9jYXRlZFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmc7CisJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZTsKIAkJaWYgKCEoYmluZGluZyA9IHNjb3BlLmdldENvbnN0cnVjdG9yKGFsbG9jYXRlZFR5cGUsIGFyZ3VtZW50VHlwZXMsIHRoaXMpKQogCQkJLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCiAJCQkJYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IGFsbG9jYXRlZFR5cGU7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7Ci0JCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJCX0KIAkJaWYgKGlzTWV0aG9kVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOwpAQCAtMjUzLDQgKzI3OCw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCBiMzhiYTg5Li40YjA1ODc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKQEAgLTI3LDcgKzI3LDcgQEAKIAl9IAogCQogCS8vIHVzZSBhIGRlZmF1bHQgbmFtZSBpbiBvcmRlciB0byB0aCBuYW1lIGxvb2t1cCAKLQkvLyB0byBvcGVyYXRlIGp1YXQgbGlrZSBhIHJlZ3VsYXIgdHlwZSAod2hpY2ggaGFzIGEgbmFtZSkKKwkvLyB0byBvcGVyYXRlIGp1c3QgbGlrZSBhIHJlZ3VsYXIgdHlwZSAod2hpY2ggaGFzIGEgbmFtZSkKIAkvL3dpdGhvdXQgY2hlY2tpbmcgc3lzdGVtYXRpY2FsbHkgaWYgdGhlIG5hZW0gaXMgbnVsbCAuLi4uIAogCXB1YmxpYyBNZXRob2RCaW5kaW5nIGNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoTWV0aG9kQmluZGluZyBpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcpIHsKIApAQCAtNTIsOCArNTIsNyBAQAogCQl9CiAKIAkJLy90aGUgc3VwZXIgY2FsbCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yCi0JCWNkLmNvbnN0cnVjdG9yQ2FsbCA9Ci0JCQluZXcgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7CisJCWNkLmNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKIAkJY2QuY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7CiAJCWNkLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CiAKQEAgLTg3LDcgKzg2LDcgQEAKIAkJCQlpbmhlcml0ZWRDb25zdHJ1Y3RvckJpbmRpbmcudGhyb3duRXhjZXB0aW9ucywgLy9leGNlcHRpb25zCiAJCQkJYmluZGluZyk7IC8vZGVjbGFyaW5nQ2xhc3MKIAkJCQkKLQkJY2Quc2NvcGUgPSBuZXcgTWV0aG9kU2NvcGUoc2NvcGUsIHRoaXMsIHRydWUpOworCQljZC5zY29wZSA9IG5ldyBNZXRob2RTY29wZShzY29wZSwgY2QsIHRydWUpOwogCQljZC5iaW5kQXJndW1lbnRzKCk7CiAJCWNkLmNvbnN0cnVjdG9yQ2FsbC5yZXNvbHZlKGNkLnNjb3BlKTsKIApAQCAtMTExLDYgKzExMCwxMCBAQAogCX0KIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAorCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQkvLyByZW1lbWJlciBsb2NhbCB0eXBlcyBiaW5kaW5nIGZvciBpbm5lcmNsYXNzIGVtdWxhdGlvbiBwcm9wYWdhdGlvbgorCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucmVjb3JkKChMb2NhbFR5cGVCaW5kaW5nKWJpbmRpbmcpOworCQl9CiAJCS8vIHNjb3BlIGFuZCBiaW5kaW5nIGFyZSBwcm92aWRlZCBpbiB1cGRhdGVCaW5kaW5nU3VwZXJjbGFzcyAKIAkJcmVzb2x2ZSgpOwogCQl1cGRhdGVNYXhGaWVsZENvdW50KCk7CkBAIC0xNjcsNCArMTcwLDQgQEAKIAkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKIAkJfQogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FyZ3VtZW50LmphdmEKaW5kZXggYTA0MzM2Mi4uZjFhMDNiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bcmd1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJndW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0xOCw2ICsxOCw3IEBACiAJcHVibGljIEFyZ3VtZW50KGNoYXJbXSBuYW1lLCBsb25nIHBvc05vbSwgVHlwZVJlZmVyZW5jZSB0ciwgaW50IG1vZGlmaWVycykgewogCiAJCXN1cGVyKG51bGwsIG5hbWUsIChpbnQpIChwb3NOb20gPj4+IDMyKSwgKGludCkgcG9zTm9tKTsKKwkJdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCA9IChpbnQpIHBvc05vbTsKIAkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CiAJCXR5cGUgPSB0cjsKIAkJdGhpcy5iaXRzIHw9IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZU1BU0s7CkBAIC0yNiw3ICsyNyw3IEBACiAJcHVibGljIHZvaWQgYmluZChNZXRob2RTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIGJvb2xlYW4gdXNlZCkgewogCiAJCWlmICh0aGlzLnR5cGUgIT0gbnVsbCkKLQkJCXRoaXMudHlwZS5iaW5kaW5nID0gdHlwZUJpbmRpbmc7CisJCQl0aGlzLnR5cGUucmVzb2x2ZWRUeXBlID0gdHlwZUJpbmRpbmc7CiAJCS8vIHJlY29yZCB0aGUgcmVzb2x2ZWQgdHlwZSBpbnRvIHRoZSB0eXBlIHJlZmVyZW5jZQogCQlpbnQgbW9kaWZpZXJGbGFnID0gdGhpcy5tb2RpZmllcnM7CiAJCWlmICgodGhpcy5iaW5kaW5nID0gc2NvcGUuZHVwbGljYXRlTmFtZSh0aGlzLm5hbWUpKSAhPSBudWxsKSB7CkBAIC00MCw3ICs0MSw3IEBACiAJCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBpc1R5cGVVc2VEZXByZWNhdGVkKHR5cGVCaW5kaW5nLCBzY29wZSkpCiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUodHlwZUJpbmRpbmcsIHRoaXMudHlwZSk7CiAJCQl0aGlzLmJpbmRpbmcuZGVjbGFyYXRpb24gPSB0aGlzOwotCQkJdGhpcy5iaW5kaW5nLnVzZWQgPSB1c2VkOworCQkJdGhpcy5iaW5kaW5nLnVzZUZsYWcgPSB1c2VkID8gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRCA6IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRDsKIAkJfQogCX0KIApAQCAtODksNCArOTAsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCmluZGV4IGExZTk1OGEuLmY0NDI5YTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTI1LDggKzI1LDYgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbltdIGRpbWVuc2lvbnM7CiAJcHVibGljIEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI7CiAKLQlwdWJsaWMgQXJyYXlCaW5kaW5nIGFycmF5VGI7Ci0KIAkvKioKIAkgKiBBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCiAJICovCkBAIC02MCw3ICs1OCw2IEBACiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmc7CiAKIAkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKIAkJCWluaXRpYWxpemVyLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwpAQCAtNzUsMTMgKzcyLDEyIEBACiAJCQl9CiAKIAkJLy8gR2VuZXJhdGUgYSBzZXF1ZW5jZSBvZiBieXRlY29kZXMgY29ycmVzcG9uZGluZyB0byBhbiBhcnJheSBhbGxvY2F0aW9uCi0JCWlmICgoYXJyYXlUYi5pc0FycmF5VHlwZSgpKQotCQkJJiYgKChhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSBhcnJheVRiKS5kaW1lbnNpb25zID09IDEpKSB7CisJCWlmICh0aGlzLnJlc29sdmVkVHlwZS5kaW1lbnNpb25zKCkgPT0gMSkgewogCQkJLy8gTW9uby1kaW1lbnNpb25hbCBhcnJheQotCQkJY29kZVN0cmVhbS5uZXdBcnJheShjdXJyZW50U2NvcGUsIGFycmF5QmluZGluZyk7CisJCQljb2RlU3RyZWFtLm5ld0FycmF5KGN1cnJlbnRTY29wZSwgKEFycmF5QmluZGluZyl0aGlzLnJlc29sdmVkVHlwZSk7CiAJCX0gZWxzZSB7CiAJCQkvLyBNdWx0aS1kaW1lbnNpb25hbCBhcnJheQotCQkJY29kZVN0cmVhbS5tdWx0aWFuZXdhcnJheShhcnJheVRiLCBub25OdWxsRGltZW5zaW9uc0xlbmd0aCk7CisJCQljb2RlU3RyZWFtLm11bHRpYW5ld2FycmF5KHRoaXMucmVzb2x2ZWRUeXBlLCBub25OdWxsRGltZW5zaW9uc0xlbmd0aCk7CiAJCX0KIAogCQlpZiAodmFsdWVSZXF1aXJlZCkgewpAQCAtMTAwLDU4ICs5Niw2MCBAQAogCQkvLyBvbmx5IGF0IHRoZSAtZW5kLSBsaWtlIG5ldyBpbnQgWzRdW11bXS4gVGhlIHBhcnNlciBhbGxvd3MgbmV3IGludFtdWzRdW10KIAkJLy8gc28gdGhpcyBtdXN0IGJlIGNoZWNrZWQgaGVyZS4uLi4uLih0aGlzIGNvbWVzIGZyb20gYSByZWR1Y3Rpb24gdG8gTEwxIGdyYW1tYXIpCiAKLQkJVHlwZUJpbmRpbmcgcmVmZXJlbmNlVGIgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJVHlwZUJpbmRpbmcgcmVmZXJlbmNlVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOworCQkKIAkJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBkaW1lbnNpb25zIGFyZSBjaGVja2VkCiAJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQlpZiAocmVmZXJlbmNlVGIgPT0gVm9pZEJpbmRpbmcpIHsKKwkJaWYgKHJlZmVyZW5jZVR5cGUgPT0gVm9pZEJpbmRpbmcpIHsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFsbG9jYXRlVm9pZEFycmF5KHRoaXMpOwotCQkJcmVmZXJlbmNlVGIgPSBudWxsOyAvLyB3aWxsIHJldHVybiBiZWxvdworCQkJcmVmZXJlbmNlVHlwZSA9IG51bGw7CiAJCX0KIAogCQkvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGRpbWVuc2lvbiBzeW50YXggKGFuZCB0ZXN0IGZvciBhbGwgbnVsbCBkaW1lbnNpb25zKQotCQlpbnQgbGVuZ3RoRGltID0gLTE7CisJCWludCBleHBsaWNpdERpbUluZGV4ID0gLTE7CiAJCWZvciAoaW50IGkgPSBkaW1lbnNpb25zLmxlbmd0aDsgLS1pID49IDA7KSB7CiAJCQlpZiAoZGltZW5zaW9uc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKGxlbmd0aERpbSA9PSAtMSkKLQkJCQkJbGVuZ3RoRGltID0gaTsKLQkJCX0gZWxzZSBpZiAoCi0JCQkJbGVuZ3RoRGltICE9IC0xKSB7CisJCQkJaWYgKGV4cGxpY2l0RGltSW5kZXggPCAwKSBleHBsaWNpdERpbUluZGV4ID0gaTsKKwkJCX0gZWxzZSBpZiAoZXhwbGljaXREaW1JbmRleD4gMCkgewogCQkJCS8vIHNob3VsZCBub3QgaGF2ZSBhbiBlbXB0eSBkaW1lbnNpb24gYmVmb3JlIGFuIG5vbi1lbXB0eSBvbmUKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RMb2NhdGlvbkZvckVtcHR5RGltZW5zaW9uKHRoaXMsIGkpOwotCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9Ci0JCWlmIChyZWZlcmVuY2VUYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7CiAKLQkJLy8gbGVuZ3RoRGltID09IC0xIHNheXMgaWYgYWxsIGRpbWVuc2lvbnMgYXJlIG51bGxlZAorCQkvLyBleHBsaWNpdERpbUluZGV4IDwgMCBzYXlzIGlmIGFsbCBkaW1lbnNpb25zIGFyZSBudWxsZWQKIAkJLy8gd2hlbiBhbiBpbml0aWFsaXplciBpcyBnaXZlbiwgbm8gZGltZW5zaW9uIG11c3QgYmUgc3BlY2lmaWVkCiAJCWlmIChpbml0aWFsaXplciA9PSBudWxsKSB7Ci0JCQlpZiAobGVuZ3RoRGltID09IC0xKSB7CisJCQlpZiAoZXhwbGljaXREaW1JbmRleCA8IDApIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tdXN0RGVmaW5lRGltZW5zaW9uc09ySW5pdGlhbGl6ZXIodGhpcyk7Ci0JCQkJcmV0dXJuIG51bGw7CiAJCQl9Ci0JCX0gZWxzZSBpZiAobGVuZ3RoRGltICE9IC0xKSB7CisJCX0gZWxzZSBpZiAoZXhwbGljaXREaW1JbmRleCA+PSAwKSB7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3REZWZpbmVEaW1lbnNpb25zQW5kSW5pdGlhbGl6ZXIodGhpcyk7Ci0JCQlyZXR1cm4gbnVsbDsKIAkJfQogCiAJCS8vIGRpbWVuc2lvbnMgcmVzb2x1dGlvbiAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoRGltOyBpKyspIHsKLQkJCVR5cGVCaW5kaW5nIGRpbVRiID0gZGltZW5zaW9uc1tpXS5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgSW50QmluZGluZyk7Ci0JCQlpZiAoZGltVGIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWRpbWVuc2lvbnNbaV0uaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCBkaW1UYik7CisJCWZvciAoaW50IGkgPSAwOyBpIDw9IGV4cGxpY2l0RGltSW5kZXg7IGkrKykgeworCQkJaWYgKGRpbWVuc2lvbnNbaV0gIT0gbnVsbCkgeworCQkJCVR5cGVCaW5kaW5nIGRpbWVuc2lvblR5cGUgPSBkaW1lbnNpb25zW2ldLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBJbnRCaW5kaW5nKTsKKwkJCQlpZiAoZGltZW5zaW9uVHlwZSAhPSBudWxsKSB7CisJCQkJCWRpbWVuc2lvbnNbaV0uaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCBkaW1lbnNpb25UeXBlKTsKKwkJCQl9CisJCQl9CiAJCX0KIAogCQkvLyBidWlsZGluZyB0aGUgYXJyYXkgYmluZGluZwotCQlhcnJheVRiID0gc2NvcGUuY3JlYXRlQXJyYXkocmVmZXJlbmNlVGIsIGRpbWVuc2lvbnMubGVuZ3RoKTsKKwkJaWYgKHJlZmVyZW5jZVR5cGUgIT0gbnVsbCkgeworCQkJaWYgKGRpbWVuc2lvbnMubGVuZ3RoID4gMjU1KSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueURpbWVuc2lvbnModGhpcyk7CisJCQl9CisJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmNyZWF0ZUFycmF5KHJlZmVyZW5jZVR5cGUsIGRpbWVuc2lvbnMubGVuZ3RoKTsKIAotCQkvLyBjaGVjayB0aGUgaW5pdGlhbGl6ZXIKLQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpCi0JCQlpZiAoKGluaXRpYWxpemVyLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBhcnJheVRiKSkgIT0gbnVsbCkKLQkJCQlpbml0aWFsaXplci5iaW5kaW5nID0gYXJyYXlUYjsKLQkJcmV0dXJuIGFycmF5VGI7CisJCQkvLyBjaGVjayB0aGUgaW5pdGlhbGl6ZXIKKwkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKSB7CisJCQkJaWYgKChpbml0aWFsaXplci5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgdGhpcy5yZXNvbHZlZFR5cGUpKSAhPSBudWxsKQorCQkJCQlpbml0aWFsaXplci5iaW5kaW5nID0gKEFycmF5QmluZGluZyl0aGlzLnJlc29sdmVkVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CkBAIC0xODIsNCArMTgwLDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5SW5pdGlhbGl6ZXIuamF2YQppbmRleCAwMGUzYTI2Li43YzUxYjU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5SW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5SW5pdGlhbGl6ZXIuamF2YQpAQCAtMSwxNyArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwpAQCAtNTUsMTAgKzU0LDE4IEBACiAJCQkJCWNhc2UgVF9zaG9ydCA6CiAJCQkJCWNhc2UgVF9ieXRlIDoKIAkJCQkJY2FzZSBUX2NoYXIgOgotCQkJCQljYXNlIFRfZmxvYXQgOgogCQkJCQljYXNlIFRfbG9uZyA6CisJCQkJCQlpZiAoZXhwci5jb25zdGFudC5sb25nVmFsdWUoKSAhPSAwKSB7CisJCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKKwkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOworCQkJCQkJCWV4cHIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJCQkJY29kZVN0cmVhbS5hcnJheUF0UHV0KGVsZW1lbnRzVHlwZUlELCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUX2Zsb2F0IDoKIAkJCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJCQlpZiAoZXhwci5jb25zdGFudC5kb3VibGVWYWx1ZSgpICE9IDApIHsKKwkJCQkJCWRvdWJsZSBjb25zdGFudFZhbHVlID0gZXhwci5jb25zdGFudC5kb3VibGVWYWx1ZSgpOworCQkJCQkJaWYgKGNvbnN0YW50VmFsdWUgPT0gLTAuMCB8fCBjb25zdGFudFZhbHVlICE9IDApIHsKIAkJCQkJCQljb2RlU3RyZWFtLmR1cCgpOwogCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUoaSk7CiAJCQkJCQkJZXhwci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKQEAgLTc0LDcgKzgxLDcgQEAKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWlmIChleHByLmNvbnN0YW50ICE9IE51bGxDb25zdGFudC5EZWZhdWx0KSB7CisJCQkJCQlpZiAoIShleHByIGluc3RhbmNlb2YgTnVsbExpdGVyYWwpKSB7CiAJCQkJCQkJY29kZVN0cmVhbS5kdXAoKTsKIAkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGkpOwogCQkJCQkJCWV4cHIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVF1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YQppbmRleCA1OGY5MGUyLi4yNTRlNDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlRdWFsaWZpZWRUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMjcsOCArMjcsMTEgQEAKIAlyZXR1cm4gZGltZW5zaW9uczsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewotCWlmIChiaW5kaW5nICE9IG51bGwpCi0JCXJldHVybiBiaW5kaW5nOworCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKQorCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CisJaWYgKGRpbWVuc2lvbnMgPiAyNTUpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudG9vTWFueURpbWVuc2lvbnModGhpcyk7CisJfQogCXJldHVybiBzY29wZS5jcmVhdGVBcnJheShzY29wZS5nZXRUeXBlKHRva2VucyksIGRpbWVuc2lvbnMpOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oaW50IHRhYil7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5UmVmZXJlbmNlLmphdmEKaW5kZXggOTZiNTRmZS4uNjc3ZmU5NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0yMSw4ICsyMSw2IEBACiAJcHVibGljIEV4cHJlc3Npb24gcmVjZWl2ZXI7CiAJcHVibGljIEV4cHJlc3Npb24gcG9zaXRpb247CiAKLQlwdWJsaWMgVHlwZUJpbmRpbmcgYXJyYXlFbGVtZW50QmluZGluZzsKLQogCXB1YmxpYyBBcnJheVJlZmVyZW5jZShFeHByZXNzaW9uIHJlYywgRXhwcmVzc2lvbiBwb3MpIHsKIAkJdGhpcy5yZWNlaXZlciA9IHJlYzsKIAkJdGhpcy5wb3NpdGlvbiA9IHBvczsKQEAgLTY5LDcgKzY3LDcgQEAKIAkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQlhc3NpZ25tZW50LmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7Ci0JCWNvZGVTdHJlYW0uYXJyYXlBdFB1dChhcnJheUVsZW1lbnRCaW5kaW5nLmlkLCB2YWx1ZVJlcXVpcmVkKTsKKwkJY29kZVN0cmVhbS5hcnJheUF0UHV0KHRoaXMucmVzb2x2ZWRUeXBlLmlkLCB2YWx1ZVJlcXVpcmVkKTsKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oYXNzaWdubWVudC5pbXBsaWNpdENvbnZlcnNpb24pOwogCQl9CkBAIC04NiwxMyArODQsMTMgQEAKIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQljb2RlU3RyZWFtLmFycmF5QXQoYXJyYXlFbGVtZW50QmluZGluZy5pZCk7CisJCWNvZGVTdHJlYW0uYXJyYXlBdCh0aGlzLnJlc29sdmVkVHlwZS5pZCk7CiAJCS8vIEdlbmVyYXRpbmcgY29kZSBmb3IgdGhlIHBvdGVudGlhbCBydW50aW1lIHR5cGUgY2hlY2tpbmcKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChhcnJheUVsZW1lbnRCaW5kaW5nID09IExvbmdCaW5kaW5nCi0JCQkJfHwgYXJyYXlFbGVtZW50QmluZGluZyA9PSBEb3VibGVCaW5kaW5nKSB7CisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gTG9uZ0JpbmRpbmcKKwkJCQl8fCB0aGlzLnJlc29sdmVkVHlwZSA9PSBEb3VibGVCaW5kaW5nKSB7CiAJCQkJY29kZVN0cmVhbS5wb3AyKCk7CiAJCQl9IGVsc2UgewogCQkJCWNvZGVTdHJlYW0ucG9wKCk7CkBAIC0xMTIsNyArMTEwLDcgQEAKIAkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQljb2RlU3RyZWFtLmR1cDIoKTsKLQkJY29kZVN0cmVhbS5hcnJheUF0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQpOworCQljb2RlU3RyZWFtLmFycmF5QXQodGhpcy5yZXNvbHZlZFR5cGUuaWQpOwogCQlpbnQgb3BlcmF0aW9uVHlwZUlEOwogCQlpZiAoKG9wZXJhdGlvblR5cGVJRCA9IGltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX1N0cmluZykgewogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN0cmluZ0FwcGVuZChjdXJyZW50U2NvcGUsIG51bGwsIGV4cHJlc3Npb24pOwpAQCAtMTMwLDcgKzEyOCw3IEBACiAJCQkvLyBjYXN0IHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSBhcnJheSByZWZlcmVuY2UgdHlwZQogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uKTsKIAkJfQotCQljb2RlU3RyZWFtLmFycmF5QXRQdXQoYXJyYXlFbGVtZW50QmluZGluZy5pZCwgdmFsdWVSZXF1aXJlZCk7CisJCWNvZGVTdHJlYW0uYXJyYXlBdFB1dCh0aGlzLnJlc29sdmVkVHlwZS5pZCwgdmFsdWVSZXF1aXJlZCk7CiAJfQogCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0SW5jcmVtZW50KApAQCAtMTQyLDEwICsxNDAsMTAgQEAKIAkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCXBvc2l0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQljb2RlU3RyZWFtLmR1cDIoKTsKLQkJY29kZVN0cmVhbS5hcnJheUF0KGFycmF5RWxlbWVudEJpbmRpbmcuaWQpOworCQljb2RlU3RyZWFtLmFycmF5QXQodGhpcy5yZXNvbHZlZFR5cGUuaWQpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaWYgKChhcnJheUVsZW1lbnRCaW5kaW5nID09IExvbmdCaW5kaW5nKQotCQkJCXx8IChhcnJheUVsZW1lbnRCaW5kaW5nID09IERvdWJsZUJpbmRpbmcpKSB7CisJCQlpZiAoKHRoaXMucmVzb2x2ZWRUeXBlID09IExvbmdCaW5kaW5nKQorCQkJCXx8ICh0aGlzLnJlc29sdmVkVHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgewogCQkJCWNvZGVTdHJlYW0uZHVwMl94MigpOwogCQkJfSBlbHNlIHsKIAkJCQljb2RlU3RyZWFtLmR1cF94MigpOwpAQCAtMTU0LDI3ICsxNTIsMjggQEAKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KAogCQkJcG9zdEluY3JlbWVudC5leHByZXNzaW9uLmNvbnN0YW50LAogCQkJaW1wbGljaXRDb252ZXJzaW9uKTsKLQkJY29kZVN0cmVhbS5zZW5kT3BlcmF0b3IocG9zdEluY3JlbWVudC5vcGVyYXRvciwgYXJyYXlFbGVtZW50QmluZGluZy5pZCk7CisJCWNvZGVTdHJlYW0uc2VuZE9wZXJhdG9yKHBvc3RJbmNyZW1lbnQub3BlcmF0b3IsIHRoaXMucmVzb2x2ZWRUeXBlLmlkKTsKIAkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbigKIAkJCXBvc3RJbmNyZW1lbnQuYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWNvZGVTdHJlYW0uYXJyYXlBdFB1dChhcnJheUVsZW1lbnRCaW5kaW5nLmlkLCBmYWxzZSk7CisJCWNvZGVTdHJlYW0uYXJyYXlBdFB1dCh0aGlzLnJlc29sdmVkVHlwZS5pZCwgZmFsc2UpOwogCX0KIAogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAKIAkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci0JCVR5cGVCaW5kaW5nIGFycmF5VGIgPSByZWNlaXZlci5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmIChhcnJheVRiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFhcnJheVRiLmlzQXJyYXlUeXBlKCkpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KGFycmF5VGIsIHRoaXMpOwotCQkJcmV0dXJuIG51bGw7CisJCVR5cGVCaW5kaW5nIGFycmF5VHlwZSA9IHJlY2VpdmVyLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGFycmF5VHlwZSAhPSBudWxsKSB7CisJCQlpZiAoYXJyYXlUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBhcnJheVR5cGUpLmVsZW1lbnRzVHlwZShzY29wZSk7CisJCQl9IGVsc2UgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlZmVyZW5jZU11c3RCZUFycmF5VHlwZUF0KGFycmF5VHlwZSwgdGhpcyk7CisJCQl9CiAJCX0KLQkJVHlwZUJpbmRpbmcgcG9zaXRpb25UYiA9IHBvc2l0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKHNjb3BlLCBJbnRCaW5kaW5nKTsKLQkJaWYgKHBvc2l0aW9uVGIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlwb3NpdGlvbi5pbXBsaWNpdFdpZGVuaW5nKEludEJpbmRpbmcsIHBvc2l0aW9uVGIpOwotCQlyZXR1cm4gYXJyYXlFbGVtZW50QmluZGluZyA9ICgoQXJyYXlCaW5kaW5nKSBhcnJheVRiKS5lbGVtZW50c1R5cGUoc2NvcGUpOworCQlUeXBlQmluZGluZyBwb3NpdGlvblR5cGUgPSBwb3NpdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhzY29wZSwgSW50QmluZGluZyk7CisJCWlmIChwb3NpdGlvblR5cGUgIT0gbnVsbCkgeworCQkJcG9zaXRpb24uaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCBwb3NpdGlvblR5cGUpOworCQl9CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKQEAgLTE5MSw0ICsxOTAsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9BcnJheVR5cGVSZWZlcmVuY2UuamF2YQppbmRleCA5MWM2Zjc2Li40MTNkNzEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0FycmF5VHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXJyYXlUeXBlUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMzIsMTIgKzMyLDE1IEBACiAJcmV0dXJuIGRpbWVuc2lvbnM7CiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKLQlpZiAoYmluZGluZyAhPSBudWxsKQotCQlyZXR1cm4gYmluZGluZzsKKwlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkKKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOworCWlmIChkaW1lbnNpb25zID4gMjU1KSB7CisJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnRvb01hbnlEaW1lbnNpb25zKHRoaXMpOworCX0KIAlyZXR1cm4gc2NvcGUuY3JlYXRlQXJyYXkoc2NvcGUuZ2V0VHlwZSh0b2tlbiksIGRpbWVuc2lvbnMpOworCiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKXsKLQkvKiBzbG93IHNwZWVkICovCiAKIAlTdHJpbmcgcyA9IHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpICA7CiAJaWYgKGRpbWVuc2lvbnMgPT0gMSApIHJldHVybiBzICsgIltdIiA7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Fzc2VydFN0YXRlbWVudC5qYXZhCmluZGV4IDVhNWE1MWUuLjY1ZWJmOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzZXJ0U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NlcnRTdGF0ZW1lbnQuamF2YQpAQCAtMSwxOCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwogCkBAIC00NywzNiArNDcsMzggQEAKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CiAJCQkKLQkJQ29uc3RhbnQgY29uc3RhbnQgPSBhc3NlcnRFeHByZXNzaW9uLmNvbnN0YW50OwotCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50ICYmIGNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKLQkJCXJldHVybiBmbG93SW5mbzsKLQkJfQotCiAJCXByZUFzc2VydEluaXRTdGF0ZUluZGV4ID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOworCisJCUNvbnN0YW50IGNzdCA9IHRoaXMuYXNzZXJ0RXhwcmVzc2lvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsJCQorCQlib29sZWFuIGlzT3B0aW1pemVkVHJ1ZUFzc2VydGlvbiA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CisJCWJvb2xlYW4gaXNPcHRpbWl6ZWRGYWxzZUFzc2VydGlvbiA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCiAJCUZsb3dJbmZvIGFzc2VydEluZm8gPSBmbG93SW5mby5jb3B5KCk7Ci0JCQkKKwkJaWYgKGlzT3B0aW1pemVkVHJ1ZUFzc2VydGlvbikgeworCQkJYXNzZXJ0SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworCQl9CisJCWFzc2VydEluZm8gPSBhc3NlcnRFeHByZXNzaW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGFzc2VydEluZm8pLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkKIAkJaWYgKGV4Y2VwdGlvbkFyZ3VtZW50ICE9IG51bGwpIHsKLQkJCWFzc2VydEluZm8gPSBleGNlcHRpb25Bcmd1bWVudC5hbmFseXNlQ29kZSgKLQkJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJCWZsb3dDb250ZXh0LAotCQkJCQkJYXNzZXJ0RXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBhc3NlcnRJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkKLQkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0SW5mbyA9IGFzc2VydEV4cHJlc3Npb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgYXNzZXJ0SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQkvLyBvbmx5IGdldHMgZXZhbHVhdGVkIHdoZW4gZXNjYXBpbmcgLSByZXN1bHRzIGFyZSBub3QgdGFrZW4gaW50byBhY2NvdW50CisJCQlGbG93SW5mbyBleGNlcHRpb25JbmZvID0gZXhjZXB0aW9uQXJndW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgYXNzZXJ0SW5mby5jb3B5KCkpOyAKKwkJCQorCQkJaWYgKCFpc09wdGltaXplZFRydWVBc3NlcnRpb24peworCQkJCWZsb3dDb250ZXh0LmNoZWNrRXhjZXB0aW9uSGFuZGxlcnMoCisJCQkJCWN1cnJlbnRTY29wZS5nZXRKYXZhTGFuZ0Fzc2VydGlvbkVycm9yKCksCisJCQkJCXRoaXMsCisJCQkJCWV4Y2VwdGlvbkluZm8sCisJCQkJCWN1cnJlbnRTY29wZSk7CisJCQl9CiAJCX0KIAkJCi0JCS8vIGFzc2VydGlvbiBtaWdodCB0aHJvdyBBc3NlcnRpb25FcnJvciAodW5jaGVja2VkKSwgd2hpY2ggY2FuIGhhdmUgY29uc2VxdWVuY2VzIGluIHRlcm0gb2YKLQkJLy8gZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMgKGRlcGVuZGluZyBvbiBjYXVnaHQgZXhjZXB0aW9uIGluIHRoZSBjb250ZXh0KQotCQkvLyBESVNBQkxFRCAtIEFzc2VydGlvbkVycm9yIGlzIHVuY2hlY2tlZCwgdHJ5IHN0YXRlbWVudHMgYXJlIGFscmVhZHkgcHJvdGVjdGVkIGFnYWluc3QgdGhlc2UuCi0JCS8vZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyhjdXJyZW50U2NvcGUuZ2V0SmF2YUxhbmdBc3NlcnRpb25FcnJvcigpLCB0aGlzLCBhc3NlcnRJbmZvLCBjdXJyZW50U2NvcGUpOwotCi0JCS8vIG9ubHkgcmV0YWluIHBvdGVudGlhbCBpbml0aWFsaXphdGlvbnMKLQkJZmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShhc3NlcnRJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKLQogCQkvLyBhZGQgdGhlIGFzc2VydCBzdXBwb3J0IGluIHRoZSBjbGluaXQKIAkJbWFuYWdlU3ludGhldGljQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKLQkJCQkJCi0JCXJldHVybiBmbG93SW5mbzsKKwkJaWYgKGlzT3B0aW1pemVkRmFsc2VBc3NlcnRpb24pIHsKKwkJCXJldHVybiBmbG93SW5mbzsgLy8gaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgYmUgdW5yZWFjaGFibGUKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmbG93SW5mby5tZXJnZWRXaXRoKGFzc2VydEluZm8udW5jb25kaXRpb25hbEluaXRzKCkpOyAKKwkJfQogCX0KIAogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CkBAIC0xMzksMTMgKzE0MSwxOSBAQAogCQogCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CiAKLQkJLy8gbmVlZCBhc3NlcnRpb24gZmxhZzogJGFzc2VydGlvbnNEaXNhYmxlZCBvbiBvdXRlciBtb3N0IHNvdXJjZSB0eXBlCi0JCUNsYXNzU2NvcGUgb3V0ZXJNb3N0Q2xhc3NTY29wZSA9IGN1cnJlbnRTY29wZS5vdXRlck1vc3RDbGFzc1Njb3BlKCk7Ci0JCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGVCaW5kaW5nID0gb3V0ZXJNb3N0Q2xhc3NTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nID0gc291cmNlVHlwZUJpbmRpbmcuYWRkU3ludGhldGljRmllbGQodGhpcywgY3VycmVudFNjb3BlKTsKKwkJLy8gbmVlZCBhc3NlcnRpb24gZmxhZzogJGFzc2VydGlvbnNEaXNhYmxlZCBvbiBvdXRlciBtb3N0IHNvdXJjZSBjbGFzCisJCS8vIChpbiBjYXNlIG9mIHN0YXRpYyBtZW1iZXIgb2YgaW50ZXJmYWNlLCB3aWxsIHVzZSB0aGUgb3V0ZXJtb3N0IHN0YXRpYyBtZW1iZXIgLSBidWcgMjIzMzQpCisJCVNvdXJjZVR5cGVCaW5kaW5nIG91dGVyTW9zdENsYXNzID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkJd2hpbGUgKG91dGVyTW9zdENsYXNzLmlzTG9jYWxUeXBlKCkpeworCQkJUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmcgPSBvdXRlck1vc3RDbGFzcy5lbmNsb3NpbmdUeXBlKCk7CisJCQlpZiAoZW5jbG9zaW5nID09IG51bGwgfHwgZW5jbG9zaW5nLmlzSW50ZXJmYWNlKCkpIGJyZWFrOworCQkJb3V0ZXJNb3N0Q2xhc3MgPSAoU291cmNlVHlwZUJpbmRpbmcpIGVuY2xvc2luZzsKKwkJfQorCisJCXRoaXMuYXNzZXJ0aW9uU3ludGhldGljRmllbGRCaW5kaW5nID0gb3V0ZXJNb3N0Q2xhc3MuYWRkU3ludGhldGljRmllbGQodGhpcywgY3VycmVudFNjb3BlKTsKIAogCQkvLyBmaW5kIDxjbGluaXQ+IGFuZCBlbmFibGUgYXNzZXJ0aW9uIHN1cHBvcnQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG91dGVyTW9zdENsYXNzU2NvcGUucmVmZXJlbmNlVHlwZSgpOworCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gb3V0ZXJNb3N0Q2xhc3Muc2NvcGUucmVmZXJlbmNlVHlwZSgpOwogCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5tZXRob2RzOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOwpAQCAtMTU5LDcgKzE2Nyw3IEBACiAJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CiAKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU3RyaW5nKHRhYikpOwotCQlidWZmZXIuYXBwZW5kKCJhc3NlcnQiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJhc3NlcnQgIik7IC8vJE5PTi1OTFMtMSQKIAkJYnVmZmVyLmFwcGVuZCh0aGlzLmFzc2VydEV4cHJlc3Npb24pOwogCQlpZiAodGhpcy5leGNlcHRpb25Bcmd1bWVudCAhPSBudWxsKSB7CiAJCQlidWZmZXIuYXBwZW5kKCI6Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTE2OSw0ICsxNzcsNCBAQAogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQogCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXNzaWdubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NpZ25tZW50LmphdmEKaW5kZXggYmJmYzlhMS4uOGJkYmJkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NpZ25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3NpZ25tZW50LmphdmEKQEAgLTEsMTMgKzEsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqICAgICBHZW5hZHkgQmVyaW96a2luIC0gYWRkZWQgc3VwcG9ydCBmb3IgcmVwb3J0aW5nIGFzc2lnbm1lbnQgd2l0aCBubyBlZmZlY3QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMTcsMTUgKzE4LDE2IEBACiAKIHB1YmxpYyBjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CiAKLQlwdWJsaWMgUmVmZXJlbmNlIGxoczsKKwlwdWJsaWMgRXhwcmVzc2lvbiBsaHM7CiAJcHVibGljIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQlwdWJsaWMgVHlwZUJpbmRpbmcgbGhzVHlwZTsKLQkKKwkJCiAJcHVibGljIEFzc2lnbm1lbnQoRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IHNvdXJjZUVuZCkgewogCQkvL2xocyBpcyBhbHdheXMgYSByZWZlcmVuY2UgYnkgY29uc3RydWN0aW9uICwKIAkJLy9idXQgaXMgYnVpbGQgYXMgYW4gZXhwcmVzc2lvbiA9PT4gdGhlIGNoZWNrY2FzdCBjYW5ub3QgZmFpbAogCi0JCXRoaXMubGhzID0gKFJlZmVyZW5jZSkgbGhzOworCQl0aGlzLmxocyA9IGxoczsKKwkJbGhzLmJpdHMgfD0gSXNTdHJpY3RseUFzc2lnbmVkTUFTSzsgLy8gdGFnIGxocyBhcyBhc3NpZ25lZAorCQkKIAkJdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKIAogCQl0aGlzLnNvdXJjZVN0YXJ0ID0gbGhzLnNvdXJjZVN0YXJ0OwpAQCAtNDAsMTEgKzQyLDIwIEBACiAJCS8vIGEgZmllbGQgcmVmZXJlbmNlLCBhIGJsYW5rIGZpbmFsIGZpZWxkIHJlZmVyZW5jZSwgYSBmaWVsZCBvZiBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb3IgCiAJCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KIAotCQlyZXR1cm4gbGhzCisJCXJldHVybiAoKFJlZmVyZW5jZSkgbGhzKQogCQkJLmFuYWx5c2VBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCB0aGlzLCBmYWxzZSkKIAkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAl9CiAKKwl2b2lkIGNoZWNrQXNzaWdubWVudEVmZmVjdChCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQorCQlCaW5kaW5nIGxlZnQgPSBnZXREaXJlY3RCaW5kaW5nKHRoaXMubGhzKTsKKwkJaWYgKGxlZnQgIT0gbnVsbCAmJiBsZWZ0ID09IGdldERpcmVjdEJpbmRpbmcodGhpcy5leHByZXNzaW9uKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXNzaWdubWVudEhhc05vRWZmZWN0KHRoaXMsIGxlZnQuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJCQl0aGlzLmJpdHMgfD0gSXNBc3NpZ25tZW50V2l0aE5vRWZmZWN0TUFTSzsgLy8gcmVjb3JkIGFzc2lnbm1lbnQgaGFzIG5vIGVmZmVjdAorCQl9CisJfQorCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKAogCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKIAkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLApAQCAtNTUsMzQgKzY2LDU3IEBACiAJCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KIAogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwotCQlsaHMuZ2VuZXJhdGVBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdGhpcywgdmFsdWVSZXF1aXJlZCk7Ci0JCS8vIHZhcmlhYmxlIG1heSBoYXZlIGJlZW4gb3B0aW1pemVkIG91dAotCQkvLyB0aGUgbGhzIGlzIHJlc3BvbnNpYmxlIHRvIHBlcmZvcm0gdGhlIGltcGxpY2l0Q29udmVyc2lvbiBnZW5lcmF0aW9uIGZvciB0aGUgYXNzaWdubWVudCBzaW5jZSBvcHRpbWl6ZWQgZm9yIHVudXNlZCBsb2NhbCBhc3NpZ25tZW50LgorCQlpZiAoKHRoaXMuYml0cyAmIElzQXNzaWdubWVudFdpdGhOb0VmZmVjdE1BU0spICE9IDApIHsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJICgoUmVmZXJlbmNlKSBsaHMpLmdlbmVyYXRlQXNzaWdubWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMsIHZhbHVlUmVxdWlyZWQpOworCQkJLy8gdmFyaWFibGUgbWF5IGhhdmUgYmVlbiBvcHRpbWl6ZWQgb3V0CisJCQkvLyB0aGUgbGhzIGlzIHJlc3BvbnNpYmxlIHRvIHBlcmZvcm0gdGhlIGltcGxpY2l0Q29udmVyc2lvbiBnZW5lcmF0aW9uIGZvciB0aGUgYXNzaWdubWVudCBzaW5jZSBvcHRpbWl6ZWQgZm9yIHVudXNlZCBsb2NhbCBhc3NpZ25tZW50LgorCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQogCisJQmluZGluZyBnZXREaXJlY3RCaW5kaW5nKEV4cHJlc3Npb24gc29tZUV4cHJlc3Npb24pIHsKKwkJaWYgKHNvbWVFeHByZXNzaW9uIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgeworCQkJcmV0dXJuICgoU2luZ2xlTmFtZVJlZmVyZW5jZSlzb21lRXhwcmVzc2lvbikuYmluZGluZzsKKwkJfSBlbHNlIGlmIChzb21lRXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7CisJCQlGaWVsZFJlZmVyZW5jZSBmaWVsZFJlZiA9IChGaWVsZFJlZmVyZW5jZSlzb21lRXhwcmVzc2lvbjsKKwkJCWlmIChmaWVsZFJlZi5yZWNlaXZlci5pc1RoaXMoKSAmJiAhKGZpZWxkUmVmLnJlY2VpdmVyIGluc3RhbmNlb2YgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSkpIHsKKwkJCQlyZXR1cm4gZmllbGRSZWYuYmluZGluZzsKKwkJCX0JCQkKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCS8vIGR1ZSB0byBzeW50YXggbGhzIG1heSBiZSBvbmx5IGEgTmFtZVJlZmVyZW5jZSwgYSBGaWVsZFJlZmVyZW5jZSBvciBhbiBBcnJheVJlZmVyZW5jZQogCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKLQkJdGhpcy5saHNUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblRiID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmICh0aGlzLmxoc1R5cGUgPT0gbnVsbCB8fCBleHByZXNzaW9uVGIgPT0gbnVsbCkKKwkJaWYgKCEodGhpcy5saHMgaW5zdGFuY2VvZiBSZWZlcmVuY2UpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5leHByZXNzaW9uU2hvdWxkQmVBVmFyaWFibGUodGhpcy5saHMpOworCQl9CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsgLy8gZXhwcmVzc2lvblR5cGUgY29udGFpbnMgdGhlIGFzc2lnbm1lbnQgdHlwZSAobGhzIFR5cGUpCisJCVR5cGVCaW5kaW5nIHJoc1R5cGUgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09IG51bGwgfHwgcmhzVHlwZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQorCQl9CisJCWNoZWNrQXNzaWdubWVudEVmZmVjdChzY29wZSk7CisJCQkJCiAJCS8vIENvbXBpbGUtdGltZSBjb252ZXJzaW9uIG9mIGJhc2UtdHlwZXMgOiBpbXBsaWNpdCBuYXJyb3dpbmcgaW50ZWdlciBpbnRvIGJ5dGUvc2hvcnQvY2hhcmFjdGVyCiAJCS8vIG1heSByZXF1aXJlIHRvIHdpZGVuIHRoZSByaHMgZXhwcmVzc2lvbiBhdCBydW50aW1lCi0JCWlmICgoZXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGV4cHJlc3Npb25UYiwgdGhpcy5saHNUeXBlKQotCQkJfHwgKHRoaXMubGhzVHlwZS5pc0Jhc2VUeXBlKCkgJiYgQmFzZVR5cGVCaW5kaW5nLmlzV2lkZW5pbmcodGhpcy5saHNUeXBlLmlkLCBleHByZXNzaW9uVGIuaWQpKSkKLQkJCXx8IChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblRiLCB0aGlzLmxoc1R5cGUpKSkgewotCQkJZXhwcmVzc2lvbi5pbXBsaWNpdFdpZGVuaW5nKHRoaXMubGhzVHlwZSwgZXhwcmVzc2lvblRiKTsKLQkJCXJldHVybiB0aGlzLmxoc1R5cGU7CisJCWlmICgoZXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKHJoc1R5cGUsIHRoaXMucmVzb2x2ZWRUeXBlKQorCQkJCXx8ICh0aGlzLnJlc29sdmVkVHlwZS5pc0Jhc2VUeXBlKCkgJiYgQmFzZVR5cGVCaW5kaW5nLmlzV2lkZW5pbmcodGhpcy5yZXNvbHZlZFR5cGUuaWQsIHJoc1R5cGUuaWQpKSkKKwkJCQl8fCByaHNUeXBlLmlzQ29tcGF0aWJsZVdpdGgodGhpcy5yZXNvbHZlZFR5cGUpKSB7CisJCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcodGhpcy5yZXNvbHZlZFR5cGUsIHJoc1R5cGUpOworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQl9CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZSgKIAkJCWV4cHJlc3Npb24sCi0JCQlleHByZXNzaW9uVGIsCi0JCQl0aGlzLmxoc1R5cGUpOwotCQlyZXR1cm4gbnVsbDsKKwkJCXJoc1R5cGUsCisJCQl0aGlzLnJlc29sdmVkVHlwZSk7CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQXN0Tm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEKaW5kZXggYzdlYjgyYS4uNzZhNDVlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Bc3ROb2RlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKQEAgLTIxLDc2ICsyMSw4MiBAQAogCS8vc29tZSBnbG9iYWwgcHJvdmlzaW9uIGZvciB0aGUgaGllcmFyY2h5CiAJcHVibGljIGZpbmFsIHN0YXRpYyBDb25zdGFudCBOb3RBQ29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAKLQkvLyBzdG9yYWdlIGZvciBpbnRlcm5hbCBmbGFncyAoMzIgYml0cykKLQlwdWJsaWMgaW50IGJpdHMgPSBJc1JlYWNoYWJsZU1BU0s7IC8vIHJlYWNoYWJsZSBieSBkZWZhdWx0CisJLy8gc3RvcmFnZSBmb3IgaW50ZXJuYWwgZmxhZ3MgKDMyIGJpdHMpCQkJQklUIFVTQUdFCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MSA9IDB4MTsgCQkJLy8gcmV0dXJuIHR5cGUgKG9wZXJhdG9ycykgfCBuYW1lIHJlZmVyZW5jZSBraW5kIChuYW1lIHJlZikgfCBhZGQgYXNzZXJ0aW9uICh0eXBlIGRlY2wpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MiA9IDB4MjsgCQkJLy8gcmV0dXJuIHR5cGUgKG9wZXJhdG9ycykgfCBuYW1lIHJlZmVyZW5jZSBraW5kIChuYW1lIHJlZikgfCBoYXMgbG9jYWwgdHlwZSAodHlwZSwgbWV0aG9kLCBmaWVsZCBkZWNsKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDMgPSAweDQ7IAkJCS8vIHJldHVybiB0eXBlIChvcGVyYXRvcnMpIHwgbmFtZSByZWZlcmVuY2Uga2luZCAobmFtZSByZWYpIHwgaW1wbGljaXQgdGhpcyAodGhpcyByZWYpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0NCA9IDB4ODsgCQkJLy8gcmV0dXJuIHR5cGUgKG9wZXJhdG9ycykgfCBmaXJzdCBhc3NpZ25tZW50IHRvIGxvY2FsIChsb2NhbCBkZWNsKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDUgPSAweDEwOyAJCQkvLyB2YWx1ZSBmb3IgcmV0dXJuIChiaW5hcnkgZXhwcmVzc2lvbikgfCAKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQ2ID0gMHgyMDsgCQkJLy8gZGVwdGggKG5hbWUgcmVmLCBtc2cpIHwgb25seSB2YWx1ZSByZXF1aXJlZCAoYmluYXJ5IGV4cHJlc3Npb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0NyA9IDB4NDA7IAkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcnMpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0OCA9IDB4ODA7IAkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcnMpIAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDkgPSAweDEwMDsgCQkJLy8gZGVwdGggKG5hbWUgcmVmLCBtc2cpIHwgb3BlcmF0b3IgKG9wZXJhdG9ycykKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxMD0gMHgyMDA7IAkJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSB8IG9wZXJhdG9yIChvcGVyYXRvcnMpCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTEgPSAweDQwMDsgCQkJLy8gZGVwdGggKG5hbWUgcmVmLCBtc2cpIHwgb3BlcmF0b3IgKG9wZXJhdG9ycykKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxMiA9IDB4ODAwOyAJCQkvLyBkZXB0aCAobmFtZSByZWYsIG1zZykgfCBvcGVyYXRvciAob3BlcmF0b3JzKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDEzID0gMHgxMDAwOyAJCS8vIGRlcHRoIChuYW1lIHJlZiwgbXNnKSAKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxNCA9IDB4MjAwMDsgCQkvLyBhc3NpZ25lZCAocmVmZXJlbmNlIGxocykKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxNSA9IDB4NDAwMDsgCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTYgPSAweDgwMDA7IAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDE3ID0gMHgxMDAwMDsgCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MTggPSAweDIwMDAwOyAKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQxOSA9IDB4NDAwMDA7IAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDIwID0gMHg4MDAwMDsgCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjEgPSAweDEwMDAwMDsgCQkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyMiA9IDB4MjAwMDAwOyAJCS8vIHBhcmVudGhlc2lzIGNvdW50IChleHByZXNzaW9uKQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDIzID0gMHg0MDAwMDA7IAkJLy8gcGFyZW50aGVzaXMgY291bnQgKGV4cHJlc3Npb24pCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0MjQgPSAweDgwMDAwMDsgCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNSA9IDB4MTAwMDAwMDsgCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNiA9IDB4MjAwMDAwMDsgCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyNyA9IDB4NDAwMDAwMDsgCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyOCA9IDB4ODAwMDAwMDsgCQkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQyOSA9IDB4MTAwMDAwMDA7IAkvLyBwYXJlbnRoZXNpcyBjb3VudCAoZXhwcmVzc2lvbikKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQzMCA9IDB4MjAwMDAwMDA7IAkvLyBhc3NpZ25tZW50IHdpdGggbm8gZWZmZWN0IChhc3NpZ25tZW50KQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdDMxID0gMHg0MDAwMDAwMDsgCS8vIGxvY2FsIGRlY2xhcmF0aW9uIHJlYWNoYWJsZSAobG9jYWwgZGVjbCkKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXQzMiA9IDB4ODAwMDAwMDA7IAkvLyByZWFjaGFibGUgKHN0YXRlbWVudCkKIAotCS8vIGZvciBvcGVyYXRvcnMgb25seQotCS8vIFJlYWNoIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiBPIE8gTyBPIE8gTyBWIFZyUiBSIFIgUgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJldHVyblR5cGVJRE1BU0sgPSAxNTsgLy8gNCBsb3dlciBiaXRzIGZvciBvcGVyYXRvcnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWYWx1ZUZvclJldHVybk1BU0sgPSAxNjsgLy8gZm9yIGJpbmFyeSBleHByZXNzaW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ubHlWYWx1ZVJlcXVpcmVkTUFTSyA9IDMyOyAvLyBmb3IgYmluYXJ5IGV4cHJlc3Npb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3BlcmF0b3JTSElGVCA9IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3BlcmF0b3JNQVNLID0gNjMgPDwgT3BlcmF0b3JTSElGVDsKKwlwdWJsaWMgaW50IGJpdHMgPSBJc1JlYWNoYWJsZU1BU0s7IAkJCQkvLyByZWFjaGFibGUgYnkgZGVmYXVsdAogCi0JLy8gZm9yIG5hbWUgcmVmZXJlbmNlcyBvbmx5Ci0JLy8gUmVhY2ggLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiBEIEQgRCBEIEQgRCBEIEQgVnJGIFIgUiBSCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUmVzdHJpY3RpdmVGbGFnTUFTSyA9IDc7Ci0JLy8gMyBsb3dlciBiaXRzIGZvciBuYW1lIHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGaXJzdEFzc2lnbm1lbnRUb0xvY2FsTUFTSyA9IDg7CisJLy8gZm9yIG9wZXJhdG9ycyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZXR1cm5UeXBlSURNQVNLID0gQml0MXxCaXQyfEJpdDN8Qml0NDsgCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT3BlcmF0b3JTSElGVCA9IDY7CS8vIEJpdDcgLT4gQml0MTIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPcGVyYXRvck1BU0sgPSBCaXQ3fEJpdDh8Qml0OXxCaXQxMHxCaXQxMXxCaXQxMjsgLy8gNiBiaXRzIGZvciBvcGVyYXRvciBJRAorCisJLy8gZm9yIGJpbmFyeSBleHByZXNzaW9ucworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZhbHVlRm9yUmV0dXJuTUFTSyA9IEJpdDU7IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ubHlWYWx1ZVJlcXVpcmVkTUFTSyA9IEJpdDY7IAorCisJLy8gZm9yIG5hbWUgcmVmZXJlbmNlcyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSZXN0cmljdGl2ZUZsYWdNQVNLID0gQml0MXxCaXQyfEJpdDM7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZpcnN0QXNzaWdubWVudFRvTG9jYWxNQVNLID0gQml0NDsKKwkKKwkvLyBmb3IgdGhpcyByZWZlcmVuY2UKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc0ltcGxpY2l0VGhpc01hc2sgPSBCaXQzOyAKKwogCS8vIGZvciBzaW5nbGUgbmFtZSByZWZlcmVuY2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGVwdGhTSElGVCA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRGVwdGhNQVNLID0gMHhGRiA8PCBEZXB0aFNISUZUOwotCS8vIDggYml0cyBmb3IgYWN0dWFsIGRlcHRoIHZhbHVlIChtYXguIDI1NSkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEZXB0aFNISUZUID0gNTsJLy8gQml0NiAtPiBCaXQxMworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERlcHRoTUFTSyA9IEJpdDZ8Qml0N3xCaXQ4fEJpdDl8Qml0MTB8Qml0MTF8Qml0MTJ8Qml0MTM7IC8vIDggYml0cyBmb3IgYWN0dWFsIGRlcHRoIHZhbHVlIChtYXguIDI1NSkKIAotCS8vIGZvciBzdGF0ZW1lbnRzIG9ubHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc1JlYWNoYWJsZU1BU0sgPSAweDgwMDAwMDAwOyAvLyBoaWdoZXN0IGJpdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzTG9jYWxEZWNsYXJhdGlvblJlYWNoYWJsZU1BU0sgPSAweDQwMDAwMDAwOyAvLyBiZWxvdyBoaWdoZXN0IGJpdAorCS8vIGZvciBzdGF0ZW1lbnRzIAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzUmVhY2hhYmxlTUFTSyA9IEJpdDMyOyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJc0xvY2FsRGVjbGFyYXRpb25SZWFjaGFibGVNQVNLID0gQml0MzE7IAogCi0JLy8gZm9yIHR5cGUgZGVjbGFyYXRpb24gb25seQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFkZEFzc2VydGlvbk1BU0sgPSAxOyAvLyBsb3dlc3QgYml0CisJLy8gZm9yIHR5cGUgZGVjbGFyYXRpb24KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBZGRBc3NlcnRpb25NQVNLID0gQml0MTsKIAotCS8vIGZvciB0eXBlLCBtZXRob2QgYW5kIGZpZWxkIGRlY2xhcmF0aW9ucyBvbmx5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSGFzTG9jYWxUeXBlTUFTSyA9IDI7Ci0JLy8gY2Fubm90IGNvbmZsaWN0IHdpdGggQWRkQXNzZXJ0aW9uTUFTSworCS8vIGZvciB0eXBlLCBtZXRob2QgYW5kIGZpZWxkIGRlY2xhcmF0aW9ucyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIYXNMb2NhbFR5cGVNQVNLID0gQml0MjsgLy8gY2Fubm90IGNvbmZsaWN0IHdpdGggQWRkQXNzZXJ0aW9uTUFTSwogCi0JLyoKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMT0gMHgxOyAvLyBkZWNpbWFsIDEKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMj0gMHgyOyAvLyBkZWNpbWFsIDIKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMz0gMHg0OyAvLyBkZWNpbWFsIDQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrND0gMHg4OyAvLyBkZWNpbWFsIDgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrNT0gMHgxMDsgLy8gZGVjaW1hbCAxNgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2s2PSAweDIwOyAvLyBkZWNpbWFsIDMyCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazc9IDB4NDA7IC8vIGRlY2ltYWwgNjQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrOD0gMHg4MDsgLy8gZGVjaW1hbCAxMjgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrOT0gMHgxMDA7IC8vIGRlY2ltYWwgMjU2Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazEwPSAweDIwMDsgLy8gZGVjaW1hbCA1MTIKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTE9IDB4NDAwOyAvLyBkZWNpbWFsIDEwMjQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTI9IDB4ODAwOyAvLyBkZWNpbWFsIDIwNDgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTM9IDB4MTAwMDsgLy8gZGVjaW1hbCA0MDk2Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE0PSAweDIwMDA7IC8vIGRlY2ltYWwgODE5MgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2sxNT0gMHg0MDAwOyAvLyBkZWNpbWFsIDE2Mzg0Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE2PSAweDgwMDA7IC8vIGRlY2ltYWwgMzI3NjgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTc9IDB4MTAwMDA7IC8vIGRlY2ltYWwgNjU1MzYKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMTg9IDB4MjAwMDA7IC8vIGRlY2ltYWwgMTMxMDcyCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazE5PSAweDQwMDAwOyAvLyBkZWNpbWFsIDI2MjE0NAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2syMD0gMHg4MDAwMDsgLy8gZGVjaW1hbCA1MjQyODgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjE9IDB4MTAwMDAwOyAvLyBkZWNpbWFsIDEwNDg1NzYKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjI9IDB4MjAwMDAwOyAvLyBkZWNpbWFsIDIwOTcxNTIKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjM9IDB4NDAwMDAwOyAvLyBkZWNpbWFsIDQxOTQzMDQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjQ9IDB4ODAwMDAwOyAvLyBkZWNpbWFsIDgzODg2MDgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjU9IDB4MTAwMDAwMDsgLy8gZGVjaW1hbCAxNjc3NzIxNgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2syNj0gMHgyMDAwMDAwOyAvLyBkZWNpbWFsIDMzNTU0NDMyCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazI3PSAweDQwMDAwMDA7IC8vIGRlY2ltYWwgNjcxMDg4NjQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjg9IDB4ODAwMDAwMDsgLy8gZGVjaW1hbCAxMzQyMTc3MjgKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCaXRNYXNrMjk9IDB4MTAwMDAwMDA7IC8vIGRlY2ltYWwgMjY4NDM1NDU2Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazMwPSAweDIwMDAwMDAwOyAvLyBkZWNpbWFsIDUzNjg3MDkxMgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJpdE1hc2szMT0gMHg0MDAwMDAwMDsgLy8gZGVjaW1hbCAxMDczNzQxODI0Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0TWFzazMyPSAweDgwMDAwMDAwOyAvLyBkZWNpbWFsIDIxNDc0ODM2NDgJCi0JKi8KKwkvLyBmb3IgZXhwcmVzc2lvbiAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQYXJlbnRoZXNpemVkU0hJRlQgPSAyMTsgLy8gQml0MjIgLT4gQml0MjkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQYXJlbnRoZXNpemVkTUFTSyA9IEJpdDIyfEJpdDIzfEJpdDI0fEJpdDI1fEJpdDI2fEJpdDI3fEJpdDI4fEJpdDI5OyAvLyA4IGJpdHMgZm9yIHBhcmVudGhlc2lzIGNvdW50IHZhbHVlIChtYXguIDI1NSkKIAotCS8qKgotCSAqIEFzdE5vZGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KKwkvLyBmb3IgYXNzaWdubWVudAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElzQXNzaWdubWVudFdpdGhOb0VmZmVjdE1BU0sgPSBCaXQzMDsJCisJCisJLy8gZm9yIHJlZmVyZW5jZXMgb24gbGhzIG9mIGFzc2lnbm1lbnQgKHNldCBvbmx5IGZvciB0cnVlIGFzc2lnbm1lbnRzLCBhcyBvcHBvc2VkIHRvIGNvbXBvdW5kIG9uZXMpCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSXNTdHJpY3RseUFzc2lnbmVkTUFTSyA9IEJpdDE0OworCQogCXB1YmxpYyBBc3ROb2RlKCkgewogCiAJCXN1cGVyKCk7CkBAIC0xMDksMTYgKzExNSw0NCBAQAogCSovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWVsZFVzZURlcHJlY2F0ZWQoRmllbGRCaW5kaW5nIGZpZWxkLCBTY29wZSBzY29wZSkgewogCi0JCXJldHVybiBmaWVsZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpCi0JCQkmJiAhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChmaWVsZC5kZWNsYXJpbmdDbGFzcyk7CisJCWlmIChmaWVsZC5pc1ByaXZhdGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5GaWVsZChmaWVsZCkpIHsKKwkJCS8vIGlnbm9yZSBjYXNlcyB3aGVyZSBmaWVsZCBpcyB1c2VkIGZyb20gd2l0aGluIGluc2lkZSBpdHNlbGYgCisJCQlmaWVsZC5tb2RpZmllcnMgfD0gQWNjUHJpdmF0ZVVzZWQ7CisJCX0KKworCQlpZiAoIWZpZWxkLmlzVmlld2VkQXNEZXByZWNhdGVkKCkpIHJldHVybiBmYWxzZTsKKworCQkvLyBpbnNpZGUgc2FtZSB1bml0IC0gbm8gcmVwb3J0CisJCWlmIChzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KGZpZWxkLmRlY2xhcmluZ0NsYXNzKSkgcmV0dXJuIGZhbHNlOworCQkKKwkJLy8gaWYgY29udGV4dCBpcyBkZXByZWNhdGVkLCBtYXkgYXZvaWQgcmVwb3J0aW5nCisJCWlmICghc2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLnJlcG9ydERlcHJlY2F0aW9uSW5zaWRlRGVwcmVjYXRlZENvZGUgJiYgc2NvcGUuaXNJbnNpZGVEZXByZWNhdGVkQ29kZSgpKSByZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOwogCX0KIAorCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUaGlzKCkgeworCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKIAkvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbWV0aG9kIHVzZSBpcyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCiAJKiBBbiBhY2Nlc3MgaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdCBpcyBhbGxvd2VkLgogCSovCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNZXRob2RVc2VEZXByZWNhdGVkKE1ldGhvZEJpbmRpbmcgbWV0aG9kLCBTY29wZSBzY29wZSkgewotCQlyZXR1cm4gbWV0aG9kLmlzVmlld2VkQXNEZXByZWNhdGVkKCkKLQkJCSYmICFzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KG1ldGhvZC5kZWNsYXJpbmdDbGFzcyk7CisKKwkJaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5NZXRob2QobWV0aG9kKSkgeworCQkJLy8gaWdub3JlIGNhc2VzIHdoZXJlIG1ldGhvZCBpcyB1c2VkIGZyb20gd2l0aGluIGluc2lkZSBpdHNlbGYgKGUuZy4gZGlyZWN0IHJlY3Vyc2lvbnMpCisJCQltZXRob2QubW9kaWZpZXJzIHw9IEFjY1ByaXZhdGVVc2VkOworCQl9CisJCQorCQlpZiAoIW1ldGhvZC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSByZXR1cm4gZmFsc2U7CisKKwkJLy8gaW5zaWRlIHNhbWUgdW5pdCAtIG5vIHJlcG9ydAorCQlpZiAoc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChtZXRob2QuZGVjbGFyaW5nQ2xhc3MpKSByZXR1cm4gZmFsc2U7CisJCQorCQkvLyBpZiBjb250ZXh0IGlzIGRlcHJlY2F0ZWQsIG1heSBhdm9pZCByZXBvcnRpbmcKKwkJaWYgKCFzY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMucmVwb3J0RGVwcmVjYXRpb25JbnNpZGVEZXByZWNhdGVkQ29kZSAmJiBzY29wZS5pc0luc2lkZURlcHJlY2F0ZWRDb2RlKCkpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKQEAgLTE0Miw3ICsxNzYsMjAgQEAKIAkJCXJldHVybiBmYWxzZTsKIAogCQlSZWZlcmVuY2VCaW5kaW5nIHJlZlR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgdHlwZTsKLQkJcmV0dXJuIHJlZlR5cGUuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5TYW1lVW5pdChyZWZUeXBlKTsKKworCQlpZiAocmVmVHlwZS5pc1ByaXZhdGUoKSAmJiAhc2NvcGUuaXNEZWZpbmVkSW5UeXBlKHJlZlR5cGUpKSB7CisJCQkvLyBpZ25vcmUgY2FzZXMgd2hlcmUgdHlwZSBpcyB1c2VkIGZyb20gd2l0aGluIGluc2lkZSBpdHNlbGYgCisJCQlyZWZUeXBlLm1vZGlmaWVycyB8PSBBY2NQcml2YXRlVXNlZDsKKwkJfQorCisJCWlmICghcmVmVHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSByZXR1cm4gZmFsc2U7CisJCQorCQkvLyBpbnNpZGUgc2FtZSB1bml0IC0gbm8gcmVwb3J0CisJCWlmIChzY29wZS5pc0RlZmluZWRJblNhbWVVbml0KHJlZlR5cGUpKSByZXR1cm4gZmFsc2U7CisJCQorCQkvLyBpZiBjb250ZXh0IGlzIGRlcHJlY2F0ZWQsIG1heSBhdm9pZCByZXBvcnRpbmcKKwkJaWYgKCFzY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMucmVwb3J0RGVwcmVjYXRpb25JbnNpZGVEZXByZWNhdGVkQ29kZSAmJiBzY29wZS5pc0luc2lkZURlcHJlY2F0ZWRDb2RlKCkpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZpZXJzU3RyaW5nKGludCBtb2RpZmllcnMpIHsKQEAgLTIwNSw0ICsyNTIsNCBAQAogCQogCXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CaW5hcnlFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JpbmFyeUV4cHJlc3Npb24uamF2YQppbmRleCAyZTM4ZDgyLi5jMDQ3ZGZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JpbmFyeUV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JpbmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC00NiwzNCArNDYsMzQgQEAKIAlwdWJsaWMgdm9pZCBjb21wdXRlQ29uc3RhbnQoQmxvY2tTY29wZSBzY29wZSwgaW50IGxlZnRJZCwgaW50IHJpZ2h0SWQpIHsKIAogCQkvL2NvbXB1dGUgdGhlIGNvbnN0YW50IHdoZW4gdmFsaWQKLQkJaWYgKChsZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKLQkJCSYmIChyaWdodC5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpKSB7CisJCWlmICgodGhpcy5sZWZ0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKKwkJCSYmICh0aGlzLnJpZ2h0LmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHsKIAkJCXRyeSB7Ci0JCQkJY29uc3RhbnQgPQorCQkJCXRoaXMuY29uc3RhbnQgPQogCQkJCQlDb25zdGFudC5jb21wdXRlQ29uc3RhbnRPcGVyYXRpb24oCi0JCQkJCQlsZWZ0LmNvbnN0YW50LAorCQkJCQkJdGhpcy5sZWZ0LmNvbnN0YW50LAogCQkJCQkJbGVmdElkLAotCQkJCQkJKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQsCi0JCQkJCQlyaWdodC5jb25zdGFudCwKKwkJCQkJCSh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQsCisJCQkJCQl0aGlzLnJpZ2h0LmNvbnN0YW50LAogCQkJCQkJcmlnaHRJZCk7CiAJCQl9IGNhdGNoIChBcml0aG1ldGljRXhjZXB0aW9uIGUpIHsKLQkJCQljb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKKwkJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQkJCS8vIDEuMiBubyBsb25nZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhdCBjb21waWxlLXRpbWUKIAkJCQkvL3Njb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbXBpbGVUaW1lQ29uc3RhbnRUaHJvd3NBcml0aG1ldGljRXhjZXB0aW9uKHRoaXMpOwogCQkJfQogCQl9IGVsc2UgewotCQkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CisJCQl0aGlzLmNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwogCQkJLy9hZGQgc29tZSB3b3JrIGZvciB0aGUgYm9vbGVhbiBvcGVyYXRvcnMgJiB8ICAKLQkJCW9wdGltaXplZEJvb2xlYW5Db25zdGFudCgKKwkJCXRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KAogCQkJCWxlZnRJZCwKLQkJCQkoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCwKKwkJCQkodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZULAogCQkJCXJpZ2h0SWQpOwogCQl9CiAJfQogCi0JcHVibGljIENvbnN0YW50IGNvbmRpdGlvbmFsQ29uc3RhbnQoKSB7CisJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpIHsKIAotCQlyZXR1cm4gb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID09IG51bGwgPyBjb25zdGFudCA6IG9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKKwkJcmV0dXJuIHRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID09IG51bGwgPyB0aGlzLmNvbnN0YW50IDogdGhpcy5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CiAJfQogCiAJLyoqCkBAIC02OTksNyArNjk5LDYgQEAKIAkJTGFiZWwgZmFsc2VMYWJlbCwKIAkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAKLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaW50IHByb21vdGVkVHlwZUlEID0gbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNDsKIAkJLy8gYm90aCBzaWRlcyBnb3QgcHJvbW90ZWQgaW4gdGhlIHNhbWUgd2F5CiAJCWlmIChwcm9tb3RlZFR5cGVJRCA9PSBUX2ludCkgewpAQCAtNzIxLDcgKzcyMCw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQkvLyB4ID4gMApAQCAtNzQyLDcgKzc0Miw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTc2OSw3ICs3NzAsOCBAQAogCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGwoKTsKIAkJCQkJCQljb2RlU3RyZWFtLmlmZ3QodHJ1ZUxhYmVsKTsKIAkJCQkJfQotCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtNzkxLDcgKzc5Myw4IEBACiAJCQkJCQkJY29kZVN0cmVhbS5kY21wbCgpOwogCQkJCQkJCWNvZGVTdHJlYW0uaWZsZShmYWxzZUxhYmVsKTsKIAkJCQkJfQotCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJCXJldHVybjsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCkBAIC04MTAsNyArODEzLDYgQEAKIAkJTGFiZWwgZmFsc2VMYWJlbCwKIAkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAKLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJaW50IHByb21vdGVkVHlwZUlEID0gbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPj4gNDsKIAkJLy8gYm90aCBzaWRlcyBnb3QgcHJvbW90ZWQgaW4gdGhlIHNhbWUgd2F5CiAJCWlmIChwcm9tb3RlZFR5cGVJRCA9PSBUX2ludCkgewpAQCAtODMyLDcgKzgzNCw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQkvLyB4ID49IDAKQEAgLTg1Myw3ICs4NTYsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC04ODAsNyArODg0LDggQEAKIAkJCQkJCQljb2RlU3RyZWFtLmRjbXBsKCk7CiAJCQkJCQkJY29kZVN0cmVhbS5pZmdlKHRydWVMYWJlbCk7CiAJCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTkwMiw3ICs5MDcsOCBAQAogCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGwoKTsKIAkJCQkJCQljb2RlU3RyZWFtLmlmbHQoZmFsc2VMYWJlbCk7CiAJCQkJCX0KLQkJCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQogCQkJCQlyZXR1cm47CiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgpAQCAtOTIxLDcgKzkyNyw2IEBACiAJCUxhYmVsIGZhbHNlTGFiZWwsCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCi0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCWludCBwcm9tb3RlZFR5cGVJRCA9IGxlZnQuaW1wbGljaXRDb252ZXJzaW9uID4+IDQ7CiAJCS8vIGJvdGggc2lkZXMgZ290IHByb21vdGVkIGluIHRoZSBzYW1lIHdheQogCQlpZiAocHJvbW90ZWRUeXBlSUQgPT0gVF9pbnQpIHsKQEAgLTk0Myw3ICs5NDgsNyBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQkvLyB4IDwgMApAQCAtOTY0LDcgKzk2OSw3IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtOTkxLDcgKzk5Niw3IEBACiAJCQkJCQkJY29kZVN0cmVhbS5kY21wZygpOwogCQkJCQkJCWNvZGVTdHJlYW0uaWZsdCh0cnVlTGFiZWwpOwogCQkJCQl9Ci0JCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtMTAxMyw3ICsxMDE4LDcgQEAKIAkJCQkJCQljb2RlU3RyZWFtLmRjbXBnKCk7CiAJCQkJCQkJY29kZVN0cmVhbS5pZmdlKGZhbHNlTGFiZWwpOwogCQkJCQl9Ci0JCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJCQkJCXJldHVybjsKIAkJCQl9IGVsc2UgewogCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCkBAIC0xMDMyLDcgKzEwMzcsNiBAQAogCQlMYWJlbCBmYWxzZUxhYmVsLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlpbnQgcHJvbW90ZWRUeXBlSUQgPSBsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0OwogCQkvLyBib3RoIHNpZGVzIGdvdCBwcm9tb3RlZCBpbiB0aGUgc2FtZSB3YXkKIAkJaWYgKHByb21vdGVkVHlwZUlEID09IFRfaW50KSB7CkBAIC0xMDU0LDcgKzEwNTgsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJcmV0dXJuOwogCQkJfQogCQkJLy8geCA8PSAwCkBAIC0xMDc1LDcgKzEwODAsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC0xMTAyLDcgKzExMDgsOCBAQAogCQkJCQkJCWNvZGVTdHJlYW0uZGNtcGcoKTsKIAkJCQkJCQljb2RlU3RyZWFtLmlmbGUodHJ1ZUxhYmVsKTsKIAkJCQkJfQotCQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtMTEyNCw3ICsxMTMxLDggQEAKIAkJCQkJCQljb2RlU3RyZWFtLmRjbXBnKCk7CiAJCQkJCQkJY29kZVN0cmVhbS5pZmd0KGZhbHNlTGFiZWwpOwogCQkJCQl9Ci0JCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCisJCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIAkJCQkJcmV0dXJuOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKQEAgLTExNDMsMTAgKzExNTEsOSBAQAogCQlMYWJlbCBmYWxzZUxhYmVsLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAkJCQotCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlDb25zdGFudCBjb25kQ29uc3Q7CiAJCWlmICgobGVmdC5pbXBsaWNpdENvbnZlcnNpb24gJiAweEYpID09IFRfYm9vbGVhbikgewotCQkJaWYgKChjb25kQ29uc3QgPSBsZWZ0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewogCQkJCQkvLyA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4gJiB4CiAJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKApAQCAtMTE4OSwxMSArMTE5NiwxMiBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQorCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJaWYgKChjb25kQ29uc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJaWYgKChjb25kQ29uc3QgPSByaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJCS8vIHggJiA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4KIAkJCQkJaWYgKChiaXRzICYgT25seVZhbHVlUmVxdWlyZWRNQVNLKSAhPSAwKSB7CkBAIC0xMjM2LDggKzEyNDQsOSBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQorCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC0xMjYyLDcgKzEyNzEsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJfQogCQogCS8qKgpAQCAtMTI3NSwxMCArMTI4NSw5IEBACiAJCUxhYmVsIGZhbHNlTGFiZWwsCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCQkJCi0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCUNvbnN0YW50IGNvbmRDb25zdDsKIAkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgPT0gVF9ib29sZWFuKSB7Ci0JCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmICgoY29uZENvbnN0ID0gbGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiB8IHgKIAkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCkBAIC0xMzAyLDYgKzEzMTEsOCBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQorCQkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiB8IHgKIAkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCkBAIC0xMzIxLDEwICsxMzMyLDkgQEAKIAkJCQkJCQl2YWx1ZVJlcXVpcmVkKTsKIAkJCQkJfQogCQkJCX0KLQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCWlmICgoY29uZENvbnN0ID0gcmlnaHQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmICgoY29uZENvbnN0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewogCQkJCQkvLyB4IHwgPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+CiAJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKApAQCAtMTM0OCw2ICsxMzU4LDggQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQkJLy8gcmVwb3NpdGlvbiB0aGUgZW5kUEMKKwkJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQogCQkJCX0gZWxzZSB7CiAJCQkJCS8vIHggfCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gZmFsc2U+CiAJCQkJCWlmICgoYml0cyAmIE9ubHlWYWx1ZVJlcXVpcmVkTUFTSykgIT0gMCkgewpAQCAtMTM2Nyw3ICsxMzc5LDYgQEAKIAkJCQkJCWZhbHNlTGFiZWwsCiAJCQkJCQlmYWxzZSk7CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC0xMzkyLDcgKzE0MDMsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJfQogCQogCS8qKgpAQCAtMTQwNSwxMCArMTQxNyw5IEBACiAJCUxhYmVsIGZhbHNlTGFiZWwsCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCQkJCi0JCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCUNvbnN0YW50IGNvbmRDb25zdDsKIAkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgPT0gVF9ib29sZWFuKSB7Ci0JCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmICgoY29uZENvbnN0ID0gbGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiBeIHgKIAkJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCkBAIC0xNDQyLDEwICsxNDUzLDkgQEAKIAkJCQkJCQl2YWx1ZVJlcXVpcmVkKTsKIAkJCQkJfQogCQkJCX0KLQkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCWlmICgoY29uZENvbnN0ID0gcmlnaHQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCWlmICgoY29uZENvbnN0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewogCQkJCQkvLyB4IF4gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIHRydWU+CiAJCQkJCWxlZnQuZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKApAQCAtMTQ3OSw3ICsxNDg5LDYgQEAKIAkJCQkJCWZhbHNlTGFiZWwsCiAJCQkJCQlmYWxzZSk7CiAJCQkJfQotCQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CkBAIC0xNTA0LDcgKzE1MTMsOCBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwkJCQkJCiAJfQogCQogCXB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkU3RyaW5nQnVmZmVyKApAQCAtMTU5MSwxOSArMTYwMSwxOSBAQAogCQkJCQlyZXR1cm47CiAJCQljYXNlIEFORF9BTkQgOgogCQkJCUNvbnN0YW50IGNzdDsKLQkJCQlpZiAoKGNzdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAoKGNzdCA9IGxlZnQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7IC8vIGxlZnQgaXMgZXF1aXZhbGVudCB0byBmYWxzZQogCQkJCQkJb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY3N0OyAvLyBjb25zdGFudChmYWxzZSkKIAkJCQkJCXJldHVybjsKIAkJCQkJfSBlbHNlIHsgLy9sZWZ0IGlzIGVxdWl2YWxlbnQgdG8gdHJ1ZQotCQkJCQkJaWYgKChjc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCQkJaWYgKChjc3QgPSByaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJCQkJb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY3N0OwogCQkJCQkJCS8vIHRoZSBjb25kaXRpb25hbCByZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmlnaHQgY29uZGl0aW9uYWwgdmFsdWUKIAkJCQkJCX0KIAkJCQkJCXJldHVybjsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAoKGNzdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJaWYgKChjc3QgPSByaWdodC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJCWlmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsgLy8gcmlnaHQgaXMgZXF1aXZhbGVudCB0byBmYWxzZQogCQkJCQkJb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY3N0OyAvLyBjb25zdGFudChmYWxzZSkKIAkJCQkJfQpAQCAtMTYxMywxOCArMTYyMywxOCBAQAogCQkJCWlmICgobGVmdElkICE9IFRfYm9vbGVhbikgfHwgKHJpZ2h0SWQgIT0gVF9ib29sZWFuKSkKIAkJCQkJcmV0dXJuOwogCQkJY2FzZSBPUl9PUiA6Ci0JCQkJaWYgKChjc3QgPSBsZWZ0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJaWYgKChjc3QgPSBsZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCQkJaWYgKGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7IC8vIGxlZnQgaXMgZXF1aXZhbGVudCB0byB0cnVlCiAJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7IC8vIGNvbnN0YW50KHRydWUpCiAJCQkJCQlyZXR1cm47CiAJCQkJCX0gZWxzZSB7IC8vbGVmdCBpcyBlcXVpdmFsZW50IHRvIGZhbHNlCi0JCQkJCQlpZiAoKGNzdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCQlpZiAoKGNzdCA9IHJpZ2h0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7CiAJCQkJCQl9CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KIAkJCQl9Ci0JCQkJaWYgKChjc3QgPSByaWdodC5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgeworCQkJCWlmICgoY3N0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJCQlpZiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsgLy8gcmlnaHQgaXMgZXF1aXZhbGVudCB0byB0cnVlCiAJCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBjc3Q7IC8vIGNvbnN0YW50KHRydWUpCiAJCQkJCX0KQEAgLTE2ODYsMjggKzE2OTYsMjggQEAKIAkJc3dpdGNoIChyZXN1bHQgJiAweEYpIHsgLy8gcmVjb3JkIHRoZSBjdXJyZW50IFJldHVyblR5cGVJRAogCQkJLy8gb25seSBzd2l0Y2ggb24gcG9zc2libGUgcmVzdWx0IHR5cGUuLi4uLgogCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBCb29sZWFuQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IEJvb2xlYW5CaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBCeXRlQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IEJ5dGVCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2NoYXIgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBDaGFyQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IENoYXJCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IERvdWJsZUJpbmRpbmc7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBEb3VibGVCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gRmxvYXRCaW5kaW5nOworCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gRmxvYXRCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IEludEJpbmRpbmc7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBJbnRCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBMb25nQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IExvbmdCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX1N0cmluZyA6Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IHNjb3BlLmdldEphdmFMYW5nU3RyaW5nKCk7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6IC8vZXJyb3IuLi4uLi4uLgogCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwpAQCAtMTcxNyw3ICsxNzI3LDcgQEAKIAogCQkvLyBjb21wdXRlIHRoZSBjb25zdGFudCB3aGVuIHZhbGlkCiAJCWNvbXB1dGVDb25zdGFudChzY29wZSwgbGVmdElkLCByaWdodElkKTsKLQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmc7CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9CiAJCiAJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgewpAQCAtMTczNSw0ICsxNzQ1LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CbG9jay5qYXZhCmluZGV4IGFmNTBlZjIuLmRkODMxNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQmxvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Jsb2NrLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMzMsMTIgKzMzLDE0IEBACiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKIAkJLy8gZW1wdHkgYmxvY2sKLQkJaWYgKHN0YXRlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBmbG93SW5mbzsKKwkJaWYgKHN0YXRlbWVudHMgPT0gbnVsbCkJcmV0dXJuIGZsb3dJbmZvOworCQlib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbiA9IGZhbHNlOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3RhdGVtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJU3RhdGVtZW50IHN0YXQ7Ci0JCQlpZiAoIWZsb3dJbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZSgoc3RhdCA9IHN0YXRlbWVudHNbaV0pLCBzY29wZSkpIHsKKwkJCWlmICghZmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKHN0YXQgPSBzdGF0ZW1lbnRzW2ldLCBzY29wZSwgZGlkQWxyZWFkeUNvbXBsYWluKSkgewogCQkJCWZsb3dJbmZvID0gc3RhdC5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKKwkJCX0gZWxzZSB7CisJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gdHJ1ZTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZmxvd0luZm87CkBAIC0xNTcsNCArMTU5LDQgQEAKIAkJIH0KIAl9CiAJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmFuY2hTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJhbmNoU3RhdGVtZW50LmphdmEKaW5kZXggMGY5NTRmYi4uODQ2NjgzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmFuY2hTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyYW5jaFN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CkBAIC02MSw2ICs2MSwxMiBAQAogCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiB9CiBwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7Ci0JdGhpcy50YXJnZXRMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwlpZiAodGhpcy50YXJnZXRMYWJlbCAhPSBudWxsKSB7CisJCXRoaXMudGFyZ2V0TGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJfQogfQorCitwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKK30KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVhay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9CcmVhay5qYXZhCmluZGV4IDM2ZjQxOTUuLjhjNjg1ZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQnJlYWsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0JyZWFrLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMjksNzAgKzI5LDYxIEBACiAJCS8vIHRvIGVhY2ggb2YgdGhlIHRyYXZlcnNlZCB0cnkgc3RhdGVtZW50cywgc28gdGhhdCBleGVjdXRpb24gd2lsbCB0ZXJtaW5hdGUgcHJvcGVybHkuCiAKIAkJLy8gbG9va3VwIHRoZSBsYWJlbCwgdGhpcyBzaG91bGQgYW5zd2VyIHRoZSByZXR1cm5Db250ZXh0Ci0JCUZsb3dDb250ZXh0IHRhcmdldENvbnRleHQ7Ci0JCWlmIChsYWJlbCA9PSBudWxsKSB7Ci0JCQl0YXJnZXRDb250ZXh0ID0gZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckRlZmF1bHRCcmVhaygpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0Q29udGV4dCA9IGZsb3dDb250ZXh0LmdldFRhcmdldENvbnRleHRGb3JCcmVha0xhYmVsKGxhYmVsKTsKLQkJfQorCQlGbG93Q29udGV4dCB0YXJnZXRDb250ZXh0ID0gKGxhYmVsID09IG51bGwpIAorCQkJPyBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdEJyZWFrKCkKKwkJCTogZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckJyZWFrTGFiZWwobGFiZWwpOworCiAJCWlmICh0YXJnZXRDb250ZXh0ID09IG51bGwpIHsKIAkJCWlmIChsYWJlbCA9PSBudWxsKSB7CiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRCcmVhayh0aGlzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOyAvLyBuZWVkIHRvIGltcHJvdmUKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5kZWZpbmVkTGFiZWwodGhpcyk7IAogCQkJfQotCQl9IGVsc2UgewotCQkJdGFyZ2V0TGFiZWwgPSB0YXJnZXRDb250ZXh0LmJyZWFrTGFiZWwoKTsKLQkJCXRhcmdldENvbnRleHQucmVjb3JkQnJlYWtGcm9tKGZsb3dJbmZvKTsKLQkJCUZsb3dDb250ZXh0IHRyYXZlcnNlZENvbnRleHQgPSBmbG93Q29udGV4dDsKLQkJCWludCBzdWJJbmRleCA9IDAsIG1heFN1YiA9IDU7Ci0JCQlzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW21heFN1Yl07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCUFzdE5vZGUgc3ViOwotCQkJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJSb3V0aW5lKCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKHN1YkluZGV4ID09IG1heFN1YikgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJCQlzdWJyb3V0aW5lcywKLQkJCQkJCQkwLAotCQkJCQkJCShzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW21heFN1YiAqPSAyXSksCi0JCQkJCQkJMCwKLQkJCQkJCQlzdWJJbmRleCk7Ci0JCQkJCQkvLyBncm93Ci0JCQkJCX0KLQkJCQkJc3Vicm91dGluZXNbc3ViSW5kZXgrK10gPSBzdWI7Ci0JCQkJCWlmIChzdWIuY2Fubm90UmV0dXJuKCkpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlbWVtYmVyIHRoZSBpbml0aWFsaXphdGlvbiBhdCB0aGlzCi0JCQkJLy8gcG9pbnQgZm9yIGRlYWxpbmcgd2l0aCBibGFuayBmaW5hbCB2YXJpYWJsZXMuCi0JCQkJdHJhdmVyc2VkQ29udGV4dC5yZWNvcmRSZXR1cm5Gcm9tKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKLQotCQkJCWlmICh0cmF2ZXJzZWRDb250ZXh0ID09IHRhcmdldENvbnRleHQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJhdmVyc2VkQ29udGV4dCA9IHRyYXZlcnNlZENvbnRleHQucGFyZW50OwotCQkJCX0KLQkJCX0KLQkJCS8vIHJlc2l6ZSBzdWJyb3V0aW5lcwotCQkJaWYgKHN1YkluZGV4ICE9IG1heFN1YikgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCXN1YnJvdXRpbmVzLAotCQkJCQkwLAotCQkJCQkoc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVtzdWJJbmRleF0pLAotCQkJCQkwLAotCQkJCQlzdWJJbmRleCk7Ci0JCQl9CisJCQlyZXR1cm4gZmxvd0luZm87IC8vIHByZXRlbmQgaXQgZGlkIG5vdCBicmVhayBzaW5jZSBubyBhY3R1YWwgdGFyZ2V0CiAJCX0KLQkJcmV0dXJuIEZsb3dJbmZvLkRlYWRFbmQ7CisJCQorCQl0YXJnZXRMYWJlbCA9IHRhcmdldENvbnRleHQuYnJlYWtMYWJlbCgpOworCQlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gZmxvd0NvbnRleHQ7CisJCWludCBzdWJJbmRleCA9IDAsIG1heFN1YiA9IDU7CisJCXN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbbWF4U3ViXTsKKwkJCisJCWRvIHsKKwkJCUFzdE5vZGUgc3ViOworCQkJaWYgKChzdWIgPSB0cmF2ZXJzZWRDb250ZXh0LnN1YlJvdXRpbmUoKSkgIT0gbnVsbCkgeworCQkJCWlmIChzdWJJbmRleCA9PSBtYXhTdWIpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShzdWJyb3V0aW5lcywgMCwgKHN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbbWF4U3ViKj0yXSksIDAsIHN1YkluZGV4KTsgLy8gZ3JvdworCQkJCX0KKwkJCQlzdWJyb3V0aW5lc1tzdWJJbmRleCsrXSA9IHN1YjsKKwkJCQlpZiAoc3ViLmNhbm5vdFJldHVybigpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisKKwkJCUFzdE5vZGUgbm9kZTsKKwkJCWlmICgobm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGUpIGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7CisJCQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IChUcnlTdGF0ZW1lbnQpIG5vZGU7CisJCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlTdGF0ZW1lbnQuc3ViUm91dGluZUluaXRzKTsgLy8gY29sbGVjdCBpbml0cwkJCQorCQkJfSBlbHNlIGlmICh0cmF2ZXJzZWRDb250ZXh0ID09IHRhcmdldENvbnRleHQpIHsKKwkJCQkvLyBvbmx5IHJlY29yZCBicmVhayBpbmZvIG9uY2UgYWNjdW11bGF0ZWQgdGhyb3VnaCBzdWJyb3V0aW5lcywgYW5kIG9ubHkgYWdhaW5zdCB0YXJnZXQgY29udGV4dAorCQkJCXRhcmdldENvbnRleHQucmVjb3JkQnJlYWtGcm9tKGZsb3dJbmZvKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoKHRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudCkgIT0gbnVsbCk7CisJCQorCQkvLyByZXNpemUgc3Vicm91dGluZXMKKwkJaWYgKHN1YkluZGV4ICE9IG1heFN1YikgeworCQkJU3lzdGVtLmFycmF5Y29weShzdWJyb3V0aW5lcywgMCwgKHN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbc3ViSW5kZXhdKSwgMCwgc3ViSW5kZXgpOworCQl9CisJCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKIAl9CiAJCiAJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CiAKIAkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKLQkJcyA9IHMgKyAiYnJlYWsgIjsgLy8kTk9OLU5MUy0xJAorCQlzICs9ICJicmVhayAiOyAvLyROT04tTkxTLTEkCiAJCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcyA9IHMgKyBuZXcgU3RyaW5nKGxhYmVsKTsKKwkJCXMgKz0gbmV3IFN0cmluZyhsYWJlbCk7CiAJCXJldHVybiBzOwogCX0KIAkKQEAgLTEwMyw0ICs5NCw0IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKaW5kZXggM2Y2MzYzMy4uYTU3MWM1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNTIsMzAgKzUyLDMwIEBACiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQogCisJLyoqCisJICogTm8tb3AgOiBzaG91bGQgdXNlIHJlc29sdmVDYXNlKC4uLikgaW5zdGVhZC4KKwkgKi8KIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQotCQkvLyBlcnJvci4uLi51c2UgcmVzb2x2ZUNhc2UuLi4uCi0JCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCX0KIAogCXB1YmxpYyBDb25zdGFudCByZXNvbHZlQ2FzZSgKIAkJQmxvY2tTY29wZSBzY29wZSwKLQkJVHlwZUJpbmRpbmcgdGVzdFRiLAorCQlUeXBlQmluZGluZyBzd2l0Y2hUeXBlLAogCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50KSB7CiAKIAkJLy8gYWRkIGludG8gdGhlIGNvbGxlY3Rpb24gb2YgY2FzZXMgb2YgdGhlIGFzc29jaWF0ZWQgc3dpdGNoIHN0YXRlbWVudAogCQlzd2l0Y2hTdGF0ZW1lbnQuY2FzZXNbc3dpdGNoU3RhdGVtZW50LmNhc2VDb3VudCsrXSA9IHRoaXM7Ci0JCVR5cGVCaW5kaW5nIGNhc2VUYiA9IGNvbnN0YW50RXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmIChjYXNlVGIgPT0gbnVsbCB8fCB0ZXN0VGIgPT0gbnVsbCkKKwkJVHlwZUJpbmRpbmcgY2FzZVR5cGUgPSBjb25zdGFudEV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAoY2FzZVR5cGUgPT0gbnVsbCB8fCBzd2l0Y2hUeXBlID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNvbnN0YW50RXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGNhc2VUYiwgdGVzdFRiKSkKKwkJaWYgKGNvbnN0YW50RXhwcmVzc2lvbi5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKGNhc2VUeXBlLCBzd2l0Y2hUeXBlKSkKIAkJCXJldHVybiBjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQ7Ci0JCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzZVRiLCB0ZXN0VGIpKQorCQlpZiAoY2FzZVR5cGUuaXNDb21wYXRpYmxlV2l0aChzd2l0Y2hUeXBlKSkKIAkJCXJldHVybiBjb25zdGFudEV4cHJlc3Npb24uY29uc3RhbnQ7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZSgKIAkJCWNvbnN0YW50RXhwcmVzc2lvbiwKLQkJCWNhc2VUYiwKLQkJCXRlc3RUYik7CisJCQljYXNlVHlwZSwKKwkJCXN3aXRjaFR5cGUpOwogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTk1LDQgKzk1LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc3RFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Nhc3RFeHByZXNzaW9uLmphdmEKaW5kZXggYmE3MDY5Ni4uMmFkM2M3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DYXN0RXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2FzdEV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0yMSw3ICsyMSw2IEBACiAJcHVibGljIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKIAlwdWJsaWMgRXhwcmVzc2lvbiB0eXBlOwogCXB1YmxpYyBib29sZWFuIG5lZWRSdW50aW1lQ2hlY2tjYXN0OwotCXB1YmxpYyBUeXBlQmluZGluZyBjYXN0VGI7CiAKIAkvL2V4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uIGhvbGRzIHRoZSBjYXN0IGZvciBiYXNlVHlwZSBjYXN0aW5nIAogCXB1YmxpYyBDYXN0RXhwcmVzc2lvbihFeHByZXNzaW9uIGUsIEV4cHJlc3Npb24gdCkgewpAQCAtNTYsMTAgKzU1LDEwIEBACiAKIAlwdWJsaWMgZmluYWwgdm9pZCBhcmVUeXBlc0Nhc3RDb21wYXRpYmxlKAogCQlCbG9ja1Njb3BlIHNjb3BlLAotCQlUeXBlQmluZGluZyBjYXN0VGIsCi0JCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYikgeworCQlUeXBlQmluZGluZyBjYXN0VHlwZSwKKwkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUpIHsKIAotCQkvLyBzZWUgc3BlY2lmaWNhdGlvbnMgcC42OAorCQkvLyBzZWUgc3BlY2lmaWNhdGlvbnMgNS41CiAJCS8vIGhhbmRsZSBlcnJvcnMgYW5kIHByb2Nlc3MgY29uc3RhbnQgd2hlbiBuZWVkZWQKIAogCQkvLyBpZiBlaXRoZXIgb25lIG9mIHRoZSB0eXBlIGlzIG51bGwgPT0+CkBAIC02NywxMzQgKzY2LDE0MyBAQAogCQkvLyB3ZSB0aGVuIGRvIG5vdCByZXBvcnQgYW4gb2J2aW91cy1jYXNjYWRlLWVycm9yLgogCiAJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gZmFsc2U7Ci0JCWlmIChjYXN0VGIgPT0gbnVsbCB8fCBleHByZXNzaW9uVGIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNhc3RUYi5pc0Jhc2VUeXBlKCkpIHsKLQkJCWlmIChleHByZXNzaW9uVGIuaXNCYXNlVHlwZSgpKSB7Ci0JCQkJaWYgKGV4cHJlc3Npb25UYiA9PSBjYXN0VGIpIHsKKwkJaWYgKGNhc3RUeXBlID09IG51bGwgfHwgZXhwcmVzc2lvblR5cGUgPT0gbnVsbCkgcmV0dXJuOworCisJCS8vIGlkZW50aXR5IGNvbnZlcnNpb24gY2Fubm90IGJlIHBlcmZvcm1lZCB1cGZyb250LCBkdWUgdG8gc2lkZS1lZmZlY3RzCisJCS8vIGxpa2UgY29uc3RhbnQgcHJvcGFnYXRpb24KKwkJCQkKKwkJaWYgKGNhc3RUeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSkgeworCQkJCWlmIChleHByZXNzaW9uVHlwZSA9PSBjYXN0VHlwZSkgeworCQkJCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcoY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCQkJY29uc3RhbnQgPSBleHByZXNzaW9uLmNvbnN0YW50OyAvL3VzZSB0aGUgc2FtZSBjb25zdGFudAogCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblRiLCBjYXN0VGIpCi0JCQkJCXx8IEJhc2VUeXBlQmluZGluZy5pc05hcnJvd2luZyhjYXN0VGIuaWQsIGV4cHJlc3Npb25UYi5pZCkpIHsKLQkJCQkJZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPSAoY2FzdFRiLmlkIDw8IDQpICsgZXhwcmVzc2lvblRiLmlkOworCQkJCWlmIChleHByZXNzaW9uVHlwZS5pc0NvbXBhdGlibGVXaXRoKGNhc3RUeXBlKQorCQkJCQl8fCBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcoY2FzdFR5cGUuaWQsIGV4cHJlc3Npb25UeXBlLmlkKSkgeworCQkJCQlleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA9IChjYXN0VHlwZS5pZCA8PCA0KSArIGV4cHJlc3Npb25UeXBlLmlkOwogCQkJCQlpZiAoZXhwcmVzc2lvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpCiAJCQkJCQljb25zdGFudCA9IGV4cHJlc3Npb24uY29uc3RhbnQuY2FzdFRvKGV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJLy8tLS0tLS0tLS0tLWNhc3QgdG8gc29tZXRoaW5nIHdoaWNoIGlzIE5PVCBhIGJhc2UgdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQotCQlpZiAoZXhwcmVzc2lvblRiID09IE51bGxCaW5kaW5nKQorCQlpZiAoZXhwcmVzc2lvblR5cGUgPT0gTnVsbEJpbmRpbmcpIHsKKwkJCS8vCWlmIChjYXN0VHlwZS5pc0FycmF5VHlwZSgpKXsgLy8gMjY5MDMgLSBuZWVkIGNoZWNrY2FzdCB3aGVuIGNhc3RpbmcgbnVsbCB0byBhcnJheSB0eXBlCisJCQkvLwkJbmVlZFJ1bnRpbWVDaGVja2Nhc3QgPSB0cnVlOworCQkJLy8JfQogCQkJcmV0dXJuOyAvL251bGwgaXMgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5IHRoaW5nCi0KLQkJaWYgKGV4cHJlc3Npb25UYi5pc0Jhc2VUeXBlKCkpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQl9CisJCWlmIChleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWlmIChleHByZXNzaW9uVGIuaXNBcnJheVR5cGUoKSkgewotCQkJaWYgKGNhc3RUYi5pc0FycmF5VHlwZSgpKSB7Ci0JCQkJLy8tLS0tLS0tIChjYXN0VGIuaXNBcnJheSkgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0KLQkJCQlUeXBlQmluZGluZyBleHByZXNzaW9uRWx0VGIgPSAoKEFycmF5QmluZGluZykgZXhwcmVzc2lvblRiKS5lbGVtZW50c1R5cGUoc2NvcGUpOwotCQkJCWlmIChleHByZXNzaW9uRWx0VGIuaXNCYXNlVHlwZSgpKSB7CisJCWlmIChleHByZXNzaW9uVHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQlpZiAoY2FzdFR5cGUgPT0gZXhwcmVzc2lvblR5cGUpIHJldHVybjsgLy8gaWRlbnRpdHkgY29udmVyc2lvbgorCisJCQlpZiAoY2FzdFR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJCS8vLS0tLS0tLSAoY2FzdFR5cGUuaXNBcnJheSkgZXhwcmVzc2lvblR5cGUuaXNBcnJheSAtLS0tLS0tLS0tLQorCQkJCVR5cGVCaW5kaW5nIGV4cHJFbGVtZW50VHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkuZWxlbWVudHNUeXBlKHNjb3BlKTsKKwkJCQlpZiAoZXhwckVsZW1lbnRUeXBlLmlzQmFzZVR5cGUoKSkgewogCQkJCQkvLyA8LS0tc3RvcCB0aGUgcmVjdXJzaW9uLS0tLS0tLSAKLQkJCQkJaWYgKCgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSkgPT0gZXhwcmVzc2lvbkVsdFRiKQorCQkJCQlpZiAoKChBcnJheUJpbmRpbmcpIGNhc3RUeXBlKS5lbGVtZW50c1R5cGUoc2NvcGUpID09IGV4cHJFbGVtZW50VHlwZSkKIAkJCQkJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKIAkJCQkJZWxzZQotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VGIsIGV4cHJlc3Npb25UYik7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJLy8gcmVjdXJzaXZlbHkgb24gdGhlIGVsZW1lbnRzLi4uCiAJCQkJYXJlVHlwZXNDYXN0Q29tcGF0aWJsZSgKIAkJCQkJc2NvcGUsCi0JCQkJCSgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSksCi0JCQkJCWV4cHJlc3Npb25FbHRUYik7CisJCQkJCSgoQXJyYXlCaW5kaW5nKSBjYXN0VHlwZSkuZWxlbWVudHNUeXBlKHNjb3BlKSwKKwkJCQkJZXhwckVsZW1lbnRUeXBlKTsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UgaWYgKAotCQkJCWNhc3RUYi5pc0NsYXNzKCkpIHsKLQkJCQkvLy0tLS0tLShjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0tLS0tCQotCQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGNhc3RUYikpCisJCQkJY2FzdFR5cGUuaXNDbGFzcygpKSB7CisJCQkJLy8tLS0tLS0oY2FzdFR5cGUuaXNDbGFzcykgZXhwcmVzc2lvblR5cGUuaXNBcnJheSAtLS0tLS0tLS0tLS0tLS0JCisJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFR5cGUpKQogCQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgeyAvLy0tLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0KLQkJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShjYXN0VGIpIHx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGNhc3RUYikpIHsKKwkJCX0gZWxzZSB7IC8vLS0tLS0tLSAoY2FzdFR5cGUuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UeXBlLmlzQXJyYXkgLS0tLS0tLS0tLS0KKwkJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShjYXN0VHlwZSkgfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoY2FzdFR5cGUpKSB7CiAJCQkJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VHlwZSwgZXhwcmVzc2lvblR5cGUpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJaWYgKGV4cHJlc3Npb25UYi5pc0NsYXNzKCkpIHsKLQkJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgewotCQkJCS8vIC0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0tCi0JCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZXhwcmVzc2lvblRiKSkgeyAvLyBwb3RlbnRpYWwgcnVudGltZSBlcnJvcgorCQlpZiAoZXhwcmVzc2lvblR5cGUuaXNDbGFzcygpKSB7CisJCQlpZiAoY2FzdFR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJCS8vIC0tLS0gKGNhc3RUeXBlLmlzQXJyYXkpIGV4cHJlc3Npb25UeXBlLmlzQ2xhc3MgLS0tLS0tLQorCQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGV4cHJlc3Npb25UeXBlKSkgeyAvLyBwb3RlbnRpYWwgcnVudGltZSBlcnJvcgogCQkJCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IHRydWU7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKAotCQkJCWNhc3RUYi5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0KLQkJCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UYiwgY2FzdFRiKSkgLy8gbm8gcnVudGltZSBlcnJvcgorCQkJfSBlbHNlIGlmIChjYXN0VHlwZS5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUeXBlLmlzQ2xhc3MpIGV4cHJlc3Npb25UeXBlLmlzQ2xhc3MgLS0tLS0tCisJCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoY2FzdFR5cGUpKXsgLy8gbm8gcnVudGltZSBlcnJvcgorCQkJCQlpZiAoY2FzdFR5cGUuaWQgPT0gVF9TdHJpbmcpIGNvbnN0YW50ID0gZXhwcmVzc2lvbi5jb25zdGFudDsgLy8gKFN0cmluZykgY3N0IGlzIHN0aWxsIGEgY29uc3RhbnQKIAkJCQkJcmV0dXJuOwotCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQkJfQorCQkJCWlmIChjYXN0VHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlKSkgewogCQkJCQkvLyBwb3RlbnRpYWwgcnVudGltZSAgZXJyb3IKIAkJCQkJbmVlZFJ1bnRpbWVDaGVja2Nhc3QgPSB0cnVlOwogCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJfSBlbHNlIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tLSAgCi0JCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblRiKS5pc0ZpbmFsKCkpIHsKLQkJCQkJLy8gbm8gc3ViY2xhc3MgZm9yIGV4cHJlc3Npb25UYiwgdGh1cyBjb21waWxlLXRpbWUgY2hlY2sgaXMgdmFsaWQKLQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIGNhc3RUYikpCisJCQl9IGVsc2UgeyAvLyAtLS0tLSAoY2FzdFR5cGUuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UeXBlLmlzQ2xhc3MgLS0tLS0tLSAgCisJCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblR5cGUpLmlzRmluYWwoKSkgeworCQkJCQkvLyBubyBzdWJjbGFzcyBmb3IgZXhwcmVzc2lvblR5cGUsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCisJCQkJCWlmIChleHByZXNzaW9uVHlwZS5pc0NvbXBhdGlibGVXaXRoKGNhc3RUeXBlKSkgCiAJCQkJCQlyZXR1cm47CiAJCQkJfSBlbHNlIHsgLy8gYSBzdWJjbGFzcyBtYXkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgPT0+IG5vIGNoZWNrIGF0IGNvbXBpbGUgdGltZQogCQkJCQluZWVkUnVudGltZUNoZWNrY2FzdCA9IHRydWU7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlQ2FzdEVycm9yKHRoaXMsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCS8vCWlmIChleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UoKSkgeyBjYW5ub3QgYmUgYW55dGhpbmcgZWxzZQotCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsKLQkJCS8vIC0tLS0tIChjYXN0VGIuaXNBcnJheSkgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLQotCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdDbG9uZWFibGUoZXhwcmVzc2lvblRiKQotCQkJCXx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGV4cHJlc3Npb25UYikpIC8vIHBvdGVudGlhbCBydW50aW1lIGVycm9yCisJCS8vCWlmIChleHByZXNzaW9uVHlwZS5pc0ludGVyZmFjZSgpKSB7IGNhbm5vdCBiZSBhbnl0aGluZyBlbHNlCisJCWlmIChjYXN0VHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQkvLyAtLS0tLSAoY2FzdFR5cGUuaXNBcnJheSkgZXhwcmVzc2lvblR5cGUuaXNJbnRlcmZhY2UgLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShleHByZXNzaW9uVHlwZSkKKwkJCQl8fCBzY29wZS5pc0phdmFJb1NlcmlhbGl6YWJsZShleHByZXNzaW9uVHlwZSkpIC8vIHBvdGVudGlhbCBydW50aW1lIGVycm9yCiAJCQkJbmVlZFJ1bnRpbWVDaGVja2Nhc3QgPSB0cnVlOwogCQkJZWxzZQotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFRiLCBleHByZXNzaW9uVGIpOworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCXJldHVybjsKLQkJfSBlbHNlIGlmICgKLQkJCWNhc3RUYi5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tLS0KLQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGNhc3RUYikpIC8vIG5vIHJ1bnRpbWUgZXJyb3IKKwkJfSBlbHNlIGlmIChjYXN0VHlwZS5pc0NsYXNzKCkpIHsgLy8gLS0tLS0gKGNhc3RUeXBlLmlzQ2xhc3MpIGV4cHJlc3Npb25UeXBlLmlzSW50ZXJmYWNlIC0tLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChjYXN0VHlwZSkpIC8vIG5vIHJ1bnRpbWUgZXJyb3IKIAkJCQlyZXR1cm47Ci0JCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLmlzRmluYWwoKSkgewotCQkJCS8vIG5vIHN1YmNsYXNzIGZvciBjYXN0VGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCi0JCQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VHlwZSkuaXNGaW5hbCgpKSB7CisJCQkJLy8gbm8gc3ViY2xhc3MgZm9yIGNhc3RUeXBlLCB0aHVzIGNvbXBpbGUtdGltZSBjaGVjayBpcyB2YWxpZAorCQkJCWlmICghY2FzdFR5cGUuaXNDb21wYXRpYmxlV2l0aChleHByZXNzaW9uVHlwZSkpIHsKIAkJCQkJLy8gcG90ZW50aWFsIHJ1bnRpbWUgZXJyb3IKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VGIsIGV4cHJlc3Npb25UYik7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0KLQkJCWlmIChjYXN0VGIgIT0gZXhwcmVzc2lvblRiCi0JCQkJJiYgKFNjb3BlLmNvbXBhcmVUeXBlcyhjYXN0VGIsIGV4cHJlc3Npb25UYikgPT0gTm90UmVsYXRlZCkpIHsKLQkJCQlNZXRob2RCaW5kaW5nW10gY2FzdFRiTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgY2FzdFRiKS5tZXRob2RzKCk7Ci0JCQkJTWV0aG9kQmluZGluZ1tdIGV4cHJlc3Npb25UYk1ldGhvZHMgPQotCQkJCQkoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UYikubWV0aG9kcygpOwotCQkJCWludCBleHByTWV0aG9kc0xlbmd0aCA9IGV4cHJlc3Npb25UYk1ldGhvZHMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwLCBjYXN0TWV0aG9kc0xlbmd0aCA9IGNhc3RUYk1ldGhvZHMubGVuZ3RoOwotCQkJCQlpIDwgY2FzdE1ldGhvZHNMZW5ndGg7Ci0JCQkJCWkrKykKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHByTWV0aG9kc0xlbmd0aDsgaisrKQotCQkJCQkJaWYgKGNhc3RUYk1ldGhvZHNbaV0ucmV0dXJuVHlwZSAhPSBleHByZXNzaW9uVGJNZXRob2RzW2pdLnJldHVyblR5cGUpCi0JCQkJCQkJaWYgKGNhc3RUYk1ldGhvZHNbaV0uc2VsZWN0b3IgPT0gZXhwcmVzc2lvblRiTWV0aG9kc1tqXS5zZWxlY3RvcikKLQkJCQkJCQkJaWYgKGNhc3RUYk1ldGhvZHNbaV0uYXJlUGFyYW1ldGVyc0VxdWFsKGV4cHJlc3Npb25UYk1ldGhvZHNbal0pKQotCQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZUNhc3RFcnJvcih0aGlzLCBjYXN0VGIsIGV4cHJlc3Npb25UYik7CisJCX0gZWxzZSB7IC8vIC0tLS0tIChjYXN0VHlwZS5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblR5cGUuaXNJbnRlcmZhY2UgLS0tLS0tLQorCQkJaWYgKGNhc3RUeXBlID09IGV4cHJlc3Npb25UeXBlKSByZXR1cm47IC8vIGlkZW50aXR5IGNvbnZlcnNpb24KKwkJCWlmIChTY29wZS5jb21wYXJlVHlwZXMoY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKSA9PSBOb3RSZWxhdGVkKSB7CisJCQkJTWV0aG9kQmluZGluZ1tdIGNhc3RUeXBlTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgY2FzdFR5cGUpLm1ldGhvZHMoKTsKKwkJCQlNZXRob2RCaW5kaW5nW10gZXhwcmVzc2lvblR5cGVNZXRob2RzID0KKwkJCQkJKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkubWV0aG9kcygpOworCQkJCWludCBleHByTWV0aG9kc0xlbmd0aCA9IGV4cHJlc3Npb25UeXBlTWV0aG9kcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNhc3RNZXRob2RzTGVuZ3RoID0gY2FzdFR5cGVNZXRob2RzLmxlbmd0aDsgaSA8IGNhc3RNZXRob2RzTGVuZ3RoOyBpKyspCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwck1ldGhvZHNMZW5ndGg7IGorKykgeworCQkJCQkJaWYgKChjYXN0VHlwZU1ldGhvZHNbaV0ucmV0dXJuVHlwZSAhPSBleHByZXNzaW9uVHlwZU1ldGhvZHNbal0ucmV0dXJuVHlwZSkKKwkJCQkJCQkJJiYgKGNhc3RUeXBlTWV0aG9kc1tpXS5zZWxlY3RvciA9PSBleHByZXNzaW9uVHlwZU1ldGhvZHNbal0uc2VsZWN0b3IpCisJCQkJCQkJCSYmIGNhc3RUeXBlTWV0aG9kc1tpXS5hcmVQYXJhbWV0ZXJzRXF1YWwoZXhwcmVzc2lvblR5cGVNZXRob2RzW2pdKSkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVDYXN0RXJyb3IodGhpcywgY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKTsKKwkJCQkJCX0KKwkJCQkJfQogCQkJfQogCQl9CiAJCW5lZWRSdW50aW1lQ2hlY2tjYXN0ID0gdHJ1ZTsKQEAgLTIxOSw3ICsyMjcsNyBAQAogCQkJCXx8IG5lZWRSdW50aW1lQ2hlY2tjYXN0KSB7IC8vIEFkZGVkIGZvcjogMUYxVzlJRzogSVZKQ09NOldJTk5UIC0gQ29tcGlsZXIgb21pdHMgY2FzdGluZyBjaGVjawogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKLQkJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QoY2FzdFRiKTsKKwkJCQkJY29kZVN0cmVhbS5jaGVja2Nhc3QodGhpcy5yZXNvbHZlZFR5cGUpOwogCQkJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCiAJCQkJCQljb2RlU3RyZWFtLnBvcCgpOwogCQkJCX0KQEAgLTIzMiw3ICsyNDAsNyBAQAogCQkJY29kZVN0cmVhbSwKIAkJCXZhbHVlUmVxdWlyZWQgfHwgbmVlZFJ1bnRpbWVDaGVja2Nhc3QpOwogCQlpZiAobmVlZFJ1bnRpbWVDaGVja2Nhc3QpIHsKLQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KGNhc3RUYik7CisJCQljb2RlU3RyZWFtLmNoZWNrY2FzdCh0aGlzLnJlc29sdmVkVHlwZSk7CiAJCQlpZiAoIXZhbHVlUmVxdWlyZWQpCiAJCQkJY29kZVN0cmVhbS5wb3AoKTsKIAkJfSBlbHNlIHsKQEAgLTI0Miw2ICsyNTAsMTQgQEAKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9CiAKKwlwdWJsaWMgRXhwcmVzc2lvbiBpbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCl7IAorCQlFeHByZXNzaW9uIGN1cnJlbnQgPSB0aGlzLmV4cHJlc3Npb247CisJCXdoaWxlIChjdXJyZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIHsKKwkJCWN1cnJlbnQgPSAoKENhc3RFeHByZXNzaW9uKSBjdXJyZW50KS5leHByZXNzaW9uOworCQl9CisJCXJldHVybiBjdXJyZW50OworCX0KKwogCXB1YmxpYyBUeXBlQmluZGluZyByZXNvbHZlVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCS8vIGNvbXB1dGUgYSBuZXcgY29uc3RhbnQgaWYgdGhlIGNhc3QgaXMgZWZmZWN0aXZlCiAKQEAgLTI1MSwxNiArMjY3LDE2IEBACiAKIAkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCWltcGxpY2l0Q29udmVyc2lvbiA9IFRfdW5kZWZpbmVkOwotCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJaWYgKGV4cHJlc3Npb25UYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KIAkJaWYgKCh0eXBlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgfHwgKHR5cGUgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSkgewotCQkJaWYgKChjYXN0VGIgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsIGNhc3RUYiwgZXhwcmVzc2lvblRiKTsKLQkJCXJldHVybiBjYXN0VGI7Ci0JCX0gZWxzZSB7IC8vIGV4cHJlc3Npb24gYXMgYSBjYXN0ICEhISEhISEhIAorCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJCVR5cGVCaW5kaW5nIGNhc3RlZEV4cHJlc3Npb25UeXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCAmJiBjYXN0ZWRFeHByZXNzaW9uVHlwZSAhPSBudWxsKSB7CisJCQkJYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgdGhpcy5yZXNvbHZlZFR5cGUsIGNhc3RlZEV4cHJlc3Npb25UeXBlKTsKKwkJCX0KKwkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKKwkJfSBlbHNlIHsgLy8gZXhwcmVzc2lvbiBhcyBhIGNhc3QgISEhISEhISEKKwkJCVR5cGVCaW5kaW5nIGNhc3RlZEV4cHJlc3Npb25UeXBlID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZShzY29wZSk7CisJCQlpZiAoY2FzdGVkRXhwcmVzc2lvblR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZVJlZmVyZW5jZSh0eXBlKTsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC0yODIsNCArMjk4LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NoYXJMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NoYXJMaXRlcmFsLmphdmEKaW5kZXggZWU0MzY5My4uNjU3MmFhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DaGFyTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2hhckxpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGFzc0xpdGVyYWxBY2Nlc3MuamF2YQppbmRleCAyYTQwMDM3Li4xMDQyOGM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsYXNzTGl0ZXJhbEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xhc3NMaXRlcmFsQWNjZXNzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNTgsNyArNTgsNyBAQAogCiAJCS8vIGluIGludGVyZmFjZSBjYXNlLCBubyBjYWNoaW5nIG9jY3Vycywgc2luY2UgY2Fubm90IG1ha2UgYSBjYWNoZSBmaWVsZCBmb3IgaW50ZXJmYWNlCiAJCWlmICh2YWx1ZVJlcXVpcmVkKQotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNsYXNzTGl0ZXJhbEFjY2Vzc0ZvclR5cGUodHlwZS5iaW5kaW5nLCBzeW50aGV0aWNGaWVsZCk7CisJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ2xhc3NMaXRlcmFsQWNjZXNzRm9yVHlwZSh0eXBlLnJlc29sdmVkVHlwZSwgc3ludGhldGljRmllbGQpOwogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCX0KIApAQCAtNzQsNyArNzQsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAotCQlyZXR1cm4gc2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBzY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCk7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CkBAIC05Myw0ICs5Myw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGluaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ2xpbml0LmphdmEKaW5kZXggMWUwZjg2OC4uYmUzMmE1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9DbGluaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NsaW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTQ1LDExICs0NSwxMCBAQAogCQkJCQl0aGlzLAogCQkJCQlOb0V4Y2VwdGlvbnMsCiAJCQkJCXNjb3BlLAotCQkJCQlGbG93SW5mby5EZWFkRW5kKTsKKwkJCQkJRmxvd0luZm8uREVBRF9FTkQpOwogCiAJCQkvLyBjaGVjayBmb3IgbWlzc2luZyByZXR1cm5pbmcgcGF0aAotCQkJbmVlZEZyZWVSZXR1cm4gPQotCQkJCSEoKGZsb3dJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKTsKKwkJCXRoaXMubmVlZEZyZWVSZXR1cm4gPSBmbG93SW5mby5pc1JlYWNoYWJsZSgpOwogCiAJCQkvLyBjaGVjayBtaXNzaW5nIGJsYW5rIGZpbmFsIGZpZWxkIGluaXRpYWxpemF0aW9ucwogCQkJZmxvd0luZm8gPSBmbG93SW5mby5tZXJnZWRXaXRoKHN0YXRpY0luaXRpYWxpemVyRmxvd0NvbnRleHQuaW5pdHNPblJldHVybik7CkBAIC0xNDcsMTAgKzE0Niw4IEBACiAJCVR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0OwogCiAJCS8vIGluaXRpYWxpemUgbG9jYWwgcG9zaXRpb25zIC0gaW5jbHVkaW5nIGluaXRpYWxpemVyIHNjb3BlLgotCQlzY29wZS5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucygwLCBjb2RlU3RyZWFtKTsgLy8gc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkKIAkJTWV0aG9kU2NvcGUgc3RhdGljSW5pdGlhbGl6ZXJTY29wZSA9IGRlY2xhcmluZ1R5cGUuc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKIAkJc3RhdGljSW5pdGlhbGl6ZXJTY29wZS5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucygwLCBjb2RlU3RyZWFtKTsKLQkJLy8gb2Zmc2V0IGJ5IHRoZSBhcmd1bWVudCBzaXplCiAKIAkJLy8gMS40IGZlYXR1cmUKIAkJLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgYW55IG90aGVyIGluaXRpYWxpemF0aW9uCkBAIC0xODgsNyArMTg1LDcgQEAKIAkJCS8vIHJlc2V0IHRoZSBjb25zdGFudCBwb29sIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIGNsaW5pdAogCQkJY29uc3RhbnRQb29sLnJlc2V0Rm9yQ2xpbml0KGNvbnN0YW50UG9vbEluZGV4LCBjb25zdGFudFBvb2xPZmZzZXQpOwogCQl9IGVsc2UgewotCQkJaWYgKG5lZWRGcmVlUmV0dXJuKSB7CisJCQlpZiAodGhpcy5uZWVkRnJlZVJldHVybikgewogCQkJCWludCBvbGRQb3NpdGlvbiA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCQkJY29kZVN0cmVhbS5yZXR1cm5fKCk7CiAJCQkJY29kZVN0cmVhbS51cGRhdGVMb2NhbFZhcmlhYmxlc0F0dHJpYnV0ZShvbGRQb3NpdGlvbik7CkBAIC0yNTIsNCArMjQ5LDQgQEAKIAkJCXNvdXJjZVR5cGUuYWRkU3ludGhldGljRmllbGQoc291cmNlVHlwZSwgc2NvcGUpOwogCX0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uamF2YQppbmRleCBiN2NmNWFjLi43YjdiZmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDIwICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24KIAlleHRlbmRzIEFzdE5vZGUKQEAgLTMxLDcgKzMxLDkgQEAKIAlwdWJsaWMgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKIAlwdWJsaWMgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQ7CiAKLQlwcml2YXRlIExvY2FsVHlwZUJpbmRpbmdbXSBhbGxMb2NhbFR5cGVzOworCXByaXZhdGUgTG9jYWxUeXBlQmluZGluZ1tdIGxvY2FsVHlwZXM7CisJaW50IGxvY2FsVHlwZUNvdW50ID0gMDsKKwkKIAlwdWJsaWMgYm9vbGVhbiBpc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbjsKIAogCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbigKQEAgLTg5LDE5ICs5MSwzNiBAQAogCSAqIHRvIGNvbXBpbGVyIHN0cnVjdHVyZXMuCiAJICovCiAJcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQorCQlpZiAodGhpcy50eXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy50eXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCWNsZWFuVXAodGhpcy50eXBlc1tpXSk7CisJCQl9CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5sb2NhbFR5cGVDb3VudDsgaSA8IG1heDsgaSsrKSB7CisJCQkJLy8gbnVsbCBvdXQgdGhlIHR5cGUncyBzY29wZSBiYWNrcG9pbnRlcnMKKwkJCQlsb2NhbFR5cGVzW2ldLnNjb3BlID0gbnVsbDsgLy8gbG9jYWwgbWVtYmVycyBhcmUgYWxyZWFkeSBpbiB0aGUgbGlzdAorCQkJfQorCQl9CiAJCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSBjb21waWxhdGlvblJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjbGFzc0ZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQkvLyBjbGVhciB0aGUgY2xhc3NGaWxlIGJhY2sgcG9pbnRlciB0byB0aGUgYmluZGluZ3MKIAkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBjbGFzc0ZpbGVzW2ldOwotCQkJLy8gbnVsbCBvdXQgdGhlIHR5cGUncyBzY29wZSBiYWNrcG9pbnRlcnMKLQkJCSAoKFNvdXJjZVR5cGVCaW5kaW5nKSBjbGFzc0ZpbGUucmVmZXJlbmNlQmluZGluZykuc2NvcGUgPSBudWxsOwogCQkJLy8gbnVsbCBvdXQgdGhlIGNsYXNzZmlsZSBiYWNrcG9pbnRlciB0byBhIHR5cGUgYmluZGluZwogCQkJY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcgPSBudWxsOwogCQkJY2xhc3NGaWxlLmNvZGVTdHJlYW0gPSBudWxsOyAvLyBjb2RlU3RyZWFtIGhvbGRzIG9udG8gYXN0IGFuZCBzY29wZXMKIAkJCWNsYXNzRmlsZS5pbm5lckNsYXNzZXNCaW5kaW5ncyA9IG51bGw7CiAJCX0KIAl9CisJcHJpdmF0ZSB2b2lkIGNsZWFuVXAoVHlwZURlY2xhcmF0aW9uIHR5cGUpIHsKKwkJaWYgKHR5cGUubWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHR5cGUubWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspeworCQkJCWNsZWFuVXAodHlwZS5tZW1iZXJUeXBlc1tpXSk7CisJCQl9CisJCX0KKwkJaWYgKHR5cGUuYmluZGluZyAhPSBudWxsKSB7CisJCQkvLyBudWxsIG91dCB0aGUgdHlwZSdzIHNjb3BlIGJhY2twb2ludGVycworCQkJdHlwZS5iaW5kaW5nLnNjb3BlID0gbnVsbDsKKwkJfQorCX0KIAogCXB1YmxpYyB2b2lkIGNoZWNrVW51c2VkSW1wb3J0cygpewogCQkKQEAgLTIwMCw5ICsyMTksMTIgQEAKIAlwdWJsaWMgdm9pZCBwcm9wYWdhdGVJbm5lckVtdWxhdGlvbkZvckFsbExvY2FsVHlwZXMoKSB7CiAKIAkJaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24gPSB0cnVlOwotCQlpZiAoYWxsTG9jYWxUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYWxsTG9jYWxUeXBlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCWFsbExvY2FsVHlwZXNbaV0udXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmxvY2FsVHlwZUNvdW50OyBpIDwgbWF4OyBpKyspIHsKKwkJCQkKKwkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gbG9jYWxUeXBlc1tpXTsKKwkJCS8vIG9ubHkgcHJvcGFnYXRlIGZvciByZWFjaGFibGUgbG9jYWwgdHlwZXMKKwkJCWlmICgobG9jYWxUeXBlLnNjb3BlLnJlZmVyZW5jZVR5cGUoKS5iaXRzICYgSXNSZWFjaGFibGVNQVNLKSAhPSAwKSB7CisJCQkJbG9jYWxUeXBlLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOwogCQkJfQogCQl9CiAJfQpAQCAtMjEzLDE4ICsyMzUsMTIgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCByZWNvcmQoTG9jYWxUeXBlQmluZGluZyBsb2NhbFR5cGUpIHsKIAotCQlpZiAoYWxsTG9jYWxUeXBlcyA9PSBudWxsKSB7Ci0JCQlhbGxMb2NhbFR5cGVzID0gbmV3IExvY2FsVHlwZUJpbmRpbmdbXSB7IGxvY2FsVHlwZSB9OwotCQl9IGVsc2UgewotCQkJaW50IGxlbmd0aCA9IGFsbExvY2FsVHlwZXMubGVuZ3RoOwotCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQlhbGxMb2NhbFR5cGVzLAotCQkJCTAsCi0JCQkJKGFsbExvY2FsVHlwZXMgPSBuZXcgTG9jYWxUeXBlQmluZGluZ1tsZW5ndGggKyAxXSksCi0JCQkJMCwKLQkJCQlsZW5ndGgpOwotCQkJYWxsTG9jYWxUeXBlc1tsZW5ndGhdID0gbG9jYWxUeXBlOworCQlpZiAodGhpcy5sb2NhbFR5cGVDb3VudCA9PSAwKSB7CisJCQl0aGlzLmxvY2FsVHlwZXMgPSBuZXcgTG9jYWxUeXBlQmluZGluZ1s1XTsKKwkJfSBlbHNlIGlmICh0aGlzLmxvY2FsVHlwZUNvdW50ID09IHRoaXMubG9jYWxUeXBlcy5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5sb2NhbFR5cGVzLCAwLCAodGhpcy5sb2NhbFR5cGVzID0gbmV3IExvY2FsVHlwZUJpbmRpbmdbdGhpcy5sb2NhbFR5cGVDb3VudCAqIDJdKSwgMCwgdGhpcy5sb2NhbFR5cGVDb3VudCk7CiAJCX0KKwkJdGhpcy5sb2NhbFR5cGVzW3RoaXMubG9jYWxUeXBlQ291bnQrK10gPSBsb2NhbFR5cGU7CiAJfQogCiAJcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKQEAgLTIzNSw3ICsyNTEsNyBAQAogCQkJCQl0eXBlc1tpXS5yZXNvbHZlKHNjb3BlKTsKIAkJCQl9CiAJCQl9Ci0JCQljaGVja1VudXNlZEltcG9ydHMoKTsKKwkJCWlmICghdGhpcy5jb21waWxhdGlvblJlc3VsdC5oYXNTeW50YXhFcnJvcigpKSBjaGVja1VudXNlZEltcG9ydHMoKTsKIAkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvblVuaXQgZSkgewogCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCQlyZXR1cm47CkBAIC0yNzIsMTkgKzI4OCwyNCBAQAogCQkJcmV0dXJuOwogCQl0cnkgewogCQkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CisJCQkJaWYgKGN1cnJlbnRQYWNrYWdlICE9IG51bGwpIHsKKwkJCQkJY3VycmVudFBhY2thZ2UudHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCX0KIAkJCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7CiAJCQkJCWludCBpbXBvcnRMZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRMZW5ndGg7IGkrKykKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRMZW5ndGg7IGkrKykgewogCQkJCQkJaW1wb3J0c1tpXS50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CisJCQkJCX0KIAkJCQl9CiAJCQkJaWYgKHR5cGVzICE9IG51bGwpIHsKIAkJCQkJaW50IHR5cGVzTGVuZ3RoID0gdHlwZXMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzTGVuZ3RoOyBpKyspCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNMZW5ndGg7IGkrKykgewogCQkJCQkJdHlwZXNbaV0udHJhdmVyc2UodmlzaXRvciwgc2NvcGUpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKIAkJfQogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db21wb3VuZEFzc2lnbm1lbnQuamF2YQppbmRleCA1OTdlNWYzLi41ZGZkM2MzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbXBvdW5kQXNzaWdubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29tcG91bmRBc3NpZ25tZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMjcsNiArMjcsNyBAQAogCS8vYnV0IGlzIGJ1aWxkIGFzIGFuIGV4cHJlc3Npb24gPT0+IHRoZSBjaGVja2Nhc3QgY2Fubm90IGZhaWwKIAogCXN1cGVyKGxocywgZXhwcmVzc2lvbiwgc291cmNlRW5kKTsKKwlsaHMuYml0cyAmPSB+SXNTdHJpY3RseUFzc2lnbmVkTUFTSzsgLy8gdGFnIGxocyBhcyBOT04gYXNzaWduZWQgLSBpdCBpcyBhbHNvIGEgcmVhZCBhY2Nlc3MKIAl0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3IgOwogfQogcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKQEAgLTM0LDcgKzM1LDcgQEAKIAkvLyBhIGZpZWxkIHJlZmVyZW5jZSwgYSBibGFuayBmaW5hbCBmaWVsZCByZWZlcmVuY2UsIGEgZmllbGQgb2YgYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9yIAogCS8vIGp1c3QgYSBsb2NhbCB2YXJpYWJsZS4KIAotCXJldHVybiBsaHMuYW5hbHlzZUFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIHRydWUpLnVuY29uZGl0aW9uYWxJbml0cygpOworCXJldHVybiAgKChSZWZlcmVuY2UpIGxocykuYW5hbHlzZUFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIHRoaXMsIHRydWUpLnVuY29uZGl0aW9uYWxJbml0cygpOwogfQogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCkBAIC00Myw3ICs0NCw3IEBACiAJLy8ganVzdCBhIGxvY2FsIHZhcmlhYmxlLgogCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKLQlsaHMuZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBleHByZXNzaW9uLCBvcGVyYXRvciwgYXNzaWdubWVudEltcGxpY2l0Q29udmVyc2lvbiwgdmFsdWVSZXF1aXJlZCk7CisJICgoUmVmZXJlbmNlKSBsaHMpLmdlbmVyYXRlQ29tcG91bmRBc3NpZ25tZW50KGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZXhwcmVzc2lvbiwgb3BlcmF0b3IsIGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIHZhbHVlUmVxdWlyZWQpOwogCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKIAl9CkBAIC03OCw2ICs3OSw5IEBACiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCWlmICghKHRoaXMubGhzIGluc3RhbmNlb2YgUmVmZXJlbmNlKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5leHByZXNzaW9uU2hvdWxkQmVBVmFyaWFibGUodGhpcy5saHMpOworCX0KIAlUeXBlQmluZGluZyBsaHNUeXBlID0gbGhzLnJlc29sdmVUeXBlKHNjb3BlKTsKIAlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOwogCWlmIChsaHNUeXBlID09IG51bGwgfHwgZXhwcmVzc2lvblR5cGUgPT0gbnVsbCkKQEAgLTEyMiw3ICsxMjYsNyBAQAogCWxocy5pbXBsaWNpdENvbnZlcnNpb24gPSByZXN1bHQgPj4+IDEyOwogCWV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID0gKHJlc3VsdCA+Pj4gNCkgJiAweDAwMEZGOwogCWFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24gPSAobGhzSWQgPDwgNCkgKyAocmVzdWx0ICYgMHgwMDAwRik7Ci0JcmV0dXJuIGxoc1R5cGU7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gbGhzVHlwZTsKIH0KIHB1YmxpYyBib29sZWFuIHJlc3RyYWluVXNhZ2VUb051bWVyaWNUeXBlcygpewogCXJldHVybiBmYWxzZSA7fQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKaW5kZXggNjU5YTg4MC4uYzdlZGY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTE5LDExICsxOSwxNSBAQAogcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIE9wZXJhdG9yRXhwcmVzc2lvbiB7CiAKIAlwdWJsaWMgRXhwcmVzc2lvbiBjb25kaXRpb24sIHZhbHVlSWZUcnVlLCB2YWx1ZUlmRmFsc2U7CisJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKKwlwdWJsaWMgQ29uc3RhbnQgb3B0aW1pemVkSWZUcnVlQ29uc3RhbnQ7CisJcHVibGljIENvbnN0YW50IG9wdGltaXplZElmRmFsc2VDb25zdGFudDsKKwkKIAlwcml2YXRlIGludCByZXR1cm5UeXBlU2xvdFNpemUgPSAxOwogCiAJLy8gZm9yIGxvY2FsIHZhcmlhYmxlcyB0YWJsZSBhdHRyaWJ1dGVzCi0JaW50IHRoZW5Jbml0U3RhdGVJbmRleCA9IC0xOwotCWludCBlbHNlSW5pdFN0YXRlSW5kZXggPSAtMTsKKwlpbnQgdHJ1ZUluaXRTdGF0ZUluZGV4ID0gLTE7CisJaW50IGZhbHNlSW5pdFN0YXRlSW5kZXggPSAtMTsKIAlpbnQgbWVyZ2VkSW5pdFN0YXRlSW5kZXggPSAtMTsKIAkKIAlwdWJsaWMgQ29uZGl0aW9uYWxFeHByZXNzaW9uKApAQCAtNDIsNzQgKzQ2LDY2IEBACiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCi0JCUNvbnN0YW50IGNvbmRpdGlvbkNvbnN0YW50ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CiAKLQkJZmxvd0luZm8gPSBjb25kaXRpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sIGNvbmRpdGlvbkNvbnN0YW50ID09IE5vdEFDb25zdGFudCk7Ci0KLQkJaWYgKGNvbmRpdGlvbkNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewotCQkJaWYgKGNvbmRpdGlvbkNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpIHsKLQkJCQkvLyBUUlVFID8gbGVmdCA6IHJpZ2h0Ci0JCQkJRmxvd0luZm8gcmVzdWx0SW5mbyA9Ci0JCQkJCXZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLmluaXRzV2hlblRydWUoKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JCQkJLy8gYW5hbHlzZSB2YWx1ZUlmRmFsc2UsIGJ1dCBkbyBub3QgdGFrZSBpbnRvIGFjY291bnQgYW55IG9mIGl0cyBpbmZvcwotCQkJCXZhbHVlSWZGYWxzZS5hbmFseXNlQ29kZSgKLQkJCQkJY3VycmVudFNjb3BlLAotCQkJCQlmbG93Q29udGV4dCwKLQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKSk7Ci0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyZXN1bHRJbmZvKTsKLQkJCQlyZXR1cm4gcmVzdWx0SW5mbzsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRkFMU0UgPyBsZWZ0IDogcmlnaHQKLQkJCQkvLyBhbmFseXNlIHZhbHVlSWZUcnVlLCBidXQgZG8gbm90IHRha2UgaW50byBhY2NvdW50IGFueSBvZiBpdHMgaW5mb3MJCQkKLQkJCQl2YWx1ZUlmVHJ1ZS5hbmFseXNlQ29kZSgKLQkJCQkJY3VycmVudFNjb3BlLAotCQkJCQlmbG93Q29udGV4dCwKLQkJCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpKTsKLQkJCQlGbG93SW5mbyBtZXJnZUluZm8gPQotCQkJCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZUluZm8pOwotCQkJCXJldHVybiBtZXJnZUluZm87Ci0JCQl9CisJCWludCBtb2RlID0gZmxvd0luZm8ucmVhY2hNb2RlKCk7CisJCWZsb3dJbmZvID0gY29uZGl0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvLCBjc3QgPT0gTm90QUNvbnN0YW50KTsKKwkJCisJCS8vIHByb2Nlc3MgdGhlIGlmLXRydWUgcGFydAorCQlGbG93SW5mbyB0cnVlRmxvd0luZm8gPSBmbG93SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOworCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgeworCQkJdHJ1ZUZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAogCQl9CisJCXRydWVJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKHRydWVGbG93SW5mbyk7CisJCXRydWVGbG93SW5mbyA9IHZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHRydWVGbG93SW5mbyk7CiAKLQkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBtZXJnZWQgaW5mbywgc28gYXMgdG8gY29tcHV0ZSB0aGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcyBhZnRlcndhcmRzCi0JCUZsb3dJbmZvIHRydWVJbmZvID0gZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpOwotCQl0aGVuSW5pdFN0YXRlSW5kZXggPQotCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXModHJ1ZUluZm8pOwotCQlGbG93SW5mbyBmYWxzZUluZm8gPSBmbG93SW5mby5pbml0c1doZW5GYWxzZSgpOwotCQllbHNlSW5pdFN0YXRlSW5kZXggPQotCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmFsc2VJbmZvKTsKKwkJLy8gcHJvY2VzcyB0aGUgaWYtZmFsc2UgcGFydAorCQlGbG93SW5mbyBmYWxzZUZsb3dJbmZvID0gZmxvd0luZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCk7CisJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZFRydWUpIHsKKwkJCWZhbHNlRmxvd0luZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsgCisJCX0KKwkJZmFsc2VJbml0U3RhdGVJbmRleCA9IGN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZhbHNlRmxvd0luZm8pOworCQlmYWxzZUZsb3dJbmZvID0gdmFsdWVJZkZhbHNlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZhbHNlRmxvd0luZm8pOwogCi0JCS8vIHByb3BhZ2F0ZSBhbmFseXNpcwotCQl0cnVlSW5mbyA9IHZhbHVlSWZUcnVlLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIHRydWVJbmZvLmNvcHkoKSk7Ci0JCWZhbHNlSW5mbyA9Ci0JCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmFsc2VJbmZvLmNvcHkoKSk7CisJCS8vIG1lcmdlIGlmLXRydWUgJiBpZi1mYWxzZSBpbml0aWFsaXphdGlvbnMKKwkJRmxvd0luZm8gbWVyZ2VkSW5mbzsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSl7CisJCQltZXJnZWRJbmZvID0gdHJ1ZUZsb3dJbmZvLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oZmFsc2VGbG93SW5mbyk7CisJCX0gZWxzZSBpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgeworCQkJbWVyZ2VkSW5mbyA9IGZhbHNlRmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSh0cnVlRmxvd0luZm8pOworCQl9IGVsc2UgeworCQkJLy8gbWVyZ2UgdXNpbmcgYSBjb25kaXRpb25hbCBpbmZvIC0gIDFHSzJCTE0KKwkJCS8vIGlmICgodCAmJiAodiA9IHQpKSA/IHQgOiB0ICYmICh2ID0gZikpIHIgPSB2OyAgLS0gb2sKKwkJCWNzdCA9IHRoaXMub3B0aW1pemVkSWZUcnVlQ29uc3RhbnQ7CisJCQlib29sZWFuIGlzVmFsdWVJZlRydWVPcHRpbWl6ZWRUcnVlID0gY3N0ICE9IG51bGwgJiYgY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJCWJvb2xlYW4gaXNWYWx1ZUlmVHJ1ZU9wdGltaXplZEZhbHNlID0gY3N0ICE9IG51bGwgJiYgY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CisJCQkKKwkJCWNzdCA9IHRoaXMub3B0aW1pemVkSWZGYWxzZUNvbnN0YW50OworCQkJYm9vbGVhbiBpc1ZhbHVlSWZGYWxzZU9wdGltaXplZFRydWUgPSBjc3QgIT0gbnVsbCAmJiBjc3QgIT0gTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOworCQkJYm9vbGVhbiBpc1ZhbHVlSWZGYWxzZU9wdGltaXplZEZhbHNlID0gY3N0ICE9IG51bGwgJiYgY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CiAKLQkJLy8gbWVyZ2UgYmFjayB1c2luZyBhIGNvbmRpdGlvbmFsIGluZm8gLSAgMUdLMkJMTQotCQkvLyBpZiAoKHQgJiYgKHYgPSB0KSkgPyB0IDogdCAmJiAodiA9IGYpKSByID0gdjsgIC0tIG9rCi0JCUZsb3dJbmZvIG1lcmdlZEluZm8gPQotCQkJRmxvd0luZm8uY29uZGl0aW9uYWwoCi0JCQkJdHJ1ZUluZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKCAvLyBtdXN0IGNvcHksIHNpbmNlIGNvdWxkIGJlIHNoYXJlZCB3aXRoIHRydWVJbmZvLmluaXRzV2hlbkZhbHNlKCkuLi4KLQkJCQkJZmFsc2VJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkpLAotCQkJCXRydWVJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKLQkJCQkJZmFsc2VJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkpKTsKLQkJLyoJCQkKLQkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSB2YWx1ZUlmVHJ1ZS5hbmFseXNlQ29kZSgKLQkJCQljdXJyZW50U2NvcGUsCi0JCQkJZmxvd0NvbnRleHQsCi0JCQkJZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKSkuCi0JCQkJCXVuY29uZGl0aW9uYWxJbml0cygpLgotCQkJCQkJbWVyZ2VkV2l0aCgKLQkJCQkJCQl2YWx1ZUlmRmFsc2UuYW5hbHlzZUNvZGUoCi0JCQkJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJCQkJZmxvd0NvbnRleHQsCi0JCQkJCQkJCWZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpKS4KLQkJCQkJCQkJCXVuY29uZGl0aW9uYWxJbml0cygpKTsKLQkJKi8KKwkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyB0cnVlSW5mb1doZW5UcnVlID0gdHJ1ZUZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlpZiAoaXNWYWx1ZUlmVHJ1ZU9wdGltaXplZEZhbHNlKSB0cnVlSW5mb1doZW5UcnVlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCisJCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmFsc2VJbmZvV2hlblRydWUgPSBmYWxzZUZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CisJCQlpZiAoaXNWYWx1ZUlmRmFsc2VPcHRpbWl6ZWRGYWxzZSkgZmFsc2VJbmZvV2hlblRydWUuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsgCisJCQkKKwkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyB0cnVlSW5mb1doZW5GYWxzZSA9IHRydWVGbG93SW5mby5pbml0c1doZW5GYWxzZSgpLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCWlmIChpc1ZhbHVlSWZUcnVlT3B0aW1pemVkVHJ1ZSkgdHJ1ZUluZm9XaGVuRmFsc2Uuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsgCisKKwkJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmYWxzZUluZm9XaGVuRmFsc2UgPSBmYWxzZUZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJaWYgKGlzVmFsdWVJZkZhbHNlT3B0aW1pemVkVHJ1ZSkgZmFsc2VJbmZvV2hlbkZhbHNlLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCisJCQltZXJnZWRJbmZvID0KKwkJCQlGbG93SW5mby5jb25kaXRpb25hbCgKKwkJCQkJdHJ1ZUluZm9XaGVuVHJ1ZS5tZXJnZWRXaXRoKGZhbHNlSW5mb1doZW5UcnVlKSwKKwkJCQkJdHJ1ZUluZm9XaGVuRmFsc2UubWVyZ2VkV2l0aChmYWxzZUluZm9XaGVuRmFsc2UpKTsKKwkJfQogCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CiAJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJbWVyZ2VkSW5mby5zZXRSZWFjaE1vZGUobW9kZSk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwogCX0KIApAQCAtMTM0LDcgKzEzMCw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50OwotCQlDb25zdGFudCBjb25kQ3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJQ29uc3RhbnQgY29uZENzdCA9IGNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBuZWVkVHJ1ZVBhcnQgPQogCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQogCQkJCXx8ICgoY29uZENzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOwpAQCAtMTUyLDExICsxNDgsMTEgQEAKIAkJCShmYWxzZUxhYmVsID0gbmV3IExhYmVsKGNvZGVTdHJlYW0pKSwKIAkJCW5lZWRDb25kaXRpb25WYWx1ZSk7CiAKLQkJaWYgKHRoZW5Jbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQlpZiAodHJ1ZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQljdXJyZW50U2NvcGUsCi0JCQkJdGhlbkluaXRTdGF0ZUluZGV4KTsKLQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgdGhlbkluaXRTdGF0ZUluZGV4KTsKKwkJCQl0cnVlSW5pdFN0YXRlSW5kZXgpOworCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0cnVlSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJCS8vIFRoZW4gY29kZSBnZW5lcmF0aW9uCiAJCWlmIChuZWVkVHJ1ZVBhcnQpIHsKQEAgLTE3NCwxMSArMTcwLDExIEBACiAJCX0KIAkJaWYgKG5lZWRGYWxzZVBhcnQpIHsKIAkJCWZhbHNlTGFiZWwucGxhY2UoKTsKLQkJCWlmIChlbHNlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKKwkJCWlmIChmYWxzZUluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKLQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7CisJCQkJCWZhbHNlSW5pdFN0YXRlSW5kZXgpOworCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgZmFsc2VJbml0U3RhdGVJbmRleCk7CiAJCQl9CiAJCQl2YWx1ZUlmRmFsc2UuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCQkvLyBFbmQgb2YgaWYgc3RhdGVtZW50CkBAIC0yMTEsOSArMjA3LDggQEAKIAkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJQ29uc3RhbnQgY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50OwotCQlDb25zdGFudCBjb25kQ3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKKwkJQ29uc3RhbnQgY29uZENzdCA9IGNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKIAkJYm9vbGVhbiBuZWVkVHJ1ZVBhcnQgPQogCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQogCQkJCXx8ICgoY29uZENzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOwpAQCAtMjMyLDExICsyMjcsMTEgQEAKIAkJCQlpbnRlcm5hbEZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSksCiAJCQkJbmVlZENvbmRpdGlvblZhbHVlKTsKIAotCQlpZiAodGhlbkluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CisJCWlmICh0cnVlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAogCQkJCWN1cnJlbnRTY29wZSwKLQkJCQl0aGVuSW5pdFN0YXRlSW5kZXgpOwotCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGVuSW5pdFN0YXRlSW5kZXgpOworCQkJCXRydWVJbml0U3RhdGVJbmRleCk7CisJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHRydWVJbml0U3RhdGVJbmRleCk7CiAJCX0KIAkJLy8gVGhlbiBjb2RlIGdlbmVyYXRpb24KIAkJaWYgKG5lZWRUcnVlUGFydCkgewpAQCAtMjQ3LDE5ICsyNDIsMTcgQEAKIAkJCQlpbnQgcG9zaXRpb24gPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQkJCWNvZGVTdHJlYW0uZ290b18oZW5kaWZMYWJlbCk7CiAJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhwb3NpdGlvbik7Ci0JCQkJLy8gVHVuZSBjb2Rlc3RyZWFtIHN0YWNrIHNpemUKLQkJCQkvL2lmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQkJLy8JY29kZVN0cmVhbS5kZWNyU3RhY2tTaXplKHJldHVyblR5cGVTbG90U2l6ZSk7Ci0JCQkJLy99CisJCQkJLy8gTm8gbmVlZCB0byBkZWNyZW1lbnQgY29kZXN0cmVhbSBzdGFjayBzaXplCisJCQkJLy8gc2luY2UgdmFsdWVJZlRydWUgd2FzIGFscmVhZHkgY29uc3VtZWQgYnkgYnJhbmNoIGJ5dGVjb2RlCiAJCQl9CiAJCX0KIAkJaWYgKG5lZWRGYWxzZVBhcnQpIHsKIAkJCWludGVybmFsRmFsc2VMYWJlbC5wbGFjZSgpOwotCQkJaWYgKGVsc2VJbml0U3RhdGVJbmRleCAhPSAtMSkgeworCQkJaWYgKGZhbHNlSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLAotCQkJCQllbHNlSW5pdFN0YXRlSW5kZXgpOwotCQkJCWNvZGVTdHJlYW0uYWRkRGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKGN1cnJlbnRTY29wZSwgZWxzZUluaXRTdGF0ZUluZGV4KTsKKwkJCQkJZmFsc2VJbml0U3RhdGVJbmRleCk7CisJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCBmYWxzZUluaXRTdGF0ZUluZGV4KTsKIAkJCX0KIAkJCXZhbHVlSWZGYWxzZS5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwogCkBAIC0yNzMsOSArMjY2LDE0IEBACiAJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXgpOwogCQl9CiAJCS8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGJvb2xlYW4gdmFsdWVzCi0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CiAJfQogCisJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpIHsKKworCQlyZXR1cm4gdGhpcy5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPT0gbnVsbCA/IHRoaXMuY29uc3RhbnQgOiB0aGlzLm9wdGltaXplZEJvb2xlYW5Db25zdGFudDsKKwl9CisJCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkJLy8gc3BlY3MgcC4zNjgKIAkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CkBAIC0yODYsMTUgKzI4NCwxMyBAQAogCQkJcmV0dXJuIG51bGw7CiAKIAkJLy8gUHJvcGFnYXRlIHRoZSBjb25zdGFudCB2YWx1ZSBmcm9tIHRoZSB2YWx1ZUlmVHJ1ZSBhbmQgdmFsdWVJRkZhbHNlIGV4cHJlc3Npb24gaWYgaXQgaXMgcG9zc2libGUKLQkJaWYgKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQKLQkJCSYmIHZhbHVlSWZUcnVlLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudAotCQkJJiYgdmFsdWVJZkZhbHNlLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQlDb25zdGFudCBjb25kQ29uc3RhbnQsIHRydWVDb25zdGFudCwgZmFsc2VDb25zdGFudDsKKwkJaWYgKChjb25kQ29uc3RhbnQgPSBjb25kaXRpb24uY29uc3RhbnQpICE9IE5vdEFDb25zdGFudAorCQkJJiYgKHRydWVDb25zdGFudCA9IHZhbHVlSWZUcnVlLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQKKwkJCSYmIChmYWxzZUNvbnN0YW50ID0gdmFsdWVJZkZhbHNlLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCS8vIGFsbCB0ZXJtcyBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbiBzbyB3ZSBjYW4gcHJvcGFnYXRlIHRoZSBjb25zdGFudAogCQkJLy8gZnJvbSB2YWx1ZUlGVHJ1ZSBvciB2YWx1ZUlmRmFsc2UgdG8gdGVoIHJlY2VpdmVyIGNvbnN0YW50Ci0JCQljb25zdGFudCA9Ci0JCQkJKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSkKLQkJCQkJPyB2YWx1ZUlmVHJ1ZS5jb25zdGFudAotCQkJCQk6IHZhbHVlSWZGYWxzZS5jb25zdGFudDsKKwkJCWNvbnN0YW50ID0gY29uZENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID8gdHJ1ZUNvbnN0YW50IDogZmFsc2VDb25zdGFudDsKIAkJfQogCQlpZiAodmFsdWVJZlRydWVUeXBlID09IHZhbHVlSWZGYWxzZVR5cGUpIHsgLy8gaGFybWVkIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIAogCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CkBAIC0zMDIsOCArMjk4LDIwIEBACiAJCQlpZiAodmFsdWVJZlRydWVUeXBlID09IExvbmdCaW5kaW5nIHx8IHZhbHVlSWZUcnVlVHlwZSA9PSBEb3VibGVCaW5kaW5nKSB7CiAJCQkJcmV0dXJuVHlwZVNsb3RTaXplID0gMjsKIAkJCX0KLQkJCXRoaXMudHlwZUJpbmRpbmcgPSB2YWx1ZUlmVHJ1ZVR5cGU7Ci0JCQlyZXR1cm4gdmFsdWVJZlRydWVUeXBlOworCisJCQlpZiAodmFsdWVJZlRydWVUeXBlID09IEJvb2xlYW5CaW5kaW5nKSB7CisJCQkJdGhpcy5vcHRpbWl6ZWRJZlRydWVDb25zdGFudCA9IHZhbHVlSWZUcnVlLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQkJCXRoaXMub3B0aW1pemVkSWZGYWxzZUNvbnN0YW50ID0gdmFsdWVJZkZhbHNlLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQkJCisJCQkJLy8gUHJvcGFnYXRlIHRoZSBvcHRpbWl6ZWQgYm9vbGVhbiBjb25zdGFudCBpZiBwb3NzaWJsZQorCQkJCWlmICgoY29uZENvbnN0YW50ID0gY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJCisJCQkJCXRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gY29uZENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpCisJCQkJCQk/IG9wdGltaXplZElmVHJ1ZUNvbnN0YW50CisJCQkJCQk6IG9wdGltaXplZElmRmFsc2VDb25zdGFudDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSB2YWx1ZUlmVHJ1ZVR5cGU7CiAJCX0KIAkJLy8gRGV0ZXJtaW5lIHRoZSByZXR1cm4gdHlwZSBkZXBlbmRpbmcgb24gYXJndW1lbnQgdHlwZXMKIAkJLy8gTnVtZXJpYyB0eXBlcwpAQCAtMzEzLDcgKzMyMSw3IEBACiAJCQkJfHwgKHZhbHVlSWZUcnVlVHlwZSA9PSBTaG9ydEJpbmRpbmcgJiYgdmFsdWVJZkZhbHNlVHlwZSA9PSBCeXRlQmluZGluZykpIHsKIAkJCQl2YWx1ZUlmVHJ1ZS5pbXBsaWNpdFdpZGVuaW5nKFNob3J0QmluZGluZywgdmFsdWVJZlRydWVUeXBlKTsKIAkJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyhTaG9ydEJpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOwotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBTaG9ydEJpbmRpbmc7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBTaG9ydEJpbmRpbmc7CiAJCQkJcmV0dXJuIFNob3J0QmluZGluZzsKIAkJCX0KIAkJCS8vIDxCeXRlfFNob3J0fENoYXI+IHggY29uc3RhbnQoSW50KSAgLS0tPiA8Qnl0ZXxTaG9ydHxDaGFyPiAgIGFuZCByZWNpcHJvY2FsbHkKQEAgLTMyMiw3ICszMzAsNyBAQAogCQkJCQkmJiB2YWx1ZUlmRmFsc2UuaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSh2YWx1ZUlmRmFsc2VUeXBlLCB2YWx1ZUlmVHJ1ZVR5cGUpKSkgewogCQkJCXZhbHVlSWZUcnVlLmltcGxpY2l0V2lkZW5pbmcodmFsdWVJZlRydWVUeXBlLCB2YWx1ZUlmVHJ1ZVR5cGUpOwogCQkJCXZhbHVlSWZGYWxzZS5pbXBsaWNpdFdpZGVuaW5nKHZhbHVlSWZUcnVlVHlwZSwgdmFsdWVJZkZhbHNlVHlwZSk7Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IHZhbHVlSWZUcnVlVHlwZTsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHZhbHVlSWZUcnVlVHlwZTsKIAkJCQlyZXR1cm4gdmFsdWVJZlRydWVUeXBlOwogCQkJfQogCQkJaWYgKCh2YWx1ZUlmRmFsc2VUeXBlID09IEJ5dGVCaW5kaW5nCkBAIC0zMzIsNyArMzQwLDcgQEAKIAkJCQkJJiYgdmFsdWVJZlRydWUuaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZSh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZGYWxzZVR5cGUpKSkgewogCQkJCXZhbHVlSWZUcnVlLmltcGxpY2l0V2lkZW5pbmcodmFsdWVJZkZhbHNlVHlwZSwgdmFsdWVJZlRydWVUeXBlKTsKIAkJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmRmFsc2VUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKTsKLQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gdmFsdWVJZkZhbHNlVHlwZTsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IHZhbHVlSWZGYWxzZVR5cGU7CiAJCQkJcmV0dXJuIHZhbHVlSWZGYWxzZVR5cGU7CiAJCQl9CiAJCQkvLyBNYW51YWwgYmluYXJ5IG51bWVyaWMgcHJvbW90aW9uCkBAIC0zNDEsNyArMzQ5LDcgQEAKIAkJCQkmJiBCYXNlVHlwZUJpbmRpbmcuaXNOYXJyb3dpbmcodmFsdWVJZkZhbHNlVHlwZS5pZCwgVF9pbnQpKSB7CiAJCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyhJbnRCaW5kaW5nLCB2YWx1ZUlmVHJ1ZVR5cGUpOwogCQkJCXZhbHVlSWZGYWxzZS5pbXBsaWNpdFdpZGVuaW5nKEludEJpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOwotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBJbnRCaW5kaW5nOworCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gSW50QmluZGluZzsKIAkJCQlyZXR1cm4gSW50QmluZGluZzsKIAkJCX0KIAkJCS8vIGxvbmcKQEAgLTM1MCw3ICszNTgsNyBAQAogCQkJCXZhbHVlSWZUcnVlLmltcGxpY2l0V2lkZW5pbmcoTG9uZ0JpbmRpbmcsIHZhbHVlSWZUcnVlVHlwZSk7CiAJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcoTG9uZ0JpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOwogCQkJCXJldHVyblR5cGVTbG90U2l6ZSA9IDI7Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IExvbmdCaW5kaW5nOworCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gTG9uZ0JpbmRpbmc7CiAJCQkJcmV0dXJuIExvbmdCaW5kaW5nOwogCQkJfQogCQkJLy8gZmxvYXQKQEAgLTM1OCwxNCArMzY2LDE0IEBACiAJCQkJJiYgQmFzZVR5cGVCaW5kaW5nLmlzTmFycm93aW5nKHZhbHVlSWZGYWxzZVR5cGUuaWQsIFRfZmxvYXQpKSB7CiAJCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyhGbG9hdEJpbmRpbmcsIHZhbHVlSWZUcnVlVHlwZSk7CiAJCQkJdmFsdWVJZkZhbHNlLmltcGxpY2l0V2lkZW5pbmcoRmxvYXRCaW5kaW5nLCB2YWx1ZUlmRmFsc2VUeXBlKTsKLQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gRmxvYXRCaW5kaW5nOworCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gRmxvYXRCaW5kaW5nOwogCQkJCXJldHVybiBGbG9hdEJpbmRpbmc7CiAJCQl9CiAJCQkvLyBkb3VibGUKIAkJCXZhbHVlSWZUcnVlLmltcGxpY2l0V2lkZW5pbmcoRG91YmxlQmluZGluZywgdmFsdWVJZlRydWVUeXBlKTsKIAkJCXZhbHVlSWZGYWxzZS5pbXBsaWNpdFdpZGVuaW5nKERvdWJsZUJpbmRpbmcsIHZhbHVlSWZGYWxzZVR5cGUpOwogCQkJcmV0dXJuVHlwZVNsb3RTaXplID0gMjsKLQkJCXRoaXMudHlwZUJpbmRpbmcgPSBEb3VibGVCaW5kaW5nOworCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBEb3VibGVCaW5kaW5nOwogCQkJcmV0dXJuIERvdWJsZUJpbmRpbmc7CiAJCX0KIAkJLy8gVHlwZSByZWZlcmVuY2VzIChudWxsIG51bGwgaXMgYWxyZWFkeSB0ZXN0ZWQpCkBAIC0zNzcsMTYgKzM4NSwxNiBAQAogCQkJCXZhbHVlSWZGYWxzZVR5cGUpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZSh2YWx1ZUlmRmFsc2VUeXBlLCB2YWx1ZUlmVHJ1ZVR5cGUpKSB7CisJCWlmICh2YWx1ZUlmRmFsc2VUeXBlLmlzQ29tcGF0aWJsZVdpdGgodmFsdWVJZlRydWVUeXBlKSkgewogCQkJdmFsdWVJZlRydWUuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CiAJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmVHJ1ZVR5cGUsIHZhbHVlSWZGYWxzZVR5cGUpOwotCQkJdGhpcy50eXBlQmluZGluZyA9IHZhbHVlSWZUcnVlVHlwZTsKKwkJCXRoaXMucmVzb2x2ZWRUeXBlID0gdmFsdWVJZlRydWVUeXBlOwogCQkJcmV0dXJuIHZhbHVlSWZUcnVlVHlwZTsKIAkJfQotCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKHZhbHVlSWZUcnVlVHlwZSwgdmFsdWVJZkZhbHNlVHlwZSkpIHsKKwkJaWYgKHZhbHVlSWZUcnVlVHlwZS5pc0NvbXBhdGlibGVXaXRoKHZhbHVlSWZGYWxzZVR5cGUpKSB7CiAJCQl2YWx1ZUlmVHJ1ZS5pbXBsaWNpdFdpZGVuaW5nKHZhbHVlSWZGYWxzZVR5cGUsIHZhbHVlSWZUcnVlVHlwZSk7CiAJCQl2YWx1ZUlmRmFsc2UuaW1wbGljaXRXaWRlbmluZyh2YWx1ZUlmRmFsc2VUeXBlLCB2YWx1ZUlmRmFsc2VUeXBlKTsKLQkJCXRoaXMudHlwZUJpbmRpbmcgPSB2YWx1ZUlmRmFsc2VUeXBlOworCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSB2YWx1ZUlmRmFsc2VUeXBlOwogCQkJcmV0dXJuIHZhbHVlSWZGYWxzZVR5cGU7CiAJCX0KIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY29uZGl0aW9uYWxBcmd1bWVudHNJbmNvbXBhdGlibGVUeXBlcygKQEAgLTQxMCw0ICs0MTgsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDZhMzY1OTUuLjM3M2YwMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xNiwxMCArMTYsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gewogCkBAIC0yNyw5ICsyNyw2IEBACiAJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gQ29uc3RhbnRQb29sTmFtZSA9ICI8aW5pdD4iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwogCi0JcHVibGljIGludCByZWZlcmVuY2VDb3VudCA9IDA7Ci0JLy8gY291bnQgaG93IG1hbnkgdGltZXMgdGhpcyBjb25zdHJ1Y3RvciBpcyByZWZlcmVuY2VkIGZyb20gb3RoZXIgbG9jYWwgY29uc3RydWN0b3JzCi0KIAlwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCl7CiAJCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKIAl9CkBAIC00MSw2ICszOCwxOCBAQAogCiAJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKIAkJCXJldHVybjsKKworCQlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzUHJpdmF0ZSgpICYmICF0aGlzLmJpbmRpbmcuaXNQcml2YXRlVXNlZCgpKSB7CisJCQlpZiAoIWNsYXNzU2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuaGFzU3ludGF4RXJyb3IoKSkgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVudXNlZFByaXZhdGVDb25zdHJ1Y3Rvcih0aGlzKTsKKwkJCX0KKwkJfQorCQkJCisJCS8vIGNoZWNrIGNvbnN0cnVjdG9yIHJlY3Vyc2lvbiwgb25jZSBhbGwgY29uc3RydWN0b3IgZ290IHJlc29sdmVkCisJCWlmIChpc1JlY3Vyc2l2ZShudWxsIC8qbGF6eSBpbml0aWFsaXplZCB2aXNpdGVkIGxpc3QqLykpIHsJCQkJCisJCQl0aGlzLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzLmNvbnN0cnVjdG9yQ2FsbCk7CisJCX0KKwkJCQogCQl0cnkgewogCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBjb25zdHJ1Y3RvckNvbnRleHQgPQogCQkJCW5ldyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KApAQCAtNDgsNyArNTcsNyBAQAogCQkJCQl0aGlzLAogCQkJCQliaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsCiAJCQkJCXNjb3BlLAotCQkJCQlGbG93SW5mby5EZWFkRW5kKTsKKwkJCQkJRmxvd0luZm8uREVBRF9FTkQpOwogCQkJaW5pdGlhbGl6ZXJGbG93Q29udGV4dC5jaGVja0luaXRpYWxpemVyRXhjZXB0aW9ucygKIAkJCQlzY29wZSwKIAkJCQljb25zdHJ1Y3RvckNvbnRleHQsCkBAIC04NCwyMSArOTMsMjMgQEAKIAkJCX0KIAkJCS8vIHByb3BhZ2F0ZSB0byBzdGF0ZW1lbnRzCiAJCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQkJYm9vbGVhbiBkaWRBbHJlYWR5Q29tcGxhaW4gPSBmYWxzZTsKIAkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCQkJU3RhdGVtZW50IHN0YXQ7Ci0JCQkJCWlmICghZmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKChzdGF0ID0gc3RhdGVtZW50c1tpXSksIHNjb3BlKSkgeworCQkJCQlpZiAoIWZsb3dJbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZShzdGF0ID0gc3RhdGVtZW50c1tpXSwgc2NvcGUsIGRpZEFscmVhZHlDb21wbGFpbikpIHsKIAkJCQkJCWZsb3dJbmZvID0gc3RhdC5hbmFseXNlQ29kZShzY29wZSwgY29uc3RydWN0b3JDb250ZXh0LCBmbG93SW5mbyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkaWRBbHJlYWR5Q29tcGxhaW4gPSB0cnVlOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJLy8gY2hlY2sgZm9yIG1pc3NpbmcgcmV0dXJuaW5nIHBhdGgKLQkJCW5lZWRGcmVlUmV0dXJuID0KLQkJCQkhKChmbG93SW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSk7CisJCQl0aGlzLm5lZWRGcmVlUmV0dXJuID0gZmxvd0luZm8uaXNSZWFjaGFibGUoKTsKIAogCQkJLy8gY2hlY2sgbWlzc2luZyBibGFuayBmaW5hbCBmaWVsZCBpbml0aWFsaXphdGlvbnMKIAkJCWlmICgoY29uc3RydWN0b3JDYWxsICE9IG51bGwpCiAJCQkJJiYgKGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlICE9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpKSB7Ci0JCQkJZmxvd0luZm8gPSBmbG93SW5mby5tZXJnZWRXaXRoKGluaXRpYWxpemVyRmxvd0NvbnRleHQuaW5pdHNPblJldHVybik7CisJCQkJZmxvd0luZm8gPSBmbG93SW5mby5tZXJnZWRXaXRoKGNvbnN0cnVjdG9yQ29udGV4dC5pbml0c09uUmV0dXJuKTsKIAkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmZpZWxkcygpOwogCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJCUZpZWxkQmluZGluZyBmaWVsZDsKQEAgLTEyMyw2ICsxMzQsNyBAQAogCSAqIEBwYXJhbSBjbGFzc0ZpbGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ2xhc3NGaWxlCiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZSwgQ2xhc3NGaWxlIGNsYXNzRmlsZSkgeworCQkKIAkJaW50IHByb2JsZW1SZXNldFBDID0gMDsKIAkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKSB7CiAJCQlpZiAodGhpcy5iaW5kaW5nID09IG51bGwpCkBAIC0xNTMsNyArMTY1LDcgQEAKIAkJCQl9IGNhdGNoIChBYm9ydE1ldGhvZCBlMikgewogCQkJCQlpbnQgcHJvYmxlbXNMZW5ndGg7CiAJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPQotCQkJCQkJc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwkJCQkJCXNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7CiAJCQkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKIAkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9ibGVtcywgMCwgcHJvYmxlbXNDb3B5LCAwLCBwcm9ibGVtc0xlbmd0aCk7CiAJCQkJCWNsYXNzRmlsZS5hZGRQcm9ibGVtQ29uc3RydWN0b3IodGhpcywgYmluZGluZywgcHJvYmxlbXNDb3B5LCBwcm9ibGVtUmVzZXRQQyk7CkBAIC0xNjEsNyArMTczLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaW50IHByb2JsZW1zTGVuZ3RoOwogCQkJCUlQcm9ibGVtW10gcHJvYmxlbXMgPQotCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRQcm9ibGVtcygpOworCQkJCQlzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5nZXRBbGxQcm9ibGVtcygpOwogCQkJCUlQcm9ibGVtW10gcHJvYmxlbXNDb3B5ID0gbmV3IElQcm9ibGVtW3Byb2JsZW1zTGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoXTsKIAkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2JsZW1zLCAwLCBwcm9ibGVtc0NvcHksIDAsIHByb2JsZW1zTGVuZ3RoKTsKIAkJCQljbGFzc0ZpbGUuYWRkUHJvYmxlbUNvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcsIHByb2JsZW1zQ29weSwgcHJvYmxlbVJlc2V0UEMpOwpAQCAtMTY5LDI1ICsxODEsNjUgQEAKIAkJfQogCX0KIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljRmllbGRJbml0aWFsaXphdGlvbnNJZk5lY2Vzc2FyeSgKKwkJTWV0aG9kU2NvcGUgc2NvcGUsCisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKKwkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCQkJCisJCWlmICghZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHJldHVybjsKKwkJCisJCU5lc3RlZFR5cGVCaW5kaW5nIG5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3MgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJncyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3MubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmc7CisJCQlpZiAoKHN5bnRoZXRpY0FyZyA9IHN5bnRoZXRpY0FyZ3NbaV0pLm1hdGNoaW5nRmllbGQgIT0gbnVsbCkgeworCQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCQkJCWNvZGVTdHJlYW0ubG9hZChzeW50aGV0aWNBcmcpOworCQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoc3ludGhldGljQXJnLm1hdGNoaW5nRmllbGQpOworCQkJfQorCQl9CisJCXN5bnRoZXRpY0FyZ3MgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3MgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNBcmdzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOworCQkJaWYgKChzeW50aGV0aWNBcmcgPSBzeW50aGV0aWNBcmdzW2ldKS5tYXRjaGluZ0ZpZWxkICE9IG51bGwpIHsKKwkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKKwkJCQljb2RlU3RyZWFtLmxvYWQoc3ludGhldGljQXJnKTsKKwkJCQljb2RlU3RyZWFtLnB1dGZpZWxkKHN5bnRoZXRpY0FyZy5tYXRjaGluZ0ZpZWxkKTsKKwkJCX0KKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCBpbnRlcm5hbEdlbmVyYXRlQ29kZShDbGFzc1Njb3BlIGNsYXNzU2NvcGUsIENsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwkJCiAJCWNsYXNzRmlsZS5nZW5lcmF0ZU1ldGhvZEluZm9IZWFkZXIoYmluZGluZyk7CiAJCWludCBtZXRob2RBdHRyaWJ1dGVPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CiAJCWludCBhdHRyaWJ1dGVOdW1iZXIgPSBjbGFzc0ZpbGUuZ2VuZXJhdGVNZXRob2RJbmZvQXR0cmlidXRlKGJpbmRpbmcpOwogCQlpZiAoKCFiaW5kaW5nLmlzTmF0aXZlKCkpICYmICghYmluZGluZy5pc0Fic3RyYWN0KCkpKSB7CisJCQkKIAkJCVR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlID0gY2xhc3NTY29wZS5yZWZlcmVuY2VDb250ZXh0OwogCQkJaW50IGNvZGVBdHRyaWJ1dGVPZmZzZXQgPSBjbGFzc0ZpbGUuY29udGVudHNPZmZzZXQ7CiAJCQljbGFzc0ZpbGUuZ2VuZXJhdGVDb2RlQXR0cmlidXRlSGVhZGVyKCk7CiAJCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0gPSBjbGFzc0ZpbGUuY29kZVN0cmVhbTsKIAkJCWNvZGVTdHJlYW0ucmVzZXQodGhpcywgY2xhc3NGaWxlKTsKKwogCQkJLy8gaW5pdGlhbGl6ZSBsb2NhbCBwb3NpdGlvbnMgLSBpbmNsdWRpbmcgaW5pdGlhbGl6ZXIgc2NvcGUuCiAJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKLQkJCWludCBhcmdTaXplID0gMDsKLQkJCXNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKC8vIGNvbnNpZGVyIHN5bnRoZXRpYyBhcmd1bWVudHMgaWYgYW55Ci0JCQlhcmdTaXplID0KLQkJCQlkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKQotCQkJCQk/ICgoTmVzdGVkVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzKS5zeW50aGV0aWNBcmd1bWVudHNPZmZzZXQKLQkJCQkJOiAxLAotCQkJCWNvZGVTdHJlYW0pOworCisJCQlpbnQgYXJnU2xvdFNpemUgPSAxOyAvLyB0aGlzPT1hbG9hZDAKKwkJCQorCQkJaWYgKGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKXsKKwkJCQlOZXN0ZWRUeXBlQmluZGluZyBuZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKKwkJCQl0aGlzLnNjb3BlLmV4dHJhU3ludGhldGljQXJndW1lbnRzID0gbmVzdGVkVHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7CisJCQkJc2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoLy8gY29uc2lkZXIgc3ludGhldGljIGFyZ3VtZW50cyBpZiBhbnkKKwkJCQkJbmVzdGVkVHlwZS5lbmNsb3NpbmdJbnN0YW5jZXNTbG90U2l6ZSArIDEsCisJCQkJCWNvZGVTdHJlYW0pOworCQkJCWFyZ1Nsb3RTaXplICs9IG5lc3RlZFR5cGUuZW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemU7CisJCQkJYXJnU2xvdFNpemUgKz0gbmVzdGVkVHlwZS5vdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemU7CisJCQl9IGVsc2UgeworCQkJCXNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKDEsICBjb2RlU3RyZWFtKTsKKwkJCX0KKwkJCQkKIAkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewogCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQkJLy8gYXJndW1lbnRzIGluaXRpYWxpemF0aW9uIGZvciBsb2NhbCB2YXJpYWJsZSBkZWJ1ZyBhdHRyaWJ1dGVzCkBAIC0xOTYsNDcgKzI0OCwzMiBAQAogCQkJCQlhcmdCaW5kaW5nLnJlY29yZEluaXRpYWxpemF0aW9uU3RhcnRQQygwKTsKIAkJCQkJVHlwZUJpbmRpbmcgYXJnVHlwZTsKIAkJCQkJaWYgKChhcmdUeXBlID0gYXJnQmluZGluZy50eXBlKSA9PSBMb25nQmluZGluZyB8fCAoYXJnVHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgewotCQkJCQkJYXJnU2l6ZSArPSAyOworCQkJCQkJYXJnU2xvdFNpemUgKz0gMjsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWFyZ1NpemUrKzsKKwkJCQkJCWFyZ1Nsb3RTaXplKys7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCQkKIAkJCU1ldGhvZFNjb3BlIGluaXRpYWxpemVyU2NvcGUgPSBkZWNsYXJpbmdUeXBlLmluaXRpYWxpemVyU2NvcGU7Ci0JCQlpbml0aWFsaXplclNjb3BlLmNvbXB1dGVMb2NhbFZhcmlhYmxlUG9zaXRpb25zKGFyZ1NpemUsIGNvZGVTdHJlYW0pOwotCQkJLy8gb2Zmc2V0IGJ5IHRoZSBhcmd1bWVudCBzaXplIChzaW5jZSBub3QgbGlua2VkIHRvIG1ldGhvZCBzY29wZSkKKwkJCWluaXRpYWxpemVyU2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoYXJnU2xvdFNpemUsIGNvZGVTdHJlYW0pOyAvLyBvZmZzZXQgYnkgdGhlIGFyZ3VtZW50IHNpemUgKHNpbmNlIG5vdCBsaW5rZWQgdG8gbWV0aG9kIHNjb3BlKQogCisJCQlib29sZWFuIG5lZWRGaWVsZEluaXRpYWxpemF0aW9ucyA9IGNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsIHx8IGNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlICE9IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXM7CisKKwkJCS8vIHBvc3QgMS40IHNvdXJjZSBsZXZlbCwgc3ludGhldGljIGluaXRpYWxpemF0aW9ucyBvY2N1ciBwcmlvciB0byBleHBsaWNpdCBjb25zdHJ1Y3RvciBjYWxsCisJCQlib29sZWFuIHByZUluaXRTeW50aGV0aWNGaWVsZHMgPSBzY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMudGFyZ2V0SkRLID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQ7CisKKwkJCWlmIChuZWVkRmllbGRJbml0aWFsaXphdGlvbnMgJiYgcHJlSW5pdFN5bnRoZXRpY0ZpZWxkcyl7CisJCQkJZ2VuZXJhdGVTeW50aGV0aWNGaWVsZEluaXRpYWxpemF0aW9uc0lmTmVjZXNzYXJ5KHNjb3BlLCBjb2RlU3RyZWFtLCBkZWNsYXJpbmdDbGFzcyk7CisJCQl9CQkJCiAJCQkvLyBnZW5lcmF0ZSBjb25zdHJ1Y3RvciBjYWxsCiAJCQlpZiAoY29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKIAkJCQljb25zdHJ1Y3RvckNhbGwuZ2VuZXJhdGVDb2RlKHNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KIAkJCS8vIGdlbmVyYXRlIGZpZWxkIGluaXRpYWxpemF0aW9uIC0gb25seSBpZiBub3QgaW52b2tpbmcgYW5vdGhlciBjb25zdHJ1Y3RvciBjYWxsIG9mIHRoZSBzYW1lIGNsYXNzCi0JCQlpZiAoKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKQotCQkJCSYmIChjb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSkgewotCQkJCS8vIGdlbmVyYXRlIHN5bnRoZXRpYyBmaWVsZHMgaW5pdGlhbGl6YXRpb24KLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJCQkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7Ci0JCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3MgPQotCQkJCQkJbmVzdGVkVHlwZS5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3MgPT0gbnVsbCA/IDAgOiBzeW50aGV0aWNBcmdzLmxlbmd0aDsKLQkJCQkJCWkgPCBtYXg7Ci0JCQkJCQlpKyspIHsKLQkJCQkJCWlmIChzeW50aGV0aWNBcmdzW2ldLm1hdGNoaW5nRmllbGQgIT0gbnVsbCkgewotCQkJCQkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwotCQkJCQkJCWNvZGVTdHJlYW0ubG9hZChzeW50aGV0aWNBcmdzW2ldKTsKLQkJCQkJCQljb2RlU3RyZWFtLnB1dGZpZWxkKHN5bnRoZXRpY0FyZ3NbaV0ubWF0Y2hpbmdGaWVsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3ludGhldGljQXJncyA9IG5lc3RlZFR5cGUuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOwotCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gc3ludGhldGljQXJncyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY0FyZ3MubGVuZ3RoOwotCQkJCQkJaSA8IG1heDsKLQkJCQkJCWkrKykgewotCQkJCQkJaWYgKHN5bnRoZXRpY0FyZ3NbaV0ubWF0Y2hpbmdGaWVsZCAhPSBudWxsKSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5hbG9hZF8wKCk7Ci0JCQkJCQkJY29kZVN0cmVhbS5sb2FkKHN5bnRoZXRpY0FyZ3NbaV0pOwotCQkJCQkJCWNvZGVTdHJlYW0ucHV0ZmllbGQoc3ludGhldGljQXJnc1tpXS5tYXRjaGluZ0ZpZWxkKTsKLQkJCQkJCX0KLQkJCQkJfQorCQkJaWYgKG5lZWRGaWVsZEluaXRpYWxpemF0aW9ucykgeworCQkJCWlmICghcHJlSW5pdFN5bnRoZXRpY0ZpZWxkcyl7CisJCQkJCWdlbmVyYXRlU3ludGhldGljRmllbGRJbml0aWFsaXphdGlvbnNJZk5lY2Vzc2FyeShzY29wZSwgY29kZVN0cmVhbSwgZGVjbGFyaW5nQ2xhc3MpOwogCQkJCX0KIAkJCQkvLyBnZW5lcmF0ZSB1c2VyIGZpZWxkIGluaXRpYWxpemF0aW9uCiAJCQkJaWYgKGRlY2xhcmluZ1R5cGUuZmllbGRzICE9IG51bGwpIHsKQEAgLTI1NCw3ICsyOTEsNyBAQAogCQkJCQlzdGF0ZW1lbnRzW2ldLmdlbmVyYXRlQ29kZShzY29wZSwgY29kZVN0cmVhbSk7CiAJCQkJfQogCQkJfQotCQkJaWYgKG5lZWRGcmVlUmV0dXJuKSB7CisJCQlpZiAodGhpcy5uZWVkRnJlZVJldHVybikgewogCQkJCWNvZGVTdHJlYW0ucmV0dXJuXygpOwogCQkJfQogCQkJLy8gbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlcwpAQCAtMjg2LDE0ICszMjMsNDMgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBkaXJlY3RseSBpbnZvbHZlZCBpbiBhIGN5Y2xlLgorCSAqIEdpdmVuIG1vc3QgY29uc3RydWN0b3JzIGFyZW4ndCwgd2Ugb25seSBhbGxvY2F0ZSB0aGUgdmlzaXRlZCBsaXN0CisJICogbGF6aWx5LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVjdXJzaXZlKEFycmF5TGlzdCB2aXNpdGVkKSB7CisKKwkJaWYgKHRoaXMuYmluZGluZyA9PSBudWxsCisJCQkJfHwgdGhpcy5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbAorCQkJCXx8IHRoaXMuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcgPT0gbnVsbAorCQkJCXx8IHRoaXMuY29uc3RydWN0b3JDYWxsLmlzU3VwZXJBY2Nlc3MoKQorCQkJCXx8ICF0aGlzLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB0YXJnZXRDb25zdHJ1Y3RvciA9IAorCQkJKChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKXRoaXMuc2NvcGUucmVmZXJlbmNlVHlwZSgpLmRlY2xhcmF0aW9uT2YoY29uc3RydWN0b3JDYWxsLmJpbmRpbmcpKTsKKwkJaWYgKHRoaXMgPT0gdGFyZ2V0Q29uc3RydWN0b3IpIHJldHVybiB0cnVlOyAvLyBkaXJlY3QgY2FzZQorCisJCWlmICh2aXNpdGVkID09IG51bGwpIHsgLy8gbGF6eSBhbGxvY2F0aW9uCisJCQl2aXNpdGVkID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJfSBlbHNlIHsKKwkJCWludCBpbmRleCA9IHZpc2l0ZWQuaW5kZXhPZih0aGlzKTsKKwkJCWlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXggPT0gMDsgLy8gb25seSBibGFtZSBpZiBkaXJlY3RseSBwYXJ0IG9mIHRoZSBjeWNsZQorCQl9CisJCXZpc2l0ZWQuYWRkKHRoaXMpOworCisJCXJldHVybiB0YXJnZXRDb25zdHJ1Y3Rvci5pc1JlY3Vyc2l2ZSh2aXNpdGVkKTsKKwl9CisJCiAJcHVibGljIHZvaWQgcGFyc2VTdGF0ZW1lbnRzKFBhcnNlciBwYXJzZXIsIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKIAogCQkvL2ZpbGwgdXAgdGhlIGNvbnN0cnVjdG9yIGJvZHkgd2l0aCBpdHMgc3RhdGVtZW50cwogCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCiAJCQlyZXR1cm47CiAJCWlmIChpc0RlZmF1bHRDb25zdHJ1Y3Rvcil7Ci0JCQljb25zdHJ1Y3RvckNhbGwgPQotCQkJCW5ldyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKTsKKwkJCWNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKIAkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwogCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsgCiAJCQlyZXR1cm47CkBAIC0zMDYsNDUgKzM3MiwyOCBAQAogCSAqIFR5cGUgY2hlY2tpbmcgZm9yIGNvbnN0cnVjdG9yLCBqdXN0IGFub3RoZXIgbWV0aG9kLCBleGNlcHQgZm9yIHNwZWNpYWwgY2hlY2sKIAkgKiBmb3IgcmVjdXJzaXZlIGNvbnN0cnVjdG9yIGludm9jYXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmVTdGF0ZW1lbnRzKENsYXNzU2NvcGUgdXBwZXJTY29wZSkgewotLyoKLQkJLy8gY2hlY2tpbmcgZm9yIHJlY3Vyc2l2ZSBjb25zdHJ1Y3RvciBjYWxsIChwcm90ZWN0aW9uKQotCQlpZiAoIWlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uICYmIGNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsKXsKLQkJCWNvbnN0cnVjdG9yQ2FsbCA9IG5ldyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKTsKLQkJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VTdGFydCA9IHNvdXJjZVN0YXJ0OwotCQkJY29uc3RydWN0b3JDYWxsLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKLQkJfQotKi8KKwlwdWJsaWMgdm9pZCByZXNvbHZlU3RhdGVtZW50cygpIHsKKwogCQlpZiAoIUNoYXJPcGVyYXRpb24uZXF1YWxzKHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5zb3VyY2VOYW1lLCBzZWxlY3RvcikpewogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubWlzc2luZ1JldHVyblR5cGUodGhpcyk7CiAJCX0KIAogCQkvLyBpZiBudWxsID09PiBhbiBlcnJvciBoYXMgb2NjdXJzIGF0IHBhcnNpbmcgdGltZSAuLi4uCi0JCWlmIChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgeworCQlpZiAodGhpcy5jb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgewogCQkJLy8gZS5nLiB1c2luZyBzdXBlcigpIGluIGphdmEubGFuZy5PYmplY3QKLQkJCWlmIChiaW5kaW5nICE9IG51bGwKLQkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkID09IFRfT2JqZWN0Ci0JCQkJJiYgY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUgIT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcykgewotCQkJCQlpZiAoY29uc3RydWN0b3JDYWxsLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpIHsKLQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdChjb25zdHJ1Y3RvckNhbGwpOworCQkJaWYgKHRoaXMuYmluZGluZyAhPSBudWxsCisJCQkJJiYgdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkID09IFRfT2JqZWN0CisJCQkJJiYgdGhpcy5jb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKSB7CisJCQkJCWlmICh0aGlzLmNvbnN0cnVjdG9yQ2FsbC5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKSB7CisJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RVc2VTdXBlckluSmF2YUxhbmdPYmplY3QodGhpcy5jb25zdHJ1Y3RvckNhbGwpOwogCQkJCQl9Ci0JCQkJCWNvbnN0cnVjdG9yQ2FsbCA9IG51bGw7CisJCQkJCXRoaXMuY29uc3RydWN0b3JDYWxsID0gbnVsbDsKIAkJCX0gZWxzZSB7Ci0JCQkJY29uc3RydWN0b3JDYWxsLnJlc29sdmUoc2NvcGUpOworCQkJCXRoaXMuY29uc3RydWN0b3JDYWxsLnJlc29sdmUodGhpcy5zY29wZSk7CiAJCQl9CiAJCX0KIAkJCi0JCXN1cGVyLnJlc29sdmVTdGF0ZW1lbnRzKHVwcGVyU2NvcGUpOwotCi0JCS8vIGluZGlyZWN0IHJlZmVyZW5jZTogaW5jcmVtZW50IHRhcmdldCBjb25zdHJ1Y3RvciByZWZlcmVuY2UgY291bnQKLQkJaWYgKGNvbnN0cnVjdG9yQ2FsbCAhPSBudWxsKXsKLQkJCWlmIChjb25zdHJ1Y3RvckNhbGwuYmluZGluZyAhPSBudWxsCi0JCQkJJiYgIWNvbnN0cnVjdG9yQ2FsbC5pc1N1cGVyQWNjZXNzKCkKLQkJCQkmJiBjb25zdHJ1Y3RvckNhbGwuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJKChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKQotCQkJCQkJKHVwcGVyU2NvcGUucmVmZXJlbmNlQ29udGV4dC5kZWNsYXJhdGlvbk9mKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKSkpLnJlZmVyZW5jZUNvdW50Kys7Ci0JCQl9Ci0JCX0KKwkJc3VwZXIucmVzb2x2ZVN0YXRlbWVudHMoKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nU3RhdGVtZW50cyhpbnQgdGFiKSB7CkBAIC0zOTEsNCArNDQwLDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGNsYXNzU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnRpbnVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0NvbnRpbnVlLmphdmEKaW5kZXggZmU1ZTgyYy4uN2M4MjdlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Db250aW51ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvQ29udGludWUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0zMCw3NCArMzAsNjUgQEAKIAkJLy8gdG8gZWFjaCBvZiB0aGUgdHJhdmVyc2VkIHRyeSBzdGF0ZW1lbnRzLCBzbyB0aGF0IGV4ZWN1dGlvbiB3aWxsIHRlcm1pbmF0ZSBwcm9wZXJseS4KIAogCQkvLyBsb29rdXAgdGhlIGxhYmVsLCB0aGlzIHNob3VsZCBhbnN3ZXIgdGhlIHJldHVybkNvbnRleHQKLQkJRmxvd0NvbnRleHQgdGFyZ2V0Q29udGV4dDsKLQkJaWYgKGxhYmVsID09IG51bGwpIHsKLQkJCXRhcmdldENvbnRleHQgPSBmbG93Q29udGV4dC5nZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdENvbnRpbnVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRDb250ZXh0ID0gZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckNvbnRpbnVlTGFiZWwobGFiZWwpOwotCQl9CisJCUZsb3dDb250ZXh0IHRhcmdldENvbnRleHQgPSAobGFiZWwgPT0gbnVsbCkKKwkJCQk/IGZsb3dDb250ZXh0LmdldFRhcmdldENvbnRleHRGb3JEZWZhdWx0Q29udGludWUoKQorCQkJCTogZmxvd0NvbnRleHQuZ2V0VGFyZ2V0Q29udGV4dEZvckNvbnRpbnVlTGFiZWwobGFiZWwpOworCiAJCWlmICh0YXJnZXRDb250ZXh0ID09IG51bGwpIHsKIAkJCWlmIChsYWJlbCA9PSBudWxsKSB7CiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb250aW51ZSh0aGlzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuZGVmaW5lZExhYmVsKHRoaXMpOyAvLyBuZWVkIHRvIGltcHJvdmUKKwkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5kZWZpbmVkTGFiZWwodGhpcyk7IAogCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRhcmdldENvbnRleHQgPT0gRmxvd0NvbnRleHQuTm90Q29udGludWFibGVDb250ZXh0KSB7Ci0JCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb250aW51ZSh0aGlzKTsKLQkJCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKLQkJCX0KLQkJCXRhcmdldExhYmVsID0gdGFyZ2V0Q29udGV4dC5jb250aW51ZUxhYmVsKCk7Ci0JCQl0YXJnZXRDb250ZXh0LnJlY29yZENvbnRpbnVlRnJvbShmbG93SW5mbyk7Ci0JCQlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gZmxvd0NvbnRleHQ7Ci0JCQlpbnQgc3ViSW5kZXggPSAwLCBtYXhTdWIgPSA1OwotCQkJc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWJdOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlBc3ROb2RlIHN1YjsKLQkJCQlpZiAoKHN1YiA9IHRyYXZlcnNlZENvbnRleHQuc3ViUm91dGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdWJJbmRleCA9PSBtYXhTdWIpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQkJc3Vicm91dGluZXMsCi0JCQkJCQkJMCwKLQkJCQkJCQkoc3Vicm91dGluZXMgPSBuZXcgQXN0Tm9kZVttYXhTdWIgKj0gMl0pLAotCQkJCQkJCTAsCi0JCQkJCQkJc3ViSW5kZXgpOwotCQkJCQkJLy8gZ3JvdwotCQkJCQl9Ci0JCQkJCXN1YnJvdXRpbmVzW3N1YkluZGV4KytdID0gc3ViOwotCQkJCQlpZiAoc3ViLmNhbm5vdFJldHVybigpKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyByZW1lbWJlciB0aGUgaW5pdGlhbGl6YXRpb24gYXQgdGhpcwotCQkJCS8vIHBvaW50IGZvciBkZWFsaW5nIHdpdGggYmxhbmsgZmluYWwgdmFyaWFibGVzLgotCQkJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCQlyZXR1cm4gZmxvd0luZm87IC8vIHByZXRlbmQgaXQgZGlkIG5vdCBjb250aW51ZSBzaW5jZSBubyBhY3R1YWwgdGFyZ2V0CQkJCisJCX0gCiAKLQkJCQlpZiAodHJhdmVyc2VkQ29udGV4dCA9PSB0YXJnZXRDb250ZXh0KSB7CisJCWlmICh0YXJnZXRDb250ZXh0ID09IEZsb3dDb250ZXh0Lk5vdENvbnRpbnVhYmxlQ29udGV4dCkgeworCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb250aW51ZSh0aGlzKTsKKwkJCXJldHVybiBmbG93SW5mbzsgLy8gcHJldGVuZCBpdCBkaWQgbm90IGNvbnRpbnVlIHNpbmNlIG5vIGFjdHVhbCB0YXJnZXQKKwkJfQorCQl0YXJnZXRMYWJlbCA9IHRhcmdldENvbnRleHQuY29udGludWVMYWJlbCgpOworCQlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gZmxvd0NvbnRleHQ7CisJCWludCBzdWJJbmRleCA9IDAsIG1heFN1YiA9IDU7CisJCXN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbbWF4U3ViXTsKKworCQlkbyB7CisJCQlBc3ROb2RlIHN1YjsKKwkJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJSb3V0aW5lKCkpICE9IG51bGwpIHsKKwkJCQlpZiAoc3ViSW5kZXggPT0gbWF4U3ViKSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoc3Vicm91dGluZXMsIDAsIChzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW21heFN1Yio9Ml0pLCAwLCBzdWJJbmRleCk7IC8vIGdyb3cKKwkJCQl9CisJCQkJc3Vicm91dGluZXNbc3ViSW5kZXgrK10gPSBzdWI7CisJCQkJaWYgKHN1Yi5jYW5ub3RSZXR1cm4oKSkgewogCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmF2ZXJzZWRDb250ZXh0ID0gdHJhdmVyc2VkQ29udGV4dC5wYXJlbnQ7CiAJCQkJfQogCQkJfQotCQkJLy8gcmVzaXplIHN1YnJvdXRpbmVzCi0JCQlpZiAoc3ViSW5kZXggIT0gbWF4U3ViKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCQkJc3Vicm91dGluZXMsCi0JCQkJCTAsCi0JCQkJCShzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW3N1YkluZGV4XSksCi0JCQkJCTAsCi0JCQkJCXN1YkluZGV4KTsKKwkJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisKKwkJCUFzdE5vZGUgbm9kZTsKKwkJCWlmICgobm9kZSA9IHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGUpIGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7CisJCQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IChUcnlTdGF0ZW1lbnQpIG5vZGU7CisJCQkJZmxvd0luZm8uYWRkSW5pdGlhbGl6YXRpb25zRnJvbSh0cnlTdGF0ZW1lbnQuc3ViUm91dGluZUluaXRzKTsgLy8gY29sbGVjdCBpbml0cwkJCQorCQkJfSBlbHNlIGlmICh0cmF2ZXJzZWRDb250ZXh0ID09IHRhcmdldENvbnRleHQpIHsKKwkJCQkvLyBvbmx5IHJlY29yZCBjb250aW51ZSBpbmZvIG9uY2UgYWNjdW11bGF0ZWQgdGhyb3VnaCBzdWJyb3V0aW5lcywgYW5kIG9ubHkgYWdhaW5zdCB0YXJnZXQgY29udGV4dAorCQkJCXRhcmdldENvbnRleHQucmVjb3JkQ29udGludWVGcm9tKGZsb3dJbmZvKTsKKwkJCQlicmVhazsKIAkJCX0KKwkJfSB3aGlsZSAoKHRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudCkgIT0gbnVsbCk7CisJCQorCQkvLyByZXNpemUgc3Vicm91dGluZXMKKwkJaWYgKHN1YkluZGV4ICE9IG1heFN1YikgeworCQkJU3lzdGVtLmFycmF5Y29weShzdWJyb3V0aW5lcywgMCwgKHN1YnJvdXRpbmVzID0gbmV3IEFzdE5vZGVbc3ViSW5kZXhdKSwgMCwgc3ViSW5kZXgpOwogCQl9Ci0JCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCQlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CiAKIAkJU3RyaW5nIHMgPSB0YWJTdHJpbmcodGFiKTsKLQkJcyA9IHMgKyAiY29udGludWUgIjsgLy8kTk9OLU5MUy0xJAorCQlzICs9ICJjb250aW51ZSAiOyAvLyROT04tTkxTLTEkCiAJCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcyA9IHMgKyBuZXcgU3RyaW5nKGxhYmVsKTsKKwkJCXMgKz0gbmV3IFN0cmluZyhsYWJlbCk7CiAJCXJldHVybiBzOwogCX0KIApAQCAtMTA4LDQgKzk5LDQgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9EZWZhdWx0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9EZWZhdWx0Q2FzZS5qYXZhCmluZGV4IDMxNzllYWIuLjI1MGUzMjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRGVmYXVsdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RlZmF1bHRDYXNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNTIsNiArNTIsMTIgQEAKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAogCX0KKwkvKioKKwkgKiBOby1vcCA6IHNob3VsZCB1c2UgcmVzb2x2ZUNhc2UoLi4uKSBpbnN0ZWFkLgorCSAqLworCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgeworCX0KKwogCXB1YmxpYyBDb25zdGFudCByZXNvbHZlQ2FzZSgKIAkJQmxvY2tTY29wZSBzY29wZSwKIAkJVHlwZUJpbmRpbmcgdGVzdFR5cGUsCkBAIC04MSw0ICs4Nyw0IEBACiAJCXZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG9TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG9TdGF0ZW1lbnQuamF2YQppbmRleCBiOWIyZmNiLi5lOWU0ZWM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Eb1N0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTQ5LDYzICs0OSw1NCBAQAogCQkJCWNvbnRpbnVlTGFiZWwsCiAJCQkJY3VycmVudFNjb3BlKTsKIAotCQlDb25zdGFudCBjb25kaXRpb25Db25zdGFudCA9IGNvbmRpdGlvbi5jb25zdGFudDsKLQkJQ29uc3RhbnQgY29uZGl0aW9uYWxDb25zdGFudCA9IGNvbmRpdGlvbi5jb25kaXRpb25hbENvbnN0YW50KCk7Ci0JCWJvb2xlYW4gaXNGYWxzZUNvbmRpdGlvbiA9Ci0JCQkoKGNvbmRpdGlvbkNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKLQkJCQkmJiAoY29uZGl0aW9uQ29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQotCQkJCXx8ICgoY29uZGl0aW9uYWxDb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCi0JCQkJCSYmIChjb25kaXRpb25hbENvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSk7CisJCUNvbnN0YW50IGNzdCA9IGNvbmRpdGlvbi5jb25zdGFudDsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvblRydWUgPSBjc3QgIT0gTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlOworCQljc3QgPSBjb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CiAKKwkJaW50IHByZXZpb3VzTW9kZSA9IGZsb3dJbmZvLnJlYWNoTW9kZSgpOworCQkJCQogCQlpZiAoKGFjdGlvbiAhPSBudWxsKSAmJiAhYWN0aW9uLmlzRW1wdHlCbG9jaygpKSB7Ci0JCQlmbG93SW5mbyA9IGFjdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGxvb3BpbmdDb250ZXh0LCBmbG93SW5mby5jb3B5KCkpOworCQkJZmxvd0luZm8gPSBhY3Rpb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBsb29waW5nQ29udGV4dCwgZmxvd0luZm8pOwogCiAJCQkvLyBjb2RlIGdlbmVyYXRpb24gY2FuIGJlIG9wdGltaXplZCB3aGVuIG5vIG5lZWQgdG8gY29udGludWUgaW4gdGhlIGxvb3AKLQkJCWlmICgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpIHsKLQkJCQlpZiAoKGxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZSA9PSBGbG93SW5mby5EZWFkRW5kKQotCQkJCQl8fCBsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUuaXNGYWtlUmVhY2hhYmxlKCkpIHsKLQkJCQkJY29udGludWVMYWJlbCA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmxvd0luZm8gPSBsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWU7IC8vIGZvciBjb25kaXRpb24KLQkJCQkJaWYgKGlzRmFsc2VDb25kaXRpb24pIHsKLQkJCQkJCS8vCWNvbnRpbnVlTGFiZWwgPSBudWxsOyAtIGNhbm5vdCBuaWwgdGhlIGxhYmVsIHNpbmNlIG1heSBiZSB0YXJnZXRlZCBhbHJlYWR5IGJ5ICdjb250aW51ZScgc3RhdGVtZW50cwotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9vcGluZ0NvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3AoY3VycmVudFNjb3BlLCBmbG93SW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpc0ZhbHNlQ29uZGl0aW9uKSB7Ci0JCQkJCS8vCWNvbnRpbnVlTGFiZWwgPSBudWxsOyAtIGNhbm5vdCBuaWwgdGhlIGxhYmVsIHNpbmNlIG1heSBiZSB0YXJnZXRlZCBhbHJlYWR5IGJ5ICdjb250aW51ZScgc3RhdGVtZW50cwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOwotCQkJCX0KKwkJCWlmICghZmxvd0luZm8uaXNSZWFjaGFibGUoKSAmJiAhbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLmlzUmVhY2hhYmxlKCkpIHsKKwkJCQljb250aW51ZUxhYmVsID0gbnVsbDsKIAkJCX0KIAkJfQotCQlMb29waW5nRmxvd0NvbnRleHQgY29uZExvb3BDb250ZXh0OworCQkvKiBSZXNldCByZWFjaCBtb2RlLCB0byBhZGRyZXNzIGZvbGxvd2luZyBzY2VuYXJpby4KKwkJICogICBmaW5hbCBibGFuazsKKwkJICogICBkbyB7IGlmICh0cnVlKSBicmVhazsgZWxzZSBibGFuayA9IDA7IH0gd2hpbGUoZmFsc2UpOworCQkgKiAgIGJsYW5rID0gMTsgLy8gbWF5IGJlIGluaXRpYWxpemVkIGFscmVhZHkgCisJCSAqLworCQlmbG93SW5mby5zZXRSZWFjaE1vZGUocHJldmlvdXNNb2RlKTsKKwkJCiAJCWZsb3dJbmZvID0KIAkJCWNvbmRpdGlvbi5hbmFseXNlQ29kZSgKIAkJCQljdXJyZW50U2NvcGUsCi0JCQkJKGNvbmRMb29wQ29udGV4dCA9Ci0JCQkJCW5ldyBMb29waW5nRmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIHRoaXMsIG51bGwsIG51bGwsIGN1cnJlbnRTY29wZSkpLAorCQkJCWxvb3BpbmdDb250ZXh0LAogCQkJCShhY3Rpb24gPT0gbnVsbAogCQkJCQk/IGZsb3dJbmZvCiAJCQkJCTogKGZsb3dJbmZvLm1lcmdlZFdpdGgobG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlKSkpKTsKLQkJY29uZExvb3BDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKGN1cnJlbnRTY29wZSwgZmxvd0luZm8pOworCQlpZiAoIWlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgJiYgY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQlsb29waW5nQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChjdXJyZW50U2NvcGUsIGZsb3dJbmZvKTsKKwkJfQogCiAJCS8vIGluZmluaXRlIGxvb3AKIAkJRmxvd0luZm8gbWVyZ2VkSW5mbzsKLQkJaWYgKChjb25kaXRpb24uY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQotCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgeworCQlpZiAoaXNDb25kaXRpb25UcnVlKSB7CiAJCQltZXJnZWRJbmZvID0gbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrOwotCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOwotCQkJcmV0dXJuIG1lcmdlZEluZm87CisJCQlpZiAoIW1lcmdlZEluZm8uaXNSZWFjaGFibGUoKSkgbWVyZ2VkSW5mby5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkpOworCQl9IGVsc2UgeworCQkJLy8gZW5kIG9mIGxvb3A6IGVpdGhlciBjb25kaXRpb24gZmFsc2Ugb3IgYnJlYWsKKwkJCW1lcmdlZEluZm8gPQorCQkJCWZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKKwkJCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKTsKKwkJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgJiYgIWxvb3BpbmdDb250ZXh0LmluaXRzT25CcmVhay5pc1JlYWNoYWJsZSgpKSB7CisJCQkJbWVyZ2VkSW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworCQkJfQogCQl9Ci0KLQkJLy8gZW5kIG9mIGxvb3A6IGVpdGhlciBjb25kaXRpb24gZmFsc2Ugb3IgYnJlYWsKLQkJbWVyZ2VkSW5mbyA9Ci0JCQlmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLnVuY29uZGl0aW9uYWxJbml0cygpLm1lcmdlZFdpdGgoCi0JCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKTsKIAkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwpAQCAtMTU3LDkgKzE0OCwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpIHsKLQotCQl0aGlzLmJyZWFrTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7Ci0JCXRoaXMuY29udGludWVMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJaWYgKHRoaXMuYnJlYWtMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLmJyZWFrTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KKwkJaWYgKHRoaXMuY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLmNvbnRpbnVlTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KIAl9CiAKIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpIHsKQEAgLTE5NSw0ICsxODksNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0RvdWJsZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG91YmxlTGl0ZXJhbC5qYXZhCmluZGV4IGEzNDMwZjIuLjI0MjI4Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG91YmxlTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRG91YmxlTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTMwLDcgKzMwLDcgQEAKIAogCWlmIChjb21wdXRlZFZhbHVlLmRvdWJsZVZhbHVlKCkgPiBEb3VibGUuTUFYX1ZBTFVFKSByZXR1cm4gOyAvL21heSBiZSBJbmZpbml0eQogCWlmIChjb21wdXRlZFZhbHVlLmRvdWJsZVZhbHVlKCkgPCBEb3VibGUuTUlOX1ZBTFVFKQotCXsJLy9vbmx5IGEgdHJ1ZSAwIGNhbiBiZSBtYWRlIG9mIHplcm9zIDotKQorCXsJLy9vbmx5IGEgdHJ1ZSAwIGNhbiBiZSBtYWRlIG9mIHplcm9zCiAJCS8vMi4wMDAwMDAwMDAwMDAwMDAwMGUtMzI0IGlzIGlsbGVnYWwgLi4uLiAKIAkJbGFiZWwgOgogCQkJZm9yIChpbnQgaT0wO2k8c291cmNlLmxlbmd0aDtpKyspCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VtcHR5U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VtcHR5U3RhdGVtZW50LmphdmEKaW5kZXggODRjOWZjNy4uYzdiN2NhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FbXB0eVN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRW1wdHlTdGF0ZW1lbnQuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VxdWFsRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FcXVhbEV4cHJlc3Npb24uamF2YQppbmRleCAzNDQyNDc2Li45ZmUwYWFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0VxdWFsRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXF1YWxFeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNjgsMzIgKzY4LDMzIEBACiAJCQlsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKSkuYXNOZWdhdGVkQ29uZGl0aW9uKCkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJfQogfQotcHVibGljIGZpbmFsIGJvb2xlYW4gYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShCbG9ja1Njb3BlIHNjb3BlLCBUeXBlQmluZGluZyBjYXN0VGIsIFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UYikgewotCS8vc2VlIHNwZWNpZmljYXRpb25zIHAuNjgKK3B1YmxpYyBmaW5hbCBib29sZWFuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgY2FzdFR5cGUsIFR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlKSB7CisJLy9zZWUgc3BlY2lmaWNhdGlvbnMgNS41CiAJLy9BIG1vcmUgY29tcGxldGUgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBvbgogCS8vQ2FzdEV4cHJlc3Npb24gKGl0IGRlYWxzIHdpdGggY29uc3RhbnQgYW5kIG5lZWQgcnVudGltZSBjaGVja2Nhc3QpCiAKKwlpZiAoY2FzdFR5cGUgPT0gZXhwcmVzc2lvblR5cGUpIHJldHVybiB0cnVlOwogCiAJLy89PT09PT09PUFSUkFZPT09PT09PT09PT09PT09Ci0JaWYgKGV4cHJlc3Npb25UYi5pc0FycmF5VHlwZSgpKSB7Ci0JCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeyAvLy0tLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNBcnJheSAtLS0tLS0tLS0tLQotCQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvbkVsdFRiID0gKChBcnJheUJpbmRpbmcpIGV4cHJlc3Npb25UYikuZWxlbWVudHNUeXBlKHNjb3BlKTsKLQkJCWlmIChleHByZXNzaW9uRWx0VGIuaXNCYXNlVHlwZSgpKQorCWlmIChleHByZXNzaW9uVHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCWlmIChjYXN0VHlwZS5pc0FycmF5VHlwZSgpKSB7IC8vLS0tLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tCisJCQlUeXBlQmluZGluZyBleHByZXNzaW9uRWx0VHlwZSA9ICgoQXJyYXlCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkuZWxlbWVudHNUeXBlKHNjb3BlKTsKKwkJCWlmIChleHByZXNzaW9uRWx0VHlwZS5pc0Jhc2VUeXBlKCkpCiAJCQkJLy8gPC0tLXN0b3AgdGhlIHJlY3Vyc2lvbi0tLS0tLS0gCi0JCQkJcmV0dXJuICgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSkgPT0gZXhwcmVzc2lvbkVsdFRiOworCQkJCXJldHVybiAoKEFycmF5QmluZGluZykgY2FzdFR5cGUpLmVsZW1lbnRzVHlwZShzY29wZSkgPT0gZXhwcmVzc2lvbkVsdFR5cGU7CiAJCQkvL3JlY3Vyc2l2bHkgb24gdGhlIGVsdHMuLi4KLQkJCXJldHVybiBhcmVUeXBlc0Nhc3RDb21wYXRpYmxlKHNjb3BlLCAoKEFycmF5QmluZGluZykgY2FzdFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpLCBleHByZXNzaW9uRWx0VGIpOworCQkJcmV0dXJuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsICgoQXJyYXlCaW5kaW5nKSBjYXN0VHlwZSkuZWxlbWVudHNUeXBlKHNjb3BlKSwgZXhwcmVzc2lvbkVsdFR5cGUpOwogCQl9Ci0JCWlmIChjYXN0VGIuaXNCYXNlVHlwZSgpKSB7CisJCWlmIChjYXN0VHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeyAvLy0tLS0tLShjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0tLS0tCQotCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJaWYgKGNhc3RUeXBlLmlzQ2xhc3MoKSkgeyAvLy0tLS0tLShjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0tLS0tCQorCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFR5cGUpKQogCQkJCXJldHVybiB0cnVlOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWlmIChjYXN0VGIuaXNJbnRlcmZhY2UoKSkgeyAvLy0tLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0KLQkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGNhc3RUYikgfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoY2FzdFRiKSkgeworCQlpZiAoY2FzdFR5cGUuaXNJbnRlcmZhY2UoKSkgeyAvLy0tLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQXJyYXkgLS0tLS0tLS0tLS0KKwkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGNhc3RUeXBlKSB8fCBzY29wZS5pc0phdmFJb1NlcmlhbGl6YWJsZShjYXN0VHlwZSkpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJCXJldHVybiBmYWxzZTsKQEAgLTEwMywzOSArMTA0LDM5IEBACiAJfQogCiAJLy8tLS0tLS0tLS0tLS0oY2FzdFR5cGUpIG51bGwtLS0tLS0tLS0tLS0tLQotCWlmIChleHByZXNzaW9uVGIgPT0gTnVsbEJpbmRpbmcpIHsKLQkJcmV0dXJuICFjYXN0VGIuaXNCYXNlVHlwZSgpOworCWlmIChleHByZXNzaW9uVHlwZSA9PSBOdWxsQmluZGluZykgeworCQlyZXR1cm4gIWNhc3RUeXBlLmlzQmFzZVR5cGUoKTsKIAl9CiAKIAkvLz09PT09PT09QkFTRVRZUEU9PT09PT09PT09PT09PQotCWlmIChleHByZXNzaW9uVGIuaXNCYXNlVHlwZSgpKSB7CisJaWYgKGV4cHJlc3Npb25UeXBlLmlzQmFzZVR5cGUoKSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAKIAkvLz09PT09PT09UkVGRVJFTkNFIFRZUEU9PT09PT09PT09PT09PT09PT09CiAKLQlpZiAoZXhwcmVzc2lvblRiLmlzQ2xhc3MoKSkgewotCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsgLy8gLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0KLQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGV4cHJlc3Npb25UYikpCisJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ2xhc3MoKSkgeworCQlpZiAoY2FzdFR5cGUuaXNBcnJheVR5cGUoKSkgeyAvLyAtLS0tIChjYXN0VGIuaXNBcnJheSkgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tLQorCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZXhwcmVzc2lvblR5cGUpKQogCQkJCXJldHVybiB0cnVlOwogCQl9Ci0JCWlmIChjYXN0VGIuaXNCYXNlVHlwZSgpKSB7CisJCWlmIChjYXN0VHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeyAvLyAtLS0tLSAoY2FzdFRiLmlzQ2xhc3MpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLSAKLQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoZXhwcmVzc2lvblRiLCBjYXN0VGIpKQorCQlpZiAoY2FzdFR5cGUuaXNDbGFzcygpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tIAorCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoY2FzdFR5cGUpKQogCQkJCXJldHVybiB0cnVlOwogCQkJZWxzZSB7Ci0JCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCQlpZiAoY2FzdFR5cGUuaXNDb21wYXRpYmxlV2l0aChleHByZXNzaW9uVHlwZSkpIHsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJfQotCQlpZiAoY2FzdFRiLmlzSW50ZXJmYWNlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzQ2xhc3MgLS0tLS0tLSAgCi0JCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVGIpLmlzRmluYWwoKSkgeyAvL25vIHN1YmNsYXNzIGZvciBleHByZXNzaW9uVGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCi0JCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIGNhc3RUYikpCisJCWlmIChjYXN0VHlwZS5pc0ludGVyZmFjZSgpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0gIAorCQkJaWYgKCgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblR5cGUpLmlzRmluYWwoKSkgeyAvL25vIHN1YmNsYXNzIGZvciBleHByZXNzaW9uVGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCisJCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoY2FzdFR5cGUpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9IGVsc2UgewpAQCAtMTQ1LDM0ICsxNDYsMzQgQEAKIAogCQlyZXR1cm4gZmFsc2U7CiAJfQotCWlmIChleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UoKSkgewotCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tCi0JCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShleHByZXNzaW9uVGIpIHx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGV4cHJlc3Npb25UYikpCisJaWYgKGV4cHJlc3Npb25UeXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJaWYgKGNhc3RUeXBlLmlzQXJyYXlUeXBlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShleHByZXNzaW9uVHlwZSkgfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoZXhwcmVzc2lvblR5cGUpKQogCQkJCS8vcG90ZW50aWFsIHJ1bnRpbWUgZXJyb3IKIAkJCQl7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJaWYgKGNhc3RUYi5pc0Jhc2VUeXBlKCkpIHsKKwkJaWYgKGNhc3RUeXBlLmlzQmFzZVR5cGUoKSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWlmIChjYXN0VGIuaXNDbGFzcygpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0tCi0JCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChjYXN0VGIpKQorCQlpZiAoY2FzdFR5cGUuaXNDbGFzcygpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNDbGFzcykgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0tCisJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ09iamVjdChjYXN0VHlwZSkpCiAJCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLmlzRmluYWwoKSkgeyAvL25vIHN1YmNsYXNzIGZvciBjYXN0VGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCi0JCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKS5pc0ZpbmFsKCkpIHsgLy9ubyBzdWJjbGFzcyBmb3IgY2FzdFRiLCB0aHVzIGNvbXBpbGUtdGltZSBjaGVjayBpcyB2YWxpZAorCQkJCWlmIChjYXN0VHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlKSkgewogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7IC8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0ludGVyZmFjZSAtLS0tLS0tCi0JCQlpZiAoY2FzdFRiICE9IGV4cHJlc3Npb25UYiAmJiAoU2NvcGUuY29tcGFyZVR5cGVzKGNhc3RUYiwgZXhwcmVzc2lvblRiKSA9PSBOb3RSZWxhdGVkKSkgewotCQkJCU1ldGhvZEJpbmRpbmdbXSBjYXN0VGJNZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VGIpLm1ldGhvZHMoKTsKKwkJaWYgKGNhc3RUeXBlLmlzSW50ZXJmYWNlKCkpIHsgLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0KKwkJCWlmIChTY29wZS5jb21wYXJlVHlwZXMoY2FzdFR5cGUsIGV4cHJlc3Npb25UeXBlKSA9PSBOb3RSZWxhdGVkKSB7CisJCQkJTWV0aG9kQmluZGluZ1tdIGNhc3RUYk1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKS5tZXRob2RzKCk7CiAJCQkJaW50IGNhc3RUYk1ldGhvZHNMZW5ndGggPSBjYXN0VGJNZXRob2RzLmxlbmd0aDsKLQkJCQlNZXRob2RCaW5kaW5nW10gZXhwcmVzc2lvblRiTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblRiKS5tZXRob2RzKCk7CisJCQkJTWV0aG9kQmluZGluZ1tdIGV4cHJlc3Npb25UYk1ldGhvZHMgPSAoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UeXBlKS5tZXRob2RzKCk7CiAJCQkJaW50IGV4cHJlc3Npb25UYk1ldGhvZHNMZW5ndGggPSBleHByZXNzaW9uVGJNZXRob2RzLmxlbmd0aDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc3RUYk1ldGhvZHNMZW5ndGg7IGkrKykgewogCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cHJlc3Npb25UYk1ldGhvZHNMZW5ndGg7IGorKykgewpAQCAtMTk0LDE5ICsxOTUsMjAgQEAKIAogCXJldHVybiBmYWxzZTsKIH0KLXB1YmxpYyBmaW5hbCB2b2lkIGNvbXB1dGVDb25zdGFudChUeXBlQmluZGluZyBsZWZ0VGIsIFR5cGVCaW5kaW5nIHJpZ2h0VGIpIHsKLQlpZiAoKGxlZnQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSAmJiAocmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkgewotCQljb25zdGFudCA9CitwdWJsaWMgZmluYWwgdm9pZCBjb21wdXRlQ29uc3RhbnQoVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgeworCWlmICgodGhpcy5sZWZ0LmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgJiYgKHRoaXMucmlnaHQuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkgeworCQl0aGlzLmNvbnN0YW50ID0KIAkJCUNvbnN0YW50LmNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkVRVUFMX0VRVUFMKAogCQkJCWxlZnQuY29uc3RhbnQsCi0JCQkJbGVmdFRiLmlkLAorCQkJCWxlZnRUeXBlLmlkLAogCQkJCUVRVUFMX0VRVUFMLAogCQkJCXJpZ2h0LmNvbnN0YW50LAotCQkJCXJpZ2h0VGIuaWQpOwotCQlpZiAoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBOT1RfRVFVQUwpCisJCQkJcmlnaHRUeXBlLmlkKTsKKwkJaWYgKCgodGhpcy5iaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBOT1RfRVFVQUwpCiAJCQljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZSghY29uc3RhbnQuYm9vbGVhblZhbHVlKCkpOwogCX0gZWxzZSB7Ci0JCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQl0aGlzLmNvbnN0YW50ID0gTm90QUNvbnN0YW50OworCQkvLyBubyBvcHRpbWl6YXRpb24gZm9yIG51bGwgPT0gbnVsbAogCX0KIH0KIC8qKgpAQCAtMjYwLDExICsyNjIsMTEgQEAKICAqCU9wdGltaXplZCBvcGVyYXRpb25zIGFyZTogPT0gYW5kICE9CiAgKi8KIHB1YmxpYyB2b2lkIGdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBMYWJlbCB0cnVlTGFiZWwsIExhYmVsIGZhbHNlTGFiZWwsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCisJaWYgKGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgewogCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlTGFiZWwsIGZhbHNlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwogCQlyZXR1cm47CiAJfQotCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJaWYgKCgoYml0cyAmIE9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JTSElGVCkgPT0gRVFVQUxfRVFVQUwpIHsKIAkJaWYgKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiAmIDB4RikgLypjb21waWxlLXRpbWUqLyA9PSBUX2Jvb2xlYW4pIHsKIAkJCWdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbkVxdWFsKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZUxhYmVsLCBmYWxzZUxhYmVsLCB2YWx1ZVJlcXVpcmVkKTsKQEAgLTI3OCw3ICsyODAsNiBAQAogCQkJZ2VuZXJhdGVPcHRpbWl6ZWROb25Cb29sZWFuRXF1YWwoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCBmYWxzZUxhYmVsLCB0cnVlTGFiZWwsIHZhbHVlUmVxdWlyZWQpOwogCQl9CiAJfQotCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiB9CiAvKioKICAqIEJvb2xlYW4gZ2VuZXJhdGlvbiBmb3IgPT0gd2l0aCBib29sZWFuIG9wZXJhbmRzCkBAIC0yODYsMTggKzI4NywxNiBAQAogICogTm90ZSB0aGlzIGNvZGUgZG9lcyBub3Qgb3B0aW1pemUgY29uZGl0aW9uYWwgY29uc3RhbnRzICEhISEKICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuRXF1YWwoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgTGFiZWwgdHJ1ZUxhYmVsLCBMYWJlbCBmYWxzZUxhYmVsLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCiAJLy8gb3B0aW1pemVkIGNhc2VzOiB0cnVlID09IHgsIGZhbHNlID09IHgKIAlpZiAobGVmdC5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJYm9vbGVhbiBpbmxpbmUgPSBsZWZ0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpOwogCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAoaW5saW5lID8gdHJ1ZUxhYmVsIDogZmFsc2VMYWJlbCksIChpbmxpbmUgPyBmYWxzZUxhYmVsIDogdHJ1ZUxhYmVsKSwgdmFsdWVSZXF1aXJlZCk7Ci0JCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCXJldHVybjsKIAl9IC8vIG9wdGltaXplZCBjYXNlczogeCA9PSB0cnVlLCB4ID09IGZhbHNlCiAJaWYgKHJpZ2h0LmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewogCQlib29sZWFuIGlubGluZSA9IHJpZ2h0LmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpOwogCQlsZWZ0LmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIChpbmxpbmUgPyB0cnVlTGFiZWwgOiBmYWxzZUxhYmVsKSwgKGlubGluZSA/IGZhbHNlTGFiZWwgOiB0cnVlTGFiZWwpLCB2YWx1ZVJlcXVpcmVkKTsKLQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJcmV0dXJuOwogCX0KIAkvLyBkZWZhdWx0IGNhc2UKQEAgLTMxOCwzNyArMzE3LDE4IEBACiAJCQl9CiAJCX0KIAl9Ci0JY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIH0KIC8qKgogICogQm9vbGVhbiBnZW5lcmF0aW9uIGZvciA9PSB3aXRoIG5vbi1ib29sZWFuIG9wZXJhbmRzCiAgKgogICovCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZU9wdGltaXplZE5vbkJvb2xlYW5FcXVhbChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBMYWJlbCB0cnVlTGFiZWwsIExhYmVsIGZhbHNlTGFiZWwsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlDb25zdGFudCBpbmxpbmU7CiAJaWYgKChpbmxpbmUgPSByaWdodC5jb25zdGFudCkgIT0gTm90QUNvbnN0YW50KSB7Ci0JCS8vIG9wdGltaXplZCBjYXNlOiB4ID09IG51bGwKLQkJaWYgKHJpZ2h0LmNvbnN0YW50ID09IE51bGxDb25zdGFudC5EZWZhdWx0KSB7Ci0JCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwotCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7Ci0JCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCi0JCQkJCQljb2RlU3RyZWFtLmlmbnVsbCh0cnVlTGFiZWwpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKLQkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7Ci0JCQkJCQljb2RlU3RyZWFtLmlmbm9ubnVsbChmYWxzZUxhYmVsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJLy8gb3B0aW1pemVkIGNhc2U6IHggPT0gMAogCQlpZiAoKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX2ludCkgJiYgKGlubGluZS5pbnRWYWx1ZSgpID09IDApKSB7CiAJCQlsZWZ0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwpAQCAtMzcyLDI3ICszNTIsNiBAQAogCQl9CiAJfQogCWlmICgoaW5saW5lID0gbGVmdC5jb25zdGFudCkgIT0gTm90QUNvbnN0YW50KSB7Ci0JCS8vIG9wdGltaXplZCBjYXNlOiBudWxsID09IHgKLQkJaWYgKGxlZnQuY29uc3RhbnQgPT0gTnVsbENvbnN0YW50LkRlZmF1bHQpIHsKLQkJCXJpZ2h0LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwotCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7Ci0JCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCi0JCQkJCQljb2RlU3RyZWFtLmlmbnVsbCh0cnVlTGFiZWwpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKLQkJCQkJaWYgKHRydWVMYWJlbCA9PSBudWxsKSB7Ci0JCQkJCQljb2RlU3RyZWFtLmlmbm9ubnVsbChmYWxzZUxhYmVsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJLy8gb3B0aW1pemVkIGNhc2U6IDAgPT0geAogCQlpZiAoKChsZWZ0LmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSA9PSBUX2ludCkKIAkJCSYmIChpbmxpbmUuaW50VmFsdWUoKSA9PSAwKSkgewpAQCAtNDE2LDYgKzM3NSw2MCBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQorCS8vIG51bGwgY2FzZXMKKwkvLyBvcHRpbWl6ZWQgY2FzZTogeCA9PSBudWxsCisJaWYgKHJpZ2h0IGluc3RhbmNlb2YgTnVsbExpdGVyYWwpIHsKKwkJaWYgKGxlZnQgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbCkgeworCQkJLy8gbnVsbCA9PSBudWxsCisJCQlpZiAodmFsdWVSZXF1aXJlZCkgeworCQkJCWlmIChmYWxzZUxhYmVsID09IG51bGwpIHsKKwkJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBGQUxTRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgIT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5nb3RvXyh0cnVlTGFiZWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQkJaWYgKGZhbHNlTGFiZWwgPT0gbnVsbCkgeworCQkJCQlpZiAodHJ1ZUxhYmVsICE9IG51bGwpIHsKKwkJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQkJY29kZVN0cmVhbS5pZm51bGwodHJ1ZUxhYmVsKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgVFJVRSBjYXNlCisJCQkJCWlmICh0cnVlTGFiZWwgPT0gbnVsbCkgeworCQkJCQkJY29kZVN0cmVhbS5pZm5vbm51bGwoZmFsc2VMYWJlbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBubyBpbXBsaWNpdCBmYWxsIHRocm91Z2ggVFJVRS9GQUxTRSAtLT4gc2hvdWxkIG5ldmVyIG9jY3VyCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAobGVmdCBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKSB7IC8vIG9wdGltaXplZCBjYXNlOiBudWxsID09IHgKKwkJcmlnaHQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CisJCQlpZiAoZmFsc2VMYWJlbCA9PSBudWxsKSB7CisJCQkJaWYgKHRydWVMYWJlbCAhPSBudWxsKSB7CisJCQkJCS8vIGltcGxpY2l0IGZhbGxpbmcgdGhyb3VnaCB0aGUgRkFMU0UgY2FzZQorCQkJCQljb2RlU3RyZWFtLmlmbnVsbCh0cnVlTGFiZWwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gaW1wbGljaXQgZmFsbGluZyB0aHJvdWdoIHRoZSBUUlVFIGNhc2UKKwkJCQlpZiAodHJ1ZUxhYmVsID09IG51bGwpIHsKKwkJCQkJY29kZVN0cmVhbS5pZm5vbm51bGwoZmFsc2VMYWJlbCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gbm8gaW1wbGljaXQgZmFsbCB0aHJvdWdoIFRSVUUvRkFMU0UgLS0+IHNob3VsZCBuZXZlciBvY2N1cgorCQkJCX0KKwkJCX0KKwkJfQorCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCQlyZXR1cm47CisJfQorCiAJLy8gZGVmYXVsdCBjYXNlCiAJbGVmdC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAlyaWdodC5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKQEAgLTQ3Nyw1MCArNDkwLDUwIEBACiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCS8vIGFsd2F5cyByZXR1cm4gQm9vbGVhbkJpbmRpbmcKLQlUeXBlQmluZGluZyBsZWZ0VGIgPSBsZWZ0LnJlc29sdmVUeXBlKHNjb3BlKTsKLQlUeXBlQmluZGluZyByaWdodFRiID0gcmlnaHQucmVzb2x2ZVR5cGUoc2NvcGUpOwotCWlmIChsZWZ0VGIgPT0gbnVsbCB8fCByaWdodFRiID09IG51bGwpeworCVR5cGVCaW5kaW5nIGxlZnRUeXBlID0gbGVmdC5yZXNvbHZlVHlwZShzY29wZSk7CisJVHlwZUJpbmRpbmcgcmlnaHRUeXBlID0gcmlnaHQucmVzb2x2ZVR5cGUoc2NvcGUpOworCWlmIChsZWZ0VHlwZSA9PSBudWxsIHx8IHJpZ2h0VHlwZSA9PSBudWxsKXsKIAkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CQkKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLy8gYm90aCBiYXNlIHR5cGUKLQlpZiAobGVmdFRiLmlzQmFzZVR5cGUoKSAmJiByaWdodFRiLmlzQmFzZVR5cGUoKSkgeworCWlmIChsZWZ0VHlwZS5pc0Jhc2VUeXBlKCkgJiYgcmlnaHRUeXBlLmlzQmFzZVR5cGUoKSkgewogCQkvLyB0aGUgY29kZSBpcyBhbiBpbnQKIAkJLy8gKGNhc3QpICBsZWZ0ICAgPT0gKGNhc3QpICByaWd0aCAtLT4gcmVzdWx0CiAJCS8vICAwMDAwICAgMDAwMCAgICAgICAwMDAwICAgMDAwMCAgICAgIDAwMDAKIAkJLy8gIDw8MTYgICA8PDEyICAgICAgIDw8OCAgICA8PDQgICAgICAgPDwwCi0JCWludCByZXN1bHQgPSBSZXNvbHZlVHlwZVRhYmxlc1tFUVVBTF9FUVVBTF1bIChsZWZ0VGIuaWQgPDwgNCkgKyByaWdodFRiLmlkXTsKKwkJaW50IHJlc3VsdCA9IFJlc29sdmVUeXBlVGFibGVzW0VRVUFMX0VRVUFMXVsgKGxlZnRUeXBlLmlkIDw8IDQpICsgcmlnaHRUeXBlLmlkXTsKIAkJbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPSByZXN1bHQgPj4+IDEyOwogCQlyaWdodC5pbXBsaWNpdENvbnZlcnNpb24gPSAocmVzdWx0ID4+PiA0KSAmIDB4MDAwRkY7CiAJCWJpdHMgfD0gcmVzdWx0ICYgMHhGOwkJCiAJCWlmICgocmVzdWx0ICYgMHgwMDAwRikgPT0gVF91bmRlZmluZWQpIHsKIAkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGxlZnRUYiwgcmlnaHRUYik7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgbGVmdFR5cGUsIHJpZ2h0VHlwZSk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQljb21wdXRlQ29uc3RhbnQobGVmdFRiLCByaWdodFRiKTsKLQkJdGhpcy50eXBlQmluZGluZyA9IEJvb2xlYW5CaW5kaW5nOworCQljb21wdXRlQ29uc3RhbnQobGVmdFR5cGUsIHJpZ2h0VHlwZSk7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gQm9vbGVhbkJpbmRpbmc7CiAJCXJldHVybiBCb29sZWFuQmluZGluZzsKIAl9CiAKIAkvLyBPYmplY3QgcmVmZXJlbmNlcyAKIAkvLyBzcGVjIDE1LjIwLjMKLQlpZiAoYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgcmlnaHRUYiwgbGVmdFRiKSB8fCBhcmVUeXBlc0Nhc3RDb21wYXRpYmxlKHNjb3BlLCBsZWZ0VGIsIHJpZ2h0VGIpKSB7CisJaWYgKGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsIHJpZ2h0VHlwZSwgbGVmdFR5cGUpIHx8IGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsIGxlZnRUeXBlLCByaWdodFR5cGUpKSB7CiAJCS8vIChzcGVjaWFsIGNhc2UgZm9yIFN0cmluZykKLQkJaWYgKChyaWdodFRiLmlkID09IFRfU3RyaW5nKSAmJiAobGVmdFRiLmlkID09IFRfU3RyaW5nKSkKLQkJCWNvbXB1dGVDb25zdGFudChsZWZ0VGIsIHJpZ2h0VGIpOworCQlpZiAoKHJpZ2h0VHlwZS5pZCA9PSBUX1N0cmluZykgJiYgKGxlZnRUeXBlLmlkID09IFRfU3RyaW5nKSkKKwkJCWNvbXB1dGVDb25zdGFudChsZWZ0VHlwZSwgcmlnaHRUeXBlKTsKIAkJZWxzZQogCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7Ci0JCWlmIChyaWdodFRiLmlkID09IFRfU3RyaW5nKQorCQlpZiAocmlnaHRUeXBlLmlkID09IFRfU3RyaW5nKQogCQkJcmlnaHQuaW1wbGljaXRDb252ZXJzaW9uID0gU3RyaW5nMlN0cmluZzsKLQkJaWYgKGxlZnRUYi5pZCA9PSBUX1N0cmluZykKKwkJaWYgKGxlZnRUeXBlLmlkID09IFRfU3RyaW5nKQogCQkJbGVmdC5pbXBsaWNpdENvbnZlcnNpb24gPSBTdHJpbmcyU3RyaW5nOwotCQl0aGlzLnR5cGVCaW5kaW5nID0gQm9vbGVhbkJpbmRpbmc7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gQm9vbGVhbkJpbmRpbmc7CiAJCXJldHVybiBCb29sZWFuQmluZGluZzsKIAl9CiAJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7Ci0Jc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm90Q29tcGF0aWJsZVR5cGVzRXJyb3IodGhpcywgbGVmdFRiLCByaWdodFRiKTsKKwlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub3RDb21wYXRpYmxlVHlwZXNFcnJvcih0aGlzLCBsZWZ0VHlwZSwgcmlnaHRUeXBlKTsKIAlyZXR1cm4gbnVsbDsKIH0KIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuamF2YQppbmRleCA1NWRjNzViLi5lOWRjYTRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTEwMiw5ICsxMDIsMTAgQEAKIAkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwogCiAJCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGNvbnN0cnVjdG9yIGludm9jYXRpb24KLQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZTsKLQkJCWlmICgodGFyZ2V0VHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmlzTmVzdGVkVHlwZSgpKSB7Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0FyZ3VtZW50VmFsdWVzKAorCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gYmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbiAtIGVuY2xvc2luZyBpbnN0YW5jZSBhcmd1bWVudHMKKwkJCWlmICh0YXJnZXRUeXBlLmlzTmVzdGVkVHlwZSgpKSB7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVmFsdWVzKAogCQkJCQljdXJyZW50U2NvcGUsCiAJCQkJCXRhcmdldFR5cGUsCiAJCQkJCWRpc2NhcmRFbmNsb3NpbmdJbnN0YW5jZSA/IG51bGwgOiBxdWFsaWZpY2F0aW9uLApAQCAtMTE2LDYgKzExNywxMyBAQAogCQkJCQlhcmd1bWVudHNbaV0uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCQkJfQogCQkJfQorCQkJLy8gaGFuZGxpbmcgaW5uZXJjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uIC0gb3V0ZXIgbG9jYWwgYXJndW1lbnRzCisJCQlpZiAodGFyZ2V0VHlwZS5pc05lc3RlZFR5cGUoKSkgeworCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNPdXRlckFyZ3VtZW50VmFsdWVzKAorCQkJCQljdXJyZW50U2NvcGUsCisJCQkJCXRhcmdldFR5cGUsCisJCQkJCXRoaXMpOworCQkJfQogCQkJaWYgKHN5bnRoZXRpY0FjY2Vzc29yICE9IG51bGwpIHsKIAkJCQkvLyBzeW50aGV0aWMgYWNjZXNzb3IgZ290IHNvbWUgZXh0cmEgYXJndW1lbnRzIGFwcGVuZGVkIHRvIGl0cyBzaWduYXR1cmUsIHdoaWNoIG5lZWQgdmFsdWVzCiAJCQkJZm9yIChpbnQgaSA9IDAsCkBAIC0xNjUsMTYgKzE3MywxMCBAQAogCQkJJiYgY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5pc0xvY2FsVHlwZSgpKSB7CiAKIAkJCWlmIChzdXBlclR5cGUuaXNMb2NhbFR5cGUoKSkgewotCQkJCSgoTG9jYWxUeXBlQmluZGluZykgc3VwZXJUeXBlKS5hZGRJbm5lckVtdWxhdGlvbkRlcGVuZGVudCgKLQkJCQkJY3VycmVudFNjb3BlLAotCQkJCQlxdWFsaWZpY2F0aW9uICE9IG51bGwsCi0JCQkJCXRydWUpOwotCQkJCS8vIHJlcXVlc3QgZGlyZWN0IGFjY2VzcworCQkJCSgoTG9jYWxUeXBlQmluZGluZykgc3VwZXJUeXBlKS5hZGRJbm5lckVtdWxhdGlvbkRlcGVuZGVudChjdXJyZW50U2NvcGUsIHF1YWxpZmljYXRpb24gIT0gbnVsbCk7CiAJCQl9IGVsc2UgewogCQkJCS8vIGxvY2FsbHkgcHJvcGFnYXRlLCBzaW5jZSB3ZSBhbHJlYWR5IG5vdyB0aGUgZGVzaXJlZCBzaGFwZSBmb3Igc3VyZQotCQkJCWN1cnJlbnRTY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbihzdXBlclR5cGUsIHF1YWxpZmljYXRpb24gIT0gbnVsbCwgdHJ1ZSk7Ci0JCQkJLy8gcmVxdWVzdCBkaXJlY3QgYWNjZXNzCi0KKwkJCQljdXJyZW50U2NvcGUucHJvcGFnYXRlSW5uZXJFbXVsYXRpb24oc3VwZXJUeXBlLCBxdWFsaWZpY2F0aW9uICE9IG51bGwpOwogCQkJfQogCQl9CiAJfQpAQCAtMTkyLDcgKzE5NCw3IEBACiAJCQkJLy8gY29uc3RydWN0b3Igd2lsbCBub3QgYmUgZHVtcGVkIGFzIHByaXZhdGUsIG5vIGVtdWxhdGlvbiByZXF1aXJlZCB0aHVzCiAJCQl9IGVsc2UgewogCQkJCXN5bnRoZXRpY0FjY2Vzc29yID0KLQkJCQkJKChTb3VyY2VUeXBlQmluZGluZykgYmluZGluZy5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcpOworCQkJCQkoKFNvdXJjZVR5cGVCaW5kaW5nKSBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKIAkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcyhiaW5kaW5nLCB0aGlzKTsKIAkJCX0KIAkJfQpAQCAtMjU3LDYgKzI1OSw5IEBACiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAJCQkJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhwYXJhbVR5cGVzW2ldLCBhcmdUeXBlc1tpXSk7CiAJCQkJfQorCQkJCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpKSB7CisJCQkJCWJpbmRpbmcubW9kaWZpZXJzIHw9IEFjY1ByaXZhdGVVc2VkOworCQkJCX0JCQkJCiAJCQl9IGVsc2UgewogCQkJCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCiAJCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSByZWNlaXZlclR5cGU7CkBAIC0zMTMsNCArMzE4LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cHJlc3Npb24uamF2YQppbmRleCA2YTIzM2U4Li4zMzU3ZDI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwpAQCAtMjUsMjUgKzI1LDM0IEBACiAJLy9FeHByZXNzaW9uIGlzIGEgc3ViY2xhc3Mgb2YgU3RhdGVtZW50LiBTZWUgdGhlIG1lc3NhZ2UgaXNWYWxpZEphdmFTdGF0ZW1lbnQoKQogCiAJcHVibGljIGludCBpbXBsaWNpdENvbnZlcnNpb247Ci0KKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlOworCQogCXB1YmxpYyBDb25zdGFudCBjb25zdGFudDsKIAogCXB1YmxpYyBFeHByZXNzaW9uKCkgewogCQlzdXBlcigpOwogCX0KIAotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbywKLQkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlyZXR1cm4gZmxvd0luZm87CisJfQorCisJcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCiAJCXJldHVybiBhbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJfQogCi0JcHVibGljIENvbnN0YW50IGNvbmRpdGlvbmFsQ29uc3RhbnQoKSB7CisJLyoqCisJICogQ29uc3RhbnQgdXNhYmxlIGZvciBieXRlY29kZSBwYXR0ZXJuIG9wdGltaXphdGlvbnMsIGJ1dCBjYW5ub3QgYmUgaW5saW5lZAorCSAqIHNpbmNlIGl0IGlzIG5vdCBzdHJpY3RseSBlcXVpdmFsZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGNvbnN0YW50IGV4cHJlc3Npb25zLgorCSAqIEluIHBhcnRpY3VsYXIsIHNvbWUgc2lkZS1lZmZlY3RzIG1heSBiZSByZXF1aXJlZCB0byBvY2N1ciAob25seSB0aGUgZW5kIHZhbHVlCisJICogaXMga25vd24pLgorCSAqIENvbnN0YW50IGlzIGtub3duIHRvIGJlIG9mIGJvb2xlYW4gdHlwZQorCSAqLyAKKwlwdWJsaWMgQ29uc3RhbnQgb3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkgewogCi0JCXJldHVybiBjb25zdGFudDsKKwkJcmV0dXJuIHRoaXMuY29uc3RhbnQ7CiAJfQogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzQ29uc3RhbnRWYWx1ZVJlcHJlc2VudGFibGUoCkBAIC0zMzUsNyArMzQ0LDcgQEAKIAkJfQogCQljb2RlU3RyZWFtLm5ld1N0cmluZ0J1ZmZlcigpOwogCQljb2RlU3RyZWFtLmR1cCgpOwotCQlpZiAoKHR5cGVJRCA9PSBUX1N0cmluZykgfHwgKHR5cGVJRCA9PSBUX251bGwpKSB7CisJCWlmICh0eXBlSUQgPT0gVF9TdHJpbmcgfHwgdHlwZUlEID09IFRfbnVsbCkgewogCQkJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewogCQkJCWNvZGVTdHJlYW0ubGRjKGNvbnN0YW50LnN0cmluZ1ZhbHVlKCkpOwogCQkJfSBlbHNlIHsKQEAgLTM1NywxNSArMzY2LDE1IEBACiAJCWlmIChydW50aW1lVGltZVR5cGUgPT0gbnVsbCB8fCBjb21waWxlVGltZVR5cGUgPT0gbnVsbCkKIAkJCXJldHVybjsKIAotCQlpZiAoY29tcGlsZVRpbWVUeXBlLmlkID09IFRfbnVsbCkgewotCQkJLy8gdGhpcyBjYXNlIGlzIHBvc3NpYmxlIG9ubHkgZm9yIGNvbnN0YW50IG51bGwKLQkJCS8vIFRoZSB0eXBlIG9mIHJ1bnRpbWUgaXMgYSByZWZlcmVuY2UgdHlwZQotCQkJLy8gVGhlIGNvZGUgZ2VuIHVzZSB0aGUgY29uc3RhbnQgaWQgdGh1cyBhbnkgdmFsdWUKLQkJCS8vIGZvciB0aGUgcnVudGltZSBpZCAoYWthayB0aGUgPDw0KSBjb3VsZCBiZSB1c2VkLgotCQkJLy8gVF9PYmplY3QgaXMgdXNlZCBhcyBzb21lIGdlbmVyYWwgVF9yZWZlcmVuY2UKLQkJCWltcGxpY2l0Q29udmVyc2lvbiA9IChUX09iamVjdCA8PCA0KSArIFRfbnVsbDsKLQkJCXJldHVybjsKLQkJfQorLy8JCWlmIChjb21waWxlVGltZVR5cGUuaWQgPT0gVF9udWxsKSB7CisvLwkJCS8vIHRoaXMgY2FzZSBpcyBwb3NzaWJsZSBvbmx5IGZvciBjb25zdGFudCBudWxsCisvLwkJCS8vIFRoZSB0eXBlIG9mIHJ1bnRpbWUgaXMgYSByZWZlcmVuY2UgdHlwZQorLy8JCQkvLyBUaGUgY29kZSBnZW4gdXNlIHRoZSBjb25zdGFudCBpZCB0aHVzIGFueSB2YWx1ZQorLy8JCQkvLyBmb3IgdGhlIHJ1bnRpbWUgaWQgKGFrYWsgdGhlIDw8NCkgY291bGQgYmUgdXNlZC4KKy8vCQkJLy8gVF9PYmplY3QgaXMgdXNlZCBhcyBzb21lIGdlbmVyYWwgVF9yZWZlcmVuY2UKKy8vCQkJaW1wbGljaXRDb252ZXJzaW9uID0gKFRfT2JqZWN0IDw8IDQpICsgVF9udWxsOworLy8JCQlyZXR1cm47CisvLwkJfQogCiAJCXN3aXRjaCAocnVudGltZVRpbWVUeXBlLmlkKSB7CiAJCQljYXNlIFRfYnl0ZSA6CkBAIC00MzMsMTYgKzQ0MiwxNyBAQAogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlRXhwZWN0aW5nKAogCQlCbG9ja1Njb3BlIHNjb3BlLAotCQlUeXBlQmluZGluZyBleHBlY3RlZFRiKSB7CisJCVR5cGVCaW5kaW5nIGV4cGVjdGVkVHlwZSkgewogCi0JCVR5cGVCaW5kaW5nIHRoaXNUYiA9IHRoaXMucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQlpZiAodGhpc1RiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUodGhpc1RiLCBleHBlY3RlZFRiKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IodGhpc1RiLCBleHBlY3RlZFRiLCB0aGlzKTsKKwkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblR5cGUgPSB0aGlzLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cHJlc3Npb25UeXBlID09IG51bGwpIHJldHVybiBudWxsOworCQlpZiAoZXhwcmVzc2lvblR5cGUgPT0gZXhwZWN0ZWRUeXBlKSByZXR1cm4gZXhwcmVzc2lvblR5cGU7CisJCQorCQlpZiAoIWV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoZXhwZWN0ZWRUeXBlKSkgeworCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudHlwZU1pc21hdGNoRXJyb3IoZXhwcmVzc2lvblR5cGUsIGV4cGVjdGVkVHlwZSwgdGhpcyk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpc1RiOworCQlyZXR1cm4gZXhwcmVzc2lvblR5cGU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7CkBAIC00ODEsNCArNDkxLDQgQEAKIAogCQlyZXR1cm4gdGhpczsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRXh0ZW5kZWRTdHJpbmdMaXRlcmFsLmphdmEKaW5kZXggMTU2MDUwNC4uZTc5MjEyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9FeHRlbmRlZFN0cmluZ0xpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0V4dGVuZGVkU3RyaW5nTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTE1LDggKzE1LDYgQEAKIAogcHVibGljIGNsYXNzIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRzIFN0cmluZ0xpdGVyYWwgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRfU0laRSA9IDMwOwotCiAJLyoqIAogCSAqICBCdWlsZCBhIHN0cmluZytjaGFyIGxpdGVyYWwKIAkgKi8KQEAgLTc5LDQgKzc3LDQgQEAKIAkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZhbHNlTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GYWxzZUxpdGVyYWwuamF2YQppbmRleCBkOWFhNjI0Li5mODA1MTQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZhbHNlTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmFsc2VMaXRlcmFsLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YQppbmRleCBhOGZhNTA2Li43NTI3NmVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC01NSw2ICs1NSwxMSBAQAogCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAorCQlpZiAodGhpcy5iaW5kaW5nICE9IG51bGwgJiYgdGhpcy5iaW5kaW5nLmlzUHJpdmF0ZSgpICYmICF0aGlzLmJpbmRpbmcuaXNQcml2YXRlVXNlZCgpKSB7CisJCQlpZiAoIWluaXRpYWxpemF0aW9uU2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuaGFzU3ludGF4RXJyb3IoKSkgeworCQkJCWluaXRpYWxpemF0aW9uU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZUZpZWxkKHRoaXMpOworCQkJfQorCQl9CiAJCS8vIGNhbm5vdCBkZWZpbmUgc3RhdGljIG5vbi1jb25zdGFudCBmaWVsZCBpbnNpZGUgbmVzdGVkIGNsYXNzCiAJCWlmIChiaW5kaW5nICE9IG51bGwKIAkJCSYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKQpAQCAtNzQsOSArNzksNiBAQAogCQkJCQkuYW5hbHlzZUNvZGUoaW5pdGlhbGl6YXRpb25TY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoYmluZGluZyk7Ci0JCQkvLyBjbGVhciB0aGUgYml0IGluIGNhc2UgaXQgd2FzIGFscmVhZHkgc2V0IChmcm9tIGVuY2xvc2luZyBpbmZvKQogCQl9CiAJCXJldHVybiBmbG93SW5mbzsKIAl9CkBAIC0xNTAsNyArMTUyLDcgQEAKIAkJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHRoaXMuYmluZGluZy50eXBlLCBpbml0aWFsaXphdGlvblNjb3BlKSkKIAkJCQlpbml0aWFsaXphdGlvblNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKHRoaXMuYmluZGluZy50eXBlLCB0aGlzLnR5cGUpOwogCi0JCQl0aGlzLnR5cGUuYmluZGluZyA9IHRoaXMuYmluZGluZy50eXBlOyAvLyB1cGRhdGUgYmluZGluZyBmb3IgdHlwZSByZWZlcmVuY2UKKwkJCXRoaXMudHlwZS5yZXNvbHZlZFR5cGUgPSB0aGlzLmJpbmRpbmcudHlwZTsgLy8gdXBkYXRlIGJpbmRpbmcgZm9yIHR5cGUgcmVmZXJlbmNlCiAKIAkJCS8vIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbml0aWFsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lCiAJCQlpZiAodGhpcy5pbml0aWFsaXphdGlvbiA9PSBudWxsKSB7CkBAIC0xNjgsNyArMTcwLDcgQEAKIAkJCQkJCiAJCQkJCWlmIChpbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKIAotCQkJCQkJaWYgKChpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nID0gdGhpcy5pbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUV4cGVjdGluZyhpbml0aWFsaXphdGlvblNjb3BlLCB0eXBlQmluZGluZykpIAkhPSBudWxsKSB7CisJCQkJCQlpZiAoKGluaXRpYWxpemF0aW9uVHlwZUJpbmRpbmcgPSB0aGlzLmluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlRXhwZWN0aW5nKGluaXRpYWxpemF0aW9uU2NvcGUsIHR5cGVCaW5kaW5nKSkgIT0gbnVsbCkgewogCQkJCQkJCSgoQXJyYXlJbml0aWFsaXplcikgdGhpcy5pbml0aWFsaXphdGlvbikuYmluZGluZyA9IChBcnJheUJpbmRpbmcpIGluaXRpYWxpemF0aW9uVHlwZUJpbmRpbmc7CiAJCQkJCQkJdGhpcy5pbml0aWFsaXphdGlvbi5pbXBsaWNpdFdpZGVuaW5nKHR5cGVCaW5kaW5nLCBpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nKTsKIAkJCQkJCX0KQEAgLTE3OSw3ICsxODEsNyBAQAogCiAJCQkJCQkJdGhpcy5pbml0aWFsaXphdGlvbi5pbXBsaWNpdFdpZGVuaW5nKHR5cGVCaW5kaW5nLCBpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nKTsKIAotCQkJCQkJfQllbHNlIGlmIChpbml0aWFsaXphdGlvblNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShpbml0aWFsaXphdGlvblR5cGVCaW5kaW5nLCB0eXBlQmluZGluZykpIHsKKwkJCQkJCX0JZWxzZSBpZiAoaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZy5pc0NvbXBhdGlibGVXaXRoKHR5cGVCaW5kaW5nKSkgewogCQkJCQkJCXRoaXMuaW5pdGlhbGl6YXRpb24uaW1wbGljaXRXaWRlbmluZyh0eXBlQmluZGluZywgaW5pdGlhbGl6YXRpb25UeXBlQmluZGluZyk7CiAKIAkJCQkJCX0gZWxzZSB7CkBAIC0yMTEsNCArMjEzLDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GaWVsZFJlZmVyZW5jZS5qYXZhCmluZGV4IDcyNzc1MWYuLmYwYTk0OWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmllbGRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZpZWxkUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNDUsNyArNDUsNyBAQAogCiAJCS8vIGNvbXBvdW5kIGFzc2lnbm1lbnQgZXh0cmEgd29yawogCQlpZiAoaXNDb21wb3VuZCkgeyAvLyBjaGVjayB0aGUgdmFyaWFibGUgcGFydCBpcyBpbml0aWFsaXplZCBpZiBibGFuayBmaW5hbAotCQkJaWYgKGJpbmRpbmcuaXNGaW5hbCgpCisJCQlpZiAoYmluZGluZy5pc0JsYW5rRmluYWwoKQogCQkJCSYmIHJlY2VpdmVyLmlzVGhpcygpCiAJCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChiaW5kaW5nKQogCQkJCSYmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZykpKSB7CkBAIC01NCw2ICs1NCwxMCBAQAogCQkJfQogCQkJbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CiAJCX0KKwkJZmxvd0luZm8gPQorCQkJcmVjZWl2ZXIKKwkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sICFiaW5kaW5nLmlzU3RhdGljKCkpCisJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOwogCQlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKIAkJCWZsb3dJbmZvID0KIAkJCQlhc3NpZ25tZW50CkBAIC02MSwyNyArNjUsMjcgQEAKIAkJCQkJLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKQogCQkJCQkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCX0KLQkJZmxvd0luZm8gPQotCQkJcmVjZWl2ZXIKLQkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8sICFiaW5kaW5nLmlzU3RhdGljKCkpCi0JCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOwogCQltYW5hZ2VTeW50aGV0aWNXcml0ZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CiAKIAkJLy8gY2hlY2sgaWYgYXNzaWduaW5nIGEgZmluYWwgZmllbGQgCiAJCWlmIChiaW5kaW5nLmlzRmluYWwoKSkgewogCQkJLy8gaW4gYSBjb250ZXh0IHdoZXJlIGl0IGNhbiBiZSBhc3NpZ25lZD8KLQkJCWlmIChyZWNlaXZlci5pc1RoaXMoKQorCQkJaWYgKGJpbmRpbmcuaXNCbGFua0ZpbmFsKCkKKwkJCQkmJiAhaXNDb21wb3VuZAorCQkJCSYmIHJlY2VpdmVyLmlzVGhpcygpCiAJCQkJJiYgIShyZWNlaXZlciBpbnN0YW5jZW9mIFF1YWxpZmllZFRoaXNSZWZlcmVuY2UpCisJCQkJJiYgKChyZWNlaXZlci5iaXRzICYgUGFyZW50aGVzaXplZE1BU0spID09IDApIC8vICh0aGlzKS54IGlzIGZvcmJpZGRlbgogCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoYmluZGluZykpIHsKIAkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKGJpbmRpbmcpKSB7CiAJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAogCQkJCQkJYmluZGluZywKIAkJCQkJCXRoaXMpOworCQkJCX0gZWxzZSB7CisJCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChiaW5kaW5nLCB0aGlzKTsKIAkJCQl9CiAJCQkJZmxvd0luZm8ubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGJpbmRpbmcpOwotCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChiaW5kaW5nLCB0aGlzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJLy8gYXNzaWduaW5nIGEgZmluYWwgZmllbGQgb3V0c2lkZSBhbiBpbml0aWFsaXplciBvciBjb25zdHJ1Y3RvcgorCQkJCS8vIGFzc2lnbmluZyBhIGZpbmFsIGZpZWxkIG91dHNpZGUgYW4gaW5pdGlhbGl6ZXIgb3IgY29uc3RydWN0b3Igb3Igd3JvbmcgcmVmZXJlbmNlCiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChiaW5kaW5nLCB0aGlzKTsKIAkJCX0KIAkJfQpAQCAtMTU0LDEwICsxNTgsNyBAQAogCQkJfQogCQl9IGVsc2UgewogCQkJYm9vbGVhbiBpc1N0YXRpYyA9IHRoaXMuY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKTsKLQkJCXJlY2VpdmVyLmdlbmVyYXRlQ29kZSgKLQkJCQljdXJyZW50U2NvcGUsCi0JCQkJY29kZVN0cmVhbSwKLQkJCQl2YWx1ZVJlcXVpcmVkICYmICghaXNTdGF0aWMpICYmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkpOworCQkJcmVjZWl2ZXIuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgIWlzU3RhdGljKTsKIAkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSB7CiAJCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCkBAIC0xNzUsOCArMTc2LDE3IEBACiAJCQkJCX0KIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0gZWxzZSB7CisJCQkJCWlmICghaXNTdGF0aWMpIHsKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCisJCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCQl9CiAJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudCh0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFpc1N0YXRpYyl7CisJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCisJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJfQogCQkJfQogCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CkBAIC0yODYsMTAgKzI5Niw5IEBACiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGdldENvbnN0YW50Rm9yKAogCQlGaWVsZEJpbmRpbmcgYmluZGluZywKLQkJYm9vbGVhbiBpbXBsaWNpdFJlY2VpdmVyLAogCQlSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQlTY29wZSByZWZlcmVuY2VTY29wZSwKLQkJaW50IGluZGV4SW5RdWFsaWZpY2F0aW9uKSB7CisJCWJvb2xlYW4gaXNJbXBsaWNpdCwKKwkJU2NvcGUgcmVmZXJlbmNlU2NvcGUpIHsKIAogCQkvL3Byb3BhZ2F0aW9uIG9mIHRoZSBjb25zdGFudC4KIApAQCAtMzExLDEyICszMjAsOCBAQAogCQkJcmV0dXJuIGJpbmRpbmcuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CiAJCX0KIAkJaWYgKGJpbmRpbmcuY29uc3RhbnQgIT0gbnVsbCkgewotCQkJaWYgKGluZGV4SW5RdWFsaWZpY2F0aW9uID09IDApIHsKLQkJCQlyZXR1cm4gYmluZGluZy5jb25zdGFudDsKLQkJCX0KLQkJCS8vc2VlIHByZXZpb3VzIGNvbW1lbnQgZm9yIHRoZSAoc291bGQtYWx3YXlzLWJlKSB2YWxpZCBjYXN0Ci0JCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHF1YWxpZmllZFJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSByZWZlcmVuY2U7Ci0JCQlpZiAoaW5kZXhJblF1YWxpZmljYXRpb24gPT0gKHF1YWxpZmllZFJlZmVyZW5jZS5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgLSAxKSkgeworCQkJaWYgKGlzSW1wbGljaXQgfHwgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UKKwkJCQkJJiYgYmluZGluZyA9PSAoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpcmVmZXJlbmNlKS5iaW5kaW5nKSkgewogCQkJCXJldHVybiBiaW5kaW5nLmNvbnN0YW50OwogCQkJfQogCQkJcmV0dXJuIE5vdEFDb25zdGFudDsKQEAgLTMzMSw0NyArMzM2LDE1IEBACiAJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IHR5cGVCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CiAJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsID0gdHlwZURlY2wuZGVjbGFyYXRpb25PZihiaW5kaW5nKTsKIAotCQkvL3doYXQgc2NvcGUgdG8gdXNlIChkZXBlbmQgb24gdGhlIHN0YXRpY25lc3Mgb2YgdGhlIGZpZWxkIGJpbmRpbmcpCi0JCU1ldGhvZFNjb3BlIGZpZWxkU2NvcGUgPQotCQkJYmluZGluZy5pc1N0YXRpYygpCisJCWZpZWxkRGVjbC5yZXNvbHZlKGJpbmRpbmcuaXNTdGF0aWMoKSAvL3NpZGUgZWZmZWN0IG9uIGJpbmRpbmcgCiAJCQkJPyB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlCi0JCQkJOiB0eXBlRGVjbC5pbml0aWFsaXplclNjb3BlOworCQkJCTogdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZSk7IAogCi0JCWlmIChpbXBsaWNpdFJlY2VpdmVyKSB7IC8vRGV0ZXJtaW5lIGlmIHRoZSByZWYgaXMgbGVnYWwgaW4gdGhlIGN1cnJlbnQgY2xhc3Mgb2YgdGhlIGZpZWxkCi0JCQkvL2kuZS4gbm90IGEgZm9yd2FyZCByZWZlcmVuY2UgLi4uLiAodGhleSBhcmUgYWxsb3dlZCB3aGVuIHRoZSByZWNlaXZlciBpcyBleHBsaWNpdCAhIC4uLiBQbGVhc2UgZG9uJ3QgYXNrIG1lIHdoeSAhLi4ueWV0IGFub3RoZXIgamF2YSBteXN0ZXJ5Li4uKQotCQkJaWYgKGZpZWxkU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ID09IE1ldGhvZFNjb3BlLk5vdEluRmllbGREZWNsKSB7Ci0JCQkJLy8gbm8gZmllbGQgaXMgY3VycmVudGx5IGJlaW5nIGFuYWx5c2VkIGluIHR5cGVEZWNsCi0JCQkJZmllbGREZWNsLnJlc29sdmUoZmllbGRTY29wZSk7IC8vc2lkZSBlZmZlY3Qgb24gYmluZGluZyA6LSkgLi4uIAotCQkJCXJldHVybiBiaW5kaW5nLmNvbnN0YW50OwotCQkJfQotCQkJLy9XZSBhcmUgcmUtZW50ZXJpbmcgdGhlIHNhbWUgY2xhc3MgZmllbGRzIGFuYWx5c2luZwotCQkJaWYgKChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCQkmJiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSByZWZlcmVuY2VTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkpIC8vIG9ubHkgY29tcGxhaW4gZm9yIGFjY2VzcyBpbnNpZGUgc2FtZSB0eXBlCi0JCQkJJiYgKGJpbmRpbmcuaWQgPiBmaWVsZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCkpIHsKLQkJCQkvL2ZvcndhcmQgcmVmZXJlbmNlLiBUaGUgZGVjbGFyYXRpb24gcmVtYWlucyB1bnJlc29sdmVkLgotCQkJCXJlZmVyZW5jZVNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZvcndhcmRSZWZlcmVuY2UocmVmZXJlbmNlLCBpbmRleEluUXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOwotCQkJCXJldHVybiBOb3RBQ29uc3RhbnQ7Ci0JCQl9Ci0JCQlmaWVsZERlY2wucmVzb2x2ZShmaWVsZFNjb3BlKTsgLy9zaWRlIGVmZmVjdCBvbiBiaW5kaW5nIDotKSAuLi4gCisJCWlmIChpc0ltcGxpY2l0IHx8IChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlCisJCQkJJiYgYmluZGluZyA9PSAoKFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpcmVmZXJlbmNlKS5iaW5kaW5nKSkgewogCQkJcmV0dXJuIGJpbmRpbmcuY29uc3RhbnQ7CiAJCX0KLQkJLy90aGUgZmllbGQgcmVmZXJlbmNlIGlzIGV4cGxpY2l0eS4gSXQgaGFzIHRvIGJlIGEgInNpbXBsZSIgbGlrZSBmaWVsZCByZWZlcmVuY2UgdG8gZ2V0IHRoZQotCQkvL2NvbnN0YW50IHByb3BhZ2F0aW9uLiBGb3IgZXhhbXBsZSBpbiBQYWNrYWhlLlR5cGUuZmllbGQxLmZpZWxkMiAsIGZpZWxkMSBtYXkgaGF2ZSBpdHMKLQkJLy9jb25zdGFudCBoYXZpbmcgYSBwcm9wYWdhdGlvbiB3aGVyZSBmaWVsZDIgaXMgYWx3YXlzIG5vdCBwcm9wYWdhdGluZyBpdHMKLQkJaWYgKGluZGV4SW5RdWFsaWZpY2F0aW9uID09IDApIHsKLQkJCWZpZWxkRGVjbC5yZXNvbHZlKGZpZWxkU2NvcGUpOyAvL3NpZGUgZWZmZWN0IG9uIGJpbmRpbmcgOi0pIC4uLiAKLQkJCXJldHVybiBiaW5kaW5nLmNvbnN0YW50OwotCQl9Ci0JCS8vIFNpZGUtZWZmZWN0IG9uIHRoZSBmaWVsZCBiaW5kaW5nIG1heSBub3QgYmUgcHJvcGFnYXRlZCBvdXQgZm9yIHRoZSBxdWFsaWZpZWQgcmVmZXJlbmNlCi0JCS8vIHVubGVzcyBpdCBvY2N1cnMgaW4gZmlyc3QgcGxhY2Ugb2YgdGhlIG5hbWUgc2VxdWVuY2UKLQkJZmllbGREZWNsLnJlc29sdmUoZmllbGRTY29wZSk7IC8vc2lkZSBlZmZlY3Qgb24gYmluZGluZyA6LSkgLi4uIAotCQkvL3NlZSBwcmV2aW91cyBjb21tZW50IGZvciB0aGUgY2FzdCB0aGF0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKLQkJUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBxdWFsaWZpZWRSZWZlcmVuY2UgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgcmVmZXJlbmNlOwotCQlpZiAoaW5kZXhJblF1YWxpZmljYXRpb24gPT0gKHF1YWxpZmllZFJlZmVyZW5jZS5pbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgLSAxKSkgewotCQkJcmV0dXJuIGJpbmRpbmcuY29uc3RhbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTm90QUNvbnN0YW50OwotCQl9CisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNTdXBlckFjY2VzcygpIHsKQEAgLTQyNSwxMiArMzk4LDEyIEBACiAJCX0KIAkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCiAJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCi0JCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQogCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLnJlY2VpdmVyVHlwZQogCQkJJiYgIXRoaXMucmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKIAkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKIAkJCSYmIGJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50Ci0JCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMgogCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCiAJCQkvL25vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcyAoaW4gY2FzZSB0aGVyZSB3YXMpCiAJCQkJfHwgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpIHsKQEAgLTQ4MiwxMiArNDU1LDEyIEBACiAJCX0KIAkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCiAJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCi0JCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQogCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLnJlY2VpdmVyVHlwZQogCQkJJiYgIXRoaXMucmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKIAkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKIAkJCSYmIGJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50Ci0JCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMgogCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCiAJCQkvL25vIGNoYW5nZSBmb3IgT2JqZWN0IGZpZWxkcyAoaW4gY2FzZSB0aGVyZSB3YXMpCiAJCQkJfHwgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpIHsKQEAgLTUyMiwxOCArNDk1LDIxIEBACiAJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoYmluZGluZywgdGhpcyk7CiAKLQkJLy8gY2hlY2sgZm9yIHRoaXMueCBpbiBzdGF0aWMgaXMgZG9uZSBpbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVjZWl2ZXIKLQkJY29uc3RhbnQgPQotCQkJRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoCi0JCQkJYmluZGluZywKLQkJCQlyZWNlaXZlciA9PSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCwKLQkJCQl0aGlzLAotCQkJCXNjb3BlLAotCQkJCTApOwotCQlpZiAocmVjZWl2ZXIgIT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpCisJCWJvb2xlYW4gaXNJbXBsaWNpdFRoaXNSY3YgPSByZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpOworCQljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGJpbmRpbmcsIHRoaXMsIGlzSW1wbGljaXRUaGlzUmN2LCBzY29wZSk7CisJCWlmICghaXNJbXBsaWNpdFRoaXNSY3YpIHsKIAkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwotCi0JCXJldHVybiBiaW5kaW5nLnR5cGU7CisJCX0KKwkJaWYgKGJpbmRpbmcuaXNTdGF0aWMoKSkgeworCQkJLy8gc3RhdGljIGZpZWxkIGFjY2Vzc2VkIHRocm91Z2ggcmVjZWl2ZXI/IGxlZ2FsIGJ1dCB1bm9wdGltYWwgKG9wdGlvbmFsIHdhcm5pbmcpCisJCQlpZiAoIShpc0ltcGxpY2l0VGhpc1JjdgorCQkJCQl8fCByZWNlaXZlci5pc1N1cGVyKCkKKwkJCQkJfHwgKHJlY2VpdmVyIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSAKKwkJCQkJCSYmICgoKE5hbWVSZWZlcmVuY2UpIHJlY2VpdmVyKS5iaXRzICYgQmluZGluZ0lkcy5UWVBFKSAhPSAwKSkpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeVJlY2VpdmVyRm9yU3RhdGljRmllbGQodGhpcywgYmluZGluZyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gYmluZGluZy50eXBlOwogCX0KIAogCXB1YmxpYyB2b2lkIHNldEFjdHVhbFJlY2VpdmVyVHlwZShSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgewpAQCAtNTY1LDQgKzU0MSw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmxvYXRMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0Zsb2F0TGl0ZXJhbC5qYXZhCmluZGV4IGQ3ZmI2MGYuLmZjYWU2ZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRmxvYXRMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9GbG9hdExpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZvclN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Gb3JTdGF0ZW1lbnQuamF2YQppbmRleCA1ODNjNDRkLi41MmYwMWZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ZvclN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvRm9yU3RhdGVtZW50LmphdmEKQEAgLTEsMTggKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKQEAgLTcwLDE1ICs3MiwxOCBAQAogCQlwcmVDb25kSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZmxvd0luZm8pOwogCi0JCWJvb2xlYW4gY29uZGl0aW9uSXNJbmxpbmVkVG9UcnVlID0gCi0JCQljb25kaXRpb24gPT0gbnVsbCB8fCAoY29uZGl0aW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCAmJiBjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSk7Ci0JCWJvb2xlYW4gY29uZGl0aW9uSXNJbmxpbmVkVG9GYWxzZSA9IAotCQkJISBjb25kaXRpb25Jc0lubGluZWRUb1RydWUgJiYgKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQgJiYgY29uZGl0aW9uLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKTsKKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24gPT0gbnVsbCA/IG51bGwgOiB0aGlzLmNvbmRpdGlvbi5jb25zdGFudDsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvblRydWUgPSBjc3QgPT0gbnVsbCB8fCAoY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSk7CisJCWJvb2xlYW4gaXNDb25kaXRpb25GYWxzZSA9IGNzdCAhPSBudWxsICYmIChjc3QgIT0gTm90QUNvbnN0YW50ICYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSk7CisKKwkJY3N0ID0gdGhpcy5jb25kaXRpb24gPT0gbnVsbCA/IG51bGwgOiB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZFRydWUgPSBjc3QgPT0gbnVsbCB8fCAgKGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpOworCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkRmFsc2UgPSBjc3QgIT0gbnVsbCAmJiAoY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpOwogCQkKIAkJLy8gcHJvY2VzcyB0aGUgY29uZGl0aW9uCiAJCUxvb3BpbmdGbG93Q29udGV4dCBjb25kTG9vcENvbnRleHQgPSBudWxsOwogCQlpZiAoY29uZGl0aW9uICE9IG51bGwpIHsKLQkJCWlmICghY29uZGl0aW9uSXNJbmxpbmVkVG9UcnVlKSB7CisJCQlpZiAoIWlzQ29uZGl0aW9uVHJ1ZSkgewogCQkJCWZsb3dJbmZvID0KIAkJCQkJY29uZGl0aW9uLmFuYWx5c2VDb2RlKAogCQkJCQkJc2NvcGUsCkBAIC05MSwxMyArOTYsMTQgQEAKIAkJLy8gcHJvY2VzcyB0aGUgYWN0aW9uCiAJCUxvb3BpbmdGbG93Q29udGV4dCBsb29waW5nQ29udGV4dDsKIAkJRmxvd0luZm8gYWN0aW9uSW5mbzsKLQkJaWYgKChhY3Rpb24gPT0gbnVsbCkgfHwgYWN0aW9uLmlzRW1wdHlCbG9jaygpKSB7CisJCWlmIChhY3Rpb24gPT0gbnVsbCAKKwkJCXx8IChhY3Rpb24uaXNFbXB0eUJsb2NrKCkgJiYgY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPD0gQ29tcGlsZXJPcHRpb25zLkpESzFfMykpIHsKIAkJCWlmIChjb25kTG9vcENvbnRleHQgIT0gbnVsbCkKIAkJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3Aoc2NvcGUsIGZsb3dJbmZvKTsKLQkJCWlmIChjb25kaXRpb25Jc0lubGluZWRUb1RydWUpIHsKLQkJCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwkJCWlmIChpc0NvbmRpdGlvblRydWUpIHsKKwkJCQlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7CiAJCQl9IGVsc2UgewotCQkJCWlmIChjb25kaXRpb25Jc0lubGluZWRUb0ZhbHNlKXsKKwkJCQlpZiAoaXNDb25kaXRpb25GYWxzZSl7CiAJCQkJCWNvbnRpbnVlTGFiZWwgPSBudWxsOyAvLyBmb3IoO2ZhbHNlO3AoKSk7CiAJCQkJfQogCQkJCWFjdGlvbkluZm8gPSBmbG93SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOwpAQCAtMTExLDE3ICsxMTcsMjAgQEAKIAkJCWNvbmRJZlRydWVJbml0U3RhdGVJbmRleCA9CiAJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoaW5pdHNXaGVuVHJ1ZSk7CiAKLQkJCQlhY3Rpb25JbmZvID0gY29uZGl0aW9uSXNJbmxpbmVkVG9GYWxzZQotCQkJCQk/IEZsb3dJbmZvLkRlYWRFbmQgIC8vIHVucmVhY2hhYmxlIHdoZW4gY29uZGl0aW9uIGlubGluZWQgdG8gZmFsc2UKLQkJCQkJOiBpbml0c1doZW5UcnVlLmNvcHkoKTsKLQkJCWlmICghYWN0aW9uSW5mby5jb21wbGFpbklmVW5yZWFjaGFibGUoYWN0aW9uLCBzY29wZSkpIHsKKwkJCQlpZiAoaXNDb25kaXRpb25GYWxzZSkgeworCQkJCQlhY3Rpb25JbmZvID0gRmxvd0luZm8uREVBRF9FTkQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWN0aW9uSW5mbyA9IGluaXRzV2hlblRydWUuY29weSgpOworCQkJCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSl7CisJCQkJCQlhY3Rpb25JbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQkJCX0KKwkJCQl9CisJCQlpZiAoIWFjdGlvbkluZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKGFjdGlvbiwgc2NvcGUsIGZhbHNlKSkgewogCQkJCWFjdGlvbkluZm8gPSBhY3Rpb24uYW5hbHlzZUNvZGUoc2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKTsKIAkJCX0KIAogCQkJLy8gY29kZSBnZW5lcmF0aW9uIGNhbiBiZSBvcHRpbWl6ZWQgd2hlbiBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBsb29wCi0JCQlpZiAoKChhY3Rpb25JbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGFjdGlvbkluZm8uaXNGYWtlUmVhY2hhYmxlKCkpCi0JCQkJJiYgKChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUgPT0gRmxvd0luZm8uRGVhZEVuZCkKLQkJCQkJfHwgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLmlzRmFrZVJlYWNoYWJsZSgpKSkgeworCQkJaWYgKCFhY3Rpb25JbmZvLmlzUmVhY2hhYmxlKCkgJiYgIWxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZS5pc1JlYWNoYWJsZSgpKSB7CiAJCQkJY29udGludWVMYWJlbCA9IG51bGw7CiAJCQl9IGVsc2UgewogCQkJCWlmIChjb25kTG9vcENvbnRleHQgIT0gbnVsbCkKQEAgLTEzOCwxMiArMTQ3LDEyIEBACiAJCQlpbnQgaSA9IDAsIGNvdW50ID0gaW5jcmVtZW50cy5sZW5ndGg7CiAJCQl3aGlsZSAoaSA8IGNvdW50KQogCQkJCWFjdGlvbkluZm8gPSBpbmNyZW1lbnRzW2krK10uYW5hbHlzZUNvZGUoc2NvcGUsIGxvb3BDb250ZXh0LCBhY3Rpb25JbmZvKTsKLQkJCWxvb3BDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKHNjb3BlLCBmbG93SW5mbyk7CisJCQlsb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChzY29wZSwgYWN0aW9uSW5mbyk7CiAJCX0KIAogCQkvLyBpbmZpbml0ZSBsb29wCiAJCUZsb3dJbmZvIG1lcmdlZEluZm87Ci0JCWlmIChjb25kaXRpb25Jc0lubGluZWRUb1RydWUpIHsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSkgewogCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKAogCQkJCQltZXJnZWRJbmZvID0gbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKTsKQEAgLTE1NCw2ICsxNjMsOSBAQAogCQltZXJnZWRJbmZvID0KIAkJCWZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKIAkJCQlsb29waW5nQ29udGV4dC5pbml0c09uQnJlYWsudW5jb25kaXRpb25hbEluaXRzKCkpOworCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlICYmIGNvbnRpbnVlTGFiZWwgPT0gbnVsbCl7CisJCQltZXJnZWRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCX0KIAkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwpAQCAtMjQ4LDkgKzI2MCwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpIHsKLQotCQl0aGlzLmJyZWFrTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7Ci0JCXRoaXMuY29udGludWVMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJaWYgKHRoaXMuYnJlYWtMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLmJyZWFrTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KKwkJaWYgKHRoaXMuY29udGludWVMYWJlbCAhPSBudWxsKSB7CisJCQl0aGlzLmNvbnRpbnVlTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KIAl9CiAKIAlwdWJsaWMgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgdXBwZXJTY29wZSkgewpAQCAtMzMzLDQgKzM0OCw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JZlN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JZlN0YXRlbWVudC5qYXZhCmluZGV4IGNkMTljNzQuLjg1OTU0OGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSWZTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lmU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNjMsODYgKzYzLDg0IEBACiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCi0JCUZsb3dJbmZvIHRoZW5GbG93SW5mbywgZWxzZUZsb3dJbmZvOwotCiAJCS8vIHByb2Nlc3MgdGhlIGNvbmRpdGlvbgogCQlmbG93SW5mbyA9IGNvbmRpdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAKKwkJQ29uc3RhbnQgY3N0ID0gdGhpcy5jb25kaXRpb24ub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCk7CisJCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJYm9vbGVhbiBpc0NvbmRpdGlvbk9wdGltaXplZEZhbHNlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2U7CisJCQogCQkvLyBwcm9jZXNzIHRoZSBUSEVOIHBhcnQKLQkJaWYgKHRoZW5TdGF0ZW1lbnQgPT0gbnVsbCkgewotCQkJdGhlbkZsb3dJbmZvID0gZmxvd0luZm8uaW5pdHNXaGVuVHJ1ZSgpOwotCQl9IGVsc2UgewotCQkJQ29uc3RhbnQgY3N0OwotCQkJdGhlbkZsb3dJbmZvID0KLQkJCQkoKCgoY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQpCi0JCQkJCSYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpKQotCQkJCQl8fCAoKChjc3QgPSBjb25kaXRpb24uY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpCi0JCQkJCQkmJiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpCi0JCQkJCT8gKGZsb3dJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKSkKLQkJCQkJOiBmbG93SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOworCQlGbG93SW5mbyB0aGVuRmxvd0luZm8gPSBmbG93SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOworCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgeworCQkJdGhlbkZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCQl9CisJCWlmICh0aGlzLnRoZW5TdGF0ZW1lbnQgIT0gbnVsbCkgewogCQkJLy8gU2F2ZSBpbmZvIGZvciBjb2RlIGdlbgogCQkJdGhlbkluaXRTdGF0ZUluZGV4ID0KIAkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyh0aGVuRmxvd0luZm8pOwotCQkJaWYgKCF0aGVuRmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKHRoZW5TdGF0ZW1lbnQsIGN1cnJlbnRTY29wZSkpIHsKKwkJCWlmICghdGhlbkZsb3dJbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZSh0aGVuU3RhdGVtZW50LCBjdXJyZW50U2NvcGUsIGZhbHNlKSkgewogCQkJCXRoZW5GbG93SW5mbyA9CiAJCQkJCXRoZW5TdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgdGhlbkZsb3dJbmZvKTsKIAkJCX0KIAkJfTsKIAkJLy8gb3B0aW1pemluZyB0aGUganVtcCBhcm91bmQgdGhlIEVMU0UgcGFydAotCQl0aGVuRXhpdCA9ICh0aGVuRmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgdGhlbkZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpOworCQl0aGlzLnRoZW5FeGl0ID0gIXRoZW5GbG93SW5mby5pc1JlYWNoYWJsZSgpOwogCiAJCS8vIHByb2Nlc3MgdGhlIEVMU0UgcGFydAotCQlpZiAoZWxzZVN0YXRlbWVudCA9PSBudWxsKSB7Ci0JCQllbHNlRmxvd0luZm8gPSBmbG93SW5mby5pbml0c1doZW5GYWxzZSgpOwotCQl9IGVsc2UgewotCQkJQ29uc3RhbnQgY3N0OwotCQkJZWxzZUZsb3dJbmZvID0KLQkJCQkoKCgoY3N0ID0gY29uZGl0aW9uLmNvbnN0YW50KSAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpCi0JCQkJCXx8ICgoKGNzdCA9IGNvbmRpdGlvbi5jb25kaXRpb25hbENvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkKLQkJCQkJCSYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpKQotCQkJCQk/IChmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLmNvcHkoKS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpKQotCQkJCQk6IGZsb3dJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpOworCQlGbG93SW5mbyBlbHNlRmxvd0luZm8gPSBmbG93SW5mby5pbml0c1doZW5GYWxzZSgpLmNvcHkoKTsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSkgeworCQkJZWxzZUZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7IAorCQl9CisJCWlmICh0aGlzLmVsc2VTdGF0ZW1lbnQgIT0gbnVsbCkgewogCQkJLy8gU2F2ZSBpbmZvIGZvciBjb2RlIGdlbgogCQkJZWxzZUluaXRTdGF0ZUluZGV4ID0KIAkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhlbHNlRmxvd0luZm8pOwotCQkJaWYgKCFlbHNlRmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKGVsc2VTdGF0ZW1lbnQsIGN1cnJlbnRTY29wZSkpIHsKKwkJCWlmICghZWxzZUZsb3dJbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZShlbHNlU3RhdGVtZW50LCBjdXJyZW50U2NvcGUsIGZhbHNlKSkgewogCQkJCWVsc2VGbG93SW5mbyA9CiAJCQkJCWVsc2VTdGF0ZW1lbnQuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZWxzZUZsb3dJbmZvKTsKIAkJCX0KIAkJfQogCisJCWJvb2xlYW4gZWxzZUV4aXQgPSAhZWxzZUZsb3dJbmZvLmlzUmVhY2hhYmxlKCk7CisJCQogCQkvLyBtZXJnZSBUSEVOICYgRUxTRSBpbml0aWFsaXphdGlvbnMKIAkJRmxvd0luZm8gbWVyZ2VkSW5mbzsKLQkJaWYgKChjb25kaXRpb24uY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQotCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgewotCQkJLy8gSUYgKFRSVUUpCi0JCQlpZiAodGhlbkV4aXQpIHsKLQkJCQltZXJnZWRJbmZvID0gZWxzZUZsb3dJbmZvLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7Ci0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKLQkJCQlyZXR1cm4gbWVyZ2VkSW5mbzsKKy8vCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRUcnVlKXsKKy8vCQkJaWYgKCF0aGlzLnRoZW5FeGl0KSB7CisvLwkJCQltZXJnZWRJbmZvID0gdGhlbkZsb3dJbmZvOworLy8JCQl9IGVsc2UgeworLy8JCQkJbWVyZ2VkSW5mbyA9IGVsc2VGbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworLy8JCQl9CisvLworLy8JCX0gZWxzZSBpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgeworLy8JCQlpZiAoIWVsc2VFeGl0KSB7CisvLwkJCQltZXJnZWRJbmZvID0gZWxzZUZsb3dJbmZvOworLy8JCQl9IGVsc2UgeworLy8JCQkJbWVyZ2VkSW5mbyA9IHRoZW5GbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworLy8JCQl9CisvLworLy8JCX0gZWxzZSB7CisvLwkJCW1lcmdlZEluZm8gPSB0aGVuRmxvd0luZm8ubWVyZ2VkV2l0aChlbHNlRmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworLy8JCX0KKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSl7CisJCQlpZiAoIXRoaXMudGhlbkV4aXQpIHsKKwkJCQltZXJnZWRJbmZvID0gdGhlbkZsb3dJbmZvLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oZWxzZUZsb3dJbmZvKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyh0aGVuRmxvd0luZm8pOwotCQkJCXJldHVybiB0aGVuRmxvd0luZm87CisJCQkJbWVyZ2VkSW5mbyA9IGVsc2VGbG93SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOwogCQkJfQorCisJCX0gZWxzZSBpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSkgeworCQkJaWYgKCFlbHNlRXhpdCkgeworCQkJCW1lcmdlZEluZm8gPSBlbHNlRmxvd0luZm8uYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbSh0aGVuRmxvd0luZm8pOworCQkJfSBlbHNlIHsKKwkJCQltZXJnZWRJbmZvID0gdGhlbkZsb3dJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQl9CisKIAkJfSBlbHNlIHsKLQkJCS8vIElGIChGQUxTRSkKLQkJCWlmICgoY29uZGl0aW9uLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKLQkJCQkmJiAoY29uZGl0aW9uLmNvbnN0YW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkgewotCQkJCWlmIChlbHNlRmxvd0luZm8uaXNEZWFkRW5kKCkpIHsKLQkJCQkJbWVyZ2VkSW5mbyA9IHRoZW5GbG93SW5mby5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOwotCQkJCQltZXJnZWRJbml0U3RhdGVJbmRleCA9Ci0JCQkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKLQkJCQkJcmV0dXJuIG1lcmdlZEluZm87Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQotCQkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoZWxzZUZsb3dJbmZvKTsKLQkJCQkJcmV0dXJuIGVsc2VGbG93SW5mbzsKLQkJCQl9Ci0JCQl9CisJCQltZXJnZWRJbmZvID0gdGhlbkZsb3dJbmZvLm1lcmdlZFdpdGgoZWxzZUZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKIAkJfQotCQltZXJnZWRJbmZvID0gdGhlbkZsb3dJbmZvLm1lcmdlZFdpdGgoZWxzZUZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwogCQltZXJnZWRJbml0U3RhdGVJbmRleCA9CiAJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKIAkJcmV0dXJuIG1lcmdlZEluZm87CkBAIC0xNTYsMzIgKzE1NCwyOCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAKLQkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CisJCWlmICgodGhpcy5iaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CiAJCQlyZXR1cm47CiAJCX0KIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJTGFiZWwgZW5kaWZMYWJlbCA9IG5ldyBMYWJlbChjb2RlU3RyZWFtKTsKIAogCQkvLyBvcHRpbWl6aW5nIHRoZSB0aGVuL2Vsc2UgcGFydCBjb2RlIGdlbgotCQlDb25zdGFudCBjc3QsIGNvbmRDc3Q7Ci0JCWJvb2xlYW4gaGFzVGhlblBhcnQgPQotCQkJISgoKChjc3QgPSBjb25kaXRpb24uY29uc3RhbnQpICE9IE5vdEFDb25zdGFudCkKLQkJCQkmJiAoY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkKLQkJCQl8fCAodGhlblN0YXRlbWVudCA9PSBudWxsKQotCQkJCXx8ICh0aGVuU3RhdGVtZW50LmlzRW1wdHlCbG9jaygpKQotCQkJCXx8ICgoKGNvbmRDc3QgPSBjb25kaXRpb24uY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpCi0JCQkJCSYmIChjb25kQ3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSkpOworCQlDb25zdGFudCBjc3Q7CisJCWJvb2xlYW4gaGFzVGhlblBhcnQgPSAKKwkJCSEoKChjc3QgPSB0aGlzLmNvbmRpdGlvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50CisJCQkJCSYmIGNzdC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkKKwkJCQl8fCB0aGlzLnRoZW5TdGF0ZW1lbnQgPT0gbnVsbAorCQkJCXx8IHRoaXMudGhlblN0YXRlbWVudC5pc0VtcHR5QmxvY2soKSk7CiAJCWJvb2xlYW4gaGFzRWxzZVBhcnQgPQotCQkJISgoKGNzdCAhPSBOb3RBQ29uc3RhbnQpICYmIChjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpCi0JCQkJfHwgKGVsc2VTdGF0ZW1lbnQgPT0gbnVsbCkKLQkJCQl8fCAoZWxzZVN0YXRlbWVudC5pc0VtcHR5QmxvY2soKSkKLQkJCQl8fCAoKChjb25kQ3N0ID0gY29uZGl0aW9uLmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KQotCQkJCQkmJiAoY29uZENzdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkpOworCQkJISgoY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKKwkJCQl8fCB0aGlzLmVsc2VTdGF0ZW1lbnQgPT0gbnVsbAorCQkJCXx8IHRoaXMuZWxzZVN0YXRlbWVudC5pc0VtcHR5QmxvY2soKSk7CiAKIAkJaWYgKGhhc1RoZW5QYXJ0KSB7CiAJCQlMYWJlbCBmYWxzZUxhYmVsOwogCQkJLy8gZ2VuZXJhdGUgYm9vbGVhbiBjb25kaXRpb24KLQkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQl0aGlzLmNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJY3VycmVudFNjb3BlLAogCQkJCWNvZGVTdHJlYW0sCiAJCQkJbnVsbCwKQEAgLTE5NSwxMCArMTg5LDEwIEBACiAJCQkJY29kZVN0cmVhbS5hZGREZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoY3VycmVudFNjb3BlLCB0aGVuSW5pdFN0YXRlSW5kZXgpOwogCQkJfQogCQkJLy8gZ2VuZXJhdGUgdGhlbiBzdGF0ZW1lbnQKLQkJCXRoZW5TdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CisJCQl0aGlzLnRoZW5TdGF0ZW1lbnQuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJCQkvLyBqdW1wIGFyb3VuZCB0aGUgZWxzZSBzdGF0ZW1lbnQKIAkJCWlmIChoYXNFbHNlUGFydCAmJiAhdGhlbkV4aXQpIHsKLQkJCQl0aGVuU3RhdGVtZW50LmJyYW5jaENoYWluVG8oZW5kaWZMYWJlbCk7CisJCQkJdGhpcy50aGVuU3RhdGVtZW50LmJyYW5jaENoYWluVG8oZW5kaWZMYWJlbCk7CiAJCQkJaW50IHBvc2l0aW9uID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJCQljb2RlU3RyZWFtLmdvdG9fKGVuZGlmTGFiZWwpOwogCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMocG9zaXRpb24pOwpAQCAtMjA4LDcgKzIwMiw3IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAoaGFzRWxzZVBhcnQpIHsKIAkJCQkvLyBnZW5lcmF0ZSBib29sZWFuIGNvbmRpdGlvbgotCQkJCWNvbmRpdGlvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJdGhpcy5jb25kaXRpb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAogCQkJCQljdXJyZW50U2NvcGUsCiAJCQkJCWNvZGVTdHJlYW0sCiAJCQkJCWVuZGlmTGFiZWwsCkBAIC0yMTYsNyArMjEwLDcgQEAKIAkJCQkJdHJ1ZSk7CiAJCQl9IGVsc2UgewogCQkJCS8vIGdlbmVyYXRlIGNvbmRpdGlvbiBzaWRlLWVmZmVjdHMKLQkJCQljb25kaXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgZmFsc2UpOworCQkJCXRoaXMuY29uZGl0aW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIGZhbHNlKTsKIAkJCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJfQogCQl9CkBAIC0yMjksNyArMjIzLDcgQEAKIAkJCQkJZWxzZUluaXRTdGF0ZUluZGV4KTsKIAkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIGVsc2VJbml0U3RhdGVJbmRleCk7CiAJCQl9Ci0JCQllbHNlU3RhdGVtZW50LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQkJdGhpcy5lbHNlU3RhdGVtZW50LmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQl9CiAJCWVuZGlmTGFiZWwucGxhY2UoKTsKIAkJLy8gTWF5IGxvb3NlIHNvbWUgbG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zIDogYWZmZWN0aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhdHRyaWJ1dGVzCkBAIC0yNzUsNCArMjY5LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbXBvcnRSZWZlcmVuY2UuamF2YQppbmRleCBlNGNjMGE4Li40N2FhM2UxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ltcG9ydFJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW1wb3J0UmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbml0aWFsaXplci5qYXZhCmluZGV4IDNkNjYwNjAuLmM5NDk1MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luaXRpYWxpemVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMjUsNyArMjUsNyBAQAogCQl0aGlzLmJsb2NrID0gYmxvY2s7CiAJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOwogCi0JCWRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBzb3VyY2VTdGFydCA9IGJsb2NrLnNvdXJjZVN0YXJ0OworCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQgPSBib2R5U3RhcnQgPSBibG9jay5zb3VyY2VTdGFydDsKIAl9CiAKIAlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCkBAIC0xMTEsNiArMTExLDYgQEAKIAkJaWYgKHZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpKSB7CiAJCQlibG9jay50cmF2ZXJzZSh2aXNpdG9yLCBzY29wZSk7CiAJCX0KLQkJdmlzaXRvci52aXNpdCh0aGlzLCBzY29wZSk7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lubmVyVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0lubmVyVHlwZURlY2xhcmF0aW9uLmphdmEKaW5kZXggNjczMDljNy4uMTJlMTU0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Jbm5lclR5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5uZXJUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luc3RhbmNlT2ZFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0luc3RhbmNlT2ZFeHByZXNzaW9uLmphdmEKaW5kZXggOWJhYjgwNS4uM2NkZDc4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnN0YW5jZU9mRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW5zdGFuY2VPZkV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC00NCwxMyArNDQsMTUgQEAKIAogCXB1YmxpYyBmaW5hbCBib29sZWFuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoCiAJCUJsb2NrU2NvcGUgc2NvcGUsCi0JCVR5cGVCaW5kaW5nIGNhc3RUYiwKLQkJVHlwZUJpbmRpbmcgZXhwcmVzc2lvblRiKSB7CisJCVR5cGVCaW5kaW5nIGNhc3RUeXBlLAorCQlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSkgewogCiAJCS8vCXNlZSBzcGVjaWZpY2F0aW9ucyBwLjY4CiAJCS8vQSBtb3JlIGNwbXBsZXRlIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgb24KIAkJLy9DYXN0RXhwcmVzc2lvbiAoaXQgZGVhbHMgd2l0aCBjb25zdGFudCBhbmQgbmVlZCBydW50aW1lIGNoZWNrY2FzdCkKIAorCQlpZiAoY2FzdFR5cGUgPT0gZXhwcmVzc2lvblR5cGUpIHJldHVybiB0cnVlOworCQkKIAkJLy9ieSBncmFtbWF0aWNhbCBjb25zdHJ1Y3Rpb24sIHRoZSBmaXJzdCB0ZXN0IGlzIEFMV0FZUyBmYWxzZQogCQkvL2lmIChjYXN0VGIuaXNCYXNlVHlwZSgpKQogCQkvL3sJaWYgKGV4cHJlc3Npb25UYi5pc0Jhc2VUeXBlKCkpCkBAIC03MSwzMyArNzMsMzIgQEAKIAkJLy9lbHNlCiAJCXsgLy8tLS0tLS0tLS0tLS0tY2hlY2tjYXN0IHRvIHNvbWV0aGluZyB3aGljaCBpcyBOT1QgYSBiYXNldHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCiAKLQkJCWlmIChOdWxsQmluZGluZyA9PSBleHByZXNzaW9uVGIpCi0JCQkJLy9udWxsIGlzIGNvbXBhdGlibGUgd2l0aCBldmVyeSB0aGluZyAuLi4uIAotCQkJCXsKKwkJCS8vbnVsbCBpcyBjb21wYXRpYmxlIHdpdGggZXZlcnkgdGhpbmcgLi4uLiAKKwkJCWlmIChOdWxsQmluZGluZyA9PSBleHByZXNzaW9uVHlwZSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJaWYgKGV4cHJlc3Npb25UYi5pc0FycmF5VHlwZSgpKSB7Ci0JCQkJaWYgKGNhc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCQlpZiAoZXhwcmVzc2lvblR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJCWlmIChjYXN0VHlwZS5pc0FycmF5VHlwZSgpKSB7CiAJCQkJCS8vLS0tLS0tLSAoY2FzdFRiLmlzQXJyYXkpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tCi0JCQkJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25FbHRUYiA9ICgoQXJyYXlCaW5kaW5nKSBleHByZXNzaW9uVGIpLmVsZW1lbnRzVHlwZShzY29wZSk7CisJCQkJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25FbHRUYiA9ICgoQXJyYXlCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkuZWxlbWVudHNUeXBlKHNjb3BlKTsKIAkJCQkJaWYgKGV4cHJlc3Npb25FbHRUYi5pc0Jhc2VUeXBlKCkpCiAJCQkJCQkvLyA8LS0tc3RvcCB0aGUgcmVjdXJzaW9uLS0tLS0tLSAKLQkJCQkJCXJldHVybiAoKEFycmF5QmluZGluZykgY2FzdFRiKS5lbGVtZW50c1R5cGUoc2NvcGUpID09IGV4cHJlc3Npb25FbHRUYjsKKwkJCQkJCXJldHVybiAoKEFycmF5QmluZGluZykgY2FzdFR5cGUpLmVsZW1lbnRzVHlwZShzY29wZSkgPT0gZXhwcmVzc2lvbkVsdFRiOwogCQkJCQkvL3JlY3Vyc2l2bHkgb24gdGhlIGVsdHMuLi4KIAkJCQkJcmV0dXJuIGFyZVR5cGVzQ2FzdENvbXBhdGlibGUoCiAJCQkJCQlzY29wZSwKLQkJCQkJCSgoQXJyYXlCaW5kaW5nKSBjYXN0VGIpLmVsZW1lbnRzVHlwZShzY29wZSksCisJCQkJCQkoKEFycmF5QmluZGluZykgY2FzdFR5cGUpLmVsZW1lbnRzVHlwZShzY29wZSksCiAJCQkJCQlleHByZXNzaW9uRWx0VGIpOwogCQkJCX0KLQkJCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeworCQkJCWlmIChjYXN0VHlwZS5pc0NsYXNzKCkpIHsKIAkJCQkJLy8tLS0tLS0oY2FzdFRiLmlzQ2xhc3MpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tLS0tLQkKLQkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFR5cGUpKQogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9Ci0JCQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7CisJCQkJaWYgKGNhc3RUeXBlLmlzSW50ZXJmYWNlKCkpIHsKIAkJCQkJLy8tLS0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0FycmF5IC0tLS0tLS0tLS0tCi0JCQkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGNhc3RUYikgfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoY2FzdFRiKSkgeworCQkJCQlpZiAoc2NvcGUuaXNKYXZhTGFuZ0Nsb25lYWJsZShjYXN0VHlwZSkgfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoY2FzdFR5cGUpKSB7CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gZmFsc2U7CkBAIC0xMDUsMzMgKzEwNiwzMyBAQAogCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQotCQkJaWYgKGV4cHJlc3Npb25UYi5pc0Jhc2VUeXBlKCkpIHsKKwkJCWlmIChleHByZXNzaW9uVHlwZS5pc0Jhc2VUeXBlKCkpIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9Ci0JCQlpZiAoZXhwcmVzc2lvblRiLmlzQ2xhc3MoKSkgewotCQkJCWlmIChjYXN0VGIuaXNBcnJheVR5cGUoKSkgeworCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ2xhc3MoKSkgeworCQkJCWlmIChjYXN0VHlwZS5pc0FycmF5VHlwZSgpKSB7CiAJCQkJCS8vIC0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNDbGFzcyAtLS0tLS0tCi0JCQkJCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGV4cHJlc3Npb25UYikpIHsKKwkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZXhwcmVzc2lvblR5cGUpKSB7CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeyAvLyAtLS0tLSAoY2FzdFRiLmlzQ2xhc3MpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLSAKLQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShleHByZXNzaW9uVGIsIGNhc3RUYikpCisJCQkJaWYgKGNhc3RUeXBlLmlzQ2xhc3MoKSkgeyAvLyAtLS0tLSAoY2FzdFRiLmlzQ2xhc3MpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLSAKKwkJCQkJaWYgKGV4cHJlc3Npb25UeXBlLmlzQ29tcGF0aWJsZVdpdGgoY2FzdFR5cGUpKQogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCWVsc2UgewotCQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXN0VGIsIGV4cHJlc3Npb25UYikpIHsKKwkJCQkJCWlmIChjYXN0VHlwZS5pc0NvbXBhdGlibGVXaXRoKGV4cHJlc3Npb25UeXBlKSkgewogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJfQogCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQl9CiAJCQkJfQotCQkJCWlmIChjYXN0VGIuaXNJbnRlcmZhY2UoKSkgeworCQkJCWlmIChjYXN0VHlwZS5pc0ludGVyZmFjZSgpKSB7CiAJCQkJCS8vIC0tLS0tIChjYXN0VGIuaXNJbnRlcmZhY2UpIGV4cHJlc3Npb25UYi5pc0NsYXNzIC0tLS0tLS0gIAotCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVGIpLmlzRmluYWwoKSkgeworCQkJCQlpZiAoKChSZWZlcmVuY2VCaW5kaW5nKSBleHByZXNzaW9uVHlwZSkuaXNGaW5hbCgpKSB7CiAJCQkJCQkvL25vIHN1YmNsYXNzIGZvciBleHByZXNzaW9uVGIsIHRodXMgY29tcGlsZS10aW1lIGNoZWNrIGlzIHZhbGlkCi0JCQkJCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UYiwgY2FzdFRiKSkKKwkJCQkJCWlmIChleHByZXNzaW9uVHlwZS5pc0NvbXBhdGlibGVXaXRoKGNhc3RUeXBlKSkKIAkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJfSBlbHNlIHsKQEAgLTE0MSwzOCArMTQyLDM3IEBACiAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9Ci0JCQlpZiAoZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlpZiAoY2FzdFRiLmlzQXJyYXlUeXBlKCkpIHsKKwkJCWlmIChleHByZXNzaW9uVHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCQkJaWYgKGNhc3RUeXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQkJLy8gLS0tLS0gKGNhc3RUYi5pc0FycmF5KSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tCi0JCQkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGV4cHJlc3Npb25UYikKLQkJCQkJCXx8IHNjb3BlLmlzSmF2YUlvU2VyaWFsaXphYmxlKGV4cHJlc3Npb25UYikpCisJCQkJCWlmIChzY29wZS5pc0phdmFMYW5nQ2xvbmVhYmxlKGV4cHJlc3Npb25UeXBlKQorCQkJCQkJfHwgc2NvcGUuaXNKYXZhSW9TZXJpYWxpemFibGUoZXhwcmVzc2lvblR5cGUpKQogCQkJCQkJLy9wb3RlbnRpYWwgcnVudGltZSBlcnJvcgogCQkJCQkJewogCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCX0KIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KLQkJCQlpZiAoY2FzdFRiLmlzQ2xhc3MoKSkgeworCQkJCWlmIChjYXN0VHlwZS5pc0NsYXNzKCkpIHsKIAkJCQkJLy8gLS0tLS0gKGNhc3RUYi5pc0NsYXNzKSBleHByZXNzaW9uVGIuaXNJbnRlcmZhY2UgLS0tLS0tLS0KLQkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFRiKSkKKwkJCQkJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoY2FzdFR5cGUpKQogCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUYikuaXNGaW5hbCgpKSB7CisJCQkJCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIGNhc3RUeXBlKS5pc0ZpbmFsKCkpIHsKIAkJCQkJCS8vbm8gc3ViY2xhc3MgZm9yIGNhc3RUYiwgdGh1cyBjb21waWxlLXRpbWUgY2hlY2sgaXMgdmFsaWQKLQkJCQkJCWlmIChzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUoY2FzdFRiLCBleHByZXNzaW9uVGIpKSB7CisJCQkJCQlpZiAoY2FzdFR5cGUuaXNDb21wYXRpYmxlV2l0aChleHByZXNzaW9uVHlwZSkpIHsKIAkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCX0KIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9Ci0JCQkJaWYgKGNhc3RUYi5pc0ludGVyZmFjZSgpKSB7CisJCQkJaWYgKGNhc3RUeXBlLmlzSW50ZXJmYWNlKCkpIHsKIAkJCQkJLy8gLS0tLS0gKGNhc3RUYi5pc0ludGVyZmFjZSkgZXhwcmVzc2lvblRiLmlzSW50ZXJmYWNlIC0tLS0tLS0KLQkJCQkJaWYgKGNhc3RUYiAhPSBleHByZXNzaW9uVGIKLQkJCQkJCSYmIChTY29wZS5jb21wYXJlVHlwZXMoY2FzdFRiLCBleHByZXNzaW9uVGIpID09IE5vdFJlbGF0ZWQpKSB7Ci0JCQkJCQlNZXRob2RCaW5kaW5nW10gY2FzdFRiTWV0aG9kcyA9ICgoUmVmZXJlbmNlQmluZGluZykgY2FzdFRiKS5tZXRob2RzKCk7CisJCQkJCWlmICgoU2NvcGUuY29tcGFyZVR5cGVzKGNhc3RUeXBlLCBleHByZXNzaW9uVHlwZSkgPT0gTm90UmVsYXRlZCkpIHsKKwkJCQkJCU1ldGhvZEJpbmRpbmdbXSBjYXN0VGJNZXRob2RzID0gKChSZWZlcmVuY2VCaW5kaW5nKSBjYXN0VHlwZSkubWV0aG9kcygpOwogCQkJCQkJaW50IGNhc3RUYk1ldGhvZHNMZW5ndGggPSBjYXN0VGJNZXRob2RzLmxlbmd0aDsKIAkJCQkJCU1ldGhvZEJpbmRpbmdbXSBleHByZXNzaW9uVGJNZXRob2RzID0KLQkJCQkJCQkoKFJlZmVyZW5jZUJpbmRpbmcpIGV4cHJlc3Npb25UYikubWV0aG9kcygpOworCQkJCQkJCSgoUmVmZXJlbmNlQmluZGluZykgZXhwcmVzc2lvblR5cGUpLm1ldGhvZHMoKTsKIAkJCQkJCWludCBleHByZXNzaW9uVGJNZXRob2RzTGVuZ3RoID0gZXhwcmVzc2lvblRiTWV0aG9kcy5sZW5ndGg7CiAJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc3RUYk1ldGhvZHNMZW5ndGg7IGkrKykgewogCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwcmVzc2lvblRiTWV0aG9kc0xlbmd0aDsgaisrKSB7CkBAIC0yMDksNyArMjA5LDcgQEAKIAogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwotCQljb2RlU3RyZWFtLmluc3RhbmNlX29mKHR5cGUuYmluZGluZyk7CisJCWNvZGVTdHJlYW0uaW5zdGFuY2Vfb2YodHlwZS5yZXNvbHZlZFR5cGUpOwogCQlpZiAoIXZhbHVlUmVxdWlyZWQpCiAJCQljb2RlU3RyZWFtLnBvcCgpOwogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwpAQCAtMjE4LDE2ICsyMTgsMTYgQEAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCiAJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwotCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJVHlwZUJpbmRpbmcgY2hlY2tUYiA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQlpZiAoZXhwcmVzc2lvblRiID09IG51bGwgfHwgY2hlY2tUYiA9PSBudWxsKQorCQlUeXBlQmluZGluZyBleHByZXNzaW9uVHlwZSA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlUeXBlQmluZGluZyBjaGVja1R5cGUgPSB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cHJlc3Npb25UeXBlID09IG51bGwgfHwgY2hlY2tUeXBlID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIAotCQlpZiAoIWFyZVR5cGVzQ2FzdENvbXBhdGlibGUoc2NvcGUsIGNoZWNrVGIsIGV4cHJlc3Npb25UYikpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9yKHRoaXMsIGV4cHJlc3Npb25UYiwgY2hlY2tUYik7CisJCWlmICghYXJlVHlwZXNDYXN0Q29tcGF0aWJsZShzY29wZSwgY2hlY2tUeXBlLCBleHByZXNzaW9uVHlwZSkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5vdENvbXBhdGlibGVUeXBlc0Vycm9yKHRoaXMsIGV4cHJlc3Npb25UeXBlLCBjaGVja1R5cGUpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJdGhpcy50eXBlQmluZGluZyA9IEJvb2xlYW5CaW5kaW5nOworCQl0aGlzLnJlc29sdmVkVHlwZSA9IEJvb2xlYW5CaW5kaW5nOwogCQlyZXR1cm4gQm9vbGVhbkJpbmRpbmc7CiAJfQogCkBAIC0yNDUsNCArMjQ1LDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnRMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQppbmRleCA5NjVlMTAxLi4wMzVkMDY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0xMjksNiArMTI5LDcgQEAKIAlpZiAoY29uc3RhbnQgPT0gRk9STUFUX0VSUk9SKSB7CiAJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jb25zdGFudE91dE9mRm9ybWF0KHRoaXMpOworCQl0aGlzLnJlc29sdmVkVHlwZSA9IG51bGw7CiAJCXJldHVybiBudWxsOwogCX0KIAlyZXR1cm4gdGI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9JbnRMaXRlcmFsTWluVmFsdWUuamF2YQppbmRleCBjZDkyMTFlLi4wMzE0ZDZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0ludExpdGVyYWxNaW5WYWx1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvSW50TGl0ZXJhbE1pblZhbHVlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTGFiZWxlZFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MYWJlbGVkU3RhdGVtZW50LmphdmEKaW5kZXggNTM3OGE2OS4uZjBjZTk3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MYWJlbGVkU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MYWJlbGVkU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNjcsNyArNjcsOCBAQAogCQogCXB1YmxpYyBBc3ROb2RlIGNvbmNyZXRlU3RhdGVtZW50KCkgewogCQkKLQkJcmV0dXJuIHN0YXRlbWVudC5jb25jcmV0ZVN0YXRlbWVudCgpOworCQkvLyByZXR1cm4gc3RhdGVtZW50LmNvbmNyZXRlU3RhdGVtZW50KCk7IC8vIGZvciBzdXBwb3J0aW5nIG5lc3RlZCBsYWJlbHM6ICAgYTpiOmM6IHNvbWVTdGF0ZW1lbnQgKHNlZSAyMTkxMikKKwkJcmV0dXJuIHN0YXRlbWVudDsKIAl9CiAJCiAJLyoqCkBAIC0xMjAsNyArMTIxLDggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7Ci0KLQkJdGhpcy50YXJnZXRMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJaWYgKHRoaXMudGFyZ2V0TGFiZWwgIT0gbnVsbCkgewkKKwkJCXRoaXMudGFyZ2V0TGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9MaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xpdGVyYWwuamF2YQppbmRleCAxMjlmYTljLi40MDRiNTJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xpdGVyYWwuamF2YQpAQCAtMSwyNSArMSwzMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAkKLQogcHVibGljIExpdGVyYWwoaW50IHMsaW50IGUpIHsKIAlzb3VyY2VTdGFydCA9IHMgOwogCXNvdXJjZUVuZD0gZTsKIH0KKworcHVibGljIEZsb3dJbmZvIGFuYWx5c2VDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8pIHsKKwlyZXR1cm4gZmxvd0luZm87Cit9CisKIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbXB1dGVDb25zdGFudCgpIDsKIAkvL09OIEVSUk9SIGNvbnN0YW50IFNUQVlTIE5VTEwKIHB1YmxpYyBhYnN0cmFjdCBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKTsKQEAgLTMyLDcgKzM4LDggQEAKIAkJY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCXJldHVybiBudWxsOwogCX0KLQlyZXR1cm4gbGl0ZXJhbFR5cGUoc2NvcGUpOworCXRoaXMucmVzb2x2ZWRUeXBlID0gbGl0ZXJhbFR5cGUoc2NvcGUpOworCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIH0KIHB1YmxpYyBhYnN0cmFjdCBjaGFyW10gc291cmNlKCkgOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb2NhbERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsRGVjbGFyYXRpb24uamF2YQppbmRleCA3ZTczMWZlLi5kYWVkMmMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0zMiwxMCArMzIsMTAgQEAKIAkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CiAJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAJCQl0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kID0gaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOworCQkJdGhpcy5kZWNsYXJhdGlvbkVuZCA9IGluaXRpYWxpemF0aW9uLnNvdXJjZUVuZDsKIAkJfSBlbHNlIHsKLQkJCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CisJCQl0aGlzLmRlY2xhcmF0aW9uRW5kID0gc291cmNlRW5kOwogCQl9Ci0JCXRoaXMuZGVjbGFyYXRpb25FbmQgPSB0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kOwogCX0KIAogCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKQEAgLTQ0LDMwICs0NCwzNiBAQAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCiAJCS8vIHJlY29yZCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBpZiBhbnkKLQkJaWYgKCFmbG93SW5mby5pc0RlYWRFbmQoKSAmJiAhZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpIHsKKwkJaWYgKGZsb3dJbmZvLmlzUmVhY2hhYmxlKCkpIHsKIAkJCWJpdHMgfD0gSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlTUFTSzsgLy8gb25seSBzZXQgaWYgYWN0dWFsbHkgcmVhY2hlZAogCQl9Ci0JCWlmIChpbml0aWFsaXphdGlvbiA9PSBudWxsKQorCQlpZiAoaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgCiAJCQlyZXR1cm4gZmxvd0luZm87CisJCQkKIAkJZmxvd0luZm8gPQogCQkJaW5pdGlhbGl6YXRpb24KIAkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCiAJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCisJCS8vIGZpbmFsIGludCBpID0gKGkgPSAwKTsKKwkJLy8gbm8gbmVlZCB0byBjb21wbGFpbiBzaW5jZSAoaSA9IDApIHBhcnQgd2lsbCBnZXQgdGhlIGJsYW1lCisJCS8vaWYgKGJpbmRpbmcuaXNGaW5hbCgpICYmIGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChiaW5kaW5nKSkgeworCQkvLwljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoYmluZGluZywgdGhpcyk7CisJCS8vfQorCQkJCQogCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoYmluZGluZyk7CiAJCXJldHVybiBmbG93SW5mbzsKIAl9CiAKIAlwdWJsaWMgdm9pZCBjaGVja01vZGlmaWVycygpIHsKLQkJLy9vbmx5IHBvdGVudGlhbCB2YWxpZCBtb2RpZmllciBpcyA8PGZpbmFsPj4KIAotCQlpZiAoKChtb2RpZmllcnMgJiBBY2NKdXN0RmxhZykgfCBBY2NGaW5hbCkgIT0gQWNjRmluYWwpCisJCS8vb25seSBwb3RlbnRpYWwgdmFsaWQgbW9kaWZpZXIgaXMgPDxmaW5hbD4+CisJCWlmICgoKG1vZGlmaWVycyAmIEFjY0p1c3RGbGFnKSAmIH5BY2NGaW5hbCkgIT0gMCkKIAkJCS8vQWNjTW9kaWZpZXJQcm9ibGVtIC0+IG90aGVyIChub24tdmlzaWJpbGl0eSBwcm9ibGVtKQogCQkJLy9BY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gLT4gZHVwbGljYXRlIG1vZGlmaWVyCiAJCQkvL0FjY01vZGlmaWVyUHJvYmxlbSB8IEFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSAtPiB2aXNpYmlsaXR5IHByb2JsZW0iCi0JCQkvLyAteC0xIHJldHVybnMgdGhlIGJpdEludmVydCAKIAotCQkJbW9kaWZpZXJzID0KLQkJCQkobW9kaWZpZXJzICYgKC1BY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gLSAxKSkgfCBBY2NNb2RpZmllclByb2JsZW07CisJCQltb2RpZmllcnMgPSAobW9kaWZpZXJzICYgfkFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgfCBBY2NNb2RpZmllclByb2JsZW07CiAJfQogCiAJLyoqCkBAIC03NiwxNSArODIsMTcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCisJCS8vIGV2ZW4gaWYgbm90IHJlYWNoYWJsZSwgdmFyaWFibGUgbXVzdCBiZSBhZGRlZCB0byB2aXNpYmxlIGlmIGFsbG9jYXRlZCAoMjgyOTgpCisJCWlmIChiaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKKwkJCWNvZGVTdHJlYW0uYWRkVmlzaWJsZUxvY2FsVmFyaWFibGUoYmluZGluZyk7CisJCX0KIAkJaWYgKChiaXRzICYgSXNSZWFjaGFibGVNQVNLKSA9PSAwKSB7CiAJCQlyZXR1cm47CiAJCX0KIAkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJQ29uc3RhbnQgaW5saW5lZFZhbHVlOworCiAJCS8vIHNvbWV0aGluZyB0byBpbml0aWFsaXplPwotCQlpZiAoYmluZGluZy5yZXNvbHZlZFBvc2l0aW9uICE9IC0xKSB7Ci0JCQljb2RlU3RyZWFtLmFkZFZpc2libGVMb2NhbFZhcmlhYmxlKGJpbmRpbmcpOwotCQl9CiAJCWlmIChpbml0aWFsaXphdGlvbiAhPSBudWxsKSB7CiAJCQkvLyBpbml0aWFsaXplIHRvIGNvbnN0YW50IHZhbHVlPwogCQkJaWYgKChpbmxpbmVkVmFsdWUgPSBpbml0aWFsaXphdGlvbi5jb25zdGFudCkgIT0gTm90QUNvbnN0YW50KSB7CkBAIC0xMDIsNiArMTEwLDEzIEBACiAJCQkJaW5pdGlhbGl6YXRpb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CiAJCQkJLy8gaWYgYmluZGluZyB1bnVzZWQgZ2VuZXJhdGUgdGhlbiBkaXNjYXJkIHRoZSB2YWx1ZQogCQkJCWlmIChiaW5kaW5nLnJlc29sdmVkUG9zaXRpb24gIT0gLTEpIHsKKwkJCQkJLy8gMjY5MDMsIG5lZWQgZXh0cmEgY2FzdCB0byBzdG9yZSBudWxsIGluIGFycmF5IGxvY2FsIHZhcgkKKwkJCQkJaWYgKGJpbmRpbmcudHlwZS5pc0FycmF5VHlwZSgpIAorCQkJCQkJJiYgKGluaXRpYWxpemF0aW9uLnJlc29sdmVkVHlwZSA9PSBOdWxsQmluZGluZwkvLyBhcnJheUxvYyA9IG51bGwKKwkJCQkJCQl8fCAoKGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pCS8vIGFycmF5TG9jID0gKHR5cGVbXSludWxsCisJCQkJCQkJCSYmICgoKENhc3RFeHByZXNzaW9uKWluaXRpYWxpemF0aW9uKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IE51bGxCaW5kaW5nKSkpKXsKKwkJCQkJCWNvZGVTdHJlYW0uY2hlY2tjYXN0KGJpbmRpbmcudHlwZSk7IAorCQkJCQl9CQkJCQkKIAkJCQkJY29kZVN0cmVhbS5zdG9yZShiaW5kaW5nLCBmYWxzZSk7CiAJCQkJCWlmIChiaW5kaW5nLmluaXRpYWxpemF0aW9uQ291bnQgPT0gMCkgewogCQkJCQkJLyogVmFyaWFibGUgbWF5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBkdXJpbmcgdGhlIGNvZGUgaW5pdGlhbGl6aW5nIGl0CkBAIC0xNTEsNiArMTY2LDkgQEAKIAkJCS8vIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLi4uIG1heSBjYXJyeSBvbiB3aXRoIHRoZSBmaXJzdCBiaW5kaW5nLi4uCiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWRlZmluZUxvY2FsKHRoaXMpOwogCQl9IGVsc2UgeworCQkJaWYgKChtb2RpZmllcnMgJiBBY2NGaW5hbCkhPSAwICYmIHRoaXMuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCkgeworCQkJCW1vZGlmaWVycyB8PSBBY2NCbGFua0ZpbmFsOworCQkJfQogCQkJYmluZGluZyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZyh0aGlzLCB0YiwgbW9kaWZpZXJzLCBmYWxzZSk7CiAJCQlzY29wZS5hZGRMb2NhbFZhcmlhYmxlKGJpbmRpbmcpOwogCQkJYmluZGluZy5jb25zdGFudCA9IE5vdEFDb25zdGFudDsKQEAgLTE3Nyw3ICsxOTUsNyBAQAogCQkJCWlmIChpbml0VGIgIT0gbnVsbCkgewogCQkJCQlpZiAoaW5pdGlhbGl6YXRpb24uaXNDb25zdGFudFZhbHVlT2ZUeXBlQXNzaWduYWJsZVRvVHlwZShpbml0VGIsIHRiKQogCQkJCQkJfHwgKHRiLmlzQmFzZVR5cGUoKSAmJiBCYXNlVHlwZUJpbmRpbmcuaXNXaWRlbmluZyh0Yi5pZCwgaW5pdFRiLmlkKSkKLQkJCQkJCXx8IHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShpbml0VGIsIHRiKSkKKwkJCQkJCXx8IGluaXRUYi5pc0NvbXBhdGlibGVXaXRoKHRiKSkKIAkJCQkJCWluaXRpYWxpemF0aW9uLmltcGxpY2l0V2lkZW5pbmcodGIsIGluaXRUYik7CiAJCQkJCWVsc2UKIAkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnR5cGVNaXNtYXRjaEVycm9yKGluaXRUYiwgdGIsIHRoaXMpOwpAQCAtMjAzLDQgKzIyMSw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9jYWxUeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCAyMTkzY2Q3Li43ZjEwYzZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvY2FsVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb2NhbFR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWwuamF2YQppbmRleCAzMDdmNzNjLi43YTA2MjI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L0xvbmdMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTEyOSw2ICsxMjksNyBAQAogCWlmIChjb25zdGFudCA9PSBGT1JNQVRfRVJST1IpIHsKIAkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNvbnN0YW50T3V0T2ZGb3JtYXQodGhpcyk7CisJCXRoaXMucmVzb2x2ZWRUeXBlID0gbnVsbDsKIAkJcmV0dXJuIG51bGw7CiAJfQogCXJldHVybiB0YjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTG9uZ0xpdGVyYWxNaW5WYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKaW5kZXggODEyMmQ2Mi4uNTcyMzZjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Mb25nTGl0ZXJhbE1pblZhbHVlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFnaWNMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01hZ2ljTGl0ZXJhbC5qYXZhCmluZGV4IGU5MDI0ZGYuLmZiNzVlNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWFnaWNMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NYWdpY0xpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyAgTWFnaWNMaXRlcmFsIGV4dGVuZHMgTGl0ZXJhbCB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lbWJlclR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZW1iZXJUeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCAxZDczMTNiLi4yYzg3YzI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lbWJlclR5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVtYmVyVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXNzYWdlU2VuZC5qYXZhCmluZGV4IGI4Yzg4MGEuLjNlN2NmZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWVzc2FnZVNlbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01lc3NhZ2VTZW5kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNDUsOCArNDUsNiBAQAogCQkvLyBtdXN0IHZlcmlmeSB0aGF0IGV4Y2VwdGlvbnMgcG90ZW50aWFsbHkgdGhyb3duIGJ5IHRoaXMgZXhwcmVzc2lvbiBhcmUgY2F1Z2h0IGluIHRoZSBtZXRob2QKIAkJZmxvd0NvbnRleHQuY2hlY2tFeGNlcHRpb25IYW5kbGVycyh0aHJvd25FeGNlcHRpb25zLCB0aGlzLCBmbG93SW5mbywgY3VycmVudFNjb3BlKTsKIAl9Ci0JLy8gaWYgaW52b2tpbmcgdGhyb3VnaCBhbiBlbmNsb3NpbmcgaW5zdGFuY2UsIHRoZW4gbXVzdCBwZXJmb3JtIHRoZSBmaWVsZCBnZW5lcmF0aW9uIC0tIG9ubHkgaWYgcmVhY2hhYmxlCi0JbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOwogCW1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7CQogCXJldHVybiBmbG93SW5mbzsKIH0KQEAgLTY0LDE1ICs2MiwxMSBAQAogCS8vIGdlbmVyYXRlIHJlY2VpdmVyL2VuY2xvc2luZyBpbnN0YW5jZSBhY2Nlc3MKIAlib29sZWFuIGlzU3RhdGljID0gY29kZWdlbkJpbmRpbmcuaXNTdGF0aWMoKTsKIAkvLyBvdXRlciBhY2Nlc3MgPwotCWlmICghaXNTdGF0aWMgJiYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSAmJiAocmVjZWl2ZXIgPT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpKXsKKwlpZiAoIWlzU3RhdGljICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgJiYgcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSl7CiAJCS8vIG91dGVyIG1ldGhvZCBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGVtdWxhdGlvbiBpZiBpbXBsaWNpdCBhY2Nlc3MKLQkJT2JqZWN0W10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJLy8gZW11bGF0aW9uIHdhcyBub3QgcG9zc2libGUgKHNob3VsZCBub3QgaGFwcGVuIHBlciBjb25zdHJ1Y3Rpb24pCi0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKLQkJfQorCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CQkKKwkJT2JqZWN0W10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAl9IGVsc2UgewogCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOwogCX0KQEAgLTEyNSwxNyArMTE5LDYgQEAKIHB1YmxpYyBib29sZWFuIGlzVHlwZUFjY2VzcygpIHsJCiAJcmV0dXJuIHJlY2VpdmVyICE9IG51bGwgJiYgcmVjZWl2ZXIuaXNUeXBlUmVmZXJlbmNlKCk7CiB9Ci1wdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7Ci0JaWYgKCgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgJiYgIWJpbmRpbmcuaXNTdGF0aWMoKSAmJiAocmVjZWl2ZXIgPT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpKSB7Ci0JCVJlZmVyZW5jZUJpbmRpbmcgY29tcGF0aWJsZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkvLyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb2YgdGhlIHRhcmdldCBiaW5kaW5nIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBlbmNsb3NpbmcKLQkJLy8gdHlwZSBhdCA8ZGVwdGg+IGxldmVscyBvdXRzaWRlCi0JCWZvciAoaW50IGkgPSAwLCBkZXB0aCA9IChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUOyBpIDwgZGVwdGg7IGkrKykgewotCQkJY29tcGF0aWJsZVR5cGUgPSBjb21wYXRpYmxlVHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCX0KLQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygoU291cmNlVHlwZUJpbmRpbmcpIGNvbXBhdGlibGVUeXBlLCBmYWxzZSk7IC8vIHJlcXVlc3QgY2FzY2FkZSBvZiBhY2Nlc3NlcwotCX0KLX0KIHB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY0FjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKXsKIAogCWlmIChiaW5kaW5nLmlzUHJpdmF0ZSgpKXsKQEAgLTE0Myw3ICsxMjYsNyBAQAogCQkvLyBkZXB0aCBpcyBzZXQgZm9yIGJvdGggaW1wbGljaXQgYW5kIGV4cGxpY2l0IGFjY2VzcyAoc2VlIE1ldGhvZEJpbmRpbmcjY2FuQmVTZWVuQnkpCQkKIAkJaWYgKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkgIT0gYmluZGluZy5kZWNsYXJpbmdDbGFzcyl7CiAJCQotCQkJc3ludGhldGljQWNjZXNzb3IgPSAoKFNvdXJjZVR5cGVCaW5kaW5nKWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MpLmFkZFN5bnRoZXRpY01ldGhvZChiaW5kaW5nKTsKKwkJCXN5bnRoZXRpY0FjY2Vzc29yID0gKChTb3VyY2VUeXBlQmluZGluZyliaW5kaW5nLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKIAkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkVG9FbXVsYXRlTWV0aG9kQWNjZXNzKGJpbmRpbmcsIHRoaXMpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xNTIsNyArMTM1LDcgQEAKIAogCQkvLyBxdWFsaWZpZWQgc3VwZXIgbmVlZCBlbXVsYXRpb24gYWx3YXlzCiAJCVNvdXJjZVR5cGVCaW5kaW5nIGRlc3RpbmF0aW9uVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykoKChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSlyZWNlaXZlcikuY3VycmVudENvbXBhdGlibGVUeXBlKTsKLQkJc3ludGhldGljQWNjZXNzb3IgPSBkZXN0aW5hdGlvblR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcpOworCQlzeW50aGV0aWNBY2Nlc3NvciA9IGRlc3RpbmF0aW9uVHlwZS5hZGRTeW50aGV0aWNNZXRob2QoYmluZGluZywgaXNTdXBlckFjY2VzcygpKTsKIAkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRUb0VtdWxhdGVNZXRob2RBY2Nlc3MoYmluZGluZywgdGhpcyk7CiAJCXJldHVybjsKIApAQCAtMTY0LDE5ICsxNDcsMTkgQEAKIAkJCQkJIT0gKGVuY2xvc2luZ1NvdXJjZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpKS5nZXRQYWNrYWdlKCkpewogCiAJCQlTb3VyY2VUeXBlQmluZGluZyBjdXJyZW50Q29tcGF0aWJsZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpZW5jbG9zaW5nU291cmNlVHlwZS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOwotCQkJc3ludGhldGljQWNjZXNzb3IgPSBjdXJyZW50Q29tcGF0aWJsZVR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcpOworCQkJc3ludGhldGljQWNjZXNzb3IgPSBjdXJyZW50Q29tcGF0aWJsZVR5cGUuYWRkU3ludGhldGljTWV0aG9kKGJpbmRpbmcsIGlzU3VwZXJBY2Nlc3MoKSk7CiAJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZFRvRW11bGF0ZU1ldGhvZEFjY2VzcyhiaW5kaW5nLCB0aGlzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KIAkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCS8vIE5PVEU6IGZyb20gMS40IG9uLCBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKIAkvLyBhbmQgbm90IGZyb20gT2JqZWN0IG9yIGltcGxpY2l0IHN0YXRpYyBtZXRob2QgY2FsbC4JCiAJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5xdWFsaWZ5aW5nVHlwZQogCQkmJiAhdGhpcy5xdWFsaWZ5aW5nVHlwZS5pc0FycmF5VHlwZSgpCi0JCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAotCQkJCSYmIChyZWNlaXZlciAhPSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdCB8fCAhYmluZGluZy5pc1N0YXRpYygpKQorCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMudGFyZ2V0SkRLID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzIKKwkJCQkmJiAoIXJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkgfHwgIWJpbmRpbmcuaXNTdGF0aWMoKSkKIAkJCQkmJiBiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KSAvLyBubyBjaGFuZ2UgZm9yIE9iamVjdCBtZXRob2RzCiAJCQl8fCAhYmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSkgewogCkBAIC0yMDMsNyArMTg2LDYgQEAKIAkJCX0KIAkJfQogCQlpZiAoYXJnSGFzRXJyb3IpewotCQkJTWV0aG9kQmluZGluZyBjbG9zZXN0TWV0aG9kID0gbnVsbDsKIAkJCWlmKHJlY2VpdmVyVHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHsKIAkJCQkvLyByZWNvcmQgYW55IHNlbGVjdG9yIG1hdGNoLCBmb3IgY2xpZW50cyB3aG8gbWF5IHN0aWxsIG5lZWQgaGludCBhYm91dCBwb3NzaWJsZSBtZXRob2QgbWF0Y2gKIAkJCQl0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gc2NvcGUuZmluZE1ldGhvZCgoUmVmZXJlbmNlQmluZGluZylyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBuZXcgVHlwZUJpbmRpbmdbXXt9LCB0aGlzKTsKQEAgLTIyMSwzMiArMjAzLDM5IEBACiAJfQogCiAJdGhpcy5jb2RlZ2VuQmluZGluZyA9IHRoaXMuYmluZGluZyA9IAotCQlyZWNlaXZlciA9PSBUaGlzUmVmZXJlbmNlLlRoaXNJbXBsaWNpdAorCQlyZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpCiAJCQk/IHNjb3BlLmdldEltcGxpY2l0TWV0aG9kKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKQogCQkJOiBzY29wZS5nZXRNZXRob2QodGhpcy5yZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsgCiAJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgewogCQkJaWYgKHRoaXMucmVjZWl2ZXJUeXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgewogCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZWNlaXZlclR5cGU7Ci0JCQl9IGVsc2UgeyAvLyByZWFsbHkgYmFkIGVycm9yIC4uLi4KKwkJCX0gZWxzZSB7IAogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yTm9NZXRob2RGb3IodGhpcywgdGhpcy5yZWNlaXZlclR5cGUsIGFyZ3VtZW50VHlwZXMpOwogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9CiAJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRNZXRob2QodGhpcywgYmluZGluZyk7CiAJCS8vIHJlY29yZCB0aGUgY2xvc2VzdCBtYXRjaCwgZm9yIGNsaWVudHMgd2hvIG1heSBzdGlsbCBuZWVkIGhpbnQgYWJvdXQgcG9zc2libGUgbWV0aG9kIG1hdGNoCi0JCWlmIChiaW5kaW5nLnByb2JsZW1JZCgpID09IFByb2JsZW1SZWFzb25zLk5vdEZvdW5kKXsKLQkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPSB0aGlzLmJpbmRpbmcgPSAoKFByb2JsZW1NZXRob2RCaW5kaW5nKWJpbmRpbmcpLmNsb3Nlc3RNYXRjaDsKKwkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtTWV0aG9kQmluZGluZyl7CisJCQlNZXRob2RCaW5kaW5nIGNsb3Nlc3RNYXRjaCA9ICgoUHJvYmxlbU1ldGhvZEJpbmRpbmcpYmluZGluZykuY2xvc2VzdE1hdGNoOworCQkJaWYgKGNsb3Nlc3RNYXRjaCAhPSBudWxsKSB0aGlzLmNvZGVnZW5CaW5kaW5nID0gdGhpcy5iaW5kaW5nID0gY2xvc2VzdE1hdGNoOwogCQl9Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gYmluZGluZyA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmcucmV0dXJuVHlwZTsKIAl9CiAJaWYgKCFiaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJLy8gdGhlICJyZWNlaXZlciIgbXVzdCBub3QgYmUgYSB0eXBlLCBpLmUuIGEgTmFtZVJlZmVyZW5jZSB0aGF0IHRoZSBUQyBoYXMgYm91bmQgdG8gYSBUeXBlCi0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIE5hbWVSZWZlcmVuY2UpIHsKLQkJCWlmICgoKChOYW1lUmVmZXJlbmNlKSByZWNlaXZlcikuYml0cyAmIEJpbmRpbmdJZHMuVFlQRSkgIT0gMCkgewotCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm11c3RVc2VBU3RhdGljTWV0aG9kKHRoaXMsIGJpbmRpbmcpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQorCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlIAorCQkJCSYmICgoKE5hbWVSZWZlcmVuY2UpIHJlY2VpdmVyKS5iaXRzICYgQmluZGluZ0lkcy5UWVBFKSAhPSAwKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tdXN0VXNlQVN0YXRpY01ldGhvZCh0aGlzLCBiaW5kaW5nKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIHN0YXRpYyBtZXNzYWdlIGludm9rZWQgdGhyb3VnaCByZWNlaXZlcj8gbGVnYWwgYnV0IHVub3B0aW1hbCAob3B0aW9uYWwgd2FybmluZykuCisJCWlmICghKHJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkKKwkJCQl8fCByZWNlaXZlci5pc1N1cGVyKCkKKwkJCQl8fCAocmVjZWl2ZXIgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlIAorCQkJCQkmJiAoKChOYW1lUmVmZXJlbmNlKSByZWNlaXZlcikuYml0cyAmIEJpbmRpbmdJZHMuVFlQRSkgIT0gMCkpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bm5lY2Vzc2FyeVJlY2VpdmVyRm9yU3RhdGljTWV0aG9kKHRoaXMsIGJpbmRpbmcpOwogCQl9CiAJfQogCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKQEAgLTI1NywxNCArMjQ2LDEzIEBACiAJaWYgKGJpbmRpbmcuaXNBYnN0cmFjdCgpKSB7CiAJCWlmIChyZWNlaXZlci5pc1N1cGVyKCkpIHsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdERpcmVjbHlJbnZva2VBYnN0cmFjdE1ldGhvZCh0aGlzLCBiaW5kaW5nKTsKLQkJCXJldHVybiBudWxsOwogCQl9CiAJCS8vIGFic3RyYWN0IHByaXZhdGUgbWV0aG9kcyBjYW5ub3Qgb2NjdXIgbm9yIGFic3RyYWN0IHN0YXRpYy4uLi4uLi4uLi4uLgogCX0KIAlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZE1ldGhvZChiaW5kaW5nLCB0aGlzKTsKIAotCXJldHVybiBiaW5kaW5nLnJldHVyblR5cGU7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gYmluZGluZy5yZXR1cm5UeXBlOwogfQogcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CiAJdGhpcy5xdWFsaWZ5aW5nVHlwZSA9IHJlY2VpdmVyVHlwZTsKQEAgLTI4Miw3ICsyNzAsNyBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXsKIAkKIAlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JaWYgKHJlY2VpdmVyICE9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0KQorCWlmICghcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSkKIAkJcyA9IHMgKyByZWNlaXZlci50b1N0cmluZ0V4cHJlc3Npb24oKSsiLiI7IC8vJE5PTi1OTFMtMSQKIAlzID0gcyArIG5ldyBTdHJpbmcoc2VsZWN0b3IpICsgIigiIDsgLy8kTk9OLU5MUy0xJAogCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTWV0aG9kRGVjbGFyYXRpb24uamF2YQppbmRleCBiZWU0MWEwLi5kNjNkYTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L01ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDIwICsxLDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0TWV0aG9kOwogCiBwdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIHsKIAkKQEAgLTI3LDYgKzMxLDYxIEBACiAJCXN1cGVyKGNvbXBpbGF0aW9uUmVzdWx0KTsKIAl9CiAKKwlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZSgKKwkJQ2xhc3NTY29wZSBjbGFzc1Njb3BlLAorCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IGluaXRpYWxpemF0aW9uQ29udGV4dCwKKwkJRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQkvLyBzdGFydGluZyBvZiB0aGUgY29kZSBhbmFseXNpcyBmb3IgbWV0aG9kcworCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlpZiAoYmluZGluZyA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCQkKKwkJCWlmICh0aGlzLmJpbmRpbmcuaXNQcml2YXRlKCkgJiYgIXRoaXMuYmluZGluZy5pc1ByaXZhdGVVc2VkKCkpIHsKKwkJCQlpZiAoIWNsYXNzU2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuY29tcGlsYXRpb25SZXN1bHQuaGFzU3ludGF4RXJyb3IoKSkgeworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRQcml2YXRlTWV0aG9kKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJCQkKKwkJCS8vIG1heSBiZSBpbiBhIG5vbiBuZWNlc3NhcnkgPGNsaW5pdD4gZm9yIGlubmVyY2xhc3Mgd2l0aCBzdGF0aWMgZmluYWwgY29uc3RhbnQgZmllbGRzCisJCQlpZiAoYmluZGluZy5pc0Fic3RyYWN0KCkgfHwgYmluZGluZy5pc05hdGl2ZSgpKQorCQkJCXJldHVybjsKKworCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBtZXRob2RDb250ZXh0ID0KKwkJCQluZXcgRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCgKKwkJCQkJaW5pdGlhbGl6YXRpb25Db250ZXh0LAorCQkJCQl0aGlzLAorCQkJCQliaW5kaW5nLnRocm93bkV4Y2VwdGlvbnMsCisJCQkJCXNjb3BlLAorCQkJCQlGbG93SW5mby5ERUFEX0VORCk7CisKKwkJCS8vIHByb3BhZ2F0ZSB0byBzdGF0ZW1lbnRzCisJCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQkJYm9vbGVhbiBkaWRBbHJlYWR5Q29tcGxhaW4gPSBmYWxzZTsKKwkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQkJU3RhdGVtZW50IHN0YXQ7CisJCQkJCWlmICghZmxvd0luZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKChzdGF0ID0gc3RhdGVtZW50c1tpXSksIHNjb3BlLCBkaWRBbHJlYWR5Q29tcGxhaW4pKSB7CisJCQkJCQlmbG93SW5mbyA9IHN0YXQuYW5hbHlzZUNvZGUoc2NvcGUsIG1ldGhvZENvbnRleHQsIGZsb3dJbmZvKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRpZEFscmVhZHlDb21wbGFpbiA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBjaGVjayBmb3IgbWlzc2luZyByZXR1cm5pbmcgcGF0aAorCQkJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSA9IGJpbmRpbmcucmV0dXJuVHlwZTsKKwkJCWlmICgocmV0dXJuVHlwZSA9PSBWb2lkQmluZGluZykgfHwgaXNBYnN0cmFjdCgpKSB7CisJCQkJdGhpcy5uZWVkRnJlZVJldHVybiA9IGZsb3dJbmZvLmlzUmVhY2hhYmxlKCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChmbG93SW5mbyAhPSBGbG93SW5mby5ERUFEX0VORCkgeyAKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuc2hvdWxkUmV0dXJuKHJldHVyblR5cGUsIHRoaXMpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRNZXRob2QgZSkgeworCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCX0KKwl9CiAKIAlwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoUGFyc2VyIHBhcnNlciwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgewogCkBAIC0zNiwxMSArOTUsMTEgQEAKIAkJcGFyc2VyLnBhcnNlKHRoaXMsIHVuaXQpOwogCX0KIAotCXB1YmxpYyB2b2lkIHJlc29sdmVTdGF0ZW1lbnRzKENsYXNzU2NvcGUgdXBwZXJTY29wZSkgeworCXB1YmxpYyB2b2lkIHJlc29sdmVTdGF0ZW1lbnRzKCkgewogCiAJCS8vID09PT09PT09PSBhYm9ydCBvbiBmYXRhbCBlcnJvciA9PT09PT09PT09PT09CiAJCWlmICh0aGlzLnJldHVyblR5cGUgIT0gbnVsbCAmJiB0aGlzLmJpbmRpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5yZXR1cm5UeXBlLmJpbmRpbmcgPSB0aGlzLmJpbmRpbmcucmV0dXJuVHlwZTsKKwkJCXRoaXMucmV0dXJuVHlwZS5yZXNvbHZlZFR5cGUgPSB0aGlzLmJpbmRpbmcucmV0dXJuVHlwZTsKIAkJCS8vIHJlY29yZCB0aGUgcmV0dXJuIHR5cGUgYmluZGluZwogCQl9CiAJCS8vIGxvb2sgaWYgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyBjb3JyZWN0CkBAIC02NSw3ICsxMjQsNyBAQAogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5tZXRob2ROZWVkaW5nTm9Cb2R5KHRoaXMpOwogCQkJfQogCQl9Ci0JCXN1cGVyLnJlc29sdmVTdGF0ZW1lbnRzKHVwcGVyU2NvcGUpOyAKKwkJc3VwZXIucmVzb2x2ZVN0YXRlbWVudHMoKTsgCiAJfQogCiAJcHVibGljIFN0cmluZyByZXR1cm5UeXBlVG9TdHJpbmcoaW50IHRhYikgewpAQCAtMTAwLDQgKzE1OSw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBjbGFzc1Njb3BlKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQppbmRleCA2ZmNjMjVlLi45ZGRlNWIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L05hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CkBAIC0xNiw3ICsxNiw4IEBACiAKIAlwdWJsaWMgQmluZGluZyBiaW5kaW5nLCBjb2RlZ2VuQmluZGluZzsgLy9tYXkgYmUgYVR5cGVCaW5kaW5nLWFGaWVsZEJpbmRpbmctYUxvY2FsVmFyaWFibGVCaW5kaW5nCiAJCi0JcHVibGljIFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgYWN0dWFsUmVjZWl2ZXJUeXBlOworCXB1YmxpYyBUeXBlQmluZGluZyByZWNlaXZlclR5cGU7CQkvLyByYXcgcmVjZWl2ZXIgdHlwZQorCXB1YmxpYyBUeXBlQmluZGluZyBhY3R1YWxSZWNlaXZlclR5cGU7CS8vIG1vZGlmaWVkIHJlY2VpdmVyIHR5cGUgLSBhY3R1YWwgb25lIGFjY29yZGluZyB0byBuYW1lbG9va3VwCiAKIAkvL3RoZSBlcnJvciBwcmludGluZwogCS8vc29tZSBuYW1lIHJlZmVyZW5jZSBhcmUgYnVpbGQgYXMgbmFtZSByZWZlcmVuY2UgYnV0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bGxMaXRlcmFsLmphdmEKaW5kZXggMjc0YzljYi4uMDI3ZTEyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9OdWxsTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVsbExpdGVyYWwuamF2YQpAQCAtMSw1MiArMSw1OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIE51bGxMaXRlcmFsIGV4dGVuZHMgTWFnaWNMaXRlcmFsIHsKLQlzdGF0aWMgZmluYWwgY2hhcltdIHNvdXJjZSA9IHsnbicgLCAndScgLCAnbCcgLCAnbCd9OwotcHVibGljIE51bGxMaXRlcmFsKGludCBzICwgaW50IGUpIHsKLQlzdXBlcihzLGUpOwotfQotcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgewogCi0JY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUobnVsbCk7fQotLyoqCi0gKiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBudWxsIGxpdGVyYWwKLSAqCi0gKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQotICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQotICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotICovIAotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JaWYgKHZhbHVlUmVxdWlyZWQpCi0JCWNvZGVTdHJlYW0uYWNvbnN0X251bGwoKTsKLQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwotfQotcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQlyZXR1cm4gTnVsbEJpbmRpbmc7Ci19Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKLQlyZXR1cm4gc291cmNlOwotfQotcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgewotCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOwotCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwotfQorCXN0YXRpYyBmaW5hbCBjaGFyW10gc291cmNlID0geyduJyAsICd1JyAsICdsJyAsICdsJ307CisKKwlwdWJsaWMgTnVsbExpdGVyYWwoaW50IHMgLCBpbnQgZSkgeworCisJCXN1cGVyKHMsZSk7CisJfQorCisJcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgeworCQorCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsgCisJfQorCisJLyoqCisJICogQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgbnVsbCBsaXRlcmFsCisJICoKKwkgKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQorCSAqIEBwYXJhbSBjb2RlU3RyZWFtIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW0KKwkgKiBAcGFyYW0gdmFsdWVSZXF1aXJlZCBib29sZWFuCisJICovIAorCXB1YmxpYyB2b2lkIGdlbmVyYXRlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKKwkJaWYgKHZhbHVlUmVxdWlyZWQpCisJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCXB1YmxpYyBUeXBlQmluZGluZyBsaXRlcmFsVHlwZShCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXJldHVybiBOdWxsQmluZGluZzsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKKwkJcmV0dXJuIHNvdXJjZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIHNjb3BlKSB7CisJCXZpc2l0b3IudmlzaXQodGhpcywgc2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L051bWJlckxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCmluZGV4IGY5MzA5Y2IuLmVkMmQ0YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvTnVtYmVyTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIE51bWJlckxpdGVyYWwgZXh0ZW5kcyBMaXRlcmFsIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT1JfT1JfRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEKaW5kZXggNWY2ZDRlNC4uOWMwZjc3MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PUl9PUl9FeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMzEsMzUgKzMxLDQyIEBACiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCi0JCUNvbnN0YW50IG9wQ29uc3RhbnQgPSBsZWZ0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKTsKLQkJaWYgKG9wQ29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7Ci0JCQlpZiAob3BDb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCS8vIEZBTFNFIHx8IGFueXRoaW5nCi0JCQkJIC8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzY2VuYXJpbzoKLQkJCQkvLwkJKHggfHwgeSkgfHwgIXosIGlmIHBhc3NpbmcgdGhlIGxlZnQgaW5mbyB0byB0aGUgcmlnaHQsIGl0IHdvdWxkIGJlIHN3YXBwZWQgYnkgdGhlICEKLQkJCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykudW5jb25kaXRpb25hbEluaXRzKCk7Ci0JCQkJbWVyZ2VkSW5mbyA9IHJpZ2h0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIG1lcmdlZEluZm8pOwotCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KLQkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7Ci0JCQkJcmV0dXJuIG1lcmdlZEluZm87Ci0JCQl9CisJCUNvbnN0YW50IGNzdCA9IHRoaXMubGVmdC5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJYm9vbGVhbiBpc0xlZnRPcHRpbWl6ZWRUcnVlID0gY3N0ICE9IE5vdEFDb25zdGFudCAmJiBjc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZTsKKwkJYm9vbGVhbiBpc0xlZnRPcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCisJCWlmIChpc0xlZnRPcHRpbWl6ZWRGYWxzZSkgeworCQkJLy8gRkFMU0UgfHwgYW55dGhpbmcKKwkJCSAvLyBuZWVkIHRvIGJlIGNhcmVmdWwgb2Ygc2NlbmFyaW86CisJCQkvLwkJKHggfHwgeSkgfHwgIXosIGlmIHBhc3NpbmcgdGhlIGxlZnQgaW5mbyB0byB0aGUgcmlnaHQsIGl0IHdvdWxkIGJlIHN3YXBwZWQgYnkgdGhlICEKKwkJCUZsb3dJbmZvIG1lcmdlZEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJCW1lcmdlZEluZm8gPSByaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBtZXJnZWRJbmZvKTsKKwkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KKwkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhtZXJnZWRJbmZvKTsKKwkJCXJldHVybiBtZXJnZWRJbmZvOwogCQl9Ci0JCUZsb3dJbmZvIGxlZnRJbmZvLCByaWdodEluZm87Ci0JCWxlZnRJbmZvID0gbGVmdC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CisKKwkJRmxvd0luZm8gbGVmdEluZm8gPSBsZWZ0LmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAkKIAkJIC8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzY2VuYXJpbzoKIAkJLy8JCSh4IHx8IHkpIHx8ICF6LCBpZiBwYXNzaW5nIHRoZSBsZWZ0IGluZm8gdG8gdGhlIHJpZ2h0LCBpdCB3b3VsZCBiZSBzd2FwcGVkIGJ5IHRoZSAhCi0JCXJpZ2h0SW5mbyA9IGxlZnRJbmZvLmluaXRzV2hlbkZhbHNlKCkudW5jb25kaXRpb25hbEluaXRzKCkuY29weSgpOwotCQlpZiAob3BDb25zdGFudCAhPSBOb3RBQ29uc3RhbnQgJiYgb3BDb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSByaWdodEluZm8ubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKLQorCQlGbG93SW5mbyByaWdodEluZm8gPSBsZWZ0SW5mby5pbml0c1doZW5GYWxzZSgpLnVuY29uZGl0aW9uYWxJbml0cygpLmNvcHkoKTsKIAkJcmlnaHRJbml0U3RhdGVJbmRleCA9CiAJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhyaWdodEluZm8pOworCisJCWludCBwcmV2aW91c01vZGUgPSByaWdodEluZm8ucmVhY2hNb2RlKCk7CisJCWlmIChpc0xlZnRPcHRpbWl6ZWRUcnVlKXsKKwkJCXJpZ2h0SW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOyAKKwkJfQogCQlyaWdodEluZm8gPSByaWdodC5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCByaWdodEluZm8pOworCQlGbG93SW5mbyBmYWxzZU1lcmdlZEluZm8gPSByaWdodEluZm8uaW5pdHNXaGVuRmFsc2UoKS5jb3B5KCk7CisJCXJpZ2h0SW5mby5zZXRSZWFjaE1vZGUocHJldmlvdXNNb2RlKTsgLy8gcmVzZXQgYWZ0ZXIgZmFsc2VNZXJnZWRJbmZvIGdvdCBleHRyYWN0ZWQKKwogCQlGbG93SW5mbyBtZXJnZWRJbmZvID0gRmxvd0luZm8uY29uZGl0aW9uYWwoCiAJCQkJCS8vIG1lcmdpbmcgdHdvIHRydWUgaW5pdEluZm9zIGZvciBzdWNoIGEgbmVnYXRpdmUgY2FzZTogaWYgKCh0ICYmIChiID0gdCkpIHx8IGYpIHIgPSBiOyAvLyBiIG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkCiAJCQkJCWxlZnRJbmZvLmluaXRzV2hlblRydWUoKS5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aCgKIAkJCQkJCXJpZ2h0SW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKSwKLQkJCQkJcmlnaHRJbmZvLmluaXRzV2hlbkZhbHNlKCkuY29weSgpKTsKKwkJCQkJZmFsc2VNZXJnZWRJbmZvKTsKIAkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCXJldHVybiBtZXJnZWRJbmZvOwpAQCAtMTI3LDEzICsxMzQsMTIgQEAKIAkJTGFiZWwgdHJ1ZUxhYmVsLAogCQlMYWJlbCBmYWxzZUxhYmVsLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQkJaWYgKChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpICYmIChjb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CisJCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKIAkJCXN1cGVyLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbihjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWVMYWJlbCwgZmFsc2VMYWJlbCwgdmFsdWVSZXF1aXJlZCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAkJQ29uc3RhbnQgY29uZENvbnN0OwotCQlpZiAoKGNvbmRDb25zdCA9IGxlZnQuY29uZGl0aW9uYWxDb25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJaWYgKChjb25kQ29uc3QgPSBsZWZ0Lm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpKSAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCWlmIChjb25kQ29uc3QuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewogCQkJCS8vIDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byB0cnVlPiB8fCB4CiAJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCkBAIC0xNTEsNiArMTU3LDggQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KKwkJCQkvLyByZXBvc2l0aW9uIHRoZSBlbmRQQworCQkJCWNvZGVTdHJlYW0udXBkYXRlTGFzdFJlY29yZGVkRW5kUEMoY29kZVN0cmVhbS5wb3NpdGlvbik7CQkJCQkKIAkJCX0gZWxzZSB7CiAJCQkJLy8gPHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGZhbHNlPiB8fCB4CiAJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCkBAIC0xNzMsNyArMTgxLDYgQEAKIAkJCQkJCXZhbHVlUmVxdWlyZWQpOwogCQkJCX0KIAkJCX0KLQkJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCQljb2RlU3RyZWFtLnJlbW92ZU5vdERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcygKIAkJCQkJY3VycmVudFNjb3BlLApAQCAtMTgxLDE4ICsxODgsMjAgQEAKIAkJCX0KIAkJCXJldHVybjsKIAkJfQotCQlpZiAoKGNvbmRDb25zdCA9IHJpZ2h0LmNvbmRpdGlvbmFsQ29uc3RhbnQoKSkgIT0gTm90QUNvbnN0YW50KSB7CisJCWlmICgoY29uZENvbnN0ID0gcmlnaHQub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50KCkpICE9IE5vdEFDb25zdGFudCkgewogCQkJaWYgKGNvbmRDb25zdC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7CiAJCQkJLy8geCB8fCA8c29tZXRoaW5nIGVxdWl2YWxlbnQgdG8gdHJ1ZT4KKwkJCQlMYWJlbCBpbnRlcm5hbEZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoY29kZVN0cmVhbSk7CiAJCQkJbGVmdC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkJY29kZVN0cmVhbSwKLQkJCQkJdHJ1ZUxhYmVsLAotCQkJCQlmYWxzZUxhYmVsLAorCQkJCQludWxsLAorCQkJCQlpbnRlcm5hbEZhbHNlTGFiZWwsIC8vIHdpbGwgYmUgdHJ1ZSBpbiB0aGUgZW5kCiAJCQkJCWZhbHNlKTsKIAkJCQlpZiAocmlnaHRJbml0U3RhdGVJbmRleCAhPSAtMSkgewogCQkJCQljb2RlU3RyZWFtLmFkZERlZmluaXRlbHlBc3NpZ25lZFZhcmlhYmxlcyhjdXJyZW50U2NvcGUsIHJpZ2h0SW5pdFN0YXRlSW5kZXgpOwogCQkJCX0KKwkJCQlpbnRlcm5hbEZhbHNlTGFiZWwucGxhY2UoKTsKIAkJCQlyaWdodC5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkJY29kZVN0cmVhbSwKQEAgLTIwOCw2ICsyMTcsOCBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQorCQkJCS8vIHJlcG9zaXRpb24gdGhlIGVuZFBDCisJCQkJY29kZVN0cmVhbS51cGRhdGVMYXN0UmVjb3JkZWRFbmRQQyhjb2RlU3RyZWFtLnBvc2l0aW9uKTsJCQkJCQogCQkJfSBlbHNlIHsKIAkJCQkvLyB4IHx8IDxzb21ldGhpbmcgZXF1aXZhbGVudCB0byBmYWxzZT4KIAkJCQlpZiAoKGJpdHMgJiBPbmx5VmFsdWVSZXF1aXJlZE1BU0spICE9IDApIHsKQEAgLTIzMCw3ICsyNDEsNiBAQAogCQkJCQlmYWxzZUxhYmVsLAogCQkJCQlmYWxzZSk7CiAJCQl9Ci0JCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQkJaWYgKG1lcmdlZEluaXRTdGF0ZUluZGV4ICE9IC0xKSB7CiAJCQkJY29kZVN0cmVhbS5yZW1vdmVOb3REZWZpbml0ZWx5QXNzaWduZWRWYXJpYWJsZXMoCiAJCQkJCWN1cnJlbnRTY29wZSwKQEAgLTI3NCw3ICsyODQsNiBAQAogCQkJCS8vIG5vIGltcGxpY2l0IGZhbGwgdGhyb3VnaCBUUlVFL0ZBTFNFIC0tPiBzaG91bGQgbmV2ZXIgb2NjdXIKIAkJCX0KIAkJfQotCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCQlpZiAobWVyZ2VkSW5pdFN0YXRlSW5kZXggIT0gLTEpIHsKIAkJCWNvZGVTdHJlYW0ucmVtb3ZlTm90RGVmaW5pdGVseUFzc2lnbmVkVmFyaWFibGVzKAogCQkJCWN1cnJlbnRTY29wZSwKQEAgLTI5Myw0ICszMDIsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvckV4cHJlc3Npb24uamF2YQppbmRleCAyZjc5MTJkLi5jOTgyODVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKQEAgLTEsMjEgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKLQogcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBPcGVyYXRvcklkcyB7CiAKIAlwdWJsaWMgc3RhdGljIGludFtdW10gUmVzb2x2ZVR5cGVUYWJsZXMgPSBuZXcgaW50W051bWJlck9mVGFibGVzXVtdOwotCXB1YmxpYyBUeXBlQmluZGluZyB0eXBlQmluZGluZzsJCisKIAlzdGF0aWMge2NsYXNzSW5pdGlhbGl6ZSgpO30KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvcklkcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9PcGVyYXRvcklkcy5qYXZhCmluZGV4IGU4OTUwMDUuLjM1NjYyZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvT3BlcmF0b3JJZHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L09wZXJhdG9ySWRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBwdWJsaWMgaW50ZXJmYWNlIE9wZXJhdG9ySWRzIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUG9zdGZpeEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUG9zdGZpeEV4cHJlc3Npb24uamF2YQppbmRleCBjM2ZhMjkxLi45OWZiZWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTQwLDcgKzQwLDcgQEAKIAkJLy8ganVzdCBhIGxvY2FsIHZhcmlhYmxlLgogCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWxocy5nZW5lcmF0ZVBvc3RJbmNyZW1lbnQoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0aGlzLCB2YWx1ZVJlcXVpcmVkKTsKKwkJICgoUmVmZXJlbmNlKSBsaHMpLmdlbmVyYXRlUG9zdEluY3JlbWVudChjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRoaXMsIHZhbHVlUmVxdWlyZWQpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwogCQl9CkBAIC03NCw0ICs3NCw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUHJlZml4RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKaW5kZXggZGJhMWYyMS4uZTk0ZTlhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9QcmVmaXhFeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNTcsNCArNTcsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgc2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggMjUwNWQzMy4uYzY0MWEwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0xNSwxMiArMTUsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAorLyoqCisgKiBWYXJpYXRpb24gb24gYWxsb2NhdGlvbiwgd2hlcmUgY2FuIGJlIHNwZWNpZmllZCBhbiBlbmNsb3NpbmcgaW5zdGFuY2UgYW5kIGFuIGFub255bW91cyB0eXBlCisgKi8KIHB1YmxpYyBjbGFzcyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEFsbG9jYXRpb25FeHByZXNzaW9uIHsKIAkKIAkvL3F1YWxpZmljYXRpb24gbWF5IGJlIG9uIGJvdGggc2lkZQogCXB1YmxpYyBFeHByZXNzaW9uIGVuY2xvc2luZ0luc3RhbmNlOwogCXB1YmxpYyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNUeXBlOwotCisJcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlQmluZGluZzsKKwkKIAlwdWJsaWMgUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb24oKSB7CiAJfQogCkBAIC0zMywxMiArMzcsMTcgQEAKIAkJRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsCiAJCUZsb3dJbmZvIGZsb3dJbmZvKSB7CiAKLQkJLy8gdmFyaWF0aW9uIG9uIGFsbG9jYXRpb24sIHdoZXJlIGNhbiBiZSBzcGVjaWZpZWQgYW4gZW5jbG9zaW5nIGluc3RhbmNlIGFuZCBhbiBhbm9ueW1vdXMgdHlwZQotCiAJCS8vIGFuYWx5c2UgdGhlIGVuY2xvc2luZyBpbnN0YW5jZQogCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkgewogCQkJZmxvd0luZm8gPSBlbmNsb3NpbmdJbnN0YW5jZS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCX0KKwkJCisJCS8vIGNoZWNrIGNhcHR1cmVkIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gY3VycmVudCBjb250ZXh0ICgyNjEzNCkKKwkJY2hlY2tDYXB0dXJlZExvY2FsSW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSgKKwkJCXRoaXMuc3VwZXJUeXBlQmluZGluZyA9PSBudWxsID8gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzIDogdGhpcy5zdXBlclR5cGVCaW5kaW5nLCAKKwkJCWN1cnJlbnRTY29wZSwgCisJCQlmbG93SW5mbyk7CisJCQogCQkvLyBwcm9jZXNzIGFyZ3VtZW50cwogCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKIAkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC03OCwxMiArODcsNiBAQAogCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7Ci0JCWlmIChhbGxvY2F0ZWRUeXBlLmlzTG9jYWxUeXBlKCkpIHsKLQkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gKExvY2FsVHlwZUJpbmRpbmcpIGFsbG9jYXRlZFR5cGU7Ci0JCQlsb2NhbFR5cGUuY29uc3RhbnRQb29sTmFtZSgKLQkJCQljb2RlU3RyZWFtLmNsYXNzRmlsZS5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKS5jb21wdXRlQ29uc3RhbnRQb29sTmFtZSgKLQkJCQkJbG9jYWxUeXBlKSk7Ci0JCX0KIAkJY29kZVN0cmVhbS5uZXdfKGFsbG9jYXRlZFR5cGUpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJY29kZVN0cmVhbS5kdXAoKTsKQEAgLTkxLDEwICs5NCw5IEBACiAJCS8vIGJldHRlciBoaWdobGlnaHQgZm9yIGFsbG9jYXRpb246IGRpc3BsYXkgdGhlIHR5cGUgaW5kaXZpZHVhbGx5CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdHlwZS5zb3VyY2VTdGFydCk7CiAKLQkJLy8gaGFuZGxpbmcgaW5uZXJjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uCisJCS8vIGhhbmRsaW5nIGlubmVyY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbiAtIGVuY2xvc2luZyBpbnN0YW5jZSBhcmd1bWVudHMKIAkJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKLQkJCS8vIG1ha2Ugc3VyZSBpdHMgbmFtZSBpcyBjb21wdXRlZCBiZWZvcmUgYXJndW1lbnRzLCBzaW5jZSBtYXkgYmUgbmVjZXNzYXJ5IGZvciBhcmd1bWVudCBlbXVsYXRpb24KLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNBcmd1bWVudFZhbHVlcygKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVZhbHVlcygKIAkJCQljdXJyZW50U2NvcGUsCiAJCQkJYWxsb2NhdGVkVHlwZSwKIAkJCQllbmNsb3NpbmdJbnN0YW5jZSgpLApAQCAtMTA2LDYgKzEwOCwxNCBAQAogCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJCX0KIAkJfQorCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gLSBvdXRlciBsb2NhbCBhcmd1bWVudHMKKwkJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNPdXRlckFyZ3VtZW50VmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCXRoaXMpOworCQl9CisJCQogCQkvLyBpbnZva2UgY29uc3RydWN0b3IKIAkJaWYgKHN5bnRoZXRpY0FjY2Vzc29yID09IG51bGwpIHsKIAkJCWNvZGVTdHJlYW0uaW52b2tlc3BlY2lhbChiaW5kaW5nKTsKQEAgLTEyMCw2ICsxMzAsNyBAQAogCQkJY29kZVN0cmVhbS5pbnZva2VzcGVjaWFsKHN5bnRoZXRpY0FjY2Vzc29yKTsKIAkJfQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOworCiAJCWlmIChhbm9ueW1vdXNUeXBlICE9IG51bGwpIHsKIAkJCWFub255bW91c1R5cGUuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJCX0KQEAgLTE0NywzMCArMTU4LDIyIEBACiAJCQkmJiBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmlzTG9jYWxUeXBlKCkpIHsKIAogCQkJaWYgKGFsbG9jYXRlZFR5cGUuaXNMb2NhbFR5cGUoKSkgewotCQkJCSgoTG9jYWxUeXBlQmluZGluZykgYWxsb2NhdGVkVHlwZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoCi0JCQkJCWN1cnJlbnRTY29wZSwKLQkJCQkJZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCwKLQkJCQkJZmFsc2UpOwotCQkJCS8vIHJlcXVlc3QgY2FzY2FkZSBvZiBhY2Nlc3NlcworCQkJCSgoTG9jYWxUeXBlQmluZGluZykgYWxsb2NhdGVkVHlwZSkuYWRkSW5uZXJFbXVsYXRpb25EZXBlbmRlbnQoY3VycmVudFNjb3BlLCBlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKTsKIAkJCX0gZWxzZSB7CiAJCQkJLy8gbG9jYWxseSBwcm9wYWdhdGUsIHNpbmNlIHdlIGFscmVhZHkgbm93IHRoZSBkZXNpcmVkIHNoYXBlIGZvciBzdXJlCi0JCQkJY3VycmVudFNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKAotCQkJCQlhbGxvY2F0ZWRUeXBlLAotCQkJCQllbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsLAotCQkJCQlmYWxzZSk7Ci0JCQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCisJCQkJY3VycmVudFNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKGFsbG9jYXRlZFR5cGUsIGVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpOwogCQkJfQogCQl9CiAJfQogCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAotCQlpZiAoYW5vbnltb3VzVHlwZSA9PSBudWxsICYmIGVuY2xvc2luZ0luc3RhbmNlID09IG51bGwpCisJCS8vIGFkZGVkIGZvciBjb2RlIGFzc2lzdC4uLmNhbm5vdCBvY2N1ciB3aXRoICdub3JtYWwnIGNvZGUKKwkJaWYgKGFub255bW91c1R5cGUgPT0gbnVsbCAmJiBlbmNsb3NpbmdJbnN0YW5jZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVR5cGUoc2NvcGUpOwotCQkvLyBhZGRlZCBmb3IgY29kZSBhc3Npc3QuLi4gaXMgbm90IHBvc3NpYmxlIHdpdGggJ25vcm1hbCcgY29kZQorCQl9CiAKIAkJLy8gUHJvcGFnYXRlIHRoZSB0eXBlIGNoZWNraW5nIHRvIHRoZSBhcmd1bWVudHMsIGFuZCBjaGVja3MgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCi0KIAkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKIAkJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gTmFtZSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKIAkJLy8gPT0+IGJ5IGNvbnN0cnVjdGlvbiwgd2hlbiB0aGVyZSBpcyBhbiBlbmNsb3NpbmcgaW5zdGFuY2UgdGhlIHR5cGVuYW1lIG1heSBOT1QgYmUgcXVhbGlmaWVkCkBAIC0xNzgsMTE5ICsxODEsMTE4IEBACiAJCS8vIHNvbWV0aW1lIGEgU2luZ2xlVHlwZVJlZmVyZW5jZSBhbmQgc29tZXRpbWUgYSBRdWFsaWZlZFR5cGVSZWZlcmVuY2UKIAogCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKLQkJVHlwZUJpbmRpbmcgZW5jbG9zaW5nSW5zdFRiID0gbnVsbDsKLQkJVHlwZUJpbmRpbmcgcmVjVHlwZTsKLQkJaWYgKGFub255bW91c1R5cGUgPT0gbnVsbCkgewotCQkJLy8tLS0tLS0tLS0tLS0tLS0tbm8gYW5vbnltb3VzIGNsYXNzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQotCQkJaWYgKChlbmNsb3NpbmdJbnN0VGIgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoZW5jbG9zaW5nSW5zdFRiLmlzQmFzZVR5cGUoKSB8IGVuY2xvc2luZ0luc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCVR5cGVCaW5kaW5nIGVuY2xvc2luZ0luc3RhbmNlVHlwZSA9IG51bGw7CisJCVR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSA9IG51bGw7CisJCWJvb2xlYW4gaGFzRXJyb3IgPSBmYWxzZTsKKwkJaWYgKGFub255bW91c1R5cGUgPT0gbnVsbCkgeyAvLy0tLS0tLS0tLS0tLS0tLS1ubyBhbm9ueW1vdXMgY2xhc3MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCisJCQlpZiAoKGVuY2xvc2luZ0luc3RhbmNlVHlwZSA9IGVuY2xvc2luZ0luc3RhbmNlLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCl7CisJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJfSBlbHNlIGlmIChlbmNsb3NpbmdJbnN0YW5jZVR5cGUuaXNCYXNlVHlwZSgpIHx8IGVuY2xvc2luZ0luc3RhbmNlVHlwZS5pc0FycmF5VHlwZSgpKSB7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaWxsZWdhbFByaW1pdGl2ZU9yQXJyYXlUeXBlRm9yRW5jbG9zaW5nSW5zdGFuY2UoCi0JCQkJCWVuY2xvc2luZ0luc3RUYiwKKwkJCQkJZW5jbG9zaW5nSW5zdGFuY2VUeXBlLAogCQkJCQllbmNsb3NpbmdJbnN0YW5jZSk7Ci0JCQkJcmV0dXJuIG51bGw7CisJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJfSBlbHNlIGlmICgodGhpcy5yZXNvbHZlZFR5cGUgPSByZWNlaXZlclR5cGUgPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGUpLnJlc29sdmVUeXBlRW5jbG9zaW5nKAorCQkJCQkJCXNjb3BlLAorCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpKSA9PSBudWxsKSB7CisJCQkJaGFzRXJyb3IgPSB0cnVlOwogCQkJfQotCQkJcmVjVHlwZSA9Ci0JCQkJKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlKS5yZXNvbHZlVHlwZUVuY2xvc2luZygKLQkJCQkJc2NvcGUsCi0JCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0VGIpOwogCQkJLy8gd2lsbCBjaGVjayBmb3IgbnVsbCBhZnRlciBhcmdzIGFyZSByZXNvbHZlZAogCQkJVHlwZUJpbmRpbmdbXSBhcmd1bWVudFR5cGVzID0gTm9QYXJhbWV0ZXJzOwogCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBhcmdIYXNFcnJvciA9IGZhbHNlOwogCQkJCWludCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogCQkJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJCQlpZiAoKGFyZ3VtZW50VHlwZXNbaV0gPSBhcmd1bWVudHNbaV0ucmVzb2x2ZVR5cGUoc2NvcGUpKSA9PSBudWxsKQotCQkJCQkJYXJnSGFzRXJyb3IgPSB0cnVlOwotCQkJCWlmIChhcmdIYXNFcnJvcikKLQkJCQkJcmV0dXJuIHJlY1R5cGU7CisJCQkJCWlmICgoYXJndW1lbnRUeXBlc1tpXSA9IGFyZ3VtZW50c1tpXS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpeworCQkJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJCQl9CiAJCQl9Ci0JCQlpZiAocmVjVHlwZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFyZWNUeXBlLmNhbkJlSW5zdGFudGlhdGVkKCkpIHsKLQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnN0YW50aWF0ZSh0eXBlLCByZWNUeXBlKTsKLQkJCQlyZXR1cm4gcmVjVHlwZTsKKwkJCS8vIGxpbWl0IG9mIGZhdWx0LXRvbGVyYW5jZQorCQkJaWYgKGhhc0Vycm9yKSByZXR1cm4gcmVjZWl2ZXJUeXBlOworCisJCQlpZiAoIXJlY2VpdmVyVHlwZS5jYW5CZUluc3RhbnRpYXRlZCgpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90SW5zdGFudGlhdGUodHlwZSwgcmVjZWl2ZXJUeXBlKTsKKwkJCQlyZXR1cm4gcmVjZWl2ZXJUeXBlOwogCQkJfQotCQkJaWYgKChiaW5kaW5nID0KLQkJCQlzY29wZS5nZXRDb25zdHJ1Y3RvcigoUmVmZXJlbmNlQmluZGluZykgcmVjVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpCi0JCQkJLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCWlmICgodGhpcy5iaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IoKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpCisJCQkJCS5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkJaWYgKGlzTWV0aG9kVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCi0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QoYmluZGluZywgdGhpcyk7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRNZXRob2QodGhpcy5iaW5kaW5nLCB0aGlzKTsKIAogCQkJCWlmIChhcmd1bWVudHMgIT0gbnVsbCkKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspCi0JCQkJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhiaW5kaW5nLnBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50VHlwZXNbaV0pOworCQkJCQkJYXJndW1lbnRzW2ldLmltcGxpY2l0V2lkZW5pbmcodGhpcy5iaW5kaW5nLnBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50VHlwZXNbaV0pOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKQotCQkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY1R5cGU7Ci0JCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcpOwotCQkJCXJldHVybiByZWNUeXBlOworCQkJCWlmICh0aGlzLmJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKKwkJCQkJdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgdGhpcy5iaW5kaW5nKTsKKwkJCQlyZXR1cm4gcmVjZWl2ZXJUeXBlOwogCQkJfQogCiAJCQkvLyBUaGUgZW5jbG9zaW5nIGluc3RhbmNlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIHR5cGUKLQkJCVJlZmVyZW5jZUJpbmRpbmcgZXhwZWN0ZWRUeXBlID0gYmluZGluZy5kZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCk7Ci0JCQlpZiAoc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGVuY2xvc2luZ0luc3RUYiwgZXhwZWN0ZWRUeXBlKSkKLQkJCQlyZXR1cm4gcmVjVHlwZTsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgZXhwZWN0ZWRUeXBlID0gdGhpcy5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKTsKKwkJCWlmIChlbmNsb3NpbmdJbnN0YW5jZVR5cGUuaXNDb21wYXRpYmxlV2l0aChleHBlY3RlZFR5cGUpKQorCQkJCXJldHVybiByZWNlaXZlclR5cGU7CiAJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvckFjdHVhbFR5cGVFeHBlY3RlZFR5cGUoCi0JCQkJZW5jbG9zaW5nSW5zdGFuY2UsCi0JCQkJZW5jbG9zaW5nSW5zdFRiLAorCQkJCXRoaXMuZW5jbG9zaW5nSW5zdGFuY2UsCisJCQkJZW5jbG9zaW5nSW5zdGFuY2VUeXBlLAogCQkJCWV4cGVjdGVkVHlwZSk7Ci0JCQlyZXR1cm4gcmVjVHlwZTsKKwkJCXJldHVybiByZWNlaXZlclR5cGU7CiAJCX0KIAogCQkvLy0tLS0tLS0tLS0tLS0tdGhlcmUgaXMgYW4gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24tLS0tLS0tLS0tLS0tLS0tLQotCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkgewotCQkJaWYgKChlbmNsb3NpbmdJbnN0VGIgPSBlbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoZW5jbG9zaW5nSW5zdFRiLmlzQmFzZVR5cGUoKSB8IGVuY2xvc2luZ0luc3RUYi5pc0FycmF5VHlwZSgpKSB7CisJCWlmICh0aGlzLmVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKKwkJCWlmICgoZW5jbG9zaW5nSW5zdGFuY2VUeXBlID0gdGhpcy5lbmNsb3NpbmdJbnN0YW5jZS5yZXNvbHZlVHlwZShzY29wZSkpID09IG51bGwpIHsKKwkJCQloYXNFcnJvciA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGVuY2xvc2luZ0luc3RhbmNlVHlwZS5pc0Jhc2VUeXBlKCkgfHwgZW5jbG9zaW5nSW5zdGFuY2VUeXBlLmlzQXJyYXlUeXBlKCkpIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbGxlZ2FsUHJpbWl0aXZlT3JBcnJheVR5cGVGb3JFbmNsb3NpbmdJbnN0YW5jZSgKLQkJCQkJZW5jbG9zaW5nSW5zdFRiLAotCQkJCQllbmNsb3NpbmdJbnN0YW5jZSk7Ci0JCQkJcmV0dXJuIG51bGw7CisJCQkJCWVuY2xvc2luZ0luc3RhbmNlVHlwZSwKKwkJCQkJdGhpcy5lbmNsb3NpbmdJbnN0YW5jZSk7CisJCQkJaGFzRXJyb3IgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlyZWNlaXZlclR5cGUgPSAoKFNpbmdsZVR5cGVSZWZlcmVuY2UpIHR5cGUpLnJlc29sdmVUeXBlRW5jbG9zaW5nKAorCQkJCQkJCQkJCXNjb3BlLAorCQkJCQkJCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0YW5jZVR5cGUpOwkJCQkKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlY2VpdmVyVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOwogCQl9Ci0JCS8vIGR1ZSB0byBzeW50YXgtY29uc3RydWN0aW9uLCByZWNUeXBlIGlzIGEgUmVmZXJlbmNlQmluZGluZwkJCi0JCXJlY1R5cGUgPQotCQkJKGVuY2xvc2luZ0luc3RhbmNlID09IG51bGwpCi0JCQkJPyB0eXBlLnJlc29sdmVUeXBlKHNjb3BlKQotCQkJCTogKChTaW5nbGVUeXBlUmVmZXJlbmNlKSB0eXBlKS5yZXNvbHZlVHlwZUVuY2xvc2luZygKLQkJCQkJc2NvcGUsCi0JCQkJCShSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0VGIpOwotCQlpZiAocmVjVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICgoKFJlZmVyZW5jZUJpbmRpbmcpIHJlY1R5cGUpLmlzRmluYWwoKSkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYW5vbnltb3VzQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzKHR5cGUsIHJlY1R5cGUpOwotCQkJcmV0dXJuIG51bGw7CisJCWlmIChyZWNlaXZlclR5cGUgPT0gbnVsbCkgeworCQkJaGFzRXJyb3IgPSB0cnVlOworCQl9IGVsc2UgaWYgKCgoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlKS5pc0ZpbmFsKCkpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFub255bW91c0NsYXNzQ2Fubm90RXh0ZW5kRmluYWxDbGFzcyh0eXBlLCByZWNlaXZlclR5cGUpOworCQkJaGFzRXJyb3IgPSB0cnVlOwogCQl9CiAJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcyA9IE5vUGFyYW1ldGVyczsKIAkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CiAJCQlpbnQgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKIAkJCWFyZ3VtZW50VHlwZXMgPSBuZXcgVHlwZUJpbmRpbmdbbGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7CisJCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkgeworCQkJCQloYXNFcnJvciA9IHRydWU7CisJCQkJfQorCQl9CisJCS8vIGxpbWl0IG9mIGZhdWx0LXRvbGVyYW5jZQorCQlpZiAoaGFzRXJyb3IpIHsKKwkJCQlyZXR1cm4gcmVjZWl2ZXJUeXBlOwogCQl9CiAKIAkJLy8gYW4gYW5vbnltb3VzIGNsYXNzIGluaGVyaXRzIGZyb20gamF2YS5sYW5nLk9iamVjdCB3aGVuIGRlY2xhcmVkICJhZnRlciIgYW4gaW50ZXJmYWNlCi0JCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJCaW5kaW5nID0KLQkJCXJlY1R5cGUuaXNJbnRlcmZhY2UoKSA/IHNjb3BlLmdldEphdmFMYW5nT2JqZWN0KCkgOiAoUmVmZXJlbmNlQmluZGluZykgcmVjVHlwZTsKKwkJdGhpcy5zdXBlclR5cGVCaW5kaW5nID0KKwkJCXJlY2VpdmVyVHlwZS5pc0ludGVyZmFjZSgpID8gc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSA6IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CiAJCU1ldGhvZEJpbmRpbmcgaW5oZXJpdGVkQmluZGluZyA9Ci0JCQlzY29wZS5nZXRDb25zdHJ1Y3RvcihzdXBlckJpbmRpbmcsIGFyZ3VtZW50VHlwZXMsIHRoaXMpOworCQkJc2NvcGUuZ2V0Q29uc3RydWN0b3IodGhpcy5zdXBlclR5cGVCaW5kaW5nLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsKIAkJaWYgKCFpbmhlcml0ZWRCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCWlmIChpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpCi0JCQkJaW5oZXJpdGVkQmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IHN1cGVyQmluZGluZzsKKwkJCQlpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gdGhpcy5zdXBlclR5cGVCaW5kaW5nOwogCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGluaGVyaXRlZEJpbmRpbmcpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJaWYgKGVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwpIHsKLQkJCWlmICghc2NvcGUKLQkJCQkuYXJlVHlwZXNDb21wYXRpYmxlKAotCQkJCQllbmNsb3NpbmdJbnN0VGIsCi0JCQkJCWluaGVyaXRlZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuZW5jbG9zaW5nVHlwZSgpKSkgeworCQkJaWYgKCFlbmNsb3NpbmdJbnN0YW5jZVR5cGUuaXNDb21wYXRpYmxlV2l0aChpbmhlcml0ZWRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmVuY2xvc2luZ1R5cGUoKSkpIHsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS50eXBlTWlzbWF0Y2hFcnJvckFjdHVhbFR5cGVFeHBlY3RlZFR5cGUoCiAJCQkJCWVuY2xvc2luZ0luc3RhbmNlLAotCQkJCQllbmNsb3NpbmdJbnN0VGIsCisJCQkJCWVuY2xvc2luZ0luc3RhbmNlVHlwZSwKIAkJCQkJaW5oZXJpdGVkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5lbmNsb3NpbmdUeXBlKCkpOwogCQkJCXJldHVybiBudWxsOwogCQkJfQpAQCAtMzAzLDE4ICszMDUsMjIgQEAKIAkJCQlhcmd1bWVudHNbaV0uaW1wbGljaXRXaWRlbmluZyhpbmhlcml0ZWRCaW5kaW5nLnBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50VHlwZXNbaV0pOwogCiAJCS8vIFVwZGF0ZSB0aGUgYW5vbnltb3VzIGlubmVyIGNsYXNzIDogc3VwZXJjbGFzcywgaW50ZXJmYWNlICAKLQkJc2NvcGUuYWRkQW5vbnltb3VzVHlwZShhbm9ueW1vdXNUeXBlLCAoUmVmZXJlbmNlQmluZGluZykgcmVjVHlwZSk7CisJCXNjb3BlLmFkZEFub255bW91c1R5cGUoYW5vbnltb3VzVHlwZSwgKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZSk7CiAJCWFub255bW91c1R5cGUucmVzb2x2ZShzY29wZSk7CiAJCWJpbmRpbmcgPSBhbm9ueW1vdXNUeXBlLmNyZWF0ZXNJbnRlcm5hbENvbnN0cnVjdG9yV2l0aEJpbmRpbmcoaW5oZXJpdGVkQmluZGluZyk7CiAJCXJldHVybiBhbm9ueW1vdXNUeXBlLmJpbmRpbmc7IC8vIDEuMiBjaGFuZ2UKIAl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CisJCXJldHVybiB0aGlzLnRvU3RyaW5nRXhwcmVzc2lvbigwKTsKKwl9CiAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKSB7CiAKIAkJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2UgIT0gbnVsbCkKIAkJCXMgKz0gZW5jbG9zaW5nSW5zdGFuY2UudG9TdHJpbmcoKSArICIuIjsgLy8kTk9OLU5MUy0xJAotCQlzICs9IHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbih0YWIpOworCQlzICs9IHN1cGVyLnRvU3RyaW5nRXhwcmVzc2lvbigpOwogCQlpZiAoYW5vbnltb3VzVHlwZSAhPSBudWxsKSB7CiAJCQlzICs9IGFub255bW91c1R5cGUudG9TdHJpbmcodGFiKTsKIAkJfSAvL2FsbG93cyB0byByZXN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIH0gb25lIGxpbmUgdW5kZXIgLi4uLgpAQCAtMzM3LDQgKzM0Myw0IEBACiAJCX0KIAkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggMWUwZTU1ZS4uZDVlNDI3MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtNDEsNzcgKzQxLDY0IEBACiAJCUFzc2lnbm1lbnQgYXNzaWdubWVudCwKIAkJYm9vbGVhbiBpc0NvbXBvdW5kKSB7CiAKLQkJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlmbG93SW5mbyA9Ci0JCQkJYXNzaWdubWVudAotCQkJCQkuZXhwcmVzc2lvbgotCQkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCi0JCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKLQkJfQogCQkvLyBkZXRlcm1pbmUgdGhlIHJhbmsgdW50aWwgd2hpY2ggd2Ugbm93IHdlIGRvIG5vdCBuZWVkIGFueSBhY3R1YWwgdmFsdWUgZm9yIHRoZSBmaWVsZCBhY2Nlc3MKIAkJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IG90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBvdGhlckJpbmRpbmdzLmxlbmd0aDsKLQkJaW50IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPSBvdGhlckJpbmRpbmdzQ291bnQ7Ci0JCXdoaWxlIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID4gMCkgewotCQkJRmllbGRCaW5kaW5nIG90aGVyQmluZGluZyA9IG90aGVyQmluZGluZ3NbaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDFdOwotCQkJaWYgKG90aGVyQmluZGluZy5pc1N0YXRpYygpKQotCQkJCWJyZWFrOyAvLyBubyBsb25nZXIgbmVlZCBhbnkgdmFsdWUgYmVmb3JlIHRoaXMgcG9pbnQKLQkJCWluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQtLTsKLQkJfQotCQlGaWVsZEJpbmRpbmcgbGFzdEZpZWxkQmluZGluZyA9IG51bGw7Ci0JCWlmICgoYml0cyAmIEZJRUxEKSAhPSAwKSB7Ci0JCQkvLyByZWFkaW5nIGZyb20gYSBmaWVsZAotCQkJLy8gY2hlY2sgaWYgZmluYWwgYmxhbmsgZmllbGQKLQkJCWlmICgobGFzdEZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzRmluYWwoKQotCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQobGFzdEZpZWxkQmluZGluZykpIHsKLQkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxhc3RGaWVsZEJpbmRpbmcpKSB7Ci0JCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKAotCQkJCQkJbGFzdEZpZWxkQmluZGluZywKLQkJCQkJCXRoaXMpOworCQlib29sZWFuIG5lZWRWYWx1ZSA9IG90aGVyQmluZGluZ3NDb3VudCA9PSAwIHx8ICF0aGlzLm90aGVyQmluZGluZ3NbMF0uaXNTdGF0aWMoKTsKKwkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgeworCQkJY2FzZSBGSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAorCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOworCQkJCWlmIChuZWVkVmFsdWUpIHsKKwkJCQkJbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgbGFzdEZpZWxkQmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIDApOworCQkJCX0JCQkJLy8gY2hlY2sgaWYgZmluYWwgYmxhbmsgZmllbGQKKwkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc0JsYW5rRmluYWwoKQorCQkJCSAgICAmJiB0aGlzLm90aGVyQmluZGluZ3MgIT0gbnVsbCAvLyB0aGUgbGFzdCBmaWVsZCBiaW5kaW5nIGlzIG9ubHkgYXNzaWduZWQKKwkgCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQobGFzdEZpZWxkQmluZGluZykpIHsKKwkJCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKSkgeworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoCisJCQkJCQkJbGFzdEZpZWxkQmluZGluZywKKwkJCQkJCQl0aGlzKTsKKwkJCQkJfQogCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoYml0cyAmIExPQ0FMKSAhPSAwKSB7CisJCQkJYnJlYWs7CisJCQljYXNlIExPQ0FMIDoKIAkJCQkvLyBmaXJzdCBiaW5kaW5nIGlzIGEgbG9jYWwgdmFyaWFibGUKIAkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbEJpbmRpbmc7CiAJCQkJaWYgKCFmbG93SW5mbwogCQkJCQkuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKSkgewogCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUobG9jYWxCaW5kaW5nLCB0aGlzKTsKIAkJCQl9Ci0JCQkJaWYgKCFmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkKLQkJCQkJbG9jYWxCaW5kaW5nLnVzZWQgPSB0cnVlOwotCQkJfQorCQkJCWlmIChmbG93SW5mby5pc1JlYWNoYWJsZSgpKSB7CisJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgeworCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRDsKKwkJCQl9CiAJCX0KLQkJaWYgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCkgeworCQkKKwkJaWYgKG5lZWRWYWx1ZSkgewogCQkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOwogCQkJLy8gb25seSBmb3IgZmlyc3QgYmluZGluZwogCQl9CiAJCS8vIGFsbCBpbnRlcm1lZGlhdGUgZmllbGQgYWNjZXNzZXMgYXJlIHJlYWQgYWNjZXNzZXMKIAkJaWYgKG90aGVyQmluZGluZ3MgIT0gbnVsbCkgewotCQkJaW50IHN0YXJ0ID0gaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9PSAwID8gMCA6IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgLSAxOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgb3RoZXJCaW5kaW5nc0NvdW50OyBpKyspIHsKLQkJCQlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsKSB7IC8vIGNvdWxkIGJlIG51bGwgaWYgZmlyc3Qgd2FzIGEgbG9jYWwgdmFyaWFibGUKLQkJCQkJVHlwZUJpbmRpbmcgbGFzdFJlY2VpdmVyVHlwZTsKLQkJCQkJc3dpdGNoKGkpewotCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQlsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDEgOgotCQkJCQkJCWxhc3RSZWNlaXZlclR5cGUgPSAoKFZhcmlhYmxlQmluZGluZyliaW5kaW5nKS50eXBlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJbGFzdFJlY2VpdmVyVHlwZSA9IG90aGVyQmluZGluZ3NbaS0xXS50eXBlOwotCQkJCQl9CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyQmluZGluZ3NDb3VudC0xOyBpKyspIHsKKwkJCQlsYXN0RmllbGRCaW5kaW5nID0gb3RoZXJCaW5kaW5nc1tpXTsKKwkJCQluZWVkVmFsdWUgPSAhb3RoZXJCaW5kaW5nc1tpKzFdLmlzU3RhdGljKCk7CisJCQkJaWYgKG5lZWRWYWx1ZSkgewogCQkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoCiAJCQkJCQljdXJyZW50U2NvcGUsIAogCQkJCQkJbGFzdEZpZWxkQmluZGluZywgCi0JCQkJCQlsYXN0UmVjZWl2ZXJUeXBlLAotCQkJCQkJaSk7CisJCQkJCQlpID09IDAgCisJCQkJCQkJPyAoKFZhcmlhYmxlQmluZGluZyliaW5kaW5nKS50eXBlCisJCQkJCQkJOiBvdGhlckJpbmRpbmdzW2ktMV0udHlwZSwKKwkJCQkJCWkgKyAxKTsKIAkJCQl9Ci0JCQkJbGFzdEZpZWxkQmluZGluZyA9IG90aGVyQmluZGluZ3NbaV07CiAJCQl9CisJCQlsYXN0RmllbGRCaW5kaW5nID0gb3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdzQ291bnQtMV07CiAJCX0KKwogCQlpZiAoaXNDb21wb3VuZCkgewogCQkJaWYgKGJpbmRpbmcgPT0gbGFzdEZpZWxkQmluZGluZworCQkJCSYmIGxhc3RGaWVsZEJpbmRpbmcuaXNCbGFua0ZpbmFsKCkKIAkJCQkmJiBjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGxhc3RGaWVsZEJpbmRpbmcpCiAJCQkJJiYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKSkpIHsKIAkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5pbml0aWFsaXplZEJsYW5rRmluYWxGaWVsZCgKQEAgLTEzNCwyNSArMTIxLDMzIEBACiAJCQkJCT8gMCAKIAkJCQkJOiBvdGhlckJpbmRpbmdzQ291bnQpOwogCQl9CisJCQorCQlpZiAoYXNzaWdubWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKKwkJCWZsb3dJbmZvID0KKwkJCQlhc3NpZ25tZW50CisJCQkJCS5leHByZXNzaW9uCisJCQkJCS5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykKKwkJCQkJLnVuY29uZGl0aW9uYWxJbml0cygpOworCQl9CisJCQogCQkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKIAkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNGaW5hbCgpKSB7CiAJCQkvLyBpbiBhIGNvbnRleHQgd2hlcmUgaXQgY2FuIGJlIGFzc2lnbmVkPwotCQkJaWYgKGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQobGFzdEZpZWxkQmluZGluZykpIHsKKwkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzQmxhbmtGaW5hbCgpCisJCQkJCSYmICFpc0NvbXBvdW5kCisJCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQobGFzdEZpZWxkQmluZGluZykgCisJCQkJCSYmIGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKSB7CiAJCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKSkgewotCQkJCQlpZiAoaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpIHsKLQkJCQkJCS8vIHdhcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGZpZWxkIGJpbmRpbmcKLQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAotCQkJCQkJCWxhc3RGaWVsZEJpbmRpbmcsCi0JCQkJCQkJdGhpcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbEZpZWxkKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOwotCQkJCQkJLy8gYXR0ZW1wdGluZyB0byBhc3NpZ24gYSBub24gaW1wbGljaXQgcmVmZXJlbmNlCi0JCQkJCX0KKwkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUluaXRpYWxpemF0aW9uT2ZCbGFua0ZpbmFsRmllbGQobGFzdEZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOwogCQkJCX0KIAkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobGFzdEZpZWxkQmluZGluZyk7Ci0JCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOwogCQkJfSBlbHNlIHsKIAkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbEZpZWxkKGxhc3RGaWVsZEJpbmRpbmcsIHRoaXMpOworCQkJCWlmIChjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGxhc3RGaWVsZEJpbmRpbmcpKSB7IC8vIHByZXRlbmQgaXQgZ290IGFzc2lnbmVkCisJCQkJCWZsb3dJbmZvLm1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJLy8gZXF1aXZhbGVudCB0byB2YWx1ZXNSZXF1aXJlZFttYXhPdGhlckJpbmRpbmdzXQpAQCAtMTY4LDYgKzE2Myw3IEBACiAKIAkJcmV0dXJuIGZsb3dJbmZvOwogCX0KKwkKIAlwdWJsaWMgRmxvd0luZm8gYW5hbHlzZUNvZGUoCiAJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAogCQlGbG93Q29udGV4dCBmbG93Q29udGV4dCwKQEAgLTE4NCwyNiArMTgwLDE2IEBACiAJCQkKIAkJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCiAJCWludCBvdGhlckJpbmRpbmdzQ291bnQgPSBvdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogb3RoZXJCaW5kaW5ncy5sZW5ndGg7Ci0JCWludCBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkOwotCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9IG90aGVyQmluZGluZ3NDb3VudDsKLQkJCXdoaWxlIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID4gMCkgewotCQkJCUZpZWxkQmluZGluZyBvdGhlckJpbmRpbmcgPSBvdGhlckJpbmRpbmdzW2luZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgLSAxXTsKLQkJCQlpZiAob3RoZXJCaW5kaW5nLmlzU3RhdGljKCkpCi0JCQkJCWJyZWFrOyAvLyBubyBsb25nZXIgbmVlZCBhbnkgdmFsdWUgYmVmb3JlIHRoaXMgcG9pbnQKLQkJCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkLS07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50ICsgMTsKLQkJfQorCisJCWJvb2xlYW4gbmVlZFZhbHVlID0gb3RoZXJCaW5kaW5nc0NvdW50ID09IDAgPyB2YWx1ZVJlcXVpcmVkIDogIXRoaXMub3RoZXJCaW5kaW5nc1swXS5pc1N0YXRpYygpOwogCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7CiAJCQljYXNlIEZJRUxEIDogLy8gcmVhZGluZyBhIGZpZWxkCi0JCQkJaWYgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCkgeworCQkJCWlmIChuZWVkVmFsdWUpIHsKIAkJCQkJbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSwgKEZpZWxkQmluZGluZykgYmluZGluZywgdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIDApOwogCQkJCX0KIAkJCQkvLyBjaGVjayBpZiByZWFkaW5nIGEgZmluYWwgYmxhbmsgZmllbGQKIAkJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOwotCQkJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzRmluYWwoKQorCQkJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzQmxhbmtGaW5hbCgpCiAJCQkJCQkmJiAoaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpCiAJCQkJCS8vIHdhcyBhbiBpbXBsaWNpdCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGZpZWxkIGJpbmRpbmcKIAkJCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKQpAQCAtMjE3LDIzICsyMDMsMjggQEAKIAkJCQkJLmlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZykpIHsKIAkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKGxvY2FsQmluZGluZywgdGhpcyk7CiAJCQkJfQotCQkJCWlmICghZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpCi0JCQkJCWxvY2FsQmluZGluZy51c2VkID0gdHJ1ZTsKKwkJCQlpZiAoZmxvd0luZm8uaXNSZWFjaGFibGUoKSkgeworCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CisJCQkJfSBlbHNlIGlmIChsb2NhbEJpbmRpbmcudXNlRmxhZyA9PSBMb2NhbFZhcmlhYmxlQmluZGluZy5VTlVTRUQpIHsKKwkJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5GQUtFX1VTRUQ7CisJCQkJfQogCQl9Ci0JCWlmIChpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDApIHsKKwkJaWYgKG5lZWRWYWx1ZSkgewogCQkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOwogCQkJLy8gb25seSBmb3IgZmlyc3QgYmluZGluZwogCQl9CiAJCWlmIChvdGhlckJpbmRpbmdzICE9IG51bGwpIHsKLQkJCWludCBzdGFydCA9IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCA/IDAgOiBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMTsKLQkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7Ci0JCQkJbWFuYWdlU3ludGhldGljUmVhZEFjY2Vzc0lmTmVjZXNzYXJ5KAotCQkJCQljdXJyZW50U2NvcGUsIAotCQkJCQlvdGhlckJpbmRpbmdzW2ldLCAKLQkJCQkJaSA9PSAwIAotCQkJCQkJPyAoKFZhcmlhYmxlQmluZGluZyliaW5kaW5nKS50eXBlCi0JCQkJCQk6IG90aGVyQmluZGluZ3NbaS0xXS50eXBlLAotCQkJCQlpICsgMSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyQmluZGluZ3NDb3VudDsgaSsrKSB7CisJCQkJbmVlZFZhbHVlID0gaSA8IG90aGVyQmluZGluZ3NDb3VudC0xID8gIW90aGVyQmluZGluZ3NbaSsxXS5pc1N0YXRpYygpIDogdmFsdWVSZXF1aXJlZDsKKwkJCQlpZiAobmVlZFZhbHVlKSB7CisJCQkJCW1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeSgKKwkJCQkJCWN1cnJlbnRTY29wZSwgCisJCQkJCQlvdGhlckJpbmRpbmdzW2ldLCAKKwkJCQkJCWkgPT0gMCAKKwkJCQkJCQk/ICgoVmFyaWFibGVCaW5kaW5nKWJpbmRpbmcpLnR5cGUKKwkJCQkJCQk6IG90aGVyQmluZGluZ3NbaS0xXS50eXBlLAorCQkJCQkJaSArIDEpOworCQkJCX0KIAkJCX0KIAkJfQogCQlyZXR1cm4gZmxvd0luZm87CkBAIC0yNDYsNyArMjM3LDcgQEAKIAkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmc7CiAJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKIAkJaWYgKG1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSA9PSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MKLQkJCSYmIG1ldGhvZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCAhPSBtZXRob2RTY29wZS5Ob3RJbkZpZWxkRGVjbAorCQkJJiYgbWV0aG9kU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4ICE9IE1ldGhvZFNjb3BlLk5vdEluRmllbGREZWNsCiAJCQkmJiBmaWVsZEJpbmRpbmcuaWQgPj0gbWV0aG9kU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4KSB7CiAJCQlpZiAoKCFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSB8fCBtZXRob2RTY29wZS5pc1N0YXRpYykKIAkJCQkmJiB0aGlzLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9PSAxKQpAQCAtMjYyLDcgKzI1Myw3IEBACiAJCUFzc2lnbm1lbnQgYXNzaWdubWVudCwKIAkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CiAJCQkKLQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwogCQlmaWVsZFN0b3JlKGNvZGVTdHJlYW0sIGxhc3RGaWVsZEJpbmRpbmcsIHN5bnRoZXRpY1dyaXRlQWNjZXNzb3IsIHZhbHVlUmVxdWlyZWQpOwogCQkvLyBlcXVpdmFsZW50IHRvIHZhbHVlc1JlcXVpcmVkW21heE90aGVyQmluZGluZ3NdCkBAIC0yNzQsMTkgKzI2NSwyNCBAQAogCQlCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwKIAkJQ29kZVN0cmVhbSBjb2RlU3RyZWFtLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKKwkJCQogCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOwogCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOyAKIAkJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeyAvLyBhcnJheSBsZW5ndGgKIAkJCQkJY29kZVN0cmVhbS5hcnJheWxlbmd0aCgpOwogCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW1wbGljaXRDb252ZXJzaW9uKGltcGxpY2l0Q29udmVyc2lvbik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCQlpZiAoIWxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CisJCQkJCQkJY29kZVN0cmVhbS5pbnZva2VPYmplY3RHZXRDbGFzcygpOworCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQl9CiAJCQkJCQkvLyBpbmxpbmUgdGhlIGxhc3QgZmllbGQgY29uc3RhbnQKIAkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCQl9IGVsc2UgewpAQCAtMzA2LDYgKzMwMiwxMiBAQAogCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCQl9CiAJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsICYmICFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpeworCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCX0KKwkJCQkJCQkKIAkJCX0KIAkJfQogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwpAQCAtMzE4LDcgKzMyMCw3IEBACiAJCWludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLAogCQlib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAkJCQotCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KIAkJCXN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbAogCQkJCT8gbnVsbApAQCAtMzY1LDcgKzM2Nyw3IEBACiAJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKIAkJQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KIAkJCXN5bnRoZXRpY1JlYWRBY2Nlc3NvcnMgPT0gbnVsbAogCQkJCT8gbnVsbApAQCAtNDE2LDkzICs0MTgsODIgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlYWRTZXF1ZW5jZSgKIAkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSwKLQkJYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisJCUNvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCQkJCiAJCS8vIGRldGVybWluZSB0aGUgcmFuayB1bnRpbCB3aGljaCB3ZSBub3cgd2UgZG8gbm90IG5lZWQgYW55IGFjdHVhbCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGFjY2VzcwogCQlpbnQgb3RoZXJCaW5kaW5nc0NvdW50ID0gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyA9PSBudWxsID8gMCA6IG90aGVyQ29kZWdlbkJpbmRpbmdzLmxlbmd0aDsKLQkJaW50IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQ7Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50OwotCQkJd2hpbGUgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPiAwKSB7Ci0JCQkJRmllbGRCaW5kaW5nIG90aGVyQmluZGluZyA9IHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3NbaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDFdOwotCQkJCWlmIChvdGhlckJpbmRpbmcuaXNTdGF0aWMoKSB8fCBvdGhlckJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KQotCQkJCQlicmVhazsgLy8gbm8gbG9uZ2VyIG5lZWQgYW55IHZhbHVlIGJlZm9yZSB0aGlzIHBvaW50Ci0JCQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZC0tOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9IG90aGVyQmluZGluZ3NDb3VudCArIDE7Ci0JCX0KLQkJaWYgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCkgewotCQkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewotCQkJCWNhc2UgRklFTEQgOgotCQkJCQlsYXN0RmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKLQkJCQkJLy8gaWYgZmlyc3QgZmllbGQgaXMgYWN0dWFsbHkgY29uc3RhbnQsIHdlIGNhbiBpbmxpbmUgaXQKLQkJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7Ci0JCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCwgMCk7Ci0JCQkJCQkvLyBubyBpbXBsaWNpdCBjb252ZXJzaW9uCi0JCQkJCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsgLy8gd2lsbCBub3QgZ2VuZXJhdGUgaXQgYWdhaW4KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7Ci0JCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0KLQkJCQkJCQkJY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aCgKLQkJCQkJCQkJCWN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KAotCQkJCQkJCQkJCShiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7Ci0JCQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgewotCQkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAotCQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwotCQkJCQkJfQotCQkJCQl9CisKKwkJYm9vbGVhbiBuZWVkVmFsdWUgPSBvdGhlckJpbmRpbmdzQ291bnQgPT0gMCB8fCAhdGhpcy5vdGhlckJpbmRpbmdzWzBdLmlzU3RhdGljKCk7CisJCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJCWNhc2UgRklFTEQgOgorCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOworCQkJCS8vIGlmIGZpcnN0IGZpZWxkIGlzIGFjdHVhbGx5IGNvbnN0YW50LCB3ZSBjYW4gaW5saW5lIGl0CisJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CiAJCQkJCWJyZWFrOwotCQkJCWNhc2UgTE9DQUwgOiAvLyByZWFkaW5nIHRoZSBmaXJzdCBsb2NhbCB2YXJpYWJsZQotCQkJCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsKLQkJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCQkJCQkvLyByZWd1bGFyIGxvY2FsIHZhcmlhYmxlIHJlYWQKLQkJCQkJaWYgKGxvY2FsQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsb2NhbEJpbmRpbmcuY29uc3RhbnQsIDApOwotCQkJCQkJLy8gbm8gaW1wbGljaXQgY29udmVyc2lvbgorCQkJCX0KKwkJCQlpZiAobmVlZFZhbHVlICYmICFsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG91dGVyIGxvY2FsPwotCQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQkJLy8gb3V0ZXIgbG9jYWwgY2FuIGJlIHJlYWNoZWQgZWl0aGVyIHRocm91Z2ggYSBzeW50aGV0aWMgYXJnIG9yIGEgc3ludGhldGljIGZpZWxkCi0JCQkJCQkJVmFyaWFibGVCaW5kaW5nW10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKGxvY2FsQmluZGluZyk7Ci0JCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCQkJCQkvLyBlbXVsYXRpb24gd2FzIG5vdCBwb3NzaWJsZSAoc2hvdWxkIG5vdCBoYXBwZW4gcGVyIGNvbnN0cnVjdGlvbikKLQkJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhwYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7Ci0JCQkJCQl9CisJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIExPQ0FMIDogLy8gcmVhZGluZyB0aGUgZmlyc3QgbG9jYWwgdmFyaWFibGUKKwkJCQlpZiAoIW5lZWRWYWx1ZSkgYnJlYWs7IC8vIG5vIHZhbHVlIG5lZWRlZAorCQkJCWxhc3RGaWVsZEJpbmRpbmcgPSBudWxsOworCQkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCQkvLyByZWd1bGFyIGxvY2FsIHZhcmlhYmxlIHJlYWQKKwkJCQlpZiAobG9jYWxCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobG9jYWxCaW5kaW5nLmNvbnN0YW50LCAwKTsKKwkJCQkJLy8gbm8gaW1wbGljaXQgY29udmVyc2lvbgorCQkJCX0gZWxzZSB7CisJCQkJCS8vIG91dGVyIGxvY2FsPworCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKKwkJCQkJCS8vIG91dGVyIGxvY2FsIGNhbiBiZSByZWFjaGVkIGVpdGhlciB0aHJvdWdoIGEgc3ludGhldGljIGFyZyBvciBhIHN5bnRoZXRpYyBmaWVsZAorCQkJCQkJVmFyaWFibGVCaW5kaW5nW10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKGxvY2FsQmluZGluZyk7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgbG9jYWxCaW5kaW5nLCBjdXJyZW50U2NvcGUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJCX0KKwkJCQl9CiAJCX0KKwogCQkvLyBhbGwgaW50ZXJtZWRpYXRlIGZpZWxkIGFjY2Vzc2VzIGFyZSByZWFkIGFjY2Vzc2VzCiAJCS8vIG9ubHkgdGhlIGxhc3QgZmllbGQgYmluZGluZyBpcyBhIHdyaXRlIGFjY2VzcwogCQlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyAhPSBudWxsKSB7Ci0JCQlpbnQgc3RhcnQgPSBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID09IDAgPyAwIDogaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCAtIDE7Ci0JCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBvdGhlckJpbmRpbmdzQ291bnQ7IGkrKykgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlckJpbmRpbmdzQ291bnQ7IGkrKykgeworCQkJCUZpZWxkQmluZGluZyBuZXh0RmllbGQgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2ldOwogCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kQmluZGluZyBhY2Nlc3NvciA9Ci0JCQkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljUmVhZEFjY2Vzc29yc1tpXTsKLQkJCQkJaWYgKGFjY2Vzc29yID09IG51bGwpCi0JCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKQotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGxhc3RGaWVsZEJpbmRpbmcpOwotCQkJCQkJZWxzZQotCQkJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCQkJbmVlZFZhbHVlID0gIW5leHRGaWVsZC5pc1N0YXRpYygpOworCQkJCQlpZiAobmVlZFZhbHVlKSB7CisJCQkJCQlNZXRob2RCaW5kaW5nIGFjY2Vzc29yID0KKwkJCQkJCQlzeW50aGV0aWNSZWFkQWNjZXNzb3JzID09IG51bGwgPyBudWxsIDogc3ludGhldGljUmVhZEFjY2Vzc29yc1tpXTsgCisJCQkJCQlpZiAoYWNjZXNzb3IgPT0gbnVsbCkgeworCQkJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgeworCQkJCQkJCQlpZiAodGhpcy5sYXN0RmllbGRCaW5kaW5nICE9IHRoaXMuY29kZWdlbkJpbmRpbmcgJiYgIXRoaXMubGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJCQkJfQorCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCwgMCk7CisJCQkJCQkJfSBlbHNlIGlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZXRmaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlc3RhdGljKGFjY2Vzc29yKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nICE9IHRoaXMubGFzdEZpZWxkQmluZGluZyAmJiAhdGhpcy5sYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpeworCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCisJCQkJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCQkJCX0JCQkJCQkKKwkJCQkJfQogCQkJCX0KLQkJCQlsYXN0RmllbGRCaW5kaW5nID0gb3RoZXJDb2RlZ2VuQmluZGluZ3NbaV07CisJCQkJdGhpcy5sYXN0RmllbGRCaW5kaW5nID0gbmV4dEZpZWxkOwogCQkJfQogCQl9CiAJfQpAQCAtNTM2LDggKzUyNyw3IEBACiAJCWludCBpbmRleCA9IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKIAkJaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CiAJCWlmIChpbmRleCA9PSBsZW5ndGgpIHsgLy8JcmVzdHJpY3RpdmVGbGFnID09IEZJRUxECi0JCQljb25zdGFudCA9Ci0JCQkJRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoKEZpZWxkQmluZGluZykgYmluZGluZywgZmFsc2UsIHRoaXMsIHNjb3BlLCBpbmRleCAtIDEpOworCQkJdGhpcy5jb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcsIHRoaXMsIGZhbHNlLCBzY29wZSk7CiAJCQlyZXR1cm4gdHlwZTsKIAkJfQogCQkvLyBhbGxvY2F0aW9uIG9mIHRoZSBmaWVsZEJpbmRpbmdzIGFycmF5CWFuZCBpdHMgcmVzcGVjdGl2ZSBjb25zdGFudHMKQEAgLTU0Niw5ICs1MzYsOSBAQAogCQlvdGhlckRlcHRocyA9IG5ldyBpbnRbb3RoZXJCaW5kaW5nc0xlbmd0aF07CiAJCQogCQkvLyBmaWxsIHRoZSBmaXJzdCBjb25zdGFudCAodGhlIG9uZSBvZiB0aGUgYmluZGluZykKLQkJY29uc3RhbnQgPQorCQl0aGlzLmNvbnN0YW50ID0KIAkJCSgoYml0cyAmIEZJRUxEKSAhPSAwKQotCQkJCT8gRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoKEZpZWxkQmluZGluZykgYmluZGluZywgZmFsc2UsIHRoaXMsIHNjb3BlLCBpbmRleCAtIDEpCisJCQkJPyBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcigoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCB0aGlzLCBmYWxzZSwgc2NvcGUpCiAJCQkJOiAoKFZhcmlhYmxlQmluZGluZykgYmluZGluZykuY29uc3RhbnQ7CiAJCS8vIHNhdmUgZmlyc3QgZGVwdGgsIHNpbmNlIHdpbGwgYmUgdXBkYXRlZCBieSB2aXNpYmlsaXR5IGNoZWNrcyBvZiBvdGhlciBiaW5kaW5ncwogCQlpbnQgZmlyc3REZXB0aCA9IChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUOwpAQCAtNTY2LDE0ICs1NTYsMjAgQEAKIAkJCWlmIChmaWVsZC5pc1ZhbGlkQmluZGluZygpKSB7CiAJCQkJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkLCBzY29wZSkpCiAJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZCwgdGhpcyk7Ci0JCQkJQ29uc3RhbnQgc29tZUNvbnN0YW50ID0KLQkJCQkJRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoZmllbGQsIGZhbHNlLCB0aGlzLCBzY29wZSwgcGxhY2UpOworCQkJCUNvbnN0YW50IHNvbWVDb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkLCB0aGlzLCBmYWxzZSwgc2NvcGUpOwogCQkJCS8vIGNvbnN0YW50IHByb3BhZ2F0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBhcyBsb25nIGFzIHRoZSBwcmV2aW91cyBvbmUgaXMgYSBjb25zdGFudCB0b28uCi0JCQkJaWYgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewotCQkJCQljb25zdGFudCA9IHNvbWVDb25zdGFudDsKKwkJCQlpZiAodGhpcy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJdGhpcy5jb25zdGFudCA9IHNvbWVDb25zdGFudDsJCQkJCQogCQkJCX0KKwogCQkJCXR5cGUgPSBmaWVsZC50eXBlOwogCQkJCWluZGV4Kys7CisJCQkJCisJCQkJaWYgKGZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQkJLy8gc3RhdGljIGZpZWxkIGFjY2Vzc2VkIHRocm91Z2ggcmVjZWl2ZXI/IGxlZ2FsIGJ1dCB1bm9wdGltYWwgKG9wdGlvbmFsIHdhcm5pbmcpCisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVubmVjZXNzYXJ5UmVjZWl2ZXJGb3JTdGF0aWNGaWVsZCh0aGlzLCBmaWVsZCk7CisJCQkJfQorCQkJCQogCQkJfSBlbHNlIHsKIAkJCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsgLy9kb24ndCBmaWxsIG90aGVyIGNvbnN0YW50cyBzbG90cy4uLgogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRGaWVsZCh0aGlzLCBmaWVsZCwgaW5kZXgsIHR5cGUpOwpAQCAtNTg5LDIzICs1ODUsOCBAQAogCQlpZiAoKChiaXRzICYgRGVwdGhNQVNLKSA9PSAwKSB8fCAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkgewogCQkJcmV0dXJuOwogCQl9Ci0JCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKLQkJCWNhc2UgRklFTEQgOgotCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7Ci0JCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc1N0YXRpYygpCi0JCQkJCXx8IChmaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgY29tcGF0aWJsZVR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpOwotCQkJCS8vIHRoZSBkZWNsYXJpbmdDbGFzcyBvZiB0aGUgdGFyZ2V0IGJpbmRpbmcgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGVuY2xvc2luZwotCQkJCS8vIHR5cGUgYXQgPGRlcHRoPiBsZXZlbHMgb3V0c2lkZQotCQkJCWZvciAoaW50IGkgPSAwLCBkZXB0aCA9IChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUOyBpIDwgZGVwdGg7IGkrKykgewotCQkJCQljb21wYXRpYmxlVHlwZSA9IGNvbXBhdGlibGVUeXBlLmVuY2xvc2luZ1R5cGUoKTsKLQkJCQl9Ci0JCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2Vzcyhjb21wYXRpYmxlVHlwZSwgZmFsc2UpOwotCQkJCS8vIHJlcXVlc3QgY2FzY2FkZSBvZiBhY2Nlc3NlcwotCQkJCWJyZWFrOwotCQkJY2FzZSBMT0NBTCA6Ci0JCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOworCQlpZiAoKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSA9PSBMT0NBTCkgeworCQkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOwogCQl9CiAJfQogCXB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeSgKQEAgLTY1MCwxMiArNjMxLDEyIEBACiAJCX0KIAkJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCiAJCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCi0JCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQogCQlpZiAoZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IGxhc3RSZWNlaXZlclR5cGUKIAkJCSYmICFsYXN0UmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkJCQkKIAkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsCiAJCQkmJiBmaWVsZEJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50Ci0JCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMgogCQkJCQkmJiAoaW5kZXggPiAwIHx8IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA+IDEgfHwgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKQogCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCiAJCQkJfHwgIWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSl7CkBAIC02OTYsMTIgKzY3NywxMiBAQAogCQl9CiAJCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgogCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKIAkJaWYgKGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBsYXN0UmVjZWl2ZXJUeXBlCiAJCQkmJiAhbGFzdFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQkJCiAJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbAogCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAotCQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80CisJCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMudGFyZ2V0SkRLID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzIKIAkJCQkJJiYgKGZpZWxkQmluZGluZyAhPSBiaW5kaW5nIHx8IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA+IDEgfHwgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpKQogCQkJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpCiAJCQkJfHwgIWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5jYW5CZVNlZW5CeShjdXJyZW50U2NvcGUpKSl7CkBAIC03NDgsMTQgKzcyOSwxNCBAQAogCQkJCQkJCQl0aGlzKTsKIAkJCQkJCWJpdHMgJj0gflJlc3RyaWN0aXZlRmxhZ01BU0s7IC8vIGNsZWFyIGJpdHMKIAkJCQkJCWJpdHMgfD0gTE9DQUw7Ci0JCQkJCQlyZXR1cm4gZ2V0T3RoZXJGaWVsZEJpbmRpbmdzKHNjb3BlKTsKKwkJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CiAJCQkJCX0KIAkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKIAkJCQkJCS8vIGNoZWNrIGZvciBmb3J3YXJkIHJlZmVyZW5jZXMKIAkJCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nOwogCQkJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOwogCQkJCQkJaWYgKG1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSA9PSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MKLQkJCQkJCQkmJiBtZXRob2RTY29wZS5maWVsZERlY2xhcmF0aW9uSW5kZXggIT0gbWV0aG9kU2NvcGUuTm90SW5GaWVsZERlY2wKKwkJCQkJCQkmJiBtZXRob2RTY29wZS5maWVsZERlY2xhcmF0aW9uSW5kZXggIT0gTWV0aG9kU2NvcGUuTm90SW5GaWVsZERlY2wKIAkJCQkJCQkmJiBmaWVsZEJpbmRpbmcuaWQgPj0gbWV0aG9kU2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4KSB7CiAJCQkJCQkJaWYgKCghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkgfHwgbWV0aG9kU2NvcGUuaXNTdGF0aWMpCiAJCQkJCQkJCSYmIHRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID09IDEpCkBAIC03NjMsMjAgKzc0NCwyNyBAQAogCQkJCQkJfQogCQkJCQkJYml0cyAmPSB+UmVzdHJpY3RpdmVGbGFnTUFTSzsgLy8gY2xlYXIgYml0cwogCQkJCQkJYml0cyB8PSBGSUVMRDsKLQkJCQkJCXJldHVybiBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOworCQkJCQkJCisJCQkJCQkvLyBjaGVjayBmb3IgZGVwcmVjYXRlZCByZWNlaXZlciB0eXBlCisJCQkJCQkvLyBkZXByZWNhdGlvbiBjaGVjayBmb3IgcmVjZWl2ZXIgdHlwZSBpZiBub3QgZmlyc3QgdG9rZW4KKwkJCQkJCWlmIChpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAxKSB7CisJCQkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHNjb3BlKSkKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUodGhpcy5hY3R1YWxSZWNlaXZlclR5cGUsIHRoaXMpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBnZXRPdGhlckZpZWxkQmluZGluZ3Moc2NvcGUpOwogCQkJCQl9CiAJCQkJCS8vIHRodXMgaXQgd2FzIGEgdHlwZQogCQkJCQliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAvLyBjbGVhciBiaXRzCiAJCQkJCWJpdHMgfD0gVFlQRTsKIAkJCQljYXNlIFRZUEUgOiAvLz09PT09PT09PT09PT1vbmx5IHR5cGUgPT09PT09PT09PT09PT0KLQkJCQkJLy9kZXByZWNhdGVkIHRlc3QKIAkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQoKFR5cGVCaW5kaW5nKSBiaW5kaW5nLCBzY29wZSkpCiAJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSgoVHlwZUJpbmRpbmcpIGJpbmRpbmcsIHRoaXMpOwotCQkJCQlyZXR1cm4gKFR5cGVCaW5kaW5nKSBiaW5kaW5nOworCQkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSAoVHlwZUJpbmRpbmcpIGJpbmRpbmc7CiAJCQl9CiAJCX0KIAkJLy89PT09PT09PWVycm9yIGNhc2VzPT09PT09PT09PT09PT09Ci0JCXJldHVybiB0aGlzLnJlcG9ydEVycm9yKHNjb3BlKTsKKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5yZXBvcnRFcnJvcihzY29wZSk7CiAJfQogCXB1YmxpYyB2b2lkIHNldEZpZWxkSW5kZXgoaW50IGluZGV4KSB7CiAJCXRoaXMuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nID0gaW5kZXg7CkBAIC03OTgsNCArNzg2LDQgQEAKIAlwdWJsaWMgU3RyaW5nIHVuYm91bmRSZWZlcmVuY2VFcnJvck5hbWUoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nKHRva2Vuc1swXSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UuamF2YQppbmRleCBmN2ZiMzc3Li5kMzViODJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFN1cGVyUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRTdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTMxLDYgKzMxLDEwIEBACiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewogCisJCWlmICgodGhpcy5iaXRzICYgUGFyZW50aGVzaXplZE1BU0spICE9IDApIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbih0aGlzKTsKKwkJCXJldHVybiBudWxsOworCQl9CiAJCXN1cGVyLnJlc29sdmVUeXBlKHNjb3BlKTsKIAkJaWYgKGN1cnJlbnRDb21wYXRpYmxlVHlwZSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yIGNhc2UKQEAgLTM5LDcgKzQzLDcgQEAKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdCh0aGlzKTsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBjdXJyZW50Q29tcGF0aWJsZVR5cGUuc3VwZXJjbGFzcygpOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBjdXJyZW50Q29tcGF0aWJsZVR5cGUuc3VwZXJjbGFzcygpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgewpAQCAtNTYsNCArNjAsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVGhpc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggNmEyN2YwNy4uODZkMzhkZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9RdWFsaWZpZWRUaGlzUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMTksMTEgKzE5LDEwIEBACiAJCiAJcHVibGljIFR5cGVSZWZlcmVuY2UgcXVhbGlmaWNhdGlvbjsKIAlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRDb21wYXRpYmxlVHlwZTsKLQotCXB1YmxpYyBRdWFsaWZpZWRUaGlzUmVmZXJlbmNlKFR5cGVSZWZlcmVuY2UgbmFtZSwgaW50IHBvcywgaW50IHNvdXJjZUVuZCkgewotCisJCisJcHVibGljIFF1YWxpZmllZFRoaXNSZWZlcmVuY2UoVHlwZVJlZmVyZW5jZSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwkJc3VwZXIoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAJCXF1YWxpZmljYXRpb24gPSBuYW1lOwotCQl0aGlzLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKIAkJdGhpcy5zb3VyY2VTdGFydCA9IG5hbWUuc291cmNlU3RhcnQ7CiAJfQogCkBAIC0zMiw3ICszMSw2IEBACiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCi0JCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKIAkJcmV0dXJuIGZsb3dJbmZvOwogCX0KIApAQCAtNDIsMzIgKzQwLDkgQEAKIAkJRmxvd0luZm8gZmxvd0luZm8sCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCi0JCWlmICh2YWx1ZVJlcXVpcmVkKSB7Ci0JCQltYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KGN1cnJlbnRTY29wZSk7Ci0JCX0KIAkJcmV0dXJuIGZsb3dJbmZvOwogCX0KIAotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXNzKAotCQlNZXRob2RTY29wZSBtZXRob2RTY29wZSwKLQkJVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSkgewotCi0JCS8vIHRoaXMvc3VwZXIgY2Fubm90IGJlIHVzZWQgaW4gY29uc3RydWN0b3IgY2FsbAotCQlpZiAobWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKLQkJCW1ldGhvZFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKLQkJaWYgKG1ldGhvZFNjb3BlLmlzU3RhdGljKSB7Ci0JCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RFbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSgKLQkJCQl0aGlzLAotCQkJCXRhcmdldFR5cGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQogCS8qKgogCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3IgUXVhbGlmaWVkVGhpc1JlZmVyZW5jZQogCSAqCkBAIC04NCwxMyArNTksOCBAQAogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CiAJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9Ci0JCQkJCWN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudENvbXBhdGlibGVUeXBlKTsKLQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7Ci0JCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0Ci0JCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKLQkJCQl9CisJCQkJCWN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlLCB0cnVlIC8qb25seSBleGFjdCBtYXRjaCovLCBmYWxzZS8qY29uc2lkZXIgZW5jbG9zaW5nIGFyZyovKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQl9IGVsc2UgewogCQkJCS8vIG5vdGhpbmcgcGFydGljdWxhciBhZnRlciBhbGwKIAkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKQEAgLTk5LDY0ICs2OSwzNCBAQAogCQljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogCX0KIAotCXZvaWQgbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgewotCi0JCWN1cnJlbnRTY29wZS5lbXVsYXRlT3V0ZXJBY2Nlc3MoCi0JCQkoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRDb21wYXRpYmxlVHlwZSwKLQkJCWZhbHNlKTsKLQkJLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCi0JfQotCiAJcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAogCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKLQkJVHlwZUJpbmRpbmcgcXVhbGlmaWNhdGlvblRiID0gcXVhbGlmaWNhdGlvbi5yZXNvbHZlVHlwZShzY29wZSk7Ci0JCWlmIChxdWFsaWZpY2F0aW9uVGIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOworCQl0aGlzLnJlc29sdmVkVHlwZSA9IHF1YWxpZmljYXRpb24ucmVzb2x2ZVR5cGUoc2NvcGUpOworCQlpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKIAkJLy8gdGhlIHF1YWxpZmljYXRpb24gTVVTVCBleGFjdGx5IG1hdGNoIHNvbWUgZW5jbG9zaW5nIHR5cGUgbmFtZQogCQkvLyBJdHMgcG9zc2libGUgdG8gcXVhbGlmeSAndGhpcycgYnkgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgY2xhc3MKIAkJaW50IGRlcHRoID0gMDsKLQkJY3VycmVudENvbXBhdGlibGVUeXBlID0gc2NvcGUucmVmZXJlbmNlVHlwZSgpLmJpbmRpbmc7Ci0JCXdoaWxlIChjdXJyZW50Q29tcGF0aWJsZVR5cGUgIT0gbnVsbAotCQkJJiYgY3VycmVudENvbXBhdGlibGVUeXBlICE9IHF1YWxpZmljYXRpb25UYikgeworCQl0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZSA9IHNjb3BlLnJlZmVyZW5jZVR5cGUoKS5iaW5kaW5nOworCQl3aGlsZSAodGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUgIT0gbnVsbAorCQkJJiYgdGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUgIT0gdGhpcy5yZXNvbHZlZFR5cGUpIHsKIAkJCWRlcHRoKys7Ci0JCQljdXJyZW50Q29tcGF0aWJsZVR5cGUgPQotCQkJCWN1cnJlbnRDb21wYXRpYmxlVHlwZS5pc1N0YXRpYygpID8gbnVsbCA6IGN1cnJlbnRDb21wYXRpYmxlVHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCQl0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZSA9IHRoaXMuY3VycmVudENvbXBhdGlibGVUeXBlLmlzU3RhdGljKCkgPyBudWxsIDogdGhpcy5jdXJyZW50Q29tcGF0aWJsZVR5cGUuZW5jbG9zaW5nVHlwZSgpOwogCQl9CiAJCWJpdHMgJj0gfkRlcHRoTUFTSzsgLy8gZmx1c2ggcHJldmlvdXMgZGVwdGggaWYgYW55CQkJCiAJCWJpdHMgfD0gKGRlcHRoICYgMHhGRikgPDwgRGVwdGhTSElGVDsgLy8gZW5jb2RlZCBkZXB0aCBpbnRvIDggYml0cwogCi0JCWlmIChjdXJyZW50Q29tcGF0aWJsZVR5cGUgPT0gbnVsbCkgewotCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UoCi0JCQkJdGhpcywKLQkJCQlxdWFsaWZpY2F0aW9uVGIpOwotCQkJcmV0dXJuIG51bGw7CisJCWlmICh0aGlzLmN1cnJlbnRDb21wYXRpYmxlVHlwZSA9PSBudWxsKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub1N1Y2hFbmNsb3NpbmdJbnN0YW5jZSh0aGlzLnJlc29sdmVkVHlwZSwgdGhpcywgZmFsc2UpOworCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQl9CiAKIAkJLy8gRW5zdXJlIG9uZSBjYW5ub3Qgd3JpdGUgY29kZSBsaWtlOiBCKCkgeyBzdXBlcihCLnRoaXMpOyB9CiAJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQlpZiAoIWNoZWNrQWNjZXNzKHNjb3BlLm1ldGhvZFNjb3BlKCksIHF1YWxpZmljYXRpb25UYikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBDb3VsZCBhbHNvIGJlIHRhcmdldGluZyBhbiBlbmNsb3NpbmcgaW5zdGFuY2UgaW5zaWRlIGEgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbgotCQkJLy8JY2xhc3MgWCB7Ci0JCQkvLwkJcHVibGljIFgoaW50IGkpIHsKLQkJCS8vCQkJdGhpcyhuZXcgT2JqZWN0KCkgeyBPYmplY3Qgb2JqID0gWC50aGlzOyB9KTsKLQkJCS8vCQl9Ci0JCQkvLwl9Ci0KLQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gc2NvcGUubWV0aG9kU2NvcGUoKTsKLQkJCXdoaWxlIChtZXRob2RTY29wZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG1ldGhvZFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSA9PSBjdXJyZW50Q29tcGF0aWJsZVR5cGUpIHsKLQkJCQkJaWYgKCF0aGlzLmNoZWNrQWNjZXNzKG1ldGhvZFNjb3BlLCBxdWFsaWZpY2F0aW9uVGIpKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQltZXRob2RTY29wZSA9IG1ldGhvZFNjb3BlLnBhcmVudC5tZXRob2RTY29wZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdWFsaWZpY2F0aW9uVGI7CisJCQljaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKTsKKwkJfSAvLyBpZiBkZXB0aD4wLCBwYXRoIGVtdWxhdGlvbiB3aWxsIGRpYWdub3NlIGJhZCBzY2VuYXJpaQorCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKSB7CkBAIC0xNzMsNCArMTEzLDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1F1YWxpZmllZFR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDJkZjhmODEuLjMyNDRkYjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTIyLDkgKzIyLDkgQEAKIAlzb3VyY2VTdGFydCA9IChpbnQpIChzb3VyY2VQb3NpdGlvbnNbMF0+Pj4zMikgOwogCXNvdXJjZUVuZCA9IChpbnQpKHNvdXJjZVBvc2l0aW9uc1tzb3VyY2VQb3NpdGlvbnMubGVuZ3RoLTFdICYgMHgwMDAwMDAwMEZGRkZGRkZGTCApIDsKIH0KLXB1YmxpYyBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKGNoYXJbXVtdIHNvdXJjZXMgLCBUeXBlQmluZGluZyB0YiAsIGxvbmdbXSBwb3NzKSB7CitwdWJsaWMgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShjaGFyW11bXSBzb3VyY2VzICwgVHlwZUJpbmRpbmcgdHlwZSAsIGxvbmdbXSBwb3NzKSB7CiAJdGhpcyhzb3VyY2VzLHBvc3MpOwotCWJpbmRpbmcgPSB0YjsKKwl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGU7CiB9CiBwdWJsaWMgVHlwZVJlZmVyZW5jZSBjb3B5RGltcyhpbnQgZGltKXsKIAkvL3JldHVybiBhIHR5cGUgcmVmZXJlbmNlIGNvcHkgb2YgbWUgd2l0aCBzb21lIGRpbWVuc2lvbnMKQEAgLTMzLDggKzMzLDggQEAKIAlyZXR1cm4gbmV3IEFycmF5UXVhbGlmaWVkVHlwZVJlZmVyZW5jZSh0b2tlbnMsbnVsbCxkaW0sc291cmNlUG9zaXRpb25zKSA7CiB9CiBwdWJsaWMgVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoU2NvcGUgc2NvcGUpIHsKLQlpZiAoYmluZGluZyAhPSBudWxsKQotCQlyZXR1cm4gYmluZGluZzsKKwlpZiAodGhpcy5yZXNvbHZlZFR5cGUgIT0gbnVsbCkKKwkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCXJldHVybiBzY29wZS5nZXRUeXBlKHRva2Vucyk7CiB9CiBwdWJsaWMgY2hhcltdW10gZ2V0VHlwZU5hbWUoKXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JlZmVyZW5jZS5qYXZhCmluZGV4IDA5MjlkOGYuLjMzNjUyYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZWZlcmVuY2UuamF2YQpAQCAtMSwyMCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZSBleHRlbmRzIEV4cHJlc3Npb24gIHsKIC8qKgpAQCAtMjMsOSArMjEsOCBAQAogcHVibGljIFJlZmVyZW5jZSgpIHsKIAlzdXBlcigpOwogfQotcHVibGljIEZsb3dJbmZvIGFuYWx5c2VBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBGbG93Q29udGV4dCBmbG93Q29udGV4dCwgRmxvd0luZm8gZmxvd0luZm8sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiBpc0NvbXBvdW5kKSB7Ci0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImFzdC52YXJpYWJsZVNob3VsZFByb3ZpZGUiKSk7IC8vJE5PTi1OTFMtMSQKLX0KK3B1YmxpYyBhYnN0cmFjdCBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gaXNDb21wb3VuZCk7CisKIHB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAJcmV0dXJuIGZsb3dJbmZvOwogfQpAQCAtNjQsMTMgKzYxLDEwIEBACiAJCX0KIAl9CiB9Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0LmNvbXBvdW5kUHJlU2hvdWxkUHJvdmlkZSIpKTsgLy8kTk9OLU5MUy0xJAotfQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0LmNvbXBvdW5kVmFyaWFibGVTaG91bGRQcm92aWRlIikpOyAvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJhc3QucG9zdEluY3JTaG91bGRQcm92aWRlIikpOyAvLyROT04tTkxTLTEkCi19CitwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpOworCitwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCk7CisKK3B1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKTsKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvUmV0dXJuU3RhdGVtZW50LmphdmEKaW5kZXggZGE5ZGJjNC4uY2I0N2MyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1JldHVyblN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTQxLDcgKzQxLDcgQEAKIAlpbnQgc3ViSW5kZXggPSAwLCBtYXhTdWIgPSA1OwogCWJvb2xlYW4gc2F2ZVZhbHVlTmVlZGVkID0gZmFsc2U7CiAJYm9vbGVhbiBoYXNWYWx1ZVRvU2F2ZSA9IGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uLmNvbnN0YW50ID09IE5vdEFDb25zdGFudDsKLQl3aGlsZSAodHJ1ZSkgeworCWRvIHsKIAkJQXN0Tm9kZSBzdWI7CiAJCWlmICgoc3ViID0gdHJhdmVyc2VkQ29udGV4dC5zdWJSb3V0aW5lKCkpICE9IG51bGwpIHsKIAkJCWlmICh0aGlzLnN1YnJvdXRpbmVzID09IG51bGwpewpAQCAtNTYsMzMgKzU2LDI4IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJQXN0Tm9kZSBub2RlOworCQl0cmF2ZXJzZWRDb250ZXh0LnJlY29yZFJldHVybkZyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwogCisJCUFzdE5vZGUgbm9kZTsKIAkJaWYgKChub2RlID0gdHJhdmVyc2VkQ29udGV4dC5hc3NvY2lhdGVkTm9kZSkgaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQpIHsKIAkJCWlzU3luY2hyb25pemVkID0gdHJ1ZTsKIAotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcnlTdGF0ZW1lbnQgJiYgaGFzVmFsdWVUb1NhdmUpIHsKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgVHJ5U3RhdGVtZW50KSB7CisJCQlUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gKFRyeVN0YXRlbWVudCkgbm9kZTsKKwkJCWZsb3dJbmZvLmFkZEluaXRpYWxpemF0aW9uc0Zyb20odHJ5U3RhdGVtZW50LnN1YlJvdXRpbmVJbml0cyk7IC8vIGNvbGxlY3QgaW5pdHMKKwkJCWlmIChoYXNWYWx1ZVRvU2F2ZSkgewogCQkJCWlmICh0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlID09IG51bGwpeyAvLyBjbG9zZXN0IHN1YnJvdXRpbmUgc2VjcmV0IHZhcmlhYmxlIGlzIHVzZWQKLQkJCQkJcHJlcGFyZVNhdmVWYWx1ZUxvY2F0aW9uKChUcnlTdGF0ZW1lbnQpbm9kZSk7CisJCQkJCXByZXBhcmVTYXZlVmFsdWVMb2NhdGlvbih0cnlTdGF0ZW1lbnQpOwogCQkJCX0KIAkJCQlzYXZlVmFsdWVOZWVkZWQgPSB0cnVlOworCQkJfQogCiAJCX0gZWxzZSBpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQpIHsKIAkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90UmV0dXJuSW5Jbml0aWFsaXplcih0aGlzKTsKLQkJCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwkJCQlyZXR1cm4gRmxvd0luZm8uREVBRF9FTkQ7CiAJCX0KLQotCQkvLyByZW1lbWJlciB0aGUgaW5pdGlhbGl6YXRpb24gYXQgdGhpcwotCQkvLyBwb2ludCBmb3IgZGVhbGluZyB3aXRoIGJsYW5rIGZpbmFsIHZhcmlhYmxlcy4KLQkJdHJhdmVyc2VkQ29udGV4dC5yZWNvcmRSZXR1cm5Gcm9tKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKLQotCQlGbG93Q29udGV4dCBwYXJlbnRDb250ZXh0OwotCQlpZiAoKHBhcmVudENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudCkgPT0gbnVsbCkgeyAvLyB0b3AtY29udGV4dAotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQl0cmF2ZXJzZWRDb250ZXh0ID0gcGFyZW50Q29udGV4dDsKLQkJfQotCX0KKwl9IHdoaWxlICgodHJhdmVyc2VkQ29udGV4dCA9IHRyYXZlcnNlZENvbnRleHQucGFyZW50KSAhPSBudWxsKTsKKwkKIAkvLyByZXNpemUgc3Vicm91dGluZXMKIAlpZiAoKHN1YnJvdXRpbmVzICE9IG51bGwpICYmIChzdWJJbmRleCAhPSBtYXhTdWIpKSB7CiAJCVN5c3RlbS5hcnJheWNvcHkoc3Vicm91dGluZXMsIDAsIChzdWJyb3V0aW5lcyA9IG5ldyBBc3ROb2RlW3N1YkluZGV4XSksIDAsIHN1YkluZGV4KTsKQEAgLTkxLDcgKzg2LDcgQEAKIAkvLyBzZWNyZXQgbG9jYWwgdmFyaWFibGUgZm9yIHJldHVybiB2YWx1ZSAobm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgb2NjdXIgaW4gYSByZWFsIG1ldGhvZCkKIAlpZiAoc2F2ZVZhbHVlTmVlZGVkKSB7CiAJCWlmICh0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuc2F2ZVZhbHVlVmFyaWFibGUudXNlZCA9IHRydWU7CisJCQl0aGlzLnNhdmVWYWx1ZVZhcmlhYmxlLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOwogCQl9CiAJfSBlbHNlIHsKIAkJdGhpcy5zYXZlVmFsdWVWYXJpYWJsZSA9IG51bGw7CkBAIC05OSw3ICs5NCw3IEBACiAJCQl0aGlzLmV4cHJlc3Npb24uYml0cyB8PSBWYWx1ZUZvclJldHVybk1BU0s7CiAJCX0KIAl9Ci0JcmV0dXJuIEZsb3dJbmZvLkRlYWRFbmQ7CisJcmV0dXJuIEZsb3dJbmZvLkRFQURfRU5EOwogfQogIAogLyoqCkBAIC0xMTgsNyArMTEzLDcgQEAKIAkvLyBnZW5lcmF0ZSB0aGUgZXhwcmVzc2lvbgogCWlmICgoZXhwcmVzc2lvbiAhPSBudWxsKSAmJiAoZXhwcmVzc2lvbi5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQpKSB7CiAJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgbmVlZFZhbHVlKCkpOyAvLyBubyB2YWx1ZSBuZWVkZWQgaWYgbm9uLXJldHVybmluZyBzdWJyb3V0aW5lCi0JCWdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCQlnZW5lcmF0ZVN0b3JlU2F2ZVZhbHVlSWZOZWNlc3NhcnkoY29kZVN0cmVhbSk7CiAJfQogCQogCS8vIGdlbmVyYXRpb24gb2YgY29kZSByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgdGhlIGZpbmFsbHkgYmxvY2tzIGluIHNlcXVlbmNlCkBAIC0xNDQsMTAgKzEzOSwxMCBAQAogCQogCWlmICgoZXhwcmVzc2lvbiAhPSBudWxsKSAmJiAoZXhwcmVzc2lvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKSB7CiAJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChleHByZXNzaW9uLmNvbnN0YW50LCBleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbik7Ci0JCWdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwkJCisJCWdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShjb2RlU3RyZWFtKTsJCQogCX0KIAkvLyBvdXRwdXQgdGhlIHN1aXRhYmxlIHJldHVybiBieXRlY29kZSBvciB3cmFwIHRoZSB2YWx1ZSBpbnNpZGUgYSBkZXNjcmlwdG9yIGZvciBkb2l0cwotCXRoaXMuZ2VuZXJhdGVSZXR1cm5CeXRlY29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOworCXRoaXMuZ2VuZXJhdGVSZXR1cm5CeXRlY29kZShjb2RlU3RyZWFtKTsKIAkKIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogfQpAQCAtMTU1LDcgKzE1MCw3IEBACiAgKiBEdW1wIHRoZSBzdWl0YWJsZSByZXR1cm4gYnl0ZWNvZGUgZm9yIGEgcmV0dXJuIHN0YXRlbWVudAogICoKICAqLwotcHVibGljIHZvaWQgZ2VuZXJhdGVSZXR1cm5CeXRlY29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVJldHVybkJ5dGVjb2RlKENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCiAJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQljb2RlU3RyZWFtLnJldHVybl8oKTsKQEAgLTE3OSw4ICsxNzQsNyBAQAogCQl9CiAJfQogfQotcHVibGljIHZvaWQgZ2VuZXJhdGVTdG9yZVNhdmVWYWx1ZUlmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pewotCitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN0b3JlU2F2ZVZhbHVlSWZOZWNlc3NhcnkoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKXsKIAlpZiAoc2F2ZVZhbHVlVmFyaWFibGUgIT0gbnVsbCkgY29kZVN0cmVhbS5zdG9yZShzYXZlVmFsdWVWYXJpYWJsZSwgZmFsc2UpOwogfQogcHVibGljIGJvb2xlYW4gbmVlZFZhbHVlKCl7CkBAIC0yMjMsNyArMjE3LDcgQEAKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYXR0ZW1wdFRvUmV0dXJuVm9pZFZhbHVlKHRoaXMpOwogCQlyZXR1cm47CiAJfQotCWlmIChtZXRob2RUeXBlICE9IG51bGwgJiYgc2NvcGUuYXJlVHlwZXNDb21wYXRpYmxlKGV4cHJlc3Npb25UeXBlLCBtZXRob2RUeXBlKSkgeworCWlmIChtZXRob2RUeXBlICE9IG51bGwgJiYgZXhwcmVzc2lvblR5cGUuaXNDb21wYXRpYmxlV2l0aChtZXRob2RUeXBlKSkgewogCQlleHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcobWV0aG9kVHlwZSwgZXhwcmVzc2lvblR5cGUpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQppbmRleCAzZWJmZmYyLi5kM2Y1NmRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0zNiwxMCArMzYsMTAgQEAKIAkJc3dpdGNoIChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgewogCQkJY2FzZSBGSUVMRCA6IC8vIHJlYWRpbmcgYSBmaWVsZAogCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7Ci0JCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc0ZpbmFsKCkgJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChmaWVsZEJpbmRpbmcpKSB7CisJCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc0JsYW5rRmluYWwoKSAKKwkJCQkJCSYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgewogCQkJCQlpZiAoIWZsb3dJbmZvLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKIAkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7Ci0JCQkJCQkvLyB3ZSBjb3VsZCBpbXByb3ZlIGVycm9yIG1zZyBoZXJlIHRlbGxpbmcgImNhbm5vdCB1c2UgY29tcG91bmQgYXNzaWdubWVudCBvbiBmaW5hbCBibGFuayBmaWVsZCIKIAkJCQkJfQogCQkJCX0KIAkJCQltYW5hZ2VTeW50aGV0aWNSZWFkQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKQEAgLTUxLDcgKzUxLDExIEBACiAJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZShsb2NhbEJpbmRpbmcsIHRoaXMpOwogCQkJCQkvLyB3ZSBjb3VsZCBpbXByb3ZlIGVycm9yIG1zZyBoZXJlIHRlbGxpbmcgImNhbm5vdCB1c2UgY29tcG91bmQgYXNzaWdubWVudCBvbiBmaW5hbCBsb2NhbCB2YXJpYWJsZSIKIAkJCQl9Ci0JCQkJaWYgKCFmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkgbG9jYWxCaW5kaW5nLnVzZWQgPSB0cnVlOworCQkJCWlmIChmbG93SW5mby5pc1JlYWNoYWJsZSgpKSB7CisJCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgeworCQkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLkZBS0VfVVNFRDsKKwkJCQl9CiAJCX0KIAl9CiAJaWYgKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiAhPSBudWxsKSB7CkBAIC02NSwxMiArNjksMTMgQEAKIAkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmc7CiAJCQlpZiAoKGZpZWxkQmluZGluZyA9IChGaWVsZEJpbmRpbmcpIGJpbmRpbmcpLmlzRmluYWwoKSkgewogCQkJCS8vIGluc2lkZSBhIGNvbnRleHQgd2hlcmUgYWxsb3dlZAotCQkJCWlmIChjdXJyZW50U2NvcGUuYWxsb3dCbGFua0ZpbmFsRmllbGRBc3NpZ25tZW50KGZpZWxkQmluZGluZykpIHsKKwkJCQlpZiAoIWlzQ29tcG91bmQgJiYgZmllbGRCaW5kaW5nLmlzQmxhbmtGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgewogCQkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkQmluZGluZykpIHsKIAkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmbG93Q29udGV4dC5yZWNvcmRTZXR0aW5nRmluYWwoZmllbGRCaW5kaW5nLCB0aGlzKTsJCQkJCQkKIAkJCQkJfQogCQkJCQlmbG93SW5mby5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGRCaW5kaW5nKTsKLQkJCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGZpZWxkQmluZGluZywgdGhpcyk7CQkJCQkJCiAJCQkJfSBlbHNlIHsKIAkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxGaWVsZChmaWVsZEJpbmRpbmcsIHRoaXMpOwogCQkJCX0KQEAgLTg1LDEwICs5MCwxMyBAQAogCQkJfQogCQkJaWYgKGxvY2FsQmluZGluZy5pc0ZpbmFsKCkpIHsKIAkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spID09IDApIHsKLQkJCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcpKSB7CisJCQkJCWlmIChpc0NvbXBvdW5kIHx8ICFsb2NhbEJpbmRpbmcuaXNCbGFua0ZpbmFsKCkpeworCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEFzc2lnblRvRmluYWxMb2NhbChsb2NhbEJpbmRpbmcsIHRoaXMpOworCQkJCQl9IGVsc2UgaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcpKSB7CiAJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwobG9jYWxCaW5kaW5nLCB0aGlzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZsb3dDb250ZXh0LnJlY29yZFNldHRpbmdGaW5hbChsb2NhbEJpbmRpbmcsIHRoaXMpOwkJCQkJCQkJCiAJCQkJCX0KLQkJCQkJZmxvd0NvbnRleHQucmVjb3JkU2V0dGluZ0ZpbmFsKGxvY2FsQmluZGluZywgdGhpcyk7CQkJCQkJCQkKIAkJCQl9IGVsc2UgewogCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90QXNzaWduVG9GaW5hbE91dGVyTG9jYWwobG9jYWxCaW5kaW5nLCB0aGlzKTsKIAkJCQl9CkBAIC0xMTAsNyArMTE4LDggQEAKIAkJCX0KIAkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAogCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKLQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc0JsYW5rRmluYWwoKSAKKwkJCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChmaWVsZEJpbmRpbmcpKSB7CiAJCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpKSB7CiAJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CiAJCQkJfQpAQCAtMTIxLDcgKzEzMCwxMSBAQAogCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbEJpbmRpbmcgPSAoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpKSB7CiAJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnVuaW5pdGlhbGl6ZWRMb2NhbFZhcmlhYmxlKGxvY2FsQmluZGluZywgdGhpcyk7CiAJCQl9Ci0JCQlpZiAoIWZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKSBsb2NhbEJpbmRpbmcudXNlZCA9IHRydWU7CQkJCisJCQlpZiAoZmxvd0luZm8uaXNSZWFjaGFibGUoKSkgeworCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKKwkJCX0gZWxzZSBpZiAobG9jYWxCaW5kaW5nLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVU5VU0VEKSB7CisJCQkJbG9jYWxCaW5kaW5nLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5GQUtFX1VTRUQ7CisJCQl9CiAJfQogCWlmICh2YWx1ZVJlcXVpcmVkKSB7CiAJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKQEAgLTEzNyw0MiArMTUwLDIwIEBACiAJaWYgKCEoKEZpZWxkQmluZGluZykgYmluZGluZykuaXNTdGF0aWMoKSkgewogCQkvLyBtdXN0IGNoZWNrIGZvciB0aGUgc3RhdGljIHN0YXR1cy4uLi4KIAkJaWYgKHNjb3BlLm1ldGhvZFNjb3BlKCkuaXNTdGF0aWMpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnN0YXRpY0ZpZWxkQWNjZXNzVG9Ob25TdGF0aWNWYXJpYWJsZSgKLQkJCQl0aGlzLAotCQkJCWZpZWxkQmluZGluZyk7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5zdGF0aWNGaWVsZEFjY2Vzc1RvTm9uU3RhdGljVmFyaWFibGUodGhpcywgZmllbGRCaW5kaW5nKTsKIAkJCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwotCQkJcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gZmllbGRCaW5kaW5nLnR5cGU7CiAJCX0KIAl9Ci0JY29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZEJpbmRpbmcsIHRydWUsIHRoaXMsIHNjb3BlLCAwKTsKKwljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkQmluZGluZywgdGhpcywgdHJ1ZSwgc2NvcGUpOworCiAJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUpKQogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKIAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvL2N5Y2xlIGFyZSBmb3JiaWRkZW4gT05MWSB3aXRoaW4gdGhlIHNhbWUgY2xhc3MuLi53aHkgPz8/Pz8/IChwb29yIGphdmFjLi4uLikKLQkvL0N5Y2xlIGNhbiBiZSBkb25lIHVzaW5nIGNyb3NzIGNsYXNzIHJlZiBidXQgbm90IGRpcmVjdCBpbnRvIGEgc2FtZSBjbGFzcyByZWZlcmVuY2UgPz8/PwotCS8vY2xhc3MgQSB7CXN0YXRpYyBpbnQgayA9IEIuaysxO30KLQkvL2NsYXNzIEIgewlzdGF0aWMgaW50IGsgPSBBLmsrMjt9Ci0JLy9UaGUgay1jeWNsZSBpbiB0aGlzIGV4YW1wbGUgaXMgdmFsaWQuCi0KLQkvL2NsYXNzIEMgeyBzdGF0aWMgaW50IGsgPSBrICsgMSA7fQotCS8vaGVyZSBpdCBpcyBmb3JiaWRkZW4gISA/Pz8/Ci0JLy9idXQgdGhlIG5leHQgb25lIGlzIHZhbGlkICEhIQotCS8vY2xhc3MgQyB7IHN0YXRpYyBpbnQgayA9IEMuayArIDE7fQotCi0JLy9ub3RpY2UgdGhhdCB0aGUgbmV4dCBvbmUgaXMgYWxzbyB2YWxpZCA/IT8hCi0JLy9jbGFzcyBBIHsJc3RhdGljIGludCBrID0gZm9vKCkuaysxIDsgc3RhdGljIEEgZm9vKCl7cmV0dXJuIG5ldyBBKCk7fX0KLQotCS8vZm9yIGFsbCB0aGVzZSByZWFzb25zLCB0aGUgbmV4dCBwaWVjZSBvZiBjb2RlIGlzIG9ubHkgaGVyZSBhbmQgbm90Ci0JLy9jb21tdW4gZm9yIGFsbCBGaWVsZFJlZiBhbmQgUXVhbGlmaWVkTmFtZVJlZi4uLi4oaS5lLiBpbiB0aGUgZ2V0RmllbGQoLi4pIEFQSS4uLi4uCi0KLQkvL2luc3RhbmNlIGZpZWxkIG1heSByZWZlciB0byBmb3J3YXJkIHN0YXRpYyBmaWVsZCwgbGlrZSBpbgotCS8vaW50IGkgPSBzdGF0aWNJOwotCS8vc3RhdGljIGludCBzdGF0aWNJID0gMiA7Ci0KIAlNZXRob2RTY29wZSBtcyA9IHNjb3BlLm1ldGhvZFNjb3BlKCk7Ci0JaWYgKG1zLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSA9PSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MKLQkJJiYgbXMuZmllbGREZWNsYXJhdGlvbkluZGV4ICE9IG1zLk5vdEluRmllbGREZWNsCisJaWYgKCh0aGlzLmJpdHMgJiBJc1N0cmljdGx5QXNzaWduZWRNQVNLKSA9PSAwCisJCSYmIG1zLmVuY2xvc2luZ1NvdXJjZVR5cGUoKSA9PSBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MKKwkJJiYgbXMuZmllbGREZWNsYXJhdGlvbkluZGV4ICE9IE1ldGhvZFNjb3BlLk5vdEluRmllbGREZWNsCiAJCSYmIGZpZWxkQmluZGluZy5pZCA+PSBtcy5maWVsZERlY2xhcmF0aW9uSW5kZXgpIHsKIAkJLy9pZiB0aGUgZmllbGQgaXMgc3RhdGljIGFuZCBtcyBpcyBub3QgLi4uLiB0aGVuIGl0IGlzIHZhbGlkCiAJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkgfHwgbXMuaXNTdGF0aWMpCkBAIC0yMTEsMTMgKzIwMiw5IEBACiAJCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOwogCQkJaWYgKCEoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZykuaXNTdGF0aWMoKSkgeyAvLyBuZWVkIGEgcmVjZWl2ZXI/CiAJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7Ci0JCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKLQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0Ci0JCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKLQkJCQkJfQorCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCh0YXJnZXRUeXBlLCB0cnVlIC8qb25seSBleGFjdCBtYXRjaCovLCBmYWxzZS8qY29uc2lkZXIgZW5jbG9zaW5nIGFyZyovKTsKKwkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJdGhpcy5nZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCQkJCX0KQEAgLTI1NCw2ICsyNDEsMTQgQEAKIAkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfQorCQkJLy8gMjY5MDMsIG5lZWQgZXh0cmEgY2FzdCB0byBzdG9yZSBudWxsIGluIGFycmF5IGxvY2FsIHZhcgkKKwkJCWlmIChsb2NhbEJpbmRpbmcudHlwZS5pc0FycmF5VHlwZSgpIAorCQkJCSYmIChhc3NpZ25tZW50LmV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlID09IE51bGxCaW5kaW5nCS8vIGFycmF5TG9jID0gbnVsbAorCQkJCQl8fCAoKGFzc2lnbm1lbnQuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKQkvLyBhcnJheUxvYyA9ICh0eXBlW10pbnVsbAorCQkJCQkJJiYgKCgoQ2FzdEV4cHJlc3Npb24pYXNzaWdubWVudC5leHByZXNzaW9uKS5pbm5lcm1vc3RDYXN0ZWRFeHByZXNzaW9uKCkucmVzb2x2ZWRUeXBlID09IE51bGxCaW5kaW5nKSkpKXsKKwkJCQljb2RlU3RyZWFtLmNoZWNrY2FzdChsb2NhbEJpbmRpbmcudHlwZSk7IAorCQkJfQorCQkJCiAJCQkvLyBub3JtYWwgbG9jYWwgYXNzaWdubWVudCAoc2luY2UgY2Fubm90IHN0b3JlIGluIG91dGVyIGxvY2FsIHdoaWNoIGFyZSBmaW5hbCBsb2NhdGlvbnMpCiAJCQljb2RlU3RyZWFtLnN0b3JlKGxvY2FsQmluZGluZywgdmFsdWVSZXF1aXJlZCk7CiAJCQlpZiAoKGJpdHMgJiBGaXJzdEFzc2lnbm1lbnRUb0xvY2FsTUFTSykgIT0gMCkgeyAvLyBmb3IgbG9jYWwgdmFyaWFibGUgZGVidWcgYXR0cmlidXRlcwpAQCAtMjgwLDEzICsyNzUsOSBAQAogCQkJCQkJYm9vbGVhbiBpc1N0YXRpYzsKIAkJCQkJCWlmICghKGlzU3RhdGljID0gZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpKSB7CiAJCQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7Ci0JCQkJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKLQkJCQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0Ci0JCQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKLQkJCQkJCQkJfQorCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCh0YXJnZXRUeXBlLCB0cnVlIC8qb25seSBleGFjdCBtYXRjaCovLCBmYWxzZS8qY29uc2lkZXIgZW5jbG9zaW5nIGFyZyovKTsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKIAkJCQkJCQl9CkBAIC0zMTQsMTIgKzMwNSw3IEBACiAJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewogCQkJCQkJLy8gb3V0ZXIgbG9jYWwgY2FuIGJlIHJlYWNoZWQgZWl0aGVyIHRocm91Z2ggYSBzeW50aGV0aWMgYXJnIG9yIGEgc3ludGhldGljIGZpZWxkCiAJCQkJCQlWYXJpYWJsZUJpbmRpbmdbXSBwYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgobG9jYWxCaW5kaW5nKTsKLQkJCQkJCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQkJCQkvLyBlbXVsYXRpb24gd2FzIG5vdCBwb3NzaWJsZSAoc2hvdWxkIG5vdCBoYXBwZW4gcGVyIGNvbnN0cnVjdGlvbikKLQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhwYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQkJfQorCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGxvY2FsQmluZGluZywgY3VycmVudFNjb3BlKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgcmVhZAogCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CkBAIC0zNjMsMTMgKzM0OSw5IEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKLQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgewotCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKLQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQl9CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKKwkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQl9IGVsc2UgewogCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKIAkJCQl9CkBAIC00NjgsMTMgKzQ1MCw5IEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKLQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgewotCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKLQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQl9CisJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKKwkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQl9IGVsc2UgewogCQkJCQljb2RlU3RyZWFtLmFsb2FkXzAoKTsKIAkJCQl9CkBAIC01NDIsMjAgKzUyMCw4IEBACiAJLy9JZiBpbmxpbmFibGUgZmllbGQsIGZvcmdldCB0aGUgYWNjZXNzIGVtdWxhdGlvbiwgdGhlIGNvZGUgZ2VuIHdpbGwgZGlyZWN0bHkgdGFyZ2V0IGl0CiAJaWYgKCgoYml0cyAmIERlcHRoTUFTSykgPT0gMCkgfHwgKGNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkpIHJldHVybjsKIAotCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKLQkJY2FzZSBGSUVMRCA6Ci0JCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nOwotCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKWJpbmRpbmcpLmlzU3RhdGljKCkgfHwgKGZpZWxkQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpKSByZXR1cm47Ci0JCQlSZWZlcmVuY2VCaW5kaW5nIGNvbXBhdGlibGVUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJCS8vIHRoZSBkZWNsYXJpbmdDbGFzcyBvZiB0aGUgdGFyZ2V0IGJpbmRpbmcgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGVuY2xvc2luZwotCQkJLy8gdHlwZSBhdCA8ZGVwdGg+IGxldmVscyBvdXRzaWRlCi0JCQlmb3IgKGludCBpID0gMCwgZGVwdGggPSAoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVDsgaSA8IGRlcHRoOyBpKyspIHsKLQkJCQljb21wYXRpYmxlVHlwZSA9IGNvbXBhdGlibGVUeXBlLmVuY2xvc2luZ1R5cGUoKTsKLQkJCX0KLQkJCWN1cnJlbnRTY29wZS5lbXVsYXRlT3V0ZXJBY2Nlc3MoY29tcGF0aWJsZVR5cGUsIGZhbHNlKTsgLy8gcmVxdWVzdCBjYXNjYWRlIG9mIGFjY2Vzc2VzCi0JCQlicmVhazsKLQkJY2FzZSBMT0NBTCA6Ci0JCQljdXJyZW50U2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKChMb2NhbFZhcmlhYmxlQmluZGluZykgYmluZGluZyk7CisJaWYgKChiaXRzICYgUmVzdHJpY3RpdmVGbGFnTUFTSykgPT0gTE9DQUwpIHsKKwkJY3VycmVudFNjb3BlLmVtdWxhdGVPdXRlckFjY2VzcygoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOwogCX0KIH0KIHB1YmxpYyB2b2lkIG1hbmFnZVN5bnRoZXRpY1JlYWRBY2Nlc3NJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSkgewpAQCAtNTgyLDEzICs1NDgsMTMgQEAKIAkJfQogCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KIAkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkJLy8gTk9URTogZnJvbSAxLjQgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCiAJCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIGZpZWxkIGFjY2Vzcy4JCiAJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUKIAkJCSYmICF0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQogCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKIAkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKLQkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCAKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMiAKIAkJCQkJJiYgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpCiAJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzIChpZiB0aGVyZSB3YXMgYW55KQogCQkJCXx8ICFmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpewpAQCAtNjE2LDEzICs1ODIsMTMgQEAKIAkJfQogCQkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KIAkJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkJLy8gTk9URTogZnJvbSAxLjQgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKKwkJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCiAJCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIGZpZWxkIGFjY2Vzcy4JCiAJCWlmIChmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5hY3R1YWxSZWNlaXZlclR5cGUKIAkJCSYmICF0aGlzLmFjdHVhbFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQogCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKIAkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKLQkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCAKKwkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMiAKIAkJCQkJJiYgIWZpZWxkQmluZGluZy5pc1N0YXRpYygpCiAJCQkJCSYmIGZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkgLy8gbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzIChpZiB0aGVyZSB3YXMgYW55KQogCQkJCXx8ICFmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpewpAQCAtNjUyLDE3ICs2MTgsMjIgQEAKIAkJCWNhc2UgVkFSSUFCTEUgOiAvLyA9PT09PT09PT1vbmx5IHZhcmlhYmxlPT09PT09PT09PT09CiAJCQljYXNlIFZBUklBQkxFIHwgVFlQRSA6IC8vPT09PWJvdGggdmFyaWFibGUgYW5kIHR5cGU9PT09PT09PT09PT0KIAkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykgewotCQkJCQlWYXJpYWJsZUJpbmRpbmcgdmIgPSAoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOworCQkJCQlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUgPSAoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwogCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIExvY2FsVmFyaWFibGVCaW5kaW5nKSB7CiAJCQkJCQliaXRzICY9IH5SZXN0cmljdGl2ZUZsYWdNQVNLOyAgLy8gY2xlYXIgYml0cwogCQkJCQkJYml0cyB8PSBMT0NBTDsKLQkJCQkJCWNvbnN0YW50ID0gdmIuY29uc3RhbnQ7Ci0JCQkJCQlpZiAoKCF2Yi5pc0ZpbmFsKCkpICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkpCi0JCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90UmVmZXJUb05vbkZpbmFsT3V0ZXJMb2NhbCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpdmIsIHRoaXMpOwotCQkJCQkJcmV0dXJuIHZiLnR5cGU7CisJCQkJCQlpZiAoKHRoaXMuYml0cyAmIElzU3RyaWN0bHlBc3NpZ25lZE1BU0spID09IDApIHsKKwkJCQkJCQljb25zdGFudCA9IHZhcmlhYmxlLmNvbnN0YW50OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJCQkJCX0KKwkJCQkJCWlmICgoIXZhcmlhYmxlLmlzRmluYWwoKSkgJiYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSkgeworCQkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdFJlZmVyVG9Ob25GaW5hbE91dGVyTG9jYWwoKExvY2FsVmFyaWFibGVCaW5kaW5nKXZhcmlhYmxlLCB0aGlzKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHZhcmlhYmxlLnR5cGU7CiAJCQkJCX0KIAkJCQkJLy8gYSBmaWVsZAotCQkJCQlyZXR1cm4gY2hlY2tGaWVsZEFjY2VzcyhzY29wZSk7CisJCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGNoZWNrRmllbGRBY2Nlc3Moc2NvcGUpOwogCQkJCX0KIAogCQkJCS8vIHRodXMgaXQgd2FzIGEgdHlwZQpAQCAtNjczLDEyICs2NDQsMTIgQEAKIAkJCQkvL2RlcHJlY2F0ZWQgdGVzdAogCQkJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKChUeXBlQmluZGluZykgYmluZGluZywgc2NvcGUpKQogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSgoVHlwZUJpbmRpbmcpIGJpbmRpbmcsIHRoaXMpOwotCQkJCXJldHVybiAoVHlwZUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gKFR5cGVCaW5kaW5nKSBiaW5kaW5nOwogCQl9CiAJfQogCiAJLy8gZXJyb3Igc2NlbmFyaWkKLQlyZXR1cm4gdGhpcy5yZXBvcnRFcnJvcihzY29wZSk7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5yZXBvcnRFcnJvcihzY29wZSk7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpewogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1NpbmdsZVR5cGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCmluZGV4IDcxMzBjMGMuLmU5MDc1NjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU2luZ2xlVHlwZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTIzLDkgKzIzLDkgQEAKIAkJc291cmNlRW5kID0gKGludCkgKHBvcyAmIDB4MDAwMDAwMDBGRkZGRkZGRkwpIDsKIAkKIH0KLXB1YmxpYyBTaW5nbGVUeXBlUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UgLFR5cGVCaW5kaW5nIHRiLCBsb25nIHBvcykgeworcHVibGljIFNpbmdsZVR5cGVSZWZlcmVuY2UoY2hhcltdIHNvdXJjZSAsVHlwZUJpbmRpbmcgdHlwZSwgbG9uZyBwb3MpIHsKIAl0aGlzKHNvdXJjZSwgcG9zKSA7Ci0JYmluZGluZyA9IHRiIDsKKwl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGUgOwogfQogcHVibGljIFR5cGVSZWZlcmVuY2UgY29weURpbXMoaW50IGRpbSl7CiAJLy9yZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBjb3B5IG9mIG1lIHdpdGggc29tZSBkaW1lbnNpb25zCkBAIC0zNCw4ICszNCw4IEBACiAJcmV0dXJuIG5ldyBBcnJheVR5cGVSZWZlcmVuY2UodG9rZW4sbnVsbCxkaW0sKCgobG9uZylzb3VyY2VTdGFydCk8PDMyKStzb3VyY2VFbmQpIDsKIH0KIHB1YmxpYyBUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhTY29wZSBzY29wZSkgewotCWlmIChiaW5kaW5nICE9IG51bGwpCi0JCXJldHVybiBiaW5kaW5nOworCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKQorCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJcmV0dXJuIHNjb3BlLmdldFR5cGUodG9rZW4pOwogfQogcHVibGljIGNoYXIgW11bXSBnZXRUeXBlTmFtZSgpIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAl9CiAJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQobWVtYmVyVGIsIHNjb3BlKSkKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUobWVtYmVyVGIsIHRoaXMpOwotCXJldHVybiBiaW5kaW5nID0gbWVtYmVyVGI7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gbWVtYmVyVGI7CiB9CiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbihpbnQgdGFiKXsKIAlyZXR1cm4gbmV3IFN0cmluZyh0b2tlbikgOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RhdGVtZW50LmphdmEKaW5kZXggNDYzZTBkOS4uYmRhY2MwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N0YXRlbWVudC5qYXZhCkBAIC0xLDIxICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQgZXh0ZW5kcyBBc3ROb2RlIHsKIAkKQEAgLTI2LDE2ICsyNCw5IEBACiAJCXN1cGVyKCk7CiAJfQogCQotCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZSgKLQkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCi0JCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAotCQlGbG93SW5mbyBmbG93SW5mbykgewotCQlyZXR1cm4gZmxvd0luZm87Ci0JfQorCXB1YmxpYyBhYnN0cmFjdCBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKTsKIAkKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewotCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiYXN0Lm1pc3NpbmdTdGF0ZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9CisJcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pOwogCQogCXB1YmxpYyBib29sZWFuIGlzRW1wdHlCbG9jaygpIHsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTYsMTMgKzQ3LDkgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCQotCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSBzY29wZSkgewotCX0KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNvbHZlKEJsb2NrU2NvcGUgc2NvcGUpOwogCQotCXB1YmxpYyBDb25zdGFudCByZXNvbHZlQ2FzZSgKLQkJQmxvY2tTY29wZSBzY29wZSwKLQkJVHlwZUJpbmRpbmcgdGVzdFR5cGUsCi0JCVN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKKwlwdWJsaWMgQ29uc3RhbnQgcmVzb2x2ZUNhc2UoQmxvY2tTY29wZSBzY29wZSwgVHlwZUJpbmRpbmcgdGVzdFR5cGUsIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQpIHsKIAkJLy8gc3RhdGVtZW50IHdpdGhpbiBhIHN3aXRjaCB0aGF0IGFyZSBub3QgY2FzZSBhcmUgdHJlYXRlZCBhcyBub3JtYWwgc3RhdGVtZW50Li4uLiAKIAogCQlyZXNvbHZlKHNjb3BlKTsKQEAgLTc4LDQgKzY1LDQgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBicmFuY2hDaGFpblRvKExhYmVsIGxhYmVsKSB7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3RyaW5nTGl0ZXJhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdHJpbmdMaXRlcmFsLmphdmEKaW5kZXggODgzOGM1OC4uNjU2YzdmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdHJpbmdMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdHJpbmdMaXRlcmFsLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMTcsODkgKzE3LDk4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIAogcHVibGljIGNsYXNzIFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBMaXRlcmFsIHsKKwogCWNoYXJbXSBzb3VyY2U7CiAKLXB1YmxpYyBTdHJpbmdMaXRlcmFsKGNoYXJbXSB0b2tlbiwgaW50IHMsIGludCBlKSB7Ci0JdGhpcyhzLGUpOwotCXNvdXJjZSA9IHRva2VuOwotfQotcHVibGljIFN0cmluZ0xpdGVyYWwoaW50IHMsIGludCBlKSB7Ci0Jc3VwZXIocyxlKTsKLX0KLXB1YmxpYyB2b2lkIGNvbXB1dGVDb25zdGFudCgpIHsKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbChjaGFyW10gdG9rZW4sIGludCBzLCBpbnQgZSkgewogCi0JY29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUoU3RyaW5nLnZhbHVlT2Yoc291cmNlKSk7fQotcHVibGljIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRXaXRoKENoYXJMaXRlcmFsIGxpdCl7Ci0JLy9hZGQgdGhlIGxpdCBzb3VyY2UgdG8gbWluZSwganVzdCBhcyBpZiBpdCB3YXMgbWluZQotCi0JcmV0dXJuIG5ldyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwodGhpcyxsaXQpOwotfQotcHVibGljIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCBleHRlbmRXaXRoKFN0cmluZ0xpdGVyYWwgbGl0KXsKLQkvL2FkZCB0aGUgbGl0IHNvdXJjZSB0byBtaW5lLCBqdXN0IGFzIGlmIGl0IHdhcyBtaW5lCi0KLQlyZXR1cm4gbmV3IEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCh0aGlzLGxpdCk7Ci19Ci0vKioKLSAqIENvZGUgZ2VuZXJhdGlvbiBmb3Igc3RyaW5nIGxpdGVyYWwKLSAqCi0gKiBAcGFyYW0gY3VycmVudFNjb3BlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZQotICogQHBhcmFtIGNvZGVTdHJlYW0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbQotICogQHBhcmFtIHZhbHVlUmVxdWlyZWQgYm9vbGVhbgotICovIAotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JaWYgKHZhbHVlUmVxdWlyZWQpCi0JCWNvZGVTdHJlYW0ubGRjKGNvbnN0YW50LnN0cmluZ1ZhbHVlKCkpOwotCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci19Ci1wdWJsaWMgVHlwZUJpbmRpbmcgbGl0ZXJhbFR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCXJldHVybiBzY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpOwotfQotLyoqCi0gKiBzb3VyY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBjaGFyW10gc291cmNlKCkgewotCXJldHVybiBzb3VyY2U7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpIHsKLQotCS8vIGhhbmRsZSBzb21lIHNwZWNpYWwgY2hhci4uLi4uCi0JU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewotCQlzd2l0Y2ggKHNvdXJjZVtpXSkgewotCQkJY2FzZSAnXGInIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHQnIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXGYnIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCInIDoKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJyA6Ci0JCQkJcmVzdWx0LmFwcGVuZCgiXFwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJyA6IC8vdGFrZSBjYXJlIG5vdCB0byBkaXNwbGF5IHRoZSBlc2NhcGUgYXMgYSBwb3RlbnRpYWwgcmVhbCBjaGFyCi0JCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXN1bHQuYXBwZW5kKHNvdXJjZVtpXSk7Ci0JCX0KKwkJdGhpcyhzLGUpOworCQlzb3VyY2UgPSB0b2tlbjsKIAl9Ci0JcmVzdWx0LmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyB2b2lkIHRyYXZlcnNlKElBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKLQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHNjb3BlKTsKLX0KKworCXB1YmxpYyBTdHJpbmdMaXRlcmFsKGludCBzLCBpbnQgZSkgeworCisJCXN1cGVyKHMsZSk7CisJfQorCisJcHVibGljIHZvaWQgY29tcHV0ZUNvbnN0YW50KCkgeworCQorCQljb25zdGFudCA9IENvbnN0YW50LmZyb21WYWx1ZShTdHJpbmcudmFsdWVPZihzb3VyY2UpKTsKKwl9CisKKwlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZFdpdGgoQ2hhckxpdGVyYWwgbGl0KXsKKworCQkvL2FkZCB0aGUgbGl0IHNvdXJjZSB0byBtaW5lLCBqdXN0IGFzIGlmIGl0IHdhcyBtaW5lCisJCXJldHVybiBuZXcgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsKHRoaXMsbGl0KTsKKwl9CisKKwlwdWJsaWMgRXh0ZW5kZWRTdHJpbmdMaXRlcmFsIGV4dGVuZFdpdGgoU3RyaW5nTGl0ZXJhbCBsaXQpeworCisJCS8vYWRkIHRoZSBsaXQgc291cmNlIHRvIG1pbmUsIGp1c3QgYXMgaWYgaXQgd2FzIG1pbmUKKwkJcmV0dXJuIG5ldyBFeHRlbmRlZFN0cmluZ0xpdGVyYWwodGhpcyxsaXQpOworCX0KKworCS8qKgorCSAqIENvZGUgZ2VuZXJhdGlvbiBmb3Igc3RyaW5nIGxpdGVyYWwKKwkgKi8gCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CisJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJY29kZVN0cmVhbS5sZGMoY29uc3RhbnQuc3RyaW5nVmFsdWUoKSk7CisJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CisJfQorCisJcHVibGljIFR5cGVCaW5kaW5nIGxpdGVyYWxUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKKworCQlyZXR1cm4gc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgY2hhcltdIHNvdXJjZSgpIHsKKworCQlyZXR1cm4gc291cmNlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCkgeworCQorCQkvLyBoYW5kbGUgc29tZSBzcGVjaWFsIGNoYXIuLi4uLgorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiXCIiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgeworCQkJc3dpdGNoIChzb3VyY2VbaV0pIHsKKwkJCQljYXNlICdcYicgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcdCcgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcbicgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcZicgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdccicgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXHIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcIicgOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXCcnIDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiXFwnIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXFwnIDogLy90YWtlIGNhcmUgbm90IHRvIGRpc3BsYXkgdGhlIGVzY2FwZSBhcyBhIHBvdGVudGlhbCByZWFsIGNoYXIKKwkJCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXN1bHQuYXBwZW5kKHNvdXJjZVtpXSk7CisJCQl9CisJCX0KKwkJcmVzdWx0LmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBzY29wZSkgeworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIHNjb3BlKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBzY29wZSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdXBlclJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TdXBlclJlZmVyZW5jZS5qYXZhCmluZGV4IDA4NTA5ZDMuLjIxMTFlNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3VwZXJSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N1cGVyUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMTYsMjIgKzE2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIAogcHVibGljIGNsYXNzIFN1cGVyUmVmZXJlbmNlIGV4dGVuZHMgVGhpc1JlZmVyZW5jZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdXBlclJlZmVyZW5jZSBTdXBlciA9IG5ldyBTdXBlclJlZmVyZW5jZSgpOwogCQotLyoqCi0gKiBTdXBlclJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgU3VwZXJSZWZlcmVuY2UoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBTdXBlclJlZmVyZW5jZShpbnQgcG9zLCBpbnQgc291cmNlRW5kKSB7Ci0Jc3VwZXIoKTsKLQlzb3VyY2VTdGFydCA9IHBvczsKLQl0aGlzLnNvdXJjZUVuZCA9IHNvdXJjZUVuZDsKK3B1YmxpYyBTdXBlclJlZmVyZW5jZShpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlzdXBlcihzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKIH0KIHB1YmxpYyBzdGF0aWMgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpIHsKIAlyZXR1cm4gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOwogfQorcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdFRoaXMoKSB7CisJCisJcmV0dXJuIGZhbHNlOworfQogcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKIAkKIAlyZXR1cm4gdHJ1ZTsKQEAgLTQ5LDcgKzQ0LDcgQEAKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90VXNlU3VwZXJJbkphdmFMYW5nT2JqZWN0KHRoaXMpOwogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JcmV0dXJuIGVuY2xvc2luZ1RiLnN1cGVyY2xhc3M7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gZW5jbG9zaW5nVGIuc3VwZXJjbGFzczsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3dpdGNoU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N3aXRjaFN0YXRlbWVudC5qYXZhCmluZGV4IGE1ODMyY2MuLmE4ZmExNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3dpdGNoU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9Td2l0Y2hTdGF0ZW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC00NSwyNSArNDUsMjcgQEAKIAogCQkvLyBhbmFseXNlIHRoZSBibG9jayBieSBjb25zaWRlcmluZyBzcGVjaWFsbHkgdGhlIGNhc2UvZGVmYXVsdCBzdGF0ZW1lbnRzIChuZWVkIHRvIGJpbmQgdGhlbSAKIAkJLy8gdG8gdGhlIGVudHJ5IHBvaW50KQotCQlGbG93SW5mbyBjYXNlSW5pdHMgPSBGbG93SW5mby5EZWFkRW5kOworCQlGbG93SW5mbyBjYXNlSW5pdHMgPSBGbG93SW5mby5ERUFEX0VORDsKIAkJLy8gaW4gY2FzZSBvZiBzdGF0ZW1lbnRzIGJlZm9yZSB0aGUgZmlyc3QgY2FzZQogCQlwcmVTd2l0Y2hJbml0U3RhdGVJbmRleCA9CiAJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhmbG93SW5mbyk7CiAJCWludCBjYXNlSW5kZXggPSAwOwogCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsKSB7CisJCQlib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbiA9IGZhbHNlOwogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKLQkJCQlpZiAoKGNhc2VJbmRleCA8IGNhc2VDb3VudCkKLQkJCQkJJiYgKHN0YXRlbWVudCA9PSBjYXNlc1tjYXNlSW5kZXhdKSkgeyAvLyBzdGF0ZW1lbnRzW2ldIGlzIGEgY2FzZSBvciBhIGRlZmF1bHQgY2FzZQorCQkJCWlmICgoY2FzZUluZGV4IDwgY2FzZUNvdW50KSAmJiAoc3RhdGVtZW50ID09IGNhc2VzW2Nhc2VJbmRleF0pKSB7IC8vIHN0YXRlbWVudCBpcyBhIGNhc2UKIAkJCQkJY2FzZUluZGV4Kys7CiAJCQkJCWNhc2VJbml0cyA9IGNhc2VJbml0cy5tZXJnZWRXaXRoKGZsb3dJbmZvLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHN0YXRlbWVudCA9PSBkZWZhdWx0Q2FzZSkgewotCQkJCQkJY2FzZUluaXRzID0gY2FzZUluaXRzLm1lcmdlZFdpdGgoZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKTsKLQkJCQkJfQorCQkJCQlkaWRBbHJlYWR5Q29tcGxhaW4gPSBmYWxzZTsgLy8gcmVzZXQgY29tcGxhaW50CisJCQkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgPT0gZGVmYXVsdENhc2UpIHsgLy8gc3RhdGVtZW50IGlzIHRoZSBkZWZhdWx0IGNhc2UKKwkJCQkJY2FzZUluaXRzID0gY2FzZUluaXRzLm1lcmdlZFdpdGgoZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwkJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gZmFsc2U7IC8vIHJlc2V0IGNvbXBsYWludAogCQkJCX0KLQkJCQlpZiAoIWNhc2VJbml0cy5jb21wbGFpbklmVW5yZWFjaGFibGUoc3RhdGVtZW50LCBzY29wZSkpIHsKKwkJCQlpZiAoIWNhc2VJbml0cy5jb21wbGFpbklmVW5yZWFjaGFibGUoc3RhdGVtZW50LCBzY29wZSwgZGlkQWxyZWFkeUNvbXBsYWluKSkgewogCQkJCQljYXNlSW5pdHMgPSBzdGF0ZW1lbnQuYW5hbHlzZUNvZGUoc2NvcGUsIHN3aXRjaENvbnRleHQsIGNhc2VJbml0cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGlkQWxyZWFkeUNvbXBsYWluID0gdHJ1ZTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTEyNiwyMyArMTI4LDMyIEBACiAJCS8vIGdlbmVyYXRlIGV4cHJlc3Npb24gdGVzdGVzCiAJCXRlc3RFeHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIG5lZWRTd2l0Y2gpOwogCi0JCS8vIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBzd2l0Y2ggdGFibGUKKwkJLy8gZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHN3aXRjaCB0YWJsZS9sb29rdXAgYnl0ZWNvZGUKIAkJaWYgKG5lZWRTd2l0Y2gpIHsKIAkJCWludCBtYXggPSBsb2NhbEtleXNDb3B5W2Nhc2VDb3VudCAtIDFdOwogCQkJaW50IG1pbiA9IGxvY2FsS2V5c0NvcHlbMF07CiAJCQlpZiAoKGxvbmcpIChjYXNlQ291bnQgKiAyLjUpID4gKChsb25nKSBtYXggLSAobG9uZykgbWluKSkgewotCQkJCWNvZGVTdHJlYW0udGFibGVzd2l0Y2goCi0JCQkJCWRlZmF1bHRMYWJlbCwKLQkJCQkJbWluLAotCQkJCQltYXgsCi0JCQkJCWNvbnN0YW50cywKLQkJCQkJc29ydGVkSW5kZXhlcywKLQkJCQkJY2FzZUxhYmVscyk7CisJCQkJCisJCQkJLy8gd29yay1hcm91bmQgMS4zIFZNIGJ1ZywgaWYgbWF4PjB4N0ZGRjAwMDAsIG11c3QgdXNlIGxvb2t1cCBieXRlY29kZQorCQkJCS8vIHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTU3CisJCQkJaWYgKG1heCA+IDB4N0ZGRjAwMDAgJiYgY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPCBDb21waWxlck9wdGlvbnMuSkRLMV80KSB7CisJCQkJCWNvZGVTdHJlYW0ubG9va3Vwc3dpdGNoKGRlZmF1bHRMYWJlbCwgY29uc3RhbnRzLCBzb3J0ZWRJbmRleGVzLCBjYXNlTGFiZWxzKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWNvZGVTdHJlYW0udGFibGVzd2l0Y2goCisJCQkJCQlkZWZhdWx0TGFiZWwsCisJCQkJCQltaW4sCisJCQkJCQltYXgsCisJCQkJCQljb25zdGFudHMsCisJCQkJCQlzb3J0ZWRJbmRleGVzLAorCQkJCQkJY2FzZUxhYmVscyk7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQljb2RlU3RyZWFtLmxvb2t1cHN3aXRjaChkZWZhdWx0TGFiZWwsIGNvbnN0YW50cywgc29ydGVkSW5kZXhlcywgY2FzZUxhYmVscyk7CiAJCQl9CiAJCQljb2RlU3RyZWFtLnVwZGF0ZUxhc3RSZWNvcmRlZEVuZFBDKGNvZGVTdHJlYW0ucG9zaXRpb24pOwogCQl9CisJCQogCQkvLyBnZW5lcmF0ZSB0aGUgc3dpdGNoIGJsb2NrIHN0YXRlbWVudHMKIAkJaW50IGNhc2VJbmRleCA9IDA7CiAJCWlmIChzdGF0ZW1lbnRzICE9IG51bGwpIHsKQEAgLTE4OCw4ICsxOTksOSBAQAogCiAKIAlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7Ci0KLQkJdGhpcy5icmVha0xhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQlpZiAodGhpcy5icmVha0xhYmVsICE9IG51bGwpIHsKKwkJCXRoaXMuYnJlYWtMYWJlbC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKKwkJfQogCX0KIAogCXB1YmxpYyB2b2lkIHJlc29sdmUoQmxvY2tTY29wZSB1cHBlclNjb3BlKSB7CkBAIC0xOTgsOSArMjEwLDggQEAKIAkJaWYgKHRlc3RUeXBlID09IG51bGwpCiAJCQlyZXR1cm47CiAJCXRlc3RFeHByZXNzaW9uLmltcGxpY2l0V2lkZW5pbmcodGVzdFR5cGUsIHRlc3RUeXBlKTsKLQkJaWYgKCEodGVzdEV4cHJlc3Npb24KLQkJCS5pc0NvbnN0YW50VmFsdWVPZlR5cGVBc3NpZ25hYmxlVG9UeXBlKHRlc3RUeXBlLCBJbnRCaW5kaW5nKSkpIHsKLQkJCWlmICghdXBwZXJTY29wZS5hcmVUeXBlc0NvbXBhdGlibGUodGVzdFR5cGUsIEludEJpbmRpbmcpKSB7CisJCWlmICghKHRlc3RFeHByZXNzaW9uLmlzQ29uc3RhbnRWYWx1ZU9mVHlwZUFzc2lnbmFibGVUb1R5cGUodGVzdFR5cGUsIEludEJpbmRpbmcpKSkgeworCQkJaWYgKCF0ZXN0VHlwZS5pc0NvbXBhdGlibGVXaXRoKEludEJpbmRpbmcpKSB7CiAJCQkJdXBwZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbmNvcnJlY3RTd2l0Y2hUeXBlKHRlc3RFeHByZXNzaW9uLCB0ZXN0VHlwZSk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMjIwLDcgKzIzMSw3IEBACiAJCQkJCQlpbnQga2V5ID0gY3N0LmludFZhbHVlKCk7CiAJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50ZXI7IGorKykgewogCQkJCQkJCWlmIChjYXNlc1ZhbHVlc1tqXSA9PSBrZXkpIHsKLQkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlQ2FzZSgoQ2FzZSkgc3RhdGVtZW50c1tpXSwgY3N0KTsKKwkJCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlQ2FzZSgoQ2FzZSkgc3RhdGVtZW50c1tpXSwgY3N0KTsgLy9UT0RPOiAocGhpbGlwcGUpIGNvdWxkIGltcHJvdmUgZGlhZ25vc2lzIHRvIGluZGljYXRlIGNvbGxpZGluZyBjYXNlCiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJY2FzZXNWYWx1ZXNbY291bnRlcisrXSA9IGtleTsKQEAgLTMwOSw0ICszMjAsNCBAQAogCQkJbGFiZWwuYXBwZW5kRm9yd2FyZFJlZmVyZW5jZXNGcm9tKHRoaXMuYnJlYWtMYWJlbCk7CiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKaW5kZXggMmM3NzAyNC4uYWMyZjVhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTQzLDcgKzQzLDcgQEAKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAogCQkvLyBtYXJrIHRoZSBzeW50aGV0aWMgdmFyaWFibGUgYXMgYmVpbmcgdXNlZAotCQlzeW5jaHJvVmFyaWFibGUudXNlZCA9IHRydWU7CisJCXN5bmNocm9WYXJpYWJsZS51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKIAogCQkvLyBzaW1wbGUgcHJvcGFnYXRpb24gdG8gc3Vibm9kZXMKIAkJZmxvd0luZm8gPQpAQCAtNTMsOSArNTMsOCBAQAogCQkJCWV4cHJlc3Npb24uYW5hbHlzZUNvZGUoc2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbykpOwogCiAJCS8vIG9wdGltaXppbmcgY29kZSBnZW4KLQkJaWYgKChmbG93SW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkgewotCQkJYmxvY2tFeGl0ID0gdHJ1ZTsKLQkJfQorCQl0aGlzLmJsb2NrRXhpdCA9ICFmbG93SW5mby5pc1JlYWNoYWJsZSgpOworCiAJCXJldHVybiBmbG93SW5mbzsKIAl9CiAKQEAgLTE2Nyw0ICsxNjYsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhpc1JlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggNjk4NThjZC4uZWE3MWY5OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaGlzUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaGlzUmVmZXJlbmNlLmphdmEKQEAgLTEsNzIgKzEsMTE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93LkZsb3dJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIAogcHVibGljIGNsYXNzIFRoaXNSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2UgeworCisJcHVibGljIHN0YXRpYyBUaGlzUmVmZXJlbmNlIGltcGxpY2l0VGhpcygpeworCisJCVRoaXNSZWZlcmVuY2UgaW1wbGljaXRUaGlzID0gbmV3IFRoaXNSZWZlcmVuY2UoMCwgMCk7IAorCQlpbXBsaWNpdFRoaXMuYml0cyB8PSBJc0ltcGxpY2l0VGhpc01hc2s7CisJCXJldHVybiBpbXBsaWNpdFRoaXM7CisJfQorCQkKKwlwdWJsaWMgVGhpc1JlZmVyZW5jZShpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRoaXNSZWZlcmVuY2UgVGhpc0ltcGxpY2l0ID0gbmV3IFRoaXNSZWZlcmVuY2UoKTsKLQkKLS8qKgotICogVGhpc1JlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgVGhpc1JlZmVyZW5jZSgpIHsKLQlzdXBlcigpOwotfQotcHVibGljIFRoaXNSZWZlcmVuY2UoaW50IHMsIGludCBzb3VyY2VFbmQpIHsKLQl0aGlzKCk7Ci0JdGhpcy5zb3VyY2VTdGFydCA9IHMgOwotCXRoaXMuc291cmNlRW5kID0gc291cmNlRW5kOwotfQotcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBY2Nlc3MoTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUpIHsKLQkvLyB0aGlzL3N1cGVyIGNhbm5vdCBiZSB1c2VkIGluIGNvbnN0cnVjdG9yIGNhbGwKLQlpZiAobWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKLQkJbWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZmllbGRzT3JUaGlzQmVmb3JlQ29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7CisJCXRoaXMuc291cmNlU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJdGhpcy5zb3VyY2VFbmQgPSBzb3VyY2VFbmQ7CiAJfQogCi0JLy8gc3RhdGljIG1heSBub3QgcmVmZXIgdG8gdGhpcy9zdXBlcgotCWlmIChtZXRob2RTY29wZS5pc1N0YXRpYykgewotCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvclRoaXNTdXBlckluU3RhdGljKHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JaWYgKHZhbHVlUmVxdWlyZWQpCi0JCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwotCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7Ci0JCi0JcmV0dXJuIHRydWUgOwotfQotcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkvLyBpbXBsaWNpdCB0aGlzCi0JY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7Ci0JaWYgKHRoaXMgIT0gVGhpc0ltcGxpY2l0ICYmICFjaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKSkKLQkJcmV0dXJuIG51bGw7Ci0JcmV0dXJuIHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdFeHByZXNzaW9uKCl7CisJLyogCisJICogQHNlZSBSZWZlcmVuY2UjYW5hbHlzZUFzc2lnbm1lbnQoLi4uKQorCSAqLworCXB1YmxpYyBGbG93SW5mbyBhbmFseXNlQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGJvb2xlYW4gaXNDb21wb3VuZCkgewogCi0JaWYgKHRoaXMgPT0gVGhpc0ltcGxpY2l0KSByZXR1cm4gIiIgOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuICJ0aGlzIjsgLy8kTk9OLU5MUy0xJAotfQotcHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7Ci0JdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTsKLQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwotfQorCQlyZXR1cm4gZmxvd0luZm87IC8vIHRoaXMgY2Fubm90IGJlIGFzc2lnbmVkCisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tBY2Nlc3MoTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUpIHsKKwkKKwkJLy8gdGhpcy9zdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBjb25zdHJ1Y3RvciBjYWxsCisJCWlmIChtZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbCkgeworCQkJbWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZmllbGRzT3JUaGlzQmVmb3JlQ29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCisJCS8vIHN0YXRpYyBtYXkgbm90IHJlZmVyIHRvIHRoaXMvc3VwZXIKKwkJaWYgKG1ldGhvZFNjb3BlLmlzU3RhdGljKSB7CisJCQltZXRob2RTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvclRoaXNTdXBlckluU3RhdGljKHRoaXMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIAorCSAqIEBzZWUgUmVmZXJlbmNlI2dlbmVyYXRlQXNzaWdubWVudCguLi4pCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVBc3NpZ25tZW50KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJIC8vIHRoaXMgY2Fubm90IGJlIGFzc2lnbmVkCisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQorCQlpbnQgcGMgPSBjb2RlU3RyZWFtLnBvc2l0aW9uOworCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCWNvZGVTdHJlYW0uYWxvYWRfMCgpOworCQlpZiAoKHRoaXMuYml0cyAmIElzSW1wbGljaXRUaGlzTWFzaykgPT0gMCkgY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKKwl9CisKKwkvKiAKKwkgKiBAc2VlIFJlZmVyZW5jZSNnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudCguLi4pCisJICovCisJcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCAgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7CisKKwkJIC8vIHRoaXMgY2Fubm90IGJlIGFzc2lnbmVkCisJfQorCQorCS8qIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2UjZ2VuZXJhdGVQb3N0SW5jcmVtZW50KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvc3RJbmNyZW1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQ29tcG91bmRBc3NpZ25tZW50IHBvc3RJbmNyZW1lbnQsIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCisJCSAvLyB0aGlzIGNhbm5vdCBiZSBhc3NpZ25lZAorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0VGhpcygpIHsKKwkJCisJCXJldHVybiAodGhpcy5iaXRzICYgSXNJbXBsaWNpdFRoaXNNYXNrKSAhPSAwOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVGhpcygpIHsKKwkJCisJCXJldHVybiB0cnVlIDsKKwl9CisKKwlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgeworCQorCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJaWYgKCF0aGlzLmlzSW1wbGljaXRUaGlzKCkgJiYgIWNoZWNrQWNjZXNzKHNjb3BlLm1ldGhvZFNjb3BlKCkpKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpeworCQorCQlpZiAodGhpcy5pc0ltcGxpY2l0VGhpcygpKSByZXR1cm4gIiIgOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAidGhpcyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKworCQl2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhyb3dTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVGhyb3dTdGF0ZW1lbnQuamF2YQppbmRleCBhYzI4MDQxLi5kOTM4MjMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1Rocm93U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UaHJvd1N0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTMzLDcgKzMzLDcgQEAKIAkJZXhjZXB0aW9uLmFuYWx5c2VDb2RlKGN1cnJlbnRTY29wZSwgZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsKIAkJLy8gbmVlZCB0byBjaGVjayB0aGF0IGV4Y2VwdGlvbiB0aHJvd24gaXMgYWN0dWFsbHkgY2F1Z2h0IHNvbWV3aGVyZQogCQlmbG93Q29udGV4dC5jaGVja0V4Y2VwdGlvbkhhbmRsZXJzKGV4Y2VwdGlvblR5cGUsIHRoaXMsIGZsb3dJbmZvLCBjdXJyZW50U2NvcGUpOwotCQlyZXR1cm4gRmxvd0luZm8uRGVhZEVuZDsKKwkJcmV0dXJuIEZsb3dJbmZvLkRFQURfRU5EOwogCX0KIAogCS8qKgpAQCAtNzYsNCArNzYsNCBAQAogCQkJZXhjZXB0aW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RydWVMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RydWVMaXRlcmFsLmphdmEKaW5kZXggYzg2M2FlYS4uOTk2MGJhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnVlTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ1ZUxpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RyeVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UcnlTdGF0ZW1lbnQuamF2YQppbmRleCBkZTU4ZGE3Li5lZDQ5OTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1RyeVN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHJ5U3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yOwpAQCAtMjQsNiArMjQsOCBAQAogCUJsb2NrU2NvcGUgc2NvcGU7CiAKIAlwdWJsaWMgYm9vbGVhbiBzdWJSb3V0aW5lQ2Fubm90UmV0dXJuID0gdHJ1ZTsKKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHN1YlJvdXRpbmVJbml0czsKKwkKIAkvLyBzaG91bGQgcmVuYW1lIGludG8gc3ViUm91dGluZUNvbXBsZXRlIHRvIGJlIHNldCB0byBmYWxzZSBieSBkZWZhdWx0CiAKIAlSZWZlcmVuY2VCaW5kaW5nW10gY2F1Z2h0RXhjZXB0aW9uVHlwZXM7CkBAIC02MCwxMCArNjIsMTAgQEAKIAkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKIAogCQlpZiAoYW55RXhjZXB0aW9uVmFyaWFibGUgIT0gbnVsbCkgewotCQkJYW55RXhjZXB0aW9uVmFyaWFibGUudXNlZCA9IHRydWU7CisJCQlhbnlFeGNlcHRpb25WYXJpYWJsZS51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKIAkJfQogCQlpZiAocmV0dXJuQWRkcmVzc1ZhcmlhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybkFkZHJlc3NWYXJpYWJsZS51c2VkID0gdHJ1ZTsKKwkJCXJldHVybkFkZHJlc3NWYXJpYWJsZS51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVVNFRDsKIAkJfQogCQlJbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQgaW5zaWRlU3ViQ29udGV4dDsKIAkJRmluYWxseUZsb3dDb250ZXh0IGZpbmFsbHlDb250ZXh0OwpAQCAtNzYsMTYgKzc4LDE3IEBACiAJCX0gZWxzZSB7CiAJCQkvLyBhbmFseXNlIGZpbmFsbHkgYmxvY2sgZmlyc3QKIAkJCWluc2lkZVN1YkNvbnRleHQgPSBuZXcgSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0KGZsb3dDb250ZXh0LCB0aGlzKTsKLQkJCXN1YkluZm8gPQorCQkJc3ViSW5mbyA9IAogCQkJCWZpbmFsbHlCbG9jawogCQkJCQkuYW5hbHlzZUNvZGUoCiAJCQkJCQljdXJyZW50U2NvcGUsCiAJCQkJCQlmaW5hbGx5Q29udGV4dCA9IG5ldyBGaW5hbGx5Rmxvd0NvbnRleHQoZmxvd0NvbnRleHQsIGZpbmFsbHlCbG9jayksCiAJCQkJCQlmbG93SW5mby5jb3B5KCkpCiAJCQkJCS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKLQkJCWlmICghKChzdWJJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IHN1YkluZm8uaXNGYWtlUmVhY2hhYmxlKCkpKSB7CisJCQlpZiAoc3ViSW5mby5pc1JlYWNoYWJsZSgpKSB7CiAJCQkJc3ViUm91dGluZUNhbm5vdFJldHVybiA9IGZhbHNlOwogCQkJfQorCQkJdGhpcy5zdWJSb3V0aW5lSW5pdHMgPSBzdWJJbmZvOwogCQl9CiAJCS8vIHByb2Nlc3MgdGhlIHRyeSBibG9jayBpbiBhIGNvbnRleHQgaGFuZGxpbmcgdGhlIGxvY2FsIGV4Y2VwdGlvbnMuCiAJCUV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgaGFuZGxpbmdDb250ZXh0ID0KQEAgLTEwMiw3ICsxMDUsNyBAQAogCQkJdHJ5QmxvY2tFeGl0ID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQl0cnlJbmZvID0gdHJ5QmxvY2suYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBoYW5kbGluZ0NvbnRleHQsIGZsb3dJbmZvLmNvcHkoKSk7Ci0JCQl0cnlCbG9ja0V4aXQgPSAodHJ5SW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCB0cnlJbmZvLmlzRmFrZVJlYWNoYWJsZSgpOworCQkJdHJ5QmxvY2tFeGl0ID0gIXRyeUluZm8uaXNSZWFjaGFibGUoKTsKIAkJfQogCiAJCS8vIGNoZWNrIHVucmVhY2hhYmxlIGNhdGNoIGJsb2NrcwpAQCAtMTE0LDcgKzExNyw2IEBACiAJCQljYXRjaEV4aXRzID0gbmV3IGJvb2xlYW5bY2F0Y2hDb3VudCA9IGNhdGNoQmxvY2tzLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQ291bnQ7IGkrKykgewogCQkJCS8vIGtlZXAgdHJhY2sgb2YgdGhlIGluaXRzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgaGF2ZSBsZWQgdG8gdGhpcyBleGNlcHRpb24gaGFuZGxlciAoZm9yIGZpbmFsIGFzc2lnbm1lbnRzIGRpYWdub3NpcykKLQkJCQkvLy8qCiAJCQkJRmxvd0luZm8gY2F0Y2hJbmZvID0KIAkJCQkJZmxvd0luZm8KIAkJCQkJCS5jb3B5KCkKQEAgLTEzMywxNiArMTM1LDE3IEBACiAJCQkJIih1bmNoZWNrZWRFeGNlcHRpb25UeXBlcyBub3ROaWwgYW5kOiBbdW5jaGVja2VkRXhjZXB0aW9uVHlwZXMgYXQ6IGluZGV4XSkKIAkJCQlpZlRydWU6IFtjYXRjaEluaXRzIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb206IHRyeUluaXRzXS4iCiAJCQkJKi8KKwkJCQkvLyBUT0RPOiBzaG91bGQgb25seSB0YWcgYXMgdW5yZWFjaGFibGUgaWYgdGhlIGNhdGNoYmxvY2sgY2Fubm90IGJlIHJlYWNoZWQKKwkJCQkvLz8/PyBpZiAoIWhhbmRsaW5nQ29udGV4dC5pbml0c09uRXhjZXB0aW9uKGNhdWdodEV4Y2VwdGlvblR5cGVzW2ldKS5pc1JlYWNoYWJsZSgpKXsKIAkJCQlpZiAodHJ5QmxvY2suc3RhdGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCWNhdGNoSW5mby5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOworCQkJCQljYXRjaEluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsKIAkJCQl9CiAJCQkJY2F0Y2hJbmZvID0KIAkJCQkJY2F0Y2hCbG9ja3NbaV0uYW5hbHlzZUNvZGUoCiAJCQkJCQljdXJyZW50U2NvcGUsCiAJCQkJCQlpbnNpZGVTdWJDb250ZXh0ID09IG51bGwgPyBmbG93Q29udGV4dCA6IGluc2lkZVN1YkNvbnRleHQsCiAJCQkJCQljYXRjaEluZm8pOwotCQkJCWNhdGNoRXhpdHNbaV0gPQotCQkJCQkoKGNhdGNoSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB8fCBjYXRjaEluZm8uaXNGYWtlUmVhY2hhYmxlKCkpOworCQkJCWNhdGNoRXhpdHNbaV0gPSAhY2F0Y2hJbmZvLmlzUmVhY2hhYmxlKCk7CiAJCQkJdHJ5SW5mbyA9IHRyeUluZm8ubWVyZ2VkV2l0aChjYXRjaEluZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwogCQkJfQogCQl9CkBAIC0xNTIsMTEgKzE1NSwxNSBAQAogCQkJcmV0dXJuIHRyeUluZm87CiAJCX0KIAorCiAJCS8vIHdlIGFsc28gbmVlZCB0byBjaGVjayBwb3RlbnRpYWwgbXVsdGlwbGUgYXNzaWdubWVudHMgb2YgZmluYWwgdmFyaWFibGVzIGluc2lkZSB0aGUgZmluYWxseSBibG9jawogCQkvLyBuZWVkIHRvIGluY2x1ZGUgcG90ZW50aWFsIGluaXRzIGZyb20gcmV0dXJucyBpbnNpZGUgdGhlIHRyeS9jYXRjaCBwYXJ0cyAtIDFHSzJBT0YKLQkJdHJ5SW5mby5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGluc2lkZVN1YkNvbnRleHQuaW5pdHNPblJldHVybik7Ci0JCWZpbmFsbHlDb250ZXh0LmNvbXBsYWluT25SZWR1bmRhbnRGaW5hbEFzc2lnbm1lbnRzKHRyeUluZm8sIGN1cnJlbnRTY29wZSk7Ci0JCWlmIChzdWJJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKKwkJZmluYWxseUNvbnRleHQuY29tcGxhaW5PblJlZHVuZGFudEZpbmFsQXNzaWdubWVudHMoCisJCQl0cnlJbmZvLmlzUmVhY2hhYmxlKCkgCisJCQkJPyAodHJ5SW5mby5hZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKGluc2lkZVN1YkNvbnRleHQuaW5pdHNPblJldHVybikpCisJCQkJOiBpbnNpZGVTdWJDb250ZXh0LmluaXRzT25SZXR1cm4sIAorCQkJY3VycmVudFNjb3BlKTsKKwkJaWYgKHN1YkluZm8gPT0gRmxvd0luZm8uREVBRF9FTkQpIHsKIAkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KIAkJCQljdXJyZW50U2NvcGUubWV0aG9kU2NvcGUoKS5yZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhzdWJJbmZvKTsKIAkJCXJldHVybiBzdWJJbmZvOwpAQCAtMjQ2LDggKzI1Myw3IEBACiAJCWlmICh0cnlCbG9ja0hhc1NvbWVDb2RlKSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENhdGNoZXM7IGkrKykgewogCQkJCWJvb2xlYW4gcHJlc2VydmVDdXJyZW50SGFuZGxlciA9Ci0JCQkJCShwcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXJbaQotCQkJCQkJLyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZV0KKwkJCQkJKHByZXNlcnZlRXhjZXB0aW9uSGFuZGxlcltpCS8gRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemVdCiAJCQkJCQkJJiAoMSA8PCAoaSAlIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplKSkpCiAJCQkJCQkhPSAwOwogCQkJCWlmIChwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyKSB7CkBAIC0yNjUsOCArMjcxLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhDYXRjaGVzOyBpKyspIHsKIAkJCQkJYm9vbGVhbiBwcmVzZXJ2ZUN1cnJlbnRIYW5kbGVyID0KLQkJCQkJCShwcmVzZXJ2ZUV4Y2VwdGlvbkhhbmRsZXJbaQotCQkJCQkJCS8gRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5CaXRDYWNoZVNpemVdCisJCQkJCQkocHJlc2VydmVFeGNlcHRpb25IYW5kbGVyW2kgLyBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LkJpdENhY2hlU2l6ZV0KIAkJCQkJCQkJJiAoMSA8PCAoaSAlIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuQml0Q2FjaGVTaXplKSkpCiAJCQkJCQkJIT0gMDsKIAkJCQkJaWYgKHByZXNlcnZlQ3VycmVudEhhbmRsZXIpIHsKQEAgLTM4Nyw2ICszOTIsMTIgQEAKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9CiAKKwlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7CisJCWlmICh0aGlzLnN1YlJvdXRpbmVTdGFydExhYmVsICE9IG51bGwpIHsKKwkJCXRoaXMuc3ViUm91dGluZVN0YXJ0TGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCX0KKwl9CQorCiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHVwcGVyU2NvcGUpIHsKIAogCQkvLyBzcGVjaWFsIHNjb3BlIGZvciBzZWNyZXQgbG9jYWxzIG9wdGltaXphdGlvbi4JCkBAIC00MDMsNyArNDE0LDcgQEAKIAkJCS8vIHByb3Zpc2lvbiBmb3IgcmV0dXJuaW5nIGFuZCBmb3JjaW5nIHRoZSBmaW5hbGx5IGJsb2NrIHRvIHJ1bgogCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSBzY29wZS5tZXRob2RTY29wZSgpOwogCi0JCQkvLyB0aGUgdHlwZSBkb2VzIG5vdCBtYXR0ZXIgYXMgbG9uZyBhcyBpdHMgbm90IGEgbm9ybWFsIGJhc2UgdHlwZQorCQkJLy8gdGhlIHR5cGUgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgaXQgaXMgbm90IGEgYmFzZSB0eXBlCiAJCQl0aGlzLnJldHVybkFkZHJlc3NWYXJpYWJsZSA9CiAJCQkJbmV3IExvY2FsVmFyaWFibGVCaW5kaW5nKFNlY3JldFJldHVybk5hbWUsIHVwcGVyU2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKSwgQWNjRGVmYXVsdCwgZmFsc2UpOwogCQkJZmluYWxseVNjb3BlLmFkZExvY2FsVmFyaWFibGUocmV0dXJuQWRkcmVzc1ZhcmlhYmxlKTsKQEAgLTQ2MCw5ICs0NzEsOSBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCWNhdWdodEV4Y2VwdGlvblR5cGVzW2ldID0gKFJlZmVyZW5jZUJpbmRpbmcpIGFyZ3VtZW50VHlwZXNbaV07CiAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQkJaWYgKHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShjYXVnaHRFeGNlcHRpb25UeXBlc1tpXSwgYXJndW1lbnRUeXBlc1tqXSkpIHsKKwkJCQkJaWYgKGNhdWdodEV4Y2VwdGlvblR5cGVzW2ldLmlzQ29tcGF0aWJsZVdpdGgoYXJndW1lbnRUeXBlc1tqXSkpIHsKIAkJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLndyb25nU2VxdWVuY2VPZkV4Y2VwdGlvblR5cGVzRXJyb3IodGhpcywgaSwgaik7Ci0JCQkJCQlyZXR1cm47CisJCQkJCQkvLyBjYW5ub3QgcmV0dXJuIC0gc2luY2UgbWF5IHN0aWxsIHByb2NlZWQgaWYgdW5yZWFjaGFibGUgY29kZSBpcyBpZ25vcmVkICgyMTIwMykKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTUyMiw0ICs1MzMsNCBAQAogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDRjZGI1MDkuLjE5OGE4YzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC4qOwpAQCAtMTgsNyArMTksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uCiAJZXh0ZW5kcyBTdGF0ZW1lbnQKQEAgLTEyMyw2NCArMTIzLDE0IEBACiAJCWlmIChpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKIAkJCXJldHVybiBmbG93SW5mbzsKIAkJdHJ5IHsKLQkJCS8vIHJlbWVtYmVyIGxvY2FsIHR5cGVzIGJpbmRpbmcgZm9yIGlubmVyY2xhc3MgZW11bGF0aW9uIHByb3BhZ2F0aW9uCi0JCQljdXJyZW50U2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkucmVjb3JkKChMb2NhbFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQotCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckNvbnRleHQgPQotCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIGluaXRpYWxpemVyU2NvcGUpOwotCQkJLy8gcHJvcGFnYXRlIGRvd24gdGhlIG1heCBmaWVsZCBjb3VudAotCQkJdXBkYXRlTWF4RmllbGRDb3VudCgpOwotCQkJRmxvd0luZm8gZmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpOwotCQkJLy8gc28gYXMgbm90IHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIG91dHNpZGUgdGhpcyB0eXBlCi0JCQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlmaWVsZEluZm8gPQotCQkJCQkJZmllbGRzW2ldLmFuYWx5c2VDb2RlKGluaXRpYWxpemVyU2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgZmllbGRJbmZvKTsKLQkJCQkJaWYgKGZpZWxkSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB7Ci0JCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCi0JCQkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCi0JCQkJCQlpbml0aWFsaXplclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHkoZmllbGRzW2ldKTsKLQkJCQkJCWZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkubWFya0FzRmFrZVJlYWNoYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQltZW1iZXJUeXBlc1tpXS5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIGZpZWxkSW5mby5jb3B5KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCQlpbnQgcmVjdXJzaW9uQmFsYW5jZSA9IDA7IC8vIGNoZWNrIGNvbnN0cnVjdG9yIHJlY3Vyc2lvbnMJCQkKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCQlpZiAobWV0aG9kLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7IC8vIGNvbnN0cnVjdG9yCi0JCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZDsKLQkJCQkJCWNvbnN0cnVjdG9yLmFuYWx5c2VDb2RlKHNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIGZpZWxkSW5mby5jb3B5KCkpOwotCQkJCQkJLy8gY29tcHV0ZSB0aGUgcmVjdXJzaXZlIGludm9jYXRpb24gYmFsYW5jZToKLQkJCQkJCS8vICAgaG93IG1hbnkgdGhpc1JlZmVyZW5jZXMgdnMuIHN1cGVyUmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMKLQkJCQkJCWludCByZWZDb3VudDsKLQkJCQkJCWlmICgocmVmQ291bnQgPSBjb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCkgPiAwKSB7Ci0JCQkJCQkJaWYgKChjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbCkKLQkJCQkJCQkJfHwgY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmlzU3VwZXJBY2Nlc3MoKQotCQkJCQkJCQl8fCAhY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlIC09IHJlZkNvdW50OwotCQkJCQkJCQljb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA9IC0xOwotCQkJCQkJCQkvLyBmb3IgZXJyb3IgcmVwb3J0aW5nIHByb3BhZ2F0aW9uCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgKz0gcmVmQ291bnQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyByZWd1bGFyIG1ldGhvZAotCQkJCQkJbWV0aG9kLmFuYWx5c2VDb2RlKHNjb3BlLCBudWxsLCBmbG93SW5mby5jb3B5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZWN1cnNpb25CYWxhbmNlID4gMCkgewotCQkJCQkvLyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBjeWNsZShzKSBhbW9uZ3N0IGNvbnN0cnVjdG9yIGludm9jYXRpb25zCi0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKLQkJCQl9Ci0JCQl9CisJCQliaXRzIHw9IElzUmVhY2hhYmxlTUFTSzsKKwkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gKExvY2FsVHlwZUJpbmRpbmcpIGJpbmRpbmc7CisJCQkKKwkJCWxvY2FsVHlwZS5zZXRDb25zdGFudFBvb2xOYW1lKGN1cnJlbnRTY29wZS5jb21waWxhdGlvblVuaXRTY29wZSgpLmNvbXB1dGVDb25zdGFudFBvb2xOYW1lKGxvY2FsVHlwZSkpOworCQkJbWFuYWdlRW5jbG9zaW5nSW5zdGFuY2VBY2Nlc3NJZk5lY2Vzc2FyeShjdXJyZW50U2NvcGUpOworCQkJCisJCQl1cGRhdGVNYXhGaWVsZENvdW50KCk7IC8vIHByb3BhZ2F0ZSBkb3duIHRoZSBtYXggZmllbGQgY291bnQKKwkJCWludGVybmFsQW5hbHlzZUNvZGUoZmxvd0NvbnRleHQsIGZsb3dJbmZvKTsgCiAJCX0gY2F0Y2ggKEFib3J0VHlwZSBlKSB7CiAJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKIAkJfQpAQCAtMTkxLDkwICsxNDEsMTcgQEAKIAkgKglGbG93IGFuYWx5c2lzIGZvciBhIG1lbWJlciBpbm5lcnR5cGUKIAkgKgogCSAqLwotCXB1YmxpYyB2b2lkIGFuYWx5c2VDb2RlKENsYXNzU2NvcGUgY2xhc3NTY29wZTEpIHsKKwlwdWJsaWMgdm9pZCBhbmFseXNlQ29kZShDbGFzc1Njb3BlIGVuY2xvc2luZ0NsYXNzU2NvcGUpIHsKIAogCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCiAJCQlyZXR1cm47CiAJCXRyeSB7CiAJCQkvLyBwcm9wYWdhdGUgZG93biB0aGUgbWF4IGZpZWxkIGNvdW50CiAJCQl1cGRhdGVNYXhGaWVsZENvdW50KCk7Ci0JCQlGbG93SW5mbyBmbG93SW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCk7IC8vIHN0YXJ0IGZyZXNoIGluaXQgaW5mbwotCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckNvbnRleHQgPQotCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIGluaXRpYWxpemVyU2NvcGUpOwotCQkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQgPQotCQkJCW5ldyBJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0KG51bGwsIHRoaXMsIHN0YXRpY0luaXRpYWxpemVyU2NvcGUpOwotCQkJRmxvd0luZm8gbm9uU3RhdGljRmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpLAotCQkJCXN0YXRpY0ZpZWxkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKTsKLQkJCWlmIChmaWVsZHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCWlmIChmaWVsZHNbaV0uaXNTdGF0aWMoKSkgewotCQkJCQkJc3RhdGljRmllbGRJbmZvID0KLQkJCQkJCQlmaWVsZHNbaV0uYW5hbHlzZUNvZGUoCi0JCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyU2NvcGUsCi0JCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwKLQkJCQkJCQkJc3RhdGljRmllbGRJbmZvKTsKLQkJCQkJCS8vIGluIGNhc2UgdGhlIGluaXRpYWxpemVyIGlzIG5vdCByZWFjaGFibGUsIHVzZSBhIHJlaW5pdGlhbGl6ZWQgZmxvd0luZm8gYW5kIGVudGVyIGEgZmFrZSByZWFjaGFibGUKLQkJCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KLQkJCQkJCWlmIChzdGF0aWNGaWVsZEluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgewotCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseSgKLQkJCQkJCQkJZmllbGRzW2ldKTsKLQkJCQkJCQlzdGF0aWNGaWVsZEluZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlub25TdGF0aWNGaWVsZEluZm8gPQotCQkJCQkJCWZpZWxkc1tpXS5hbmFseXNlQ29kZShpbml0aWFsaXplclNjb3BlLCBpbml0aWFsaXplckNvbnRleHQsIG5vblN0YXRpY0ZpZWxkSW5mbyk7Ci0JCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCi0JCQkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCi0JCQkJCQlpZiAobm9uU3RhdGljRmllbGRJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKLQkJCQkJCQlpbml0aWFsaXplclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHkoZmllbGRzW2ldKTsKLQkJCQkJCQlub25TdGF0aWNGaWVsZEluZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpLm1hcmtBc0Zha2VSZWFjaGFibGUodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1lbWJlclR5cGVzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJbWVtYmVyVHlwZXNbaV0uYW5hbHlzZUNvZGUoc2NvcGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCQlpbnQgcmVjdXJzaW9uQmFsYW5jZSA9IDA7IC8vIGNoZWNrIGNvbnN0cnVjdG9yIHJlY3Vyc2lvbnMKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJCQlpZiAobWV0aG9kLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChtZXRob2QuaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpKSB7Ci0JCQkJCQlpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsgLy8gPGNsaW5pdD4KLQkJCQkJCQkoKENsaW5pdCkgbWV0aG9kKS5hbmFseXNlQ29kZShzY29wZSwgc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LCBzdGF0aWNGaWVsZEluZm8pOwotCQkJCQkJfSBlbHNlIHsgLy8gY29uc3RydWN0b3IKLQkJCQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZDsKLQkJCQkJCQljb25zdHJ1Y3Rvci5hbmFseXNlQ29kZShzY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8uY29weSgpKTsKLQkJCQkJCQkvLyBjb21wdXRlIHRoZSByZWN1cnNpdmUgaW52b2NhdGlvbiBiYWxhbmNlOgotCQkJCQkJCS8vICAgaG93IG1hbnkgdGhpc1JlZmVyZW5jZXMgdnMuIHN1cGVyUmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMKLQkJCQkJCQlpbnQgcmVmQ291bnQ7Ci0JCQkJCQkJaWYgKChyZWZDb3VudCA9IGNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50KSA+IDApIHsKLQkJCQkJCQkJaWYgKChjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbCkKLQkJCQkJCQkJCXx8IGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5pc1N1cGVyQWNjZXNzKCkKLQkJCQkJCQkJCXx8ICFjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlIC09IHJlZkNvdW50OwotCQkJCQkJCQkJY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPSAtMTsgLy8gZm9yIGVycm9yIHJlcG9ydGluZyBwcm9wYWdhdGlvbgkJCQkJCQkJCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZWN1cnNpb25CYWxhbmNlICs9IHJlZkNvdW50OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyByZWd1bGFyIG1ldGhvZAotCQkJCQkJbWV0aG9kLmFuYWx5c2VDb2RlKHNjb3BlLCBudWxsLCBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVjdXJzaW9uQmFsYW5jZSA+IDApIHsKLQkJCQkJLy8gdGhlcmUgaXMgb25lIG9yIG1vcmUgY3ljbGUocykgYW1vbmdzdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9ucwotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5yZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24odGhpcyk7Ci0JCQkJfQotCQkJfQorCQkJaW50ZXJuYWxBbmFseXNlQ29kZShudWxsLCBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpKTsKIAkJfSBjYXRjaCAoQWJvcnRUeXBlIGUpIHsKIAkJCXRoaXMuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24gPSB0cnVlOwotCQl9OworCQl9CiAJfQogCiAJLyoqCkBAIC0yODksNzcgKzE2NiwxNyBAQAogCQlpZiAoaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCiAJCQlyZXR1cm47CiAJCXRyeSB7Ci0JCQkvLyByZW1lbWJlciBsb2NhbCB0eXBlcyBiaW5kaW5nIGZvciBpbm5lcmNsYXNzIGVtdWxhdGlvbiBwcm9wYWdhdGlvbgotCQkJY3VycmVudFNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLnJlY29yZCgoTG9jYWxUeXBlQmluZGluZykgYmluZGluZyk7CisJCQliaXRzIHw9IElzUmVhY2hhYmxlTUFTSzsKKwkJCUxvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlID0gKExvY2FsVHlwZUJpbmRpbmcpIGJpbmRpbmc7CiAKLQkJCS8qIGZvcmNlIHRvIGVtdWxhdGlvbiBvZiBhY2Nlc3MgdG8gZGlyZWN0IGVuY2xvc2luZyBpbnN0YW5jZTogb25seSBmb3IgbG9jYWwgbWVtYmVycy4KLQkJCSAqIEJ5IHVzaW5nIHRoZSBpbml0aWFsaXplciBzY29wZSwgd2UgYWN0dWFsbHkgb25seSByZXF1ZXN0IGFuIGFyZ3VtZW50IGVtdWxhdGlvbiwgdGhlCi0JCQkgKiBmaWVsZCBpcyBub3QgYWRkZWQgdW50aWwgYWN0dWFsbHkgdXNlZC4gSG93ZXZlciB3ZSB3aWxsIGZvcmNlIGFsbG9jYXRpb25zIHRvIGJlIHF1YWxpZmllZAotCQkJICogd2l0aCBhbiBlbmNsb3NpbmcgaW5zdGFuY2UuCi0JCQkgKi8KLQkJCWluaXRpYWxpemVyU2NvcGUuZW11bGF0ZU91dGVyQWNjZXNzKAotCQkJCShTb3VyY2VUeXBlQmluZGluZykgYmluZGluZy5lbmNsb3NpbmdUeXBlKCksCi0JCQkJZmFsc2UpOwotCi0JCQlJbml0aWFsaXphdGlvbkZsb3dDb250ZXh0IGluaXRpYWxpemVyQ29udGV4dCA9Ci0JCQkJbmV3IEluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQobnVsbCwgdGhpcywgaW5pdGlhbGl6ZXJTY29wZSk7Ci0JCQkvLyBwcm9wYWdhdGUgZG93biB0aGUgbWF4IGZpZWxkIGNvdW50Ci0JCQl1cGRhdGVNYXhGaWVsZENvdW50KCk7Ci0JCQlGbG93SW5mbyBmaWVsZEluZm8gPSBmbG93SW5mby5jb3B5KCk7Ci0JCQkvLyBzbyBhcyBub3QgdG8gcHJvcGFnYXRlIGNoYW5nZXMgb3V0c2lkZSB0aGlzIHR5cGUKLQkJCWlmIChmaWVsZHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IGZpZWxkcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCWlmICghZmllbGRzW2ldLmlzU3RhdGljKCkpIHsKLQkJCQkJCWZpZWxkSW5mbyA9Ci0JCQkJCQkJZmllbGRzW2ldLmFuYWx5c2VDb2RlKGluaXRpYWxpemVyU2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgZmllbGRJbmZvKTsKLQkJCQkJCWlmIChmaWVsZEluZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgewotCQkJCQkJCS8vIGluIGNhc2UgdGhlIGluaXRpYWxpemVyIGlzIG5vdCByZWFjaGFibGUsIHVzZSBhIHJlaW5pdGlhbGl6ZWQgZmxvd0luZm8gYW5kIGVudGVyIGEgZmFrZSByZWFjaGFibGUKLQkJCQkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCi0JCQkJCQkJaW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkc1tpXSk7Ci0JCQkJCQkJZmllbGRJbmZvID0gRmxvd0luZm8uaW5pdGlhbChtYXhGaWVsZENvdW50KS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCW1lbWJlclR5cGVzW2ldLmFuYWx5c2VDb2RlKHNjb3BlLCBmbG93Q29udGV4dCwgZmllbGRJbmZvLmNvcHkoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQkJCWludCByZWN1cnNpb25CYWxhbmNlID0gMDsgLy8gY2hlY2sgY29uc3RydWN0b3IgcmVjdXJzaW9ucwkJCQotCQkJCWZvciAoaW50IGkgPSAwLCBjb3VudCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQkJCWlmIChtZXRob2QuaWdub3JlRnVydGhlckludmVzdGlnYXRpb24pCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsgLy8gY29uc3RydWN0b3IKLQkJCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWV0aG9kOwotCQkJCQkJY29uc3RydWN0b3IuYW5hbHlzZUNvZGUoc2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgZmllbGRJbmZvLmNvcHkoKSk7Ci0JCQkJCQkvLyBjb21wdXRlIHRoZSByZWN1cnNpdmUgaW52b2NhdGlvbiBiYWxhbmNlOgotCQkJCQkJLy8gICBob3cgbWFueSB0aGlzUmVmZXJlbmNlcyB2cy4gc3VwZXJSZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9ycwotCQkJCQkJaW50IHJlZkNvdW50OwotCQkJCQkJaWYgKChyZWZDb3VudCA9IGNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50KSA+IDApIHsKLQkJCQkJCQlpZiAoKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9PSBudWxsKQotCQkJCQkJCQl8fCBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuaXNTdXBlckFjY2VzcygpCi0JCQkJCQkJCXx8ICFjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgLT0gcmVmQ291bnQ7Ci0JCQkJCQkJCWNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50ID0gLTE7IC8vIGZvciBlcnJvciByZXBvcnRpbmcgcHJvcGFnYXRpb24JCQkJCQkJCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgKz0gcmVmQ291bnQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyByZWd1bGFyIG1ldGhvZAotCQkJCQkJbWV0aG9kLmFuYWx5c2VDb2RlKHNjb3BlLCBudWxsLCBmbG93SW5mby5jb3B5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZWN1cnNpb25CYWxhbmNlID4gMCkgewotCQkJCQkvLyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBjeWNsZShzKSBhbW9uZ3N0IGNvbnN0cnVjdG9yIGludm9jYXRpb25zCi0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKLQkJCQl9Ci0JCQl9CisJCQlsb2NhbFR5cGUuc2V0Q29uc3RhbnRQb29sTmFtZShjdXJyZW50U2NvcGUuY29tcGlsYXRpb25Vbml0U2NvcGUoKS5jb21wdXRlQ29uc3RhbnRQb29sTmFtZShsb2NhbFR5cGUpKTsKKwkJCW1hbmFnZUVuY2xvc2luZ0luc3RhbmNlQWNjZXNzSWZOZWNlc3NhcnkoY3VycmVudFNjb3BlKTsKKwkJCQorCQkJdXBkYXRlTWF4RmllbGRDb3VudCgpOyAvLyBwcm9wYWdhdGUgZG93biB0aGUgbWF4IGZpZWxkIGNvdW50CisJCQlpbnRlcm5hbEFuYWx5c2VDb2RlKGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCX0gY2F0Y2ggKEFib3J0VHlwZSBlKSB7CiAJCQl0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uID0gdHJ1ZTsKLQkJfTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzcxLDgzICsxODgsMTAgQEAKIAkJaWYgKGlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uKQogCQkJcmV0dXJuOwogCQl0cnkgewotCQkJRmxvd0luZm8gZmxvd0luZm8gPSBGbG93SW5mby5pbml0aWFsKG1heEZpZWxkQ291bnQpOyAvLyBzdGFydCBmcmVzaCBpbml0IGluZm8KLQkJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgaW5pdGlhbGl6ZXJDb250ZXh0ID0KLQkJCQluZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCBpbml0aWFsaXplclNjb3BlKTsKLQkJCUluaXRpYWxpemF0aW9uRmxvd0NvbnRleHQgc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0ID0KLQkJCQluZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCBzdGF0aWNJbml0aWFsaXplclNjb3BlKTsKLQkJCUZsb3dJbmZvIG5vblN0YXRpY0ZpZWxkSW5mbyA9IGZsb3dJbmZvLmNvcHkoKSwKLQkJCQlzdGF0aWNGaWVsZEluZm8gPSBmbG93SW5mby5jb3B5KCk7Ci0JCQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBmaWVsZHMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlpZiAoZmllbGRzW2ldLmlzU3RhdGljKCkpIHsKLQkJCQkJCXN0YXRpY0ZpZWxkSW5mbyA9Ci0JCQkJCQkJZmllbGRzW2ldLmFuYWx5c2VDb2RlKAotCQkJCQkJCQlzdGF0aWNJbml0aWFsaXplclNjb3BlLAotCQkJCQkJCQlzdGF0aWNJbml0aWFsaXplckNvbnRleHQsCi0JCQkJCQkJCXN0YXRpY0ZpZWxkSW5mbyk7Ci0JCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCi0JCQkJCQkvLyBicmFuY2gsIHNpbmNlIHRoZSBwcmV2aW91cyBpbml0aWFsaXplciBhbHJlYWR5IGdvdCB0aGUgYmxhbWUuCi0JCQkJCQlpZiAoc3RhdGljRmllbGRJbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKLQkJCQkJCQlzdGF0aWNJbml0aWFsaXplclNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHkoCi0JCQkJCQkJCWZpZWxkc1tpXSk7Ci0JCQkJCQkJc3RhdGljRmllbGRJbmZvID0gRmxvd0luZm8uaW5pdGlhbChtYXhGaWVsZENvdW50KS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJbm9uU3RhdGljRmllbGRJbmZvID0KLQkJCQkJCQlmaWVsZHNbaV0uYW5hbHlzZUNvZGUoaW5pdGlhbGl6ZXJTY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8pOwotCQkJCQkJLy8gaW4gY2FzZSB0aGUgaW5pdGlhbGl6ZXIgaXMgbm90IHJlYWNoYWJsZSwgdXNlIGEgcmVpbml0aWFsaXplZCBmbG93SW5mbyBhbmQgZW50ZXIgYSBmYWtlIHJlYWNoYWJsZQotCQkJCQkJLy8gYnJhbmNoLCBzaW5jZSB0aGUgcHJldmlvdXMgaW5pdGlhbGl6ZXIgYWxyZWFkeSBnb3QgdGhlIGJsYW1lLgotCQkJCQkJaWYgKG5vblN0YXRpY0ZpZWxkSW5mbyA9PSBGbG93SW5mby5EZWFkRW5kKSB7Ci0JCQkJCQkJaW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkc1tpXSk7Ci0JCQkJCQkJbm9uU3RhdGljRmllbGRJbmZvID0gRmxvd0luZm8uaW5pdGlhbChtYXhGaWVsZENvdW50KS5tYXJrQXNGYWtlUmVhY2hhYmxlKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZW1iZXJUeXBlcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCW1lbWJlclR5cGVzW2ldLmFuYWx5c2VDb2RlKHNjb3BlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJaW50IHJlY3Vyc2lvbkJhbGFuY2UgPSAwOyAvLyBjaGVjayBjb25zdHJ1Y3RvciByZWN1cnNpb25zCQkJCi0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbWV0aG9kc1tpXTsKLQkJCQkJaWYgKG1ldGhvZC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAobWV0aG9kLmlzSW5pdGlhbGl6YXRpb25NZXRob2QoKSkgewotCQkJCQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7IC8vIDxjbGluaXQ+Ci0JCQkJCQkJKChDbGluaXQpIG1ldGhvZCkuYW5hbHlzZUNvZGUoc2NvcGUsIHN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwgc3RhdGljRmllbGRJbmZvKTsKLQkJCQkJCX0gZWxzZSB7IC8vIGNvbnN0cnVjdG9yCi0JCQkJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBtZXRob2Q7Ci0JCQkJCQkJY29uc3RydWN0b3IuYW5hbHlzZUNvZGUoc2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgbm9uU3RhdGljRmllbGRJbmZvLmNvcHkoKSk7Ci0JCQkJCQkJLy8gY29tcHV0ZSB0aGUgcmVjdXJzaXZlIGludm9jYXRpb24gYmFsYW5jZToKLQkJCQkJCQkvLyAgIGhvdyBtYW55IHRoaXNSZWZlcmVuY2VzIHZzLiBzdXBlclJlZmVyZW5jZXMgdG8gY29uc3RydWN0b3JzCi0JCQkJCQkJaW50IHJlZkNvdW50OwotCQkJCQkJCWlmICgocmVmQ291bnQgPSBjb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCkgPiAwKSB7Ci0JCQkJCQkJCWlmICgoY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsID09IG51bGwpCi0JCQkJCQkJCQl8fCBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuaXNTdXBlckFjY2VzcygpCi0JCQkJCQkJCQl8fCAhY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLmJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJCQkJcmVjdXJzaW9uQmFsYW5jZSAtPSByZWZDb3VudDsKLQkJCQkJCQkJCWNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50ID0gLTE7IC8vIGZvciBlcnJvciByZXBvcnRpbmcgcHJvcGFnYXRpb24KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXJlY3Vyc2lvbkJhbGFuY2UgKz0gcmVmQ291bnQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7IC8vIHJlZ3VsYXIgbWV0aG9kCi0JCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoc2NvcGUsIG51bGwsIEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZWN1cnNpb25CYWxhbmNlID4gMCkgewotCQkJCQkvLyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBjeWNsZShzKSBhbW9uZ3N0IGNvbnN0cnVjdG9yIGludm9jYXRpb25zCi0JCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbih0aGlzKTsKLQkJCQl9Ci0JCQl9CisJCQlpbnRlcm5hbEFuYWx5c2VDb2RlKG51bGwsIEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkpOwogCQl9IGNhdGNoIChBYm9ydFR5cGUgZSkgewogCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7Ci0JCX07CisJCX0KIAl9CiAKIAkvKgpAQCAtNTMyLDggKzI3Niw3IEBACiAKIAkJLy90aGUgc3VwZXIgY2FsbCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yCiAJCWlmIChuZWVkRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKLQkJCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbCA9Ci0JCQkJbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpOworCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsID0gU3VwZXJSZWZlcmVuY2UuaW1wbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCgpOwogCQkJY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsLnNvdXJjZVN0YXJ0ID0gc291cmNlU3RhcnQ7CiAJCQljb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuc291cmNlRW5kID0gc291cmNlRW5kOwogCQl9CkBAIC03NzEsMTIgKzUxNCw5IEBACiAJICovCiAJcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgYmxvY2tTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAKLQkJaWYgKGhhc0JlZW5HZW5lcmF0ZWQpCi0JCQlyZXR1cm47CisJCWlmIChoYXNCZWVuR2VuZXJhdGVkKSByZXR1cm47CiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247Ci0JCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCSgoTmVzdGVkVHlwZUJpbmRpbmcpIGJpbmRpbmcpLmNvbXB1dGVTeW50aGV0aWNBcmd1bWVudHNPZmZzZXQoKTsKLQkJfQorCQlpZiAoYmluZGluZyAhPSBudWxsKSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBiaW5kaW5nKS5jb21wdXRlU3ludGhldGljQXJndW1lbnRTbG90U2l6ZXMoKTsKIAkJZ2VuZXJhdGVDb2RlKGNvZGVTdHJlYW0uY2xhc3NGaWxlKTsKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAl9CkBAIC03ODYsOSArNTI2LDggQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvZGUoQ2xhc3NTY29wZSBjbGFzc1Njb3BlLCBDbGFzc0ZpbGUgZW5jbG9zaW5nQ2xhc3NGaWxlKSB7CiAKLQkJaWYgKGhhc0JlZW5HZW5lcmF0ZWQpCi0JCQlyZXR1cm47Ci0JCSgoTmVzdGVkVHlwZUJpbmRpbmcpIGJpbmRpbmcpLmNvbXB1dGVTeW50aGV0aWNBcmd1bWVudHNPZmZzZXQoKTsKKwkJaWYgKGhhc0JlZW5HZW5lcmF0ZWQpIHJldHVybjsKKwkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgKChOZXN0ZWRUeXBlQmluZGluZykgYmluZGluZykuY29tcHV0ZVN5bnRoZXRpY0FyZ3VtZW50U2xvdFNpemVzKCk7CiAJCWdlbmVyYXRlQ29kZShlbmNsb3NpbmdDbGFzc0ZpbGUpOwogCX0KIApAQCAtODAwLDE1ICs1MzksMTQ2IEBACiAJCWdlbmVyYXRlQ29kZSgoQ2xhc3NGaWxlKSBudWxsKTsKIAl9CiAKKwlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CisJCXJldHVybiB0aGlzLmlnbm9yZUZ1cnRoZXJJbnZlc3RpZ2F0aW9uOworCX0KKworCS8qKgorCSAqCUNvbW1vbiBmbG93IGFuYWx5c2lzIGZvciBhbGwgdHlwZXMKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIGludGVybmFsQW5hbHlzZUNvZGUoRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJaWYgKHRoaXMuYmluZGluZy5pc1ByaXZhdGUoKSAmJiAhdGhpcy5iaW5kaW5nLmlzUHJpdmF0ZVVzZWQoKSkgeworCQkJaWYgKCFzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5jb21waWxhdGlvblJlc3VsdC5oYXNTeW50YXhFcnJvcigpKSB7CisJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW51c2VkUHJpdmF0ZVR5cGUodGhpcyk7CisJCQl9CisJCX0KKworCQlSZWZlcmVuY2VCaW5kaW5nW10gZGVmYXVsdEhhbmRsZWRFeGNlcHRpb25zID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7IHNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCl9OyAvLyB0b2xlcmF0ZSBhbnkga2luZCBvZiBleGNlcHRpb24KKwkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBpbml0aWFsaXplckNvbnRleHQgPSBuZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCBpbml0aWFsaXplclNjb3BlKTsKKwkJSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCBzdGF0aWNJbml0aWFsaXplckNvbnRleHQgPSBuZXcgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dChudWxsLCB0aGlzLCBzdGF0aWNJbml0aWFsaXplclNjb3BlKTsKKwkJRmxvd0luZm8gbm9uU3RhdGljRmllbGRJbmZvID0gZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpLmRpc2NhcmRGaWVsZEluaXRpYWxpemF0aW9ucygpOworCQlGbG93SW5mbyBzdGF0aWNGaWVsZEluZm8gPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkuZGlzY2FyZEZpZWxkSW5pdGlhbGl6YXRpb25zKCk7CisJCWlmIChmaWVsZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gZmllbGRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gZmllbGRzW2ldOworCQkJCWlmIChmaWVsZC5pc1N0YXRpYygpKSB7CisJCQkJCS8qaWYgKGZpZWxkLmlzRmllbGQoKSl7CisJCQkJCQlzdGF0aWNJbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7IC8vIG5vIGV4Y2VwdGlvbiBpcyBhbGxvd2VkIGpsczguMy4yCisJCQkJCX0gZWxzZSB7Ki8KKwkJCQkJc3RhdGljSW5pdGlhbGl6ZXJDb250ZXh0LmhhbmRsZWRFeGNlcHRpb25zID0gZGVmYXVsdEhhbmRsZWRFeGNlcHRpb25zOyAvLyB0b2xlcmF0ZSB0aGVtIGFsbCwgYW5kIHJlY29yZCB0aGVtCisJCQkJCS8qfSovCisJCQkJCXN0YXRpY0ZpZWxkSW5mbyA9CisJCQkJCQlmaWVsZC5hbmFseXNlQ29kZSgKKwkJCQkJCQlzdGF0aWNJbml0aWFsaXplclNjb3BlLAorCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwKKwkJCQkJCQlzdGF0aWNGaWVsZEluZm8pOworCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCisJCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KKwkJCQkJaWYgKHN0YXRpY0ZpZWxkSW5mbyA9PSBGbG93SW5mby5ERUFEX0VORCkgeworCQkJCQkJc3RhdGljSW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkKTsKKwkJCQkJCXN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qaWYgKGZpZWxkLmlzRmllbGQoKSl7CisJCQkJCQlpbml0aWFsaXplckNvbnRleHQuaGFuZGxlZEV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7IC8vIG5vIGV4Y2VwdGlvbiBpcyBhbGxvd2VkIGpsczguMy4yCisJCQkJCX0gZWxzZSB7Ki8KKwkJCQkJCWluaXRpYWxpemVyQ29udGV4dC5oYW5kbGVkRXhjZXB0aW9ucyA9IGRlZmF1bHRIYW5kbGVkRXhjZXB0aW9uczsgLy8gdG9sZXJhdGUgdGhlbSBhbGwsIGFuZCByZWNvcmQgdGhlbQorCQkJCQkvKn0qLworCQkJCQlub25TdGF0aWNGaWVsZEluZm8gPQorCQkJCQkJZmllbGQuYW5hbHlzZUNvZGUoaW5pdGlhbGl6ZXJTY29wZSwgaW5pdGlhbGl6ZXJDb250ZXh0LCBub25TdGF0aWNGaWVsZEluZm8pOworCQkJCQkvLyBpbiBjYXNlIHRoZSBpbml0aWFsaXplciBpcyBub3QgcmVhY2hhYmxlLCB1c2UgYSByZWluaXRpYWxpemVkIGZsb3dJbmZvIGFuZCBlbnRlciBhIGZha2UgcmVhY2hhYmxlCisJCQkJCS8vIGJyYW5jaCwgc2luY2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemVyIGFscmVhZHkgZ290IHRoZSBibGFtZS4KKwkJCQkJaWYgKG5vblN0YXRpY0ZpZWxkSW5mbyA9PSBGbG93SW5mby5ERUFEX0VORCkgeworCQkJCQkJaW5pdGlhbGl6ZXJTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbml0aWFsaXplck11c3RDb21wbGV0ZU5vcm1hbGx5KGZpZWxkKTsKKwkJCQkJCW5vblN0YXRpY0ZpZWxkSW5mbyA9IEZsb3dJbmZvLmluaXRpYWwobWF4RmllbGRDb3VudCkuc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWlmIChmbG93Q29udGV4dCAhPSBudWxsKXsgLy8gbG9jYWwgdHlwZQorCQkJCQltZW1iZXJUeXBlc1tpXS5hbmFseXNlQ29kZShzY29wZSwgZmxvd0NvbnRleHQsIG5vblN0YXRpY0ZpZWxkSW5mby5jb3B5KCkpOworCQkJCX0gZWxzZSB7CisJCQkJCW1lbWJlclR5cGVzW2ldLmFuYWx5c2VDb2RlKHNjb3BlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJVW5jb25kaXRpb25hbEZsb3dJbmZvIG91dGVySW5mbyA9IGZsb3dJbmZvLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKS5kaXNjYXJkRmllbGRJbml0aWFsaXphdGlvbnMoKTsKKwkJCUZsb3dJbmZvIGNvbnN0cnVjdG9ySW5mbyA9IG5vblN0YXRpY0ZpZWxkSW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKS5kaXNjYXJkTm9uRmllbGRJbml0aWFsaXphdGlvbnMoKS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKG91dGVySW5mbyk7CisJCQlmb3IgKGludCBpID0gMCwgY291bnQgPSBtZXRob2RzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkJaWYgKG1ldGhvZC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKG1ldGhvZC5pc0luaXRpYWxpemF0aW9uTWV0aG9kKCkpIHsKKwkJCQkJaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7IC8vIDxjbGluaXQ+CisJCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoCisJCQkJCQkJc2NvcGUsIAorCQkJCQkJCXN0YXRpY0luaXRpYWxpemVyQ29udGV4dCwgCisJCQkJCQkJc3RhdGljRmllbGRJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpLmRpc2NhcmROb25GaWVsZEluaXRpYWxpemF0aW9ucygpLmFkZEluaXRpYWxpemF0aW9uc0Zyb20ob3V0ZXJJbmZvKSk7CisJCQkJCX0gZWxzZSB7IC8vIGNvbnN0cnVjdG9yCisJCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoc2NvcGUsIGluaXRpYWxpemVyQ29udGV4dCwgY29uc3RydWN0b3JJbmZvLmNvcHkoKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeyAvLyByZWd1bGFyIG1ldGhvZAorCQkJCQltZXRob2QuYW5hbHlzZUNvZGUoc2NvcGUsIG51bGwsIGZsb3dJbmZvLmNvcHkoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCiAJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CiAKIAkJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NJbnRlcmZhY2UpICE9IDA7CiAJfQogCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgewotCQlyZXR1cm4gdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbjsKLQl9CisJLyogCisJICogQWNjZXNzIGVtdWxhdGlvbiBmb3IgYSBsb2NhbCB0eXBlCisJICogZm9yY2UgdG8gZW11bGF0aW9uIG9mIGFjY2VzcyB0byBkaXJlY3QgZW5jbG9zaW5nIGluc3RhbmNlLgorCSAqIEJ5IHVzaW5nIHRoZSBpbml0aWFsaXplciBzY29wZSwgd2UgYWN0dWFsbHkgb25seSByZXF1ZXN0IGFuIGFyZ3VtZW50IGVtdWxhdGlvbiwgdGhlCisJICogZmllbGQgaXMgbm90IGFkZGVkIHVudGlsIGFjdHVhbGx5IHVzZWQuIEhvd2V2ZXIgd2Ugd2lsbCBmb3JjZSBhbGxvY2F0aW9ucyB0byBiZSBxdWFsaWZpZWQKKwkgKiB3aXRoIGFuIGVuY2xvc2luZyBpbnN0YW5jZS4KKwkgKiAxNS45LjIKKwkgKi8KKwlwdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KEJsb2NrU2NvcGUgY3VycmVudFNjb3BlKSB7CiAKKwkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgYmluZGluZzsKKwkJCisJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCk7CisJCWlmICghbWV0aG9kU2NvcGUuaXNTdGF0aWMgJiYgIW1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsKXsKKworCQkJbmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKGJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpKTsJCisJCX0KKwkJLy8gYWRkIHN1cGVyY2xhc3MgZW5jbG9zaW5nIGluc3RhbmNlIGFyZyBmb3IgYW5vbnltb3VzIHR5cGVzIChpZiBuZWNlc3NhcnkpCisJCWlmIChiaW5kaW5nLmlzQW5vbnltb3VzVHlwZSgpKSB7IAorCQkJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gYmluZGluZy5zdXBlcmNsYXNzOworCQkJaWYgKHN1cGVyY2xhc3MuZW5jbG9zaW5nVHlwZSgpICE9IG51bGwgJiYgIXN1cGVyY2xhc3MuaXNTdGF0aWMoKSkgeworCQkJCWlmICghYmluZGluZy5zdXBlcmNsYXNzLmlzTG9jYWxUeXBlKCkKKwkJCQkJCXx8ICgoTmVzdGVkVHlwZUJpbmRpbmcpYmluZGluZy5zdXBlcmNsYXNzKS5nZXRTeW50aGV0aWNGaWVsZChzdXBlcmNsYXNzLmVuY2xvc2luZ1R5cGUoKSwgdHJ1ZSkgIT0gbnVsbCl7CisKKwkJCQkJbmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudChzdXBlcmNsYXNzLmVuY2xvc2luZ1R5cGUoKSk7CQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvKiAKKwkgKiBBY2Nlc3MgZW11bGF0aW9uIGZvciBhIGxvY2FsIG1lbWJlciB0eXBlCisJICogZm9yY2UgdG8gZW11bGF0aW9uIG9mIGFjY2VzcyB0byBkaXJlY3QgZW5jbG9zaW5nIGluc3RhbmNlLgorCSAqIEJ5IHVzaW5nIHRoZSBpbml0aWFsaXplciBzY29wZSwgd2UgYWN0dWFsbHkgb25seSByZXF1ZXN0IGFuIGFyZ3VtZW50IGVtdWxhdGlvbiwgdGhlCisJICogZmllbGQgaXMgbm90IGFkZGVkIHVudGlsIGFjdHVhbGx5IHVzZWQuIEhvd2V2ZXIgd2Ugd2lsbCBmb3JjZSBhbGxvY2F0aW9ucyB0byBiZSBxdWFsaWZpZWQKKwkgKiB3aXRoIGFuIGVuY2xvc2luZyBpbnN0YW5jZS4KKwkgKiAKKwkgKiBMb2NhbCBtZW1iZXIgY2Fubm90IGJlIHN0YXRpYy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYW5hZ2VFbmNsb3NpbmdJbnN0YW5jZUFjY2Vzc0lmTmVjZXNzYXJ5KENsYXNzU2NvcGUgY3VycmVudFNjb3BlKSB7CisKKwkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgYmluZGluZzsKKwkJbmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKGJpbmRpbmcuZW5jbG9zaW5nVHlwZSgpKTsKKwl9CQorCQogCS8qKgogCSAqIEEgPGNsaW5pdD4gd2lsbCBiZSByZXF1ZXN0ZWQgYXMgc29vbiBhcyBzdGF0aWMgZmllbGRzIG9yIGFzc2VydGlvbnMgYXJlIHByZXNlbnQuIEl0IHdpbGwgYmUgZWxpbWluYXRlZCBkdXJpbmcKIAkgKiBjbGFzc2ZpbGUgY3JlYXRpb24gaWYgbm8gYnl0ZWNvZGUgd2FzIGFjdHVhbGx5IHByb2R1Y2VkIGJhc2VkIG9uIHNvbWUgb3B0aW1pemF0aW9ucy9jb21waWxlciBzZXR0aW5ncy4KQEAgLTg0MywxOSArNzEzLDIyIEBACiAKIAkJLy9tZW1iZXJzCiAJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gbWVtYmVyVHlwZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQlpbnQgbGVuZ3RoID0gbWVtYmVyVHlwZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKIAkJCQltZW1iZXJUeXBlc1tpXS5wYXJzZU1ldGhvZChwYXJzZXIsIHVuaXQpOwogCQl9CiAKIAkJLy9tZXRob2RzCiAJCWlmIChtZXRob2RzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgLS1pID49IDA7KQorCQkJaW50IGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKIAkJCQltZXRob2RzW2ldLnBhcnNlU3RhdGVtZW50cyhwYXJzZXIsIHVuaXQpOwogCQl9CiAKIAkJLy9pbml0aWFsaXplcnMKIAkJaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gZmllbGRzLmxlbmd0aDsgLS1pID49IDA7KSB7CisJCQlpbnQgbGVuZ3RoID0gZmllbGRzLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlpZiAoZmllbGRzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHsKIAkJCQkJKChJbml0aWFsaXplcikgZmllbGRzW2ldKS5wYXJzZVN0YXRlbWVudHMocGFyc2VyLCB0aGlzLCB1bml0KTsKIAkJCQl9CkBAIC04NzcsMTAgKzc1MCwxMCBAQAogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZShiaW5kaW5nLnN1cGVyY2xhc3MsIHN1cGVyY2xhc3MpOwogCQkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKQogCQkJCWZvciAoaW50IGkgPSBzdXBlckludGVyZmFjZXMubGVuZ3RoOyAtLWkgPj0gMDspCi0JCQkJCWlmIChzdXBlckludGVyZmFjZXNbaV0uYmluZGluZyAhPSBudWxsKQotCQkJCQkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQoc3VwZXJJbnRlcmZhY2VzW2ldLmJpbmRpbmcsIHNjb3BlKSkKKwkJCQkJaWYgKHN1cGVySW50ZXJmYWNlc1tpXS5yZXNvbHZlZFR5cGUgIT0gbnVsbCkKKwkJCQkJCWlmIChpc1R5cGVVc2VEZXByZWNhdGVkKHN1cGVySW50ZXJmYWNlc1tpXS5yZXNvbHZlZFR5cGUsIHNjb3BlKSkKIAkJCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZSgKLQkJCQkJCQkJc3VwZXJJbnRlcmZhY2VzW2ldLmJpbmRpbmcsCisJCQkJCQkJCXN1cGVySW50ZXJmYWNlc1tpXS5yZXNvbHZlZFR5cGUsCiAJCQkJCQkJCXN1cGVySW50ZXJmYWNlc1tpXSk7CiAJCQltYXhGaWVsZENvdW50ID0gMDsKIAkJCWludCBsYXN0RmllbGRJRCA9IC0xOwpAQCAtODg5LDYgKzc2Miw4IEBACiAJCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZHNbaV07CiAJCQkJCWlmIChmaWVsZC5pc0ZpZWxkKCkpIHsKIAkJCQkJCWlmIChmaWVsZC5iaW5kaW5nID09IG51bGwpIHsKKwkJCQkJCQkvLyBzdGlsbCBkaXNjb3ZlciBzZWNvbmRhcnkgZXJyb3JzCisJCQkJCQkJaWYgKGZpZWxkLmluaXRpYWxpemF0aW9uICE9IG51bGwpIGZpZWxkLmluaXRpYWxpemF0aW9uLnJlc29sdmUoZmllbGQuaXNTdGF0aWMoKSA/IHN0YXRpY0luaXRpYWxpemVyU2NvcGUgOiBpbml0aWFsaXplclNjb3BlKTsKIAkJCQkJCQlpZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCQkJCQkJY29udGludWU7CiAJCQkJCQl9CkBAIC05MDAsMTIgKzc3NSwyMiBAQAogCQkJCQlmaWVsZC5yZXNvbHZlKGZpZWxkLmlzU3RhdGljKCkgPyBzdGF0aWNJbml0aWFsaXplclNjb3BlIDogaW5pdGlhbGl6ZXJTY29wZSk7CiAJCQkJfQogCQkJfQotCQkJaWYgKG1lbWJlclR5cGVzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykKKwkJCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgewogCQkJCQltZW1iZXJUeXBlc1tpXS5yZXNvbHZlKHNjb3BlKTsKLQkJCWlmIChtZXRob2RzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKQorCQkJCX0KKwkJCX0KKwkJCWludCBtaXNzaW5nQWJzdHJhY3RNZXRob2RzbGVuZ3RoID0gdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzID09IG51bGwgPyAwIDogdGhpcy5taXNzaW5nQWJzdHJhY3RNZXRob2RzLmxlbmd0aDsKKwkJCWludCBtZXRob2RzTGVuZ3RoID0gdGhpcy5tZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisJCQlpZiAoKG1ldGhvZHNMZW5ndGggKyBtaXNzaW5nQWJzdHJhY3RNZXRob2RzbGVuZ3RoKSA+IDB4RkZGRikgeworCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLnRvb01hbnlNZXRob2RzKHRoaXMpOworCQkJfQorCQkJCisJCQlpZiAobWV0aG9kcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQkJCW1ldGhvZHNbaV0ucmVzb2x2ZShzY29wZSk7CisJCQkJfQorCQkJfQogCQl9IGNhdGNoIChBYm9ydFR5cGUgZSkgewogCQkJdGhpcy5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CiAJCQlyZXR1cm47CkBAIC05MjAsNiArODA1LDkgQEAKIAogCQkvLyBhbmQgVEMuLi4uCiAJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCS8vIHJlbWVtYmVyIGxvY2FsIHR5cGVzIGJpbmRpbmcgZm9yIGlubmVyY2xhc3MgZW11bGF0aW9uIHByb3BhZ2F0aW9uCisJCQlibG9ja1Njb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLnJlY29yZCgoTG9jYWxUeXBlQmluZGluZyliaW5kaW5nKTsKKwogCQkJLy8gYmluZGluZyBpcyBub3Qgc2V0IGlmIHRoZSByZWNlaXZlciBjb3VsZCBub3QgYmUgY3JlYXRlZAogCQkJcmVzb2x2ZSgpOwogCQkJdXBkYXRlTWF4RmllbGRDb3VudCgpOwpAQCAtOTMwLDYgKzgxOCwxMCBAQAogCQkvLyBtZW1iZXIgc2NvcGVzIGFyZSBhbHJlYWR5IGNyZWF0ZWQKIAkJLy8gcmVxdWVzdCB0aGUgY29uc3RydWN0aW9uIG9mIGEgYmluZGluZyBpZiBsb2NhbCBtZW1iZXIgdHlwZQogCisJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZyBpbnN0YW5jZW9mIExvY2FsVHlwZUJpbmRpbmcpIHsKKwkJCS8vIHJlbWVtYmVyIGxvY2FsIHR5cGVzIGJpbmRpbmcgZm9yIGlubmVyY2xhc3MgZW11bGF0aW9uIHByb3BhZ2F0aW9uCisJCQl1cHBlclNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLnJlY29yZCgoTG9jYWxUeXBlQmluZGluZyliaW5kaW5nKTsKKwkJfQogCQlyZXNvbHZlKCk7CiAJCXVwZGF0ZU1heEZpZWxkQ291bnQoKTsKIAl9CkBAIC0xMDQxLDYgKzkzMyw3IEBACiAJCQkJCQltZXRob2RzW2ldLnRyYXZlcnNlKHZpc2l0b3IsIHNjb3BlKTsKIAkJCQl9CiAJCQl9CisJCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIHVuaXRTY29wZSk7CiAJCX0gY2F0Y2ggKEFib3J0VHlwZSBlKSB7CiAJCX0KIAl9CkBAIC0xMDY2LDQgKzk1OSw0IEBACiAJCQltYXhGaWVsZENvdW50ID0gb3V0ZXJNb3N0VHlwZS5tYXhGaWVsZENvdW50OyAvLyBkb3duCiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9UeXBlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVSZWZlcmVuY2UuamF2YQppbmRleCBjZjc5OWE2Li44OTE2OTgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1R5cGVSZWZlcmVuY2UuamF2YQpAQCAtMSwyNSArMSwzMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3cuRmxvd0luZm87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZVJlZmVyZW5jZSBleHRlbmRzIEV4cHJlc3Npb24gewotCXB1YmxpYyBUeXBlQmluZGluZyBiaW5kaW5nOworCiBwdWJsaWMgVHlwZVJlZmVyZW5jZSgpIHsKIAkJc3VwZXIgKCkgOwogCQl9Ci0vLyBhbGxvd3MgdXMgdG8gdHJhcCBjb21wbGV0aW9uICYgc2VsZWN0aW9uIG5vZGVzCiAKK3B1YmxpYyBGbG93SW5mbyBhbmFseXNlQ29kZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgRmxvd0NvbnRleHQgZmxvd0NvbnRleHQsIEZsb3dJbmZvIGZsb3dJbmZvKSB7CisJcmV0dXJuIGZsb3dJbmZvOworfQorCisvLyBhbGxvd3MgdXMgdG8gdHJhcCBjb21wbGV0aW9uICYgc2VsZWN0aW9uIG5vZGVzCiBwdWJsaWMgdm9pZCBhYm91dFRvUmVzb2x2ZShTY29wZSBzY29wZSkge30KIC8qCiAgKiBBbnN3ZXIgYSBiYXNlIHR5cGUgcmVmZXJlbmNlIChjYW4gYmUgYW4gYXJyYXkgb2YgYmFzZSB0eXBlKS4KQEAgLTg0LDE5ICs5MCwxOSBAQAogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBoYW5kbGUgdGhlIGVycm9yIGhlcmUKIAljb25zdGFudCA9IE5vdEFDb25zdGFudDsKLQlpZiAoYmluZGluZyAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCi0JCWlmICghYmluZGluZy5pc1ZhbGlkQmluZGluZygpKQorCWlmICh0aGlzLnJlc29sdmVkVHlwZSAhPSBudWxsKSB7IC8vIGlzIGEgc2hhcmVkIHR5cGUgcmVmZXJlbmNlIHdoaWNoIHdhcyBhbHJlYWR5IHJlc29sdmVkCisJCWlmICghdGhpcy5yZXNvbHZlZFR5cGUuaXNWYWxpZEJpbmRpbmcoKSkKIAkJCXJldHVybiBudWxsOyAvLyBhbHJlYWR5IHJlcG9ydGVkIGVycm9yCiAJfSBlbHNlIHsKLQkJYmluZGluZyA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKLQkJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRUeXBlKHRoaXMsIGJpbmRpbmcpOworCQl0aGlzLnJlc29sdmVkVHlwZSA9IGdldFR5cGVCaW5kaW5nKHNjb3BlKTsKKwkJaWYgKCF0aGlzLnJlc29sdmVkVHlwZS5pc1ZhbGlkQmluZGluZygpKSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkVHlwZSh0aGlzLCB0aGlzLnJlc29sdmVkVHlwZSk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlpZiAoaXNUeXBlVXNlRGVwcmVjYXRlZChiaW5kaW5nLCBzY29wZSkpCi0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkVHlwZShiaW5kaW5nLCB0aGlzKTsKKwkJaWYgKGlzVHlwZVVzZURlcHJlY2F0ZWQodGhpcy5yZXNvbHZlZFR5cGUsIHNjb3BlKSkKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRUeXBlKHRoaXMucmVzb2x2ZWRUeXBlLCB0aGlzKTsKIAl9Ci0JcmV0dXJuIGJpbmRpbmc7CisJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogfQogcHVibGljIGFic3RyYWN0IHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQ2xhc3NTY29wZSBjbGFzc1Njb3BlKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1VuYXJ5RXhwcmVzc2lvbi5qYXZhCmluZGV4IDQwOGE4MzIuLmFkZThmZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9VbmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3I7CkBAIC0zMCwxNyArMzAsMjEgQEAKIAkJQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsCiAJCUZsb3dDb250ZXh0IGZsb3dDb250ZXh0LAogCQlGbG93SW5mbyBmbG93SW5mbykgeworCQkJCiAJCWlmICgoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IE5PVCkgewotCQkJcmV0dXJuIGV4cHJlc3Npb24KKwkJCXJldHVybiB0aGlzLmV4cHJlc3Npb24KIAkJCQkuYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pCiAJCQkJLmFzTmVnYXRlZENvbmRpdGlvbigpOwogCQl9IGVsc2UgewotCQkJcmV0dXJuIGV4cHJlc3Npb24uYW5hbHlzZUNvZGUoY3VycmVudFNjb3BlLCBmbG93Q29udGV4dCwgZmxvd0luZm8pOworCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGZsb3dDb250ZXh0LCBmbG93SW5mbyk7CiAJCX0KIAl9CiAKLQlwdWJsaWMgQ29uc3RhbnQgY29uZGl0aW9uYWxDb25zdGFudCgpIHsKLQkJcmV0dXJuIG9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9PSBudWxsID8gY29uc3RhbnQgOiBvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQ7CisJcHVibGljIENvbnN0YW50IG9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpIHsKKwkJCisJCXJldHVybiB0aGlzLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCA9PSBudWxsIAorCQkJCT8gdGhpcy5jb25zdGFudCAKKwkJCQk6IHRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50OwogCX0KIAogCS8qKgpAQCAtNTQsMjMgKzU4LDI0IEBACiAJCUJsb2NrU2NvcGUgY3VycmVudFNjb3BlLAogCQlDb2RlU3RyZWFtIGNvZGVTdHJlYW0sCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCQkJCiAJCWludCBwYyA9IGNvZGVTdHJlYW0ucG9zaXRpb247CiAJCUxhYmVsIGZhbHNlTGFiZWwsIGVuZGlmTGFiZWw7Ci0JCWlmIChjb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJaWYgKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CiAJCQkvLyBpbmxpbmVkIHZhbHVlCiAJCQlpZiAodmFsdWVSZXF1aXJlZCkgewotCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChjb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb25zdGFudCwgdGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQkJfQogCQkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0aGlzLnNvdXJjZVN0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQogCQlzd2l0Y2ggKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSB7CiAJCQljYXNlIE5PVCA6Ci0JCQkJc3dpdGNoIChleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAvKiBydW50aW1lIHR5cGUgKi8geworCQkJCXN3aXRjaCAodGhpcy5leHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA+PiA0KSAvKiBydW50aW1lIHR5cGUgKi8gewogCQkJCQljYXNlIFRfYm9vbGVhbiA6CiAJCQkJCQkvLyAhIDxib29sZWFuPgogCQkJCQkJLy8gR2VuZXJhdGUgY29kZSBmb3IgdGhlIGNvbmRpdGlvbgotCQkJCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCisJCQkJCQl0aGlzLmV4cHJlc3Npb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAogCQkJCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkJCQljb2RlU3RyZWFtLAogCQkJCQkJCW51bGwsCkBAIC05MiwxOCArOTcsMTggQEAKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRXSURETEUgOgotCQkJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCAvKiBydW50aW1lICovCisJCQkJc3dpdGNoICh0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID4+IDQgLyogcnVudGltZSAqLwogCQkJCQkpIHsKIAkJCQkJY2FzZSBUX2ludCA6CiAJCQkJCQkvLyB+aW50Ci0JCQkJCQlleHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQkJCQkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOwogCQkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCQkJCQljb2RlU3RyZWFtLmljb25zdF9tMSgpOwogCQkJCQkJCWNvZGVTdHJlYW0uaXhvcigpOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCQl0aGlzLmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCQkJCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJCQkJCWNvZGVTdHJlYW0ubGRjMl93KC0xTCk7CiAJCQkJCQkJY29kZVN0cmVhbS5seG9yKCk7CkBAIC0xMTIsMjggKzExNywyNiBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBNSU5VUyA6CiAJCQkJLy8gLSA8bnVtPgotCQkJCWlmIChjb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlpZiAodGhpcy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKIAkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCAvKiBydW50aW1lICovCi0JCQkJCQkJKSB7CisJCQkJCQlzd2l0Y2ggKHRoaXMuZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCl7IC8qIHJ1bnRpbWUgKi8KIAkJCQkJCQljYXNlIFRfaW50IDoKLQkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5pbnRWYWx1ZSgpICogLTEpOworCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKHRoaXMuY29uc3RhbnQuaW50VmFsdWUoKSAqIC0xKTsKIAkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5mbG9hdFZhbHVlKCkgKiAtMS4wZik7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUodGhpcy5jb25zdGFudC5mbG9hdFZhbHVlKCkgKiAtMS4wZik7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgVF9sb25nIDoKLQkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZShjb25zdGFudC5sb25nVmFsdWUoKSAqIC0xTCk7CisJCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbmxpbmVkVmFsdWUodGhpcy5jb25zdGFudC5sb25nVmFsdWUoKSAqIC0xTCk7CiAJCQkJCQkJCWJyZWFrOwogCQkJCQkJCWNhc2UgVF9kb3VibGUgOgotCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LmRvdWJsZVZhbHVlKCkgKiAtMS4wKTsKKwkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUlubGluZWRWYWx1ZSh0aGlzLmNvbnN0YW50LmRvdWJsZVZhbHVlKCkgKiAtMS4wKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CisJCQkJCXRoaXMuZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKIAkJCQkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCQkJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCAvKiBydW50aW1lIHR5cGUgKi8KLQkJCQkJCQkpIHsKKwkJCQkJCXN3aXRjaCAoZXhwcmVzc2lvbi5pbXBsaWNpdENvbnZlcnNpb24gPj4gNCl7IC8qIHJ1bnRpbWUgdHlwZSAqLwogCQkJCQkJCWNhc2UgVF9pbnQgOgogCQkJCQkJCQljb2RlU3RyZWFtLmluZWcoKTsKIAkJCQkJCQkJYnJlYWs7CkBAIC0xNTAsMTAgKzE1MywxMCBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgUExVUyA6Ci0JCQkJZXhwcmVzc2lvbi5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkKTsKKwkJCQl0aGlzLmV4cHJlc3Npb24uZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdmFsdWVSZXF1aXJlZCk7CiAJCX0KIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24odGhpcy5pbXBsaWNpdENvbnZlcnNpb24pOwogCQl9CiAJCWNvZGVTdHJlYW0ucmVjb3JkUG9zaXRpb25zRnJvbShwYywgdGhpcy5zb3VyY2VTdGFydCk7CiAJfQpAQCAtMTY5LDcgKzE3Miw3IEBACiAJCUxhYmVsIGZhbHNlTGFiZWwsCiAJCWJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCi0JCWlmICgoY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAoY29uc3RhbnQudHlwZUlEKCkgPT0gVF9ib29sZWFuKSkgeworCQlpZiAoKHRoaXMuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSAmJiAodGhpcy5jb25zdGFudC50eXBlSUQoKSA9PSBUX2Jvb2xlYW4pKSB7CiAJCQlzdXBlci5nZW5lcmF0ZU9wdGltaXplZEJvb2xlYW4oCiAJCQkJY3VycmVudFNjb3BlLAogCQkJCWNvZGVTdHJlYW0sCkBAIC0xNzgsOCArMTgxLDggQEAKIAkJCQl2YWx1ZVJlcXVpcmVkKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAoKChiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKSA9PSBOT1QpIHsKLQkJCWV4cHJlc3Npb24uZ2VuZXJhdGVPcHRpbWl6ZWRCb29sZWFuKAorCQlpZiAoKCh0aGlzLmJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IE5PVCkgeworCQkJdGhpcy5leHByZXNzaW9uLmdlbmVyYXRlT3B0aW1pemVkQm9vbGVhbigKIAkJCQljdXJyZW50U2NvcGUsCiAJCQkJY29kZVN0cmVhbSwKIAkJCQlmYWxzZUxhYmVsLApAQCAtMTk2LDE1ICsxOTksMTYgQEAKIAl9CiAKIAlwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkgewotCQlUeXBlQmluZGluZyBleHByZXNzaW9uVGIgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKLQkJaWYgKGV4cHJlc3Npb25UYiA9PSBudWxsKSB7Ci0JCQljb25zdGFudCA9IE5vdEFDb25zdGFudDsKKwkJCisJCVR5cGVCaW5kaW5nIGV4cHJlc3Npb25UeXBlID0gdGhpcy5leHByZXNzaW9uLnJlc29sdmVUeXBlKHNjb3BlKTsKKwkJaWYgKGV4cHJlc3Npb25UeXBlID09IG51bGwpIHsKKwkJCXRoaXMuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlpbnQgZXhwcmVzc2lvbklkID0gZXhwcmVzc2lvblRiLmlkOworCQlpbnQgZXhwcmVzc2lvbklkID0gZXhwcmVzc2lvblR5cGUuaWQ7CiAJCWlmIChleHByZXNzaW9uSWQgPiAxNSkgewotCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgZXhwcmVzc2lvblRiKTsKKwkJCXRoaXMuY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkT3BlcmF0b3IodGhpcywgZXhwcmVzc2lvblR5cGUpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIApAQCAtMjI1LDY0ICsyMjksNjYgQEAKIAkJLy8gIDAwMDAgICAwMDAwICAgICAgIDAwMDAgICAwMDAwICAgICAgMDAwMAogCQkvLyAgPDwxNiAgIDw8MTIgICAgICAgPDw4ICAgIDw8NCAgICAgICA8PDAKIAkJaW50IHJlc3VsdCA9IFJlc29sdmVUeXBlVGFibGVzW3RhYmxlSWRdWyhleHByZXNzaW9uSWQgPDwgNCkgKyBleHByZXNzaW9uSWRdOwotCQlleHByZXNzaW9uLmltcGxpY2l0Q29udmVyc2lvbiA9IHJlc3VsdCA+Pj4gMTI7Ci0JCWJpdHMgfD0gcmVzdWx0ICYgMHhGOworCQl0aGlzLmV4cHJlc3Npb24uaW1wbGljaXRDb252ZXJzaW9uID0gcmVzdWx0ID4+PiAxMjsKKwkJdGhpcy5iaXRzIHw9IHJlc3VsdCAmIDB4RjsKIAkJc3dpdGNoIChyZXN1bHQgJiAweEYpIHsgLy8gb25seSBzd2l0Y2ggb24gcG9zc2libGUgcmVzdWx0IHR5cGUuLi4uLgogCQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBCb29sZWFuQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IEJvb2xlYW5CaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2J5dGUgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBCeXRlQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IEJ5dGVCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2NoYXIgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBDaGFyQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IENoYXJCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IERvdWJsZUJpbmRpbmc7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBEb3VibGVCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2Zsb2F0IDoKLQkJCQl0aGlzLnR5cGVCaW5kaW5nID0gRmxvYXRCaW5kaW5nOworCQkJCXRoaXMucmVzb2x2ZWRUeXBlID0gRmxvYXRCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2ludCA6Ci0JCQkJdGhpcy50eXBlQmluZGluZyA9IEludEJpbmRpbmc7CisJCQkJdGhpcy5yZXNvbHZlZFR5cGUgPSBJbnRCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUX2xvbmcgOgotCQkJCXRoaXMudHlwZUJpbmRpbmcgPSBMb25nQmluZGluZzsKKwkJCQl0aGlzLnJlc29sdmVkVHlwZSA9IExvbmdCaW5kaW5nOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdCA6IC8vZXJyb3IuLi4uLi4uLgotCQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7CiAJCQkJaWYgKGV4cHJlc3Npb25JZCAhPSBUX3VuZGVmaW5lZCkKLQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZE9wZXJhdG9yKHRoaXMsIGV4cHJlc3Npb25UYik7CisJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRPcGVyYXRvcih0aGlzLCBleHByZXNzaW9uVHlwZSk7CiAJCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJLy8gY29tcHV0ZSB0aGUgY29uc3RhbnQgd2hlbiB2YWxpZAotCQlpZiAoZXhwcmVzc2lvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKLQkJCWNvbnN0YW50ID0KKwkJaWYgKHRoaXMuZXhwcmVzc2lvbi5jb25zdGFudCAhPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQpIHsKKwkJCXRoaXMuY29uc3RhbnQgPQogCQkJCUNvbnN0YW50LmNvbXB1dGVDb25zdGFudE9wZXJhdGlvbigKLQkJCQkJZXhwcmVzc2lvbi5jb25zdGFudCwKKwkJCQkJdGhpcy5leHByZXNzaW9uLmNvbnN0YW50LAogCQkJCQlleHByZXNzaW9uSWQsCiAJCQkJCShiaXRzICYgT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvclNISUZUKTsKIAkJfSBlbHNlIHsKLQkJCWNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OworCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAkJCWlmICgoKGJpdHMgJiBPcGVyYXRvck1BU0spID4+IE9wZXJhdG9yU0hJRlQpID09IE5PVCkgewotCQkJCUNvbnN0YW50IGNzdCA9IGV4cHJlc3Npb24uY29uZGl0aW9uYWxDb25zdGFudCgpOwotCQkJCWlmIChjc3QudHlwZUlEKCkgPT0gVF9ib29sZWFuKQotCQkJCQlvcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQgPSBDb25zdGFudC5mcm9tVmFsdWUoIWNzdC5ib29sZWFuVmFsdWUoKSk7CisJCQkJQ29uc3RhbnQgY3N0ID0gZXhwcmVzc2lvbi5vcHRpbWl6ZWRCb29sZWFuQ29uc3RhbnQoKTsKKwkJCQlpZiAoY3N0ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgCisJCQkJCXRoaXMub3B0aW1pemVkQm9vbGVhbkNvbnN0YW50ID0gQ29uc3RhbnQuZnJvbVZhbHVlKCFjc3QuYm9vbGVhblZhbHVlKCkpOwogCQkJfQogCQl9Ci0JCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJfQogCiAJcHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb25Ob1BhcmVudGhlc2lzKCkgewotCQlyZXR1cm4gb3BlcmF0b3JUb1N0cmluZygpICsgIiAiICsgZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJcmV0dXJuIG9wZXJhdG9yVG9TdHJpbmcoKSArICIgIiArIHRoaXMuZXhwcmVzc2lvbi50b1N0cmluZ0V4cHJlc3Npb24oKTsgLy8kTk9OLU5MUy0xJAogCX0gCiAJCiAJcHVibGljIHZvaWQgdHJhdmVyc2UoCiAJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IsCiAJCUJsb2NrU2NvcGUgYmxvY2tTY29wZSkgeworCQkJCiAJCWlmICh2aXNpdG9yLnZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpKSB7Ci0JCQlleHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOworCQkJdGhpcy5leHByZXNzaW9uLnRyYXZlcnNlKHZpc2l0b3IsIGJsb2NrU2NvcGUpOwogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9hc3QvV2hpbGVTdGF0ZW1lbnQuamF2YQppbmRleCBjZjQzMTE3Li40YWI5OGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvYXN0L1doaWxlU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2FzdC9XaGlsZVN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTM5LDI2ICszOSwzOCBAQAogCQlGbG93SW5mbyBmbG93SW5mbykgewogCiAJCWJyZWFrTGFiZWwgPSBuZXcgTGFiZWwoKTsKLQkJY29udGludWVMYWJlbCA9IG5ldyBMYWJlbCgpOworCQljb250aW51ZUxhYmVsID0gbmV3IExhYmVsKCk7IAogCisJCUNvbnN0YW50IGNzdCA9IHRoaXMuY29uZGl0aW9uLmNvbnN0YW50OworCQlib29sZWFuIGlzQ29uZGl0aW9uVHJ1ZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CisJCWJvb2xlYW4gaXNDb25kaXRpb25GYWxzZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCisJCWNzdCA9IHRoaXMuY29uZGl0aW9uLm9wdGltaXplZEJvb2xlYW5Db25zdGFudCgpOworCQlib29sZWFuIGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IHRydWU7CisJCWJvb2xlYW4gaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSA9IGNzdCAhPSBOb3RBQ29uc3RhbnQgJiYgY3N0LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlOworCQkKIAkJcHJlQ29uZEluaXRTdGF0ZUluZGV4ID0KIAkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKGZsb3dJbmZvKTsKIAkJTG9vcGluZ0Zsb3dDb250ZXh0IGNvbmRMb29wQ29udGV4dDsKIAkJRmxvd0luZm8gcG9zdENvbmRJbmZvID0KLQkJCWNvbmRpdGlvbi5hbmFseXNlQ29kZSgKKwkJCXRoaXMuY29uZGl0aW9uLmFuYWx5c2VDb2RlKAogCQkJCWN1cnJlbnRTY29wZSwKIAkJCQkoY29uZExvb3BDb250ZXh0ID0KIAkJCQkJbmV3IExvb3BpbmdGbG93Q29udGV4dChmbG93Q29udGV4dCwgdGhpcywgbnVsbCwgbnVsbCwgY3VycmVudFNjb3BlKSksCiAJCQkJZmxvd0luZm8pOwogCiAJCUxvb3BpbmdGbG93Q29udGV4dCBsb29waW5nQ29udGV4dDsKLQkJaWYgKChhY3Rpb24gPT0gbnVsbCkgfHwgYWN0aW9uLmlzRW1wdHlCbG9jaygpKSB7CisJCUZsb3dJbmZvIGFjdGlvbkluZm87CisJCWlmIChhY3Rpb24gPT0gbnVsbCAKKwkJCXx8IChhY3Rpb24uaXNFbXB0eUJsb2NrKCkgJiYgY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPD0gQ29tcGlsZXJPcHRpb25zLkpESzFfMykpIHsKIAkJCWNvbmRMb29wQ29udGV4dC5jb21wbGFpbk9uRmluYWxBc3NpZ25tZW50c0luTG9vcChjdXJyZW50U2NvcGUsIHBvc3RDb25kSW5mbyk7Ci0JCQlpZiAoKGNvbmRpdGlvbi5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpCi0JCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgewotCQkJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCQkJaWYgKGlzQ29uZGl0aW9uVHJ1ZSkgeworCQkJCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKIAkJCX0gZWxzZSB7CiAJCQkJRmxvd0luZm8gbWVyZ2VkSW5mbyA9IHBvc3RDb25kSW5mby5pbml0c1doZW5GYWxzZSgpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQkJCWlmIChpc0NvbmRpdGlvbk9wdGltaXplZFRydWUpeworCQkJCQltZXJnZWRJbmZvLnNldFJlYWNoTW9kZShGbG93SW5mby5VTlJFQUNIQUJMRSk7CisJCQkJfQogCQkJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KIAkJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMobWVyZ2VkSW5mbyk7CiAJCQkJcmV0dXJuIG1lcmdlZEluZm87CkBAIC03MywyNyArODUsMjkgQEAKIAkJCQkJYnJlYWtMYWJlbCwKIAkJCQkJY29udGludWVMYWJlbCwKIAkJCQkJY3VycmVudFNjb3BlKTsKLQkJCUZsb3dJbmZvIGFjdGlvbkluZm8gPQotCQkJCSgoY29uZGl0aW9uLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKLQkJCQkJJiYgKGNvbmRpdGlvbi5jb25zdGFudC5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkpCi0JCQkJCT8gRmxvd0luZm8uRGVhZEVuZAotCQkJCQk6IHBvc3RDb25kSW5mby5pbml0c1doZW5UcnVlKCkuY29weSgpOworCQkJaWYgKGlzQ29uZGl0aW9uRmFsc2UpIHsKKwkJCQlhY3Rpb25JbmZvID0gRmxvd0luZm8uREVBRF9FTkQ7CisJCQl9IGVsc2UgeworCQkJCWFjdGlvbkluZm8gPSBwb3N0Q29uZEluZm8uaW5pdHNXaGVuVHJ1ZSgpLmNvcHkoKTsKKwkJCQlpZiAoaXNDb25kaXRpb25PcHRpbWl6ZWRGYWxzZSl7CisJCQkJCWFjdGlvbkluZm8uc2V0UmVhY2hNb2RlKEZsb3dJbmZvLlVOUkVBQ0hBQkxFKTsKKwkJCQl9CisJCQl9CiAKIAkJCS8vIGZvciBjb21wdXRpbmcgbG9jYWwgdmFyIGF0dHJpYnV0ZXMKIAkJCWNvbmRJZlRydWVJbml0U3RhdGVJbmRleCA9CiAJCQkJY3VycmVudFNjb3BlLm1ldGhvZFNjb3BlKCkucmVjb3JkSW5pdGlhbGl6YXRpb25TdGF0ZXMoCiAJCQkJCXBvc3RDb25kSW5mby5pbml0c1doZW5UcnVlKCkpOwogCi0JCQlpZiAoIWFjdGlvbkluZm8uY29tcGxhaW5JZlVucmVhY2hhYmxlKGFjdGlvbiwgY3VycmVudFNjb3BlKSkgeworCQkJaWYgKCFhY3Rpb25JbmZvLmNvbXBsYWluSWZVbnJlYWNoYWJsZShhY3Rpb24sIGN1cnJlbnRTY29wZSwgZmFsc2UpKSB7CiAJCQkJYWN0aW9uSW5mbyA9IGFjdGlvbi5hbmFseXNlQ29kZShjdXJyZW50U2NvcGUsIGxvb3BpbmdDb250ZXh0LCBhY3Rpb25JbmZvKTsKIAkJCX0KIAogCQkJLy8gY29kZSBnZW5lcmF0aW9uIGNhbiBiZSBvcHRpbWl6ZWQgd2hlbiBubyBuZWVkIHRvIGNvbnRpbnVlIGluIHRoZSBsb29wCi0JCQlpZiAoKChhY3Rpb25JbmZvID09IEZsb3dJbmZvLkRlYWRFbmQpIHx8IGFjdGlvbkluZm8uaXNGYWtlUmVhY2hhYmxlKCkpCi0JCQkJJiYgKChsb29waW5nQ29udGV4dC5pbml0c09uQ29udGludWUgPT0gRmxvd0luZm8uRGVhZEVuZCkKLQkJCQkJfHwgbG9vcGluZ0NvbnRleHQuaW5pdHNPbkNvbnRpbnVlLmlzRmFrZVJlYWNoYWJsZSgpKSkgeworCQkJaWYgKCFhY3Rpb25JbmZvLmlzUmVhY2hhYmxlKCkgJiYgIWxvb3BpbmdDb250ZXh0LmluaXRzT25Db250aW51ZS5pc1JlYWNoYWJsZSgpKSB7CiAJCQkJY29udGludWVMYWJlbCA9IG51bGw7CiAJCQl9IGVsc2UgeworCQkJCS8vIFRPRE86IChwaGlsaXBwZSkgc2hvdWxkIHNpbXBsaWZ5IGluIG9uZSBMb29wIGNvbnRleHQKIAkJCQljb25kTG9vcENvbnRleHQuY29tcGxhaW5PbkZpbmFsQXNzaWdubWVudHNJbkxvb3AoY3VycmVudFNjb3BlLCBwb3N0Q29uZEluZm8pOwogCQkJCWxvb3BpbmdDb250ZXh0LmNvbXBsYWluT25GaW5hbEFzc2lnbm1lbnRzSW5Mb29wKGN1cnJlbnRTY29wZSwgYWN0aW9uSW5mbyk7CiAJCQl9CkBAIC0xMDEsOCArMTE1LDcgQEAKIAogCQkvLyBpbmZpbml0ZSBsb29wCiAJCUZsb3dJbmZvIG1lcmdlZEluZm87Ci0JCWlmICgoY29uZGl0aW9uLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkKLQkJCSYmIChjb25kaXRpb24uY29uc3RhbnQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkpIHsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSkgewogCQkJbWVyZ2VkSW5pdFN0YXRlSW5kZXggPQogCQkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKAogCQkJCQltZXJnZWRJbmZvID0gbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKTsKQEAgLTExMyw2ICsxMjYsOSBAQAogCQltZXJnZWRJbmZvID0KIAkJCXBvc3RDb25kSW5mby5pbml0c1doZW5GYWxzZSgpLnVuY29uZGl0aW9uYWxJbml0cygpLm1lcmdlZFdpdGgoCiAJCQkJbG9vcGluZ0NvbnRleHQuaW5pdHNPbkJyZWFrKTsKKwkJaWYgKGlzQ29uZGl0aW9uT3B0aW1pemVkVHJ1ZSAmJiBjb250aW51ZUxhYmVsID09IG51bGwpeworCQkJbWVyZ2VkSW5mby5zZXRSZWFjaE1vZGUoRmxvd0luZm8uVU5SRUFDSEFCTEUpOworCQl9CiAJCW1lcmdlZEluaXRTdGF0ZUluZGV4ID0KIAkJCWN1cnJlbnRTY29wZS5tZXRob2RTY29wZSgpLnJlY29yZEluaXRpYWxpemF0aW9uU3RhdGVzKG1lcmdlZEluZm8pOwogCQlyZXR1cm4gbWVyZ2VkSW5mbzsKQEAgLTE5Niw5ICsyMTIsMTIgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKSB7Ci0KLQkJdGhpcy5icmVha0xhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOwotCQl0aGlzLmNvbnRpbnVlTGFiZWwucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCWlmICh0aGlzLmJyZWFrTGFiZWwgIT0gbnVsbCkgeworCQkJdGhpcy5icmVha0xhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQl9CisJCWlmICh0aGlzLmNvbnRpbnVlTGFiZWwgIT0gbnVsbCkgeworCQkJdGhpcy5jb250aW51ZUxhYmVsLnJlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvbigpOworCQl9CiAJfQogCiAJcHVibGljIHZvaWQgcmVzb2x2ZShCbG9ja1Njb3BlIHNjb3BlKSB7CkBAIC0yMzMsNCArMjUyLDQgQEAKIAkJfQogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlQ29uc3RhbnRzLmphdmEKaW5kZXggY2JhYzFmMy4uMDA1MjkwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVDb25zdGFudHMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVSZWFkZXIuamF2YQppbmRleCBmNmI2YzIyLi41MTE2ZGY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVJlYWRlci5qYXZhCkBAIC0xLDI0ICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uKjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5BdHRyaWJ1dGVOYW1lc0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuTnVsbENvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIENsYXNzRmlsZVJlYWRlciBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBJQmluYXJ5VHlwZSB7CiAJcHJpdmF0ZSBpbnQgY29uc3RhbnRQb29sQ291bnQ7CkBAIC0zNzMsNyArMzc0LDExIEBACiAgKi8KIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewogCWlmICh0aGlzLmlubmVySW5mbyAhPSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLmlubmVySW5mby5nZXRNb2RpZmllcnMoKTsKKwkJaWYgKCh0aGlzLmFjY2Vzc0ZsYWdzICYgQWNjRGVwcmVjYXRlZCkgIT0gMCkgeworCQkJcmV0dXJuIHRoaXMuaW5uZXJJbmZvLmdldE1vZGlmaWVycygpIHwgQWNjRGVwcmVjYXRlZDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmlubmVySW5mby5nZXRNb2RpZmllcnMoKTsKKwkJfQogCX0KIAlyZXR1cm4gdGhpcy5hY2Nlc3NGbGFnczsKIH0KQEAgLTcwOSw4ICs3MTQsNiBAQAogCQkJCXJldHVybiBjdXJyZW50Q29uc3RhbnQuYm9vbGVhblZhbHVlKCkgIT0gb3RoZXJDb25zdGFudC5ib29sZWFuVmFsdWUoKTsKIAkJCWNhc2UgVHlwZUlkcy5UX1N0cmluZyA6CiAJCQkJcmV0dXJuICFjdXJyZW50Q29uc3RhbnQuc3RyaW5nVmFsdWUoKS5lcXVhbHMob3RoZXJDb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKLQkJCWNhc2UgVHlwZUlkcy5UX251bGwgOgotCQkJCXJldHVybiBvdGhlckNvbnN0YW50ICE9IE51bGxDb25zdGFudC5EZWZhdWx0OwogCQl9CiAJfQogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQppbmRleCA5ZjFlZjUxLi4zMjllNmZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvQ2xhc3NGaWxlU3RydWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRmlsZVN0cnVjdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10OwogCiBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ2xhc3NGaWxlU3RydWN0IGltcGxlbWVudHMgQ2xhc3NGaWxlQ29uc3RhbnRzIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKaW5kZXggYjBiYjUxZS4uYWQ2M2VlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CiAKIHB1YmxpYyBjbGFzcyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvRmllbGRJbmZvLmphdmEKaW5kZXggZDA0ZGQwNy4uYWYxOWNiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0ZpZWxkSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9GaWVsZEluZm8uamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQm9vbGVhbkNvbnN0YW50OwpAQCAtMjMsNyArMjQsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlNob3J0Q29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuU3RyaW5nQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBGaWVsZEluZm8gZXh0ZW5kcyBDbGFzc0ZpbGVTdHJ1Y3QgaW1wbGVtZW50cyBBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cywgSUJpbmFyeUZpZWxkLCBDb21wYXJhYmxlLCBUeXBlSWRzIHsKIAlwcml2YXRlIENvbnN0YW50IGNvbnN0YW50OwpAQCAtMzMsNyArMzMsNiBAQAogCXByaXZhdGUgaW50IGFjY2Vzc0ZsYWdzOwogCXByaXZhdGUgY2hhcltdIG5hbWU7CiAJcHJpdmF0ZSBjaGFyW10gc2lnbmF0dXJlOwotCXByaXZhdGUgaW50IGF0dHJpYnV0ZXNDb3VudDsKIAlwcml2YXRlIGludCBhdHRyaWJ1dGVCeXRlczsKIAlwcml2YXRlIE9iamVjdCB3cmFwcGVkQ29uc3RhbnRWYWx1ZTsKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L0lubmVyQ2xhc3NJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQppbmRleCAyM2Y4MDdhLi5kMTI0NWM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvSW5uZXJDbGFzc0luZm8uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU5lc3RlZFR5cGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NsYXNzZm10L01ldGhvZEluZm8uamF2YQppbmRleCA2MGUwZmE5Li5mMDRiYzlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY2xhc3NmbXQvTWV0aG9kSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jbGFzc2ZtdC9NZXRob2RJbmZvLmphdmEKQEAgLTEsMTggKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQ7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgTWV0aG9kSW5mbyBleHRlbmRzIENsYXNzRmlsZVN0cnVjdCBpbXBsZW1lbnRzIElCaW5hcnlNZXRob2QsIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLCBDb21wYXJhYmxlIHsKIAlwcml2YXRlIGNoYXJbXVtdIGV4Y2VwdGlvbk5hbWVzOwpAQCAtMjIsMTAgKzIyLDggQEAKIAlwcml2YXRlIGludCBhY2Nlc3NGbGFnczsKIAlwcml2YXRlIGNoYXJbXSBuYW1lOwogCXByaXZhdGUgY2hhcltdIHNpZ25hdHVyZTsKLQlwcml2YXRlIGludCBhdHRyaWJ1dGVzQ291bnQ7CiAJcHJpdmF0ZSBpbnQgYXR0cmlidXRlQnl0ZXM7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhcltdW10gbm9FeGNlcHRpb24gPSBuZXcgY2hhclswXVswXTsKLQlwcml2YXRlIGludCBkZWNvZGVJbmRleDsKKwlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyW11bXSBub0V4Y2VwdGlvbiA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwogLyoqCiAgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgYnl0ZVtdCiAgKiBAcGFyYW0gb2Zmc2V0cyBpbnRbXQpAQCAtMjM1LDQgKzIzMyw0IEBACiAJdGhpcy5jb25zdGFudFBvb2xPZmZzZXRzID0gbnVsbDsKIAlzdXBlci5yZXNldCgpOwogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0F0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9BdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCmluZGV4IDdiNmRiMWYuLjhiZGE4OTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0F0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCiBwdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Nhc2VMYWJlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKaW5kZXggYmU3YjkyYi4uNjlhMGQ1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2FzZUxhYmVsLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKIAogcHVibGljIGNsYXNzIENhc2VMYWJlbCBleHRlbmRzIExhYmVsIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9DaGFyQXJyYXlDYWNoZS5qYXZhCmluZGV4IDc3ZTlhY2QuLjc3ZmRkMWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NoYXJBcnJheUNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ2hhckFycmF5Q2FjaGUuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgQ2hhckFycmF5Q2FjaGUgewogCS8vIHRvIGF2b2lkIHVzaW5nIEVudW1lcmF0aW9ucywgd2FsayB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgc2tpcHBpbmcgbnVsbHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvZGVTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvZGVTdHJlYW0uamF2YQppbmRleCBmNmRjM2YwLi4xNTljNTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Db2RlU3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29kZVN0cmVhbS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKQEAgLTE0ODQsMTQgKzE0ODQsOCBAQAogCQljYXNlIFRfZG91YmxlIDoKIAkJCWdlbmVyYXRlSW5saW5lZFZhbHVlKGNvbnN0YW50LmRvdWJsZVZhbHVlKCkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgVF9TdHJpbmcgOgotCQkJdGhpcy5sZGMoY29uc3RhbnQuc3RyaW5nVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdCA6IC8vcmVmZXJlbmNlIG9iamVjdCAoY29uc3RhbnQgY2FuIGJlIGZyb20gVF9udWxsIG9yIFRfU3RyaW5nKQotCQkJaWYgKGNvbnN0YW50LnR5cGVJRCgpID09IFRfU3RyaW5nKQotCQkJCWxkYyhjb25zdGFudC5zdHJpbmdWYWx1ZSgpKTsKLQkJCWVsc2UKLQkJCQlhY29uc3RfbnVsbCgpOworCQlkZWZhdWx0IDogLy9TdHJpbmcgb3IgT2JqZWN0CisJCQlsZGMoY29uc3RhbnQuc3RyaW5nVmFsdWUoKSk7CiAJfQogfQogLyoqCkBAIC0xNzczLDIxICsxNzY3LDI4IEBACiAJZWxzZQogCQl0aGlzLmljb25zdF8wKCk7CiB9Ci1wdWJsaWMgdm9pZCBnZW5lcmF0ZU91dGVyQWNjZXNzKE9iamVjdFtdIG1hcHBpbmdTZXF1ZW5jZSwgQXN0Tm9kZSBpbnZvY2F0aW9uU2l0ZSwgU2NvcGUgc2NvcGUpIHsKLQlpZiAobWFwcGluZ1NlcXVlbmNlID09IG51bGwpCi0JCXJldHVybjsKLQlpZiAobWFwcGluZ1NlcXVlbmNlID09IEJsb2NrU2NvcGUuRW11bGF0aW9uUGF0aFRvSW1wbGljaXRUaGlzKSB7Ci0JCWlmIChzY29wZS5tZXRob2RTY29wZSgpLmlzQ29uc3RydWN0b3JDYWxsKXsKLQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmVycm9yVGhpc1N1cGVySW5TdGF0aWMoaW52b2NhdGlvblNpdGUpOworcHVibGljIHZvaWQgZ2VuZXJhdGVPdXRlckFjY2VzcyhPYmplY3RbXSBtYXBwaW5nU2VxdWVuY2UsIEFzdE5vZGUgaW52b2NhdGlvblNpdGUsIEJpbmRpbmcgdGFyZ2V0LCBTY29wZSBzY29wZSkgeworCWlmIChtYXBwaW5nU2VxdWVuY2UgPT0gbnVsbCkgeworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHsKKwkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOyAvL1RPRE86IChwaGlsaXBwZSkgc2hvdWxkIGltcHJvdmUgbG9jYWwgZW11bGF0aW9uIGZhaWx1cmUgcmVwb3J0aW5nCisJCX0gZWxzZSB7CisJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5ub1N1Y2hFbmNsb3NpbmdJbnN0YW5jZSgoUmVmZXJlbmNlQmluZGluZyl0YXJnZXQsIGludm9jYXRpb25TaXRlLCBmYWxzZSk7CiAJCX0KLQkJdGhpcy5hbG9hZF8wKCk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKG1hcHBpbmdTZXF1ZW5jZVswXSBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCWlmIChtYXBwaW5nU2VxdWVuY2UgPT0gQmxvY2tTY29wZS5Ob0VuY2xvc2luZ0luc3RhbmNlSW5Db25zdHJ1Y3RvckNhbGwpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9TdWNoRW5jbG9zaW5nSW5zdGFuY2UoKFJlZmVyZW5jZUJpbmRpbmcpdGFyZ2V0LCBpbnZvY2F0aW9uU2l0ZSwgdHJ1ZSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKG1hcHBpbmdTZXF1ZW5jZSA9PSBCbG9ja1Njb3BlLk5vRW5jbG9zaW5nSW5zdGFuY2VJblN0YXRpY0NvbnRleHQpIHsKKwkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9TdWNoRW5jbG9zaW5nSW5zdGFuY2UoKFJlZmVyZW5jZUJpbmRpbmcpdGFyZ2V0LCBpbnZvY2F0aW9uU2l0ZSwgZmFsc2UpOworCQlyZXR1cm47CisJfQorCQorCWlmIChtYXBwaW5nU2VxdWVuY2UgPT0gQmxvY2tTY29wZS5FbXVsYXRpb25QYXRoVG9JbXBsaWNpdFRoaXMpIHsKKwkJdGhpcy5hbG9hZF8wKCk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKG1hcHBpbmdTZXF1ZW5jZVswXSBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgewogCQlGaWVsZEJpbmRpbmcgZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgbWFwcGluZ1NlcXVlbmNlWzBdOwotCQlpZiAoc2NvcGUubWV0aG9kU2NvcGUoKS5pc0NvbnN0cnVjdG9yQ2FsbCl7Ci0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5lcnJvclRoaXNTdXBlckluU3RhdGljKGludm9jYXRpb25TaXRlKTsKLQkJfQogCQl0aGlzLmFsb2FkXzAoKTsKIAkJdGhpcy5nZXRmaWVsZChmaWVsZEJpbmRpbmcpOwogCX0gZWxzZSB7CkBAIC0xODAyLDYgKzE4MDMsNyBAQAogCQl9CiAJfQogfQorCiAvKioKICAqIFRoZSBlcXVpdmFsZW50IGNvZGUgcGVyZm9ybXMgYSBzdHJpbmcgY29udmVyc2lvbjoKICAqCkBAIC0xODMyLDcyICsxODM0LDcwIEBACiAJdGhpcy5pbnZva2VTdHJpbmdCdWZmZXJUb1N0cmluZygpOwogfQogLyoqCi0gKiBDb2RlIHJlc3BvbnNpYmxlIHRvIGdlbmVyYXRlIHRoZSBzdWl0YWJsZSBjb2RlIHRvIHN1cHBseSB2YWx1ZXMgZm9yIHRoZSBzeW50aGV0aWMgYXJndW1lbnRzIG9mCi0gKiBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgYSBuZXN0ZWQgdHlwZS4KKyAqIENvZGUgcmVzcG9uc2libGUgdG8gZ2VuZXJhdGUgdGhlIHN1aXRhYmxlIGNvZGUgdG8gc3VwcGx5IHZhbHVlcyBmb3IgdGhlIHN5bnRoZXRpYyBlbmNsb3NpbmcKKyAqIGluc3RhbmNlIGFyZ3VtZW50cyBvZiBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgYSBuZXN0ZWQgdHlwZS4KICAqLwotcHVibGljIHZvaWQgZ2VuZXJhdGVTeW50aGV0aWNBcmd1bWVudFZhbHVlcyhCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlLCBFeHByZXNzaW9uIGVuY2xvc2luZ0luc3RhbmNlLCBBc3ROb2RlIGludm9jYXRpb25TaXRlKSB7CitwdWJsaWMgdm9pZCBnZW5lcmF0ZVN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVmFsdWVzKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUsIEV4cHJlc3Npb24gZW5jbG9zaW5nSW5zdGFuY2UsIEFzdE5vZGUgaW52b2NhdGlvblNpdGUpIHsKKworCS8vIHN1cHBseWluZyBlbmNsb3NpbmcgaW5zdGFuY2UgZm9yIHRoZSBhbm9ueW1vdXMgdHlwZSdzIHN1cGVyY2xhc3MKKwlSZWZlcmVuY2VCaW5kaW5nIGNoZWNrZWRUYXJnZXRUeXBlID0gdGFyZ2V0VHlwZS5pc0Fub255bW91c1R5cGUoKSA/IHRhcmdldFR5cGUuc3VwZXJjbGFzcygpIDogdGFyZ2V0VHlwZTsKKwlib29sZWFuIGhhc0V4dHJhRW5jbG9zaW5nSW5zdGFuY2UgPSBlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsOworCWlmIChoYXNFeHRyYUVuY2xvc2luZ0luc3RhbmNlIAorCQkJJiYgKCFjaGVja2VkVGFyZ2V0VHlwZS5pc05lc3RlZFR5cGUoKSB8fCBjaGVja2VkVGFyZ2V0VHlwZS5pc1N0YXRpYygpKSkgeworCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oZW5jbG9zaW5nSW5zdGFuY2UsIGNoZWNrZWRUYXJnZXRUeXBlKTsKKwkJcmV0dXJuOworCX0KIAogCS8vIHBlcmZvcm0gc29tZSBlbXVsYXRpb24gd29yayBpbiBjYXNlIHRoZXJlIGlzIHNvbWUgYW5kIHdlIGFyZSBpbnNpZGUgYSBsb2NhbCB0eXBlIG9ubHkKIAlSZWZlcmVuY2VCaW5kaW5nW10gc3ludGhldGljQXJndW1lbnRUeXBlczsKLQotCS8vIGdlbmVyYXRlIHRoZSBlbmNsb3NpbmcgaW5zdGFuY2UgZmlyc3QKIAlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSB0YXJnZXRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKSkgIT0gbnVsbCkgewogCi0JCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSA9IHRhcmdldFR5cGUuaXNBbm9ueW1vdXNUeXBlKCkgPyAKLQkJCQl0YXJnZXRUeXBlLnN1cGVyY2xhc3MoKS5lbmNsb3NpbmdUeXBlKCkgLy8gc3VwcGx5aW5nIGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgdGhlIGFub255bW91cyB0eXBlJ3Mgc3VwZXJjbGFzcwotCQkJCTogdGFyZ2V0VHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQkJCisJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSA9IGNoZWNrZWRUYXJnZXRUeXBlLmVuY2xvc2luZ1R5cGUoKTsKKwkJYm9vbGVhbiBuZWVkRW5jbG9zaW5nSW5zdGFuY2VOdWxsQ2hlY2sgPSBjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80OworCQkJCQkJCiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQlSZWZlcmVuY2VCaW5kaW5nIHN5bnRoZXRpY0FyZ1R5cGUgPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzW2ldOwotCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlICE9IG51bGwgJiYgaSA9PSAwKSB7Ci0JCQkJaWYgKHN5bnRoZXRpY0FyZ1R5cGUgIT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSkgewotCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oZW5jbG9zaW5nSW5zdGFuY2UsIHRhcmdldFR5cGUpOwotCQkJCX0KLQkJCQkvL2lmIChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KXsKKwkJCWlmIChoYXNFeHRyYUVuY2xvc2luZ0luc3RhbmNlICYmIHN5bnRoZXRpY0FyZ1R5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSkgeworCQkJCWhhc0V4dHJhRW5jbG9zaW5nSW5zdGFuY2UgPSBmYWxzZTsKIAkJCQllbmNsb3NpbmdJbnN0YW5jZS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCB0aGlzLCB0cnVlKTsKLQkJCQlpZiAoc3ludGhldGljQXJnVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKXsKLQkJCQkJdGhpcy5kdXAoKTsKLQkJCQl9IAotCQkJCXRoaXMuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gY2F1c2VzIG51bGwgY2hlY2sgZm9yIGFsbCBleHBsaWNpdCBlbmNsb3NpbmcgaW5zdGFuY2VzCi0JCQkJdGhpcy5wb3AoKTsKLQkJCQkvL30gZWxzZSB7Ci0JCQkJLy8JZW5jbG9zaW5nSW5zdGFuY2UuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgdGhpcywgc3ludGhldGljQXJnVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKTsKLQkJCQkvL30JCQkKLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRDb21wYXRpYmxlRW11bGF0aW9uUGF0aChzeW50aGV0aWNBcmdUeXBlKTsKLQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5taXNzaW5nRW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKHN5bnRoZXRpY0FyZ1R5cGUsIGludm9jYXRpb25TaXRlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgaW52b2NhdGlvblNpdGUsIGN1cnJlbnRTY29wZSk7CisJCQkJaWYgKG5lZWRFbmNsb3NpbmdJbnN0YW5jZU51bGxDaGVjayl7CisJCQkJCWR1cCgpOworCQkJCQlpbnZva2VPYmplY3RHZXRDbGFzcygpOyAvLyB3aWxsIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQlwb3AoKTsKIAkJCQl9CisJCQkJCisJCQl9IGVsc2UgeworCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCgKKwkJCQkJc3ludGhldGljQXJnVHlwZSwgCisJCQkJCWZhbHNlIC8qbm90IG9ubHkgZXhhY3QgbWF0Y2ggKGkuZS4gYWxsb3cgY29tcGF0aWJsZSkqLywKKwkJCQkJdGFyZ2V0VHlwZS5pc0Fub255bW91c1R5cGUoKSk7CisJCQkJdGhpcy5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIGludm9jYXRpb25TaXRlLCBzeW50aGV0aWNBcmdUeXBlLCBjdXJyZW50U2NvcGUpOwogCQkJfQogCQl9Ci0JfSBlbHNlIHsgLy8gd2UgbWF5IHN0aWxsIGhhdmUgYW4gZW5jbG9zaW5nIGluc3RhbmNlIHRvIGNvbnNpZGVyCi0JCWlmIChlbmNsb3NpbmdJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oZW5jbG9zaW5nSW5zdGFuY2UsIHRhcmdldFR5cGUpOwotCQkJLy9pZiAoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCl7Ci0JCQllbmNsb3NpbmdJbnN0YW5jZS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCB0aGlzLCB0cnVlKTsKLQkJCXRoaXMuaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gY2F1c2VzIG51bGwgY2hlY2sgZm9yIGFsbCBleHBsaWNpdCBlbmNsb3NpbmcgaW5zdGFuY2VzCi0JCQl0aGlzLnBvcCgpOwotCQkJLy99IGVsc2UgewotCQkJLy8JZW5jbG9zaW5nSW5zdGFuY2UuZ2VuZXJhdGVDb2RlKGN1cnJlbnRTY29wZSwgdGhpcywgZmFsc2UpOyAvLyBkbyBub3Qgd2FudCB0aGUgdmFsdWUKLQkJCS8vfQkJCQorCQlpZiAoaGFzRXh0cmFFbmNsb3NpbmdJbnN0YW5jZSl7CisJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkudW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZVNwZWNpZmljYXRpb24oZW5jbG9zaW5nSW5zdGFuY2UsIGNoZWNrZWRUYXJnZXRUeXBlKTsKIAkJfQogCX0KK30KKworLyoqCisgKiBDb2RlIHJlc3BvbnNpYmxlIHRvIGdlbmVyYXRlIHRoZSBzdWl0YWJsZSBjb2RlIHRvIHN1cHBseSB2YWx1ZXMgZm9yIHRoZSBzeW50aGV0aWMgb3V0ZXIgbG9jYWwKKyAqIHZhcmlhYmxlIGFyZ3VtZW50cyBvZiBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24gb2YgYSBuZXN0ZWQgdHlwZS4KKyAqIChidWcgMjYxMjIpIC0gc3ludGhldGljIHZhbHVlcyBmb3Igb3V0ZXIgbG9jYWxzIG11c3QgYmUgcGFzc2VkIGFmdGVyIHVzZXIgYXJndW1lbnRzLCBlLmcuIG5ldyBYKGkgPSAxKXt9CisgKi8KK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3ludGhldGljT3V0ZXJBcmd1bWVudFZhbHVlcyhCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlLCBBc3ROb2RlIGludm9jYXRpb25TaXRlKSB7CisKIAkvLyBnZW5lcmF0ZSB0aGUgc3ludGhldGljIG91dGVyIGFyZ3VtZW50cyB0aGVuCiAJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoZXRpY0FyZ3VtZW50c1tdOwogCWlmICgoc3ludGhldGljQXJndW1lbnRzID0gdGFyZ2V0VHlwZS5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkpICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJVmFyaWFibGVCaW5kaW5nW10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHN5bnRoZXRpY0FyZ3VtZW50c1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOwotCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgewotCQkJCS8vIGNvdWxkIG5vdCBlbXVsYXRlIGEgcGF0aCB0byBhIGdpdmVuIG91dGVyIGxvY2FsIHZhcmlhYmxlIChpbnRlcm5hbCBlcnJvcikKLQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCBpbnZvY2F0aW9uU2l0ZSwgY3VycmVudFNjb3BlKTsKLQkJCX0KKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIHRhcmdldFZhcmlhYmxlID0gc3ludGhldGljQXJndW1lbnRzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZTsKKwkJCVZhcmlhYmxlQmluZGluZ1tdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCh0YXJnZXRWYXJpYWJsZSk7CisJCQl0aGlzLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgaW52b2NhdGlvblNpdGUsIHRhcmdldFZhcmlhYmxlLCBjdXJyZW50U2NvcGUpOwogCQl9CiAJfQogfQorCiAvKioKICAqIEBwYXJhbSBwYXJhbWV0ZXJzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmdbXQogICogQHBhcmFtIGNvbnN0cnVjdG9yQmluZGluZyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcKQEAgLTE5MjIsNyArMTkyMiwxOCBAQAogCQkJZWxzZQogCQkJCXJlc29sdmVkUG9zaXRpb24rKzsKIAkJfQotCQlzeW50aGV0aWNBcmd1bWVudHMgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKKwl9CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlsb2FkKHBhcmFtZXRlcnNbaV0sIHJlc29sdmVkUG9zaXRpb24pOworCQlpZiAoKHBhcmFtZXRlcnNbaV0gPT0gRG91YmxlQmluZGluZykgfHwgKHBhcmFtZXRlcnNbaV0gPT0gTG9uZ0JpbmRpbmcpKQorCQkJcmVzb2x2ZWRQb3NpdGlvbiArPSAyOworCQllbHNlCisJCQlyZXNvbHZlZFBvc2l0aW9uKys7CisJfQorCQorCWlmIChjb25zdHJ1Y3RvckJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJTmVzdGVkVHlwZUJpbmRpbmcgbmVzdGVkVHlwZSA9IChOZXN0ZWRUeXBlQmluZGluZykgY29uc3RydWN0b3JCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBuZXN0ZWRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCAoc3ludGhldGljQXJndW1lbnRzID09IG51bGwgPyAwIDogc3ludGhldGljQXJndW1lbnRzLmxlbmd0aCk7IGkrKykgewogCQkJVHlwZUJpbmRpbmcgdHlwZTsKIAkJCWxvYWQoKHR5cGUgPSBzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZSksIHJlc29sdmVkUG9zaXRpb24pOwpAQCAtMTkzMiwxMyArMTk0Myw2IEBACiAJCQkJcmVzb2x2ZWRQb3NpdGlvbisrOwogCQl9CiAJfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJbG9hZChwYXJhbWV0ZXJzW2ldLCByZXNvbHZlZFBvc2l0aW9uKTsKLQkJaWYgKChwYXJhbWV0ZXJzW2ldID09IERvdWJsZUJpbmRpbmcpIHx8IChwYXJhbWV0ZXJzW2ldID09IExvbmdCaW5kaW5nKSkKLQkJCXJlc29sdmVkUG9zaXRpb24gKz0gMjsKLQkJZWxzZQotCQkJcmVzb2x2ZWRQb3NpdGlvbisrOwotCX0KIAl0aGlzLmludm9rZXNwZWNpYWwoY29uc3RydWN0b3JCaW5kaW5nKTsKIAl0aGlzLnJldHVybl8oKTsKIH0KQEAgLTIwMDksNyArMjAxMyw3IEBACiAJCWlmIChtZXRob2RCaW5kaW5nLmlzQ29uc3RydWN0b3IoKQogCQkJfHwgbWV0aG9kQmluZGluZy5pc1ByaXZhdGUoKQogCQkJLy8gcXVhbGlmaWVkIHN1cGVyICJYLnN1cGVyLmZvbygpIiB0YXJnZXRzIG1ldGhvZHMgZnJvbSBzdXBlcmNsYXNzCi0JCQl8fCAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzKSl7CisJCQl8fCBhY2Nlc3NCaW5kaW5nLmFjY2Vzc1R5cGUgPT0gU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5TdXBlck1ldGhvZEFjY2Vzcyl7CiAJCQl0aGlzLmludm9rZXNwZWNpYWwobWV0aG9kQmluZGluZyk7CiAJCX0gZWxzZSB7CiAJCQlpZiAobWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0ludGVyZmFjZSgpKXsKQEAgLTMwMTQsOCArMzAxOCwxMiBAQAogCXdyaXRlVW5zaWduZWRCeXRlKGFyZ0NvdW50KTsKIAkvLyBHZW5lcmF0ZSBhICAwIGludG8gdGhlIGJ5dGUgYXJyYXkuIExpa2UgdGhlIGFycmF5IGlzIGFscmVhZHkgZmlsbCB3aXRoIDAsIHdlIGp1c3QgbmVlZCB0byBpbmNyZW1lbnQKIAkvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgotCXBvc2l0aW9uKys7Ci0JY2xhc3NGaWxlT2Zmc2V0Kys7CisJdHJ5IHsKKwkJcG9zaXRpb24rKzsKKwkJYkNvZGVTdHJlYW1bY2xhc3NGaWxlT2Zmc2V0KytdID0gMDsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJcmVzaXplQnl0ZUFycmF5KChieXRlKTApOworCX0KIAlpZiAoKChpZCA9IG1ldGhvZEJpbmRpbmcucmV0dXJuVHlwZS5pZCkgPT0gVF9kb3VibGUpIHx8IChpZCA9PSBUX2xvbmcpKQogCQlzdGFja0RlcHRoICs9ICgyIC0gYXJnQ291bnQpOwogCWVsc2UKQEAgLTM1MDQsNiArMzUxMiwxMCBAQAogCX0KIH0KIGZpbmFsIHB1YmxpYyB2b2lkIGpzcihMYWJlbCBsYmwpIHsKKwlpZiAodGhpcy53aWRlTW9kZSkgeworCQl0aGlzLmpzcl93KGxibCk7CisJCXJldHVybjsKKwl9CiAJY291bnRMYWJlbHMgPSAwOwogCXRyeSB7CiAJCXBvc2l0aW9uKys7CkBAIC00MDE4LDYgKzQwMzAsOSBAQAogCQkJY2FzZSAzIDoKIAkJCQl0aGlzLmlsb2FkXzMoKTsKIAkJCQlicmVhazsKKwkJCS8vY2FzZSAtMSA6CisJCQkvLyBpbnRlcm5hbCBmYWlsdXJlOiB0cnlpbmcgdG8gbG9hZCB2YXJpYWJsZSBub3Qgc3VwcG9zZWQgdG8gYmUgZ2VuZXJhdGVkCisJCQkvLwlicmVhazsKIAkJCWRlZmF1bHQgOgogCQkJCXRoaXMuaWxvYWQocmVzb2x2ZWRQb3NpdGlvbik7CiAJCX0KQEAgLTQyOTYsOCArNDMxMSwxMiBAQAogCQlyZXNpemVCeXRlQXJyYXkoT1BDX2xvb2t1cHN3aXRjaCk7CiAJfQogCWZvciAoaW50IGkgPSAoMyAtIChwb3MgJSA0KSk7IGkgPiAwOyBpLS0pIHsKLQkJcG9zaXRpb24rKzsgLy8gUGFkZGluZwotCQljbGFzc0ZpbGVPZmZzZXQrKzsKKwkJdHJ5IHsKKwkJCXBvc2l0aW9uKys7CisJCQliQ29kZVN0cmVhbVtjbGFzc0ZpbGVPZmZzZXQrK10gPSAwOworCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCXJlc2l6ZUJ5dGVBcnJheSgoYnl0ZSkwKTsKKwkJfQogCX0KIAlkZWZhdWx0TGFiZWwuYnJhbmNoKCk7CiAJd3JpdGVTaWduZWRXb3JkKGxlbmd0aCk7CkBAIC00ODA4LDEyICs0ODI3LDE5IEBACiAJCQkJaWYgKGluc2VydGlvbkluZGV4ICE9IC0xKSB7CiAJCQkJCS8vIHdpZGVuIHRoZSBleGlzdGluZyBlbnRyeQogCQkJCQkvLyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byBtb3ZlIHRoZSBsYXN0IGVudHJ5IGF0IGFub3RoZXIgbG9jYXRpb24gdG8ga2VlcCBhIHNvcnRlZCB0YWJsZQotCQkJCQlpZiAoKHBjVG9Tb3VyY2VNYXBTaXplID4gNCkgJiYgKHBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSA0XSA+IHN0YXJ0UEMpKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCBwY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCArIDIsIHBjVG9Tb3VyY2VNYXBTaXplIC0gMiAtIGluc2VydGlvbkluZGV4KTsKLQkJCQkJCXBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXgrK10gPSBzdGFydFBDOwotCQkJCQkJcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleF0gPSBuZXdMaW5lOwkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJcGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDJdID0gc3RhcnRQQzsKKwkJCQkJLyogRmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBhdCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIHRoZXJlIGlzIG5vdCBhbiBleGlzdGluZyBlbnRyeQorCQkJCQkgKiB0aGF0IGluY2x1ZGVzIHRoZSBvbmUgd2Ugd2FudCB0byBpbnNlcnQuIFRoaXMgaXMgdGhlIGNhc2UgaWYgcGNUb1NvdXJjZU1hcFtpbnNlcnRpb25JbmRleCAtIDFdID09IG5ld0xpbmUuCisJCQkJCSAqIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgdGFibGUuIElmIG5vdCwgd2Ugd2FudCB0byBpbnNlcnQgYSBuZXcgZW50cnkuIFByaW9yIHRvIGluc2VydGlvbgorCQkJCQkgKiB3ZSB3YW50IHRvIGNoZWNrIGlmIGl0IGlzIHdvcnRoIGRvaW5nIGFuIGFycmF5Y29weS4gSWYgbm90IHdlIHNpbXBseSB1cGRhdGUgdGhlIHJlY29yZGVkIHBjLgorCQkJCQkgKi8KKwkJCQkJaWYgKCEoKGluc2VydGlvbkluZGV4ID4gMSkgJiYgKHBjVG9Tb3VyY2VNYXBbaW5zZXJ0aW9uSW5kZXggLSAxXSA9PSBuZXdMaW5lKSkpIHsKKwkJCQkJCWlmICgocGNUb1NvdXJjZU1hcFNpemUgPiA0KSAmJiAocGNUb1NvdXJjZU1hcFtwY1RvU291cmNlTWFwU2l6ZSAtIDRdID4gc3RhcnRQQykpIHsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBjVG9Tb3VyY2VNYXAsIGluc2VydGlvbkluZGV4LCBwY1RvU291cmNlTWFwLCBpbnNlcnRpb25JbmRleCArIDIsIHBjVG9Tb3VyY2VNYXBTaXplIC0gMiAtIGluc2VydGlvbkluZGV4KTsKKwkJCQkJCQlwY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4KytdID0gc3RhcnRQQzsKKwkJCQkJCQlwY1RvU291cmNlTWFwW2luc2VydGlvbkluZGV4XSA9IG5ld0xpbmU7CQkJCQkJCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXBjVG9Tb3VyY2VNYXBbcGNUb1NvdXJjZU1hcFNpemUgLSAyXSA9IHN0YXJ0UEM7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC01MTM0LDExNSArNTE2MCwxMTggQEAKIAkJCXNvcnQodGFiLCBsbywgaGkwLCByZXN1bHQpOwogCX0KIH0KKwogcHVibGljIGZpbmFsIHZvaWQgc3RvcmUoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQlUeXBlQmluZGluZyB0eXBlID0gbG9jYWxCaW5kaW5nLnR5cGU7CiAJaW50IHBvc2l0aW9uID0gbG9jYWxCaW5kaW5nLnJlc29sdmVkUG9zaXRpb247CiAJLy8gVXNpbmcgZGVkaWNhdGVkIGludCBieXRlY29kZQotCWlmICgodHlwZSA9PSBJbnRCaW5kaW5nKSB8fCAodHlwZSA9PSBDaGFyQmluZGluZykgfHwgKHR5cGUgPT0gQnl0ZUJpbmRpbmcpIHx8ICh0eXBlID09IFNob3J0QmluZGluZykgfHwgKHR5cGUgPT0gQm9vbGVhbkJpbmRpbmcpKSB7Ci0JCWlmICh2YWx1ZVJlcXVpcmVkKQotCQkJdGhpcy5kdXAoKTsKLQkJc3dpdGNoIChwb3NpdGlvbikgewotCQkJY2FzZSAwIDoKLQkJCQl0aGlzLmlzdG9yZV8wKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEgOgotCQkJCXRoaXMuaXN0b3JlXzEoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMiA6Ci0JCQkJdGhpcy5pc3RvcmVfMigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQl0aGlzLmlzdG9yZV8zKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aGlzLmlzdG9yZShwb3NpdGlvbik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkvLyBVc2luZyBkZWRpY2F0ZWQgZmxvYXQgYnl0ZWNvZGUKLQlpZiAodHlwZSA9PSBGbG9hdEJpbmRpbmcpIHsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpCi0JCQl0aGlzLmR1cCgpOwotCQlzd2l0Y2ggKHBvc2l0aW9uKSB7Ci0JCQljYXNlIDAgOgotCQkJCXRoaXMuZnN0b3JlXzAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMSA6Ci0JCQkJdGhpcy5mc3RvcmVfMSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQl0aGlzLmZzdG9yZV8yKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMgOgotCQkJCXRoaXMuZnN0b3JlXzMoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRoaXMuZnN0b3JlKHBvc2l0aW9uKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8vIFVzaW5nIGRlZGljYXRlZCBsb25nIGJ5dGVjb2RlCi0JaWYgKHR5cGUgPT0gTG9uZ0JpbmRpbmcpIHsKLQkJaWYgKHZhbHVlUmVxdWlyZWQpCi0JCQl0aGlzLmR1cDIoKTsKLQkJc3dpdGNoIChwb3NpdGlvbikgewotCQkJY2FzZSAwIDoKLQkJCQl0aGlzLmxzdG9yZV8wKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEgOgotCQkJCXRoaXMubHN0b3JlXzEoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMiA6Ci0JCQkJdGhpcy5sc3RvcmVfMigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQl0aGlzLmxzdG9yZV8zKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aGlzLmxzdG9yZShwb3NpdGlvbik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkvLyBVc2luZyBkZWRpY2F0ZWQgZG91YmxlIGJ5dGVjb2RlCi0JaWYgKHR5cGUgPT0gRG91YmxlQmluZGluZykgewotCQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJCXRoaXMuZHVwMigpOwotCQlzd2l0Y2ggKHBvc2l0aW9uKSB7Ci0JCQljYXNlIDAgOgotCQkJCXRoaXMuZHN0b3JlXzAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMSA6Ci0JCQkJdGhpcy5kc3RvcmVfMSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQl0aGlzLmRzdG9yZV8yKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMgOgotCQkJCXRoaXMuZHN0b3JlXzMoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRoaXMuZHN0b3JlKHBvc2l0aW9uKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCS8vIFJlZmVyZW5jZSBvYmplY3QKLQlpZiAodmFsdWVSZXF1aXJlZCkKLQkJdGhpcy5kdXAoKTsKLQlzd2l0Y2ggKHBvc2l0aW9uKSB7Ci0JCWNhc2UgMCA6Ci0JCQl0aGlzLmFzdG9yZV8wKCk7CisJc3dpdGNoKGxvY2FsQmluZGluZy50eXBlLmlkKSB7CisJCWNhc2UgVHlwZUlkcy5UX2ludCA6CisJCWNhc2UgVHlwZUlkcy5UX2NoYXIgOgorCQljYXNlIFR5cGVJZHMuVF9ieXRlIDoKKwkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgorCQljYXNlIFR5cGVJZHMuVF9ib29sZWFuIDoKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCXRoaXMuZHVwKCk7CisJCQlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCQkJY2FzZSAwIDoKKwkJCQkJdGhpcy5pc3RvcmVfMCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEgOgorCQkJCQl0aGlzLmlzdG9yZV8xKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMiA6CisJCQkJCXRoaXMuaXN0b3JlXzIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzIDoKKwkJCQkJdGhpcy5pc3RvcmVfMygpOworCQkJCQlicmVhazsKKwkJCQkvL2Nhc2UgLTEgOgorCQkJCS8vIGludGVybmFsIGZhaWx1cmU6IHRyeWluZyB0byBzdG9yZSBpbnRvIHZhcmlhYmxlIG5vdCBzdXBwb3NlZCB0byBiZSBnZW5lcmF0ZWQKKwkJCQkvLwlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJdGhpcy5pc3RvcmUocG9zaXRpb24pOworCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgMSA6Ci0JCQl0aGlzLmFzdG9yZV8xKCk7CisJCWNhc2UgVHlwZUlkcy5UX2Zsb2F0IDoKKwkJCWlmICh2YWx1ZVJlcXVpcmVkKQorCQkJCXRoaXMuZHVwKCk7CisJCQlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCQkJY2FzZSAwIDoKKwkJCQkJdGhpcy5mc3RvcmVfMCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEgOgorCQkJCQl0aGlzLmZzdG9yZV8xKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMiA6CisJCQkJCXRoaXMuZnN0b3JlXzIoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzIDoKKwkJCQkJdGhpcy5mc3RvcmVfMygpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJdGhpcy5mc3RvcmUocG9zaXRpb24pOworCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2UgMiA6Ci0JCQl0aGlzLmFzdG9yZV8yKCk7CisJCWNhc2UgVHlwZUlkcy5UX2RvdWJsZSA6CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQl0aGlzLmR1cDIoKTsKKwkJCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJCQljYXNlIDAgOgorCQkJCQl0aGlzLmRzdG9yZV8wKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMSA6CisJCQkJCXRoaXMuZHN0b3JlXzEoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyIDoKKwkJCQkJdGhpcy5kc3RvcmVfMigpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMgOgorCQkJCQl0aGlzLmRzdG9yZV8zKCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQl0aGlzLmRzdG9yZShwb3NpdGlvbik7CisJCQl9CiAJCQlicmVhazsKLQkJY2FzZSAzIDoKLQkJCXRoaXMuYXN0b3JlXzMoKTsKKwkJY2FzZSBUeXBlSWRzLlRfbG9uZyA6CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQl0aGlzLmR1cDIoKTsKKwkJCXN3aXRjaCAocG9zaXRpb24pIHsKKwkJCQljYXNlIDAgOgorCQkJCQl0aGlzLmxzdG9yZV8wKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMSA6CisJCQkJCXRoaXMubHN0b3JlXzEoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyIDoKKwkJCQkJdGhpcy5sc3RvcmVfMigpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMgOgorCQkJCQl0aGlzLmxzdG9yZV8zKCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQl0aGlzLmxzdG9yZShwb3NpdGlvbik7CisJCQl9CiAJCQlicmVhazsKLQkJZGVmYXVsdCA6Ci0JCQl0aGlzLmFzdG9yZShwb3NpdGlvbik7CisJCWRlZmF1bHQ6CisJCQkvLyBSZWZlcmVuY2Ugb2JqZWN0CisJCQlpZiAodmFsdWVSZXF1aXJlZCkKKwkJCQl0aGlzLmR1cCgpOworCQkJc3dpdGNoIChwb3NpdGlvbikgeworCQkJCWNhc2UgMCA6CisJCQkJCXRoaXMuYXN0b3JlXzAoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxIDoKKwkJCQkJdGhpcy5hc3RvcmVfMSgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDIgOgorCQkJCQl0aGlzLmFzdG9yZV8yKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMyA6CisJCQkJCXRoaXMuYXN0b3JlXzMoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCXRoaXMuYXN0b3JlKHBvc2l0aW9uKTsKKwkJCX0KIAl9CiB9CiBwdWJsaWMgZmluYWwgdm9pZCBzdG9yZShUeXBlQmluZGluZyB0eXBlLCBpbnQgcG9zaXRpb24pIHsKQEAgLTU0MTMsOCArNTQ0MiwxMiBAQAogCQlyZXNpemVCeXRlQXJyYXkoT1BDX3RhYmxlc3dpdGNoKTsKIAl9CiAJZm9yIChpbnQgaSA9ICgzIC0gKHBvcyAlIDQpKTsgaSA+IDA7IGktLSkgewotCQlwb3NpdGlvbisrOyAvLyBQYWRkaW5nCi0JCWNsYXNzRmlsZU9mZnNldCsrOworCQl0cnkgeworCQkJcG9zaXRpb24rKzsKKwkJCWJDb2RlU3RyZWFtW2NsYXNzRmlsZU9mZnNldCsrXSA9IDA7CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJcmVzaXplQnl0ZUFycmF5KChieXRlKTApOworCQl9CiAJfQogCWRlZmF1bHRMYWJlbC5icmFuY2goKTsKIAl3cml0ZVNpZ25lZFdvcmQobG93KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0NvbnN0YW50UG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29uc3RhbnRQb29sLmphdmEKaW5kZXggZjIzYjM2MS4uZDFkMzBmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29uc3RhbnRQb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vQ29uc3RhbnRQb29sLmphdmEKQEAgLTEsMjAgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7CiAKIC8qKgogICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHRoZSBjb25zdGFudCBwb29sIGVudHJpZXMuCkBAIC03MDEsNyArNzAxLDcgQEAKIAkJfQogCQlpZiAobGVuZ3RoID49IDY1NTM1KSB7CiAJCQljdXJyZW50T2Zmc2V0ID0gc2F2ZWRDdXJyZW50T2Zmc2V0IC0gMTsKLQkJCXJldHVybiAtMTsKKwkJCXRoaXMuY2xhc3NGaWxlLnJlZmVyZW5jZUJpbmRpbmcuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JDb25zdGFudCh0aGlzLmNsYXNzRmlsZS5yZWZlcmVuY2VCaW5kaW5nLnNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7CiAJCX0KIAkJaW5kZXggPSBVVEY4Q2FjaGUucHV0KHV0ZjhDb25zdGFudCwgY3VycmVudEluZGV4KTsKIAkJaWYgKGluZGV4ID4gMHhGRkZGKXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0RvdWJsZUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Eb3VibGVDYWNoZS5qYXZhCmluZGV4IGJkN2M1YmYuLjQ2NzM1OGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0RvdWJsZUNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRG91YmxlQ2FjaGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCiBwdWJsaWMgY2xhc3MgRG91YmxlQ2FjaGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRXhjZXB0aW9uTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0V4Y2VwdGlvbkxhYmVsLmphdmEKaW5kZXggMzNjODQ0ZS4uYjEyMDgzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRXhjZXB0aW9uTGFiZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9FeGNlcHRpb25MYWJlbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmllbGROYW1lQW5kVHlwZUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GaWVsZE5hbWVBbmRUeXBlQ2FjaGUuamF2YQppbmRleCA5MDM3YzI0Li4xZTA2OTMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GaWVsZE5hbWVBbmRUeXBlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GaWVsZE5hbWVBbmRUeXBlQ2FjaGUuamF2YQpAQCAtMSwxNyArMSwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgRmllbGROYW1lQW5kVHlwZUNhY2hlIHsKIAlwdWJsaWMgRmllbGRCaW5kaW5nIGtleVRhYmxlW107CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9GbG9hdENhY2hlLmphdmEKaW5kZXggZTUxZjgzOC4uYzgzYjVkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vRmxvYXRDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0Zsb2F0Q2FjaGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCiBwdWJsaWMgY2xhc3MgRmxvYXRDYWNoZSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9JbnRlZ2VyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ludGVnZXJDYWNoZS5qYXZhCmluZGV4IGZlYWZlOTMuLjUxYmE1ZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ludGVnZXJDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0ludGVnZXJDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIHB1YmxpYyBjbGFzcyBJbnRlZ2VyQ2FjaGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTGFiZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xhYmVsLmphdmEKaW5kZXggMjBkZWU4Yy4uZGZmNTAwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTGFiZWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9MYWJlbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkxvY2FsVmFyaWFibGVCaW5kaW5nOwpAQCAtNjQsOCArNjQsMTUgQEAKIAkJLy8gTGVhdmUgdHdvIGJ5dGVzIGZyZWUgdG8gZ2VuZXJhdGUgdGhlIGp1bXAgYWZ0ZXJ3YXJkcwogCQljb2RlU3RyZWFtLnBvc2l0aW9uICs9IDI7CiAJCWNvZGVTdHJlYW0uY2xhc3NGaWxlT2Zmc2V0ICs9IDI7Ci0JfSBlbHNlIHsgLy9Qb3NpdGlvbiBpcyBzZXQuIFdyaXRlIGl0IQotCQljb2RlU3RyZWFtLndyaXRlU2lnbmVkU2hvcnQoKHNob3J0KSAocG9zaXRpb24gLSBjb2RlU3RyZWFtLnBvc2l0aW9uICsgMSkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFBvc2l0aW9uIGlzIHNldC4gV3JpdGUgaXQgaWYgaXQgaXMgbm90IGEgd2lkZSBicmFuY2guCisJCSAqLworCQlpbnQgb2Zmc2V0ID0gcG9zaXRpb24gLSBjb2RlU3RyZWFtLnBvc2l0aW9uICsgMTsKKwkJaWYgKE1hdGguYWJzKG9mZnNldCkgPiAweDdGRkYgJiYgIXRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgeworCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKENvZGVTdHJlYW0uUkVTVEFSVF9JTl9XSURFX01PREUpOworCQl9CisJCWNvZGVTdHJlYW0ud3JpdGVTaWduZWRTaG9ydCgoc2hvcnQpIG9mZnNldCk7CiAJfQogfQogLyoKQEAgLTE3NCw3ICsxODEsNyBAQAogCQl9CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yd2FyZFJlZmVyZW5jZUNvdW50OyBpKyspIHsKIAkJCWludCBvZmZzZXQgPSBwb3NpdGlvbiAtIGZvcndhcmRSZWZlcmVuY2VzW2ldICsgMTsKLQkJCWlmIChvZmZzZXQgPiAweDdGRkYgJiYgIXRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgeworCQkJaWYgKE1hdGguYWJzKG9mZnNldCkgPiAweDdGRkYgJiYgIXRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgewogCQkJCXRocm93IG5ldyBBYm9ydE1ldGhvZChDb2RlU3RyZWFtLlJFU1RBUlRfSU5fV0lERV9NT0RFKTsKIAkJCX0KIAkJCWlmICh0aGlzLmNvZGVTdHJlYW0ud2lkZU1vZGUpIHsKQEAgLTIwNSw3ICsyMTIsNyBAQAogCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsYWJlbC5mb3J3YXJkUmVmZXJlbmNlQ291bnQ7IGorKykgewogCQkJCQkJCWludCBmb3J3YXJkUG9zaXRpb24gPSBsYWJlbC5mb3J3YXJkUmVmZXJlbmNlc1tqXTsKIAkJCQkJCQlpbnQgb2Zmc2V0ID0gcG9zaXRpb24gLSBmb3J3YXJkUG9zaXRpb24gKyAxOwotCQkJCQkJCWlmIChvZmZzZXQgPiAweDdGRkYgJiYgIXRoaXMuY29kZVN0cmVhbS53aWRlTW9kZSkgeworCQkJCQkJCWlmIChNYXRoLmFicyhvZmZzZXQpID4gMHg3RkZGICYmICF0aGlzLmNvZGVTdHJlYW0ud2lkZU1vZGUpIHsKIAkJCQkJCQkJdGhyb3cgbmV3IEFib3J0TWV0aG9kKENvZGVTdHJlYW0uUkVTVEFSVF9JTl9XSURFX01PREUpOwogCQkJCQkJCX0KIAkJCQkJCQlpZiAodGhpcy5jb2RlU3RyZWFtLndpZGVNb2RlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9Mb25nQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xvbmdDYWNoZS5qYXZhCmluZGV4IDYyNDQ0NmQuLmUzMjgxN2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xvbmdDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL0xvbmdDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIHB1YmxpYyBjbGFzcyBMb25nQ2FjaGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTWV0aG9kTmFtZUFuZFR5cGVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vTWV0aG9kTmFtZUFuZFR5cGVDYWNoZS5qYXZhCmluZGV4IDIxZjU4NzkuLjBmYzY1ZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL01ldGhvZE5hbWVBbmRUeXBlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9NZXRob2ROYW1lQW5kVHlwZUNhY2hlLmphdmEKQEAgLTEsMTcgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBNZXRob2ROYW1lQW5kVHlwZUNhY2hlIHsKIAlwdWJsaWMgTWV0aG9kQmluZGluZyBrZXlUYWJsZVtdOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09iamVjdENhY2hlLmphdmEKaW5kZXggM2U3ZmQ4ZC4uMzhkNDMxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT2JqZWN0Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PYmplY3RDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIHB1YmxpYyBjbGFzcyBPYmplY3RDYWNoZSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PcGNvZGVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9PcGNvZGVzLmphdmEKaW5kZXggMmMyYjU3Mi4uYTAwZmU3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vT3Bjb2Rlcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL09wY29kZXMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuOwogCiBwdWJsaWMgaW50ZXJmYWNlIE9wY29kZXMgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1F1YWxpZmllZE5hbWVzQ29uc3RhbnRzLmphdmEKaW5kZXggYWFhMGFiYS4uMzA0ZWJkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUXVhbGlmaWVkTmFtZXNDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9RdWFsaWZpZWROYW1lc0NvbnN0YW50cy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW47CiAKIHB1YmxpYyBpbnRlcmZhY2UgUXVhbGlmaWVkTmFtZXNDb25zdGFudHMgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2NvZGVnZW4vUmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvci5qYXZhCmluZGV4IDdjY2U0Y2EuLjY2YzBkZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9jb2RlZ2VuL1Jlc2V0U3RhdGVGb3JDb2RlR2VuZXJhdGlvblZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvY29kZWdlbi9SZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb25WaXNpdG9yLmphdmEKQEAgLTEsMTYgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CcmFuY2hTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Eb1N0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZvclN0YXRlbWVudDsKQEAgLTUxLDYgKzUyLDEwIEBACiAJCWJyYW5jaFN0YXRlbWVudC5yZXNldFN0YXRlRm9yQ29kZUdlbmVyYXRpb24oKTsKIAkJcmV0dXJuIHRydWU7CiAJfQotCQorCisJcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCwgQmxvY2tTY29wZSBzY29wZSkgeworCQl0cnlTdGF0ZW1lbnQucmVzZXRTdGF0ZUZvckNvZGVHZW5lcmF0aW9uKCk7CisJCXJldHVybiB0cnVlOworCX0JCiB9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlGaWVsZC5qYXZhCmluZGV4IDQ4MzE3M2IuLjY4Y2Q2NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5RmllbGQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TWV0aG9kLmphdmEKaW5kZXggMjcxODk1NS4uMjJlMzU4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TWV0aG9kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiAvLyBjbGluaXQgbWV0aG9kcyAoc3ludGhldGljcyB0b28/KSBjYW4gYmUgcmV0dXJuZWQgZnJvbSBJQmluYXJ5VHlwZT4+Z2V0TWV0aG9kcygpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlOZXN0ZWRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlOZXN0ZWRUeXBlLmphdmEKaW5kZXggYTFkMDZkYS4uNjNlZDdlMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5TmVzdGVkVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeU5lc3RlZFR5cGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUJpbmFyeU5lc3RlZFR5cGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQmluYXJ5VHlwZS5qYXZhCmluZGV4IDRiMWJkYWEuLmI3OTY0ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUJpbmFyeVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lCaW5hcnlUeXBlLmphdmEKQEAgLTEsMTggKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogcHVibGljIGludGVyZmFjZSBJQmluYXJ5VHlwZSBleHRlbmRzIElHZW5lcmljVHlwZSB7CiAKLQljaGFyW11bXSBOb0ludGVyZmFjZSA9IG5ldyBjaGFyWzBdW107CisJY2hhcltdW10gTm9JbnRlcmZhY2UgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAlJQmluYXJ5TmVzdGVkVHlwZVtdIE5vTmVzdGVkVHlwZSA9IG5ldyBJQmluYXJ5TmVzdGVkVHlwZVswXTsKIAlJQmluYXJ5RmllbGRbXSBOb0ZpZWxkID0gbmV3IElCaW5hcnlGaWVsZFswXTsKIAlJQmluYXJ5TWV0aG9kW10gTm9NZXRob2QgPSBuZXcgSUJpbmFyeU1ldGhvZFswXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggZDRhM2IxYy4uNzAwMDZiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29uc3RhbnRzLmphdmEKaW5kZXggNTAxYzRkMS4uN2ViMzZhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JQ29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSURlcGVuZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKaW5kZXggZWE3NzFiMS4uYjQ1NmM4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JRGVwZW5kZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY0ZpZWxkLmphdmEKaW5kZXggNGZlYzllMC4uOWIzNjViZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY0ZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY0ZpZWxkLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiBwdWJsaWMgaW50ZXJmYWNlIElHZW5lcmljRmllbGQgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY01ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY01ldGhvZC5qYXZhCmluZGV4IDhmMjc3YTcuLmI5ZDVjYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lHZW5lcmljTWV0aG9kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiBwdWJsaWMgaW50ZXJmYWNlIElHZW5lcmljTWV0aG9kIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lHZW5lcmljVHlwZS5qYXZhCmluZGV4IDRkMDNhMzEuLjgxZWNhMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSUdlbmVyaWNUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JR2VuZXJpY1R5cGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNUeXBlIGV4dGVuZHMgSURlcGVuZGVudCB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lOYW1lRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCmluZGV4IDJjYzFjZGUuLjY2MzkxNGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSU5hbWVFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlRmllbGQuamF2YQppbmRleCA2N2Q4NGIyLi5lNzBlYTI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VGaWVsZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZUZpZWxkLmphdmEKQEAgLTEsNDIgKzEsNDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiBwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VGaWVsZCBleHRlbmRzIElHZW5lcmljRmllbGQgewogLyoqCiAgKiBBbnN3ZXIgdGhlIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIGZpZWxkJ3MgZGVjbGFyYXRpb24uCiAgKi8KLQogaW50IGdldERlY2xhcmF0aW9uU291cmNlRW5kKCk7CisKIC8qKgogICogQW5zd2VyIHRoZSBzb3VyY2Ugc3RhcnQgcG9zaXRpb24gb2YgdGhlIGZpZWxkJ3MgZGVjbGFyYXRpb24uCiAgKi8KLQogaW50IGdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKTsKKworLyoqCisgKiBBbnN3ZXIgdGhlIGluaXRpYWxpemF0aW9uIHNvdXJjZSBmb3IgdGhpcyBjb25zdGFudCBmaWVsZC4KKyAqIEFuc3dlciBudWxsIGlmIHRoZSBmaWVsZCBpcyBub3QgYSBjb25zdGFudCBvciBpZiBpdCBoYXMgbm8gaW5pdGlhbGl6YXRpb24uCisgKi8KK2NoYXJbXSBnZXRJbml0aWFsaXphdGlvblNvdXJjZSgpOworCiAvKioKICAqIEFuc3dlciB0aGUgc291cmNlIGVuZCBwb3NpdGlvbiBvZiB0aGUgZmllbGQncyBuYW1lLgogICovCi0KIGludCBnZXROYW1lU291cmNlRW5kKCk7CisKIC8qKgogICogQW5zd2VyIHRoZSBzb3VyY2Ugc3RhcnQgcG9zaXRpb24gb2YgdGhlIGZpZWxkJ3MgbmFtZS4KICAqLwotCiBpbnQgZ2V0TmFtZVNvdXJjZVN0YXJ0KCk7CisKIC8qKgogICogQW5zd2VyIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGZpZWxkLgogICoKICAqIFRoZSBuYW1lIGlzIGEgc2ltcGxlIG5hbWUgb3IgYSBxdWFsaWZpZWQsIGRvdCBzZXBhcmF0ZWQgbmFtZS4KICAqIEZvciBleGFtcGxlLCBIYXNodGFibGUgb3IgamF2YS51dGlsLkhhc2h0YWJsZS4KICAqLwotCiBjaGFyW10gZ2V0VHlwZU5hbWUoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlTWV0aG9kLmphdmEKaW5kZXggOWI4NDE1Zi4uMGEzNGUyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlTWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlTWV0aG9kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52OwogCiBwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VNZXRob2QgZXh0ZW5kcyBJR2VuZXJpY01ldGhvZCB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L0lTb3VyY2VUeXBlLmphdmEKaW5kZXggMDM5MDI5ZS4uOTVjMmUxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9JU291cmNlVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvSVNvdXJjZVR5cGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnY7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZVR5cGUgZXh0ZW5kcyBJR2VuZXJpY1R5cGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9lbnYvTmFtZUVudmlyb25tZW50QW5zd2VyLmphdmEKaW5kZXggZjBkYjEyYy4uMzA4Y2RmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Vudi9OYW1lRW52aXJvbm1lbnRBbnN3ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZW52L05hbWVFbnZpcm9ubWVudEFuc3dlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudjsKIAogcHVibGljIGNsYXNzIE5hbWVFbnZpcm9ubWVudEFuc3dlciB7CkBAIC03Niw0ICs3Niw0IEBACiAJcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlKCkgewogCQlyZXR1cm4gc291cmNlVHlwZXMgIT0gbnVsbDsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvQ29uZGl0aW9uYWxGbG93SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvQ29uZGl0aW9uYWxGbG93SW5mby5qYXZhCmluZGV4IGZkMjk4OGMuLmRiODUwOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0NvbmRpdGlvbmFsRmxvd0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Db25kaXRpb25hbEZsb3dJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwpAQCAtMTgsMTEwICsxOCwxNjEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDb25kaXRpb25hbEZsb3dJbmZvIGV4dGVuZHMgRmxvd0luZm8geworCQogCXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5UcnVlOwogCXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5GYWxzZTsKLUNvbmRpdGlvbmFsRmxvd0luZm8oRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UpewotCXRoaXMuaW5pdHNXaGVuVHJ1ZSA9IGluaXRzV2hlblRydWU7Ci0JdGhpcy5pbml0c1doZW5GYWxzZSA9IGluaXRzV2hlbkZhbHNlOyAKLX0KLXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWRkSW5pdGlhbGl6YXRpb25zRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cykgewotCXJldHVybiB1bmNvbmRpdGlvbmFsSW5pdHMoKS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKG90aGVySW5pdHMpOwotfQotcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBhZGRQb3RlbnRpYWxJbml0aWFsaXphdGlvbnNGcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7Ci0JcmV0dXJuIHVuY29uZGl0aW9uYWxJbml0cygpLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20ob3RoZXJJbml0cyk7Ci19Ci1wdWJsaWMgRmxvd0luZm8gYXNOZWdhdGVkQ29uZGl0aW9uKCkgewotCUZsb3dJbmZvIGV4dHJhID0gaW5pdHNXaGVuVHJ1ZTsKLQlpbml0c1doZW5UcnVlID0gaW5pdHNXaGVuRmFsc2U7Ci0JaW5pdHNXaGVuRmFsc2UgPSBleHRyYTsKLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBGbG93SW5mbyBjb3B5KCkgewotCXJldHVybiBuZXcgQ29uZGl0aW9uYWxGbG93SW5mbyhpbml0c1doZW5UcnVlLmNvcHkoKSwgaW5pdHNXaGVuRmFsc2UuY29weSgpKTsKLX0KLXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5GYWxzZSgpIHsKLQlyZXR1cm4gaW5pdHNXaGVuRmFsc2U7Ci19Ci1wdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSgpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZTsKLX0KLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCXJldHVybiBpbml0c1doZW5UcnVlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKSAKLQkJCSYmIGluaXRzV2hlbkZhbHNlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKIAkKLX0KLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwgdmFyaWFibGUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpIAotCQkJJiYgaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOworCUNvbmRpdGlvbmFsRmxvd0luZm8oRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UpeworCQkKKwkJdGhpcy5pbml0c1doZW5UcnVlID0gaW5pdHNXaGVuVHJ1ZTsKKwkJdGhpcy5pbml0c1doZW5GYWxzZSA9IGluaXRzV2hlbkZhbHNlOyAKKwl9CiAJCi19Ci1wdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUoKXsKLQlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkuaXNGYWtlUmVhY2hhYmxlKCk7CQotCS8vc2hvdWxkIG1heWJlIGRpcmVjdGx5IGJlOiBmYWxzZQotfQotLyoqCi0gKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKLQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQpIAotCQkJfHwgaW5pdHNXaGVuRmFsc2UuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkKTsKKwlwdWJsaWMgRmxvd0luZm8gYWRkSW5pdGlhbGl6YXRpb25zRnJvbShGbG93SW5mbyBvdGhlckluaXRzKSB7CisJCQorCQl0aGlzLmluaXRzV2hlblRydWUuYWRkSW5pdGlhbGl6YXRpb25zRnJvbShvdGhlckluaXRzKTsKKwkJdGhpcy5pbml0c1doZW5GYWxzZS5hZGRJbml0aWFsaXphdGlvbnNGcm9tKG90aGVySW5pdHMpOworCQlyZXR1cm4gdGhpczsKKwl9CiAJCi19Ci0vKioKLSAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGxvY2FsKSAKLQkJCXx8IGluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbCk7CisJcHVibGljIEZsb3dJbmZvIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8gb3RoZXJJbml0cykgeworCQkKKwkJdGhpcy5pbml0c1doZW5UcnVlLmFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20ob3RoZXJJbml0cyk7CisJCXRoaXMuaW5pdHNXaGVuRmFsc2UuYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShvdGhlckluaXRzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQogCQotfQotLyoqCi0gKiBSZWNvcmQgYSBmaWVsZCBnb3QgZGVmaW5pdGVseSBhc3NpZ25lZC4KLSAqLwotcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKLQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQpOwkKLX0KLS8qKgotICogUmVjb3JkIGEgZmllbGQgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCi0gKi8KLXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsKTsKLQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOwkKLX0KLS8qKgotICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgZmllbGQKLSAqLwotcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGZpZWxkKTsKLQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoZmllbGQpOwkKLX0KLS8qKgotICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgbG9jYWwgdmFyaWFibGUKLSAqLwotcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQobG9jYWwpOwotCWluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChsb2NhbCk7CQotfQotcHVibGljIEZsb3dJbmZvIG1hcmtBc0Zha2VSZWFjaGFibGUoYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUpIHsKLQlpbml0c1doZW5UcnVlLm1hcmtBc0Zha2VSZWFjaGFibGUoaXNGYWtlUmVhY2hhYmxlKTsKLQlpbml0c1doZW5GYWxzZS5tYXJrQXNGYWtlUmVhY2hhYmxlKGlzRmFrZVJlYWNoYWJsZSk7Ci0JcmV0dXJuIHRoaXM7Ci19Ci1wdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIG1lcmdlZFdpdGgoVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpIHsKLQlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkubWVyZ2VkV2l0aChvdGhlckluaXRzKTsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJGbG93SW5mbzx0cnVlOiAiICsgaW5pdHNXaGVuVHJ1ZS50b1N0cmluZygpICsgIiwgZmFsc2U6ICIgKyBpbml0c1doZW5GYWxzZS50b1N0cmluZygpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJAotfQotcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsSW5pdHMoKSB7Ci0JcmV0dXJuIGluaXRzV2hlblRydWUudW5jb25kaXRpb25hbEluaXRzKCkuY29weSgpCi0JCQkubWVyZ2VkV2l0aChpbml0c1doZW5GYWxzZS51bmNvbmRpdGlvbmFsSW5pdHMoKSk7Ci19CisJcHVibGljIEZsb3dJbmZvIGFzTmVnYXRlZENvbmRpdGlvbigpIHsKKwkJCisJCUZsb3dJbmZvIGV4dHJhID0gaW5pdHNXaGVuVHJ1ZTsKKwkJaW5pdHNXaGVuVHJ1ZSA9IGluaXRzV2hlbkZhbHNlOworCQlpbml0c1doZW5GYWxzZSA9IGV4dHJhOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgRmxvd0luZm8gY29weSgpIHsKKwkJCisJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxGbG93SW5mbyhpbml0c1doZW5UcnVlLmNvcHkoKSwgaW5pdHNXaGVuRmFsc2UuY29weSgpKTsKKwl9CisJCisJcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKCkgeworCQkKKwkJcmV0dXJuIGluaXRzV2hlbkZhbHNlOworCX0KKwkKKwlwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSgpIHsKKwkJCisJCXJldHVybiBpbml0c1doZW5UcnVlOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwkJCisJCXJldHVybiBpbml0c1doZW5UcnVlLmlzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKSAKKwkJCQkmJiBpbml0c1doZW5GYWxzZS5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZCk7CisJfQorCQorCS8qKgorCSAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGxvY2FsIHZhcmlhYmxlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJCQorCQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbCkgCisJCQkJJiYgaW5pdHNXaGVuRmFsc2UuaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOworCX0KKwkKKwlwdWJsaWMgaW50IHJlYWNoTW9kZSgpeworCQlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkucmVhY2hNb2RlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKCl7CisJCQorCQlyZXR1cm4gdW5jb25kaXRpb25hbEluaXRzKCkuaXNSZWFjaGFibGUoKTsJCisJCS8vc2hvdWxkIG1heWJlIGRpcmVjdGx5IGJlOiBmYWxzZQorCX0KKwkKKwkvKioKKwkgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgeworCQkKKwkJcmV0dXJuIGluaXRzV2hlblRydWUuaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkKSAKKwkJCQl8fCBpbml0c1doZW5GYWxzZS5pc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQpOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwgdmFyaWFibGUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJCQorCQlyZXR1cm4gaW5pdHNXaGVuVHJ1ZS5pc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWwpIAorCQkJCXx8IGluaXRzV2hlbkZhbHNlLmlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbCk7CisJfQorCQorCS8qKgorCSAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorCSAqLworCXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwkJCisJCWluaXRzV2hlblRydWUubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsKKwkJaW5pdHNXaGVuRmFsc2UubWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkKTsJCisJfQorCQorCS8qKgorCSAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorCSAqLworCXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCQkKKwkJaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOworCQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwpOwkKKwl9CisJCisJLyoqCisJICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgZmllbGQKKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJCQorCQlpbml0c1doZW5UcnVlLm1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChmaWVsZCk7CisJCWluaXRzV2hlbkZhbHNlLm1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChmaWVsZCk7CQorCX0KKwkKKwkvKioKKwkgKiBDbGVhciB0aGUgaW5pdGlhbGl6YXRpb24gaW5mbyBmb3IgYSBsb2NhbCB2YXJpYWJsZQorCSAqLworCXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCQkKKwkJaW5pdHNXaGVuVHJ1ZS5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQobG9jYWwpOworCQlpbml0c1doZW5GYWxzZS5tYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQobG9jYWwpOwkKKwl9CisJCisJcHVibGljIEZsb3dJbmZvIHNldFJlYWNoTW9kZShpbnQgcmVhY2hNb2RlKSB7CisJCQorCQlpbml0c1doZW5UcnVlLnNldFJlYWNoTW9kZShyZWFjaE1vZGUpOworCQlpbml0c1doZW5GYWxzZS5zZXRSZWFjaE1vZGUocmVhY2hNb2RlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCS8qKgorCSAqIENvbnZlcnRzIGNvbmRpdGlvbmFsIHJlY2VpdmVyIGludG8gaW5jb25kaXRpb25hbCBvbmUsIHVwZGF0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6IDx1bD4KKwkgKiA8bGk+IGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCisJICogPGxpPiB1bmlvbiBvZiBwb3RlbnRpYWxseSBhc3NpZ25lZCB2YXJpYWJsZXMuCisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIG1lcmdlZFdpdGgoVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpIHsKKwkJCisJCXJldHVybiB1bmNvbmRpdGlvbmFsSW5pdHMoKS5tZXJnZWRXaXRoKG90aGVySW5pdHMpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkKKwkJcmV0dXJuICJGbG93SW5mbzx0cnVlOiAiICsgaW5pdHNXaGVuVHJ1ZS50b1N0cmluZygpICsgIiwgZmFsc2U6ICIgKyBpbml0c1doZW5GYWxzZS50b1N0cmluZygpICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHVuY29uZGl0aW9uYWxJbml0cygpIHsKKwkJCisJCXJldHVybiBpbml0c1doZW5UcnVlLnVuY29uZGl0aW9uYWxJbml0cygpLmNvcHkoKQorCQkJCS5tZXJnZWRXaXRoKGluaXRzV2hlbkZhbHNlLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9FeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0LmphdmEKaW5kZXggMGNjY2Y5ZC4uOGUzYmFmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0V4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTI2LDcgKzI2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQgZXh0ZW5kcyBGbG93Q29udGV4dCB7CiAJCi0JUmVmZXJlbmNlQmluZGluZ1tdIGhhbmRsZWRFeGNlcHRpb25zOworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nW10gaGFuZGxlZEV4Y2VwdGlvbnM7CiAJCiAJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQml0Q2FjaGVTaXplID0gMzI7IC8vIDMyIGJpdHMgcGVyIGludAogCWludFtdIGlzUmVhY2hlZDsKQEAgLTYzLDExICs2MywxMSBAQAogCQkJCWlzUmVhY2hlZFtjYWNoZUluZGV4XSB8PSBiaXRNYXNrOwogCQkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaV0gPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCQl9IGVsc2UgewotCQkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaV0gPSBGbG93SW5mby5EZWFkRW5kOworCQkJCXRoaXMuaW5pdHNPbkV4Y2VwdGlvbnNbaV0gPSBGbG93SW5mby5ERUFEX0VORDsKIAkJCX0KIAkJfQogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuaXNSZWFjaGVkLCAwLCB0aGlzLmlzTmVlZGVkLCAwLCBjYWNoZVNpemUpOwotCQl0aGlzLmluaXRzT25SZXR1cm4gPSBGbG93SW5mby5EZWFkRW5kOwkKKwkJdGhpcy5pbml0c09uUmV0dXJuID0gRmxvd0luZm8uREVBRF9FTkQ7CQogCX0KIAogCXB1YmxpYyB2b2lkIGNvbXBsYWluSWZVbnVzZWRFeGNlcHRpb25IYW5kbGVycygKQEAgLTExNCw2ICsxMTQsNyBAQAogCQkJfQogCQkJYnVmZmVyLmFwcGVuZCgnLScpLmFwcGVuZChpbml0c09uRXhjZXB0aW9uc1tpXS50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsKIAkJfQorCQlidWZmZXIuYXBwZW5kKCJbaW5pdHNPblJldHVybiAtIikuYXBwZW5kKGluaXRzT25SZXR1cm4udG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KIApAQCAtMTIxLDExICsxMjIsMTUgQEAKIAkJCiAJCWludCBpbmRleDsKIAkJaWYgKChpbmRleCA9IGluZGV4ZXMuZ2V0KGV4Y2VwdGlvblR5cGUpKSA8IDApIHsKLQkJCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCQkJcmV0dXJuIEZsb3dJbmZvLkRFQURfRU5EOwogCQl9CiAJCXJldHVybiBpbml0c09uRXhjZXB0aW9uc1tpbmRleF07CiAJfQogCisJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uUmV0dXJuKCl7CisJCXJldHVybiB0aGlzLmluaXRzT25SZXR1cm47CisJfQorCQogCXB1YmxpYyB2b2lkIHJlY29yZEhhbmRsaW5nRXhjZXB0aW9uKAogCQlSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUsCiAJCVVuY29uZGl0aW9uYWxGbG93SW5mbyBmbG93SW5mbywKQEAgLTE0MSwxNiArMTQ2LDIxIEBACiAJCQl0aGlzLmlzTmVlZGVkW2NhY2hlSW5kZXhdIHw9IGJpdE1hc2s7CiAJCX0KIAkJdGhpcy5pc1JlYWNoZWRbY2FjaGVJbmRleF0gfD0gYml0TWFzazsKKwkJCiAJCWluaXRzT25FeGNlcHRpb25zW2luZGV4XSA9Ci0JCQlpbml0c09uRXhjZXB0aW9uc1tpbmRleF0gPT0gRmxvd0luZm8uRGVhZEVuZAorCQkJaW5pdHNPbkV4Y2VwdGlvbnNbaW5kZXhdID09IEZsb3dJbmZvLkRFQURfRU5ECiAJCQkJPyBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCkKIAkJCQk6IGluaXRzT25FeGNlcHRpb25zW2luZGV4XS5tZXJnZWRXaXRoKGZsb3dJbmZvKTsKIAl9CiAJCi0JcHVibGljIHZvaWQgcmVjb3JkUmV0dXJuRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKLQkJCi0JCS8vIHJlY29yZCBpbml0aWFsaXphdGlvbnMgd2hpY2ggd2VyZSBwZXJmb3JtZWQgYXQgdGhlIHJldHVybiBwb2ludAotCQlpbml0c09uUmV0dXJuID0gaW5pdHNPblJldHVybi5tZXJnZWRXaXRoKGZsb3dJbmZvKTsKKwlwdWJsaWMgdm9pZCByZWNvcmRSZXR1cm5Gcm9tKEZsb3dJbmZvIGZsb3dJbmZvKSB7CisKKwkJaWYgKCFmbG93SW5mby5pc1JlYWNoYWJsZSgpKSByZXR1cm47IAorCQlpZiAoaW5pdHNPblJldHVybiA9PSBGbG93SW5mby5ERUFEX0VORCkgeworCQkJaW5pdHNPblJldHVybiA9IGZsb3dJbmZvLmNvcHkoKS51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJfSBlbHNlIHsKKwkJCWluaXRzT25SZXR1cm4ubWVyZ2VkV2l0aChmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCX0KIAl9CiAJCiAJLyoKQEAgLTE4NCw0ICsxOTQsNCBAQAogCQkJdGhpcy5leHRlbmRlZEV4Y2VwdGlvbnMuYWRkKG5ld0V4Y2VwdGlvbik7CiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmluYWxseUZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GaW5hbGx5Rmxvd0NvbnRleHQuamF2YQppbmRleCA4ZDY0NzYwLi5hMDlmYTU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GaW5hbGx5Rmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GaW5hbGx5Rmxvd0NvbnRleHQuamF2YQpAQCAtMSwyMCArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTmFtZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmdJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmc7CiAKQEAgLTI1LDYgKzI0LDcgQEAKIHB1YmxpYyBjbGFzcyBGaW5hbGx5Rmxvd0NvbnRleHQgZXh0ZW5kcyBGbG93Q29udGV4dCB7CiAJCiAJUmVmZXJlbmNlIGZpbmFsQXNzaWdubWVudHNbXTsKKwlWYXJpYWJsZUJpbmRpbmcgZmluYWxWYXJpYWJsZXNbXTsKIAlpbnQgYXNzaWduQ291bnQ7CiAJCiAJcHVibGljIEZpbmFsbHlGbG93Q29udGV4dChGbG93Q29udGV4dCBwYXJlbnQsIEFzdE5vZGUgYXNzb2NpYXRlZE5vZGUpIHsKQEAgLTQwLDMzICs0MCw0NiBAQAogCQlGbG93SW5mbyBmbG93SW5mbywKIAkJQmxvY2tTY29wZSBzY29wZSkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGFzc2lnbkNvdW50OyBpKyspIHsKLQkJCVJlZmVyZW5jZSByZWY7Ci0JCQlpZiAoKChyZWYgPSBmaW5hbEFzc2lnbm1lbnRzW2ldKS5iaXRzICYgQmluZGluZ0lkcy5GSUVMRCkgIT0gMCkgeworCQkJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlID0gZmluYWxWYXJpYWJsZXNbaV07CisJCQlpZiAodmFyaWFibGUgPT0gbnVsbCkgY29udGludWU7CisJCQkKKwkJCWJvb2xlYW4gY29tcGxhaW5lZCA9IGZhbHNlOyAvLyByZW1lbWJlciBpZiBoYXZlIGNvbXBsYWluZWQgb24gdGhpcyBmaW5hbCBhc3NpZ25tZW50CisJCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKIAkJCQkvLyBmaW5hbCBmaWVsZAotCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQocmVmLmZpZWxkQmluZGluZygpKSkgewotCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKHJlZi5maWVsZEJpbmRpbmcoKSwgcmVmKTsKKwkJCQlpZiAoZmxvd0luZm8uaXNQb3RlbnRpYWxseUFzc2lnbmVkKChGaWVsZEJpbmRpbmcpdmFyaWFibGUpKSB7CisJCQkJCWNvbXBsYWluZWQgPSB0cnVlOworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKChGaWVsZEJpbmRpbmcpdmFyaWFibGUsIGZpbmFsQXNzaWdubWVudHNbaV0pOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLy8gZmluYWwgbG9jYWwgdmFyaWFibGUKLQkJCQlpZiAoZmxvd0luZm8KLQkJCQkJLmlzUG90ZW50aWFsbHlBc3NpZ25lZCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpICgoTmFtZVJlZmVyZW5jZSkgcmVmKS5iaW5kaW5nKSkgeworCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoKExvY2FsVmFyaWFibGVCaW5kaW5nKSB2YXJpYWJsZSkpIHsKKwkJCQkJY29tcGxhaW5lZCA9IHRydWU7CiAJCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmR1cGxpY2F0ZUluaXRpYWxpemF0aW9uT2ZGaW5hbExvY2FsKAotCQkJCQkJKExvY2FsVmFyaWFibGVCaW5kaW5nKSAoKE5hbWVSZWZlcmVuY2UpIHJlZikuYmluZGluZywKLQkJCQkJCShOYW1lUmVmZXJlbmNlKSByZWYpOworCQkJCQkJKExvY2FsVmFyaWFibGVCaW5kaW5nKSB2YXJpYWJsZSwKKwkJCQkJCWZpbmFsQXNzaWdubWVudHNbaV0pOwogCQkJCX0KIAkJCX0KIAkJCS8vIGFueSByZWZlcmVuY2UgcmVwb3J0ZWQgYXQgdGhpcyBsZXZlbCBpcyByZW1vdmVkIGZyb20gdGhlIHBhcmVudCBjb250ZXh0IAogCQkJLy8gd2hlcmUgaXQgY291bGQgYWxzbyBiZSByZXBvcnRlZCBhZ2FpbgotCQkJRmxvd0NvbnRleHQgY3VycmVudENvbnRleHQgPSBwYXJlbnQ7Ci0JCQl3aGlsZSAoY3VycmVudENvbnRleHQgIT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50Q29udGV4dC5pc1N1YlJvdXRpbmUoKSkgewotCQkJCQljdXJyZW50Q29udGV4dC5yZW1vdmVGaW5hbEFzc2lnbm1lbnRJZkFueShyZWYpOworCQkJaWYgKGNvbXBsYWluZWQpIHsKKwkJCQlGbG93Q29udGV4dCBjdXJyZW50Q29udGV4dCA9IHBhcmVudDsKKwkJCQl3aGlsZSAoY3VycmVudENvbnRleHQgIT0gbnVsbCkgeworCQkJCQkvL2lmIChjdXJyZW50Q29udGV4dC5pc1N1YlJvdXRpbmUoKSkgeworCQkJCQljdXJyZW50Q29udGV4dC5yZW1vdmVGaW5hbEFzc2lnbm1lbnRJZkFueShmaW5hbEFzc2lnbm1lbnRzW2ldKTsKKwkJCQkJLy99CisJCQkJCWN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQucGFyZW50OwogCQkJCX0KLQkJCQljdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0LnBhcmVudDsKIAkJCX0KIAkJfQogCX0KIAorCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgeworCQkKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkZpbmFsbHkgZmxvdyBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiW2ZpbmFsQXNzaWdubWVudHMgY291bnQgLSIpLmFwcGVuZChhc3NpZ25Db3VudCkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiBpc1N1YlJvdXRpbmUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTc2LDYgKzg5LDcgQEAKIAkJUmVmZXJlbmNlIGZpbmFsQXNzaWdubWVudCkgewogCQlpZiAoYXNzaWduQ291bnQgPT0gMCkgewogCQkJZmluYWxBc3NpZ25tZW50cyA9IG5ldyBSZWZlcmVuY2VbNV07CisJCQlmaW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbNV07CiAJCX0gZWxzZSB7CiAJCQlpZiAoYXNzaWduQ291bnQgPT0gZmluYWxBc3NpZ25tZW50cy5sZW5ndGgpCiAJCQkJU3lzdGVtLmFycmF5Y29weSgKQEAgLTg0LDggKzk4LDI1IEBACiAJCQkJCShmaW5hbEFzc2lnbm1lbnRzID0gbmV3IFJlZmVyZW5jZVthc3NpZ25Db3VudCAqIDJdKSwKIAkJCQkJMCwKIAkJCQkJYXNzaWduQ291bnQpOworCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQlmaW5hbFZhcmlhYmxlcywKKwkJCQkwLAorCQkJCShmaW5hbFZhcmlhYmxlcyA9IG5ldyBWYXJpYWJsZUJpbmRpbmdbYXNzaWduQ291bnQgKiAyXSksCisJCQkJMCwKKwkJCQlhc3NpZ25Db3VudCk7CiAJCX07Ci0JCWZpbmFsQXNzaWdubWVudHNbYXNzaWduQ291bnQrK10gPSBmaW5hbEFzc2lnbm1lbnQ7CisJCWZpbmFsQXNzaWdubWVudHNbYXNzaWduQ291bnRdID0gZmluYWxBc3NpZ25tZW50OworCQlmaW5hbFZhcmlhYmxlc1thc3NpZ25Db3VudCsrXSA9IGJpbmRpbmc7CiAJCXJldHVybiB0cnVlOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKwl2b2lkIHJlbW92ZUZpbmFsQXNzaWdubWVudElmQW55KFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NpZ25Db3VudDsgaSsrKSB7CisJCQlpZiAoZmluYWxBc3NpZ25tZW50c1tpXSA9PSByZWZlcmVuY2UpIHsKKwkJCQlmaW5hbEFzc2lnbm1lbnRzW2ldID0gbnVsbDsKKwkJCQlmaW5hbFZhcmlhYmxlc1tpXSA9IG51bGw7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dDb250ZXh0LmphdmEKaW5kZXggZjI2YzVlYi4uYmVhMzE3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93Q29udGV4dC5qYXZhCkBAIC0xLDE4ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UcnlTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uTGFiZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKQEAgLTIwLDI1ICsyMiwyNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKICAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgogICovCiBwdWJsaWMgY2xhc3MgRmxvd0NvbnRleHQgaW1wbGVtZW50cyBUeXBlQ29uc3RhbnRzIHsKKwkKIAlwdWJsaWMgQXN0Tm9kZSBhc3NvY2lhdGVkTm9kZTsKIAlwdWJsaWMgRmxvd0NvbnRleHQgcGFyZW50OwogCi0JcHVibGljIGZpbmFsIHN0YXRpYyBGbG93Q29udGV4dCBOb3RDb250aW51YWJsZUNvbnRleHQgPQotCQluZXcgRmxvd0NvbnRleHQobnVsbCwgbnVsbCk7CisJcHVibGljIGZpbmFsIHN0YXRpYyBGbG93Q29udGV4dCBOb3RDb250aW51YWJsZUNvbnRleHQgPSBuZXcgRmxvd0NvbnRleHQobnVsbCwgbnVsbCk7CiAJCQogCXB1YmxpYyBGbG93Q29udGV4dChGbG93Q29udGV4dCBwYXJlbnQsIEFzdE5vZGUgYXNzb2NpYXRlZE5vZGUpIHsKKwogCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKIAkJdGhpcy5hc3NvY2lhdGVkTm9kZSA9IGFzc29jaWF0ZWROb2RlOwogCX0KIAkKIAlwdWJsaWMgTGFiZWwgYnJlYWtMYWJlbCgpIHsKKwogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCkBAIC02OCw2ICs3MSw3IEBACiAJCQkwLAogCQkJcmFpc2VkQ291bnQpOwogCQlGbG93Q29udGV4dCB0cmF2ZXJzZWRDb250ZXh0ID0gdGhpczsKKwogCQl3aGlsZSAodHJhdmVyc2VkQ29udGV4dCAhPSBudWxsKSB7CiAJCQlBc3ROb2RlIHN1YjsKIAkJCWlmICgoKHN1YiA9IHRyYXZlcnNlZENvbnRleHQuc3ViUm91dGluZSgpKSAhPSBudWxsKSAmJiBzdWIuY2Fubm90UmV0dXJuKCkpIHsKQEAgLTc1LDggKzc5LDggQEAKIAkJCQkvLyBleGNlcHRpb25zIHdpbGwgYWN0dWFsbHkgbmV2ZXIgZ2V0IHNlbnQuLi4KIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBtb3N0IGVuY2xvc2luZyAKLQkJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVyIG9uZXMuCisJCQkvLyBmaWx0ZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSBsb2NhbGx5IGNhdWdodCBmcm9tIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIAorCQkJLy8gdHJ5IHN0YXRlbWVudCB0byB0aGUgb3V0ZXJtb3N0IG9uZXMuCiAJCQlpZiAodHJhdmVyc2VkQ29udGV4dCBpbnN0YW5jZW9mIEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHsKIAkJCQlFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0IGV4Y2VwdGlvbkNvbnRleHQgPQogCQkJCQkoRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCkgdHJhdmVyc2VkQ29udGV4dDsKQEAgLTEyOSw5ICsxMzMsOCBAQAogCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKIAkJCQkJCVR5cGVCaW5kaW5nIHJhaXNlZEV4Y2VwdGlvbjsKIAkJCQkJCWlmICgocmFpc2VkRXhjZXB0aW9uID0gcmFpc2VkRXhjZXB0aW9uc1tpXSkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChzY29wZQotCQkJCQkJCQkuYXJlVHlwZXNDb21wYXRpYmxlKHJhaXNlZEV4Y2VwdGlvbiwgc2NvcGUuZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkpCi0JCQkJCQkJCXx8IHNjb3BlLmFyZVR5cGVzQ29tcGF0aWJsZShyYWlzZWRFeGNlcHRpb24sIHNjb3BlLmdldEphdmFMYW5nRXJyb3IoKSkpIHsKKwkJCQkJCQlpZiAocmFpc2VkRXhjZXB0aW9uLmlzQ29tcGF0aWJsZVdpdGgoc2NvcGUuZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkpCisJCQkJCQkJCXx8IHJhaXNlZEV4Y2VwdGlvbi5pc0NvbXBhdGlibGVXaXRoKHNjb3BlLmdldEphdmFMYW5nRXJyb3IoKSkpIHsKIAkJCQkJCQkJcmVtYWluaW5nQ291bnQtLTsKIAkJCQkJCQkJcmFpc2VkRXhjZXB0aW9uc1tpXSA9IG51bGw7CiAJCQkJCQkJfQpAQCAtMTU3LDEyICsxNjAsMjEgQEAKIAkJCX0KIAkJCWlmIChyZW1haW5pbmdDb3VudCA9PSAwKQogCQkJCXJldHVybjsKKwkJCQkKKwkJCXRyYXZlcnNlZENvbnRleHQucmVjb3JkUmV0dXJuRnJvbShmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKSk7CisJCQlpZiAodHJhdmVyc2VkQ29udGV4dC5hc3NvY2lhdGVkTm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCl7CisJCQkJZmxvd0luZm8gPSBmbG93SW5mby5jb3B5KCkuYWRkSW5pdGlhbGl6YXRpb25zRnJvbSgoKFRyeVN0YXRlbWVudCkgdHJhdmVyc2VkQ29udGV4dC5hc3NvY2lhdGVkTm9kZSkuc3ViUm91dGluZUluaXRzKTsKKwkJCX0KIAkJCXRyYXZlcnNlZENvbnRleHQgPSB0cmF2ZXJzZWRDb250ZXh0LnBhcmVudDsKIAkJfQogCQkvLyBpZiByZWFjaGVzIHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgYXJlIHNvbWUgcmVtYWluaW5nIHVuaGFuZGxlZCBleGNlcHRpb24gdHlwZXMuCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhaXNlZENvdW50OyBpKyspIHsKKwkJbmV4dFJlcG9ydDogZm9yIChpbnQgaSA9IDA7IGkgPCByYWlzZWRDb3VudDsgaSsrKSB7CiAJCQlUeXBlQmluZGluZyBleGNlcHRpb247CiAJCQlpZiAoKGV4Y2VwdGlvbiA9IHJhaXNlZEV4Y2VwdGlvbnNbaV0pICE9IG51bGwpIHsKKwkJCQkvLyBvbmx5IG9uZSBjb21wbGFpbnQgaWYgc2FtZSBleGNlcHRpb24gZGVjbGFyZWQgdG8gYmUgdGhyb3duIG1vcmUgdGhhbiBvbmNlCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkJaWYgKHJhaXNlZEV4Y2VwdGlvbnNbal0gPT0gZXhjZXB0aW9uKSBjb250aW51ZSBuZXh0UmVwb3J0OyAvLyBhbHJlYWR5IHJlcG9ydGVkIAorCQkJCX0KIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmhhbmRsZWRFeGNlcHRpb24oZXhjZXB0aW9uLCBsb2NhdGlvbik7CiAJCQl9CiAJCX0KQEAgLTE4Nyw4ICsxOTksOSBAQAogCQkJCS8vIGV4Y2VwdGlvbnMgd2lsbCBhY3R1YWxseSBuZXZlciBnZXQgc2VudC4uLgogCQkJCXJldHVybjsKIAkJCX0KLQkJCS8vIGZpbHRlciBleGNlcHRpb25zIHRoYXQgYXJlIGxvY2FsbHkgY2F1Z2h0IGZyb20gdGhlIG1vc3QgZW5jbG9zaW5nIAotCQkJLy8gdHJ5IHN0YXRlbWVudCB0byB0aGUgb3V0ZXIgb25lcy4KKwkJCQorCQkJLy8gZmlsdGVyIGV4Y2VwdGlvbnMgdGhhdCBhcmUgbG9jYWxseSBjYXVnaHQgZnJvbSB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyAKKwkJCS8vIHRyeSBzdGF0ZW1lbnQgdG8gdGhlIG91dGVybW9zdCBvbmVzLgogCQkJaWYgKHRyYXZlcnNlZENvbnRleHQgaW5zdGFuY2VvZiBFeGNlcHRpb25IYW5kbGluZ0Zsb3dDb250ZXh0KSB7CiAJCQkJRXhjZXB0aW9uSGFuZGxpbmdGbG93Q29udGV4dCBleGNlcHRpb25Db250ZXh0ID0KIAkJCQkJKEV4Y2VwdGlvbkhhbmRsaW5nRmxvd0NvbnRleHQpIHRyYXZlcnNlZENvbnRleHQ7CkBAIC0yMjUsOSArMjM4LDggQEAKIAkJCQl9CiAJCQkJLy8gbWV0aG9kIHRyZWF0bWVudCBmb3IgdW5jaGVja2VkIGV4Y2VwdGlvbnMKIAkJCQlpZiAoZXhjZXB0aW9uQ29udGV4dC5pc01ldGhvZENvbnRleHQpIHsKLQkJCQkJaWYgKHNjb3BlCi0JCQkJCQkuYXJlVHlwZXNDb21wYXRpYmxlKHJhaXNlZEV4Y2VwdGlvbiwgc2NvcGUuZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkpCi0JCQkJCQl8fCBzY29wZS5hcmVUeXBlc0NvbXBhdGlibGUocmFpc2VkRXhjZXB0aW9uLCBzY29wZS5nZXRKYXZhTGFuZ0Vycm9yKCkpKQorCQkJCQlpZiAocmFpc2VkRXhjZXB0aW9uLmlzQ29tcGF0aWJsZVdpdGgoc2NvcGUuZ2V0SmF2YUxhbmdSdW50aW1lRXhjZXB0aW9uKCkpCisJCQkJCQl8fCByYWlzZWRFeGNlcHRpb24uaXNDb21wYXRpYmxlV2l0aChzY29wZS5nZXRKYXZhTGFuZ0Vycm9yKCkpKQogCQkJCQkJcmV0dXJuOwogCQkJCQkJCiAJCQkJCS8vIGFub255bW91cyBjb25zdHJ1Y3RvcnMgYXJlIGFsbG93ZWQgdG8gdGhyb3cgYW55IGV4Y2VwdGlvbnMgKHRoZWlyIHRocm93biBleGNlcHRpb25zCkBAIC0yNDMsNiArMjU1LDExIEBACiAJCQkJCWJyZWFrOyAvLyBub3QgaGFuZGxlZCBhbnl3aGVyZSwgdGh1cyBqdW1wIHRvIGVycm9yIGhhbmRsaW5nCiAJCQkJfQogCQkJfQorCisJCQl0cmF2ZXJzZWRDb250ZXh0LnJlY29yZFJldHVybkZyb20oZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOworCQkJaWYgKHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGUgaW5zdGFuY2VvZiBUcnlTdGF0ZW1lbnQpeworCQkJCWZsb3dJbmZvID0gZmxvd0luZm8uY29weSgpLmFkZEluaXRpYWxpemF0aW9uc0Zyb20oKChUcnlTdGF0ZW1lbnQpIHRyYXZlcnNlZENvbnRleHQuYXNzb2NpYXRlZE5vZGUpLnN1YlJvdXRpbmVJbml0cyk7CisJCQl9CiAJCQl0cmF2ZXJzZWRDb250ZXh0ID0gdHJhdmVyc2VkQ29udGV4dC5wYXJlbnQ7CiAJCX0KIAkJLy8gaWYgcmVhY2hlcyB0aGlzIHBvaW50LCB0aGVuIHRoZXJlIGFyZSBzb21lIHJlbWFpbmluZyB1bmhhbmRsZWQgZXhjZXB0aW9uIHR5cGVzLgpAQCAtMjUwLDYgKzI2Nyw3IEBACiAJfQogCiAJcHVibGljIExhYmVsIGNvbnRpbnVlTGFiZWwoKSB7CisKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0yNTcsNiArMjc1LDcgQEAKIAkgKiBsb29rdXAgdGhyb3VnaCBicmVhayBsYWJlbHMKIAkgKi8KIAlwdWJsaWMgRmxvd0NvbnRleHQgZ2V0VGFyZ2V0Q29udGV4dEZvckJyZWFrTGFiZWwoY2hhcltdIGxhYmVsTmFtZSkgeworCiAJCUZsb3dDb250ZXh0IGN1cnJlbnQgPSB0aGlzLCBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IG51bGw7CiAJCXdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50LmlzTm9uUmV0dXJuaW5nQ29udGV4dCgpKSB7CkBAIC0yODEsOSArMzAwLDExIEBACiAJICogbG9va3VwIHRocm91Z2ggY29udGludWUgbGFiZWxzCiAJICovCiAJcHVibGljIEZsb3dDb250ZXh0IGdldFRhcmdldENvbnRleHRGb3JDb250aW51ZUxhYmVsKGNoYXJbXSBsYWJlbE5hbWUpIHsKLQkJRmxvd0NvbnRleHQgY3VycmVudCA9IHRoaXMsCi0JCQlsYXN0Q29udGludWFibGUgPSBudWxsLAotCQkJbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPSBudWxsOworCisJCUZsb3dDb250ZXh0IGN1cnJlbnQgPSB0aGlzOworCQlGbG93Q29udGV4dCBsYXN0Q29udGludWFibGUgPSBudWxsOworCQlGbG93Q29udGV4dCBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IG51bGw7CisKIAkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewogCQkJaWYgKGN1cnJlbnQuaXNOb25SZXR1cm5pbmdDb250ZXh0KCkpIHsKIAkJCQlsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IGN1cnJlbnQ7CkBAIC0yOTIsMTIgKzMxMywxNCBAQAogCQkJCQlsYXN0Q29udGludWFibGUgPSBjdXJyZW50OwogCQkJCX0KIAkJCX0KKwkJCQogCQkJY2hhcltdIGN1cnJlbnRMYWJlbE5hbWU7Ci0JCQlpZiAoKChjdXJyZW50TGFiZWxOYW1lID0gY3VycmVudC5sYWJlbE5hbWUoKSkgIT0gbnVsbCkKLQkJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50TGFiZWxOYW1lLCBsYWJlbE5hbWUpKSB7CisJCQlpZiAoKGN1cnJlbnRMYWJlbE5hbWUgPSBjdXJyZW50LmxhYmVsTmFtZSgpKSAhPSBudWxsICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRMYWJlbE5hbWUsIGxhYmVsTmFtZSkpIHsKKworCQkJCS8vIG1hdGNoaW5nIGxhYmVsIGZvdW5kCQkJCQkKIAkJCQlpZiAoKGxhc3RDb250aW51YWJsZSAhPSBudWxsKQotCQkJCQkmJiAoY3VycmVudC5hc3NvY2lhdGVkTm9kZS5jb25jcmV0ZVN0YXRlbWVudCgpCi0JCQkJCQk9PSBsYXN0Q29udGludWFibGUuYXNzb2NpYXRlZE5vZGUpKSB7CisJCQkJCSYmIChjdXJyZW50LmFzc29jaWF0ZWROb2RlLmNvbmNyZXRlU3RhdGVtZW50KCkJPT0gbGFzdENvbnRpbnVhYmxlLmFzc29jaWF0ZWROb2RlKSkgeworCQkJCQkJCiAJCQkJCWlmIChsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9PSBudWxsKSB7CiAJCQkJCQlyZXR1cm4gbGFzdENvbnRpbnVhYmxlOwogCQkJCQl9IGVsc2UgewpAQCAtMzE4LDEyICszNDEsMTMgQEAKIAkgKiBsb29rdXAgYSBkZWZhdWx0IGJyZWFrIHRocm91Z2ggYnJlYWthYmxlIGxvY2F0aW9ucwogCSAqLwogCXB1YmxpYyBGbG93Q29udGV4dCBnZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdEJyZWFrKCkgeworCiAJCUZsb3dDb250ZXh0IGN1cnJlbnQgPSB0aGlzLCBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IG51bGw7CiAJCXdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50LmlzTm9uUmV0dXJuaW5nQ29udGV4dCgpKSB7CiAJCQkJbGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPSBjdXJyZW50OwogCQkJfQotCQkJaWYgKGN1cnJlbnQuaXNCcmVha2FibGUoKSkgeworCQkJaWYgKGN1cnJlbnQuaXNCcmVha2FibGUoKSAmJiBjdXJyZW50LmxhYmVsTmFtZSgpID09IG51bGwpIHsKIAkJCQlpZiAobGFzdE5vblJldHVybmluZ1N1YlJvdXRpbmUgPT0gbnVsbCkgewogCQkJCQlyZXR1cm4gY3VycmVudDsKIAkJCQl9IGVsc2UgewpAQCAtMzQwLDYgKzM2NCw3IEBACiAJICogbG9va3VwIGEgZGVmYXVsdCBjb250aW51ZSBhbW9uZ3N0IGNvbnRpbnVhYmxlIGxvY2F0aW9ucwogCSAqLwogCXB1YmxpYyBGbG93Q29udGV4dCBnZXRUYXJnZXRDb250ZXh0Rm9yRGVmYXVsdENvbnRpbnVlKCkgeworCiAJCUZsb3dDb250ZXh0IGN1cnJlbnQgPSB0aGlzLCBsYXN0Tm9uUmV0dXJuaW5nU3ViUm91dGluZSA9IG51bGw7CiAJCXdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKIAkJCWlmIChjdXJyZW50LmlzTm9uUmV0dXJuaW5nQ29udGV4dCgpKSB7CkBAIC0zNTksMzAgKzM4NCw0MiBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgeworCiAJCXJldHVybiAiRmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBGbG93SW5mbyBpbml0c09uQnJlYWsoKSB7Ci0JCXJldHVybiBGbG93SW5mby5EZWFkRW5kOworCisJCXJldHVybiBGbG93SW5mby5ERUFEX0VORDsKKwl9CisKKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGluaXRzT25SZXR1cm4oKSB7CisKKwkJcmV0dXJuIEZsb3dJbmZvLkRFQURfRU5EOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzQnJlYWthYmxlKCkgeworCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbnRpbnVhYmxlKCkgeworCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc05vblJldHVybmluZ0NvbnRleHQoKSB7CisKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzU3ViUm91dGluZSgpIHsKKwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcHVibGljIGNoYXJbXSBsYWJlbE5hbWUoKSB7CisKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0zOTUsMTUgKzQzMiwxNyBAQAogCWJvb2xlYW4gcmVjb3JkRmluYWxBc3NpZ25tZW50KAogCQlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUsCiAJCVJlZmVyZW5jZSBmaW5hbFJlZmVyZW5jZSkgeworCiAJCXJldHVybiB0cnVlOyAvLyBrZWVwIGdvaW5nCiAJfQogCi0JcHVibGljIHZvaWQgcmVjb3JkUmV0dXJuRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKKwlwdWJsaWMgdm9pZCByZWNvcmRSZXR1cm5Gcm9tKEZsb3dJbmZvIGZsb3dJbmZvKSB7CiAJfQogCiAJcHVibGljIHZvaWQgcmVjb3JkU2V0dGluZ0ZpbmFsKAogCQlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGUsCiAJCVJlZmVyZW5jZSBmaW5hbFJlZmVyZW5jZSkgeworCiAJCS8vIGZvciBpbml0aWFsaXphdGlvbiBpbnNpZGUgbG9vcGluZyBzdGF0ZW1lbnQgdGhhdCBlZmZlY3RpdmVseSBsb29wcwogCQlGbG93Q29udGV4dCBjb250ZXh0ID0gdGhpczsKIAkJd2hpbGUgKGNvbnRleHQgIT0gbnVsbCkgewpAQCAtNDE4LDEwICs0NTcsMTIgQEAKIAl9CiAKIAlwdWJsaWMgQXN0Tm9kZSBzdWJSb3V0aW5lKCkgeworCiAJCXJldHVybiBudWxsOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJRmxvd0NvbnRleHQgY3VycmVudCA9IHRoaXM7CiAJCWludCBwYXJlbnRzQ291bnQgPSAwOwpAQCAtNDQ2LDQgKzQ4Nyw0IEBACiAJCWJ1ZmZlci5hcHBlbmQoaW5kaXZpZHVhbFRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsKIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvRmxvd0luZm8uamF2YQppbmRleCBiY2NkYWJjLi4yMzFiOGM4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9GbG93SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0Zsb3dJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OwpAQCAtMTYsNzIgKzE2LDExMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGbG93SW5mbyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVbmNvbmRpdGlvbmFsRmxvd0luZm8gRGVhZEVuZCA9IG5ldyBVbmNvbmRpdGlvbmFsRmxvd0luZm8oKTsgLy8gUmVwcmVzZW50cyBhIGRlYWQgYnJhbmNoIHN0YXR1cyBvZiBpbml0aWFsaXphdGlvbgotYWJzdHJhY3QgcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBhZGRJbml0aWFsaXphdGlvbnNGcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKTsKLWFic3RyYWN0IHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cyk7Ci1wdWJsaWMgRmxvd0luZm8gYXNOZWdhdGVkQ29uZGl0aW9uKCkgewotCXJldHVybiB0aGlzOwotfQotcHVibGljIGJvb2xlYW4gY29tcGxhaW5JZlVucmVhY2hhYmxlKFN0YXRlbWVudCBzdGF0ZW1lbnQsIEJsb2NrU2NvcGUgc2NvcGUpIHsKLQkvLyBSZXBvcnQgYW4gZXJyb3IgaWYgbmVjZXNzYXJ5CiAKLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgc3RhdGljIEZsb3dJbmZvIGNvbmRpdGlvbmFsKEZsb3dJbmZvIGluaXRzV2hlblRydWUsIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKXsKLQkvLyBpZiAoaW5pdHNXaGVuVHJ1ZS5lcXVhbHMoaW5pdHNXaGVuRmFsc2UpKSByZXR1cm4gaW5pdHNXaGVuVHJ1ZTsgLS0gY291bGQgb3B0aW1pemUgaWYgI2VxdWFscyBpcyBkZWZpbmVkCi0JcmV0dXJuIG5ldyBDb25kaXRpb25hbEZsb3dJbmZvKGluaXRzV2hlblRydWUsIGluaXRzV2hlbkZhbHNlKTsKLX0KLWFic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBjb3B5KCk7Ci1wdWJsaWMgc3RhdGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0aWFsKGludCBtYXhGaWVsZENvdW50KSB7Ci0JVW5jb25kaXRpb25hbEZsb3dJbmZvIGluZm8gPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvKCk7Ci0JaW5mby5tYXhGaWVsZENvdW50ID0gbWF4RmllbGRDb3VudDsKLQlyZXR1cm4gaW5mbzsKLX0KLWFic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5GYWxzZSgpOwotYWJzdHJhY3QgcHVibGljIEZsb3dJbmZvIGluaXRzV2hlblRydWUoKTsKLWZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVhZEVuZCgpIHsKLQlyZXR1cm4gdGhpcyA9PSBEZWFkRW5kOwotfQotLyoqCi0gKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KLSAqLwotIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCk7ICAgCi0vKioKLSAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGxvY2FsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7Ci1hYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUoKTsKLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGZvciBhIGZpZWxkLgotICovCi0gYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCk7ICAgCi0vKioKLSAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KLSAqLwotIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBmaWVsZCk7ICAgCi0vKioKLSAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgotICovCi1hYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKTsKLS8qKgotICogUmVjb3JkIGEgbG9jYWwgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCi0gKi8KLWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7Ci0vKioKLSAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGZpZWxkCi0gKi8KLWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOwotLyoqCi0gKiBDbGVhciB0aGUgaW5pdGlhbGl6YXRpb24gaW5mbyBmb3IgYSBsb2NhbCB2YXJpYWJsZQotICovCi1hYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOwotYWJzdHJhY3QgcHVibGljIEZsb3dJbmZvIG1hcmtBc0Zha2VSZWFjaGFibGUoYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUpOwotYWJzdHJhY3QgcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKTsKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlpZiAodGhpcyA9PSBEZWFkRW5kKXsKLQkJcmV0dXJuICJGbG93SW5mby5EZWFkRW5kIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQUNIQUJMRSA9IDA7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5SRUFDSEFCTEUgPSAxOyAKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFVuY29uZGl0aW9uYWxGbG93SW5mbyBERUFEX0VORDsgLy8gUmVwcmVzZW50cyBhIGRlYWQgYnJhbmNoIHN0YXR1cyBvZiBpbml0aWFsaXphdGlvbgorCXN0YXRpYyB7CisJCURFQURfRU5EID0gbmV3IFVuY29uZGl0aW9uYWxGbG93SW5mbygpOworCQlERUFEX0VORC5yZWFjaE1vZGUgPSBVTlJFQUNIQUJMRTsKIAl9Ci0JcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci19Ci1hYnN0cmFjdCBwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIHVuY29uZGl0aW9uYWxJbml0cygpOworCWFic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBhZGRJbml0aWFsaXphdGlvbnNGcm9tKEZsb3dJbmZvIG90aGVySW5pdHMpOworCisJYWJzdHJhY3QgcHVibGljIEZsb3dJbmZvIGFkZFBvdGVudGlhbEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8gb3RoZXJJbml0cyk7CisKKwlwdWJsaWMgRmxvd0luZm8gYXNOZWdhdGVkQ29uZGl0aW9uKCkgeworCisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbXBsYWluSWZVbnJlYWNoYWJsZShTdGF0ZW1lbnQgc3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbikgeworCisJCS8vIFJlcG9ydCBhbiBlcnJvciBpZiBuZWNlc3NhcnkKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgRmxvd0luZm8gY29uZGl0aW9uYWwoRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSwgRmxvd0luZm8gaW5pdHNXaGVuRmFsc2UpeworCisJCS8vIGlmIChpbml0c1doZW5UcnVlLmVxdWFscyhpbml0c1doZW5GYWxzZSkpIHJldHVybiBpbml0c1doZW5UcnVlOyAtLSBjb3VsZCBvcHRpbWl6ZSBpZiAjZXF1YWxzIGlzIGRlZmluZWQKKwkJcmV0dXJuIG5ldyBDb25kaXRpb25hbEZsb3dJbmZvKGluaXRzV2hlblRydWUsIGluaXRzV2hlbkZhbHNlKTsKKwl9CisKKwlhYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gY29weSgpOworCisJcHVibGljIHN0YXRpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdGlhbChpbnQgbWF4RmllbGRDb3VudCkgeworCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5mbyA9IG5ldyBVbmNvbmRpdGlvbmFsRmxvd0luZm8oKTsKKwkJaW5mby5tYXhGaWVsZENvdW50ID0gbWF4RmllbGRDb3VudDsKKwkJcmV0dXJuIGluZm87CisJfQorCisJYWJzdHJhY3QgcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKCk7CisKKwlhYnN0cmFjdCBwdWJsaWMgRmxvd0luZm8gaW5pdHNXaGVuVHJ1ZSgpOworCisJLyoqCisJICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisJICovCisJIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCk7ICAgCisKKwkvKioKKwkgKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBsb2NhbC4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7CisKKwkvL2Fic3RyYWN0IHB1YmxpYyBpbnQgcmVhY2hNb2RlKCk7IAorCisJLyoqCisJICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGZvciBhIGZpZWxkLgorCSAqLworCSBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKTsgICAKKworCS8qKgorCSAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBsb2NhbCB2YXJpYWJsZS4KKwkgKi8KKworCSBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgZmllbGQpOyAgIAorCisJYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoKTsKKwkKKwkvKioKKwkgKiBSZWNvcmQgYSBmaWVsZCBnb3QgZGVmaW5pdGVseSBhc3NpZ25lZC4KKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKTsKKworCS8qKgorCSAqIFJlY29yZCBhIGxvY2FsIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCk7CisKKwkvKioKKwkgKiBDbGVhciB0aGUgaW5pdGlhbGl6YXRpb24gaW5mbyBmb3IgYSBmaWVsZAorCSAqLworCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpOworCisJLyoqCisJICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgbG9jYWwgdmFyaWFibGUKKwkgKi8KKwlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpOworCisJYWJzdHJhY3QgcHVibGljIGludCByZWFjaE1vZGUoKTsKKworCWFic3RyYWN0IHB1YmxpYyBGbG93SW5mbyBzZXRSZWFjaE1vZGUoaW50IHJlYWNoTW9kZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWNlaXZlciB1cGRhdGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5OiA8dWw+CisJICogPGxpPiBpbnRlcnNlY3Rpb24gb2YgZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMsIAorCSAqIDxsaT4gdW5pb24gb2YgcG90ZW50aWFsbHkgYXNzaWduZWQgdmFyaWFibGVzLgorCSAqIDwvdWw+CisJICovCisJYWJzdHJhY3QgcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKTsKKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKKworCQlpZiAodGhpcyA9PSBERUFEX0VORCl7CisJCQlyZXR1cm4gIkZsb3dJbmZvLkRFQURfRU5EIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBzdXBlci50b1N0cmluZygpOworCX0KKworCWFic3RyYWN0IHB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzKCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Jbml0aWFsaXphdGlvbkZsb3dDb250ZXh0LmphdmEKaW5kZXggOGNlMjZmOS4uNmRlNmE2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0luaXRpYWxpemF0aW9uRmxvd0NvbnRleHQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwpAQCAtMjUsNyArMjUsNyBAQAogCXB1YmxpYyBUeXBlQmluZGluZ1tdIHRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZUJpbmRpbmdbNV07CiAJcHVibGljIEFzdE5vZGVbXSBleGNlcHRpb25UaHJvd2VycyA9IG5ldyBBc3ROb2RlWzVdOwogCXB1YmxpYyBGbG93SW5mb1tdIGV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3MgPSBuZXcgRmxvd0luZm9bNV07Ci0KKwkKIAlwdWJsaWMgSW5pdGlhbGl6YXRpb25GbG93Q29udGV4dCgKIAkJRmxvd0NvbnRleHQgcGFyZW50LAogCQlBc3ROb2RlIGFzc29jaWF0ZWROb2RlLApAQCAtMzMsOSArMzMsOSBAQAogCQlzdXBlcigKIAkJCXBhcmVudCwKIAkJCWFzc29jaWF0ZWROb2RlLAotCQkJbmV3IFJlZmVyZW5jZUJpbmRpbmdbXSB7IHNjb3BlLmdldEphdmFMYW5nVGhyb3dhYmxlKCl9LAotCQkvLyB0b2xlcmF0ZSBhbnkga2luZCBvZiBleGNlcHRpb24sIGJ1dCByZWNvcmQgdGhlbQotCQlzY29wZSwgRmxvd0luZm8uRGVhZEVuZCk7CisJCQlOb0V4Y2VwdGlvbnMsIC8vIG5vIGV4Y2VwdGlvbiBhbGxvd2VkIGJ5IGRlZmF1bHQKKwkJCXNjb3BlLCAKKwkJCUZsb3dJbmZvLkRFQURfRU5EKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBjaGVja0luaXRpYWxpemVyRXhjZXB0aW9ucygKQEAgLTUxLDYgKzUxLDE2IEBACiAJCX0KIAl9CiAKKwlwdWJsaWMgU3RyaW5nIGluZGl2aWR1YWxUb1N0cmluZygpIHsKKwkJCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJJbml0aWFsaXphdGlvbiBmbG93IGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAorCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyBpKyspIHsKKwkJCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQodGhyb3duRXhjZXB0aW9uc1tpXS5yZWFkYWJsZU5hbWUoKSk7CisJCQlidWZmZXIuYXBwZW5kKCctJykuYXBwZW5kKGV4Y2VwdGlvblRocm93ZXJGbG93SW5mb3NbaV0udG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKwkKIAlwdWJsaWMgdm9pZCByZWNvcmRIYW5kbGluZ0V4Y2VwdGlvbigKIAkJUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlLAogCQlVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8sCkBAIC01OCw2ICs2OCw3IEBACiAJCUFzdE5vZGUgaW52b2NhdGlvblNpdGUsCiAJCWJvb2xlYW4gd2FzTWFza2VkKSB7CiAJCQkKKwkJLy8gZXZlbiBpZiB1bnJlYWNoYWJsZSBjb2RlLCBuZWVkIHRvIHBlcmZvcm0gdW5oYW5kbGVkIGV4Y2VwdGlvbiBkaWFnbm9zaXMKIAkJaW50IHNpemUgPSB0aHJvd25FeGNlcHRpb25zLmxlbmd0aDsKIAkJaWYgKGV4Y2VwdGlvbkNvdW50ID09IHNpemUpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoCkBAIC04Myw0ICs5NCw0IEBACiAJCWV4Y2VwdGlvblRocm93ZXJzW2V4Y2VwdGlvbkNvdW50XSA9IGludm9jYXRpb25TaXRlOwogCQlleGNlcHRpb25UaHJvd2VyRmxvd0luZm9zW2V4Y2VwdGlvbkNvdW50KytdID0gZmxvd0luZm8uY29weSgpOwogCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvSW5zaWRlU3ViUm91dGluZUZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9JbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQuamF2YQppbmRleCAxNGVjMGIzLi5iYmE0MmUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9JbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9JbnNpZGVTdWJSb3V0aW5lRmxvd0NvbnRleHQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwpAQCAtMjQsOSArMjQsMjAgQEAKIAkJRmxvd0NvbnRleHQgcGFyZW50LAogCQlBc3ROb2RlIGFzc29jaWF0ZWROb2RlKSB7CiAJCXN1cGVyKHBhcmVudCwgYXNzb2NpYXRlZE5vZGUpOwotCQl0aGlzLmluaXRzT25SZXR1cm4gPSBGbG93SW5mby5EZWFkRW5kOwkJCQkKKwkJdGhpcy5pbml0c09uUmV0dXJuID0gRmxvd0luZm8uREVBRF9FTkQ7CQkJCQogCX0KLQkKKworCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgeworCQkKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkluc2lkZSBTdWJSb3V0aW5lIGZsb3cgY29udGV4dCIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIltpbml0c09uUmV0dXJuIC0iKS5hcHBlbmQoaW5pdHNPblJldHVybi50b1N0cmluZygpKS5hcHBlbmQoJ10nKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCQkKKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGluaXRzT25SZXR1cm4oKXsKKwkJcmV0dXJuIHRoaXMuaW5pdHNPblJldHVybjsKKwl9CisJCQogCXB1YmxpYyBib29sZWFuIGlzTm9uUmV0dXJuaW5nQ29udGV4dCgpIHsKIAkJcmV0dXJuIGFzc29jaWF0ZWROb2RlLmNhbm5vdFJldHVybigpOwogCX0KQEAgLTM1LDggKzQ2LDEzIEBACiAJCXJldHVybiBhc3NvY2lhdGVkTm9kZTsKIAl9CiAJCi0JcHVibGljIHZvaWQgcmVjb3JkUmV0dXJuRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gZmxvd0luZm8pIHsKLQkJLy8gcmVjb3JkIGluaXRpYWxpemF0aW9ucyB3aGljaCB3ZXJlIHBlcmZvcm1lZCBhdCB0aGUgcmV0dXJuIHBvaW50Ci0JCWluaXRzT25SZXR1cm4gPSBpbml0c09uUmV0dXJuLm1lcmdlZFdpdGgoZmxvd0luZm8pOworCXB1YmxpYyB2b2lkIHJlY29yZFJldHVybkZyb20oRmxvd0luZm8gZmxvd0luZm8pIHsKKworCQlpZiAoIWZsb3dJbmZvLmlzUmVhY2hhYmxlKCkpIHJldHVybjsgCisJCWlmIChpbml0c09uUmV0dXJuID09IEZsb3dJbmZvLkRFQURfRU5EKSB7CisJCQlpbml0c09uUmV0dXJuID0gZmxvd0luZm8uY29weSgpLnVuY29uZGl0aW9uYWxJbml0cygpOworCQl9IGVsc2UgeworCQkJaW5pdHNPblJldHVybi5tZXJnZWRXaXRoKGZsb3dJbmZvLnVuY29uZGl0aW9uYWxJbml0cygpKTsKKwkJfQogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9MYWJlbEZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9MYWJlbEZsb3dDb250ZXh0LmphdmEKaW5kZXggYjUxMjliYi4uOWY1YzgxYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvTGFiZWxGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xhYmVsRmxvd0NvbnRleHQuamF2YQpAQCAtMSwzOCArMSw0MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uTGFiZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogUmVmbGVjdHMgdGhlIGNvbnRleHQgb2YgY29kZSBhbmFseXNpcywga2VlcGluZyB0cmFjayBvZiBlbmNsb3NpbmcKICAqCXRyeSBzdGF0ZW1lbnRzLCBleGNlcHRpb24gaGFuZGxlcnMsIGV0Yy4uLgogICovCiBwdWJsaWMgY2xhc3MgTGFiZWxGbG93Q29udGV4dCBleHRlbmRzIFN3aXRjaEZsb3dDb250ZXh0IHsKKwkKIAlwdWJsaWMgY2hhcltdIGxhYmVsTmFtZTsKKwkKIAlwdWJsaWMgTGFiZWxGbG93Q29udGV4dCgKIAkJRmxvd0NvbnRleHQgcGFyZW50LAogCQlBc3ROb2RlIGFzc29jaWF0ZWROb2RlLAogCQljaGFyW10gbGFiZWxOYW1lLAogCQlMYWJlbCBicmVha0xhYmVsLAogCQlCbG9ja1Njb3BlIHNjb3BlKSB7CisJCQkKIAkJc3VwZXIocGFyZW50LCBhc3NvY2lhdGVkTm9kZSwgYnJlYWtMYWJlbCk7CiAJCXRoaXMubGFiZWxOYW1lID0gbGFiZWxOYW1lOwogCQljaGVja0xhYmVsVmFsaWRpdHkoc2NvcGUpOwogCX0KIAogCXZvaWQgY2hlY2tMYWJlbFZhbGlkaXR5KEJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJCiAJCS8vIGNoZWNrIGlmIGxhYmVsIHdhcyBhbHJlYWR5IGRlZmluZWQgYWJvdmUKIAkJRmxvd0NvbnRleHQgY3VycmVudCA9IHBhcmVudDsKIAkJd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgewpAQCAtNDYsMTAgKzUwLDEyIEBACiAJfQogCiAJcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7CisKIAkJcmV0dXJuICJMYWJlbCBmbG93IGNvbnRleHQgW2xhYmVsOiIgKyBTdHJpbmcudmFsdWVPZihsYWJlbE5hbWUpICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwdWJsaWMgY2hhcltdIGxhYmVsTmFtZSgpIHsKKwogCQlyZXR1cm4gbGFiZWxOYW1lOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Mb29waW5nRmxvd0NvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCmluZGV4IGE0YjJiMzcuLmY0Nzg4OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L0xvb3BpbmdGbG93Q29udGV4dC5qYXZhCkBAIC0xLDE3ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkxhYmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKQEAgLTI1LDEyICsyNCwxNCBAQAogICoJdHJ5IHN0YXRlbWVudHMsIGV4Y2VwdGlvbiBoYW5kbGVycywgZXRjLi4uCiAgKi8KIHB1YmxpYyBjbGFzcyBMb29waW5nRmxvd0NvbnRleHQgZXh0ZW5kcyBTd2l0Y2hGbG93Q29udGV4dCB7CisJCiAJcHVibGljIExhYmVsIGNvbnRpbnVlTGFiZWw7Ci0JcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uQ29udGludWUgPSBGbG93SW5mby5EZWFkRW5kOworCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkNvbnRpbnVlID0gRmxvd0luZm8uREVBRF9FTkQ7CiAJUmVmZXJlbmNlIGZpbmFsQXNzaWdubWVudHNbXTsKIAlWYXJpYWJsZUJpbmRpbmcgZmluYWxWYXJpYWJsZXNbXTsKIAlpbnQgYXNzaWduQ291bnQgPSAwOwogCVNjb3BlIGFzc29jaWF0ZWRTY29wZTsKKwkKIAlwdWJsaWMgTG9vcGluZ0Zsb3dDb250ZXh0KAogCQlGbG93Q29udGV4dCBwYXJlbnQsCiAJCUFzdE5vZGUgYXNzb2NpYXRlZE5vZGUsCkBAIC00NiwzMSArNDcsMzEgQEAKIAkJQmxvY2tTY29wZSBzY29wZSwKIAkJRmxvd0luZm8gZmxvd0luZm8pIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NpZ25Db3VudDsgaSsrKSB7Ci0JCQlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGU7Ci0JCQlpZiAoKHZhcmlhYmxlID0gZmluYWxWYXJpYWJsZXNbaV0pICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGNvbXBsYWluZWQ7IC8vIHJlbWVtYmVyIGlmIGhhdmUgY29tcGxhaW5lZCBvbiB0aGlzIGZpbmFsIGFzc2lnbm1lbnQKLQkJCQlpZiAodmFyaWFibGUgaW5zdGFuY2VvZiBGaWVsZEJpbmRpbmcpIHsKLQkJCQkJaWYgKGNvbXBsYWluZWQgPSBmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoKEZpZWxkQmluZGluZykgdmFyaWFibGUpKSB7Ci0JCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAotCQkJCQkJCShGaWVsZEJpbmRpbmcpIHZhcmlhYmxlLAotCQkJCQkJCShOYW1lUmVmZXJlbmNlKSBmaW5hbEFzc2lnbm1lbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjb21wbGFpbmVkID0KLQkJCQkJCWZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHZhcmlhYmxlKSkgewotCQkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoCi0JCQkJCQkJKExvY2FsVmFyaWFibGVCaW5kaW5nKSB2YXJpYWJsZSwKLQkJCQkJCQkoTmFtZVJlZmVyZW5jZSkgZmluYWxBc3NpZ25tZW50c1tpXSk7Ci0JCQkJCX0KKwkJCVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZSA9IGZpbmFsVmFyaWFibGVzW2ldOworCQkJaWYgKHZhcmlhYmxlID09IG51bGwpIGNvbnRpbnVlOworCQkJYm9vbGVhbiBjb21wbGFpbmVkID0gZmFsc2U7IC8vIHJlbWVtYmVyIGlmIGhhdmUgY29tcGxhaW5lZCBvbiB0aGlzIGZpbmFsIGFzc2lnbm1lbnQKKwkJCWlmICh2YXJpYWJsZSBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCQkJCWlmIChmbG93SW5mby5pc1BvdGVudGlhbGx5QXNzaWduZWQoKEZpZWxkQmluZGluZykgdmFyaWFibGUpKSB7CisJCQkJCWNvbXBsYWluZWQgPSB0cnVlOworCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVJbml0aWFsaXphdGlvbk9mQmxhbmtGaW5hbEZpZWxkKAorCQkJCQkJKEZpZWxkQmluZGluZykgdmFyaWFibGUsCisJCQkJCQlmaW5hbEFzc2lnbm1lbnRzW2ldKTsKIAkJCQl9Ci0JCQkJLy8gYW55IHJlZmVyZW5jZSByZXBvcnRlZCBhdCB0aGlzIGxldmVsIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IGNvbnRleHQgd2hlcmUgaXQgCi0JCQkJLy8gY291bGQgYWxzbyBiZSByZXBvcnRlZCBhZ2FpbgotCQkJCWlmIChjb21wbGFpbmVkKSB7Ci0JCQkJCUZsb3dDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQ7Ci0JCQkJCXdoaWxlIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQkJCWNvbnRleHQucmVtb3ZlRmluYWxBc3NpZ25tZW50SWZBbnkoZmluYWxBc3NpZ25tZW50c1tpXSk7Ci0JCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7Ci0JCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZsb3dJbmZvLmlzUG90ZW50aWFsbHlBc3NpZ25lZCgoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHZhcmlhYmxlKSkgeworCQkJCQljb21wbGFpbmVkID0gdHJ1ZTsKKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoCisJCQkJCQkoTG9jYWxWYXJpYWJsZUJpbmRpbmcpIHZhcmlhYmxlLAorCQkJCQkJZmluYWxBc3NpZ25tZW50c1tpXSk7CisJCQkJfQorCQkJfQorCQkJLy8gYW55IHJlZmVyZW5jZSByZXBvcnRlZCBhdCB0aGlzIGxldmVsIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IGNvbnRleHQgd2hlcmUgaXQgCisJCQkvLyBjb3VsZCBhbHNvIGJlIHJlcG9ydGVkIGFnYWluCisJCQlpZiAoY29tcGxhaW5lZCkgeworCQkJCUZsb3dDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQ7CisJCQkJd2hpbGUgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJCQljb250ZXh0LnJlbW92ZUZpbmFsQXNzaWdubWVudElmQW55KGZpbmFsQXNzaWdubWVudHNbaV0pOworCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7CiAJCQkJfQogCQkJfQogCQl9CkBAIC04MSw3ICs4MiwxMCBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmcgaW5kaXZpZHVhbFRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkxvb3BpbmcgZmxvdyBjb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTG9vcGluZyBmbG93IGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbaW5pdHNPbkJyZWFrIC0iKS5hcHBlbmQoaW5pdHNPbkJyZWFrLnRvU3RyaW5nKCkpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoIltpbml0c09uQ29udGludWUgLSIpLmFwcGVuZChpbml0c09uQ29udGludWUudG9TdHJpbmcoKSkuYXBwZW5kKCddJyk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzQ29udGludWFibGUoKSB7CkBAIC04OSwxNiArOTMsMTUgQEAKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0NvbnRpbnVlZFRvKCkgewotCQlyZXR1cm4gaW5pdHNPbkNvbnRpbnVlICE9IEZsb3dJbmZvLkRlYWRFbmQ7CisJCXJldHVybiBpbml0c09uQ29udGludWUgIT0gRmxvd0luZm8uREVBRF9FTkQ7CiAJfQogCiAJcHVibGljIHZvaWQgcmVjb3JkQ29udGludWVGcm9tKEZsb3dJbmZvIGZsb3dJbmZvKSB7Ci0JCWlmIChpbml0c09uQ29udGludWUgPT0gRmxvd0luZm8uRGVhZEVuZCkgeworCisJCWlmICghZmxvd0luZm8uaXNSZWFjaGFibGUoKSkgcmV0dXJuOworCQlpZiAoaW5pdHNPbkNvbnRpbnVlID09IEZsb3dJbmZvLkRFQURfRU5EKSB7CiAJCQlpbml0c09uQ29udGludWUgPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCX0gZWxzZSB7Ci0JCQkvLyBpZ25vcmUgaWYgbm90IHJlYWxseSByZWFjaGFibGUgKDFGS0VLUlApCi0JCQlpZiAoZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpCi0JCQkJcmV0dXJuOwogCQkJaW5pdHNPbkNvbnRpbnVlLm1lcmdlZFdpdGgoZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwogCQl9OwogCX0KQEAgLTE0Niw0ICsxNDksNCBAQAogCQkJfQogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9Td2l0Y2hGbG93Q29udGV4dC5qYXZhCmluZGV4IDU5ZTE4N2IuLjA4YjYzMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1N3aXRjaEZsb3dDb250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2Zsb3cvU3dpdGNoRmxvd0NvbnRleHQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5mbG93OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwpAQCAtMTksNyArMTksNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU3dpdGNoRmxvd0NvbnRleHQgZXh0ZW5kcyBGbG93Q29udGV4dCB7CiAJcHVibGljIExhYmVsIGJyZWFrTGFiZWw7Ci0JcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBpbml0c09uQnJlYWsgPSBGbG93SW5mby5EZWFkRW5kOworCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gaW5pdHNPbkJyZWFrID0gRmxvd0luZm8uREVBRF9FTkQ7CiAJCiAJcHVibGljIFN3aXRjaEZsb3dDb250ZXh0KAogCQlGbG93Q29udGV4dCBwYXJlbnQsCkBAIC0zNCw3ICszNCw5IEBACiAJfQogCiAJcHVibGljIFN0cmluZyBpbmRpdmlkdWFsVG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU3dpdGNoIGZsb3cgY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlN3aXRjaCBmbG93IGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAorCQlidWZmZXIuYXBwZW5kKCJbaW5pdHNPbkJyZWFrIC0iKS5hcHBlbmQoaW5pdHNPbkJyZWFrLnRvU3RyaW5nKCkpLmFwcGVuZCgnXScpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0JyZWFrYWJsZSgpIHsKQEAgLTQyLDEzICs0NCwxMSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHJlY29yZEJyZWFrRnJvbShGbG93SW5mbyBmbG93SW5mbykgewotCQlpZiAoaW5pdHNPbkJyZWFrID09IEZsb3dJbmZvLkRlYWRFbmQpIHsKKworCQlpZiAoaW5pdHNPbkJyZWFrID09IEZsb3dJbmZvLkRFQURfRU5EKSB7CiAJCQlpbml0c09uQnJlYWsgPSBmbG93SW5mby5jb3B5KCkudW5jb25kaXRpb25hbEluaXRzKCk7CiAJCX0gZWxzZSB7Ci0JCQkvLyBpZ25vcmUgaWYgbm90IHJlYWxseSByZWFjaGFibGUgKDFGS0VLUlApCi0JCQlpZiAoZmxvd0luZm8uaXNGYWtlUmVhY2hhYmxlKCkpCi0JCQkJcmV0dXJuOwogCQkJaW5pdHNPbkJyZWFrLm1lcmdlZFdpdGgoZmxvd0luZm8udW5jb25kaXRpb25hbEluaXRzKCkpOwogCQl9OwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvZmxvdy9VbmNvbmRpdGlvbmFsRmxvd0luZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1VuY29uZGl0aW9uYWxGbG93SW5mby5qYXZhCmluZGV4IDc5MTZjOTcuLjY3ODRkMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1VuY29uZGl0aW9uYWxGbG93SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9mbG93L1VuY29uZGl0aW9uYWxGbG93SW5mby5qYXZhCkBAIC0xLDE3ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmZsb3c7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9jYWxWYXJpYWJsZUJpbmRpbmc7CkBAIC0yMyw0MTcgKzI0LDU1NCBAQAogICogTm8gY2FjaGluZyBvZiBwcmUtYWxsb2NhdGVkIGluc3RhbmNlcy4KICAqLwogcHVibGljIGNsYXNzIFVuY29uZGl0aW9uYWxGbG93SW5mbyBleHRlbmRzIEZsb3dJbmZvIHsKKworCQogCXB1YmxpYyBsb25nIGRlZmluaXRlSW5pdHM7Ci0JbG9uZyBwb3RlbnRpYWxJbml0czsKKwlwdWJsaWMgbG9uZyBwb3RlbnRpYWxJbml0czsKIAlwdWJsaWMgbG9uZyBleHRyYURlZmluaXRlSW5pdHNbXTsKLQlsb25nIGV4dHJhUG90ZW50aWFsSW5pdHNbXTsKLQlwdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGU7CisJcHVibGljIGxvbmcgZXh0cmFQb3RlbnRpYWxJbml0c1tdOworCQorCXB1YmxpYyBpbnQgcmVhY2hNb2RlID0gUkVBQ0hBQkxFOyAvLyBieSBkZWZhdWx0CisKIAlwdWJsaWMgaW50IG1heEZpZWxkQ291bnQ7CiAJCiAJLy8gQ29uc3RhbnRzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQml0Q2FjaGVTaXplID0gNjQ7IC8vIDY0IGJpdHMgaW4gYSBsb25nLgotVW5jb25kaXRpb25hbEZsb3dJbmZvKCkgewotfQotcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBhZGRJbml0aWFsaXphdGlvbnNGcm9tKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7CisKKwlVbmNvbmRpdGlvbmFsRmxvd0luZm8oKSB7CisJfQogCiAJLy8gdW5pb25zIG9mIGJvdGggc2V0cyBvZiBpbml0aWFsaXphdGlvbiAtIHVzZWQgZm9yIHRyeS9maW5hbGx5Ci0JaWYgKHRoaXMgPT0gRGVhZEVuZCkKLQkJcmV0dXJuIHRoaXM7Ci0JaWYgKG90aGVySW5pdHMgPT0gRGVhZEVuZCkKLQkJcmV0dXJuIHRoaXM7Ci0JCQotCS8vIHVuaW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLCAKLQlkZWZpbml0ZUluaXRzIHw9IG90aGVySW5pdHMuZGVmaW5pdGVJbml0czsKLQkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcwotCXBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7CisJcHVibGljIEZsb3dJbmZvIGFkZEluaXRpYWxpemF0aW9uc0Zyb20oRmxvd0luZm8gaW5pdHMpIHsKIAotCS8vIHRyZWF0aW5nIGV4dHJhIHN0b3JhZ2UKLQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJCS8vIGJvdGggc2lkZXMgaGF2ZSBleHRyYSBzdG9yYWdlCi0JCQlpbnQgaSA9IDAsIGxlbmd0aCwgb3RoZXJMZW5ndGg7Ci0JCQlpZiAoKGxlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpIDwgKG90aGVyTGVuZ3RoID0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSkgewotCQkJCS8vIGN1cnJlbnQgc3RvcmFnZSBpcyBzaG9ydGVyIC0+IGdyb3cgY3VycmVudCAoY291bGQgbWF5YmUgcmV1c2Ugb3RoZXJJbml0cyBleHRyYSBzdG9yYWdlPykKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhRGVmaW5pdGVJbml0cywgMCwgKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIGxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShleHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIGxlbmd0aCk7Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCQkJZXh0cmFEZWZpbml0ZUluaXRzW2ldIHw9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzW2ldOwotCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldIHw9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOwotCQkJCX0KLQkJCQl3aGlsZSAoaSA8IG90aGVyTGVuZ3RoKSB7Ci0JCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gPSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGN1cnJlbnQgc3RvcmFnZSBpcyBsb25nZXIKLQkJCQl3aGlsZSAoaSA8IG90aGVyTGVuZ3RoKSB7Ci0JCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0c1tpXTsKLQkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpCi0JCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpKytdID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIG5vIGV4dHJhIHN0b3JhZ2Ugb24gb3RoZXJJbml0cwotCQl9Ci0JfSBlbHNlCi0JCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7Ci0JCQkvLyBubyBzdG9yYWdlIGhlcmUsIGJ1dCBvdGhlciBoYXMgZXh0cmEgc3RvcmFnZS4KLQkJCWludCBvdGhlckxlbmd0aDsKLQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aF0pLCAwLCBvdGhlckxlbmd0aCk7CQkJCi0JCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBvdGhlckxlbmd0aCk7Ci0JCX0KLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShVbmNvbmRpdGlvbmFsRmxvd0luZm8gb3RoZXJJbml0cykgeworCQlpZiAodGhpcyA9PSBERUFEX0VORCkKKwkJCXJldHVybiB0aGlzOwogCi0JLy8gdW5pb25zIG9mIGJvdGggc2V0cyBvZiBpbml0aWFsaXphdGlvbiAtIHVzZWQgZm9yIHRyeS9maW5hbGx5Ci0JaWYgKHRoaXMgPT0gRGVhZEVuZCl7Ci0JCXJldHVybiB0aGlzOwotCX0KLQlpZiAob3RoZXJJbml0cyA9PSBEZWFkRW5kKXsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCS8vIHVuaW9uIG9mIHBvdGVudGlhbGx5IHNldCBvbmVzCi0JcG90ZW50aWFsSW5pdHMgfD0gb3RoZXJJbml0cy5wb3RlbnRpYWxJbml0czsKLQotCS8vIHRyZWF0aW5nIGV4dHJhIHN0b3JhZ2UKLQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJCS8vIGJvdGggc2lkZXMgaGF2ZSBleHRyYSBzdG9yYWdlCi0JCQlpbnQgaSA9IDAsIGxlbmd0aCwgb3RoZXJMZW5ndGg7Ci0JCQlpZiAoKGxlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpIDwgKG90aGVyTGVuZ3RoID0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSkgewotCQkJCS8vIGN1cnJlbnQgc3RvcmFnZSBpcyBzaG9ydGVyIC0+IGdyb3cgY3VycmVudCAoY291bGQgbWF5YmUgcmV1c2Ugb3RoZXJJbml0cyBleHRyYSBzdG9yYWdlPykKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhRGVmaW5pdGVJbml0cywgMCwgKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIGxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShleHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIGxlbmd0aCk7Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgewotCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCi0JCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgewotCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldIHw9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZQotCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgewotCQkJLy8gbm8gc3RvcmFnZSBoZXJlLCBidXQgb3RoZXIgaGFzIGV4dHJhIHN0b3JhZ2UuCi0JCQlpbnQgb3RoZXJMZW5ndGg7Ci0JCQlleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aF07CQkJCi0JCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBvdGhlckxlbmd0aCk7Ci0JCX0KLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBib29sZWFuIGNvbXBsYWluSWZVbnJlYWNoYWJsZShTdGF0ZW1lbnQgc3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlKSB7Ci0JLy8gUmVwb3J0IGFuIGVycm9yIGlmIG5lY2Vzc2FyeQotCi0JYm9vbGVhbiBpc0RlYWRFbmQ7Ci0JaWYgKChpc0RlYWRFbmQgPSAodGhpcyA9PSBEZWFkRW5kKSkgfHwgaXNGYWtlUmVhY2hhYmxlKSB7Ci0JCXN0YXRlbWVudC5iaXRzICY9IH5Bc3ROb2RlLklzUmVhY2hhYmxlTUFTSzsKLQkJLyogRVhUUkEgUkVGRVJFTkNFIFJFQ09SRElORwotCQlzdGF0ZW1lbnQucmVjb3JkVW5yZWFjaGFibGVSZWZlcmVuY2VzKHNjb3BlLnJlZmVyZW5jZVR5cGUoKSk7IC8vIHNjb3BlcyBjYW5ub3QgaGF2ZSBhbiBlbmNsb3NpbmdNZXRob2Qgc2xvdCBzaW5jZSB0aGVyZSBhcmUgY2xhc3Mgc2NvcGVzCi0JCSovCi0JCWlmIChpc0RlYWRFbmQpCi0JCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlYWNoYWJsZUNvZGUoc3RhdGVtZW50KTsKLQkJcmV0dXJuIGlzRGVhZEVuZDsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBBbnN3ZXJzIGEgY29weSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZQotICovCi1wdWJsaWMgRmxvd0luZm8gY29weSgpIHsKLQkvLyBkbyBub3QgY2xvbmUgdGhlIERlYWRFbmQKLQlpZiAodGhpcyA9PSBEZWFkRW5kKQotCQlyZXR1cm4gdGhpczsKLQotCS8vIGxvb2sgZm9yIGFuIHVudXNlZCBwcmVhbGxvY2F0ZWQgb2JqZWN0Ci0JVW5jb25kaXRpb25hbEZsb3dJbmZvIGNvcHkgPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvKCk7Ci0KLQkvLyBjb3B5IHNsb3RzCi0JY29weS5kZWZpbml0ZUluaXRzID0gZGVmaW5pdGVJbml0czsKLQljb3B5LnBvdGVudGlhbEluaXRzID0gcG90ZW50aWFsSW5pdHM7Ci0JY29weS5pc0Zha2VSZWFjaGFibGUgPSBpc0Zha2VSZWFjaGFibGU7Ci0JY29weS5tYXhGaWVsZENvdW50ID0gbWF4RmllbGRDb3VudDsKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMgPSBpbml0cy51bmNvbmRpdGlvbmFsSW5pdHMoKTsJCisJCWlmIChvdGhlckluaXRzID09IERFQURfRU5EKQorCQkJcmV0dXJuIHRoaXM7CisJCQkKKwkJLy8gdW5pb24gb2YgZGVmaW5pdGVseSBhc3NpZ25lZCB2YXJpYWJsZXMsIAorCQlkZWZpbml0ZUluaXRzIHw9IG90aGVySW5pdHMuZGVmaW5pdGVJbml0czsKKwkJLy8gdW5pb24gb2YgcG90ZW50aWFsbHkgc2V0IG9uZXMKKwkJcG90ZW50aWFsSW5pdHMgfD0gb3RoZXJJbml0cy5wb3RlbnRpYWxJbml0czsKIAkKLQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJaW50IGxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChjb3B5LmV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nWyAobGVuZ3RoID0gZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCldKSwgMCwgbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShleHRyYVBvdGVudGlhbEluaXRzLCAwLCAoY29weS5leHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbbGVuZ3RoXSksIDAsIGxlbmd0aCk7Ci0JfTsKLQlyZXR1cm4gY29weTsKLX0KLXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5GYWxzZSgpIHsKLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5UcnVlKCkgewotCXJldHVybiB0aGlzOwotfQotLyoqCi0gKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uLgotICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKLSAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgotICovCi1maW5hbCBwcml2YXRlIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7Ci0JLy8gRGVwZW5kYW50IG9mIENvZGVTdHJlYW0uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCi0JLy8gaWQgaXMgemVyby1iYXNlZAotCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgewotCQlyZXR1cm4gKGRlZmluaXRlSW5pdHMgJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwOyAvLyB1c2UgYml0cwotCX0KLQkvLyB1c2UgZXh0cmEgdmVjdG9yCi0JaWYgKGV4dHJhRGVmaW5pdGVJbml0cyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKLQlpbnQgdmVjdG9ySW5kZXg7Ci0JaWYgKCh2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkIAotCXJldHVybiAoKGV4dHJhRGVmaW5pdGVJbml0c1t2ZWN0b3JJbmRleF0pICYgKDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpKSAhPSAwOwotfQotLyoqCi0gKiBDaGVjayBzdGF0dXMgb2YgZGVmaW5pdGUgYXNzaWdubWVudCBmb3IgYSBmaWVsZC4KLSAqLwotZmluYWwgcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7Ci0JLy8gRGVwZW5kYW50IG9mIENvZGVTdHJlYW0uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCi0JLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQotCWlmICgodGhpcyA9PSBEZWFkRW5kKSB8fCAodGhpcy5pc0Zha2VSZWFjaGFibGUpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQuaWQpOyAKLX0KLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuCi0gKi8KLWZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGVseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JLy8gRGVwZW5kYW50IG9mIENvZGVTdHJlYW0uaXNEZWZpbml0ZWx5QXNzaWduZWQoLi4pCi0JLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQotCWlmICgodGhpcyA9PSBEZWFkRW5kKSB8fCAodGhpcy5pc0Zha2VSZWFjaGFibGUpKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAobG9jYWwuaXNBcmd1bWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGlzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsLmlkICsgbWF4RmllbGRDb3VudCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0Zha2VSZWFjaGFibGUoKSB7Ci0JcmV0dXJuIGlzRmFrZVJlYWNoYWJsZTsKLX0KLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24uCi0gKiBJdCBkZWFscyB3aXRoIHRoZSBkdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJbml0aWFsaXphdGlvbkluZm8zOgotICogYml0cyBmb3IgdGhlIGZpcnN0IDY0IGVudHJpZXMsIHRoZW4gYW4gYXJyYXkgb2YgYm9vbGVhbnMuCi0gKi8KLWZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7Ci0JLy8gaWQgaXMgemVyby1iYXNlZAotCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgewotCQkvLyB1c2UgYml0cwotCQlyZXR1cm4gKHBvdGVudGlhbEluaXRzICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMDsKLQl9Ci0JLy8gdXNlIGV4dHJhIHZlY3RvcgotCWlmIChleHRyYVBvdGVudGlhbEluaXRzID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAotCWludCB2ZWN0b3JJbmRleDsKLQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IGV4dHJhUG90ZW50aWFsSW5pdHMubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkIAotCXJldHVybiAoKGV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdKSAmICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSkgIT0gMDsKLX0KLS8qKgotICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCi0gKi8KLWZpbmFsIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKLQkvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wbGFpbiBpbiB1bnJlYWNoYWJsZSBjb2RlCi0JaWYgKCh0aGlzID09IERlYWRFbmQpIHx8ICh0aGlzLmlzRmFrZVJlYWNoYWJsZSkpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKGZpZWxkLmlkKTsgCi19Ci0vKioKLSAqIENoZWNrIHN0YXR1cyBvZiBwb3RlbnRpYWwgYXNzaWdubWVudCBmb3IgYSBsb2NhbC4KLSAqLwotZmluYWwgcHVibGljIGJvb2xlYW4gaXNQb3RlbnRpYWxseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQotCWlmICgodGhpcyA9PSBEZWFkRW5kKSB8fCAodGhpcy5pc0Zha2VSZWFjaGFibGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGxvY2FsLmlzQXJndW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBpc1BvdGVudGlhbGx5QXNzaWduZWQobG9jYWwuaWQgKyBtYXhGaWVsZENvdW50KTsKLX0KLS8qKgotICogUmVjb3JkIGEgZGVmaW5pdGUgYXNzaWdubWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uLgotICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKLSAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgotICovCi1maW5hbCBwcml2YXRlIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGludCBwb3NpdGlvbikgewotCWlmICh0aGlzICE9IERlYWRFbmQpIHsKLQotCQkvLyBwb3NpdGlvbiBpcyB6ZXJvLWJhc2VkCi0JCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgewotCQkJLy8gdXNlIGJpdHMKLQkJCWxvbmcgbWFzazsKLQkJCWRlZmluaXRlSW5pdHMgfD0gKG1hc2sgPSAxTCA8PCBwb3NpdGlvbik7Ci0JCQlwb3RlbnRpYWxJbml0cyB8PSBtYXNrOwotCQl9IGVsc2UgewotCQkJLy8gdXNlIGV4dHJhIHZlY3RvcgotCQkJaW50IHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDE7Ci0JCQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzID09IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoOwotCQkJCWV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW2xlbmd0aCA9IHZlY3RvckluZGV4ICsgMV07Ci0JCQkJZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW2xlbmd0aF07Ci0JCQl9IGVsc2UgewotCQkJCWludCBvbGRMZW5ndGg7IC8vIG1pZ2h0IG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXlzCi0JCQkJaWYgKHZlY3RvckluZGV4ID49IChvbGRMZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhRGVmaW5pdGVJbml0cywgMCwgKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLCBvbGRMZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhUG90ZW50aWFsSW5pdHMsIDAsIChleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbdmVjdG9ySW5kZXggKyAxXSksIDAsIG9sZExlbmd0aCk7CisJCS8vIHRyZWF0aW5nIGV4dHJhIHN0b3JhZ2UKKwkJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJCS8vIGJvdGggc2lkZXMgaGF2ZSBleHRyYSBzdG9yYWdlCisJCQkJaW50IGkgPSAwLCBsZW5ndGgsIG90aGVyTGVuZ3RoOworCQkJCWlmICgobGVuZ3RoID0gZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkgPCAob3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpKSB7CisJCQkJCS8vIGN1cnJlbnQgc3RvcmFnZSBpcyBzaG9ydGVyIC0+IGdyb3cgY3VycmVudCAoY291bGQgbWF5YmUgcmV1c2Ugb3RoZXJJbml0cyBleHRyYSBzdG9yYWdlPykKKwkJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhUG90ZW50aWFsSW5pdHMsIDAsIChleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKKwkJCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKKwkJCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0c1tpXTsKKwkJCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJCX0KKwkJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSA9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIGxvbmdlcgorCQkJCQl3aGlsZSAoaSA8IG90aGVyTGVuZ3RoKSB7CisJCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHNbaV07CisJCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldIHw9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOworCQkJCQl9CisJCQkJCXdoaWxlIChpIDwgbGVuZ3RoKQorCQkJCQkJZXh0cmFEZWZpbml0ZUluaXRzW2krK10gPSAwOwogCQkJCX0KLQkJCX0KLQkJCWxvbmcgbWFzazsKLQkJCWV4dHJhRGVmaW5pdGVJbml0c1t2ZWN0b3JJbmRleF0gfD0gKG1hc2sgPSAxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKTsKLQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdIHw9IG1hc2s7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJlY29yZCBhIGZpZWxkIGdvdCBkZWZpbml0ZWx5IGFzc2lnbmVkLgotICovCi1wdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7Ci0JaWYgKHRoaXMgIT0gRGVhZEVuZCkKLQkJbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkLmlkKTsKLX0KLS8qKgotICogUmVjb3JkIGEgbG9jYWwgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCi0gKi8KLXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgewotCWlmICh0aGlzICE9IERlYWRFbmQpCi0JCW1hcmtBc0RlZmluaXRlbHlBc3NpZ25lZChsb2NhbC5pZCArIG1heEZpZWxkQ291bnQpOwotfQotLyoqCi0gKiBDbGVhciBpbml0aWFsaXphdGlvbiBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIHBvc2l0aW9uLgotICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKLSAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgotICovCi1maW5hbCBwcml2YXRlIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGludCBwb3NpdGlvbikgewotCWlmICh0aGlzICE9IERlYWRFbmQpIHsKLQotCQkvLyBwb3NpdGlvbiBpcyB6ZXJvLWJhc2VkCi0JCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgewotCQkJLy8gdXNlIGJpdHMKLQkJCWxvbmcgbWFzazsKLQkJCWRlZmluaXRlSW5pdHMgJj0gfihtYXNrID0gMUwgPDwgcG9zaXRpb24pOwotCQkJcG90ZW50aWFsSW5pdHMgJj0gfm1hc2s7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1c2UgZXh0cmEgdmVjdG9yCi0JCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKLQkJCWlmIChleHRyYURlZmluaXRlSW5pdHMgPT0gbnVsbCkgewotCQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbywgaXQgd2FzIG5vdCB5ZXQgc2V0IAogCQkJfSBlbHNlIHsKLQkJCQkvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cwotCQkJCWlmICh2ZWN0b3JJbmRleCA+PSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbywgaXQgd2FzIG5vdCB5ZXQgc2V0IAotCQkJCX0KKwkJCQkvLyBubyBleHRyYSBzdG9yYWdlIG9uIG90aGVySW5pdHMKIAkJCX0KLQkJCWxvbmcgbWFzazsKLQkJCWV4dHJhRGVmaW5pdGVJbml0c1t2ZWN0b3JJbmRleF0gJj0gfihtYXNrID0gMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7Ci0JCQlleHRyYVBvdGVudGlhbEluaXRzW3ZlY3RvckluZGV4XSAmPSB+bWFzazsKLQkJfQotCX0KLX0KLS8qKgotICogQ2xlYXIgdGhlIGluaXRpYWxpemF0aW9uIGluZm8gZm9yIGEgZmllbGQKLSAqLwotcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgewotCWlmICh0aGlzICE9IERlYWRFbmQpCi0JCW1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChmaWVsZC5pZCk7Ci19Ci0vKioKLSAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGxvY2FsIHZhcmlhYmxlCi0gKi8KLQotcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7Ci0JaWYgKHRoaXMgIT0gRGVhZEVuZCkKLQkJbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGxvY2FsLmlkICsgbWF4RmllbGRDb3VudCk7Ci19Ci1wdWJsaWMgRmxvd0luZm8gbWFya0FzRmFrZVJlYWNoYWJsZShib29sZWFuIGlzRmFrZVJlYWNoYWJsZSkgewotCXRoaXMuaXNGYWtlUmVhY2hhYmxlID0gaXNGYWtlUmVhY2hhYmxlOwotCXJldHVybiB0aGlzOwotfQotcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBtZXJnZWRXaXRoKFVuY29uZGl0aW9uYWxGbG93SW5mbyBvdGhlckluaXRzKSB7Ci0JLy8gdXBkYXRlcyB0aGUgcmVjZWl2ZXIgd2l0aDoKLQkvLyAtIGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCi0JLy8gLSB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcwotCi0JaWYgKHRoaXMgPT0gRGVhZEVuZCkKLQkJcmV0dXJuIG90aGVySW5pdHM7Ci0JaWYgKG90aGVySW5pdHMgPT0gRGVhZEVuZCkKKwkJfSBlbHNlCisJCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJCS8vIG5vIHN0b3JhZ2UgaGVyZSwgYnV0IG90aGVyIGhhcyBleHRyYSBzdG9yYWdlLgorCQkJCWludCBvdGhlckxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLCAwLCAoZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOwkJCQorCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsKKwkJCX0KIAkJcmV0dXJuIHRoaXM7CisJfQogCi0JLy8gaWYgb25lIGJyYW5jaCBpcyBub3QgZmFrZSByZWFjaGFibGUsIHRoZW4gdGhlIG1lcmdlZCBvbmUgaXMgcmVhY2hhYmxlCi0JaWYgKCFvdGhlckluaXRzLmlzRmFrZVJlYWNoYWJsZSgpKQotCQltYXJrQXNGYWtlUmVhY2hhYmxlKGZhbHNlKTsKKwkvLyB1bmlvbnMgb2YgYm90aCBzZXRzIG9mIGluaXRpYWxpemF0aW9uIC0gdXNlZCBmb3IgdHJ5L2ZpbmFsbHkKKwlwdWJsaWMgRmxvd0luZm8gYWRkUG90ZW50aWFsSW5pdGlhbGl6YXRpb25zRnJvbShGbG93SW5mbyBpbml0cykgeworCQorCQlpZiAodGhpcyA9PSBERUFEX0VORCl7CisJCQlyZXR1cm4gdGhpczsKKwkJfQogCi0JLy8gaW50ZXJzZWN0aW9uIG9mIGRlZmluaXRlbHkgYXNzaWduZWQgdmFyaWFibGVzLCAKLQlkZWZpbml0ZUluaXRzICY9IG90aGVySW5pdHMuZGVmaW5pdGVJbml0czsKLQkvLyB1bmlvbiBvZiBwb3RlbnRpYWxseSBzZXQgb25lcwotCXBvdGVudGlhbEluaXRzIHw9IG90aGVySW5pdHMucG90ZW50aWFsSW5pdHM7Ci0KLQkvLyB0cmVhdGluZyBleHRyYSBzdG9yYWdlCi0JaWYgKGV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7Ci0JCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7Ci0JCQkvLyBib3RoIHNpZGVzIGhhdmUgZXh0cmEgc3RvcmFnZQotCQkJaW50IGkgPSAwLCBsZW5ndGgsIG90aGVyTGVuZ3RoOwotCQkJaWYgKChsZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSA8IChvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKLQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgc2hvcnRlciAtPiBncm93IGN1cnJlbnQgKGNvdWxkIG1heWJlIHJldXNlIG90aGVySW5pdHMgZXh0cmEgc3RvcmFnZT8pCi0JCQkJU3lzdGVtLmFycmF5Y29weShleHRyYURlZmluaXRlSW5pdHMsIDAsIChleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOwotCQkJCXdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0JCQkJCWV4dHJhRGVmaW5pdGVJbml0c1tpXSAmPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0c1tpXTsKLQkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMgPSBpbml0cy51bmNvbmRpdGlvbmFsSW5pdHMoKTsKKwkJaWYgKG90aGVySW5pdHMgPT0gREVBRF9FTkQpeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJLy8gdW5pb24gb2YgcG90ZW50aWFsbHkgc2V0IG9uZXMKKwkJcG90ZW50aWFsSW5pdHMgfD0gb3RoZXJJbml0cy5wb3RlbnRpYWxJbml0czsKKwkKKwkJLy8gdHJlYXRpbmcgZXh0cmEgc3RvcmFnZQorCQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKKwkJCWlmIChvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cyAhPSBudWxsKSB7CisJCQkJLy8gYm90aCBzaWRlcyBoYXZlIGV4dHJhIHN0b3JhZ2UKKwkJCQlpbnQgaSA9IDAsIGxlbmd0aCwgb3RoZXJMZW5ndGg7CisJCQkJaWYgKChsZW5ndGggPSBleHRyYURlZmluaXRlSW5pdHMubGVuZ3RoKSA8IChvdGhlckxlbmd0aCA9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkpIHsKKwkJCQkJLy8gY3VycmVudCBzdG9yYWdlIGlzIHNob3J0ZXIgLT4gZ3JvdyBjdXJyZW50IChjb3VsZCBtYXliZSByZXVzZSBvdGhlckluaXRzIGV4dHJhIHN0b3JhZ2U/KQorCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhRGVmaW5pdGVJbml0cywgMCwgKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIGxlbmd0aCk7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCQl3aGlsZSAoaSA8IGxlbmd0aCkgeworCQkJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1tpXSB8PSBvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHNbaSsrXTsKKwkJCQkJfQorCQkJCQl3aGlsZSAoaSA8IG90aGVyTGVuZ3RoKSB7CisJCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCisJCQkJCXdoaWxlIChpIDwgb3RoZXJMZW5ndGgpIHsKKwkJCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJCX0KIAkJCQl9Ci0JCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgewotCQkJCQlleHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQl9CisJCX0gZWxzZQorCQkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKKwkJCQkvLyBubyBzdG9yYWdlIGhlcmUsIGJ1dCBvdGhlciBoYXMgZXh0cmEgc3RvcmFnZS4KKwkJCQlpbnQgb3RoZXJMZW5ndGg7CisJCQkJZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGhdOwkJCQorCQkJCVN5c3RlbS5hcnJheWNvcHkob3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsKKwkJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLy8gUmVwb3J0IGFuIGVycm9yIGlmIG5lY2Vzc2FyeQorCXB1YmxpYyBib29sZWFuIGNvbXBsYWluSWZVbnJlYWNoYWJsZShTdGF0ZW1lbnQgc3RhdGVtZW50LCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIGRpZEFscmVhZHlDb21wbGFpbikgeworCQorCQlpZiAoKHRoaXMucmVhY2hNb2RlICYgVU5SRUFDSEFCTEUpICE9IDApIHsKKwkJCXN0YXRlbWVudC5iaXRzICY9IH5Bc3ROb2RlLklzUmVhY2hhYmxlTUFTSzsKKwkJCWJvb2xlYW4gcmVwb3J0ZWQgPSB0aGlzID09IERFQURfRU5EOworCQkJaWYgKCFkaWRBbHJlYWR5Q29tcGxhaW4gJiYgcmVwb3J0ZWQpIHsKKwkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bnJlYWNoYWJsZUNvZGUoc3RhdGVtZW50KTsKKwkJCX0KKwkJCXJldHVybiByZXBvcnRlZDsgLy8ga2VlcCBnb2luZyBmb3IgZmFrZSByZWFjaGFibGUKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIEFuc3dlcnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlCisJICovCisJcHVibGljIEZsb3dJbmZvIGNvcHkoKSB7CisJCQorCQkvLyBkbyBub3QgY2xvbmUgdGhlIERlYWRFbmQKKwkJaWYgKHRoaXMgPT0gREVBRF9FTkQpCisJCQlyZXR1cm4gdGhpczsKKwkKKwkJLy8gbG9vayBmb3IgYW4gdW51c2VkIHByZWFsbG9jYXRlZCBvYmplY3QKKwkJVW5jb25kaXRpb25hbEZsb3dJbmZvIGNvcHkgPSBuZXcgVW5jb25kaXRpb25hbEZsb3dJbmZvKCk7CisJCisJCS8vIGNvcHkgc2xvdHMKKwkJY29weS5kZWZpbml0ZUluaXRzID0gdGhpcy5kZWZpbml0ZUluaXRzOworCQljb3B5LnBvdGVudGlhbEluaXRzID0gdGhpcy5wb3RlbnRpYWxJbml0czsKKwkJY29weS5yZWFjaE1vZGUgPSB0aGlzLnJlYWNoTW9kZTsKKwkJY29weS5tYXhGaWVsZENvdW50ID0gdGhpcy5tYXhGaWVsZENvdW50OworCQkKKwkJaWYgKHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKKwkJCWludCBsZW5ndGg7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzLCAwLCAoY29weS5leHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1sgKGxlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpXSksIDAsIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKGNvcHkuZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW2xlbmd0aF0pLCAwLCBsZW5ndGgpOworCQl9OworCQlyZXR1cm4gY29weTsKKwl9CisJCisJcHVibGljIFVuY29uZGl0aW9uYWxGbG93SW5mbyBkaXNjYXJkRmllbGRJbml0aWFsaXphdGlvbnMoKXsKKwkJCisJCWludCBsaW1pdCA9IHRoaXMubWF4RmllbGRDb3VudDsKKwkJCisJCWlmIChsaW1pdCA8IEJpdENhY2hlU2l6ZSkgeworCQkJbG9uZyBtYXNrID0gKDFMIDw8IGxpbWl0KS0xOworCQkJdGhpcy5kZWZpbml0ZUluaXRzICY9IH5tYXNrOworCQkJdGhpcy5wb3RlbnRpYWxJbml0cyAmPSB+bWFzazsKKwkJCXJldHVybiB0aGlzOworCQl9IAorCisJCXRoaXMuZGVmaW5pdGVJbml0cyA9IDA7CisJCXRoaXMucG90ZW50aWFsSW5pdHMgPSAwOworCisJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwkJaWYgKGV4dHJhRGVmaW5pdGVJbml0cyA9PSBudWxsKSB7CisJCQlyZXR1cm4gdGhpczsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAorCQl9CisJCWludCB2ZWN0b3JJbmRleCwgbGVuZ3RoID0gdGhpcy5leHRyYURlZmluaXRlSW5pdHMubGVuZ3RoOworCQlpZiAoKHZlY3RvckluZGV4ID0gKGxpbWl0IC8gQml0Q2FjaGVTaXplKSAtIDEpID49IGxlbmd0aCkgeworCQkJcmV0dXJuIHRoaXM7IC8vIG5vdCBlbm91Z2ggcm9vbSB5ZXQKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IHZlY3RvckluZGV4OyBpKyspIHsKKwkJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW2ldID0gMEw7CisJCQl0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHNbaV0gPSAwTDsKKwkJfQorCQlsb25nIG1hc2sgPSAoMUwgPDwgKGxpbWl0ICUgQml0Q2FjaGVTaXplKSktMTsKKwkJdGhpcy5leHRyYURlZmluaXRlSW5pdHNbdmVjdG9ySW5kZXhdICY9IH5tYXNrOworCQl0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdICY9IH5tYXNrOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIGRpc2NhcmROb25GaWVsZEluaXRpYWxpemF0aW9ucygpeworCQkKKwkJaW50IGxpbWl0ID0gdGhpcy5tYXhGaWVsZENvdW50OworCQkKKwkJaWYgKGxpbWl0IDwgQml0Q2FjaGVTaXplKSB7CisJCQlsb25nIG1hc2sgPSAoMUwgPDwgbGltaXQpLTE7CisJCQl0aGlzLmRlZmluaXRlSW5pdHMgJj0gbWFzazsKKwkJCXRoaXMucG90ZW50aWFsSW5pdHMgJj0gbWFzazsKKwkJCXJldHVybiB0aGlzOworCQl9IAorCQkvLyB1c2UgZXh0cmEgdmVjdG9yCisJCWlmIChleHRyYURlZmluaXRlSW5pdHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXM7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKKwkJfQorCQlpbnQgdmVjdG9ySW5kZXgsIGxlbmd0aCA9IHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aDsKKwkJaWYgKCh2ZWN0b3JJbmRleCA9IChsaW1pdCAvIEJpdENhY2hlU2l6ZSkgLSAxKSA+PSBsZW5ndGgpIHsKKwkJCXJldHVybiB0aGlzOyAvLyBub3QgZW5vdWdoIHJvb20geWV0CisJCX0KKwkJbG9uZyBtYXNrID0gKDFMIDw8IChsaW1pdCAlIEJpdENhY2hlU2l6ZSkpLTE7CisJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW3ZlY3RvckluZGV4XSAmPSBtYXNrOworCQl0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdICY9IG1hc2s7CisJCWZvciAoaW50IGkgPSB2ZWN0b3JJbmRleCsxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW2ldID0gMEw7CisJCQl0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHNbaV0gPSAwTDsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisJCisJcHVibGljIEZsb3dJbmZvIGluaXRzV2hlbkZhbHNlKCkgeworCQkKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBGbG93SW5mbyBpbml0c1doZW5UcnVlKCkgeworCQkKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCS8qKgorCSAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24uCisJICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKKwkgKiBiaXRzIGZvciB0aGUgZmlyc3QgNjQgZW50cmllcywgdGhlbiBhbiBhcnJheSBvZiBib29sZWFucy4KKwkgKi8KKwlmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7CisJCQorCQkvLyBEZXBlbmRhbnQgb2YgQ29kZVN0cmVhbS5pc0RlZmluaXRlbHlBc3NpZ25lZCguLikKKwkJLy8gaWQgaXMgemVyby1iYXNlZAorCQlpZiAocG9zaXRpb24gPCBCaXRDYWNoZVNpemUpIHsKKwkJCXJldHVybiAoZGVmaW5pdGVJbml0cyAmICgxTCA8PCBwb3NpdGlvbikpICE9IDA7IC8vIHVzZSBiaXRzCisJCX0KKwkJLy8gdXNlIGV4dHJhIHZlY3RvcgorCQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHZlY3RvciBub3QgeWV0IGFsbG9jYXRlZCwgdGhlbiBub3QgaW5pdGlhbGl6ZWQKKwkJaW50IHZlY3RvckluZGV4OworCQlpZiAoKHZlY3RvckluZGV4ID0gKHBvc2l0aW9uIC8gQml0Q2FjaGVTaXplKSAtIDEpID49IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpCisJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkIAorCQlyZXR1cm4gKChleHRyYURlZmluaXRlSW5pdHNbdmVjdG9ySW5kZXhdKSAmICgxTCA8PCAocG9zaXRpb24gJSBCaXRDYWNoZVNpemUpKSkgIT0gMDsKKwl9CisJCisJLyoqCisJICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgZmllbGQuCisJICovCisJZmluYWwgcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJCQorCQkvLyBEZXBlbmRhbnQgb2YgQ29kZVN0cmVhbS5pc0RlZmluaXRlbHlBc3NpZ25lZCguLikKKwkJLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGxhaW4gaW4gdW5yZWFjaGFibGUgY29kZQorCQlpZiAoKHRoaXMucmVhY2hNb2RlICYgVU5SRUFDSEFCTEUpICE9IDApICAKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gaXNEZWZpbml0ZWx5QXNzaWduZWQoZmllbGQuaWQpOyAKKwl9CisJCisJLyoqCisJICogQ2hlY2sgc3RhdHVzIG9mIGRlZmluaXRlIGFzc2lnbm1lbnQgZm9yIGEgbG9jYWwuCisJICovCisJZmluYWwgcHVibGljIGJvb2xlYW4gaXNEZWZpbml0ZWx5QXNzaWduZWQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwpIHsKKwkJCisJCS8vIERlcGVuZGFudCBvZiBDb2RlU3RyZWFtLmlzRGVmaW5pdGVseUFzc2lnbmVkKC4uKQorCQkvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wbGFpbiBpbiB1bnJlYWNoYWJsZSBjb2RlCisJCWlmICgodGhpcy5yZWFjaE1vZGUgJiBVTlJFQUNIQUJMRSkgIT0gMCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAobG9jYWwuaXNBcmd1bWVudCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJLy8gZmluYWwgY29uc3RhbnRzIGFyZSBpbmxpbmVkLCBhbmQgdGh1cyBjb25zaWRlcmVkIGFzIGFsd2F5cyBpbml0aWFsaXplZAorCQlpZiAobG9jYWwuY29uc3RhbnQgIT0gQ29uc3RhbnQuTm90QUNvbnN0YW50KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWwuaWQgKyBtYXhGaWVsZENvdW50KTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoKSB7CisJCQorCQlyZXR1cm4gdGhpcy5yZWFjaE1vZGUgPT0gUkVBQ0hBQkxFOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayBzdGF0dXMgb2YgcG90ZW50aWFsIGFzc2lnbm1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbi4KKwkgKiBJdCBkZWFscyB3aXRoIHRoZSBkdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJbml0aWFsaXphdGlvbkluZm8zOgorCSAqIGJpdHMgZm9yIHRoZSBmaXJzdCA2NCBlbnRyaWVzLCB0aGVuIGFuIGFycmF5IG9mIGJvb2xlYW5zLgorCSAqLworCWZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc1BvdGVudGlhbGx5QXNzaWduZWQoaW50IHBvc2l0aW9uKSB7CisJCQorCQkvLyBpZCBpcyB6ZXJvLWJhc2VkCisJCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgeworCQkJLy8gdXNlIGJpdHMKKwkJCXJldHVybiAocG90ZW50aWFsSW5pdHMgJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwOworCQl9CisJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwkJaWYgKGV4dHJhUG90ZW50aWFsSW5pdHMgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsgLy8gaWYgdmVjdG9yIG5vdCB5ZXQgYWxsb2NhdGVkLCB0aGVuIG5vdCBpbml0aWFsaXplZAorCQlpbnQgdmVjdG9ySW5kZXg7CisJCWlmICgodmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMSkgPj0gZXh0cmFQb3RlbnRpYWxJbml0cy5sZW5ndGgpCisJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIG5vdCBlbm91Z2ggcm9vbSBpbiB2ZWN0b3IsIHRoZW4gbm90IGluaXRpYWxpemVkIAorCQlyZXR1cm4gKChleHRyYVBvdGVudGlhbEluaXRzW3ZlY3RvckluZGV4XSkgJiAoMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSkpICE9IDA7CisJfQorCQorCS8qKgorCSAqIENoZWNrIHN0YXR1cyBvZiBkZWZpbml0ZSBhc3NpZ25tZW50IGZvciBhIGZpZWxkLgorCSAqLworCWZpbmFsIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwkJCisJCXJldHVybiBpc1BvdGVudGlhbGx5QXNzaWduZWQoZmllbGQuaWQpOyAKKwl9CisJCisJLyoqCisJICogQ2hlY2sgc3RhdHVzIG9mIHBvdGVudGlhbCBhc3NpZ25tZW50IGZvciBhIGxvY2FsLgorCSAqLworCWZpbmFsIHB1YmxpYyBib29sZWFuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCQkKKwkJaWYgKGxvY2FsLmlzQXJndW1lbnQpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCS8vIGZpbmFsIGNvbnN0YW50cyBhcmUgaW5saW5lZCwgYW5kIHRodXMgY29uc2lkZXJlZCBhcyBhbHdheXMgaW5pdGlhbGl6ZWQKKwkJaWYgKGxvY2FsLmNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGlzUG90ZW50aWFsbHlBc3NpZ25lZChsb2NhbC5pZCArIG1heEZpZWxkQ291bnQpOworCX0KKwkKKwkvKioKKwkgKiBSZWNvcmQgYSBkZWZpbml0ZSBhc3NpZ25tZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24uCisJICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKKwkgKiBiaXRzIGZvciB0aGUgZmlyc3QgNjQgZW50cmllcywgdGhlbiBhbiBhcnJheSBvZiBib29sZWFucy4KKwkgKi8KKwlmaW5hbCBwcml2YXRlIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGludCBwb3NpdGlvbikgeworCQkKKwkJaWYgKHRoaXMgIT0gREVBRF9FTkQpIHsKKwkKKwkJCS8vIHBvc2l0aW9uIGlzIHplcm8tYmFzZWQKKwkJCWlmIChwb3NpdGlvbiA8IEJpdENhY2hlU2l6ZSkgeworCQkJCS8vIHVzZSBiaXRzCisJCQkJbG9uZyBtYXNrOworCQkJCWRlZmluaXRlSW5pdHMgfD0gKG1hc2sgPSAxTCA8PCBwb3NpdGlvbik7CisJCQkJcG90ZW50aWFsSW5pdHMgfD0gbWFzazsKKwkJCX0gZWxzZSB7CisJCQkJLy8gdXNlIGV4dHJhIHZlY3RvcgorCQkJCWludCB2ZWN0b3JJbmRleCA9IChwb3NpdGlvbiAvIEJpdENhY2hlU2l6ZSkgLSAxOworCQkJCWlmIChleHRyYURlZmluaXRlSW5pdHMgPT0gbnVsbCkgeworCQkJCQlpbnQgbGVuZ3RoOworCQkJCQlleHRyYURlZmluaXRlSW5pdHMgPSBuZXcgbG9uZ1tsZW5ndGggPSB2ZWN0b3JJbmRleCArIDFdOworCQkJCQlleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbbGVuZ3RoXTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgb2xkTGVuZ3RoOyAvLyBtaWdodCBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cworCQkJCQlpZiAodmVjdG9ySW5kZXggPj0gKG9sZExlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4dHJhRGVmaW5pdGVJbml0cywgMCwgKGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLCBvbGRMZW5ndGgpOworCQkJCQkJU3lzdGVtLmFycmF5Y29weShleHRyYVBvdGVudGlhbEluaXRzLCAwLCAoZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW3ZlY3RvckluZGV4ICsgMV0pLCAwLCBvbGRMZW5ndGgpOworCQkJCQl9CisJCQkJfQorCQkJCWxvbmcgbWFzazsKKwkJCQlleHRyYURlZmluaXRlSW5pdHNbdmVjdG9ySW5kZXhdIHw9IChtYXNrID0gMUwgPDwgKHBvc2l0aW9uICUgQml0Q2FjaGVTaXplKSk7CisJCQkJZXh0cmFQb3RlbnRpYWxJbml0c1t2ZWN0b3JJbmRleF0gfD0gbWFzazsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZWNvcmQgYSBmaWVsZCBnb3QgZGVmaW5pdGVseSBhc3NpZ25lZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXJrQXNEZWZpbml0ZWx5QXNzaWduZWQoRmllbGRCaW5kaW5nIGZpZWxkKSB7CisJCWlmICh0aGlzICE9IERFQURfRU5EKQorCQkJbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGZpZWxkLmlkKTsKKwl9CisJCisJLyoqCisJICogUmVjb3JkIGEgbG9jYWwgZ290IGRlZmluaXRlbHkgYXNzaWduZWQuCisJICovCisJcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsKSB7CisJCWlmICh0aGlzICE9IERFQURfRU5EKQorCQkJbWFya0FzRGVmaW5pdGVseUFzc2lnbmVkKGxvY2FsLmlkICsgbWF4RmllbGRDb3VudCk7CisJfQorCQorCS8qKgorCSAqIENsZWFyIGluaXRpYWxpemF0aW9uIGluZm9ybWF0aW9uIGF0IGEgZ2l2ZW4gcG9zaXRpb24uCisJICogSXQgZGVhbHMgd2l0aCB0aGUgZHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSW5pdGlhbGl6YXRpb25JbmZvMjoKKwkgKiBiaXRzIGZvciB0aGUgZmlyc3QgNjQgZW50cmllcywgdGhlbiBhbiBhcnJheSBvZiBib29sZWFucy4KKwkgKi8KKwlmaW5hbCBwcml2YXRlIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKGludCBwb3NpdGlvbikgeworCQlpZiAodGhpcyAhPSBERUFEX0VORCkgeworCQorCQkJLy8gcG9zaXRpb24gaXMgemVyby1iYXNlZAorCQkJaWYgKHBvc2l0aW9uIDwgQml0Q2FjaGVTaXplKSB7CisJCQkJLy8gdXNlIGJpdHMKKwkJCQlsb25nIG1hc2s7CisJCQkJZGVmaW5pdGVJbml0cyAmPSB+KG1hc2sgPSAxTCA8PCBwb3NpdGlvbik7CisJCQkJcG90ZW50aWFsSW5pdHMgJj0gfm1hc2s7CisJCQl9IGVsc2UgeworCQkJCS8vIHVzZSBleHRyYSB2ZWN0b3IKKwkJCQlpbnQgdmVjdG9ySW5kZXggPSAocG9zaXRpb24gLyBCaXRDYWNoZVNpemUpIC0gMTsKKwkJCQlpZiAoZXh0cmFEZWZpbml0ZUluaXRzID09IG51bGwpIHsKKwkJCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvLCBpdCB3YXMgbm90IHlldCBzZXQgCisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gbWlnaHQgbmVlZCB0byBncm93IHRoZSBhcnJheXMKKwkJCQkJaWYgKHZlY3RvckluZGV4ID49IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpIHsKKwkJCQkJCXJldHVybjsgLy8gbm90aGluZyB0byBkbywgaXQgd2FzIG5vdCB5ZXQgc2V0IAorCQkJCQl9CisJCQkJfQorCQkJCWxvbmcgbWFzazsKKwkJCQlleHRyYURlZmluaXRlSW5pdHNbdmVjdG9ySW5kZXhdICY9IH4obWFzayA9IDFMIDw8IChwb3NpdGlvbiAlIEJpdENhY2hlU2l6ZSkpOworCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbdmVjdG9ySW5kZXhdICY9IH5tYXNrOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIENsZWFyIHRoZSBpbml0aWFsaXphdGlvbiBpbmZvIGZvciBhIGZpZWxkCisJICovCisJcHVibGljIHZvaWQgbWFya0FzRGVmaW5pdGVseU5vdEFzc2lnbmVkKEZpZWxkQmluZGluZyBmaWVsZCkgeworCQkKKwkJaWYgKHRoaXMgIT0gREVBRF9FTkQpCisJCQltYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQoZmllbGQuaWQpOworCX0KKwkKKwkvKioKKwkgKiBDbGVhciB0aGUgaW5pdGlhbGl6YXRpb24gaW5mbyBmb3IgYSBsb2NhbCB2YXJpYWJsZQorCSAqLworCQorCXB1YmxpYyB2b2lkIG1hcmtBc0RlZmluaXRlbHlOb3RBc3NpZ25lZChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCkgeworCQkKKwkJaWYgKHRoaXMgIT0gREVBRF9FTkQpCisJCQltYXJrQXNEZWZpbml0ZWx5Tm90QXNzaWduZWQobG9jYWwuaWQgKyBtYXhGaWVsZENvdW50KTsKKwl9CisJCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlY2VpdmVyIHVwZGF0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6IDx1bD4KKwkgKiA8bGk+IGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCisJICogPGxpPiB1bmlvbiBvZiBwb3RlbnRpYWxseSBhc3NpZ25lZCB2YXJpYWJsZXMuCisJICogPC91bD4KKwkgKi8KKwlwdWJsaWMgVW5jb25kaXRpb25hbEZsb3dJbmZvIG1lcmdlZFdpdGgoVW5jb25kaXRpb25hbEZsb3dJbmZvIG90aGVySW5pdHMpIHsKKwkKKwkJaWYgKHRoaXMgPT0gREVBRF9FTkQpIHJldHVybiBvdGhlckluaXRzOworCQlpZiAob3RoZXJJbml0cyA9PSBERUFEX0VORCkgcmV0dXJuIHRoaXM7CisJCisJCWlmICgodGhpcy5yZWFjaE1vZGUgJiBVTlJFQUNIQUJMRSkgIT0gKG90aGVySW5pdHMucmVhY2hNb2RlICYgVU5SRUFDSEFCTEUpKXsKKwkJCWlmICgodGhpcy5yZWFjaE1vZGUgJiBVTlJFQUNIQUJMRSkgIT0gMCl7CisJCQkJcmV0dXJuIG90aGVySW5pdHM7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0aGlzOworCQkJfQorCQl9CisJCQorCQkvLyBpZiBvbmUgYnJhbmNoIGlzIG5vdCBmYWtlIHJlYWNoYWJsZSwgdGhlbiB0aGUgbWVyZ2VkIG9uZSBpcyByZWFjaGFibGUKKwkJdGhpcy5yZWFjaE1vZGUgJj0gb3RoZXJJbml0cy5yZWFjaE1vZGU7CisJCisJCS8vIGludGVyc2VjdGlvbiBvZiBkZWZpbml0ZWx5IGFzc2lnbmVkIHZhcmlhYmxlcywgCisJCXRoaXMuZGVmaW5pdGVJbml0cyAmPSBvdGhlckluaXRzLmRlZmluaXRlSW5pdHM7CisJCS8vIHVuaW9uIG9mIHBvdGVudGlhbGx5IHNldCBvbmVzCisJCXRoaXMucG90ZW50aWFsSW5pdHMgfD0gb3RoZXJJbml0cy5wb3RlbnRpYWxJbml0czsKKwkKKwkJLy8gdHJlYXRpbmcgZXh0cmEgc3RvcmFnZQorCQlpZiAodGhpcy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKKwkJCQkvLyBib3RoIHNpZGVzIGhhdmUgZXh0cmEgc3RvcmFnZQorCQkJCWludCBpID0gMCwgbGVuZ3RoLCBvdGhlckxlbmd0aDsKKwkJCQlpZiAoKGxlbmd0aCA9IHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzLmxlbmd0aCkgPCAob3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGgpKSB7CisJCQkJCS8vIGN1cnJlbnQgc3RvcmFnZSBpcyBzaG9ydGVyIC0+IGdyb3cgY3VycmVudCAoY291bGQgbWF5YmUgcmV1c2Ugb3RoZXJJbml0cyBleHRyYSBzdG9yYWdlPykKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhRGVmaW5pdGVJbml0cywgMCwgKHRoaXMuZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgbGVuZ3RoKTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHMsIDAsICh0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHMgPSBuZXcgbG9uZ1tvdGhlckxlbmd0aF0pLCAwLCBsZW5ndGgpOworCQkJCQl3aGlsZSAoaSA8IGxlbmd0aCkgeworCQkJCQkJdGhpcy5leHRyYURlZmluaXRlSW5pdHNbaV0gJj0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHNbaV07CisJCQkJCQl0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJCX0KKwkJCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgeworCQkJCQkJdGhpcy5leHRyYVBvdGVudGlhbEluaXRzW2ldID0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCisJCQkJCXdoaWxlIChpIDwgb3RoZXJMZW5ndGgpIHsKKwkJCQkJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW2ldICY9IG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzW2ldOworCQkJCQkJdGhpcy5leHRyYVBvdGVudGlhbEluaXRzW2ldIHw9IG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0c1tpKytdOworCQkJCQl9CisJCQkJCXdoaWxlIChpIDwgbGVuZ3RoKQorCQkJCQkJdGhpcy5leHRyYURlZmluaXRlSW5pdHNbaSsrXSA9IDA7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQkvLyBjdXJyZW50IHN0b3JhZ2UgaXMgbG9uZ2VyCi0JCQkJd2hpbGUgKGkgPCBvdGhlckxlbmd0aCkgewotCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaV0gJj0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHNbaV07Ci0JCQkJCWV4dHJhUG90ZW50aWFsSW5pdHNbaV0gfD0gb3RoZXJJbml0cy5leHRyYVBvdGVudGlhbEluaXRzW2krK107Ci0JCQkJfQorCQkJCS8vIG5vIGV4dHJhIHN0b3JhZ2Ugb24gb3RoZXJJbml0cworCQkJCWludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5leHRyYURlZmluaXRlSW5pdHMubGVuZ3RoOwogCQkJCXdoaWxlIChpIDwgbGVuZ3RoKQotCQkJCQlleHRyYURlZmluaXRlSW5pdHNbaSsrXSA9IDA7CisJCQkJCXRoaXMuZXh0cmFEZWZpbml0ZUluaXRzW2krK10gPSAwOwogCQkJfQotCQl9IGVsc2UgewotCQkJLy8gbm8gZXh0cmEgc3RvcmFnZSBvbiBvdGhlckluaXRzCi0JCQlpbnQgaSA9IDAsIGxlbmd0aCA9IGV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGg7Ci0JCQl3aGlsZSAoaSA8IGxlbmd0aCkKLQkJCQlleHRyYURlZmluaXRlSW5pdHNbaSsrXSA9IDA7Ci0JCX0KLQl9IGVsc2UKLQkJaWYgKG90aGVySW5pdHMuZXh0cmFEZWZpbml0ZUluaXRzICE9IG51bGwpIHsKLQkJCS8vIG5vIHN0b3JhZ2UgaGVyZSwgYnV0IG90aGVyIGhhcyBleHRyYSBzdG9yYWdlLgotCQkJaW50IG90aGVyTGVuZ3RoOwotCQkJZXh0cmFEZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGggPSBvdGhlckluaXRzLmV4dHJhRGVmaW5pdGVJbml0cy5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShvdGhlckluaXRzLmV4dHJhUG90ZW50aWFsSW5pdHMsIDAsIChleHRyYVBvdGVudGlhbEluaXRzID0gbmV3IGxvbmdbb3RoZXJMZW5ndGhdKSwgMCwgb3RoZXJMZW5ndGgpOwotCQl9Ci0JcmV0dXJuIHRoaXM7Ci19Ci0vKgotICogQW5zd2VyIHRoZSB0b3RhbCBudW1iZXIgb2YgZmllbGRzIGluIGVuY2xvc2luZyB0eXBlcyBvZiBhIGdpdmVuIHR5cGUKLSAqLwotc3RhdGljIGludCBudW1iZXJPZkVuY2xvc2luZ0ZpZWxkcyhSZWZlcmVuY2VCaW5kaW5nIHR5cGUpewotCWludCBjb3VudCA9IDA7Ci0JdHlwZSA9IHR5cGUuZW5jbG9zaW5nVHlwZSgpOwotCXdoaWxlKHR5cGUgIT0gbnVsbCkgewotCQljb3VudCArPSB0eXBlLmZpZWxkQ291bnQoKTsKKwkJfSBlbHNlCisJCQlpZiAob3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMgIT0gbnVsbCkgeworCQkJCS8vIG5vIHN0b3JhZ2UgaGVyZSwgYnV0IG90aGVyIGhhcyBleHRyYSBzdG9yYWdlLgorCQkJCWludCBvdGhlckxlbmd0aDsKKwkJCQl0aGlzLmV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoID0gb3RoZXJJbml0cy5leHRyYURlZmluaXRlSW5pdHMubGVuZ3RoXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVySW5pdHMuZXh0cmFQb3RlbnRpYWxJbml0cywgMCwgKHRoaXMuZXh0cmFQb3RlbnRpYWxJbml0cyA9IG5ldyBsb25nW290aGVyTGVuZ3RoXSksIDAsIG90aGVyTGVuZ3RoKTsKKwkJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCS8qCisJICogQW5zd2VyIHRoZSB0b3RhbCBudW1iZXIgb2YgZmllbGRzIGluIGVuY2xvc2luZyB0eXBlcyBvZiBhIGdpdmVuIHR5cGUKKwkgKi8KKwlzdGF0aWMgaW50IG51bWJlck9mRW5jbG9zaW5nRmllbGRzKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSl7CisJCQorCQlpbnQgY291bnQgPSAwOwogCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCXdoaWxlKHR5cGUgIT0gbnVsbCkgeworCQkJY291bnQgKz0gdHlwZS5maWVsZENvdW50KCk7CisJCQl0eXBlID0gdHlwZS5lbmNsb3NpbmdUeXBlKCk7CisJCX0KKwkJcmV0dXJuIGNvdW50OwogCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JaWYgKHRoaXMgPT0gRGVhZEVuZCl7Ci0JCXJldHVybiAiRmxvd0luZm8uRGVhZEVuZCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgaW50IHJlYWNoTW9kZSgpeworCQlyZXR1cm4gdGhpcy5yZWFjaE1vZGU7CiAJfQotCXJldHVybiAiRmxvd0luZm88ZGVmOiAiKyBkZWZpbml0ZUluaXRzICsiLCBwb3Q6ICIgKyBwb3RlbnRpYWxJbml0cyArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtMiQKLX0KLXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzKCkgewotCS8vIGFsc28gc2VlIGNvbmRpdGlvbmFsIGluaXRzLCB3aGVyZSBpdCByZXF1ZXN0cyB0aGVtIHRvIG1lcmdlCi0JcmV0dXJuIHRoaXM7Ci19CisJCisJcHVibGljIEZsb3dJbmZvIHNldFJlYWNoTW9kZShpbnQgcmVhY2hNb2RlKSB7CisJCQorCQlpZiAodGhpcyA9PSBERUFEX0VORCkgcmV0dXJuIHRoaXM7IC8vIGNhbm5vdCBtb2RpZnkgREVBRF9FTkQKKwkKKwkJLy8gcmVzZXQgb3B0aW9uYWwgaW5pdHMgd2hlbiBiZWNvbWluZyB1bnJlYWNoYWJsZQorCQlpZiAoKHRoaXMucmVhY2hNb2RlICYgVU5SRUFDSEFCTEUpID09IDAgJiYgKHJlYWNoTW9kZSAmIFVOUkVBQ0hBQkxFKSAhPSAwKSB7CisJCQl0aGlzLnBvdGVudGlhbEluaXRzID0gMDsKKwkJCWlmICh0aGlzLmV4dHJhUG90ZW50aWFsSW5pdHMgIT0gbnVsbCl7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMuZXh0cmFQb3RlbnRpYWxJbml0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7CisJCQkJCXRoaXMuZXh0cmFQb3RlbnRpYWxJbml0c1tpXSA9IDA7CisJCQkJfQorCQkJfQorCQl9CQkJCQorCQl0aGlzLnJlYWNoTW9kZSA9IHJlYWNoTW9kZTsKKwkKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCQkKKwkJaWYgKHRoaXMgPT0gREVBRF9FTkQpeworCQkJcmV0dXJuICJGbG93SW5mby5ERUFEX0VORCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gIkZsb3dJbmZvPGRlZjogIisgdGhpcy5kZWZpbml0ZUluaXRzIC8vJE5PTi1OTFMtMSQKKwkJCSsiLCBwb3Q6ICIgKyB0aGlzLnBvdGVudGlhbEluaXRzICAvLyROT04tTkxTLTEkCisJCQkrICIsIHJlYWNoYWJsZToiICsgKCh0aGlzLnJlYWNoTW9kZSAmIFVOUkVBQ0hBQkxFKSA9PSAwKSAvLyROT04tTkxTLTEkCisJCQkrIj4iOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBVbmNvbmRpdGlvbmFsRmxvd0luZm8gdW5jb25kaXRpb25hbEluaXRzKCkgeworCQkKKwkJLy8gYWxzbyBzZWUgY29uZGl0aW9uYWwgaW5pdHMsIHdoZXJlIGl0IHJlcXVlc3RzIHRoZW0gdG8gbWVyZ2UKKwkJcmV0dXJuIHRoaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQm9vbGVhbkNvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQppbmRleCA1ZWViNjM5Li42NDEyZTBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Cb29sZWFuQ29uc3RhbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgQm9vbGVhbkNvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQnl0ZUNvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQppbmRleCA5NGY1MmZlLi4yMjNmNmFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9CeXRlQ29uc3RhbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgQnl0ZUNvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ2hhckNvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQppbmRleCA4NWVlMTJjLi5mZGJkYjkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9DaGFyQ29uc3RhbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBwdWJsaWMgY2xhc3MgQ2hhckNvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29tcGlsZXJPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlck9wdGlvbnMuamF2YQppbmRleCBjMzA2Y2Y4Li40ZTMwODlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlck9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db21waWxlck9wdGlvbnMuamF2YQpAQCAtMSwyMCArMSwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7CkBAIC0zNCwxOCArMzYsMjkgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0TWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydE92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0RGVwcmVjYXRpb24gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0RGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRIaWRkZW5DYXRjaEJsb2NrID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jayI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkTG9jYWwgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0VW51c2VkUGFyYW1ldGVyID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1JlcG9ydFN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0Tm9FZmZlY3RBc3NpZ25tZW50ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnROb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRVbnVzZWRQcml2YXRlTWVtYmVyID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0Tm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU291cmNlID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVGFyZ2V0UGxhdGZvcm0gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUmVwb3J0QXNzZXJ0SWRlbnRpZmllciA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0NvbXBsaWFuY2UgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRW5jb2RpbmcgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX01heFByb2JsZW1QZXJVbml0ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9SZXBvcnRTdGF0aWNBY2Nlc3NSZWNlaXZlciA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9UYXNrVGFncyA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrVGFncyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVGFza1ByaW9yaXRpZXMgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1ByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCisKIAogCS8qIHNob3VsZCBzdXJmYWNlID8/PyAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9Qcml2YXRlQ29uc3RydWN0b3JBY2Nlc3MgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5jb25zdHJ1Y3RvckFjY2Vzc0VtdWxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKQEAgLTY0LDYgKzc3LDggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFID0gImlnbm9yZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCiAJCiAJLyoqCiAJICogQml0IG1hc2sgZm9yIGNvbmZpZ3VyYWJsZSBwcm9ibGVtcyAoZXJyb3Ivd2FybmluZyB0aHJlc2hvbGQpCkBAIC04MSwxMyArOTYsMjUgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb25FeHRlcm5hbGl6ZWRTdHJpbmcgPSAweDEwMDAwMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgPSAweDIwMDAwMDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbnVzZWRJbXBvcnQgPSAweDQwMDAwMDsKLQkJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdGljQWNjZXNzUmVjZWl2ZXIgPSAweDgwMDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUYXNrID0gMHgxMDAwMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5vRWZmZWN0QXNzaWdubWVudCA9IDB4MjAwMDAwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgPSAweDQwMDAwMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW51c2VkUHJpdmF0ZU1lbWJlciA9IDB4ODAwMDAwMDsKKwkKIAkvLyBEZWZhdWx0IHNldmVyaXR5IGxldmVsIGZvciBoYW5kbGVycwotCXB1YmxpYyBpbnQgZXJyb3JUaHJlc2hvbGQgPSBVbnJlYWNoYWJsZUNvZGUgfCBJbXBvcnRQcm9ibGVtOworCXB1YmxpYyBpbnQgZXJyb3JUaHJlc2hvbGQgPSAKKwkJVW5yZWFjaGFibGVDb2RlIAorCQl8IEltcG9ydFByb2JsZW07CisJCQogCXB1YmxpYyBpbnQgd2FybmluZ1RocmVzaG9sZCA9IAotCQlNZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIHwgT3ZlcnJpZGRlblBhY2thZ2VEZWZhdWx0TWV0aG9kCi0JCXwgVXNpbmdEZXByZWNhdGVkQVBJIHwgTWFza2VkQ2F0Y2hCbG9jayAKLQkJfCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgfCBOb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbjsKKwkJTWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSAKKwkJfCBPdmVycmlkZGVuUGFja2FnZURlZmF1bHRNZXRob2QKKwkJfCBVc2luZ0RlcHJlY2F0ZWRBUEkgCisJCXwgTWFza2VkQ2F0Y2hCbG9jayAKKwkJfCBBc3NlcnRVc2VkQXNBbklkZW50aWZpZXIgCisJCXwgTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24KKwkJfCBJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7CiAKIAkvLyBEZWJ1ZyBhdHRyaWJ1dGVzCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU291cmNlID0gMTsgLy8gU291cmNlRmlsZUF0dHJpYnV0ZQpAQCAtOTcsNyArMTI0LDYgQEAKIAkvLyBCeSBkZWZhdWx0IG9ubHkgbGluZXMgYW5kIHNvdXJjZSBhdHRyaWJ1dGVzIGFyZSBnZW5lcmF0ZWQuCiAJcHVibGljIGludCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzID0gTGluZXMgfCBTb3VyY2U7CiAKLQogCS8vIEpESyAxLjEsIDEuMiwgMS4zIG9yIDEuNAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpESzFfMSA9IDA7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkRLMV8yID0gMTsKQEAgLTExMCw4ICsxMzYsOCBAQAogCS8vIHRvZ2dsZSBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gZm9yIDEuMiAoY29uc3RyLiBhY2Nlc3NvciBoYXMgZXh0cmEgYXJnIG9uIGNvbnN0cnVjdG9yKSBvciAxLjMgKG1ha2UgcHJpdmF0ZSBjb25zdHJ1Y3RvciBkZWZhdWx0IGFjY2VzcyB3aGVuIGFjY2VzcyBuZWVkZWQpCiAJcHVibGljIGJvb2xlYW4gaXNQcml2YXRlQ29uc3RydWN0b3JBY2Nlc3NDaGFuZ2luZ1Zpc2liaWxpdHkgPSBmYWxzZTsgLy8gYnkgZGVmYXVsdCwgZm9sbG93cyAxLjIKIAotCS8vIDEuNCBmZWF0dXJlCi0JcHVibGljIGJvb2xlYW4gYXNzZXJ0TW9kZSA9IGZhbHNlOyAvLzEuMyBiZWhhdmlvciBieSBkZWZhdWx0CisJLy8gMS40IGZlYXR1cmUgKGFzc2VydGlvbnMgYXJlIGF2YWlsYWJsZSBpbiBzb3VyY2UgMS40IG1vZGUgb25seSkKKwlwdWJsaWMgaW50IHNvdXJjZUxldmVsID0gSkRLMV8zOyAvLzEuMyBiZWhhdmlvciBieSBkZWZhdWx0CiAJCiAJLy8gc291cmNlIGVuY29kaW5nIGZvcm1hdAogCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEVuY29kaW5nID0gbnVsbDsgLy8gd2lsbCB1c2UgdGhlIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcKQEAgLTEzNCw2ICsxNjAsMTkgQEAKIAkvLyBtYXggcHJvYmxlbXMgcGVyIGNvbXBpbGF0aW9uIHVuaXQKIAlwdWJsaWMgaW50IG1heFByb2JsZW1zUGVyVW5pdCA9IDEwMDsgLy8gbm8gbW9yZSB0aGFuIDEwMCBwcm9ibGVtcyBwZXIgZGVmYXVsdAogCQorCS8vIHRhZ3MgdXNlZCB0byByZWNvZ25pemUgdGFza3MgaW4gY29tbWVudHMKKwlwdWJsaWMgY2hhcltdW10gdGFza1RhZ3MgPSBudWxsOworCisJLy8gcHJpb3JpdGllcyBvZiB0YXNrcyBpbiBjb21tZW50cworCXB1YmxpYyBjaGFyW11bXSB0YXNrUHJpb3JpdGVzID0gbnVsbDsKKworCS8vIGRlcHJlY2F0aW9uIHJlcG9ydAorCXB1YmxpYyBib29sZWFuIHJlcG9ydERlcHJlY2F0aW9uSW5zaWRlRGVwcmVjYXRlZENvZGUgPSBmYWxzZTsKKwkKKwkvLyB1bnVzZWQgcGFyYW1ldGVycyByZXBvcnQKKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QgPSBmYWxzZTsKKwlwdWJsaWMgYm9vbGVhbiByZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlID0gZmFsc2U7CisJCiAJLyoqIAogCSAqIEluaXRpYWxpemluZyB0aGUgY29tcGlsZXIgb3B0aW9ucyB3aXRoIGRlZmF1bHRzCiAJICovCkBAIC0xNDgsOSArMTg3LDkgQEAKIAkJaWYgKHNldHRpbmdzID09IG51bGwpIHJldHVybjsKIAkJCiAJCS8vIGZpbHRlciBvcHRpb25zIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBjb21waWxlciBjb21wb25lbnQKLQkJT2JqZWN0W10gZW50cmllcyA9IHNldHRpbmdzLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZW50cmllcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXNbaV07CisJCUl0ZXJhdG9yIGVudHJpZXMgPSBzZXR0aW5ncy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSllbnRyaWVzLm5leHQoKTsKIAkJCWlmICghKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CiAJCQlpZiAoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CiAJCQlTdHJpbmcgb3B0aW9uSUQgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKQEAgLTMwMSw2ICszNDAsMTUgQEAKIAkJCQl9CiAJCQkJY29udGludWU7CiAJCQl9IAorCQkJLy8gUmVwb3J0IGRlcHJlY2F0aW9uIGluc2lkZSBkZXByZWNhdGVkIGNvZGUgCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZSkpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRU5BQkxFRCkpIHsKKwkJCQkJdGhpcy5yZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhESVNBQkxFRCkpIHsKKwkJCQkJdGhpcy5yZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlID0gZmFsc2U7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKIAkJCS8vIFJlcG9ydCBoaWRkZW4gY2F0Y2ggYmxvY2sKIAkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0SGlkZGVuQ2F0Y2hCbG9jaykpewogCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CkBAIC0zMjgsNyArMzc2LDIxIEBACiAJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+VW51c2VkTG9jYWxWYXJpYWJsZTsKIAkJCQl9CiAJCQkJY29udGludWU7Ci0JCQl9IAorCQkJfQorCQkJLy8gUmVwb3J0IG5vIGltcGxpY2l0IFN0cmluZyBjb252ZXJzaW9uCisJCQlpZiAob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnROb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbikpIHsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IE5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfk5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gfk5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gTm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb247CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoSUdOT1JFKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5Ob0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5Ob0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CiAJCQkvLyBSZXBvcnQgdW51c2VkIHBhcmFtZXRlcgogCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIpKXsKIAkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgewpAQCAtMzQzLDcgKzQwNSwyNSBAQAogCQkJCX0KIAkJCQljb250aW51ZTsKIAkJCX0gCi0JCQkvLyBSZXBvcnQgdW51c2VkIHBhcmFtZXRlcgorCQkJLy8gUmVwb3J0IHVudXNlZCBwYXJhbWV0ZXIgd2hlbiBpbXBsZW1lbnRpbmcgYWJzdHJhY3QgbWV0aG9kIAorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVOQUJMRUQpKSB7CisJCQkJCXRoaXMucmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0ID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhESVNBQkxFRCkpIHsKKwkJCQkJdGhpcy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QgPSBmYWxzZTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUmVwb3J0IHVudXNlZCBwYXJhbWV0ZXIgd2hlbiBpbXBsZW1lbnRpbmcgYWJzdHJhY3QgbWV0aG9kIAorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFTkFCTEVEKSkgeworCQkJCQl0aGlzLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUgPSB0cnVlOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKERJU0FCTEVEKSkgeworCQkJCQl0aGlzLnJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUgPSBmYWxzZTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUmVwb3J0IHVudXNlZCBpbXBvcnQKIAkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0VW51c2VkSW1wb3J0KSl7CiAJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKIAkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBVbnVzZWRJbXBvcnQ7CkBAIC00MDIsOSArNDgyLDkgQEAKIAkJCS8vIFNldCB0aGUgc291cmNlIGNvbXBhdGliaWxpdHkgbW9kZSAoYXNzZXJ0aW9ucykKIAkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fU291cmNlKSl7CiAJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhWRVJTSU9OXzFfMykpIHsKLQkJCQkJdGhpcy5hc3NlcnRNb2RlID0gZmFsc2U7CisJCQkJCXRoaXMuc291cmNlTGV2ZWwgPSBKREsxXzM7CiAJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoVkVSU0lPTl8xXzQpKSB7Ci0JCQkJCXRoaXMuYXNzZXJ0TW9kZSA9IHRydWU7CisJCQkJCXRoaXMuc291cmNlTGV2ZWwgPSBKREsxXzQ7CiAJCQkJfQogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNDMwLDE3ICs1MTAsODYgQEAKIAkJCQl9CQkJCQogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJLy8gUmVwb3J0IHVubmVjZXNzYXJ5IHJlY2VpdmVyIGZvciBzdGF0aWMgYWNjZXNzCisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1JlcG9ydFN0YXRpY0FjY2Vzc1JlY2VpdmVyKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmVxdWFscyhFUlJPUikpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCB8PSBTdGF0aWNBY2Nlc3NSZWNlaXZlcjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5TdGF0aWNBY2Nlc3NSZWNlaXZlcjsKKwkJCQl9IGVsc2UgaWYgKG9wdGlvblZhbHVlLmVxdWFscyhXQVJOSU5HKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkICY9IH5TdGF0aWNBY2Nlc3NSZWNlaXZlcjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkIHw9IFN0YXRpY0FjY2Vzc1JlY2VpdmVyOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+U3RhdGljQWNjZXNzUmVjZWl2ZXI7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCAmPSB+U3RhdGljQWNjZXNzUmVjZWl2ZXI7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBpbnRlcmZhY2UgbWV0aG9kIGluY29tcGF0aWJsZSB3aXRoIG5vbi1pbmhlcml0ZWQgT2JqZWN0IG1ldGhvZAorCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnRJbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5JbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoV0FSTklORykpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+SW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kOworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfkluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IAorCQkJLy8gUmVwb3J0IHVudXNlZCBwcml2YXRlIG1lbWJlcnMKKwkJCWlmKG9wdGlvbklELmVxdWFscyhPUFRJT05fUmVwb3J0VW51c2VkUHJpdmF0ZU1lbWJlcikpeworCQkJCWlmIChvcHRpb25WYWx1ZS5lcXVhbHMoRVJST1IpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgfD0gVW51c2VkUHJpdmF0ZU1lbWJlcjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRQcml2YXRlTWVtYmVyOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKFdBUk5JTkcpKSB7CisJCQkJCXRoaXMuZXJyb3JUaHJlc2hvbGQgJj0gflVudXNlZFByaXZhdGVNZW1iZXI7CisJCQkJCXRoaXMud2FybmluZ1RocmVzaG9sZCB8PSBVbnVzZWRQcml2YXRlTWVtYmVyOworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+VW51c2VkUHJpdmF0ZU1lbWJlcjsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5VbnVzZWRQcml2YXRlTWVtYmVyOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gCisJCQkvLyBSZXBvcnQgdGFzaworCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9UYXNrVGFncykpeworCQkJCWlmIChvcHRpb25WYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXRoaXMudGFza1RhZ3MgPSBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMudGFza1RhZ3MgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgb3B0aW9uVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKKwkJCS8vIFJlcG9ydCBuby1vcCBhc3NpZ25tZW50cworCQkJaWYob3B0aW9uSUQuZXF1YWxzKE9QVElPTl9SZXBvcnROb0VmZmVjdEFzc2lnbm1lbnQpKXsKKwkJCQlpZiAob3B0aW9uVmFsdWUuZXF1YWxzKEVSUk9SKSkgeworCQkJCQl0aGlzLmVycm9yVGhyZXNob2xkIHw9IE5vRWZmZWN0QXNzaWdubWVudDsKKwkJCQkJdGhpcy53YXJuaW5nVGhyZXNob2xkICY9IH5Ob0VmZmVjdEFzc2lnbm1lbnQ7CisJCQkJfSBlbHNlIGlmIChvcHRpb25WYWx1ZS5lcXVhbHMoV0FSTklORykpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+Tm9FZmZlY3RBc3NpZ25tZW50OworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgfD0gTm9FZmZlY3RBc3NpZ25tZW50OworCQkJCX0gZWxzZSBpZiAob3B0aW9uVmFsdWUuZXF1YWxzKElHTk9SRSkpIHsKKwkJCQkJdGhpcy5lcnJvclRocmVzaG9sZCAmPSB+Tm9FZmZlY3RBc3NpZ25tZW50OworCQkJCQl0aGlzLndhcm5pbmdUaHJlc2hvbGQgJj0gfk5vRWZmZWN0QXNzaWdubWVudDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZihvcHRpb25JRC5lcXVhbHMoT1BUSU9OX1Rhc2tQcmlvcml0aWVzKSl7CisJCQkJaWYgKG9wdGlvblZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdGhpcy50YXNrUHJpb3JpdGVzID0gbnVsbDsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnRhc2tQcmlvcml0ZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgb3B0aW9uVmFsdWUudG9DaGFyQXJyYXkoKSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfSAKIAkJfQogCX0KIAkKLQlwdWJsaWMgaW50IGdldFRhcmdldEpESygpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0SkRLOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Tm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbFNldmVyaXR5KCkgewotCQlpZigod2FybmluZ1RocmVzaG9sZCAmIE5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gMCkKKwlwdWJsaWMgaW50IGdldFNldmVyaXR5KGludCBpcnJpdGFudCkgeworCQlpZigod2FybmluZ1RocmVzaG9sZCAmIGlycml0YW50KSAhPSAwKQogCQkJcmV0dXJuIFdhcm5pbmc7Ci0JCWlmKChlcnJvclRocmVzaG9sZCAmIE5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gMCkKKwkJaWYoKGVycm9yVGhyZXNob2xkICYgaXJyaXRhbnQpICE9IDApCiAJCQlyZXR1cm4gRXJyb3I7CiAJCXJldHVybiBJZ25vcmU7CiAJfQpAQCAtNTY3LDcgKzcxNiwxNSBAQAogCQkJCWJ1Zi5hcHBlbmQoIlxuLXN5bnRoZXRpYyBhY2Nlc3MgZW11bGF0aW9uOiBJR05PUkUiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9Ci0JCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApeworCQlpZiAoKGVycm9yVGhyZXNob2xkICYgTm9FZmZlY3RBc3NpZ25tZW50KSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLWFzc2lnbm1lbnQgd2l0aCBubyBlZmZlY3Q6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIE5vRWZmZWN0QXNzaWdubWVudCkgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4tYXNzaWdubWVudCB3aXRoIG5vIGVmZmVjdDogV0FSTklORyIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1Zi5hcHBlbmQoIlxuLWFzc2lnbm1lbnQgd2l0aCBubyBlZmZlY3Q6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0JCWlmICgoZXJyb3JUaHJlc2hvbGQgJiBOb25FeHRlcm5hbGl6ZWRTdHJpbmcpICE9IDApewogCQkJYnVmLmFwcGVuZCgiXG4tbm9uIGV4dGVybmFsaXplZCBzdHJpbmc6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBlbHNlIHsKIAkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIE5vbkV4dGVybmFsaXplZFN0cmluZykgIT0gMCl7CkBAIC01NzYsNiArNzMzLDMzIEBACiAJCQkJYnVmLmFwcGVuZCgiXG4tbm9uIGV4dGVybmFsaXplZCBzdHJpbmc6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIFN0YXRpY0FjY2Vzc1JlY2VpdmVyKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLXN0YXRpYyBhY2Nlc3MgcmVjZWl2ZXI6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIFN0YXRpY0FjY2Vzc1JlY2VpdmVyKSAhPSAwKXsKKwkJCQlidWYuYXBwZW5kKCJcbi1zdGF0aWMgYWNjZXNzIHJlY2VpdmVyOiBXQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgiXG4tc3RhdGljIGFjY2VzcyByZWNlaXZlcjogSUdOT1JFIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yVGhyZXNob2xkICYgSW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kKSAhPSAwKXsKKwkJCWJ1Zi5hcHBlbmQoIlxuLWluY29tcGF0aWJsZSBub24gaW5oZXJpdGVkIGludGVyZmFjZSBtZXRob2Q6IEVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIEluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCkgIT0gMCl7CisJCQkJYnVmLmFwcGVuZCgiXG4taW5jb21wYXRpYmxlIG5vbiBpbmhlcml0ZWQgaW50ZXJmYWNlIG1ldGhvZDogV0FSTklORyIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1Zi5hcHBlbmQoIlxuLWluY29tcGF0aWJsZSBub24gaW5oZXJpdGVkIGludGVyZmFjZSBtZXRob2Q6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJaWYgKChlcnJvclRocmVzaG9sZCAmIFVudXNlZFByaXZhdGVNZW1iZXIpICE9IDApeworCQkJYnVmLmFwcGVuZCgiXG4tdW51c2VkIHByaXZhdGUgbWVtYmVyOiBFUlJPUiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBVbnVzZWRQcml2YXRlTWVtYmVyKSAhPSAwKXsKKwkJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgcHJpdmF0ZSBtZW1iZXI6IFdBUk5JTkciKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlidWYuYXBwZW5kKCJcbi11bnVzZWQgcHJpdmF0ZSBtZW1iZXI6IElHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KIAkJc3dpdGNoKHRhcmdldEpESyl7CiAJCQljYXNlIEpESzFfMSA6CiAJCQkJYnVmLmFwcGVuZCgiXG4tdGFyZ2V0IEpESzogMS4xIik7IC8vJE5PTi1OTFMtMSQKQEAgLTYxNCw2ICs3OTgsMTEgQEAKIAkJYnVmLmFwcGVuZCgiXG4tcGFyc2UgbGl0ZXJhbCBleHByZXNzaW9ucyBhcyBjb25zdGFudHMgOiAiICsgKHBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMgPyAiT04iIDogIk9GRiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJYnVmLmFwcGVuZCgiXG4tcnVudGltZSBleGNlcHRpb24gbmFtZSBmb3IgY29tcGlsZSBlcnJvciA6ICIgKyBydW50aW1lRXhjZXB0aW9uTmFtZUZvckNvbXBpbGVFcnJvcik7IC8vJE5PTi1OTFMtMSQKIAkJYnVmLmFwcGVuZCgiXG4tZW5jb2RpbmcgOiAiICsgKGRlZmF1bHRFbmNvZGluZyA9PSBudWxsID8gIjxkZWZhdWx0PiIgOiBkZWZhdWx0RW5jb2RpbmcpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1Zi5hcHBlbmQoIlxuLXRhc2sgdGFnczogIiArICh0aGlzLnRhc2tUYWdzID09IG51bGwgPyAiIiA6IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHRoaXMudGFza1RhZ3MsJywnKSkpKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlidWYuYXBwZW5kKCJcbi10YXNrIHByaW9yaXRpZXMgOiAiICsgKHRoaXMudGFza1ByaW9yaXRlcyA9PSBudWxsID8gIiIgOiBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uY29uY2F0V2l0aCh0aGlzLnRhc2tQcmlvcml0ZXMsJywnKSkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1Zi5hcHBlbmQoIlxuLXJlcG9ydCBkZXByZWNhdGlvbiBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlIDogIiArIChyZXBvcnREZXByZWNhdGlvbkluc2lkZURlcHJlY2F0ZWRDb2RlID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlidWYuYXBwZW5kKCJcbi1yZXBvcnQgdW51c2VkIHBhcmFtZXRlciB3aGVuIGltcGxlbWVudGluZyBhYnN0cmFjdCBtZXRob2QgOiAiICsgKHJlcG9ydFVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCA/ICJFTkFCTEVEIiA6ICJESVNBQkxFRCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJYnVmLmFwcGVuZCgiXG4tcmVwb3J0IHVudXNlZCBwYXJhbWV0ZXIgd2hlbiBvdmVycmlkaW5nIGNvbmNyZXRlIG1ldGhvZCA6ICIgKyAocmVwb3J0VW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZSA/ICJFTkFCTEVEIiA6ICJESVNBQkxFRCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbnN0YW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Db25zdGFudC5qYXZhCmluZGV4IDY1ODg2YjMuLmM5NDZiNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0NvbnN0YW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvQ29uc3RhbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5PcGVyYXRvcklkczsKQEAgLTE2LDE0NzcgKzE2LDE1OTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnQgaW1wbGVtZW50cyBUeXBlSWRzLCBPcGVyYXRvcklkcyB7CisJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBOb3RBQ29uc3RhbnQgPSBuZXcgRG91YmxlQ29uc3RhbnQoRG91YmxlLk5hTik7CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEludENvbnN0YW50IFplcm8gPSBuZXcgSW50Q29uc3RhbnQoMCk7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBUd28gPSBuZXcgSW50Q29uc3RhbnQoMik7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRDb25zdGFudCBPbmUgPSBuZXcgSW50Q29uc3RhbnQoMSk7Ci1wdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImJvb2xlYW4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotfQotcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJieXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLX0KLXB1YmxpYyBmaW5hbCBDb25zdGFudCBjYXN0VG8oaW50IGNvbnZlcnNpb25Ub1RhcmdldFR5cGUpewotCS8vdGhlIGNhc3QgaXMgYW4gaW50IG9mIHRoZSBmb3JtCi0JLy8gKGNhc3RJZDw8NCkrdHlwZUlkIChpbiBvcmRlciB0byBmb2xsb3cgdGhlCi0JLy91c2VyIHdyaXR0ZW4gc3R5bGUgKGNhc3QpZXhwcmVzc2lvbiAuLi4uCi0JLy9UaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIFRDIGlzIGRvbmUgKGNvcnJlY3RseSA6LSkKLQotCWlmICh0aGlzID09IE5vdEFDb25zdGFudCkgcmV0dXJuIE5vdEFDb25zdGFudCA7Ci0Jc3dpdGNoKGNvbnZlcnNpb25Ub1RhcmdldFR5cGUpewotCQljYXNlIFRfdW5kZWZpbmVkIDogCQkJCQkJcmV0dXJuIHRoaXM7Ci0vLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9PYmplY3QgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9kb3VibGUgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9mbG9hdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9udWxsICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAogCQotLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIHRoaXMgOyAgCi0JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5sb25nVmFsdWUoKSkgOyAKLQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5zaG9ydFZhbHVlKCkpOyAgICAKLS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfU3RyaW5nICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfT2JqZWN0ICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2RvdWJsZSAgCSAJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmRvdWJsZVZhbHVlKCkpOyAgICAKLQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5mbG9hdFZhbHVlKCkpOyAgICAKLS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuY2hhclZhbHVlKCkpOyAgICAKLQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2ludCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuaW50VmFsdWUoKSk7ICAgIAotLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9udWxsICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAorCXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKIAotLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmJ5dGVWYWx1ZSgpKTsgCi0JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9sb25nICAJCSA6IHJldHVybiB0aGlzIDsgCi0JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuc2hvcnRWYWx1ZSgpKTsgCi0vLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfT2JqZWN0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5kb3VibGVWYWx1ZSgpKTsgICAKLQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5mbG9hdFZhbHVlKCkpOyAgCi0vLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmNoYXJWYWx1ZSgpKTsgCi0JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmludFZhbHVlKCkpOyAKLS8vCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfbnVsbCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmJ5dGVWYWx1ZSgpKTsKLQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMubG9uZ1ZhbHVlKCkpOyAKLQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gdGhpcyA7ICAKLS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMuZG91YmxlVmFsdWUoKSkgOyAgIAotCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMuZmxvYXRWYWx1ZSgpKSA7ICAgCi0vLwkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9ib29sZWFuIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9zaG9ydDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMuY2hhclZhbHVlKCkpIDsgIAotCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2ludCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmludFZhbHVlKCkpIDsgIAotLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfbnVsbCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX1N0cmluZyAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX09iamVjdCAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2RvdWJsZSAgCSAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2ludCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfbnVsbCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZCAgIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9sb25nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3Nob3J0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfU3RyaW5nICAJIDogcmV0dXJuIHRoaXMgOyAgIAotLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2Zsb2F0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfYm9vbGVhbiAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfbnVsbCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3VuZGVmaW5lZCAgIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2J5dGUgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2xvbmcgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3Nob3J0IAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX3ZvaWQgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX1N0cmluZyAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX09iamVjdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2RvdWJsZSAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfT2JqZWN0PDw0KStUX2Zsb2F0ICAJCTogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfYm9vbGVhbiAJCTogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfY2hhciAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfaW50ICAJCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9udWxsICAJCSAJOiByZXR1cm4gdGhpcyA7ICAgCi0KLS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF91bmRlZmluZWQgIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9ieXRlICAJCSAJOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChkb3VibGUpdGhpcy5ieXRlVmFsdWUoKSkgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9sb25nICAJCSAJOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChkb3VibGUpdGhpcy5sb25nVmFsdWUoKSkgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9zaG9ydCAgCQk6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGRvdWJsZSl0aGlzLnNob3J0VmFsdWUoKSkgOyAgIAotLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX3ZvaWQgIAkJIAk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX1N0cmluZyAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX09iamVjdCAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9kb3VibGUgIAkJOiByZXR1cm4gdGhpcyA7ICAgCi0JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2Zsb2F0ICAJCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuZmxvYXRWYWx1ZSgpKSA7ICAgCi0vLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfYm9vbGVhbiAgCQk6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9jaGFyICAJCSAJOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChkb3VibGUpdGhpcy5jaGFyVmFsdWUoKSkgOyAgIAotCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9pbnQgIAkJCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuaW50VmFsdWUoKSk7ICAKLS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9udWxsICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmJ5dGVWYWx1ZSgpKSA7ICAgCi0JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmxvbmdWYWx1ZSgpKSAgOyAgIAotCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGZsb2F0KXRoaXMuc2hvcnRWYWx1ZSgpKSAgOyAgIAotLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX1N0cmluZyAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5kb3VibGVWYWx1ZSgpKSAgOyAgIAotCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiB0aGlzIDsgICAKLS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5jaGFyVmFsdWUoKSkgIDsgICAKLQkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5pbnRWYWx1ZSgpKSAgOyAgIAotLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfbnVsbCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQotLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF91bmRlZmluZWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2J5dGUgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9sb25nICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1Rfc2hvcnQgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF92b2lkICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfU3RyaW5nICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfT2JqZWN0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfZG91YmxlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfZmxvYXQgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfYm9vbGVhbiAgCQkJIDogcmV0dXJuIHRoaXMgOyAgCi0vLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2NoYXIgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9pbnQgIAkJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfbnVsbCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JCi0vLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuYnl0ZVZhbHVlKCkpICA7ICAKLQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmxvbmdWYWx1ZSgpKSAgOyAgCi0JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuc2hvcnRWYWx1ZSgpKSA7ICAKLS8vCSAgICBjYXNlIChUX2NoYXI8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfU3RyaW5nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9PYmplY3QgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9kb3VibGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmRvdWJsZVZhbHVlKCkpIDsgICAKLQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5mbG9hdFZhbHVlKCkpIDsgICAKLS8vCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfYm9vbGVhbiAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gdGhpcyA7ICAKLQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2ludCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuaW50VmFsdWUoKSkgOyAgCi0vLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JCi0vLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0JICAgIGNhc2UgKFRfaW50PDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoaW50KXRoaXMuYnl0ZVZhbHVlKCkpIDsgIAotCSAgICBjYXNlIChUX2ludDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmxvbmdWYWx1ZSgpKSAgOyAgCi0JICAgIGNhc2UgKFRfaW50PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLnNob3J0VmFsdWUoKSkgIDsgIAotLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfU3RyaW5nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfZG91YmxlICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmRvdWJsZVZhbHVlKCkpICA7ICAgCi0JICAgIGNhc2UgKFRfaW50PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmZsb2F0VmFsdWUoKSkgIDsgICAKLS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF9ib29sZWFuICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5jaGFyVmFsdWUoKSkgOyAgCi0JICAgIGNhc2UgKFRfaW50PDw0KStUX2ludCAgCQkgCSA6IHJldHVybiB0aGlzIDsgIAotLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX251bGwgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0KLS8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfdW5kZWZpbmVkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9ieXRlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfbG9uZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX3Nob3J0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX251bGw8PDQpK1Rfdm9pZCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudCA7ICAgCi0vLwkgICAgY2FzZSAoVF9udWxsPDw0KStUX1N0cmluZyAgCQkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9PYmplY3QgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9kb3VibGUgIAkJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfZmxvYXQgIAkJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9ib29sZWFuICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQgOyAgIAotLy8JICAgIGNhc2UgKFRfbnVsbDw8NCkrVF9jaGFyICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLS8vCSAgICBjYXNlIChUX251bGw8PDQpK1RfaW50ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50IDsgICAKLQkgICAgY2FzZSAoVF9udWxsPDw0KStUX251bGwgIAkJCSA6IHJldHVybiB0aGlzIDsKKwkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImJvb2xlYW4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAorCXB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKKworCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiYnl0ZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJcHVibGljIGZpbmFsIENvbnN0YW50IGNhc3RUbyhpbnQgY29udmVyc2lvblRvVGFyZ2V0VHlwZSl7CisJCS8vdGhlIGNhc3QgaXMgYW4gaW50IG9mIHRoZSBmb3JtCisJCS8vIChjYXN0SWQ8PDQpK3R5cGVJZCAoaW4gb3JkZXIgdG8gZm9sbG93IHRoZQorCQkvL3VzZXIgd3JpdHRlbiBzdHlsZSAoY2FzdClleHByZXNzaW9uIC4uLi4KIAkKLQotCXJldHVybiBOb3RBQ29uc3RhbnQgOwotfQotcHVibGljIGNoYXIgY2hhclZhbHVlKCkgewotCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJjaGFyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGNzdCwgaW50IGlkLCBpbnQgb3BlcmF0b3IpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKLQkvL3RoZSByZXN1bHQgc2hvdWxkIGJlIGF2YWlsYmFsZSB3aXRoIG5vdCBydW50aW1lIGVycm9yCi0KLQlzd2l0Y2ggKG9wZXJhdG9yKSB7Ci0JCWNhc2UgTk9UCTogCQotCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSghY3N0LmJvb2xlYW5WYWx1ZSgpKTsKLQkJY2FzZSBQTFVTCToJcmV0dXJuIGNzdCA7IAotCQljYXNlIE1JTlVTCToJLy90aGUgdHdvIHNwZWNpYWwgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMIGFuZCAtMjE0NzQ4MzY0OCBhcmUgaW5saW5lZCBhdCBwYXJzZVRpbWUKLQkJCQkJCXN3aXRjaCAoaWQpewotCQkJCQkJCWNhc2UgVF9mbG9hdCAgOglmbG9hdCBmIDsKLQkJCQkJCQkJCQkJaWYgKCAoZj0gY3N0LmZsb2F0VmFsdWUoKSkgPT0gMC4wZikKLQkJCQkJCQkJCQkJeyAvL3Bvc2l0aXZlIGFuZCBuZWdhdGl2ZSAwLi4uLgotCQkJCQkJCQkJCQkJaWYgKEZsb2F0LmZsb2F0VG9JbnRCaXRzKGYpID09IDApCi0JCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgtMC4wZik7Ci0JCQkJCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgwLjBmKTt9Ci0JCQkJCQkJCQkJCWJyZWFrOyAvL2RlZmF1bHQgY2FzZQotCQkJCQkJCWNhc2UgVF9kb3VibGUgOiBkb3VibGUgZCA7Ci0JCQkJCQkJCQkJCWlmICggKGQ9IGNzdC5kb3VibGVWYWx1ZSgpKSA9PSAwLjBkKQotCQkJCQkJCQkJCQl7IC8vcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIDAuLi4uCi0JCQkJCQkJCQkJCQlpZiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZCkgPT0gMCkKLQkJCQkJCQkJCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKC0wLjBkKTsKLQkJCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKDAuMGQpO30KLQkJCQkJCQkJCQkJYnJlYWs7IC8vZGVmYXVsdCBjYXNlCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTUlOVVMoWmVybyxUX2ludCxvcGVyYXRvcixjc3QsaWQpOwotCQljYXNlIFRXSURETEU6CQotCQkJc3dpdGNoIChpZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3Quc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJZGVmYXVsdCA6IHJldHVybiBOb3RBQ29uc3RhbnQ7fSAvL3Nob3VsZCBub3Qgb2NjdXIuLi4uLihjb25zZXJ2YXRpdmUgY29kZSkKLQkJZGVmYXVsdCA6IHJldHVybiBOb3RBQ29uc3RhbnQgO319IC8vc2hvdWxkIG5vdCBvY2N1ci4uLi4oY29uc2VydmF0aXZlIGNvZGUpCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIFNvIChleGNlcHQgZm9yIGRpdmlkZSBieSB6ZXJvKQotCS8vdGhlIHJlc3VsdCBzaG91bGQgYmUgYXZhaWxiYWxlIHdpdGggbm90IHJ1bnRpbWUgZXJyb3IKLQotCXN3aXRjaCAob3BlcmF0b3IpIHsKLQkJY2FzZSBBTkQJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORAkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKLQkJY2FzZSBBTkRfQU5ECTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORF9BTkQJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKLQkJY2FzZSBESVZJREUgCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkRJVklERQkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKLQkJY2FzZSBHUkVBVEVSCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVIJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpIDsKLQkJY2FzZSBHUkVBVEVSX0VRVUFMCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVJfRVFVQUwobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIExFRlRfU0hJRlQJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVGVF9TSElGVAkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIExFU1MJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1MJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7Ci0JCWNhc2UgTEVTU19FUVVBTAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTX0VRVUFMCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7Ci0JCWNhc2UgTUlOVVMJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1JTlVTCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIE1VTFRJUExZCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1VTFRJUExZCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7Ci0JCWNhc2UgT1IJCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUgkJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7Ci0JCWNhc2UgT1JfT1IJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk9SX09SCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIFBMVVMJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblBMVVMJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKSA7Ci0JCWNhc2UgUkVNQUlOREVSCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJFTUFJTkRFUgkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIFJJR0hUX1NISUZUOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uUklHSFRfU0hJRlQobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIFVOU0lHTkVEX1JJR0hUX1NISUZUOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uVU5TSUdORURfUklHSFRfU0hJRlQobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCQljYXNlIFhPUgkJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uWE9SCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCkgOwotCi0JCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50IDt9fSAvL3Nob3VsZCBub3Qgb2NjdXJzLi4uLihjb25zZXJ2YXRpdmUgY29kZSkKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uQU5EKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCisJCWlmICh0aGlzID09IE5vdEFDb25zdGFudCkgcmV0dXJuIE5vdEFDb25zdGFudDsKKwkJc3dpdGNoKGNvbnZlcnNpb25Ub1RhcmdldFR5cGUpeworCQkJY2FzZSBUX3VuZGVmaW5lZCA6IAkJCQkJCXJldHVybiB0aGlzOworCS8vICAgICAgICAgICAgVEFSR0VUIFRZUEUgIDwtIEZST00gVFlQRQorCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3VuZGVmaW5lZDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX1N0cmluZyAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdW5kZWZpbmVkPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF91bmRlZmluZWQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCQorCS8vCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9ieXRlICAJCSA6IHJldHVybiB0aGlzOyAgCisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMubG9uZ1ZhbHVlKCkpOyAKKwkJICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuc2hvcnRWYWx1ZSgpKTsgICAgCisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9TdHJpbmcgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfYnl0ZTw8NCkrVF9PYmplY3QgIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfZG91YmxlICAJIAkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChieXRlKXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgIAorCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5mbG9hdFZhbHVlKCkpOyAgICAKKwkvLwkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9ieXRlPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoYnl0ZSl0aGlzLmNoYXJWYWx1ZSgpKTsgICAgCisJCSAgICBjYXNlIChUX2J5dGU8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGJ5dGUpdGhpcy5pbnRWYWx1ZSgpKTsgICAgCiAJCi0Jc3dpdGNoIChsZWZ0SWQpewotCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgJiByaWdodC5ib29sZWFuVmFsdWUoKSkgOwotCQljYXNlIFRfY2hhciA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhayA7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2ludCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAmIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KKwkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuYnl0ZVZhbHVlKCkpOyAKKwkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9sb25nICAJCSA6IHJldHVybiB0aGlzOyAKKwkJICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuc2hvcnRWYWx1ZSgpKTsgCisJLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfbG9uZzw8NCkrVF9TdHJpbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChsb25nKXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCisJCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmZsb2F0VmFsdWUoKSk7ICAKKwkvLwkgICAgY2FzZSAoVF9sb25nPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9sb25nPDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgobG9uZyl0aGlzLmNoYXJWYWx1ZSgpKTsgCisJCSAgICBjYXNlIChUX2xvbmc8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGxvbmcpdGhpcy5pbnRWYWx1ZSgpKTsgCisJCisJLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmJ5dGVWYWx1ZSgpKTsKKwkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChzaG9ydCl0aGlzLmxvbmdWYWx1ZSgpKTsgCisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiB0aGlzOyAgCisJLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX1N0cmluZyAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfT2JqZWN0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfZG91YmxlICAJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5kb3VibGVWYWx1ZSgpKTsgICAKKwkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5mbG9hdFZhbHVlKCkpOyAgIAorCS8vCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX3Nob3J0PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoc2hvcnQpdGhpcy5jaGFyVmFsdWUoKSk7ICAKKwkJICAgIGNhc2UgKFRfc2hvcnQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKHNob3J0KXRoaXMuaW50VmFsdWUoKSk7ICAKKwkKKwkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX3VuZGVmaW5lZCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9ieXRlICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfdm9pZDw8NCkrVF9zaG9ydCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfU3RyaW5nICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfT2JqZWN0ICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfZG91YmxlICAJIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF92b2lkPDw0KStUX2Jvb2xlYW4gIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX3ZvaWQ8PDQpK1RfaW50ICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3VuZGVmaW5lZCAgIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9sb25nICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX3Nob3J0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1Rfdm9pZCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfU3RyaW5nICAJIDogcmV0dXJuIHRoaXM7ICAgCisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfU3RyaW5nPDw0KStUX2Zsb2F0ICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfYm9vbGVhbiAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9TdHJpbmc8PDQpK1RfY2hhciAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX1N0cmluZzw8NCkrVF9pbnQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfdW5kZWZpbmVkICAgCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfYnl0ZSAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfbG9uZyAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1Rfc2hvcnQgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1Rfdm9pZCAgCQkgCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfU3RyaW5nICAJCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfT2JqZWN0ICAJCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfZG91YmxlICAJCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9PYmplY3Q8PDQpK1RfZmxvYXQgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9ib29sZWFuIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9jaGFyICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX09iamVjdDw8NCkrVF9pbnQgIAkJCTogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkKKwkvLwkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfdW5kZWZpbmVkICAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfYnl0ZSAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuYnl0ZVZhbHVlKCkpOyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfbG9uZyAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMubG9uZ1ZhbHVlKCkpOyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1Rfc2hvcnQgIAkJOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChkb3VibGUpdGhpcy5zaG9ydFZhbHVlKCkpOyAgIAorCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF92b2lkICAJCSAJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9TdHJpbmcgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9PYmplY3QgIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfZG91YmxlICAJCTogcmV0dXJuIHRoaXM7ICAgCisJCSAgICBjYXNlIChUX2RvdWJsZTw8NCkrVF9mbG9hdCAgCQk6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGRvdWJsZSl0aGlzLmZsb2F0VmFsdWUoKSk7ICAgCisJLy8JICAgIGNhc2UgKFRfZG91YmxlPDw0KStUX2Jvb2xlYW4gIAkJOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfY2hhciAgCQkgCTogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZG91YmxlKXRoaXMuY2hhclZhbHVlKCkpOyAgIAorCQkgICAgY2FzZSAoVF9kb3VibGU8PDQpK1RfaW50ICAJCQk6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGRvdWJsZSl0aGlzLmludFZhbHVlKCkpOyAgCisJCisJLy8JICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfYnl0ZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmJ5dGVWYWx1ZSgpKTsgICAKKwkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1RfbG9uZyAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmxvbmdWYWx1ZSgpKTsgICAKKwkJICAgIGNhc2UgKFRfZmxvYXQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5zaG9ydFZhbHVlKCkpOyAgIAorCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX3ZvaWQgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9mbG9hdDw8NCkrVF9TdHJpbmcgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX09iamVjdCAgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2RvdWJsZSAgCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGZsb2F0KXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiB0aGlzOyAgIAorCS8vCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2Jvb2xlYW4gCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2NoYXIgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoZmxvYXQpdGhpcy5jaGFyVmFsdWUoKSk7ICAgCisJCSAgICBjYXNlIChUX2Zsb2F0PDw0KStUX2ludCAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChmbG9hdCl0aGlzLmludFZhbHVlKCkpOyAgIAorCQorCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfdW5kZWZpbmVkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9ieXRlICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfbG9uZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX3Nob3J0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1Rfdm9pZCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX1N0cmluZyAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX09iamVjdCAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2RvdWJsZSAgCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Zsb2F0ICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9ib29sZWFuPDw0KStUX2Jvb2xlYW4gIAkJCSA6IHJldHVybiB0aGlzOyAgCisJLy8JICAgIGNhc2UgKFRfYm9vbGVhbjw8NCkrVF9jaGFyICAJCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2Jvb2xlYW48PDQpK1RfaW50ICAJCQkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJCisJLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF91bmRlZmluZWQgIAkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmJ5dGVWYWx1ZSgpKTsgIAorCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2xvbmcgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmxvbmdWYWx1ZSgpKTsgIAorCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX3Nob3J0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5zaG9ydFZhbHVlKCkpOyAgCisJLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9TdHJpbmcgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkvLwkgICAgY2FzZSAoVF9jaGFyPDw0KStUX09iamVjdCAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCQkgICAgY2FzZSAoVF9jaGFyPDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChjaGFyKXRoaXMuZG91YmxlVmFsdWUoKSk7ICAgCisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfZmxvYXQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoY2hhcil0aGlzLmZsb2F0VmFsdWUoKSk7ICAgCisJLy8JICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9ib29sZWFuICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfY2hhcjw8NCkrVF9jaGFyICAJCSA6IHJldHVybiB0aGlzOyAgCisJCSAgICBjYXNlIChUX2NoYXI8PDQpK1RfaW50ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGNoYXIpdGhpcy5pbnRWYWx1ZSgpKTsgIAorCQkKKwkvLwkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfdW5kZWZpbmVkICAJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfaW50PDw0KStUX2J5dGUgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoaW50KXRoaXMuYnl0ZVZhbHVlKCkpOyAgCisJCSAgICBjYXNlIChUX2ludDw8NCkrVF9sb25nICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmxvbmdWYWx1ZSgpKTsgIAorCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1Rfc2hvcnQgIAkJIDogcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoaW50KXRoaXMuc2hvcnRWYWx1ZSgpKTsgIAorCS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF92b2lkICAJCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX1N0cmluZyAgCQkgOiByZXR1cm4gTm90QUNvbnN0YW50OyAgIAorCS8vCSAgICBjYXNlIChUX2ludDw8NCkrVF9PYmplY3QgIAkJIDogcmV0dXJuIE5vdEFDb25zdGFudDsgICAKKwkJICAgIGNhc2UgKFRfaW50PDw0KStUX2RvdWJsZSAgCQkgOiByZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKChpbnQpdGhpcy5kb3VibGVWYWx1ZSgpKTsgICAKKwkJICAgIGNhc2UgKFRfaW50PDw0KStUX2Zsb2F0ICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmZsb2F0VmFsdWUoKSk7ICAgCisJLy8JICAgIGNhc2UgKFRfaW50PDw0KStUX2Jvb2xlYW4gIAkgCSA6IHJldHVybiBOb3RBQ29uc3RhbnQ7ICAgCisJCSAgICBjYXNlIChUX2ludDw8NCkrVF9jaGFyICAJCSA6IHJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKGludCl0aGlzLmNoYXJWYWx1ZSgpKTsgIAorCQkgICAgY2FzZSAoVF9pbnQ8PDQpK1RfaW50ICAJCSAJIDogcmV0dXJuIHRoaXM7ICAKKwkKIAkJfQogCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0KKwkKKwlwdWJsaWMgY2hhciBjaGFyVmFsdWUoKSB7CisJCQorCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiY2hhciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uKENvbnN0YW50IGNzdCwgaW50IGlkLCBpbnQgb3BlcmF0b3IpIHsKIAotCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUgCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkFORF9BTkQoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKLQotCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSAmJiByaWdodC5ib29sZWFuVmFsdWUoKSkgO30KLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRElWSURFKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCi0JLy8gdGhlIC8wIG11c3QgYmUgaGFuZGxlZCBvdXRzaWRlIHRoaXMgbWV0aG9kIChlcnJvciByZXBvcnRpbmcpCi0KLQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCWNhc2UgVF9jaGFyIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZmxvYXQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZG91YmxlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfaW50IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KKwkJc3dpdGNoIChvcGVyYXRvcikgeworCQkJY2FzZSBOT1QJOiAJCisJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSghY3N0LmJvb2xlYW5WYWx1ZSgpKTsKKwkJCWNhc2UgUExVUwk6CXJldHVybiBjc3Q7IAorCQkJY2FzZSBNSU5VUwk6CS8vdGhlIHR3byBzcGVjaWFsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCBhbmQgLTIxNDc0ODM2NDggYXJlIGlubGluZWQgYXQgcGFyc2VUaW1lCisJCQkJCQkJc3dpdGNoIChpZCl7CisJCQkJCQkJCWNhc2UgVF9mbG9hdCAgOglmbG9hdCBmOworCQkJCQkJCQkJCQkJaWYgKCAoZj0gY3N0LmZsb2F0VmFsdWUoKSkgPT0gMC4wZikKKwkJCQkJCQkJCQkJCXsgLy9wb3NpdGl2ZSBhbmQgbmVnYXRpdmUgMC4uLi4KKwkJCQkJCQkJCQkJCQlpZiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoZikgPT0gMCkKKwkJCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgtMC4wZik7CisJCQkJCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKDAuMGYpO30KKwkJCQkJCQkJCQkJCWJyZWFrOyAvL2RlZmF1bHQgY2FzZQorCQkJCQkJCQljYXNlIFRfZG91YmxlIDogZG91YmxlIGQ7CisJCQkJCQkJCQkJCQlpZiAoIChkPSBjc3QuZG91YmxlVmFsdWUoKSkgPT0gMC4wZCkKKwkJCQkJCQkJCQkJCXsgLy9wb3NpdGl2ZSBhbmQgbmVnYXRpdmUgMC4uLi4KKwkJCQkJCQkJCQkJCQlpZiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZCkgPT0gMCkKKwkJCQkJCQkJCQkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgtMC4wZCk7CisJCQkJCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKDAuMGQpO30KKwkJCQkJCQkJCQkJCWJyZWFrOyAvL2RlZmF1bHQgY2FzZQorCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTUlOVVMoWmVybyxUX2ludCxvcGVyYXRvcixjc3QsaWQpOworCQkJY2FzZSBUV0lERExFOgkKKwkJCQlzd2l0Y2ggKGlkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3Quc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUofiBjc3QuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKH4gY3N0LmxvbmdWYWx1ZSgpKTsKKwkJCQkJZGVmYXVsdCA6IHJldHVybiBOb3RBQ29uc3RhbnQ7CisJCQkJfSAKKwkJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50OwogCQl9Ci0JCisJfSAKIAotCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRVFVQUxfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCisJCXN3aXRjaCAob3BlcmF0b3IpIHsKKwkJCWNhc2UgQU5ECQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkQJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKTsKKwkJCWNhc2UgQU5EX0FORAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkRfQU5ECShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKTsKKwkJCWNhc2UgRElWSURFIAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25ESVZJREUJCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKTsKKwkJCWNhc2UgR1JFQVRFUgk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25HUkVBVEVSCShsZWZ0LGxlZnRJZCxvcGVyYXRvcixyaWdodCxyaWdodElkKTsKKwkJCWNhc2UgR1JFQVRFUl9FUVVBTAk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25HUkVBVEVSX0VRVUFMKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBMRUZUX1NISUZUCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFRlRfU0hJRlQJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBMRVNTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCk7CisJCQljYXNlIExFU1NfRVFVQUwJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVTU19FUVVBTAkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCk7CisJCQljYXNlIE1JTlVTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NSU5VUwkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBNVUxUSVBMWQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NVUxUSVBMWQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCk7CisJCQljYXNlIE9SCQkJOiByZXR1cm4gY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uT1IJCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCk7CisJCQljYXNlIE9SX09SCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUl9PUgkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBQTFVTCQk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25QTFVTCQkobGVmdCxsZWZ0SWQsb3BlcmF0b3IscmlnaHQscmlnaHRJZCk7CisJCQljYXNlIFJFTUFJTkRFUgk6IHJldHVybiBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SRU1BSU5ERVIJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBSSUdIVF9TSElGVDogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJJR0hUX1NISUZUKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVDogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblVOU0lHTkVEX1JJR0hUX1NISUZUKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOworCQkJY2FzZSBYT1IJCTogcmV0dXJuIGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblhPUgkJKGxlZnQsbGVmdElkLG9wZXJhdG9yLHJpZ2h0LHJpZ2h0SWQpOwogCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2Jvb2xlYW4gOgotCQkJaWYgKHJpZ2h0SWQgPT0gVF9ib29sZWFuKSB7Ci0JCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpID09IHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKSA7Ci0JCQl9Ci0JCWJyZWFrIDsKLQkJY2FzZSBUX2NoYXIgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZmxvYXQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2J5dGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwkJCQotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2ludCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQotCQljYXNlIFRfbG9uZyA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9TdHJpbmcgOgotCQkJaWYgKHJpZ2h0SWQgPT0gVF9TdHJpbmcpIHsKLQkJCQkvL1N0cmluZyBhcmUgaW50ZXJtZWQgaW4gdGggY29tcGlsZXI9PT50aHVzIGlmIHR3byBzdHJpbmcgY29uc3RhbnQKLQkJCQkvL2dldCB0byBiZSBjb21wYXJlZCwgaXQgaXMgYW4gZXF1YWwgb24gdGhlIHZhbGUgd2hpY2ggaXMgZG9uZQotCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUoKChTdHJpbmdDb25zdGFudClsZWZ0KS5jb21waWxlVGltZUVxdWFsKChTdHJpbmdDb25zdGFudClyaWdodCkpIDsKLQkJCX0KLQkJYnJlYWs7CQotCQljYXNlIFRfbnVsbCA6Ci0JCQlpZiAocmlnaHRJZCA9PSBUX1N0cmluZykgeyAKLQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJpZ2h0SWQgPT0gVF9udWxsKSB7IAotCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKHRydWUpIDsKKwkJCWRlZmF1bHQgOiByZXR1cm4gTm90QUNvbnN0YW50OworCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uQU5EKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCQorCQlzd2l0Y2ggKGxlZnRJZCl7CisJCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgJiByaWdodC5ib29sZWFuVmFsdWUoKSk7CisJCQljYXNlIFRfY2hhciA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICYgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICYgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAmIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICYgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICYgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICYgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKIAkJCQl9CiAJCQl9Ci0JCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfSAKKwkJCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25BTkRfQU5EKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CiAJCi0JcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShmYWxzZSkgIDt9Ci1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVIoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKLQkKLQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCWNhc2UgVF9jaGFyIDogCi0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2Zsb2F0IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2RvdWJsZSA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfYnl0ZSA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQkKLQkJY2FzZSBUX3Nob3J0IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2ludCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwkJCi0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCQkKLQkJfQotCQotCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uR1JFQVRFUl9FUVVBTChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2NoYXIgOiAKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2Zsb2F0IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9kb3VibGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQkKLQkJY2FzZSBUX3Nob3J0IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7CQkKLQkJY2FzZSBUX2xvbmcgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCQkKLQkJfQotCQotCXJldHVybiBOb3RBQ29uc3RhbnQgO30gIC8vc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVGVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2NoYXIgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhayA7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PCByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5sb25nVmFsdWUoKSkgO30KLQotCQl9Ci0JCi0KLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvLyBzaG91bGQgbm90IGdldCBoZXJlIAotcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25MRVNTKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCi0JCi0Jc3dpdGNoIChsZWZ0SWQpewotCQljYXNlIFRfY2hhciA6IAotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9mbG9hdCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9kb3VibGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2J5dGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7CQkJCi0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQotCQljYXNlIFRfbG9uZyA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQkJCi0JCX0KLQkKLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1NfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKLQkKLQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCWNhc2UgVF9jaGFyIDogCi0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9mbG9hdCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZG91YmxlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfYnl0ZSA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7CQkJCi0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfaW50IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwkJCi0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQkJCi0JCX0KLQkKLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1JTlVTKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCi0JCi0Jc3dpdGNoIChsZWZ0SWQpewotCQljYXNlIFRfY2hhciA6IAotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9mbG9hdCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9kb3VibGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2J5dGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7CQkJCi0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQotCQljYXNlIFRfbG9uZyA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQkJCi0JCX0KLQkKLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1VTFRJUExZKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCi0KLQlzd2l0Y2ggKGxlZnRJZCl7Ci0JCWNhc2UgVF9jaGFyIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZmxvYXQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZG91YmxlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfaW50IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KLQkJfQotCQotCi0JcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy9zaG91bGQgbm90IGdldCBoZXJlIAotcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25PUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2Jvb2xlYW4gOgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpIHwgcmlnaHQuYm9vbGVhblZhbHVlKCkpIDsKLQkJY2FzZSBUX2NoYXIgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSB8IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSB8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgfCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgfCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgfCByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2ludCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgfCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIHwgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KLQkJfQotCQotCi0JcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy8gc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uT1JfT1IoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKLQkvL3RoaXMgbWV0aG9kICBhc3N1bWVzIHRoYXQgdGhlIFRDIGhhcyBiZWVuIGRvbmUgLiAKLQotCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSB8fCByaWdodC5ib29sZWFuVmFsdWUoKSkgO30KLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uUExVUyhDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX09iamVjdCA6Ci0JCQlpZiAocmlnaHRJZCA9PSBUX1N0cmluZykgewotCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7Ci0JCQl9Ci0JCWNhc2UgVF9ib29sZWFuIDoKLQkJCWlmIChyaWdodElkID09IFRfU3RyaW5nKSB7Ci0JCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKLQkJCX0KLQkJYnJlYWsgOwotCQljYXNlIFRfY2hhciA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2Zsb2F0IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7IH0KLQkJYnJlYWs7Ci0JCWNhc2UgVF9kb3VibGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2J5dGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9TdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOyB9Ci0KLQkJYnJlYWs7CQkJCi0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9TdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCQotCQljYXNlIFRfbG9uZyA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7IH0KLQkJYnJlYWs7Ci0JCWNhc2UgVF9TdHJpbmcgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKLQkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsgCi0JCQkJY2FzZSBUX251bGw6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOyAKLQkJCQljYXNlIFRfYm9vbGVhbjoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7fQotCQlicmVhazsJCi0JCWNhc2UgVF9udWxsIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKSA7IAotCQkJCWNhc2UgVF9udWxsOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpIDsgfQotCQkJCi0JCX0KLQkKLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvL3Nob3VsZCBub3QgZ2V0IGhlcmUgCi1wdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJFTUFJTkRFUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2NoYXIgOiAKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZmxvYXQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfZG91YmxlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwkJCQotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfaW50IDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuZG91YmxlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7CQkKLQkJY2FzZSBUX2xvbmcgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5mbG9hdFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJCQotCQl9Ci0JCi0JcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy9zaG91bGQgbm90IGdldCBoZXJlIAotcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SSUdIVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2NoYXIgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhayA7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9zaG9ydCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5sb25nVmFsdWUoKSkgO30KLQotCQl9Ci0JCi0KLQlyZXR1cm4gTm90QUNvbnN0YW50IDt9ICAvLyBzaG91bGQgbm90IGdldCBoZXJlIAotcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25VTlNJR05FRF9SSUdIVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgewotCS8vdGhpcyBtZXRob2QgIGFzc3VtZXMgdGhhdCB0aGUgVEMgaGFzIGJlZW4gZG9uZSAuIAotCQotCXN3aXRjaCAobGVmdElkKXsKLQkJY2FzZSBUX2NoYXIgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrIDsKLQkJY2FzZSBUX2J5dGUgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LmNoYXJWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQuaW50VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9pbnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2xvbmcgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KLQkJfQotCQotCi0JcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy8gc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uWE9SKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7Ci0JLy90aGlzIG1ldGhvZCAgYXNzdW1lcyB0aGF0IHRoZSBUQyBoYXMgYmVlbiBkb25lIC4gCi0JCi0Jc3dpdGNoIChsZWZ0SWQpewotCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgXiByaWdodC5ib29sZWFuVmFsdWUoKSkgOwotCQljYXNlIFRfY2hhciA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpIDsKLQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSBeIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhayA7Ci0JCWNhc2UgVF9ieXRlIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0JCWJyZWFrOwotCQljYXNlIFRfc2hvcnQgOgotCQkJc3dpdGNoIChyaWdodElkKXsKLQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQuYnl0ZVZhbHVlKCkpIDsKLQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5zaG9ydFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKSA7fQotCQlicmVhazsKLQkJY2FzZSBUX2ludCA6Ci0JCQlzd2l0Y2ggKHJpZ2h0SWQpewotCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmJ5dGVWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LnNob3J0VmFsdWUoKSkgOwotCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSkgO30KLQkJYnJlYWs7Ci0JCWNhc2UgVF9sb25nIDoKLQkJCXN3aXRjaCAocmlnaHRJZCl7Ci0JCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSkgOwotCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKSA7Ci0JCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpIDsKLQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpIDt9Ci0KLQkJfQotCQotCi0JcmV0dXJuIE5vdEFDb25zdGFudCA7fSAgLy8gc2hvdWxkIG5vdCBnZXQgaGVyZSAKLXB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0JdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImRvdWJsZSIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZmxvYXQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotfQotcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoYnl0ZSB2YWx1ZSkgewotCXJldHVybiBuZXcgQnl0ZUNvbnN0YW50KHZhbHVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGNoYXIgdmFsdWUpIHsKLQlyZXR1cm4gbmV3IENoYXJDb25zdGFudCh2YWx1ZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShkb3VibGUgdmFsdWUpIHsKLQlyZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHZhbHVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGZsb2F0IHZhbHVlKSB7Ci0JcmV0dXJuIG5ldyBGbG9hdENvbnN0YW50KHZhbHVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGludCB2YWx1ZSkgewotCXJldHVybiBuZXcgSW50Q29uc3RhbnQodmFsdWUpOwotfQotcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUobG9uZyB2YWx1ZSkgewotCXJldHVybiBuZXcgTG9uZ0NvbnN0YW50KHZhbHVlKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotCWlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gTnVsbENvbnN0YW50LkRlZmF1bHQ7Ci0JcmV0dXJuIG5ldyBTdHJpbmdDb25zdGFudCh2YWx1ZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShzaG9ydCB2YWx1ZSkgewotCXJldHVybiBuZXcgU2hvcnRDb25zdGFudCh2YWx1ZSk7Ci19Ci1wdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JcmV0dXJuIG5ldyBCb29sZWFuQ29uc3RhbnQodmFsdWUpOwotfQotcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiaW50IikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLX0KLXB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwibG9uZyIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8iLHR5cGVOYW1lKCksInNob3J0IikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLX0KLS8qKiBEZXByZWNhdGVkCi0qLwotcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKLQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8iLHR5cGVOYW1lKCksIlN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0KLQlpZiAodGhpcyA9PSBOb3RBQ29uc3RhbnQpIHJldHVybiAiKENvbnN0YW50KSBOb3RBQ29uc3RhbnQiIDsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBzdXBlci50b1N0cmluZygpOyB9Ci1wdWJsaWMgYWJzdHJhY3QgaW50IHR5cGVJRCgpOwotcHVibGljIFN0cmluZyB0eXBlTmFtZSgpIHsKLQlzd2l0Y2ggKHR5cGVJRCgpKSB7Ci0JCWNhc2UgVF9pbnQgOiByZXR1cm4gImludCI7IC8vJE5PTi1OTFMtMSQKLQkJY2FzZSBUX2J5dGUgOiByZXR1cm4gImJ5dGUiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgVF9zaG9ydCA6IHJldHVybiAic2hvcnQiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgVF9jaGFyIDogcmV0dXJuICJjaGFyIjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIFRfZmxvYXQgOiByZXR1cm4gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIFRfZG91YmxlIDogcmV0dXJuICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JCWNhc2UgVF9ib29sZWFuIDogcmV0dXJuICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIFRfbG9uZyA6IHJldHVybiAibG9uZyI7Ly8kTk9OLU5MUy0xJAotCQljYXNlIFRfU3RyaW5nIDogcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQljYXNlIFRfbnVsbCA6IHJldHVybiAibnVsbCI7CSAvLyROT04tTkxTLTEkCi0JCWRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpICYmIHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKTsKIAl9Ci19CisJCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRElWSURFKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCS8vIGRpdmlzaW9uIGJ5IHplcm8gbXVzdCBiZSBoYW5kbGVkIG91dHNpZGUgdGhpcyBtZXRob2QgKGVycm9yIHJlcG9ydGluZykKKwkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC8gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9mbG9hdCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC8gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLyByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC8gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC8gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLyByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9pbnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC8gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC8gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAvIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCisJCQl9CisJCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0gCisJCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uRVFVQUxfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9ib29sZWFuIDoKKwkJCQlpZiAocmlnaHRJZCA9PSBUX2Jvb2xlYW4pIHsKKwkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJvb2xlYW5WYWx1ZSgpID09IHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9jaGFyIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpO30KKwkJCWJyZWFrOworCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA9PSByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPT0gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOwkJCQorCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA9PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPT0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9pbnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPT0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID09IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQorCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID09IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPT0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA9PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfU3RyaW5nIDoKKwkJCQlpZiAocmlnaHRJZCA9PSBUX1N0cmluZykgeworCQkJCQkvL1N0cmluZyBhcmUgaW50ZXJuZWQgaW4gdGggY29tcGlsZXI9PT50aHVzIGlmIHR3byBzdHJpbmcgY29uc3RhbnQKKwkJCQkJLy9nZXQgdG8gYmUgY29tcGFyZWQsIGl0IGlzIGFuIGVxdWFsIG9uIHRoZSB2YWxlIHdoaWNoIGlzIGRvbmUKKwkJCQkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZSgoKFN0cmluZ0NvbnN0YW50KWxlZnQpLmNvbXBpbGVUaW1lRXF1YWwoKFN0cmluZ0NvbnN0YW50KXJpZ2h0KSk7CisJCQkJfQorCQkJYnJlYWs7CQorCQkJY2FzZSBUX251bGwgOgorCQkJCWlmIChyaWdodElkID09IFRfU3RyaW5nKSB7IAorCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGZhbHNlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocmlnaHRJZCA9PSBUX251bGwpIHsgCisJCQkJCQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKHRydWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkKKwkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShmYWxzZSk7CisJfQorCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVIoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9jaGFyIDogCisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2RvdWJsZSA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOwkJCQorCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2ludCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQkKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJCQorCQkJfQorCQkKKwkJcmV0dXJuIE5vdEFDb25zdGFudDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkdSRUFURVJfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9jaGFyIDogCisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9mbG9hdCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID49IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQkKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID49IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID49IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQkKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PSByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID49IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj0gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfSAgCisJCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uTEVGVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCQkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2ludCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPDwgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkKKwkJCX0KKwkKKwkJcmV0dXJuIE5vdEFDb25zdGFudDsKKwl9IAorCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1MoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsgCisJCQorCQlzd2l0Y2ggKGxlZnRJZCl7CisJCQljYXNlIFRfY2hhciA6IAorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9mbG9hdCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQkKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9pbnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8IHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOwkJCisJCQljYXNlIFRfbG9uZyA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCQkKKwkJCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfQorCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbkxFU1NfRVFVQUwoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9jaGFyIDogCisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPD0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9mbG9hdCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPD0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIDw9IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQkKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPD0gcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIDw9IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw9IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIDw9IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA8PSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQkKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA8PSByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIDw9IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPD0gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfSAgCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25NSU5VUyhDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCQkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOiAKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQkJCisJCQljYXNlIFRfc2hvcnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAtIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgLSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIC0gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQorCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIC0gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQkJCisJCQl9CisJCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk1VTFRJUExZKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9jaGFyIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfc2hvcnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAqIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9sb25nIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAqIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJfQorCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk9SKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCQorCQlzd2l0Y2ggKGxlZnRJZCl7CisJCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgfCByaWdodC5ib29sZWFuVmFsdWUoKSk7CisJCQljYXNlIFRfY2hhciA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgfCByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgfCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSB8IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIHwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSB8IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIHwgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgfCByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgfCByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgfCByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIHwgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIHwgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgfCByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCisJCQl9CQorCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvbk9SX09SKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCisJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ib29sZWFuVmFsdWUoKSB8fCByaWdodC5ib29sZWFuVmFsdWUoKSk7CisJfQorCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblBMVVMoQ29uc3RhbnQgbGVmdCwgaW50IGxlZnRJZCwgaW50IG9wZXJhdG9yLCBDb25zdGFudCByaWdodCwgaW50IHJpZ2h0SWQpIHsKKwkJCisJCXN3aXRjaCAobGVmdElkKXsKKwkJCWNhc2UgVF9PYmplY3QgOgorCQkJCWlmIChyaWdodElkID09IFRfU3RyaW5nKSB7CisJCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJfQorCQkJY2FzZSBUX2Jvb2xlYW4gOgorCQkJCWlmIChyaWdodElkID09IFRfU3RyaW5nKSB7CisJCQkJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfY2hhciA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSArIHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2Zsb2F0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9kb3VibGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsgCisJCQkJfQorCQorCQkJYnJlYWs7CQkJCisJCQljYXNlIFRfc2hvcnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSArIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9TdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgKyByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICsgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQorCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICsgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSArIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX1N0cmluZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsgCisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfU3RyaW5nIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9mbG9hdDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfU3RyaW5nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOyAKKwkJCQkJY2FzZSBUX2Jvb2xlYW46CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQorCQkJY2FzZSBUX251bGwgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc3RyaW5nVmFsdWUoKSArIHJpZ2h0LnN0cmluZ1ZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnN0cmluZ1ZhbHVlKCkgKyByaWdodC5zdHJpbmdWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9TdHJpbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zdHJpbmdWYWx1ZSgpICsgcmlnaHQuc3RyaW5nVmFsdWUoKSk7IAorCQkJCX0KKwkJCQkKKwkJCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfQorCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50IGNvbXB1dGVDb25zdGFudE9wZXJhdGlvblJFTUFJTkRFUihDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCQkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOiAKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZmxvYXQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmZsb2F0VmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZmxvYXRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5mbG9hdFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfZG91YmxlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmRvdWJsZVZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuZG91YmxlVmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9ieXRlIDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5mbG9hdFZhbHVlKCkpOworCQkJCQljYXNlIFRfZG91YmxlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CQkJCisJCQljYXNlIFRfc2hvcnQgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2Zsb2F0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSAlIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgJSByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuZmxvYXRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2RvdWJsZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgJSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpICUgcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsJCQorCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfZmxvYXQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmZsb2F0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9kb3VibGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSAlIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQkJCisJCQl9CisJCQorCQlyZXR1cm4gTm90QUNvbnN0YW50OworCX0gCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25SSUdIVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCQkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX3Nob3J0IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+PiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2ludCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpID4+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkKKwkJCX0KKwkJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25zdGFudCBjb21wdXRlQ29uc3RhbnRPcGVyYXRpb25VTlNJR05FRF9SSUdIVF9TSElGVChDb25zdGFudCBsZWZ0LCBpbnQgbGVmdElkLCBpbnQgb3BlcmF0b3IsIENvbnN0YW50IHJpZ2h0LCBpbnQgcmlnaHRJZCkgeworCQkKKwkJc3dpdGNoIChsZWZ0SWQpeworCQkJY2FzZSBUX2NoYXIgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfYnl0ZSA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+Pj4gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+Pj4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSA+Pj4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgPj4+IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+PiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpID4+PiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSA+Pj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2ludCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuaW50VmFsdWUoKSA+Pj4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfbG9uZyA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LmNoYXJWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2J5dGU6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+Pj4gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+Pj4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSA+Pj4gcmlnaHQuaW50VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9sb25nOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgPj4+IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCisJCQl9CisJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnQgY29tcHV0ZUNvbnN0YW50T3BlcmF0aW9uWE9SKENvbnN0YW50IGxlZnQsIGludCBsZWZ0SWQsIGludCBvcGVyYXRvciwgQ29uc3RhbnQgcmlnaHQsIGludCByaWdodElkKSB7CisJCQorCQlzd2l0Y2ggKGxlZnRJZCl7CisJCQljYXNlIFRfYm9vbGVhbiA6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYm9vbGVhblZhbHVlKCkgXiByaWdodC5ib29sZWFuVmFsdWUoKSk7CisJCQljYXNlIFRfY2hhciA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgXiByaWdodC5jaGFyVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9ieXRlOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuY2hhclZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5jaGFyVmFsdWUoKSBeIHJpZ2h0LmludFZhbHVlKCkpOworCQkJCQljYXNlIFRfbG9uZzoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmNoYXJWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2J5dGUgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmJ5dGVWYWx1ZSgpIF4gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuYnl0ZVZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5ieXRlVmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQlicmVhazsKKwkJCWNhc2UgVF9zaG9ydCA6CisJCQkJc3dpdGNoIChyaWdodElkKXsKKwkJCQkJY2FzZSBUX2NoYXIgOglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LnNob3J0VmFsdWUoKSBeIHJpZ2h0LmJ5dGVWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX3Nob3J0OglyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQuc2hvcnRWYWx1ZSgpIF4gcmlnaHQuc2hvcnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2ludDoJCXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5zaG9ydFZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSk7CisJCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIFRfaW50IDoKKwkJCQlzd2l0Y2ggKHJpZ2h0SWQpeworCQkJCQljYXNlIFRfY2hhciA6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgXiByaWdodC5ieXRlVmFsdWUoKSk7CisJCQkJCWNhc2UgVF9zaG9ydDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgXiByaWdodC5zaG9ydFZhbHVlKCkpOworCQkJCQljYXNlIFRfaW50OgkJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmludFZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5pbnRWYWx1ZSgpIF4gcmlnaHQubG9uZ1ZhbHVlKCkpOworCQkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSBUX2xvbmcgOgorCQkJCXN3aXRjaCAocmlnaHRJZCl7CisJCQkJCWNhc2UgVF9jaGFyIDoJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIF4gcmlnaHQuY2hhclZhbHVlKCkpOworCQkJCQljYXNlIFRfYnl0ZToJcmV0dXJuIENvbnN0YW50LmZyb21WYWx1ZShsZWZ0LmxvbmdWYWx1ZSgpIF4gcmlnaHQuYnl0ZVZhbHVlKCkpOworCQkJCQljYXNlIFRfc2hvcnQ6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LnNob3J0VmFsdWUoKSk7CisJCQkJCWNhc2UgVF9pbnQ6CQlyZXR1cm4gQ29uc3RhbnQuZnJvbVZhbHVlKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKKwkJCQkJY2FzZSBUX2xvbmc6CXJldHVybiBDb25zdGFudC5mcm9tVmFsdWUobGVmdC5sb25nVmFsdWUoKSBeIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCisJCXJldHVybiBOb3RBQ29uc3RhbnQ7CisJfQorCisJcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKworCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZG91YmxlIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKworCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q2FzdGVkSW50byIsdHlwZU5hbWUoKSwiZmxvYXQiKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKGJ5dGUgdmFsdWUpIHsKKworCQlyZXR1cm4gbmV3IEJ5dGVDb25zdGFudCh2YWx1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoY2hhciB2YWx1ZSkgeworCisJCXJldHVybiBuZXcgQ2hhckNvbnN0YW50KHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShkb3VibGUgdmFsdWUpIHsKKworCQlyZXR1cm4gbmV3IERvdWJsZUNvbnN0YW50KHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShmbG9hdCB2YWx1ZSkgeworCisJCXJldHVybiBuZXcgRmxvYXRDb25zdGFudCh2YWx1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUoaW50IHZhbHVlKSB7CisKKwkJcmV0dXJuIG5ldyBJbnRDb25zdGFudCh2YWx1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBDb25zdGFudCBmcm9tVmFsdWUobG9uZyB2YWx1ZSkgeworCisJCXJldHVybiBuZXcgTG9uZ0NvbnN0YW50KHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCisJCXJldHVybiBuZXcgU3RyaW5nQ29uc3RhbnQodmFsdWUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29uc3RhbnQgZnJvbVZhbHVlKHNob3J0IHZhbHVlKSB7CisKKwkJcmV0dXJuIG5ldyBTaG9ydENvbnN0YW50KHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbnN0YW50IGZyb21WYWx1ZShib29sZWFuIHZhbHVlKSB7CisKKwkJcmV0dXJuIG5ldyBCb29sZWFuQ29uc3RhbnQodmFsdWUpOworCX0KKworCXB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisKKwkJdGhyb3cgbmV3IFNob3VsZE5vdEltcGxlbWVudChVdGlsLmJpbmQoImNvbnN0YW50LmNhbm5vdENhc3RlZEludG8iLHR5cGVOYW1lKCksImludCIpKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworCisJCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDYXN0ZWRJbnRvIix0eXBlTmFtZSgpLCJsb25nIikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKKworCQl0aHJvdyBuZXcgU2hvdWxkTm90SW1wbGVtZW50KFV0aWwuYmluZCgiY29uc3RhbnQuY2Fubm90Q29udmVydGVkVG8iLHR5cGVOYW1lKCksInNob3J0IikpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgeworCisJCXRocm93IG5ldyBTaG91bGROb3RJbXBsZW1lbnQoVXRpbC5iaW5kKCJjb25zdGFudC5jYW5ub3RDb252ZXJ0ZWRUbyIsdHlwZU5hbWUoKSwiU3RyaW5nIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisJCisJCWlmICh0aGlzID09IE5vdEFDb25zdGFudCkgcmV0dXJuICIoQ29uc3RhbnQpIE5vdEFDb25zdGFudCI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7IH0KKworCXB1YmxpYyBhYnN0cmFjdCBpbnQgdHlwZUlEKCk7CisKKwlwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkgeworCQlzd2l0Y2ggKHR5cGVJRCgpKSB7CisJCQljYXNlIFRfaW50IDogcmV0dXJuICJpbnQiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFRfYnl0ZSA6IHJldHVybiAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgVF9zaG9ydCA6IHJldHVybiAic2hvcnQiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFRfY2hhciA6IHJldHVybiAiY2hhciI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgVF9mbG9hdCA6IHJldHVybiAiZmxvYXQiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFRfZG91YmxlIDogcmV0dXJuICJkb3VibGUiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIFRfYm9vbGVhbiA6IHJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgVF9sb25nIDogcmV0dXJuICJsb25nIjsvLyROT04tTkxTLTEkCisJCQljYXNlIFRfU3RyaW5nIDogcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSBUX251bGwgOiByZXR1cm4gIm51bGwiOwkgLy8kTk9OLU5MUy0xJAorCQkJZGVmYXVsdDogcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRG91YmxlQ29uc3RhbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0RvdWJsZUNvbnN0YW50LmphdmEKaW5kZXggNjg0ZmU5Ni4uZDE4Y2E3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRG91YmxlQ29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9Eb3VibGVDb25zdGFudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CiAKIHB1YmxpYyBjbGFzcyBEb3VibGVDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKQEAgLTQ3LDggKzQ3LDcgQEAKIAl9CiAJCiAJcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpIHsKLQkJLy9zcGVjIDE1LjE3LjExCi0JCVN0cmluZyBzID0gbmV3IERvdWJsZSh2YWx1ZSkudG9TdHJpbmcoKTsKKwkJU3RyaW5nIHMgPSBEb3VibGUudG9TdHJpbmcodmFsdWUpOwogCQlpZiAocyA9PSBudWxsKQogCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAogCQllbHNlCkBAIC02NCw0ICs2Myw0IEBACiAJcHVibGljIGludCB0eXBlSUQoKSB7CiAJCXJldHVybiBUX2RvdWJsZTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRmxvYXRDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvRmxvYXRDb25zdGFudC5qYXZhCmluZGV4IDAzMTQ0N2QuLjAxM2FlOWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0Zsb2F0Q29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9GbG9hdENvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIEZsb2F0Q29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CkBAIC00Nyw4ICs0Nyw3IEBACiAJfQogCQogCXB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKSB7Ci0JCS8vc3BlYyAxNS4xNy4xMQotCQlTdHJpbmcgcyA9IG5ldyBGbG9hdCh2YWx1ZSkudG9TdHJpbmcoKTsKKwkJU3RyaW5nIHMgPSBGbG9hdC50b1N0cmluZyh2YWx1ZSk7CiAJCWlmIChzID09IG51bGwpCiAJCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCiAJCWVsc2UKQEAgLTYyLDQgKzYxLDQgQEAKIAlwdWJsaWMgaW50IHR5cGVJRCgpIHsKIAkJcmV0dXJuIFRfZmxvYXQ7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lUeXBlUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JVHlwZVJlcXVlc3Rvci5qYXZhCmluZGV4IGNlZDMxNTcuLmMyZDM0MzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0lUeXBlUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSVR5cGVSZXF1ZXN0b3IuamF2YQpAQCAtMSwyMCArMSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOwotDQorCiBwdWJsaWMgaW50ZXJmYWNlIElUeXBlUmVxdWVzdG9yIHsKIAkKIAkvKioKQEAgLTM0LDQgKzM0LDQgQEAKIAkgKiByZXF1ZXN0ZWQgdHlwZS4KIAkgKi8KIAl2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvSW50Q29uc3RhbnQuamF2YQppbmRleCAwZjFmODQ2Li40OGVjN2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9JbnRDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0ludENvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIEludENvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewpAQCAtNjIsNCArNjIsNCBAQAogCXB1YmxpYyBpbnQgdHlwZUlEKCkgewogCQlyZXR1cm4gVF9pbnQ7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL0xvbmdDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTG9uZ0NvbnN0YW50LmphdmEKaW5kZXggYmRlZGU0Ny4uNDQ2NTQ4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTG9uZ0NvbnN0YW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTG9uZ0NvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIExvbmdDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL051bGxDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTnVsbENvbnN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGY2YmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvTnVsbENvbnN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKLQotcHVibGljIGNsYXNzIE51bGxDb25zdGFudCBleHRlbmRzIENvbnN0YW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxDb25zdGFudCBEZWZhdWx0ID0gbmV3IE51bGxDb25zdGFudCgpOwotCi0JZmluYWwgc3RhdGljIFN0cmluZyBOdWxsU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcig0KS5hcHBlbmQoKFN0cmluZyludWxsKS50b1N0cmluZygpOwotcHJpdmF0ZSBOdWxsQ29uc3RhbnQoKSB7Ci19Ci1wdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgewotCQotCXJldHVybiBOdWxsU3RyaW5nOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCi0JcmV0dXJuICIobnVsbCkiICsgbnVsbCA7IH0gLy8kTk9OLU5MUy0xJAotcHVibGljIGludCB0eXBlSUQoKSB7Ci0JcmV0dXJuIFRfbnVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1JlZmVyZW5jZUNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1JlZmVyZW5jZUNvbnRleHQuamF2YQppbmRleCA4ZDhhZTFhLi5kNWQwNGEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9SZWZlcmVuY2VDb250ZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvUmVmZXJlbmNlQ29udGV4dC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGw7CiAvKgogICogSW1wbGVtZW50b3JzIGFyZSB2YWxpZCBjb21waWxhdGlvbiBjb250ZXh0cyBmcm9tIHdoaWNoIHdlIGNhbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU2hvcnRDb25zdGFudC5qYXZhCmluZGV4IGNlZjY5MDEuLmEyYzVmODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1Nob3J0Q29uc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TaG9ydENvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIFNob3J0Q29uc3RhbnQgZXh0ZW5kcyBDb25zdGFudCB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TdHJpbmdDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2ltcGwvU3RyaW5nQ29uc3RhbnQuamF2YQppbmRleCAzZWJjNjBhLi44NTBlYTY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvaW1wbC9TdHJpbmdDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9pbXBsL1N0cmluZ0NvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbDsKIAogcHVibGljIGNsYXNzIFN0cmluZ0NvbnN0YW50IGV4dGVuZHMgQ29uc3RhbnQgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9BcnJheUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQXJyYXlCaW5kaW5nLmphdmEKaW5kZXggMTVlMzZlZC4uOGUyOTNhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9BcnJheUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0FycmF5QmluZGluZy5qYXZhCkBAIC0xLDE3ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIEFycmF5QmluZGluZyBleHRlbmRzIFR5cGVCaW5kaW5nIHsKIAkvLyBjcmVhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGxlbmd0aCBmaWVsZApAQCAtNDcsNiArNDcsMTAgQEAKIAkJYnJhY2tldHMuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCiAJcmV0dXJuIGxlYWZDb21wb25lbnRUeXBlLmRlYnVnTmFtZSgpICsgYnJhY2tldHMudG9TdHJpbmcoKTsKIH0KK3B1YmxpYyBpbnQgZGltZW5zaW9ucygpIHsKKwlyZXR1cm4gdGhpcy5kaW1lbnNpb25zOworfQorCiAvKiBBbnN3ZXIgYW4gYXJyYXkgd2hvc2UgZGltZW5zaW9uIHNpemUgaXMgb25lIGxlc3MgdGhhbiB0aGUgcmVjZWl2ZXIuCiAqCiAqIFdoZW4gdGhlIHJlY2VpdmVyJ3MgZGltZW5zaW9uIHNpemUgaXMgb25lIHRoZW4gYW5zd2VyIHRoZSBsZWFmIGNvbXBvbmVudCB0eXBlLgpAQCAtNjQsNyArNjgsNyBAQAogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIHR5cGUgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBhcmd1bWVudCB0eXBlIChyaWdodCkKICovCiAKLWJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZyByaWdodCkgeworcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZyByaWdodCkgewogCWlmICh0aGlzID09IHJpZ2h0KQogCQlyZXR1cm4gdHJ1ZTsKIApAQCAtMTI5LDYgKzEzMywxNCBAQAogCX0KIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQobGVhZkNvbXBvbmVudFR5cGUucmVhZGFibGVOYW1lKCksIGJyYWNrZXRzKTsKIH0KK3B1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKXsKKwljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07CisJZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKKwkJYnJhY2tldHNbaV0gPSAnXSc7CisJCWJyYWNrZXRzW2kgLSAxXSA9ICdbJzsKKwl9CisJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGxlYWZDb21wb25lbnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCksIGJyYWNrZXRzKTsKK30KIHB1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKIAljaGFyW10gYnJhY2tldHMgPSBuZXcgY2hhcltkaW1lbnNpb25zICogMl07CiAJZm9yIChpbnQgaSA9IGRpbWVuc2lvbnMgKiAyIC0gMTsgaSA+PSAwOyBpIC09IDIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlQmluZGluZy5qYXZhCmluZGV4IGE5ZjZmNzguLjFjMmNkMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZUJpbmRpbmcuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBCYXNlVHlwZUJpbmRpbmcgZXh0ZW5kcyBUeXBlQmluZGluZyB7CkBAIC0zMSw3ICszMSw3IEBACiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgKHJpZ2h0KQogKi8KIAotZmluYWwgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CiAJaWYgKHRoaXMgPT0gcmlnaHQpCiAJCXJldHVybiB0cnVlOwogCWlmICghcmlnaHQuaXNCYXNlVHlwZSgpKQpAQCAtMTQ2LDYgKzE0Niw5IEBACiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKIAlyZXR1cm4gc2ltcGxlTmFtZTsKIH0KK3B1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKXsKKwlyZXR1cm4gc2ltcGxlTmFtZTsKK30KIHB1YmxpYyBjaGFyW10gc291cmNlTmFtZSgpIHsKIAlyZXR1cm4gc2ltcGxlTmFtZTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0Jhc2VUeXBlcy5qYXZhCmluZGV4IGU3MzRjNWIuLmY1NmQ2ODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmFzZVR5cGVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CYXNlVHlwZXMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIHB1YmxpYyBpbnRlcmZhY2UgQmFzZVR5cGVzIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluYXJ5VHlwZUJpbmRpbmcuamF2YQppbmRleCBkN2JhYjRmLi4wMzk1ZDYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmFyeVR5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5hcnlUeXBlQmluZGluZy5qYXZhCkBAIC0xLDIyICsxLDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlOZXN0ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKgogTm90IGFsbCBmaWVsZHMgZGVmaW5lZCBieSB0aGlzIHR5cGUgYXJlIGluaXRpYWxpemVkIHdoZW4gaXQgaXMgY3JlYXRlZC4KQEAgLTIyMCwxNyArMjIwLDI4IEBACiAJCQl0aGlzKTsKIAlyZXR1cm4gYmluZGluZzsKIH0KKy8qKgorICogQ3JlYXRlIG1ldGhvZCBiaW5kaW5ncyBmb3IgYmluYXJ5IHR5cGUsIGZpbHRlcmluZyBvdXQgPGNsaW5pdD4gYW5kIHN5bnRoZXRpY3MKKyAqLwogcHJpdmF0ZSB2b2lkIGNyZWF0ZU1ldGhvZHMoSUJpbmFyeU1ldGhvZFtdIGlNZXRob2RzKSB7Ci0JaW50IHRvdGFsID0gMDsKLQlpbnQgY2xpbml0SW5kZXggPSAtMTsKKwlpbnQgdG90YWwgPSAwLCBpbml0aWFsVG90YWwgPSAwLCBpQ2xpbml0ID0gLTE7CisJaW50W10gdG9Ta2lwID0gbnVsbDsKIAlpZiAoaU1ldGhvZHMgIT0gbnVsbCkgewotCQl0b3RhbCA9IGlNZXRob2RzLmxlbmd0aDsKKwkJdG90YWwgPSBpbml0aWFsVG90YWwgPSBpTWV0aG9kcy5sZW5ndGg7CiAJCWZvciAoaW50IGkgPSB0b3RhbDsgLS1pID49IDA7KSB7Ci0JCQljaGFyW10gbWV0aG9kTmFtZSA9IGlNZXRob2RzW2ldLmdldFNlbGVjdG9yKCk7Ci0JCQlpZiAobWV0aG9kTmFtZVswXSA9PSAnPCcgJiYgbWV0aG9kTmFtZS5sZW5ndGggPT0gOCkgeyAvLyBDYW4gb25seSBtYXRjaCA8Y2xpbml0PgorCQkJSUJpbmFyeU1ldGhvZCBtZXRob2QgPSBpTWV0aG9kc1tpXTsKKwkJCWlmICgobWV0aG9kLmdldE1vZGlmaWVycygpICYgQWNjU3ludGhldGljKSAhPSAwKSB7CisJCQkJLy8gZGlzY2FyZCBzeW50aGV0aWNzIG1ldGhvZHMKKwkJCQlpZiAodG9Ta2lwID09IG51bGwpIHRvU2tpcCA9IG5ldyBpbnRbaU1ldGhvZHMubGVuZ3RoXTsKKwkJCQl0b1NraXBbaV0gPSAtMTsKIAkJCQl0b3RhbC0tOwotCQkJCWNsaW5pdEluZGV4ID0gaTsKLQkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoaUNsaW5pdCA9PSAtMSkgeworCQkJCWNoYXJbXSBtZXRob2ROYW1lID0gbWV0aG9kLmdldFNlbGVjdG9yKCk7CisJCQkJaWYgKG1ldGhvZE5hbWUubGVuZ3RoID09IDggJiYgbWV0aG9kTmFtZVswXSA9PSAnPCcpIHsKKwkJCQkJLy8gZGlzY2FyZCA8Y2xpbml0PgorCQkJCQlpQ2xpbml0ID0gaTsKKwkJCQkJdG90YWwtLTsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC0yNDAsMTAgKzI1MSwxNCBAQAogCX0KIAogCXRoaXMubWV0aG9kcyA9IG5ldyBNZXRob2RCaW5kaW5nW3RvdGFsXTsKLQlpbnQgbmV4dCA9IDA7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGlNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQlpZiAoaSAhPSBjbGluaXRJbmRleCkKLQkJCXRoaXMubWV0aG9kc1tuZXh0KytdID0gY3JlYXRlTWV0aG9kKGlNZXRob2RzW2ldKTsKKwlpZiAodG90YWwgPT0gaW5pdGlhbFRvdGFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbFRvdGFsOyBpKyspCisJCQl0aGlzLm1ldGhvZHNbaV0gPSBjcmVhdGVNZXRob2QoaU1ldGhvZHNbaV0pOworCX0gZWxzZSB7CisJCWZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBpbml0aWFsVG90YWw7IGkrKykKKwkJCWlmIChpQ2xpbml0ICE9IGkgJiYgKHRvU2tpcCA9PSBudWxsIHx8IHRvU2tpcFtpXSAhPSAtMSkpCisJCQkJdGhpcy5tZXRob2RzW2luZGV4KytdID0gY3JlYXRlTWV0aG9kKGlNZXRob2RzW2ldKTsKKwl9CiAJbW9kaWZpZXJzIHw9IEFjY1VucmVzb2x2ZWQ7IC8vIHVudGlsIG1ldGhvZHMoKSBpcyBzZW50CiB9CiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZW5jbG9zaW5nIHR5cGUuLi4gbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nLmphdmEKaW5kZXggMzlmZGMyNi4uOWIzYzZjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CaW5kaW5nLmphdmEKQEAgLTEsNDEgKzEsNDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZyBpbXBsZW1lbnRzIEJpbmRpbmdJZHMsIENvbXBpbGVyTW9kaWZpZXJzLCBQcm9ibGVtUmVhc29ucyB7Ci0vKiBBUEkKLSogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgotKgotKiBOb3RlOiBEbyBOT1QgZXhwZWN0IHRoaXMgdG8gYmUgdXNlZCB2ZXJ5IG9mdGVuLi4uIG9ubHkgaW4gc3dpdGNoIHN0YXRlbWVudHMgd2l0aAotKiBtb3JlIHRoYW4gMiBwb3NzaWJsZSBjaG9pY2VzLgotKi8KKwkvKiBBUEkKKwkqIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBiaW5kaW5nIHR5cGUgZnJvbSBCaW5kaW5nLkJpbmRpbmdJRC4KKwkqCisJKiBOb3RlOiBEbyBOT1QgZXhwZWN0IHRoaXMgdG8gYmUgdXNlZCB2ZXJ5IG9mdGVuLi4uIG9ubHkgaW4gc3dpdGNoIHN0YXRlbWVudHMgd2l0aAorCSogbW9yZSB0aGFuIDIgcG9zc2libGUgY2hvaWNlcy4KKwkqLworCXB1YmxpYyBhYnN0cmFjdCBpbnQgYmluZGluZ1R5cGUoKTsKKwkvKiBBUEkKKwkqIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBub3QgYSBwcm9ibGVtIGJpbmRpbmcKKwkqLworCQorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRCaW5kaW5nKCkgeworCQlyZXR1cm4gcHJvYmxlbUlkKCkgPT0gTm9FcnJvcjsKKwl9CisJLyogQVBJCisJKiBBbnN3ZXIgdGhlIHByb2JsZW0gaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KKwkqIE5vRXJyb3IgaWYgdGhlIHJlY2VpdmVyIGlzIGEgdmFsaWQgYmluZGluZy4KKwkqLworCQorCXB1YmxpYyBpbnQgcHJvYmxlbUlkKCkgeworCQlyZXR1cm4gTm9FcnJvcjsKKwl9CisJLyogQW5zd2VyIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlci4KKwkqLworCXB1YmxpYyBhYnN0cmFjdCBjaGFyW10gcmVhZGFibGVOYW1lKCk7CiAKLXB1YmxpYyBhYnN0cmFjdCBpbnQgYmluZGluZ1R5cGUoKTsKLS8qIEFQSQotKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgbm90IGEgcHJvYmxlbSBiaW5kaW5nCi0qLwotCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkQmluZGluZygpIHsKLQlyZXR1cm4gcHJvYmxlbUlkKCkgPT0gTm9FcnJvcjsKLX0KLS8qIEFQSQotKiBBbnN3ZXIgdGhlIHByb2JsZW0gaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlci4KLSogTm9FcnJvciBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB2YWxpZCBiaW5kaW5nLgotKi8KLQotcHVibGljIGludCBwcm9ibGVtSWQoKSB7Ci0JcmV0dXJuIE5vRXJyb3I7Ci19Ci0vKiBBbnN3ZXIgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2VpdmVyLgotKi8KLQotcHVibGljIGFic3RyYWN0IGNoYXJbXSByZWFkYWJsZU5hbWUoKTsKKwkvKiBTaG9ydGVyIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXIgKG5vIHF1YWxpZmllZCB0eXBlKQorCSAqLwkKKwlwdWJsaWMgY2hhcltdIHNob3J0UmVhZGFibGVOYW1lKCl7CisJCXJldHVybiByZWFkYWJsZU5hbWUoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0JpbmRpbmdJZHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluZGluZ0lkcy5qYXZhCmluZGV4IDMyYTgxNDQuLmI2OWIxMmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluZGluZ0lkcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmluZGluZ0lkcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGludGVyZmFjZSBCaW5kaW5nSWRzIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQmxvY2tTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKaW5kZXggYjNiZTBhMi4uMjFkMDQ0OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9CbG9ja1Njb3BlLmphdmEKQEAgLTEsMTUgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CkBAIC0xOSw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgQmxvY2tTY29wZSBleHRlbmRzIFNjb3BlIHsKIApAQCAtMzAsMTAgKzMwLDEzIEBACiAJcHVibGljIGludCBvZmZzZXQ7IC8vIGZvciB2YXJpYWJsZSBhbGxvY2F0aW9uIHRocm91Z2hvdXQgc2NvcGVzCiAJcHVibGljIGludCBtYXhPZmZzZXQ7IC8vIGZvciB2YXJpYWJsZSBhbGxvY2F0aW9uIHRocm91Z2hvdXQgc2NvcGVzCiAKLQkvLyBmaW5hbGx5IHNjb3BlcyBtdXN0IGJlIHNoaWZ0ZWQgYmVoaW5kIHJlc3BlY3RpdmUgdHJ5IHNjb3BlCisJLy8gZmluYWxseSBzY29wZXMgbXVzdCBiZSBzaGlmdGVkIGJlaGluZCByZXNwZWN0aXZlIHRyeSZjYXRjaCBzY29wZShzKSBzbyBhcyB0byBhdm9pZAorCS8vIGNvbGxpc2lvbnMgb2Ygc2VjcmV0IHZhcmlhYmxlcyAocmV0dXJuIGFkZHJlc3MsIHNhdmUgdmFsdWUpLgogCXB1YmxpYyBCbG9ja1Njb3BlW10gc2hpZnRTY29wZXM7IAogCiAJcHVibGljIGZpbmFsIHN0YXRpYyBWYXJpYWJsZUJpbmRpbmdbXSBFbXVsYXRpb25QYXRoVG9JbXBsaWNpdFRoaXMgPSB7fTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFZhcmlhYmxlQmluZGluZ1tdIE5vRW5jbG9zaW5nSW5zdGFuY2VJbkNvbnN0cnVjdG9yQ2FsbCA9IHt9OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmFyaWFibGVCaW5kaW5nW10gTm9FbmNsb3NpbmdJbnN0YW5jZUluU3RhdGljQ29udGV4dCA9IHt9OwogCiAJcHVibGljIFNjb3BlW10gc3Vic2NvcGVzID0gbmV3IFNjb3BlWzFdOyAvLyBuZWVkIGFjY2VzcyBmcm9tIGNvZGUgYXNzaXN0CiAJcHVibGljIGludCBzY29wZUluZGV4ID0gMDsgLy8gbmVlZCBhY2Nlc3MgZnJvbSBjb2RlIGFzc2lzdApAQCAtMTAwLDggKzEwMyw4IEBACiAJCX0gd2hpbGUgKChzY29wZSA9IHNjb3BlLnBhcmVudCkgaW5zdGFuY2VvZiBCbG9ja1Njb3BlKTsKIAogCQlDbGFzc1Njb3BlIGxvY2FsVHlwZVNjb3BlID0gbmV3IENsYXNzU2NvcGUodGhpcywgbG9jYWxUeXBlKTsKLQkJbG9jYWxUeXBlU2NvcGUuYnVpbGRMb2NhbFR5cGVCaW5kaW5nKGVuY2xvc2luZ1NvdXJjZVR5cGUoKSk7CiAJCWFkZFN1YnNjb3BlKGxvY2FsVHlwZVNjb3BlKTsKKwkJbG9jYWxUeXBlU2NvcGUuYnVpbGRMb2NhbFR5cGVCaW5kaW5nKGVuY2xvc2luZ1NvdXJjZVR5cGUoKSk7CiAJfQogCiAJLyogSW5zZXJ0IGEgbG9jYWwgdmFyaWFibGUgaW50byBhIGdpdmVuIHNjb3BlLCB1cGRhdGluZyBpdHMgcG9zaXRpb24KQEAgLTE1MSw5ICsxNTQsOCBAQAogCQlpZiAobWV0aG9kU2NvcGUuaXNTdGF0aWMgIT0gYmluZGluZy5pc1N0YXRpYygpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gbWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplcigpIC8vIGluc2lkZSBpbml0aWFsaXplcgotCQl8fCAoKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpCi0JCQkuaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpOwotCQkvLyBpbnNpZGUgY29uc3RydWN0b3Igb3IgY2xpbml0CisJCQkJfHwgKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2RTY29wZS5yZWZlcmVuY2VDb250ZXh0KQorCQkJCQkuaXNJbml0aWFsaXphdGlvbk1ldGhvZCgpOyAvLyBpbnNpZGUgY29uc3RydWN0b3Igb3IgY2xpbml0CiAJfQogCVN0cmluZyBiYXNpY1RvU3RyaW5nKGludCB0YWIpIHsKIAkJU3RyaW5nIG5ld0xpbmUgPSAiXG4iOyAvLyROT04tTkxTLTEkCkBAIC0xODcsMjcgKzE4OSwyMCBAQAogCS8qIENvbXB1dGUgdmFyaWFibGUgcG9zaXRpb25zIGluIHNjb3BlcyBnaXZlbiBhbiBpbml0aWFsIHBvc2l0aW9uIG9mZnNldAogCSAqIGlnbm9yaW5nIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCiAJICogCi0JICogU3BlY2lhbCB0cmVhdG1lbnQgdG8gaGF2ZSBUcnkgc2VjcmV0IHJldHVybiBhZGRyZXNzIHZhcmlhYmxlcyBsb2NhdGVkIGF0IG5vbgotCSAqIGNvbGxpZGluZyBwb3NpdGlvbnMuIFJldHVybiBhZGRyZXNzZXMgYXJlIG5vdCBhbGxvY2F0ZWQgaW5pdGlhbGx5LCBidXQgZ2F0aGVyZWQKLQkgKiBhbmQgYWxsb2NhdGVkIGJlaGluZCBhbGwgb3RoZXIgdmFyaWFibGVzLgorCSAqIE5vIGFyZ3VtZW50IGlzIGV4cGVjdGVkIGhlcmUgKGlsb2NhbCBpcyB0aGUgZmlyc3Qgbm9uLWFyZ3VtZW50IGxvY2FsIG9mIHRoZSBvdXRlcm1vc3Qgc2NvcGUpCisJICogQXJndW1lbnRzIGFyZSBtYW5hZ2VkIGJ5IHRoZSBNZXRob2RTY29wZSBtZXRob2QKIAkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucygKLQkJaW50IGluaXRPZmZzZXQsCi0JCUNvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCXZvaWQgY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoaW50IGlsb2NhbCwgaW50IGluaXRPZmZzZXQsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgewogCiAJCXRoaXMub2Zmc2V0ID0gaW5pdE9mZnNldDsKIAkJdGhpcy5tYXhPZmZzZXQgPSBpbml0T2Zmc2V0OwogCiAJCS8vIGxvY2FsIHZhcmlhYmxlIGluaXQKLQkJaW50IGlsb2NhbCA9IDAsIG1heExvY2FscyA9IDAsIGxvY2Fsc0xlbmd0aCA9IGxvY2Fscy5sZW5ndGg7Ci0JCXdoaWxlICgobWF4TG9jYWxzIDwgbG9jYWxzTGVuZ3RoKSAmJiAobG9jYWxzW21heExvY2Fsc10gIT0gbnVsbCkpCi0JCQltYXhMb2NhbHMrKzsKLQkJYm9vbGVhbiBoYXNNb3JlVmFyaWFibGVzID0gbWF4TG9jYWxzID4gMDsKKwkJaW50IG1heExvY2FscyA9IHRoaXMubG9jYWxJbmRleDsKKwkJYm9vbGVhbiBoYXNNb3JlVmFyaWFibGVzID0gaWxvY2FsIDwgbWF4TG9jYWxzOwogCiAJCS8vIHNjb3BlIGluaXQKLQkJaW50IGlzY29wZSA9IDAsIG1heFNjb3BlcyA9IDAsIHN1YnNjb3Blc0xlbmd0aCA9IHN1YnNjb3Blcy5sZW5ndGg7Ci0JCXdoaWxlICgobWF4U2NvcGVzIDwgc3Vic2NvcGVzTGVuZ3RoKSAmJiAoc3Vic2NvcGVzW21heFNjb3Blc10gIT0gbnVsbCkpCi0JCQltYXhTY29wZXMrKzsKKwkJaW50IGlzY29wZSA9IDAsIG1heFNjb3BlcyA9IHRoaXMuc2NvcGVJbmRleDsKIAkJYm9vbGVhbiBoYXNNb3JlU2NvcGVzID0gbWF4U2NvcGVzID4gMDsKIAogCQkvLyBpdGVyYXRlIHNjb3BlcyBhbmQgdmFyaWFibGVzIGluIHBhcmFsbGVsCkBAIC0yMTgsNjAgKzIxMyw1NSBAQAogCQkJCWlmIChzdWJzY29wZXNbaXNjb3BlXSBpbnN0YW5jZW9mIEJsb2NrU2NvcGUpIHsKIAkJCQkJQmxvY2tTY29wZSBzdWJzY29wZSA9IChCbG9ja1Njb3BlKSBzdWJzY29wZXNbaXNjb3BlXTsKIAkJCQkJaW50IHN1Yk9mZnNldCA9IHN1YnNjb3BlLnNoaWZ0U2NvcGVzID09IG51bGwgPyB0aGlzLm9mZnNldCA6IHN1YnNjb3BlLm1heFNoaWZ0ZWRPZmZzZXQoKTsKLQkJCQkJc3Vic2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoc3ViT2Zmc2V0LCBjb2RlU3RyZWFtKTsKKwkJCQkJc3Vic2NvcGUuY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoMCwgc3ViT2Zmc2V0LCBjb2RlU3RyZWFtKTsKIAkJCQkJaWYgKHN1YnNjb3BlLm1heE9mZnNldCA+IHRoaXMubWF4T2Zmc2V0KQogCQkJCQkJdGhpcy5tYXhPZmZzZXQgPSBzdWJzY29wZS5tYXhPZmZzZXQ7CiAJCQkJfQogCQkJCWhhc01vcmVTY29wZXMgPSArK2lzY29wZSA8IG1heFNjb3BlczsKIAkJCX0gZWxzZSB7CisJCQkJCiAJCQkJLy8gY29uc2lkZXIgdmFyaWFibGUgZmlyc3QKLQkJCQlMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCA9IGxvY2Fsc1tpbG9jYWxdOwotCisJCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwgPSBsb2NhbHNbaWxvY2FsXTsgLy8gaWYgbm8gbG9jYWwgYXQgYWxsLCB3aWxsIGJlIGxvY2Fsc1tpbG9jYWxdPT1udWxsCisJCQkJCiAJCQkJLy8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYWN0dWFsbHkgdXNlZCwgYW5kIG1heSBmb3JjZSBpdCB0byBiZSBwcmVzZXJ2ZWQKLQkJCQlib29sZWFuIGdlbmVyYXRlc0xvY2FsID0KLQkJCQkJKGxvY2FsLnVzZWQgJiYgKGxvY2FsLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkpIHx8IGxvY2FsLmlzQXJndW1lbnQ7Ci0JCQkJaWYgKCFsb2NhbC51c2VkCisJCQkJYm9vbGVhbiBnZW5lcmF0ZUN1cnJlbnRMb2NhbFZhciA9IChsb2NhbC51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQgJiYgKGxvY2FsLmNvbnN0YW50ID09IENvbnN0YW50Lk5vdEFDb25zdGFudCkpOworCQkJCQkKKwkJCQkvLyBkbyBub3QgcmVwb3J0IGZha2UgdXNlZCB2YXJpYWJsZQorCQkJCWlmIChsb2NhbC51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRAogCQkJCQkmJiAobG9jYWwuZGVjbGFyYXRpb24gIT0gbnVsbCkgLy8gdW51c2VkIChhbmQgbm9uIHNlY3JldCkgbG9jYWwKIAkJCQkJJiYgKChsb2NhbC5kZWNsYXJhdGlvbi5iaXRzICYgQXN0Tm9kZS5Jc0xvY2FsRGVjbGFyYXRpb25SZWFjaGFibGVNQVNLKSAhPSAwKSkgeyAvLyBkZWNsYXJhdGlvbiBpcyByZWFjaGFibGUKLQkJCQkJaWYgKGxvY2FsLmlzQXJndW1lbnQpIC8vIG1ldGhvZCBhcmd1bWVudAotCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRBcmd1bWVudChsb2NhbC5kZWNsYXJhdGlvbik7Ci0JCQkJCWVsc2UgaWYgKCEobG9jYWwuZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBBcmd1bWVudCkpICAvLyBkbyBub3QgcmVwb3J0IHVudXNlZCBjYXRjaCBhcmd1bWVudHMKKwkJCQkJCQorCQkJCQlpZiAoIShsb2NhbC5kZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFyZ3VtZW50KSkgIC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIGNhdGNoIGFyZ3VtZW50cwogCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRMb2NhbFZhcmlhYmxlKGxvY2FsLmRlY2xhcmF0aW9uKTsKIAkJCQl9Ci0JCQkJaWYgKCFnZW5lcmF0ZXNMb2NhbCkgewotCQkJCQlpZiAobG9jYWwuZGVjbGFyYXRpb24gIT0gbnVsbAotCQkJCQkJJiYgZW52aXJvbm1lbnQoKS5vcHRpb25zLnByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXMpIHsKLQkJCQkJCWdlbmVyYXRlc0xvY2FsID0gdHJ1ZTsgLy8gZm9yY2UgaXQgdG8gYmUgcHJlc2VydmVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQotCQkJCQkJbG9jYWwudXNlZCA9IHRydWU7CisJCQkJCisJCQkJLy8gY291bGQgYmUgb3B0aW1pemVkIG91dCwgYnV0IGRvZXMgbmVlZCB0byBwcmVzZXJ2ZSB1bnJlYWQgdmFyaWFibGVzID8KKwkJCQlpZiAoIWdlbmVyYXRlQ3VycmVudExvY2FsVmFyKSB7CisJCQkJCWlmIChsb2NhbC5kZWNsYXJhdGlvbiAhPSBudWxsICYmIGVudmlyb25tZW50KCkub3B0aW9ucy5wcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzKSB7CisJCQkJCQlnZW5lcmF0ZUN1cnJlbnRMb2NhbFZhciA9IHRydWU7IC8vIGZvcmNlIGl0IHRvIGJlIHByZXNlcnZlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKKwkJCQkJCWxvY2FsLnVzZUZsYWcgPSBMb2NhbFZhcmlhYmxlQmluZGluZy5VU0VEOwogCQkJCQl9CiAJCQkJfQotCQkJCWlmIChnZW5lcmF0ZXNMb2NhbCkgeworCQkJCQorCQkJCS8vIGFsbG9jYXRlIHZhcmlhYmxlCisJCQkJaWYgKGdlbmVyYXRlQ3VycmVudExvY2FsVmFyKSB7CiAKIAkJCQkJaWYgKGxvY2FsLmRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCWNvZGVTdHJlYW0ucmVjb3JkKGxvY2FsKTsKLQkJCQkJCS8vIHJlY29yZCB1c2VyIGxvY2FsIHZhcmlhYmxlcyBmb3IgYXR0cmlidXRlIGdlbmVyYXRpb24KKwkJCQkJCWNvZGVTdHJlYW0ucmVjb3JkKGxvY2FsKTsgLy8gcmVjb3JkIHVzZXItZGVmaW5lZCBsb2NhbCB2YXJpYWJsZXMgZm9yIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCiAJCQkJCX0KLQkJCQkJLy8gYWxsb2NhdGUgdmFyaWFibGUgcG9zaXRpb24KKwkJCQkJLy8gYXNzaWduIHZhcmlhYmxlIHBvc2l0aW9uCiAJCQkJCWxvY2FsLnJlc29sdmVkUG9zaXRpb24gPSB0aGlzLm9mZnNldDsKIAotCQkJCQkvLyBjaGVjayBmb3IgdG9vIG1hbnkgYXJndW1lbnRzL2xvY2FsIHZhcmlhYmxlcwotCQkJCQlpZiAobG9jYWwuaXNBcmd1bWVudCkgewotCQkJCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cwotCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChsb2NhbCwgbG9jYWwuZGVjbGFyYXRpb24pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRkZGKSB7IC8vIG5vIG1vcmUgdGhhbiA2NTUzNSB3b3JkcyBvZiBsb2NhbHMKLQkJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yTG9jYWwoCi0JCQkJCQkJCWxvY2FsLCBsb2NhbC5kZWNsYXJhdGlvbiA9PSBudWxsID8gKEFzdE5vZGUpdGhpcy5tZXRob2RTY29wZSgpLnJlZmVyZW5jZUNvbnRleHQgOiBsb2NhbC5kZWNsYXJhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBpbmNyZW1lbnQgb2Zmc2V0CiAJCQkJCWlmICgobG9jYWwudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGxvY2FsLnR5cGUgPT0gRG91YmxlQmluZGluZykpIHsKIAkJCQkJCXRoaXMub2Zmc2V0ICs9IDI7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQl0aGlzLm9mZnNldCsrOwogCQkJCQl9CisJCQkJCWlmICh0aGlzLm9mZnNldCA+IDB4RkZGRikgeyAvLyBubyBtb3JlIHRoYW4gNjU1MzUgd29yZHMgb2YgbG9jYWxzCisJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLm5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yTG9jYWwoCisJCQkJCQkJbG9jYWwsIAorCQkJCQkJCWxvY2FsLmRlY2xhcmF0aW9uID09IG51bGwgPyAoQXN0Tm9kZSl0aGlzLm1ldGhvZFNjb3BlKCkucmVmZXJlbmNlQ29udGV4dCA6IGxvY2FsLmRlY2xhcmF0aW9uKTsKKwkJCQkJfQogCQkJCX0gZWxzZSB7CiAJCQkJCWxvY2FsLnJlc29sdmVkUG9zaXRpb24gPSAtMTsgLy8gbm90IGdlbmVyYXRlZAogCQkJCX0KQEAgLTMyMiw1NyArMzEyLDYgQEAKIAkJfQogCX0KIAotCS8qCi0JICogUmVjb3JkIHRoZSBzdWl0YWJsZSBiaW5kaW5nIGRlbm90aW5nIGEgc3ludGhldGljIGZpZWxkIG9yIGNvbnN0cnVjdG9yIGFyZ3VtZW50LAotCSAqIG1hcHBpbmcgdG8gYSBnaXZlbiBhY3R1YWwgZW5jbG9zaW5nIGluc3RhbmNlIHR5cGUgaW4gdGhlIHNjb3BlIGNvbnRleHQuCi0JICogU2tpcCBpdCBpZiB0aGUgZW5jbG9zaW5nVHlwZSBpcyBhY3R1YWxseSB0aGUgY3VycmVudCBzY29wZSdzIGVuY2xvc2luZyB0eXBlLgotCSAqLwotCi0JcHVibGljIHZvaWQgZW11bGF0ZU91dGVyQWNjZXNzKAotCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUsCi0JCWJvb2xlYW4gdXNlRGlyZWN0UmVmZXJlbmNlKSB7Ci0KLQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IGVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKLQkJaWYgKGN1cnJlbnRUeXBlLmlzTmVzdGVkVHlwZSgpCi0JCQkmJiBjdXJyZW50VHlwZSAhPSB0YXJnZXRFbmNsb3NpbmdUeXBlKXsKLQkJCS8qJiYgIXRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKi8KLQotCQkJaWYgKHVzZURpcmVjdFJlZmVyZW5jZSkgewotCQkJCS8vIHRoZSB0YXJnZXQgZW5jbG9zaW5nIHR5cGUgaXMgbm90IGluIHNjb3BlLCB3ZSBkaXJlY3RseSByZWZlciBpdAotCQkJCS8vIG11c3QgYWxzbyBhZGQgYSBzeW50aGV0aWMgZmllbGQgaWYgd2UncmUgbm90IGluc2lkZSBhIGNvbnN0cnVjdG9yCi0JCQkJTmVzdGVkVHlwZUJpbmRpbmcgY3VycmVudE5lc3RlZFR5cGUgPSAoTmVzdGVkVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlOwotCQkJCWlmIChtZXRob2RTY29wZSgpLmlzSW5zaWRlSW5pdGlhbGl6ZXJPckNvbnN0cnVjdG9yKCkpCi0JCQkJCWN1cnJlbnROZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50KHRhcmdldEVuY2xvc2luZ1R5cGUpOwotCQkJCWVsc2UKLQkJCQkJY3VycmVudE5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZCh0YXJnZXRFbmNsb3NpbmdUeXBlKTsKLQkJCQkJCi0JCQl9IGVsc2UgeyAvLyBpbmRpcmVjdCByZWZlcmVuY2Ugc2VxdWVuY2UKLQkJCQlpbnQgZGVwdGggPSAwOwotCQkJCQotCQkJCS8vIHNhdHVyYXRlIGFsbCB0aGUgd2F5IHVwIHVudGlsIHJlYWNoaW5nIGNvbXBhdGlibGUgZW5jbG9zaW5nIHR5cGUKLQkJCQl3aGlsZSAoY3VycmVudFR5cGUuaXNMb2NhbFR5cGUoKSl7Ci0JCQkJCU5lc3RlZFR5cGVCaW5kaW5nIGN1cnJlbnROZXN0ZWRUeXBlID0gKE5lc3RlZFR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZTsKLQkJCQkJY3VycmVudFR5cGUgPSBjdXJyZW50TmVzdGVkVHlwZS5lbmNsb3NpbmdUeXBlOwotCQkJCQkKLQkJCQkJaWYgKGRlcHRoID09IDApewotCQkJCQkJaWYgKG1ldGhvZFNjb3BlKCkuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKSkgewotCQkJCQkJCS8vIG11c3QgYWxzbyBhZGQgYSBzeW50aGV0aWMgZmllbGQgaWYgd2UncmUgbm90IGluc2lkZSBhIGNvbnN0cnVjdG9yCi0JCQkJCQkJY3VycmVudE5lc3RlZFR5cGUuYWRkU3ludGhldGljQXJndW1lbnQoY3VycmVudFR5cGUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljdXJyZW50TmVzdGVkVHlwZS5hZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKGN1cnJlbnRUeXBlKTsKLQkJCQkJCX0JCQkJCQotCQkJCQl9IGVsc2UgaWYgKGN1cnJlbnROZXN0ZWRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUgCi0JCQkJCQkJCQkJfHwgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihjdXJyZW50TmVzdGVkVHlwZSkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWN1cnJlbnROZXN0ZWRUeXBlLmFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoY3VycmVudFR5cGUpOwotCQkJCQl9IAotCQkJCQlkZXB0aCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQogCS8qIE5vdGUgdGhhdCBpdCBtdXN0IG5ldmVyIHByb2R1Y2UgYSBkaXJlY3QgYWNjZXNzIHRvIHRoZSB0YXJnZXRFbmNsb3NpbmdUeXBlLAogCSAqIGJ1dCBpbnN0ZWFkIGEgZmllbGQgc2VxdWVuY2UgKHRoaXMkMi50aGlzJDEudGhpcyQwKSBzbyBhcyB0byBoYW5kbGUgc3VjaCBhIHRlc3QgY2FzZToKIAkgKgpAQCAtODI0LDg2ICs3NjMsNiBAQAogCQllbHNlCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1CaW5kaW5nKG5hbWUsIGVuY2xvc2luZ1NvdXJjZVR5cGUoKSwgTm90Rm91bmQpOwogCX0KLQkKLQkvKgotCSAqIFRoaXMgcmV0cmlldmVzIHRoZSBhcmd1bWVudCB0aGF0IG1hcHMgdG8gYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHRoZSBzdWl0YWJsZSB0eXBlLAotCSAqIAlpZiBub3QgZm91bmQgdGhlbiBhbnN3ZXJzIG5pbCAtLSBkbyBub3QgY3JlYXRlIG9uZQotCSAqCi0JICoJCSNpbXBsaWNpdFRoaXMJCSAgCSAJCQkJCTogIHRoZSBpbXBsaWNpdCB0aGlzIHdpbGwgYmUgb2sKLQkgKgkJIygoYXJnKSB0aGlzJG4pCQkJCQkJCQk6IGF2YWlsYWJsZSBhcyBhIGNvbnN0cnVjdG9yIGFyZwotCSAqIAkJIygoYXJnKSB0aGlzJG4gYWNjZXNzJG0uLi4gYWNjZXNzJHApIAkJOiBhdmFpbGFibGUgYXMgYXMgYSBjb25zdHJ1Y3RvciBhcmcgKyBhIHNlcXVlbmNlIG9mIHN5bnRoZXRpYyBhY2Nlc3NvcnMgdG8gc3ludGhldGljIGZpZWxkcwotCSAqIAkJIygoZmllbGREZXNjcikgdGhpcyRuIGFjY2VzcyNtLi4uIGFjY2VzcyRwKQk6IGF2YWlsYWJsZSBhcyBhIGZpcnN0IHN5bnRoZXRpYyBmaWVsZCArIGEgc2VxdWVuY2Ugb2Ygc3ludGhldGljIGFjY2Vzc29ycyB0byBzeW50aGV0aWMgZmllbGRzCi0JICogCQluaWwgCQkgCQkJCQkJCQkJCQkJCQk6IG5vdCBmb3VuZAotCSAqCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENvbXBhdGlibGVFbXVsYXRpb25QYXRoKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSkgewotCi0JCU1ldGhvZFNjb3BlIGN1cnJlbnRNZXRob2RTY29wZSA9IHRoaXMubWV0aG9kU2NvcGUoKTsKLQkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IGN1cnJlbnRNZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7Ci0KLQkJLy8gaWRlbnRpdHkgY2hlY2sKLQkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMgCi0JCQkmJiAhY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsCi0JCQkmJiAoc291cmNlVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlCi0JCQkJfHwgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihzb3VyY2VUeXBlKSkpIHsKLQkJCXJldHVybiBFbXVsYXRpb25QYXRoVG9JbXBsaWNpdFRoaXM7IC8vIGltcGxpY2l0IHRoaXMgaXMgZ29vZCBlbm91Z2gKLQkJfQotCQlpZiAoIXNvdXJjZVR5cGUuaXNOZXN0ZWRUeXBlKCkKLQkJCXx8IHNvdXJjZVR5cGUuaXNTdGF0aWMoKSkgeyAvLyBubyBlbXVsYXRpb24gZnJvbSB3aXRoaW4gbm9uLWlubmVyIHR5cGVzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGluc2lkZUNvbnN0cnVjdG9yID0KLQkJCWN1cnJlbnRNZXRob2RTY29wZS5pc0luc2lkZUluaXRpYWxpemVyT3JDb25zdHJ1Y3RvcigpOwotCQkvLyB1c2Ugc3ludGhldGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpZiBwb3NzaWJsZQotCQlpZiAoaW5zaWRlQ29uc3RydWN0b3IpIHsKLQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmc7Ci0JCQlpZiAoKHN5bnRoZXRpY0FyZyA9ICgoTmVzdGVkVHlwZUJpbmRpbmcpIHNvdXJjZVR5cGUpLmdldFN5bnRoZXRpY0FyZ3VtZW50KHRhcmdldEVuY2xvc2luZ1R5cGUsIHRoaXMsIGZhbHNlKSkgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBzeW50aGV0aWNBcmcgfTsKLQkJCX0KLQkJfQotCi0JCS8vIHVzZSBhIGRpcmVjdCBzeW50aGV0aWMgZmllbGQgdGhlbgotCQlpZiAoIWN1cnJlbnRNZXRob2RTY29wZS5pc1N0YXRpYykgewotCQkJRmllbGRCaW5kaW5nIHN5bnRoZXRpY0ZpZWxkOwotCQkJaWYgKChzeW50aGV0aWNGaWVsZCA9IHNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQodGFyZ2V0RW5jbG9zaW5nVHlwZSwgdGhpcywgZmFsc2UpKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHN5bnRoZXRpY0ZpZWxkIH07Ci0JCQl9Ci0JCQkvLyBjb3VsZCBiZSByZWFjaGVkIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBlbmNsb3NpbmcgaW5zdGFuY2UgbGluayAobmVzdGVkIG1lbWJlcnMpCi0JCQlPYmplY3RbXSBwYXRoID0gbmV3IE9iamVjdFsyXTsgLy8gcHJvYmFibHkgYXQgbGVhc3QgMiBvZiB0aGVtCi0JCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gc291cmNlVHlwZS5lbmNsb3NpbmdUeXBlKCk7Ci0JCQlpZiAoaW5zaWRlQ29uc3RydWN0b3IpIHsKLQkJCQlwYXRoWzBdID0gKChOZXN0ZWRUeXBlQmluZGluZykgc291cmNlVHlwZSkuZ2V0U3ludGhldGljQXJndW1lbnQoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSwgdGhpcywgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXRoWzBdID0KLQkJCQkJc291cmNlVHlwZS5nZXRTeW50aGV0aWNGaWVsZCgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlLCB0aGlzLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAocGF0aFswXSAhPSBudWxsKSB7IC8vIGtlZXAgYWNjdW11bGF0aW5nCi0JCQkJaW50IGNvdW50ID0gMTsKLQkJCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRFbmNsb3NpbmdUeXBlOwotCQkJCXdoaWxlICgoY3VycmVudEVuY2xvc2luZ1R5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpIHsKLQkJCQkJLy9kb25lPwotCQkJCQlpZiAoY3VycmVudFR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZQotCQkJCQkJfHwgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpCi0JCQkJCQlicmVhazsKLQkJCQkJc3ludGhldGljRmllbGQgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSkuZ2V0U3ludGhldGljRmllbGQoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50RW5jbG9zaW5nVHlwZSwgdGhpcywgZmFsc2UpOwotCQkJCQlpZiAoc3ludGhldGljRmllbGQgPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCQkvLyBhcHBlbmQgaW5zaWRlIHRoZSBwYXRoCi0JCQkJCWlmIChjb3VudCA9PSBwYXRoLmxlbmd0aCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXRoLCAwLCAocGF0aCA9IG5ldyBPYmplY3RbY291bnQgKyAxXSksIDAsIGNvdW50KTsKLQkJCQkJfQotCQkJCQkvLyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIHN5bnRoZXRpYyBmaWVsZCBpcyBwcml2YXRlCi0JCQkJCXBhdGhbY291bnQrK10gPSAoKFNvdXJjZVR5cGVCaW5kaW5nKSBzeW50aGV0aWNGaWVsZC5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKHN5bnRoZXRpY0ZpZWxkLCB0cnVlKTsKLQkJCQkJY3VycmVudFR5cGUgPSBjdXJyZW50RW5jbG9zaW5nVHlwZTsKLQkJCQl9Ci0JCQkJaWYgKGN1cnJlbnRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUKLQkJCQkJfHwgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KIAogCS8qIEFQSQogCSAqCkBAIC05MjIsMTggKzc4MSwxOCBAQAogCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFR5cGVSZWZlcmVuY2UocmVjZWl2ZXJUeXBlKTsKIAkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlcyhhcmd1bWVudFR5cGVzKTsKIAkJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gcmVjZWl2ZXJUeXBlLmdldEV4YWN0Q29uc3RydWN0b3IoYXJndW1lbnRUeXBlcyk7Ci0JCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpCisJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIHsKIAkJCWlmIChtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KGludm9jYXRpb25TaXRlLCB0aGlzKSkKIAkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKLQorCQl9CiAJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0KIAkJCXJlY2VpdmVyVHlwZS5nZXRNZXRob2RzKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSk7Ci0JCWlmIChtZXRob2RzID09IE5vTWV0aG9kcykKKwkJaWYgKG1ldGhvZHMgPT0gTm9NZXRob2RzKSB7CiAJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAogCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwKIAkJCQlhcmd1bWVudFR5cGVzLAogCQkJCU5vdEZvdW5kKTsKLQorCQl9CiAJCU1ldGhvZEJpbmRpbmdbXSBjb21wYXRpYmxlID0gbmV3IE1ldGhvZEJpbmRpbmdbbWV0aG9kcy5sZW5ndGhdOwogCQlpbnQgY29tcGF0aWJsZUluZGV4ID0gMDsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCkBAIC05NTcsOCArODE2LDkgQEAKIAkJCXJldHVybiB2aXNpYmxlWzBdOwogCQlpZiAodmlzaWJsZUluZGV4ID09IDApCiAJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCWNvbXBhdGlibGVbMF0sCiAJCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5Db25zdGFudFBvb2xOYW1lLAotCQkJCWFyZ3VtZW50VHlwZXMsCisJCQkJY29tcGF0aWJsZVswXS5wYXJhbWV0ZXJzLAogCQkJCU5vdFZpc2libGUpOwogCQlyZXR1cm4gbW9zdFNwZWNpZmljQ2xhc3NNZXRob2RCaW5kaW5nKHZpc2libGUsIHZpc2libGVJbmRleCk7CiAJfQpAQCAtOTY3LDkgKzgyNyw5IEBACiAJICogVGhpcyByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50IHRoYXQgbWFwcyB0byBhbiBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhlIHN1aXRhYmxlIHR5cGUsCiAJICogCWlmIG5vdCBmb3VuZCB0aGVuIGFuc3dlcnMgbmlsIC0tIGRvIG5vdCBjcmVhdGUgb25lCiAgICAgICoJCi0JICoJCQkjaW1wbGljaXRUaGlzCQkgIAkgCQkJCQkJOiAgdGhlIGltcGxpY2l0IHRoaXMgd2lsbCBiZSBvawotCSAqCQkJIygoYXJnKSB0aGlzJG4pCQkJCQkJCQk6IGF2YWlsYWJsZSBhcyBhIGNvbnN0cnVjdG9yIGFyZwotCSAqIAkJIygoYXJnKSB0aGlzJG4gLi4uIHRoaXMkcCkgCQkJCTogYXZhaWxhYmxlIGFzIGFzIGEgY29uc3RydWN0b3IgYXJnICsgYSBzZXF1ZW5jZSBvZiBmaWVsZHMKKwkgKgkJI2ltcGxpY2l0VGhpcwkJICAJIAkJCTogdGhlIGltcGxpY2l0IHRoaXMgd2lsbCBiZSBvaworCSAqCQkjKChhcmcpIHRoaXMkbikJCQkJCQk6IGF2YWlsYWJsZSBhcyBhIGNvbnN0cnVjdG9yIGFyZworCSAqIAkJIygoYXJnKSB0aGlzJG4gLi4uIHRoaXMkcCkgCQkJOiBhdmFpbGFibGUgYXMgYXMgYSBjb25zdHJ1Y3RvciBhcmcgKyBhIHNlcXVlbmNlIG9mIGZpZWxkcwogCSAqIAkJIygoZmllbGREZXNjcikgdGhpcyRuIC4uLiB0aGlzJHApIAk6IGF2YWlsYWJsZSBhcyBhIHNlcXVlbmNlIG9mIGZpZWxkcwogCSAqIAkJbmlsIAkJIAkJCQkJCQkJCQkJOiBub3QgZm91bmQKIAkgKgpAQCAtMTAxMiw4MCArODcyLDEwOCBAQAogCSAqIFRoaXMgcmV0cmlldmVzIHRoZSBhcmd1bWVudCB0aGF0IG1hcHMgdG8gYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHRoZSBzdWl0YWJsZSB0eXBlLAogCSAqIAlpZiBub3QgZm91bmQgdGhlbiBhbnN3ZXJzIG5pbCAtLSBkbyBub3QgY3JlYXRlIG9uZQogCSAqCi0JICoJCSNpbXBsaWNpdFRoaXMJCQkJCQkJCTogIHRoZSBpbXBsaWNpdCB0aGlzIHdpbGwgYmUgb2sKKwkgKgkJI2ltcGxpY2l0VGhpcwkJICAJIAkJCQkJOiAgdGhlIGltcGxpY2l0IHRoaXMgd2lsbCBiZSBvawogCSAqCQkjKChhcmcpIHRoaXMkbikJCQkJCQkJCTogYXZhaWxhYmxlIGFzIGEgY29uc3RydWN0b3IgYXJnCiAJICogCQkjKChhcmcpIHRoaXMkbiBhY2Nlc3MkbS4uLiBhY2Nlc3MkcCkgCQk6IGF2YWlsYWJsZSBhcyBhcyBhIGNvbnN0cnVjdG9yIGFyZyArIGEgc2VxdWVuY2Ugb2Ygc3ludGhldGljIGFjY2Vzc29ycyB0byBzeW50aGV0aWMgZmllbGRzCiAJICogCQkjKChmaWVsZERlc2NyKSB0aGlzJG4gYWNjZXNzI20uLi4gYWNjZXNzJHApCTogYXZhaWxhYmxlIGFzIGEgZmlyc3Qgc3ludGhldGljIGZpZWxkICsgYSBzZXF1ZW5jZSBvZiBzeW50aGV0aWMgYWNjZXNzb3JzIHRvIHN5bnRoZXRpYyBmaWVsZHMKLQkgKiAJCW5pbCAJCSAJCQkJCQkJCTogbm90IGZvdW5kCi0JICoKLQkgKglFWEFDVCBNQVRDSCBWRVJTSU9OIC0gbm8gdHlwZSBjb21wYXRpYmlsaXR5IGlzIHBlcmZvcm1lZAorCSAqIAkJbmlsIAkJIAkJCQkJCQkJCQkJCQkJOiBub3QgZm91bmQKKwkgKglqbHMgMTUuOS4yCiAJICovCi0JcHVibGljIE9iamVjdFtdIGdldEV4YWN0RW11bGF0aW9uUGF0aChSZWZlcmVuY2VCaW5kaW5nIHRhcmdldEVuY2xvc2luZ1R5cGUpIHsKLQorCXB1YmxpYyBPYmplY3RbXSBnZXRFbXVsYXRpb25QYXRoKAorCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlLCAKKwkJCWJvb2xlYW4gb25seUV4YWN0TWF0Y2gsCisJCQlib29sZWFuIGlnbm9yZUVuY2xvc2luZ0FyZ0luQ29uc3RydWN0b3JDYWxsKSB7CisJCS8vVE9ETzogKHBoaWxpcHBlKSBpbnZlc3RpZ2F0ZSB3aHkgZXhhY3RseSB0ZXN0NzYgZmFpbHMgaWYgaWdub3JlRW5jbG9zaW5nQXJnSW5Db25zdHJ1Y3RvckNhbGwgaXMgYWx3YXlzIGZhbHNlCiAJCU1ldGhvZFNjb3BlIGN1cnJlbnRNZXRob2RTY29wZSA9IHRoaXMubWV0aG9kU2NvcGUoKTsKIAkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IGN1cnJlbnRNZXRob2RTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7CiAKIAkJLy8gaWRlbnRpdHkgY2hlY2sKIAkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMgCi0JCQkmJiAhY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsCi0JCQkmJiAoc291cmNlVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlKSkgeworCQkJJiYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwgfHwgaWdub3JlRW5jbG9zaW5nQXJnSW5Db25zdHJ1Y3RvckNhbGwpCisJCQkmJiAoc291cmNlVHlwZSA9PSB0YXJnZXRFbmNsb3NpbmdUeXBlCisJCQkJfHwgKCFvbmx5RXhhY3RNYXRjaCAmJiB0YXJnZXRFbmNsb3NpbmdUeXBlLmlzU3VwZXJjbGFzc09mKHNvdXJjZVR5cGUpKSkpIHsKKwkJCWlmIChjdXJyZW50TWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCQlyZXR1cm4gTm9FbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsOworCQkJfQorCQkJaWYgKGN1cnJlbnRNZXRob2RTY29wZS5pc1N0YXRpYyl7CisJCQkJcmV0dXJuIE5vRW5jbG9zaW5nSW5zdGFuY2VJblN0YXRpY0NvbnRleHQ7CisJCQl9CiAJCQlyZXR1cm4gRW11bGF0aW9uUGF0aFRvSW1wbGljaXRUaGlzOyAvLyBpbXBsaWNpdCB0aGlzIGlzIGdvb2QgZW5vdWdoCiAJCX0KLQkJaWYgKCFzb3VyY2VUeXBlLmlzTmVzdGVkVHlwZSgpCi0JCQl8fCBzb3VyY2VUeXBlLmlzU3RhdGljKCkpIHsgLy8gbm8gZW11bGF0aW9uIGZyb20gd2l0aGluIG5vbi1pbm5lciB0eXBlcworCQlpZiAoIXNvdXJjZVR5cGUuaXNOZXN0ZWRUeXBlKCkgfHwgc291cmNlVHlwZS5pc1N0YXRpYygpKSB7IC8vIG5vIGVtdWxhdGlvbiBmcm9tIHdpdGhpbiBub24taW5uZXIgdHlwZXMKKwkJCWlmIChjdXJyZW50TWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpIHsKKwkJCQlyZXR1cm4gTm9FbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsOworCQkJfQorCQkJCWlmIChjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpeworCQkJCQlyZXR1cm4gTm9FbmNsb3NpbmdJbnN0YW5jZUluU3RhdGljQ29udGV4dDsKKwkJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCi0JCWJvb2xlYW4gaW5zaWRlQ29uc3RydWN0b3IgPQotCQkJY3VycmVudE1ldGhvZFNjb3BlLmlzSW5zaWRlSW5pdGlhbGl6ZXJPckNvbnN0cnVjdG9yKCk7CisJCWJvb2xlYW4gaW5zaWRlQ29uc3RydWN0b3IgPSBjdXJyZW50TWV0aG9kU2NvcGUuaXNJbnNpZGVJbml0aWFsaXplck9yQ29uc3RydWN0b3IoKTsKIAkJLy8gdXNlIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaWYgcG9zc2libGUKIAkJaWYgKGluc2lkZUNvbnN0cnVjdG9yKSB7CiAJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhldGljQXJnOwotCQkJaWYgKChzeW50aGV0aWNBcmcgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlLCB0aGlzLCB0cnVlKSkgIT0gbnVsbCkgeworCQkJaWYgKChzeW50aGV0aWNBcmcgPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCh0YXJnZXRFbmNsb3NpbmdUeXBlLCBvbmx5RXhhY3RNYXRjaCkpICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgc3ludGhldGljQXJnIH07CiAJCQl9CiAJCX0KKwogCQkvLyB1c2UgYSBkaXJlY3Qgc3ludGhldGljIGZpZWxkIHRoZW4KLQkJaWYgKCFjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKLQkJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZDsKLQkJCWlmICgoc3ludGhldGljRmllbGQgPSBzb3VyY2VUeXBlLmdldFN5bnRoZXRpY0ZpZWxkKHRhcmdldEVuY2xvc2luZ1R5cGUsIHRoaXMsIHRydWUpKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHN5bnRoZXRpY0ZpZWxkIH07CisJCWlmIChjdXJyZW50TWV0aG9kU2NvcGUuaXNTdGF0aWMpIHsKKwkJCXJldHVybiBOb0VuY2xvc2luZ0luc3RhbmNlSW5TdGF0aWNDb250ZXh0OworCQl9CisJCUZpZWxkQmluZGluZyBzeW50aGV0aWNGaWVsZCA9IHNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQodGFyZ2V0RW5jbG9zaW5nVHlwZSwgb25seUV4YWN0TWF0Y2gpOworCQlpZiAoc3ludGhldGljRmllbGQgIT0gbnVsbCkgeworCQkJaWYgKGN1cnJlbnRNZXRob2RTY29wZS5pc0NvbnN0cnVjdG9yQ2FsbCl7CisJCQkJcmV0dXJuIE5vRW5jbG9zaW5nSW5zdGFuY2VJbkNvbnN0cnVjdG9yQ2FsbDsKIAkJCX0KLQkJCS8vIGNvdWxkIGJlIHJlYWNoZWQgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIGVuY2xvc2luZyBpbnN0YW5jZSBsaW5rIChuZXN0ZWQgbWVtYmVycykKLQkJCU9iamVjdFtdIHBhdGggPSBuZXcgT2JqZWN0WzJdOyAvLyBwcm9iYWJseSBhdCBsZWFzdCAyIG9mIHRoZW0KLQkJCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSBzb3VyY2VUeXBlLmVuY2xvc2luZ1R5cGUoKTsKLQkJCWlmIChpbnNpZGVDb25zdHJ1Y3RvcikgewotCQkJCXBhdGhbMF0gPQotCQkJCQkoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlLAl0aGlzLCB0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aFswXSA9Ci0JCQkJCXNvdXJjZVR5cGUuZ2V0U3ludGhldGljRmllbGQoKFNvdXJjZVR5cGVCaW5kaW5nKSBjdXJyZW50VHlwZSwgdGhpcywgdHJ1ZSk7CisJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgc3ludGhldGljRmllbGQgfTsKKwkJfQorCQkvLyBjb3VsZCBiZSByZWFjaGVkIHRocm91Z2ggYSBzZXF1ZW5jZSBvZiBlbmNsb3NpbmcgaW5zdGFuY2UgbGluayAobmVzdGVkIG1lbWJlcnMpCisJCU9iamVjdFtdIHBhdGggPSBuZXcgT2JqZWN0WzJdOyAvLyBwcm9iYWJseSBhdCBsZWFzdCAyIG9mIHRoZW0KKwkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IHNvdXJjZVR5cGUuZW5jbG9zaW5nVHlwZSgpOworCQlpZiAoaW5zaWRlQ29uc3RydWN0b3IpIHsKKwkJCXBhdGhbMF0gPSAoKE5lc3RlZFR5cGVCaW5kaW5nKSBzb3VyY2VUeXBlKS5nZXRTeW50aGV0aWNBcmd1bWVudCgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlLCBvbmx5RXhhY3RNYXRjaCk7CisJCX0gZWxzZSB7CisJCQlpZiAoY3VycmVudE1ldGhvZFNjb3BlLmlzQ29uc3RydWN0b3JDYWxsKXsKKwkJCQlyZXR1cm4gTm9FbmNsb3NpbmdJbnN0YW5jZUluQ29uc3RydWN0b3JDYWxsOwogCQkJfQotCQkJaWYgKHBhdGhbMF0gIT0gbnVsbCkgeyAvLyBrZWVwIGFjY3VtdWxhdGluZwotCQkJCWludCBjb3VudCA9IDE7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RW5jbG9zaW5nVHlwZTsKLQkJCQl3aGlsZSAoKGN1cnJlbnRFbmNsb3NpbmdUeXBlID0gY3VycmVudFR5cGUuZW5jbG9zaW5nVHlwZSgpKSAhPSBudWxsKSB7Ci0JCQkJCS8vZG9uZT8KLQkJCQkJaWYgKGN1cnJlbnRUeXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCi0JCQkJCQlicmVhazsKLQkJCQkJc3ludGhldGljRmllbGQgPQotCQkJCQkJKChOZXN0ZWRUeXBlQmluZGluZykgY3VycmVudFR5cGUpLmdldFN5bnRoZXRpY0ZpZWxkKAotCQkJCQkJCShTb3VyY2VUeXBlQmluZGluZykgY3VycmVudEVuY2xvc2luZ1R5cGUsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0cnVlKTsKLQkJCQkJaWYgKHN5bnRoZXRpY0ZpZWxkID09IG51bGwpCi0JCQkJCQlicmVhazsKLQkJCQkJLy8gYXBwZW5kIGluc2lkZSB0aGUgcGF0aAotCQkJCQlpZiAoY291bnQgPT0gcGF0aC5sZW5ndGgpIHsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocGF0aCwgMCwgKHBhdGggPSBuZXcgT2JqZWN0W2NvdW50ICsgMV0pLCAwLCBjb3VudCk7CisJCQlwYXRoWzBdID0gc291cmNlVHlwZS5nZXRTeW50aGV0aWNGaWVsZCgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlLCBvbmx5RXhhY3RNYXRjaCk7CisJCX0KKwkJaWYgKHBhdGhbMF0gIT0gbnVsbCkgeyAvLyBrZWVwIGFjY3VtdWxhdGluZworCQkJCisJCQlpbnQgY291bnQgPSAxOworCQkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50RW5jbG9zaW5nVHlwZTsKKwkJCXdoaWxlICgoY3VycmVudEVuY2xvc2luZ1R5cGUgPSBjdXJyZW50VHlwZS5lbmNsb3NpbmdUeXBlKCkpICE9IG51bGwpIHsKKworCQkJCS8vZG9uZT8KKwkJCQlpZiAoY3VycmVudFR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZQorCQkJCQl8fCAoIW9ubHlFeGFjdE1hdGNoICYmIHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoY3VycmVudFR5cGUpKSkJYnJlYWs7CisKKwkJCQlpZiAoY3VycmVudE1ldGhvZFNjb3BlICE9IG51bGwpIHsKKwkJCQkJY3VycmVudE1ldGhvZFNjb3BlID0gY3VycmVudE1ldGhvZFNjb3BlLmVuY2xvc2luZ01ldGhvZFNjb3BlKCk7CisJCQkJCWlmIChjdXJyZW50TWV0aG9kU2NvcGUgIT0gbnVsbCAmJiBjdXJyZW50TWV0aG9kU2NvcGUuaXNDb25zdHJ1Y3RvckNhbGwpeworCQkJCQkJcmV0dXJuIE5vRW5jbG9zaW5nSW5zdGFuY2VJbkNvbnN0cnVjdG9yQ2FsbDsKIAkJCQkJfQotCQkJCQkvLyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIHN5bnRoZXRpYyBmaWVsZCBpcyBwcml2YXRlCi0JCQkJCXBhdGhbY291bnQrK10gPSAoKFNvdXJjZVR5cGVCaW5kaW5nKSBzeW50aGV0aWNGaWVsZC5kZWNsYXJpbmdDbGFzcykuYWRkU3ludGhldGljTWV0aG9kKHN5bnRoZXRpY0ZpZWxkLCB0cnVlKTsKLQkJCQkJY3VycmVudFR5cGUgPSBjdXJyZW50RW5jbG9zaW5nVHlwZTsKKwkJCQkJaWYgKGN1cnJlbnRNZXRob2RTY29wZSAhPSBudWxsICYmIGN1cnJlbnRNZXRob2RTY29wZS5pc1N0YXRpYyl7CisJCQkJCQlyZXR1cm4gTm9FbmNsb3NpbmdJbnN0YW5jZUluU3RhdGljQ29udGV4dDsKKwkJCQkJfQogCQkJCX0KLQkJCQlpZiAoY3VycmVudFR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSkgewotCQkJCQlyZXR1cm4gcGF0aDsKKwkJCQkKKwkJCQlzeW50aGV0aWNGaWVsZCA9ICgoTmVzdGVkVHlwZUJpbmRpbmcpIGN1cnJlbnRUeXBlKS5nZXRTeW50aGV0aWNGaWVsZCgoU291cmNlVHlwZUJpbmRpbmcpIGN1cnJlbnRFbmNsb3NpbmdUeXBlLCBvbmx5RXhhY3RNYXRjaCk7CisJCQkJaWYgKHN5bnRoZXRpY0ZpZWxkID09IG51bGwpIGJyZWFrOworCisJCQkJLy8gYXBwZW5kIGluc2lkZSB0aGUgcGF0aAorCQkJCWlmIChjb3VudCA9PSBwYXRoLmxlbmd0aCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhdGgsIDAsIChwYXRoID0gbmV3IE9iamVjdFtjb3VudCArIDFdKSwgMCwgY291bnQpOwogCQkJCX0KKwkJCQkvLyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIHN5bnRoZXRpYyBmaWVsZCBpcyBwcml2YXRlCisJCQkJcGF0aFtjb3VudCsrXSA9ICgoU291cmNlVHlwZUJpbmRpbmcpIHN5bnRoZXRpY0ZpZWxkLmRlY2xhcmluZ0NsYXNzKS5hZGRTeW50aGV0aWNNZXRob2Qoc3ludGhldGljRmllbGQsIHRydWUpOworCQkJCWN1cnJlbnRUeXBlID0gY3VycmVudEVuY2xvc2luZ1R5cGU7CisJCQl9CisJCQlpZiAoY3VycmVudFR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZQorCQkJCXx8ICghb25seUV4YWN0TWF0Y2ggJiYgdGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZihjdXJyZW50VHlwZSkpKSB7CisJCQkJcmV0dXJuIHBhdGg7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CkBAIC0xMjAyLDE1ICsxMDkwLDE1IEBACiAJCQkJCQkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhtZXRob2RCaW5kaW5nLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgTm90Rm91bmQpOwogCQkJCQkJCQkJfQogCQkJCQkJCQkJLy8gbWFrZSB0aGUgdXNlciBxdWFsaWZ5IHRoZSBtZXRob2QsIGxpa2VseSB3YW50cyB0aGUgZmlyc3QgaW5oZXJpdGVkIG1ldGhvZCAoamF2YWMgZ2VuZXJhdGVzIGFuIGFtYmlndW91cyBlcnJvciBpbnN0ZWFkKQotCQkJCQkJCQkJZnV6enlQcm9ibGVtID0gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKKwkJCQkJCQkJCWZ1enp5UHJvYmxlbSA9IG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lKTsKIAogCQkJCQkJCQl9IGVsc2UgaWYgKCFtZXRob2RCaW5kaW5nLmNhbkJlU2VlbkJ5KHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIGNsYXNzU2NvcGUpKSB7CiAJCQkJCQkJCQkvLyB1c2luZyA8Y2xhc3NTY29wZT4gaW5zdGVhZCBvZiA8dGhpcz4gZm9yIHZpc2liaWxpdHkgY2hlY2sgZG9lcyBncmFudCBhbGwgYWNjZXNzIHRvIGlubmVyY2xhc3MKIAkJCQkJCQkJCWZ1enp5UHJvYmxlbSA9CiAJCQkJCQkJCQkJbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCQkJCQkJCQltZXRob2RCaW5kaW5nLAogCQkJCQkJCQkJCQlzZWxlY3RvciwKLQkJCQkJCQkJCQkJYXJndW1lbnRUeXBlcywKLQkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJCQkJCQkJbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAogCQkJCQkJCQkJCQlOb3RWaXNpYmxlKTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KQEAgLTEzMjcsOCArMTIxNSw3IEBACiAKIAkJUmVmZXJlbmNlQmluZGluZyBjdXJyZW50VHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSByZWNlaXZlclR5cGU7CiAJCWlmICghY3VycmVudFR5cGUuY2FuQmVTZWVuQnkodGhpcykpCi0JCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCBOb3RWaXNpYmxlKTsKLQkJLy8gKioqIE5lZWQgYSBuZXcgcHJvYmxlbSBpZCAtIFR5cGVOb3RWaXNpYmxlPworCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSk7CiAKIAkJLy8gcmV0cmlldmUgYW4gZXhhY3QgdmlzaWJsZSBtYXRjaCAoaWYgcG9zc2libGUpCiAJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9CkBAIC0xMzUwLDkgKzEyMzcsOSBAQAogCQkJCQlOb3RGb3VuZCk7CiAJCQlpZiAoIW1ldGhvZEJpbmRpbmcuY2FuQmVTZWVuQnkoY3VycmVudFR5cGUsIGludm9jYXRpb25TaXRlLCB0aGlzKSkKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKAorCQkJCQltZXRob2RCaW5kaW5nLAogCQkJCQlzZWxlY3RvciwKLQkJCQkJYXJndW1lbnRUeXBlcywKLQkJCQkJbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywKKwkJCQkJbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLAogCQkJCQlOb3RWaXNpYmxlKTsKIAkJfQogCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKQEAgLTEzODQsMjUgKzEyNzEsMTAgQEAKIAkgKiBDb2RlIHJlc3BvbnNpYmxlIHRvIHJlcXVlc3Qgc29tZSBtb3JlIGVtdWxhdGlvbiB3b3JrIGluc2lkZSB0aGUgaW52b2NhdGlvbiB0eXBlLCBzbyBhcyB0byBzdXBwbHkKIAkgKiBjb3JyZWN0IHN5bnRoZXRpYyBhcmd1bWVudHMgdG8gYW55IGFsbG9jYXRpb24gb2YgdGhlIHRhcmdldCB0eXBlLgogCSAqLwotCXB1YmxpYyB2b2lkIHByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKAotCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUsCi0JCWJvb2xlYW4gaXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkLAotCQlib29sZWFuIHVzZURpcmVjdFJlZmVyZW5jZSkgeworCXB1YmxpYyB2b2lkIHByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSwgYm9vbGVhbiBpc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpIHsKIAotCQkvLyBwZXJmb3JtIHNvbWUgZW11bGF0aW9uIHdvcmsgaW4gY2FzZSB0aGVyZSBpcyBzb21lIGFuZCB3ZSBhcmUgaW5zaWRlIGEgbG9jYWwgdHlwZSBvbmx5Ci0JCS8vIHByb3BhZ2UgZW11bGF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgaW5zdGFuY2VzCi0JCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzOwotCQlpZiAoKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXMgPSB0YXJnZXRUeXBlLnN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVHlwZXMoKSkKLQkJCSE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJUmVmZXJlbmNlQmluZGluZyBzeW50aGV0aWNBcmdUeXBlID0gc3ludGhldGljQXJndW1lbnRUeXBlc1tpXTsKLQkJCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgdGhlIG9uZSB0aGF0IGNvdWxkIG1hdGNoIGEgc3VwcGxpZWQgZW5jbG9zaW5nIGluc3RhbmNlCi0JCQkJaWYgKCEoaXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkCi0JCQkJCSYmIChzeW50aGV0aWNBcmdUeXBlID09IHRhcmdldFR5cGUuZW5jbG9zaW5nVHlwZSgpKSkpIHsKLQkJCQkJdGhpcy5lbXVsYXRlT3V0ZXJBY2Nlc3Moc3ludGhldGljQXJnVHlwZSwgdXNlRGlyZWN0UmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJLy8gbm8gbmVlZCB0byBwcm9wYWdhdGUgZW5jbG9zaW5nIGluc3RhbmNlcywgdGhleSBnb3QgZWFnZXJseSBhbGxvY2F0ZWQgYWxyZWFkeS4KKwkJCiAJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0FyZ3VtZW50czsKIAkJaWYgKChzeW50aGV0aWNBcmd1bWVudHMgPSB0YXJnZXRUeXBlLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKSkgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewpAQCAtMTQ0Miw0ICsxMzE0LDQgQEAKIAkJCQlzICs9ICgoQmxvY2tTY29wZSkgc3Vic2NvcGVzW2ldKS50b1N0cmluZyh0YWIgKyAxKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIHM7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ2xhc3NTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKaW5kZXggY2QyNjhlZS4uNjY1ZDM1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9DbGFzc1Njb3BlLmphdmEKQEAgLTEsMTUgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DbGluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwpAQCAtMTcsNyArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OwogCiBwdWJsaWMgY2xhc3MgQ2xhc3NTY29wZSBleHRlbmRzIFNjb3BlIHsKQEAgLTQ2OSw2ICs0NjksOSBAQAogCQkJCWZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzcywKIAkJCQlmaWVsZERlY2wpOwogCisJCWlmIChmaWVsZERlY2wuaW5pdGlhbGl6YXRpb24gPT0gbnVsbCAmJiAobW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDApIHsKKwkJCW1vZGlmaWVycyB8PSBBY2NCbGFua0ZpbmFsOworCQl9CiAJCWZpZWxkQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CiAJfQogCQpAQCAtNTY1LDEyICs1NjgsMTYgQEAKIAkqLwogCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0U3VwZXJjbGFzcygpIHsKIAkJU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IHJlZmVyZW5jZUNvbnRleHQuYmluZGluZzsKKwkJaWYgKGlzSmF2YUxhbmdPYmplY3Qoc291cmNlVHlwZSkpIHsgLy8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlZGVmaW5pbmcgamF2YS5sYW5nLk9iamVjdCB1cCBmcm9udAorCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gbnVsbDsKKwkJCXNvdXJjZVR5cGUuc3VwZXJJbnRlcmZhY2VzID0gTm9TdXBlckludGVyZmFjZXM7CisJCQlpZiAocmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzICE9IG51bGwgfHwgcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMgIT0gbnVsbCkKKwkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5vYmplY3RDYW5ub3RIYXZlU3VwZXJUeXBlcyhzb3VyY2VUeXBlKTsKKwkJCXJldHVybiB0cnVlOyAvLyBkbyBub3QgcHJvcGFnYXRlIE9iamVjdCdzIGhpZXJhcmNoeSBwcm9ibGVtcyBkb3duIHRvIGV2ZXJ5IHN1YnR5cGUKKwkJfQogCQlpZiAocmVmZXJlbmNlQ29udGV4dC5zdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCWlmIChpc0phdmFMYW5nT2JqZWN0KHNvdXJjZVR5cGUpKQotCQkJCXJldHVybiB0cnVlOwogCQkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKIAkJCXJldHVybiAhZGV0ZWN0Q3ljbGUoc291cmNlVHlwZSwgc291cmNlVHlwZS5zdXBlcmNsYXNzLCBudWxsKTsKLQkJCS8vIGVuc3VyZSBPYmplY3QgaXMgaW5pdGlhbGl6ZWQgaWYgaXQgY29tZXMgZnJvbSBhIHNvdXJjZSBmaWxlCiAJCX0KIAkJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gZmluZFN1cGVydHlwZShyZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MpOwogCQlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7IC8vIGlzIG51bGwgaWYgYSBjeWNsZSB3YXMgZGV0ZWN0ZWQgY3ljbGUKQEAgLTU4MCwyNSArNTg3LDE3IEBACiAJCQkJcHJvYmxlbVJlcG9ydGVyKCkuc3VwZXJjbGFzc011c3RCZUFDbGFzcyhzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MsIHN1cGVyY2xhc3MpOwogCQkJfSBlbHNlIGlmIChzdXBlcmNsYXNzLmlzRmluYWwoKSkgewogCQkJCXByb2JsZW1SZXBvcnRlcigpLmNsYXNzRXh0ZW5kRmluYWxDbGFzcyhzb3VyY2VUeXBlLCByZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MsIHN1cGVyY2xhc3MpOwotCQkJfSBlbHNlIGlmIChpc0phdmFMYW5nT2JqZWN0KHNvdXJjZVR5cGUpKSB7Ci0JCQkJLy8gY2FuIG9ubHkgaGFwcGVuIGlmIE9iamVjdCBleHRlbmRzIGFub3RoZXIgdHlwZS4uLiB3aWxsIG5ldmVyIGhhcHBlbiB1bmxlc3Mgd2UncmUgdGVzdGluZyBmb3IgaXQuCi0JCQkJc291cmNlVHlwZS50YWdCaXRzIHw9IEhpZXJhcmNoeUhhc1Byb2JsZW1zOwotCQkJCXNvdXJjZVR5cGUuc3VwZXJjbGFzcyA9IG51bGw7Ci0JCQkJcmV0dXJuIHRydWU7CiAJCQl9IGVsc2UgewogCQkJCS8vIG9ubHkgd2FudCB0byByZWFjaCBoZXJlIHdoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAotCQkJCXJlZmVyZW5jZUNvbnRleHQuc3VwZXJjbGFzcy5iaW5kaW5nID0gc3VwZXJjbGFzczsKKwkJCQlyZWZlcmVuY2VDb250ZXh0LnN1cGVyY2xhc3MucmVzb2x2ZWRUeXBlID0gc3VwZXJjbGFzczsKIAkJCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQl9CiAJCXNvdXJjZVR5cGUudGFnQml0cyB8PSBIaWVyYXJjaHlIYXNQcm9ibGVtczsKLQkJaWYgKCFpc0phdmFMYW5nT2JqZWN0KHNvdXJjZVR5cGUpKSB7Ci0JCQlzb3VyY2VUeXBlLnN1cGVyY2xhc3MgPSBnZXRKYXZhTGFuZ09iamVjdCgpOwotCQkJaWYgKChzb3VyY2VUeXBlLnN1cGVyY2xhc3MudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApCi0JCQkJZGV0ZWN0Q3ljbGUoc291cmNlVHlwZSwgc291cmNlVHlwZS5zdXBlcmNsYXNzLCBudWxsKTsKLQkJCS8vIGVuc3VyZSBPYmplY3QgaXMgaW5pdGlhbGl6ZWQgaWYgaXQgY29tZXMgZnJvbSBhIHNvdXJjZSBmaWxlCi0JCX0KKwkJc291cmNlVHlwZS5zdXBlcmNsYXNzID0gZ2V0SmF2YUxhbmdPYmplY3QoKTsKKwkJaWYgKChzb3VyY2VUeXBlLnN1cGVyY2xhc3MudGFnQml0cyAmIEJlZ2luSGllcmFyY2h5Q2hlY2spID09IDApCisJCQlkZXRlY3RDeWNsZShzb3VyY2VUeXBlLCBzb3VyY2VUeXBlLnN1cGVyY2xhc3MsIG51bGwpOwogCQlyZXR1cm4gZmFsc2U7IC8vIHJlcG9ydGVkIHNvbWUgZXJyb3IgYWdhaW5zdCB0aGUgc291cmNlIHR5cGUKIAl9CiAKQEAgLTYxNyw2ICs2MTYsOCBAQAogCQlzb3VyY2VUeXBlLnN1cGVySW50ZXJmYWNlcyA9IE5vU3VwZXJJbnRlcmZhY2VzOwogCQlpZiAocmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXMgPT0gbnVsbCkKIAkJCXJldHVybiB0cnVlOworCQlpZiAoaXNKYXZhTGFuZ09iamVjdChzb3VyY2VUeXBlKSkgLy8gYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIG9mIHJlZGVmaW5pbmcgamF2YS5sYW5nLk9iamVjdAorCQkJcmV0dXJuIHRydWU7CiAKIAkJYm9vbGVhbiBub1Byb2JsZW1zID0gdHJ1ZTsKIAkJaW50IGxlbmd0aCA9IHJlZmVyZW5jZUNvbnRleHQuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKQEAgLTY1MSw3ICs2NTIsOCBAQAogCQkJCW5vUHJvYmxlbXMgPSBmYWxzZTsKIAkJCQljb250aW51ZSBuZXh0SW50ZXJmYWNlOwogCQkJfQotCQkJcmVmZXJlbmNlQ29udGV4dC5zdXBlckludGVyZmFjZXNbaV0uYmluZGluZyA9IHN1cGVySW50ZXJmYWNlOworCisJCQlyZWZlcmVuY2VDb250ZXh0LnN1cGVySW50ZXJmYWNlc1tpXS5yZXNvbHZlZFR5cGUgPSBzdXBlckludGVyZmFjZTsKIAkJCS8vIG9ubHkgd2FudCB0byByZWFjaCBoZXJlIHdoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAogCQkJaW50ZXJmYWNlQmluZGluZ3NbY291bnQrK10gPSBzdXBlckludGVyZmFjZTsKIAkJfQpAQCAtODcxLDQgKzg3Myw0IEBACiAJCWVsc2UKIAkJCXJldHVybiAiLS0tIENsYXNzIFNjb3BlIC0tLVxuXG4gQmluZGluZyBub3QgaW5pdGlhbGl6ZWQiIDsgLy8kTk9OLU5MUy0xJAogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGF0aW9uVW5pdFNjb3BlLmphdmEKaW5kZXggN2E1ODIyMC4uN2I2NjQzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxhdGlvblVuaXRTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsYXRpb25Vbml0U2NvcGUuamF2YQpAQCAtMSwyNyArMSwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNvbXBvdW5kTmFtZVZlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZlR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuT2JqZWN0VmVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlNpbXBsZU5hbWVWZWN0b3I7CiAKIHB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRTY29wZSBleHRlbmRzIFNjb3BlIHsKKwkKIAlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7CiAJcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHJlZmVyZW5jZUNvbnRleHQ7CiAJcHVibGljIGNoYXJbXVtdIGN1cnJlbnRQYWNrYWdlTmFtZTsKQEAgLTMzLDEzICszNCwxNSBAQAogCXByaXZhdGUgQ29tcG91bmROYW1lVmVjdG9yIHF1YWxpZmllZFJlZmVyZW5jZXM7CiAJcHJpdmF0ZSBTaW1wbGVOYW1lVmVjdG9yIHNpbXBsZU5hbWVSZWZlcmVuY2VzOwogCXByaXZhdGUgT2JqZWN0VmVjdG9yIHJlZmVyZW5jZWRUeXBlczsKKwkKKwlIYXNodGFibGVPZlR5cGUgY29uc3RhbnRQb29sTmFtZVVzYWdlOwogCiBwdWJsaWMgQ29tcGlsYXRpb25Vbml0U2NvcGUoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKIAlzdXBlcihDT01QSUxBVElPTl9VTklUX1NDT1BFLCBudWxsKTsKIAl0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7CiAJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdW5pdDsKIAl1bml0LnNjb3BlID0gdGhpczsKLQl0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSA9IHVuaXQuY3VycmVudFBhY2thZ2UgPT0gbnVsbCA/IE5vQ2hhckNoYXIgOiB1bml0LmN1cnJlbnRQYWNrYWdlLnRva2VuczsKKwl0aGlzLmN1cnJlbnRQYWNrYWdlTmFtZSA9IHVuaXQuY3VycmVudFBhY2thZ2UgPT0gbnVsbCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogdW5pdC5jdXJyZW50UGFja2FnZS50b2tlbnM7CiAKIAlpZiAoZW52aXJvbm1lbnQub3B0aW9ucy5wcm9kdWNlUmVmZXJlbmNlSW5mbykgewogCQl0aGlzLnF1YWxpZmllZFJlZmVyZW5jZXMgPSBuZXcgQ29tcG91bmROYW1lVmVjdG9yKCk7CkBAIC01OSwxMiArNjIsMTkgQEAKIAl0b3BMZXZlbFR5cGVzID0gbmV3IFNvdXJjZVR5cGVCaW5kaW5nWzBdOyAvLyB3YW50IGl0IGluaXRpYWxpemVkIGlmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSByZXNvbHZlZAogCWlmIChyZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7CiAJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSByZWZlcmVuY2VDb250ZXh0LmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlTmFtZSgpOwotCQlpZiAoZXhwZWN0ZWRQYWNrYWdlTmFtZSAhPSBudWxsICYmICFDaGFyT3BlcmF0aW9uLmVxdWFscyhjdXJyZW50UGFja2FnZU5hbWUsIGV4cGVjdGVkUGFja2FnZU5hbWUpKSB7Ci0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5wYWNrYWdlSXNOb3RFeHBlY3RlZFBhY2thZ2UocmVmZXJlbmNlQ29udGV4dCk7Ci0JCQljdXJyZW50UGFja2FnZU5hbWUgPSBleHBlY3RlZFBhY2thZ2VOYW1lLmxlbmd0aCA9PSAwID8gTm9DaGFyQ2hhciA6IGV4cGVjdGVkUGFja2FnZU5hbWU7CisJCWlmIChleHBlY3RlZFBhY2thZ2VOYW1lICE9IG51bGwgCisJCQkJJiYgIUNoYXJPcGVyYXRpb24uZXF1YWxzKGN1cnJlbnRQYWNrYWdlTmFtZSwgZXhwZWN0ZWRQYWNrYWdlTmFtZSkpIHsKKworCQkJLy8gb25seSByZXBvcnQgaWYgdGhlIHVuaXQgaXNuJ3Qgc3RydWN0dXJhbGx5IGVtcHR5CisJCQlpZiAocmVmZXJlbmNlQ29udGV4dC5jdXJyZW50UGFja2FnZSAhPSBudWxsIAorCQkJCQl8fCByZWZlcmVuY2VDb250ZXh0LnR5cGVzICE9IG51bGwgCisJCQkJCXx8IHJlZmVyZW5jZUNvbnRleHQuaW1wb3J0cyAhPSBudWxsKSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkucGFja2FnZUlzTm90RXhwZWN0ZWRQYWNrYWdlKHJlZmVyZW5jZUNvbnRleHQpOworCQkJfQorCQkJY3VycmVudFBhY2thZ2VOYW1lID0gZXhwZWN0ZWRQYWNrYWdlTmFtZS5sZW5ndGggPT0gMCA/IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIDogZXhwZWN0ZWRQYWNrYWdlTmFtZTsKIAkJfQogCX0KLQlpZiAoY3VycmVudFBhY2thZ2VOYW1lID09IE5vQ2hhckNoYXIpIHsKKwlpZiAoY3VycmVudFBhY2thZ2VOYW1lID09IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKSB7CiAJCWlmICgoZlBhY2thZ2UgPSBlbnZpcm9ubWVudC5kZWZhdWx0UGFja2FnZSkgPT0gbnVsbCkgewogCQkJcHJvYmxlbVJlcG9ydGVyKCkubXVzdFNwZWNpZnlQYWNrYWdlKHJlZmVyZW5jZUNvbnRleHQpOwogCQkJcmV0dXJuOwpAQCAtOTIsMTAgKzEwMiw3IEBACiAJCQlwcm9ibGVtUmVwb3J0ZXIoKS5kdXBsaWNhdGVUeXBlcyhyZWZlcmVuY2VDb250ZXh0LCB0eXBlRGVjbCk7CiAJCQljb250aW51ZSBuZXh0VHlwZTsKIAkJfQotCQlib29sZWFuIHBhY2thZ2VFeGlzdHMgPSBjdXJyZW50UGFja2FnZU5hbWUgPT0gTm9DaGFyQ2hhcgotCQkJPyBlbnZpcm9ubWVudC5nZXRUb3BMZXZlbFBhY2thZ2UodHlwZURlY2wubmFtZSkgIT0gbnVsbAotCQkJOiAoZlBhY2thZ2UuZ2V0UGFja2FnZSh0eXBlRGVjbC5uYW1lKSkgIT0gbnVsbDsKLQkJaWYgKHBhY2thZ2VFeGlzdHMpIHsKKwkJaWYgKGZQYWNrYWdlICE9IGVudmlyb25tZW50LmRlZmF1bHRQYWNrYWdlICYmIGZQYWNrYWdlLmdldFBhY2thZ2UodHlwZURlY2wubmFtZSkgIT0gbnVsbCkgewogCQkJLy8gaWYgYSBwYWNrYWdlIGV4aXN0cywgaXQgbXVzdCBiZSBhIHZhbGlkIHBhY2thZ2UgLSBjYW5ub3QgYmUgYSBOb3RGb3VuZCBwcm9ibGVtIHBhY2thZ2UKIAkJCXByb2JsZW1SZXBvcnRlcigpLnR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlKHJlZmVyZW5jZUNvbnRleHQsIHR5cGVEZWNsKTsKIAkJCWNvbnRpbnVlIG5leHRUeXBlOwpAQCAtMTExLDcgKzExOCwxMCBAQAogCQl9CiAKIAkJQ2xhc3NTY29wZSBjaGlsZCA9IG5ldyBDbGFzc1Njb3BlKHRoaXMsIHR5cGVEZWNsKTsKLQkJdG9wTGV2ZWxUeXBlc1tjb3VudCsrXSA9IGNoaWxkLmJ1aWxkVHlwZShudWxsLCBmUGFja2FnZSk7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGUgPSBjaGlsZC5idWlsZFR5cGUobnVsbCwgZlBhY2thZ2UpOworCQlpZih0eXBlICE9IG51bGwpIHsKKwkJCXRvcExldmVsVHlwZXNbY291bnQrK10gPSB0eXBlOworCQl9CiAJfQogCiAJLy8gc2hyaW5rIHRvcExldmVsVHlwZXMuLi4gb25seSBoYXBwZW5zIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZApAQCAtMTc4LDYgKzE4OCw2NSBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHJlc29sdmVkSW1wb3J0cywgMCwgcmVzb2x2ZWRJbXBvcnRzID0gbmV3IEltcG9ydEJpbmRpbmdbaW5kZXhdLCAwLCBpbmRleCk7CiAJaW1wb3J0cyA9IHJlc29sdmVkSW1wb3J0czsKIH0KKy8qCisgKiBJTlRFUk5BTCBVU0UtT05MWQorICogSW5uZXJjbGFzc2VzIGdldCB0aGVpciBuYW1lIGNvbXB1dGVkIGFzIHRoZXkgYXJlIGdlbmVyYXRlZCwgc2luY2Ugc29tZSBtYXkgbm90CisgKiBiZSBhY3R1YWxseSBvdXRwdXRlZCBpZiBzaXR0aW5nIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlLgorICovCitwdWJsaWMgY2hhcltdIGNvbXB1dGVDb25zdGFudFBvb2xOYW1lKExvY2FsVHlwZUJpbmRpbmcgbG9jYWxUeXBlKSB7CisJaWYgKGxvY2FsVHlwZS5jb25zdGFudFBvb2xOYW1lKCkgIT0gbnVsbCkgeworCQlyZXR1cm4gbG9jYWxUeXBlLmNvbnN0YW50UG9vbE5hbWUoKTsKKwl9CisJLy8gZGVsZWdhdGVzIHRvIHRoZSBvdXRlcm1vc3QgZW5jbG9zaW5nIGNsYXNzZmlsZSwgc2luY2UgaXQgaXMgdGhlIG9ubHkgb25lIHdpdGggYSBnbG9iYWwgdmlzaW9uIG9mIGl0cyBpbm5lcnR5cGVzLgorCisJaWYgKGNvbnN0YW50UG9vbE5hbWVVc2FnZSA9PSBudWxsKQorCQljb25zdGFudFBvb2xOYW1lVXNhZ2UgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKCk7CisKKwlSZWZlcmVuY2VCaW5kaW5nIG91dGVyTW9zdEVuY2xvc2luZ1R5cGUgPSBsb2NhbFR5cGUuc2NvcGUub3V0ZXJNb3N0Q2xhc3NTY29wZSgpLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKKwkKKwkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGxvY2FsIHR5cGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSB1c2VyCisJaW50IGluZGV4ID0gMDsKKwljaGFyW10gY2FuZGlkYXRlTmFtZTsKKwl3aGlsZSh0cnVlKSB7CisJCWlmIChsb2NhbFR5cGUuaXNNZW1iZXJUeXBlKCkpeworCQkJaWYgKGluZGV4ID09IDApeworCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJbG9jYWxUeXBlLmVuY2xvc2luZ1R5cGUoKS5jb25zdGFudFBvb2xOYW1lKCksCisJCQkJCWxvY2FsVHlwZS5zb3VyY2VOYW1lLAorCQkJCQknJCcpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBpbiBjYXNlIG9mIGNvbGxpc2lvbiwgdGhlbiBtZW1iZXIgbmFtZSBnZXRzIGV4dHJhICQxIGluc2VydGVkCisJCQkJLy8gZS5nLiBjbGFzcyBYIHsgeyBjbGFzcyBMe30gbmV3IFgoKXsgY2xhc3MgTHt9IH0gfSB9CisJCQkJY2FuZGlkYXRlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQlsb2NhbFR5cGUuZW5jbG9zaW5nVHlwZSgpLmNvbnN0YW50UG9vbE5hbWUoKSwKKwkJCQkJJyQnLAorCQkJCQlTdHJpbmcudmFsdWVPZihpbmRleCkudG9DaGFyQXJyYXkoKSwKKwkJCQkJJyQnLAorCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSk7CisJCQl9CisJCX0gZWxzZSBpZiAobG9jYWxUeXBlLmlzQW5vbnltb3VzVHlwZSgpKXsKKwkJCQljYW5kaWRhdGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCW91dGVyTW9zdEVuY2xvc2luZ1R5cGUuY29uc3RhbnRQb29sTmFtZSgpLAorCQkJCQlTdHJpbmcudmFsdWVPZihpbmRleCsxKS50b0NoYXJBcnJheSgpLAorCQkJCQknJCcpOworCQl9IGVsc2UgeworCQkJCWNhbmRpZGF0ZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJb3V0ZXJNb3N0RW5jbG9zaW5nVHlwZS5jb25zdGFudFBvb2xOYW1lKCksCisJCQkJCSckJywKKwkJCQkJU3RyaW5nLnZhbHVlT2YoaW5kZXgrMSkudG9DaGFyQXJyYXkoKSwKKwkJCQkJJyQnLAorCQkJCQlsb2NhbFR5cGUuc291cmNlTmFtZSk7CisJCX0JCQkJCQkKKwkJaWYgKGNvbnN0YW50UG9vbE5hbWVVc2FnZS5nZXQoY2FuZGlkYXRlTmFtZSkgIT0gbnVsbCkgeworCQkJaW5kZXggKys7CisJCX0gZWxzZSB7CisJCQljb25zdGFudFBvb2xOYW1lVXNhZ2UucHV0KGNhbmRpZGF0ZU5hbWUsIGxvY2FsVHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY2FuZGlkYXRlTmFtZTsKK30KKwogdm9pZCBjb25uZWN0VHlwZUhpZXJhcmNoeSgpIHsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKIAkJdG9wTGV2ZWxUeXBlc1tpXS5zY29wZS5jb25uZWN0VHlwZUhpZXJhcmNoeSgpOwpAQCAtMjE5LDEwICsyODgsMTIgQEAKIAkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRleDsgaisrKQogCQkJaWYgKHJlc29sdmVkSW1wb3J0c1tqXS5vbkRlbWFuZCA9PSBpbXBvcnRSZWZlcmVuY2Uub25EZW1hbmQpCiAJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGNvbXBvdW5kTmFtZSwgcmVzb2x2ZWRJbXBvcnRzW2pdLmNvbXBvdW5kTmFtZSkpIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkudW51c2VkSW1wb3J0KGltcG9ydFJlZmVyZW5jZSk7IC8vIHNpbmNlIHNraXBwZWQsIG11c3QgYmUgcmVwb3J0ZWQgbm93CiAJCQkJCWNvbnRpbnVlIG5leHRJbXBvcnQ7CiAJCQkJfQogCQlpZiAoaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kID09IHRydWUpCiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoY29tcG91bmROYW1lLCBjdXJyZW50UGFja2FnZU5hbWUpKSB7CisJCQkJcHJvYmxlbVJlcG9ydGVyKCkudW51c2VkSW1wb3J0KGltcG9ydFJlZmVyZW5jZSk7IC8vIHNpbmNlIHNraXBwZWQsIG11c3QgYmUgcmVwb3J0ZWQgbm93CiAJCQkJY29udGludWUgbmV4dEltcG9ydDsKIAkJCX0KIAkJaWYgKGltcG9ydFJlZmVyZW5jZS5vbkRlbWFuZCkgewpAQCAtMjQyLDYgKzMxMywxMiBAQAogCQkJCXByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEltcG9ydFBhY2thZ2UoaW1wb3J0UmVmZXJlbmNlKTsKIAkJCQljb250aW51ZSBuZXh0SW1wb3J0OwogCQkJfQorCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUmVmZXJlbmNlQmluZGluZykgeworCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IChSZWZlcmVuY2VCaW5kaW5nKSB0eXBlQmluZGluZzsKKwkJCQlpZiAoaW1wb3J0UmVmZXJlbmNlLmlzVHlwZVVzZURlcHJlY2F0ZWQocmVmZXJlbmNlQmluZGluZywgdGhpcykpIHsKKwkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZFR5cGUoKFR5cGVCaW5kaW5nKSB0eXBlQmluZGluZywgaW1wb3J0UmVmZXJlbmNlKTsKKwkJCQl9CisJCQl9CiAJCQlSZWZlcmVuY2VCaW5kaW5nIGV4aXN0aW5nVHlwZSA9IHR5cGVzQnlTaW1wbGVOYW1lcy5nZXQoY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSk7CiAJCQlpZiAoZXhpc3RpbmdUeXBlICE9IG51bGwpIHsKIAkJCQkvLyBkdXBsaWNhdGUgdGVzdCBhYm92ZSBzaG91bGQgaGF2ZSBjYXVnaHQgdGhpcyBjYXNlLCBidXQgbWFrZSBzdXJlCkBAIC0zMTUsMTEgKzM5MiwxNSBAQAogCX0KIAogCWZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKCF0eXBlLmNhbkJlU2VlbkJ5KGZQYWNrYWdlKSkgeworCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgaSksIHR5cGUsIE5vdFZpc2libGUpOwkJCisJCX0KIAkJLy8gZG9lcyBub3QgbG9vayBmb3IgaW5oZXJpdGVkIG1lbWJlciB0eXBlcyBvbiBwdXJwb3NlCi0JCWlmICgodHlwZSA9IHR5cGUuZ2V0TWVtYmVyVHlwZShjb21wb3VuZE5hbWVbaV0pKSA9PSBudWxsKQorCQlpZiAoKHR5cGUgPSB0eXBlLmdldE1lbWJlclR5cGUoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCkgewogCQkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZygKIAkJCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kTmFtZSwgMCwgaSArIDEpLAogCQkJCU5vdEZvdW5kKTsKKwkJfQogCX0KIAlpZiAoIXR5cGUuY2FuQmVTZWVuQnkoZlBhY2thZ2UpKQogCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKGNvbXBvdW5kTmFtZSwgdHlwZSwgTm90VmlzaWJsZSk7CkBAIC01MDUsNCArNTg2LDQgQEAKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKIAkJdG9wTGV2ZWxUeXBlc1tpXS52ZXJpZnlNZXRob2RzKHZlcmlmaWVyKTsKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGVyTW9kaWZpZXJzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0NvbXBpbGVyTW9kaWZpZXJzLmphdmEKaW5kZXggNDQwOGYwOS4uNzNlNzY1OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Db21waWxlck1vZGlmaWVycy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvQ29tcGlsZXJNb2RpZmllcnMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwpAQCAtMTYsMTcgKzE2LDIzIEBACiAJLy8gdGhvc2UgY29uc3RhbnRzIGFyZSBkZXBlbmRpbmcgdXBvbiBDbGFzc0ZpbGVDb25zdGFudHMgKHJlbHlpbmcgdGhhdCBjbGFzc2ZpbGVzIG9ubHkgdXNlIHRoZSAxNiBsb3dlciBiaXRzKQogCWZpbmFsIGludCBBY2NEZWZhdWx0ID0gMDsKIAlmaW5hbCBpbnQgQWNjSnVzdEZsYWcgPSAweEZGRkY7Ci0JZmluYWwgaW50IEFjY0NhdGNoZXNFeGNlcHRpb25zID0gMHgxMDAwMDsKLQlmaW5hbCBpbnQgQWNjVGhyb3dzRXhjZXB0aW9ucyA9IDB4MjAwMDA7Ci0JZmluYWwgaW50IEFjY1Byb2JsZW0gPSAweDQwMDAwOwotCWZpbmFsIGludCBBY2NGcm9tQ2xhc3NGaWxlID0gMHg4MDAwMDsKLQlmaW5hbCBpbnQgQWNjSXNDb25zdGFudFZhbHVlID0gMHg4MDAwMDsJCi0JZmluYWwgaW50IEFjY0RlZmF1bHRBYnN0cmFjdCA9IDB4ODAwMDA7Ci0JZmluYWwgaW50IEFjY0RlcHJlY2F0ZWRJbXBsaWNpdGx5ID0gMHgyMDAwMDA7IC8vIGllLiBpcyBkZXByZWNhdGVkIGl0c2VsZiBvciBjb250YWluZWQgYnkgYSBkZXByZWNhdGVkIHR5cGUKLQlmaW5hbCBpbnQgQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtID0gMHg0MDAwMDA7Ci0JZmluYWwgaW50IEFjY01vZGlmaWVyUHJvYmxlbSA9IDB4ODAwMDAwOwotCWZpbmFsIGludCBBY2NTZW1pY29sb25Cb2R5ID0gMHgxMDAwMDAwOwotCWZpbmFsIGludCBBY2NVbnJlc29sdmVkID0gMHgyMDAwMDAwOwotCWZpbmFsIGludCBBY2NDbGVhclByaXZhdGVNb2RpZmllciA9IDB4NDAwMDAwMDsgLy8gbWlnaHQgYmUgcmVxdWVzdGVkIGR1cmluZyBwcml2YXRlIGFjY2VzcyBlbXVsYXRpb24KKwlmaW5hbCBpbnQgQWNjQ2F0Y2hlc0V4Y2VwdGlvbnMgPSAweDEwMDAwOyAvLyBiaXQxNworCWZpbmFsIGludCBBY2NUaHJvd3NFeGNlcHRpb25zID0gMHgyMDAwMDsgLy8gYml0MTggLSBhbHNvIElDb25zdGFudHMuQWNjU3ludGhldGljCisJZmluYWwgaW50IEFjY1Byb2JsZW0gPSAweDQwMDAwOyAvLyBiaXQxOQorCWZpbmFsIGludCBBY2NGcm9tQ2xhc3NGaWxlID0gMHg4MDAwMDsgLy8gYml0MjAKKwlmaW5hbCBpbnQgQWNjSXNDb25zdGFudFZhbHVlID0gMHg4MDAwMDsJIC8vIGJpdDIwCisJZmluYWwgaW50IEFjY0RlZmF1bHRBYnN0cmFjdCA9IDB4ODAwMDA7IC8vIGJpdDIwCisJLy8gYml0MjEgLSBJQ29uc3RhbnRzLkFjY0RlcHJlY2F0ZWQKKwlmaW5hbCBpbnQgQWNjRGVwcmVjYXRlZEltcGxpY2l0bHkgPSAweDIwMDAwMDsgLy8gYml0MjIgaWUuIGlzIGRlcHJlY2F0ZWQgaXRzZWxmIG9yIGNvbnRhaW5lZCBieSBhIGRlcHJlY2F0ZWQgdHlwZQorCWZpbmFsIGludCBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0gPSAweDQwMDAwMDsgLy8gYml0MjMKKwlmaW5hbCBpbnQgQWNjTW9kaWZpZXJQcm9ibGVtID0gMHg4MDAwMDA7IC8vIGJpdDI0CisJZmluYWwgaW50IEFjY1NlbWljb2xvbkJvZHkgPSAweDEwMDAwMDA7IC8vIGJpdDI1CisJZmluYWwgaW50IEFjY1VucmVzb2x2ZWQgPSAweDIwMDAwMDA7IC8vIGJpdDI2CisJZmluYWwgaW50IEFjY0NsZWFyUHJpdmF0ZU1vZGlmaWVyID0gMHg0MDAwMDAwOyAvLyBiaXQyNyBtaWdodCBiZSByZXF1ZXN0ZWQgZHVyaW5nIHByaXZhdGUgYWNjZXNzIGVtdWxhdGlvbgorCWZpbmFsIGludCBBY2NCbGFua0ZpbmFsID0gMHg0MDAwMDAwOyAvLyBiaXQyNyBmb3IgYmxhbmsgZmluYWwgdmFyaWFibGVzCisJZmluYWwgaW50IEFjY1ByaXZhdGVVc2VkID0gMHg4MDAwMDAwOyAvLyBiaXQyOCB1c2VkIHRvIGRpYWdub3NlIHVudXNlZCBwcml2YXRlIG1lbWJlcnMKIAlmaW5hbCBpbnQgQWNjVmlzaWJpbGl0eU1BU0sgPSBBY2NQdWJsaWMgfCBBY2NQcm90ZWN0ZWQgfCBBY2NQcml2YXRlOworCQorCWZpbmFsIGludCBBY2NPdmVycmlkaW5nID0gMHgxMDAwMDAwMDsgLy8gYml0MjkgdG8gcmVjb3JkIGZhY3QgYSBtZXRob2Qgb3ZlcnJpZGVzIGFub3RoZXIgb25lCisJZmluYWwgaW50IEFjY0ltcGxlbWVudGluZyA9IDB4MjAwMDAwMDA7IC8vIGJpdDMwIHRvIHJlY29yZCBmYWN0IGEgbWV0aG9kIGltcGxlbWVudHMgYW5vdGhlciBvbmUgKGkuZS4gaXMgY29uY3JldGUgYW5kIG92ZXJyaWRlcyBhbiBhYnN0cmFjdCBvbmUpCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ZpZWxkQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9GaWVsZEJpbmRpbmcuamF2YQppbmRleCA2ZGI3Yjc5Li5hMmY1ZTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ZpZWxkQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvRmllbGRCaW5kaW5nLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwpAQCAtMTM4LDYgKzEzOCw3IEBACiBwdWJsaWMgZmluYWwgaW50IGdldEFjY2Vzc0ZsYWdzKCkgewogCXJldHVybiBtb2RpZmllcnMgJiBBY2NKdXN0RmxhZzsKIH0KKwogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBkZWZhdWx0IHZpc2liaWxpdHkKICovCiAKQEAgLTE1Niw2ICsxNTcsMTIgQEAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpdmF0ZSgpIHsKIAlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDA7CiB9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eSBhbmQgaXMgdXNlZCBsb2NhbGx5CisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaXZhdGVVc2VkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJpdmF0ZVVzZWQpICE9IDA7Cit9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CiAqLwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ltcG9ydEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCmluZGV4IGUyMjE5ODguLmJhZDc5NGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW1wb3J0QmluZGluZy5qYXZhCkBAIC0xLDE3ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGNsYXNzIEltcG9ydEJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nIHsKIAlwdWJsaWMgY2hhcltdW10gY29tcG91bmROYW1lOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Jbm5lckVtdWxhdGlvbkRlcGVuZGVuY3kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5LmphdmEKaW5kZXggNmMwZDM2Mi4uZGMzNDVjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Jbm5lckVtdWxhdGlvbkRlcGVuZGVuY3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0lubmVyRW11bGF0aW9uRGVwZW5kZW5jeS5qYXZhCkBAIC0xLDIzICsxLDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGNsYXNzIElubmVyRW11bGF0aW9uRGVwZW5kZW5jeXsKKwogCXB1YmxpYyBCbG9ja1Njb3BlIHNjb3BlOwogCXB1YmxpYyBib29sZWFuIHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQ7Ci0JcHVibGljIGJvb2xlYW4gdXNlRGlyZWN0QWNjZXNzOwogICAgIAotcHVibGljIElubmVyRW11bGF0aW9uRGVwZW5kZW5jeShCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQsIGJvb2xlYW4gdXNlRGlyZWN0QWNjZXNzKSB7Ci0JdGhpcy5zY29wZSA9IHNjb3BlOwotCXRoaXMud2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCA9IHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQ7Ci0JdGhpcy51c2VEaXJlY3RBY2Nlc3MgPSB1c2VEaXJlY3RBY2Nlc3M7Ci19CisJcHVibGljIElubmVyRW11bGF0aW9uRGVwZW5kZW5jeShCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpIHsKKwkJdGhpcy5zY29wZSA9IHNjb3BlOworCQl0aGlzLndhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQgPSB3YXNFbmNsb3NpbmdJbnN0YW5jZVN1cHBsaWVkOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvSW52b2NhdGlvblNpdGUuamF2YQppbmRleCA5NWE1MzMwLi45NTQ5ZmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0ludm9jYXRpb25TaXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9JbnZvY2F0aW9uU2l0ZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uU2l0ZSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxUeXBlQmluZGluZy5qYXZhCmluZGV4IDJkMzk0MGEuLmJlMTI3YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxUeXBlQmluZGluZy5qYXZhCkBAIC0xLDIzICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBMb2NhbFR5cGVCaW5kaW5nIGV4dGVuZHMgTmVzdGVkVHlwZUJpbmRpbmcgewogCWZpbmFsIHN0YXRpYyBjaGFyW10gTG9jYWxUeXBlUHJlZml4ID0geyAnJCcsICdMJywgJ28nLCAnYycsICdhJywgJ2wnLCAnJCcgfTsKIAogCXByaXZhdGUgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5W10gZGVwZW5kZW50czsKKwlBcnJheUJpbmRpbmdbXSBsb2NhbEFycmF5QmluZGluZ3M7IC8vIHVzZWQgdG8gY2FjaGUgYXJyYXkgYmluZGluZ3Mgb2YgdmFyaW91cyBkaW1lbnNpb25zIGZvciB0aGlzIGxvY2FsIHR5cGUKKwogcHVibGljIExvY2FsVHlwZUJpbmRpbmcoQ2xhc3NTY29wZSBzY29wZSwgU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgewogCXN1cGVyKAogCQluZXcgY2hhcltdW10ge0NoYXJPcGVyYXRpb24uY29uY2F0KExvY2FsVHlwZVByZWZpeCwgc2NvcGUucmVmZXJlbmNlQ29udGV4dC5uYW1lKX0sCkBAIC0zNCw3ICszNiw3IEBACiAqIGFsbCBpdHMgZGVwZW5kZW50cyBzbyBhcyB0byB1cGRhdGUgdGhlbSAoc2VlIHVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpKS4KICovCiAKLXB1YmxpYyB2b2lkIGFkZElubmVyRW11bGF0aW9uRGVwZW5kZW50KEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwgYm9vbGVhbiB1c2VEaXJlY3RBY2Nlc3MpIHsKK3B1YmxpYyB2b2lkIGFkZElubmVyRW11bGF0aW9uRGVwZW5kZW50KEJsb2NrU2NvcGUgc2NvcGUsIGJvb2xlYW4gd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCkgewogCWludCBpbmRleDsKIAlpZiAoZGVwZW5kZW50cyA9PSBudWxsKSB7CiAJCWluZGV4ID0gMDsKQEAgLTQ2LDcgKzQ4LDcgQEAKIAkJCQlyZXR1cm47IC8vIGFscmVhZHkgc3RvcmVkCiAJCVN5c3RlbS5hcnJheWNvcHkoZGVwZW5kZW50cywgMCwgKGRlcGVuZGVudHMgPSBuZXcgSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5W2luZGV4ICsgMV0pLCAwLCBpbmRleCk7CiAJfQotCWRlcGVuZGVudHNbaW5kZXhdID0gbmV3IElubmVyRW11bGF0aW9uRGVwZW5kZW5jeShzY29wZSwgd2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwgdXNlRGlyZWN0QWNjZXNzKTsKKwlkZXBlbmRlbnRzW2luZGV4XSA9IG5ldyBJbm5lckVtdWxhdGlvbkRlcGVuZGVuY3koc2NvcGUsIHdhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpOwogCS8vICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBkZXBlbmRlbmN5OiAiKyBuZXcgU3RyaW5nKHNjb3BlLmVuY2xvc2luZ1R5cGUoKS5yZWFkYWJsZU5hbWUoKSkgKyAiIC0tPiAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSk7CiB9CiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY29uc3RhbnQgcG9vbCBuYW1lLgpAQCAtNTcsOSArNTksMjQgQEAKIHB1YmxpYyBjaGFyW10gY29uc3RhbnRQb29sTmFtZSgpIC8qIGphdmEvbGFuZy9PYmplY3QgKi8gewogCXJldHVybiBjb25zdGFudFBvb2xOYW1lOwogfQotcHVibGljIHZvaWQgY29uc3RhbnRQb29sTmFtZShjaGFyW10gY29tcHV0ZWRDb25zdGFudFBvb2xOYW1lKSAvKiBqYXZhL2xhbmcvT2JqZWN0ICovIHsKLQl0aGlzLmNvbnN0YW50UG9vbE5hbWUgPSBjb21wdXRlZENvbnN0YW50UG9vbE5hbWU7CisKK0FycmF5QmluZGluZyBjcmVhdGVBcnJheVR5cGUoaW50IGRpbWVuc2lvbkNvdW50KSB7CisJaWYgKGxvY2FsQXJyYXlCaW5kaW5ncyA9PSBudWxsKSB7CisJCWxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbXSB7bmV3IEFycmF5QmluZGluZyh0aGlzLCBkaW1lbnNpb25Db3VudCl9OworCQlyZXR1cm4gbG9jYWxBcnJheUJpbmRpbmdzWzBdOworCX0KKworCS8vIGZpbmQgdGhlIGNhY2hlZCBhcnJheSBiaW5kaW5nIGZvciB0aGlzIGRpbWVuc2lvbkNvdW50IChpZiBhbnkpCisJaW50IGxlbmd0aCA9IGxvY2FsQXJyYXlCaW5kaW5ncy5sZW5ndGg7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKGxvY2FsQXJyYXlCaW5kaW5nc1tpXS5kaW1lbnNpb25zID09IGRpbWVuc2lvbkNvdW50KQorCQkJcmV0dXJuIGxvY2FsQXJyYXlCaW5kaW5nc1tpXTsKKworCS8vIG5vIG1hdGNoaW5nIGFycmF5CisJU3lzdGVtLmFycmF5Y29weShsb2NhbEFycmF5QmluZGluZ3MsIDAsIGxvY2FsQXJyYXlCaW5kaW5ncyA9IG5ldyBBcnJheUJpbmRpbmdbbGVuZ3RoICsgMV0sIDAsIGxlbmd0aCk7IAorCXJldHVybiBsb2NhbEFycmF5QmluZGluZ3NbbGVuZ3RoXSA9IG5ldyBBcnJheUJpbmRpbmcodGhpcywgZGltZW5zaW9uQ291bnQpOwogfQorCiBwdWJsaWMgY2hhcltdIHJlYWRhYmxlTmFtZSgpIHsKIAlpZiAoaXNBbm9ueW1vdXNUeXBlKCkpIHsKIAkJaWYgKHN1cGVySW50ZXJmYWNlcyA9PSBOb1N1cGVySW50ZXJmYWNlcykKQEAgLTcyLDE1ICs4OSwzOCBAQAogCQlyZXR1cm4gc291cmNlTmFtZTsKIAl9CiB9Ci0vLyBSZWNvcmQgdGhhdCB0aGUgdHlwZSBpcyBhIGxvY2FsIG1lbWJlciB0eXBlCiAKK3B1YmxpYyBjaGFyW10gc2hvcnRSZWFkYWJsZU5hbWUoKSB7CisJaWYgKGlzQW5vbnltb3VzVHlwZSgpKSB7CisJCWlmIChzdXBlckludGVyZmFjZXMgPT0gTm9TdXBlckludGVyZmFjZXMpCisJCQlyZXR1cm4gKCI8IitVdGlsLmJpbmQoImJpbmRpbmcuc3ViY2xhc3MiLG5ldyBTdHJpbmcoc3VwZXJjbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSkgKyAiPiIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXJldHVybiAoIjwiK1V0aWwuYmluZCgiYmluZGluZy5pbXBsZW1lbnRhdGlvbiIsbmV3IFN0cmluZyhzdXBlckludGVyZmFjZXNbMF0uc2hvcnRSZWFkYWJsZU5hbWUoKSkpICsgIj4iKS50b0NoYXJBcnJheSgpOwkJCSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorCX0gZWxzZSBpZiAoaXNNZW1iZXJUeXBlKCkpIHsKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpLCBzb3VyY2VOYW1lLCAnLicpOworCX0gZWxzZSB7CisJCXJldHVybiBzb3VyY2VOYW1lOworCX0KK30KKworLy8gUmVjb3JkIHRoYXQgdGhlIHR5cGUgaXMgYSBsb2NhbCBtZW1iZXIgdHlwZQogcHVibGljIHZvaWQgc2V0QXNNZW1iZXJUeXBlKCkgewogCXRhZ0JpdHMgfD0gTWVtYmVyVHlwZU1hc2s7CiB9CisKK3B1YmxpYyB2b2lkIHNldENvbnN0YW50UG9vbE5hbWUoY2hhcltdIGNvbXB1dGVkQ29uc3RhbnRQb29sTmFtZSkgLyogamF2YS9sYW5nL09iamVjdCAqLyB7CisJdGhpcy5jb25zdGFudFBvb2xOYW1lID0gY29tcHV0ZWRDb25zdGFudFBvb2xOYW1lOworfQorCiBwdWJsaWMgY2hhcltdIHNvdXJjZU5hbWUoKSB7Ci0JaWYgKGlzQW5vbnltb3VzVHlwZSgpKQotCQlyZXR1cm4gcmVhZGFibGVOYW1lKCk7Ci0JZWxzZQorCWlmIChpc0Fub255bW91c1R5cGUoKSkgeworCQkvL3JldHVybiByZWFkYWJsZU5hbWUoKTsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyA9PSBOb1N1cGVySW50ZXJmYWNlcykKKwkJCXJldHVybiAoIjwiK1V0aWwuYmluZCgiYmluZGluZy5zdWJjbGFzcyIsbmV3IFN0cmluZyhzdXBlcmNsYXNzLnNvdXJjZU5hbWUoKSkpICsgIj4iKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlyZXR1cm4gKCI8IitVdGlsLmJpbmQoImJpbmRpbmcuaW1wbGVtZW50YXRpb24iLG5ldyBTdHJpbmcoc3VwZXJJbnRlcmZhY2VzWzBdLnNvdXJjZU5hbWUoKSkpICsgIj4iKS50b0NoYXJBcnJheSgpOwkJCSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAorCQkJCisJfSBlbHNlCiAJCXJldHVybiBzb3VyY2VOYW1lOwogfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTk5LDcgKzEzOSw3IEBACiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgewogCQkJSW5uZXJFbXVsYXRpb25EZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBkZXBlbmRlbnRzW2ldOwogCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGluZyAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSArICIgLS0+ICIgKyBuZXcgU3RyaW5nKGRlcGVuZGVuY3kuc2NvcGUuZW5jbG9zaW5nVHlwZSgpLnJlYWRhYmxlTmFtZSgpKSk7Ci0JCQlkZXBlbmRlbmN5LnNjb3BlLnByb3BhZ2F0ZUlubmVyRW11bGF0aW9uKHRoaXMsIGRlcGVuZGVuY3kud2FzRW5jbG9zaW5nSW5zdGFuY2VTdXBwbGllZCwgZGVwZW5kZW5jeS51c2VEaXJlY3RBY2Nlc3MpOworCQkJZGVwZW5kZW5jeS5zY29wZS5wcm9wYWdhdGVJbm5lckVtdWxhdGlvbih0aGlzLCBkZXBlbmRlbmN5Lndhc0VuY2xvc2luZ0luc3RhbmNlU3VwcGxpZWQpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb2NhbFZhcmlhYmxlQmluZGluZy5qYXZhCmluZGV4IGRhZTljOTQuLjY1YzI0NjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9jYWxWYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvY2FsVmFyaWFibGVCaW5kaW5nLmphdmEKQEAgLTEsOTEgKzEsMTEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTG9jYWxEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIAogcHVibGljIGNsYXNzIExvY2FsVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgVmFyaWFibGVCaW5kaW5nIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0FyZ3VtZW50OwogCisJcHVibGljIGJvb2xlYW4gaXNBcmd1bWVudDsKIAlwdWJsaWMgaW50IHJlc29sdmVkUG9zaXRpb247IC8vIGZvciBjb2RlIGdlbmVyYXRpb24gKHBvc2l0aW9uIGluIG1ldGhvZCBjb250ZXh0KQotCXB1YmxpYyBib29sZWFuIHVzZWQ7IC8vIGZvciBmbG93IGFuYWx5c2lzCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5VU0VEID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VEID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUtFX1VTRUQgPSAyOworCXB1YmxpYyBpbnQgdXNlRmxhZzsgLy8gZm9yIGZsb3cgYW5hbHlzaXMgKGRlZmF1bHQgaXMgVU5VU0VEKQorCQogCXB1YmxpYyBCbG9ja1Njb3BlIGRlY2xhcmluZ1Njb3BlOyAvLyBiYWNrLXBvaW50ZXIgdG8gaXRzIGRlY2xhcmluZyBzY29wZQogCXB1YmxpYyBMb2NhbERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOyAvLyBmb3Igc291cmNlLXBvc2l0aW9ucwogCiAJcHVibGljIGludFtdIGluaXRpYWxpemF0aW9uUENzOwogCXB1YmxpYyBpbnQgaW5pdGlhbGl6YXRpb25Db3VudCA9IDA7CiAKLS8vIGZvciBzeW50aGV0aWMgbG9jYWwgdmFyaWFibGVzCQotcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nKGNoYXJbXSBuYW1lLCBUeXBlQmluZGluZyB0eXBlLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQXJndW1lbnQpIHsKLQl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMudHlwZSA9IHR5cGU7Ci0JdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JaWYgKHRoaXMuaXNBcmd1bWVudCA9IGlzQXJndW1lbnQpCi0JCXRoaXMuY29uc3RhbnQgPSBDb25zdGFudC5Ob3RBQ29uc3RhbnQ7Ci19CisJLy8gZm9yIHN5bnRoZXRpYyBsb2NhbCB2YXJpYWJsZXMJCisJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nKGNoYXJbXSBuYW1lLCBUeXBlQmluZGluZyB0eXBlLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQXJndW1lbnQpIHsKIAotLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSBvciBhcmd1bWVudAotcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nKExvY2FsRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNBcmd1bWVudCkgewotCXRoaXMoZGVjbGFyYXRpb24ubmFtZSwgdHlwZSwgbW9kaWZpZXJzLCBpc0FyZ3VtZW50KTsKLQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci19Ci0vKiBBUEkKLSogQW5zd2VyIHRoZSByZWNlaXZlcidzIGJpbmRpbmcgdHlwZSBmcm9tIEJpbmRpbmcuQmluZGluZ0lELgotKi8KLQotcHVibGljIGZpbmFsIGludCBiaW5kaW5nVHlwZSgpIHsKLQlyZXR1cm4gTE9DQUw7Ci19Ci0vLyBBbnN3ZXIgd2hldGhlciB0aGUgdmFyaWFibGUgYmluZGluZyBpcyBhIHNlY3JldCB2YXJpYWJsZSBhZGRlZCBmb3IgY29kZSBnZW4gcHVycG9zZXMKLQotcHVibGljIGJvb2xlYW4gaXNTZWNyZXQoKSB7Ci0JcmV0dXJuIGRlY2xhcmF0aW9uID09IG51bGwgJiYgIWlzQXJndW1lbnQ7Ci19Ci1wdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvbkVuZFBDKGludCBwYykgewotCWlmIChpbml0aWFsaXphdGlvblBDc1soKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IC0xKQotCQlpbml0aWFsaXphdGlvblBDc1soKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID0gcGM7Ci19Ci1wdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoaW50IHBjKSB7Ci0JaWYgKGluaXRpYWxpemF0aW9uUENzID09IG51bGwpCi0JCXJldHVybjsKLQkvLyBvcHRpbWl6ZSBjYXNlcyB3aGVyZSByZW9wZW5pbmcgYSBjb250aWd1b3VzIGludGVydmFsCi0JaWYgKChpbml0aWFsaXphdGlvbkNvdW50ID4gMCkgJiYgKGluaXRpYWxpemF0aW9uUENzWyAoKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IHBjKSkgewotCQlpbml0aWFsaXphdGlvblBDc1sgKChpbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSA9IC0xOyAvLyByZXVzZSBwcmV2aW91cyBpbnRlcnZhbCAoaXRzIHJhbmdlIHdpbGwgYmUgYXVnbWVudGVkKQotCX0gZWxzZSB7Ci0JCWludCBpbmRleCA9IGluaXRpYWxpemF0aW9uQ291bnQgPDwgMTsKLQkJaWYgKGluZGV4ID09IGluaXRpYWxpemF0aW9uUENzLmxlbmd0aCkgewotCQkJU3lzdGVtLmFycmF5Y29weShpbml0aWFsaXphdGlvblBDcywgMCwgKGluaXRpYWxpemF0aW9uUENzID0gbmV3IGludFtpbml0aWFsaXphdGlvbkNvdW50IDw8IDJdKSwgMCwgaW5kZXgpOwotCQl9Ci0JCWluaXRpYWxpemF0aW9uUENzW2luZGV4XSA9IHBjOwotCQlpbml0aWFsaXphdGlvblBDc1tpbmRleCArIDFdID0gLTE7Ci0JCWluaXRpYWxpemF0aW9uQ291bnQrKzsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCWlmICh0aGlzLmlzQXJndW1lbnQgPSBpc0FyZ3VtZW50KQorCQkJdGhpcy5jb25zdGFudCA9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIAl9Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZyBzID0gc3VwZXIudG9TdHJpbmcoKTsKLQlpZiAoIXVzZWQpCi0JCXMgKz0gIltwb3M6IHVudXNlZF0iOyAvLyROT04tTkxTLTEkCi0JZWxzZQotCQlzICs9ICJbcG9zOiAiICsgU3RyaW5nLnZhbHVlT2YocmVzb2x2ZWRQb3NpdGlvbikgKyAiXSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCXMgKz0gIltpZDoiICsgU3RyaW5nLnZhbHVlT2YoaWQpICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQlpZiAoaW5pdGlhbGl6YXRpb25Db3VudCA+IDApIHsKLQkJcyArPSAiW3BjOiAiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbGl6YXRpb25Db3VudDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApCi0JCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQlzICs9IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzW2kgPDwgMV0pICsgIi0iICsgKChpbml0aWFsaXphdGlvblBDc1soaSA8PCAxKSArIDFdID09IC0xKSA/ICI/IiA6IFN0cmluZy52YWx1ZU9mKGluaXRpYWxpemF0aW9uUENzWyhpPDwgMSkgKyAxXSkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzICs9ICJdIjsgLy8kTk9OLU5MUy0xJAorCQorCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgb3IgYXJndW1lbnQKKwlwdWJsaWMgTG9jYWxWYXJpYWJsZUJpbmRpbmcoTG9jYWxEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgVHlwZUJpbmRpbmcgdHlwZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBpc0FyZ3VtZW50KSB7CisKKwkJdGhpcyhkZWNsYXJhdGlvbi5uYW1lLCB0eXBlLCBtb2RpZmllcnMsIGlzQXJndW1lbnQpOworCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJfQotCXJldHVybiBzOwotfQorCisJLyogQVBJCisJKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgYmluZGluZyB0eXBlIGZyb20gQmluZGluZy5CaW5kaW5nSUQuCisJKi8KKwlwdWJsaWMgZmluYWwgaW50IGJpbmRpbmdUeXBlKCkgeworCisJCXJldHVybiBMT0NBTDsKKwl9CisJCisJLy8gQW5zd2VyIHdoZXRoZXIgdGhlIHZhcmlhYmxlIGJpbmRpbmcgaXMgYSBzZWNyZXQgdmFyaWFibGUgYWRkZWQgZm9yIGNvZGUgZ2VuIHB1cnBvc2VzCisJcHVibGljIGJvb2xlYW4gaXNTZWNyZXQoKSB7CisKKwkJcmV0dXJuIGRlY2xhcmF0aW9uID09IG51bGwgJiYgIWlzQXJndW1lbnQ7CisJfQorCisJcHVibGljIHZvaWQgcmVjb3JkSW5pdGlhbGl6YXRpb25FbmRQQyhpbnQgcGMpIHsKKworCQlpZiAoaW5pdGlhbGl6YXRpb25QQ3NbKChpbml0aWFsaXphdGlvbkNvdW50IC0gMSkgPDwgMSkgKyAxXSA9PSAtMSkKKwkJCWluaXRpYWxpemF0aW9uUENzWygoaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSBwYzsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWNvcmRJbml0aWFsaXphdGlvblN0YXJ0UEMoaW50IHBjKSB7CisKKwkJaWYgKGluaXRpYWxpemF0aW9uUENzID09IG51bGwpIAlyZXR1cm47CisJCS8vIG9wdGltaXplIGNhc2VzIHdoZXJlIHJlb3BlbmluZyBhIGNvbnRpZ3VvdXMgaW50ZXJ2YWwKKwkJaWYgKChpbml0aWFsaXphdGlvbkNvdW50ID4gMCkgJiYgKGluaXRpYWxpemF0aW9uUENzWyAoKGluaXRpYWxpemF0aW9uQ291bnQgLSAxKSA8PCAxKSArIDFdID09IHBjKSkgeworCQkJaW5pdGlhbGl6YXRpb25QQ3NbICgoaW5pdGlhbGl6YXRpb25Db3VudCAtIDEpIDw8IDEpICsgMV0gPSAtMTsgLy8gcmV1c2UgcHJldmlvdXMgaW50ZXJ2YWwgKGl0cyByYW5nZSB3aWxsIGJlIGF1Z21lbnRlZCkKKwkJfSBlbHNlIHsKKwkJCWludCBpbmRleCA9IGluaXRpYWxpemF0aW9uQ291bnQgPDwgMTsKKwkJCWlmIChpbmRleCA9PSBpbml0aWFsaXphdGlvblBDcy5sZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGluaXRpYWxpemF0aW9uUENzLCAwLCAoaW5pdGlhbGl6YXRpb25QQ3MgPSBuZXcgaW50W2luaXRpYWxpemF0aW9uQ291bnQgPDwgMl0pLCAwLCBpbmRleCk7CisJCQl9CisJCQlpbml0aWFsaXphdGlvblBDc1tpbmRleF0gPSBwYzsKKwkJCWluaXRpYWxpemF0aW9uUENzW2luZGV4ICsgMV0gPSAtMTsKKwkJCWluaXRpYWxpemF0aW9uQ291bnQrKzsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwkJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZygpOworCQlzd2l0Y2ggKHVzZUZsYWcpeworCQkJY2FzZSBVU0VEOgorCQkJCXMgKz0gIltwb3M6ICIgKyBTdHJpbmcudmFsdWVPZihyZXNvbHZlZFBvc2l0aW9uKSArICJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJYnJlYWs7CisJCQljYXNlIFVOVVNFRDoKKwkJCQlzICs9ICJbcG9zOiB1bnVzZWRdIjsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJY2FzZSBGQUtFX1VTRUQ6CisJCQkJcyArPSAiW3BvczogZmFrZV91c2VkXSI7IC8vJE5PTi1OTFMtMSQKKwkJCQlicmVhazsKKwkJfQorCQlzICs9ICJbaWQ6IiArIFN0cmluZy52YWx1ZU9mKGlkKSArICJdIjsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCWlmIChpbml0aWFsaXphdGlvbkNvdW50ID4gMCkgeworCQkJcyArPSAiW3BjOiAiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemF0aW9uQ291bnQ7IGkrKykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJcyArPSAiLCAiOyAvLyROT04tTkxTLTEkCisJCQkJcyArPSBTdHJpbmcudmFsdWVPZihpbml0aWFsaXphdGlvblBDc1tpIDw8IDFdKSArICItIiArICgoaW5pdGlhbGl6YXRpb25QQ3NbKGkgPDwgMSkgKyAxXSA9PSAtMSkgPyAiPyIgOiBTdHJpbmcudmFsdWVPZihpbml0aWFsaXphdGlvblBDc1soaTw8IDEpICsgMV0pKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQl9CisJCQlzICs9ICJdIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBzOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTG9va3VwRW52aXJvbm1lbnQuamF2YQppbmRleCBiNzIwYjliLi4xYWZiZTNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL0xvb2t1cEVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Mb29rdXBFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDE1ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKQEAgLTE3LDcgKzE4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSVR5cGVSZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKQEAgLTI5LDggKzI5LDggQEAKIAlQYWNrYWdlQmluZGluZyBkZWZhdWx0UGFja2FnZTsKIAlJbXBvcnRCaW5kaW5nW10gZGVmYXVsdEltcG9ydHM7CiAJSGFzaHRhYmxlT2ZQYWNrYWdlIGtub3duUGFja2FnZXM7Ci0Jc3RhdGljIGZpbmFsIFByb2JsZW1QYWNrYWdlQmluZGluZyB0aGVOb3RGb3VuZFBhY2thZ2UgPSBuZXcgUHJvYmxlbVBhY2thZ2VCaW5kaW5nKG5ldyBjaGFyWzBdLCBOb3RGb3VuZCk7Ci0Jc3RhdGljIGZpbmFsIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHRoZU5vdEZvdW5kVHlwZSA9IG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuZXcgY2hhclswXSwgTm90Rm91bmQpOworCXN0YXRpYyBmaW5hbCBQcm9ibGVtUGFja2FnZUJpbmRpbmcgVGhlTm90Rm91bmRQYWNrYWdlID0gbmV3IFByb2JsZW1QYWNrYWdlQmluZGluZyhDaGFyT3BlcmF0aW9uLk5PX0NIQVIsIE5vdEZvdW5kKTsKKwlzdGF0aWMgZmluYWwgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgVGhlTm90Rm91bmRUeXBlID0gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKENoYXJPcGVyYXRpb24uTk9fQ0hBUiwgTm90Rm91bmQpOwogCiAJcHJpdmF0ZSBJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudDsKIAlwcml2YXRlIE1ldGhvZFZlcmlmaWVyIHZlcmlmaWVyOwpAQCAtMjI4LDE0ICsyMjgsMTQgQEAKIAkJcmV0dXJuIGRlZmF1bHRQYWNrYWdlOwogCiAJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlMChjb25zdGFudFBvb2xOYW1lWzBdKTsKLQlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpIHsKKwlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpIHsKIAkJcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcoY29uc3RhbnRQb29sTmFtZVswXSwgdGhpcyk7CiAJCWtub3duUGFja2FnZXMucHV0KGNvbnN0YW50UG9vbE5hbWVbMF0sIHBhY2thZ2VCaW5kaW5nKTsKIAl9CiAKIAlmb3IgKGludCBpID0gMSwgbGVuZ3RoID0gY29uc3RhbnRQb29sTmFtZS5sZW5ndGggLSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJUGFja2FnZUJpbmRpbmcgcGFyZW50ID0gcGFja2FnZUJpbmRpbmc7Ci0JCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYXJlbnQuZ2V0UGFja2FnZTAoY29uc3RhbnRQb29sTmFtZVtpXSkpID09IG51bGwgfHwgcGFja2FnZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRQYWNrYWdlKSB7CisJCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYXJlbnQuZ2V0UGFja2FnZTAoY29uc3RhbnRQb29sTmFtZVtpXSkpID09IG51bGwgfHwgcGFja2FnZUJpbmRpbmcgPT0gVGhlTm90Rm91bmRQYWNrYWdlKSB7CiAJCQlwYWNrYWdlQmluZGluZyA9IG5ldyBQYWNrYWdlQmluZGluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbnN0YW50UG9vbE5hbWUsIDAsIGkgKyAxKSwgcGFyZW50LCB0aGlzKTsKIAkJCXBhcmVudC5hZGRQYWNrYWdlKHBhY2thZ2VCaW5kaW5nKTsKIAkJfQpAQCAtMjQ2LDYgKzI0Niw5IEBACiAqLwogCiBBcnJheUJpbmRpbmcgY3JlYXRlQXJyYXlUeXBlKFR5cGVCaW5kaW5nIHR5cGUsIGludCBkaW1lbnNpb25Db3VudCkgeworCWlmICh0eXBlIGluc3RhbmNlb2YgTG9jYWxUeXBlQmluZGluZykgLy8gY2FjaGUgbG9jYWwgdHlwZSBhcnJheXMgd2l0aCB0aGUgbG9jYWwgdHlwZSBpdHNlbGYKKwkJcmV0dXJuICgoTG9jYWxUeXBlQmluZGluZykgdHlwZSkuY3JlYXRlQXJyYXlUeXBlKGRpbWVuc2lvbkNvdW50KTsKKwogCS8vIGZpbmQgdGhlIGFycmF5IGJpbmRpbmcgY2FjaGUgZm9yIHRoaXMgZGltZW5zaW9uCiAJaW50IGRpbUluZGV4ID0gZGltZW5zaW9uQ291bnQgLSAxOwogCWludCBsZW5ndGggPSB1bmlxdWVBcnJheUJpbmRpbmdzLmxlbmd0aDsKQEAgLTMwNiw3ICszMDksNyBAQAogCiBQYWNrYWdlQmluZGluZyBjcmVhdGVQYWNrYWdlKGNoYXJbXVtdIGNvbXBvdW5kTmFtZSkgewogCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAoY29tcG91bmROYW1lWzBdKTsKLQlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpIHsKKwlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpIHsKIAkJcGFja2FnZUJpbmRpbmcgPSBuZXcgUGFja2FnZUJpbmRpbmcoY29tcG91bmROYW1lWzBdLCB0aGlzKTsKIAkJa25vd25QYWNrYWdlcy5wdXQoY29tcG91bmROYW1lWzBdLCBwYWNrYWdlQmluZGluZyk7CiAJfQpAQCAtMzE3LDExICszMjAsMTEgQEAKIAkJLy8gb3RoZXJ3aXNlIHdoZW4gdGhlIHNvdXJjZSB0eXBlIHdhcyBkZWZpbmVkLCB0aGUgY29ycmVjdCBlcnJvciB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKIAkJLy8gdW5sZXNzIGl0cyBhbiB1bnJlc29sdmVkIHR5cGUgd2hpY2ggaXMgcmVmZXJlbmNlZCBmcm9tIGFuIGluY29uc2lzdGVudCBjbGFzcyBmaWxlCiAJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IHBhY2thZ2VCaW5kaW5nLmdldFR5cGUwKGNvbXBvdW5kTmFtZVtpXSk7Ci0JCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZSAhPSB0aGVOb3RGb3VuZFR5cGUgJiYgISh0eXBlIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpKQorCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgIT0gVGhlTm90Rm91bmRUeXBlICYmICEodHlwZSBpbnN0YW5jZW9mIFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSkKIAkJCXJldHVybiBudWxsOwogCiAJCVBhY2thZ2VCaW5kaW5nIHBhcmVudCA9IHBhY2thZ2VCaW5kaW5nOwotCQlpZiAoKHBhY2thZ2VCaW5kaW5nID0gcGFyZW50LmdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVtpXSkpID09IG51bGwgfHwgcGFja2FnZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRQYWNrYWdlKSB7CisJCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYXJlbnQuZ2V0UGFja2FnZTAoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpIHsKIAkJCS8vIGlmIHRoZSBwYWNrYWdlIGlzIHVua25vd24sIGNoZWNrIHRvIHNlZSBpZiBhIHR5cGUgZXhpc3RzIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgbmV3IHBhY2thZ2UKIAkJCS8vIGNhdGNoZXMgdGhlIGNhc2Ugb2YgYSBwYWNrYWdlIHN0YXRlbWVudCBvZjogcGFja2FnZSBqYXZhLmxhbmcuT2JqZWN0OwogCQkJLy8gc2luY2UgdGhlIHBhY2thZ2UgY2FuIGJlIGFkZGVkIGFmdGVyIGEgc2V0IG9mIHNvdXJjZSBmaWxlcyBoYXZlIGFscmVhZHkgYmVlbiBjb21waWxlZCwgd2UgbmVlZApAQCAtMzUxLDExICszNTQsMTEgQEAKIAl9CiAKIAlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVswXSk7Ci0JaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwgfHwgcGFja2FnZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRQYWNrYWdlKQorCWlmIChwYWNrYWdlQmluZGluZyA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IFRoZU5vdEZvdW5kUGFja2FnZSkKIAkJcmV0dXJuIG51bGw7CiAKIAlmb3IgKGludCBpID0gMSwgcGFja2FnZUxlbmd0aCA9IGNvbXBvdW5kTmFtZS5sZW5ndGggLSAxOyBpIDwgcGFja2FnZUxlbmd0aDsgaSsrKQotCQlpZiAoKHBhY2thZ2VCaW5kaW5nID0gcGFja2FnZUJpbmRpbmcuZ2V0UGFja2FnZTAoY29tcG91bmROYW1lW2ldKSkgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpCisJCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRQYWNrYWdlMChjb21wb3VuZE5hbWVbaV0pKSA9PSBudWxsIHx8IHBhY2thZ2VCaW5kaW5nID09IFRoZU5vdEZvdW5kUGFja2FnZSkKIAkJCXJldHVybiBudWxsOwogCXJldHVybiBwYWNrYWdlQmluZGluZy5nZXRUeXBlMChjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aCAtIDFdKTsKIH0KQEAgLTM3OCw3ICszODEsNyBAQAogUGFja2FnZUJpbmRpbmcgZ2V0VG9wTGV2ZWxQYWNrYWdlKGNoYXJbXSBuYW1lKSB7CiAJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlMChuYW1lKTsKIAlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCkgewotCQlpZiAocGFja2FnZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRQYWNrYWdlKQorCQlpZiAocGFja2FnZUJpbmRpbmcgPT0gVGhlTm90Rm91bmRQYWNrYWdlKQogCQkJcmV0dXJuIG51bGw7CiAJCWVsc2UKIAkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKQEAgLTM4OSw3ICszOTIsNyBAQAogCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CiAJfQogCi0Ja25vd25QYWNrYWdlcy5wdXQobmFtZSwgdGhlTm90Rm91bmRQYWNrYWdlKTsgLy8gc2F2ZXMgYXNraW5nIHRoZSBvcmFjbGUgbmV4dCB0aW1lCisJa25vd25QYWNrYWdlcy5wdXQobmFtZSwgVGhlTm90Rm91bmRQYWNrYWdlKTsgLy8gc2F2ZXMgYXNraW5nIHRoZSBvcmFjbGUgbmV4dCB0aW1lCiAJcmV0dXJuIG51bGw7CiB9CiAvKiBBbnN3ZXIgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG91bmROYW1lLgpAQCAtNDA2LDIwICs0MDksMjAgQEAKIAogCQlpZiAoKHJlZmVyZW5jZUJpbmRpbmcgPSBkZWZhdWx0UGFja2FnZS5nZXRUeXBlMChjb21wb3VuZE5hbWVbMF0pKSA9PSBudWxsKSB7CiAJCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVswXSk7Ci0JCQlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCAmJiBwYWNrYWdlQmluZGluZyAhPSB0aGVOb3RGb3VuZFBhY2thZ2UpCisJCQlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCAmJiBwYWNrYWdlQmluZGluZyAhPSBUaGVOb3RGb3VuZFBhY2thZ2UpCiAJCQkJcmV0dXJuIG51bGw7IC8vIGNvbGxpZGVzIHdpdGggYSBrbm93biBwYWNrYWdlLi4uIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBpbiBzdWNoIGEgY2FzZQogCQkJcmVmZXJlbmNlQmluZGluZyA9IGFza0ZvclR5cGUoZGVmYXVsdFBhY2thZ2UsIGNvbXBvdW5kTmFtZVswXSk7CiAJCX0KIAl9IGVsc2UgewogCQlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UwKGNvbXBvdW5kTmFtZVswXSk7Ci0JCWlmIChwYWNrYWdlQmluZGluZyA9PSB0aGVOb3RGb3VuZFBhY2thZ2UpCisJCWlmIChwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpCiAJCQlyZXR1cm4gbnVsbDsKIAogCQlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCkgewogCQkJZm9yIChpbnQgaSA9IDEsIHBhY2thZ2VMZW5ndGggPSBjb21wb3VuZE5hbWUubGVuZ3RoIC0gMTsgaSA8IHBhY2thZ2VMZW5ndGg7IGkrKykgewogCQkJCWlmICgocGFja2FnZUJpbmRpbmcgPSBwYWNrYWdlQmluZGluZy5nZXRQYWNrYWdlMChjb21wb3VuZE5hbWVbaV0pKSA9PSBudWxsKQogCQkJCQlicmVhazsKLQkJCQlpZiAocGFja2FnZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRQYWNrYWdlKQorCQkJCWlmIChwYWNrYWdlQmluZGluZyA9PSBUaGVOb3RGb3VuZFBhY2thZ2UpCiAJCQkJCXJldHVybiBudWxsOwogCQkJfQogCQl9CkBAIC00MzAsNyArNDMzLDcgQEAKIAkJCXJlZmVyZW5jZUJpbmRpbmcgPSBhc2tGb3JUeXBlKHBhY2thZ2VCaW5kaW5nLCBjb21wb3VuZE5hbWVbY29tcG91bmROYW1lLmxlbmd0aCAtIDFdKTsKIAl9CiAKLQlpZiAocmVmZXJlbmNlQmluZGluZyA9PSBudWxsIHx8IHJlZmVyZW5jZUJpbmRpbmcgPT0gdGhlTm90Rm91bmRUeXBlKQorCWlmIChyZWZlcmVuY2VCaW5kaW5nID09IG51bGwgfHwgcmVmZXJlbmNlQmluZGluZyA9PSBUaGVOb3RGb3VuZFR5cGUpCiAJCXJldHVybiBudWxsOwogCWlmIChyZWZlcmVuY2VCaW5kaW5nIGluc3RhbmNlb2YgVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpCiAJCXJlZmVyZW5jZUJpbmRpbmcgPSAoKFVucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nKSByZWZlcmVuY2VCaW5kaW5nKS5yZXNvbHZlKHRoaXMpOwpAQCAtNDUyLDcgKzQ1NSw3IEBACiAKIFJlZmVyZW5jZUJpbmRpbmcgZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKGNoYXJbXSBzaWduYXR1cmUsIGludCBzdGFydCwgaW50IGVuZCkgewogCWlmIChlbmQgPT0gLTEpCi0JCWVuZCA9IHNpZ25hdHVyZS5sZW5ndGggLSAxOworCQllbmQgPSBzaWduYXR1cmUubGVuZ3RoOwogCiAJY2hhcltdW10gY29tcG91bmROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgc2lnbmF0dXJlLCBzdGFydCwgZW5kKTsKIAlSZWZlcmVuY2VCaW5kaW5nIGJpbmRpbmcgPSBnZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7CkBAIC00NjAsNyArNDYzLDcgQEAKIAkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBjb21wdXRlUGFja2FnZUZyb20oY29tcG91bmROYW1lKTsKIAkJYmluZGluZyA9IG5ldyBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZyhjb21wb3VuZE5hbWUsIHBhY2thZ2VCaW5kaW5nKTsKIAkJcGFja2FnZUJpbmRpbmcuYWRkVHlwZShiaW5kaW5nKTsKLQl9IGVsc2UgaWYgKGJpbmRpbmcgPT0gdGhlTm90Rm91bmRUeXBlKSB7CisJfSBlbHNlIGlmIChiaW5kaW5nID09IFRoZU5vdEZvdW5kVHlwZSkgewogCQlwcm9ibGVtUmVwb3J0ZXIuaXNDbGFzc1BhdGhDb3JyZWN0KGNvbXBvdW5kTmFtZSwgbnVsbCk7CiAJCXJldHVybiBudWxsOyAvLyB3aWxsIG5vdCBnZXQgaGVyZSBzaW5jZSB0aGUgYWJvdmUgZXJyb3IgYWJvcnRzIHRoZSBjb21waWxhdGlvbgogCX0KQEAgLTUxOSw3ICs1MjIsNyBAQAogCQkJCXRocm93IG5ldyBFcnJvcihVdGlsLmJpbmQoImVycm9yLnVuZGVmaW5lZEJhc2VUeXBlIixTdHJpbmcudmFsdWVPZihzaWduYXR1cmVbc3RhcnRdKSkpOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9IGVsc2UgewotCQliaW5kaW5nID0gZ2V0VHlwZUZyb21Db25zdGFudFBvb2xOYW1lKHNpZ25hdHVyZSwgc3RhcnQgKyAxLCBlbmQgLSAxKTsKKwkJYmluZGluZyA9IGdldFR5cGVGcm9tQ29uc3RhbnRQb29sTmFtZShzaWduYXR1cmUsIHN0YXJ0ICsgMSwgZW5kKTsKIAl9CiAKIAlpZiAoZGltZW5zaW9uID09IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01lbWJlclR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01lbWJlclR5cGVCaW5kaW5nLmphdmEKaW5kZXggZjdkMjIyMi4uZWJiNjAyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZW1iZXJUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWVtYmVyVHlwZUJpbmRpbmcuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBNZW1iZXJUeXBlQmluZGluZyBleHRlbmRzIE5lc3RlZFR5cGVCaW5kaW5nIHsKIHB1YmxpYyBNZW1iZXJUeXBlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIENsYXNzU2NvcGUgc2NvcGUsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKaW5kZXggZDExZTQ1Ni4uZmMyYjc1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsMTUgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwogCkBAIC0yMiw2ICsyMyw3IEBACiAJcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3M7CiAKIAljaGFyW10gc2lnbmF0dXJlOworCiBwcm90ZWN0ZWQgTWV0aG9kQmluZGluZygpIHsKIH0KIHB1YmxpYyBNZXRob2RCaW5kaW5nKGludCBtb2RpZmllcnMsIGNoYXJbXSBzZWxlY3RvciwgVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSwgVHlwZUJpbmRpbmdbXSBhcmdzLCBSZWZlcmVuY2VCaW5kaW5nW10gZXhjZXB0aW9ucywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgewpAQCAtMjA0LDEyMCArMjA2LDE1NiBAQAogCX0gd2hpbGUgKCh0eXBlID0gdHlwZS5zdXBlcmNsYXNzKCkpICE9IG51bGwpOwogCXJldHVybiBmYWxzZTsKIH0KKwogLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGNvbnN0YW50IHBvb2wgbmFtZS4KICoKICogPGluaXQ+IGZvciBjb25zdHJ1Y3RvcnMKICogPGNsaW5pdD4gZm9yIGNsaW5pdCBtZXRob2RzCiAqIG9yIHRoZSBzb3VyY2UgbmFtZSBvZiB0aGUgbWV0aG9kCiAqLwotCiBwdWJsaWMgZmluYWwgY2hhcltdIGNvbnN0YW50UG9vbE5hbWUoKSB7CiAJcmV0dXJuIHNlbGVjdG9yOwogfQogcHVibGljIGZpbmFsIGludCBnZXRBY2Nlc3NGbGFncygpIHsKIAlyZXR1cm4gbW9kaWZpZXJzICYgQWNjSnVzdEZsYWc7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhbiBhYnN0cmFjdCBtZXRob2QKICovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWJzdHJhY3QoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NBYnN0cmFjdCkgIT0gMDsKIH0KKwogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgY29uc3RydWN0b3IKICovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CiAJcmV0dXJuIHNlbGVjdG9yID09IENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZTsKIH0KIHByb3RlY3RlZCBib29sZWFuIGlzQ29uc3RydWN0b3JSZWxhdGVkKCkgewogCXJldHVybiBpc0NvbnN0cnVjdG9yKCk7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgZGVmYXVsdCB2aXNpYmlsaXR5CiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHQoKSB7CiAJcmV0dXJuICFpc1B1YmxpYygpICYmICFpc1Byb3RlY3RlZCgpICYmICFpc1ByaXZhdGUoKTsKIH0KKwogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGEgc3lzdGVtIGdlbmVyYXRlZCBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZAogKi8KLQogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0QWJzdHJhY3QoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NEZWZhdWx0QWJzdHJhY3QpICE9IDA7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRlcHJlY2F0ZWQgbWV0aG9kCiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwOwogfQorCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgZmluYWwgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuCiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbmFsKCkgewogCXJldHVybiAobW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDA7CiB9CisKKy8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBpbXBsZW1lbnRpbmcgYW5vdGhlciBtZXRob2QKKyAqIGkuZS4gaXMgb3ZlcnJpZGluZyBhbmQgaXMgY29uY3JldGUgYW5kIG92ZXJyaWRlbiBpcyBhYnN0cmFjdAorICogT25seSBzZXQgZm9yIHNvdXJjZSBtZXRob2RzCisqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRpbmcoKSB7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NJbXBsZW1lbnRpbmcpICE9IDA7Cit9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIG5hdGl2ZSBtZXRob2QKICovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTmF0aXZlKCkgewogCXJldHVybiAobW9kaWZpZXJzICYgQWNjTmF0aXZlKSAhPSAwOwogfQorCisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgb3ZlcnJpZGluZyBhbm90aGVyIG1ldGhvZAorICogT25seSBzZXQgZm9yIHNvdXJjZSBtZXRob2RzCisqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPdmVycmlkaW5nKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjT3ZlcnJpZGluZykgIT0gMDsKK30KKy8qCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSAicHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10pIiBtZXRob2QKKyAqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNYWluKCkgeworCWlmICh0aGlzLnNlbGVjdG9yLmxlbmd0aCA9PSA0ICYmIENoYXJPcGVyYXRpb24uZXF1YWxzKHRoaXMuc2VsZWN0b3IsIE1BSU4pCisJCQkmJiAoKHRoaXMubW9kaWZpZXJzICYgKEFjY1B1YmxpYyB8IEFjY1N0YXRpYykpICE9IDApCisJCQkmJiBWb2lkQmluZGluZyA9PSB0aGlzLnJldHVyblR5cGUgIAorCQkJJiYgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSB7CisJCVR5cGVCaW5kaW5nIHBhcmFtVHlwZSA9IHRoaXMucGFyYW1ldGVyc1swXTsKKwkJaWYgKHBhcmFtVHlwZS5kaW1lbnNpb25zKCkgPT0gMSAmJiBwYXJhbVR5cGUubGVhZkNvbXBvbmVudFR5cGUoKS5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdTdHJpbmcpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBoYXMgcHJpdmF0ZSB2aXNpYmlsaXR5CiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaXZhdGUoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NQcml2YXRlKSAhPSAwOwogfQorCisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eSBhbmQgaXMgdXNlZCBsb2NhbGx5CisqLworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcml2YXRlVXNlZCgpIHsKKwlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1ByaXZhdGVVc2VkKSAhPSAwOworfQorCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKIAlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1Byb3RlY3RlZCkgIT0gMDsKIH0KKwogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQogKi8KLQogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaWMoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NQdWJsaWMpICE9IDA7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBnb3QgcmVxdWVzdGVkIHRvIGNsZWFyIHRoZSBwcml2YXRlIG1vZGlmaWVyCiAgKiBkdXJpbmcgcHJpdmF0ZSBhY2Nlc3MgZW11bGF0aW9uLgogICovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVxdWlyZWRUb0NsZWFyUHJpdmF0ZU1vZGlmaWVyKCkgewogCXJldHVybiAobW9kaWZpZXJzICYgQWNjQ2xlYXJQcml2YXRlTW9kaWZpZXIpICE9IDA7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIHN0YXRpYyBtZXRob2QKICovCi0KIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3RhdGljKCkgewogCXJldHVybiAobW9kaWZpZXJzICYgQWNjU3RhdGljKSAhPSAwOwogfQorCiAvKiBBbnN3ZXIgdHJ1ZSBpZiBhbGwgZmxvYXQgb3BlcmF0aW9ucyBtdXN0IGFkaGVyIHRvIElFRUUgNzU0IGZsb2F0L2RvdWJsZSBydWxlcwogKi8KLQogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTdHJpY3RmcCgpIHsKIAlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1N0cmljdGZwKSAhPSAwOwogfQorCiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYSBzeW5jaHJvbml6ZWQgbWV0aG9kCiAqLwotCiBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKIAlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1N5bmNocm9uaXplZCkgIT0gMDsKIH0KKwogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhhcyBwdWJsaWMgdmlzaWJpbGl0eQogKi8KLQogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTeW50aGV0aWMoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NTeW50aGV0aWMpICE9IDA7CiB9CisKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlcidzIGRlY2xhcmluZyB0eXBlIGlzIGRlcHJlY2F0ZWQgKG9yIGFueSBvZiBpdHMgZW5jbG9zaW5nIHR5cGVzKQogKi8KLQogcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSB7CiAJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkKSAhPSAwIHx8CiAJCShtb2RpZmllcnMgJiBBY2NEZXByZWNhdGVkSW1wbGljaXRseSkgIT0gMDsKIH0KKwogcHVibGljIGNoYXJbXSByZWFkYWJsZU5hbWUoKSAvKiBmb28oaW50LCBUaHJlYWQpICovIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CiAJaWYgKGlzQ29uc3RydWN0b3IoKSkKQEAgLTMzNSwzNyArMzczLDc4IEBACiAJYnVmZmVyLmFwcGVuZCgnKScpOwogCXJldHVybiBidWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwogfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nI3Nob3J0UmVhZGFibGVOYW1lKCkKKyAqLworcHVibGljIGNoYXJbXSBzaG9ydFJlYWRhYmxlTmFtZSgpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CisJaWYgKGlzQ29uc3RydWN0b3IoKSkKKwkJYnVmZmVyLmFwcGVuZChkZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKTsKKwllbHNlCisJCWJ1ZmZlci5hcHBlbmQoc2VsZWN0b3IpOworCWJ1ZmZlci5hcHBlbmQoJygnKTsKKwlpZiAocGFyYW1ldGVycyAhPSBOb1BhcmFtZXRlcnMpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpID4gMCkKKwkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHBhcmFtZXRlcnNbaV0uc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJCX0KKwl9CisJYnVmZmVyLmFwcGVuZCgnKScpOworCXJldHVybiBidWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworfQorCiBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZWxlY3RvcihjaGFyW10gc2VsZWN0b3IpIHsKIAl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CiAJdGhpcy5zaWduYXR1cmUgPSBudWxsOwogfQorCiAvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3Mgc2lnbmF0dXJlLgogKgogKiBOT1RFOiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGR1cmluZy9hZnRlciBjb2RlIGdlbi4KICogVGhlIHNpZ25hdHVyZSBpcyBjYWNoZWQgc28gaWYgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcmV0dXJuIHR5cGUgb3IgYW55IHBhcmFtZXRlcgogKiB0eXBlIGNoYW5nZXMsIHRoZSBjYWNoZWQgc3RhdGUgaXMgaW52YWxpZC4KICovCi0KIHB1YmxpYyBmaW5hbCBjaGFyW10gc2lnbmF0dXJlKCkgLyogKElMamF2YS9sYW5nL1RocmVhZDspTGphdmEvbGFuZy9PYmplY3Q7ICovIHsKIAlpZiAoc2lnbmF0dXJlICE9IG51bGwpCiAJCXJldHVybiBzaWduYXR1cmU7CiAKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJhbWV0ZXJzLmxlbmd0aCArIDEgKiAyMCk7CiAJYnVmZmVyLmFwcGVuZCgnKCcpOwotCWlmIChpc0NvbnN0cnVjdG9yUmVsYXRlZCgpICYmIGRlY2xhcmluZ0NsYXNzLmlzTmVzdGVkVHlwZSgpKSB7CisJCisJVHlwZUJpbmRpbmdbXSB0YXJnZXRQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOworCWJvb2xlYW4gY29uc2lkZXJTeW50aGV0aWNzID0gaXNDb25zdHJ1Y3RvclJlbGF0ZWQoKSAmJiBkZWNsYXJpbmdDbGFzcy5pc05lc3RlZFR5cGUoKTsKKwlpZiAoY29uc2lkZXJTeW50aGV0aWNzKSB7CisJCQogCQkvLyB0YWtlIGludG8gYWNjb3VudCB0aGUgc3ludGhldGljIGFyZ3VtZW50IHR5cGUgc2lnbmF0dXJlcyBhcyB3ZWxsCiAJCVJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VUeXBlcygpOwogCQlpbnQgY291bnQgPSBzeW50aGV0aWNBcmd1bWVudFR5cGVzID09IG51bGwgPyAwIDogc3ludGhldGljQXJndW1lbnRUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQlidWZmZXIuYXBwZW5kKHN5bnRoZXRpY0FyZ3VtZW50VHlwZXNbaV0uc2lnbmF0dXJlKCkpOwotCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNBcmd1bWVudHMgPSBkZWNsYXJpbmdDbGFzcy5zeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCk7Ci0JCWNvdW50ID0gc3ludGhldGljQXJndW1lbnRzID09IG51bGwgPyAwIDogc3ludGhldGljQXJndW1lbnRzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZChzeW50aGV0aWNBcmd1bWVudHNbaV0udHlwZS5zaWduYXR1cmUoKSk7CisJCX0KKwkJCisJCWlmICh0aGlzIGluc3RhbmNlb2YgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZykgeworCQkJdGFyZ2V0UGFyYW1ldGVycyA9ICgoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyl0aGlzKS50YXJnZXRNZXRob2QucGFyYW1ldGVyczsKKwkJfQogCX0KLQlpZiAocGFyYW1ldGVycyAhPSBOb1BhcmFtZXRlcnMpCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCisJaWYgKHRhcmdldFBhcmFtZXRlcnMgIT0gTm9QYXJhbWV0ZXJzKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0UGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCh0YXJnZXRQYXJhbWV0ZXJzW2ldLnNpZ25hdHVyZSgpKTsKKwkJfQorCX0KKwlpZiAoY29uc2lkZXJTeW50aGV0aWNzKSB7CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY091dGVyQXJndW1lbnRzID0gZGVjbGFyaW5nQ2xhc3Muc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQlpbnQgY291bnQgPSBzeW50aGV0aWNPdXRlckFyZ3VtZW50cyA9PSBudWxsID8gMCA6IHN5bnRoZXRpY091dGVyQXJndW1lbnRzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKHN5bnRoZXRpY091dGVyQXJndW1lbnRzW2ldLnR5cGUuc2lnbmF0dXJlKCkpOworCQl9CisJCS8vIG1vdmUgdGhlIGV4dHJhIHBhZGRpbmcgYXJndW1lbnRzIG9mIHRoZSBzeW50aGV0aWMgY29uc3RydWN0b3IgaW52b2NhdGlvbiB0byB0aGUgZW5kCQkKKwkJZm9yIChpbnQgaSA9IHRhcmdldFBhcmFtZXRlcnMubGVuZ3RoLCBleHRyYUxlbmd0aCA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgZXh0cmFMZW5ndGg7IGkrKykgewogCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzW2ldLnNpZ25hdHVyZSgpKTsKKwkJfQorCX0KIAlidWZmZXIuYXBwZW5kKCcpJyk7CiAJYnVmZmVyLmFwcGVuZChyZXR1cm5UeXBlLnNpZ25hdHVyZSgpKTsKIAlyZXR1cm4gc2lnbmF0dXJlID0gYnVmZmVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kU2NvcGUuamF2YQppbmRleCA5MmJhNjhmLi5mOGJmMzc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFNjb3BlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RTY29wZS5qYXZhCkBAIC0xLDIyICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5VbmNvbmRpdGlvbmFsRmxvd0luZm87CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLlJlZmVyZW5jZUNvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwogCkBAIC0yOCwxNyArMzEsMTUgQEAKIHB1YmxpYyBjbGFzcyBNZXRob2RTY29wZSBleHRlbmRzIEJsb2NrU2NvcGUgewogCiAJcHVibGljIFJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dDsKLQlwdWJsaWMgYm9vbGVhbiBuZWVkVG9Db21wYWN0TG9jYWxWYXJpYWJsZXM7CiAJcHVibGljIGJvb2xlYW4gaXNTdGF0aWM7IC8vIG1ldGhvZCBtb2RpZmllciBvciBpbml0aWFsaXplciBvbmUKIAotCS8vZmllbGRzIHVzZWQgaW4gdGhlIFRDIHByb2Nlc3MgKG5vIHJlYWwgbWVhbmluZykKKwkvL2ZpZWxkcyB1c2VkIGR1cmluZyBuYW1lIHJlc29sdXRpb24KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOb3RJbkZpZWxkRGVjbCA9IC0xOyAvL211c3QgYmUgYSBuZWdhdGl2ZSB2YWx1ZSAKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOyAvL21vZGlmaWVkIG9uIHRoZSBmbHkgYnkgdGhlIFRDCi0JcHVibGljIGludCBmaWVsZERlY2xhcmF0aW9uSW5kZXggPSBOb3RJbkZpZWxkRGVjbDsKLQkvL21vZGlmaWVkIG9uIHRoZSBmbHkgYnkgdGhlIFRDCisJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsgCisJcHVibGljIGludCBmaWVsZERlY2xhcmF0aW9uSW5kZXggPSBOb3RJbkZpZWxkRGVjbDsgCiAKKwkvLyBmbG93IGFuYWx5c2lzCiAJcHVibGljIGludCBhbmFseXNpc0luZGV4OyAvLyBmb3Igc2V0dGluZyBmbG93LWFuYWx5c2lzIGlkCi0KIAlwdWJsaWMgYm9vbGVhbiBpc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbjsKIAogCS8vIGZvciBsb2NhbCB2YXJpYWJsZXMgdGFibGUgYXR0cmlidXRlcwpAQCAtNDYsMTAgKzQ3LDEwIEBACiAJcHVibGljIGxvbmdbXSBkZWZpbml0ZUluaXRzID0gbmV3IGxvbmdbNF07CiAJcHVibGljIGxvbmdbXVtdIGV4dHJhRGVmaW5pdGVJbml0cyA9IG5ldyBsb25nWzRdW107CiAKLQlwdWJsaWMgTWV0aG9kU2NvcGUoCi0JCUNsYXNzU2NvcGUgcGFyZW50LAotCQlSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQsCi0JCWJvb2xlYW4gaXNTdGF0aWMpIHsKKwkvLyBpbm5lci1lbXVsYXRpb24KKwlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gZXh0cmFTeW50aGV0aWNBcmd1bWVudHM7CisJCisJcHVibGljIE1ldGhvZFNjb3BlKENsYXNzU2NvcGUgcGFyZW50LCBSZWZlcmVuY2VDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaXNTdGF0aWMpIHsKIAogCQlzdXBlcihNRVRIT0RfU0NPUEUsIHBhcmVudCk7CiAJCWxvY2FscyA9IG5ldyBMb2NhbFZhcmlhYmxlQmluZGluZ1s1XTsKQEAgLTIxMyw2ICsyMTQsNzggQEAKIAkJbWV0aG9kQmluZGluZy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CiAJfQogCQorCS8qIENvbXB1dGUgdmFyaWFibGUgcG9zaXRpb25zIGluIHNjb3BlcyBnaXZlbiBhbiBpbml0aWFsIHBvc2l0aW9uIG9mZnNldAorCSAqIGlnbm9yaW5nIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCisJICogCisJICogRGVhbCB3aXRoIGFyZ3VtZW50cyBoZXJlLCBsb2NhbHMgYW5kIHN1YnNjb3BlcyBhcmUgcHJvY2Vzc2VkIGluIEJsb2NrU2NvcGUgbWV0aG9kCisJICovCisJcHVibGljIHZvaWQgY29tcHV0ZUxvY2FsVmFyaWFibGVQb3NpdGlvbnMoaW50IGluaXRPZmZzZXQsIENvZGVTdHJlYW0gY29kZVN0cmVhbSkgeworCisJCWJvb2xlYW4gaXNSZXBvcnRpbmdVbnVzZWRBcmd1bWVudCA9IGZhbHNlOworCisJCWlmIChyZWZlcmVuY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgeworCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pcmVmZXJlbmNlQ29udGV4dDsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kRGVjbC5iaW5kaW5nOworCQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBjb21waWxhdGlvblVuaXRTY29wZSgpLmVudmlyb25tZW50Lm9wdGlvbnM7CisJCQlpZiAoIShtZXRob2QuaXNBYnN0cmFjdCgpCisJCQkJCXx8IChtZXRob2QuaXNJbXBsZW1lbnRpbmcoKSAmJiAhb3B0aW9ucy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3QpIAorCQkJCQl8fCAobWV0aG9kLmlzT3ZlcnJpZGluZygpICYmICFtZXRob2QuaXNJbXBsZW1lbnRpbmcoKSAmJiAhb3B0aW9ucy5yZXBvcnRVbnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlKQorCQkJCQl8fCBtZXRob2QuaXNNYWluKCkpKSB7CisJCQkJaXNSZXBvcnRpbmdVbnVzZWRBcmd1bWVudCA9IHRydWU7CisJCQl9CisJCX0KKwkJdGhpcy5vZmZzZXQgPSBpbml0T2Zmc2V0OworCQl0aGlzLm1heE9mZnNldCA9IGluaXRPZmZzZXQ7CisKKwkJLy8gbWFuYWdlIGFyZ3VtZW50cwkKKwkJaW50IGlsb2NhbCA9IDAsIG1heExvY2FscyA9IHRoaXMubG9jYWxJbmRleDsJCisJCXdoaWxlIChpbG9jYWwgPCBtYXhMb2NhbHMpIHsKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsID0gbG9jYWxzW2lsb2NhbF07CisJCQlpZiAobG9jYWwgPT0gbnVsbCB8fCAhbG9jYWwuaXNBcmd1bWVudCkgYnJlYWs7IC8vIGRvbmUgd2l0aCBhcmd1bWVudHMKKworCQkJLy8gZG8gbm90IHJlcG9ydCBmYWtlIHVzZWQgdmFyaWFibGUKKwkJCWlmIChpc1JlcG9ydGluZ1VudXNlZEFyZ3VtZW50CisJCQkJCSYmIGxvY2FsLnVzZUZsYWcgPT0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuVU5VU0VECisJCQkJCSYmICgobG9jYWwuZGVjbGFyYXRpb24uYml0cyAmIEFzdE5vZGUuSXNMb2NhbERlY2xhcmF0aW9uUmVhY2hhYmxlTUFTSykgIT0gMCkpIHsgLy8gZGVjbGFyYXRpb24gaXMgcmVhY2hhYmxlCisJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS51bnVzZWRBcmd1bWVudChsb2NhbC5kZWNsYXJhdGlvbik7CisJCQl9CisKKwkJCS8vIHJlY29yZCB1c2VyLWRlZmluZWQgYXJndW1lbnQgZm9yIGF0dHJpYnV0ZSBnZW5lcmF0aW9uCisJCQljb2RlU3RyZWFtLnJlY29yZChsb2NhbCk7IAorCisJCQkvLyBhc3NpZ24gdmFyaWFibGUgcG9zaXRpb24KKwkJCWxvY2FsLnJlc29sdmVkUG9zaXRpb24gPSB0aGlzLm9mZnNldDsKKworCQkJaWYgKChsb2NhbC50eXBlID09IExvbmdCaW5kaW5nKSB8fCAobG9jYWwudHlwZSA9PSBEb3VibGVCaW5kaW5nKSkgeworCQkJCXRoaXMub2Zmc2V0ICs9IDI7CisJCQl9IGVsc2UgeworCQkJCXRoaXMub2Zmc2V0Kys7CisJCQl9CisJCQkvLyBjaGVjayBmb3IgdG9vIG1hbnkgYXJndW1lbnRzL2xvY2FsIHZhcmlhYmxlcworCQkJaWYgKHRoaXMub2Zmc2V0ID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cworCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChsb2NhbCwgbG9jYWwuZGVjbGFyYXRpb24pOworCQkJfQorCQkJaWxvY2FsKys7CisJCX0KKwkJCisJCS8vIHNuZWFrIGluIGV4dHJhIGFyZ3VtZW50IGJlZm9yZSBvdGhlciBsb2NhbCB2YXJpYWJsZXMKKwkJaWYgKGV4dHJhU3ludGhldGljQXJndW1lbnRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGlhcmcgPSAwLCBtYXhBcmd1bWVudHMgPSBleHRyYVN5bnRoZXRpY0FyZ3VtZW50cy5sZW5ndGg7IGlhcmcgPCBtYXhBcmd1bWVudHM7IGlhcmcrKyl7CisJCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFyZ3VtZW50ID0gZXh0cmFTeW50aGV0aWNBcmd1bWVudHNbaWFyZ107CisJCQkJYXJndW1lbnQucmVzb2x2ZWRQb3NpdGlvbiA9IHRoaXMub2Zmc2V0OworCQkJCWlmICgoYXJndW1lbnQudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGFyZ3VtZW50LnR5cGUgPT0gRG91YmxlQmluZGluZykpeworCQkJCQl0aGlzLm9mZnNldCArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMub2Zmc2V0Kys7CisJCQkJfQorCQkJCWlmICh0aGlzLm9mZnNldCA+IDB4RkYpIHsgLy8gbm8gbW9yZSB0aGFuIDI1NSB3b3JkcyBvZiBhcmd1bWVudHMKKwkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5ub01vcmVBdmFpbGFibGVTcGFjZUZvckFyZ3VtZW50KGFyZ3VtZW50LCAoQXN0Tm9kZSl0aGlzLnJlZmVyZW5jZUNvbnRleHQpOyAKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5jb21wdXRlTG9jYWxWYXJpYWJsZVBvc2l0aW9ucyhpbG9jYWwsIHRoaXMub2Zmc2V0LCBjb2RlU3RyZWFtKTsKKwl9CisKIAkvKiBFcnJvciBtYW5hZ2VtZW50OgogCSAqIAkJa2VlcCBudWxsIGZvciBhbGwgdGhlIGVycm9ycyB0aGF0IHByZXZlbnQgdGhlIG1ldGhvZCB0byBiZSBjcmVhdGVkCiAJICogCQlvdGhlcndpc2UgcmV0dXJuIGEgY29ycmVjdCBtZXRob2QgYmluZGluZyAoYnV0IHdpdGhvdXQgdGhlIGVsZW1lbnQKQEAgLTMxNSw5ICszODgsOCBAQAogCiAJcHVibGljIGZpbmFsIGludCByZWNvcmRJbml0aWFsaXphdGlvblN0YXRlcyhGbG93SW5mbyBmbG93SW5mbykgewogCi0JCWlmICgoZmxvd0luZm8gPT0gRmxvd0luZm8uRGVhZEVuZCkgfHwgKGZsb3dJbmZvLmlzRmFrZVJlYWNoYWJsZSgpKSkgewotCQkJcmV0dXJuIC0xOwotCQl9CisJCWlmICghZmxvd0luZm8uaXNSZWFjaGFibGUoKSkgcmV0dXJuIC0xOworCiAJCVVuY29uZGl0aW9uYWxGbG93SW5mbyB1bmNvbmRpdGlvbmFsRmxvd0luZm8gPSBmbG93SW5mby51bmNvbmRpdGlvbmFsSW5pdHMoKTsKIAkJbG9uZ1tdIGV4dHJhSW5pdHMgPSB1bmNvbmRpdGlvbmFsRmxvd0luZm8uZXh0cmFEZWZpbml0ZUluaXRzOwogCQlsb25nIGluaXRzID0gdW5jb25kaXRpb25hbEZsb3dJbmZvLmRlZmluaXRlSW5pdHM7CkBAIC0zOTQsNyArNDY2LDggQEAKIAkJcyArPSBuZXdMaW5lICsgInN0YXJ0SW5kZXggPSAiICsgc3RhcnRJbmRleDsgLy8kTk9OLU5MUy0xJAogCQlzICs9IG5ld0xpbmUgKyAiaXNDb25zdHJ1Y3RvckNhbGwgPSAiICsgaXNDb25zdHJ1Y3RvckNhbGw7IC8vJE5PTi1OTFMtMSQKIAkJcyArPSBuZXdMaW5lICsgImZpZWxkRGVjbGFyYXRpb25JbmRleCA9ICIgKyBmaWVsZERlY2xhcmF0aW9uSW5kZXg7IC8vJE5PTi1OTFMtMSQKKwkJcyArPSBuZXdMaW5lICsgInJlZmVyZW5jZUNvbnRleHQgPSAiICsgcmVmZXJlbmNlQ29udGV4dDsgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gczsKIAl9CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL01ldGhvZFZlcmlmaWVyLmphdmEKaW5kZXggNTY1N2I4NC4uOTAzNTYyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9NZXRob2RWZXJpZmllci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTWV0aG9kVmVyaWZpZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZPYmplY3Q7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RWZXJpZmllciBpbXBsZW1lbnRzIFRhZ0JpdHMsIFR5cGVDb25zdGFudHMgewpAQCAtMjIsNiArMjIsNyBAQAogCUhhc2h0YWJsZU9mT2JqZWN0IGN1cnJlbnRNZXRob2RzOwogCVJlZmVyZW5jZUJpbmRpbmcgcnVudGltZUV4Y2VwdGlvbjsKIAlSZWZlcmVuY2VCaW5kaW5nIGVycm9yRXhjZXB0aW9uOworCUxvb2t1cEVudmlyb25tZW50IGVudmlyb25tZW50OwogLyoKIEJpbmRpbmcgY3JlYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyBhbGwgcHJvYmxlbXMgd2l0aCB0eXBlczoKIAktIGFsbCBtb2RpZmllciBwcm9ibGVtcyAoZHVwbGljYXRlcyAmIG11bHRpcGxlIHZpc2liaWxpdHkgbW9kaWZpZXJzICsgaW5jb21wYXRpYmxlIGNvbWJpbmF0aW9ucyAtIGFic3RyYWN0L2ZpbmFsKQpAQCAtMzgsMjE1ICszOSwyNSBAQAogCQktIHNoYWRvd2luZyBhbiBlbmNsb3NpbmcgdHlwZSdzIHNvdXJjZSBuYW1lCiAJCS0gZGVmaW5pbmcgYSBzdGF0aWMgY2xhc3Mgb3IgaW50ZXJmYWNlIGluc2lkZSBhIG5vbi1zdGF0aWMgbmVzdGVkIGNsYXNzCiAJCS0gZGVmaW5pbmcgYW4gaW50ZXJmYWNlIGFzIGEgbG9jYWwgdHlwZSAobG9jYWwgdHlwZXMgY2FuIG9ubHkgYmUgY2xhc3NlcykKLQotdmVyaWZ5VHlwZVN0cnVjdHVyZQotCi0JfCBoYXNIaWVyYXJjaHlQcm9ibGVtIHN1cGVyY2xhc3MgY3VycmVudCBuYW1lcyBpbnRlcmZhY2VzIGludGVyZmFjZXNCeUluZGVudGl0eSBkdXBsaWNhdGVFeGlzdHMgaW52YWxpZFR5cGUgfAotCi0JKHR5cGUgYmFzaWNNb2RpZmllcnMgYW55TWFzazogQWNjTW9kaWZpZXJQcm9ibGVtIHwgQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSBpZlRydWU6IFsKLQkJc2VsZiByZXBvcnRNb2RpZmllclByb2JsZW1zT25UeXBlOiB0eXBlXS4KLQotCXR5cGUgY29udHJvbGxlciBpc0phdmFEZWZhdWx0UGFja2FnZSBpZkZhbHNlOiBbCi0JCShuYW1lRW52aXJvbm1lbnQgY2xhc3MgZG9lc1BhY2thZ2VFeGlzdE5hbWVkOiB0eXBlIGphdmFRdWFsaWZpZWROYW1lKSBpZlRydWU6IFsKLQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0NvbGxpZGVzV2l0aFBhY2thZ2UKLQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogdHlwZSBqYXZhUXVhbGlmaWVkTmFtZSkKLQkJCQlzZXZlcml0eTogbmlsCi0JCQkJZm9yVHlwZTogdHlwZV1dLgotCi0JaGFzSGllcmFyY2h5UHJvYmxlbSA6PSBmYWxzZS4KLQotCXR5cGUgaXNKYXZhQ2xhc3MKLQkJaWZUcnVlOiBbCi0JCQkoc3VwZXJjbGFzcyA6PSBzZWxmIHN1cGVyY2xhc3NGb3I6IHR5cGUpIH5+IG5pbCBpZlRydWU6IFsKLQkJCQlzdXBlcmNsYXNzIGlzQnVpbGRlckNsYXNzIGlmVHJ1ZTogWwotCQkJCQlzdXBlcmNsYXNzIDo9IHN1cGVyY2xhc3MgbmV3Q2xhc3NdLgotCQkJCXN1cGVyY2xhc3MgaXNKYXZhTWlzc2luZwotCQkJCQlpZlRydWU6IFsKLQkJCQkJCWhhc0hpZXJhcmNoeVByb2JsZW0gOj0gdHJ1ZS4KLQkJCQkJCXR5cGUgamF2YVN1cGVyY2xhc3NJc01pc3NpbmcgaWZUcnVlOiBbCi0JCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI01pc3NpbmdTdXBlcmNsYXNzCi0JCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBzdXBlcmNsYXNzIGphdmFRdWFsaWZpZWROYW1lIHdpdGg6IHN1cGVyY2xhc3MgdW5tYXRjaGVkRGVzY3JpcHRvcikKLQkJCQkJCQkJc2V2ZXJpdHk6IG5pbAotCQkJCQkJCQlmb3JUeXBlOiB0eXBlXS4KLQkJCQkJCXR5cGUgamF2YVN1cGVyY2xhc3NDcmVhdGVzQ3ljbGUgaWZUcnVlOiBbCi0JCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0N5Y2xpY1N1cGVyY2xhc3MKLQkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IHN1cGVyY2xhc3MgamF2YVF1YWxpZmllZE5hbWUpCi0JCQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCQkJZm9yVHlwZTogdHlwZV0uCi0JCQkJCQl0eXBlIGphdmFTdXBlcmNsYXNzSXNJbnRlcmZhY2UgaWZUcnVlOiBbCi0JCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0NsYXNzQ2Fubm90RXh0ZW5kQW5JbnRlcmZhY2UKLQkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IHN1cGVyY2xhc3MgamF2YVF1YWxpZmllZE5hbWUpCi0JCQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCQkJZm9yVHlwZTogdHlwZV1dCi0JCQkJCWlmRmFsc2U6IFsKLQkJCQkJCSJOT1RFOiAgSWYgdHlwZSBpcyBhIEphdmEgY2xhc3MgYW5kIGl0cyBzdXBlcmNsYXNzIGlzCi0JCQkJCQlhIHZhbGlkIGRlc2NyaXB0b3IgdGhlbiBpdCBzaG91bGQgTkVWRVIgYmUgYW4gaW50ZXJmYWNlLiIKLQotCQkJCQkJc3VwZXJjbGFzcyBpc0phdmFGaW5hbCBpZlRydWU6IFsKLQkJCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjQ2xhc3NDYW5ub3RFeHRlbmRGaW5hbENsYXNzCi0JCQkJCQkJCWFyZ3M6IG5pbAotCQkJCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQkJCWZvclR5cGU6IHR5cGVdXV1dCi0JCWlmRmFsc2U6IFsKLQkJCXR5cGUgaXNKYXZhTG9jYWxUeXBlIGlmVHJ1ZTogWwotCQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNDYW5ub3REZWZpbmVMb2NhbEludGVyZmFjZQotCQkJCQlhcmdzOiBuaWwKLQkJCQkJc2V2ZXJpdHk6IG5pbAotCQkJCQlmb3JUeXBlOiB0eXBlXV0uCi0KLQl0eXBlIGlzSmF2YU5lc3RlZFR5cGUgaWZUcnVlOiBbCi0JCShjdXJyZW50IDo9IHR5cGUpIHNvdXJjZU5hbWUgbm90RW1wdHkgaWZUcnVlOiBbCi0JCQluYW1lcyA6PSBTZXQgbmV3LgotCQkJWyhjdXJyZW50IDo9IGN1cnJlbnQgZW5jbG9zaW5nVHlwZSkgfn4gbmlsXSB3aGlsZVRydWU6IFsKLQkJCQluYW1lcyBhZGQ6IGN1cnJlbnQgc291cmNlTmFtZV0uCi0KLQkJCShuYW1lcyBpbmNsdWRlczogdHlwZSBzb3VyY2VOYW1lKSBpZlRydWU6IFsKLQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjTmVzdGVkVHlwZUNhbm5vdFNoYWRvd1R5cGVOYW1lCi0JCQkJCWFyZ3M6IG5pbAotCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCWZvclR5cGU6IHR5cGVdXS4KLQotCQkodHlwZSBlbmNsb3NpbmdUeXBlIGlzSmF2YU5lc3RlZFR5cGUgYW5kOiBbdHlwZSBlbmNsb3NpbmdUeXBlIGlzSmF2YUNsYXNzXSkgaWZUcnVlOiBbCi0JCQl0eXBlIGVuY2xvc2luZ1R5cGUgaXNKYXZhU3RhdGljIGlmRmFsc2U6IFsKLQkJCQl0eXBlIGlzSmF2YUNsYXNzCi0JCQkJCWlmVHJ1ZTogWwotCQkJCQkJdHlwZSBpc0phdmFTdGF0aWMgaWZUcnVlOiBbCi0JCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI1N0YXRpY0NsYXNzQ2Fubm90RXhpc3RJbk5lc3RlZENsYXNzCi0JCQkJCQkJCWFyZ3M6IG5pbAotCQkJCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQkJCWZvclR5cGU6IHR5cGVdXQotCQkJCQlpZkZhbHNlOiBbCi0JCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbnRlcmZhY2VDYW5ub3RFeGlzdEluTmVzdGVkQ2xhc3MKLQkJCQkJCQlhcmdzOiBuaWwKLQkJCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQkJZm9yVHlwZTogdHlwZV1dXV0uCi0KLQkoaW50ZXJmYWNlcyA6PSBuZXdDbGFzcyBzdXBlcmludGVyZmFjZXMpIG5vdEVtcHR5IGlmVHJ1ZTogWwotCQlpbnRlcmZhY2VzQnlJbmRlbnRpdHkgOj0gaW50ZXJmYWNlcyBhc1NldC4KLQkJZHVwbGljYXRlRXhpc3RzIDo9IGludGVyZmFjZXMgc2l6ZSB+fiBpbnRlcmZhY2VzQnlJbmRlbnRpdHkgc2l6ZS4KLQotCQlpbnRlcmZhY2VzQnlJbmRlbnRpdHkgZG86IFs6aW50ZXJmYWNlIHwKLQkJCWR1cGxpY2F0ZUV4aXN0cyBpZlRydWU6IFsKLQkJCQkoaW50ZXJmYWNlcyBvY2N1cnJlbmNlc09mOiBpbnRlcmZhY2UpID4gMSBpZlRydWU6IFsKLQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbnRlcmZhY2VJc1NwZWNpZmllZE1vcmVUaGFuT25jZQotCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKLQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCWZvclR5cGU6IHR5cGVdXS4KLQotCQkJaW50ZXJmYWNlIGlzSmF2YU1pc3NpbmcgaWZUcnVlOiBbCi0JCQkJaGFzSGllcmFyY2h5UHJvYmxlbSA6PSB0cnVlLgotCQkJCWludGVyZmFjZSBiYXNpY0NsYXNzID09IEphdmFJbnRlcmZhY2VJc0NsYXNzIGJhc2ljQ2xhc3MKLQkJCQkJaWZUcnVlOiBbCi0JCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNVc2luZ0NsYXNzV2hlcmVJbnRlcmZhY2VJc1JlcXVpcmVkCi0JCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKLQkJCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQkJZm9yVHlwZTogdHlwZV0KLQkJCQkJaWZGYWxzZTogWwotCQkJCQkJaW50ZXJmYWNlIGJhc2ljQ2xhc3MgPT0gSmF2YU1pc3NpbmdJbnRlcmZhY2UgYmFzaWNDbGFzcwotCQkJCQkJCWlmVHJ1ZTogWwotCQkJCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI01pc3NpbmdJbnRlcmZhY2UKLQkJCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBpbnRlcmZhY2UgamF2YVF1YWxpZmllZE5hbWUgd2l0aDogaW50ZXJmYWNlIHVubWF0Y2hlZERlc2NyaXB0b3IpCi0JCQkJCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQkJCQlmb3JUeXBlOiB0eXBlXQotCQkJCQkJCWlmRmFsc2U6IFsKLQkJCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNDeWNsaWNTdXBlcmludGVyZmFjZQotCQkJCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGludGVyZmFjZSBqYXZhUXVhbGlmaWVkTmFtZSkKLQkJCQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCQkJCWZvclR5cGU6IHR5cGVdXV1dXS4KLQotCWhhc0hpZXJhcmNoeVByb2JsZW0gaWZGYWxzZTogWwotCQkiU2VhcmNoIHVwIHRoZSB0eXBlJ3MgaGllcmFyY2h5IGZvcgotCQkJMS4gbWlzc2luZyBzdXBlcmNsYXNzLAotCQkJMi4gc3VwZXJjbGFzcyBjeWNsZSwgb3IKLQkJCTMuIHN1cGVyY2xhc3MgaXMgaW50ZXJmYWNlLiIKLQkJKGludmFsaWRUeXBlIDo9IG5ld0NsYXNzIGZpbmRGaXJzdEludmFsaWRTdXBlcnR5cGVTa2lwcGluZzogRXNJZGVudGl0eVNldCBuZXcpIH5+IG5pbCBpZlRydWU6IFsKLQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0hhc0hpZXJhcmNoeVByb2JsZW0KLQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogaW52YWxpZFR5cGUgamF2YVJlYWRhYmxlTmFtZSkKLQkJCQlzZXZlcml0eTogbmlsCi0JCQkJZm9yVHlwZTogdHlwZV1dCi0KLXJlcG9ydE1vZGlmaWVyUHJvYmxlbXNPblR5cGU6IGFUeXBlCi0KLQkodHlwZSBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NBbHRlcm5hdGVNb2RpZmllclByb2JsZW0pIGlmVHJ1ZTogWwotCQkodHlwZSBiYXNpY01vZGlmaWVycyBhbnlNYXNrOiBBY2NNb2RpZmllclByb2JsZW0pCi0JCQlpZlRydWU6IFsKLQkJCQlecHJvYmxlbVN1bW1hcnkKLQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI09ubHlPbmVWaXNpYmlsaXR5TW9kaWZpZXJBbGxvd2VkCi0JCQkJCWFyZ3M6IG5pbAotCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCWZvclR5cGU6IGFUeXBlXQotCQkJaWZGYWxzZTogWwotCQkJCV5wcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjRHVwbGljYXRlTW9kaWZpZXIKLQkJCQkJYXJnczogbmlsCi0JCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJZm9yVHlwZTogYVR5cGVdXS4KLQotCXR5cGUgaXNKYXZhSW50ZXJmYWNlIGlmVHJ1ZTogWwotCQlecHJvYmxlbVN1bW1hcnkKLQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UKLQkJCWFyZ3M6IG5pbAotCQkJc2V2ZXJpdHk6IG5pbAotCQkJZm9yVHlwZTogYVR5cGVdLgotCi0JKHR5cGUgYmFzaWNNb2RpZmllcnMgYWxsTWFzazogQWNjQWJzdHJhY3QgfCBBY2NGaW5hbCkgaWZUcnVlOiBbCi0JCV5wcm9ibGVtU3VtbWFyeQotCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uQWJzdHJhY3RGaW5hbAotCQkJYXJnczogbmlsCi0JCQlzZXZlcml0eTogbmlsCi0JCQlmb3JUeXBlOiBhVHlwZV0uCi0KLQlecHJvYmxlbVN1bW1hcnkKLQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckZvckNsYXNzCi0JCWFyZ3M6IG5pbAotCQlzZXZlcml0eTogbmlsCi0JCWZvclR5cGU6IGFUeXBlCi0KLXZvaWQgcmVwb3J0TW9kaWZpZXJQcm9ibGVtcygpIHsKLQlpZiAodGhpcy50eXBlLmlzQWJzdHJhY3QoKSAmJiB0aGlzLnR5cGUuaXNGaW5hbCgpKQotCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkFic3RyYWN0RmluYWwodGhpcy50eXBlKTsKLQotCS8vIFNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCBhbGwgMyBwcm9ibGVtcyBOT1QganVzdCAxCi0JaWYgKCh0eXBlLm1vZGlmaWVycygpICYgTW9kaWZpZXJzLkFjY0FsdGVybmF0ZU1vZGlmaWVyUHJvYmxlbSkgPT0gMCkgewotCQlpZiAodGhpcy50eXBlLmlzSW50ZXJmYWNlKCkpCi0JCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UodGhpcy50eXBlKTsKLQkJZWxzZQotCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuaWxsZWdhbE1vZGlmaWVyKHRoaXMudHlwZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKCh0eXBlLm1vZGlmaWVycygpICYgTW9kaWZpZXJzLkFjY01vZGlmaWVyUHJvYmxlbSkgIT0gMCkKLQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLm9ubHlPbmVWaXNpYmlsaXR5TW9kaWZpZXJBbGxvd2VkKHRoaXMudHlwZSk7Ci0JCWVsc2UKLQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmR1cGxpY2F0ZU1vZGlmaWVyKHRoaXMudHlwZSk7Ci0JfQotfQogKi8KIHB1YmxpYyBNZXRob2RWZXJpZmllcihMb29rdXBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCXRoaXMudHlwZSA9IG51bGw7CQkvLyBJbml0aWFsaXplZCB3aXRoIHRoZSBwdWJsaWMgbWV0aG9kIHZlcmlmeShTb3VyY2VUeXBlQmluZGluZykKKwl0aGlzLnR5cGUgPSBudWxsOyAgLy8gSW5pdGlhbGl6ZWQgd2l0aCB0aGUgcHVibGljIG1ldGhvZCB2ZXJpZnkoU291cmNlVHlwZUJpbmRpbmcpCiAJdGhpcy5pbmhlcml0ZWRNZXRob2RzID0gbnVsbDsKIAl0aGlzLmN1cnJlbnRNZXRob2RzID0gbnVsbDsKIAl0aGlzLnJ1bnRpbWVFeGNlcHRpb24gPSBudWxsOwogCXRoaXMuZXJyb3JFeGNlcHRpb24gPSBudWxsOworCXRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKIH0KIHByaXZhdGUgdm9pZCBjaGVja0FnYWluc3RJbmhlcml0ZWRNZXRob2RzKE1ldGhvZEJpbmRpbmcgY3VycmVudE1ldGhvZCwgTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKKwljdXJyZW50TWV0aG9kLm1vZGlmaWVycyB8PSBDb21waWxlck1vZGlmaWVycy5BY2NPdmVycmlkaW5nOwogCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+PSAwOykgewogCQlNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCA9IG1ldGhvZHNbaV07CisJCWlmICghY3VycmVudE1ldGhvZC5pc0Fic3RyYWN0KCkgJiYgaW5oZXJpdGVkTWV0aG9kLmlzQWJzdHJhY3QoKSkKKwkJCWN1cnJlbnRNZXRob2QubW9kaWZpZXJzIHw9IENvbXBpbGVyTW9kaWZpZXJzLkFjY0ltcGxlbWVudGluZzsKKwogCQlpZiAoY3VycmVudE1ldGhvZC5yZXR1cm5UeXBlICE9IGluaGVyaXRlZE1ldGhvZC5yZXR1cm5UeXBlKSB7CiAJCQl0aGlzLnByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS5pbmNvbXBhdGlibGVSZXR1cm5UeXBlKGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7Ci0JCX0gZWxzZSBpZiAoY3VycmVudE1ldGhvZC5pc1N0YXRpYygpICE9IGluaGVyaXRlZE1ldGhvZC5pc1N0YXRpYygpKQkgewkvLyBDYW5ub3Qgb3ZlcnJpZGUgYSBzdGF0aWMgbWV0aG9kIG9yIGhpZGUgYW4gaW5zdGFuY2UgbWV0aG9kCisJCX0gZWxzZSBpZiAoY3VycmVudE1ldGhvZC5pc1N0YXRpYygpICE9IGluaGVyaXRlZE1ldGhvZC5pc1N0YXRpYygpKSB7ICAvLyBDYW5ub3Qgb3ZlcnJpZGUgYSBzdGF0aWMgbWV0aG9kIG9yIGhpZGUgYW4gaW5zdGFuY2UgbWV0aG9kCiAJCQl0aGlzLnByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS5zdGF0aWNBbmRJbnN0YW5jZUNvbmZsaWN0KGN1cnJlbnRNZXRob2QsIGluaGVyaXRlZE1ldGhvZCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY3VycmVudE1ldGhvZC50aHJvd25FeGNlcHRpb25zICE9IE5vRXhjZXB0aW9ucykKQEAgLTI1Niw3ICs2Nyw3IEBACiAJCQlpZiAoIXRoaXMuaXNBc1Zpc2libGUoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKSkKIAkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcihjdXJyZW50TWV0aG9kKS52aXNpYmlsaXR5Q29uZmxpY3QoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKIAkJCWlmIChpbmhlcml0ZWRNZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkKLQkJCQlpZiAoIWN1cnJlbnRNZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkKKwkJCQlpZiAoIWN1cnJlbnRNZXRob2QuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSB8fCBlbnZpcm9ubWVudC5vcHRpb25zLnJlcG9ydERlcHJlY2F0aW9uSW5zaWRlRGVwcmVjYXRlZENvZGUpCiAJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKGN1cnJlbnRNZXRob2QpLm92ZXJyaWRlc0RlcHJlY2F0ZWRNZXRob2QoY3VycmVudE1ldGhvZCwgaW5oZXJpdGVkTWV0aG9kKTsKIAkJfQogCX0KQEAgLTI2Nyw3ICs3OCw2IEBACiBBc3N1bWVzIGFsbCBleGNlcHRpb25zIGFyZSB2YWxpZCBhbmQgdGhyb3dhYmxlLgogVW5jaGVja2VkIGV4Y2VwdGlvbnMgKGNvbXBhdGlibGUgd2l0aCBydW50aW1lICYgZXJyb3IpIGFyZSBpZ25vcmVkIChzZWUgdGhlIHNwZWMgb24gcGcuIDIwMykuCiAqLwotCiBwcml2YXRlIHZvaWQgY2hlY2tFeGNlcHRpb25zKE1ldGhvZEJpbmRpbmcgbmV3TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgewogCVJlZmVyZW5jZUJpbmRpbmdbXSBuZXdFeGNlcHRpb25zID0gbmV3TWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7CiAJUmVmZXJlbmNlQmluZGluZ1tdIGluaGVyaXRlZEV4Y2VwdGlvbnMgPSBpbmhlcml0ZWRNZXRob2QudGhyb3duRXhjZXB0aW9uczsKQEAgLTI4MywzMyArOTMsMzMgQEAKIHByaXZhdGUgdm9pZCBjaGVja0luaGVyaXRlZE1ldGhvZHMoTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMsIGludCBsZW5ndGgpIHsKIAlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gbWV0aG9kc1swXS5yZXR1cm5UeXBlOwogCWludCBpbmRleCA9IGxlbmd0aDsKLQl3aGlsZSAoKC0taW5kZXggPiAwKSAmJiAocmV0dXJuVHlwZSA9PSBtZXRob2RzW2luZGV4XS5yZXR1cm5UeXBlKSk7Ci0JaWYgKGluZGV4ID4gMCkgewkJLy8gQWxsIGluaGVyaXRlZCBtZXRob2RzIGRvIE5PVCBoYXZlIHRoZSBzYW1lIHZtU2lnbmF0dXJlCisJd2hpbGUgKC0taW5kZXggPiAwICYmIHJldHVyblR5cGUgPT0gbWV0aG9kc1tpbmRleF0ucmV0dXJuVHlwZSk7CisJaWYgKGluZGV4ID4gMCkgeyAgLy8gQWxsIGluaGVyaXRlZCBtZXRob2RzIGRvIE5PVCBoYXZlIHRoZSBzYW1lIHZtU2lnbmF0dXJlCiAJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuaW5oZXJpdGVkTWV0aG9kc0hhdmVJbmNvbXBhdGlibGVSZXR1cm5UeXBlcyh0aGlzLnR5cGUsIG1ldGhvZHMsIGxlbmd0aCk7CiAJCXJldHVybjsKIAl9CiAKIAlNZXRob2RCaW5kaW5nIGNvbmNyZXRlTWV0aG9kID0gbnVsbDsKLQlpZiAoIXR5cGUuaXNJbnRlcmZhY2UoKSl7IC8vIGlnbm9yZSBjb25jcmV0ZSBtZXRob2RzIGZvciBpbnRlcmZhY2VzCi0JCWZvciAoaW50IGkgPSBsZW5ndGg7IC0taSA+PSAwOykJCS8vIFJlbWVtYmVyIHRoYXQgb25seSBvbmUgb2YgdGhlIG1ldGhvZHMgY2FuIGJlIG5vbi1hYnN0cmFjdAorCWlmICghdHlwZS5pc0ludGVyZmFjZSgpKSB7ICAvLyBpZ25vcmUgY29uY3JldGUgbWV0aG9kcyBmb3IgaW50ZXJmYWNlcworCQlmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspIHsgIC8vIFJlbWVtYmVyIHRoYXQgb25seSBvbmUgb2YgdGhlIG1ldGhvZHMgY2FuIGJlIG5vbi1hYnN0cmFjdAogCQkJaWYgKCFtZXRob2RzW2ldLmlzQWJzdHJhY3QoKSkgewogCQkJCWNvbmNyZXRlTWV0aG9kID0gbWV0aG9kc1tpXTsKIAkJCQlicmVhazsKIAkJCX0KKwkJfQogCX0KIAlpZiAoY29uY3JldGVNZXRob2QgPT0gbnVsbCkgewogCQlpZiAodGhpcy50eXBlLmlzQ2xhc3MoKSAmJiAhdGhpcy50eXBlLmlzQWJzdHJhY3QoKSkgewogCQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KQotCQkJCWlmICghbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kKG1ldGhvZHNbaV0pKQotCQkJCQlyZXR1cm47CQkvLyBpbiB0aGlzIGNhc2UsIHdlIGhhdmUgYWxyZWFkeSByZXBvcnRlZCBwcm9ibGVtIGFnYWluc3QgdGhlIGNvbmNyZXRlIHN1cGVyY2xhc3MKKwkJCQlpZiAoIW11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZChtZXRob2RzW2ldKSkgcmV0dXJuOyAgLy8gaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIHByb2JsZW0gYWdhaW5zdCB0aGUgY29uY3JldGUgc3VwZXJjbGFzcwogCi0JCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0OwotCQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtaXNzaW5nQWJzdHJhY3RNZXRob2QgPSB0eXBlRGVjbGFyYXRpb24uYWRkTWlzc2luZ0Fic3RyYWN0TWV0aG9kRm9yKG1ldGhvZHNbMF0pOwotCQkJCQltaXNzaW5nQWJzdHJhY3RNZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1ldGhvZHNbMF0pOwotCQkJCX0KKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLnR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dDsKKwkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1pc3NpbmdBYnN0cmFjdE1ldGhvZCA9IHR5cGVEZWNsYXJhdGlvbi5hZGRNaXNzaW5nQWJzdHJhY3RNZXRob2RGb3IobWV0aG9kc1swXSk7CisJCQkJbWlzc2luZ0Fic3RyYWN0TWV0aG9kLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQodGhpcy50eXBlLCBtZXRob2RzWzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIoKS5hYnN0cmFjdE1ldGhvZE11c3RCZUltcGxlbWVudGVkKHRoaXMudHlwZSwgbWV0aG9kc1swXSk7CisJCQl9CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTM0OSw4ICsxNTksNyBAQAogCQkJCWVsc2UKIAkJCQkJY29tcGxhaW4gYWJvdXQgbWlzc2luZyBpbXBsZW1lbnRhdGlvbiBvbmx5IGlmIHR5cGUgaXMgTk9UIGFuIGludGVyZmFjZSBvciBhYnN0cmFjdAogKi8KLQotcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kcygpIHsKK3ByaXZhdGUgdm9pZCBjaGVja01ldGhvZHMoKSB7IAogCWJvb2xlYW4gbXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyA9IHRoaXMudHlwZS5pc0NsYXNzKCkgJiYgIXRoaXMudHlwZS5pc0Fic3RyYWN0KCk7CiAJY2hhcltdW10gbWV0aG9kU2VsZWN0b3JzID0gdGhpcy5pbmhlcml0ZWRNZXRob2RzLmtleVRhYmxlOwogCWZvciAoaW50IHMgPSBtZXRob2RTZWxlY3RvcnMubGVuZ3RoOyAtLXMgPj0gMDspIHsKQEAgLTM4NywyMiArMTk2LDQyIEBACiAJCQkJfQogCQkJCWlmIChpbmRleCA+IDApIHsKIAkJCQkJdGhpcy5jaGVja0luaGVyaXRlZE1ldGhvZHMobWF0Y2hpbmdJbmhlcml0ZWQsIGluZGV4ICsgMSk7IC8vIHBhc3MgaW4gdGhlIGxlbmd0aCBvZiBtYXRjaGluZwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChtdXN0SW1wbGVtZW50QWJzdHJhY3RNZXRob2RzICYmIGluZGV4ID09IDAgJiYgbWF0Y2hpbmdJbmhlcml0ZWRbMF0uaXNBYnN0cmFjdCgpKQotCQkJCQkJaWYgKG11c3RJbXBsZW1lbnRBYnN0cmFjdE1ldGhvZChtYXRjaGluZ0luaGVyaXRlZFswXSkpIHsKLQkJCQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdGhpcy50eXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7Ci0JCQkJCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1pc3NpbmdBYnN0cmFjdE1ldGhvZCA9IHR5cGVEZWNsYXJhdGlvbi5hZGRNaXNzaW5nQWJzdHJhY3RNZXRob2RGb3IobWF0Y2hpbmdJbmhlcml0ZWRbMF0pOwotCQkJCQkJCQltaXNzaW5nQWJzdHJhY3RNZXRob2Quc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1hdGNoaW5nSW5oZXJpdGVkWzBdKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQodGhpcy50eXBlLCBtYXRjaGluZ0luaGVyaXRlZFswXSk7Ci0JCQkJCQkJfQorCQkJCX0gZWxzZSBpZiAobXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kcyAmJiBpbmRleCA9PSAwICYmIG1hdGNoaW5nSW5oZXJpdGVkWzBdLmlzQWJzdHJhY3QoKSkgeworCQkJCQlpZiAobXVzdEltcGxlbWVudEFic3RyYWN0TWV0aG9kKG1hdGNoaW5nSW5oZXJpdGVkWzBdKSkgeworCQkJCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMudHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0OworCQkJCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7CisJCQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWlzc2luZ0Fic3RyYWN0TWV0aG9kID0gdHlwZURlY2xhcmF0aW9uLmFkZE1pc3NpbmdBYnN0cmFjdE1ldGhvZEZvcihtYXRjaGluZ0luaGVyaXRlZFswXSk7CisJCQkJCQkJbWlzc2luZ0Fic3RyYWN0TWV0aG9kLnNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmFic3RyYWN0TWV0aG9kTXVzdEJlSW1wbGVtZW50ZWQodGhpcy50eXBlLCBtYXRjaGluZ0luaGVyaXRlZFswXSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RNdXN0QmVJbXBsZW1lbnRlZCh0aGlzLnR5cGUsIG1hdGNoaW5nSW5oZXJpdGVkWzBdKTsKIAkJCQkJCX0KKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQogCX0KIH0KK3ByaXZhdGUgdm9pZCBjaGVja1BhY2thZ2VQcml2YXRlQWJzdHJhY3RNZXRob2QoTWV0aG9kQmluZGluZyBhYnN0cmFjdE1ldGhvZCkgeworCVJlZmVyZW5jZUJpbmRpbmcgc3VwZXJUeXBlID0gdGhpcy50eXBlLnN1cGVyY2xhc3MoKTsKKwljaGFyW10gc2VsZWN0b3IgPSBhYnN0cmFjdE1ldGhvZC5zZWxlY3RvcjsKKwlkbyB7CisJCWlmICghc3VwZXJUeXBlLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybjsKKwkJaWYgKCFzdXBlclR5cGUuaXNBYnN0cmFjdCgpKSByZXR1cm47IC8vIGNsb3NlciBub24gYWJzdHJhY3Qgc3VwZXIgdHlwZSB3aWxsIGJlIGZsYWdnZWQgaW5zdGVhZAorCisJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gc3VwZXJUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpOworCQluZXh0TWV0aG9kIDogZm9yIChpbnQgbSA9IG1ldGhvZHMubGVuZ3RoOyAtLW0gPj0gMDspIHsKKwkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKKwkJCWlmIChtZXRob2QucmV0dXJuVHlwZSAhPSBhYnN0cmFjdE1ldGhvZC5yZXR1cm5UeXBlIHx8ICFtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKGFic3RyYWN0TWV0aG9kKSkKKwkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSB8fCBtZXRob2QuaXNDb25zdHJ1Y3RvcigpIHx8IG1ldGhvZC5pc0RlZmF1bHRBYnN0cmFjdCgpKQorCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQlpZiAoc3VwZXJUeXBlLmZQYWNrYWdlID09IGFic3RyYWN0TWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlKSByZXR1cm47IC8vIGZvdW5kIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IG1ldGhvZCBpbiBzYW1lIHBhY2thZ2UKKwkJfQorCX0gd2hpbGUgKChzdXBlclR5cGUgPSBzdXBlclR5cGUuc3VwZXJjbGFzcygpKSAhPSBhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcyk7CisKKwkvLyBub24gdmlzaWJsZSBhYnN0cmFjdCBtZXRob2RzIGNhbm5vdCBiZSBvdmVycmlkZGVuIHNvIHRoZSB0eXBlIG11c3QgYmUgZGVmaW5lZCBhYnN0cmFjdAorCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkuYWJzdHJhY3RNZXRob2RDYW5ub3RCZU92ZXJyaWRkZW4odGhpcy50eXBlLCBhYnN0cmFjdE1ldGhvZCk7Cit9CiAvKgogQmluZGluZyBjcmVhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nOgogCS0gYWxsIG1vZGlmaWVyIHByb2JsZW1zIChkdXBsaWNhdGVzICYgbXVsdGlwbGUgdmlzaWJpbGl0eSBtb2RpZmllcnMgKyBpbmNvbXBhdGlibGUgY29tYmluYXRpb25zKQpAQCAtNDIxLDEyICsyNTAsOSBAQAogCWludCBsYXN0UG9zaXRpb24gPSAwOwogCWludGVyZmFjZXNUb1Zpc2l0W2xhc3RQb3NpdGlvbl0gPSB0eXBlLnN1cGVySW50ZXJmYWNlcygpOwogCi0JUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGU7Ci0JaWYgKHRoaXMudHlwZS5pc0NsYXNzKCkpIHsKLQkJc3VwZXJUeXBlID0gdGhpcy50eXBlLnN1cGVyY2xhc3MoKTsKLQl9IGVsc2UgeyAvLyBjaGVjayBpbnRlcmZhY2UgbWV0aG9kcyBhZ2FpbnN0IE9iamVjdAotCQlzdXBlclR5cGUgPSB0aGlzLnR5cGUuc2NvcGUuZ2V0SmF2YUxhbmdPYmplY3QoKTsKLQl9CisJUmVmZXJlbmNlQmluZGluZyBzdXBlclR5cGUgPSB0aGlzLnR5cGUuaXNDbGFzcygpCisJCT8gdGhpcy50eXBlLnN1cGVyY2xhc3MoKQorCQk6IHRoaXMudHlwZS5zY29wZS5nZXRKYXZhTGFuZ09iamVjdCgpOyAvLyBjaGVjayBpbnRlcmZhY2UgbWV0aG9kcyBhZ2FpbnN0IE9iamVjdAogCU1ldGhvZEJpbmRpbmdbXSBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHMgPSBudWxsOwogCWludCBub25WaXNpYmxlQ291bnQgPSAwOwogCkBAIC00NDQsMTkgKzI3MCwyMyBAQAogCQkJCU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gbWV0aG9kc1ttXTsKIAkJCQlpZiAoIShtZXRob2QuaXNQcml2YXRlKCkgfHwgbWV0aG9kLmlzQ29uc3RydWN0b3IoKSB8fCBtZXRob2QuaXNEZWZhdWx0QWJzdHJhY3QoKSkpIHsgLy8gbG9vayBhdCBhbGwgbWV0aG9kcyB3aGljaCBhcmUgTk9UIHByaXZhdGUgb3IgY29uc3RydWN0b3JzIG9yIGRlZmF1bHQgYWJzdHJhY3QKIAkJCQkJTWV0aG9kQmluZGluZ1tdIGV4aXN0aW5nTWV0aG9kcyA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuaW5oZXJpdGVkTWV0aG9kcy5nZXQobWV0aG9kLnNlbGVjdG9yKTsKLQkJCQkJaWYgKGV4aXN0aW5nTWV0aG9kcyAhPSBudWxsKQotCQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGV4aXN0aW5nTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gZXhpc3RpbmdNZXRob2RzW2ldLnJldHVyblR5cGUpCi0JCQkJCQkJCWlmIChtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKGV4aXN0aW5nTWV0aG9kc1tpXSkpCi0JCQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCQlpZiAoZXhpc3RpbmdNZXRob2RzICE9IG51bGwpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBleGlzdGluZ01ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gZXhpc3RpbmdNZXRob2RzW2ldLnJldHVyblR5cGUgJiYgbWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChleGlzdGluZ01ldGhvZHNbaV0pKSB7CisJCQkJCQkJCWlmIChtZXRob2QuaXNEZWZhdWx0KCkgJiYgbWV0aG9kLmlzQWJzdHJhY3QoKSAmJiBtZXRob2QuZGVjbGFyaW5nQ2xhc3MuZlBhY2thZ2UgIT0gdHlwZS5mUGFja2FnZSkKKwkJCQkJCQkJCWNoZWNrUGFja2FnZVByaXZhdGVBYnN0cmFjdE1ldGhvZChtZXRob2QpOworCQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQogCQkJCQlpZiAobm9uVmlzaWJsZURlZmF1bHRNZXRob2RzICE9IG51bGwpCiAJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblZpc2libGVDb3VudDsgaSsrKQotCQkJCQkJCWlmIChtZXRob2QucmV0dXJuVHlwZSA9PSBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHNbaV0ucmV0dXJuVHlwZSkKLQkJCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3Rvciwgbm9uVmlzaWJsZURlZmF1bHRNZXRob2RzW2ldLnNlbGVjdG9yKSkKLQkJCQkJCQkJCWlmIChtZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKG5vblZpc2libGVEZWZhdWx0TWV0aG9kc1tpXSkpCi0JCQkJCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gbm9uVmlzaWJsZURlZmF1bHRNZXRob2RzW2ldLnJldHVyblR5cGUKKwkJCQkJCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBub25WaXNpYmxlRGVmYXVsdE1ldGhvZHNbaV0uc2VsZWN0b3IpCisJCQkJCQkJCSYmIG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwobm9uVmlzaWJsZURlZmF1bHRNZXRob2RzW2ldKSkgCisJCQkJCQkJCQljb250aW51ZSBuZXh0TWV0aG9kOwogCi0JCQkJCWlmICghKG1ldGhvZC5pc0RlZmF1bHQoKSAmJiAobWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpKSkgeyAvLyBpZ25vcmUgbWV0aG9kcyB3aGljaCBoYXZlIGRlZmF1bHQgdmlzaWJpbGl0eSBhbmQgYXJlIE5PVCBkZWZpbmVkIGluIGFub3RoZXIgcGFja2FnZQorCQkJCQlpZiAoIShtZXRob2QuaXNEZWZhdWx0KCkgJiYgbWV0aG9kLmRlY2xhcmluZ0NsYXNzLmZQYWNrYWdlICE9IHR5cGUuZlBhY2thZ2UpKSB7IC8vIGlnbm9yZSBtZXRob2RzIHdoaWNoIGhhdmUgZGVmYXVsdCB2aXNpYmlsaXR5IGFuZCBhcmUgTk9UIGRlZmluZWQgaW4gYW5vdGhlciBwYWNrYWdlCiAJCQkJCQlpZiAoZXhpc3RpbmdNZXRob2RzID09IG51bGwpCiAJCQkJCQkJZXhpc3RpbmdNZXRob2RzID0gbmV3IE1ldGhvZEJpbmRpbmdbMV07CiAJCQkJCQllbHNlCkBAIC00NzgsMTEgKzMwOCw5IEBACiAJCQkJCQlNZXRob2RCaW5kaW5nW10gY3VycmVudCA9IChNZXRob2RCaW5kaW5nW10pIHRoaXMuY3VycmVudE1ldGhvZHMuZ2V0KG1ldGhvZC5zZWxlY3Rvcik7CiAJCQkJCQlpZiAoY3VycmVudCAhPSBudWxsKSB7IC8vIG5vbiB2aXNpYmxlIG1ldGhvZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4gc28gYSB3YXJuaW5nIGlzIGlzc3VlZAogCQkJCQkJCWZvdW5kTWF0Y2ggOiBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY3VycmVudC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gY3VycmVudFtpXS5yZXR1cm5UeXBlKSB7Ci0JCQkJCQkJCQlpZiAobWV0aG9kLmFyZVBhcmFtZXRlcnNFcXVhbChjdXJyZW50W2ldKSkgewotCQkJCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkub3ZlcnJpZGVzUGFja2FnZURlZmF1bHRNZXRob2QoY3VycmVudFtpXSwgbWV0aG9kKTsKLQkJCQkJCQkJCQlicmVhayBmb3VuZE1hdGNoOwotCQkJCQkJCQkJfQorCQkJCQkJCQlpZiAobWV0aG9kLnJldHVyblR5cGUgPT0gY3VycmVudFtpXS5yZXR1cm5UeXBlICYmIG1ldGhvZC5hcmVQYXJhbWV0ZXJzRXF1YWwoY3VycmVudFtpXSkpIHsKKwkJCQkJCQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyKCkub3ZlcnJpZGVzUGFja2FnZURlZmF1bHRNZXRob2QoY3VycmVudFtpXSwgbWV0aG9kKTsKKwkJCQkJCQkJCWJyZWFrIGZvdW5kTWF0Y2g7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC01MzEsNTAgKzM1OSw2IEBACiAJCQlpbnRlcmZhY2VzW2pdLnRhZ0JpdHMgJj0gfkludGVyZmFjZVZpc2l0ZWQ7CiAJfQogfQotLyoKLWNvbXB1dGVJbmhlcml0ZWRNZXRob2RNZW1iZXJzCi0KLQkiOC40LjYuNCIKLQkiQ29tcHV0ZSBhbGwgb2YgdGhlIG1lbWJlcnMgZm9yIHRoZSB0eXBlIHRoYXQgYXJlIGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcnR5cGVzLgotCQlUaGlzIGluY2x1ZGVzOgotCQkJQWxsIG9mIHRoZSBtZXRob2RzIGltcGxlbWVudGVkIGluIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5IHRoYXQgYXJlIG5vdCBvdmVycmlkZGVuLgotCQkJUFJPQkxFTTogIEN1cnJlbnRseSB3ZSBkbyBub3QgcmVtb3ZlIG92ZXJyaWRkZW4gbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGhpZXJhcmNoeS4KLQkJCVRoaXMgY291bGQgY2F1c2UgYSBub24tZXhpc3RlbnQgZXhjZXB0aW9uIGVycm9yIHRvIGJlIGRldGVjdGVkLiIKLQotCXwgc3VwZXJ0eXBlIGFsbFN1cGVyaW50ZXJmYWNlcyBtZXRob2RzU2VlbiBpbnRlcmZhY2VzU2VlbiB8Ci0JaW5oZXJpdGVkTWV0aG9kTWVtYmVycyA6PSBMb29rdXBUYWJsZSBuZXc6IDUwLgotCWFsbFN1cGVyaW50ZXJmYWNlcyA6PSBPcmRlcmVkQ29sbGVjdGlvbiBuZXcuCi0KLQl0eXBlIGlzSmF2YUNsYXNzIGlmVHJ1ZTogWwotCQlzdXBlcnR5cGUgOj0gdHlwZS4KLQkJbWV0aG9kc1NlZW4gOj0gRXNJZGVudGl0eVNldCBuZXc6IDIwLgotCQlbKHN1cGVydHlwZSA6PSBzZWxmIHN1cGVyY2xhc3NGb3I6IHN1cGVydHlwZSkgPT0gbmlsXSB3aGlsZUZhbHNlOiBbCi0JCQkoc3VwZXJ0eXBlIGlzQnVpbGRlckNsYXNzIG9yOiBbc3VwZXJ0eXBlIGlzVmFsaWREZXNjcmlwdG9yXSkgaWZUcnVlOiBbCi0JCQkJYWxsU3VwZXJpbnRlcmZhY2VzIGFkZEFsbDogKHNlbGYgc3VwZXJpbnRlcmZhY2VzRm9yOiBzdXBlcnR5cGUpLgotCQkJCXN1cGVydHlwZSBqYXZhVXNlckRlZmluZWRNZXRob2RzRG86IFs6bWV0aG9kIHwKLQkJCQkJKG1ldGhvZCBpc0phdmFQcml2YXRlIG9yOiBbbWV0aG9kIGlzSmF2YUNvbnN0cnVjdG9yXSkgaWZGYWxzZTogWwotCQkJCQkJKG1ldGhvZCBpc0phdmFEZWZhdWx0IGFuZDogW21ldGhvZCBkZWNsYXJpbmdDbGFzcyBwYWNrYWdlIHN5bWJvbCB+PSB0eXBlIHBhY2thZ2Ugc3ltYm9sXSkgaWZGYWxzZTogWwotCQkJCQkJCShtZXRob2RzU2VlbiBpbmNsdWRlczogbWV0aG9kIHNlbGVjdG9yKSBpZkZhbHNlOiBbCi0JCQkJCQkJCW1ldGhvZHNTZWVuIGFkZDogbWV0aG9kIHNlbGVjdG9yLgotCQkJCQkJCQkoaW5oZXJpdGVkTWV0aG9kTWVtYmVycwotCQkJCQkJCQkJYXQ6IChzZWxmIG1ldGhvZFNpZ25hdHVyZUZvcjogbWV0aG9kIHNlbGVjdG9yKQotCQkJCQkJCQkJaWZBYnNlbnRQdXQ6IFtPcmRlcmVkQ29sbGVjdGlvbiBuZXc6IDNdKQotCQkJCQkJCQkJCWFkZDogbWV0aG9kXV1dXV1dXS4KLQotCWFsbFN1cGVyaW50ZXJmYWNlcyBhZGRBbGw6IChzZWxmIHN1cGVyaW50ZXJmYWNlc0ZvcjogdHlwZSkuCi0JaW50ZXJmYWNlc1NlZW4gOj0gRXNJZGVudGl0eVNldCBuZXc6IGFsbFN1cGVyaW50ZXJmYWNlcyBzaXplICogMi4KLQlbYWxsU3VwZXJpbnRlcmZhY2VzIG5vdEVtcHR5XSB3aGlsZVRydWU6IFsKLQkJc3VwZXJ0eXBlIDo9IGFsbFN1cGVyaW50ZXJmYWNlcyByZW1vdmVGaXJzdC4KLQkJKGludGVyZmFjZXNTZWVuIGluY2x1ZGVzOiBzdXBlcnR5cGUpIGlmRmFsc2U6IFsKLQkJCWludGVyZmFjZXNTZWVuIGFkZDogc3VwZXJ0eXBlLgotCQkJKHN1cGVydHlwZSBpc0J1aWxkZXJDbGFzcyBvcjogW3N1cGVydHlwZSBpc1ZhbGlkRGVzY3JpcHRvcl0pIGlmVHJ1ZTogWwotCQkJCWFsbFN1cGVyaW50ZXJmYWNlcyBhZGRBbGw6IChzZWxmIHN1cGVyaW50ZXJmYWNlc0Zvcjogc3VwZXJ0eXBlKS4KLQkJCQlzdXBlcnR5cGUgamF2YVVzZXJEZWZpbmVkTWV0aG9kc0RvOiBbOm1ldGhvZCB8CQkiSW50ZXJmYWNlIG1ldGhvZHMgYXJlIGFsbCBhYnN0cmFjdCBwdWJsaWMuIgotCQkJCQkoaW5oZXJpdGVkTWV0aG9kTWVtYmVycwotCQkJCQkJYXQ6IChzZWxmIG1ldGhvZFNpZ25hdHVyZUZvcjogbWV0aG9kIHNlbGVjdG9yKQotCQkJCQkJaWZBYnNlbnRQdXQ6IFtPcmRlcmVkQ29sbGVjdGlvbiBuZXc6IDNdKQotCQkJCQkJCWFkZDogbWV0aG9kXV1dXQotKi8KIHByaXZhdGUgdm9pZCBjb21wdXRlTWV0aG9kcygpIHsKIAlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGUubWV0aG9kcygpOwogCWludCBzaXplID0gbWV0aG9kcy5sZW5ndGg7CkBAIC02MjQsOCArNDA4LDExIEBACiAJCXdoaWxlIChzdXBlcmNsYXNzLmlzQWJzdHJhY3QoKSAmJiBzdXBlcmNsYXNzICE9IGRlY2xhcmluZ0NsYXNzKQogCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3Muc3VwZXJjbGFzcygpOyAvLyBmaW5kIHRoZSBmaXJzdCBjb25jcmV0ZSBzdXBlcmNsYXNzIG9yIHRoZSBhYnN0cmFjdCBkZWNsYXJpbmdDbGFzcwogCX0gZWxzZSB7Ci0JCWlmICh0aGlzLnR5cGUuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgZmFsc2UpKQotCQkJcmV0dXJuICF0aGlzLnR5cGUuaXNBYnN0cmFjdCgpOworCQlpZiAodGhpcy50eXBlLmltcGxlbWVudHNJbnRlcmZhY2UoZGVjbGFyaW5nQ2xhc3MsIGZhbHNlKSkgeworCQkJaWYgKHRoaXMudHlwZS5pc0Fic3RyYWN0KCkpIHJldHVybiBmYWxzZTsgLy8gbGVhdmUgaXQgZm9yIHRoZSBzdWJjbGFzc2VzCisJCQlpZiAoIXN1cGVyY2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgdHJ1ZSkpIC8vIG9ubHkgaWYgYSBzdXBlcmNsYXNzIGRvZXMgbm90IGFsc28gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQogCQl3aGlsZSAoc3VwZXJjbGFzcy5pc0Fic3RyYWN0KCkgJiYgIXN1cGVyY2xhc3MuaW1wbGVtZW50c0ludGVyZmFjZShkZWNsYXJpbmdDbGFzcywgZmFsc2UpKQogCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3Muc3VwZXJjbGFzcygpOyAvLyBmaW5kIHRoZSBmaXJzdCBjb25jcmV0ZSBzdXBlcmNsYXNzIG9yIHRoZSBzdXBlcmNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIGludGVyZmFjZQogCX0KQEAgLTY1MSwyMjkgKzQzOCwxMyBAQAogCXRoaXMuY29tcHV0ZUluaGVyaXRlZE1ldGhvZHMoKTsKIAl0aGlzLmNoZWNrTWV0aG9kcygpOwogfQotcHJpdmF0ZSB2b2lkIHp6RmllbGRQcm9ibGVtcygpIHsKLX0KLS8qCi1CaW5kaW5nIGNyZWF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgYWxsIHByb2JsZW1zIHdpdGggZmllbGRzOgotCS0gYWxsIG1vZGlmaWVyIHByb2JsZW1zIChkdXBsaWNhdGVzICYgbXVsdGlwbGUgdmlzaWJpbGl0eSBtb2RpZmllcnMgKyBpbmNvbXBhdGlibGUgY29tYmluYXRpb25zIC0gZmluYWwvdm9sYXRpbGUpCi0JCS0gcGx1cyBpbnZhbGlkIG1vZGlmaWVycyBnaXZlbiB0aGUgY29udGV4dCAodGhlIHZlcmlmaWVyIGRpZCBub3QgZG8gdGhpcyBiZWZvcmUpCi0JCS0gaW5jbHVkZSBpbml0aWFsaXplcnMgaW4gdGhlIG1vZGlmaWVyIGNoZWNrcyBldmVuIHRob3VnaCBiaW5kaW5ncyBhcmUgbm90IGNyZWF0ZWQKLQktIGNvbGxpc2lvbnMuLi4gMiBmaWVsZHMgd2l0aCBzYW1lIG5hbWUKLQktIGludGVyZmFjZXMgY2Fubm90IGRlZmluZSBpbml0aWFsaXplcnMKLQktIG5lc3RlZCB0eXBlcyBjYW5ub3QgZGVmaW5lIHN0YXRpYyBmaWVsZHMKLQktIHdpdGggdGhlIHR5cGUgb2YgdGhlIGZpZWxkOgotCQktIHZvaWQgaXMgbm90IGEgdmFsaWQgdHlwZSAob3IgZm9yIGFuIGFycmF5KQotCQktIGFuIGFtYmlndW91cywgaW52aXNpYmxlIG9yIG1pc3NpbmcgdHlwZQotCi12ZXJpZnlGaWVsZHMKLQotCXwgdG9TZWFyY2ggfAotCSh0b1NlYXJjaCA6PSBuZXdDbGFzcyBmaWVsZHMpIG5vdEVtcHR5IGlmVHJ1ZTogWwotCQluZXdDbGFzcyBmcm9tSmF2YUNsYXNzRmlsZQotCQkJaWZUcnVlOiBbCi0JCQkJdG9TZWFyY2ggZG86IFs6ZmllbGQgfAotCQkJCQlmaWVsZCBpc0phdmFJbml0aWFsaXplciBpZkZhbHNlOiBbCi0JCQkJCQlzZWxmIHZlcmlmeUZpZWxkVHlwZTogZmllbGRdXV0KLQkJCWlmRmFsc2U6IFsKLQkJCQl0b1NlYXJjaCBkbzogWzpmaWVsZCB8Ci0JCQkJCWZpZWxkIGlzSmF2YUluaXRpYWxpemVyCi0JCQkJCQlpZlRydWU6IFtzZWxmIHZlcmlmeUZpZWxkSW5pdGlhbGl6ZXI6IGZpZWxkXQotCQkJCQkJaWZGYWxzZTogW3NlbGYgdmVyaWZ5RmllbGQ6IGZpZWxkXV1dXQotCi12ZXJpZnlGaWVsZEluaXRpYWxpemVyOiBmaWVsZAotCi0JdHlwZSBpc0phdmFJbnRlcmZhY2UKLQkJaWZUcnVlOiBbCi0JCQlwcm9ibGVtU3VtbWFyeQotCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbnRlcmZhY2VzQ2Fubm90SGF2ZUluaXRpYWxpemVycwotCQkJCWFyZ3M6ICMoKQotCQkJCXNldmVyaXR5OiBuaWwKLQkJCQlmb3JGaWVsZDogZmllbGRdCi0JCWlmRmFsc2U6IFsKLQkJCWZpZWxkIGlzSmF2YVN0YXRpYwotCQkJCWlmVHJ1ZTogWwotCQkJCQlmaWVsZCBtb2RpZmllcnMgPT0gQWNjU3RhdGljIGlmRmFsc2U6IFsKLQkJCQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckZvclN0YXRpY0luaXRpYWxpemVyCi0JCQkJCQkJYXJnczogIygpCi0JCQkJCQkJc2V2ZXJpdHk6IG5pbAotCQkJCQkJCWZvckZpZWxkOiBmaWVsZF1dCi0JCQkJaWZGYWxzZTogWwotCQkJCQlmaWVsZCBtb2RpZmllcnMgPT0gMCBpZkZhbHNlOiBbCi0JCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsTW9kaWZpZXJGb3JJbml0aWFsaXplcgotCQkJCQkJCWFyZ3M6ICMoKQotCQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCQlmb3JGaWVsZDogZmllbGRdXV0KLQotdmVyaWZ5RmllbGQ6IGZpZWxkCi0KLQkoZmllbGQgYmFzaWNNb2RpZmllcnMgYW55TWFzazogQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtIHwgQWNjTW9kaWZpZXJQcm9ibGVtKSBpZlRydWU6IFsKLQkJc2VsZiByZXBvcnRNb2RpZmllclByb2JsZW1zT25GaWVsZDogZmllbGRdLgotCi0JZmllbGQgaXNKYXZhU3RhdGljIGlmVHJ1ZTogWwotCQl0eXBlIGlzSmF2YVN0YXRpYyBpZkZhbHNlOiBbCi0JCQkodHlwZSBpc0phdmFOZXN0ZWRUeXBlIGFuZDogW3R5cGUgaXNKYXZhQ2xhc3NdKSBpZlRydWU6IFsKLQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjTmVzdGVkQ2xhc3NDYW5ub3RIYXZlU3RhdGljRmllbGQKLQkJCQkJYXJnczogIygpCi0JCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJZm9yRmllbGQ6IGZpZWxkXV1dLgotCi0Jc2VsZiB2ZXJpZnlGaWVsZFR5cGU6IGZpZWxkCi0KLXZlcmlmeUZpZWxkVHlwZTogZmllbGQKLQotCXwgZGVzY3JpcHRvciBmaWVsZFR5cGUgfAotCSI4LjMgKENsYXNzKSA5LjMgKEludGVyZmFjZSkiCi0JIk9wdGltaXplIHRoZSBiYXNlIHR5cGUgY2FzZSIKLQlmaWVsZCB0eXBlSXNCYXNlVHlwZQotCQlpZlRydWU6IFsKLQkJCWZpZWxkIHR5cGVOYW1lID0gJ1YnIGlmVHJ1ZTogWyAgIiROT04tTkxTJCIKLQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjSWxsZWdhbFR5cGVGb3JGaWVsZAotCQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogSmF2YVZvaWQpCi0JCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJZm9yRmllbGQ6IGZpZWxkXV0KLQkJaWZGYWxzZTogWwotCQkJZGVzY3JpcHRvciA6PSBmaWVsZCBhc0Rlc2NyaXB0b3JJbjogbmFtZUVudmlyb25tZW50LgotCQkJKGZpZWxkVHlwZSA6PSBkZXNjcmlwdG9yIHR5cGUpIGlzVmFsaWREZXNjcmlwdG9yCi0JCQkJaWZUcnVlOiBbCi0JCQkJCShmaWVsZFR5cGUgaXNBcnJheVR5cGUgYW5kOiBbZmllbGRUeXBlIGxlYWZDb21wb25lbnRUeXBlIGlzVm9pZFR5cGVdKSBpZlRydWU6IFsKLQkJCQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0ludmFsaWRBcnJheVR5cGUKLQkJCQkJCQlhcmdzOiAoQXJyYXkgd2l0aDogZmllbGRUeXBlIGphdmFSZWFkYWJsZU5hbWUpCi0JCQkJCQkJc2V2ZXJpdHk6IG5pbAotCQkJCQkJCWZvckZpZWxkOiBmaWVsZF1dCi0JCQkJaWZGYWxzZTogWwotCQkJCQlwcm9ibGVtU3VtbWFyeQotCQkJCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI1VuYm91bmRUeXBlRm9yRmllbGQKLQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBmaWVsZFR5cGUgamF2YVJlYWRhYmxlTmFtZSB3aXRoOiBmaWVsZFR5cGUgbGVhZkNvbXBvbmVudFR5cGUpCi0JCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQlmb3JGaWVsZDogZmllbGRdXS4KLQotcmVwb3J0TW9kaWZpZXJQcm9ibGVtc09uRmllbGQ6IGZpZWxkCi0KLQkoZmllbGQgYmFzaWNNb2RpZmllcnMgYW55TWFzazogQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSBpZlRydWU6IFsKLQkJKGZpZWxkIGJhc2ljTW9kaWZpZXJzIGFueU1hc2s6IEFjY01vZGlmaWVyUHJvYmxlbSkKLQkJCWlmVHJ1ZTogWwotCQkJCV5wcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjT25seU9uZVZpc2liaWxpdHlNb2RpZmllckFsbG93ZWQKLQkJCQkJYXJnczogIygpCi0JCQkJCXNldmVyaXR5OiBFcnJvckluZm86OkNvbmZsaWN0aW5nTW9kaWZpZXIKLQkJCQkJZm9yRmllbGQ6IGZpZWxkXQotCQkJaWZGYWxzZTogWwotCQkJCV5wcm9ibGVtU3VtbWFyeQotCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjRHVwbGljYXRlTW9kaWZpZXIKLQkJCQkJYXJnczogIygpCi0JCQkJCXNldmVyaXR5OiBFcnJvckluZm86OkNvbmZsaWN0aW5nTW9kaWZpZXIKLQkJCQkJZm9yRmllbGQ6IGZpZWxkXV0uCi0KLQl0eXBlIGlzSmF2YUludGVyZmFjZSBpZlRydWU6IFsKLQkJXnByb2JsZW1TdW1tYXJ5Ci0JCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjSWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlRmllbGQKLQkJCWFyZ3M6ICMoKQotCQkJc2V2ZXJpdHk6IG5pbAotCQkJZm9yRmllbGQ6IGZpZWxkXS4KLQotCShmaWVsZCBiYXNpY01vZGlmaWVycyBhbGxNYXNrOiBBY2NGaW5hbCB8ICBBY2NWb2xhdGlsZSkgaWZUcnVlOiBbCi0JCV5wcm9ibGVtU3VtbWFyeQotCQkJcmVwb3J0VmVyaWZpY2F0aW9uUHJvYmxlbTogI0lsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxWb2xhdGlsZQotCQkJYXJnczogIygpCi0JCQlzZXZlcml0eTogbmlsCi0JCQlmb3JGaWVsZDogZmllbGRdLgotCi0JXnByb2JsZW1TdW1tYXJ5Ci0JCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNJbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZAotCQlhcmdzOiAjKCkKLQkJc2V2ZXJpdHk6IG5pbAotCQlmb3JGaWVsZDogZmllbGQKLQotdm9pZCByZXBvcnRNb2RpZmllclByb2JsZW1zKEZpZWxkQmluZGluZyBmaWVsZCkgewotCWlmIChmaWVsZC5pc0ZpbmFsKCkgJiYgZmllbGQuaXNWb2xhdGlsZSgpKQotCQl0aGlzLnByb2JsZW1SZXBvcnRlci5pbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsVm9sYXRpbGUoZmllbGQpOwotCi0JLy8gU2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0IGFsbCAzIHByb2JsZW1zIE5PVCBqdXN0IDEKLQlpZiAoKHR5cGUubW9kaWZpZXJzKCkgJiBNb2RpZmllcnMuQWNjQWx0ZXJuYXRlTW9kaWZpZXJQcm9ibGVtKSA9PSAwKSB7Ci0JCWlmICh0aGlzLnR5cGUuaXNJbnRlcmZhY2UoKSkKLQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZUZpZWxkKGZpZWxkKTsKLQkJZWxzZQotCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIuaWxsZWdhbE1vZGlmaWVyKGZpZWxkKTsKLQl9IGVsc2UgewotCQlpZiAoKGZpZWxkLm1vZGlmaWVycyAmIE1vZGlmaWVycy5BY2NNb2RpZmllclByb2JsZW0pICE9IDApCi0JCQl0aGlzLnByb2JsZW1SZXBvcnRlci5vbmx5T25lVmlzaWJpbGl0eU1vZGlmaWVyQWxsb3dlZChmaWVsZCk7Ci0JCWVsc2UKLQkJCXRoaXMucHJvYmxlbVJlcG9ydGVyLmR1cGxpY2F0ZU1vZGlmaWVyKGZpZWxkKTsKLQl9Ci19Ci0qLwotcHJpdmF0ZSB2b2lkIHp6SW1wb3J0UHJvYmxlbXMoKSB7Ci19Ci0vKgotQmluZGluZyBjcmVhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIGFsbCBwcm9ibGVtcyB3aXRoIGltcG9ydHM6Ci0JLSBvbiBkZW1hbmQgaW1wb3J0cyB3aGljaCByZWZlciB0byBtaXNzaW5nIHBhY2thZ2VzCi0JLSB3aXRoIHNpbmdsZSB0eXBlIGltcG9ydHM6Ci0JCS0gcmVzb2x2ZXMgdG8gYW4gYW1iaWd1b3VzLCBpbnZpc2libGUgb3IgbWlzc2luZyB0eXBlCi0JCS0gY29uZmxpY3RzIHdpdGggdGhlIHR5cGUncyBzb3VyY2UgbmFtZQotCQktIGhhcyB0aGUgc2FtZSBzaW1wbGUgbmFtZSBhcyBhbm90aGVyIGltcG9ydAotCi1Ob3RlOiBWQUogaWdub3JlZCBkdXBsaWNhdGUgaW1wb3J0cyAob25seSBvbmUgd2FzIGtlcHQpCi0KLXZlcmlmeUltcG9ydHMKLQotCXwgaW1wb3J0c0J5U2ltcGxlTmFtZSBuYW1lRW52Q2xhc3MgaW1wb3J0cyBjbCBmaXJzdCB8Ci0JaW1wb3J0c0J5U2ltcGxlTmFtZSA6PSBMb29rdXBUYWJsZSBuZXcuCi0JbmFtZUVudkNsYXNzIDo9IG5hbWVFbnZpcm9ubWVudCBjbGFzcy4KLQotCSI3LjUuMiIKLQl0eXBlIGltcG9ydHMgZG86IFs6aW1wb3J0IHwKLQkJaW1wb3J0IGlzT25EZW1hbmQKLQkJCWlmVHJ1ZTogWwotCQkJCShuYW1lRW52Q2xhc3MgZG9lc1BhY2thZ2VFeGlzdE5hbWVkOiBpbXBvcnQgamF2YVBhY2thZ2VOYW1lKSBpZkZhbHNlOiBbCi0JCQkJCShuYW1lRW52Q2xhc3MgZmluZEphdmFDbGFzc05hbWVkRnJvbTogaW1wb3J0IGphdmFQYWNrYWdlTmFtZSkgPT0gbmlsIGlmVHJ1ZTogWwotCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjT25EZW1hbmRJbXBvcnRSZWZlcnNUb01pc3NpbmdQYWNrYWdlCi0JCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IGltcG9ydCBhc1N0cmluZykKLQkJCQkJCQlzZXZlcml0eTogRXJyb3JJbmZvOjpJbXBvcnRWZXJpZmljYXRpb24KLQkJCQkJCQlmb3JUeXBlOiB0eXBlXV1dCi0JCQlpZkZhbHNlOiBbCi0JCQkJKGltcG9ydHMgOj0gaW1wb3J0c0J5U2ltcGxlTmFtZSBhdDogaW1wb3J0IGphdmFTaW1wbGVOYW1lIGlmQWJzZW50OiBbXSkgPT0gbmlsCi0JCQkJCWlmVHJ1ZTogWwotCQkJCQkJaW1wb3J0c0J5U2ltcGxlTmFtZSBhdDogaW1wb3J0IGphdmFTaW1wbGVOYW1lIHB1dDogKEFycmF5IHdpdGg6IGltcG9ydCldCi0JCQkJCWlmRmFsc2U6IFsKLQkJCQkJCShpbXBvcnRzIGluY2x1ZGVzOiBpbXBvcnQpIGlmRmFsc2U6IFsKLQkJCQkJCQlpbXBvcnRzQnlTaW1wbGVOYW1lIGF0OiBpbXBvcnQgamF2YVNpbXBsZU5hbWUgcHV0OiBpbXBvcnRzLCAoQXJyYXkgd2l0aDogaW1wb3J0KV1dLgotCi0JCQkJIklnbm9yZSBhbnkgaW1wb3J0cyB3aGljaCBhcmUgc2ltcGxlIG5hbWVzIC0gd2Ugd2lsbCB0cmVhdCB0aGVzZSBhcyBuby1vcHMuIgotCi0JCQkJaW1wb3J0IGphdmFQYWNrYWdlTmFtZSBub3RFbXB0eSBpZlRydWU6IFsKLQkJCQkJY2wgOj0gbmFtZUVudkNsYXNzIGZpbmRKYXZhQ2xhc3NOYW1lZEZyb206IGltcG9ydCBhc1N0cmluZy4KLQotCQkJCQkoY2wgfn4gbmlsIGFuZDogW2NsIGlzSmF2YVB1YmxpYyBvcjogW2NsIGNvbnRyb2xsZXIgc3ltYm9sID09IHR5cGUgY29udHJvbGxlciBzeW1ib2xdXSkgaWZGYWxzZTogWwotCQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCQlyZXBvcnRWZXJpZmljYXRpb25Qcm9ibGVtOiAjU2luZ2xlVHlwZUltcG9ydFJlZmVyc1RvSW52aXNpYmxlVHlwZQotCQkJCQkJCWFyZ3M6IChBcnJheSB3aXRoOiBpbXBvcnQgYXNTdHJpbmcpCi0JCQkJCQkJc2V2ZXJpdHk6IEVycm9ySW5mbzo6SW1wb3J0VmVyaWZpY2F0aW9uCi0JCQkJCQkJZm9yVHlwZTogdHlwZV1dXV0uCi0KLQlpbXBvcnRzQnlTaW1wbGVOYW1lIG5vdEVtcHR5IGlmVHJ1ZTogWwotCQlpbXBvcnRzQnlTaW1wbGVOYW1lIGtleXNBbmRWYWx1ZXNEbzogWzpzaW1wbGVOYW1lIDptYXRjaGluZyB8Ci0JCQltYXRjaGluZyBzaXplID09IDEKLQkJCQlpZlRydWU6IFsKLQkJCQkJc2ltcGxlTmFtZSA9IHR5cGUgc291cmNlTmFtZSBpZlRydWU6IFsKLQkJCQkJCW1hdGNoaW5nIGZpcnN0IGphdmFSZWFkYWJsZU5hbWUgPSB0eXBlIGphdmFSZWFkYWJsZU5hbWUgaWZGYWxzZTogWwotCQkJCQkJCXByb2JsZW1TdW1tYXJ5Ci0JCQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNTaW5nbGVUeXBlSW1wb3J0Q29uZmxpY3RzV2l0aFR5cGUKLQkJCQkJCQkJYXJnczogIygpCi0JCQkJCQkJCXNldmVyaXR5OiBuaWwKLQkJCQkJCQkJZm9yVHlwZTogdHlwZV1dXQotCQkJCWlmRmFsc2U6IFsKLQkJCQkJcHJvYmxlbVN1bW1hcnkKLQkJCQkJCXJlcG9ydFZlcmlmaWNhdGlvblByb2JsZW06ICNTaW5nbGVUeXBlSW1wb3J0c0hhdmVTYW1lU2ltcGxlTmFtZQotCQkJCQkJYXJnczogKEFycmF5IHdpdGg6IHNpbXBsZU5hbWUpCi0JCQkJCQlzZXZlcml0eTogbmlsCi0JCQkJCQlmb3JUeXBlOiB0eXBlXV1dCi0qLwotcHJpdmF0ZSB2b2lkIHp6VHlwZVByb2JsZW1zKCkgeworcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7CisJYnVmZmVyLmFwcGVuZCgiTWV0aG9kVmVyaWZpZXIgZm9yIHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCisJYnVmZmVyLmFwcGVuZCh0eXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlidWZmZXIuYXBwZW5kKCdcbicpOworCWJ1ZmZlci5hcHBlbmQoIlx0LWluaGVyaXRlZCBtZXRob2RzOiAiKTsgLy8kTk9OLU5MUy0xJAorCWJ1ZmZlci5hcHBlbmQodGhpcy5pbmhlcml0ZWRNZXRob2RzKTsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL05lc3RlZFR5cGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL05lc3RlZFR5cGVCaW5kaW5nLmphdmEKaW5kZXggYjVkNzFjMy4uNTMyNzkxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9OZXN0ZWRUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvTmVzdGVkVHlwZUJpbmRpbmcuamF2YQpAQCAtMSwyMDIgKzEsMjE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGNsYXNzIE5lc3RlZFR5cGVCaW5kaW5nIGV4dGVuZHMgU291cmNlVHlwZUJpbmRpbmcgeworCiAJcHVibGljIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGU7CiAKIAlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gZW5jbG9zaW5nSW5zdGFuY2VzOwogCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBvdXRlckxvY2FsVmFyaWFibGVzOwotCXB1YmxpYyBpbnQgc3ludGhldGljQXJndW1lbnRzT2Zmc2V0OyAvLyBhbW91bnQgb2Ygc2xvdHMgdXNlZCBieSBzeW50aGV0aWMgY29uc3RydWN0b3IgYXJndW1lbnRzCi1wdWJsaWMgTmVzdGVkVHlwZUJpbmRpbmcoY2hhcltdW10gdHlwZU5hbWUsIENsYXNzU2NvcGUgc2NvcGUsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKLQlzdXBlcih0eXBlTmFtZSwgZW5jbG9zaW5nVHlwZS5mUGFja2FnZSwgc2NvcGUpOwotCXRoaXMudGFnQml0cyB8PSBJc05lc3RlZFR5cGU7Ci0JdGhpcy5lbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZTsKLX0KLS8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDxhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU+LgotKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLSovCi0KLXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7Ci0JU3ludGhldGljQXJndW1lbnRCaW5kaW5nIHN5bnRoTG9jYWwgPSBudWxsOwotCi0JaWYgKG91dGVyTG9jYWxWYXJpYWJsZXMgPT0gbnVsbCkgewotCQlzeW50aExvY2FsID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOwotCQlvdXRlckxvY2FsVmFyaWFibGVzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHtzeW50aExvY2FsfTsKLQl9IGVsc2UgewotCQlpbnQgc2l6ZSA9IG91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOwotCQlpbnQgbmV3QXJnSW5kZXggPSBzaXplOwotCQlmb3IgKGludCBpID0gc2l6ZTsgLS1pID49IDA7KSB7CQkvLyBtdXN0IHNlYXJjaCBiYWNrd2FyZHMKLQkJCWlmIChvdXRlckxvY2FsVmFyaWFibGVzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpCi0JCQkJcmV0dXJuIG91dGVyTG9jYWxWYXJpYWJsZXNbaV07CS8vIGFscmVhZHkgZXhpc3RzCi0JCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlc1tpXS5pZCA+IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5pZCkKLQkJCQluZXdBcmdJbmRleCA9IGk7Ci0JCX0KLQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhMb2NhbHMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW3NpemUgKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvdXRlckxvY2FsVmFyaWFibGVzLCAwLCBzeW50aExvY2FscywgMCwgbmV3QXJnSW5kZXgpOwotCQlzeW50aExvY2Fsc1tuZXdBcmdJbmRleF0gPSBzeW50aExvY2FsID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOwotCQlTeXN0ZW0uYXJyYXljb3B5KG91dGVyTG9jYWxWYXJpYWJsZXMsIG5ld0FyZ0luZGV4LCBzeW50aExvY2FscywgbmV3QXJnSW5kZXggKyAxLCBzaXplIC0gbmV3QXJnSW5kZXgpOwotCQlvdXRlckxvY2FsVmFyaWFibGVzID0gc3ludGhMb2NhbHM7Ci0JfQotCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgc3ludGggYXJnIGZvciBsb2NhbCB2YXI6ICIgKyBuZXcgU3RyaW5nKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5uYW1lKSArICIgdG86ICIgKyBuZXcgU3RyaW5nKHRoaXMucmVhZGFibGVOYW1lKCkpKTsKLQlpZiAoc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24pCi0JCXRoaXMudXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7Ci0JcmV0dXJuIHN5bnRoTG9jYWw7Ci19Ci0vKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGZvciA8ZW5jbG9zaW5nVHlwZT4uCi0qIEFuc3dlciB0aGUgbmV3IGFyZ3VtZW50IG9yIHRoZSBleGlzdGluZyBhcmd1bWVudCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgotKi8KLQotcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBhZGRTeW50aGV0aWNBcmd1bWVudChSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKLQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhMb2NhbCA9IG51bGw7Ci0JaWYgKGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSB7Ci0JCXN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGVuY2xvc2luZ1R5cGUpOwotCQllbmNsb3NpbmdJbnN0YW5jZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10ge3N5bnRoTG9jYWx9OwotCX0gZWxzZSB7Ci0JCWludCBzaXplID0gZW5jbG9zaW5nSW5zdGFuY2VzLmxlbmd0aDsKLQkJaW50IG5ld0FyZ0luZGV4ID0gc2l6ZTsKLQkJZm9yIChpbnQgaSA9IHNpemU7IC0taSA+PSAwOykgewotCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlID09IGVuY2xvc2luZ1R5cGUpCi0JCQkJcmV0dXJuIGVuY2xvc2luZ0luc3RhbmNlc1tpXTsgLy8gYWxyZWFkeSBleGlzdHMKLQkJCWlmICh0aGlzLmVuY2xvc2luZ1R5cGUoKSA9PSBlbmNsb3NpbmdUeXBlKQotCQkJCW5ld0FyZ0luZGV4ID0gMDsKLQkJfQotCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBuZXdJbnN0YW5jZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW3NpemUgKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShlbmNsb3NpbmdJbnN0YW5jZXMsIDAsIG5ld0luc3RhbmNlcywgbmV3QXJnSW5kZXggPT0gMCA/IDEgOiAwLCBzaXplKTsKLQkJbmV3SW5zdGFuY2VzW25ld0FyZ0luZGV4XSA9IHN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGVuY2xvc2luZ1R5cGUpOwotCQllbmNsb3NpbmdJbnN0YW5jZXMgPSBuZXdJbnN0YW5jZXM7Ci0JfQotCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgc3ludGggYXJnIGZvciBlbmNsb3NpbmcgdHlwZTogIiArIG5ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiIHRvOiAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSk7Ci0JaWYgKHNjb3BlLnJlZmVyZW5jZUNvbXBpbGF0aW9uVW5pdCgpLmlzUHJvcGFnYXRpbmdJbm5lckNsYXNzRW11bGF0aW9uKQotCQl0aGlzLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOwotCXJldHVybiBzeW50aExvY2FsOwotfQotLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBhbmQgZmllbGQgZm9yIDxhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU+LgotKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLSovCi0KLXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKLQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhMb2NhbCA9IGFkZFN5bnRoZXRpY0FyZ3VtZW50KGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7Ci0JaWYgKHN5bnRoTG9jYWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLQlpZiAoc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID09IG51bGwpCi0JCXN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9IGFkZFN5bnRoZXRpY0ZpZWxkKGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7Ci0JcmV0dXJuIHN5bnRoTG9jYWw7Ci19Ci0vKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGFuZCBmaWVsZCBmb3IgPGVuY2xvc2luZ1R5cGU+LgotKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KLSovCi0KLXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnRBbmRGaWVsZChSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKLQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhMb2NhbCA9IGFkZFN5bnRoZXRpY0FyZ3VtZW50KGVuY2xvc2luZ1R5cGUpOwotCWlmIChzeW50aExvY2FsID09IG51bGwpIHJldHVybiBudWxsOwotCi0JaWYgKHN5bnRoTG9jYWwubWF0Y2hpbmdGaWVsZCA9PSBudWxsKQotCQlzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPSBhZGRTeW50aGV0aWNGaWVsZChlbmNsb3NpbmdUeXBlKTsKLQlyZXR1cm4gc3ludGhMb2NhbDsKLX0KLS8qKgotICogQ29tcHV0ZSB0aGUgcmVzb2x2ZWQgcG9zaXRpb25zIGZvciBhbGwgdGhlIHN5bnRoZXRpYyBhcmd1bWVudHMKLSAqLwotZmluYWwgcHVibGljIHZvaWQgY29tcHV0ZVN5bnRoZXRpY0FyZ3VtZW50c09mZnNldCgpIHsKLQotCWludCBwb3NpdGlvbiA9IDE7IC8vIGluc2lkZSBjb25zdHJ1Y3RvciwgcmVzZXJ2ZSByb29tIGZvciByZWNlaXZlcgorCXB1YmxpYyBpbnQgZW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemU7IC8vIGFtb3VudCBvZiBzbG90cyB1c2VkIGJ5IHN5bnRoZXRpYyBlbmNsb3NpbmcgaW5zdGFuY2VzCisJcHVibGljIGludCBvdXRlckxvY2FsVmFyaWFibGVzU2xvdFNpemU7IC8vIGFtb3VudCBvZiBzbG90cyB1c2VkIGJ5IHN5bnRoZXRpYyBvdXRlciBsb2NhbCB2YXJpYWJsZXMKIAkKLQkvLyBpbnNlcnQgZW5jbG9zaW5nIGluc3RhbmNlcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIG91dGVyTG9jYWxzCi0JU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gZW5jbG9zaW5nSW5zdGFuY2VzID0gdGhpcy5zeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKTsKLQlpbnQgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQgPSBlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCA/IDAgOiBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQ7IGkrKyl7Ci0JCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmcgPSBlbmNsb3NpbmdJbnN0YW5jZXNbaV07Ci0JCXN5bnRoZXRpY0FyZy5yZXNvbHZlZFBvc2l0aW9uID0gcG9zaXRpb247Ci0JCWlmICgoc3ludGhldGljQXJnLnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChzeW50aGV0aWNBcmcudHlwZSA9PSBEb3VibGVCaW5kaW5nKSl7Ci0JCQlwb3NpdGlvbiArPSAyOwotCQl9IGVsc2UgewotCQkJcG9zaXRpb24gKys7Ci0JCX0KKwlwdWJsaWMgTmVzdGVkVHlwZUJpbmRpbmcoY2hhcltdW10gdHlwZU5hbWUsIENsYXNzU2NvcGUgc2NvcGUsIFNvdXJjZVR5cGVCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKwkJc3VwZXIodHlwZU5hbWUsIGVuY2xvc2luZ1R5cGUuZlBhY2thZ2UsIHNjb3BlKTsKKwkJdGhpcy50YWdCaXRzIHw9IElzTmVzdGVkVHlwZTsKKwkJdGhpcy5lbmNsb3NpbmdUeXBlID0gZW5jbG9zaW5nVHlwZTsKIAl9Ci0JU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gb3V0ZXJMb2NhbHMgPSB0aGlzLnN5bnRoZXRpY091dGVyTG9jYWxWYXJpYWJsZXMoKTsKLQlpbnQgb3V0ZXJMb2NhbHNDb3VudCA9IG91dGVyTG9jYWxzID09IG51bGwgPyAwIDogb3V0ZXJMb2NhbHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG91dGVyTG9jYWxzQ291bnQ7IGkrKyl7Ci0JCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aGV0aWNBcmcgPSBvdXRlckxvY2Fsc1tpXTsKLQkJc3ludGhldGljQXJnLnJlc29sdmVkUG9zaXRpb24gPSBwb3NpdGlvbjsKLQkJaWYgKChzeW50aGV0aWNBcmcudHlwZSA9PSBMb25nQmluZGluZykgfHwgKHN5bnRoZXRpY0FyZy50eXBlID09IERvdWJsZUJpbmRpbmcpKXsKLQkJCXBvc2l0aW9uICs9IDI7CisJCisJLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZT4uCisJKiBBbnN3ZXIgdGhlIG5ldyBhcmd1bWVudCBvciB0aGUgZXhpc3RpbmcgYXJndW1lbnQgaWYgb25lIGFscmVhZHkgZXhpc3RlZC4KKwkqLworCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYWRkU3ludGhldGljQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gbnVsbDsKKwkKKwkJaWYgKG91dGVyTG9jYWxWYXJpYWJsZXMgPT0gbnVsbCkgeworCQkJc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJCW91dGVyTG9jYWxWYXJpYWJsZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10ge3N5bnRoTG9jYWx9OwogCQl9IGVsc2UgewotCQkJcG9zaXRpb24gKys7CisJCQlpbnQgc2l6ZSA9IG91dGVyTG9jYWxWYXJpYWJsZXMubGVuZ3RoOworCQkJaW50IG5ld0FyZ0luZGV4ID0gc2l6ZTsKKwkJCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspIHsJCS8vIG11c3Qgc2VhcmNoIGJhY2t3YXJkcworCQkJCWlmIChvdXRlckxvY2FsVmFyaWFibGVzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpCisJCQkJCXJldHVybiBvdXRlckxvY2FsVmFyaWFibGVzW2ldOwkvLyBhbHJlYWR5IGV4aXN0cworCQkJCWlmIChvdXRlckxvY2FsVmFyaWFibGVzW2ldLmlkID4gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLmlkKQorCQkJCQluZXdBcmdJbmRleCA9IGk7CisJCQl9CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aExvY2FscyA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbc2l6ZSArIDFdOworCQkJU3lzdGVtLmFycmF5Y29weShvdXRlckxvY2FsVmFyaWFibGVzLCAwLCBzeW50aExvY2FscywgMCwgbmV3QXJnSW5kZXgpOworCQkJc3ludGhMb2NhbHNbbmV3QXJnSW5kZXhdID0gc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob3V0ZXJMb2NhbFZhcmlhYmxlcywgbmV3QXJnSW5kZXgsIHN5bnRoTG9jYWxzLCBuZXdBcmdJbmRleCArIDEsIHNpemUgLSBuZXdBcmdJbmRleCk7CisJCQlvdXRlckxvY2FsVmFyaWFibGVzID0gc3ludGhMb2NhbHM7CiAJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBzeW50aCBhcmcgZm9yIGxvY2FsIHZhcjogIiArIG5ldyBTdHJpbmcoYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLm5hbWUpICsgIiB0bzogIiArIG5ldyBTdHJpbmcodGhpcy5yZWFkYWJsZU5hbWUoKSkpOworCQlpZiAoc2NvcGUucmVmZXJlbmNlQ29tcGlsYXRpb25Vbml0KCkuaXNQcm9wYWdhdGluZ0lubmVyQ2xhc3NFbXVsYXRpb24pCisJCQl0aGlzLnVwZGF0ZUlubmVyRW11bGF0aW9uRGVwZW5kZW50cygpOworCQlyZXR1cm4gc3ludGhMb2NhbDsKIAl9Ci0JdGhpcy5zeW50aGV0aWNBcmd1bWVudHNPZmZzZXQgPSBwb3NpdGlvbjsKLX0KLS8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBlbmNsb3NpbmcgdHlwZS4uLiBudWxsIGlmIHRoZSByZWNlaXZlciBpcyBhIHRvcCBsZXZlbCB0eXBlLgotKi8KIAotcHVibGljIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSgpIHsKLQlyZXR1cm4gZW5jbG9zaW5nVHlwZTsKLX0KLS8qIEFuc3dlciB0aGUgc3ludGhldGljIGFyZ3VtZW50IGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPiBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLSovCisJLyogQWRkIGEgbmV3IHN5bnRoZXRpYyBhcmd1bWVudCBmb3IgPGVuY2xvc2luZ1R5cGU+LgorCSogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisJKi8KKwlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFkZFN5bnRoZXRpY0FyZ3VtZW50KFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgeworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhMb2NhbCA9IG51bGw7CisJCWlmIChlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCkgeworCQkJc3ludGhMb2NhbCA9IG5ldyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoZW5jbG9zaW5nVHlwZSk7CisJCQllbmNsb3NpbmdJbnN0YW5jZXMgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10ge3N5bnRoTG9jYWx9OworCQl9IGVsc2UgeworCQkJaW50IHNpemUgPSBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOworCQkJaW50IG5ld0FyZ0luZGV4ID0gc2l6ZTsKKwkJCWZvciAoaW50IGkgPSBzaXplOyAtLWkgPj0gMDspIHsKKwkJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUgPT0gZW5jbG9zaW5nVHlwZSkKKwkJCQkJcmV0dXJuIGVuY2xvc2luZ0luc3RhbmNlc1tpXTsgLy8gYWxyZWFkeSBleGlzdHMKKwkJCQlpZiAodGhpcy5lbmNsb3NpbmdUeXBlKCkgPT0gZW5jbG9zaW5nVHlwZSkKKwkJCQkJbmV3QXJnSW5kZXggPSAwOworCQkJfQorCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gbmV3SW5zdGFuY2VzID0gbmV3IFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tzaXplICsgMV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGVuY2xvc2luZ0luc3RhbmNlcywgMCwgbmV3SW5zdGFuY2VzLCBuZXdBcmdJbmRleCA9PSAwID8gMSA6IDAsIHNpemUpOworCQkJbmV3SW5zdGFuY2VzW25ld0FyZ0luZGV4XSA9IHN5bnRoTG9jYWwgPSBuZXcgU3ludGhldGljQXJndW1lbnRCaW5kaW5nKGVuY2xvc2luZ1R5cGUpOworCQkJZW5jbG9zaW5nSW5zdGFuY2VzID0gbmV3SW5zdGFuY2VzOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgc3ludGggYXJnIGZvciBlbmNsb3NpbmcgdHlwZTogIiArIG5ldyBTdHJpbmcoZW5jbG9zaW5nVHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiIHRvOiAiICsgbmV3IFN0cmluZyh0aGlzLnJlYWRhYmxlTmFtZSgpKSk7CisJCWlmIChzY29wZS5yZWZlcmVuY2VDb21waWxhdGlvblVuaXQoKS5pc1Byb3BhZ2F0aW5nSW5uZXJDbGFzc0VtdWxhdGlvbikKKwkJCXRoaXMudXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCk7CisJCXJldHVybiBzeW50aExvY2FsOworCX0KIAotcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBnZXRTeW50aGV0aWNBcmd1bWVudChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKLQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gb3V0ZXIgbG9jYWwgdmFyaWFibGVzIGFyZSBrbm93bgorCS8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYXJndW1lbnQgYW5kIGZpZWxkIGZvciA8YWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlPi4KKwkqIEFuc3dlciB0aGUgbmV3IGFyZ3VtZW50IG9yIHRoZSBleGlzdGluZyBhcmd1bWVudCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgorCSovCisJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBhZGRTeW50aGV0aWNBcmd1bWVudEFuZEZpZWxkKExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkgeworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgc3ludGhMb2NhbCA9IGFkZFN5bnRoZXRpY0FyZ3VtZW50KGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSk7CisJCWlmIChzeW50aExvY2FsID09IG51bGwpIHJldHVybiBudWxsOworCQorCQlpZiAoc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID09IG51bGwpCisJCQlzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPSBhZGRTeW50aGV0aWNGaWVsZChhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpOworCQlyZXR1cm4gc3ludGhMb2NhbDsKKwl9CiAKLQlmb3IgKGludCBpID0gb3V0ZXJMb2NhbFZhcmlhYmxlcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKG91dGVyTG9jYWxWYXJpYWJsZXNbaV0uYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlID09IGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSkKLQkJCXJldHVybiBvdXRlckxvY2FsVmFyaWFibGVzW2ldOwotCXJldHVybiBudWxsOwotfQotcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIHN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlcygpIHsKLQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzOwkJLy8gaXMgbnVsbCBpZiBubyBlbmNsb3NpbmcgaW5zdGFuY2VzIGFyZSByZXF1aXJlZAotfQotcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkgewotCWlmIChlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCkKKwkvKiBBZGQgYSBuZXcgc3ludGhldGljIGFyZ3VtZW50IGFuZCBmaWVsZCBmb3IgPGVuY2xvc2luZ1R5cGU+LgorCSogQW5zd2VyIHRoZSBuZXcgYXJndW1lbnQgb3IgdGhlIGV4aXN0aW5nIGFyZ3VtZW50IGlmIG9uZSBhbHJlYWR5IGV4aXN0ZWQuCisJKi8KKwlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFkZFN5bnRoZXRpY0FyZ3VtZW50QW5kRmllbGQoUmVmZXJlbmNlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBzeW50aExvY2FsID0gYWRkU3ludGhldGljQXJndW1lbnQoZW5jbG9zaW5nVHlwZSk7CisJCWlmIChzeW50aExvY2FsID09IG51bGwpIHJldHVybiBudWxsOworCQorCQlpZiAoc3ludGhMb2NhbC5tYXRjaGluZ0ZpZWxkID09IG51bGwpCisJCQlzeW50aExvY2FsLm1hdGNoaW5nRmllbGQgPSBhZGRTeW50aGV0aWNGaWVsZChlbmNsb3NpbmdUeXBlKTsKKwkJcmV0dXJuIHN5bnRoTG9jYWw7CisJfQorCisJLyoqCisJICogQ29tcHV0ZSB0aGUgcmVzb2x2ZWQgcG9zaXRpb25zIGZvciBhbGwgdGhlIHN5bnRoZXRpYyBhcmd1bWVudHMKKwkgKi8KKwlmaW5hbCBwdWJsaWMgdm9pZCBjb21wdXRlU3ludGhldGljQXJndW1lbnRTbG90U2l6ZXMoKSB7CisJCisJCWludCBzbG90U2l6ZSA9IDA7IAorCQkvLyBpbnNlcnQgZW5jbG9zaW5nIGluc3RhbmNlcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIG91dGVyTG9jYWxzCisJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZ1tdIGVuY2xvc2luZ0luc3RhbmNlcyA9IHRoaXMuc3ludGhldGljRW5jbG9zaW5nSW5zdGFuY2VzKCk7CisJCWludCBlbmNsb3NpbmdJbnN0YW5jZXNDb3VudCA9IGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsID8gMCA6IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jbG9zaW5nSW5zdGFuY2VzQ291bnQ7IGkrKyl7CisJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgYXJndW1lbnQgPSBlbmNsb3NpbmdJbnN0YW5jZXNbaV07CisJCQkvLyBwb3NpdGlvbiB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIHN5bnRoZXRpYyBhcmcKKwkJCWFyZ3VtZW50LnJlc29sdmVkUG9zaXRpb24gPSBzbG90U2l6ZSArIDE7IC8vIHNoaWZ0IGJ5IDEgdG8gbGVhdmUgcm9vbSBmb3IgYWxvYWQwPT10aGlzCisJCQlpZiAoc2xvdFNpemUgKyAxID4gMHhGRikgeyAvLyBubyBtb3JlIHRoYW4gMjU1IHdvcmRzIG9mIGFyZ3VtZW50cworCQkJCXRoaXMuc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JBcmd1bWVudChhcmd1bWVudCwgdGhpcy5zY29wZS5yZWZlcmVuY2VUeXBlKCkpOyAKKwkJCX0KKwkJCWlmICgoYXJndW1lbnQudHlwZSA9PSBMb25nQmluZGluZykgfHwgKGFyZ3VtZW50LnR5cGUgPT0gRG91YmxlQmluZGluZykpeworCQkJCXNsb3RTaXplICs9IDI7CisJCQl9IGVsc2UgeworCQkJCXNsb3RTaXplICsrOworCQkJfQorCQl9CisJCXRoaXMuZW5jbG9zaW5nSW5zdGFuY2VzU2xvdFNpemUgPSBzbG90U2l6ZTsgCisJCQorCQlzbG90U2l6ZSA9IDA7IC8vIHJlc2V0LCBvdXRlciBsb2NhbCBhcmUgbm90IHBvc2l0aW9ubmVkIHlldCwgc2luY2Ugd2lsbCBiZSBhcHBlbmRlZCB0byB1c2VyIGFyZ3VtZW50cworCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBvdXRlckxvY2FscyA9IHRoaXMuc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpOworCQlpbnQgb3V0ZXJMb2NhbHNDb3VudCA9IG91dGVyTG9jYWxzID09IG51bGwgPyAwIDogb3V0ZXJMb2NhbHMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRlckxvY2Fsc0NvdW50OyBpKyspeworCQkJU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGFyZ3VtZW50ID0gb3V0ZXJMb2NhbHNbaV07CisJCQkvLyBkbyBOT1QgcG9zaXRpb24gdGhlIG91dGVybG9jYWwgc3ludGhldGljIGFyZyB5ZXQsICBzaW5jZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHVzZXIgYXJndW1lbnRzCisJCQlpZiAoKGFyZ3VtZW50LnR5cGUgPT0gTG9uZ0JpbmRpbmcpIHx8IChhcmd1bWVudC50eXBlID09IERvdWJsZUJpbmRpbmcpKXsKKwkJCQlzbG90U2l6ZSArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlzbG90U2l6ZSArKzsKKwkJCX0KKwkJfQorCQl0aGlzLm91dGVyTG9jYWxWYXJpYWJsZXNTbG90U2l6ZSA9IHNsb3RTaXplOworCX0KKwkKKwkvKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZW5jbG9zaW5nIHR5cGUuLi4gbnVsbCBpZiB0aGUgcmVjZWl2ZXIgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KKwkqLworCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUoKSB7CisKKwkJcmV0dXJuIGVuY2xvc2luZ1R5cGU7CisJfQorCisJLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDxhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU+IG9yIG51bGwgaWYgb25lIGRvZXMgbm90IGV4aXN0LgorCSovCisJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyBnZXRTeW50aGV0aWNBcmd1bWVudChMb2NhbFZhcmlhYmxlQmluZGluZyBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpIHsKKworCQlpZiAob3V0ZXJMb2NhbFZhcmlhYmxlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gb3V0ZXIgbG9jYWwgdmFyaWFibGVzIGFyZSBrbm93bgorCQorCQlmb3IgKGludCBpID0gb3V0ZXJMb2NhbFZhcmlhYmxlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCWlmIChvdXRlckxvY2FsVmFyaWFibGVzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUpCisJCQkJcmV0dXJuIG91dGVyTG9jYWxWYXJpYWJsZXNbaV07CiAJCXJldHVybiBudWxsOwotCi0JaW50IGxlbmd0aCA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7Ci0JUmVmZXJlbmNlQmluZGluZyB0eXBlc1tdID0gbmV3IFJlZmVyZW5jZUJpbmRpbmdbbGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQl0eXBlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0YW5jZXNbaV0udHlwZTsKLQlyZXR1cm4gdHlwZXM7Ci19Ci1wdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nW10gc3ludGhldGljT3V0ZXJMb2NhbFZhcmlhYmxlcygpIHsKLQlyZXR1cm4gb3V0ZXJMb2NhbFZhcmlhYmxlczsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUgcmVxdWlyZWQKLX0KLS8qCi0gKiBUcmlnZ2VyIHRoZSBkZXBlbmRlbmN5IG1lY2hhbmlzbSBmb3JjaW5nIHRoZSBpbm5lcmNsYXNzIGVtdWxhdGlvbgotICogdG8gYmUgcHJvcGFnYXRlZCB0byBhbGwgZGVwZW5kZW50IHNvdXJjZSB0eXBlcy4KLSAqLwotcHVibGljIHZvaWQgdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCkgewotCS8vIG5vdGhpbmcgdG8gZG8gaW4gZ2VuZXJhbCwgb25seSBsb2NhbCB0eXBlcyBhcmUgZG9pbmcgYW55dGhpbmcKLX0KLQotLyogQW5zd2VyIHRoZSBzeW50aGV0aWMgYXJndW1lbnQgZm9yIDx0YXJnZXRFbmNsb3NpbmdUeXBlPiBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLSovCi0KLXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcgZ2V0U3ludGhldGljQXJndW1lbnQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlLCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIG9ubHlFeGFjdE1hdGNoKSB7Ci0JaWYgKGVuY2xvc2luZ0luc3RhbmNlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsJCS8vIGlzIG51bGwgaWYgbm8gZW5jbG9zaW5nIGluc3RhbmNlcyBhcmUga25vd24KLQotCS8vIGV4YWN0IG1hdGNoCi0JZm9yIChpbnQgaSA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS50eXBlID09IHRhcmdldEVuY2xvc2luZ1R5cGUpCi0JCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBudWxsKQotCQkJCXJldHVybiBlbmNsb3NpbmdJbnN0YW5jZXNbaV07Ci0KLQkvLyB0eXBlIGNvbXBhdGliaWxpdHkgOiB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcwotCS8vIGNsYXNzIFQgeyBjbGFzcyBNe319Ci0JLy8gY2xhc3MgUyBleHRlbmRzIFQgeyBjbGFzcyBOIGV4dGVuZHMgTSB7fX0gLS0+IG5lZWQgdG8gdXNlIFMgYXMgYSBkZWZhdWx0IGVuY2xvc2luZyBpbnN0YW5jZSBmb3IgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgaW4gTigpLgotCWlmICghb25seUV4YWN0TWF0Y2gpewotCQlmb3IgKGludCBpID0gZW5jbG9zaW5nSW5zdGFuY2VzLmxlbmd0aDsgLS1pID49IDA7KQotCQkJaWYgKGVuY2xvc2luZ0luc3RhbmNlc1tpXS5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPT0gbnVsbCkKLQkJCQlpZiAodGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUpKQotCQkJCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzW2ldOwogCX0KLQlyZXR1cm4gbnVsbDsKLX0KKworCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZXMoKSB7CisJCXJldHVybiBlbmNsb3NpbmdJbnN0YW5jZXM7CQkvLyBpcyBudWxsIGlmIG5vIGVuY2xvc2luZyBpbnN0YW5jZXMgYXJlIHJlcXVpcmVkCisJfQorCisJcHVibGljIFJlZmVyZW5jZUJpbmRpbmdbXSBzeW50aGV0aWNFbmNsb3NpbmdJbnN0YW5jZVR5cGVzKCkgeworCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkKKwkJaW50IGxlbmd0aCA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7CisJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZXNbXSA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nW2xlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl0eXBlc1tpXSA9IChSZWZlcmVuY2VCaW5kaW5nKSBlbmNsb3NpbmdJbnN0YW5jZXNbaV0udHlwZTsKKwkJcmV0dXJuIHR5cGVzOworCX0KKworCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmdbXSBzeW50aGV0aWNPdXRlckxvY2FsVmFyaWFibGVzKCkgeworCisJCXJldHVybiBvdXRlckxvY2FsVmFyaWFibGVzOwkJLy8gaXMgbnVsbCBpZiBubyBvdXRlciBsb2NhbHMgYXJlIHJlcXVpcmVkCisJfQorCisJLyoKKwkgKiBUcmlnZ2VyIHRoZSBkZXBlbmRlbmN5IG1lY2hhbmlzbSBmb3JjaW5nIHRoZSBpbm5lcmNsYXNzIGVtdWxhdGlvbgorCSAqIHRvIGJlIHByb3BhZ2F0ZWQgdG8gYWxsIGRlcGVuZGVudCBzb3VyY2UgdHlwZXMuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlSW5uZXJFbXVsYXRpb25EZXBlbmRlbnRzKCkgeworCQkvLyBub3RoaW5nIHRvIGRvIGluIGdlbmVyYWwsIG9ubHkgbG9jYWwgdHlwZXMgYXJlIGRvaW5nIGFueXRoaW5nCisJfQorCQorCS8qIEFuc3dlciB0aGUgc3ludGhldGljIGFyZ3VtZW50IGZvciA8dGFyZ2V0RW5jbG9zaW5nVHlwZT4gb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCisJKi8KKwlwdWJsaWMgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGdldFN5bnRoZXRpY0FyZ3VtZW50KFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSwgYm9vbGVhbiBvbmx5RXhhY3RNYXRjaCkgeworCisJCWlmIChlbmNsb3NpbmdJbnN0YW5jZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CQkvLyBpcyBudWxsIGlmIG5vIGVuY2xvc2luZyBpbnN0YW5jZXMgYXJlIGtub3duCisJCisJCS8vIGV4YWN0IG1hdGNoCisJCWZvciAoaW50IGkgPSBlbmNsb3NpbmdJbnN0YW5jZXMubGVuZ3RoOyAtLWkgPj0gMDspCisJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUgPT0gdGFyZ2V0RW5jbG9zaW5nVHlwZSkKKwkJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBudWxsKQorCQkJCQlyZXR1cm4gZW5jbG9zaW5nSW5zdGFuY2VzW2ldOworCQorCQkvLyB0eXBlIGNvbXBhdGliaWxpdHkgOiB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcworCQkvLyBjbGFzcyBUIHsgY2xhc3MgTXt9fQorCQkvLyBjbGFzcyBTIGV4dGVuZHMgVCB7IGNsYXNzIE4gZXh0ZW5kcyBNIHt9fSAtLT4gbmVlZCB0byB1c2UgUyBhcyBhIGRlZmF1bHQgZW5jbG9zaW5nIGluc3RhbmNlIGZvciB0aGUgc3VwZXIgY29uc3RydWN0b3IgY2FsbCBpbiBOKCkuCisJCWlmICghb25seUV4YWN0TWF0Y2gpeworCQkJZm9yIChpbnQgaSA9IGVuY2xvc2luZ0luc3RhbmNlcy5sZW5ndGg7IC0taSA+PSAwOykKKwkJCQlpZiAoZW5jbG9zaW5nSW5zdGFuY2VzW2ldLmFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZSA9PSBudWxsKQorCQkJCQlpZiAodGFyZ2V0RW5jbG9zaW5nVHlwZS5pc1N1cGVyY2xhc3NPZigoUmVmZXJlbmNlQmluZGluZykgZW5jbG9zaW5nSW5zdGFuY2VzW2ldLnR5cGUpKQorCQkJCQkJcmV0dXJuIGVuY2xvc2luZ0luc3RhbmNlc1tpXTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhY2thZ2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1BhY2thZ2VCaW5kaW5nLmphdmEKaW5kZXggZmUxOWZkMi4uNmI5NjhkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9QYWNrYWdlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUGFja2FnZUJpbmRpbmcuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuSGFzaHRhYmxlT2ZQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mVHlwZTsKIApAQCAtMzYsMTUgKzM2LDE1IEBACiAqLwogCiBwdWJsaWMgUGFja2FnZUJpbmRpbmcoTG9va3VwRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQl0aGlzKE5vQ2hhckNoYXIsIG51bGwsIGVudmlyb25tZW50KTsKKwl0aGlzKENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSLCBudWxsLCBlbnZpcm9ubWVudCk7CiB9CiBwcml2YXRlIHZvaWQgYWRkTm90Rm91bmRQYWNrYWdlKGNoYXJbXSBzaW1wbGVOYW1lKSB7Ci0Ja25vd25QYWNrYWdlcy5wdXQoc2ltcGxlTmFtZSwgZW52aXJvbm1lbnQudGhlTm90Rm91bmRQYWNrYWdlKTsKKwlrbm93blBhY2thZ2VzLnB1dChzaW1wbGVOYW1lLCBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFBhY2thZ2UpOwogfQogcHJpdmF0ZSB2b2lkIGFkZE5vdEZvdW5kVHlwZShjaGFyW10gc2ltcGxlTmFtZSkgewogCWlmIChrbm93blR5cGVzID09IG51bGwpCiAJCWtub3duVHlwZXMgPSBuZXcgSGFzaHRhYmxlT2ZUeXBlKDI1KTsKLQlrbm93blR5cGVzLnB1dChzaW1wbGVOYW1lLCBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFR5cGUpOworCWtub3duVHlwZXMucHV0KHNpbXBsZU5hbWUsIExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kVHlwZSk7CiB9CiB2b2lkIGFkZFBhY2thZ2UoUGFja2FnZUJpbmRpbmcgZWxlbWVudCkgewogCWtub3duUGFja2FnZXMucHV0KGVsZW1lbnQuY29tcG91bmROYW1lW2VsZW1lbnQuY29tcG91bmROYW1lLmxlbmd0aCAtIDFdLCBlbGVtZW50KTsKQEAgLTc5LDcgKzc5LDcgQEAKIFBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2UoY2hhcltdIG5hbWUpIHsKIAlQYWNrYWdlQmluZGluZyBiaW5kaW5nID0gZ2V0UGFja2FnZTAobmFtZSk7CiAJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQlpZiAoYmluZGluZyA9PSBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFBhY2thZ2UpCisJCWlmIChiaW5kaW5nID09IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kUGFja2FnZSkKIAkJCXJldHVybiBudWxsOwogCQllbHNlCiAJCQlyZXR1cm4gYmluZGluZzsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQl9CiAJfQogCi0JaWYgKGJpbmRpbmcgPT0gZW52aXJvbm1lbnQudGhlTm90Rm91bmRUeXBlKQorCWlmIChiaW5kaW5nID09IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kVHlwZSkKIAkJcmV0dXJuIG51bGw7CiAJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKIAkJYmluZGluZyA9ICgoVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcpIGJpbmRpbmcpLnJlc29sdmUoZW52aXJvbm1lbnQpOwpAQCAtMTUzLDExICsxNTMsMTEgQEAKIAogcHVibGljIEJpbmRpbmcgZ2V0VHlwZU9yUGFja2FnZShjaGFyW10gbmFtZSkgewogCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZTAobmFtZSk7Ci0JaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwgJiYgcGFja2FnZUJpbmRpbmcgIT0gZW52aXJvbm1lbnQudGhlTm90Rm91bmRQYWNrYWdlKQorCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsICYmIHBhY2thZ2VCaW5kaW5nICE9IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kUGFja2FnZSkKIAkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOwogCiAJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IGdldFR5cGUwKG5hbWUpOwotCWlmICh0eXBlQmluZGluZyAhPSBudWxsICYmIHR5cGVCaW5kaW5nICE9IGVudmlyb25tZW50LnRoZU5vdEZvdW5kVHlwZSkgeworCWlmICh0eXBlQmluZGluZyAhPSBudWxsICYmIHR5cGVCaW5kaW5nICE9IExvb2t1cEVudmlyb25tZW50LlRoZU5vdEZvdW5kVHlwZSkgewogCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykKIAkJCXR5cGVCaW5kaW5nID0gKChVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZykgdHlwZUJpbmRpbmcpLnJlc29sdmUoZW52aXJvbm1lbnQpOwogCQlpZiAodHlwZUJpbmRpbmcuaXNOZXN0ZWRUeXBlKCkpCkBAIC0xNjUsMTEgKzE2NSwxMCBAQAogCQlyZXR1cm4gdHlwZUJpbmRpbmc7CiAJfQogCi0JaWYgKHR5cGVCaW5kaW5nID09IG51bGwgJiYgcGFja2FnZUJpbmRpbmcgPT0gbnVsbCkgewotCQkvLyBmaW5kIHRoZSBwYWNrYWdlCi0JCWlmICgocGFja2FnZUJpbmRpbmcgPSBmaW5kUGFja2FnZShuYW1lKSkgIT0gbnVsbCkKLQkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKLQorCS8vIGFsd2F5cyBsb29rIGZvciB0aGUgbmFtZSBhcyBhIHN1Yi1wYWNrYWdlIGlmIGl0cyBub3QgYSBrbm93biB0eXBlCisJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwgJiYgKHBhY2thZ2VCaW5kaW5nID0gZmluZFBhY2thZ2UobmFtZSkpICE9IG51bGwpCisJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewogCQkvLyBpZiBubyBwYWNrYWdlIHdhcyBmb3VuZCwgZmluZCB0aGUgdHlwZSBuYW1lZCBuYW1lIHJlbGF0aXZlIHRvIHRoZSByZWNlaXZlcgogCQlpZiAoKHR5cGVCaW5kaW5nID0gZW52aXJvbm1lbnQuYXNrRm9yVHlwZSh0aGlzLCBuYW1lKSkgIT0gbnVsbCkgewogCQkJaWYgKHR5cGVCaW5kaW5nLmlzTmVzdGVkVHlwZSgpKQpAQCAtMTgyLDkgKzE4MSw5IEBACiAJCWFkZE5vdEZvdW5kUGFja2FnZShuYW1lKTsKIAkJYWRkTm90Rm91bmRUeXBlKG5hbWUpOwogCX0gZWxzZSB7Ci0JCWlmIChwYWNrYWdlQmluZGluZyA9PSBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFBhY2thZ2UpCisJCWlmIChwYWNrYWdlQmluZGluZyA9PSBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFBhY2thZ2UpCiAJCQlwYWNrYWdlQmluZGluZyA9IG51bGw7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBlbnZpcm9ubWVudC50aGVOb3RGb3VuZFR5cGUpCisJCWlmICh0eXBlQmluZGluZyA9PSBMb29rdXBFbnZpcm9ubWVudC5UaGVOb3RGb3VuZFR5cGUpCiAJCQl0eXBlQmluZGluZyA9IG51bGw7CiAJfQogCkBAIC0xOTcsNyArMTk2LDcgQEAKIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKIH0KIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JaWYgKGNvbXBvdW5kTmFtZSA9PSBOb0NoYXJDaGFyKQorCWlmIChjb21wb3VuZE5hbWUgPT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpCiAJCXJldHVybiAiVGhlIERlZmF1bHQgUGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKIAllbHNlCiAJCXJldHVybiAicGFja2FnZSAiICsgKChjb21wb3VuZE5hbWUgIT0gbnVsbCkgPyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBvdW5kTmFtZSkgOiAiVU5OQU1FRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbUJpbmRpbmcuamF2YQppbmRleCBlMDM2YzAzLi45YWRhNjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1CaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtQmluZGluZy5qYXZhCkBAIC0xLDE2ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGNsYXNzIFByb2JsZW1CaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7CiAJcHVibGljIGNoYXJbXSBuYW1lOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtRmllbGRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1GaWVsZEJpbmRpbmcuamF2YQppbmRleCA1ZjRjYzg1Li5mN2IxNmI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1GaWVsZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1GaWVsZEJpbmRpbmcuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBQcm9ibGVtRmllbGRCaW5kaW5nIGV4dGVuZHMgRmllbGRCaW5kaW5nIHsKIAlwcml2YXRlIGludCBwcm9ibGVtSWQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1NZXRob2RCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1NZXRob2RCaW5kaW5nLmphdmEKaW5kZXggMDYwOWVkNS4uZjRhZjI4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtTWV0aG9kQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbU1ldGhvZEJpbmRpbmcuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIHB1YmxpYyBjbGFzcyBQcm9ibGVtTWV0aG9kQmluZGluZyBleHRlbmRzIE1ldGhvZEJpbmRpbmcgewpAQCAtMjcsNiArMjcsNyBAQAogcHVibGljIFByb2JsZW1NZXRob2RCaW5kaW5nKE1ldGhvZEJpbmRpbmcgY2xvc2VzdE1hdGNoLCBjaGFyW10gc2VsZWN0b3IsIFR5cGVCaW5kaW5nW10gYXJncywgaW50IHByb2JsZW1JZCkgewogCXRoaXMoc2VsZWN0b3IsIGFyZ3MsIHByb2JsZW1JZCk7CiAJdGhpcy5jbG9zZXN0TWF0Y2ggPSBjbG9zZXN0TWF0Y2g7CisJaWYgKGNsb3Nlc3RNYXRjaCAhPSBudWxsKSB0aGlzLmRlY2xhcmluZ0NsYXNzID0gY2xvc2VzdE1hdGNoLmRlY2xhcmluZ0NsYXNzOwogfQogLyogQVBJCiAqIEFuc3dlciB0aGUgcHJvYmxlbSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVBhY2thZ2VCaW5kaW5nLmphdmEKaW5kZXggOGJjNWRkMC4uZTNmMWM5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUGFja2FnZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1QYWNrYWdlQmluZGluZy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGNsYXNzIFByb2JsZW1QYWNrYWdlQmluZGluZyBleHRlbmRzIFBhY2thZ2VCaW5kaW5nIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVJlYXNvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVJlYXNvbnMuamF2YQppbmRleCBiNDVlNmFiLi5mYWJhMDY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWFzb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVhc29ucy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGludGVyZmFjZSBQcm9ibGVtUmVhc29ucyB7CkBAIC0xOSw0ICsxOSw1IEBACiAJZmluYWwgaW50IEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgPSA1OwogCWZpbmFsIGludCBOb25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IDY7CiAJZmluYWwgaW50IE5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCA9IDc7CisJZmluYWwgaW50IFJlY2VpdmVyVHlwZU5vdFZpc2libGUgPSA4OwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVmZXJlbmNlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Qcm9ibGVtUmVmZXJlbmNlQmluZGluZy5qYXZhCmluZGV4IDE4ZjUwNmYuLmFmYTM2MzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Byb2JsZW1SZWZlcmVuY2VCaW5kaW5nLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBwdWJsaWMgY2xhc3MgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgZXh0ZW5kcyBSZWZlcmVuY2VCaW5kaW5nIHsKQEAgLTM4LDQgKzM4LDEyIEBACiBwdWJsaWMgZmluYWwgaW50IHByb2JsZW1JZCgpIHsKIAlyZXR1cm4gcHJvYmxlbUlkOwogfQorCisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nI3Nob3J0UmVhZGFibGVOYW1lKCkKKyAqLworcHVibGljIGNoYXJbXSBzaG9ydFJlYWRhYmxlTmFtZSgpIHsKKwlyZXR1cm4gcmVhZGFibGVOYW1lKCk7Cit9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvUmVmZXJlbmNlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SZWZlcmVuY2VCaW5kaW5nLmphdmEKaW5kZXggMmNmMmZjOS4uZWQ4OTBlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SZWZlcmVuY2VCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9SZWZlcmVuY2VCaW5kaW5nLmphdmEKQEAgLTEsMTcgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklEZXBlbmRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogLyoKIE5vdCBhbGwgZmllbGRzIGRlZmluZWQgYnkgdGhpcyB0eXBlICgmIGl0cyBzdWJjbGFzc2VzKSBhcmUgaW5pdGlhbGl6ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLgpAQCAtMTIzLDI2ICsxMjMsMjIgQEAKIAl9IHdoaWxlICgodHlwZSA9IHR5cGUuc3VwZXJjbGFzcygpKSAhPSBudWxsKTsKIAlyZXR1cm4gZmFsc2U7CiB9Ci0vKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCi0qCi0qIE5PVEU6IENhbm5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQgc2NvcGUuCi0qLworLyogCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgdmlzaWJsZSB0byB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUgc2NvcGUuCisgKi8KIAogcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuQmVTZWVuQnkoU2NvcGUgc2NvcGUpIHsKKwkKIAlpZiAoaXNQdWJsaWMoKSkgcmV0dXJuIHRydWU7CiAKKwlpZiAoc2NvcGUua2luZCA9PSBTY29wZS5DT01QSUxBVElPTl9VTklUX1NDT1BFKXsKKwkJcmV0dXJuIHRoaXMuY2FuQmVTZWVuQnkoKChDb21waWxhdGlvblVuaXRTY29wZSlzY29wZSkuZlBhY2thZ2UpOworCX0KKwkKIAlTb3VyY2VUeXBlQmluZGluZyBpbnZvY2F0aW9uVHlwZSA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTsKIAlpZiAoaW52b2NhdGlvblR5cGUgPT0gdGhpcykgcmV0dXJuIHRydWU7CiAKIAlpZiAoaXNQcm90ZWN0ZWQoKSkgewotCQkvLyBhbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgKG9yIGl0cyBlbmNsb3NpbmcgdHlwZSkgaXMgdGhlIHN1cGVyY2xhc3MgCi0JCS8vCW9mIHRoZSBpbnZvY2F0aW9uVHlwZSBvciBpbiB0aGUgc2FtZSBwYWNrYWdlCi0JCXJldHVybiBpbnZvY2F0aW9uVHlwZS5mUGFja2FnZSA9PSBmUGFja2FnZSAKLQkJCQl8fCBpc1N1cGVyY2xhc3NPZihpbnZvY2F0aW9uVHlwZSkKLQkJCQl8fCBlbmNsb3NpbmdUeXBlKCkuaXNTdXBlcmNsYXNzT2YoaW52b2NhdGlvblR5cGUpOyAvLyBwcm90ZWN0ZWQgdHlwZXMgYWx3YXlzIGhhdmUgYW4gZW5jbG9zaW5nIG9uZQotCX0KLQotCWlmIChpc1Byb3RlY3RlZCgpKSB7CiAJCS8vIGFuc3dlciB0cnVlIGlmIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgZGVjbGFyaW5nQ2xhc3Mgb3IgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZQogCQkvLyBPUiB0aGUgaW52b2NhdGlvblR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVjbGFyaW5nQ2xhc3MKIAkJLy8gICAgQU5EIHRoZSBpbnZvY2F0aW9uVHlwZSBpcyB0aGUgaW52b2NhdGlvblR5cGUgb3IgaXRzIHN1YmNsYXNzCkBAIC00NDQsNyArNDQwLDcgQEAKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlciB0eXBlIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgYXJndW1lbnQgdHlwZSAocmlnaHQpCiAqLwogCQotYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CitwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KSB7CiAJaWYgKHJpZ2h0ID09IHRoaXMpCiAJCXJldHVybiB0cnVlOwogCWlmIChyaWdodC5pZCA9PSBUX09iamVjdCkKQEAgLTQ5NSw2ICs0OTEsMTIgQEAKIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpdmF0ZSgpIHsKIAlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDA7CiB9CisvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByaXZhdGUgdmlzaWJpbGl0eSBhbmQgaXMgdXNlZCBsb2NhbGx5CisqLworCitwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaXZhdGVVc2VkKCkgeworCXJldHVybiAobW9kaWZpZXJzICYgQWNjUHJpdmF0ZVVzZWQpICE9IDA7Cit9CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaGFzIHByb3RlY3RlZCB2aXNpYmlsaXR5CiAqLwogCkBAIC01NjQsNiArNTY2LDE0IEBACiAJZWxzZQogCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgJy4nKTsKIH0KKworcHVibGljIGNoYXJbXSBzaG9ydFJlYWRhYmxlTmFtZSgpIC8qT2JqZWN0Ki8geworCWlmIChpc01lbWJlclR5cGUoKSkKKwkJcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KGVuY2xvc2luZ1R5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpLCBzb3VyY2VOYW1lLCAnLicpOworCWVsc2UKKwkJcmV0dXJuIHNvdXJjZU5hbWU7Cit9CisKIC8qIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBzaWduYXR1cmUuCiAqCiAqIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nL2FmdGVyIGNvZGUgZ2VuLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TY29wZS5qYXZhCmluZGV4IDM2MzZhNmQuLmJiZWJkZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1Njb3BlLmphdmEKQEAgLTEsMTkgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuUmVmZXJlbmNlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5PYmplY3RWZWN0b3I7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY29wZQpAQCAtNTYsMTIgKzU5LDYgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JLyogQW5zd2VyIHRydWUgaWYgdGhlIGxlZnQgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gcmlnaHQKLQkqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVUeXBlc0NvbXBhdGlibGUoVHlwZUJpbmRpbmcgbGVmdCwgVHlwZUJpbmRpbmcgcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQuaXNDb21wYXRpYmxlV2l0aChyaWdodCk7Ci0JfQotCiAJLyogQW5zd2VyIGFuIGludCBkZXNjcmliaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZ2l2ZW4gdHlwZXMuCiAJKgogCSogCQlOb3RSZWxhdGVkIApAQCAtNjksOSArNjYsOSBAQAogCSogCQlNb3JlR2VuZXJpYyA6IHJpZ2h0IGlzIGNvbXBhdGlibGUgd2l0aCBsZWZ0CiAJKi8KIAlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVHlwZXMoVHlwZUJpbmRpbmcgbGVmdCwgVHlwZUJpbmRpbmcgcmlnaHQpIHsKLQkJaWYgKGFyZVR5cGVzQ29tcGF0aWJsZShsZWZ0LCByaWdodCkpCisJCWlmIChsZWZ0LmlzQ29tcGF0aWJsZVdpdGgocmlnaHQpKQogCQkJcmV0dXJuIEVxdWFsT3JNb3JlU3BlY2lmaWM7Ci0JCWlmIChhcmVUeXBlc0NvbXBhdGlibGUocmlnaHQsIGxlZnQpKQorCQlpZiAocmlnaHQuaXNDb21wYXRpYmxlV2l0aChsZWZ0KSkKIAkJCXJldHVybiBNb3JlR2VuZXJpYzsKIAkJcmV0dXJuIE5vdFJlbGF0ZWQ7CiAJfQpAQCAtMTA1LDYgKzEwMiwxNCBAQAogCQkJcmV0dXJuIG5ldyBBcnJheUJpbmRpbmcodHlwZSwgZGltZW5zaW9uKTsKIAl9CiAKKwlwdWJsaWMgZmluYWwgTWV0aG9kU2NvcGUgZW5jbG9zaW5nTWV0aG9kU2NvcGUoKSB7CisJCVNjb3BlIHNjb3BlID0gdGhpczsKKwkJd2hpbGUgKChzY29wZSA9IHNjb3BlLnBhcmVudCkgIT0gbnVsbCkgeworCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgTWV0aG9kU2NvcGUpIHJldHVybiAoTWV0aG9kU2NvcGUpc2NvcGU7CisJCX0KKwkJcmV0dXJuIG51bGw7IC8vIG1heSBhbnN3ZXIgbnVsbCBpZiBubyBtZXRob2QgYXJvdW5kCisJfQorCiAJLyogQW5zd2VyIHRoZSByZWNlaXZlcidzIGVuY2xvc2luZyBzb3VyY2UgdHlwZS4KIAkqLwogCXB1YmxpYyBmaW5hbCBTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdTb3VyY2VUeXBlKCkgewpAQCAtMTc0LDYgKzE3OSwxMSBAQAogCXB1YmxpYyBGaWVsZEJpbmRpbmcgZmluZEZpZWxkKFR5cGVCaW5kaW5nIHJlY2VpdmVyVHlwZSwgY2hhcltdIGZpZWxkTmFtZSwgSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKIAkJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpIHJldHVybiBudWxsOwogCQlpZiAocmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCVR5cGVCaW5kaW5nIGxlYWZUeXBlID0gcmVjZWl2ZXJUeXBlLmxlYWZDb21wb25lbnRUeXBlKCk7CisJCQlpZiAobGVhZlR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJaWYgKCEoKFJlZmVyZW5jZUJpbmRpbmcpIGxlYWZUeXBlKS5jYW5CZVNlZW5CeSh0aGlzKSkKKwkJCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKWxlYWZUeXBlLCBmaWVsZE5hbWUsIFJlY2VpdmVyVHlwZU5vdFZpc2libGUpOworCQkJfQogCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKGZpZWxkTmFtZSwgTEVOR1RIKSkKIAkJCQlyZXR1cm4gQXJyYXlCaW5kaW5nLkxlbmd0aEZpZWxkOwogCQkJcmV0dXJuIG51bGw7CkBAIC0xODMsOCArMTkzLDcgQEAKIAogCQlSZWZlcmVuY2VCaW5kaW5nIGN1cnJlbnRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHJlY2VpdmVyVHlwZTsKIAkJaWYgKCFjdXJyZW50VHlwZS5jYW5CZVNlZW5CeSh0aGlzKSkKLQkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhjdXJyZW50VHlwZSwgZmllbGROYW1lLCBOb3RWaXNpYmxlKTsKLQkJLy8gKioqIE5lZWQgYSBuZXcgcHJvYmxlbSBpZCAtIFR5cGVOb3RWaXNpYmxlPworCQkJcmV0dXJuIG5ldyBQcm9ibGVtRmllbGRCaW5kaW5nKGN1cnJlbnRUeXBlLCBmaWVsZE5hbWUsIFJlY2VpdmVyVHlwZU5vdFZpc2libGUpOwogCiAJCUZpZWxkQmluZGluZyBmaWVsZCA9IGN1cnJlbnRUeXBlLmdldEZpZWxkKGZpZWxkTmFtZSk7CiAJCWlmIChmaWVsZCAhPSBudWxsKSB7CkBAIC00MTksMTEgKzQyOCw0MCBAQAogCQkJY3VycmVudFR5cGUgPSBnZXRKYXZhTGFuZ09iamVjdCgpOwogCQl9CiAKKwkJYm9vbGVhbiBpc0NvbXBsaWFudDE0ID0gY29tcGlsYXRpb25Vbml0U2NvcGUoKS5lbnZpcm9ubWVudC5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80OwogCQkvLyBzdXBlcmNsYXNzIGxvb2t1cAogCQlSZWZlcmVuY2VCaW5kaW5nIGNsYXNzSGllcmFyY2h5U3RhcnQgPSBjdXJyZW50VHlwZTsKIAkJd2hpbGUgKGN1cnJlbnRUeXBlICE9IG51bGwpIHsKIAkJCU1ldGhvZEJpbmRpbmdbXSBjdXJyZW50TWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoc2VsZWN0b3IpOwogCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7CisJCQkKKwkJCS8qCisJCQkgKiBpZiAxLjQgY29tcGxpYW50LCBtdXN0IGZpbHRlciBvdXQgcmVkdW5kYW50IHByb3RlY3RlZCBtZXRob2RzIGZyb20gc3VwZXJjbGFzc2VzCisJCQkgKi8KKwkJCWlmIChpc0NvbXBsaWFudDE0KXsJCQkgCisJCQkJbmV4dE1ldGhvZDogZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TGVuZ3RoOyBpKyspeworCQkJCQlNZXRob2RCaW5kaW5nIGN1cnJlbnRNZXRob2QgPSBjdXJyZW50TWV0aG9kc1tpXTsKKwkJCQkJLy8gcHJvdGVjdGVkIG1ldGhvZCBuZWVkIHRvIGJlIGNoZWNrZWQgb25seSAtIGRlZmF1bHQgYWNjZXNzIGlzIGFscmVhZHkgZGVhbHQgd2l0aCBpbiAjY2FuQmVTZWVuIGltcGxlbWVudGF0aW9uCisJCQkJCS8vIHdoZW4gY2hlY2tpbmcgdGhhdCBwLkMgLT4gcS5CIC0+IHAuQSBjYW5ub3Qgc2VlIGRlZmF1bHQgYWNjZXNzIG1lbWJlcnMgZnJvbSBBIHRocm91Z2ggQi4KKwkJCQkJaWYgKChjdXJyZW50TWV0aG9kLm1vZGlmaWVycyAmIEFjY1Byb3RlY3RlZCkgPT0gMCkgY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQkJaWYgKG1hdGNoaW5nTWV0aG9kICE9IG51bGwpeworCQkJCQkJaWYgKGN1cnJlbnRNZXRob2QuYXJlUGFyYW1ldGVyc0VxdWFsKG1hdGNoaW5nTWV0aG9kKSl7CisJCQkJCQkJY3VycmVudExlbmd0aC0tOworCQkJCQkJCWN1cnJlbnRNZXRob2RzW2ldID0gbnVsbDsgLy8gZGlzY2FyZCB0aGlzIG1hdGNoCisJCQkJCQkJY29udGludWUgbmV4dE1ldGhvZDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZvciAoaW50IGogPSAwLCBtYXggPSBmb3VuZC5zaXplOyBqIDwgbWF4OyBqKyspIHsKKwkJCQkJCQlpZiAoKChNZXRob2RCaW5kaW5nKWZvdW5kLmVsZW1lbnRBdChqKSkuYXJlUGFyYW1ldGVyc0VxdWFsKGN1cnJlbnRNZXRob2QpKXsKKwkJCQkJCQkJY3VycmVudExlbmd0aC0tOworCQkJCQkJCQljdXJyZW50TWV0aG9kc1tpXSA9IG51bGw7CisJCQkJCQkJCWNvbnRpbnVlIG5leHRNZXRob2Q7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCiAJCQlpZiAoY3VycmVudExlbmd0aCA9PSAxICYmIG1hdGNoaW5nTWV0aG9kID09IG51bGwgJiYgZm91bmQuc2l6ZSA9PSAwKSB7CiAJCQkJbWF0Y2hpbmdNZXRob2QgPSBjdXJyZW50TWV0aG9kc1swXTsKIAkJCX0gZWxzZSBpZiAoY3VycmVudExlbmd0aCA+IDApIHsKQEAgLTQzMSwxNSArNDY5LDMxIEBACiAJCQkJCWZvdW5kLmFkZChtYXRjaGluZ01ldGhvZCk7CiAJCQkJCW1hdGNoaW5nTWV0aG9kID0gbnVsbDsKIAkJCQl9Ci0JCQkJZm91bmQuYWRkQWxsKGN1cnJlbnRNZXRob2RzKTsKKwkJCQkvLyBhcHBlbmQgY3VycmVudE1ldGhvZHMsIGZpbHRlcmluZyBvdXQgbnVsbCBlbnRyaWVzCisJCQkJaW50IG1heE1ldGhvZCA9IGN1cnJlbnRNZXRob2RzLmxlbmd0aDsKKwkJCQlpZiAobWF4TWV0aG9kID09IGN1cnJlbnRMZW5ndGgpIHsgLy8gbm8gbWV0aG9kIHdhcyBlbGltaW5hdGVkIGZvciAxLjQgY29tcGxpYW5jZSAoc2VlIGFib3ZlKQorCQkJCQlmb3VuZC5hZGRBbGwoY3VycmVudE1ldGhvZHMpOworCQkJCX0gZWxzZSB7CisJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBjdXJyZW50TWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCQkJTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kID0gY3VycmVudE1ldGhvZHNbaV07CisJCQkJCQlpZiAoY3VycmVudE1ldGhvZCAhPSBudWxsKSBmb3VuZC5hZGQoY3VycmVudE1ldGhvZCk7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAJCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnN1cGVyY2xhc3MoKTsKIAkJfQogCiAJCWludCBmb3VuZFNpemUgPSBmb3VuZC5zaXplOwogCQlpZiAoZm91bmRTaXplID09IDApIHsKLQkJCWlmIChtYXRjaGluZ01ldGhvZCAhPSBudWxsICYmIGFyZVBhcmFtZXRlcnNBc3NpZ25hYmxlKG1hdGNoaW5nTWV0aG9kLnBhcmFtZXRlcnMsIGFyZ3VtZW50VHlwZXMpKQorCQkJaWYgKG1hdGNoaW5nTWV0aG9kICE9IG51bGwgJiYgYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWF0Y2hpbmdNZXRob2QucGFyYW1ldGVycywgYXJndW1lbnRUeXBlcykpIHsKKwkJCQkvLyAoaWYgbm8gZGVmYXVsdCBhYnN0cmFjdCkgbXVzdCBleHBsaWNpdGx5IGxvb2sgZm9yIG9uZSBpbnN0ZWFkLCB3aGljaCBjb3VsZCBiZSBhIGJldHRlciBtYXRjaAorCQkJCWlmICghbWF0Y2hpbmdNZXRob2QuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpIHsKKwkJCQkJLy8gaWdub3JlIG1hdGNoaW5nIG1ldGhvZCAodG8gYmUgY29uc2lzdGVudCB3aXRoIG11bHRpcGxlIG1hdGNoZXMsIG5vbmUgdmlzaWJsZSAobWF0Y2hpbmcgbWV0aG9kIGlzIHRoZW4gbnVsbCkKKwkJCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPSBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBudWxsLCBmb3VuZCk7CQkJCQkJCisJCQkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZDsKKwkJCQl9CiAJCQkJcmV0dXJuIG1hdGNoaW5nTWV0aG9kOworCQkJfSAKIAkJCXJldHVybiBmaW5kRGVmYXVsdEFic3RyYWN0TWV0aG9kKHJlY2VpdmVyVHlwZSwgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGludm9jYXRpb25TaXRlLCBjbGFzc0hpZXJhcmNoeVN0YXJ0LCBtYXRjaGluZ01ldGhvZCwgZm91bmQpOwogCQl9CiAKQEAgLTQ5OCw3ICs1NTIsNyBAQAogCQkJTWV0aG9kQmluZGluZyBpbnRlcmZhY2VNZXRob2QgPQogCQkJCWZpbmREZWZhdWx0QWJzdHJhY3RNZXRob2QocmVjZWl2ZXJUeXBlLCBzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgaW52b2NhdGlvblNpdGUsIGNsYXNzSGllcmFyY2h5U3RhcnQsIG1hdGNoaW5nTWV0aG9kLCBmb3VuZCk7CiAJCQlpZiAoaW50ZXJmYWNlTWV0aG9kICE9IG51bGwpIHJldHVybiBpbnRlcmZhY2VNZXRob2Q7Ci0JCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKGNhbmRpZGF0ZXNbMF0uc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIGNhbmRpZGF0ZXNbMF0uZGVjbGFyaW5nQ2xhc3MsIE5vdFZpc2libGUpOworCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhjYW5kaWRhdGVzWzBdLCBjYW5kaWRhdGVzWzBdLnNlbGVjdG9yLCBjYW5kaWRhdGVzWzBdLnBhcmFtZXRlcnMsIE5vdFZpc2libGUpOwogCQl9CQogCQlpZiAoY2FuZGlkYXRlc1swXS5kZWNsYXJpbmdDbGFzcy5pc0NsYXNzKCkpIHsKIAkJCXJldHVybiBtb3N0U3BlY2lmaWNDbGFzc01ldGhvZEJpbmRpbmcoY2FuZGlkYXRlcywgdmlzaWJsZXNDb3VudCk7CkBAIC02MjUsNiArNjc5LDEyIEBACiAJCVR5cGVCaW5kaW5nW10gYXJndW1lbnRUeXBlcywKIAkJSW52b2NhdGlvblNpdGUgaW52b2NhdGlvblNpdGUpIHsKIAorCQlUeXBlQmluZGluZyBsZWFmVHlwZSA9IHJlY2VpdmVyVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQlpZiAobGVhZlR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CisJCQlpZiAoISgoUmVmZXJlbmNlQmluZGluZykgbGVhZlR5cGUpLmNhbkJlU2VlbkJ5KHRoaXMpKQorCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIE1ldGhvZEJpbmRpbmcuTm9QYXJhbWV0ZXJzLCAoUmVmZXJlbmNlQmluZGluZylsZWFmVHlwZSwgUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSk7CisJCX0KKwogCQlSZWZlcmVuY2VCaW5kaW5nIG9iamVjdCA9IGdldEphdmFMYW5nT2JqZWN0KCk7CiAJCU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG9iamVjdC5nZXRFeGFjdE1ldGhvZChzZWxlY3RvciwgYXJndW1lbnRUeXBlcyk7CiAJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIHsKQEAgLTY1Myw5ICs3MTMsOSBAQAogCQkJCQlOb3RGb3VuZCk7CiAJCQlpZiAoIW1ldGhvZEJpbmRpbmcuY2FuQmVTZWVuQnkocmVjZWl2ZXJUeXBlLCBpbnZvY2F0aW9uU2l0ZSwgdGhpcykpCiAJCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZygKKwkJCQkJbWV0aG9kQmluZGluZywKIAkJCQkJc2VsZWN0b3IsCi0JCQkJCWFyZ3VtZW50VHlwZXMsCi0JCQkJCW1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsCisJCQkJCW1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywKIAkJCQkJTm90VmlzaWJsZSk7CiAJCX0KIAkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CkBAIC02NzMsOCArNzMzLDYgQEAKIAkJCXJldHVybiBudWxsOwogCiAJCWlmICh0eXBlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0vLyBOb3QgY29udmluY2VkIHRoYXQgdGhpcyBpcyBuZWNlc3NhcnkKLS8vCQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRUeXBlUmVmZXJlbmNlKHR5cGVCaW5kaW5nKTsgLy8gdG8gcmVjb3JkIHN1cGVydHlwZXMKIAkJCWlmIChkZWNsYXJhdGlvblBhY2thZ2UgIT0gaW52b2NhdGlvblBhY2thZ2UgJiYgIXR5cGVCaW5kaW5nLmNhbkJlU2VlbkJ5KGludm9jYXRpb25QYWNrYWdlKSkKIAkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKHR5cGVOYW1lLCB0eXBlQmluZGluZywgTm90VmlzaWJsZSk7CiAJCX0KQEAgLTk5MywxMiArMTA1MSw3IEBACiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBDTEFTU19TQ09QRSA6CiAJCQkJCQlTb3VyY2VUeXBlQmluZGluZyBzb3VyY2VUeXBlID0gKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nOwotCQkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNvdXJjZVR5cGUuc291cmNlTmFtZSwgbmFtZSkpIHsKLQkJCQkJCQlpZiAoZm91bmRUeXBlICE9IG51bGwgJiYgZm91bmRUeXBlICE9IHNvdXJjZVR5cGUpCi0JCQkJCQkJCXJldHVybiBuZXcgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcobmFtZSwgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7Ci0JCQkJCQkJcmV0dXJuIHNvdXJjZVR5cGU7Ci0JCQkJCQl9Ci0KKwkJCQkJCS8vIDYuNS41LjEgLSBzaW1wbGUgbmFtZSBmYXZvcnMgbWVtYmVyIHR5cGUgb3ZlciB0b3AtbGV2ZWwgdHlwZSBpbiBzYW1lIHVuaXQKIAkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgbWVtYmVyVHlwZSA9IGZpbmRNZW1iZXJUeXBlKG5hbWUsIHNvdXJjZVR5cGUpOwogCQkJCQkJaWYgKG1lbWJlclR5cGUgIT0gbnVsbCkgeyAvLyBza2lwIGl0IGlmIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZwogCQkJCQkJCWlmIChtZW1iZXJUeXBlLnByb2JsZW1JZCgpID09IEFtYmlndW91cykgewpAQCAtMTAxMSw3ICsxMDY0LDcgQEAKIAkJCQkJCQl9CiAJCQkJCQkJaWYgKG1lbWJlclR5cGUuaXNWYWxpZEJpbmRpbmcoKSkgewogCQkJCQkJCQlpZiAoc291cmNlVHlwZSA9PSBtZW1iZXJUeXBlLmVuY2xvc2luZ1R5cGUoKQotCQkJCQkJCQkJfHwgZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KSB7CisJCQkJCQkJCQkJfHwgZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KSB7CiAJCQkJCQkJCQkvLyBmb3VuZCBhIHZhbGlkIHR5cGUgaW4gdGhlICdpbW1lZGlhdGUnIHNjb3BlIChpZS4gbm90IGluaGVyaXRlZCkKIAkJCQkJCQkJCS8vIE9SIGluIDEuNCBtb2RlIChpbmhlcml0ZWQgc2hhZG93cyBlbmNsb3NpbmcpCiAJCQkJCQkJCQlpZiAoZm91bmRUeXBlID09IG51bGwpCkBAIC0xMDI2LDYgKzEwNzksMTEgQEAKIAkJCQkJCQkJLy8gb25seSByZW1lbWJlciB0aGUgbWVtYmVyVHlwZSBpZiBpdHMgdGhlIGZpcnN0IG9uZSBmb3VuZCBvciB0aGUgcHJldmlvdXMgb25lIHdhcyBub3QgdmlzaWJsZSAmIG1lbWJlclR5cGUgaXMuLi4KIAkJCQkJCQkJZm91bmRUeXBlID0gbWVtYmVyVHlwZTsKIAkJCQkJCX0KKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhzb3VyY2VUeXBlLnNvdXJjZU5hbWUsIG5hbWUpKSB7CisJCQkJCQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsICYmIGZvdW5kVHlwZSAhPSBzb3VyY2VUeXBlICYmIGZvdW5kVHlwZS5wcm9ibGVtSWQoKSAhPSBOb3RWaXNpYmxlKQorCQkJCQkJCQlyZXR1cm4gbmV3IFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKG5hbWUsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCQkJCXJldHVybiBzb3VyY2VUeXBlOworCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgQ09NUElMQVRJT05fVU5JVF9TQ09QRSA6CiAJCQkJCQlicmVhayBkb25lOwpAQCAtMTA0MiwyNSArMTEwMCwyOSBAQAogCQlpZiAoKG1hc2sgJiBUWVBFKSAhPSAwKSB7CiAJCQkvLyBjaGVjayBzaW5nbGUgdHlwZSBpbXBvcnRzLgogCQkJSW1wb3J0QmluZGluZ1tdIGltcG9ydHMgPSB1bml0U2NvcGUuaW1wb3J0czsKLQkJCWlmIChpbXBvcnRzICE9IG51bGwpeworCQkJaWYgKGltcG9ydHMgIT0gbnVsbCkgewogCQkJCS8vIGNvcHkgdGhlIGxpc3QsIHNpbmNlIHNpbmdsZSB0eXBlIGltcG9ydHMgYXJlIHJlbW92ZWQgaWYgdGhleSBjYW5ub3QgYmUgcmVzb2x2ZWQKIAkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQlJbXBvcnRCaW5kaW5nIHR5cGVJbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJCQlpZiAoIXR5cGVJbXBvcnQub25EZW1hbmQpCi0JCQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHModHlwZUltcG9ydC5jb21wb3VuZE5hbWVbdHlwZUltcG9ydC5jb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0sIG5hbWUpKQorCQkJCQlpZiAoIXR5cGVJbXBvcnQub25EZW1hbmQpIHsKKwkJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyh0eXBlSW1wb3J0LmNvbXBvdW5kTmFtZVt0eXBlSW1wb3J0LmNvbXBvdW5kTmFtZS5sZW5ndGggLSAxXSwgbmFtZSkpIHsKIAkJCQkJCQlpZiAodW5pdFNjb3BlLnJlc29sdmVTaW5nbGVUeXBlSW1wb3J0KHR5cGVJbXBvcnQpICE9IG51bGwpIHsKIAkJCQkJCQkJaWYgKHR5cGVJbXBvcnQucmVmZXJlbmNlICE9IG51bGwpIHR5cGVJbXBvcnQucmVmZXJlbmNlLnVzZWQgPSB0cnVlOwogCQkJCQkJCQlyZXR1cm4gdHlwZUltcG9ydC5yZXNvbHZlZEltcG9ydDsgLy8gYWxyZWFkeSBrbm93IGl0cyB2aXNpYmxlCiAJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJLy8gY2hlY2sgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIGN1cnJlbnQgcGFja2FnZSAoYW5zd2VyIHRoZSBwcm9ibGVtIGJpbmRpbmcgdW5sZXNzIGl0cyBub3QgZm91bmQgaW4gd2hpY2ggY2FzZSBjb250aW51ZSB0byBsb29rKQotCQkJUmVmZXJlbmNlQmluZGluZyB0eXBlID0gZmluZFR5cGUobmFtZSwgdW5pdFNjb3BlLmZQYWNrYWdlLCB1bml0U2NvcGUuZlBhY2thZ2UpOyAvLyBpcyBhbHdheXMgdmlzaWJsZQotCQkJaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CisJCQkvLyBjaGVjayBpZiB0aGUgbmFtZSBpcyBpbiB0aGUgY3VycmVudCBwYWNrYWdlLCBza2lwIGl0IGlmIGl0cyBhIHN1Yi1wYWNrYWdlCisJCQl1bml0U2NvcGUucmVjb3JkUmVmZXJlbmNlKHVuaXRTY29wZS5mUGFja2FnZS5jb21wb3VuZE5hbWUsIG5hbWUpOworCQkJQmluZGluZyBiaW5kaW5nID0gdW5pdFNjb3BlLmZQYWNrYWdlLmdldFR5cGVPclBhY2thZ2UobmFtZSk7CisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpIHJldHVybiBiaW5kaW5nOyAvLyB0eXBlIGlzIGFsd2F5cyB2aXNpYmxlIHRvIGl0cyBvd24gcGFja2FnZQogCiAJCQkvLyBjaGVjayBvbiBkZW1hbmQgaW1wb3J0cwogCQkJYm9vbGVhbiBmb3VuZEluSW1wb3J0ID0gZmFsc2U7Ci0JCQlpZiAoaW1wb3J0cyAhPSBudWxsKXsKKwkJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZSA9IG51bGw7CisJCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7CiAJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGltcG9ydHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJSW1wb3J0QmluZGluZyBzb21lSW1wb3J0ID0gaW1wb3J0c1tpXTsKIAkJCQkJaWYgKHNvbWVJbXBvcnQub25EZW1hbmQpIHsKQEAgLTEwODAsMjIgKzExNDIsMTcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJLy8gc2VlIGlmIHRoZSBuYW1lIGlzIGEgcGFja2FnZQotCQlpZiAoKG1hc2sgJiBQQUNLQUdFKSAhPSAwKSB7Ci0JCQljb21waWxhdGlvblVuaXRTY29wZSgpLnJlY29yZFNpbXBsZVJlZmVyZW5jZShuYW1lKTsKLQkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShuYW1lKTsKLQkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKQotCQkJCXJldHVybiBwYWNrYWdlQmluZGluZzsKKwkJCWlmICh0eXBlICE9IG51bGwpIHJldHVybiB0eXBlOwogCQl9CiAKLQkJY29tcGlsYXRpb25Vbml0U2NvcGUoKS5yZWNvcmRTaW1wbGVSZWZlcmVuY2UobmFtZSk7Ci0JCS8vIEFuc3dlciBlcnJvciBiaW5kaW5nIC0tIGNvdWxkIG5vdCBmaW5kIG5hbWUKLQkJaWYgKGZvdW5kVHlwZSAhPSBudWxsKXsKLQkJCXJldHVybiBmb3VuZFR5cGU7CisJCXVuaXRTY29wZS5yZWNvcmRTaW1wbGVSZWZlcmVuY2UobmFtZSk7CisJCWlmICgobWFzayAmIFBBQ0tBR0UpICE9IDApIHsKKwkJCVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdW5pdFNjb3BlLmVudmlyb25tZW50LmdldFRvcExldmVsUGFja2FnZShuYW1lKTsKKwkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSByZXR1cm4gcGFja2FnZUJpbmRpbmc7CiAJCX0KKworCQkvLyBBbnN3ZXIgZXJyb3IgYmluZGluZyAtLSBjb3VsZCBub3QgZmluZCBuYW1lCisJCWlmIChmb3VuZFR5cGUgIT0gbnVsbCkgcmV0dXJuIGZvdW5kVHlwZTsgLy8gcHJvYmxlbSB0eXBlIGZyb20gYWJvdmUKIAkJcmV0dXJuIG5ldyBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyhuYW1lLCBOb3RGb3VuZCk7CiAJfQogCkBAIC0xMTIxLDE3ICsxMTc4LDEwNCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKYXZhSW9TZXJpYWxpemFibGUoVHlwZUJpbmRpbmcgdGIpIHsKLQkJLy9hIGZpcnN0IC1ub25lIG9wdGltaXplZCB2ZXJzaW9uLS4uLjotKS4uLi4KLQkJLy9wbGVhc2UgbW9kaWZ5IGFzIG5lZWRlZAorCS8qIEFuc3dlciB0cnVlIGlmIHRoZSBzY29wZSBpcyBuZXN0ZWQgaW5zaWRlIGEgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24uCisgICAgICogTm90ZTogaXQgd29ya3MgYXMgbG9uZyBhcyB0aGUgc2NvcGUuZmllbGREZWNsYXJhdGlvbkluZGV4IGlzIHJlZmxlY3RpbmcgdGhlIGZpZWxkIGJlaW5nIHRyYXZlcnNlZCAKKyAgICAgKiBlLmcuIGR1cmluZyBuYW1lIHJlc29sdXRpb24uCisJKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmluZWRJbkZpZWxkKEZpZWxkQmluZGluZyBmaWVsZCkgeworCQlTY29wZSBzY29wZSA9IHRoaXM7CisJCWRvIHsKKwkJCWlmIChzY29wZSBpbnN0YW5jZW9mIE1ldGhvZFNjb3BlKSB7CisJCQkJTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUgPSAoTWV0aG9kU2NvcGUpIHNjb3BlOworCQkJCVJlZmVyZW5jZUNvbnRleHQgcmVmQ29udGV4dCA9IG1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQ7CisJCQkJaWYgKHJlZkNvbnRleHQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24KKwkJCQkJCSYmICgoVHlwZURlY2xhcmF0aW9uKXJlZkNvbnRleHQpLmJpbmRpbmcgPT0gZmllbGQuZGVjbGFyaW5nQ2xhc3MKKwkJCQkJCSYmIG1ldGhvZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCA9PSBmaWVsZC5pZCkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKKwkvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgc2NvcGUgaXMgbmVzdGVkIGluc2lkZSBhIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbgorCSovCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZpbmVkSW5NZXRob2QoTWV0aG9kQmluZGluZyBtZXRob2QpIHsKKwkJU2NvcGUgc2NvcGUgPSB0aGlzOworCQlkbyB7CisJCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBNZXRob2RTY29wZSkgeworCQkJCVJlZmVyZW5jZUNvbnRleHQgcmVmQ29udGV4dCA9ICgoTWV0aG9kU2NvcGUpIHNjb3BlKS5yZWZlcmVuY2VDb250ZXh0OworCQkJCWlmIChyZWZDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgorCQkJCQkJJiYgKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKXJlZkNvbnRleHQpLmJpbmRpbmcgPT0gbWV0aG9kKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJCXNjb3BlID0gc2NvcGUucGFyZW50OworCQl9IHdoaWxlIChzY29wZSAhPSBudWxsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkJCisJLyogQW5zd2VyIHRydWUgaWYgdGhlIHNjb3BlIGlzIG5lc3RlZCBpbnNpZGUgYSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uCisJKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmluZWRJblR5cGUoUmVmZXJlbmNlQmluZGluZyB0eXBlKSB7CisJCVNjb3BlIHNjb3BlID0gdGhpczsKKwkJZG8geworCQkJaWYgKHNjb3BlIGluc3RhbmNlb2YgQ2xhc3NTY29wZSkKKwkJCQlpZiAoKChDbGFzc1Njb3BlKSBzY29wZSkucmVmZXJlbmNlQ29udGV4dC5iaW5kaW5nID09IHR5cGUpeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQlzY29wZSA9IHNjb3BlLnBhcmVudDsKKwkJfSB3aGlsZSAoc2NvcGUgIT0gbnVsbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luc2lkZURlcHJlY2F0ZWRDb2RlKCl7CisJCXN3aXRjaChraW5kKXsKKwkJCWNhc2UgU2NvcGUuQkxPQ0tfU0NPUEUgOgorCQkJY2FzZSBTY29wZS5NRVRIT0RfU0NPUEUgOgorCQkJCU1ldGhvZFNjb3BlIG1ldGhvZFNjb3BlID0gbWV0aG9kU2NvcGUoKTsKKwkJCQlpZiAoIW1ldGhvZFNjb3BlLmlzSW5zaWRlSW5pdGlhbGl6ZXIoKSl7CisJCQkJCS8vIGNoZWNrIG1ldGhvZCBtb2RpZmllcnMgdG8gc2VlIGlmIGRlcHJlY2F0ZWQKKwkJCQkJTWV0aG9kQmluZGluZyBjb250ZXh0ID0gKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKW1ldGhvZFNjb3BlLnJlZmVyZW5jZUNvbnRleHQpLmJpbmRpbmc7CisJCQkJCWlmIChjb250ZXh0ICE9IG51bGwgJiYgY29udGV4dC5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVNvdXJjZVR5cGVCaW5kaW5nIHR5cGUgPSAoKEJsb2NrU2NvcGUpdGhpcykucmVmZXJlbmNlVHlwZSgpLmJpbmRpbmc7CisKKwkJCQkJLy8gaW5zaWRlIGZpZWxkIGRlY2xhcmF0aW9uID8gY2hlY2sgZmllbGQgbW9kaWZpZXIgdG8gc2VlIGlmIGRlcHJlY2F0ZWQKKwkJCQkJaWYgKG1ldGhvZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCAhPSBNZXRob2RTY29wZS5Ob3RJbkZpZWxkRGVjbCkgeworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmZpZWxkcy5sZW5ndGg7IGkrKyl7CisJCQkJCQkJaWYgKHR5cGUuZmllbGRzW2ldLmlkID09IG1ldGhvZFNjb3BlLmZpZWxkRGVjbGFyYXRpb25JbmRleCkgeworCQkJCQkJCQkvLyBjdXJyZW50bHkgaW5zaWRlIHRoaXMgZmllbGQgaW5pdGlhbGl6YXRpb24KKwkJCQkJCQkJaWYgKHR5cGUuZmllbGRzW2ldLmlzVmlld2VkQXNEZXByZWNhdGVkKCkpeworCQkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5pc1ZpZXdlZEFzRGVwcmVjYXRlZCgpKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU2NvcGUuQ0xBU1NfU0NPUEUgOgorCQkJCVJlZmVyZW5jZUJpbmRpbmcgY29udGV4dCA9ICgoQ2xhc3NTY29wZSl0aGlzKS5yZWZlcmVuY2VUeXBlKCkuYmluZGluZzsKKwkJCQlpZiAoY29udGV4dCAhPSBudWxsICYmIGNvbnRleHQuaXNWaWV3ZWRBc0RlcHJlY2F0ZWQoKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0phdmFJb1NlcmlhbGl6YWJsZShUeXBlQmluZGluZyB0YikgewogCQlyZXR1cm4gdGIgPT0gZ2V0SmF2YUlvU2VyaWFsaXphYmxlKCk7CiAJfQogCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKYXZhTGFuZ0Nsb25lYWJsZShUeXBlQmluZGluZyB0YikgewotCQkvL2EgZmlyc3QgLW5vbmUgb3B0aW1pemVkIHZlcnNpb24tLi4uOi0pLi4uLgotCQkvL3BsZWFzZSBtb2RpZnkgYXMgbmVlZGVkCi0KIAkJcmV0dXJuIHRiID09IGdldEphdmFMYW5nQ2xvbmVhYmxlKCk7CiAJfQogCkBAIC0xMjU5LDQgKzE0MDMsNCBAQAogCWludCBzdGFydEluZGV4KCkgewogCQlyZXR1cm4gMDsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9Tb3VyY2VUeXBlQmluZGluZy5qYXZhCmluZGV4IDM2ZTgxYzguLmUyOTdjYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU291cmNlVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1NvdXJjZVR5cGVCaW5kaW5nLmphdmEKQEAgLTEsMTggKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzZXJ0U3RhdGVtZW50OwpAQCAtMjQsNyArMjUsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQmluZGluZyBleHRlbmRzIFJlZmVyZW5jZUJpbmRpbmcgewogCXB1YmxpYyBSZWZlcmVuY2VCaW5kaW5nIHN1cGVyY2xhc3M7CkBAIC0zNSwxMyArMzUsMTQgQEAKIAogCXB1YmxpYyBDbGFzc1Njb3BlIHNjb3BlOwogCi0JLy8gU3ludGhldGljcyBhcmUgc2VwYXJhdGVkIGludG8gNCBjYXRlZ29yaWVzOiBtZXRob2RzLCBmaWVsZHMsIGNsYXNzIGxpdGVyYWxzIGFuZCBjaGFuZ2VkIGRlY2xhcmluZyBjbGFzcyBiaW5kaW5ncworCS8vIFN5bnRoZXRpY3MgYXJlIHNlcGFyYXRlZCBpbnRvIDQgY2F0ZWdvcmllczogbWV0aG9kcywgc3VwZXIgbWV0aG9kcywgZmllbGRzLCBjbGFzcyBsaXRlcmFscyBhbmQgY2hhbmdlZCBkZWNsYXJpbmcgY2xhc3MgYmluZGluZ3MKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0QgPSAwOwogCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJRUxEID0gMTsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19MSVRFUkFMID0gMjsKIAlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSEFOR0VEX0RFQ0xBUklOR19DTEFTUyA9IDM7CiAJCiAJSGFzaHRhYmxlW10gc3ludGhldGljczsKKwkKIHByb3RlY3RlZCBTb3VyY2VUeXBlQmluZGluZygpIHsKIH0KIHB1YmxpYyBTb3VyY2VUeXBlQmluZGluZyhjaGFyW11bXSBjb21wb3VuZE5hbWUsIFBhY2thZ2VCaW5kaW5nIGZQYWNrYWdlLCBDbGFzc1Njb3BlIHNjb3BlKSB7CkBAIC0xNzAsNyArMTcxLDcgQEAKIAkJCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuRW5jbG9zaW5nSW5zdGFuY2VQcmVmaXgsCiAJCQkJU3RyaW5nLnZhbHVlT2YoZW5jbG9zaW5nVHlwZS5kZXB0aCgpKS50b0NoYXJBcnJheSgpKSwKIAkJCWVuY2xvc2luZ1R5cGUsCi0JCQlBY2NQcml2YXRlIHwgQWNjRmluYWwgfCBBY2NTeW50aGV0aWMsCisJCQlBY2NEZWZhdWx0IHwgQWNjRmluYWwgfCBBY2NTeW50aGV0aWMsCiAJCQl0aGlzLAogCQkJQ29uc3RhbnQuTm90QUNvbnN0YW50LAogCQkJc3ludGhldGljc1tGSUVMRF0uc2l6ZSgpKTsKQEAgLTI1MCw3ICsyNTEsNyBAQAogCQkJQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYyB8IEFjY0ZpbmFsLAogCQkJdGhpcywKIAkJCUNvbnN0YW50Lk5vdEFDb25zdGFudCwKLQkJCTApOworCQkJc3ludGhldGljc1tGSUVMRF0uc2l6ZSgpKTsKIAkJc3ludGhldGljc1tGSUVMRF0ucHV0KCJhc3NlcnRpb25FbXVsYXRpb24iLCBzeW50aEZpZWxkKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkvLyBlbnN1cmUgdGhlcmUgaXMgbm90IGFscmVhZHkgc3VjaCBhIGZpZWxkIGRlZmluZWQgYnkgdGhlIHVzZXIKQEAgLTMwNSwxMCArMzA2LDExIEBACiAJcmV0dXJuIGFjY2Vzc01ldGhvZDsKIH0KIC8qIEFkZCBhIG5ldyBzeW50aGV0aWMgYWNjZXNzIG1ldGhvZCBmb3IgYWNjZXNzIHRvIDx0YXJnZXRNZXRob2Q+LgorICogTXVzdCBkaXN0aW5ndWlzaCBhY2Nlc3MgbWV0aG9kIHVzZWQgZm9yIHN1cGVyIGFjY2VzcyBmcm9tIG90aGVycyAobmVlZCB0byB1c2UgaW52b2tlc3BlY2lhbCBieXRlY29kZSkKIAlBbnN3ZXIgdGhlIG5ldyBtZXRob2Qgb3IgdGhlIGV4aXN0aW5nIG1ldGhvZCBpZiBvbmUgYWxyZWFkeSBleGlzdGVkLgogKi8KIAotcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgYWRkU3ludGhldGljTWV0aG9kKE1ldGhvZEJpbmRpbmcgdGFyZ2V0TWV0aG9kKSB7CitwdWJsaWMgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhZGRTeW50aGV0aWNNZXRob2QoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIGJvb2xlYW4gaXNTdXBlckFjY2VzcykgewogCiAJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCkgewogCQlzeW50aGV0aWNzID0gbmV3IEhhc2h0YWJsZVs0XTsKQEAgLTMxNywxMCArMzE5LDE3IEBACiAJCXN5bnRoZXRpY3NbTUVUSE9EXSA9IG5ldyBIYXNodGFibGUoNSk7CiAJfQogCi0JU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyBhY2Nlc3NNZXRob2QgPSAoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZykgc3ludGhldGljc1tNRVRIT0RdLmdldCh0YXJnZXRNZXRob2QpOwotCWlmIChhY2Nlc3NNZXRob2QgPT0gbnVsbCkgewotCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyh0YXJnZXRNZXRob2QsIHRoaXMpOwotCQlzeW50aGV0aWNzW01FVEhPRF0ucHV0KHRhcmdldE1ldGhvZCwgYWNjZXNzTWV0aG9kKTsKKwlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nIGFjY2Vzc01ldGhvZCA9IG51bGw7CisJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIGFjY2Vzc29ycyA9IChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10pIHN5bnRoZXRpY3NbTUVUSE9EXS5nZXQodGFyZ2V0TWV0aG9kKTsKKwlpZiAoYWNjZXNzb3JzID09IG51bGwpIHsKKwkJYWNjZXNzTWV0aG9kID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcodGFyZ2V0TWV0aG9kLCBpc1N1cGVyQWNjZXNzLCB0aGlzKTsKKwkJc3ludGhldGljc1tNRVRIT0RdLnB1dCh0YXJnZXRNZXRob2QsIGFjY2Vzc29ycyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nWzJdKTsKKwkJYWNjZXNzb3JzW2lzU3VwZXJBY2Nlc3MgPyAwIDogMV0gPSBhY2Nlc3NNZXRob2Q7CQkKKwl9IGVsc2UgeworCQlpZiAoKGFjY2Vzc01ldGhvZCA9IGFjY2Vzc29yc1tpc1N1cGVyQWNjZXNzID8gMCA6IDFdKSA9PSBudWxsKSB7CisJCQlhY2Nlc3NNZXRob2QgPSBuZXcgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyh0YXJnZXRNZXRob2QsIGlzU3VwZXJBY2Nlc3MsIHRoaXMpOworCQkJYWNjZXNzb3JzW2lzU3VwZXJBY2Nlc3MgPyAwIDogMV0gPSBhY2Nlc3NNZXRob2Q7CisJCX0KIAl9CiAJcmV0dXJuIGFjY2Vzc01ldGhvZDsKIH0KQEAgLTg4MCwxMiArODg5LDI0IEBACiAJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIGJpbmRpbmdzID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbMV07CiAJRW51bWVyYXRpb24gZmllbGRzT3JNZXRob2RzID0gc3ludGhldGljc1tNRVRIT0RdLmtleXMoKTsKIAl3aGlsZSAoZmllbGRzT3JNZXRob2RzLmhhc01vcmVFbGVtZW50cygpKSB7CisKIAkJT2JqZWN0IGZpZWxkT3JNZXRob2QgPSBmaWVsZHNPck1ldGhvZHMubmV4dEVsZW1lbnQoKTsKKwogCQlpZiAoZmllbGRPck1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZEJpbmRpbmcpIHsKLQkJCWlmIChpbmRleCArIDEgPiBiaW5kaW5ncy5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShiaW5kaW5ncywgMCwgKGJpbmRpbmdzID0gbmV3IFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbaW5kZXggKyAxXSksIDAsIGluZGV4KTsKLQkJCWJpbmRpbmdzW2luZGV4KytdID0gKFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcpIHN5bnRoZXRpY3NbTUVUSE9EXS5nZXQoZmllbGRPck1ldGhvZCk7CisKKwkJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBtZXRob2RBY2Nlc3NvcnMgPSAoU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdKSBzeW50aGV0aWNzW01FVEhPRF0uZ2V0KGZpZWxkT3JNZXRob2QpOworCQkJaW50IG51bWJlck9mQWNjZXNzb3JzID0gMDsKKwkJCWlmIChtZXRob2RBY2Nlc3NvcnNbMF0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKKwkJCWlmIChtZXRob2RBY2Nlc3NvcnNbMV0gIT0gbnVsbCkgbnVtYmVyT2ZBY2Nlc3NvcnMrKzsKKwkJCWlmIChpbmRleCArIG51bWJlck9mQWNjZXNzb3JzID4gYmluZGluZ3MubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIChiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW2luZGV4ICsgbnVtYmVyT2ZBY2Nlc3NvcnNdKSwgMCwgaW5kZXgpOworCQkJaWYgKG1ldGhvZEFjY2Vzc29yc1swXSAhPSBudWxsKSAKKwkJCQliaW5kaW5nc1tpbmRleCsrXSA9IG1ldGhvZEFjY2Vzc29yc1swXTsgLy8gc3VwZXIgYWNjZXNzIAorCQkJaWYgKG1ldGhvZEFjY2Vzc29yc1sxXSAhPSBudWxsKSAKKwkJCQliaW5kaW5nc1tpbmRleCsrXSA9IG1ldGhvZEFjY2Vzc29yc1sxXTsgLy8gbm9ybWFsIGFjY2VzcworCiAJCX0gZWxzZSB7CisKIAkJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBmaWVsZEFjY2Vzc29ycyA9IChTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10pIHN5bnRoZXRpY3NbTUVUSE9EXS5nZXQoZmllbGRPck1ldGhvZCk7CiAJCQlpbnQgbnVtYmVyT2ZBY2Nlc3NvcnMgPSAwOwogCQkJaWYgKGZpZWxkQWNjZXNzb3JzWzBdICE9IG51bGwpIG51bWJlck9mQWNjZXNzb3JzKys7CkBAIC04OTMsOSArOTE0LDkgQEAKIAkJCWlmIChpbmRleCArIG51bWJlck9mQWNjZXNzb3JzID4gYmluZGluZ3MubGVuZ3RoKQogCQkJCVN5c3RlbS5hcnJheWNvcHkoYmluZGluZ3MsIDAsIChiaW5kaW5ncyA9IG5ldyBTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW2luZGV4ICsgbnVtYmVyT2ZBY2Nlc3NvcnNdKSwgMCwgaW5kZXgpOwogCQkJaWYgKGZpZWxkQWNjZXNzb3JzWzBdICE9IG51bGwpIAotCQkJCWJpbmRpbmdzW2luZGV4KytdID0gZmllbGRBY2Nlc3NvcnNbMF07CisJCQkJYmluZGluZ3NbaW5kZXgrK10gPSBmaWVsZEFjY2Vzc29yc1swXTsgLy8gcmVhZCBhY2Nlc3MKIAkJCWlmIChmaWVsZEFjY2Vzc29yc1sxXSAhPSBudWxsKSAKLQkJCQliaW5kaW5nc1tpbmRleCsrXSA9IGZpZWxkQWNjZXNzb3JzWzFdOworCQkJCWJpbmRpbmdzW2luZGV4KytdID0gZmllbGRBY2Nlc3NvcnNbMV07IC8vIHdyaXRlIGFjY2VzcwogCQl9CiAJfQogCkBAIC0xMDE4LDcgKzEwMzksNyBAQAogKglvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KICovCiAKLXB1YmxpYyBGaWVsZEJpbmRpbmcgZ2V0U3ludGhldGljRmllbGQoUmVmZXJlbmNlQmluZGluZyB0YXJnZXRFbmNsb3NpbmdUeXBlLCBCbG9ja1Njb3BlIHNjb3BlLCBib29sZWFuIG9ubHlFeGFjdE1hdGNoKSB7CitwdWJsaWMgRmllbGRCaW5kaW5nIGdldFN5bnRoZXRpY0ZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0RW5jbG9zaW5nVHlwZSwgYm9vbGVhbiBvbmx5RXhhY3RNYXRjaCkgewogCiAJaWYgKHN5bnRoZXRpY3MgPT0gbnVsbCB8fCBzeW50aGV0aWNzW0ZJRUxEXSA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAlGaWVsZEJpbmRpbmcgZmllbGQgPSAoRmllbGRCaW5kaW5nKSBzeW50aGV0aWNzW0ZJRUxEXS5nZXQodGFyZ2V0RW5jbG9zaW5nVHlwZSk7CkBAIC0xMDMxLDcgKzEwNTIsNyBAQAogCQlFbnVtZXJhdGlvbiBlbnVtID0gc3ludGhldGljc1tGSUVMRF0uZWxlbWVudHMoKTsKIAkJd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKIAkJCWZpZWxkID0gKEZpZWxkQmluZGluZykgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKENoYXJPcGVyYXRpb24uc3RhcnRzV2l0aChmaWVsZC5uYW1lLCBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuRW5jbG9zaW5nSW5zdGFuY2VQcmVmaXgpCisJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMoU3ludGhldGljQXJndW1lbnRCaW5kaW5nLkVuY2xvc2luZ0luc3RhbmNlUHJlZml4LCBmaWVsZC5uYW1lKQogCQkJCSYmIHRhcmdldEVuY2xvc2luZ1R5cGUuaXNTdXBlcmNsYXNzT2YoKFJlZmVyZW5jZUJpbmRpbmcpIGZpZWxkLnR5cGUpKQogCQkJCQlyZXR1cm4gZmllbGQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLmphdmEKaW5kZXggYzYwMGZjOC4uNDhiZGMwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsMjgzICsxLDI4OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGNsYXNzIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcgZXh0ZW5kcyBNZXRob2RCaW5kaW5nIHsKIAotCXB1YmxpYyBGaWVsZEJpbmRpbmcgdGFyZ2V0UmVhZEZpZWxkOwkvLyByZWFkIGFjY2VzcyB0byBhIGZpZWxkCisJcHVibGljIEZpZWxkQmluZGluZyB0YXJnZXRSZWFkRmllbGQ7CQkvLyByZWFkIGFjY2VzcyB0byBhIGZpZWxkCiAJcHVibGljIEZpZWxkQmluZGluZyB0YXJnZXRXcml0ZUZpZWxkOwkJLy8gd3JpdGUgYWNjZXNzIHRvIGEgZmllbGQKLQlwdWJsaWMgTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2Q7CQkvLyBtZXRob2Qgb3IgY29uc3RydWN0b3IKLQorCXB1YmxpYyBNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZDsJLy8gbWV0aG9kIG9yIGNvbnN0cnVjdG9yCisJCiAJcHVibGljIGludCBhY2Nlc3NUeXBlOwogCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRmllbGRSZWFkQWNjZXNzID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGaWVsZFdyaXRlQWNjZXNzID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBNZXRob2RBY2Nlc3MgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENvbnN0cnVjdG9yQWNjZXNzID0gNDsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGaWVsZFJlYWRBY2Nlc3MgPSAxOyAJCS8vIGZpZWxkIHJlYWQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGaWVsZFdyaXRlQWNjZXNzID0gMjsgCQkvLyBmaWVsZCB3cml0ZQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1ldGhvZEFjY2VzcyA9IDM7IAkJLy8gbm9ybWFsIG1ldGhvZCAKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDb25zdHJ1Y3RvckFjY2VzcyA9IDQ7IAkvLyBjb25zdHJ1Y3RvcgorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFN1cGVyTWV0aG9kQWNjZXNzID0gNTsgLy8gc3VwZXIgbWV0aG9kCiAKIAlmaW5hbCBzdGF0aWMgY2hhcltdIEFjY2Vzc01ldGhvZFByZWZpeCA9IHsgJ2EnLCAnYycsICdjJywgJ2UnLCAncycsICdzJywgJyQnIH07CiAKIAlwdWJsaWMgaW50IHNvdXJjZVN0YXJ0ID0gMDsgLy8gc3RhcnQgcG9zaXRpb24gb2YgdGhlIG1hdGNoaW5nIGRlY2xhcmF0aW9uCiAJcHVibGljIGludCBpbmRleDsgLy8gdXNlZCBmb3Igc29ydGluZyBhY2Nlc3MgbWV0aG9kcyBpbiB0aGUgY2xhc3MgZmlsZQotcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgewotCXRoaXMubW9kaWZpZXJzID0gQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYzsKLQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJpbmdTb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKLQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7Ci0JaW50IG1ldGhvZElkID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKLQl0aGlzLmluZGV4ID0gbWV0aG9kSWQ7Ci0JdGhpcy5zZWxlY3RvciA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFjY2Vzc01ldGhvZFByZWZpeCwgU3RyaW5nLnZhbHVlT2YobWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpOwotCWlmIChpc1JlYWRBY2Nlc3MpIHsKLQkJdGhpcy5yZXR1cm5UeXBlID0gdGFyZ2V0RmllbGQudHlwZTsKLQkJaWYgKHRhcmdldEZpZWxkLmlzU3RhdGljKCkpIHsKLQkJCXRoaXMucGFyYW1ldGVycyA9IE5vUGFyYW1ldGVyczsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1sxXTsKLQkJCXRoaXMucGFyYW1ldGVyc1swXSA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7Ci0JCX0KLQkJdGhpcy50YXJnZXRSZWFkRmllbGQgPSB0YXJnZXRGaWVsZDsKLQkJdGhpcy5hY2Nlc3NUeXBlID0gRmllbGRSZWFkQWNjZXNzOwotCX0gZWxzZSB7Ci0JCXRoaXMucmV0dXJuVHlwZSA9IFZvaWRCaW5kaW5nOwotCQlpZiAodGFyZ2V0RmllbGQuaXNTdGF0aWMoKSkgewotCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nWzFdOwotCQkJdGhpcy5wYXJhbWV0ZXJzWzBdID0gdGFyZ2V0RmllbGQudHlwZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1syXTsKLQkJCXRoaXMucGFyYW1ldGVyc1swXSA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7Ci0JCQl0aGlzLnBhcmFtZXRlcnNbMV0gPSB0YXJnZXRGaWVsZC50eXBlOwotCQl9Ci0JCXRoaXMudGFyZ2V0V3JpdGVGaWVsZCA9IHRhcmdldEZpZWxkOwotCQl0aGlzLmFjY2Vzc1R5cGUgPSBGaWVsZFdyaXRlQWNjZXNzOwotCX0KLQl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSBOb0V4Y2VwdGlvbnM7Ci0JdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisJCisJcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcoRmllbGRCaW5kaW5nIHRhcmdldEZpZWxkLCBib29sZWFuIGlzUmVhZEFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgewogCi0JLy8gY2hlY2sgZm9yIG1ldGhvZCBjb2xsaXNpb24KLQlib29sZWFuIG5lZWRSZW5hbWU7Ci0JZG8gewotCQljaGVjayA6IHsKLQkJCW5lZWRSZW5hbWUgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBrbm93biBtZXRob2RzCi0JCQlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUubWV0aG9kczsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0gbWV0aG9kc1tpXS5zZWxlY3RvciAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2ldKSkgewotCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKLQkJCQkJYnJlYWsgY2hlY2s7Ci0JCQkJfQorCQl0aGlzLm1vZGlmaWVycyA9IEFjY0RlZmF1bHQgfCBBY2NTdGF0aWMgfCBBY2NTeW50aGV0aWM7CisJCVNvdXJjZVR5cGVCaW5kaW5nIGRlY2xhcmluZ1NvdXJjZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpIGRlY2xhcmluZ0NsYXNzOworCQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7CisJCWludCBtZXRob2RJZCA9IGtub3duQWNjZXNzTWV0aG9kcyA9PSBudWxsID8gMCA6IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7CisJCXRoaXMuaW5kZXggPSBtZXRob2RJZDsKKwkJdGhpcy5zZWxlY3RvciA9IENoYXJPcGVyYXRpb24uY29uY2F0KEFjY2Vzc01ldGhvZFByZWZpeCwgU3RyaW5nLnZhbHVlT2YobWV0aG9kSWQpLnRvQ2hhckFycmF5KCkpOworCQlpZiAoaXNSZWFkQWNjZXNzKSB7CisJCQl0aGlzLnJldHVyblR5cGUgPSB0YXJnZXRGaWVsZC50eXBlOworCQkJaWYgKHRhcmdldEZpZWxkLmlzU3RhdGljKCkpIHsKKwkJCQl0aGlzLnBhcmFtZXRlcnMgPSBOb1BhcmFtZXRlcnM7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1sxXTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNbMF0gPSBkZWNsYXJpbmdTb3VyY2VUeXBlOwogCQkJfQotCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIHN5bnRoZXRpYyBhY2Nlc3NvcnMKLQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrbm93bkFjY2Vzc01ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kc1tpXSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0ga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQl0aGlzLnRhcmdldFJlYWRGaWVsZCA9IHRhcmdldEZpZWxkOworCQkJdGhpcy5hY2Nlc3NUeXBlID0gRmllbGRSZWFkQWNjZXNzOworCQl9IGVsc2UgeworCQkJdGhpcy5yZXR1cm5UeXBlID0gVm9pZEJpbmRpbmc7CisJCQlpZiAodGFyZ2V0RmllbGQuaXNTdGF0aWMoKSkgeworCQkJCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1sxXTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNbMF0gPSB0YXJnZXRGaWVsZC50eXBlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnBhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbMl07CisJCQkJdGhpcy5wYXJhbWV0ZXJzWzBdID0gZGVjbGFyaW5nU291cmNlVHlwZTsKKwkJCQl0aGlzLnBhcmFtZXRlcnNbMV0gPSB0YXJnZXRGaWVsZC50eXBlOworCQkJfQorCQkJdGhpcy50YXJnZXRXcml0ZUZpZWxkID0gdGFyZ2V0RmllbGQ7CisJCQl0aGlzLmFjY2Vzc1R5cGUgPSBGaWVsZFdyaXRlQWNjZXNzOworCQl9CisJCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IE5vRXhjZXB0aW9uczsKKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisJCisJCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCisJCWJvb2xlYW4gbmVlZFJlbmFtZTsKKwkJZG8geworCQkJY2hlY2sgOiB7CisJCQkJbmVlZFJlbmFtZSA9IGZhbHNlOworCQkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBrbm93biBtZXRob2RzCisJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLm1ldGhvZHM7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0gbWV0aG9kc1tpXS5zZWxlY3RvciAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2ldKSkgewogCQkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CiAJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJfQogCQkJCX0KKwkJCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycworCQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpIGNvbnRpbnVlOworCQkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0ga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7CisJCQkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CisJCQkJCQkJYnJlYWsgY2hlY2s7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CiAJCQl9Ci0JCX0KLQkJaWYgKG5lZWRSZW5hbWUpIHsgLy8gcmV0cnkgd2l0aCBhIHNlbGVjdG9yIHBvc3RmaXhlZCBieSBhIGdyb3dpbmcgbWV0aG9kSWQKLQkJCXRoaXMuc2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7Ci0JCX0KLQl9IHdoaWxlIChuZWVkUmVuYW1lKTsKLQotCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IGZpZWxkIGZvciBsaW5lIG51bWJlciBhdHRyaWJ1dGVzCi0JRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuZmllbGRzOwotCWlmIChmaWVsZERlY2xzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpZWxkRGVjbHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChmaWVsZERlY2xzW2ldLmJpbmRpbmcgPT0gdGFyZ2V0RmllbGQpIHsKLQkJCQl0aGlzLnNvdXJjZVN0YXJ0ID0gZmllbGREZWNsc1tpXS5zb3VyY2VTdGFydDsKLQkJCQlyZXR1cm47CisJCQlpZiAobmVlZFJlbmFtZSkgeyAvLyByZXRyeSB3aXRoIGEgc2VsZWN0b3IgcG9zdGZpeGVkIGJ5IGEgZ3Jvd2luZyBtZXRob2RJZAorCQkJCXRoaXMuc2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CiAJCQl9Ci0JCX0KLQl9Ci0KLS8qIGRpZCBub3QgZmluZCB0aGUgdGFyZ2V0IGZpZWxkIGRlY2xhcmF0aW9uIC0gaXQgaXMgYSBzeW50aGV0aWMgb25lCi0JcHVibGljIGNsYXNzIEEgewotCQlwdWJsaWMgY2xhc3MgQiB7Ci0JCQlwdWJsaWMgY2xhc3MgQyB7Ci0JCQkJdm9pZCBmb28oKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQS50aGlzID0gIiArIEEudGhpcyk7CisJCX0gd2hpbGUgKG5lZWRSZW5hbWUpOworCQorCQkvLyByZXRyaWV2ZSBzb3VyY2VTdGFydCBwb3NpdGlvbiBmb3IgdGhlIHRhcmdldCBmaWVsZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcworCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNscyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5maWVsZHM7CisJCWlmIChmaWVsZERlY2xzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZERlY2xzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJaWYgKGZpZWxkRGVjbHNbaV0uYmluZGluZyA9PSB0YXJnZXRGaWVsZCkgeworCQkJCQl0aGlzLnNvdXJjZVN0YXJ0ID0gZmllbGREZWNsc1tpXS5zb3VyY2VTdGFydDsKKwkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KIAkJfQotCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCQluZXcgQSgpLm5ldyBCKCkubmV3IEMoKS5mb28oKTsKLQkJfQotCX0JCi0qLwotCS8vIFdlIG5vdyBhdCB0aGlzIHBvaW50IC0gcGVyIGNvbnN0cnVjdGlvbiAtIGl0IGlzIGZvciBzdXJlIGFuIGVuY2xvc2luZyBpbnN0YW5jZSwgd2UgYXJlIGdvaW5nIHRvCi0JLy8gc2hvdyB0aGUgdGFyZ2V0IGZpZWxkIHR5cGUgZGVjbGFyYXRpb24gbG9jYXRpb24uCi0JdGhpcy5zb3VyY2VTdGFydCA9IGRlY2xhcmluZ1NvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5zb3VyY2VTdGFydDsgLy8gdXNlIHRoZSB0YXJnZXQgZGVjbGFyaW5nIGNsYXNzIG5hbWUgcG9zaXRpb24gaW5zdGVhZAotfQotcHVibGljIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmcoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7Ci0KLQlpZiAodGFyZ2V0TWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQl0aGlzLmluaXRpYWxpemVDb25zdHJ1Y3RvckFjY2Vzc29yKHRhcmdldE1ldGhvZCk7Ci0JfSBlbHNlIHsKLQkJdGhpcy5pbml0aWFsaXplTWV0aG9kQWNjZXNzb3IodGFyZ2V0TWV0aG9kLCByZWNlaXZlclR5cGUpOwotCX0KLX0KLS8qKgotICogQW4gY29uc3RydWN0b3IgYWNjZXNzb3IgaXMgYSBjb25zdHJ1Y3RvciB3aXRoIGFuIGV4dHJhIGFyZ3VtZW50IChkZWNsYXJpbmdDbGFzcyksIGluIGNhc2Ugb2YKLSAqIGNvbGxpc2lvbiB3aXRoIGFuIGV4aXN0aW5nIGNvbnN0cnVjdG9yLCB0aGVuIGFkZCBhZ2FpbiBhbiBleHRyYSBhcmd1bWVudCAoZGVjbGFyaW5nQ2xhc3MgYWdhaW4pLgotICovCi0gcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbnN0cnVjdG9yQWNjZXNzb3IoTWV0aG9kQmluZGluZyB0YXJnZXRDb25zdHJ1Y3RvcikgewotCi0JdGhpcy50YXJnZXRNZXRob2QgPSB0YXJnZXRDb25zdHJ1Y3RvcjsKLQl0aGlzLm1vZGlmaWVycyA9IEFjY0RlZmF1bHQgfCBBY2NTeW50aGV0aWM7Ci0JU291cmNlVHlwZUJpbmRpbmcgc291cmNlVHlwZSA9IAotCQkoU291cmNlVHlwZUJpbmRpbmcpIHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOyAKLQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gCi0JCXNvdXJjZVR5cGUuc3ludGhldGljQWNjZXNzTWV0aG9kcygpOyAKLQl0aGlzLmluZGV4ID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKLQotCXRoaXMuc2VsZWN0b3IgPSB0YXJnZXRDb25zdHJ1Y3Rvci5zZWxlY3RvcjsKLQl0aGlzLnJldHVyblR5cGUgPSB0YXJnZXRDb25zdHJ1Y3Rvci5yZXR1cm5UeXBlOwotCXRoaXMuYWNjZXNzVHlwZSA9IENvbnN0cnVjdG9yQWNjZXNzOwotCXRoaXMucGFyYW1ldGVycyA9IG5ldyBUeXBlQmluZGluZ1t0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCArIDFdOwotCVN5c3RlbS5hcnJheWNvcHkoCi0JCXRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIAotCQkwLCAKLQkJdGhpcy5wYXJhbWV0ZXJzLCAKLQkJMCwgCi0JCXRhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoKTsgCi0JcGFyYW1ldGVyc1t0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aF0gPSAKLQkJdGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3M7IAotCXRoaXMudGhyb3duRXhjZXB0aW9ucyA9IHRhcmdldENvbnN0cnVjdG9yLnRocm93bkV4Y2VwdGlvbnM7Ci0JdGhpcy5kZWNsYXJpbmdDbGFzcyA9IHNvdXJjZVR5cGU7Ci0KLQkvLyBjaGVjayBmb3IgbWV0aG9kIGNvbGxpc2lvbgotCWJvb2xlYW4gbmVlZFJlbmFtZTsKLQlkbyB7Ci0JCWNoZWNrIDogewotCQkJbmVlZFJlbmFtZSA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGtub3duIG1ldGhvZHMKLQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gc291cmNlVHlwZS5tZXRob2RzOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBtZXRob2RzW2ldLnNlbGVjdG9yCi0JCQkJCSYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7Ci0JCQkJCW5lZWRSZW5hbWUgPSB0cnVlOwotCQkJCQlicmVhayBjaGVjazsKKwkKKwkvKiBkaWQgbm90IGZpbmQgdGhlIHRhcmdldCBmaWVsZCBkZWNsYXJhdGlvbiAtIGl0IGlzIGEgc3ludGhldGljIG9uZQorCQlwdWJsaWMgY2xhc3MgQSB7CisJCQlwdWJsaWMgY2xhc3MgQiB7CisJCQkJcHVibGljIGNsYXNzIEMgeworCQkJCQl2b2lkIGZvbygpIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQS50aGlzID0gIiArIEEudGhpcyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycwotCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0ga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yCisJCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJCQkJbmV3IEEoKS5uZXcgQigpLm5ldyBDKCkuZm9vKCk7CisJCQl9CisJCX0JCisJKi8KKwkJLy8gV2Ugbm93IGF0IHRoaXMgcG9pbnQgLSBwZXIgY29uc3RydWN0aW9uIC0gaXQgaXMgZm9yIHN1cmUgYW4gZW5jbG9zaW5nIGluc3RhbmNlLCB3ZSBhcmUgZ29pbmcgdG8KKwkJLy8gc2hvdyB0aGUgdGFyZ2V0IGZpZWxkIHR5cGUgZGVjbGFyYXRpb24gbG9jYXRpb24uCisJCXRoaXMuc291cmNlU3RhcnQgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnNjb3BlLnJlZmVyZW5jZUNvbnRleHQuc291cmNlU3RhcnQ7IC8vIHVzZSB0aGUgdGFyZ2V0IGRlY2xhcmluZyBjbGFzcyBuYW1lIHBvc2l0aW9uIGluc3RlYWQKKwl9CisKKwlwdWJsaWMgU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZyhNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgYm9vbGVhbiBpc1N1cGVyQWNjZXNzLCBSZWZlcmVuY2VCaW5kaW5nIHJlY2VpdmVyVHlwZSkgeworCQorCQlpZiAodGFyZ2V0TWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgeworCQkJdGhpcy5pbml0aWFsaXplQ29uc3RydWN0b3JBY2Nlc3Nvcih0YXJnZXRNZXRob2QpOworCQl9IGVsc2UgeworCQkJdGhpcy5pbml0aWFsaXplTWV0aG9kQWNjZXNzb3IodGFyZ2V0TWV0aG9kLCBpc1N1cGVyQWNjZXNzLCByZWNlaXZlclR5cGUpOworCQl9CisJfQorCisJLyoqCisJICogQW4gY29uc3RydWN0b3IgYWNjZXNzb3IgaXMgYSBjb25zdHJ1Y3RvciB3aXRoIGFuIGV4dHJhIGFyZ3VtZW50IChkZWNsYXJpbmdDbGFzcyksIGluIGNhc2Ugb2YKKwkgKiBjb2xsaXNpb24gd2l0aCBhbiBleGlzdGluZyBjb25zdHJ1Y3RvciwgdGhlbiBhZGQgYWdhaW4gYW4gZXh0cmEgYXJndW1lbnQgKGRlY2xhcmluZ0NsYXNzIGFnYWluKS4KKwkgKi8KKwkgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbnN0cnVjdG9yQWNjZXNzb3IoTWV0aG9kQmluZGluZyB0YXJnZXRDb25zdHJ1Y3RvcikgeworCQorCQl0aGlzLnRhcmdldE1ldGhvZCA9IHRhcmdldENvbnN0cnVjdG9yOworCQl0aGlzLm1vZGlmaWVycyA9IEFjY0RlZmF1bHQgfCBBY2NTeW50aGV0aWM7CisJCVNvdXJjZVR5cGVCaW5kaW5nIHNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUJpbmRpbmcpIHRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOyAKKwkJU3ludGhldGljQWNjZXNzTWV0aG9kQmluZGluZ1tdIGtub3duQWNjZXNzTWV0aG9kcyA9IAorCQkJc291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7IAorCQl0aGlzLmluZGV4ID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKKwkKKwkJdGhpcy5zZWxlY3RvciA9IHRhcmdldENvbnN0cnVjdG9yLnNlbGVjdG9yOworCQl0aGlzLnJldHVyblR5cGUgPSB0YXJnZXRDb25zdHJ1Y3Rvci5yZXR1cm5UeXBlOworCQl0aGlzLmFjY2Vzc1R5cGUgPSBDb25zdHJ1Y3RvckFjY2VzczsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW3RhcmdldENvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCAKKwkJCTAsIAorCQkJdGhpcy5wYXJhbWV0ZXJzLCAKKwkJCTAsIAorCQkJdGFyZ2V0Q29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGgpOyAKKwkJcGFyYW1ldGVyc1t0YXJnZXRDb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aF0gPSAKKwkJCXRhcmdldENvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzOyAKKwkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gdGFyZ2V0Q29uc3RydWN0b3IudGhyb3duRXhjZXB0aW9uczsKKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IHNvdXJjZVR5cGU7CisJCisJCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCisJCWJvb2xlYW4gbmVlZFJlbmFtZTsKKwkJZG8geworCQkJY2hlY2sgOiB7CisJCQkJbmVlZFJlbmFtZSA9IGZhbHNlOworCQkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBrbm93biBtZXRob2RzCisJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLm1ldGhvZHM7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0gbWV0aG9kc1tpXS5zZWxlY3RvcgogCQkJCQkJJiYgdGhpcy5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKIAkJCQkJCW5lZWRSZW5hbWUgPSB0cnVlOwogCQkJCQkJYnJlYWsgY2hlY2s7CiAJCQkJCX0KIAkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG5lZWRSZW5hbWUpIHsgLy8gcmV0cnkgd2l0aCBhIG5ldyBleHRyYSBhcmd1bWVudAotCQkJaW50IGxlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJCXRoaXMucGFyYW1ldGVycywgCi0JCQkJMCwgCi0JCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aCArIDFdLCAKLQkJCQkwLCAKLQkJCQlsZW5ndGgpOyAKLQkJCXRoaXMucGFyYW1ldGVyc1tsZW5ndGhdID0gdGhpcy5kZWNsYXJpbmdDbGFzczsKLQkJfQotCX0gd2hpbGUgKG5lZWRSZW5hbWUpOwotCi0JLy8gcmV0cmlldmUgc291cmNlU3RhcnQgcG9zaXRpb24gZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGZvciBsaW5lIG51bWJlciBhdHRyaWJ1dGVzCi0JQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0gCi0JCXNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOyAKLQlpZiAobWV0aG9kRGVjbHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kRGVjbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtZXRob2REZWNsc1tpXS5iaW5kaW5nID09IHRhcmdldENvbnN0cnVjdG9yKSB7Ci0JCQkJdGhpcy5zb3VyY2VTdGFydCA9IG1ldGhvZERlY2xzW2ldLnNvdXJjZVN0YXJ0OwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLX0KLS8qKgotICogQW4gbWV0aG9kIGFjY2Vzc29yIGlzIGEgbWV0aG9kIHdpdGggYW4gYWNjZXNzJE4gc2VsZWN0b3IsIHdoZXJlIE4gaXMgaW5jcmVtZW50ZWQgaW4gY2FzZSBvZiBjb2xsaXNpb25zLgotICovCi0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRob2RBY2Nlc3NvcihNZXRob2RCaW5kaW5nIHRhcmdldE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgewotCQotCXRoaXMudGFyZ2V0TWV0aG9kID0gdGFyZ2V0TWV0aG9kOwotCXRoaXMubW9kaWZpZXJzID0gQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYzsKLQlTb3VyY2VUeXBlQmluZGluZyBkZWNsYXJpbmdTb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVCaW5kaW5nKSBkZWNsYXJpbmdDbGFzczsKLQlTeW50aGV0aWNBY2Nlc3NNZXRob2RCaW5kaW5nW10ga25vd25BY2Nlc3NNZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zeW50aGV0aWNBY2Nlc3NNZXRob2RzKCk7Ci0JaW50IG1ldGhvZElkID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKLQl0aGlzLmluZGV4ID0gbWV0aG9kSWQ7Ci0KLQl0aGlzLnNlbGVjdG9yID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZihtZXRob2RJZCkudG9DaGFyQXJyYXkoKSk7Ci0JdGhpcy5yZXR1cm5UeXBlID0gdGFyZ2V0TWV0aG9kLnJldHVyblR5cGU7Ci0JdGhpcy5hY2Nlc3NUeXBlID0gTWV0aG9kQWNjZXNzOwotCQotCWlmICh0YXJnZXRNZXRob2QuaXNTdGF0aWMoKSkgewotCQl0aGlzLnBhcmFtZXRlcnMgPSB0YXJnZXRNZXRob2QucGFyYW1ldGVyczsKLQl9IGVsc2UgewotCQl0aGlzLnBhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbdGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoICsgMV07Ci0JCXRoaXMucGFyYW1ldGVyc1swXSA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnMsIDAsIHRoaXMucGFyYW1ldGVycywgMSwgdGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKTsKLQl9Ci0JdGhpcy50aHJvd25FeGNlcHRpb25zID0gdGFyZ2V0TWV0aG9kLnRocm93bkV4Y2VwdGlvbnM7Ci0JdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7Ci0KLQkvLyBjaGVjayBmb3IgbWV0aG9kIGNvbGxpc2lvbgotCWJvb2xlYW4gbmVlZFJlbmFtZTsKLQlkbyB7Ci0JCWNoZWNrIDogewotCQkJbmVlZFJlbmFtZSA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIGtub3duIG1ldGhvZHMKLQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gZGVjbGFyaW5nU291cmNlVHlwZS5tZXRob2RzOwotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBtZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKG1ldGhvZHNbaV0pKSB7Ci0JCQkJCW5lZWRSZW5hbWUgPSB0cnVlOwotCQkJCQlicmVhayBjaGVjazsKKwkJCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycworCQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpCisJCQkJCQkJY29udGludWU7CisJCQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IKKwkJCQkJCQkmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChrbm93bkFjY2Vzc01ldGhvZHNbaV0pKSB7CisJCQkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CisJCQkJCQkJYnJlYWsgY2hlY2s7CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycwotCQkJaWYgKGtub3duQWNjZXNzTWV0aG9kcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duQWNjZXNzTWV0aG9kcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpIGNvbnRpbnVlOwotCQkJCQlpZiAodGhpcy5zZWxlY3RvciA9PSBrbm93bkFjY2Vzc01ldGhvZHNbaV0uc2VsZWN0b3IgJiYgdGhpcy5hcmVQYXJhbWV0ZXJzRXF1YWwobWV0aG9kc1tpXSkpIHsKKwkJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBuZXcgZXh0cmEgYXJndW1lbnQKKwkJCQlpbnQgbGVuZ3RoID0gdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQl0aGlzLnBhcmFtZXRlcnMsIAorCQkJCQkwLCAKKwkJCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW2xlbmd0aCArIDFdLCAKKwkJCQkJMCwgCisJCQkJCWxlbmd0aCk7IAorCQkJCXRoaXMucGFyYW1ldGVyc1tsZW5ndGhdID0gdGhpcy5kZWNsYXJpbmdDbGFzczsKKwkJCX0KKwkJfSB3aGlsZSAobmVlZFJlbmFtZSk7CisJCisJCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcworCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbHMgPSAKKwkJCXNvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOyAKKwkJaWYgKG1ldGhvZERlY2xzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2REZWNscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChtZXRob2REZWNsc1tpXS5iaW5kaW5nID09IHRhcmdldENvbnN0cnVjdG9yKSB7CisJCQkJCXRoaXMuc291cmNlU3RhcnQgPSBtZXRob2REZWNsc1tpXS5zb3VyY2VTdGFydDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEFuIG1ldGhvZCBhY2Nlc3NvciBpcyBhIG1ldGhvZCB3aXRoIGFuIGFjY2VzcyROIHNlbGVjdG9yLCB3aGVyZSBOIGlzIGluY3JlbWVudGVkIGluIGNhc2Ugb2YgY29sbGlzaW9ucy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWV0aG9kQWNjZXNzb3IoTWV0aG9kQmluZGluZyB0YXJnZXRNZXRob2QsIGJvb2xlYW4gaXNTdXBlckFjY2VzcywgUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcykgeworCQkKKwkJdGhpcy50YXJnZXRNZXRob2QgPSB0YXJnZXRNZXRob2Q7CisJCXRoaXMubW9kaWZpZXJzID0gQWNjRGVmYXVsdCB8IEFjY1N0YXRpYyB8IEFjY1N5bnRoZXRpYzsKKwkJU291cmNlVHlwZUJpbmRpbmcgZGVjbGFyaW5nU291cmNlVHlwZSA9IChTb3VyY2VUeXBlQmluZGluZykgZGVjbGFyaW5nQ2xhc3M7CisJCVN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmdbXSBrbm93bkFjY2Vzc01ldGhvZHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLnN5bnRoZXRpY0FjY2Vzc01ldGhvZHMoKTsKKwkJaW50IG1ldGhvZElkID0ga25vd25BY2Nlc3NNZXRob2RzID09IG51bGwgPyAwIDoga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsKKwkJdGhpcy5pbmRleCA9IG1ldGhvZElkOworCQorCQl0aGlzLnNlbGVjdG9yID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZihtZXRob2RJZCkudG9DaGFyQXJyYXkoKSk7CisJCXRoaXMucmV0dXJuVHlwZSA9IHRhcmdldE1ldGhvZC5yZXR1cm5UeXBlOworCQl0aGlzLmFjY2Vzc1R5cGUgPSBpc1N1cGVyQWNjZXNzID8gU3VwZXJNZXRob2RBY2Nlc3MgOiBNZXRob2RBY2Nlc3M7CisJCQorCQlpZiAodGFyZ2V0TWV0aG9kLmlzU3RhdGljKCkpIHsKKwkJCXRoaXMucGFyYW1ldGVycyA9IHRhcmdldE1ldGhvZC5wYXJhbWV0ZXJzOworCQl9IGVsc2UgeworCQkJdGhpcy5wYXJhbWV0ZXJzID0gbmV3IFR5cGVCaW5kaW5nW3RhcmdldE1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCArIDFdOworCQkJdGhpcy5wYXJhbWV0ZXJzWzBdID0gZGVjbGFyaW5nU291cmNlVHlwZTsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnMsIDAsIHRoaXMucGFyYW1ldGVycywgMSwgdGFyZ2V0TWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKTsKKwkJfQorCQl0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSB0YXJnZXRNZXRob2QudGhyb3duRXhjZXB0aW9uczsKKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ1NvdXJjZVR5cGU7CisJCisJCS8vIGNoZWNrIGZvciBtZXRob2QgY29sbGlzaW9uCisJCWJvb2xlYW4gbmVlZFJlbmFtZTsKKwkJZG8geworCQkJY2hlY2sgOiB7CisJCQkJbmVlZFJlbmFtZSA9IGZhbHNlOworCQkJCS8vIGNoZWNrIGZvciBjb2xsaXNpb24gd2l0aCBrbm93biBtZXRob2RzCisJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBkZWNsYXJpbmdTb3VyY2VUeXBlLm1ldGhvZHM7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0gbWV0aG9kc1tpXS5zZWxlY3RvciAmJiB0aGlzLmFyZVBhcmFtZXRlcnNFcXVhbChtZXRob2RzW2ldKSkgewogCQkJCQkJbmVlZFJlbmFtZSA9IHRydWU7CiAJCQkJCQlicmVhayBjaGVjazsKIAkJCQkJfQogCQkJCX0KKwkJCQkvLyBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3ludGhldGljIGFjY2Vzc29ycworCQkJCWlmIChrbm93bkFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgeworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0ga25vd25BY2Nlc3NNZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoa25vd25BY2Nlc3NNZXRob2RzW2ldID09IG51bGwpIGNvbnRpbnVlOworCQkJCQkJaWYgKHRoaXMuc2VsZWN0b3IgPT0ga25vd25BY2Nlc3NNZXRob2RzW2ldLnNlbGVjdG9yICYmIHRoaXMuYXJlUGFyYW1ldGVyc0VxdWFsKGtub3duQWNjZXNzTWV0aG9kc1tpXSkpIHsKKwkJCQkJCQluZWVkUmVuYW1lID0gdHJ1ZTsKKwkJCQkJCQlicmVhayBjaGVjazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KIAkJCX0KLQkJfQotCQlpZiAobmVlZFJlbmFtZSkgeyAvLyByZXRyeSB3aXRoIGEgc2VsZWN0b3IgJiBhIGdyb3dpbmcgbWV0aG9kSWQKLQkJCXRoaXMuc2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7Ci0JCX0KLQl9IHdoaWxlIChuZWVkUmVuYW1lKTsKLQotCS8vIHJldHJpZXZlIHNvdXJjZVN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBmb3IgbGluZSBudW1iZXIgYXR0cmlidXRlcwotCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNscyA9IGRlY2xhcmluZ1NvdXJjZVR5cGUuc2NvcGUucmVmZXJlbmNlQ29udGV4dC5tZXRob2RzOwotCWlmIChtZXRob2REZWNscyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2REZWNscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKG1ldGhvZERlY2xzW2ldLmJpbmRpbmcgPT0gdGFyZ2V0TWV0aG9kKSB7Ci0JCQkJdGhpcy5zb3VyY2VTdGFydCA9IG1ldGhvZERlY2xzW2ldLnNvdXJjZVN0YXJ0OwotCQkJCXJldHVybjsKKwkJCWlmIChuZWVkUmVuYW1lKSB7IC8vIHJldHJ5IHdpdGggYSBzZWxlY3RvciAmIGEgZ3Jvd2luZyBtZXRob2RJZAorCQkJCXRoaXMuc2VsZWN0b3IoQ2hhck9wZXJhdGlvbi5jb25jYXQoQWNjZXNzTWV0aG9kUHJlZml4LCBTdHJpbmcudmFsdWVPZigrK21ldGhvZElkKS50b0NoYXJBcnJheSgpKSk7CisJCQl9CisJCX0gd2hpbGUgKG5lZWRSZW5hbWUpOworCQorCQkvLyByZXRyaWV2ZSBzb3VyY2VTdGFydCBwb3NpdGlvbiBmb3IgdGhlIHRhcmdldCBtZXRob2QgZm9yIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZXMKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xzID0gZGVjbGFyaW5nU291cmNlVHlwZS5zY29wZS5yZWZlcmVuY2VDb250ZXh0Lm1ldGhvZHM7CisJCWlmIChtZXRob2REZWNscyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWV0aG9kRGVjbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobWV0aG9kRGVjbHNbaV0uYmluZGluZyA9PSB0YXJnZXRNZXRob2QpIHsKKwkJCQkJdGhpcy5zb3VyY2VTdGFydCA9IG1ldGhvZERlY2xzW2ldLnNvdXJjZVN0YXJ0OworCQkJCQlyZXR1cm47CisJCQkJfQogCQkJfQogCQl9CiAJfQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclJlbGF0ZWQoKSB7Ci0JcmV0dXJuIGFjY2Vzc1R5cGUgPT0gQ29uc3RydWN0b3JBY2Nlc3M7Ci19CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnN0cnVjdG9yUmVsYXRlZCgpIHsKKwkJcmV0dXJuIGFjY2Vzc1R5cGUgPT0gQ29uc3RydWN0b3JBY2Nlc3M7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljQXJndW1lbnRCaW5kaW5nLmphdmEKaW5kZXggMmFkOTQ4My4uMzU5YTQxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0FyZ3VtZW50QmluZGluZy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogLyoqCkBAIC0yMSwxNCArMjEsMTUgQEAKICAqIHRoZSB1c2VyIGFyZ3VtZW50cy4KICAqLwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgU3ludGhldGljQXJndW1lbnRCaW5kaW5nIGV4dGVuZHMgTG9jYWxWYXJpYWJsZUJpbmRpbmcgewogCiAJewkKIAkJdGhpcy5pc0FyZ3VtZW50ID0gdHJ1ZTsKLQkJdGhpcy51c2VkID0gdHJ1ZTsKKwkJdGhpcy51c2VGbGFnID0gVVNFRDsKIAl9CisJCiAJLy8gaWYgdGhlIGFyZ3VtZW50IGlzIG1hcHBpbmcgdG8gYW4gb3V0ZXIgbG9jYWwgdmFyaWFibGUsIHRoaXMgZGVub3RlcyB0aGUgb3V0ZXIgYWN0dWFsIHZhcmlhYmxlCiAJcHVibGljIExvY2FsVmFyaWFibGVCaW5kaW5nIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZTsKIAkvLyBpZiB0aGUgYXJndW1lbnQgaGFzIGEgbWF0Y2hpbmcgc3ludGhldGljIGZpZWxkCkBAIC0zNiwyMSArMzcsMjUgQEAKIAogCWZpbmFsIHN0YXRpYyBjaGFyW10gT3V0ZXJMb2NhbFByZWZpeCA9IHsgJ3YnLCAnYScsICdsJywgJyQnIH07CiAJZmluYWwgc3RhdGljIGNoYXJbXSBFbmNsb3NpbmdJbnN0YW5jZVByZWZpeCA9IHsgJ3QnLCAnaCcsICdpJywgJ3MnLCAnJCcgfTsKLXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7Ci0Jc3VwZXIoCi0JCUNoYXJPcGVyYXRpb24uY29uY2F0KE91dGVyTG9jYWxQcmVmaXgsIGFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS5uYW1lKSwgCi0JCWFjdHVhbE91dGVyTG9jYWxWYXJpYWJsZS50eXBlLCAKLQkJQWNjRmluYWwsCi0JCXRydWUpOwotCXRoaXMuYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlID0gYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlOwotfQotcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKLQlzdXBlcigKLQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCi0JCQlTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcuRW5jbG9zaW5nSW5zdGFuY2VQcmVmaXgsCi0JCQlTdHJpbmcudmFsdWVPZihlbmNsb3NpbmdUeXBlLmRlcHRoKCkpLnRvQ2hhckFycmF5KCkpLAotCQllbmNsb3NpbmdUeXBlLCAKLQkJQWNjRmluYWwsCi0JCXRydWUpOwotfQorCQorCXB1YmxpYyBTeW50aGV0aWNBcmd1bWVudEJpbmRpbmcoTG9jYWxWYXJpYWJsZUJpbmRpbmcgYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlKSB7CisKKwkJc3VwZXIoCisJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdChPdXRlckxvY2FsUHJlZml4LCBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGUubmFtZSksIAorCQkJYWN0dWFsT3V0ZXJMb2NhbFZhcmlhYmxlLnR5cGUsIAorCQkJQWNjRmluYWwsCisJCQl0cnVlKTsKKwkJdGhpcy5hY3R1YWxPdXRlckxvY2FsVmFyaWFibGUgPSBhY3R1YWxPdXRlckxvY2FsVmFyaWFibGU7CisJfQorCisJcHVibGljIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZyhSZWZlcmVuY2VCaW5kaW5nIGVuY2xvc2luZ1R5cGUpIHsKKworCQlzdXBlcigKKwkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCVN5bnRoZXRpY0FyZ3VtZW50QmluZGluZy5FbmNsb3NpbmdJbnN0YW5jZVByZWZpeCwKKwkJCQlTdHJpbmcudmFsdWVPZihlbmNsb3NpbmdUeXBlLmRlcHRoKCkpLnRvQ2hhckFycmF5KCkpLAorCQkJZW5jbG9zaW5nVHlwZSwgCisJCQlBY2NGaW5hbCwKKwkJCXRydWUpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1N5bnRoZXRpY0ZpZWxkQmluZGluZy5qYXZhCmluZGV4IDMwY2ZlNjEuLmM2ZGZjZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvU3ludGhldGljRmllbGRCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9TeW50aGV0aWNGaWVsZEJpbmRpbmcuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVGFnQml0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKaW5kZXggNDFlMmUwNS4uNjFiNjc5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UYWdCaXRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCiBwdWJsaWMgaW50ZXJmYWNlIFRhZ0JpdHMgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlQmluZGluZy5qYXZhCmluZGV4IGZjZjZkYjUuLjM5MDExYzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVCaW5kaW5nLmphdmEKQEAgLTEsMTUgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogLyoKICAqIE5vdCBhbGwgZmllbGRzIGRlZmluZWQgYnkgdGhpcyB0eXBlICgmIGl0cyBzdWJjbGFzc2VzKSBhcmUgaW5pdGlhbGl6ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLgogICogU29tZSBhcmUgaW5pdGlhbGl6ZWQgb25seSB3aGVuIG5lZWRlZC4KQEAgLTQ1LDYgKzQ3LDEyIEBACiBTdHJpbmcgZGVidWdOYW1lKCkgewogCXJldHVybiBuZXcgU3RyaW5nKHJlYWRhYmxlTmFtZSgpKTsKIH0KKy8qCisgKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgZGltZW5zaW9ucyAtIDAgZm9yIG5vbi1hcnJheSB0eXBlcworICovCitwdWJsaWMgaW50IGRpbWVuc2lvbnMoKXsKKwlyZXR1cm4gMDsKK30KIHB1YmxpYyBhYnN0cmFjdCBQYWNrYWdlQmluZGluZyBnZXRQYWNrYWdlKCk7CiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaXMgYW4gYXJyYXkKICovCkBAIC02NCw3ICs3Miw3IEBACiAvKiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBjYW4gYmUgYXNzaWduZWQgdG8gdGhlIGFyZ3VtZW50IHR5cGUgKHJpZ2h0KQogKi8KIAkKLWFic3RyYWN0IGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChUeXBlQmluZGluZyByaWdodCk7CitwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKFR5cGVCaW5kaW5nIHJpZ2h0KTsKIC8qIEFuc3dlciB0cnVlIGlmIHRoZSByZWNlaXZlcidzIGhpZXJhcmNoeSBoYXMgcHJvYmxlbXMgKGFsd2F5cyBmYWxzZSBmb3IgYXJyYXlzICYgYmFzZSB0eXBlcykKICovCiAKQEAgLTEwMSw3ICsxMDksMTAgQEAKICAqLwogCiBwdWJsaWMgY2hhcltdIHF1YWxpZmllZFBhY2thZ2VOYW1lKCkgewotCXJldHVybiBnZXRQYWNrYWdlKCkgPT0gbnVsbCA/IE5vQ2hhciA6IGdldFBhY2thZ2UoKS5yZWFkYWJsZU5hbWUoKTsKKwlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IGdldFBhY2thZ2UoKTsKKwlyZXR1cm4gcGFja2FnZUJpbmRpbmcgPT0gbnVsbCAgfHwgcGFja2FnZUJpbmRpbmcuY29tcG91bmROYW1lID09IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSCisJCT8gQ2hhck9wZXJhdGlvbi5OT19DSEFSCisJCTogcGFja2FnZUJpbmRpbmcucmVhZGFibGVOYW1lKCk7CiB9CiAvKioKICogQW5zd2VyIHRoZSBzb3VyY2UgbmFtZSBmb3IgdGhlIHR5cGUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhCmluZGV4IGM4MGQ3OTkuLmZlYjlkNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVHlwZUNvbnN0YW50cy5qYXZhCkBAIC0xLDYxICsxLDY3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogcHVibGljIGludGVyZmFjZSBUeXBlQ29uc3RhbnRzIHsKLQlmaW5hbCBjaGFyW10gSkFWQSA9IG5ldyBjaGFyW10geydqJywgJ2EnLCAndicsICdhJ307Ci0JZmluYWwgY2hhcltdIExBTkcgPSBuZXcgY2hhcltdIHsnbCcsICdhJywgJ24nLCAnZyd9OwotCWZpbmFsIGNoYXJbXSBJTyA9IG5ldyBjaGFyW10geydpJywgJ28nfTsKLQlmaW5hbCBjaGFyW10gUkVGTEVDVCA9IG5ldyBjaGFyW10geydyJywgJ2UnLCAnZicsICdsJywgJ2UnLCAnYycsICd0J307Ci0JZmluYWwgY2hhcltdIENoYXJBcnJheV9KQVZBX0xBTkdfT0JKRUNUID0gbmV3IGNoYXJbXSB7J2onLCAnYScsICd2JywgJ2EnLCAnLicsICdsJywgJ2EnLCAnbicsICdnJywgJy4nLCAnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfTsKLQlmaW5hbCBjaGFyW10gTEVOR1RIID0gbmV3IGNoYXJbXSB7J2wnLCAnZScsICduJywgJ2cnLCAndCcsICdoJ307Ci0JZmluYWwgY2hhcltdIENMT05FID0gbmV3IGNoYXJbXSB7J2MnLCAnbCcsICdvJywgJ24nLCAnZSd9OwotCisJZmluYWwgY2hhcltdIEpBVkEgPSAiamF2YSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBMQU5HID0gImxhbmciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gSU8gPSAiaW8iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gUkVGTEVDVCA9ICJyZWZsZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdIENoYXJBcnJheV9KQVZBX0xBTkdfT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gTEVOR1RIID0gImxlbmd0aCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBDTE9ORSA9ICJjbG9uZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBPQkpFQ1QgPSAiT2JqZWN0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdIE1BSU4gPSAibWFpbiIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBTRVJJQUxWRVJTSU9OVUlEID0gInNlcmlhbFZlcnNpb25VSUQiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gUkVBRFJFU09MVkUgPSAicmVhZFJlc29sdmUiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gV1JJVEVSRVBMQUNFID0gIndyaXRlUmVwbGFjZSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBSRUFET0JKRUNUID0gInJlYWRPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gV1JJVEVPQkpFQ1QgPSAid3JpdGVPYmplY3QiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW10gQ2hhckFycmF5X0pBVkFfSU9fT0JKRUNUSU5QVVRTVFJFQU0gPSAiamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXSBDaGFyQXJyYXlfSkFWQV9JT19PQkpFQ1RPVVRQVVRTVFJFQU0gPSAiamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0iLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkKIAkvLyBDb25zdGFudCBjb21wb3VuZCBuYW1lcwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFOR307Ci0JZmluYWwgY2hhcltdW10gSkFWQV9JTyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgSU99OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19BU1NFUlRJT05FUlJPUiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkFzc2VydGlvbkVycm9yIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19DTEFTUyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgeydDJywgJ2wnLCAnYScsICdzJywgJ3MnfX07Ci0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnQycsICdsJywgJ2EnLCAncycsICdzJywgJ04nLCAnbycsICd0JywgJ0YnLCAnbycsICd1JywgJ24nLCAnZCcsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbid9fTsKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0xPTkVBQkxFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J0MnLCAnbCcsICdvJywgJ24nLCAnZScsICdhJywgJ2InLCAnbCcsICdlJ319OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19FWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnRScsICd4JywgJ2MnLCAnZScsICdwJywgJ3QnLCAnaScsICdvJywgJ24nfX07Ci0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0VSUk9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J0UnLCAncicsICdyJywgJ28nLCAncid9fTsKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfTk9DTEFTU0RFRkVSUk9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J04nLCAnbycsICdDJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnRCcsICdlJywgJ2YnLCAnRScsICdyJywgJ3InLCAnbycsICdyJ319OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19PQkpFQ1QgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnTycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnfX07Ci0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NUUklORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgeydTJywgJ3QnLCAncicsICdpJywgJ24nLCAnZyd9fTsKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU1RSSU5HQlVGRkVSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J1MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJywgJ0InLCAndScsICdmJywgJ2YnLCAnZScsICdyJ319OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19TWVNURU0gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnUycsICd5JywgJ3MnLCAndCcsICdlJywgJ20nfX07Ci0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04gPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsIHsnUicsICd1JywgJ24nLCAndCcsICdpJywgJ20nLCAnZScsICdFJywgJ3gnLCAnYycsICdlJywgJ3AnLCAndCcsICdpJywgJ28nLCAnbid9fTsKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfVEhST1dBQkxFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCB7J1QnLCAnaCcsICdyJywgJ28nLCAndycsICdhJywgJ2InLCAnbCcsICdlJ319OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCBSRUZMRUNULCB7J0MnLCAnbycsICduJywgJ3MnLCAndCcsICdyJywgJ3UnLCAnYycsICd0JywgJ28nLCAncid9fTsKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0lPX1BSSU5UU1RSRUFNID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBJTywgeydQJywgJ3InLCAnaScsICduJywgJ3QnLCAnUycsICd0JywgJ3InLCAnZScsICdhJywgJ20nfX07Ci0JZmluYWwgY2hhcltdW10gSkFWQV9JT19TRVJJQUxJWkFCTEUgPSBuZXcgY2hhcltdW10ge0pBVkEsIElPLCB7J1MnLCAnZScsICdyJywgJ2knLCAnYScsICdsJywgJ2knLCAneicsICdhJywgJ2InLCAnbCcsICdlJ319OwotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19CWVRFID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQnl0ZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU0hPUlQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJTaG9ydCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0hBUkFDVEVSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiQ2hhcmFjdGVyIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19JTlRFR0VSID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiSW50ZWdlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfTE9ORyA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkxvbmciLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0ZMT0FUID0gbmV3IGNoYXJbXVtdIHtKQVZBLCBMQU5HLCAiRmxvYXQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0RPVUJMRSA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkRvdWJsZSIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQk9PTEVBTiA9IG5ldyBjaGFyW11bXSB7SkFWQSwgTEFORywgIkJvb2xlYW4iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCi0JZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1ZPSUQgPSBuZXcgY2hhcltdW10ge0pBVkEsIExBTkcsICJWb2lkIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFORyA9IHtKQVZBLCBMQU5HfTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0lPID0ge0pBVkEsIElPfTsKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQVNTRVJUSU9ORVJST1IgPSB7SkFWQSwgTEFORywgIkFzc2VydGlvbkVycm9yIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19DTEFTUyA9IHtKQVZBLCBMQU5HLCAiQ2xhc3MiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0NMQVNTTk9URk9VTkRFWENFUFRJT04gPSB7SkFWQSwgTEFORywgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0NMT05FQUJMRSA9IHtKQVZBLCBMQU5HLCAiQ2xvbmVhYmxlIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19FWENFUFRJT04gPSB7SkFWQSwgTEFORywgIkV4Y2VwdGlvbiIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfRVJST1IgPSB7SkFWQSwgTEFORywgIkVycm9yIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19OT0NMQVNTREVGRVJST1IgPSB7SkFWQSwgTEFORywgIk5vQ2xhc3NEZWZFcnJvciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfT0JKRUNUID0ge0pBVkEsIExBTkcsIE9CSkVDVH07CisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NUUklORyA9IHtKQVZBLCBMQU5HLCAiU3RyaW5nIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19TVFJJTkdCVUZGRVIgPSB7SkFWQSwgTEFORywgIlN0cmluZ0J1ZmZlciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfU1lTVEVNID0ge0pBVkEsIExBTkcsICJTeXN0ZW0iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT04gPSB7SkFWQSwgTEFORywgIlJ1bnRpbWVFeGNlcHRpb24iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1RIUk9XQUJMRSA9IHtKQVZBLCBMQU5HLCAiVGhyb3dhYmxlIi50b0NoYXJBcnJheSgpfTsgLy8kTk9OLU5MUy0xJAorCWZpbmFsIGNoYXJbXVtdIEpBVkFfTEFOR19SRUZMRUNUX0NPTlNUUlVDVE9SID0ge0pBVkEsIExBTkcsIFJFRkxFQ1QsICJDb25zdHJ1Y3RvciIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0lPX1BSSU5UU1RSRUFNID0ge0pBVkEsIElPLCAiUHJpbnRTdHJlYW0iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9JT19TRVJJQUxJWkFCTEUgPSB7SkFWQSwgSU8sICJTZXJpYWxpemFibGUiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0JZVEUgPSB7SkFWQSwgTEFORywgIkJ5dGUiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1NIT1JUID0ge0pBVkEsIExBTkcsICJTaG9ydCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfQ0hBUkFDVEVSID0ge0pBVkEsIExBTkcsICJDaGFyYWN0ZXIiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0lOVEVHRVIgPSB7SkFWQSwgTEFORywgIkludGVnZXIiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0xPTkcgPSB7SkFWQSwgTEFORywgIkxvbmciLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0ZMT0FUID0ge0pBVkEsIExBTkcsICJGbG9hdCIudG9DaGFyQXJyYXkoKX07IC8vJE5PTi1OTFMtMSQKKwlmaW5hbCBjaGFyW11bXSBKQVZBX0xBTkdfRE9VQkxFID0ge0pBVkEsIExBTkcsICJEb3VibGUiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX0JPT0xFQU4gPSB7SkFWQSwgTEFORywgIkJvb2xlYW4iLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCisJZmluYWwgY2hhcltdW10gSkFWQV9MQU5HX1ZPSUQgPSB7SkFWQSwgTEFORywgIlZvaWQiLnRvQ2hhckFycmF5KCl9OyAvLyROT04tTkxTLTEkCiAKIAkvLyBDb25zdGFudHMgdXNlZCBieSB0aGUgZmxvdyBhbmFseXNpcwogCWZpbmFsIGludCBFcXVhbE9yTW9yZVNwZWNpZmljID0gLTE7CiAJZmluYWwgaW50IE5vdFJlbGF0ZWQgPSAwOwogCWZpbmFsIGludCBNb3JlR2VuZXJpYyA9IDE7CiAKLQkvLyBFbXB0eSBDb2xsZWN0aW9uIHdoaWNoIGNhbiBsYXRlciBhc3NpZ24gdG8gbnVsbCBpZiBwZXJmb3JtYW5jZSBpcyBhbiBpc3N1ZS4KLQlmaW5hbCBjaGFyW10gTm9DaGFyID0gbmV3IGNoYXJbMF07Ci0JZmluYWwgY2hhcltdW10gTm9DaGFyQ2hhciA9IG5ldyBjaGFyWzBdW107CiAJLy8gTWV0aG9kIGNvbGxlY3Rpb25zCiAJZmluYWwgVHlwZUJpbmRpbmdbXSBOb1BhcmFtZXRlcnMgPSBuZXcgVHlwZUJpbmRpbmdbMF07CiAJZmluYWwgUmVmZXJlbmNlQmluZGluZ1tdIE5vRXhjZXB0aW9ucyA9IG5ldyBSZWZlcmVuY2VCaW5kaW5nWzBdOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9UeXBlSWRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQppbmRleCAxYjBlNTM5Li42ZTYxNzQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1R5cGVJZHMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKIHB1YmxpYyBpbnRlcmZhY2UgVHlwZUlkcyB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1VucmVzb2x2ZWRSZWZlcmVuY2VCaW5kaW5nLmphdmEKaW5kZXggNzMyNDRhMi4uYTYwMjc4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9VbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmcuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZyBleHRlbmRzIFJlZmVyZW5jZUJpbmRpbmcgewogCVJlZmVyZW5jZUJpbmRpbmcgcmVzb2x2ZWRUeXBlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9WYXJpYWJsZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9sb29rdXAvVmFyaWFibGVCaW5kaW5nLmphdmEKaW5kZXggMDlkNjc0ZS4uMzgyMDliOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2xvb2t1cC9WYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvbG9va3VwL1ZhcmlhYmxlQmluZGluZy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbnN0YW50OwpAQCAtMTgsOSArMTgsMTQgQEAKIAlwdWJsaWMgY2hhcltdIG5hbWU7CiAJcHVibGljIENvbnN0YW50IGNvbnN0YW50OwogCXB1YmxpYyBpbnQgaWQ7IC8vIGZvciBmbG93LWFuYWx5c2lzIChwb3NpdGlvbiBpbiBmbG93SW5mbyBiaXQgdmVjdG9yKQorCiBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0YW50VmFsdWUoKSB7CiAJcmV0dXJuIGNvbnN0YW50ICE9IENvbnN0YW50Lk5vdEFDb25zdGFudDsKIH0KKworcHVibGljIGZpbmFsIGJvb2xlYW4gaXNCbGFua0ZpbmFsKCl7CisJcmV0dXJuIChtb2RpZmllcnMgJiBBY2NCbGFua0ZpbmFsKSAhPSAwOworfQogLyogQW5zd2VyIHRydWUgaWYgdGhlIHJlY2VpdmVyIGlzIGZpbmFsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZAogKi8KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9OTFNMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU0xpbmUuamF2YQppbmRleCBjYTZlYjEzLi42NjZmNzhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU0xpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL05MU0xpbmUuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXIuamF2YQppbmRleCAwNjEzOGQ0Li40ZDk5ZmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUGFyc2VyLmphdmEKQEAgLTEsMjkgKzEsMzUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqICAgICBUb20gVHJvbWV5IC0gcGF0Y2ggZm9yIHJlYWRUYWJsZShTdHJpbmcpIGFzIGRlc2NyaWJlZCBpbiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE5NgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7IAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC4qOwotCiBpbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLXB1YmxpYyBjbGFzcyBQYXJzZXIgaW1wbGVtZW50cyBCaW5kaW5nSWRzLCBQYXJzZXJCYXNpY0luZm9ybWF0aW9uLCBJVGVybWluYWxTeW1ib2xzLCBDb21waWxlck1vZGlmaWVycywgT3BlcmF0b3JJZHMsIFR5cGVJZHMgeworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5SZWZlcmVuY2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUlkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOworCitwdWJsaWMgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgQmluZGluZ0lkcywgUGFyc2VyQmFzaWNJbmZvcm1hdGlvbiwgVGVybWluYWxUb2tlbnMsIENvbXBpbGVyTW9kaWZpZXJzLCBPcGVyYXRvcklkcywgVHlwZUlkcyB7CisKIAlwcm90ZWN0ZWQgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKIAlwdWJsaWMgaW50IGZpcnN0VG9rZW4gOyAvLyBoYW5kbGUgZm9yIG11bHRpcGxlIHBhcnNpbmcgZ29hbHMKIAlwdWJsaWMgaW50IGxhc3RBY3QgOyAvL2hhbmRsZSBmb3IgbXVsdGlwbGUgcGFyc2luZyBnb2FscwpAQCAtMTA5LDI0OCArMTE1LDI0NSBAQAogICAgICAgICAgICAgMSwzLDMsMiwxLDEsMSwxLDEsMSwxLDUsNyw3LDYsCiAgICAgICAgICAgICAyLDMsMyw0LDEsMiwyLDEsMiwzLDIsNSw1LDcsOSwKICAgICAgICAgICAgIDksMSwxLDEsMSwzLDMsNSwyLDMsMiwzLDMsMyw1LAotICAgICAgICAgICAgMSwzLDQsMSwyLDUsMiwxLDEsMSwxLDEsMSwzLDEsCi0gICAgICAgICAgICAxLDMsMywzLDMsMywxLDEsNSw2LDgsNywyLDAsMiwKLSAgICAgICAgICAgIDAsMSwzLDQsNCwxLDIsMywyLDEsMSwyLDIsMywzLAotICAgICAgICAgICAgNCw2LDYsNCw0LDEsMSwxLDEsMiwyLDAsMSwxLDMsCi0gICAgICAgICAgICAzLDEsMywzLDEsMywzLDEsNSw1LDQsMSwzLDMsMywKLSAgICAgICAgICAgIDEsMywzLDEsMywzLDMsMSwzLDMsMywzLDMsMSwzLAotICAgICAgICAgICAgMywxLDMsMSwzLDEsMywxLDMsMSwzLDEsNSwxLDEsCi0gICAgICAgICAgICAzLDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLSAgICAgICAgICAgIDEsMSwxLDEsMSwwLDEsMCwxLDAsMSwwLDEsMCwxLAotICAgICAgICAgICAgMCwxLDAsMiwwLDEsMCwxLDAsMSwwLDEsMCwxLDAsCi0gICAgICAgICAgICAxLDAsMSwwLDIsMCwwLDEsMCwxLDAsMSwwLDEsMCwKLSAgICAgICAgICAgIDEKKyAgICAgICAgICAgIDEsMyw0LDEsMiw1LDIsMSwxLDEsMSwxLDEsMSwzLAorICAgICAgICAgICAgMSwxLDMsMywzLDMsMywxLDEsNSw2LDgsNywyLDAsCisgICAgICAgICAgICAyLDAsMSwzLDMsNCwzLDQsMSwyLDMsMiwxLDEsMiwKKyAgICAgICAgICAgIDIsMywzLDQsNiw2LDQsNCw0LDEsMSwxLDEsMiwyLAorICAgICAgICAgICAgMCwxLDEsMywzLDEsMywzLDEsMywzLDEsNiw2LDUsCisgICAgICAgICAgICAwLDAsMSwzLDMsMywxLDMsMywxLDMsMywzLDEsMywKKyAgICAgICAgICAgIDMsMywzLDMsMSwzLDMsMSwzLDEsMywxLDMsMSwzLAorICAgICAgICAgICAgMSwzLDEsNSwxLDEsMywzLDEsMSwxLDEsMSwxLDEsCisgICAgICAgICAgICAxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwwLDEsMCwKKyAgICAgICAgICAgIDEsMCwxLDAsMSwwLDIsMCwxLDAsMSwwLDEsMCwxLAorICAgICAgICAgICAgMCwxLDAsMSwwLDEsMCwyLDAsMCwxLDAsMSwwLDEsCisgICAgICAgICAgICAwLDEKICAgICB9OwogCi0JCQogCXB1YmxpYyAgc3RhdGljIGNoYXIgYXNiW10gPSBudWxsOwogCXB1YmxpYyAgc3RhdGljIGNoYXIgYXNyW10gPSBudWxsOwogCXB1YmxpYyAgc3RhdGljIGNoYXIgc3ltYm9sX2luZGV4W10gPSBudWxsOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX0VPRiA9ICJVbmV4cGVjdGVkIEVuZCBPZiBGaWxlIiA7IC8vJE5PTi1OTFMtMSQKIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5hbWVbXSA9IHsgbnVsbCwKLSAgICAgICAgICAgICIrKyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIi0tIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiPT0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI8PSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj49IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiIT0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI8PCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj4+IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiPj4+IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiKz0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICItPSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIio9IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiLz0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICImPSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInw9IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiXj0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICIlPSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIjw8PSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj4+PSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj4+Pj0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ8fCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIiYmIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiKyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIi0iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICIhIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiJSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIl4iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICImIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiKiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInwiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ+IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiLyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj4iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI8IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiKCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIikiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ7IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAifSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlsiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJdIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiOyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIj8iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI6IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiLCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIi4iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI9IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiJGVtcHR5IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiSWRlbnRpZmllciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImFic3RyYWN0IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiYXNzZXJ0IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiYm9vbGVhbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImJyZWFrIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiYnl0ZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImNhc2UiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJjYXRjaCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImNoYXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJjbGFzcyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImNvbnRpbnVlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiZGVmYXVsdCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImRvIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiZG91YmxlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiZWxzZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImV4dGVuZHMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJmYWxzZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImZpbmFsIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiZmluYWxseSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImZsb2F0IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiZm9yIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiaWYiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJpbXBsZW1lbnRzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiaW1wb3J0IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiaW5zdGFuY2VvZiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImludCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImludGVyZmFjZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgImxvbmciLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJuYXRpdmUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJuZXciLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJudWxsIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAicGFja2FnZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInByaXZhdGUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJwcm90ZWN0ZWQiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJwdWJsaWMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJyZXR1cm4iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJzaG9ydCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInN0YXRpYyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInN0cmljdGZwIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAic3VwZXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJzd2l0Y2giLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ0aGlzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAidGhyb3ciLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ0aHJvd3MiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ0cmFuc2llbnQiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJ0cnVlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAidHJ5IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAidm9pZCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgInZvbGF0aWxlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAid2hpbGUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbnRlZ2VyTGl0ZXJhbCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkxvbmdMaXRlcmFsIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiRmxvYXRpbmdQb2ludExpdGVyYWwiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJEb3VibGVMaXRlcmFsIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ2hhcmFjdGVyTGl0ZXJhbCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0cmluZ0xpdGVyYWwiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFVORVhQRUNURURfRU9GLAotICAgICAgICAgICAgIkludmFsaWQgQ2hhcmFjdGVyIiwvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgICAgICAiR29hbCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk1ldGhvZEJvZHkiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDb25zdHJ1Y3RvckJvZHkiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJTdGF0aWNJbml0aWFsaXplciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkluaXRpYWxpemVyIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiSGVhZGVycyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkJsb2NrU3RhdGVtZW50cyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDYXRjaEhlYWRlciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbXBvcnREZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlBhY2thZ2VEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkdlbmVyaWNNZXRob2REZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNsYXNzQm9keURlY2xhcmF0aW9uIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlR5cGUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJQcmltaXRpdmVUeXBlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiUmVmZXJlbmNlVHlwZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNsYXNzT3JJbnRlcmZhY2VUeXBlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQXJyYXlUeXBlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiTmFtZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkRpbXMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDbGFzc1R5cGUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJTaW1wbGVOYW1lIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiSGVhZGVyIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ2xhc3NIZWFkZXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbnRlcmZhY2VIZWFkZXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJNZXRob2RIZWFkZXIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDb25zdHJ1Y3RvckhlYWRlciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkZvcm1hbFBhcmFtZXRlciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkltcG9ydERlY2xhcmF0aW9ucyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbnMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk1vZGlmaWVycyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk1vZGlmaWVyIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ2xhc3NCb2R5IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ2xhc3NIZWFkZXJOYW1lIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiSW50ZXJmYWNlVHlwZUxpc3QiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbnRlcmZhY2VUeXBlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQmxvY2siLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3JzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9yIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9ySWQiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJWYXJpYWJsZUluaXRpYWxpemVyIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQXJyYXlJbml0aWFsaXplciIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk1ldGhvZEhlYWRlck5hbWUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDbGFzc1R5cGVMaXN0IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQ29uc3RydWN0b3JIZWFkZXJOYW1lIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiRm9ybWFsUGFyYW1ldGVyTGlzdCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNsYXNzVHlwZUVsdCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0YXRpY09ubHkiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlByaW1hcnkiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbnRlcmZhY2VCb2R5IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiSW50ZXJmYWNlSGVhZGVyTmFtZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiVmFyaWFibGVJbml0aWFsaXplcnMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJCbG9ja1N0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0YXRlbWVudE5vU2hvcnRJZiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN0YXRlbWVudEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiTWV0aG9kSW52b2NhdGlvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJTd2l0Y2hCbG9jayIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50cyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN3aXRjaExhYmVscyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50IiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiU3dpdGNoTGFiZWwiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDb25zdGFudEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIk9ubHlTeW5jaHJvbml6ZWQiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDYXRjaGVzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiRmluYWxseSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNhdGNoQ2xhdXNlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiUHVzaExQQVJFTiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIlB1c2hSUEFSRU4iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJQcmltYXJ5Tm9OZXdBcnJheSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkZpZWxkQWNjZXNzIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQXJyYXlBY2Nlc3MiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkFyZ3VtZW50TGlzdCIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHBycyIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHByIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiRGltc0xvb3AiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJPbmVEaW1Mb29wIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiUG9zdGZpeEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJBZGRpdGl2ZUV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJTaGlmdEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkFuZEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJFeGNsdXNpdmVPckV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJJbmNsdXNpdmVPckV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICJDb25kaXRpb25hbE9yRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiTGVmdEhhbmRTaWRlIiwvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAiQXNzaWdubWVudE9wZXJhdG9yIi8vJE5PTi1OTFMtMSQKLSAgICB9OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG5hbWVbXSA9IHsgbnVsbCwKKyAgICAgICAgICAgICIrKyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICItLSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI9PSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI8PSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI+PSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIhPSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI8PCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI+PiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI+Pj4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKz0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLT0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiKj0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLz0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJj0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAifD0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiXj0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJT0iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiPDw9IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4+PSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI+Pj49IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInx8IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIiYmIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIisiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiLSIsIC8vJE5PTi1OTFMtMSQgCisgICAgICAgICAgICAiISIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIl4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIqIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAifiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIvIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiPCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIoIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIikiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAieyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ9IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlsiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiXSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICI7IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIj8iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiOiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIsIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIi4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiPSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiJGVtcHR5IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIklkZW50aWZpZXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYWJzdHJhY3QiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYXNzZXJ0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImJvb2xlYW4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYnJlYWsiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiYnl0ZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJjYXNlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImNhdGNoIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImNoYXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiY2xhc3MiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiY29udGludWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZGVmYXVsdCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJkbyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJkb3VibGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZWxzZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJleHRlbmRzIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImZhbHNlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImZpbmFsIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImZpbmFsbHkiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZmxvYXQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiZm9yIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImlmIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImltcGxlbWVudHMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiaW1wb3J0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImluc3RhbmNlb2YiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiaW50IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJsb25nIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIm5hdGl2ZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJuZXciLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAibnVsbCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJwYWNrYWdlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInByaXZhdGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAicHJvdGVjdGVkIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInB1YmxpYyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJyZXR1cm4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAic2hvcnQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAic3RhdGljIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInN0cmljdGZwIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInN1cGVyIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInN3aXRjaCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidGhpcyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0aHJvdyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJ0aHJvd3MiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidHJhbnNpZW50IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInRydWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidHJ5IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgInZvaWQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAidm9sYXRpbGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAid2hpbGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSW50ZWdlckxpdGVyYWwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTG9uZ0xpdGVyYWwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRmxvYXRpbmdQb2ludExpdGVyYWwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRG91YmxlTGl0ZXJhbCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDaGFyYWN0ZXJMaXRlcmFsIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0cmluZ0xpdGVyYWwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBVTkVYUEVDVEVEX0VPRiwgCisgICAgICAgICAgICAiSW52YWxpZCBDaGFyYWN0ZXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiR29hbCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNZXRob2RCb2R5IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNvbnN0cnVjdG9yQm9keSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTdGF0aWNJbml0aWFsaXplciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbml0aWFsaXplciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJIZWFkZXJzIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkJsb2NrU3RhdGVtZW50cyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNhdGNoSGVhZGVyIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSW1wb3J0RGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUGFja2FnZURlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlR5cGVEZWNsYXJhdGlvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJHZW5lcmljTWV0aG9kRGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NCb2R5RGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJUeXBlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlByaW1pdGl2ZVR5cGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUmVmZXJlbmNlVHlwZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc09ySW50ZXJmYWNlVHlwZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJBcnJheVR5cGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTmFtZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJEaW1zIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNsYXNzVHlwZSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTaW1wbGVOYW1lIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkhlYWRlciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc0hlYWRlciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlcmZhY2VIZWFkZXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTWV0aG9kSGVhZGVyIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNvbnN0cnVjdG9ySGVhZGVyIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkZvcm1hbFBhcmFtZXRlciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbXBvcnREZWNsYXJhdGlvbnMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVHlwZURlY2xhcmF0aW9ucyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1vZGlmaWVycyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNb2RpZmllciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc0JvZHkiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NIZWFkZXJOYW1lIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZVR5cGVMaXN0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZVR5cGUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NCb2R5RGVjbGFyYXRpb25zIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkJsb2NrIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvcnMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9yIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvcklkIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlZhcmlhYmxlSW5pdGlhbGl6ZXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXJyYXlJbml0aWFsaXplciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJNZXRob2RIZWFkZXJOYW1lIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk1ldGhvZEhlYWRlclBhcmFtZXRlcnMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NUeXBlTGlzdCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25zdHJ1Y3RvckhlYWRlck5hbWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRm9ybWFsUGFyYW1ldGVyTGlzdCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc1R5cGVFbHQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU3RhdGljT25seSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiIsICAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUHJpbWFyeSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJJbnRlcmZhY2VCb2R5IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZUhlYWRlck5hbWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlZhcmlhYmxlSW5pdGlhbGl6ZXJzIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkJsb2NrU3RhdGVtZW50IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IiwgIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTdGF0ZW1lbnROb1Nob3J0SWYiLCAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUG9zdEluY3JlbWVudEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUG9zdERlY3JlbWVudEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTWV0aG9kSW52b2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN3aXRjaEJsb2NrIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN3aXRjaEJsb2NrU3RhdGVtZW50cyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTd2l0Y2hMYWJlbHMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU3dpdGNoQmxvY2tTdGF0ZW1lbnQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiU3dpdGNoTGFiZWwiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ29uc3RhbnRFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlN0YXRlbWVudEV4cHJlc3Npb25MaXN0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIk9ubHlTeW5jaHJvbml6ZWQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2F0Y2hlcyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJGaW5hbGx5IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkNhdGNoQ2xhdXNlIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlB1c2hMUEFSRU4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUHVzaFJQQVJFTiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJQcmltYXJ5Tm9OZXdBcnJheSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQXJndW1lbnRMaXN0IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkRpbVdpdGhPcldpdGhPdXRFeHBycyIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJEaW1XaXRoT3JXaXRoT3V0RXhwciIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJEaW1zTG9vcCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJPbmVEaW1Mb29wIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlBvc3RmaXhFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIlVuYXJ5RXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFkZGl0aXZlRXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJTaGlmdEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiUmVsYXRpb25hbEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRXF1YWxpdHlFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFuZEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiRXhjbHVzaXZlT3JFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICJDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAiQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgIkFzc2lnbm1lbnRPcGVyYXRvciIsICAvLyROT04tTkxTLTEkCisJfTsKICAgICAKIAlwdWJsaWMgIHN0YXRpYyBzaG9ydCBjaGVja190YWJsZVtdID0gbnVsbDsKIAlwdWJsaWMgIHN0YXRpYyBjaGFyIGxoc1tdID0gIG51bGw7CkBAIC00MDYsNyArNDA5LDcgQEAKIAlwdXNoT25FeHByZXNzaW9uU3RhY2soYWkpOwogCS8vcG9zaXRpb25uaW5nCiAJYWkuc291cmNlRW5kID0gZW5kU3RhdGVtZW50UG9zaXRpb247Ci0JaW50IHNlYXJjaFBvc2l0aW9uID0gbGVuZ3RoID09IDAgPyBlbmRQb3NpdGlvbiA6IGFpLmV4cHJlc3Npb25zWzBdLnNvdXJjZVN0YXJ0OworCWludCBzZWFyY2hQb3NpdGlvbiA9IGxlbmd0aCA9PSAwID8gZW5kUG9zaXRpb24gKyAxIDogYWkuZXhwcmVzc2lvbnNbMF0uc291cmNlU3RhcnQ7CiAJdHJ5IHsKIAkJLy9kb2VzIG5vdCB3b3JrIHdpdGggY29tbWVudHModGhhdCBjb250YWluICd7Jykgbm9yICd7JyBkZXNjcmliZXMgYXMgYSB1bmljb2RlLi4uLgkJCiAJCXdoaWxlIChzY2FubmVyLnNvdXJjZVstLXNlYXJjaFBvc2l0aW9uXSAhPSAneycpIHsKQEAgLTUzNSw3ICs1MzgsOCBAQAogCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgcmVmZXJlbmNlQ29udGV4dDsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKXsKIAkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwkJCQkJCi0JCQkJCWlmICghZmllbGQuaXNGaWVsZCgpCisJCQkJCWlmIChmaWVsZCAhPSBudWxsCisJCQkJCQkmJiAhZmllbGQuaXNGaWVsZCgpCiAJCQkJCQkmJiBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IHNjYW5uZXIuaW5pdGlhbFBvc2l0aW9uCiAJCQkJCQkmJiBzY2FubmVyLmluaXRpYWxQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZAogCQkJCQkJJiYgc2Nhbm5lci5lb2ZQb3NpdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCsxKXsKQEAgLTY0Myw3ICs2NDcsNyBAQAogCQkJCQkJCQlzY2FubmVyLnB1c2hMaW5lU2VwYXJhdG9yKCk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJaXNXaGl0ZVNwYWNlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzY2FubmVyLmN1cnJlbnRDaGFyYWN0ZXIpOworCQkJCQkJaXNXaGl0ZVNwYWNlID0gQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2Uoc2Nhbm5lci5jdXJyZW50Q2hhcmFjdGVyKTsKIAkJCQkJfQogCQkJCX0gd2hpbGUgKGlzV2hpdGVTcGFjZSAmJiAoc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gPCBzY2FubmVyLmVvZlBvc2l0aW9uKSk7CiAKQEAgLTgwNiw2ICs4MTAsOSBAQAogCQkJCQkJCQkJaWYgKHNjYW5uZXIubGluZUVuZHNbc2Nhbm5lci5saW5lUHRyXSA8IHNjYW5uZXIuc3RhcnRQb3NpdGlvbikgewogCQkJCQkJCQkJCS8vIG9ubHkgcmVjb3JkIGxpbmUgcG9zaXRpb25zIHdlIGhhdmUgbm90IHJlY29yZGVkIHlldAogCQkJCQkJCQkJCXNjYW5uZXIucHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQlpZiAodGhpcy5zY2FubmVyLnRhc2tUYWdzICE9IG51bGwpIHsKKwkJCQkJCQkJCQkJdGhpcy5zY2FubmVyLmNoZWNrVGFza1RhZyh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7CisJCQkJCQkJCQkJfQogCQkJCQkJCQkJfQogCQkJCQkJCQl9CiAJCQkJCQkJCWJyZWFrOwpAQCAtODU4LDYgKzg2NSw5IEBACiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfQogCQkJCQkJCQl9CisJCQkJCQkJCWlmICh0aGlzLnNjYW5uZXIudGFza1RhZ3MgIT0gbnVsbCkgeworCQkJCQkJCQkJdGhpcy5zY2FubmVyLmNoZWNrVGFza1RhZyh0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpLCB0aGlzLnNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKSk7CisJCQkJCQkJCX0JCQkJCQkJCQogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQkJYnJlYWs7CkBAIC05NjMsMzkgKzk3MywyNiBAQAogCWludCBsYXN0QW5ub3RhdGlvbkluZGV4ID0gLTE7CiAKIAkvL3NpbmNlIGpkazEuMiBsb29rIG9ubHkgaW4gdGhlIGxhc3QgamF2YSBkb2MgY29tbWVudC4uLgotCWZvdW5kIDogZm9yIChsYXN0QW5ub3RhdGlvbkluZGV4ID0gc2Nhbm5lci5jb21tZW50UHRyOyBsYXN0QW5ub3RhdGlvbkluZGV4ID49IDA7IGxhc3RBbm5vdGF0aW9uSW5kZXgtLSl7CisJbmV4dENvbW1lbnQgOiBmb3IgKGxhc3RBbm5vdGF0aW9uSW5kZXggPSBzY2FubmVyLmNvbW1lbnRQdHI7IGxhc3RBbm5vdGF0aW9uSW5kZXggPj0gMDsgbGFzdEFubm90YXRpb25JbmRleC0tKXsKIAkJLy9sb29rIGZvciBAZGVwcmVjYXRlZCBpbnRvIHRoZSBmaXJzdCBqYXZhZG9jIGNvbW1lbnQgcHJlY2VlZGluZyB0aGUgZGVjbGFyYXRpb24KIAkJaW50IGNvbW1lbnRTb3VyY2VTdGFydCA9IHNjYW5uZXIuY29tbWVudFN0YXJ0c1tsYXN0QW5ub3RhdGlvbkluZGV4XTsKIAkJLy8gamF2YWRvYyBvbmx5IChub24gamF2YWRvYyBjb21tZW50IGhhdmUgbmVnYXRpdmUgZW5kIHBvc2l0aW9ucy4pCiAJCWlmIChtb2RpZmllcnNTb3VyY2VTdGFydCAhPSAtMSAmJiBtb2RpZmllcnNTb3VyY2VTdGFydCA8IGNvbW1lbnRTb3VyY2VTdGFydCkgewotCQkJY29udGludWU7CisJCQljb250aW51ZSBuZXh0Q29tbWVudDsKIAkJfQogCQlpZiAoc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdEFubm90YXRpb25JbmRleF0gPCAwKSB7Ci0JCQlicmVhayBmb3VuZDsKKwkJCWNvbnRpbnVlIG5leHRDb21tZW50OwogCQl9CiAJCWNoZWNrRGVwcmVjYXRlZCA9IHRydWU7CiAJCWludCBjb21tZW50U291cmNlRW5kID0gc2Nhbm5lci5jb21tZW50U3RvcHNbbGFzdEFubm90YXRpb25JbmRleF0gLSAxOyAvL3N0b3AgaXMgb25lIG92ZXIKIAkJY2hhcltdIGNvbW1lbnQgPSBzY2FubmVyLnNvdXJjZTsKIAotCQlmb3IgKGludCBpID0gY29tbWVudFNvdXJjZVN0YXJ0ICsgMzsgaSA8IGNvbW1lbnRTb3VyY2VFbmQgLSAxMDsgaSsrKSB7Ci0JCQlpZiAoKGNvbW1lbnRbaV0gPT0gJ0AnKSAKLQkJCQkmJiAoY29tbWVudFtpICsgMV0gPT0gJ2QnKQotCQkJCSYmIChjb21tZW50W2kgKyAyXSA9PSAnZScpCi0JCQkJJiYgKGNvbW1lbnRbaSArIDNdID09ICdwJykKLQkJCQkmJiAoY29tbWVudFtpICsgNF0gPT0gJ3InKQotCQkJCSYmIChjb21tZW50W2kgKyA1XSA9PSAnZScpCi0JCQkJJiYgKGNvbW1lbnRbaSArIDZdID09ICdjJykKLQkJCQkmJiAoY29tbWVudFtpICsgN10gPT0gJ2EnKQotCQkJCSYmIChjb21tZW50W2kgKyA4XSA9PSAndCcpCi0JCQkJJiYgKGNvbW1lbnRbaSArIDldID09ICdlJykKLQkJCQkmJiAoY29tbWVudFtpICsgMTBdID09ICdkJykpIHsKLQkJCQkvLyBlbnN1cmUgdGhlIHRhZyBpcyBwcm9wZXJseSBlbmRlZDogZWl0aGVyIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGEgdGFiLCBsaW5lIGVuZCBvciBhc3Rlcmlzay4KLQkJCQlpbnQgbmV4dFBvcyA9IGkrMTE7Ci0JCQkJZGVwcmVjYXRlZCA9IChjb21tZW50W25leHRQb3NdID09ICcgJykgfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJ1x0JykgfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJ1xuJykgfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJ1xyJykgfHwgKGNvbW1lbnRbbmV4dFBvc10gPT0gJyonKTsKLQkJCQlicmVhayBmb3VuZDsKLQkJCX0KLQkJfQotCQlicmVhayBmb3VuZDsKKwkJZGVwcmVjYXRlZCA9CisJCQljaGVja0RlcHJlY2F0aW9uKAorCQkJCWNvbW1lbnRTb3VyY2VTdGFydCwKKwkJCQljb21tZW50U291cmNlRW5kLAorCQkJCWNvbW1lbnQpOworCQlicmVhayBuZXh0Q29tbWVudDsKIAl9CiAJaWYgKGRlcHJlY2F0ZWQpIHsKIAkJY2hlY2tBbmRTZXRNb2RpZmllcnMoQWNjRGVwcmVjYXRlZCk7CkBAIC0xMDA1LDYgKzEwMDIsNzQgQEAKIAkJbW9kaWZpZXJzU291cmNlU3RhcnQgPSBzY2FubmVyLmNvbW1lbnRTdGFydHNbbGFzdEFubm90YXRpb25JbmRleF07IAogCX0KIH0KK3Byb3RlY3RlZCBib29sZWFuIGNoZWNrRGVwcmVjYXRpb24oCisJaW50IGNvbW1lbnRTb3VyY2VTdGFydCwKKwlpbnQgY29tbWVudFNvdXJjZUVuZCwKKwljaGFyW10gY29tbWVudCkgeworCisJYm9vbGVhbiBkZXByZWNhdGVkID0gZmFsc2U7CisJYm9vbGVhbiBvbmVTdGFyID0gZmFsc2U7CisJYm9vbGVhbiBpbnZhbGlkYXRlID0gZmFsc2U7CisJZm9yIChpbnRbXSBpbmRleCA9IG5ldyBpbnRbXSB7Y29tbWVudFNvdXJjZVN0YXJ0ICsgM307IGluZGV4WzBdIDwgY29tbWVudFNvdXJjZUVuZCAtIDEwOykgeworCQljaGFyIG5leHRDaGFyYWN0ZXIgPSBnZXROZXh0Q2hhcmFjdGVyKGNvbW1lbnQsIGluZGV4KTsKKwkJc3dpdGNoKG5leHRDaGFyYWN0ZXIpIHsKKwkJCWNhc2UgJ0AnIDoKKwkJCQlpZiAoKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdkJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdlJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdwJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdyJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdlJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdjJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdhJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICd0JykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdlJykKKwkJCQkJJiYgKGdldE5leHRDaGFyYWN0ZXIoY29tbWVudCwgaW5kZXgpID09ICdkJykpIHsKKwkJCQkJLy8gZW5zdXJlIHRoZSB0YWcgaXMgcHJvcGVybHkgZW5kZWQ6IGVpdGhlciBmb2xsb3dlZCBieSBhIHNwYWNlLCBhIHRhYiwgbGluZSBlbmQgb3IgYXN0ZXJpc2suCisJCQkJCW5leHRDaGFyYWN0ZXIgPSBnZXROZXh0Q2hhcmFjdGVyKGNvbW1lbnQsIGluZGV4KTsKKwkJCQkJZGVwcmVjYXRlZCA9ICFpbnZhbGlkYXRlICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5leHRDaGFyYWN0ZXIpIHx8IG5leHRDaGFyYWN0ZXIgPT0gJyonKTsKKwkJCQkJaWYgKGRlcHJlY2F0ZWQpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnXG4nIDoKKwkJCWNhc2UgJ1xyJyA6CisJCQljYXNlICdcZicgOgorCQkJCW9uZVN0YXIgPSBmYWxzZTsKKwkJCQlpbnZhbGlkYXRlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlICcqJyA6CisJCQkJaWYgKG9uZVN0YXIpIHsKKwkJCQkJaW52YWxpZGF0ZSA9IHRydWU7CisJCQkJfQorCQkJCW9uZVN0YXIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJaWYgKCFDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShuZXh0Q2hhcmFjdGVyKSkgeworCQkJCQlpbnZhbGlkYXRlID0gdHJ1ZTsKKwkJCQl9CisJCX0KKwl9CisJcmV0dXJuIGRlcHJlY2F0ZWQ7Cit9Citwcm90ZWN0ZWQgY2hhciBnZXROZXh0Q2hhcmFjdGVyKGNoYXJbXSBjb21tZW50LCBpbnRbXSBpbmRleCkgeworCWNoYXIgbmV4dENoYXJhY3RlciA9IGNvbW1lbnRbaW5kZXhbMF0rK107CisJc3dpdGNoKG5leHRDaGFyYWN0ZXIpIHsKKwkJY2FzZSAnXFwnIDoKKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWluZGV4WzBdKys7CisJCQl3aGlsZSAoY29tbWVudFtpbmRleFswXV0gPT0gJ3UnKSBpbmRleFswXSsrOworCQkJaWYgKCEoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoY29tbWVudFtpbmRleFswXSsrXSkpID4gMTUKKwkJCQl8fCBjMSA8IDApCisJCQkJfHwgKChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoY29tbWVudFtpbmRleFswXSsrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCXx8ICgoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKGNvbW1lbnRbaW5kZXhbMF0rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjb21tZW50W2luZGV4WzBdKytdKSkgPiAxNSB8fCBjNCA8IDApKSkgeworCQkJCQluZXh0Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJfQorCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0Q2hhcmFjdGVyOworfQogcHJvdGVjdGVkIHZvaWQgY2xhc3NJbnN0YW5jZUNyZWF0aW9uKGJvb2xlYW4gYWx3YXlzUXVhbGlmaWVkKSB7CiAJLy8gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAogCkBAIC0xMDQ5LDggKzExMTQsOCBAQAogCQlhc3RQdHItLTsKIAkJYXN0TGVuZ3RoUHRyLS07CiAJCQotCQkvLyBtYXJrIGZpZWxkcyBhbmQgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCi0JCW1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKGFub255bW91c1R5cGVEZWNsYXJhdGlvbik7CisJCS8vIG1hcmsgaW5pdGlhbGl6ZXJzIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAorCQltYXJrSW5pdGlhbGl6ZXJzV2l0aExvY2FsVHlwZShhbm9ueW1vdXNUeXBlRGVjbGFyYXRpb24pOwogCX0KIH0KIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNvbmNhdEV4cHJlc3Npb25MaXN0cygpIHsKQEAgLTExMjMsMTggKzExODgsMzggQEAKIAl9CiAJZXhwLnNvdXJjZUVuZCA9IGVuZFBvc2l0aW9uOwogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCkgewotCS8vIEFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0Ci0JLy8gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRob3V0SW5pdGlhbGl6ZXIoKSB7CisJLy8gQXJyYXlDcmVhdGlvbldpdGhvdXRBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMKKwkvLyBBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzCiAKIAlpbnQgbGVuZ3RoOwogCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYWFlID0gbmV3IEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKLQlpZiAoZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHJdICE9IDApIHsKLQkJZXhwcmVzc2lvbkxlbmd0aFB0ciAtLSA7Ci0JCWFhZS5pbml0aWFsaXplciA9IChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXTsKKwlhYWUudHlwZSA9IGdldFR5cGVSZWZlcmVuY2UoMCk7CisJbGVuZ3RoID0gKGV4cHJlc3Npb25MZW5ndGhTdGFja1tleHByZXNzaW9uTGVuZ3RoUHRyLS1dKTsKKwlleHByZXNzaW9uUHRyIC09IGxlbmd0aCA7CisJU3lzdGVtLmFycmF5Y29weSgKKwkJZXhwcmVzc2lvblN0YWNrLAorCQlleHByZXNzaW9uUHRyKzEsCisJCWFhZS5kaW1lbnNpb25zID0gbmV3IEV4cHJlc3Npb25bbGVuZ3RoXSwKKwkJMCwKKwkJbGVuZ3RoKTsKKwlhYWUuc291cmNlU3RhcnQgPSBpbnRTdGFja1tpbnRQdHItLV07CisJaWYgKGFhZS5pbml0aWFsaXplciA9PSBudWxsKSB7CisJCWFhZS5zb3VyY2VFbmQgPSBlbmRQb3NpdGlvbjsKIAl9IGVsc2UgewotCQlleHByZXNzaW9uTGVuZ3RoUHRyLS07CisJCWFhZS5zb3VyY2VFbmQgPSBhYWUuaW5pdGlhbGl6ZXIuc291cmNlRW5kIDsKIAl9CisJcHVzaE9uRXhwcmVzc2lvblN0YWNrKGFhZSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpIHsKKwkvLyBBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzIEFycmF5SW5pdGlhbGl6ZXIKKwkvLyBBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyCisKKwlpbnQgbGVuZ3RoOworCUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gYWFlID0gbmV3IEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oKTsKKwlleHByZXNzaW9uTGVuZ3RoUHRyIC0tIDsKKwlhYWUuaW5pdGlhbGl6ZXIgPSAoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV07CiAJCQogCWFhZS50eXBlID0gZ2V0VHlwZVJlZmVyZW5jZSgwKTsKIAlsZW5ndGggPSAoZXhwcmVzc2lvbkxlbmd0aFN0YWNrW2V4cHJlc3Npb25MZW5ndGhQdHItLV0pOwpAQCAtMTMwNyw4ICsxMzkyLDggQEAKIAlwdXNoT25Bc3RTdGFjayhuZXcgQ2FzZShpbnRTdGFja1tpbnRQdHItLV0sIGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dKSk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKSB7Ci0JLy8gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uCi0JLy8gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisJLy8gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uCisJLy8gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCiAKIAkvL2ludFN0YWNrIDogcG9zT2ZMZWZ0UGFyZW4gZGltIHBvc09mUmlnaHRQYXJlbgogCkBAIC0xMzIyLDIzICsxNDA3LDIxIEBACiAJY2FzdC5zb3VyY2VFbmQgPSBleHAuc291cmNlRW5kOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNhc3RFeHByZXNzaW9uTEwxKCkgewotCS8vQ2FzdEV4cHJlc3Npb24gOjo9ICcoJyBFeHByZXNzaW9uICcpJyBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKwkvL0Nhc3RFeHByZXNzaW9uIDo6PSAnKCcgRXhwcmVzc2lvbiAnKScgSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCiAJLy8gRXhwcmVzc2lvbiBpcyB1c2VkIGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxCiAKIAkvL29wdGltaXplIHB1c2gvcG9wCiAKLQlFeHByZXNzaW9uIGNhc3RUeXBlLGNhc3QsZXhwOworCUV4cHJlc3Npb24gY2FzdCxleHA7CiAJZXhwcmVzc2lvblB0ci0tOwogCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSA9IAotCQkJY2FzdCA9IG5ldyBDYXN0RXhwcmVzc2lvbigJZXhwPWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzFdICwKLQkJCQkJCQkJY2FzdFR5cGUgPSBnZXRUeXBlUmVmZXJlbmNlKGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSkpOworCQljYXN0ID0gbmV3IENhc3RFeHByZXNzaW9uKAorCQkJZXhwPWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyKzFdICwKKwkJCWdldFR5cGVSZWZlcmVuY2UoZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKSk7CiAJZXhwcmVzc2lvbkxlbmd0aFB0ciAtLSA7Ci0JdXBkYXRlU291cmNlUG9zaXRpb24oY2FzdFR5cGUpOwotCWNhc3Quc291cmNlU3RhcnQ9Y2FzdFR5cGUuc291cmNlU3RhcnQ7CisJdXBkYXRlU291cmNlUG9zaXRpb24oY2FzdCk7CiAJY2FzdC5zb3VyY2VFbmQ9ZXhwLnNvdXJjZUVuZDsKLQljYXN0VHlwZS5zb3VyY2VTdGFydCsrOwotCWNhc3RUeXBlLnNvdXJjZUVuZC0tOwotCX0KK30KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVDYXRjaGVzKCkgewogCS8vIENhdGNoZXMgOjo9IENhdGNoZXMgQ2F0Y2hDbGF1c2UKIAlvcHRpbWl6ZWRDb25jYXROb2RlTGlzdHMoKTsKQEAgLTE0MDEsOCArMTQ4NCw4IEBACiAKIAlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAoVHlwZURlY2xhcmF0aW9uKSBhc3RTdGFja1thc3RQdHJdOwogCi0JLy8gbWFyayBmaWVsZHMgYW5kIGluaXRpYWxpemVyIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAotCW1hcmtGaWVsZHNXaXRoTG9jYWxUeXBlKHR5cGVEZWNsKTsKKwkvLyBtYXJrIGluaXRpYWxpemVycyB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKKwltYXJrSW5pdGlhbGl6ZXJzV2l0aExvY2FsVHlwZSh0eXBlRGVjbCk7CiAKIAkvL2NvbnZlcnQgY29uc3RydWN0b3IgdGhhdCBkbyBub3QgaGF2ZSB0aGUgdHlwZSdzIG5hbWUgaW50byBtZXRob2RzCiAJYm9vbGVhbiBoYXNDb25zdHJ1Y3RvciA9IHR5cGVEZWNsLmNoZWNrQ29uc3RydWN0b3JzKHRoaXMpOwpAQCAtMTQ4Niw3ICsxNTY5LDcgQEAKIAl9IGVsc2UgewogCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCiAJCXR5cGVEZWNsID0gbmV3IExvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJCW1hcmtFbmNsb3NpbmdNZW1iZXJXaXRoTG9jYWxUeXBlKCk7CiAJCWJsb2NrUmVhbCgpOwogCX0KIApAQCAtMTYyMCw3ICsxNzAzLDE3IEBACiAJCQljb25zdHJ1Y3RvckNhbGwgPSBTdXBlclJlZmVyZW5jZS5pbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCk7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoIWRpZXQpeworCQlib29sZWFuIGluc2lkZUZpZWxkSW5pdGlhbGl6ZXIgPSBmYWxzZTsKKwkJaWYgKGRpZXQpIHsKKwkJCWZvciAoaW50IGkgPSBuZXN0ZWRUeXBlOyBpID4gMDsgaS0tKXsKKwkJCQlpZiAodmFyaWFibGVzQ291bnRlcltpXSA+IDApIHsKKwkJCQkJaW5zaWRlRmllbGRJbml0aWFsaXplciA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKCFkaWV0IHx8IGluc2lkZUZpZWxkSW5pdGlhbGl6ZXIpewogCQkJLy8gYWRkIGl0IG9ubHkgaW4gbm9uLWRpZXQgbW9kZSwgaWYgZGlldF9ib2RpZXMsIHRoZW4gY29uc3RydWN0b3IgY2FsbCB3aWxsIGJlIGFkZGVkIGVsc2V3aGVyZS4KIAkJCWNvbnN0cnVjdG9yQ2FsbCA9IFN1cGVyUmVmZXJlbmNlLmltcGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwoKTsKIAkJfQpAQCAtMTcyMSw2ICsxODE0LDcgQEAKIAkvLyBEaWV0IDo6PSAkZW1wdHkKIAljaGVja0Fubm90YXRpb24oKTsKIAlwdXNoT25JbnRTdGFjayhtb2RpZmllcnNTb3VyY2VTdGFydCk7IC8vIHB1c2ggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGEgamF2YWRvYyBjb21tZW50IGlmIHRoZXJlIGlzIG9uZQorCXJlc2V0TW9kaWZpZXJzKCk7CiAJanVtcE92ZXJNZXRob2RCb2R5KCk7CiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lRGltcygpIHsKQEAgLTE4MjAsNyArMTkxNCw3IEBACiAJCW5ldyBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7IAogCWFsbG9jID0gCiAJCWFub255bW91c1R5cGUuYWxsb2NhdGlvbiA9IG5ldyBRdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbihhbm9ueW1vdXNUeXBlKTsgCi0JbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsKIAlwdXNoT25Bc3RTdGFjayhhbm9ueW1vdXNUeXBlKTsKIAogCWFsbG9jLnNvdXJjZUVuZCA9IHJQYXJlblBvczsgLy90aGUgcG9zaXRpb24gaGFzIGJlZW4gc3RvcmVkIGV4cGxpY2l0bHkKQEAgLTE4NDYsOCArMTk0MCw3IEBACiAJbGlzdExlbmd0aCA9IDA7IC8vIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgc3VwZXItaW50ZXJmYWNlcwogCS8vIHJlY292ZXJ5CiAJaWYgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpeyAKLQkJbGFzdENoZWNrUG9pbnQgPSBhbm9ueW1vdXNUeXBlLmJvZHlTdGFydDsKLQkJLy8gdGhlIHJlY292ZXJ5VG9rZW5DaGVjayB3aWxsIGRlYWwgd2l0aCB0aGUgb3BlbiBicmFjZQkJCisJCWxhc3RDaGVja1BvaW50ID0gYW5vbnltb3VzVHlwZS5ib2R5U3RhcnQ7CQkKIAkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5hZGQoYW5vbnltb3VzVHlwZSwgMCk7CiAJCWN1cnJlbnRUb2tlbiA9IDA7IC8vIG9wZW5pbmcgYnJhY2UgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQKIAkJbGFzdElnbm9yZWRUb2tlbiA9IC0xOwpAQCAtMTk3NSwxMCArMjA2OCwxNyBAQAogCS8vIHNvdXJjZSBlbmQgcG9zaXRpb24gb2YgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24KIAl2YXJpYWJsZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB2YXJpYWJsZURlY2wuaW5pdGlhbGl6YXRpb24uc291cmNlRW5kOwogCXZhcmlhYmxlRGVjbC5kZWNsYXJhdGlvbkVuZCA9IHZhcmlhYmxlRGVjbC5pbml0aWFsaXphdGlvbi5zb3VyY2VFbmQ7CisJCisJdGhpcy5yZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKSB7CiAJLy8gRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKIAkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwkKKwlBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGVEZWNsID0gKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKKwl2YXJpYWJsZURlY2wuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB2YXJpYWJsZURlY2wuZGVjbGFyYXRpb25FbmQ7CisJCisJdGhpcy5yZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKTsKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbihpbnQgZmxhZywgaW50IHJlY0ZsYWcpIHsKIApAQCAtMjA4OSw3ICsyMTg5LDkgQEAKIAlpZiAoY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgewogCQlsYXN0Q2hlY2tQb2ludCA9IGVuZFBvcyArIDE7CiAJCWlmIChjdXJyZW50RWxlbWVudC5wYXJlbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkKXsKLQkJCWN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50OworCQkJaWYgKCEoY3VycmVudEVsZW1lbnQgaW5zdGFuY2VvZiBSZWNvdmVyZWRJbml0aWFsaXplcikpIHsKKwkJCQljdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudDsKKwkJCX0KIAkJfQogCQlyZXN0YXJ0UmVjb3ZlcnkgPSB0cnVlOwogCX0KQEAgLTIxNjAsNiArMjI2MiwxMyBAQAogCQkJbGVuZ3RoKTsKIAl9CiB9Citwcm90ZWN0ZWQgdm9pZCBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKSB7CisJLy8gSW5zaWRlQ2FzdEV4cHJlc3Npb24gOjo9ICRlbXB0eQorfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uTEwxKCkgeworCS8vIEluc2lkZUNhc3RFeHByZXNzaW9uTEwxIDo6PSAkZW1wdHkKK30KKwogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKGludCBvcCkgewogCS8vIFJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnaW5zdGFuY2VvZicgUmVmZXJlbmNlVHlwZQogCS8vb3B0aW1pemUgdGhlIHB1c2gvcG9wCkBAIC0yMTg5LDggKzIyOTgsOCBAQAogCiAJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKFR5cGVEZWNsYXJhdGlvbikgYXN0U3RhY2tbYXN0UHRyXTsKIAkKLQkvLyBtYXJrIGZpZWxkcyBhbmQgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCi0JbWFya0ZpZWxkc1dpdGhMb2NhbFR5cGUodHlwZURlY2wpOworCS8vIG1hcmsgaW5pdGlhbGl6ZXJzIHdpdGggbG9jYWwgdHlwZSBtYXJrIGlmIG5lZWRlZAorCW1hcmtJbml0aWFsaXplcnNXaXRoTG9jYWxUeXBlKHR5cGVEZWNsKTsKIAogCS8vY29udmVydCBjb25zdHJ1Y3RvciB0aGF0IGRvIG5vdCBoYXZlIHRoZSB0eXBlJ3MgbmFtZSBpbnRvIG1ldGhvZHMKIAl0eXBlRGVjbC5jaGVja0NvbnN0cnVjdG9ycyh0aGlzKTsKQEAgLTIyNDcsNyArMjM1Niw3IEBACiAJfSBlbHNlIHsKIAkJLy8gUmVjb3JkIHRoYXQgdGhlIGJsb2NrIGhhcyBhIGRlY2xhcmF0aW9uIGZvciBsb2NhbCB0eXBlcwogCQl0eXBlRGVjbCA9IG5ldyBMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCW1hcmtDdXJyZW50TWV0aG9kV2l0aExvY2FsVHlwZSgpOworCQltYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpOwogCQlibG9ja1JlYWwoKTsKIAl9CiAKQEAgLTIyOTgsMTEgKzI0MDcsNiBAQAogCS8vIEludGVyZmFjZVR5cGVMaXN0IDo6PSBJbnRlcmZhY2VUeXBlTGlzdCAnLCcgSW50ZXJmYWNlVHlwZQogCW9wdGltaXplZENvbmNhdE5vZGVMaXN0cygpOwogfQotcHJvdGVjdGVkIHZvaWQgY29uc3VtZUxlZnRIYW5kU2lkZSgpIHsKLQkvLyBMZWZ0SGFuZFNpZGUgOjo9IE5hbWUKLQotCXB1c2hPbkV4cHJlc3Npb25TdGFjayhnZXRVbnNwZWNpZmllZFJlZmVyZW5jZU9wdGltaXplZCgpKTsKLX0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVMZWZ0UGFyZW4oKSB7CiAJLy8gUHVzaExQQVJFTiA6Oj0gJygnCiAJcHVzaE9uSW50U3RhY2sobFBhcmVuUG9zKTsKQEAgLTI1MjYsNyArMjYzMCw3IEBACiAJCW1kLnRocm93bkV4Y2VwdGlvbnMgPSBuZXcgVHlwZVJlZmVyZW5jZVtsZW5ndGhdLCAKIAkJMCwgCiAJCWxlbmd0aCk7Ci0JbWQuc291cmNlRW5kID0gCW1kLnRocm93bkV4Y2VwdGlvbnNbbGVuZ3RoLTFdLnNvdXJjZUVuZDsKKwltZC5zb3VyY2VFbmQgPSBtZC50aHJvd25FeGNlcHRpb25zW2xlbmd0aC0xXS5zb3VyY2VFbmQ7CiAJbWQuYm9keVN0YXJ0ID0gbWQudGhyb3duRXhjZXB0aW9uc1tsZW5ndGgtMV0uc291cmNlRW5kICsgMTsKIAlsaXN0TGVuZ3RoID0gMDsgLy8gcmVzZXQgbGlzdExlbmd0aCBhZnRlciBoYXZpbmcgcmVhZCBhbGwgdGhyb3duIGV4Y2VwdGlvbnMJCiAJLy8gcmVjb3ZlcnkKQEAgLTI1NDUsNyArMjY0OSw3IEBACiAJCShpbnQpICgobS5uYW1lU291cmNlUG9zaXRpb24gPSBpZGVudGlmaWVyUG9zaXRpb25TdGFja1tpZGVudGlmaWVyUHRyXSkgPj4+IDMyKTsgCiAJbS5zZWxlY3RvciA9IGlkZW50aWZpZXJTdGFja1tpZGVudGlmaWVyUHRyLS1dOwogCWlmIChpZGVudGlmaWVyTGVuZ3RoU3RhY2tbaWRlbnRpZmllckxlbmd0aFB0cl0gPT0gMSkgewotCQltLnJlY2VpdmVyID0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQ7CisJCW0ucmVjZWl2ZXIgPSBUaGlzUmVmZXJlbmNlLmltcGxpY2l0VGhpcygpOwogCQlpZGVudGlmaWVyTGVuZ3RoUHRyLS07CiAJfSBlbHNlIHsKIAkJaWRlbnRpZmllckxlbmd0aFN0YWNrW2lkZW50aWZpZXJMZW5ndGhQdHJdLS07CkBAIC0yNzE4LDcgKzI4MjIsMTEgQEAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheSgpIHsKIAkvLyBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gIFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIAotCXVwZGF0ZVNvdXJjZVBvc2l0aW9uKGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSk7CisJZmluYWwgRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwl1cGRhdGVTb3VyY2VQb3NpdGlvbihwYXJlbnRoZXNpemVkRXhwcmVzc2lvbik7CisJaW50IG51bWJlck9mUGFyZW50aGVzaXMgPSAocGFyZW50aGVzaXplZEV4cHJlc3Npb24uYml0cyAmIEFzdE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFzdE5vZGUuUGFyZW50aGVzaXplZFNISUZUOworCXBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmJpdHMgJj0gfkFzdE5vZGUuUGFyZW50aGVzaXplZE1BU0s7CisJcGFyZW50aGVzaXplZEV4cHJlc3Npb24uYml0cyB8PSAobnVtYmVyT2ZQYXJlbnRoZXNpcyArIDEpIDw8IEFzdE5vZGUuUGFyZW50aGVzaXplZFNISUZUOwogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCkgewogCS8vIFByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgJy4nICdjbGFzcycKQEAgLTI4MDAsODk3ICsyOTA4LDkwNyBAQAogCS8vIFB1c2hSUEFSRU4gOjo9ICcpJwogCXB1c2hPbkludFN0YWNrKHJQYXJlblBvcyk7CiB9Ci0JLy8gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBhdXRvbWF0aWMgZ2VuZXJhdGlvbiA6IGRvIE5PVCBlZGl0LW1vZGlmeSAgCi0JIC8vIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gYXV0b21hdGljIGdlbmVyYXRpb24gOiBkbyBOT1QgZWRpdC1tb2RpZnkgIAotCXByb3RlY3RlZCB2b2lkIGNvbnN1bWVSdWxlKGludCBhY3QpIHsKLQkgIHN3aXRjaCAoIGFjdCApIHsKLQkgICAgY2FzZSAyOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSA6Oj0gUHJpbWl0aXZlVHlwZSIpOwotCQkJICAgIGNvbnN1bWVQcmltaXRpdmVUeXBlKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWZlcmVuY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZSIpOwotCQkJICAgIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUXVhbGlmaWVkTmFtZSA6Oj0gTmFtZSBET1QgU2ltcGxlTmFtZSIpOwotCQkJICAgIGNvbnN1bWVRdWFsaWZpZWROYW1lKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDUzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxhdGlvblVuaXQgOjo9IEVudGVyQ29tcGlsYXRpb25Vbml0IFBhY2thZ2VEZWNsYXJhdGlvbm9wdCBJbXBvcnREZWNsYXJhdGlvbnNvcHQiKTsKLQkJCSAgICBjb25zdW1lQ29tcGlsYXRpb25Vbml0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbnRlckNvbXBpbGF0aW9uVW5pdCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRW50ZXJDb21waWxhdGlvblVuaXQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoSGVhZGVyIDo6PSBjYXRjaCBMUEFSRU4gRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiBMQlJBQ0UiKTsKLQkJCSAgICBjb25zdW1lQ2F0Y2hIZWFkZXIoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9ydERlY2xhcmF0aW9ucyA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIEltcG9ydERlY2xhcmF0aW9uIik7Ci0JCQkgICAgY29uc3VtZUltcG9ydERlY2xhcmF0aW9ucygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA3MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9ucyA6Oj0gVHlwZURlY2xhcmF0aW9ucyBUeXBlRGVjbGFyYXRpb24iKTsKLQkJCSAgICBjb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOwotCQkJICAgICBjb25zdW1lUGFja2FnZURlY2xhcmF0aW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDcyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYWNrYWdlRGVjbGFyYXRpb25OYW1lIDo6PSBwYWNrYWdlIE5hbWUiKTsKLQkJCSAgICAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbk5hbWUoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDc2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSBpbXBvcnQgTmFtZSIpOwotCQkJICAgIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDc3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbiA6Oj0gVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA3OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSBpbXBvcnQgTmFtZSBET1QgTVVMVElQTFkiKTsKLQkJCSAgICBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSA4MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uIDo6PSBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgOTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzRGVjbGFyYXRpb24gOjo9IENsYXNzSGVhZGVyIENsYXNzQm9keSIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0RlY2xhcmF0aW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDk2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlciA6Oj0gQ2xhc3NIZWFkZXJOYW1lIENsYXNzSGVhZGVyRXh0ZW5kc29wdCBDbGFzc0hlYWRlckltcGxlbWVudHNvcHQiKTsKLQkJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXIoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgOTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IGNsYXNzIElkZW50aWZpZXIiKTsKLQkJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXJOYW1lKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDk4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0hlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgQ2xhc3NUeXBlIik7Ci0JCQkgICAgY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA5OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXJJbXBsZW1lbnRzIDo6PSBpbXBsZW1lbnRzIEludGVyZmFjZVR5cGVMaXN0Iik7Ci0JCQkgICAgY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZVR5cGVMaXN0IDo6PSBJbnRlcmZhY2VUeXBlTGlzdCBDT01NQSBJbnRlcmZhY2VUeXBlIik7Ci0JCQkgICAgY29uc3VtZUludGVyZmFjZVR5cGVMaXN0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEwMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUiKTsKLQkJCSAgICBjb25zdW1lSW50ZXJmYWNlVHlwZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9ucyA6Oj0gQ2xhc3NCb2R5RGVjbGFyYXRpb25zIENsYXNzQm9keURlY2xhcmF0aW9uIik7Ci0JCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpZXQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZURpZXQoKTsgIAotCQkJCWJyZWFrIDsKLQkKLQkgICAgY2FzZSAxMTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluaXRpYWxpemVyIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVFbXB0eUNsYXNzTWVtYmVyRGVjbGFyYXRpb24oKTsgIAotCQkJCWJyZWFrIDsKLQkKLQkgICAgY2FzZSAxMTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgU0VNSUNPTE9OIik7Ci0JCQkgICAgY29uc3VtZUZpZWxkRGVjbGFyYXRpb24oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTIxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYXJpYWJsZURlY2xhcmF0b3JzIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JzIENPTU1BIFZhcmlhYmxlRGVjbGFyYXRvciIpOwotCQkJICAgIGNvbnN1bWVWYXJpYWJsZURlY2xhcmF0b3JzKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEyNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJWYXJpYWJsZSA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRW50ZXJWYXJpYWJsZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEyNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSIpOwotCQkJICAgIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JjZU5vRGlldCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRm9yY2VOb0RpZXQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTI4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXN0b3JlRGlldCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lUmVzdG9yZURpZXQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTMzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkiKTsKLQkJCSAgICAvLyBzZXQgdG8gdHJ1ZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGggYSBib2R5Ci0JICBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24odHJ1ZSk7ICAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBTRU1JQ09MT04iKTsKLQkJCSAgICAvLyBzZXQgdG8gZmFsc2UgdG8gY29uc3VtZSBhIG1ldGhvZCB3aXRob3V0IGJvZHkKLQkgIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEzNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIik7Ci0JCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlcigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxMzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIgOjo9IE1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMiKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEzNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hNb2RpZmllcnMgSWRlbnRpZmllciBMUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTM4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIElkZW50aWZpZXIgTFBBUkVOIik7Ci0JCQkgICAgY29uc3VtZU1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDEzOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgSWRlbnRpZmllciBMUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclBhcmFtZXRlcnMgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3RvcHQgUlBBUkVOIik7Ci0JCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlclBhcmFtZXRlcnMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTQxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgOjo9IERpbXNvcHQiKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE0MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlIDo6PSB0aHJvd3MgQ2xhc3NUeXBlTGlzdCIpOwotCQkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlciA6Oj0gQ29uc3RydWN0b3JIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMuLi4iKTsKLQkJCSAgICBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTQ0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBJZGVudGlmaWVyIExQQVJFTiIpOwotCQkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTQ2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0IDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0IENPTU1BIEZvcm1hbFBhcmFtZXRlciIpOwotCQkJICAgIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCIpOwotCQkJICAgIC8vIHRoZSBib29sZWFuIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgbW9kaWZpZXJzIHNob3VsZCBiZSByZXNldAotCSAJY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgQ09NTUEgQ2xhc3NUeXBlRWx0Iik7Ci0JCQkgICAgY29uc3VtZUNsYXNzVHlwZUxpc3QoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVFbHQgOjo9IENsYXNzVHlwZSIpOwotCQkJICAgIGNvbnN1bWVDbGFzc1R5cGVFbHQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTUxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RCb2R5IDo6PSBOZXN0ZWRNZXRob2QgTEJSQUNFIEJsb2NrU3RhdGVtZW50c29wdCBSQlJBQ0UiKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kQm9keSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5lc3RlZE1ldGhvZCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lTmVzdGVkTWV0aG9kKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljSW5pdGlhbGl6ZXIgOjo9IFN0YXRpY09ubHkgQmxvY2siKTsKLQkJCSAgICBjb25zdW1lU3RhdGljSW5pdGlhbGl6ZXIoKTsgIAotCQkJCWJyZWFrIDsKLQkKLQkgICAgY2FzZSAxNTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRpY09ubHkgOjo9IHN0YXRpYyIpOwotCQkJICAgIGNvbnN1bWVTdGF0aWNPbmx5KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE1NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5Iik7Ci0JCQkgICAgY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgU0VNSUNPTE9OIik7Ci0JCQkgICAgY29uc3VtZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yQm9keSA6Oj0gTmVzdGVkTWV0aG9kIExCUkFDRSBDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCBSQlJBQ0UiKTsKLQkJCSAgICBjb25zdW1lQ29uc3RydWN0b3JCb2R5KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE2MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgOjo9IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIEJsb2NrU3RhdGVtZW50cyIpOwotCQkJICAgICBjb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTYxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMCxFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTYyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gc3VwZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4gU0VNSUNPTE9OIik7Ci0JCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDAsRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNjMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCBzdXBlciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOwotCQkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigxLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE2NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7Ci0JCQkgICAgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDIsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTY1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1QgdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTi4uLiIpOwotCQkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigxLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTY2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSBET1QgdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTi4uLiIpOwotCQkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VEZWNsYXJhdGlvbiA6Oj0gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkiKTsKLQkJCSAgICBjb25zdW1lSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VIZWFkZXIgOjo9IEludGVyZmFjZUhlYWRlck5hbWUgSW50ZXJmYWNlSGVhZGVyRXh0ZW5kc29wdCIpOwotCQkJICAgIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTY5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgaW50ZXJmYWNlIElkZW50aWZpZXIiKTsKLQkJCSAgICBjb25zdW1lSW50ZXJmYWNlSGVhZGVyTmFtZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsKLQkJCSAgICBjb25zdW1lSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zLi4uIik7Ci0JCQkgICAgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBJbnZhbGlkTWV0aG9kRGVjbGFyYXRpb24iKTsKLQkJCSAgICBpZ25vcmVNZXRob2RCb2R5KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE3OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIENvbnN0cnVjdG9yQm9keSIpOwotCQkJICAgIGlnbm9yZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRydWUpOyAgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTgwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgU0VNSUNPTE9OIik7Ci0JCQkgICAgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oZmFsc2UpOyAgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTg2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgLG9wdCBSQlJBQ0UiKTsKLQkJCSAgICBjb25zdW1lRW1wdHlBcnJheUluaXRpYWxpemVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE4NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFZhcmlhYmxlSW5pdGlhbGl6ZXJzIFJCUkFDRSIpOwotCQkJICAgIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlJbml0aWFsaXplciA6Oj0gTEJSQUNFIFZhcmlhYmxlSW5pdGlhbGl6ZXJzIENPTU1BIFJCUkFDRSIpOwotCQkJICAgIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVJbml0aWFsaXplcnMgOjo9IFZhcmlhYmxlSW5pdGlhbGl6ZXJzIENPTU1BIFZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKLQkJCSAgICBjb25zdW1lVmFyaWFibGVJbml0aWFsaXplcnMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMTkxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9jayA6Oj0gT3BlbkJsb2NrIExCUkFDRSBCbG9ja1N0YXRlbWVudHNvcHQgUkJSQUNFIik7Ci0JCQkgICAgY29uc3VtZUJsb2NrKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE5MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbkJsb2NrIDo6PSIpOwotCQkJICAgIGNvbnN1bWVPcGVuQmxvY2soKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDE5NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnRzIDo6PSBCbG9ja1N0YXRlbWVudHMgQmxvY2tTdGF0ZW1lbnQiKTsKLQkJCSAgICBjb25zdW1lQmxvY2tTdGF0ZW1lbnRzKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxOTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50IDo6PSBJbnZhbGlkSW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKLQkJCSAgICBpZ25vcmVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAxOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA6Oj0gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzIik7Ci0JCQkgICAgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyMDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzIik7Ci0JCQkgICAgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyMDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hNb2RpZmllcnMgOjo9Iik7Ci0JCQkgICAgY29uc3VtZVB1c2hNb2RpZmllcnMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbXB0eVN0YXRlbWVudCA6Oj0gU0VNSUNPTE9OIik7Ci0JCQkgICAgY29uc3VtZUVtcHR5U3RhdGVtZW50KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDIyNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudCA6Oj0gSWRlbnRpZmllciBDT0xPTiBTdGF0ZW1lbnQiKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDIyOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWxlZFN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gSWRlbnRpZmllciBDT0xPTiBTdGF0ZW1lbnROb1Nob3J0SWYiKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSAyMjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb25TdGF0ZW1lbnQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb24gU0VNSUNPTE9OIik7Ci0JCQkgICAgY29uc3VtZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjM3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZlRoZW5TdGF0ZW1lbnQgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnQiKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjM4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSBpZiBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Tm9TaG9ydElmIGVsc2UuLi4iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyMzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYuLi4iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaFN0YXRlbWVudCA6Oj0gc3dpdGNoIE9wZW5CbG9jayBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3dpdGNoQmxvY2siKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50U3dpdGNoKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrIDo6PSBMQlJBQ0UgUkJSQUNFIik7Ci0JCQkgICAgY29uc3VtZUVtcHR5U3dpdGNoQmxvY2soKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI0NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2sgOjo9IExCUkFDRSBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgU3dpdGNoTGFiZWxzIFJCUkFDRSIpOwotCQkJICAgIGNvbnN1bWVTd2l0Y2hCbG9jaygpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjQ2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hCbG9ja1N0YXRlbWVudCIpOwotCQkJICAgIGNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudHMoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2tTdGF0ZW1lbnQgOjo9IFN3aXRjaExhYmVscyBCbG9ja1N0YXRlbWVudHMiKTsKLQkJCSAgICBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnQoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI0OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWxzIDo6PSBTd2l0Y2hMYWJlbHMgU3dpdGNoTGFiZWwiKTsKLQkJCSAgICBjb25zdW1lU3dpdGNoTGFiZWxzKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgMjUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbCA6Oj0gY2FzZSBDb25zdGFudEV4cHJlc3Npb24gQ09MT04iKTsKLQkJCSAgICBjb25zdW1lQ2FzZUxhYmVsKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSAyNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBkZWZhdWx0IENPTE9OIik7Ci0JCQkgICAgY29uc3VtZURlZmF1bHRMYWJlbCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoaWxlU3RhdGVtZW50IDo6PSB3aGlsZSBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Iik7Ci0JCQkgICAgY29uc3VtZVN0YXRlbWVudFdoaWxlKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoaWxlU3RhdGVtZW50Tm9TaG9ydElmIDo6PSB3aGlsZSBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Tm9TaG9ydElmIik7Ci0JCQkgICAgY29uc3VtZVN0YXRlbWVudFdoaWxlKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRvU3RhdGVtZW50IDo6PSBkbyBTdGF0ZW1lbnQgd2hpbGUgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnREbygpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjU1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnQgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdCBTRU1JQ09MT04gRXhwcmVzc2lvbm9wdCBTRU1JQ09MT04uLi4iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50Rm9yKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvclN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gZm9yIExQQVJFTiBGb3JJbml0b3B0IFNFTUlDT0xPTiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI1NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ySW5pdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QiKTsKLQkJCSAgICBjb25zdW1lRm9ySW5pdCgpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjYxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgQ09NTUEgU3RhdGVtZW50RXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCgpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjYyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NlcnRTdGF0ZW1lbnQgOjo9IGFzc2VydCBFeHByZXNzaW9uIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI2MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzZXJ0U3RhdGVtZW50IDo6PSBhc3NlcnQgRXhwcmVzc2lvbiBDT0xPTiBFeHByZXNzaW9uIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVBc3NlcnRTdGF0ZW1lbnQoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI2NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRCcmVhaygpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjY1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCcmVha1N0YXRlbWVudCA6Oj0gYnJlYWsgSWRlbnRpZmllciBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50QnJlYWtXaXRoTGFiZWwoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGludWVTdGF0ZW1lbnQgOjo9IGNvbnRpbnVlIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZSgpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgSWRlbnRpZmllciBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50Q29udGludWVXaXRoTGFiZWwoKSA7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuU3RhdGVtZW50IDo6PSByZXR1cm4gRXhwcmVzc2lvbm9wdCBTRU1JQ09MT04iKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50UmV0dXJuKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93U3RhdGVtZW50IDo6PSB0aHJvdyBFeHByZXNzaW9uIFNFTUlDT0xPTiIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUaHJvdygpOwotCSAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI3MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3luY2hyb25pemVkU3RhdGVtZW50IDo6PSBPbmx5U3luY2hyb25pemVkIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBCbG9jayIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjcxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbmx5U3luY2hyb25pemVkIDo6PSBzeW5jaHJvbml6ZWQiKTsKLQkJCSAgICBjb25zdW1lT25seVN5bmNocm9uaXplZCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXMiKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KGZhbHNlKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjczIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUcnlTdGF0ZW1lbnQgOjo9IHRyeSBCbG9jayBDYXRjaGVzb3B0IEZpbmFsbHkiKTsKLQkJCSAgICBjb25zdW1lU3RhdGVtZW50VHJ5KHRydWUpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoZXMgOjo9IENhdGNoZXMgQ2F0Y2hDbGF1c2UiKTsKLQkJCSAgICBjb25zdW1lQ2F0Y2hlcygpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyNzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoQ2xhdXNlIDo6PSBjYXRjaCBMUEFSRU4gRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiBCbG9jayIpOwotCQkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjc4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoTFBBUkVOIDo6PSBMUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lTGVmdFBhcmVuKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI3OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVzaFJQQVJFTiA6Oj0gUlBBUkVOIik7Ci0JCQkgICAgY29uc3VtZVJpZ2h0UGFyZW4oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjgzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gdGhpcyIpOwotCQkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheVRoaXMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjg0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjg3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1QgdGhpcyIpOwotCQkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVUaGlzKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIHN1cGVyIik7Ci0JCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVN1cGVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI4OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIGNsYXNzIik7Ci0JCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgRE9UIGNsYXNzIik7Ci0JCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDI5MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgRE9UIGNsYXNzIik7Ci0JCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5UHJpbWl0aXZlVHlwZSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFsbG9jYXRpb25IZWFkZXIgOjo9IG5ldyBDbGFzc1R5cGUgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lQWxsb2NhdGlvbkhlYWRlcigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IG5ldyBDbGFzc1R5cGUgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4uLi4iKTsKLQkJCSAgICBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IFByaW1hcnkgRE9UIG5ldyBTaW1wbGVOYW1lIExQQVJFTi4uLiIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIG5ldy4uLiIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUXVhbGlmaWVkKCkgOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAyOTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIDo6PSBOYW1lIERPVCIpOwotCQkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSgpIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMjk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUNsYXNzQm9keW9wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IDo6PSIpOwotCQkJICAgIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMDMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50TGlzdCA6Oj0gQXJndW1lbnRMaXN0IENPTU1BIEV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMwNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9IG5ldyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycy4uLiIpOwotCQkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzLi4uIik7Ci0JCQkgICAgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMwNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGltV2l0aE9yV2l0aE91dEV4cHJzIDo6PSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgRGltV2l0aE9yV2l0aE91dEV4cHIiKTsKLQkJCSAgICBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHJzKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSAzMDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHByIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOwotCQkJICAgIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgMzEwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaW1zIDo6PSBEaW1zTG9vcCIpOwotCQkJICAgIGNvbnN1bWVEaW1zKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSAzMTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZURpbUxvb3AgOjo9IExCUkFDS0VUIFJCUkFDS0VUIik7Ci0JCQkgICAgY29uc3VtZU9uZURpbUxvb3AoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzE0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciIpOwotCQkJICAgIGNvbnN1bWVGaWVsZEFjY2VzcyhmYWxzZSk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMxNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmllbGRBY2Nlc3MgOjo9IHN1cGVyIERPVCBJZGVudGlmaWVyIik7Ci0JCQkgICAgY29uc3VtZUZpZWxkQWNjZXNzKHRydWUpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMTYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzE3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCBJZGVudGlmaWVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7Ci0JCQkgICAgY29uc3VtZU1ldGhvZEludm9jYXRpb25QcmltYXJ5KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMxOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kSW52b2NhdGlvbiA6Oj0gc3VwZXIgRE9UIElkZW50aWZpZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsKLQkJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMxOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlBY2Nlc3MgOjo9IE5hbWUgTEJSQUNLRVQgRXhwcmVzc2lvbiBSQlJBQ0tFVCIpOwotCQkJICAgIGNvbnN1bWVBcnJheUFjY2Vzcyh0cnVlKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzIwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gUHJpbWFyeU5vTmV3QXJyYXkgTEJSQUNLRVQgRXhwcmVzc2lvbiBSQlJBQ0tFVCIpOwotCQkJICAgIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMyMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGZpeEV4cHJlc3Npb24gOjo9IE5hbWUiKTsKLQkJCSAgICBjb25zdW1lUG9zdGZpeEV4cHJlc3Npb24oKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzI1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gUExVU19QTFVTIik7Ci0JCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyx0cnVlKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQb3N0RGVjcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gTUlOVVNfTUlOVVMiKTsKLQkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyx0cnVlKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUG9zaXRpb24gOjo9Iik7Ci0JCQkgICAgY29uc3VtZVB1c2hQb3NpdGlvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMzAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbiA6Oj0gUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMzMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uIDo6PSBNSU5VUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBMVVNfUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyxmYWxzZSk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDMzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlRGVjcmVtZW50RXhwcmVzc2lvbiA6Oj0gTUlOVVNfTUlOVVMgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTLGZhbHNlKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzM2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9IFRXSURETEUgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlRXSURETEUpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gTk9UIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5OT1QpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzMzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIFByaW1pdGl2ZVR5cGUgRGltc29wdCBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgRGltcyBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyIpOwotCQkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMiKTsKLQkJCSAgICBjb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBNVUxUSVBMWSBVbmFyeUV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTVVMVElQTFkpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIERJVklERSBVbmFyeUV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRElWSURFKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzQ1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBSRU1BSU5ERVIgVW5hcnlFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlJFTUFJTkRFUik7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gUExVUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM0OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gTUlOVVMgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBMRUZUX1NISUZUIEFkZGl0aXZlRXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRUZUX1NISUZUKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzUxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBSSUdIVF9TSElGVCBBZGRpdGl2ZUV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUklHSFRfU0hJRlQpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uIFVOU0lHTkVEX1JJR0hUX1NISUZUIEFkZGl0aXZlRXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5VTlNJR05FRF9SSUdIVF9TSElGVCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIExFU1MgU2hpZnRFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFU1MpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBHUkVBVEVSIFNoaWZ0RXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5HUkVBVEVSKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzU2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gTEVTU19FUVVBTCBTaGlmdEV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTU19FUVVBTCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM1NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uIEdSRUFURVJfRVFVQUwgU2hpZnRFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVJfRVFVQUwpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFJlZmVyZW5jZVR5cGUiKTsKLQkJCSAgICBjb25zdW1lSW5zdGFuY2VPZkV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLklOU1RBTkNFT0YpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVxdWFsaXR5RXhwcmVzc2lvbiA6Oj0gRXF1YWxpdHlFeHByZXNzaW9uIEVRVUFMX0VRVUFMIFJlbGF0aW9uYWxFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRVFVQUxfRVFVQUwpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVxdWFsaXR5RXhwcmVzc2lvbiA6Oj0gRXF1YWxpdHlFeHByZXNzaW9uIE5PVF9FUVVBTCBSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOwotCQkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVF9FUVVBTCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM2MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQW5kRXhwcmVzc2lvbiA6Oj0gQW5kRXhwcmVzc2lvbiBBTkQgRXF1YWxpdHlFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkFORCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM2NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBFeGNsdXNpdmVPckV4cHJlc3Npb24gWE9SIEFuZEV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uWE9SKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbmNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEluY2x1c2l2ZU9yRXhwcmVzc2lvbiBPUiBFeGNsdXNpdmVPckV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1IpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIEFORF9BTkQgSW5jbHVzaXZlT3JFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkFORF9BTkQpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsT3JFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiBPUl9PUiBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24iKTsKLQkJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1JfT1IpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gUVVFU1RJT04gRXhwcmVzc2lvbiBDT0xPTi4uLiIpOwotCQkJICAgIGNvbnN1bWVDb25kaXRpb25hbEV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlFVRVNUSU9OQ09MT04pIDsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzc2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50IDo6PSBMZWZ0SGFuZFNpZGUgQXNzaWdubWVudE9wZXJhdG9yIEFzc2lnbm1lbnRFeHByZXNzaW9uIik7Ci0JCQkgICAgY29uc3VtZUFzc2lnbm1lbnQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzc4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50IDo6PSBJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50Iik7Ci0JCQkgICAgaWdub3JlRXhwcmVzc2lvbkFzc2lnbm1lbnQoKTsgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzNzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxlZnRIYW5kU2lkZSA6Oj0gTmFtZSIpOwotCQkJICAgIGNvbnN1bWVMZWZ0SGFuZFNpZGUoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzgyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IEVRVUFMIik7Ci0JCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihFUVVBTCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM4MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBNVUxUSVBMWV9FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTVVMVElQTFkpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzODQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRElWSURFX0VRVUFMIik7Ci0JCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihESVZJREUpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzODUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gUkVNQUlOREVSX0VRVUFMIik7Ci0JCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gUExVU19FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUExVUyk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM4NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBNSU5VU19FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTUlOVVMpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzODggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gTEVGVF9TSElGVF9FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTEVGVF9TSElGVCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDM4OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSSUdIVF9TSElGVF9FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUklHSFRfU0hJRlQpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSAzOTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwiKTsKLQkJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFVOU0lHTkVEX1JJR0hUX1NISUZUKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzkxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IEFORF9FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoQU5EKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzkyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFhPUl9FUVVBTCIpOwotCQkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoWE9SKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgMzkzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE9SX0VRVUFMIik7Ci0JCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihPUik7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDQwMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwcmVzc2lvbm9wdCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRW1wdHlFeHByZXNzaW9uKCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDQwNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zb3B0IDo6PSIpOwotCQkJICAgIGNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA0MDUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIik7Ci0JCQkgICAgY29uc3VtZUltcG9ydERlY2xhcmF0aW9uc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA0MDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbnNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5VHlwZURlY2xhcmF0aW9uc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA0MDcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbnNvcHQgOjo9IFR5cGVEZWNsYXJhdGlvbnMiKTsKLQkJCSAgICBjb25zdW1lVHlwZURlY2xhcmF0aW9uc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgY2FzZSA0MDggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNDA5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUgQ2xhc3NCb2R5RGVjbGFyYXRpb25zIik7Ci0JCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgNDEwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllcnNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZURlZmF1bHRNb2RpZmllcnMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNDExIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllcnNvcHQgOjo9IE1vZGlmaWVycyIpOwotCQkJICAgIGNvbnN1bWVNb2RpZmllcnMoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JICAgIGNhc2UgNDEyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJCbG9ja1N0YXRlbWVudHNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5QmxvY2tTdGF0ZW1lbnRzb3B0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSA0MTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5RGltc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgNDE2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3RvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5QXJndW1lbnRMaXN0b3B0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDQyMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCA6Oj0iKTsKLQkJCSAgICBjb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgNDI0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSA0MjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMiKTsKLQkJCSAgICBjb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICBjYXNlIDQyNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkVHlwZSA6Oj0iKTsKLQkJCSAgICBjb25zdW1lTmVzdGVkVHlwZSgpOyAgCi0JCQkJYnJlYWsgOwotCQotCSAgICAgY2FzZSA0MjcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXRvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5Rm9ySW5pdG9wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgNDI5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JVcGRhdGVvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5Rm9yVXBkYXRlb3B0KCk7ICAKLQkJCQlicmVhayA7Ci0JIAotCSAgICAgY2FzZSA0MzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoZXNvcHQgOjo9Iik7Ci0JCQkgICAgY29uc3VtZUVtcHR5Q2F0Y2hlc29wdCgpOyAgCi0JCQkJYnJlYWsgOwotCSAKLQkgICAgIGNhc2UgNDM1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyb3B0IDo6PSIpOwotCQkJICAgIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXJvcHQoKTsgIAotCQkJCWJyZWFrIDsKLQkgCi0JCX0KLQl9IAogCisgLy8gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBhdXRvbWF0aWMgZ2VuZXJhdGlvbiA6IGRvIE5PVCBlZGl0LW1vZGlmeSAgCitwcm90ZWN0ZWQgdm9pZCBjb25zdW1lUnVsZShpbnQgYWN0KSB7CisgIHN3aXRjaCAoIGFjdCApIHsKKyAgICBjYXNlIDI5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDo6PSBQcmltaXRpdmVUeXBlIik7CisJCSAgICBjb25zdW1lUHJpbWl0aXZlVHlwZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVmZXJlbmNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUiKTsKKwkJICAgIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA1MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUXVhbGlmaWVkTmFtZSA6Oj0gTmFtZSBET1QgU2ltcGxlTmFtZSIpOworCQkgICAgY29uc3VtZVF1YWxpZmllZE5hbWUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGF0aW9uVW5pdCA6Oj0gRW50ZXJDb21waWxhdGlvblVuaXQgUGFja2FnZURlY2xhcmF0aW9ub3B0IEltcG9ydERlY2xhcmF0aW9uc29wdCIpOworCQkgICAgY29uc3VtZUNvbXBpbGF0aW9uVW5pdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJDb21waWxhdGlvblVuaXQgOjo9Iik7CisJCSAgICBjb25zdW1lRW50ZXJDb21waWxhdGlvblVuaXQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoSGVhZGVyIDo6PSBjYXRjaCBMUEFSRU4gRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiBMQlJBQ0UiKTsKKwkJICAgIGNvbnN1bWVDYXRjaEhlYWRlcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA2OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgSW1wb3J0RGVjbGFyYXRpb24iKTsKKwkJICAgIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNzAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVEZWNsYXJhdGlvbnMgOjo9IFR5cGVEZWNsYXJhdGlvbnMgVHlwZURlY2xhcmF0aW9uIik7CisJCSAgICBjb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lIFNFTUlDT0xPTiIpOworCQkgICAgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhY2thZ2VEZWNsYXJhdGlvbk5hbWUgOjo9IHBhY2thZ2UgTmFtZSIpOworCQkgICAgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDc1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24gOjo9IFNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDc2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSBpbXBvcnQgTmFtZSIpOworCQkgICAgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PSBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSA6Oj0gaW1wb3J0IE5hbWUgRE9UIE1VTFRJUExZIik7CisJCSAgICBjb25zdW1lVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSA4MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uIDo6PSBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NEZWNsYXJhdGlvbiA6Oj0gQ2xhc3NIZWFkZXIgQ2xhc3NCb2R5Iik7CisJCSAgICBjb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA5NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NIZWFkZXIgOjo9IENsYXNzSGVhZGVyTmFtZSBDbGFzc0hlYWRlckV4dGVuZHNvcHQgQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0Iik7CisJCSAgICBjb25zdW1lQ2xhc3NIZWFkZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgOTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IGNsYXNzIElkZW50aWZpZXIiKTsKKwkJICAgIGNvbnN1bWVDbGFzc0hlYWRlck5hbWUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgOTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVyRXh0ZW5kcyA6Oj0gZXh0ZW5kcyBDbGFzc1R5cGUiKTsKKwkJICAgIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgOTkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSGVhZGVySW1wbGVtZW50cyA6Oj0gaW1wbGVtZW50cyBJbnRlcmZhY2VUeXBlTGlzdCIpOworCQkgICAgY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZVR5cGVMaXN0IDo6PSBJbnRlcmZhY2VUeXBlTGlzdCBDT01NQSBJbnRlcmZhY2VUeXBlIik7CisJCSAgICBjb25zdW1lSW50ZXJmYWNlVHlwZUxpc3QoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTAyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VUeXBlIDo6PSBDbGFzc09ySW50ZXJmYWNlVHlwZSIpOworCQkgICAgY29uc3VtZUludGVyZmFjZVR5cGUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTA1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlEZWNsYXJhdGlvbnMgOjo9IENsYXNzQm9keURlY2xhcmF0aW9ucyBDbGFzc0JvZHlEZWNsYXJhdGlvbiIpOworCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMDkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jayIpOworCQkgICAgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDExMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRGlldCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVEaWV0KCk7ICAKKwkJCWJyZWFrIDsKKworICAgIGNhc2UgMTExIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbml0aWFsaXplciA6Oj0gRGlldCBOZXN0ZWRNZXRob2QgQmxvY2siKTsKKwkJICAgIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMTggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzTWVtYmVyRGVjbGFyYXRpb24gOjo9IFNFTUlDT0xPTiIpOworCQkgICAgY29uc3VtZUVtcHR5Q2xhc3NNZW1iZXJEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisKKyAgICBjYXNlIDExOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmllbGREZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVGaWVsZERlY2xhcmF0aW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDEyMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVEZWNsYXJhdG9ycyA6Oj0gVmFyaWFibGVEZWNsYXJhdG9ycyBDT01NQSBWYXJpYWJsZURlY2xhcmF0b3IiKTsKKwkJICAgIGNvbnN1bWVWYXJpYWJsZURlY2xhcmF0b3JzKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDEyNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJWYXJpYWJsZSA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbnRlclZhcmlhYmxlKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDEyNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uIDo6PSIpOworCQkgICAgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JjZU5vRGlldCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVGb3JjZU5vRGlldCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3RvcmVEaWV0IDo6PSIpOworCQkgICAgY29uc3VtZVJlc3RvcmVEaWV0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDEzMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBNZXRob2RCb2R5Iik7CisJCSAgICAvLyBzZXQgdG8gdHJ1ZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGggYSBib2R5CisJCQljb25zdW1lTWV0aG9kRGVjbGFyYXRpb24odHJ1ZSk7ICAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMzQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBTRU1JQ09MT04iKTsKKwkJICAgIC8vIHNldCB0byBmYWxzZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGhvdXQgYm9keQorCQkJY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKGZhbHNlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTM1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RIZWFkZXIgOjo9IE1ldGhvZEhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMiKTsKKwkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTM2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIDo6PSBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIik7CisJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDEzNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hNb2RpZmllcnMgSWRlbnRpZmllciBMUEFSRU4iKTsKKwkJICAgIGNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgSWRlbnRpZmllciBMUEFSRU4iKTsKKwkJICAgIGNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxMzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCBUeXBlIElkZW50aWZpZXIgTFBBUkVOIik7CisJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNDAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclBhcmFtZXRlcnMgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3RvcHQgUlBBUkVOIik7CisJCSAgICBjb25zdW1lTWV0aG9kSGVhZGVyUGFyYW1ldGVycygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyA6Oj0gRGltc29wdCIpOworCQkgICAgY29uc3VtZU1ldGhvZEhlYWRlckV4dGVuZGVkRGltcygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNDIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gdGhyb3dzIENsYXNzVHlwZUxpc3QiKTsKKwkJICAgIGNvbnN1bWVNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTQzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3RvckhlYWRlciA6Oj0gQ29uc3RydWN0b3JIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMuLi4iKTsKKwkJICAgIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IElkZW50aWZpZXIgTFBBUkVOIik7CisJCSAgICBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXJOYW1lKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE0NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyTGlzdCA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdCBDT01NQSBGb3JtYWxQYXJhbWV0ZXIiKTsKKwkJICAgIGNvbnN1bWVGb3JtYWxQYXJhbWV0ZXJMaXN0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZCIpOworCQkgICAgLy8gdGhlIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBtb2RpZmllcnMgc2hvdWxkIGJlIHJlc2V0CisgCWNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTQ5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVMaXN0IDo6PSBDbGFzc1R5cGVMaXN0IENPTU1BIENsYXNzVHlwZUVsdCIpOworCQkgICAgY29uc3VtZUNsYXNzVHlwZUxpc3QoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTUwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc1R5cGVFbHQgOjo9IENsYXNzVHlwZSIpOworCQkgICAgY29uc3VtZUNsYXNzVHlwZUVsdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCBMQlJBQ0UgQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOworCQkgICAgY29uc3VtZU1ldGhvZEJvZHkoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTUyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXN0ZWRNZXRob2QgOjo9Iik7CisJCSAgICBjb25zdW1lTmVzdGVkTWV0aG9kKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljSW5pdGlhbGl6ZXIgOjo9IFN0YXRpY09ubHkgQmxvY2siKTsKKwkJICAgIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOyAgCisJCQlicmVhayA7CisKKyAgICBjYXNlIDE1NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGljT25seSA6Oj0gc3RhdGljIik7CisJCSAgICBjb25zdW1lU3RhdGljT25seSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIENvbnN0cnVjdG9yQm9keSIpOworCQkgICAgY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE1NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgTEJSQUNFIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IFJCUkFDRSIpOworCQkgICAgY29uc3VtZUNvbnN0cnVjdG9yQm9keSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IDo6PSBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiBCbG9ja1N0YXRlbWVudHMiKTsKKwkJICAgICBjb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTYxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gdGhpcyBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBzdXBlciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTYzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSBET1Qgc3VwZXIgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4iKTsKKwkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigxLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE2NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHN1cGVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7CisJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCB0aGlzIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7CisJCSAgICBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgRE9UIHRoaXMgTFBBUkVOIEFyZ3VtZW50TGlzdG9wdCBSUEFSRU4uLi4iKTsKKwkJICAgIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VEZWNsYXJhdGlvbiA6Oj0gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkiKTsKKwkJICAgIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlciA6Oj0gSW50ZXJmYWNlSGVhZGVyTmFtZSBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzb3B0Iik7CisJCSAgICBjb25zdW1lSW50ZXJmYWNlSGVhZGVyKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE2OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IGludGVyZmFjZSBJZGVudGlmaWVyIik7CisJCSAgICBjb25zdW1lSW50ZXJmYWNlSGVhZGVyTmFtZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNzEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZUhlYWRlckV4dGVuZHMgOjo9IGV4dGVuZHMgSW50ZXJmYWNlVHlwZUxpc3QiKTsKKwkJICAgIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJFeHRlbmRzKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE3NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIDo6PSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMuLi4iKTsKKwkJICAgIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTc1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSBJbnZhbGlkTWV0aG9kRGVjbGFyYXRpb24iKTsKKwkJICAgIGlnbm9yZU1ldGhvZEJvZHkoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTc5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5Iik7CisJCSAgICBpZ25vcmVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0cnVlKTsgICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE4MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyIFNFTUlDT0xPTiIpOworCQkgICAgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oZmFsc2UpOyAgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTg2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgLG9wdCBSQlJBQ0UiKTsKKwkJICAgIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTg3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUluaXRpYWxpemVyIDo6PSBMQlJBQ0UgVmFyaWFibGVJbml0aWFsaXplcnMgUkJSQUNFIik7CisJCSAgICBjb25zdW1lQXJyYXlJbml0aWFsaXplcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxODggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5SW5pdGlhbGl6ZXIgOjo9IExCUkFDRSBWYXJpYWJsZUluaXRpYWxpemVycyBDT01NQSBSQlJBQ0UiKTsKKwkJICAgIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFyaWFibGVJbml0aWFsaXplcnMgOjo9IFZhcmlhYmxlSW5pdGlhbGl6ZXJzIENPTU1BIFZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKKwkJICAgIGNvbnN1bWVWYXJpYWJsZUluaXRpYWxpemVycygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxOTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrIDo6PSBPcGVuQmxvY2sgTEJSQUNFIEJsb2NrU3RhdGVtZW50c29wdCBSQlJBQ0UiKTsKKwkJICAgIGNvbnN1bWVCbG9jaygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAxOTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9wZW5CbG9jayA6Oj0iKTsKKwkJICAgIGNvbnN1bWVPcGVuQmxvY2soKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE5NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnRzIDo6PSBCbG9ja1N0YXRlbWVudHMgQmxvY2tTdGF0ZW1lbnQiKTsKKwkJICAgIGNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDE5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworCQkgICAgaWdub3JlSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMTk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgOjo9IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzIik7CisJCSAgICBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDIwMSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMiKTsKKwkJICAgIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjAyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoTW9kaWZpZXJzIDo6PSIpOworCQkgICAgY29uc3VtZVB1c2hNb2RpZmllcnMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjI2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbXB0eVN0YXRlbWVudCA6Oj0gU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lRW1wdHlTdGF0ZW1lbnQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjI3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJMYWJlbGVkU3RhdGVtZW50IDo6PSBJZGVudGlmaWVyIENPTE9OIFN0YXRlbWVudCIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudExhYmVsKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyMjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IElkZW50aWZpZXIgQ09MT04gU3RhdGVtZW50Tm9TaG9ydElmIik7CisJCSAgICBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSAyMjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb25TdGF0ZW1lbnQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb24gU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlblN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudCIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDIzOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSWZUaGVuRWxzZVN0YXRlbWVudCA6Oj0gaWYgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIFN0YXRlbWVudE5vU2hvcnRJZiBlbHNlLi4uIik7CisJCSAgICBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyMzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IGlmIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYuLi4iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoU3RhdGVtZW50IDo6PSBzd2l0Y2ggT3BlbkJsb2NrIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTd2l0Y2hCbG9jayIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjQxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hCbG9jayA6Oj0gTEJSQUNFIFJCUkFDRSIpOworCQkgICAgY29uc3VtZUVtcHR5U3dpdGNoQmxvY2soKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI0NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoQmxvY2sgOjo9IExCUkFDRSBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgU3dpdGNoTGFiZWxzIFJCUkFDRSIpOworCQkgICAgY29uc3VtZVN3aXRjaEJsb2NrKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50cyA6Oj0gU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaEJsb2NrU3RhdGVtZW50Iik7CisJCSAgICBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnRzKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNDcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaEJsb2NrU3RhdGVtZW50IDo6PSBTd2l0Y2hMYWJlbHMgQmxvY2tTdGF0ZW1lbnRzIik7CisJCSAgICBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnQoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI0OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoTGFiZWxzIDo6PSBTd2l0Y2hMYWJlbHMgU3dpdGNoTGFiZWwiKTsKKwkJICAgIGNvbnN1bWVTd2l0Y2hMYWJlbHMoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSAyNTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaExhYmVsIDo6PSBjYXNlIENvbnN0YW50RXhwcmVzc2lvbiBDT0xPTiIpOworCQkgICAgY29uc3VtZUNhc2VMYWJlbCgpOyAgCisJCQlicmVhayA7CisgCisgICAgIGNhc2UgMjUxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hMYWJlbCA6Oj0gZGVmYXVsdCBDT0xPTiIpOworCQkgICAgY29uc3VtZURlZmF1bHRMYWJlbCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoaWxlU3RhdGVtZW50IDo6PSB3aGlsZSBMUEFSRU4gRXhwcmVzc2lvbiBSUEFSRU4gU3RhdGVtZW50Iik7CisJCSAgICBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYgOjo9IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTdGF0ZW1lbnROb1Nob3J0SWYiKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb1N0YXRlbWVudCA6Oj0gZG8gU3RhdGVtZW50IHdoaWxlIExQQVJFTiBFeHByZXNzaW9uIFJQQVJFTiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnREbygpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjU1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JTdGF0ZW1lbnQgOjo9IGZvciBMUEFSRU4gRm9ySW5pdG9wdCBTRU1JQ09MT04gRXhwcmVzc2lvbm9wdCBTRU1JQ09MT04uLi4iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSBmb3IgTFBBUkVOIEZvckluaXRvcHQgU0VNSUNPTE9OIEV4cHJlc3Npb25vcHQgU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lU3RhdGVtZW50Rm9yKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvckluaXQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0Iik7CisJCSAgICBjb25zdW1lRm9ySW5pdCgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjYxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgQ09NTUEgU3RhdGVtZW50RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudEV4cHJlc3Npb25MaXN0KCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gU0VNSUNPTE9OIik7CisJCSAgICBjb25zdW1lU2ltcGxlQXNzZXJ0U3RhdGVtZW50KCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNjMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydFN0YXRlbWVudCA6Oj0gYXNzZXJ0IEV4cHJlc3Npb24gQ09MT04gRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVBc3NlcnRTdGF0ZW1lbnQoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI2NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnJlYWtTdGF0ZW1lbnQgOjo9IGJyZWFrIFNFTUlDT0xPTiIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudEJyZWFrKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNjUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJyZWFrU3RhdGVtZW50IDo6PSBicmVhayBJZGVudGlmaWVyIFNFTUlDT0xPTiIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudEJyZWFrV2l0aExhYmVsKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNjYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRpbnVlU3RhdGVtZW50IDo6PSBjb250aW51ZSBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZSgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb250aW51ZVN0YXRlbWVudCA6Oj0gY29udGludWUgSWRlbnRpZmllciBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRDb250aW51ZVdpdGhMYWJlbCgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjY4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5TdGF0ZW1lbnQgOjo9IHJldHVybiBFeHByZXNzaW9ub3B0IFNFTUlDT0xPTiIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudFJldHVybigpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjY5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaHJvd1N0YXRlbWVudCA6Oj0gdGhyb3cgRXhwcmVzc2lvbiBTRU1JQ09MT04iKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUaHJvdygpOworIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjcwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgTFBBUkVOIEV4cHJlc3Npb24gUlBBUkVOIEJsb2NrIik7CisJCSAgICBjb25zdW1lU3RhdGVtZW50U3luY2hyb25pemVkKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI3MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT25seVN5bmNocm9uaXplZCA6Oj0gc3luY2hyb25pemVkIik7CisJCSAgICBjb25zdW1lT25seVN5bmNocm9uaXplZCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNzIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXMiKTsKKwkJICAgIGNvbnN1bWVTdGF0ZW1lbnRUcnkoZmFsc2UpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNzMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeVN0YXRlbWVudCA6Oj0gdHJ5IEJsb2NrIENhdGNoZXNvcHQgRmluYWxseSIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudFRyeSh0cnVlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjc1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYXRjaGVzIDo6PSBDYXRjaGVzIENhdGNoQ2xhdXNlIik7CisJCSAgICBjb25zdW1lQ2F0Y2hlcygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNzYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGNoQ2xhdXNlIDo6PSBjYXRjaCBMUEFSRU4gRm9ybWFsUGFyYW1ldGVyIFJQQVJFTiBCbG9jayIpOworCQkgICAgY29uc3VtZVN0YXRlbWVudENhdGNoKCkgOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNzggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hMUEFSRU4gOjo9IExQQVJFTiIpOworCQkgICAgY29uc3VtZUxlZnRQYXJlbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyNzkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlB1c2hSUEFSRU4gOjo9IFJQQVJFTiIpOworCQkgICAgY29uc3VtZVJpZ2h0UGFyZW4oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjg0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gdGhpcyIpOworCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5VGhpcygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyODUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW1hcnlOb05ld0FycmF5IDo6PSBQdXNoTFBBUkVOIEV4cHJlc3Npb24gUHVzaFJQQVJFTiIpOworCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIHRoaXMiKTsKKwkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVUaGlzKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI4OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgRE9UIHN1cGVyIik7CisJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlOYW1lU3VwZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjkwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSBET1QgY2xhc3MiKTsKKwkJICAgIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjkxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gQXJyYXlUeXBlIERPVCBjbGFzcyIpOworCQkgICAgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI5MiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbWFyeU5vTmV3QXJyYXkgOjo9IFByaW1pdGl2ZVR5cGUgRE9UIGNsYXNzIik7CisJCSAgICBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb2NhdGlvbkhlYWRlciA6Oj0gbmV3IENsYXNzVHlwZSBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOworCQkgICAgY29uc3VtZUFsbG9jYXRpb25IZWFkZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjk2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBuZXcgQ2xhc3NUeXBlIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOLi4uIik7CisJCSAgICBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAyOTcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IFByaW1hcnkgRE9UIG5ldyBTaW1wbGVOYW1lIExQQVJFTi4uLiIpOworCQkgICAgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDI5OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUgbmV3Li4uIik7CisJCSAgICBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMjk5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSA6Oj0gTmFtZSBET1QiKTsKKwkJICAgIGNvbnN1bWVDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSgpIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzAwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0JvZHlvcHQgOjo9Iik7CisJCSAgICBjb25zdW1lQ2xhc3NCb2R5b3B0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMwMiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkgOjo9Iik7CisJCSAgICBjb25zdW1lRW50ZXJBbm9ueW1vdXNDbGFzc0JvZHkoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzA0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCBDT01NQSBFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMwNSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbldpdGhvdXRBcnJheUluaXRpYWxpemVyIDo6PSBuZXcgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMiKTsKKwkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplciA6Oj0gbmV3IFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzLi4uIik7CisJCSAgICBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRoSW5pdGlhbGl6ZXIoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzA3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIgOjo9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZS4uLiIpOworCQkgICAgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aG91dEluaXRpYWxpemVyKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMwOCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUuLi4iKTsKKwkJICAgIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMTAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByIik7CisJCSAgICBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHJzKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSAzMTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbVdpdGhPcldpdGhPdXRFeHByIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOworCQkgICAgY29uc3VtZURpbVdpdGhPcldpdGhPdXRFeHByKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSAzMTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpbXMgOjo9IERpbXNMb29wIik7CisJCSAgICBjb25zdW1lRGltcygpOyAgCisJCQlicmVhayA7CisgCisgICAgIGNhc2UgMzE2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJPbmVEaW1Mb29wIDo6PSBMQlJBQ0tFVCBSQlJBQ0tFVCIpOworCQkgICAgY29uc3VtZU9uZURpbUxvb3AoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzE3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gUHJpbWFyeSBET1QgSWRlbnRpZmllciIpOworCQkgICAgY29uc3VtZUZpZWxkQWNjZXNzKGZhbHNlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzE4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWVsZEFjY2VzcyA6Oj0gc3VwZXIgRE9UIElkZW50aWZpZXIiKTsKKwkJICAgIGNvbnN1bWVGaWVsZEFjY2Vzcyh0cnVlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzE5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7CisJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzIwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBQcmltYXJ5IERPVCBJZGVudGlmaWVyIExQQVJFTiBBcmd1bWVudExpc3RvcHQgUlBBUkVOIik7CisJCSAgICBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzIxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RJbnZvY2F0aW9uIDo6PSBzdXBlciBET1QgSWRlbnRpZmllciBMUEFSRU4gQXJndW1lbnRMaXN0b3B0IFJQQVJFTiIpOworCQkgICAgY29uc3VtZU1ldGhvZEludm9jYXRpb25TdXBlcigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFycmF5QWNjZXNzIDo6PSBOYW1lIExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsKKwkJICAgIGNvbnN1bWVBcnJheUFjY2Vzcyh0cnVlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzIzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gUHJpbWFyeU5vTmV3QXJyYXkgTEJSQUNLRVQgRXhwcmVzc2lvbiBSQlJBQ0tFVCIpOworCQkgICAgY29uc3VtZUFycmF5QWNjZXNzKGZhbHNlKTsgIAorCQkJYnJlYWsgOworICAgIGNhc2UgMzI0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcnJheUFjY2VzcyA6Oj0gQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIExCUkFDS0VUIEV4cHJlc3Npb24gUkJSQUNLRVQiKTsKKwkJICAgIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMyNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGZpeEV4cHJlc3Npb24gOjo9IE5hbWUiKTsKKwkJICAgIGNvbnN1bWVQb3N0Zml4RXhwcmVzc2lvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMjkgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3RJbmNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBQTFVTX1BMVVMiKTsKKwkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMsdHJ1ZSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMzMCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdERlY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uIE1JTlVTX01JTlVTIik7CisJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyx0cnVlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzMxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdXNoUG9zaXRpb24gOjo9Iik7CisJCSAgICBjb25zdW1lUHVzaFBvc2l0aW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDMzNCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uIDo6PSBQTFVTIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbiA6Oj0gTUlOVVMgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzMzcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBMVVNfUExVUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLGZhbHNlKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzM4IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmVEZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBNSU5VU19NSU5VUyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyxmYWxzZSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM0MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSBUV0lERExFIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlRXSURETEUpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNDEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gTk9UIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM0MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNDQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgRGltcyBQdXNoUlBBUkVOIEluc2lkZUNhc3RFeHByZXNzaW9uLi4uIik7CisJCSAgICBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzQ1IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEuLi4iKTsKKwkJICAgIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNDYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc2lkZUNhc3RFeHByZXNzaW9uIDo6PSIpOworCQkgICAgY29uc3VtZUluc2lkZUNhc3RFeHByZXNzaW9uKCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM0NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEgOjo9Iik7CisJCSAgICBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzQ5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBNVUxUSVBMWSBVbmFyeUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NVUxUSVBMWSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM1MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRElWSURFIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkRJVklERSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM1MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gUkVNQUlOREVSIFVuYXJ5RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlJFTUFJTkRFUik7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM1MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gUExVUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzU0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiBNSU5VUyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM1NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gTEVGVF9TSElGVCBBZGRpdGl2ZUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRUZUX1NISUZUKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzU3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiBSSUdIVF9TSElGVCBBZGRpdGl2ZUV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5SSUdIVF9TSElGVCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM1OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gVU5TSUdORURfUklHSFRfU0hJRlQgQWRkaXRpdmVFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uVU5TSUdORURfUklHSFRfU0hJRlQpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNjAgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBMRVNTIFNoaWZ0RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFU1MpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNjEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBHUkVBVEVSIFNoaWZ0RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVIpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNjIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBMRVNTX0VRVUFMIFNoaWZ0RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFU1NfRVFVQUwpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNjMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBHUkVBVEVSX0VRVUFMIFNoaWZ0RXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVJfRVFVQUwpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNjQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiBpbnN0YW5jZW9mIFJlZmVyZW5jZVR5cGUiKTsKKwkJICAgIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uSU5TVEFOQ0VPRik7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM2NiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gRVFVQUxfRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkVRVUFMX0VRVUFMKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzY3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiBOT1RfRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVFcXVhbGl0eUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVF9FUVVBTCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM2OSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQW5kRXhwcmVzc2lvbiA6Oj0gQW5kRXhwcmVzc2lvbiBBTkQgRXF1YWxpdHlFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzcxIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiBYT1IgQW5kRXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlhPUik7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM3MyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5jbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBJbmNsdXNpdmVPckV4cHJlc3Npb24gT1IgRXhjbHVzaXZlT3JFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1IpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzNzUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uIEFORF9BTkQgSW5jbHVzaXZlT3JFeHByZXNzaW9uIik7CisJCSAgICBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EX0FORCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM3NyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIE9SX09SIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiIpOworCQkgICAgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk9SX09SKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzc5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb25kaXRpb25hbEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIFFVRVNUSU9OIEV4cHJlc3Npb24gQ09MT04uLi4iKTsKKwkJICAgIGNvbnN1bWVDb25kaXRpb25hbEV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlFVRVNUSU9OQ09MT04pIDsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzgyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50IDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBBc3NpZ25tZW50T3BlcmF0b3IgQXNzaWdubWVudEV4cHJlc3Npb24iKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM4NCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudCIpOworCQkgICAgaWdub3JlRXhwcmVzc2lvbkFzc2lnbm1lbnQoKTsgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzODUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRVFVQUwpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzODYgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gTVVMVElQTFlfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTVVMVElQTFkpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzODcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gRElWSURFX0VRVUFMIik7CisJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKERJVklERSk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM4OCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBSRU1BSU5ERVJfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUkVNQUlOREVSKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzg5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IFBMVVNfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUExVUyk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM5MCA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBNSU5VU19FUVVBTCIpOworCQkgICAgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNSU5VUyk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM5MSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBMRUZUX1NISUZUX0VRVUFMIik7CisJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKExFRlRfU0hJRlQpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzOTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gUklHSFRfU0hJRlRfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoUklHSFRfU0hJRlQpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzOTMgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoVU5TSUdORURfUklHSFRfU0hJRlQpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSAzOTQgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gQU5EX0VRVUFMIik7CisJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEFORCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDM5NSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXNzaWdubWVudE9wZXJhdG9yIDo6PSBYT1JfRVFVQUwiKTsKKwkJICAgIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoWE9SKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgMzk2IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBc3NpZ25tZW50T3BlcmF0b3IgOjo9IE9SX0VRVUFMIik7CisJCSAgICBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE9SKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNDAzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9ub3B0IDo6PSIpOworCQkgICAgY29uc3VtZUVtcHR5RXhwcmVzc2lvbigpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MDcgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MDggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zIik7CisJCSAgICBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICBjYXNlIDQwOSA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbnNvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNDEwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJUeXBlRGVjbGFyYXRpb25zb3B0IDo6PSBUeXBlRGVjbGFyYXRpb25zIik7CisJCSAgICBjb25zdW1lVHlwZURlY2xhcmF0aW9uc29wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MTEgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbXB0eUNsYXNzQm9keURlY2xhcmF0aW9uc29wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MTIgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNsYXNzQm9keURlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsKKwkJICAgIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgICBjYXNlIDQxMyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZXJzb3B0IDo6PSIpOworCQkgICAgY29uc3VtZURlZmF1bHRNb2RpZmllcnMoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNDE0IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllcnNvcHQgOjo9IE1vZGlmaWVycyIpOworCQkgICAgY29uc3VtZU1vZGlmaWVycygpOyAgCisJCQlicmVhayA7CisgCisgICAgY2FzZSA0MTUgOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJsb2NrU3RhdGVtZW50c29wdCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbXB0eUJsb2NrU3RhdGVtZW50c29wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgIGNhc2UgNDE3IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJEaW1zb3B0IDo6PSIpOworCQkgICAgY29uc3VtZUVtcHR5RGltc29wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgIGNhc2UgNDE5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudExpc3RvcHQgOjo9Iik7CisJCSAgICBjb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNDIzIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IDo6PSIpOworCQkgICAgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3RvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgICBjYXNlIDQyNyA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSIpOworCQkgICAgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7ICAKKwkJCWJyZWFrIDsKKyAKKyAgICAgY2FzZSA0MjggOiAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMiKTsKKwkJICAgIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgIGNhc2UgNDI5IDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJOZXN0ZWRUeXBlIDo6PSIpOworCQkgICAgY29uc3VtZU5lc3RlZFR5cGUoKTsgIAorCQkJYnJlYWsgOworCisgICAgIGNhc2UgNDMwIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JJbml0b3B0IDo6PSIpOworCQkgICAgY29uc3VtZUVtcHR5Rm9ySW5pdG9wdCgpOyAgCisJCQlicmVhayA7CisgCisgICAgIGNhc2UgNDMyIDogLy8gU3lzdGVtLm91dC5wcmludGxuKCJGb3JVcGRhdGVvcHQgOjo9Iik7CisJCSAgICBjb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKTsgIAorCQkJYnJlYWsgOworIAorICAgICBjYXNlIDQzNiA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F0Y2hlc29wdCA6Oj0iKTsKKwkJICAgIGNvbnN1bWVFbXB0eUNhdGNoZXNvcHQoKTsgIAorCQkJYnJlYWsgOworIAorCX0KK30gCiAJCiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU2ltcGxlQXNzZXJ0U3RhdGVtZW50KCkgewogCS8vIEFzc2VydFN0YXRlbWVudCA6Oj0gJ2Fzc2VydCcgRXhwcmVzc2lvbiAnOycKQEAgLTM4ODcsMjcgKzQwMDUsMTUgQEAKIAkJCQlsZW5ndGgpOyAKIAkJfQogCX07Ci0JaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEJsb2NrKSB7Ci0JCXB1c2hPbkFzdFN0YWNrKAotCQkJbmV3IEZvclN0YXRlbWVudCgKLQkJCQlpbml0cywgCi0JCQkJY29uZCwgCi0JCQkJdXBkYXRlcywgCi0JCQkJYWN0aW9uLCAKLQkJCQlzY29wZSwgCi0JCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKLQkJCQllbmRTdGF0ZW1lbnRQb3NpdGlvbikpOyAKLQl9IGVsc2UgewotCQlwdXNoT25Bc3RTdGFjaygKLQkJCW5ldyBGb3JTdGF0ZW1lbnQoCi0JCQkJaW5pdHMsIAotCQkJCWNvbmQsIAotCQkJCXVwZGF0ZXMsIAotCQkJCWFjdGlvbiwgCi0JCQkJc2NvcGUsIAotCQkJCWludFN0YWNrW2ludFB0ci0tXSwgCi0JCQkJZW5kUG9zaXRpb24pKTsgCi0JfQorCXB1c2hPbkFzdFN0YWNrKAorCQluZXcgRm9yU3RhdGVtZW50KAorCQkJaW5pdHMsIAorCQkJY29uZCwgCisJCQl1cGRhdGVzLCAKKwkJCWFjdGlvbiwgCisJCQlzY29wZSwgCisJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pKTsgCiB9CiBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKSB7CiAJLy8gSWZUaGVuU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50CkBAIC0zOTE1LDE0ICs0MDIxLDcgQEAKIAkvL29wdGltaXplIHRoZSBwdXNoL3BvcAogCWV4cHJlc3Npb25MZW5ndGhQdHItLTsKIAlTdGF0ZW1lbnQgdGhlblN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIGFzdFN0YWNrW2FzdFB0cl07Ci0JaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9jaykgewotCQlhc3RTdGFja1thc3RQdHJdID0gCi0JCQluZXcgSWZTdGF0ZW1lbnQoCi0JCQkJZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHItLV0sIAotCQkJCXRoZW5TdGF0ZW1lbnQsIAotCQkJCWludFN0YWNrW2ludFB0ci0tXSwgCi0JCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKLQl9IGVsc2UgaWYgKHRoZW5TdGF0ZW1lbnQgaW5zdGFuY2VvZiBFbXB0eVN0YXRlbWVudCkgeworCWlmICh0aGVuU3RhdGVtZW50IGluc3RhbmNlb2YgRW1wdHlTdGF0ZW1lbnQpIHsKIAkJYXN0U3RhY2tbYXN0UHRyXSA9IAogCQkJbmV3IElmU3RhdGVtZW50KAogCQkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKQEAgLTM5NTMsMjMgKzQwNTIsMTMgQEAKIAlpZiAodGhlblN0YXRlbWVudCBpbnN0YW5jZW9mIEVtcHR5U3RhdGVtZW50KSB7CiAJCXRoZW5TdGF0ZW1lbnQgPSBCbG9jay5Ob25lOwogCX0KLQlpZiAoZWxzZVN0YXRlbWVudCBpbnN0YW5jZW9mIEJsb2NrKSB7Ci0JCWFzdFN0YWNrW2FzdFB0cl0gPSAKLQkJCW5ldyBJZlN0YXRlbWVudCgKLQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSwgCi0JCQkJdGhlblN0YXRlbWVudCwgCi0JCQkJZWxzZVN0YXRlbWVudCwgCi0JCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKLQkJCQllbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAotCX0gZWxzZSB7Ci0JCWFzdFN0YWNrW2FzdFB0cl0gPSAKLQkJCW5ldyBJZlN0YXRlbWVudCgKLQkJCQlleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0ci0tXSwgCi0JCQkJdGhlblN0YXRlbWVudCwgCi0JCQkJZWxzZVN0YXRlbWVudCwgCi0JCQkJaW50U3RhY2tbaW50UHRyLS1dLCAKLQkJCQllbmRTdGF0ZW1lbnRQb3NpdGlvbik7IAotCX0KKwlhc3RTdGFja1thc3RQdHJdID0gCisJCW5ldyBJZlN0YXRlbWVudCgKKwkJCWV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyLS1dLCAKKwkJCXRoZW5TdGF0ZW1lbnQsIAorCQkJZWxzZVN0YXRlbWVudCwgCisJCQlpbnRTdGFja1tpbnRQdHItLV0sIAorCQkJZW5kU3RhdGVtZW50UG9zaXRpb24pOyAKIH0KIHByb3RlY3RlZCB2b2lkIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIHsKIAkvLyBMYWJlbGVkU3RhdGVtZW50IDo6PSAnSWRlbnRpZmllcicgJzonIFN0YXRlbWVudApAQCAtNDE5NSw3ICs0Mjg0LDYgQEAKIAkJCQlwcm9ibGVtUmVwb3J0ZXIoKS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKGxpdGVyYWxzW2ldKTsKIAkJCX0KIAkJfQotCQlzY2FubmVyLmN1cnJlbnRMaW5lID0gbnVsbDsKIAkJc2Nhbm5lci53YXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gZmFsc2U7CiAJfQogCS8vIGNsZWFyIHRoZSBjb21tZW50UHRyIG9mIHRoZSBzY2FubmVyIGluIGNhc2Ugd2UgcmVhZCBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gYSBtb2RpZmllcgpAQCAtNDYyOSwxMSArNDcxNywxMSBAQAogCXJldHVybiB0eXBlUmVmLmNvcHlEaW1zKGRpbSk7CiB9CiBwcm90ZWN0ZWQgRmllbGREZWNsYXJhdGlvbiBjcmVhdGVGaWVsZERlY2xhcmF0aW9uKEV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24sIGNoYXJbXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKLQlyZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24obnVsbCwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CisJcmV0dXJuIG5ldyBGaWVsZERlY2xhcmF0aW9uKG51bGwsIG5hbWUsIHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOyAvLyBUT0RPOiAob2xpdmllcikgd2h5IGRvbid0IHdlIHBlcnNpc3QgdGhlIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24/CiB9CiAKIHByb3RlY3RlZCBMb2NhbERlY2xhcmF0aW9uIGNyZWF0ZUxvY2FsRGVjbGFyYXRpb24oRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiwgY2hhcltdIG5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotCXJldHVybiBuZXcgTG9jYWxEZWNsYXJhdGlvbihudWxsLCBuYW1lLCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKwlyZXR1cm4gbmV3IExvY2FsRGVjbGFyYXRpb24obnVsbCwgbmFtZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7IC8vIFRPRE86IChvbGl2aWVyKSB3aHkgZG9uJ3Qgd2UgcGVyc2lzdCB0aGUgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbj8KIH0KIAogcHVibGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGRpZXRQYXJzZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0KSB7CkBAIC00NzU5LDYgKzQ4NDcsMTYgQEAKIAlpZiAoc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yKSB7CiAJCWNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdC5saW5lU2VwYXJhdG9yUG9zaXRpb25zID0gc2Nhbm5lci5nZXRMaW5lRW5kcygpOwogCX0KKwlpZiAoc2Nhbm5lci50YXNrVGFncyAhPSBudWxsKXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FubmVyLmZvdW5kVGFza0NvdW50OyBpKyspeworCQkJcHJvYmxlbVJlcG9ydGVyKCkudGFzaygKKwkJCQluZXcgU3RyaW5nKHNjYW5uZXIuZm91bmRUYXNrVGFnc1tpXSksIAorCQkJCW5ldyBTdHJpbmcoc2Nhbm5lci5mb3VuZFRhc2tNZXNzYWdlc1tpXSksCisJCQkJc2Nhbm5lci5mb3VuZFRhc2tQcmlvcml0aWVzW2ldID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhzY2FubmVyLmZvdW5kVGFza1ByaW9yaXRpZXNbaV0pLCAKKwkJCQlzY2FubmVyLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVswXSwgCisJCQkJc2Nhbm5lci5mb3VuZFRhc2tQb3NpdGlvbnNbaV1bMV0pOworCQl9CisJfQogCXJldHVybiBjb21waWxhdGlvblVuaXQ7CiB9CiAvKgpAQCAtNDgwNSwxNyArNDkwMyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JLy8gcG9zaXRpb24gY2FuIGJlIGxvY2F0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGxpbmUgYnJlYWsKLQkvLyB0aGlzIGlzIGEgYnVnIG9uIFdpbmRvd3MgcGxhdGZvcm0gb25seS4KLQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTU3Ci0JY2hhcltdIHNvdXJjZSA9IHNjYW5uZXIuc291cmNlOwotCQotCWlmICgocG9zaXRpb24gPCBzb3VyY2UubGVuZ3RoKQotCQkmJiAoc291cmNlW3Bvc2l0aW9uXSA9PSAnXHInKQotCSAgICAmJiAoKHBvc2l0aW9uICsgMSkgPCBzb3VyY2UubGVuZ3RoKQotCSAgICAmJiAoc291cmNlW3Bvc2l0aW9uICsgMV0gPT0gJ1xuJykpIHsKLQkJcG9zaXRpb24rKzsKLQl9CisKIAlpZiAoaW5kZXggPCAwKSByZXR1cm4gcG9zaXRpb247IC8vIG5vIG9ic29sZXRlIGNvbW1lbnQKIAogCWlmICh2YWxpZENvdW50ID4gMCl7IC8vIG1vdmUgdmFsaWQgY29tbWVudCBpbmZvcywgb3ZlcnJpZGluZyBvYnNvbGV0ZSBjb21tZW50IGluZm9zCkBAIC01MDM5LDkgKzUxMjcsOSBAQAogCiAJZmlyc3RUb2tlbiA9IFRva2VuTmFtZVBMVVNfUExVUyA7CiAJc2Nhbm5lci5saW5lUHRyID0gLTE7CQorCXNjYW5uZXIuZm91bmRUYXNrQ291bnQgPSAwOwogCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHRydWU7CiAJc2Nhbm5lci5jdXJyZW50TGluZT0gbnVsbDsKLQlzY2FubmVyLmxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7CiB9CiBwdWJsaWMgdm9pZCBnb0ZvckNvbnN0cnVjdG9yQm9keSgpewogCS8vdGVsbHMgdGhlIHNjYW5uZXIgdG8gZ28gZm9yIGNvbXBpbGF0aW9uIHVuaXQgcGFyc2luZwpAQCAtNTkyNiw3ICs2MDE0LDggQEAKIC8uJHB1dENhc2UgY29uc3VtZVJpZ2h0UGFyZW4oKTsgJGJyZWFrIC4vCiAKIFByaW1hcnkgLT4gUHJpbWFyeU5vTmV3QXJyYXkKLVByaW1hcnkgLT4gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24KK1ByaW1hcnkgLT4gQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyCitQcmltYXJ5IC0+IEFycmF5Q3JlYXRpb25XaXRob3V0QXJyYXlJbml0aWFsaXplcgogCiBQcmltYXJ5Tm9OZXdBcnJheSAtPiBMaXRlcmFsCiBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gJ3RoaXMnCkBAIC01OTkzLDE3ICs2MDgyLDE3IEBACiBBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCAnLCcgRXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICRicmVhayAuLwogCi0tLVRoZXNzIHJ1bGVzIGFyZSByZS13cml0dGVuIGluIG9yZGVyIHRvIGJlIGxsMSAKLS0tQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIEFycmF5VHlwZSBBcnJheUluaXRpYWxpemVyCi0tLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbUV4cHJzIERpbXNvcHQgCi0tLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1FeHBycyBEaW1zb3B0Ci0tLURpbUV4cHJzIDo6PSBEaW1FeHByCi0tLURpbUV4cHJzIDo6PSBEaW1FeHBycyBEaW1FeHByCitBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KIAotQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzIEFycmF5SW5pdGlhbGl6ZXJvcHQKLS8uJHB1dENhc2UgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uKCk7ICRicmVhayAuLwotQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0Ci0vLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK0FycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplciA6Oj0gJ25ldycgUHJpbWl0aXZlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcgorLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRoSW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCisKK0FycmF5Q3JlYXRpb25XaXRob3V0QXJyYXlJbml0aWFsaXplciA6Oj0gJ25ldycgQ2xhc3NPckludGVyZmFjZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KKworQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcgorLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25XaXRoSW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCiAKIERpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHIKIERpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByCkBAIC02MDQwLDYgKzYxMjksOCBAQAogLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlBY2Nlc3ModHJ1ZSk7ICRicmVhayAuLwogQXJyYXlBY2Nlc3MgOjo9IFByaW1hcnlOb05ld0FycmF5ICdbJyBFeHByZXNzaW9uICddJwogLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlBY2Nlc3MoZmFsc2UpOyAkYnJlYWsgLi8KK0FycmF5QWNjZXNzIDo6PSBBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgJ1snIEV4cHJlc3Npb24gJ10nCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICRicmVhayAuLwogCiBQb3N0Zml4RXhwcmVzc2lvbiAtPiBQcmltYXJ5CiBQb3N0Zml4RXhwcmVzc2lvbiA6Oj0gTmFtZQpAQCAtNjA3OCwxNCArNjE2OSwxOSBAQAogLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5OT1QpOyAkYnJlYWsgLi8KIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyAtPiBDYXN0RXhwcmVzc2lvbgogCi1DYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBQcmltaXRpdmVUeXBlIERpbXNvcHQgUHVzaFJQQVJFTiBVbmFyeUV4cHJlc3Npb24KK0Nhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIFByaW1pdGl2ZVR5cGUgRGltc29wdCBQdXNoUlBBUkVOIEluc2lkZUNhc3RFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCi0gQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisgQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCiAvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KIC0tIEV4cHJlc3Npb24gaXMgaGVyZSBvbmx5IGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxCi1DYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCitDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCiAvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOyAkYnJlYWsgLi8KIAorSW5zaWRlQ2FzdEV4cHJlc3Npb24gOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSgpOyAkYnJlYWsgLi8KKwogTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIC0+IFVuYXJ5RXhwcmVzc2lvbgogTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJyonIFVuYXJ5RXhwcmVzc2lvbgogLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTVVMVElQTFkpOyAkYnJlYWsgLi8KQEAgLTYxNTMsMTkgKzYyNDksMTQgQEAKIEFzc2lnbm1lbnRFeHByZXNzaW9uIC0+IENvbmRpdGlvbmFsRXhwcmVzc2lvbgogQXNzaWdubWVudEV4cHJlc3Npb24gLT4gQXNzaWdubWVudAogCi1Bc3NpZ25tZW50IDo6PSBMZWZ0SGFuZFNpZGUgQXNzaWdubWVudE9wZXJhdG9yIEFzc2lnbm1lbnRFeHByZXNzaW9uCitBc3NpZ25tZW50IDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBBc3NpZ25tZW50T3BlcmF0b3IgQXNzaWdubWVudEV4cHJlc3Npb24KIC8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnQoKTsgJGJyZWFrIC4vCiAKIC0tIHRoaXMgcnVsZSBpcyBhZGRlZCB0byBwYXJzZSBhbiBhcnJheSBpbml0aWFsaXplciBpbiBhIGFzc2lnbWVudCBhbmQgdGhlbiByZXBvcnQgYSBzeW50YXggZXJyb3Iga25vd2luZyB0aGUgZXhhY3Qgc2VuYXJpbwotSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBcnJheUluaXRpYWxpemVyCitJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50IDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBBc3NpZ25tZW50T3BlcmF0b3IgQXJyYXlJbml0aWFsaXplcgogQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudAogLy4kcHV0Y2FzZSBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpOyRicmVhayAuLwogCi1MZWZ0SGFuZFNpZGUgOjo9IE5hbWUKLS8uJHB1dENhc2UgY29uc3VtZUxlZnRIYW5kU2lkZSgpOyAkYnJlYWsgLi8KLUxlZnRIYW5kU2lkZSAtPiBGaWVsZEFjY2VzcwotTGVmdEhhbmRTaWRlIC0+IEFycmF5QWNjZXNzCi0KIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJz0nCiAvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRVFVQUwpOyAkYnJlYWsgLi8KIEFzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJyo9JwpAQCAtNjI5MCwxMCArNjM4MSw2IEBACiAvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlDYXRjaGVzb3B0KCk7ICRicmVhayAuLwogQ2F0Y2hlc29wdCAtPiBDYXRjaGVzCiAKLUFycmF5SW5pdGlhbGl6ZXJvcHQgOjo9ICRlbXB0eQotLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5QXJyYXlJbml0aWFsaXplcm9wdCgpOyAkYnJlYWsgLi8KLUFycmF5SW5pdGlhbGl6ZXJvcHQgLT4gQXJyYXlJbml0aWFsaXplcgotCiAvLgl9CiB9IC4vCiAKQEAgLTYzODUsOCArNjQ3Miw4IEBACiAJdHlwZURlY2wuYm9keUVuZCA9IGVuZFN0YXRlbWVudFBvc2l0aW9uOwogCXByb2JsZW1SZXBvcnRlcigpLmNhbm5vdERlY2xhcmVMb2NhbEludGVyZmFjZSh0eXBlRGVjbC5uYW1lLCB0eXBlRGVjbC5zb3VyY2VTdGFydCwgdHlwZURlY2wuc291cmNlRW5kKTsKIAotCS8vIG1hcmsgZmllbGRzIGFuZCBpbml0aWFsaXplciB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQltYXJrRmllbGRzV2l0aExvY2FsVHlwZSh0eXBlRGVjbCk7CisJLy8gbWFyayBpbml0aWFsaXplcnMgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCisJbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUodHlwZURlY2wpOwogCiAJLy8gcmVtb3ZlIHRoZSBhc3Qgbm9kZSBjcmVhdGVkIGluIGludGVyZmFjZSBoZWFkZXIKIAlhc3RQdHItLTsJCkBAIC02NDk1LDYgKzY1ODIsNyBAQAogCiAJLy8gcmVzZXQgc2Nhbm5lciBzdGF0ZQogCXNjYW5uZXIuY29tbWVudFB0ciA9IC0xOworCXNjYW5uZXIuZm91bmRUYXNrQ291bnQgPSAwOwogCXNjYW5uZXIuZW9mUG9zaXRpb24gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAogCXJlc2V0TW9kaWZpZXJzKCk7CkBAIC02NTEwLDcgKzY1OTgsMTQgQEAKIAlsaXN0TGVuZ3RoID0gMDsKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVTY2FubmVyKCl7Ci0JdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIGZhbHNlLCB0aGlzLnByb2JsZW1SZXBvcnRlci5vcHRpb25zLmdldE5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxTZXZlcml0eSgpICE9IFByb2JsZW1TZXZlcml0aWVzLklnbm9yZSAsIHRoaXMuYXNzZXJ0TW9kZSk7CisJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSB0aGlzLnByb2JsZW1SZXBvcnRlci5vcHRpb25zOworCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAorCQlmYWxzZSAvKmNvbW1lbnQqLywgCisJCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKKwkJb3B0aW9ucy5nZXRTZXZlcml0eShDb21waWxlck9wdGlvbnMuTm9uRXh0ZXJuYWxpemVkU3RyaW5nKSAhPSBQcm9ibGVtU2V2ZXJpdGllcy5JZ25vcmUgLypubHMqLywgCisJCXRoaXMuYXNzZXJ0TW9kZSAvKmFzc2VydCovLCAKKwkJb3B0aW9ucy50YXNrVGFncy8qdGFza1RhZ3MqLywKKwkJb3B0aW9ucy50YXNrUHJpb3JpdGVzLyp0YXNrUHJpb3JpdGllcyovKTsKIH0KIHB1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBpbml0VGFibGVzKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewogCkBAIC02NTM3LDEyICs2NjMyLDEzIEBACiAJaWYgKGRpZXQgJiYgKGRpZXRJbnQgPT0gMCkpCiAJCXNjYW5uZXIuZGlldCA9IHRydWU7CiB9Ci1wcm90ZWN0ZWQgdm9pZCBtYXJrQ3VycmVudE1ldGhvZFdpdGhMb2NhbFR5cGUoKSB7Citwcm90ZWN0ZWQgdm9pZCBtYXJrRW5jbG9zaW5nTWVtYmVyV2l0aExvY2FsVHlwZSgpIHsKIAlpZiAodGhpcy5jdXJyZW50RWxlbWVudCAhPSBudWxsKSByZXR1cm47IC8vIHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRoZSByZWNvdmVyeSBjb2RlCiAJZm9yIChpbnQgaSA9IHRoaXMuYXN0UHRyOyBpID49IDA7IGktLSkgewogCQlBc3ROb2RlIG5vZGUgPSB0aGlzLmFzdFN0YWNrW2ldOwogCQlpZiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gCi0JCQkJfHwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeyAvLyBtYXJrIHR5cGUgZm9yIG5vdzogYWxsIGZpZWxkcyB3aWxsIGJlIG1hcmtlZCB3aGVuIGFkZGVkIHRvIHRoaXMgdHlwZQorCQkJCXx8IG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uCisJCQkJfHwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgeyAvLyBtYXJrIHR5cGUgZm9yIG5vdzogYWxsIGluaXRpYWxpemVycyB3aWxsIGJlIG1hcmtlZCB3aGVuIGFkZGVkIHRvIHRoaXMgdHlwZQogCQkJbm9kZS5iaXRzIHw9IEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSzsKIAkJCXJldHVybjsKIAkJfQpAQCAtNjU1MywxMCArNjY0OSwxMyBAQAogCQkoKEFzdE5vZGUpdGhpcy5yZWZlcmVuY2VDb250ZXh0KS5iaXRzIHw9IEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSzsKIAl9CiB9Ci1wcm90ZWN0ZWQgdm9pZCBtYXJrRmllbGRzV2l0aExvY2FsVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZSkgeworcHJvdGVjdGVkIHZvaWQgbWFya0luaXRpYWxpemVyc1dpdGhMb2NhbFR5cGUoVHlwZURlY2xhcmF0aW9uIHR5cGUpIHsKIAlpZiAodHlwZS5maWVsZHMgPT0gbnVsbCB8fCAodHlwZS5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSA9PSAwKSByZXR1cm47CiAJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHR5cGUuZmllbGRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXR5cGUuZmllbGRzW2ldLmJpdHMgfD0gQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLOworCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdHlwZS5maWVsZHNbaV07CisJCWlmIChmaWVsZCBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7CisJCQlmaWVsZC5iaXRzIHw9IEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSzsKKwkJfQogCX0KIH0KIC8qCkBAIC02NjA2LDYgKzY3MDUsNyBAQAogCXNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9IHBvczsKIAlzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiA9IHBvczsKIAlzY2FubmVyLmNvbW1lbnRQdHIgPSAtMTsKKwlzY2FubmVyLmZvdW5kVGFza0NvdW50ID0gMDsKIAogCXJldHVybiB0cnVlOwogCkBAIC02ODY4LDYgKzY5NjgsNDUgQEAKIC8vIEEgUCBJCiAKIHB1YmxpYyB2b2lkIHBhcnNlKAorCUZpZWxkRGVjbGFyYXRpb24gZmllbGQsIAorCVR5cGVEZWNsYXJhdGlvbiB0eXBlLCAKKwlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LAorCWNoYXJbXSBpbml0aWFsaXphdGlvblNvdXJjZSkgeworCS8vb25seSBwYXJzZSB0aGUgaW5pdGlhbGl6YXRpb25Tb3VyY2Ugb2YgdGhlIGdpdmVuIGZpZWxkCisKKwkvL2NvbnZlcnQgYnVncyBpbnRvIHBhcnNlIGVycm9yCisKKwlpbml0aWFsaXplKCk7CisJZ29Gb3JFeHByZXNzaW9uKCk7CisJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdKys7CisKKwlyZWZlcmVuY2VDb250ZXh0ID0gdHlwZTsKKwljb21waWxhdGlvblVuaXQgPSB1bml0OworCisJc2Nhbm5lci5zZXRTb3VyY2UoaW5pdGlhbGl6YXRpb25Tb3VyY2UpOworCXNjYW5uZXIucmVzZXRUbygwLCBpbml0aWFsaXphdGlvblNvdXJjZS5sZW5ndGgtMSk7CisJdHJ5IHsKKwkJcGFyc2UoKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGV4KSB7CisJCWxhc3RBY3QgPSBFUlJPUl9BQ1RJT047CisJfSBmaW5hbGx5IHsKKwkJbmVzdGVkTWV0aG9kW25lc3RlZFR5cGVdLS07CisJfQorCisJaWYgKGxhc3RBY3QgPT0gRVJST1JfQUNUSU9OKSB7CisJCXJldHVybjsKKwl9CisKKwlmaWVsZC5pbml0aWFsaXphdGlvbiA9IGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXTsKKwkKKwkvLyBtYXJrIGZpZWxkIHdpdGggbG9jYWwgdHlwZSBpZiBvbmUgd2FzIGZvdW5kIGR1cmluZyBwYXJzaW5nCisJaWYgKCh0eXBlLmJpdHMgJiBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0spICE9IDApIHsKKwkJZmllbGQuYml0cyB8PSBBc3ROb2RlLkhhc0xvY2FsVHlwZU1BU0s7CisJfQkKK30KKy8vIEEgUCBJCisKK3B1YmxpYyB2b2lkIHBhcnNlKAogCUluaXRpYWxpemVyIGluaSwgCiAJVHlwZURlY2xhcmF0aW9uIHR5cGUsIAogCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQpIHsKQEAgLTcxNjcsMTIgKzczMDYsMTMgQEAKIAogCS8vZmlsZXMgYXJlIGxvY2F0ZWQgYXQgUGFyc2VyLmNsYXNzIGRpcmVjdG9yeQogCi0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oUGFyc2VyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUpKTsKKwlJbnB1dFN0cmVhbSBzdHJlYW0gPSBQYXJzZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSk7CiAJaWYgKHN0cmVhbSA9PSBudWxsKSB7CiAJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKFV0aWwuYmluZCgicGFyc2VyLm1pc3NpbmdGaWxlIixmaWxlbmFtZSkpOyAvLyROT04tTkxTLTEkCiAJfQogCWJ5dGVbXSBieXRlcyA9IG51bGw7CiAJdHJ5IHsKKwkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKIAkJYnl0ZXMgPSBVdGlsLmdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAtMSk7CiAJfSBmaW5hbGx5IHsKIAkJdHJ5IHsKQEAgLTcxOTgsNiArNzMzOCwyMiBAQAogCX0KIAlyZXR1cm4gY2hhcnM7CiB9CitwdWJsaWMgdm9pZCByZWNvdmVyeUV4aXRGcm9tVmFyaWFibGUoKSB7CisJaWYoY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudC5wYXJlbnQgIT0gbnVsbCkgeworCQlpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZExvY2FsVmFyaWFibGUpIHsKKwkJCQorCQkJaW50IGVuZCA9ICgoUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZSljdXJyZW50RWxlbWVudCkubG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CisJCQljdXJyZW50RWxlbWVudC51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShlbmQpOworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnQ7CisJCX0gZWxzZSBpZihjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlY292ZXJlZEZpZWxkCisJCQkmJiAhKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIpKSB7CisJCQkJCisJCQlpbnQgZW5kID0gKChSZWNvdmVyZWRGaWVsZCljdXJyZW50RWxlbWVudCkuZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CisJCQljdXJyZW50RWxlbWVudC51cGRhdGVTb3VyY2VFbmRJZk5lY2Vzc2FyeShlbmQpOworCQkJY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnQ7CisJCX0KKwl9Cit9CiAvKiBUb2tlbiBjaGVjayBwZXJmb3JtZWQgb24gZXZlcnkgdG9rZW4gc2hpZnQgb25jZSBoYXZpbmcgZW50ZXJlZAogICogcmVjb3ZlcnkgbW9kZS4KICAqLwpAQCAtNzIxOCw3ICs3Mzc0LDcgQEAKIAkJCVJlY292ZXJlZEVsZW1lbnQgbmV3RWxlbWVudCA9CiAJCQkJY3VycmVudEVsZW1lbnQudXBkYXRlT25DbG9zaW5nQnJhY2Uoc2Nhbm5lci5zdGFydFBvc2l0aW9uLCBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtMSk7CiAJCQkJbGFzdENoZWNrUG9pbnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKLQkJCQlpZiAobmV3RWxlbWVudCAhPSBjdXJyZW50RWxlbWVudCl7CisJCQlpZiAobmV3RWxlbWVudCAhPSBjdXJyZW50RWxlbWVudCl7CiAJCQkJY3VycmVudEVsZW1lbnQgPSBuZXdFbGVtZW50OwogCQkJfQogCQl9CkBAIC03MjY0LDEzICs3NDIwLDUyIEBACiAJCQkJZXhwZWN0aW5ncyk7IAogCQl9CiAJfSBlbHNlIHsgLy90aGUgbmV4dCB0ZXN0IGlzIEhFQVZJTFkgZ3JhbW1hciBERVBFTkRFTlQuCi0JCWlmICgobGVuZ3RoID09IDIpCi0JCQkmJiAodG9rZW5OYW1lLmVxdWFscygiOyIpKSAvLyROT04tTkxTLTEkCi0JCQkmJiAoZXhwZWN0aW5nc1swXSA9PSAiKysiKSAvLyROT04tTkxTLTEkCi0JCQkmJiAoZXhwZWN0aW5nc1sxXSA9PSAiLS0iKSAvLyROT04tTkxTLTEkCisJCWlmICgobGVuZ3RoID09IDE0KQorCQkJJiYgKGV4cGVjdGluZ3NbMF0gPT0gIj0iKSAvLyROT04tTkxTLTEkCisJCQkmJiAoZXhwZWN0aW5nc1sxXSA9PSAiKj0iKSAvLyROT04tTkxTLTEkCiAJCQkmJiAoZXhwcmVzc2lvblB0ciA+IC0xKSkgewotCQkJLy8gdGhlIDsgaXMgbm90IHRoZSBleHBlY3RlZCB0b2tlbiA9PT4gaXQgZW5kcyBhIHN0YXRlbWVudCB3aGVuIGFuIGV4cHJlc3Npb24gaXMgbm90IGVuZGVkCi0JCQlwcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkRXhwcmVzc2lvbkFzU3RhdGVtZW50KGV4cHJlc3Npb25TdGFja1tleHByZXNzaW9uUHRyXSk7CisJCQkJc3dpdGNoKGN1cnJlbnRLaW5kKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVBMVVM6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTUlOVVM6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRElWSURFOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJFTUFJTkRFUjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNVUxUSVBMWToKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRUZUX1NISUZUOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJJR0hUX1NISUZUOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxFU1M6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lR1JFQVRFUjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMRVNTX0VRVUFMOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUdSRUFURVJfRVFVQUw6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRVFVQUxfRVFVQUw6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTk9UX0VRVUFMOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVhPUjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVBTkQ6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lT1I6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lT1JfT1I6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQU5EX0FORDoKKwkJCQkJCS8vIHRoZSA7IGlzIG5vdCB0aGUgZXhwZWN0ZWQgdG9rZW4gPT0+IGl0IGVuZHMgYSBzdGF0ZW1lbnQgd2hlbiBhbiBleHByZXNzaW9uIGlzIG5vdCBlbmRlZAorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEV4cHJlc3Npb25Bc1N0YXRlbWVudChleHByZXNzaW9uU3RhY2tbZXhwcmVzc2lvblB0cl0pOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQkJCXByb2JsZW1SZXBvcnRlcigpLm1pc3NpbmdTZW1pQ29sb24oZXhwcmVzc2lvblN0YWNrW2V4cHJlc3Npb25QdHJdKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJY2hhcltdIHRva2VuU291cmNlOworCQkJCQkJdHJ5IHsKKwkJCQkJCQl0b2tlblNvdXJjZSA9IHRoaXMuc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJdG9rZW5Tb3VyY2UgPSBuZXcgY2hhcltdIHt9OworCQkJCQkJfQorCQkJCQkJcHJvYmxlbVJlcG9ydGVyKCkucGFyc2VFcnJvcigKKwkJCQkJCQl0aGlzLnNjYW5uZXIuc3RhcnRQb3NpdGlvbiwgCisJCQkJCQkJdGhpcy5zY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDEsIAorCQkJCQkJCXRva2VuU291cmNlLCAKKwkJCQkJCQl0b2tlbk5hbWUsIAorCQkJCQkJCWV4cGVjdGluZ3MpOyAKKwkJCQkJCXRoaXMuY2hlY2tBbmRSZXBvcnRCcmFja2V0QW5vbWFsaWVzKHByb2JsZW1SZXBvcnRlcigpKTsKKwkJCQl9CiAJCX0gZWxzZSB7CiAJCQljaGFyW10gdG9rZW5Tb3VyY2U7CiAJCQl0cnkgewpAQCAtNzMxNCw2ICs3NTA5LDggQEAKIAlyZWFsQmxvY2tTdGFja1tyZWFsQmxvY2tQdHIgPSAwXSA9IDA7CiAJcmVjb3ZlcmVkU3RhdGljSW5pdGlhbGl6ZXJTdGFydCA9IDA7CiAJbGlzdExlbmd0aCA9IDA7CisJLy8gRml4IGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzY1CisJaWYgKHRoaXMuc2Nhbm5lciAhPSBudWxsKSB0aGlzLnNjYW5uZXIuY3VycmVudExpbmUgPSBudWxsOwogfQogLyoKICAqIFJlc2V0IGNvbnRleHQgc28gYXMgdG8gcmVzdW1lIHRvIHJlZ3VsYXIgcGFyc2UgbG9vcApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9QYXJzZXJCYXNpY0luZm9ybWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlckJhc2ljSW5mb3JtYXRpb24uamF2YQppbmRleCBkODM2NzQ0Li40OTA3ZmY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlckJhc2ljSW5mb3JtYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1BhcnNlckJhc2ljSW5mb3JtYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKIC8qQW4gaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgc3RhdGljIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBiYXNpYyBpbmZvcm1hdGlvbgpAQCAtMTYsMjEgKzE2LDE4IEBACiBwdWJsaWMgaW50ZXJmYWNlIFBhcnNlckJhc2ljSW5mb3JtYXRpb24gewogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQKLSAgICAgIEVSUk9SX1NZTUJPTCAgICAgID0gMzA3LAotICAgICAgTUFYX05BTUVfTEVOR1RIICAgPSAzNiwKLSAgICAgIE5VTV9TVEFURVMgICAgICAgID0gNTkxLAogICAgICAgTlRfT0ZGU0VUICAgICAgICAgPSAzMDgsCiAgICAgICBTQ09QRV9VQk9VTkQgICAgICA9IC0xLAogICAgICAgU0NPUEVfU0laRSAgICAgICAgPSAwLAotICAgICAgTEFfU1RBVEVfT0ZGU0VUICAgPSAxNjk2NiwKKyAgICAgIExBX1NUQVRFX09GRlNFVCAgID0gMTc3NTksCiAgICAgICBNQVhfTEEgICAgICAgICAgICA9IDEsCi0gICAgICBOVU1fUlVMRVMgICAgICAgICA9IDQzNiwKLSAgICAgIE5VTV9URVJNSU5BTFMgICAgID0gMTA1LAotICAgICAgTlVNX05PTl9URVJNSU5BTFMgPSAyMDMsCisgICAgICBOVU1fUlVMRVMgICAgICAgICA9IDQzNywKKyAgICAgIE5VTV9URVJNSU5BTFMgICAgID0gMTA0LAorICAgICAgTlVNX05PTl9URVJNSU5BTFMgPSAyMDQsCiAgICAgICBOVU1fU1lNQk9MUyAgICAgICA9IDMwOCwKLSAgICAgIFNUQVJUX1NUQVRFICAgICAgID0gMTIyNjAsCi0gICAgICBFT0ZUX1NZTUJPTCAgICAgICA9IDE1OCwKLSAgICAgIEVPTFRfU1lNQk9MICAgICAgID0gMTU4LAotICAgICAgQUNDRVBUX0FDVElPTiAgICAgPSAxNjk2NSwKLSAgICAgIEVSUk9SX0FDVElPTiAgICAgID0gMTY5NjY7CisgICAgICBTVEFSVF9TVEFURSAgICAgICA9IDE2MDM0LAorICAgICAgRU9GVF9TWU1CT0wgICAgICAgPSAxMTQsCisgICAgICBFT0xUX1NZTUJPTCAgICAgICA9IDEwNSwKKyAgICAgIEFDQ0VQVF9BQ1RJT04gICAgID0gMTc3NTgsCisgICAgICBFUlJPUl9BQ1RJT04gICAgICA9IDE3NzU5OwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRCbG9jay5qYXZhCmluZGV4IDFkYTQ1MDAuLmE0YmRiN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkQmxvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEJsb2NrLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKICAqIEludGVybmFsIGJsb2NrIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKICAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrOwpAQCAtMjMsOSArMjMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsZXJNb2RpZmllcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAotcHVibGljIGNsYXNzIFJlY292ZXJlZEJsb2NrIGV4dGVuZHMgUmVjb3ZlcmVkU3RhdGVtZW50IGltcGxlbWVudHMgQ29tcGlsZXJNb2RpZmllcnMsIElUZXJtaW5hbFN5bWJvbHMsIEJhc2VUeXBlcyB7CitwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkQmxvY2sgZXh0ZW5kcyBSZWNvdmVyZWRTdGF0ZW1lbnQgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycywgVGVybWluYWxUb2tlbnMsIEJhc2VUeXBlcyB7CiAKIAlwdWJsaWMgQmxvY2sgYmxvY2tEZWNsYXJhdGlvbjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEVsZW1lbnQuamF2YQppbmRleCBjMWE5NDM0Li4wZDEzNjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEVsZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEVsZW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRGaWVsZC5qYXZhCmluZGV4IDhkOTM4ZTEuLjc5MjQ5NzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkRmllbGQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEZpZWxkLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW1wb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEltcG9ydC5qYXZhCmluZGV4IGY0MjA5MWEuLmU2YThhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW1wb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbXBvcnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRJbml0aWFsaXplci5qYXZhCmluZGV4IDk3OThlNmUuLjFlYWY0YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZEluaXRpYWxpemVyLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKICAqIEludGVybmFsIGluaXRpYWxpemVyIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKICAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CkBAIC0yNCw5ICsyNCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CYXNlVHlwZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCi1wdWJsaWMgY2xhc3MgUmVjb3ZlcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBSZWNvdmVyZWRGaWVsZCBpbXBsZW1lbnRzIENvbXBpbGVyTW9kaWZpZXJzLCBJVGVybWluYWxTeW1ib2xzLCBCYXNlVHlwZXMgeworcHVibGljIGNsYXNzIFJlY292ZXJlZEluaXRpYWxpemVyIGV4dGVuZHMgUmVjb3ZlcmVkRmllbGQgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycywgVGVybWluYWxUb2tlbnMsIEJhc2VUeXBlcyB7CiAKIAlwdWJsaWMgUmVjb3ZlcmVkVHlwZVtdIGxvY2FsVHlwZXM7CiAJcHVibGljIGludCBsb2NhbFR5cGVDb3VudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTG9jYWxWYXJpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRMb2NhbFZhcmlhYmxlLmphdmEKaW5kZXggYjQ1MGE3NS4uYjNiZDc3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRMb2NhbFZhcmlhYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRMb2NhbFZhcmlhYmxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50OwogCkBAIC0yNyw2ICsyOCwyMSBAQAogCXRoaXMubG9jYWxEZWNsYXJhdGlvbiA9IGxvY2FsRGVjbGFyYXRpb247CiAJdGhpcy5hbHJlYWR5Q29tcGxldGVkTG9jYWxJbml0aWFsaXphdGlvbiA9IGxvY2FsRGVjbGFyYXRpb24uaW5pdGlhbGl6YXRpb24gIT0gbnVsbDsKIH0KKy8qCisgKiBSZWNvcmQgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaWYgbG9jYWwgdmFyaWFibGUgaXMgZXhwZWN0aW5nIGFuIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uIAorICovCitwdWJsaWMgUmVjb3ZlcmVkRWxlbWVudCBhZGQoU3RhdGVtZW50IHN0YXRlbWVudCwgaW50IGJyYWNrZXRCYWxhbmNlKSB7CisKKwlpZiAodGhpcy5hbHJlYWR5Q29tcGxldGVkTG9jYWxJbml0aWFsaXphdGlvbiB8fCAhKHN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pKSB7CisJCXJldHVybiBzdXBlci5hZGQoc3RhdGVtZW50LCBicmFja2V0QmFsYW5jZSk7CisJfSBlbHNlIHsKKwkJdGhpcy5hbHJlYWR5Q29tcGxldGVkTG9jYWxJbml0aWFsaXphdGlvbiA9IHRydWU7CisJCXRoaXMubG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiA9IChFeHByZXNzaW9uKXN0YXRlbWVudDsKKwkJdGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc3RhdGVtZW50LnNvdXJjZUVuZDsKKwkJdGhpcy5sb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uRW5kID0gc3RhdGVtZW50LnNvdXJjZUVuZDsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQogLyogCiAgKiBBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgcGFyc2VkIHN0cnVjdHVyZQogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZE1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRNZXRob2QuamF2YQppbmRleCA1M2Y4ODI1Li42YjU4MTRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZE1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkTWV0aG9kLmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKQEAgLTI2LDEzICsyNiwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJhc2VUeXBlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogSW50ZXJuYWwgbWV0aG9kIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKICAqLwogCi1wdWJsaWMgY2xhc3MgUmVjb3ZlcmVkTWV0aG9kIGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCBpbXBsZW1lbnRzIENvbXBpbGVyTW9kaWZpZXJzLCBJVGVybWluYWxTeW1ib2xzLCBCYXNlVHlwZXMgeworcHVibGljIGNsYXNzIFJlY292ZXJlZE1ldGhvZCBleHRlbmRzIFJlY292ZXJlZEVsZW1lbnQgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycywgVGVybWluYWxUb2tlbnMsIEJhc2VUeXBlcyB7CiAKIAlwdWJsaWMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkU3RhdGVtZW50LmphdmEKaW5kZXggM2JjYTFmNS4uYWI5ZWZkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogLyoqCkBAIC0xOSw3ICsxOSw2IEBACiBwdWJsaWMgY2xhc3MgUmVjb3ZlcmVkU3RhdGVtZW50IGV4dGVuZHMgUmVjb3ZlcmVkRWxlbWVudCB7CiAKIAlwdWJsaWMgU3RhdGVtZW50IHN0YXRlbWVudDsKLQlib29sZWFuIGFscmVhZHlDb21wbGV0ZWRMb2NhbEluaXRpYWxpemF0aW9uOwogcHVibGljIFJlY292ZXJlZFN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50LCBSZWNvdmVyZWRFbGVtZW50IHBhcmVudCwgaW50IGJyYWNrZXRCYWxhbmNlKXsKIAlzdXBlcihwYXJlbnQsIGJyYWNrZXRCYWxhbmNlKTsKIAl0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEKaW5kZXggMzRhMTQ0Ny4uOTYwZmViOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9SZWNvdmVyZWRUeXBlLmphdmEKQEAgLTEsMTYgKzEsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CkBAIC0yOCw3ICsyNyw3IEBACiAgKiBJbnRlcm5hbCB0eXBlIHN0cnVjdHVyZSBmb3IgcGFyc2luZyByZWNvdmVyeSAKICAqLwogCi1wdWJsaWMgY2xhc3MgUmVjb3ZlcmVkVHlwZSBleHRlbmRzIFJlY292ZXJlZFN0YXRlbWVudCBpbXBsZW1lbnRzIElUZXJtaW5hbFN5bWJvbHMsIENvbXBpbGVyTW9kaWZpZXJzIHsKK3B1YmxpYyBjbGFzcyBSZWNvdmVyZWRUeXBlIGV4dGVuZHMgUmVjb3ZlcmVkU3RhdGVtZW50IGltcGxlbWVudHMgVGVybWluYWxUb2tlbnMsIENvbXBpbGVyTW9kaWZpZXJzIHsKIAlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbjsKIAogCXB1YmxpYyBSZWNvdmVyZWRUeXBlW10gbWVtYmVyVHlwZXM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1JlY292ZXJlZFVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCmluZGV4IDI4ZWJjYzQuLjNjYTlhNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvUmVjb3ZlcmVkVW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NjYW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCmluZGV4IDg3ZjQ4ODkuLmM5OGY0ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU2Nhbm5lci5qYXZhCkBAIC0xLDI1ICsxLDI5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWw7CiAKLXB1YmxpYyBjbGFzcyBTY2FubmVyIGltcGxlbWVudHMgSVNjYW5uZXIsIElUZXJtaW5hbFN5bWJvbHMgeworLyoqCisgKiBJTVBPUlRBTlQgTk9URTogSW50ZXJuYWwgU2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgbWlycm9yZWQgaW4gCisgKiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciBwdWJsaWMgcGFja2FnZSB3aGVyZSBpdCBpcyBBUEkuIAorICogVGhlIG1pcnJvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2luZyB0aGUgYmFja3dhcmQgY29tcGF0aWJsZSBJVGVybWluYWxTeW1ib2xzIGNvbnN0YW50IAorICogZGVmaW5pdGlvbnMgKHN0YWJsZSB3aXRoIDIuMCksIHdoZXJlYXMgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHVzZXMgVGVybWluYWxUb2tlbnMgCisgKiB3aGljaCBjb25zdGFudCB2YWx1ZXMgcmVmbGVjdCB0aGUgbGF0ZXN0IHBhcnNlciBnZW5lcmF0aW9uIHN0YXRlLgorICovCitwdWJsaWMgY2xhc3MgU2Nhbm5lciBpbXBsZW1lbnRzIFRlcm1pbmFsVG9rZW5zIHsKIAogCS8qIEFQSXMgYXJlcwogCSAtIGdldE5leHRUb2tlbigpIHdoaWNoIHJldHVybiB0aGUgY3VycmVudCB0eXBlIG9mIHRoZSB0b2tlbgpAQCAtMzEsMjAgKzM1LDIwIEBACiAJKi8KIAogCS8vIDEuNCBmZWF0dXJlIAotCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRNb2RlOworCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRNb2RlID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7CiAJLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydCAKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsgCiAJCi0JcHVibGljIGJvb2xlYW4gcmVjb3JkTGluZVNlcGFyYXRvcjsKKwlwdWJsaWMgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yID0gZmFsc2U7CiAJcHVibGljIGNoYXIgY3VycmVudENoYXJhY3RlcjsKIAlwdWJsaWMgaW50IHN0YXJ0UG9zaXRpb247CiAJcHVibGljIGludCBjdXJyZW50UG9zaXRpb247CiAJcHVibGljIGludCBpbml0aWFsUG9zaXRpb24sIGVvZlBvc2l0aW9uOwogCS8vIGFmdGVyIHRoaXMgcG9zaXRpb24gZW9mIGFyZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWFsIHRva2VuIGZyb20gdGhlIHNvdXJjZQogCi0JcHVibGljIGJvb2xlYW4gdG9rZW5pemVDb21tZW50czsKLQlwdWJsaWMgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2U7CisJcHVibGljIGJvb2xlYW4gdG9rZW5pemVDb21tZW50cyA9IGZhbHNlOworCXB1YmxpYyBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSA9IGZhbHNlOwogCiAJLy9zb3VyY2Ugc2hvdWxkIGJlIHZpZXdlZCBhcyBhIHdpbmRvdyAoYWthIGEgcGFydCkKIAkvL29mIGEgZW50aXJlIHZlcnkgbGFyZ2Ugc3RyZWFtCkBAIC01OCwxMSArNjIsMTkgQEAKIAlwdWJsaWMgYm9vbGVhbiBzY2FubmluZ0Zsb2F0TGl0ZXJhbCA9IGZhbHNlOwogCiAJLy9zdXBwb3J0IGZvciAvKiogY29tbWVudHMKLQkvL3B1YmxpYyBjaGFyW11bXSBjb21tZW50cyA9IG5ldyBjaGFyWzEwXVtdOwogCXB1YmxpYyBpbnRbXSBjb21tZW50U3RvcHMgPSBuZXcgaW50WzEwXTsKIAlwdWJsaWMgaW50W10gY29tbWVudFN0YXJ0cyA9IG5ldyBpbnRbMTBdOwogCXB1YmxpYyBpbnQgY29tbWVudFB0ciA9IC0xOyAvLyBubyBjb21tZW50IHRlc3Qgd2l0aCBjb21tZW50UHRyIHZhbHVlIC0xCi0KKwkKKwkvLyB0YXNrIHRhZyBzdXBwb3J0CisJcHVibGljIGNoYXJbXVtdIGZvdW5kVGFza1RhZ3MgPSBudWxsOworCXB1YmxpYyBjaGFyW11bXSBmb3VuZFRhc2tNZXNzYWdlczsKKwlwdWJsaWMgY2hhcltdW10gZm91bmRUYXNrUHJpb3JpdGllcyA9IG51bGw7CisJcHVibGljIGludFtdW10gZm91bmRUYXNrUG9zaXRpb25zOworCXB1YmxpYyBpbnQgZm91bmRUYXNrQ291bnQgPSAwOworCXB1YmxpYyBjaGFyW11bXSB0YXNrVGFncyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIHRhc2tQcmlvcml0aWVzID0gbnVsbDsKKwkKIAkvL2RpZXQgcGFyc2luZyBzdXBwb3J0IC0ganVtcCBvdmVyIHNvbWUgbWV0aG9kIGJvZHkgd2hlbiByZXF1ZXN0ZWQKIAlwdWJsaWMgYm9vbGVhbiBkaWV0ID0gZmFsc2U7CiAKQEAgLTc2LDggKzg4LDcgQEAKIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfSEVYQSA9ICJJbnZhbGlkX0hleGFfTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX09DVEFMID0gIkludmFsaWRfT2N0YWxfTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCA9IAotCQkiSW52YWxpZF9DaGFyYWN0ZXJfQ29uc3RhbnQiOyAgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfQ0hBUkFDVEVSX0NPTlNUQU5UID0gIkludmFsaWRfQ2hhcmFjdGVyX0NvbnN0YW50IjsgIC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0VTQ0FQRSA9ICJJbnZhbGlkX0VzY2FwZSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0lOUFVUID0gIkludmFsaWRfSW5wdXQiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSA9ICJJbnZhbGlkX1VuaWNvZGVfRXNjYXBlIjsgLy8kTk9OLU5MUy0xJApAQCAtMTI2LDEzICsxMzcsMTIgQEAKIAlpbnQgY3VycmVudExpbmVOcj0gLTE7CiAJaW50IHByZXZpb3VzTGluZU5yPSAtMTsKIAlOTFNMaW5lIGN1cnJlbnRMaW5lPSBudWxsOwotCUxpc3QgbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJFRklYPSAiLy8kTk9OLU5MUy0iOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BSRUZJWF9MRU5HVEg9IFRBR19QUkVGSVgubGVuZ3RoKCk7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPU1RGSVg9ICIkIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19QT1NURklYX0xFTkdUSD0gVEFHX1BPU1RGSVgubGVuZ3RoKCk7CiAJcHVibGljIFN0cmluZ0xpdGVyYWxbXSBub25OTFNTdHJpbmdzID0gbnVsbDsKLQlwdWJsaWMgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gdHJ1ZTsKKwlwdWJsaWMgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gZmFsc2U7CiAJcHVibGljIGJvb2xlYW4gd2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IGZhbHNlOwogCQogCS8qc3RhdGljKi8gewpAQCAtMTU0LDE4ICsxNjQsMTMwIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3F1YXJlQnJhY2tldCA9IDE7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ3VybHlCcmFja2V0ID0gMjsJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQnJhY2tldEtpbmRzID0gMzsKKwogcHVibGljIFNjYW5uZXIoKSB7Ci0JdGhpcyhmYWxzZSwgZmFsc2UpOworCXRoaXMoZmFsc2UgLypjb21tZW50Ki8sIGZhbHNlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBmYWxzZSAvKmFzc2VydCovLCBudWxsLyp0YXNrVGFnKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8pOwogfQotcHVibGljIFNjYW5uZXIoYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCBib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSkgewotCXRoaXModG9rZW5pemVDb21tZW50cywgdG9rZW5pemVXaGl0ZVNwYWNlLCBmYWxzZSk7CQorcHVibGljIFNjYW5uZXIoCisJYm9vbGVhbiB0b2tlbml6ZUNvbW1lbnRzLCAKKwlib29sZWFuIHRva2VuaXplV2hpdGVTcGFjZSwgCisJYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzLCAKKwlib29sZWFuIGFzc2VydE1vZGUsCisJY2hhcltdW10gdGFza1RhZ3MsCisJY2hhcltdW10gdGFza1ByaW9yaXRpZXMpIHsKKwkJCisJdGhpcy5lb2ZQb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOworCXRoaXMudG9rZW5pemVDb21tZW50cyA9IHRva2VuaXplQ29tbWVudHM7CisJdGhpcy50b2tlbml6ZVdoaXRlU3BhY2UgPSB0b2tlbml6ZVdoaXRlU3BhY2U7CisJdGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsczsKKwl0aGlzLmFzc2VydE1vZGUgPSBhc3NlcnRNb2RlOworCXRoaXMudGFza1RhZ3MgPSB0YXNrVGFnczsKKwl0aGlzLnRhc2tQcmlvcml0aWVzID0gdGFza1ByaW9yaXRpZXM7CiB9CisKKwogcHVibGljICBmaW5hbCBib29sZWFuIGF0RW5kKCkgewogCS8vIFRoaXMgY29kZSBpcyBub3QgcmVsZXZhbnQgaWYgc291cmNlIGlzIAogCS8vIE9ubHkgYSBwYXJ0IG9mIHRoZSByZWFsIHN0cmVhbSBpbnB1dAogCiAJcmV0dXJuIHNvdXJjZS5sZW5ndGggPT0gY3VycmVudFBvc2l0aW9uOwogfQorCitwcml2YXRlIHZvaWQgY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpICB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlpZiAoY3VycmVudExpbmUgPT0gbnVsbCkKKwkJcmV0dXJuOworCXBhcnNlVGFncyhjdXJyZW50TGluZSk7Cit9CisKKy8vIGNoZWNoIHByZXNlbmNlIG9mIHRhc2s6IHRhZ3MKK3B1YmxpYyB2b2lkIGNoZWNrVGFza1RhZyhpbnQgY29tbWVudFN0YXJ0LCBpbnQgY29tbWVudEVuZCkgeworCisJLy8gb25seSBsb29rIGZvciBuZXdlciB0YXNrOiB0YWdzCisJaWYgKHRoaXMuZm91bmRUYXNrQ291bnQgPiAwICYmIHRoaXMuZm91bmRUYXNrUG9zaXRpb25zW3RoaXMuZm91bmRUYXNrQ291bnQtMV1bMF0gPj0gY29tbWVudFN0YXJ0KSB7CisJCXJldHVybjsKKwl9CisJaW50IGZvdW5kVGFza0luZGV4ID0gdGhpcy5mb3VuZFRhc2tDb3VudDsKKwluZXh0Q2hhcjogZm9yIChpbnQgaSA9IGNvbW1lbnRTdGFydDsgaSA8IGNvbW1lbnRFbmQgJiYgaSA8IHRoaXMuZW9mUG9zaXRpb247IGkrKykgeworCisJCWludCBuZXh0UG9zID0gLTE7CisJCWNoYXJbXSB0YWcgPSBudWxsOworCQljaGFyW10gcHJpb3JpdHkgPSBudWxsOworCQkKKwkJLy8gY2hlY2sgZm9yIHRhZyBvY2N1cnJlbmNlCisJCW5leHRUYWc6IGZvciAoaW50IGl0YWcgPSAwOyBpdGFnIDwgdGhpcy50YXNrVGFncy5sZW5ndGg7IGl0YWcrKyl7CisJCQl0YWcgPSB0aGlzLnRhc2tUYWdzW2l0YWddOworCQkJcHJpb3JpdHkgPSAKKwkJCQl0aGlzLnRhc2tQcmlvcml0aWVzICE9IG51bGwgJiYgaXRhZyA8IHRoaXMudGFza1ByaW9yaXRpZXMubGVuZ3RoID8KKwkJCQl0aGlzLnRhc2tQcmlvcml0aWVzW2l0YWddIDoKKwkJCQludWxsOworCQkJaW50IHRhZ0xlbmd0aCA9IHRhZy5sZW5ndGg7CisJCQlmb3IgKGludCB0ID0gMDsgdCA8IHRhZ0xlbmd0aDsgdCsrKXsKKwkJCQlpZiAodGhpcy5zb3VyY2VbaSt0XSAhPSB0YWdbdF0pIGNvbnRpbnVlIG5leHRUYWc7CisJCQl9CisJCQluZXh0UG9zID0gaSArIHRhZ0xlbmd0aDsKKworCQkJaWYgKHRoaXMuZm91bmRUYXNrVGFncyA9PSBudWxsKXsKKwkJCQl0aGlzLmZvdW5kVGFza1RhZ3MgPSBuZXcgY2hhcls1XVtdOworCQkJCXRoaXMuZm91bmRUYXNrTWVzc2FnZXMgPSBuZXcgY2hhcls1XVtdOworCQkJCXRoaXMuZm91bmRUYXNrUHJpb3JpdGllcyA9IG5ldyBjaGFyWzVdW107CisJCQkJdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnMgPSBuZXcgaW50WzVdW107CisJCQl9IGVsc2UgaWYgKHRoaXMuZm91bmRUYXNrQ291bnQgPT0gdGhpcy5mb3VuZFRhc2tUYWdzLmxlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5mb3VuZFRhc2tUYWdzLCAwLCB0aGlzLmZvdW5kVGFza1RhZ3MgPSBuZXcgY2hhclt0aGlzLmZvdW5kVGFza0NvdW50KjJdW10sIDAsIHRoaXMuZm91bmRUYXNrQ291bnQpOworCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5mb3VuZFRhc2tNZXNzYWdlcywgMCwgdGhpcy5mb3VuZFRhc2tNZXNzYWdlcyA9IG5ldyBjaGFyW3RoaXMuZm91bmRUYXNrQ291bnQqMl1bXSwgMCwgdGhpcy5mb3VuZFRhc2tDb3VudCk7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZvdW5kVGFza1ByaW9yaXRpZXMsIDAsIHRoaXMuZm91bmRUYXNrUHJpb3JpdGllcyA9IG5ldyBjaGFyW3RoaXMuZm91bmRUYXNrQ291bnQqMl1bXSwgMCwgdGhpcy5mb3VuZFRhc2tDb3VudCk7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZvdW5kVGFza1Bvc2l0aW9ucywgMCwgdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnMgPSBuZXcgaW50W3RoaXMuZm91bmRUYXNrQ291bnQqMl1bXSwgMCwgdGhpcy5mb3VuZFRhc2tDb3VudCk7CisJCQl9CisJCQl0aGlzLmZvdW5kVGFza1RhZ3NbdGhpcy5mb3VuZFRhc2tDb3VudF0gPSB0YWc7CisJCQl0aGlzLmZvdW5kVGFza1ByaW9yaXRpZXNbdGhpcy5mb3VuZFRhc2tDb3VudF0gPSBwcmlvcml0eTsKKwkJCXRoaXMuZm91bmRUYXNrUG9zaXRpb25zW3RoaXMuZm91bmRUYXNrQ291bnRdID0gbmV3IGludFtdeyBpLCAtMSB9OworCQkJdGhpcy5mb3VuZFRhc2tDb3VudCsrOworCQkJCisJCQlpID0gbmV4dFBvczsKKwkJfQorCX0KKwkKKwlmb3IgKGludCBpID0gZm91bmRUYXNrSW5kZXg7IGkgPCB0aGlzLmZvdW5kVGFza0NvdW50OyBpKyspIHsKKwkJLy8gcmV0cmlldmUgbWVzc2FnZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucworCQlpbnQgbXNnU3RhcnQgPSB0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVswXSArIHRoaXMuZm91bmRUYXNrVGFnc1tpXS5sZW5ndGg7CisJCWludCBlbmQ7CisJCWNoYXIgYzsKKwkJaW50IG1heF92YWx1ZSA9IGkgKyAxIDwgdGhpcy5mb3VuZFRhc2tDb3VudCA/IHRoaXMuZm91bmRUYXNrUG9zaXRpb25zW2kgKyAxXVswXSAtIDEgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJCisJCWVuZCA9IC0xOworCQlmb3IgKGludCBqID0gbXNnU3RhcnQ7IGogPCBjb21tZW50RW5kOyBqKyspeworCQkJaWYgKChjID0gdGhpcy5zb3VyY2Vbal0pID09ICdcbicgfHwgYyA9PSAnXHInKXsKKwkJCQllbmQgPSBqIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbmQgPSBlbmQgPCBtYXhfdmFsdWUgPyBlbmQgOiBtYXhfdmFsdWU7CisJCQorCQlpZiAoZW5kIDwgMCl7CisJCQlmb3IgKGludCBqID0gY29tbWVudEVuZC0xOyBqID49IG1zZ1N0YXJ0OyBqLS0peworCQkJCWlmICgoYyA9IHRoaXMuc291cmNlW2pdKSA9PSAnKicpIHsKKwkJCQkJZW5kID0gai0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZW5kIDwgMCkgZW5kID0gY29tbWVudEVuZC0xOworCQl9CisJCQorCQkvLyB0cmltIHRoZSBtZXNzYWdlCisJCXdoaWxlIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShzb3VyY2VbZW5kXSkgJiYgbXNnU3RhcnQgPD0gZW5kKSBlbmQtLTsKKwkJd2hpbGUgKENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKHNvdXJjZVttc2dTdGFydF0pICYmIG1zZ1N0YXJ0IDw9IGVuZCkgbXNnU3RhcnQrKzsKKworCQkvLyB1cGRhdGUgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgdGFzaworCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9uc1tpXVsxXSA9IGVuZDsKKwkJCisJCS8vIGdldCB0aGUgbWVzc2FnZSBzb3VyY2UKKwkJZmluYWwgaW50IG1lc3NhZ2VMZW5ndGggPSBlbmQtbXNnU3RhcnQrMTsKKwkJY2hhcltdIG1lc3NhZ2UgPSBuZXcgY2hhclttZXNzYWdlTGVuZ3RoXTsKKworCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgbXNnU3RhcnQsIG1lc3NhZ2UsIDAsIG1lc3NhZ2VMZW5ndGgpOworCQl0aGlzLmZvdW5kVGFza01lc3NhZ2VzW2ldID0gbWVzc2FnZTsKKwl9Cit9CisKIHB1YmxpYyBjaGFyW10gZ2V0Q3VycmVudElkZW50aWZpZXJTb3VyY2UoKSB7CiAJLy9yZXR1cm4gdGhlIHRva2VuIFJFQUwgc291cmNlIChha2EgdW5pY29kZXMgYXJlIHByZWNvbXB1dGVkKQogCkBAIC0yNDYsNiArMzY4LDE0IEBACiAJfQogCXJldHVybiByZXN1bHQ7CiB9CisKK3B1YmxpYyBmaW5hbCBjaGFyW10gZ2V0UmF3VG9rZW5Tb3VyY2UoKSB7CisJaW50IGxlbmd0aCA9IHRoaXMuY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uOworCWNoYXJbXSB0b2tlblNvdXJjZSA9IG5ldyBjaGFyW2xlbmd0aF07CisJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHRoaXMuc3RhcnRQb3NpdGlvbiwgdG9rZW5Tb3VyY2UsIDAsIGxlbmd0aCk7CisJcmV0dXJuIHRva2VuU291cmNlOwkKK30KKwkKIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFRva2VuU3RhcnRQb3NpdGlvbigpewogCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247CiB9CkBAIC0yNjYsNiArMzk2LDE1IEBACiAJaWYgKGxpbmVOdW1iZXIgPT0gbGluZUVuZHMubGVuZ3RoIC0gMSkgcmV0dXJuIGVvZlBvc2l0aW9uOwogCXJldHVybiBsaW5lRW5kc1tsaW5lTnVtYmVyLTFdOyAvLyBuZXh0IGxpbmUgc3RhcnQgb25lIGNoYXJhY3RlciBiZWhpbmQgdGhlIGxpbmVFbmQgb2YgdGhlIHByZXZpb3VzIGxpbmUKIH0KKworcHVibGljIGZpbmFsIGludFtdIGdldExpbmVFbmRzKCkgeworCS8vcmV0dXJuIGEgYm91bmRlZCBjb3B5IG9mIHRoaXMubGluZUVuZHMgCisKKwlpbnRbXSBjb3B5OworCVN5c3RlbS5hcnJheWNvcHkobGluZUVuZHMsIDAsIGNvcHkgPSBuZXcgaW50W2xpbmVQdHIgKyAxXSwgMCwgbGluZVB0ciArIDEpOworCXJldHVybiBjb3B5OworfQorCiAvKioKICAqIFNlYXJjaCB0aGUgc291cmNlIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGdpdmVuIGxpbmUgbnVtYmVyCiAgKgpAQCAtNjUxLDIwICs3OTAsMzcgQEAKIAkJZGlldCA9IGZhbHNlOwogCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uID4gc291cmNlLmxlbmd0aCA/IFRva2VuTmFtZUVPRiA6IFRva2VuTmFtZVJCUkFDRTsKIAl9CisJaW50IHdoaXRlU3RhcnQgPSAwOwogCXRyeSB7CiAJCXdoaWxlICh0cnVlKSB7IC8vbG9vcCBmb3IganVtcGluZyBvdmVyIGNvbW1lbnRzCiAJCQl3aXRob3V0VW5pY29kZVB0ciA9IDA7CiAJCQkvL3N0YXJ0IHdpdGggYSBuZXcgdG9rZW4gKGV2ZW4gY29tbWVudCB3cml0dGVuIHdpdGggdW5pY29kZSApCiAKIAkJCS8vIC0tLS0tLS0tLUNvbnN1bWUgd2hpdGUgc3BhY2UgYW5kIGhhbmRsZXMgc3RhcnRQb3NpdGlvbi0tLS0tLS0tLQotCQkJaW50IHdoaXRlU3RhcnQgPSBjdXJyZW50UG9zaXRpb247Ci0JCQlib29sZWFuIGlzV2hpdGVTcGFjZTsKKwkJCXdoaXRlU3RhcnQgPSBjdXJyZW50UG9zaXRpb247CisJCQlib29sZWFuIGlzV2hpdGVTcGFjZSwgaGFzV2hpdGVTcGFjZXMgPSBmYWxzZTsKKwkJCWludCBvZmZzZXQgPSAwOwogCQkJZG8gewogCQkJCXN0YXJ0UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247Ci0JCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJYm9vbGVhbiBjaGVja0lmVW5pY29kZSA9IGZhbHNlOworCQkJCXRyeSB7CisJCQkJCWNoZWNrSWZVbmljb2RlID0gKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1Jyk7CisJCQkJfSBjYXRjaChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKHRva2VuaXplV2hpdGVTcGFjZSAmJiAod2hpdGVTdGFydCAhPSBjdXJyZW50UG9zaXRpb24gLSAxKSkgeworCQkJCQkJLy8gcmVwb3NpdGlvbiBzY2FubmVyIGluIGNhc2Ugd2UgYXJlIGludGVyZXN0ZWQgYnkgc3BhY2VzIGFzIHRva2VucworCQkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJCQlzdGFydFBvc2l0aW9uID0gd2hpdGVTdGFydDsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVXSElURVNQQUNFOworCQkJCQl9CisJCQkJCWlmIChjdXJyZW50UG9zaXRpb24gPiBlb2ZQb3NpdGlvbikKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CisJCQkJfQorCQkJCWlmIChjaGVja0lmVW5pY29kZSkgewogCQkJCQlpc1doaXRlU3BhY2UgPSBqdW1wT3ZlclVuaWNvZGVXaGl0ZVNwYWNlKCk7CisJCQkJCW9mZnNldCA9IDY7CiAJCQkJfSBlbHNlIHsKKwkJCQkJb2Zmc2V0ID0gMTsKIAkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7CiAJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7CiAJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcikgewpAQCAtNjc0LDEyICs4MzAsMTUgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQlpc1doaXRlU3BhY2UgPSAKLQkJCQkJCShjdXJyZW50Q2hhcmFjdGVyID09ICcgJykgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJCQkoY3VycmVudENoYXJhY3RlciA9PSAnICcpIHx8IENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyYWN0ZXIpOyAKKwkJCQl9CisJCQkJaWYgKGlzV2hpdGVTcGFjZSkgeworCQkJCQloYXNXaGl0ZVNwYWNlcyA9IHRydWU7CiAJCQkJfQogCQkJfSB3aGlsZSAoaXNXaGl0ZVNwYWNlKTsKLQkJCWlmICh0b2tlbml6ZVdoaXRlU3BhY2UgJiYgKHdoaXRlU3RhcnQgIT0gY3VycmVudFBvc2l0aW9uIC0gMSkpIHsKKwkJCWlmICh0b2tlbml6ZVdoaXRlU3BhY2UgJiYgaGFzV2hpdGVTcGFjZXMpIHsKIAkJCQkvLyByZXBvc2l0aW9uIHNjYW5uZXIgaW4gY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBieSBzcGFjZXMgYXMgdG9rZW5zCi0JCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJY3VycmVudFBvc2l0aW9uLT1vZmZzZXQ7CiAJCQkJc3RhcnRQb3NpdGlvbiA9IHdoaXRlU3RhcnQ7CiAJCQkJcmV0dXJuIFRva2VuTmFtZVdISVRFU1BBQ0U7CiAJCQl9CkBAIC04NDAsOCArOTk5LDE2IEBACiAJCQkJCQlzY2FuRXNjYXBlQ2hhcmFjdGVyKCk7CiAJCQkJCWVsc2UgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCiAJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKLQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQotCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQlib29sZWFuIGNoZWNrSWZVbmljb2RlID0gZmFsc2U7CisJCQkJCQl0cnkgeworCQkJCQkJCWNoZWNrSWZVbmljb2RlID0gKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKTsKKwkJCQkJCX0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IGVvZlBvc2l0aW9uKQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCQkJfQorCQkJCQkJaWYgKGNoZWNrSWZVbmljb2RlKSB7CiAJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CkBAIC05NDgsOCArMTExNSw3IEBACiAJCQkJCX0KIAkJCQkJaWYgKGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpeyAvLyBjaGVjayBmb3IgcHJlc2VuY2Ugb2YJTkxTIHRhZ3MgLy8kTk9OLU5MUy0/JCB3aGVyZSA/IGlzIGFuIGludC4KIAkJCQkJCWlmIChjdXJyZW50TGluZSA9PSBudWxsKSB7Ci0JCQkJCQkJY3VycmVudExpbmU9IG5ldyBOTFNMaW5lKCk7Ci0JCQkJCQkJbGluZXMuYWRkKGN1cnJlbnRMaW5lKTsKKwkJCQkJCQljdXJyZW50TGluZSA9IG5ldyBOTFNMaW5lKCk7CiAJCQkJCQl9CiAJCQkJCQljdXJyZW50TGluZS5hZGQoCiAJCQkJCQkJbmV3IFN0cmluZ0xpdGVyYWwoCkBAIC05NjIsNyArMTEyOCw2IEBACiAJCQkJCXsKIAkJCQkJCWludCB0ZXN0OwogCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJy8nLCAnKicpKSA9PSAwKSB7IC8vbGluZSBjb21tZW50IAotCQkJCQkJCWludCBlbmRQb3NpdGlvbkZvckxpbmVDb21tZW50ID0gMDsKIAkJCQkJCQl0cnkgeyAvL2dldCB0aGUgbmV4dCBjaGFyIAogCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CkBAIC0xMDIzLDEyICsxMTg4LDQ2IEBACiAJCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOwogCQkJCQkJCQkJfSAvL2p1bXAgb3ZlciB0aGUgXFwKIAkJCQkJCQkJfQotCQkJCQkJCQlpZiAoaXNVbmljb2RlKSB7Ci0JCQkJCQkJCQllbmRQb3NpdGlvbkZvckxpbmVDb21tZW50ID0gY3VycmVudFBvc2l0aW9uIC0gNjsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWVuZFBvc2l0aW9uRm9yTGluZUNvbW1lbnQgPSBjdXJyZW50UG9zaXRpb24gLSAxOwotCQkJCQkJCQl9CisJCQkJCQkJCS8qCisJCQkJCQkJCSAqIFdlIG5lZWQgdG8gY29tcGxldGVseSBjb25zdW1lIHRoZSBsaW5lIGJyZWFrCisJCQkJCQkJCSAqLworCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXHInCisJCQkJCQkJCSAgICYmIHNvdXJjZS5sZW5ndGggPiBjdXJyZW50UG9zaXRpb24pIHsKKwkJCQkJCQkJICAgCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdcbic7CisJCQkJCQkJCSAgIAl9IGVsc2UgaWYgKChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgMV0gPT0gJ3UnKSkgeworCQkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCQkJY2hhciB1bmljb2RlQ2hhcjsKKwkJCQkJCQkJCQlpbnQgaW5kZXggPSBjdXJyZW50UG9zaXRpb24gKyAxOworCQkJCQkJCQkJCWluZGV4Kys7CisJCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtpbmRleF0gPT0gJ3UnKSB7CisJCQkJCQkJCQkJCWluZGV4Kys7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtpbmRleCsrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2luZGV4KytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMiA8IDAKKwkJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbaW5kZXgrK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtpbmRleCsrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzQgPCAwKSB7CisJCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiA9IGluZGV4OworCQkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCXVuaWNvZGVDaGFyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAodW5pY29kZUNoYXIgPT0gJ1xuJykgeworCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24gPSBpbmRleDsKKwkJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdcbic7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCSAgIAl9CiAJCQkJCQkJCXJlY29yZENvbW1lbnQoZmFsc2UpOworCQkJCQkJCQlpZiAodGhpcy50YXNrVGFncyAhPSBudWxsKSBjaGVja1Rhc2tUYWcodGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmN1cnJlbnRQb3NpdGlvbik7CiAJCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgewogCQkJCQkJCQkJY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpOwogCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsKQEAgLTEwNDIsNjUgKzEyNDEsNzEgQEAKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgewotCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsKLQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24gPSBlbmRQb3NpdGlvbkZvckxpbmVDb21tZW50OyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAotCQkJCQkJCQkJfQogCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKIAkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeyAvL2FuIGVvZiB3aWxsIHRoZW0gYmUgZ2VuZXJhdGVkCi0JCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgewotCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAotCQkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0xJTkU7Ci0JCQkJCQkJCQl9CisJCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCXJlY29yZENvbW1lbnQoZmFsc2UpOworCQkJCQkJCQlpZiAodGhpcy50YXNrVGFncyAhPSBudWxsKSBjaGVja1Rhc2tUYWcodGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmN1cnJlbnRQb3NpdGlvbi0xKTsKKwkJCQkJCQkJaWYgKHRva2VuaXplQ29tbWVudHMpIHsKKwkJCQkJCQkJCXRoaXMuY3VycmVudFBvc2l0aW9uLS07IC8vIHJlc2V0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kCisJCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUVOVF9MSU5FOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJaWYgKHRlc3QgPiAwKSB7IC8vdHJhZGl0aW9uYWwgYW5kIGFubm90YXRpb24gY29tbWVudAotCQkJCQkJCWJvb2xlYW4gaXNKYXZhZG9jID0gZmFsc2UsIHN0YXIgPSBmYWxzZTsKLQkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCi0JCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7Ci0JCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCi0JCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7Ci0JCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7Ci0JCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnKicpIHsKLQkJCQkJCQkJaXNKYXZhZG9jID0gdHJ1ZTsKLQkJCQkJCQkJc3RhciA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgewotCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7Ci0JCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7Ci0JCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIKKwkJCQkJCQkJYm9vbGVhbiBpc0phdmFkb2MgPSBmYWxzZSwgc3RhciA9IGZhbHNlOworCQkJCQkJCQlib29sZWFuIGlzVW5pY29kZSA9IGZhbHNlOworCQkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CiAJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQljdXJyZW50TGluZSA9IG51bGw7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQkJfQogCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCisJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICcqJykgeworCQkJCQkJCQkJaXNKYXZhZG9jID0gdHJ1ZTsKKwkJCQkJCQkJCXN0YXIgPSB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgeworCQkJCQkJCQkJY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpOworCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IpIHsKKwkJCQkJCQkJCQlpZiAoIWlzVW5pY29kZSkgeworCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudExpbmUgPSBudWxsOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlzVW5pY29kZSA9IGZhbHNlOwogCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCiAJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2hhbmRsZSB0aGUgXFx1IGNhc2UgbWFudWFsbHkgaW50byBjb21tZW50CiAJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdcXCcpIHsKIAkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQogCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOyAvL2p1bXAgb3ZlciB0aGUgXFwKIAkJCQkJCQkJfQotCQkJCQkJCQkvLyBlbXB0eSBjb21tZW50IGlzIG5vdCBhIGphdmFkb2MgLyoqLwotCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnLycpIHsgCi0JCQkJCQkJCQlpc0phdmFkb2MgPSBmYWxzZTsKLQkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8KIAkJCQkJCQkJd2hpbGUgKChjdXJyZW50Q2hhcmFjdGVyICE9ICcvJykgfHwgKCFzdGFyKSkgewogCQkJCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7CiAJCQkJCQkJCQkJY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpOwogCQkJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7Ci0JCQkJCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQkJCWlmICghaXNVbmljb2RlKSB7CisJCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCQkJY3VycmVudExpbmUgPSBudWxsOwogCQkJCQkJCQkJCX0KQEAgLTExMTEsNiArMTMxNiw5IEBACiAJCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCiAJCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQl9CiAJCQkJCQkJCQkvL2hhbmRsZSB0aGUgXFx1IGNhc2UgbWFudWFsbHkgaW50byBjb21tZW50CiAJCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CkBAIC0xMTE5LDYgKzEzMjcsNyBAQAogCQkJCQkJCQkJfSAvL2p1bXAgb3ZlciB0aGUgXFwKIAkJCQkJCQkJfQogCQkJCQkJCQlyZWNvcmRDb21tZW50KGlzSmF2YWRvYyk7CisJCQkJCQkJCWlmICh0aGlzLnRhc2tUYWdzICE9IG51bGwpIGNoZWNrVGFza1RhZyh0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuY3VycmVudFBvc2l0aW9uKTsKIAkJCQkJCQkJaWYgKHRva2VuaXplQ29tbWVudHMpIHsKIAkJCQkJCQkJCWlmIChpc0phdmFkb2MpCiAJCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfSkFWQURPQzsKQEAgLTExNDksNiArMTM1OCwxMiBAQAogCQl9CiAJfSAvLy0tLS0tLS0tLS0tLS0tLS0tZW5kIHN3aXRjaCB3aGlsZSB0cnktLS0tLS0tLS0tLS0tLS0tLS0tLQogCWNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaWYgKHRva2VuaXplV2hpdGVTcGFjZSAmJiAod2hpdGVTdGFydCAhPSBjdXJyZW50UG9zaXRpb24gLSAxKSkgeworCQkJLy8gcmVwb3NpdGlvbiBzY2FubmVyIGluIGNhc2Ugd2UgYXJlIGludGVyZXN0ZWQgYnkgc3BhY2VzIGFzIHRva2VucworCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQlzdGFydFBvc2l0aW9uID0gd2hpdGVTdGFydDsKKwkJCXJldHVybiBUb2tlbk5hbWVXSElURVNQQUNFOworCQl9CiAJfQogCXJldHVybiBUb2tlbk5hbWVFT0Y7CiB9CkBAIC0xMTk2LDYgKzE0MTEsMTEgQEAKIAl9CiAJdW5pY29kZUFzQmFja1NsYXNoID0gY3VycmVudENoYXJhY3RlciA9PSAnXFwnOwogfQorCitwdWJsaWMgY2hhcltdIGdldFNvdXJjZSgpeworCXJldHVybiB0aGlzLnNvdXJjZTsKK30KKwogLyogVG9rZW5pemUgYSBtZXRob2QgYm9keSwgYXNzdW1pbmcgdGhhdCBjdXJseSBicmFja2V0cyBhcmUgcHJvcGVybHkgYmFsYW5jZWQuCiAgKi8KIHB1YmxpYyBmaW5hbCB2b2lkIGp1bXBPdmVyTWV0aG9kQm9keSgpIHsKQEAgLTEyMTUsNyArMTQzNSw3IEBACiAJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCiAJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKQogCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKLQkJCQkJaXNXaGl0ZVNwYWNlID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQkJaXNXaGl0ZVNwYWNlID0gQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UoY3VycmVudENoYXJhY3Rlcik7CiAJCQkJfQogCQkJfSB3aGlsZSAoaXNXaGl0ZVNwYWNlKTsKIApAQCAtMTMwMywxMiArMTUyMywxNCBAQAogCQkJCWNhc2UgJy8nIDoKIAkJCQkJewogCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlib29sZWFuIGlzVW5pY29kZTsKIAkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCcvJywgJyonKSkgPT0gMCkgeyAvL2xpbmUgY29tbWVudCAKIAkJCQkJCQl0cnkgewogCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAogCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKIAkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CiAJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOwogCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKIAkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOwogCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgewpAQCAtMTMyNyw2ICsxNTQ5LDggQEAKIAkJCQkJCQkJCWVsc2UgewogCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CiAJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJfQogCiAJCQkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CkBAIC0xMzM2LDYgKzE1NjAsNyBAQAogCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KIAkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwogCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CiAJCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgewogCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJCQl9CkBAIC0xMzUyLDIzICsxNTc3LDMxIEBACiAJCQkJCQkJCQkJZWxzZSB7CiAJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CiAJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgotCQkJCQkJCQkJJiYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkKLQkJCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKSB7CisJCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CiAJCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJfSAvL2FuIGVvZiB3aWxsIHRoZW0gYmUgZ2VuZXJhdGVkCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlpZiAodGVzdCA+IDApIHsgLy90cmFkaXRpb25hbCBhbmQgYW5ub3RhdGlvbiBjb21tZW50CisJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJYm9vbGVhbiBzdGFyID0gZmFsc2U7CiAJCQkJCQkJdHJ5IHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgogCQkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKIAkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOwogCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CiAJCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgewogCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKIAkJCQkJCQkJCX0KQEAgLTEzNzksMTIgKzE2MTIsMTYgQEAKIAkJCQkJCQkJc3RhciA9IHRydWU7CiAJCQkJCQkJfQogCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCi0JCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpCi0JCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpIHsKKwkJCQkJCQkJCWlmICghaXNVbmljb2RlKSB7CisJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQl9CiAJCQkJCQkJdHJ5IHsgLy9nZXQgdGhlIG5leHQgY2hhciAKIAkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgewogCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKIAkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CiAJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKIAkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKQEAgLTE0MDMsMTcgKzE2NDAsMjMgQEAKIAkJCQkJCQkJCWVsc2UgewogCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CiAJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJfQogCQkJCQkJCQkvL2xvb3AgdW50aWwgZW5kIG9mIGNvbW1lbnQgKi8gCiAJCQkJCQkJCXdoaWxlICgoY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsKIAkJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yCi0JCQkJCQkJCQkJJiYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkKLQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpIHsKKwkJCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KIAkJCQkJCQkJCXN0YXIgPSBjdXJyZW50Q2hhcmFjdGVyID09ICcqJzsKIAkJCQkJCQkJCS8vZ2V0IG5leHQgY2hhcgogCQkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKIAkJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKIAkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOwogCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOwogCQkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKQEAgLTE0MzIsNiArMTY3NSw4IEBACiAJCQkJCQkJCQkJZWxzZSB7CiAJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CiAJCQkJCQkJCQkJfQorCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKIAkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewpAQCAtMTQ5MSwxMCArMTczNiw3IEBACiAJCX0KIAogCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOwotCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgotCQkJJiYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSkKLQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7Ci0JCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyYWN0ZXIpKQorCQlpZiAoQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UoY3VycmVudENoYXJhY3RlcikpCiAJCQlyZXR1cm4gdHJ1ZTsKIAogCQkvL2J1ZmZlciB0aGUgbmV3IGNoYXIgd2hpY2ggaXMgbm90IGEgd2hpdGUgc3BhY2UKQEAgLTE1MDUsMTcgKzE3NDcsNyBAQAogCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOwogCX0KIH0KLXB1YmxpYyBmaW5hbCBpbnRbXSBnZXRMaW5lRW5kcygpIHsKLQkvL3JldHVybiBhIGJvdW5kZWQgY29weSBvZiB0aGlzLmxpbmVFbmRzIAogCi0JaW50W10gY29weTsKLQlTeXN0ZW0uYXJyYXljb3B5KGxpbmVFbmRzLCAwLCBjb3B5ID0gbmV3IGludFtsaW5lUHRyICsgMV0sIDAsIGxpbmVQdHIgKyAxKTsKLQlyZXR1cm4gY29weTsKLX0KLQotcHVibGljIGNoYXJbXSBnZXRTb3VyY2UoKXsKLQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci19CiBmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMSgpIHsKIAkvL3JldHVybiBhbHdheXMgdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQogCkBAIC0xNzYzLDYgKzE5OTUsNDggQEAKIAluZXdFbnRyeTYgPSBtYXg7CiAJcmV0dXJuIHI7CQogfQorcHJpdmF0ZSB2b2lkIHBhcnNlVGFncyhOTFNMaW5lIGxpbmUpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCVN0cmluZyBzID0gbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CisJaW50IHBvcyA9IHMuaW5kZXhPZihUQUdfUFJFRklYKTsKKwlpbnQgbGluZUxlbmd0aCA9IGxpbmUuc2l6ZSgpOworCXdoaWxlIChwb3MgIT0gLTEpIHsKKwkJaW50IHN0YXJ0ID0gcG9zICsgVEFHX1BSRUZJWF9MRU5HVEg7CisJCWludCBlbmQgPSBzLmluZGV4T2YoVEFHX1BPU1RGSVgsIHN0YXJ0KTsKKwkJaWYgKGVuZCAhPSAtMSkgeworCQkJU3RyaW5nIGluZGV4ID0gcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisJCQlpbnQgaSA9IDA7CisJCQl0cnkgeworCQkJCWkgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGV4KSAtIDE7IC8vIFRhZ3MgYXJlIG9uZSBiYXNlZCBub3QgemVybyBiYXNlZC4KKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJaSA9IC0xOyAvLyB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoaXMgYXMgYSB2YWxpZCBOTFMgdGFnCisJCQl9CisJCQlpZiAobGluZS5leGlzdHMoaSkpIHsKKwkJCQlsaW5lLnNldChpLCBudWxsKTsKKwkJCX0KKwkJfQorCQlwb3MgPSBzLmluZGV4T2YoVEFHX1BSRUZJWCwgc3RhcnQpOworCX0KKworCXRoaXMubm9uTkxTU3RyaW5ncyA9IG5ldyBTdHJpbmdMaXRlcmFsW2xpbmVMZW5ndGhdOworCWludCBub25OTFNDb3VudGVyID0gMDsKKwlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGluZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgeworCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSAoU3RyaW5nTGl0ZXJhbCkgaXRlcmF0b3IubmV4dCgpOworCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7CisJCQl0aGlzLm5vbk5MU1N0cmluZ3Nbbm9uTkxTQ291bnRlcisrXSA9IGxpdGVyYWw7CisJCX0KKwl9CisJaWYgKG5vbk5MU0NvdW50ZXIgPT0gMCkgeworCQl0aGlzLm5vbk5MU1N0cmluZ3MgPSBudWxsOworCQljdXJyZW50TGluZSA9IG51bGw7CisJCXJldHVybjsKKwl9IAorCXRoaXMud2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IHRydWU7CisJaWYgKG5vbk5MU0NvdW50ZXIgIT0gbGluZUxlbmd0aCkgeworCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMubm9uTkxTU3RyaW5ncywgMCwgKHRoaXMubm9uTkxTU3RyaW5ncyA9IG5ldyBTdHJpbmdMaXRlcmFsW25vbk5MU0NvdW50ZXJdKSwgMCwgbm9uTkxTQ291bnRlcik7CisJfQorCWN1cnJlbnRMaW5lID0gbnVsbDsKK30KKwogcHVibGljIGZpbmFsIHZvaWQgcHVzaExpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkvL3NlZSBjb21tZW50IG9uIGlzTGluZURlbGltaXRlcihjaGFyKSBmb3IgdGhlIHVzZSBvZiAnXG4nIGFuZCAnXHInCiAJZmluYWwgaW50IElOQ1JFTUVOVCA9IDI1MDsKQEAgLTE4MjcsMTMgKzIxMDEsNiBAQAogCX0KIH0KIHB1YmxpYyBmaW5hbCB2b2lkIHB1c2hVbmljb2RlTGluZVNlcGFyYXRvcigpIHsKLQkvLyBpc1VuaWNvZGUgbWVhbnMgdGhhdCB0aGUgXHIgb3IgXG4gaGFzIGJlZW4gcmVhZCBhcyBhIHVuaWNvZGUgY2hhcmFjdGVyCi0JCi0JLy9zZWUgY29tbWVudCBvbiBpc0xpbmVEZWxpbWl0ZXIoY2hhcikgZm9yIHRoZSB1c2Ugb2YgJ1xuJyBhbmQgJ1xyJwotCi0JZmluYWwgaW50IElOQ1JFTUVOVCA9IDI1MDsKLQkvL2N1cnJlbnRDaGFyYWN0ZXIgaXMgYXQgcG9zaXRpb24gY3VycmVudFBvc2l0aW9uLTEKLQogCWlmICh0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMpIHsKIAkvLyByZWluaXRpYWxpemUgdGhlIGN1cnJlbnQgbGluZSBmb3Igbm9uIGV4dGVybmFsaXplIHN0cmluZ3MgcHVycG9zZQogCQljdXJyZW50TGluZSA9IG51bGw7CkBAIC0xODQxLDI0ICsyMTA4LDcgQEAKIAkKIAkvLyBjciAwMDBECiAJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgewotCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gNjsKLQkJaWYgKChsaW5lUHRyID4gMCkgJiYgKGxpbmVFbmRzW2xpbmVQdHJdID49IHNlcGFyYXRvclBvcykpIHJldHVybjsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNSLSIgKyBzZXBhcmF0b3JQb3MpOwotCQl0cnkgewotCQkJbGluZUVuZHNbKytsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2xpbmVQdHIgdmFsdWUgaXMgY29ycmVjdAotCQkJaW50IG9sZExlbmd0aCA9IGxpbmVFbmRzLmxlbmd0aDsKLQkJCWludFtdIG9sZCA9IGxpbmVFbmRzOwotCQkJbGluZUVuZHMgPSBuZXcgaW50W29sZExlbmd0aCArIElOQ1JFTUVOVF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgbGluZUVuZHMsIDAsIG9sZExlbmd0aCk7Ci0JCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKLQkJfQotCQkvLyBsb29rLWFoZWFkIGZvciBtZXJnZWQgY3IrbGYKIAkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcbicpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29rLWFoZWFkIExGLSIgKyBjdXJyZW50UG9zaXRpb24pOwkJCQotCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb247Ci0JCQljdXJyZW50UG9zaXRpb24rKzsKIAkJCXdhc0FjciA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJd2FzQWNyID0gdHJ1ZTsKQEAgLTE4NjYsMjQgKzIxMTYsNiBAQAogCX0gZWxzZSB7CiAJCS8vIGxmIDAwMEEKIAkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykgeyAvL211c3QgbWVyZ2UgZXZlbnR1YWwgY3IgZm9sbG93ZWQgYnkgbGYKLQkJCWlmICh3YXNBY3IgJiYgKGxpbmVFbmRzW2xpbmVQdHJdID09IChjdXJyZW50UG9zaXRpb24gLSA3KSkpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWVyZ2UgTEYtIiArIChjdXJyZW50UG9zaXRpb24gLSAxKSk7CQkJCQkJCQotCQkJCWxpbmVFbmRzW2xpbmVQdHJdID0gY3VycmVudFBvc2l0aW9uIC0gNjsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHNlcGFyYXRvclBvcyA9IGN1cnJlbnRQb3NpdGlvbiAtIDY7Ci0JCQkJaWYgKChsaW5lUHRyID4gMCkgJiYgKGxpbmVFbmRzW2xpbmVQdHJdID49IHNlcGFyYXRvclBvcykpIHJldHVybjsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxGLSIgKyBzZXBhcmF0b3JQb3MpOwkJCQkJCQkKLQkJCQl0cnkgewotCQkJCQlsaW5lRW5kc1srK2xpbmVQdHJdID0gc2VwYXJhdG9yUG9zOwotCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQkvL2xpbmVQdHIgdmFsdWUgaXMgY29ycmVjdAotCQkJCQlpbnQgb2xkTGVuZ3RoID0gbGluZUVuZHMubGVuZ3RoOwotCQkJCQlpbnRbXSBvbGQgPSBsaW5lRW5kczsKLQkJCQkJbGluZUVuZHMgPSBuZXcgaW50W29sZExlbmd0aCArIElOQ1JFTUVOVF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkLCAwLCBsaW5lRW5kcywgMCwgb2xkTGVuZ3RoKTsKLQkJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBzZXBhcmF0b3JQb3M7Ci0JCQkJfQotCQkJfQogCQkJd2FzQWNyID0gZmFsc2U7CiAJCX0KIAl9CkBAIC0xODkyLDIyICsyMTI0LDIzIEBACiAKIAkvLyBhIG5ldyBhbm5vdGF0aW9uIGNvbW1lbnQgaXMgcmVjb3JkZWQKIAl0cnkgewotCQljb21tZW50U3RvcHNbKytjb21tZW50UHRyXSA9IGlzSmF2YWRvYyA/IGN1cnJlbnRQb3NpdGlvbiA6IC1jdXJyZW50UG9zaXRpb247CisJCXRoaXMuY29tbWVudFN0b3BzWysrdGhpcy5jb21tZW50UHRyXSA9IGlzSmF2YWRvYyA/IHRoaXMuY3VycmVudFBvc2l0aW9uIDogLXRoaXMuY3VycmVudFBvc2l0aW9uOwogCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQlpbnQgb2xkU3RhY2tMZW5ndGggPSBjb21tZW50U3RvcHMubGVuZ3RoOwotCQlpbnRbXSBvbGRTdGFjayA9IGNvbW1lbnRTdG9wczsKLQkJY29tbWVudFN0b3BzID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIDMwXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRTdGFjaywgMCwgY29tbWVudFN0b3BzLCAwLCBvbGRTdGFja0xlbmd0aCk7Ci0JCWNvbW1lbnRTdG9wc1tjb21tZW50UHRyXSA9IGlzSmF2YWRvYyA/IGN1cnJlbnRQb3NpdGlvbiA6IC1jdXJyZW50UG9zaXRpb247CisJCWludCBvbGRTdGFja0xlbmd0aCA9IHRoaXMuY29tbWVudFN0b3BzLmxlbmd0aDsKKwkJaW50W10gb2xkU3RhY2sgPSB0aGlzLmNvbW1lbnRTdG9wczsKKwkJdGhpcy5jb21tZW50U3RvcHMgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgMzBdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZFN0YWNrLCAwLCB0aGlzLmNvbW1lbnRTdG9wcywgMCwgb2xkU3RhY2tMZW5ndGgpOworCQl0aGlzLmNvbW1lbnRTdG9wc1t0aGlzLmNvbW1lbnRQdHJdID0gaXNKYXZhZG9jID8gdGhpcy5jdXJyZW50UG9zaXRpb24gOiAtdGhpcy5jdXJyZW50UG9zaXRpb247CiAJCS8vZ3Jvd3MgdGhlIHBvc2l0aW9ucyBidWZmZXJzIHRvbwotCQlpbnRbXSBvbGQgPSBjb21tZW50U3RhcnRzOwotCQljb21tZW50U3RhcnRzID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIDMwXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGNvbW1lbnRTdGFydHMsIDAsIG9sZFN0YWNrTGVuZ3RoKTsKKwkJaW50W10gb2xkID0gdGhpcy5jb21tZW50U3RhcnRzOworCQl0aGlzLmNvbW1lbnRTdGFydHMgPSBuZXcgaW50W29sZFN0YWNrTGVuZ3RoICsgMzBdOworCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgdGhpcy5jb21tZW50U3RhcnRzLCAwLCBvbGRTdGFja0xlbmd0aCk7CiAJfQogCiAJLy90aGUgYnVmZmVyIGlzIG9mIGEgY29ycmVjdCBzaXplIGhlcmUKLQljb21tZW50U3RhcnRzW2NvbW1lbnRQdHJdID0gc3RhcnRQb3NpdGlvbjsKKwl0aGlzLmNvbW1lbnRTdGFydHNbdGhpcy5jb21tZW50UHRyXSA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKIH0KKwogcHVibGljIHZvaWQgcmVzZXRUbyhpbnQgYmVnaW4sIGludCBlbmQpIHsKIAkvL3Jlc2V0IHRoZSBzY2FubmVyIHRvIGEgZ2l2ZW4gcG9zaXRpb24gd2hlcmUgaXQgbWF5IHJlc2NhbiBhZ2FpbgogCkBAIC0xOTE1LDYgKzIxNDgsOCBAQAogCWluaXRpYWxQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb24gPSBiZWdpbjsKIAllb2ZQb3NpdGlvbiA9IGVuZCA8IEludGVnZXIuTUFYX1ZBTFVFID8gZW5kICsgMSA6IGVuZDsKIAljb21tZW50UHRyID0gLTE7IC8vIHJlc2V0IGNvbW1lbnQgc3RhY2sKKwlmb3VuZFRhc2tDb3VudCA9IDA7CisKIH0KIAogcHVibGljIGZpbmFsIHZvaWQgc2NhbkVzY2FwZUNoYXJhY3RlcigpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewpAQCAtMjAwNCw3ICsyMjM5LDcgQEAKIAkvL2ZpcnN0IGRpc3BhdGNoIG9uIHRoZSBmaXJzdCBjaGFyLgogCS8vdGhlbiB0aGUgbGVuZ3RoLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbAogCS8va2V5d29ycyB3aXRoIHRoZSBzYW1lIGxlbmd0aCBBTkQgdGhlIHNhbWUgZmlyc3QgY2hhciwgdGhlbiBkbyBhbm90aGVyCi0JLy9kaXNwdGFjaCBvbiB0aGUgc2Vjb25kIGNoYXIgOi0pLi4uY29vbC4uLi5idXQgZmFzdCAhCisJLy9kaXNwYXRjaCBvbiB0aGUgc2Vjb25kIGNoYXIgCiAJdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7CiAJd2hpbGUgKGdldE5leHRDaGFyQXNKYXZhSWRlbnRpZmllclBhcnQoKSkge307CiAKQEAgLTI2MDksOSArMjg0NCwyNSBAQAogCQkJaWYgKGdldE5leHRDaGFyKCdkJywgJ0QnKSA+PSAwKSB7CiAJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CiAJCQl9IGVsc2UgeyAvL21ha2UgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gb2N0YWwgYW5kIGZsb2F0IC4uLi4KLQkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgeyAvL2JpbmdvICEgLi4uLgorCQkJCWJvb2xlYW4gaXNJbnRlZ2VyID0gdHJ1ZTsKKwkJCQlpZiAoZ2V0TmV4dENoYXIoJy4nKSkgeyAKKwkJCQkJaXNJbnRlZ2VyID0gZmFsc2U7CiAJCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307Ci0JCQkJCWlmIChnZXROZXh0Q2hhcignZScsICdFJykgPj0gMCkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJfQorCQkJCWlmIChnZXROZXh0Q2hhcignZScsICdFJykgPj0gMCkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCWlzSW50ZWdlciA9IGZhbHNlOworCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnLScpCisJCQkJCQl8fCAoY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKIAkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOwogCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCiAJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKQEAgLTI2MjEsMzAgKzI4NzIsMTYgQEAKIAkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOwogCQkJCQkJCX0KIAkJCQkJCX0KLQotCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICctJykKLQkJCQkJCQl8fCAoY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKLQkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKLQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKLQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKLQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKLQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlcikpCi0JCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKLQkJCQkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307CiAJCQkJCX0KLQkJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKQotCQkJCQkJcmV0dXJuIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsOwotCQkJCQlnZXROZXh0Q2hhcignZCcsICdEJyk7IC8vanVtcCBvdmVyIHBvdGVudGlhbCBkIG9yIEQKLQkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOworCQkJCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKQorCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKKwkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKIAkJCQl9CisJCQkJaWYgKGdldE5leHRDaGFyKCdmJywgJ0YnKSA+PSAwKQorCQkJCQlyZXR1cm4gVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw7CisJCQkJaWYgKGdldE5leHRDaGFyKCdkJywgJ0QnKSA+PSAwIHx8ICFpc0ludGVnZXIpCisJCQkJCXJldHVybiBUb2tlbk5hbWVEb3VibGVMaXRlcmFsOworCQkJCXJldHVybiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIGNhcnJ5IG9uICovCkBAIC0yNzM0LDExICsyOTcxLDEyIEBACiAJLy90aGUgc291cmNlLWJ1ZmZlciBpcyBzZXQgdG8gc291cmNlU3RyaW5nCiAKIAlpZiAoc291cmNlID09IG51bGwpIHsKLQkJdGhpcy5zb3VyY2UgPSBuZXcgY2hhclswXTsKKwkJdGhpcy5zb3VyY2UgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJfSBlbHNlIHsKIAkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAJfQogCXN0YXJ0UG9zaXRpb24gPSAtMTsKKwllb2ZQb3NpdGlvbiA9IHNvdXJjZS5sZW5ndGg7CiAJaW5pdGlhbFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uID0gMDsKIAljb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsKIAl3aXRob3V0VW5pY29kZUJ1ZmZlciA9IG5ldyBjaGFyW3RoaXMuc291cmNlLmxlbmd0aF07CkBAIC0yNzY1LDcgKzMwMDMsNyBAQAogCQkJMCwgCiAJCQltaWRkbGVMZW5ndGgpOwogCX0gZWxzZSB7Ci0JCW1pZGRsZSA9IG5ldyBjaGFyWzBdOworCQltaWRkbGUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJfQogCQogCWNoYXIgZW5kW10gPSBuZXcgY2hhcltzb3VyY2UubGVuZ3RoIC0gKGN1cnJlbnRQb3NpdGlvbiAtIDEpXTsKQEAgLTI5OTQsNjIgKzMyMzIsNCBAQAogCQkJcmV0dXJuICJub3QtYS10b2tlbiI7IC8vJE5PTi1OTFMtMSQKIAl9CiB9Ci0KLXB1YmxpYyBTY2FubmVyKGJvb2xlYW4gdG9rZW5pemVDb21tZW50cywgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIGJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgewotCXRoaXModG9rZW5pemVDb21tZW50cywgdG9rZW5pemVXaGl0ZVNwYWNlLCBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyBTY2FubmVyKGJvb2xlYW4gdG9rZW5pemVDb21tZW50cywgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIGJvb2xlYW4gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscywgYm9vbGVhbiBhc3NlcnRNb2RlKSB7Ci0JdGhpcy5lb2ZQb3NpdGlvbiA9IEludGVnZXIuTUFYX1ZBTFVFOwotCXRoaXMudG9rZW5pemVDb21tZW50cyA9IHRva2VuaXplQ29tbWVudHM7Ci0JdGhpcy50b2tlbml6ZVdoaXRlU3BhY2UgPSB0b2tlbml6ZVdoaXRlU3BhY2U7Ci0JdGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsczsKLQl0aGlzLmFzc2VydE1vZGUgPSBhc3NlcnRNb2RlOwotfQotCi1wcml2YXRlIHZvaWQgY2hlY2tOb25FeHRlcm5hbGl6ZVN0cmluZygpICB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQlpZiAoY3VycmVudExpbmUgPT0gbnVsbCkKLQkJcmV0dXJuOwotCXBhcnNlVGFncyhjdXJyZW50TGluZSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBwYXJzZVRhZ3MoTkxTTGluZSBsaW5lKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKLQlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwotCWludCBwb3MgPSBzLmluZGV4T2YoVEFHX1BSRUZJWCk7Ci0JaW50IGxpbmVMZW5ndGggPSBsaW5lLnNpemUoKTsKLQl3aGlsZSAocG9zICE9IC0xKSB7Ci0JCWludCBzdGFydCA9IHBvcyArIFRBR19QUkVGSVhfTEVOR1RIOwotCQlpbnQgZW5kID0gcy5pbmRleE9mKFRBR19QT1NURklYLCBzdGFydCk7Ci0JCVN0cmluZyBpbmRleCA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQlpbnQgaSA9IDA7Ci0JCXRyeSB7Ci0JCQlpID0gSW50ZWdlci5wYXJzZUludChpbmRleCkgLSAxOyAvLyBUYWdzIGFyZSBvbmUgYmFzZWQgbm90IHplcm8gYmFzZWQuCi0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpID0gLTE7IC8vIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgdGhpcyBhcyBhIHZhbGlkIE5MUyB0YWcKLQkJfQotCQlpZiAobGluZS5leGlzdHMoaSkpIHsKLQkJCWxpbmUuc2V0KGksIG51bGwpOwotCQl9Ci0JCXBvcyA9IHMuaW5kZXhPZihUQUdfUFJFRklYLCBzdGFydCk7Ci0JfQotCi0JdGhpcy5ub25OTFNTdHJpbmdzID0gbmV3IFN0cmluZ0xpdGVyYWxbbGluZUxlbmd0aF07Ci0JaW50IG5vbk5MU0NvdW50ZXIgPSAwOwotCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5lLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IChTdHJpbmdMaXRlcmFsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCXRoaXMubm9uTkxTU3RyaW5nc1tub25OTFNDb3VudGVyKytdID0gbGl0ZXJhbDsKLQkJfQotCX0KLQlpZiAobm9uTkxTQ291bnRlciA9PSAwKSB7Ci0JCXRoaXMubm9uTkxTU3RyaW5ncyA9IG51bGw7Ci0JCWN1cnJlbnRMaW5lID0gbnVsbDsKLQkJcmV0dXJuOwotCX0gCi0JdGhpcy53YXNOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsID0gdHJ1ZTsKLQlpZiAobm9uTkxTQ291bnRlciAhPSBsaW5lTGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkodGhpcy5ub25OTFNTdHJpbmdzLCAwLCAodGhpcy5ub25OTFNTdHJpbmdzID0gbmV3IFN0cmluZ0xpdGVyYWxbbm9uTkxTQ291bnRlcl0pLCAwLCBub25OTFNDb3VudGVyKTsKLQl9Ci0JY3VycmVudExpbmUgPSBudWxsOwotfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQppbmRleCA4N2UzNWM4Li5mMjI4MTg2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUZpZWxkRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlRmllbGREZWNsYXJhdGlvbi5qYXZhCmluZGV4IDlmZGM5OTUuLmZlOTdlYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlRmllbGREZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlRmllbGREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlTWV0aG9kRGVjbGFyYXRpb24uamF2YQppbmRleCA5NzdiNWU5Li45MzNmNTJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1NvdXJjZU1ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VNZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZUNvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKaW5kZXggZGY4ZDQxMS4uYTQ1YzcwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlQ29udmVydGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyOwogCiAvKioKQEAgLTIzLDYgKzIzLDcgQEAKICAqCiAgKi8KIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFyZ3VtZW50OwpAQCAtNDEsMzEgKzQyLDU5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsZXJNb2RpZmllcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQ29udmVydGVyIGltcGxlbWVudHMgQ29tcGlsZXJNb2RpZmllcnMgeworCQorCXByaXZhdGUgYm9vbGVhbiBuZWVkRmllbGRJbml0aWFsaXphdGlvbjsKKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQ7CisJcHJpdmF0ZSBQYXJzZXIgcGFyc2VyOworCXByaXZhdGUgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcjsKKwkKKwlwcml2YXRlIFNvdXJjZVR5cGVDb252ZXJ0ZXIoYm9vbGVhbiBuZWVkRmllbGRJbml0aWFsaXphdGlvbiwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgeworCQl0aGlzLm5lZWRGaWVsZEluaXRpYWxpemF0aW9uID0gbmVlZEZpZWxkSW5pdGlhbGl6YXRpb247CisJCXRoaXMucHJvYmxlbVJlcG9ydGVyID0gcHJvYmxlbVJlcG9ydGVyOworCX0KIAogCS8qCiAJICogQ29udmVydCBhIHNldCBvZiBzb3VyY2UgZWxlbWVudCB0eXBlcyBpbnRvIGEgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24KIAkgKiBUaGUgYXJndW1lbnQgdHlwZXMgYXJlIHRoZW4gYWxsIGdyb3VwZWQgaW4gdGhlIHNhbWUgdW5pdC4gVGhlIGFyZ3VtZW50IHR5cGVzIG11c3QgCiAJICogYXQgbGVhc3QgY29udGFpbiBvbmUgdHlwZS4KLQkgKiBDYW4gb3B0aW9uYWxseSBpZ25vcmUgZmllbGRzICYgbWV0aG9kcyBvciBtZW1iZXIgdHlwZXMKKwkgKiBDYW4gb3B0aW9uYWxseSBpZ25vcmUgZmllbGRzICYgbWV0aG9kcyBvciBtZW1iZXIgdHlwZXMgb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGJ1aWxkQ29tcGlsYXRpb25Vbml0KAogCQlJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLAogCQlib29sZWFuIG5lZWRGaWVsZHNBbmRNZXRob2RzLAogCQlib29sZWFuIG5lZWRNZW1iZXJUeXBlcywKKwkJYm9vbGVhbiBuZWVkRmllbGRJbml0aWFsaXphdGlvbiwKIAkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciwKIAkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwkJCQorCQlyZXR1cm4gCisJCQluZXcgU291cmNlVHlwZUNvbnZlcnRlcihuZWVkRmllbGRJbml0aWFsaXphdGlvbiwgcHJvYmxlbVJlcG9ydGVyKS5jb252ZXJ0KAorCQkJCXNvdXJjZVR5cGVzLCAKKwkJCQluZWVkRmllbGRzQW5kTWV0aG9kcywKKwkJCQluZWVkTWVtYmVyVHlwZXMsCisJCQkJY29tcGlsYXRpb25SZXN1bHQpOworCX0KIAorCS8qCisJICogQ29udmVydCBhIHNldCBvZiBzb3VyY2UgZWxlbWVudCB0eXBlcyBpbnRvIGEgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb24KKwkgKiBUaGUgYXJndW1lbnQgdHlwZXMgYXJlIHRoZW4gYWxsIGdyb3VwZWQgaW4gdGhlIHNhbWUgdW5pdC4gVGhlIGFyZ3VtZW50IHR5cGVzIG11c3QgCisJICogYXQgbGVhc3QgY29udGFpbiBvbmUgdHlwZS4KKwkgKi8KKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbnZlcnQoCisJCUlTb3VyY2VUeXBlW10gc291cmNlVHlwZXMsCisJCWJvb2xlYW4gbmVlZEZpZWxkc0FuZE1ldGhvZHMsCisJCWJvb2xlYW4gbmVlZE1lbWJlclR5cGVzLAorCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgewogCQlJU291cmNlVHlwZSBzb3VyY2VUeXBlID0gc291cmNlVHlwZXNbMF07CiAJCWlmIChzb3VyY2VUeXBlLmdldE5hbWUoKSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7IC8vIGRvIGEgYmFzaWMgdGVzdCB0aGF0IHRoZSBzb3VyY2VUeXBlIGlzIHZhbGlkCiAKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0KLQkJCW5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihwcm9ibGVtUmVwb3J0ZXIsIGNvbXBpbGF0aW9uUmVzdWx0LCAwKTsKKwkJdGhpcy51bml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKHByb2JsZW1SZXBvcnRlciwgY29tcGlsYXRpb25SZXN1bHQsIDApOwogCQkvLyBub3QgZmlsbGVkIGF0IHRoaXMgcG9pbnQKIAogCQkvKiBvbmx5IHBvc2l0aW9ucyBhdmFpbGFibGUgKi8KQEAgLTc2LDI3ICsxMDUsMjcgQEAKIAkJaWYgKHNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsCiAJCQkmJiBzb3VyY2VUeXBlLmdldFBhY2thZ2VOYW1lKCkubGVuZ3RoID4gMCkKIAkJCS8vIGlmIGl0cyBudWxsIHRoZW4gaXQgaXMgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlCi0JCQljb21waWxhdGlvblVuaXQuY3VycmVudFBhY2thZ2UgPQorCQkJdGhpcy51bml0LmN1cnJlbnRQYWNrYWdlID0KIAkJCQljcmVhdGVJbXBvcnRSZWZlcmVuY2Uoc291cmNlVHlwZS5nZXRQYWNrYWdlTmFtZSgpLCBzdGFydCwgZW5kKTsKIAkJY2hhcltdW10gaW1wb3J0TmFtZXMgPSBzb3VyY2VUeXBlLmdldEltcG9ydHMoKTsKIAkJaW50IGltcG9ydENvdW50ID0gaW1wb3J0TmFtZXMgPT0gbnVsbCA/IDAgOiBpbXBvcnROYW1lcy5sZW5ndGg7Ci0JCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzID0gbmV3IEltcG9ydFJlZmVyZW5jZVtpbXBvcnRDb3VudF07CisJCXRoaXMudW5pdC5pbXBvcnRzID0gbmV3IEltcG9ydFJlZmVyZW5jZVtpbXBvcnRDb3VudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0Q291bnQ7IGkrKykKLQkJCWNvbXBpbGF0aW9uVW5pdC5pbXBvcnRzW2ldID0gY3JlYXRlSW1wb3J0UmVmZXJlbmNlKGltcG9ydE5hbWVzW2ldLCBzdGFydCwgZW5kKTsKKwkJCXRoaXMudW5pdC5pbXBvcnRzW2ldID0gY3JlYXRlSW1wb3J0UmVmZXJlbmNlKGltcG9ydE5hbWVzW2ldLCBzdGFydCwgZW5kKTsKIAkJLyogY29udmVydCB0eXBlKHMpICovCiAJCWludCB0eXBlQ291bnQgPSBzb3VyY2VUeXBlcy5sZW5ndGg7Ci0JCWNvbXBpbGF0aW9uVW5pdC50eXBlcyA9IG5ldyBUeXBlRGVjbGFyYXRpb25bdHlwZUNvdW50XTsKKwkJdGhpcy51bml0LnR5cGVzID0gbmV3IFR5cGVEZWNsYXJhdGlvblt0eXBlQ291bnRdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVDb3VudDsgaSsrKSB7Ci0JCQljb21waWxhdGlvblVuaXQudHlwZXNbaV0gPQorCQkJdGhpcy51bml0LnR5cGVzW2ldID0KIAkJCQljb252ZXJ0KHNvdXJjZVR5cGVzW2ldLCBuZWVkRmllbGRzQW5kTWV0aG9kcywgbmVlZE1lbWJlclR5cGVzLCBjb21waWxhdGlvblJlc3VsdCk7CiAJCX0KLQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKKwkJcmV0dXJuIHRoaXMudW5pdDsKIAl9CiAJCiAJLyoKIAkgKiBDb252ZXJ0IGEgZmllbGQgc291cmNlIGVsZW1lbnQgaW50byBhIHBhcnNlZCBmaWVsZCBkZWNsYXJhdGlvbgogCSAqLwotCXByaXZhdGUgc3RhdGljIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJU291cmNlRmllbGQgc291cmNlRmllbGQpIHsKKwlwcml2YXRlIEZpZWxkRGVjbGFyYXRpb24gY29udmVydChJU291cmNlRmllbGQgc291cmNlRmllbGQsIFR5cGVEZWNsYXJhdGlvbiB0eXBlKSB7CiAKIAkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7CiAKQEAgLTExMSwyMCArMTQwLDI4IEBACiAJCWZpZWxkLmRlY2xhcmF0aW9uU291cmNlRW5kID0gc291cmNlRmllbGQuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKTsKIAkJZmllbGQubW9kaWZpZXJzID0gc291cmNlRmllbGQuZ2V0TW9kaWZpZXJzKCk7CiAKLQkJLyogY29udmVyc2lvbiBvZiBmaWVsZCBjb25zdGFudDogaWYgbm90IHByZXNlbnQsIHRoZW4gY2Fubm90IGdlbmVyYXRlIGJpbmFyeSBhZ2FpbnN0IAotCQkJY29udmVydGVkIHBhcnNlIG5vZGVzICovCi0JCS8qCi0JCWlmIChmaWVsZC5tb2RpZmllcnMgJiBBY2NGaW5hbCl7CisJCWlmICh0aGlzLm5lZWRGaWVsZEluaXRpYWxpemF0aW9uKSB7CisJCQkvKiBjb252ZXJzaW9uIG9mIGZpZWxkIGNvbnN0YW50ICovCiAJCQljaGFyW10gaW5pdGlhbGl6YXRpb25Tb3VyY2UgPSBzb3VyY2VGaWVsZC5nZXRJbml0aWFsaXphdGlvblNvdXJjZSgpOworCQkJaWYgKGluaXRpYWxpemF0aW9uU291cmNlICE9IG51bGwpIHsKKwkJCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkgeworCQkJCQl0aGlzLnBhcnNlciA9IAorCQkJCQkJbmV3IFBhcnNlcigKKwkJCQkJCQl0aGlzLnByb2JsZW1SZXBvcnRlciwgCisJCQkJCQkJdHJ1ZSwgCisJCQkJCQkJdGhpcy5wcm9ibGVtUmVwb3J0ZXIub3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KTsKKwkJCQl9CisJCQkJdGhpcy5wYXJzZXIucGFyc2UoZmllbGQsIHR5cGUsIHRoaXMudW5pdCwgaW5pdGlhbGl6YXRpb25Tb3VyY2UpOworCQkJfQogCQl9Ci0JCSovCisJCQogCQlyZXR1cm4gZmllbGQ7CiAJfQogCiAJLyoKIAkgKiBDb252ZXJ0IGEgbWV0aG9kIHNvdXJjZSBlbGVtZW50IGludG8gYSBwYXJzZWQgbWV0aG9kL2NvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIAogCSAqLwotCXByaXZhdGUgc3RhdGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gY29udmVydChJU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKKwlwcml2YXRlIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gY29udmVydChJU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCwgQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKIAogCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDsKIApAQCAtMTgyLDcgKzIxOSw3IEBACiAJICoKIAkgKiBDYW4gb3B0aW9uYWxseSBpZ25vcmUgZmllbGRzICYgbWV0aG9kcwogCSAqLwotCXByaXZhdGUgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiBjb252ZXJ0KAorCXByaXZhdGUgVHlwZURlY2xhcmF0aW9uIGNvbnZlcnQoCiAJCUlTb3VyY2VUeXBlIHNvdXJjZVR5cGUsCiAJCWJvb2xlYW4gbmVlZEZpZWxkc0FuZE1ldGhvZHMsCiAJCWJvb2xlYW4gbmVlZE1lbWJlclR5cGVzLApAQCAtMjM0LDcgKzI3MSw3IEBACiAJCQlpbnQgc291cmNlRmllbGRDb3VudCA9IHNvdXJjZUZpZWxkcyA9PSBudWxsID8gMCA6IHNvdXJjZUZpZWxkcy5sZW5ndGg7CiAJCQl0eXBlLmZpZWxkcyA9IG5ldyBGaWVsZERlY2xhcmF0aW9uW3NvdXJjZUZpZWxkQ291bnRdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWVsZENvdW50OyBpKyspIHsKLQkJCQl0eXBlLmZpZWxkc1tpXSA9IGNvbnZlcnQoc291cmNlRmllbGRzW2ldKTsKKwkJCQl0eXBlLmZpZWxkc1tpXSA9IGNvbnZlcnQoc291cmNlRmllbGRzW2ldLCB0eXBlKTsKIAkJCX0KIAogCQkJLyogY29udmVydCBtZXRob2RzIC0gbmVlZCB0byBhZGQgZGVmYXVsdCBjb25zdHJ1Y3RvciBpZiBuZWNlc3NhcnkgKi8KQEAgLTI0MywxMiArMjgwLDE1IEBACiAKIAkJCS8qIHNvdXJjZSB0eXBlIGhhcyBhIGNvbnN0cnVjdG9yID8gICAgICAgICAgICovCiAJCQkvKiBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhhdCBvbmUgaXMgbmVlZGVkLiAqLwotCQkJaW50IG5lZWRlZENvdW50ID0gMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTWV0aG9kQ291bnQ7IGkrKykgewotCQkJCWlmIChzb3VyY2VNZXRob2RzW2ldLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQluZWVkZWRDb3VudCA9IDA7Ci0JCQkJCS8vIERvZXMgbm90IG5lZWQgdGhlIGV4dHJhIGNvbnN0cnVjdG9yIHNpbmNlIG9uZSBjb25zdHJ1Y3RvciBhbHJlYWR5IGV4aXN0cy4KLQkJCQkJYnJlYWs7CisJCQlpbnQgbmVlZGVkQ291bnQgPSAwOworCQkJaWYgKCF0eXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJCQluZWVkZWRDb3VudCA9IDE7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VNZXRob2RDb3VudDsgaSsrKSB7CisJCQkJCWlmIChzb3VyY2VNZXRob2RzW2ldLmlzQ29uc3RydWN0b3IoKSkgeworCQkJCQkJbmVlZGVkQ291bnQgPSAwOworCQkJCQkJLy8gRG9lcyBub3QgbmVlZCB0aGUgZXh0cmEgY29uc3RydWN0b3Igc2luY2Ugb25lIGNvbnN0cnVjdG9yIGFscmVhZHkgZXhpc3RzLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQl0eXBlLm1ldGhvZHMgPSBuZXcgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltzb3VyY2VNZXRob2RDb3VudCArIG5lZWRlZENvdW50XTsKQEAgLTI3MCw3ICszMTAsNyBAQAogCS8qCiAJICogQnVpbGQgYW4gaW1wb3J0IHJlZmVyZW5jZSBmcm9tIGFuIGltcG9ydCBuYW1lLCBlLmcuIGphdmEubGFuZy4qCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UmVmZXJlbmNlIGNyZWF0ZUltcG9ydFJlZmVyZW5jZSgKKwlwcml2YXRlIEltcG9ydFJlZmVyZW5jZSBjcmVhdGVJbXBvcnRSZWZlcmVuY2UoCiAJCWNoYXJbXSBpbXBvcnROYW1lLAogCQlpbnQgc3RhcnQsCiAJCWludCBlbmQpIHsKQEAgLTI5Myw3ICszMzMsNyBAQAogCQkJcG9zaXRpb25zW2ldID0gcG9zaXRpb247CiAJCX0KIAkJcmV0dXJuIG5ldyBJbXBvcnRSZWZlcmVuY2UoCi0JCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBpbXBvcnROYW1lLCAwLCBtYXggLSAob25EZW1hbmQgPyAzIDogMSkpLAorCQkJQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgaW1wb3J0TmFtZSwgMCwgbWF4IC0gKG9uRGVtYW5kID8gMiA6IDApKSwKIAkJCXBvc2l0aW9ucywKIAkJCW9uRGVtYW5kKTsKIAl9CkBAIC0zMDEsNyArMzQxLDcgQEAKIAkvKgogCSAqIEJ1aWxkIGEgdHlwZSByZWZlcmVuY2UgZnJvbSBhIHJlYWRhYmxlIG5hbWUsIGUuZy4gamF2YS5sYW5nLk9iamVjdFtdW10KIAkgKi8KLQlwcml2YXRlIHN0YXRpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoCisJcHJpdmF0ZSBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoCiAJCWNoYXJbXSB0eXBlU2lnbmF0dXJlLAogCQlpbnQgc3RhcnQsCiAJCWludCBlbmQpIHsKQEAgLTMzOSw3ICszNzksNyBAQAogCQkJCXBvc2l0aW9uc1tpXSA9IHBvczsKIAkJCX0KIAkJCWNoYXJbXVtdIGlkZW50aWZpZXJzID0KLQkJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlU2lnbmF0dXJlLCAwLCBkaW1TdGFydCAtIDEpOworCQkJCUNoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGVTaWduYXR1cmUsIDAsIGRpbVN0YXJ0KTsKIAkJCWlmIChkaW0gPT0gMCkgewogCQkJCXJldHVybiBuZXcgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZShpZGVudGlmaWVycywgcG9zaXRpb25zKTsKIAkJCX0gZWxzZSB7CkBAIC0zNDcsNCArMzg3LDQgQEAKIAkJCX0KIAkJfQogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1Rlcm1pbmFsVG9rZW5zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL1Rlcm1pbmFsVG9rZW5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5MTQyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvVGVybWluYWxUb2tlbnMuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXI7CisgCisvKioKKyAqIElNUE9SVEFOVCBOT1RFOiBUaGVzZSBjb25zdGFudHMgYXJlIGRlZGljYXRlZCB0byB0aGUgaW50ZXJuYWwgU2Nhbm5lciBpbXBsZW1lbnRhdGlvbi4gCisgKiBJdCBpcyBtaXJyb3JlZCBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlciBwdWJsaWMgcGFja2FnZSB3aGVyZSBpdCBpcyBBUEkuIAorICogVGhlIG1pcnJvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2luZyB0aGUgYmFja3dhcmQgY29tcGF0aWJsZSBJVGVybWluYWxTeW1ib2xzIGNvbnN0YW50IAorICogZGVmaW5pdGlvbnMgKHN0YWJsZSB3aXRoIDIuMCksIHdoZXJlYXMgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHVzZXMgVGVybWluYWxUb2tlbnMgCisgKiB3aGljaCBjb25zdGFudCB2YWx1ZXMgcmVmbGVjdCB0aGUgbGF0ZXN0IHBhcnNlciBnZW5lcmF0aW9uIHN0YXRlLgorICovCisgCisvKioKKyAqIE1hcHMgZWFjaCB0ZXJtaW5hbCBzeW1ib2wgaW4gdGhlIGphdmEtZ3JhbW1hciBpbnRvIGEgdW5pcXVlIGludGVnZXIuIAorICogVGhpcyBpbnRlZ2VyIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0ZXJtaW5hbCB3aGVuIGNvbXB1dGluZyBhIHBhcnNpbmcgYWN0aW9uLiAKKyAqIAorICogRGlzY2xhaW1lciA6IFRoZXNlIGNvbnN0YW50IHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYSBKYXZhIAorICogZ3JhbW1hciwgdGhlcmVmb3JlIHRoZWlyIGFjdHVhbCB2YWx1ZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGlmIG5ldyBrZXl3b3JkcyAKKyAqIHdlcmUgYWRkZWQgdG8gdGhlIGxhbmd1YWdlIChpLmUuICdhc3NlcnQnIGtleXdvcmQgaW4gMS40KS4KKyAqLworcHVibGljIGludGVyZmFjZSBUZXJtaW5hbFRva2VucyB7CisKKwkvLyBzcGVjaWFsIHRva2VucyBub3QgcGFydCBvZiBncmFtbWFyIC0gbm90IGF1dG9nZW5lcmF0ZWQKKwlpbnQgCisJCVRva2VuTmFtZVdISVRFU1BBQ0UgPSAxMDAwLAorCQlUb2tlbk5hbWVDT01NRU5UX0xJTkUgPSAxMDAxLAorCQlUb2tlbk5hbWVDT01NRU5UX0JMT0NLID0gMTAwMiwKKwkJVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DID0gMTAwMzsKKwkKKyAgICBpbnQKKyAgICAgIFRva2VuTmFtZUlkZW50aWZpZXIgPSA2LAorICAgICAgVG9rZW5OYW1lYWJzdHJhY3QgPSA5OSwKKyAgICAgIFRva2VuTmFtZWFzc2VydCA9IDEyMSwKKyAgICAgIFRva2VuTmFtZWJvb2xlYW4gPSAyNSwKKyAgICAgIFRva2VuTmFtZWJyZWFrID0gMTIyLAorICAgICAgVG9rZW5OYW1lYnl0ZSA9IDI2LAorICAgICAgVG9rZW5OYW1lY2FzZSA9IDIxMSwKKyAgICAgIFRva2VuTmFtZWNhdGNoID0gMjI1LAorICAgICAgVG9rZW5OYW1lY2hhciA9IDI3LAorICAgICAgVG9rZW5OYW1lY2xhc3MgPSAxNjYsCisgICAgICBUb2tlbk5hbWVjb250aW51ZSA9IDEyMywKKyAgICAgIFRva2VuTmFtZWRlZmF1bHQgPSAyMTIsCisgICAgICBUb2tlbk5hbWVkbyA9IDEyNCwKKyAgICAgIFRva2VuTmFtZWRvdWJsZSA9IDI4LAorICAgICAgVG9rZW5OYW1lZWxzZSA9IDIxMywKKyAgICAgIFRva2VuTmFtZWV4dGVuZHMgPSAyNDMsCisgICAgICBUb2tlbk5hbWVmYWxzZSA9IDQ0LAorICAgICAgVG9rZW5OYW1lZmluYWwgPSAxMDAsCisgICAgICBUb2tlbk5hbWVmaW5hbGx5ID0gMjI2LAorICAgICAgVG9rZW5OYW1lZmxvYXQgPSAyOSwKKyAgICAgIFRva2VuTmFtZWZvciA9IDEyNSwKKyAgICAgIFRva2VuTmFtZWlmID0gMTI2LAorICAgICAgVG9rZW5OYW1laW1wbGVtZW50cyA9IDI2OCwKKyAgICAgIFRva2VuTmFtZWltcG9ydCA9IDE5MSwKKyAgICAgIFRva2VuTmFtZWluc3RhbmNlb2YgPSAxNiwKKyAgICAgIFRva2VuTmFtZWludCA9IDMwLAorICAgICAgVG9rZW5OYW1laW50ZXJmYWNlID0gMTY5LAorICAgICAgVG9rZW5OYW1lbG9uZyA9IDMxLAorICAgICAgVG9rZW5OYW1lbmF0aXZlID0gMTAxLAorICAgICAgVG9rZW5OYW1lbmV3ID0gNDAsCisgICAgICBUb2tlbk5hbWVudWxsID0gNDUsCisgICAgICBUb2tlbk5hbWVwYWNrYWdlID0gMjE0LAorICAgICAgVG9rZW5OYW1lcHJpdmF0ZSA9IDEwMiwKKyAgICAgIFRva2VuTmFtZXByb3RlY3RlZCA9IDEwMywKKyAgICAgIFRva2VuTmFtZXB1YmxpYyA9IDEwNCwKKyAgICAgIFRva2VuTmFtZXJldHVybiA9IDEyNywKKyAgICAgIFRva2VuTmFtZXNob3J0ID0gMzIsCisgICAgICBUb2tlbk5hbWVzdGF0aWMgPSA5NywKKyAgICAgIFRva2VuTmFtZXN0cmljdGZwID0gMTA1LAorICAgICAgVG9rZW5OYW1lc3VwZXIgPSA0MiwKKyAgICAgIFRva2VuTmFtZXN3aXRjaCA9IDEyOCwKKyAgICAgIFRva2VuTmFtZXN5bmNocm9uaXplZCA9IDg4LAorICAgICAgVG9rZW5OYW1ldGhpcyA9IDQzLAorICAgICAgVG9rZW5OYW1ldGhyb3cgPSAxMjksCisgICAgICBUb2tlbk5hbWV0aHJvd3MgPSAyMjcsCisgICAgICBUb2tlbk5hbWV0cmFuc2llbnQgPSAxMDYsCisgICAgICBUb2tlbk5hbWV0cnVlID0gNDYsCisgICAgICBUb2tlbk5hbWV0cnkgPSAxMzAsCisgICAgICBUb2tlbk5hbWV2b2lkID0gMzMsCisgICAgICBUb2tlbk5hbWV2b2xhdGlsZSA9IDEwNywKKyAgICAgIFRva2VuTmFtZXdoaWxlID0gMTIwLAorICAgICAgVG9rZW5OYW1lSW50ZWdlckxpdGVyYWwgPSA0NywKKyAgICAgIFRva2VuTmFtZUxvbmdMaXRlcmFsID0gNDgsCisgICAgICBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA9IDQ5LAorICAgICAgVG9rZW5OYW1lRG91YmxlTGl0ZXJhbCA9IDUwLAorICAgICAgVG9rZW5OYW1lQ2hhcmFjdGVyTGl0ZXJhbCA9IDUxLAorICAgICAgVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbCA9IDUyLAorICAgICAgVG9rZW5OYW1lUExVU19QTFVTID0gMywKKyAgICAgIFRva2VuTmFtZU1JTlVTX01JTlVTID0gNCwKKyAgICAgIFRva2VuTmFtZUVRVUFMX0VRVUFMID0gMjMsCisgICAgICBUb2tlbk5hbWVMRVNTX0VRVUFMID0gMTcsCisgICAgICBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMID0gMTgsCisgICAgICBUb2tlbk5hbWVOT1RfRVFVQUwgPSAyNCwKKyAgICAgIFRva2VuTmFtZUxFRlRfU0hJRlQgPSAxMywKKyAgICAgIFRva2VuTmFtZVJJR0hUX1NISUZUID0gMTEsCisgICAgICBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVCA9IDEyLAorICAgICAgVG9rZW5OYW1lUExVU19FUVVBTCA9IDE3MCwKKyAgICAgIFRva2VuTmFtZU1JTlVTX0VRVUFMID0gMTcxLAorICAgICAgVG9rZW5OYW1lTVVMVElQTFlfRVFVQUwgPSAxNzIsCisgICAgICBUb2tlbk5hbWVESVZJREVfRVFVQUwgPSAxNzMsCisgICAgICBUb2tlbk5hbWVBTkRfRVFVQUwgPSAxNzQsCisgICAgICBUb2tlbk5hbWVPUl9FUVVBTCA9IDE3NSwKKyAgICAgIFRva2VuTmFtZVhPUl9FUVVBTCA9IDE3NiwKKyAgICAgIFRva2VuTmFtZVJFTUFJTkRFUl9FUVVBTCA9IDE3NywKKyAgICAgIFRva2VuTmFtZUxFRlRfU0hJRlRfRVFVQUwgPSAxNzgsCisgICAgICBUb2tlbk5hbWVSSUdIVF9TSElGVF9FUVVBTCA9IDE3OSwKKyAgICAgIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMID0gMTgwLAorICAgICAgVG9rZW5OYW1lT1JfT1IgPSA3MywKKyAgICAgIFRva2VuTmFtZUFORF9BTkQgPSA3MiwKKyAgICAgIFRva2VuTmFtZVBMVVMgPSAxLAorICAgICAgVG9rZW5OYW1lTUlOVVMgPSAyLAorICAgICAgVG9rZW5OYW1lTk9UID0gNzUsCisgICAgICBUb2tlbk5hbWVSRU1BSU5ERVIgPSA4LAorICAgICAgVG9rZW5OYW1lWE9SID0gNjgsCisgICAgICBUb2tlbk5hbWVBTkQgPSAzOCwKKyAgICAgIFRva2VuTmFtZU1VTFRJUExZID0gNywKKyAgICAgIFRva2VuTmFtZU9SID0gNzEsCisgICAgICBUb2tlbk5hbWVUV0lERExFID0gNzYsCisgICAgICBUb2tlbk5hbWVESVZJREUgPSA5LAorICAgICAgVG9rZW5OYW1lR1JFQVRFUiA9IDE5LAorICAgICAgVG9rZW5OYW1lTEVTUyA9IDIwLAorICAgICAgVG9rZW5OYW1lTFBBUkVOID0gMTAsCisgICAgICBUb2tlbk5hbWVSUEFSRU4gPSA4MSwKKyAgICAgIFRva2VuTmFtZUxCUkFDRSA9IDExMSwKKyAgICAgIFRva2VuTmFtZVJCUkFDRSA9IDg2LAorICAgICAgVG9rZW5OYW1lTEJSQUNLRVQgPSAxNCwKKyAgICAgIFRva2VuTmFtZVJCUkFDS0VUID0gMTE5LAorICAgICAgVG9rZW5OYW1lU0VNSUNPTE9OID0gNDEsCisgICAgICBUb2tlbk5hbWVRVUVTVElPTiA9IDc0LAorICAgICAgVG9rZW5OYW1lQ09MT04gPSAxMTAsCisgICAgICBUb2tlbk5hbWVDT01NQSA9IDgyLAorICAgICAgVG9rZW5OYW1lRE9UID0gNSwKKyAgICAgIFRva2VuTmFtZUVRVUFMID0gMTY3LAorICAgICAgVG9rZW5OYW1lRU9GID0gMTE0LAorICAgICAgVG9rZW5OYW1lRVJST1IgPSAzMDg7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIxLnJzYwppbmRleCAwNWQ2OGJjLi42ZWRjMjI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjEucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMS5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMi5yc2MKaW5kZXggZDY2Njk5MC4uMjZlNDE2ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIyLnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjIucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMy5yc2MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjMucnNjCmluZGV4IDA1OGRkMDkuLjdiM2UzMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyMy5yc2MKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXIzLnJzYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjQucnNjIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI0LnJzYwppbmRleCBjNTBkYWNlLi40NWQxNDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjQucnNjCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNC5yc2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wYXJzZXIvcGFyc2VyNS5yc2MKaW5kZXggYmZlN2NiNC4uYmI5YjEyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3BhcnNlci9wYXJzZXI1LnJzYworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcGFyc2VyL3BhcnNlcjUucnNjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb24uamF2YQppbmRleCA4ZDA4NjY1Li43OTk4NDBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CkBAIC0xOSwzMiArMTksNDEgQEAKICAqIHNob3VsZCBvbmx5IGJlIHRocm93biBmcm9tIHdpdGhpbiBwcm9ibGVtIGhhbmRsZXJzLgogICovCiBwdWJsaWMgY2xhc3MgQWJvcnRDb21waWxhdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCiAJcHVibGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0OwogCXB1YmxpYyBUaHJvd2FibGUgZXhjZXB0aW9uOwotCQogCXB1YmxpYyBpbnQgcHJvYmxlbUlkOyAKLQlwdWJsaWMgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50czsKLQorCXB1YmxpYyBTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLCBtZXNzYWdlQXJndW1lbnRzOwogCS8qIHNwZWNpYWwgZmllbGRzIHVzZWQgdG8gYWJvcnQgc2lsZW50bHkgKGUuZy4gd2hlbiBjYW5jZWxsaW5nIGJ1aWxkIHByb2Nlc3MpICovCiAJcHVibGljIGJvb2xlYW4gaXNTaWxlbnQ7CiAJcHVibGljIFJ1bnRpbWVFeGNlcHRpb24gc2lsZW50RXhjZXB0aW9uOwotcHVibGljIEFib3J0Q29tcGlsYXRpb24oKSB7Ci0JdGhpcygoQ29tcGlsYXRpb25SZXN1bHQpbnVsbCk7Ci19Ci1wdWJsaWMgQWJvcnRDb21waWxhdGlvbihpbnQgcHJvYmxlbUlkLCBTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzKSB7CiAKLQl0aGlzLnByb2JsZW1JZCA9IHByb2JsZW1JZDsKLQl0aGlzLnByb2JsZW1Bcmd1bWVudHMgPSBwcm9ibGVtQXJndW1lbnRzOwotfQotcHVibGljIEFib3J0Q29tcGlsYXRpb24oQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQpIHsKLQl0aGlzKGNvbXBpbGF0aW9uUmVzdWx0LCBudWxsKTsKLX0KLXB1YmxpYyBBYm9ydENvbXBpbGF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OwotCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOwotfQotcHVibGljIEFib3J0Q29tcGlsYXRpb24oYm9vbGVhbiBpc1NpbGVudCwgUnVudGltZUV4Y2VwdGlvbiBzaWxlbnRFeGNlcHRpb24pIHsKLQl0aGlzLmlzU2lsZW50ID0gaXNTaWxlbnQ7Ci0JdGhpcy5zaWxlbnRFeGNlcHRpb24gPSBzaWxlbnRFeGNlcHRpb247Ci19CisJcHVibGljIEFib3J0Q29tcGlsYXRpb24oKSB7CisKKwkJdGhpcygoQ29tcGlsYXRpb25SZXN1bHQpbnVsbCk7CisJfQorCisJcHVibGljIEFib3J0Q29tcGlsYXRpb24oaW50IHByb2JsZW1JZCwgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cykgeworCQorCQl0aGlzLnByb2JsZW1JZCA9IHByb2JsZW1JZDsKKwkJdGhpcy5wcm9ibGVtQXJndW1lbnRzID0gcHJvYmxlbUFyZ3VtZW50czsKKwkJdGhpcy5tZXNzYWdlQXJndW1lbnRzID0gbWVzc2FnZUFyZ3VtZW50czsKKwl9CisKKwlwdWJsaWMgQWJvcnRDb21waWxhdGlvbihDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgeworCisJCXRoaXMoY29tcGlsYXRpb25SZXN1bHQsIG51bGwpOworCX0KKworCXB1YmxpYyBBYm9ydENvbXBpbGF0aW9uKENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKwkJdGhpcy5jb21waWxhdGlvblJlc3VsdCA9IGNvbXBpbGF0aW9uUmVzdWx0OworCQl0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKwl9CisKKwlwdWJsaWMgQWJvcnRDb21waWxhdGlvbihib29sZWFuIGlzU2lsZW50LCBSdW50aW1lRXhjZXB0aW9uIHNpbGVudEV4Y2VwdGlvbikgeworCisJCXRoaXMuaXNTaWxlbnQgPSBpc1NpbGVudDsKKwkJdGhpcy5zaWxlbnRFeGNlcHRpb24gPSBzaWxlbnRFeGNlcHRpb247CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0Q29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggODViYmIzOS4uYWJkMDRkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRDb21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydENvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydE1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRNZXRob2QuamF2YQppbmRleCBjZmQyNGUyLi5mNTZkZDk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9BYm9ydE1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0TWV0aG9kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0Fib3J0VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEKaW5kZXggOGM5Mjk1My4uZjBhYTRlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vQWJvcnRUeXBlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbS5qYXZhCmluZGV4IDYwYTJjZGUuLjYzNTQyOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW0uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CkBAIC0yNDYsNCArMjQ2LDQgQEAKIAkJfQogCQlyZXR1cm4gczsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vRGVmYXVsdFByb2JsZW1GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YQppbmRleCA0NzA1M2I5Li44N2EzYzBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9EZWZhdWx0UHJvYmxlbUZhY3RvcnkuamF2YQpAQCAtMSwyMiArMSwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgRGVmYXVsdFByb2JsZW1GYWN0b3J5IGltcGxlbWVudHMgSVByb2JsZW1GYWN0b3J5IHsKIApAQCAtNDYsNyArNDYsOCBAQAogICogPHVsPgogICogPGxpPm9yaWdpbmF0aW5nRmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgbmFtZSBmcm9tIHdoaWNoIHRoZSBwcm9ibGVtIGlzIG9yaWdpbmF0ZWQKICAqIDxsaT5wcm9ibGVtSWQgdGhlIHByb2JsZW0gaWQKLSAqIDxsaT5hcmd1bWVudHMgdGhlIGFyZ3VtZW50cyBuZWVkZWQgdG8gc2V0IHRoZSBlcnJvciBtZXNzYWdlCisgKiA8bGk+cHJvYmxlbUFyZ3VtZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGFyZ3VtZW50cyByZWNvcmRlZCBpbnNpZGUgdGhlIHByb2JsZW0KKyAqIDxsaT5tZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgbmVlZGVkIHRvIHNldCB0aGUgZXJyb3IgbWVzc2FnZSAoc2hvcnRlciBuYW1lcyB0aGFuIHByb2JsZW1Bcmd1bWVudHMgb25lcykKICAqIDxsaT5zZXZlcml0eSB0aGUgc2V2ZXJpdHkgb2YgdGhlIHByb2JsZW0KICAqIDxsaT5zdGFydFBvc2l0aW9uIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcHJvYmxlbQogICogPGxpPmVuZFBvc2l0aW9uIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHByb2JsZW0KQEAgLTY0LDcgKzY1LDggQEAKIHB1YmxpYyBJUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAogCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLCAKIAlpbnQgcHJvYmxlbUlkLCAKLQlTdHJpbmdbXSBhcmd1bWVudHMsIAorCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsIAorCVN0cmluZ1tdIG1lc3NhZ2VBcmd1bWVudHMsIAogCWludCBzZXZlcml0eSwgCiAJaW50IHN0YXJ0UG9zaXRpb24sIAogCWludCBlbmRQb3NpdGlvbiwgCkBAIC03Miw5ICs3NCw5IEBACiAKIAlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtKAogCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLCAKLQkJdGhpcy5nZXRMb2NhbGl6ZWRNZXNzYWdlKHByb2JsZW1JZCwgYXJndW1lbnRzKSwKKwkJdGhpcy5nZXRMb2NhbGl6ZWRNZXNzYWdlKHByb2JsZW1JZCwgbWVzc2FnZUFyZ3VtZW50cyksCiAJCXByb2JsZW1JZCwgCi0JCWFyZ3VtZW50cywgCisJCXByb2JsZW1Bcmd1bWVudHMsIAogCQlzZXZlcml0eSwgCiAJCXN0YXJ0UG9zaXRpb24sIAogCQllbmRQb3NpdGlvbiwgCkBAIC05Myw3ICs5NSw3IEBACiAJCW1lc3NhZ2VUZW1wbGF0ZXNbKGlkICYgSVByb2JsZW0uSWdub3JlQ2F0ZWdvcmllc01hc2spXTsgCiAJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewogCQlyZXR1cm4gIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbSBpZDogIiAvLyROT04tTkxTLTEkCi0JCQkrIGlkCisJCQkrIChpZCAmIElQcm9ibGVtLklnbm9yZUNhdGVnb3JpZXNNYXNrKQogCQkJKyAiLiBDaGVjayBjb21waWxlciByZXNvdXJjZXMuIjsgIC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTE0Miw3ICsxNDQsMTQgQEAKICAqIHRvIHRoZSBjdXJyZW50IExvY2FsZS4KICAqLwogcHVibGljIHN0YXRpYyBTdHJpbmdbXSBsb2FkTWVzc2FnZVRlbXBsYXRlcyhMb2NhbGUgbG9jKSB7Ci0JUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5tZXNzYWdlcyIsIGxvYyk7IC8vJE5PTi1OTFMtMSQKKwlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOworCVN0cmluZyBidW5kbGVOYW1lID0gIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCXRyeSB7CisJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2MpOyAKKwl9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyByZXNvdXJjZSA6ICIgKyBidW5kbGVOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5wcm9wZXJ0aWVzIGZvciBsb2NhbGUgIiArIGxvYyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCXRocm93IGU7CisJfQogCVN0cmluZ1tdIHRlbXBsYXRlcyA9IG5ldyBTdHJpbmdbNTAwXTsKIAlmb3IgKGludCBpID0gMCwgbWF4ID0gdGVtcGxhdGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbUhhbmRsZXIuamF2YQppbmRleCA0ZWU0YzEzLi43NGJkYTc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtSGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1IYW5kbGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwpAQCAtMjgsNiArMjgsOCBAQAogCiBwdWJsaWMgY2xhc3MgUHJvYmxlbUhhbmRsZXIgaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcyB7CiAKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIE5vQXJndW1lbnQgPSBuZXcgU3RyaW5nWzBdOworCQogCWZpbmFsIHB1YmxpYyBJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3k7CiAJcHVibGljIGZpbmFsIElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeTsKIAlwdWJsaWMgZmluYWwgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7CkBAIC01NSw2ICs1Nyw3IEBACiAJY2hhcltdIGZpbGVOYW1lLCAKIAlpbnQgcHJvYmxlbUlkLCAKIAlTdHJpbmdbXSBwcm9ibGVtQXJndW1lbnRzLCAKKwlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAogCWludCBzZXZlcml0eSwgCiAJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKIAlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uLCAKQEAgLTY2LDYgKzY5LDcgQEAKIAkJZmlsZU5hbWUsIAogCQlwcm9ibGVtSWQsIAogCQlwcm9ibGVtQXJndW1lbnRzLCAKKwkJbWVzc2FnZUFyZ3VtZW50cywKIAkJc2V2ZXJpdHksIAogCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCiAJCXByb2JsZW1FbmRQb3NpdGlvbiwgCkBAIC03NCw2ICs3OCw3IEBACiBwdWJsaWMgdm9pZCBoYW5kbGUoCiAJaW50IHByb2JsZW1JZCwgCiAJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKIAlpbnQgc2V2ZXJpdHksIAogCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCiAJaW50IHByb2JsZW1FbmRQb3NpdGlvbiwgCkBAIC04Niw3ICs5MSw3IEBACiAJLy8gaWYgbm8gcmVmZXJlbmNlIGNvbnRleHQsIHdlIG5lZWQgdG8gYWJvcnQgZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbiBwcm9jZXNzCiAJaWYgKHJlZmVyZW5jZUNvbnRleHQgPT0gbnVsbCkgewogCQlpZiAoKHNldmVyaXR5ICYgRXJyb3IpICE9IDApIHsgLy8gbm9uIHJlcG9ydGFibGUgZXJyb3IgaXMgZmF0YWwKLQkJCXRocm93IG5ldyBBYm9ydENvbXBpbGF0aW9uKHByb2JsZW1JZCwgcHJvYmxlbUFyZ3VtZW50cyk7CisJCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbihwcm9ibGVtSWQsIHByb2JsZW1Bcmd1bWVudHMsIG1lc3NhZ2VBcmd1bWVudHMpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuOyAvLyBpZ25vcmUgbm9uIHJlcG9ydGFibGUgd2FybmluZwogCQl9CkBAIC05Nyw2ICsxMDIsNyBAQAogCQkJdW5pdFJlc3VsdC5nZXRGaWxlTmFtZSgpLCAKIAkJCXByb2JsZW1JZCwgCiAJCQlwcm9ibGVtQXJndW1lbnRzLCAKKwkJCW1lc3NhZ2VBcmd1bWVudHMsCiAJCQlzZXZlcml0eSwgCiAJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCiAJCQlwcm9ibGVtRW5kUG9zaXRpb24sIApAQCAtMTMyLDYgKzEzOCw3IEBACiBwdWJsaWMgdm9pZCBoYW5kbGUoCiAJaW50IHByb2JsZW1JZCwgCiAJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywgCisJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKIAlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAogCWludCBwcm9ibGVtRW5kUG9zaXRpb24sIAogCVJlZmVyZW5jZUNvbnRleHQgcmVmZXJlbmNlQ29udGV4dCwgCkBAIC0xNDAsNiArMTQ3LDcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJcHJvYmxlbUlkLAogCQlwcm9ibGVtQXJndW1lbnRzLAorCQltZXNzYWdlQXJndW1lbnRzLAogCQl0aGlzLmNvbXB1dGVTZXZlcml0eShwcm9ibGVtSWQpLCAvLyBzZXZlcml0eSBpbmZlcnJlZCB1c2luZyB0aGUgSUQKIAkJcHJvYmxlbVN0YXJ0UG9zaXRpb24sCiAJCXByb2JsZW1FbmRQb3NpdGlvbiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1SZXBvcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEKaW5kZXggZWM4NTgyYy4uZTBiYzI2ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVJlcG9ydGVyLmphdmEKQEAgLTEsMjQgKzEsMjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JRXJyb3JIYW5kbGluZ1BvbGljeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29uc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuUmVmZXJlbmNlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogcHVibGljIGNsYXNzIFByb2JsZW1SZXBvcnRlciBleHRlbmRzIFByb2JsZW1IYW5kbGVyIGltcGxlbWVudHMgUHJvYmxlbVJlYXNvbnMgewogCQpAQCAtMjcsMTcgKzMxLDIxIEBACiAJc3VwZXIocG9saWN5LCBvcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7CiB9CiBwdWJsaWMgdm9pZCBhYm9ydER1ZVRvSW50ZXJuYWxFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtlcnJvck1lc3NhZ2V9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbmNsYXNzaWZpZWQsCi0JCW5ldyBTdHJpbmdbXSB7ZXJyb3JNZXNzYWdlfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCUVycm9yIHwgQWJvcnQsCiAJCTAsCiAJCTApOwogfQogcHVibGljIHZvaWQgYWJvcnREdWVUb0ludGVybmFsRXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSwgQXN0Tm9kZSBsb2NhdGlvbikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7ZXJyb3JNZXNzYWdlfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5jbGFzc2lmaWVkLAotCQluZXcgU3RyaW5nW10ge2Vycm9yTWVzc2FnZX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlFcnJvciB8IEFib3J0LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKQEAgLTQ3LDE0ICs1NSwzMCBAQAogCXRoaXMuaGFuZGxlKAogCQkvLyAlMSBtdXN0IGJlIGFic3RyYWN0IHNpbmNlIGl0IGNhbm5vdCBvdmVycmlkZSB0aGUgaW5oZXJpdGVkIHBhY2thZ2UtcHJpdmF0ZSBhYnN0cmFjdCBtZXRob2QgJTIKIAkJSVByb2JsZW0uQWJzdHJhY3RNZXRob2RDYW5ub3RCZU92ZXJyaWRkZW4sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcoY29uY3JldGVNZXRob2QucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCAKKwkJCW5ldyBTdHJpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJY29uY3JldGVNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCksCisJCQkJCQljb25jcmV0ZU1ldGhvZC5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJCScuJykpfSwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCAKKwkJCW5ldyBTdHJpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJY29uY3JldGVNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSwKKwkJCQkJCWNvbmNyZXRlTWV0aG9kLnNob3J0UmVhZGFibGVOYW1lKCksCisJCQkJCQknLicpKX0sCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBhYnN0cmFjdE1ldGhvZEluQWJzdHJhY3RDbGFzcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5BYnN0cmFjdE1ldGhvZEluQWJzdHJhY3RDbGFzcywKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAogCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiB9CkBAIC02OSwyMiArOTMsMzEgQEAKIAkJCQkJYWJzdHJhY3RNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCksCiAJCQkJCWFic3RyYWN0TWV0aG9kLnJlYWRhYmxlTmFtZSgpLAogCQkJCQknLicpKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKAorCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQlhYnN0cmFjdE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQlhYnN0cmFjdE1ldGhvZC5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQknLicpKX0sCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBhYnN0cmFjdE1ldGhvZE5lZWRpbmdOb0JvZHkoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQm9keUZvckFic3RyYWN0TWV0aG9kLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQltZXRob2Quc291cmNlU3RhcnQsCiAJCW1ldGhvZC5zb3VyY2VFbmQsCiAJCW1ldGhvZCwKIAkJbWV0aG9kLmNvbXBpbGF0aW9uUmVzdWx0KCkpOwogfQogcHVibGljIHZvaWQgYWxyZWFkeURlZmluZWRMYWJlbChjaGFyW10gbGFiZWxOYW1lLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxhYmVsTmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVMYWJlbCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxhYmVsTmFtZSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC05MiwyMCArMTI1LDI1IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkFub255bW91c0NsYXNzQ2Fubm90RXh0ZW5kRmluYWxDbGFzcywKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBhcmd1bWVudFR5cGVDYW5ub3RCZVZvaWQoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsLCBBcmd1bWVudCBhcmcpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoYXJnLm5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQXJndW1lbnRUeXBlQ2Fubm90QmVWb2lkLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoYXJnLm5hbWUpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZEFycmF5KFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCwgQXJndW1lbnQgYXJnKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKGFyZy5uYW1lKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkFyZ3VtZW50VHlwZUNhbm5vdEJlVm9pZEFycmF5LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoYXJnLm5hbWUpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTEzNiw0MiArMTc0LDY4IEBACiAJdGhpcy5oYW5kbGUoCiAJCWlkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIGFyZy5uYW1lKCksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKSwgYXJnLm5hbWUoKSwgbmV3IFN0cmluZyhleHBlY3RlZFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlhcmcudHlwZS5zb3VyY2VTdGFydCwKIAkJYXJnLnR5cGUuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGFycmF5Q29uc3RhbnRzT25seUluQXJyYXlJbml0aWFsaXplcnMoaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlRW5kKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkFycmF5Q29uc3RhbnRzT25seUluQXJyYXlJbml0aWFsaXplcnMsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCXNvdXJjZVN0YXJ0LAogCQlzb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgYXNzaWdubWVudEhhc05vRWZmZWN0KEFzc2lnbm1lbnQgYXNzaWdubWVudCwgY2hhcltdIG5hbWUpeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcobmFtZSkgfTsJCisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5Bc3NpZ25tZW50SGFzTm9FZmZlY3QsCisJCQlhcmd1bWVudHMsCisJCQlhcmd1bWVudHMsCisJCQlhc3NpZ25tZW50LnNvdXJjZVN0YXJ0LAorCQkJYXNzaWdubWVudC5zb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgYXR0ZW1wdFRvUmV0dXJuTm9uVm9pZEV4cHJlc3Npb24oUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlZvaWRNZXRob2RSZXR1cm5zVmFsdWUsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCXJldHVyblN0YXRlbWVudC5zb3VyY2VTdGFydCwKIAkJcmV0dXJuU3RhdGVtZW50LnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBhdHRlbXB0VG9SZXR1cm5Wb2lkVmFsdWUoUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5NZXRob2RSZXR1cm5zVm9pZCwKLQkJbmV3IFN0cmluZ1tdIHt9LAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlyZXR1cm5TdGF0ZW1lbnQuc291cmNlU3RhcnQsCiAJCXJldHVyblN0YXRlbWVudC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgYnl0ZWNvZGVFeGNlZWRzNjRLTGltaXQoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBsb2NhdGlvbikgewotCXRoaXMuaGFuZGxlKAotCQlJUHJvYmxlbS5CeXRlY29kZUV4Y2VlZHM2NEtMaW1pdCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2F0aW9uLnNlbGVjdG9yKX0sCi0JCUVycm9yIHwgQWJvcnQsCi0JCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsb2NhdGlvbi5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1N0cmluZyhsb2NhdGlvbi5iaW5kaW5nKX07CisJaWYgKGxvY2F0aW9uLmlzQ29uc3RydWN0b3IoKSkgeworCQl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLkJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0Rm9yQ29uc3RydWN0b3IsCisJCQlhcmd1bWVudHMsCisJCQlhcmd1bWVudHMsCisJCQlFcnJvciB8IEFib3J0LAorCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworCX0gZWxzZSB7CisJCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uQnl0ZWNvZGVFeGNlZWRzNjRLTGltaXQsCisJCQlhcmd1bWVudHMsCisJCQlhcmd1bWVudHMsCisJCQlFcnJvciB8IEFib3J0LAorCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworCX0KIH0KIHB1YmxpYyB2b2lkIGJ5dGVjb2RlRXhjZWVkczY0S0xpbWl0KFR5cGVEZWNsYXJhdGlvbiBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5CeXRlY29kZUV4Y2VlZHM2NEtMaW1pdEZvckNsaW5pdCwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJRXJyb3IgfCBBYm9ydCwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CkBAIC0xNzksNyArMjQzLDggQEAKIHB1YmxpYyB2b2lkIGNhbm5vdEFsbG9jYXRlVm9pZEFycmF5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5DYW5ub3RBbGxvY2F0ZVZvaWRBcnJheSwKLQkJbmV3IFN0cmluZ1tdIHt9LAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0xODksMjcgKzI1NCw0NCBAQAogCQluZXcgU3RyaW5nW10gewogCQkJKGZpZWxkLmRlY2xhcmluZ0NsYXNzID09IG51bGwgPyAiYXJyYXkiIDogbmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSkpLCAvLyROT04tTkxTLTEkCiAJCQluZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQkoZmllbGQuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCA/ICJhcnJheSIgOiBuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpKSwgLy8kTk9OLU5MUy0xJAorCQkJbmV3IFN0cmluZyhmaWVsZC5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgY2Fubm90QXNzaWduVG9GaW5hbExvY2FsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyhsb2NhbC5yZWFkYWJsZU5hbWUoKSl9OworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Ob25CbGFua0ZpbmFsTG9jYWxBc3NpZ25tZW50LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBjYW5ub3RBc3NpZ25Ub0ZpbmFsT3V0ZXJMb2NhbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgQXN0Tm9kZSBsb2NhdGlvbikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsb2NhbC5yZWFkYWJsZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5GaW5hbE91dGVyTG9jYWxBc3NpZ25tZW50LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWwucmVhZGFibGVOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY2Fubm90RGVjbGFyZUxvY2FsSW50ZXJmYWNlKGNoYXJbXSBpbnRlcmZhY2VOYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW50ZXJmYWNlTmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5DYW5ub3REZWZpbmVJbnRlcmZhY2VJbkxvY2FsVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGludGVyZmFjZU5hbWUpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXNvdXJjZVN0YXJ0LAogCQlzb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY2Fubm90RGVmaW5lRGltZW5zaW9uc0FuZEluaXRpYWxpemVyKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gZXhwcmVzc3Npb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ2Fubm90RGVmaW5lRGltZW5zaW9uRXhwcmVzc2lvbnNXaXRoSW5pdCwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZXhwcmVzc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3NzaW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0yMTcsMTMgKzI5OSwxNiBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EaXJlY3RJbnZvY2F0aW9uT2ZBYnN0cmFjdE1ldGhvZCwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKG1ldGhvZCl9LAogCQltZXNzYWdlU2VuZC5zb3VyY2VTdGFydCwKIAkJbWVzc2FnZVNlbmQuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGNhbm5vdEltcG9ydFBhY2thZ2UoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhpbXBvcnRSZWYudG9rZW5zKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkNhbm5vdEltcG9ydFBhY2thZ2UsCi0JCW5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhpbXBvcnRSZWYudG9rZW5zKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCiAJCWltcG9ydFJlZi5zb3VyY2VFbmQpOwogfQpAQCAtMjMxLDI3ICszMTYsMzIgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZENsYXNzSW5zdGFudGlhdGlvbiwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQl0eXBlUmVmLnNvdXJjZVN0YXJ0LAogCQl0eXBlUmVmLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBjYW5ub3RSZWZlclRvTm9uRmluYWxPdXRlckxvY2FsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID1uZXcgU3RyaW5nW117IG5ldyBTdHJpbmcobG9jYWwucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uT3V0ZXJMb2NhbE11c3RCZUZpbmFsLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobG9jYWwucmVhZGFibGVOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY2Fubm90UmV0dXJuSW5Jbml0aWFsaXplcihBc3ROb2RlIGxvY2F0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkNhbm5vdFJldHVybkluSW5pdGlhbGl6ZXIsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY2Fubm90VGhyb3dOdWxsKFRocm93U3RhdGVtZW50IHN0YXRlbWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5DYW5ub3RUaHJvd051bGwsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCXN0YXRlbWVudC5zb3VyY2VTdGFydCwKIAkJc3RhdGVtZW50LnNvdXJjZUVuZCk7CiB9CkBAIC0yNTksMjAgKzM0OSwyMyBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5DYW5ub3RUaHJvd1R5cGUsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCWV4Y2VwdGlvblR5cGUuc291cmNlU3RhcnQsCiAJCWV4Y2VwdGlvblR5cGUuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGNhbm5vdFVzZVN1cGVySW5KYXZhTGFuZ09iamVjdChBc3ROb2RlIHJlZmVyZW5jZSkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5PYmplY3RIYXNOb1N1cGVyY2xhc3MsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKIAkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBjYW5ub3RVc2VTdXBlckluQ29kZVNuaXBwZXQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkNhbm5vdFVzZVN1cGVySW5Db2RlU25pcHBldCwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJRXJyb3IgfCBBYm9ydCwKIAkJc3RhcnQsCiAJCWVuZCk7CkBAIC0yODAsMjkgKzM3MywzOSBAQAogcHVibGljIHZvaWQgY2FzZUV4cHJlc3Npb25NdXN0QmVDb25zdGFudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTm9uQ29uc3RhbnRFeHByZXNzaW9uLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBjbGFzc0V4dGVuZEZpbmFsQ2xhc3MoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgVHlwZVJlZmVyZW5jZSBzdXBlcmNsYXNzLCBUeXBlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKKwlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpOworCVN0cmluZyBleHBlY3RlZEZ1bGxOYW1lID0gbmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpOworCVN0cmluZyBleHBlY3RlZFNob3J0TmFtZSA9IG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCWlmIChleHBlY3RlZFNob3J0TmFtZS5lcXVhbHMobmFtZSkpIGV4cGVjdGVkU2hvcnROYW1lID0gZXhwZWN0ZWRGdWxsTmFtZTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ2xhc3NFeHRlbmRGaW5hbENsYXNzLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge2V4cGVjdGVkRnVsbE5hbWUsIG5hbWV9LAorCQluZXcgU3RyaW5nW10ge2V4cGVjdGVkU2hvcnROYW1lLCBuYW1lfSwKIAkJc3VwZXJjbGFzcy5zb3VyY2VTdGFydCwKIAkJc3VwZXJjbGFzcy5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MoU3RyaW5nIG1pc3NpbmcsIGludCBzdGFydCwgaW50IGVuZCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXttaXNzaW5nfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ29kZVNuaXBwZXRNaXNzaW5nQ2xhc3MsCi0JCW5ldyBTdHJpbmdbXXsgbWlzc2luZyB9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJRXJyb3IgfCBBYm9ydCwKIAkJc3RhcnQsCiAJCWVuZCk7CiB9CiBwdWJsaWMgdm9pZCBjb2RlU25pcHBldE1pc3NpbmdNZXRob2QoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1pc3NpbmdNZXRob2QsIFN0cmluZyBhcmd1bWVudFR5cGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117IGNsYXNzTmFtZSwgbWlzc2luZ01ldGhvZCwgYXJndW1lbnRUeXBlcyB9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Db2RlU25pcHBldE1pc3NpbmdNZXRob2QsCi0JCW5ldyBTdHJpbmdbXXsgY2xhc3NOYW1lLCBtaXNzaW5nTWV0aG9kLCBhcmd1bWVudFR5cGVzIH0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlFcnJvciB8IEFib3J0LAogCQlzdGFydCwKIAkJZW5kKTsKQEAgLTM4NCwxNiArNDg3LDYgQEAKIAkJCX0KIAkJCXJldHVybiBJZ25vcmU7CiAJCQkKLS8qCQkKLQkJY2FzZSBVbm5lY2Vzc2FyeUVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbiA6Ci0JCQlpZiAoKGVycm9yVGhyZXNob2xkICYgVW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZSkgIT0gMCl7Ci0JCQkJcmV0dXJuIEVycm9yOwotCQkJfQotCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgVW5uZWNlc3NhcnlFbmNsb3NpbmdJbnN0YW5jZSkgIT0gMCl7Ci0JCQkJcmV0dXJuIFdhcm5pbmc7Ci0JCQl9Ci0JCQlyZXR1cm4gSWdub3JlOwotKi8JCQogCQljYXNlIElQcm9ibGVtLk1ldGhvZEJ1dFdpdGhDb25zdHJ1Y3Rvck5hbWUgOgogCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5NZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lKSAhPSAwKXsKIAkJCQlyZXR1cm4gRXJyb3I7CkBAIC00MTIsNiArNTA1LDE2IEBACiAJCQl9CiAJCQlyZXR1cm4gSWdub3JlOwogCisJCWNhc2UgSVByb2JsZW0uSW5jb21wYXRpYmxlUmV0dXJuVHlwZUZvck5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCA6CisJCWNhc2UgSVByb2JsZW0uSW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2VGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QgOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5JbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QpICE9IDApeworCQkJCXJldHVybiBFcnJvcjsKKwkJCX0KKwkJCWlmICgod2FybmluZ1RocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5JbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QpICE9IDApeworCQkJCXJldHVybiBXYXJuaW5nOworCQkJfQorCQkJcmV0dXJuIElnbm9yZTsKKwogCQljYXNlIElQcm9ibGVtLk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kIDoJCQkJCiAJCWNhc2UgSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkVHlwZSA6CQkJCQogCQljYXNlIElQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZE1ldGhvZCA6CkBAIC00NzksNiArNTgyLDM3IEBACiAJCQkJcmV0dXJuIFdhcm5pbmc7CiAJCQl9CiAJCQlyZXR1cm4gSWdub3JlOwkJCisJCWNhc2UgSVByb2JsZW0uTm9uU3RhdGljQWNjZXNzVG9TdGF0aWNNZXRob2QgOgorCQljYXNlIElQcm9ibGVtLk5vblN0YXRpY0FjY2Vzc1RvU3RhdGljRmllbGQgOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5TdGF0aWNBY2Nlc3NSZWNlaXZlcikgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLlN0YXRpY0FjY2Vzc1JlY2VpdmVyKSAhPSAwKXsKKwkJCQlyZXR1cm4gV2FybmluZzsKKwkJCX0KKwkJCXJldHVybiBJZ25vcmU7CQkKKwkJY2FzZSBJUHJvYmxlbS5Bc3NpZ25tZW50SGFzTm9FZmZlY3Q6CisJCQlpZiAoKGVycm9yVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLk5vRWZmZWN0QXNzaWdubWVudCkgIT0gMCl7CisJCQkJcmV0dXJuIEVycm9yOworCQkJfQorCQkJaWYgKCh3YXJuaW5nVGhyZXNob2xkICYgQ29tcGlsZXJPcHRpb25zLk5vRWZmZWN0QXNzaWdubWVudCkgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOwkJCisJCWNhc2UgSVByb2JsZW0uVW51c2VkUHJpdmF0ZUNvbnN0cnVjdG9yOgorCQljYXNlIElQcm9ibGVtLlVudXNlZFByaXZhdGVNZXRob2Q6CisJCWNhc2UgSVByb2JsZW0uVW51c2VkUHJpdmF0ZUZpZWxkOgorCQljYXNlIElQcm9ibGVtLlVudXNlZFByaXZhdGVUeXBlOgorCQkJaWYgKChlcnJvclRocmVzaG9sZCAmIENvbXBpbGVyT3B0aW9ucy5VbnVzZWRQcml2YXRlTWVtYmVyKSAhPSAwKXsKKwkJCQlyZXR1cm4gRXJyb3I7CisJCQl9CisJCQlpZiAoKHdhcm5pbmdUaHJlc2hvbGQgJiBDb21waWxlck9wdGlvbnMuVW51c2VkUHJpdmF0ZU1lbWJlcikgIT0gMCl7CisJCQkJcmV0dXJuIFdhcm5pbmc7CisJCQl9CisJCQlyZXR1cm4gSWdub3JlOwkJCisJCQorCQljYXNlIElQcm9ibGVtLlRhc2sgOgorCQkJcmV0dXJuIFdhcm5pbmc7CQkJCiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gRXJyb3I7CiAJfQpAQCAtNDg3LDEzICs2MjEsMTYgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW5jb21wYXRpYmxlVHlwZXNJbkNvbmRpdGlvbmFsT3BlcmF0b3IsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0cnVlVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmFsc2VUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0cnVlVHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKGZhbHNlVHlwZS5zb3VyY2VOYW1lKCkpfSwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgY29uZmxpY3RpbmdJbXBvcnQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhpbXBvcnRSZWYudG9rZW5zKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkNvbmZsaWN0aW5nSW1wb3J0LAotCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoaW1wb3J0UmVmLnRva2Vucyl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJaW1wb3J0UmVmLnNvdXJjZVN0YXJ0LAogCQlpbXBvcnRSZWYuc291cmNlRW5kKTsKIH0KQEAgLTUyMiwxMCArNjU5LDEyIEBACiAJCQkJCWJyZWFrIGxhYmVsOwogCQkJCX0KIAkJCX0KKwkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7UmFkaXggKyAiICIgKyBuZXcgU3RyaW5nKHNvdXJjZSkgKyAiIChkaWdpdCAiICsgbmV3IFN0cmluZyhuZXcgY2hhcltdIHtzb3VyY2VbcGxhY2VdfSkgKyAiKSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5OdW1lcmljVmFsdWVPdXRPZlJhbmdlLAotCQkJCW5ldyBTdHJpbmdbXSB7UmFkaXggKyAiICIgKyBuZXcgU3RyaW5nKHNvdXJjZSkgKyAiIChkaWdpdCAiICsgbmV3IFN0cmluZyhuZXcgY2hhcltdIHtzb3VyY2VbcGxhY2VdfSkgKyAiKSJ9LCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCWFyZ3VtZW50cywKKwkJCQlhcmd1bWVudHMsCiAJCQkJbGl0LnNvdXJjZVN0YXJ0LAogCQkJCWxpdC5zb3VyY2VFbmQpOwogCQkJcmV0dXJuOwpAQCAtNTM5LDEwICs2NzgsMTEgQEAKIHB1YmxpYyB2b2lkIGNvbnN0YW50T3V0T2ZSYW5nZShMaXRlcmFsIGxpdCkgewogCS8vIGxpdCBpcyBzb21lIGhvdyBvdXQgb2YgcmFuZ2Ugb2YgaXQgZGVjbGFyZWQgdHlwZQogCS8vIGV4YW1wbGUgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQotCisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxpdC5zb3VyY2UoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5OdW1lcmljVmFsdWVPdXRPZlJhbmdlLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobGl0LnNvdXJjZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlsaXQuc291cmNlU3RhcnQsCiAJCWxpdC5zb3VyY2VFbmQpOwogfQpAQCAtNTUwLDYgKzY5MCw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZEZpZWxkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC01NTgsMTIgKzY5OSwxNCBAQAogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLlVzaW5nRGVwcmVjYXRlZENvbnN0cnVjdG9yLAogCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKG1ldGhvZCl9LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogCWVsc2UKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5Vc2luZ0RlcHJlY2F0ZWRNZXRob2QsCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCBwYXJhbWV0ZXJzQXNTdHJpbmcobWV0aG9kKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKG1ldGhvZCl9LAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQpAQCAtNTcyLDIwICs3MTUsMjQgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVXNpbmdEZXByZWNhdGVkVHlwZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZUNhc2UoQ2FzZSBzdGF0ZW1lbnQsIENvbnN0YW50IGNvbnN0YW50KSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZihjb25zdGFudC5pbnRWYWx1ZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkR1cGxpY2F0ZUNhc2UsCi0JCW5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YoY29uc3RhbnQuaW50VmFsdWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJc3RhdGVtZW50LnNvdXJjZVN0YXJ0LAogCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZURlZmF1bHRDYXNlKERlZmF1bHRDYXNlIHN0YXRlbWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVEZWZhdWx0Q2FzZSwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJc3RhdGVtZW50LnNvdXJjZVN0YXJ0LAogCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKIH0KQEAgLTU5MywzNCArNzQwLDQzIEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkR1cGxpY2F0ZUZpZWxkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBmaWVsZERlY2wubmFtZSgpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIGZpZWxkRGVjbC5uYW1lKCl9LAogCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgZHVwbGljYXRlSW1wb3J0KEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoaW1wb3J0UmVmLnRva2Vucyl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVJbXBvcnQsCi0JCW5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhpbXBvcnRSZWYudG9rZW5zKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCiAJCWltcG9ydFJlZi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkJsYW5rRmluYWxGaWVsZChGaWVsZEJpbmRpbmcgZmllbGQsIFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117IG5ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uRHVwbGljYXRlQmxhbmtGaW5hbEZpZWxkSW5pdGlhbGl6YXRpb24sCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAogCQlyZWZlcmVuY2Uuc291cmNlRW5kKTsKIH0KLXB1YmxpYyB2b2lkIGR1cGxpY2F0ZUluaXRpYWxpemF0aW9uT2ZGaW5hbExvY2FsKExvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsLCBOYW1lUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworcHVibGljIHZvaWQgZHVwbGljYXRlSW5pdGlhbGl6YXRpb25PZkZpbmFsTG9jYWwoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKGxvY2FsLnJlYWRhYmxlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkR1cGxpY2F0ZUZpbmFsTG9jYWxJbml0aWFsaXphdGlvbiwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2FsLnJlYWRhYmxlTmFtZSgpKX0sCi0JCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKLQkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAorCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKKwkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZU1ldGhvZEluVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uRHVwbGljYXRlTWV0aG9kLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTYzMywxMCArNzg5LDExIEBACiAJCQlmaWVsZERlY2wubW9kaWZpZXJzLnNvdXJjZVN0YXJ0LAogCQkJZmllbGREZWNsLm1vZGlmaWVycy5zb3VyY2VFbmQpKTsKICovCi0KKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvckZpZWxkLAotCQluZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJZmllbGREZWNsLnNvdXJjZVN0YXJ0LAogCQlmaWVsZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTY0NCwyOSArODAxLDM2IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yTWV0aG9kLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAogCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAogCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBkdXBsaWNhdGVNb2RpZmllckZvclR5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVNb2RpZmllckZvclR5cGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZU1vZGlmaWVyRm9yVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2wsIGJvb2xlYW4gY29tcGxhaW5Gb3JBcmd1bWVudCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bG9jYWxEZWNsLm5hbWUoKX07CiAJdGhpcy5oYW5kbGUoCiAJCWNvbXBsYWluRm9yQXJndW1lbnQKLQkJCT8gIElQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yQXJndW1lbnQgCisJCQk/IElQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yQXJndW1lbnQgCiAJCQk6IElQcm9ibGVtLkR1cGxpY2F0ZU1vZGlmaWVyRm9yVmFyaWFibGUsCi0JCW5ldyBTdHJpbmdbXSB7bG9jYWxEZWNsLm5hbWUoKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCiAJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgZHVwbGljYXRlTmVzdGVkVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZURlY2wubmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVOZXN0ZWRUeXBlLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZURlY2wubmFtZSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZURlY2wuc291cmNlU3RhcnQsCiAJCXR5cGVEZWNsLnNvdXJjZUVuZCk7CiB9CkBAIC02NzYsMzYgKzg0MCw0OCBAQAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhzdXBlclR5cGUucmVhZGFibGVOYW1lKCkpLAogCQkJbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZyhzdXBlclR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQluZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCiAJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAogCQl0eXBlRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgZHVwbGljYXRlVHlwZXMoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsLCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY29tcFVuaXREZWNsLmdldEZpbGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfTsKIAl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSB0eXBlRGVjbDsgLy8gcmVwb3J0IHRoZSBwcm9ibGVtIGFnYWluc3QgdGhlIHR5cGUgbm90IHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5EdXBsaWNhdGVUeXBlcywKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kLAogCQljb21wVW5pdERlY2wuY29tcGlsYXRpb25SZXN1bHQpOwogfQogcHVibGljIHZvaWQgZXJyb3JOb01ldGhvZEZvcihNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCwgVHlwZUJpbmRpbmcgcmVjVHlwZSwgVHlwZUJpbmRpbmdbXSBwYXJhbXMpIHsKIAlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVN0cmluZ0J1ZmZlciBzaG9ydEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICE9IDApCisJCWlmIChpICE9IDApewogCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJc2hvcnRCdWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCX0KIAkJYnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKHBhcmFtc1tpXS5yZWFkYWJsZU5hbWUoKSkpOworCQlzaG9ydEJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhwYXJhbXNbaV0uc2hvcnRSZWFkYWJsZU5hbWUoKSkpOwogCX0KIAogCXRoaXMuaGFuZGxlKAogCQlyZWNUeXBlLmlzQXJyYXlUeXBlKCkgPyBJUHJvYmxlbS5Ob01lc3NhZ2VTZW5kT25BcnJheVR5cGUgOiBJUHJvYmxlbS5Ob01lc3NhZ2VTZW5kT25CYXNlVHlwZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHJlY1R5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1lc3NhZ2VTZW5kLnNlbGVjdG9yKSwgYnVmZmVyLnRvU3RyaW5nKCl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcocmVjVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXNzYWdlU2VuZC5zZWxlY3RvciksIHNob3J0QnVmZmVyLnRvU3RyaW5nKCl9LAogCQltZXNzYWdlU2VuZC5zb3VyY2VTdGFydCwKIAkJbWVzc2FnZVNlbmQuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGVycm9yVGhpc1N1cGVySW5TdGF0aWMoQXN0Tm9kZSByZWZlcmVuY2UpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge3JlZmVyZW5jZS5pc1N1cGVyKCkgPyAic3VwZXIiIDogInRoaXMifTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlRoaXNJblN0YXRpY0NvbnRleHQsCi0JCW5ldyBTdHJpbmdbXSB7cmVmZXJlbmNlLmlzU3VwZXIoKSA/ICJzdXBlciIgOiAidGhpcyJ9LCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKIAkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CiB9CkBAIC03MzYsMTMgKzkxMiwyMyBAQAogCXRoaXMuaGFuZGxlKAogCQlpZCwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3RvciksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJZXhjZXB0aW9uVHlwZS5zb3VyY2VTdGFydCwKIAkJZXhjZXB0aW9uVHlwZS5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgZXhwcmVzc2lvblNob3VsZEJlQVZhcmlhYmxlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5FeHByZXNzaW9uU2hvdWxkQmVBVmFyaWFibGUsCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIGZpZWxkc09yVGhpc0JlZm9yZUNvbnN0cnVjdG9ySW52b2NhdGlvbihUaGlzUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5UaGlzU3VwZXJEdXJpbmdDb25zdHJ1Y3Rvckludm9jYXRpb24sCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwKIAkJcmVmZXJlbmNlLnNvdXJjZUVuZCk7CiB9CkBAIC03NzMsNiArOTU5LDcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJaWQsCiAJCW5ldyBTdHJpbmdbXSB7ZmllbGREZWNsLm5hbWUoKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7ZmllbGREZWNsLm5hbWUoKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJZmllbGREZWNsLnR5cGUuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC50eXBlLnNvdXJjZUVuZCk7CiB9CkBAIC03ODIsMTMgKzk2OSwxNSBAQAogCQkvLyA4LjQuMy4zIC0gRmluYWwgbWV0aG9kcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBvciBoaWRkZW4uCiAJCUlQcm9ibGVtLkZpbmFsTWV0aG9kQ2Fubm90QmVPdmVycmlkZGVuLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCiAJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgZm9yd2FyZFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmZXJlbmNlLCBpbnQgaW5kZXhJblF1YWxpZmljYXRpb24sIFR5cGVCaW5kaW5nIHR5cGUpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uUmVmZXJlbmNlVG9Gb3J3YXJkRmllbGQsCi0JCW5ldyBTdHJpbmdbXSB7fSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAogCQlyZWZlcmVuY2Uuc291cmNlRW5kKTsKIH0KQEAgLTc5OSwxMiArOTg4LDE0IEBACiBwcml2YXRlIHZvaWQgaGFuZGxlKAogCWludCBwcm9ibGVtSWQsIAogCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKIAlpbnQgcHJvYmxlbVN0YXJ0UG9zaXRpb24sIAogCWludCBwcm9ibGVtRW5kUG9zaXRpb24pewogCiAJdGhpcy5oYW5kbGUoCiAJCQlwcm9ibGVtSWQsCiAJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJbWVzc2FnZUFyZ3VtZW50cywKIAkJCXByb2JsZW1TdGFydFBvc2l0aW9uLAogCQkJcHJvYmxlbUVuZFBvc2l0aW9uLAogCQkJcmVmZXJlbmNlQ29udGV4dCwgCkBAIC04MTgsNiArMTAwOSw3IEBACiBwcml2YXRlIHZvaWQgaGFuZGxlKAogCWludCBwcm9ibGVtSWQsIAogCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKIAlpbnQgc2V2ZXJpdHksCiAJaW50IHByb2JsZW1TdGFydFBvc2l0aW9uLCAKIAlpbnQgcHJvYmxlbUVuZFBvc2l0aW9uKXsKQEAgLTgyNSw2ICsxMDE3LDcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJCXByb2JsZW1JZCwKIAkJCXByb2JsZW1Bcmd1bWVudHMsCisJCQltZXNzYWdlQXJndW1lbnRzLAogCQkJc2V2ZXJpdHksCiAJCQlwcm9ibGVtU3RhcnRQb3NpdGlvbiwKIAkJCXByb2JsZW1FbmRQb3NpdGlvbiwKQEAgLTgzOCw2ICsxMDMxLDcgQEAKIHByaXZhdGUgdm9pZCBoYW5kbGUoCiAJaW50IHByb2JsZW1JZCwgCiAJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAogCWludCBwcm9ibGVtU3RhcnRQb3NpdGlvbiwgCiAJaW50IHByb2JsZW1FbmRQb3NpdGlvbiwKIAlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0KXsKQEAgLTg0NSw2ICsxMDM5LDcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJCXByb2JsZW1JZCwKIAkJCXByb2JsZW1Bcmd1bWVudHMsCisJCQltZXNzYWdlQXJndW1lbnRzLAogCQkJcHJvYmxlbVN0YXJ0UG9zaXRpb24sCiAJCQlwcm9ibGVtRW5kUG9zaXRpb24sCiAJCQlyZWZlcmVuY2VDb250ZXh0LCAKQEAgLTg1Miw5ICsxMDQ3LDExIEBACiAJcmVmZXJlbmNlQ29udGV4dCA9IG51bGw7CiB9CiBwdWJsaWMgdm9pZCBoaWRpbmdFbmNsb3NpbmdUeXBlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkhpZGluZ0VuY2xvc2luZ1R5cGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kKTsKIH0KQEAgLTg2MiwxMjggKzEwNTksMTYzIEBACiAJaW50IHN0YXJ0ID0gMDsKIAlpbnQgZW5kID0gMDsKIAlTdHJpbmcgdHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBzaG9ydFR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKIAogCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewkvLyBjYW4gb25seSBoYXBwZW4gd2hlbiBqYXZhLmxhbmcuT2JqZWN0IGlzIGJ1c3RlZAogCQlzdGFydCA9IHNvdXJjZVR5cGUuc291cmNlU3RhcnQoKTsKIAkJZW5kID0gc291cmNlVHlwZS5zb3VyY2VFbmQoKTsKIAkJdHlwZU5hbWUgPSBuZXcgU3RyaW5nKHN1cGVyVHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJCXNob3J0VHlwZU5hbWUgPSBuZXcgU3RyaW5nKHN1cGVyVHlwZS5zb3VyY2VOYW1lKCkpOwogCX0gZWxzZSB7CiAJCXN0YXJ0ID0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0OwogCQllbmQgPSByZWZlcmVuY2Uuc291cmNlRW5kOwotCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24udG9TdHJpbmcocmVmZXJlbmNlLmdldFR5cGVOYW1lKCkpOworCQljaGFyW11bXSBxTmFtZSA9IHJlZmVyZW5jZS5nZXRUeXBlTmFtZSgpOworCQl0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24udG9TdHJpbmcocU5hbWUpOworCQlzaG9ydFR5cGVOYW1lID0gbmV3IFN0cmluZyhxTmFtZVtxTmFtZS5sZW5ndGgtMV0pOwogCX0KIAogCWlmIChzb3VyY2VUeXBlID09IHN1cGVyVHlwZSkKIAkJdGhpcy5oYW5kbGUoCiAJCQlJUHJvYmxlbS5IaWVyYXJjaHlDaXJjdWxhcml0eVNlbGZSZWZlcmVuY2UsCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlVHlwZS5zb3VyY2VOYW1lKCkpLCB0eXBlTmFtZX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlVHlwZS5zb3VyY2VOYW1lKCkpLCBzaG9ydFR5cGVOYW1lfSwKIAkJCXN0YXJ0LAogCQkJZW5kKTsKIAllbHNlCiAJCXRoaXMuaGFuZGxlKAogCQkJSVByb2JsZW0uSGllcmFyY2h5Q2lyY3VsYXJpdHksCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlVHlwZS5zb3VyY2VOYW1lKCkpLCB0eXBlTmFtZX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc291cmNlVHlwZS5zb3VyY2VOYW1lKCkpLCBzaG9ydFR5cGVOYW1lfSwKIAkJCXN0YXJ0LAogCQkJZW5kKTsKIH0KIHB1YmxpYyB2b2lkIGhpZXJhcmNoeUhhc1Byb2JsZW1zKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSGllcmFyY2h5SGFzUHJvYmxlbXMsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxBYnN0cmFjdE1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbEFic3RyYWN0TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAogCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsQWJzdHJhY3RGb3JDbGFzcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckNvbWJpbmF0aW9uRmluYWxBYnN0cmFjdEZvckNsYXNzLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsVm9sYXRpbGVGb3JGaWVsZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfTsKKwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJDb21iaW5hdGlvbkZpbmFsVm9sYXRpbGVGb3JGaWVsZCwKLQkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKIAkJZmllbGREZWNsLnNvdXJjZUVuZCk7CiB9CiAKIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9yQ2xhc3MsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JGaWVsZCwKLQkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKIAkJZmllbGREZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2UsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckludGVyZmFjZUZpZWxkKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge2ZpZWxkRGVjbC5uYW1lKCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2VGaWVsZCwKLQkJbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWZpZWxkRGVjbC5zb3VyY2VTdGFydCwKIAkJZmllbGREZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JJbnRlcmZhY2VNZXRob2QoUmVmZXJlbmNlQmluZGluZyB0eXBlLCBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbE1vZGlmaWVyRm9ySW50ZXJmYWNlTWV0aG9kLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvckxvY2FsQ2xhc3MoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JMb2NhbENsYXNzLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJDbGFzcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvck1lbWJlckNsYXNzLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJJbnRlcmZhY2UoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JNZW1iZXJJbnRlcmZhY2UsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxNb2RpZmllckZvck1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsTW9kaWZpZXJGb3JNZXRob2QsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbE1vZGlmaWVyRm9yVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2wsIGJvb2xlYW4gY29tcGxhaW5Bc0FyZ3VtZW50KSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtsb2NhbERlY2wubmFtZSgpfTsKIAl0aGlzLmhhbmRsZSgKIAkJY29tcGxhaW5Bc0FyZ3VtZW50CiAJCQk/IElQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvckFyZ3VtZW50CiAJCQk6IElQcm9ibGVtLklsbGVnYWxNb2RpZmllckZvclZhcmlhYmxlLAotCQluZXcgU3RyaW5nW10ge2xvY2FsRGVjbC5uYW1lKCl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbG9jYWxEZWNsLnNvdXJjZVN0YXJ0LAogCQlsb2NhbERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTk5MSw0OCArMTIyMyw2MCBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsUHJpbWl0aXZlT3JBcnJheVR5cGVGb3JFbmNsb3NpbmdJbnN0YW5jZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxTdGF0aWNNb2RpZmllckZvck1lbWJlclR5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsU3RhdGljTW9kaWZpZXJGb3JNZW1iZXJUeXBlLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXR5cGUuc291cmNlU3RhcnQoKSwKIAkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBpbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JGaWVsZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkRGVjbC5uYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yRmllbGQsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZERlY2wubmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckNvbWJpbmF0aW9uRm9yTWVtYmVyVHlwZShTb3VyY2VUeXBlQmluZGluZyB0eXBlKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLklsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1lbWJlclR5cGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGlsbGVnYWxWaXNpYmlsaXR5TW9kaWZpZXJDb21iaW5hdGlvbkZvck1ldGhvZChSZWZlcmVuY2VCaW5kaW5nIHR5cGUsIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyQ29tYmluYXRpb25Gb3JNZXRob2QsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbFZpc2liaWxpdHlNb2RpZmllckZvckludGVyZmFjZU1lbWJlclR5cGUoU291cmNlVHlwZUJpbmRpbmcgdHlwZSkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsVmlzaWJpbGl0eU1vZGlmaWVyRm9ySW50ZXJmYWNlTWVtYmVyVHlwZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQl0eXBlLnNvdXJjZVN0YXJ0KCksCiAJCXR5cGUuc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgaWxsZWdhbFZvaWRFeHByZXNzaW9uKEFzdE5vZGUgbG9jYXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZFZvaWRFeHByZXNzaW9uLAotCQluZXcgU3RyaW5nW10ge30sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQpAQCAtMTA2NiwxNCArMTMxMCwyMiBAQAogCX0gZWxzZSB7CiAJCWFyZ3VtZW50ID0gQ2hhck9wZXJhdGlvbi50b1N0cmluZyhpbXBvcnRSZWYudG9rZW5zKTsKIAl9Ci0JdGhpcy5oYW5kbGUoaWQsIG5ldyBTdHJpbmdbXSB7YXJndW1lbnR9LCBpbXBvcnRSZWYuc291cmNlU3RhcnQsIGltcG9ydFJlZi5zb3VyY2VFbmQpOworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXthcmd1bWVudH07CisJdGhpcy5oYW5kbGUoaWQsIGFyZ3VtZW50cywgYXJndW1lbnRzLCBpbXBvcnRSZWYuc291cmNlU3RhcnQsIGltcG9ydFJlZi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2UoU291cmNlVHlwZUJpbmRpbmcgdHlwZSwgTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCwgUmVmZXJlbmNlQmluZGluZyBleGNlcHRpb25UeXBlKSB7Ci0JaWYgKHR5cGUgPT0gY3VycmVudE1ldGhvZC5kZWNsYXJpbmdDbGFzcykKKwlpZiAodHlwZSA9PSBjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzKSB7CisJCWludCBpZDsKKwkJaWYgKGN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3MuaXNJbnRlcmZhY2UoKSAKKwkJCQkmJiAhaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkpeyAvLyBpbnRlcmZhY2UgaW5oZXJpdGluZyBPYmplY3QgcHJvdGVjdGVkIG1ldGhvZAorCQkJaWQgPSBJUHJvYmxlbS5JbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZUZvck5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZDsKKwkJfSBlbHNlIHsKKwkJCWlkID0gSVByb2JsZW0uSW5jb21wYXRpYmxlRXhjZXB0aW9uSW5UaHJvd3NDbGF1c2U7CisJCX0KIAkJdGhpcy5oYW5kbGUoCiAJCQkvLyBFeGNlcHRpb24gJTEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aHJvd3MgY2xhdXNlIGluICUyCiAJCQkvLyA5LjQuNCAtIFRoZSB0eXBlIG9mIGV4Y2VwdGlvbiBpbiB0aGUgdGhyb3dzIGNsYXVzZSBpcyBpbmNvbXBhdGlibGUuCi0JCQlJUHJvYmxlbS5JbmNvbXBhdGlibGVFeGNlcHRpb25JblRocm93c0NsYXVzZSwKKwkJCWlkLAogCQkJbmV3IFN0cmluZ1tdIHsKIAkJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpKSwKIAkJCQluZXcgU3RyaW5nKApAQCAtMTA4MSw5ICsxMzMzLDE2IEBACiAJCQkJCQlpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCksCiAJCQkJCQlpbmhlcml0ZWRNZXRob2QucmVhZGFibGVOYW1lKCksCiAJCQkJCQknLicpKX0sCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcoZXhjZXB0aW9uVHlwZS5zb3VyY2VOYW1lKCkpLAorCQkJCW5ldyBTdHJpbmcoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KAorCQkJCQkJaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCksCisJCQkJCQlpbmhlcml0ZWRNZXRob2Quc2hvcnRSZWFkYWJsZU5hbWUoKSwKKwkJCQkJCScuJykpfSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwotCWVsc2UJCisJfSBlbHNlCQogCQl0aGlzLmhhbmRsZSgKIAkJCS8vIEV4Y2VwdGlvbiAlMSBpbiB0aHJvd3MgY2xhdXNlIG9mICUyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggJTMKIAkJCS8vIDkuNC40IC0gVGhlIHR5cGUgb2YgZXhjZXB0aW9uIGluIHRoZSB0aHJvd3MgY2xhdXNlIGlzIGluY29tcGF0aWJsZS4KQEAgLTExMDAsNiArMTM1OSwxOCBAQAogCQkJCQkJaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpLAogCQkJCQkJaW5oZXJpdGVkTWV0aG9kLnJlYWRhYmxlTmFtZSgpLAogCQkJCQkJJy4nKSl9LAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQluZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc291cmNlTmFtZSgpKSwKKwkJCQluZXcgU3RyaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCWN1cnJlbnRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc291cmNlTmFtZSgpLAorCQkJCQkJY3VycmVudE1ldGhvZC5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSksCisJCQkJbmV3IFN0cmluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSwKKwkJCQkJCWluaGVyaXRlZE1ldGhvZC5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSl9LAogCQkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQkJdHlwZS5zb3VyY2VFbmQoKSk7CiB9CkBAIC0xMTEwLDI4ICsxMzgxLDMxIEBACiAJCS5hcHBlbmQoJy4nKQogCQkuYXBwZW5kKGluaGVyaXRlZE1ldGhvZC5yZWFkYWJsZU5hbWUoKSk7CiAKKwlTdHJpbmdCdWZmZXIgc2hvcnRTaWduYXR1cmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJc2hvcnRTaWduYXR1cmUKKwkJLmFwcGVuZChpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSkKKwkJLmFwcGVuZCgnLicpCisJCS5hcHBlbmQoaW5oZXJpdGVkTWV0aG9kLnNob3J0UmVhZGFibGVOYW1lKCkpOworCisJaW50IGlkOworCWlmIChjdXJyZW50TWV0aG9kLmRlY2xhcmluZ0NsYXNzLmlzSW50ZXJmYWNlKCkgCisJCQkmJiAhaW5oZXJpdGVkTWV0aG9kLmlzUHVibGljKCkpeyAvLyBpbnRlcmZhY2UgaW5oZXJpdGluZyBPYmplY3QgcHJvdGVjdGVkIG1ldGhvZAorCQlpZCA9IElQcm9ibGVtLkluY29tcGF0aWJsZVJldHVyblR5cGVGb3JOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q7CisJfSBlbHNlIHsKKwkJaWQgPSBJUHJvYmxlbS5JbmNvbXBhdGlibGVSZXR1cm5UeXBlOworCX0KIAl0aGlzLmhhbmRsZSgKLQkJLy8gUmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggJTEKLQkJLy8gOS40LjIgLSBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgbWV0aG9kIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJhdGlvbi4KLQkJSVByb2JsZW0uSW5jb21wYXRpYmxlUmV0dXJuVHlwZSwKKwkJaWQsCiAJCW5ldyBTdHJpbmdbXSB7bWV0aG9kU2lnbmF0dXJlLnRvU3RyaW5nKCl9LAorCQluZXcgU3RyaW5nW10ge3Nob3J0U2lnbmF0dXJlLnRvU3RyaW5nKCl9LAogCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCiAJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQotcHVibGljIHZvaWQgaW5jb3JyZWN0RW5jbG9zaW5nSW5zdGFuY2VSZWZlcmVuY2UoCi0JUXVhbGlmaWVkVGhpc1JlZmVyZW5jZSByZWZlcmVuY2UsIAotCVR5cGVCaW5kaW5nIHF1YWxpZmljYXRpb25UeXBlKSB7Ci0JCQotCXRoaXMuaGFuZGxlKAotCQlJUHJvYmxlbS5JbmNvcnJlY3RFbmNsb3NpbmdJbnN0YW5jZVJlZmVyZW5jZSwgCi0JCW5ldyBTdHJpbmdbXSB7IG5ldyBTdHJpbmcocXVhbGlmaWNhdGlvblR5cGUucmVhZGFibGVOYW1lKCkpfSwgCi0JCXJlZmVyZW5jZS5zb3VyY2VTdGFydCwgCi0JCXJlZmVyZW5jZS5zb3VyY2VFbmQpOyAKLX0KIHB1YmxpYyB2b2lkIGluY29ycmVjdExvY2F0aW9uRm9yRW1wdHlEaW1lbnNpb24oQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgaW5kZXgpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbERpbWVuc2lvbiwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZXhwcmVzc2lvbi5kaW1lbnNpb25zW2luZGV4ICsgMV0uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uZGltZW5zaW9uc1tpbmRleCArIDFdLnNvdXJjZUVuZCk7CiB9CkBAIC0xMTM5LDYgKzE0MTMsNyBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbmNvcnJlY3RTd2l0Y2hUeXBlLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGVzdFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHRlc3RUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQpAQCAtMTE0OCwyNCArMTQyMywzOSBAQAogCQkuYXBwZW5kKGNvbmNyZXRlTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKQogCQkuYXBwZW5kKCcuJykKIAkJLmFwcGVuZChjb25jcmV0ZU1ldGhvZC5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nQnVmZmVyIHNob3J0U2lnbmF0dXJlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXNob3J0U2lnbmF0dXJlCisJCS5hcHBlbmQoY29uY3JldGVNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSkKKwkJLmFwcGVuZCgnLicpCisJCS5hcHBlbmQoY29uY3JldGVNZXRob2Quc2hvcnRSZWFkYWJsZU5hbWUoKSk7CiAJdGhpcy5oYW5kbGUoCiAJCS8vIFRoZSBpbmhlcml0ZWQgbWV0aG9kICUxIGNhbm5vdCBoaWRlIHRoZSBwdWJsaWMgYWJzdHJhY3QgbWV0aG9kIGluICUyCiAJCUlQcm9ibGVtLkluaGVyaXRlZE1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5LAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhjb25jcmV0ZVNpZ25hdHVyZS50b1N0cmluZygpKSwKIAkJCW5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2RzWzBdLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKHNob3J0U2lnbmF0dXJlLnRvU3RyaW5nKCkpLAorCQkJbmV3IFN0cmluZyhhYnN0cmFjdE1ldGhvZHNbMF0uZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQl0eXBlLnNvdXJjZVN0YXJ0KCksCiAJCXR5cGUuc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgaW5oZXJpdGVkTWV0aG9kc0hhdmVJbmNvbXBhdGlibGVSZXR1cm5UeXBlcyhTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2RCaW5kaW5nW10gaW5oZXJpdGVkTWV0aG9kcywgaW50IGxlbmd0aCkgewogCVN0cmluZ0J1ZmZlciBtZXRob2RTaWduYXR1cmVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVN0cmluZ0J1ZmZlciBzaG9ydFNpZ25hdHVyZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJZm9yIChpbnQgaSA9IGxlbmd0aDsgLS1pID49IDA7KSB7CiAJCW1ldGhvZFNpZ25hdHVyZXMKIAkJCS5hcHBlbmQoaW5oZXJpdGVkTWV0aG9kc1tpXS5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSkKIAkJCS5hcHBlbmQoJy4nKQogCQkJLmFwcGVuZChpbmhlcml0ZWRNZXRob2RzW2ldLnJlYWRhYmxlTmFtZSgpKTsKLQkJaWYgKGkgIT0gMCkKKwkJc2hvcnRTaWduYXR1cmVzCisJCQkuYXBwZW5kKGluaGVyaXRlZE1ldGhvZHNbaV0uZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSkKKwkJCS5hcHBlbmQoJy4nKQorCQkJLmFwcGVuZChpbmhlcml0ZWRNZXRob2RzW2ldLnNob3J0UmVhZGFibGVOYW1lKCkpOworCQlpZiAoaSAhPSAwKXsKIAkJCW1ldGhvZFNpZ25hdHVyZXMuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCQlzaG9ydFNpZ25hdHVyZXMuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCX0KIAl9CiAKIAl0aGlzLmhhbmRsZSgKQEAgLTExNzMsMTMgKzE0NjMsMTUgQEAKIAkJLy8gOS40LjIgLSBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgbWV0aG9kIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJhdGlvbi4KIAkJSVByb2JsZW0uSW5jb21wYXRpYmxlUmV0dXJuVHlwZSwKIAkJbmV3IFN0cmluZ1tdIHttZXRob2RTaWduYXR1cmVzLnRvU3RyaW5nKCl9LAorCQluZXcgU3RyaW5nW10ge3Nob3J0U2lnbmF0dXJlcy50b1N0cmluZygpfSwKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemVyTXVzdENvbXBsZXRlTm9ybWFsbHkoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2wpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW5pdGlhbGl6ZXJNdXN0Q29tcGxldGVOb3JtYWxseSwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZmllbGREZWNsLnNvdXJjZVN0YXJ0LAogCQlmaWVsZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTExODcsMjkgKzE0NzksMzUgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ2Fubm90RGVmaW5lU3RhdGljSW5pdGlhbGl6ZXJJbkxvY2FsVHlwZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGlubmVyVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5uZXJUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbnRlcmZhY2VDYW5ub3RIYXZlQ29uc3RydWN0b3JzKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW50ZXJmYWNlQ2Fubm90SGF2ZUNvbnN0cnVjdG9ycywKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJY29uc3RydWN0b3Iuc291cmNlU3RhcnQsCiAJCWNvbnN0cnVjdG9yLnNvdXJjZUVuZCwKIAkJY29uc3RydWN0b3IsCiAJCWNvbnN0cnVjdG9yLmNvbXBpbGF0aW9uUmVzdWx0KCkpOwogfQogcHVibGljIHZvaWQgaW50ZXJmYWNlQ2Fubm90SGF2ZUluaXRpYWxpemVycyhTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9OworCiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludGVyZmFjZUNhbm5vdEhhdmVJbml0aWFsaXplcnMsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJZmllbGREZWNsLnNvdXJjZVN0YXJ0LAogCQlmaWVsZERlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRCcmVhayhBc3ROb2RlIGxvY2F0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludmFsaWRCcmVhaywKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0xMjYxLDE4ICsxNTU5LDIxIEBACiAJdGhpcy5oYW5kbGUoCiAJCWZsYWcsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvci5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1N0cmluZyh0YXJnZXRDb25zdHJ1Y3Rvcil9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodGFyZ2V0Q29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIHBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKHRhcmdldENvbnN0cnVjdG9yKX0sCiAJCXN0YXRlbWVudC5zb3VyY2VTdGFydCwKIAkJc3RhdGVtZW50LnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBpbnZhbGlkQ29udGludWUoQXN0Tm9kZSBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkQ29udGludWUsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQotcHVibGljIHZvaWQgaW52YWxpZEVuY2xvc2luZ1R5cGUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyB0eXBlLCBUeXBlQmluZGluZyBlbmNsb3NpbmdUeXBlKSB7CitwdWJsaWMgdm9pZCBpbnZhbGlkRW5jbG9zaW5nVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIHR5cGUsIFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSkgewogCisJaWYgKGVuY2xvc2luZ1R5cGUuaXNBbm9ueW1vdXNUeXBlKCkpIGVuY2xvc2luZ1R5cGUgPSBlbmNsb3NpbmdUeXBlLnN1cGVyY2xhc3MoKTsKIAlpbnQgZmxhZyA9IElQcm9ibGVtLlVuZGVmaW5lZFR5cGU7IC8vIGRlZmF1bHQKIAlzd2l0Y2ggKHR5cGUucHJvYmxlbUlkKCkpIHsKIAkJY2FzZSBOb3RGb3VuZCA6IC8vIDEKQEAgLTEyOTYsMTMgKzE1OTcsMTUgQEAKIAl0aGlzLmhhbmRsZSgKIAkJZmxhZywKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUucmVhZGFibGVOYW1lKCkpICsgIi4iICsgbmV3IFN0cmluZyh0eXBlLnJlYWRhYmxlTmFtZSgpKX0sIC8vJE5PTi1OTFMtMSQKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSkgKyAiLiIgKyBuZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LCAvLyROT04tTkxTLTEkCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRFeHByZXNzaW9uQXNTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKXsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZEV4cHJlc3Npb25Bc1N0YXRlbWVudCwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQpAQCAtMTMzMywxNSArMTYzNiwyNiBAQAogCQljYXNlIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgogCQkJZmxhZyA9IElQcm9ibGVtLkluaGVyaXRlZEZpZWxkSGlkZXNFbmNsb3NpbmdOYW1lOwogCQkJYnJlYWs7CisJCWNhc2UgUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSA6CisJCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5Ob3RWaXNpYmxlVHlwZSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCWZpZWxkUmVmLnJlY2VpdmVyLnNvdXJjZVN0YXJ0LAorCQkJCWZpZWxkUmVmLnJlY2VpdmVyLnNvdXJjZUVuZCk7CisJCQlyZXR1cm47CisJCQkKIAkJY2FzZSBOb0Vycm9yIDogLy8gMAogCQlkZWZhdWx0IDoKIAkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KIAkJCWJyZWFrOwogCX0KIAorCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlmbGFnLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXNldmVyaXR5LAogCQlmaWVsZFJlZi5zb3VyY2VTdGFydCwKIAkJZmllbGRSZWYuc291cmNlRW5kKTsKQEAgLTEzNjcsMTQgKzE2ODEsMjQgQEAKIAkJY2FzZSBJbmhlcml0ZWROYW1lSGlkZXNFbmNsb3NpbmdOYW1lIDoKIAkJCWZsYWcgPSBJUHJvYmxlbS5Jbmhlcml0ZWRGaWVsZEhpZGVzRW5jbG9zaW5nTmFtZTsKIAkJCWJyZWFrOworCQljYXNlIFJlY2VpdmVyVHlwZU5vdFZpc2libGUgOgorCQkJdGhpcy5oYW5kbGUoCisJCQkJSVByb2JsZW0uTm90VmlzaWJsZVR5cGUsCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MubGVhZkNvbXBvbmVudFR5cGUoKS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCisJCQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKKwkJCQluYW1lUmVmLnNvdXJjZUVuZCk7CisJCQlyZXR1cm47CiAJCWNhc2UgTm9FcnJvciA6IC8vIDAKIAkJZGVmYXVsdCA6CiAJCQluZWVkSW1wbGVtZW50YXRpb24oKTsgLy8gd2FudCB0byBmYWlsIHRvIHNlZSB3aHkgd2Ugd2VyZSBoZXJlLi4uCiAJCQlicmVhazsKIAl9CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCWZsYWcsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbmFtZVJlZi5zb3VyY2VTdGFydCwKIAkJbmFtZVJlZi5zb3VyY2VFbmQpOwogfQpAQCAtMTM5NCw2ICsxNzE4LDEwIEBACiAJCQkJbmV3IFN0cmluZyhzZWFyY2hlZFR5cGUucmVhZGFibGVOYW1lKCkpLAogCQkJCUNoYXJPcGVyYXRpb24udG9TdHJpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lUmVmLnRva2VucywgMCwgaW5kZXgpKSwKIAkJCQluZXcgU3RyaW5nKG5hbWVSZWYudG9rZW5zW2luZGV4XSl9LAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQluZXcgU3RyaW5nKHNlYXJjaGVkVHlwZS5zb3VyY2VOYW1lKCkpLAorCQkJCUNoYXJPcGVyYXRpb24udG9TdHJpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lUmVmLnRva2VucywgMCwgaW5kZXgpKSwKKwkJCQluZXcgU3RyaW5nKG5hbWVSZWYudG9rZW5zW2luZGV4XSl9LAogCQkJbmFtZVJlZi5zb3VyY2VTdGFydCwKIAkJCW5hbWVSZWYuc291cmNlRW5kKTsKIAkJcmV0dXJuOwpAQCAtMTQyMywxNCArMTc1MSwyNCBAQAogCQljYXNlIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUgOgogCQkJZmxhZyA9IElQcm9ibGVtLkluaGVyaXRlZEZpZWxkSGlkZXNFbmNsb3NpbmdOYW1lOwogCQkJYnJlYWs7CisJCWNhc2UgUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSA6CisJCQl0aGlzLmhhbmRsZSgKKwkJCQlJUHJvYmxlbS5Ob3RWaXNpYmxlVHlwZSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkucmVhZGFibGVOYW1lKCkpfSwKKwkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoc2VhcmNoZWRUeXBlLmxlYWZDb21wb25lbnRUeXBlKCkuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQkJCW5hbWVSZWYuc291cmNlU3RhcnQsCisJCQkJbmFtZVJlZi5zb3VyY2VFbmQpOworCQkJcmV0dXJuOwogCQljYXNlIE5vRXJyb3IgOiAvLyAwCiAJCWRlZmF1bHQgOgogCQkJbmVlZEltcGxlbWVudGF0aW9uKCk7IC8vIHdhbnQgdG8gZmFpbCB0byBzZWUgd2h5IHdlIHdlcmUgaGVyZS4uLgogCQkJYnJlYWs7CiAJfQorCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWVSZWYudG9rZW5zLCAwLCBpbmRleCArIDEpKX07CiAJdGhpcy5oYW5kbGUoCiAJCWZsYWcsIAotCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lUmVmLnRva2VucywgMCwgaW5kZXggKyAxKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbmFtZVJlZi5zb3VyY2VTdGFydCwgCiAJCW5hbWVSZWYuc291cmNlRW5kKTsgCiB9CkBAIC0xNDY0LDYgKzE4MDIsMTUgQEAKIAkJY2FzZSBOb25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQgOgogCQkJZmxhZyA9IElQcm9ibGVtLlN0YXRpY01ldGhvZFJlcXVlc3RlZDsKIAkJCWJyZWFrOworCQljYXNlIFJlY2VpdmVyVHlwZU5vdFZpc2libGUgOgorCQkJdGhpcy5oYW5kbGUoCisJCQkJSVByb2JsZW0uTm90VmlzaWJsZVR5cGUsCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5sZWFmQ29tcG9uZW50VHlwZSgpLnJlYWRhYmxlTmFtZSgpKX0sCisJCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5sZWFmQ29tcG9uZW50VHlwZSgpLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJCQltZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VTdGFydCwKKwkJCQltZXNzYWdlU2VuZC5yZWNlaXZlci5zb3VyY2VFbmQpOworCQkJcmV0dXJuOworCQkKIAkJY2FzZSBOb0Vycm9yIDogLy8gMAogCQlkZWZhdWx0IDoKIAkJCW5lZWRJbXBsZW1lbnRhdGlvbigpOyAvLyB3YW50IHRvIGZhaWwgdG8gc2VlIHdoeSB3ZSB3ZXJlIGhlcmUuLi4KQEAgLTE0NzMsMTMgKzE4MjAsMjggQEAKIAlpZiAoZmxhZyA9PSBJUHJvYmxlbS5VbmRlZmluZWRNZXRob2QpIHsKIAkJUHJvYmxlbU1ldGhvZEJpbmRpbmcgcHJvYmxlbU1ldGhvZCA9IChQcm9ibGVtTWV0aG9kQmluZGluZykgbWV0aG9kOwogCQlpZiAocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2ggIT0gbnVsbCkgeworCQkJCVN0cmluZyBjbG9zZXN0UGFyYW1ldGVyVHlwZU5hbWVzID0gcGFyYW1ldGVyc0FzU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoKTsKKwkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZU5hbWVzID0gcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCk7CisJCQkJU3RyaW5nIGNsb3Nlc3RQYXJhbWV0ZXJUeXBlU2hvcnROYW1lcyA9IHBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoKTsKKwkJCQlTdHJpbmcgcGFyYW1ldGVyVHlwZVNob3J0TmFtZXMgPSBwYXJhbWV0ZXJzQXNTaG9ydFN0cmluZyhtZXRob2QpOworCQkJCWlmIChjbG9zZXN0UGFyYW1ldGVyVHlwZVNob3J0TmFtZXMuZXF1YWxzKHBhcmFtZXRlclR5cGVTaG9ydE5hbWVzKSl7CisJCQkJCWNsb3Nlc3RQYXJhbWV0ZXJUeXBlU2hvcnROYW1lcyA9IGNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXM7CisJCQkJCXBhcmFtZXRlclR5cGVTaG9ydE5hbWVzID0gcGFyYW1ldGVyVHlwZU5hbWVzOworCQkJCX0KIAkJCQl0aGlzLmhhbmRsZSgKIAkJCQkJSVByb2JsZW0uUGFyYW1ldGVyTWlzbWF0Y2gsCiAJCQkJCW5ldyBTdHJpbmdbXSB7CiAJCQkJCQluZXcgU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwKIAkJCQkJCW5ldyBTdHJpbmcocHJvYmxlbU1ldGhvZC5jbG9zZXN0TWF0Y2guc2VsZWN0b3IpLAotCQkJCQkJcGFyYW1ldGVyc0FzU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoKSwKLQkJCQkJCXBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJCQkJCWNsb3Nlc3RQYXJhbWV0ZXJUeXBlTmFtZXMsCisJCQkJCQlwYXJhbWV0ZXJUeXBlTmFtZXMgCisJCQkJCX0sCisJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQluZXcgU3RyaW5nKHByb2JsZW1NZXRob2QuY2xvc2VzdE1hdGNoLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJCQkJbmV3IFN0cmluZyhwcm9ibGVtTWV0aG9kLmNsb3Nlc3RNYXRjaC5zZWxlY3RvciksCisJCQkJCQljbG9zZXN0UGFyYW1ldGVyVHlwZVNob3J0TmFtZXMsCisJCQkJCQlwYXJhbWV0ZXJUeXBlU2hvcnROYW1lcworCQkJCQl9LAogCQkJCQkoaW50KSAobWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uID4+PiAzMiksCiAJCQkJCShpbnQpIG1lc3NhZ2VTZW5kLm5hbWVTb3VyY2VQb3NpdGlvbik7CiAJCQkJcmV0dXJuOwpAQCAtMTQ5MSwzMSArMTg1Myw1NyBAQAogCQluZXcgU3RyaW5nW10gewogCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAogCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCBwYXJhbWV0ZXJzQXNTdHJpbmcobWV0aG9kKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyc0FzU2hvcnRTdHJpbmcobWV0aG9kKX0sCiAJCShpbnQpIChtZXNzYWdlU2VuZC5uYW1lU291cmNlUG9zaXRpb24gPj4+IDMyKSwKIAkJKGludCkgbWVzc2FnZVNlbmQubmFtZVNvdXJjZVBvc2l0aW9uKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWROdWxsVG9TeW5jaHJvbml6ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZE51bGxUb1N5bmNocm9uaXplZCwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW52YWxpZE9wZXJhdG9yKEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgeworCVN0cmluZyBsZWZ0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpOworCVN0cmluZyByaWdodE5hbWUgPSBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIGxlZnRTaG9ydE5hbWUgPSBuZXcgU3RyaW5nKGxlZnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCVN0cmluZyByaWdodFNob3J0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCWlmIChsZWZ0U2hvcnROYW1lLmVxdWFscyhyaWdodFNob3J0TmFtZSkpeworCQlsZWZ0U2hvcnROYW1lID0gbGVmdE5hbWU7CisJCXJpZ2h0U2hvcnROYW1lID0gcmlnaHROYW1lOworCX0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZE9wZXJhdG9yLAogCQluZXcgU3RyaW5nW10gewogCQkJZXhwcmVzc2lvbi5vcGVyYXRvclRvU3RyaW5nKCksCi0JCQluZXcgU3RyaW5nKGxlZnRUeXBlLnJlYWRhYmxlTmFtZSgpKSArICIsICIgKyBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSl9LCAvLyROT04tTkxTLTEkCisJCQlsZWZ0TmFtZSArICIsICIgKyByaWdodE5hbWV9LCAvLyROT04tTkxTLTEkCisJCW5ldyBTdHJpbmdbXSB7CisJCQlleHByZXNzaW9uLm9wZXJhdG9yVG9TdHJpbmcoKSwKKwkJCWxlZnRTaG9ydE5hbWUgKyAiLCAiICsgcmlnaHRTaG9ydE5hbWV9LCAvLyROT04tTkxTLTEkCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRPcGVyYXRvcihDb21wb3VuZEFzc2lnbm1lbnQgYXNzaWduLCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CisJU3RyaW5nIGxlZnROYW1lID0gbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlTdHJpbmcgbGVmdFNob3J0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0U2hvcnROYW1lID0gbmV3IFN0cmluZyhyaWdodFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJaWYgKGxlZnRTaG9ydE5hbWUuZXF1YWxzKHJpZ2h0U2hvcnROYW1lKSl7CisJCWxlZnRTaG9ydE5hbWUgPSBsZWZ0TmFtZTsKKwkJcmlnaHRTaG9ydE5hbWUgPSByaWdodE5hbWU7CisJfQogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkT3BlcmF0b3IsCiAJCW5ldyBTdHJpbmdbXSB7CiAJCQlhc3NpZ24ub3BlcmF0b3JUb1N0cmluZygpLAotCQkJbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSkgKyAiLCAiICsgbmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpfSwgLy8kTk9OLU5MUy0xJAorCQkJbGVmdE5hbWUgKyAiLCAiICsgcmlnaHROYW1lfSwgLy8kTk9OLU5MUy0xJAorCQluZXcgU3RyaW5nW10geworCQkJYXNzaWduLm9wZXJhdG9yVG9TdHJpbmcoKSwKKwkJCWxlZnRTaG9ydE5hbWUgKyAiLCAiICsgcmlnaHRTaG9ydE5hbWV9LCAvLyROT04tTkxTLTEkCiAJCWFzc2lnbi5zb3VyY2VTdGFydCwKIAkJYXNzaWduLnNvdXJjZUVuZCk7CiB9CkBAIC0xNTIzLDkgKzE5MTEsMTggQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW52YWxpZE9wZXJhdG9yLAogCQluZXcgU3RyaW5nW10ge2V4cHJlc3Npb24ub3BlcmF0b3JUb1N0cmluZygpLCBuZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtleHByZXNzaW9uLm9wZXJhdG9yVG9TdHJpbmcoKSwgbmV3IFN0cmluZyh0eXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgaW52YWxpZFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKEFzdE5vZGUgcmVmZXJlbmNlKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLkludmFsaWRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKKwkJcmVmZXJlbmNlLnNvdXJjZVN0YXJ0LAorCQlyZWZlcmVuY2Uuc291cmNlRW5kKTsKK30KIHB1YmxpYyB2b2lkIGludmFsaWRTdXBlcmNsYXNzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIFR5cGVSZWZlcmVuY2Ugc3VwZXJjbGFzc1JlZiwgUmVmZXJlbmNlQmluZGluZyBleHBlY3RlZFR5cGUpIHsKIAlpbnQgcHJvYmxlbUlkID0gZXhwZWN0ZWRUeXBlLnByb2JsZW1JZCgpOwogCWludCBpZDsKQEAgLTE1NTMsNiArMTk1MCw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCWlkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCiAJCXN1cGVyY2xhc3NSZWYuc291cmNlU3RhcnQsCiAJCXN1cGVyY2xhc3NSZWYuc291cmNlRW5kKTsKIH0KQEAgLTE1ODMsNiArMTk4MSw3IEBACiAJCXRoaXMuaGFuZGxlKAogCQkJaWQsCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAorCQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAogCQkJc3VwZXJpbnRlcmZhY2VSZWYuc291cmNlU3RhcnQsCiAJCQlzdXBlcmludGVyZmFjZVJlZi5zb3VyY2VFbmQpOwogfQpAQCAtMTYxMywxMyArMjAxMiwxNSBAQAogCXRoaXMuaGFuZGxlKAogCQlmbGFnLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgaW52YWxpZFR5cGVSZWZlcmVuY2UoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludmFsaWRUeXBlRXhwcmVzc2lvbiwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQpAQCAtMTYyNywyMSArMjAyOCwyNSBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbnZhbGlkVHlwZVRvU3luY2hyb25pemVkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGludmFsaWRVbmFyeUV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLkludmFsaWRVbmFyeUV4cHJlc3Npb24sCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIGlzQ2xhc3NQYXRoQ29ycmVjdChjaGFyW11bXSB3ZWxsS25vd25UeXBlTmFtZSwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcFVuaXREZWNsKSB7CiAJcmVmZXJlbmNlQ29udGV4dCA9IGNvbXBVbml0RGVjbDsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcod2VsbEtub3duVHlwZU5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSXNDbGFzc1BhdGhDb3JyZWN0LAotCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcod2VsbEtub3duVHlwZU5hbWUpfSwgCisJCWFyZ3VtZW50cywgCisJCWFyZ3VtZW50cywKIAkJQWJvcnRDb21waWxhdGlvbiB8IEVycm9yLAogCQljb21wVW5pdERlY2wgPT0gbnVsbCA/IDAgOiBjb21wVW5pdERlY2wuc291cmNlU3RhcnQsCiAJCWNvbXBVbml0RGVjbCA9PSBudWxsID8gMSA6IGNvbXBVbml0RGVjbC5zb3VyY2VFbmQpOwpAQCAtMTY0OSw2MiArMjA1NCw3OSBAQAogcHVibGljIHZvaWQgbWFza2VkRXhjZXB0aW9uSGFuZGxlcihSZWZlcmVuY2VCaW5kaW5nIGV4Y2VwdGlvblR5cGUsIEFzdE5vZGUgbG9jYXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTWFza2VkQ2F0Y2gsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgbWV0aG9kTmVlZGluZ0Fic3RyYWN0TW9kaWZpZXIoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5NZXRob2RSZXF1aXJlc0JvZHksCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIG1ldGhvZE5lZWRpbmdOb0JvZHkoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewogCXRoaXMuaGFuZGxlKAogCQkoKG1ldGhvZERlY2wubW9kaWZpZXJzICYgQ29tcGlsZXJNb2RpZmllcnMuQWNjTmF0aXZlKSAhPSAwKSA/IElQcm9ibGVtLkJvZHlGb3JOYXRpdmVNZXRob2QgOiBJUHJvYmxlbS5Cb2R5Rm9yQWJzdHJhY3RNZXRob2QsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIG1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5NZXRob2RCdXRXaXRoQ29uc3RydWN0b3JOYW1lLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAogCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiB9Ci1wdWJsaWMgdm9pZCBtaXNzaW5nRW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgewotCWJvb2xlYW4gaW5zaWRlQ29uc3RydWN0b3JDYWxsID0KLQkJKGxvY2F0aW9uIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpCi0JCQkmJiAoKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbG9jYXRpb24pLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7Ci0KLQl0aGlzLmhhbmRsZSgKLQkJaW5zaWRlQ29uc3RydWN0b3JDYWxsCi0JCQk/IElQcm9ibGVtLk1pc3NpbmdFbmNsb3NpbmdJbnN0YW5jZUZvckNvbnN0cnVjdG9yQ2FsbAotCQkJOiBJUHJvYmxlbS5NaXNzaW5nRW5jbG9zaW5nSW5zdGFuY2UsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCi0JCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAotCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwotfQorLy9wdWJsaWMgdm9pZCBtaXNzaW5nRW5jbG9zaW5nSW5zdGFuY2VTcGVjaWZpY2F0aW9uKFJlZmVyZW5jZUJpbmRpbmcgZW5jbG9zaW5nVHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgeworLy8JYm9vbGVhbiBpbnNpZGVDb25zdHJ1Y3RvckNhbGwgPQorLy8JCShsb2NhdGlvbiBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKQorLy8JCQkmJiAoKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbG9jYXRpb24pLmFjY2Vzc01vZGUgPT0gRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuSW1wbGljaXRTdXBlcik7CisvLworLy8JdGhpcy5oYW5kbGUoCisvLwkJaW5zaWRlQ29uc3RydWN0b3JDYWxsCisvLwkJCT8gSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlRm9yQ29uc3RydWN0b3JDYWxsCisvLwkJCTogSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlLAorLy8JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhlbmNsb3NpbmdUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisvLwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGVuY2xvc2luZ1R5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorLy8JCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorLy8JCWxvY2F0aW9uLnNvdXJjZUVuZCk7CisvL30KIHB1YmxpYyB2b2lkIG1pc3NpbmdSZXR1cm5UeXBlKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5NaXNzaW5nUmV0dXJuVHlwZSwKLQkJbmV3IFN0cmluZ1swXSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgbWlzc2luZ1NlbWlDb2xvbihFeHByZXNzaW9uIGV4cHJlc3Npb24peworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5NaXNzaW5nU2VtaUNvbG9uLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAorCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAorCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCBtdXN0RGVmaW5lRGltZW5zaW9uc09ySW5pdGlhbGl6ZXIoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk11c3REZWZpbmVFaXRoZXJEaW1lbnNpb25FeHByZXNzaW9uc09ySW5pdGlhbGl6ZXIsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIG11c3RTcGVjaWZ5UGFja2FnZShDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wVW5pdERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY29tcFVuaXREZWNsLmdldEZpbGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTXVzdFNwZWNpZnlQYWNrYWdlLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY29tcFVuaXREZWNsLmdldEZpbGVOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWNvbXBVbml0RGVjbC5zb3VyY2VTdGFydCwKIAkJY29tcFVuaXREZWNsLnNvdXJjZVN0YXJ0ICsgMSk7CQogfQpAQCAtMTcxMiwxMyArMjEzNCwxNyBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5TdGF0aWNNZXRob2RSZXF1ZXN0ZWQsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksIHBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCBwYXJhbWV0ZXJzQXNTaG9ydFN0cmluZyhtZXRob2QpfSwKIAkJbWVzc2FnZVNlbmQuc291cmNlU3RhcnQsCiAJCW1lc3NhZ2VTZW5kLnNvdXJjZUVuZCk7CiB9CisKIHB1YmxpYyB2b2lkIG5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk5hdGl2ZU1ldGhvZHNDYW5ub3RCZVN0cmljdGZwLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpLCBuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCW1ldGhvZERlY2wuc291cmNlU3RhcnQsCiAJCW1ldGhvZERlY2wuc291cmNlRW5kKTsKIH0KQEAgLTE3MjksNiArMjE1NSw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk5lZWRUb0VtdWxhdGVGaWVsZFJlYWRBY2Nlc3MsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQubmFtZSl9LAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZmllbGQubmFtZSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KQEAgLTE3MzYsNiArMjE2Myw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk5lZWRUb0VtdWxhdGVGaWVsZFdyaXRlQWNjZXNzLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0xNzUwLDYgKzIxNzgsMTAgQEAKIAkJCQluZXcgU3RyaW5nKG1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAogCQkJCXBhcmFtZXRlcnNBc1N0cmluZyhtZXRob2QpCiAJCQkgfSwgCisJCQluZXcgU3RyaW5nW10geworCQkJCW5ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKKwkJCQlwYXJhbWV0ZXJzQXNTaG9ydFN0cmluZyhtZXRob2QpCisJCQkgfSwgCiAJCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwgCiAJCQlsb2NhdGlvbi5zb3VyY2VFbmQpOyAKIAllbHNlCkBAIC0xNzYwLDU5ICsyMTkyLDE0OSBAQAogCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgCiAJCQkJcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCkKIAkJCSB9LCAKKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIAorCQkJCW5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgCisJCQkJcGFyYW1ldGVyc0FzU2hvcnRTdHJpbmcobWV0aG9kKQorCQkJIH0sIAogCQkJbG9jYXRpb24uc291cmNlU3RhcnQsIAogCQkJbG9jYXRpb24uc291cmNlRW5kKTsgCiB9CiBwdWJsaWMgdm9pZCBuZXN0ZWRDbGFzc0Nhbm5vdERlY2xhcmVJbnRlcmZhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQ2Fubm90RGVmaW5lSW50ZXJmYWNlSW5Mb2NhbFR5cGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIG5vTW9yZUF2YWlsYWJsZVNwYWNlRm9yQXJndW1lbnQoTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWwsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117IG5ldyBTdHJpbmcobG9jYWwubmFtZSkgfTsKIAl0aGlzLmhhbmRsZSgKLQkJSVByb2JsZW0uVG9vTWFueUFyZ3VtZW50U2xvdHMsCi0JCW5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyhsb2NhbC5uYW1lKSB9LAorCQlsb2NhbCBpbnN0YW5jZW9mIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZworCQkJPyBJUHJvYmxlbS5Ub29NYW55U3ludGhldGljQXJndW1lbnRTbG90cworCQkJOiBJUHJvYmxlbS5Ub29NYW55QXJndW1lbnRTbG90cywKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCUFib3J0IHwgRXJyb3IsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgbm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JMb2NhbChMb2NhbFZhcmlhYmxlQmluZGluZyBsb2NhbCwgQXN0Tm9kZSBsb2NhdGlvbikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyhsb2NhbC5uYW1lKSB9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Ub29NYW55TG9jYWxWYXJpYWJsZVNsb3RzLAotCQluZXcgU3RyaW5nW117IG5ldyBTdHJpbmcobG9jYWwubmFtZSkgfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCUFib3J0IHwgRXJyb3IsCiAJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAogCQlsb2NhdGlvbi5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgbm9TdWNoRW5jbG9zaW5nSW5zdGFuY2UoVHlwZUJpbmRpbmcgdGFyZ2V0VHlwZSwgQXN0Tm9kZSBsb2NhdGlvbiwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yQ2FsbCkgeworCisJaW50IGlkOworCisJaWYgKGlzQ29uc3RydWN0b3JDYWxsKSB7CisJCS8vMjggPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gaXMgYXZhaWxhYmxlIGR1ZSB0byBzb21lIGludGVybWVkaWF0ZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCisJCWlkID0gSVByb2JsZW0uRW5jbG9zaW5nSW5zdGFuY2VJbkNvbnN0cnVjdG9yQ2FsbDsKKwl9IGVsc2UgaWYgKChsb2NhdGlvbiBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKQorCQkJCSYmICgoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIGxvY2F0aW9uKS5hY2Nlc3NNb2RlID09IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpIHsKKwkJLy8yMCA9IE5vIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0eXBlIHswfSBpcyBhY2Nlc3NpYmxlIHRvIGludm9rZSB0aGUgc3VwZXIgY29uc3RydWN0b3IuIE11c3QgZGVmaW5lIGEgY29uc3RydWN0b3IgYW5kIGV4cGxpY2l0bHkgcXVhbGlmeSBpdHMgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiB3aXRoIGFuIGluc3RhbmNlIG9mIHswfSAoZS5nLiB4LnN1cGVyKCkgd2hlcmUgeCBpcyBhbiBpbnN0YW5jZSBvZiB7MH0pLgorCQlpZCA9IElQcm9ibGVtLk1pc3NpbmdFbmNsb3NpbmdJbnN0YW5jZUZvckNvbnN0cnVjdG9yQ2FsbDsKKwl9IGVsc2UgaWYgKGxvY2F0aW9uIGluc3RhbmNlb2YgQWxsb2NhdGlvbkV4cHJlc3Npb24gCisJCQkJJiYgKCgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGxvY2F0aW9uKS5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlzTWVtYmVyVHlwZSgpCisJCQkJCXx8ICgoKEFsbG9jYXRpb25FeHByZXNzaW9uKSBsb2NhdGlvbikuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pc0Fub255bW91c1R5cGUoKSAKKwkJCQkJCSYmICgoQWxsb2NhdGlvbkV4cHJlc3Npb24pIGxvY2F0aW9uKS5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnN1cGVyY2xhc3MoKS5pc01lbWJlclR5cGUoKSkpKSB7CisJCS8vMjEgPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZS4gTXVzdCBxdWFsaWZ5IHRoZSBhbGxvY2F0aW9uIHdpdGggYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IChlLmcuIHgubmV3IEEoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCisJCWlkID0gSVByb2JsZW0uTWlzc2luZ0VuY2xvc2luZ0luc3RhbmNlOworCX0gZWxzZSB7IC8vIGRlZmF1bHQKKwkJLy8yMiA9IE5vIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0aGUgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZSBpbiBzY29wZQorCQlpZCA9IElQcm9ibGVtLkluY29ycmVjdEVuY2xvc2luZ0luc3RhbmNlUmVmZXJlbmNlOworCX0KKworCXRoaXMuaGFuZGxlKAorCQlpZCwKKwkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyh0YXJnZXRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sIAorCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKHRhcmdldFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LCAKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsIAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOyAKK30KIHB1YmxpYyB2b2lkIG5vdENvbXBhdGlibGVUeXBlc0Vycm9yKEVxdWFsRXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CisJU3RyaW5nIGxlZnROYW1lID0gbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlTdHJpbmcgbGVmdFNob3J0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0U2hvcnROYW1lID0gbmV3IFN0cmluZyhyaWdodFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJaWYgKGxlZnRTaG9ydE5hbWUuZXF1YWxzKHJpZ2h0U2hvcnROYW1lKSl7CisJCWxlZnRTaG9ydE5hbWUgPSBsZWZ0TmFtZTsKKwkJcmlnaHRTaG9ydE5hbWUgPSByaWdodE5hbWU7CisJfQogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbmNvbXBhdGlibGVUeXBlc0luRXF1YWxpdHlPcGVyYXRvciwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxlZnRUeXBlLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhyaWdodFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtsZWZ0TmFtZSwgcmlnaHROYW1lIH0sCisJCW5ldyBTdHJpbmdbXSB7bGVmdFNob3J0TmFtZSwgcmlnaHRTaG9ydE5hbWUgfSwKIAkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwKIAkJZXhwcmVzc2lvbi5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgbm90Q29tcGF0aWJsZVR5cGVzRXJyb3IoSW5zdGFuY2VPZkV4cHJlc3Npb24gZXhwcmVzc2lvbiwgVHlwZUJpbmRpbmcgbGVmdFR5cGUsIFR5cGVCaW5kaW5nIHJpZ2h0VHlwZSkgeworCVN0cmluZyBsZWZ0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpOworCVN0cmluZyByaWdodE5hbWUgPSBuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIGxlZnRTaG9ydE5hbWUgPSBuZXcgU3RyaW5nKGxlZnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCVN0cmluZyByaWdodFNob3J0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCWlmIChsZWZ0U2hvcnROYW1lLmVxdWFscyhyaWdodFNob3J0TmFtZSkpeworCQlsZWZ0U2hvcnROYW1lID0gbGVmdE5hbWU7CisJCXJpZ2h0U2hvcnROYW1lID0gcmlnaHROYW1lOworCX0KIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSW5jb21wYXRpYmxlVHlwZXNJbkNvbmRpdGlvbmFsT3BlcmF0b3IsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bGVmdE5hbWUsIHJpZ2h0TmFtZSB9LAorCQluZXcgU3RyaW5nW10ge2xlZnRTaG9ydE5hbWUsIHJpZ2h0U2hvcnROYW1lIH0sCiAJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCiAJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKIH0KK3B1YmxpYyB2b2lkIG9iamVjdENhbm5vdEhhdmVTdXBlclR5cGVzKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUpIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uT2JqZWN0Q2Fubm90SGF2ZVN1cGVyVHlwZXMsCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCisJCXR5cGUuc291cmNlU3RhcnQoKSwKKwkJdHlwZS5zb3VyY2VFbmQoKSk7Cit9CiBwdWJsaWMgdm9pZCBvcGVyYXRvck9ubHlWYWxpZE9uTnVtZXJpY1R5cGUoQ29tcG91bmRBc3NpZ25tZW50ICBhc3NpZ25tZW50LCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CisJU3RyaW5nIGxlZnROYW1lID0gbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlTdHJpbmcgbGVmdFNob3J0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0U2hvcnROYW1lID0gbmV3IFN0cmluZyhyaWdodFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJaWYgKGxlZnRTaG9ydE5hbWUuZXF1YWxzKHJpZ2h0U2hvcnROYW1lKSl7CisJCWxlZnRTaG9ydE5hbWUgPSBsZWZ0TmFtZTsKKwkJcmlnaHRTaG9ydE5hbWUgPSByaWdodE5hbWU7CisJfQogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5UeXBlTWlzbWF0Y2gsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bGVmdE5hbWUsIHJpZ2h0TmFtZSB9LAorCQluZXcgU3RyaW5nW10ge2xlZnRTaG9ydE5hbWUsIHJpZ2h0U2hvcnROYW1lIH0sCiAJCWFzc2lnbm1lbnQuc291cmNlU3RhcnQsCiAJCWFzc2lnbm1lbnQuc291cmNlRW5kKTsKIH0KLXB1YmxpYyB2b2lkIG92ZXJyaWRlc0RlcHJlY2F0ZWRNZXRob2QoTWV0aG9kQmluZGluZyBjdXJyZW50TWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgeworcHVibGljIHZvaWQgb3ZlcnJpZGVzRGVwcmVjYXRlZE1ldGhvZChNZXRob2RCaW5kaW5nIGxvY2FsTWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAotCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCi0JCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOworCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlsb2NhbE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSwKKwkJCQkJCWxvY2FsTWV0aG9kLnJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSksCisJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZygKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQlsb2NhbE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQkJbG9jYWxNZXRob2Quc2hvcnRSZWFkYWJsZU5hbWUoKSwKKwkJCQkJCScuJykpLAorCQkJbmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQlsb2NhbE1ldGhvZC5zb3VyY2VTdGFydCgpLAorCQlsb2NhbE1ldGhvZC5zb3VyY2VFbmQoKSk7CiB9CiBwdWJsaWMgdm9pZCBvdmVycmlkZXNQYWNrYWdlRGVmYXVsdE1ldGhvZChNZXRob2RCaW5kaW5nIGxvY2FsTWV0aG9kLCBNZXRob2RCaW5kaW5nIGluaGVyaXRlZE1ldGhvZCkgewogCXRoaXMuaGFuZGxlKApAQCAtMTgyNCwyMCArMjM0NiwzMSBAQAogCQkJCQkJbG9jYWxNZXRob2QucmVhZGFibGVOYW1lKCksCiAJCQkJCQknLicpKSwKIAkJCW5ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKAorCQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKKwkJCQkJCWxvY2FsTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCksCisJCQkJCQlsb2NhbE1ldGhvZC5zaG9ydFJlYWRhYmxlTmFtZSgpLAorCQkJCQkJJy4nKSksCisJCQluZXcgU3RyaW5nKGluaGVyaXRlZE1ldGhvZC5kZWNsYXJpbmdDbGFzcy5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCWxvY2FsTWV0aG9kLnNvdXJjZVN0YXJ0KCksCiAJCWxvY2FsTWV0aG9kLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIHBhY2thZ2VDb2xsaWRlc1dpdGhUeXBlKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBVbml0RGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7Q2hhck9wZXJhdGlvbi50b1N0cmluZyhjb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2UudG9rZW5zKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlBhY2thZ2VDb2xsaWRlc1dpdGhUeXBlLAotCQluZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcFVuaXREZWNsLmN1cnJlbnRQYWNrYWdlLnRva2Vucyl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJY29tcFVuaXREZWNsLmN1cnJlbnRQYWNrYWdlLnNvdXJjZVN0YXJ0LAogCQljb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2Uuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHBhY2thZ2VJc05vdEV4cGVjdGVkUGFja2FnZShDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wVW5pdERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge0NoYXJPcGVyYXRpb24udG9TdHJpbmcoY29tcFVuaXREZWNsLmNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlTmFtZSgpKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlBhY2thZ2VJc05vdEV4cGVjdGVkUGFja2FnZSwKLQkJbmV3IFN0cmluZ1tdIHtDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGNvbXBVbml0RGVjbC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJY29tcFVuaXREZWNsLmN1cnJlbnRQYWNrYWdlID09IG51bGwgPyAwIDogY29tcFVuaXREZWNsLmN1cnJlbnRQYWNrYWdlLnNvdXJjZVN0YXJ0LAogCQljb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2UgPT0gbnVsbCA/IDAgOiBjb21wVW5pdERlY2wuY3VycmVudFBhY2thZ2Uuc291cmNlRW5kKTsKIH0KQEAgLTE4NTEsNiArMjM4NCwxNiBAQAogCX0KIAlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiB9Citwcml2YXRlIFN0cmluZyBwYXJhbWV0ZXJzQXNTaG9ydFN0cmluZyhNZXRob2RCaW5kaW5nIG1ldGhvZCkgeworCVR5cGVCaW5kaW5nW10gcGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnM7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChpICE9IDApCisJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhwYXJhbXNbaV0uc2hvcnRSZWFkYWJsZU5hbWUoKSkpOworCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CiBwdWJsaWMgdm9pZCBwYXJzZUVycm9yKAogCWludCBzdGFydFBvc2l0aW9uLCAKIAlpbnQgZW5kUG9zaXRpb24sIApAQCAtMTg2MCwxNyArMjQwMywyMSBAQAogCQkKIAlpZiAocG9zc2libGVUb2tlbnMubGVuZ3RoID09IDApIHsgLy9ubyBzdWdnZXN0aW9uIGF2YWlsYWJsZQogCQlpZiAoaXNLZXl3b3JkKGN1cnJlbnRUb2tlblNvdXJjZSkpIHsKKwkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjdXJyZW50VG9rZW5Tb3VyY2UpfTsKIAkJCXRoaXMuaGFuZGxlKAogCQkJCUlQcm9ibGVtLlBhcnNpbmdFcnJvck9uS2V5d29yZE5vU3VnZ2VzdGlvbiwKLQkJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKX0sCisJCQkJYXJndW1lbnRzLAorCQkJCWFyZ3VtZW50cywKIAkJCQkvLyB0aGlzIGlzIHRoZSBjdXJyZW50IC1pbnZhbGlkLSB0b2tlbiBwb3NpdGlvbgogCQkJCXN0YXJ0UG9zaXRpb24sCiAJCQkJZW5kUG9zaXRpb24pOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgeworCQkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtlcnJvclRva2VuTmFtZX07CiAJCQl0aGlzLmhhbmRsZSgKIAkJCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24sCi0JCQkJbmV3IFN0cmluZ1tdIHtlcnJvclRva2VuTmFtZX0sCisJCQkJYXJndW1lbnRzLAorCQkJCWFyZ3VtZW50cywKIAkJCQkvLyB0aGlzIGlzIHRoZSBjdXJyZW50IC1pbnZhbGlkLSB0b2tlbiBwb3NpdGlvbgogCQkJCXN0YXJ0UG9zaXRpb24sCiAJCQkJZW5kUG9zaXRpb24pOwpAQCAtMTg4OSw5ICsyNDM2LDExIEBACiAJfQogCiAJaWYgKGlzS2V5d29yZChjdXJyZW50VG9rZW5Tb3VyY2UpKSB7CisJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjdXJyZW50VG9rZW5Tb3VyY2UpLCBsaXN0LnRvU3RyaW5nKCl9OwogCQl0aGlzLmhhbmRsZSgKIAkJCUlQcm9ibGVtLlBhcnNpbmdFcnJvck9uS2V5d29yZCwKLQkJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhjdXJyZW50VG9rZW5Tb3VyY2UpLCBsaXN0LnRvU3RyaW5nKCl9LAorCQkJYXJndW1lbnRzLAorCQkJYXJndW1lbnRzLAogCQkJLy8gdGhpcyBpcyB0aGUgY3VycmVudCAtaW52YWxpZC0gdG9rZW4gcG9zaXRpb24KIAkJCXN0YXJ0UG9zaXRpb24sCiAJCQllbmRQb3NpdGlvbik7CkBAIC0xOTA4LDc4ICsyNDU3LDU3IEBACiAJCQllcnJvclRva2VuTmFtZSA9IG5ldyBTdHJpbmcoY3VycmVudFRva2VuU291cmNlKTsKIAl9CiAKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge2Vycm9yVG9rZW5OYW1lLCBsaXN0LnRvU3RyaW5nKCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5QYXJzaW5nRXJyb3IsCi0JCW5ldyBTdHJpbmdbXSB7ZXJyb3JUb2tlbk5hbWUsIGxpc3QudG9TdHJpbmcoKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQkvLyB0aGlzIGlzIHRoZSBjdXJyZW50IC1pbnZhbGlkLSB0b2tlbiBwb3NpdGlvbgogCQlzdGFydFBvc2l0aW9uLAogCQllbmRQb3NpdGlvbik7CiB9CiBwdWJsaWMgdm9pZCBwdWJsaWNDbGFzc011c3RNYXRjaEZpbGVOYW1lKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBVbml0RGVjbCwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CiAJdGhpcy5yZWZlcmVuY2VDb250ZXh0ID0gdHlwZURlY2w7IC8vIHJlcG9ydCB0aGUgcHJvYmxlbSBhZ2FpbnN0IHRoZSB0eXBlIG5vdCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY29tcFVuaXREZWNsLmdldEZpbGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uUHVibGljQ2xhc3NNdXN0TWF0Y2hGaWxlTmFtZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kLAogCQljb21wVW5pdERlY2wuY29tcGlsYXRpb25SZXN1bHQpOwogfQotLyoKLSAqIEZsYWcgYWxsIGNvbnN0cnVjdG9ycyBpbnZvbHZlZCBpbiBhIGN5Y2xlLCB3ZSBrbm93IHdlIGhhdmUgYSBjeWNsZS4KLSAqLwotcHVibGljIHZvaWQgcmVjdXJzaXZlQ29uc3RydWN0b3JJbnZvY2F0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKK3B1YmxpYyB2b2lkIHJlY3Vyc2l2ZUNvbnN0cnVjdG9ySW52b2NhdGlvbihFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBjb25zdHJ1Y3RvckNhbGwpIHsKIAotCS8vIHByb3BhZ2F0ZSB0aGUgcmVmZXJlbmNlIGNvdW50LCBuZWdhdGl2ZSBjb3VudHMgbWVhbnMgbGVhZGluZyB0byBhIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpCi0JYm9vbGVhbiBoYXNDaGFuZ2VkOwotCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7Ci0JaW50IG1heCA9IG1ldGhvZHMubGVuZ3RoOwotCWRvIHsKLQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspewotCQkJaWYgKG1ldGhvZHNbaV0uaXNDb25zdHJ1Y3RvcigpKXsKLQkJCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZHNbaV07Ci0JCQkJaWYgKGNvbnN0cnVjdG9yLnJlZmVyZW5jZUNvdW50ID4gMCl7Ci0JCQkJCUNvbnN0cnVjdG9yRGVjbGFyYXRpb24gdGFyZ2V0Q29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwgPT0gbnVsbAotCQkJCQkJPyBudWxsCi0JCQkJCQk6IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSh0eXBlRGVjbGFyYXRpb24uZGVjbGFyYXRpb25PZihjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZykpOwotCQkJCQlpZiAoKHRhcmdldENvbnN0cnVjdG9yID09IG51bGwpIHx8ICh0YXJnZXRDb25zdHJ1Y3Rvci5yZWZlcmVuY2VDb3VudCA8IDApKXsKLQkJCQkJCWhhc0NoYW5nZWQgPSB0cnVlOwotCQkJCQkJY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPSAtMTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChoYXNDaGFuZ2VkKTsKLQotCS8vIGFsbCByZW1haW5pbmcgY29uc3RydWN0b3JzIHdpdGggYSBwb3NpdGl2ZSBjb3VudCBhcmUgc3RpbGwgaW52b2x2ZWQgaW4gYSBjeWNsZQotCWZvcihpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKyl7Ci0JCWlmIChtZXRob2RzW2ldLmlzQ29uc3RydWN0b3IoKSl7Ci0JCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZHNbaV07Ci0JCQlpZiAoY29uc3RydWN0b3IucmVmZXJlbmNlQ291bnQgPiAwKXsKLQkJCQl0aGlzLnJlZmVyZW5jZUNvbnRleHQgPSBjb25zdHJ1Y3RvcjsKLQkJCQl0aGlzLmhhbmRsZSgKLQkJCQkJSVByb2JsZW0uUmVjdXJzaXZlQ29uc3RydWN0b3JJbnZvY2F0aW9uLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJbmV3IFN0cmluZyhjb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuYmluZGluZy5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksIAotCQkJCQkJcGFyYW1ldGVyc0FzU3RyaW5nKGNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKQotCQkJCQl9LAotCQkJCQljb25zdHJ1Y3Rvci5jb25zdHJ1Y3RvckNhbGwuc291cmNlU3RhcnQsCi0JCQkJCWNvbnN0cnVjdG9yLmNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQpOwotCQkJfQotCQl9Ci0JfQorCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5SZWN1cnNpdmVDb25zdHJ1Y3Rvckludm9jYXRpb24sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgCisJCQlwYXJhbWV0ZXJzQXNTdHJpbmcoY29uc3RydWN0b3JDYWxsLmJpbmRpbmcpCisJCX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCAKKwkJCXBhcmFtZXRlcnNBc1Nob3J0U3RyaW5nKGNvbnN0cnVjdG9yQ2FsbC5iaW5kaW5nKQorCQl9LAorCQljb25zdHJ1Y3RvckNhbGwuc291cmNlU3RhcnQsCisJCWNvbnN0cnVjdG9yQ2FsbC5zb3VyY2VFbmQpOwogfQorCiBwdWJsaWMgdm9pZCByZWRlZmluZUFyZ3VtZW50KEFyZ3VtZW50IGFyZykgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhhcmcubmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5SZWRlZmluZWRBcmd1bWVudCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGFyZy5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlhcmcuc291cmNlU3RhcnQsCiAJCWFyZy5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgcmVkZWZpbmVMb2NhbChMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbCkgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhsb2NhbERlY2wubmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5SZWRlZmluZWRMb2NhbCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGxvY2FsRGVjbC5uYW1lKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCiAJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOwogfQpAQCAtMTk4NywxMyArMjUxNSwxNiBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5BcnJheVJlZmVyZW5jZVJlcXVpcmVkLAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYXJyYXlUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhhcnJheVR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlhcnJheVJlZi5zb3VyY2VTdGFydCwKIAkJYXJyYXlSZWYuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHJldHVyblR5cGVDYW5ub3RCZVZvaWRBcnJheShTb3VyY2VUeXBlQmluZGluZyB0eXBlLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uUmV0dXJuVHlwZUNhbm5vdEJlVm9pZEFycmF5LAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kRGVjbC5zZWxlY3Rvcil9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOwogfQpAQCAtMjAyNCw2ICsyNTU1LDcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJaWQsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKSwgbmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKG1ldGhvZERlY2wuc2VsZWN0b3IpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCW1ldGhvZERlY2wucmV0dXJuVHlwZS5zb3VyY2VTdGFydCwKIAkJbWV0aG9kRGVjbC5yZXR1cm5UeXBlLnNvdXJjZUVuZCk7CiB9CkBAIC0yMDczLDExICsyNjA1LDEzIEBACiAJCQkJCQkJCQkJaWYgKGVycm9yVG9rZW5OYW1lLmVxdWFscyhTY2FubmVyLklOVkFMSURfQ0hBUl9JTl9TVFJJTkcpKQogCQkJCQkJCQkJCQlmbGFnID0gSVByb2JsZW0uVW50ZXJtaW5hdGVkU3RyaW5nOwogCisJU3RyaW5nW10gYXJndW1lbnRzID0gZmxhZyA9PSBJUHJvYmxlbS5QYXJzaW5nRXJyb3JOb1N1Z2dlc3Rpb24gCisJCQk/IG5ldyBTdHJpbmdbXSB7ZXJyb3JUb2tlbk5hbWV9CisJCQk6IE5vQXJndW1lbnQ7CiAJdGhpcy5oYW5kbGUoCiAJCWZsYWcsIAotCQlmbGFnID09IElQcm9ibGVtLlBhcnNpbmdFcnJvck5vU3VnZ2VzdGlvbiAKLQkJCT8gbmV3IFN0cmluZ1tdIHtlcnJvclRva2VuTmFtZX0KLQkJCTogbmV3IFN0cmluZ1swXSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCS8vIHRoaXMgaXMgdGhlIGN1cnJlbnQgLWludmFsaWQtIHRva2VuIHBvc2l0aW9uCiAJCXN0YXJ0UG9zLCAKIAkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxLApAQCAtMjA4NywxMyArMjYyMSwxNSBAQAogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5TaG91bGRSZXR1cm5WYWx1ZSwKIAkJbmV3IFN0cmluZ1tdIHsgbmV3IFN0cmluZyAocmV0dXJuVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nIChyZXR1cm5UeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBzaWduYWxOb0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbkZvckNoYXJBcnJheUV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLk5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uRm9yQ2hhckFycmF5RXhwcmVzc2lvbiwKLQkJbmV3IFN0cmluZ1tdIHt9LAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CkBAIC0yMTA0LDYgKzI2NDAsNyBAQAogCQkJLy8gOC40LjYuNCAtIElmIGEgY2xhc3MgaW5oZXJpdHMgbW9yZSB0aGFuIG9uZSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYSBzdGF0aWMgKG5vbi1hYnN0cmFjdCkgbWV0aG9kIGNhbm5vdCBoaWRlIGFuIGluc3RhbmNlIG1ldGhvZC4KIAkJCUlQcm9ibGVtLkNhbm5vdEhpZGVBbkluc3RhbmNlTWV0aG9kV2l0aEFTdGF0aWNNZXRob2QsCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogCWVsc2UKQEAgLTIxMTIsMjcgKzI2NDksMzQgQEAKIAkJCS8vIDguNC42LjQgLSBJZiBhIGNsYXNzIGluaGVyaXRzIG1vcmUgdGhhbiBvbmUgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFuIGluc3RhbmNlIChub24tYWJzdHJhY3QpIG1ldGhvZCBjYW5ub3Qgb3ZlcnJpZGUgYSBzdGF0aWMgbWV0aG9kLgogCQkJSVByb2JsZW0uQ2Fubm90T3ZlcnJpZGVBU3RhdGljTWV0aG9kV2l0aEFuSW5zdGFuY2VNZXRob2QsCiAJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlU3RhcnQoKSwKIAkJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQogcHVibGljIHZvaWQgc3RhdGljRmllbGRBY2Nlc3NUb05vblN0YXRpY1ZhcmlhYmxlKEZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTm9uU3RhdGljRmllbGRGcm9tU3RhdGljSW52b2NhdGlvbiwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlmaWVsZFJlZi5zb3VyY2VTdGFydCwKIAkJZmllbGRSZWYuc291cmNlRW5kKTsgCiB9CiBwdWJsaWMgdm9pZCBzdGF0aWNGaWVsZEFjY2Vzc1RvTm9uU3RhdGljVmFyaWFibGUoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSBuYW1lUmVmLCBGaWVsZEJpbmRpbmcgZmllbGQpeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhmaWVsZC5yZWFkYWJsZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Ob25TdGF0aWNGaWVsZEZyb21TdGF0aWNJbnZvY2F0aW9uLAotCQluZXcgU3RyaW5nW10geyBuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQluYW1lUmVmLnNvdXJjZVN0YXJ0LAogCQluYW1lUmVmLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCBzdGF0aWNGaWVsZEFjY2Vzc1RvTm9uU3RhdGljVmFyaWFibGUoU2luZ2xlTmFtZVJlZmVyZW5jZSBuYW1lUmVmLCBGaWVsZEJpbmRpbmcgZmllbGQpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTm9uU3RhdGljRmllbGRGcm9tU3RhdGljSW52b2NhdGlvbiwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLnJlYWRhYmxlTmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQluYW1lUmVmLnNvdXJjZVN0YXJ0LAogCQluYW1lUmVmLnNvdXJjZUVuZCk7CiB9CkBAIC0yMTQ0LDEzICsyNjg4LDE3IEBACiAJCW5ldyBTdHJpbmdbXSB7CiAJCQluZXcgU3RyaW5nKGNvbmNyZXRlTWV0aG9kLnJlYWRhYmxlTmFtZSgpKSwKIAkJCW5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2RzWzBdLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGNvbmNyZXRlTWV0aG9kLnJlYWRhYmxlTmFtZSgpKSwKKwkJCW5ldyBTdHJpbmcoYWJzdHJhY3RNZXRob2RzWzBdLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKIAkJdHlwZS5zb3VyY2VTdGFydCgpLAogCQl0eXBlLnNvdXJjZUVuZCgpKTsKIH0KIHB1YmxpYyB2b2lkIHN0cmluZ0NvbnN0YW50SXNFeGNlZWRpbmdVdGY4TGltaXQoQXN0Tm9kZSBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5TdHJpbmdDb25zdGFudElzRXhjZWVkaW5nVXRmOExpbWl0LAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KQEAgLTIxNTgsNiArMjcwNiw3IEBACiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlN1cGVyY2xhc3NNdXN0QmVBQ2xhc3MsCiAJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzdXBlclR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhzdXBlclR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKIAkJc3VwZXJjbGFzc1JlZi5zb3VyY2VTdGFydCwKIAkJc3VwZXJjbGFzc1JlZi5zb3VyY2VFbmQpOwogfQpAQCAtMjE2NSw1NyArMjcxNCwxMjcgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uU3VwZXJJbnRlcmZhY2VNdXN0QmVBbkludGVyZmFjZSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHN1cGVyVHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcodHlwZS5zb3VyY2VOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHN1cGVyVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlLnNvdXJjZU5hbWUoKSl9LAogCQl0eXBlRGVjbC5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2wuc291cmNlRW5kKTsKIH0KK3B1YmxpYyB2b2lkIHRhc2soU3RyaW5nIHRhZywgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwcmlvcml0eSwgaW50IHN0YXJ0LCBpbnQgZW5kKXsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVGFzaywKKwkJbmV3IFN0cmluZ1tdIHsgdGFnLCBtZXNzYWdlLCBwcmlvcml0eS8qc2VjcmV0IGFyZ3VtZW50IHRoYXQgaXMgbm90IHN1cmZhY2VkIGluIGdldE1lc3NhZ2UoKSovfSwKKwkJbmV3IFN0cmluZ1tdIHsgdGFnLCBtZXNzYWdlLCBwcmlvcml0eS8qc2VjcmV0IGFyZ3VtZW50IHRoYXQgaXMgbm90IHN1cmZhY2VkIGluIGdldE1lc3NhZ2UoKSovfSwgCisJCXN0YXJ0LAorCQllbmQpOworfQorcHVibGljIHZvaWQgdG9vTWFueURpbWVuc2lvbnMoQXN0Tm9kZSBleHByZXNzaW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlRvb01hbnlBcnJheURpbWVuc2lvbnMsCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCisJCWV4cHJlc3Npb24uc291cmNlU3RhcnQsCisJCWV4cHJlc3Npb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHRvb01hbnlGaWVsZHMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Ub29NYW55RmllbGRzLAorCQluZXcgU3RyaW5nW117IG5ldyBTdHJpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJQWJvcnQgfCBFcnJvciwKKwkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQl0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHRvb01hbnlNZXRob2RzKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwl0aGlzLmhhbmRsZSgKKwkJSVByb2JsZW0uVG9vTWFueU1ldGhvZHMsCisJCW5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24uYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW117IG5ldyBTdHJpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAorCQlBYm9ydCB8IEVycm9yLAorCQl0eXBlRGVjbGFyYXRpb24uc291cmNlU3RhcnQsCisJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VFbmQpOworfQogcHVibGljIHZvaWQgdHlwZUNhc3RFcnJvcihDYXN0RXhwcmVzc2lvbiBleHByZXNzaW9uLCBUeXBlQmluZGluZyBsZWZ0VHlwZSwgVHlwZUJpbmRpbmcgcmlnaHRUeXBlKSB7CisJU3RyaW5nIGxlZnROYW1lID0gbmV3IFN0cmluZyhsZWZ0VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0TmFtZSA9IG5ldyBTdHJpbmcocmlnaHRUeXBlLnJlYWRhYmxlTmFtZSgpKTsKKwlTdHJpbmcgbGVmdFNob3J0TmFtZSA9IG5ldyBTdHJpbmcobGVmdFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIHJpZ2h0U2hvcnROYW1lID0gbmV3IFN0cmluZyhyaWdodFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSk7CisJaWYgKGxlZnRTaG9ydE5hbWUuZXF1YWxzKHJpZ2h0U2hvcnROYW1lKSl7CisJCWxlZnRTaG9ydE5hbWUgPSBsZWZ0TmFtZTsKKwkJcmlnaHRTaG9ydE5hbWUgPSByaWdodE5hbWU7CisJfQogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5JbGxlZ2FsQ2FzdCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHJpZ2h0VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobGVmdFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHsgcmlnaHROYW1lLCBsZWZ0TmFtZSB9LAorCQluZXcgU3RyaW5nW10geyByaWdodFNob3J0TmFtZSwgbGVmdFNob3J0TmFtZSB9LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB0eXBlQ29sbGlkZXNXaXRoUGFja2FnZShDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wVW5pdERlY2wsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgewogCXRoaXMucmVmZXJlbmNlQ29udGV4dCA9IHR5cGVEZWNsOyAvLyByZXBvcnQgdGhlIHByb2JsZW0gYWdhaW5zdCB0aGUgdHlwZSBub3QgdGhlIGVudGlyZSBjb21waWxhdGlvbiB1bml0CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbXBVbml0RGVjbC5nZXRGaWxlTmFtZSgpKSwgbmV3IFN0cmluZyh0eXBlRGVjbC5uYW1lKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlR5cGVDb2xsaWRlc1dpdGhQYWNrYWdlLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoY29tcFVuaXREZWNsLmdldEZpbGVOYW1lKCkpLCBuZXcgU3RyaW5nKHR5cGVEZWNsLm5hbWUpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXR5cGVEZWNsLnNvdXJjZVN0YXJ0LAogCQl0eXBlRGVjbC5zb3VyY2VFbmQsCiAJCWNvbXBVbml0RGVjbC5jb21waWxhdGlvblJlc3VsdCk7CiB9CiBwdWJsaWMgdm9pZCB0eXBlTWlzbWF0Y2hFcnJvcihUeXBlQmluZGluZyByZXN1bHRUeXBlLCBUeXBlQmluZGluZyBleHBlY3RlZFR5cGUsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwlTdHJpbmcgcmVzdWx0VHlwZU5hbWUgPSBuZXcgU3RyaW5nKHJlc3VsdFR5cGUucmVhZGFibGVOYW1lKCkpOworCVN0cmluZyBleHBlY3RlZFR5cGVOYW1lID0gbmV3IFN0cmluZyhleHBlY3RlZFR5cGUucmVhZGFibGVOYW1lKCkpOworCVN0cmluZyByZXN1bHRUeXBlU2hvcnROYW1lID0gbmV3IFN0cmluZyhyZXN1bHRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCVN0cmluZyBleHBlY3RlZFR5cGVTaG9ydE5hbWUgPSBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKTsKKwlpZiAocmVzdWx0VHlwZVNob3J0TmFtZS5lcXVhbHMoZXhwZWN0ZWRUeXBlU2hvcnROYW1lKSl7CisJCXJlc3VsdFR5cGVTaG9ydE5hbWUgPSByZXN1bHRUeXBlTmFtZTsKKwkJZXhwZWN0ZWRUeXBlU2hvcnROYW1lID0gZXhwZWN0ZWRUeXBlTmFtZTsKKwl9CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlR5cGVNaXNtYXRjaCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHJlc3VsdFR5cGUucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSl9LAorCQluZXcgU3RyaW5nW10ge3Jlc3VsdFR5cGVOYW1lLCBleHBlY3RlZFR5cGVOYW1lfSwKKwkJbmV3IFN0cmluZ1tdIHtyZXN1bHRUeXBlU2hvcnROYW1lLCBleHBlY3RlZFR5cGVTaG9ydE5hbWV9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHR5cGVNaXNtYXRjaEVycm9yQWN0dWFsVHlwZUV4cGVjdGVkVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFR5cGVCaW5kaW5nIGNvbnN0YW50VHlwZSwgVHlwZUJpbmRpbmcgZXhwZWN0ZWRUeXBlKSB7CisJU3RyaW5nIGNvbnN0YW50VHlwZU5hbWUgPSBuZXcgU3RyaW5nKGNvbnN0YW50VHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIGV4cGVjdGVkVHlwZU5hbWUgPSBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5yZWFkYWJsZU5hbWUoKSk7CisJU3RyaW5nIGNvbnN0YW50VHlwZVNob3J0TmFtZSA9IG5ldyBTdHJpbmcoY29uc3RhbnRUeXBlLnNob3J0UmVhZGFibGVOYW1lKCkpOworCVN0cmluZyBleHBlY3RlZFR5cGVTaG9ydE5hbWUgPSBuZXcgU3RyaW5nKGV4cGVjdGVkVHlwZS5zaG9ydFJlYWRhYmxlTmFtZSgpKTsKKwlpZiAoY29uc3RhbnRUeXBlU2hvcnROYW1lLmVxdWFscyhleHBlY3RlZFR5cGVTaG9ydE5hbWUpKXsKKwkJY29uc3RhbnRUeXBlU2hvcnROYW1lID0gY29uc3RhbnRUeXBlTmFtZTsKKwkJZXhwZWN0ZWRUeXBlU2hvcnROYW1lID0gZXhwZWN0ZWRUeXBlTmFtZTsKKwl9CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlR5cGVNaXNtYXRjaCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGNvbnN0YW50VHlwZS5yZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcoZXhwZWN0ZWRUeXBlLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7Y29uc3RhbnRUeXBlTmFtZSwgZXhwZWN0ZWRUeXBlTmFtZX0sCisJCW5ldyBTdHJpbmdbXSB7Y29uc3RhbnRUeXBlU2hvcnROYW1lLCBleHBlY3RlZFR5cGVTaG9ydE5hbWV9LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bmRlZmluZWRMYWJlbChCcmFuY2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHN0YXRlbWVudC5sYWJlbCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbmRlZmluZWRMYWJlbCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHN0YXRlbWVudC5sYWJlbCl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJc3RhdGVtZW50LnNvdXJjZVN0YXJ0LAogCQlzdGF0ZW1lbnQuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHVuZXhwZWN0ZWRTdGF0aWNNb2RpZmllckZvckZpZWxkKFNvdXJjZVR5cGVCaW5kaW5nIHR5cGUsIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtmaWVsZERlY2wubmFtZSgpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5leHBlY3RlZFN0YXRpY01vZGlmaWVyRm9yRmllbGQsCi0JCW5ldyBTdHJpbmdbXSB7ZmllbGREZWNsLm5hbWUoKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCiAJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgdW5leHBlY3RlZFN0YXRpY01vZGlmaWVyRm9yTWV0aG9kKFJlZmVyZW5jZUJpbmRpbmcgdHlwZSwgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX07CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlVuZXhwZWN0ZWRTdGF0aWNNb2RpZmllckZvck1ldGhvZCwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHR5cGUuc291cmNlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2REZWNsLnNlbGVjdG9yKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQltZXRob2REZWNsLnNvdXJjZVN0YXJ0LAogCQltZXRob2REZWNsLnNvdXJjZUVuZCk7CiB9CkBAIC0yMjM1LDIwICsyODU0LDI1IEBACiAJCQkJCT8gSVByb2JsZW0uVW5kZWZpbmVkQ29uc3RydWN0b3JJbkltcGxpY2l0Q29uc3RydWN0b3JDYWxsCiAJCQkJCTogSVByb2JsZW0uVW5oYW5kbGVkRXhjZXB0aW9uKSwKIAkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGV4Y2VwdGlvblR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZWRCbGFua0ZpbmFsRmllbGQoRmllbGRCaW5kaW5nIGJpbmRpbmcsIEFzdE5vZGUgbG9jYXRpb24pIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkLAotCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoYmluZGluZy5yZWFkYWJsZU5hbWUoKSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJbG9jYXRpb24uc291cmNlU3RhcnQsCiAJCWxvY2F0aW9uLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZShMb2NhbFZhcmlhYmxlQmluZGluZyBiaW5kaW5nLCBBc3ROb2RlIGxvY2F0aW9uKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5pbml0aWFsaXplZExvY2FsVmFyaWFibGUsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhiaW5kaW5nLnJlYWRhYmxlTmFtZSgpKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KQEAgLTIyNTYsNyArMjg4MCw4IEBACiAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5tYXRjaGVkQnJhY2tldCwgCi0JCW5ldyBTdHJpbmdbXSB7fSwKKwkJTm9Bcmd1bWVudCwKKwkJTm9Bcmd1bWVudCwKIAkJcG9zaXRpb24sIAogCQlwb3NpdGlvbiwKIAkJY29udGV4dCwKQEAgLTIyNjYsMjAgKzI4OTEsMzkgQEAKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uSWxsZWdhbEVuY2xvc2luZ0luc3RhbmNlU3BlY2lmaWNhdGlvbiwKIAkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHRhcmdldFR5cGUucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHRhcmdldFR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQlleHByZXNzaW9uLnNvdXJjZVN0YXJ0LAogCQlleHByZXNzaW9uLnNvdXJjZUVuZCk7CiB9CitwdWJsaWMgdm9pZCB1bm5lY2Vzc2FyeVJlY2VpdmVyRm9yU3RhdGljTWV0aG9kKEFzdE5vZGUgbG9jYXRpb24sIE1ldGhvZEJpbmRpbmcgbWV0aG9kKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLk5vblN0YXRpY0FjY2Vzc1RvU3RhdGljTWV0aG9kLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcobWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKSwgbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLCBwYXJhbWV0ZXJzQXNTdHJpbmcobWV0aG9kKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksIG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyc0FzU2hvcnRTdHJpbmcobWV0aG9kKX0sCisJCWxvY2F0aW9uLnNvdXJjZVN0YXJ0LAorCQlsb2NhdGlvbi5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdW5uZWNlc3NhcnlSZWNlaXZlckZvclN0YXRpY0ZpZWxkKEFzdE5vZGUgbG9jYXRpb24sIEZpZWxkQmluZGluZyBmaWVsZCkgeworCXRoaXMuaGFuZGxlKAorCQlJUHJvYmxlbS5Ob25TdGF0aWNBY2Nlc3NUb1N0YXRpY0ZpZWxkLAorCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoZmllbGQuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKKwkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLCBuZXcgU3RyaW5nKGZpZWxkLm5hbWUpfSwKKwkJbG9jYXRpb24uc291cmNlU3RhcnQsCisJCWxvY2F0aW9uLnNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCB1bnJlYWNoYWJsZUNvZGUoU3RhdGVtZW50IHN0YXRlbWVudCkgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Db2RlQ2Fubm90QmVSZWFjaGVkLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlzdGF0ZW1lbnQuc291cmNlU3RhcnQsCiAJCXN0YXRlbWVudC5zb3VyY2VFbmQpOwogfQogcHVibGljIHZvaWQgdW5yZWFjaGFibGVFeGNlcHRpb25IYW5kbGVyKFJlZmVyZW5jZUJpbmRpbmcgZXhjZXB0aW9uVHlwZSwgQXN0Tm9kZSBsb2NhdGlvbikgewogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbnJlYWNoYWJsZUNhdGNoLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KQEAgLTIyOTIsNTQgKzI5MzYsMTgyIEBACiAJCQlzZXZlcml0eSA9IFNlY29uZGFyeUVycm9yOwogCX0KICovCisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcucmVhZGFibGVOYW1lKCkpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW5kZWZpbmVkTmFtZSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXNldmVyaXR5LAogCQluYW1lUmVmLnNvdXJjZVN0YXJ0LAogCQluYW1lUmVmLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bnVzZWRBcmd1bWVudChMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbCkgeworCisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtsb2NhbERlY2wubmFtZSgpfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uQXJndW1lbnRJc05ldmVyVXNlZCwKLQkJbmV3IFN0cmluZ1tdIHtsb2NhbERlY2wubmFtZSgpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCWxvY2FsRGVjbC5zb3VyY2VTdGFydCwKIAkJbG9jYWxEZWNsLnNvdXJjZUVuZCk7CiB9CiBwdWJsaWMgdm9pZCB1bnVzZWRJbXBvcnQoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7IENoYXJPcGVyYXRpb24udG9TdHJpbmcoaW1wb3J0UmVmLnRva2VucykgfTsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVW51c2VkSW1wb3J0LAotCQluZXcgU3RyaW5nW10geyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKGltcG9ydFJlZi50b2tlbnMpIH0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlpbXBvcnRSZWYuc291cmNlU3RhcnQsCiAJCWltcG9ydFJlZi5zb3VyY2VFbmQpOyAKIH0KIHB1YmxpYyB2b2lkIHVudXNlZExvY2FsVmFyaWFibGUoTG9jYWxEZWNsYXJhdGlvbiBsb2NhbERlY2wpIHsKKwlTdHJpbmdbXSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10ge2xvY2FsRGVjbC5uYW1lKCl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5Mb2NhbFZhcmlhYmxlSXNOZXZlclVzZWQsCi0JCW5ldyBTdHJpbmdbXSB7bG9jYWxEZWNsLm5hbWUoKX0sCisJCWFyZ3VtZW50cywKKwkJYXJndW1lbnRzLAogCQlsb2NhbERlY2wuc291cmNlU3RhcnQsCiAJCWxvY2FsRGVjbC5zb3VyY2VFbmQpOwogfQorcHVibGljIHZvaWQgdW51c2VkUHJpdmF0ZUNvbnN0cnVjdG9yKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsKSB7CisJCisJaWYgKGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5VbnVzZWRQcml2YXRlQ29uc3RydWN0b3IpID09IElnbm9yZSkgcmV0dXJuOwogCisJLy8gbm8gY29tcGxhaW50IGZvciBuby1hcmcgY29uc3RydWN0b3JzIChvciBkZWZhdWx0IG9uZXMpIC0ga25vd24gcGF0dGVybiB0byBibG9jayBpbnN0YW50aWF0aW9uCisJaWYgKGNvbnN0cnVjdG9yRGVjbC5hcmd1bWVudHMgPT0gbnVsbCB8fCBjb25zdHJ1Y3RvckRlY2wuYXJndW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47CisJCQkJCQorCU1ldGhvZEJpbmRpbmcgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvckRlY2wuYmluZGluZzsKKwl0aGlzLmhhbmRsZSgKKwkJCUlQcm9ibGVtLlVudXNlZFByaXZhdGVDb25zdHJ1Y3RvciwKKwkJbmV3IFN0cmluZ1tdIHsKKwkJCW5ldyBTdHJpbmcoY29uc3RydWN0b3IuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJcGFyYW1ldGVyc0FzU3RyaW5nKGNvbnN0cnVjdG9yKQorCQkgfSwgCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGNvbnN0cnVjdG9yLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJcGFyYW1ldGVyc0FzU2hvcnRTdHJpbmcoY29uc3RydWN0b3IpCisJCSB9LCAKKwkJY29uc3RydWN0b3JEZWNsLnNvdXJjZVN0YXJ0LAorCQljb25zdHJ1Y3RvckRlY2wuc291cmNlRW5kKTsKK30KK3B1YmxpYyB2b2lkIHVudXNlZFByaXZhdGVGaWVsZChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbCkgeworCQorCWlmIChjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVW51c2VkUHJpdmF0ZUZpZWxkKSA9PSBJZ25vcmUpIHJldHVybjsKKworCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkRGVjbC5iaW5kaW5nOworCQorCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLlNFUklBTFZFUlNJT05VSUQsIGZpZWxkLm5hbWUpCisJCQkmJiBmaWVsZC5pc1N0YXRpYygpCisJCQkmJiBmaWVsZC5pc0ZpbmFsKCkKKwkJCSYmIFR5cGVCaW5kaW5nLkxvbmdCaW5kaW5nID09IGZpZWxkLnR5cGUpIHsKKwkJCQlyZXR1cm47IC8vIGRvIG5vdCByZXBvcnQgdW51c2VkIHNlcmlhbFZlcnNpb25VSUQgZmllbGQKKwkJfQorCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uVW51c2VkUHJpdmF0ZUZpZWxkLAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZyhmaWVsZC5kZWNsYXJpbmdDbGFzcy5yZWFkYWJsZU5hbWUoKSksCisJCQluZXcgU3RyaW5nKGZpZWxkLm5hbWUpLAorCQkgfSwgCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKGZpZWxkLmRlY2xhcmluZ0NsYXNzLnNob3J0UmVhZGFibGVOYW1lKCkpLAorCQkJbmV3IFN0cmluZyhmaWVsZC5uYW1lKSwKKwkJIH0sIAorCQlmaWVsZERlY2wuc291cmNlU3RhcnQsCisJCWZpZWxkRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdW51c2VkUHJpdmF0ZU1ldGhvZChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKworCWlmIChjb21wdXRlU2V2ZXJpdHkoSVByb2JsZW0uVW51c2VkUHJpdmF0ZU1ldGhvZCkgPT0gSWdub3JlKSByZXR1cm47CisJCisJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2REZWNsLmJpbmRpbmc7CisJCisJLy8gbm8gcmVwb3J0IGZvciBzZXJpYWxpemF0aW9uIHN1cHBvcnQgJ3ZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSknCisJaWYgKCFtZXRob2QuaXNTdGF0aWMoKQorCQkJJiYgVHlwZUJpbmRpbmcuVm9pZEJpbmRpbmcgPT0gbWV0aG9kLnJldHVyblR5cGUKKwkJCSYmIG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAxCisJCQkmJiBtZXRob2QucGFyYW1ldGVyc1swXS5kaW1lbnNpb25zKCkgPT0gMAorCQkJJiYgQ2hhck9wZXJhdGlvbi5lcXVhbHMobWV0aG9kLnNlbGVjdG9yLCBUeXBlQ29uc3RhbnRzLlJFQURPQkpFQ1QpCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhUeXBlQ29uc3RhbnRzLkNoYXJBcnJheV9KQVZBX0lPX09CSkVDVElOUFVUU1RSRUFNLCBtZXRob2QucGFyYW1ldGVyc1swXS5yZWFkYWJsZU5hbWUoKSkpIHsKKwkJcmV0dXJuOworCX0KKwkvLyBubyByZXBvcnQgZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydCAndm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0pJworCWlmICghbWV0aG9kLmlzU3RhdGljKCkKKwkJCSYmIFR5cGVCaW5kaW5nLlZvaWRCaW5kaW5nID09IG1ldGhvZC5yZXR1cm5UeXBlCisJCQkmJiBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT0gMQorCQkJJiYgbWV0aG9kLnBhcmFtZXRlcnNbMF0uZGltZW5zaW9ucygpID09IDAKKwkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3RvciwgVHlwZUNvbnN0YW50cy5XUklURU9CSkVDVCkKKwkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKFR5cGVDb25zdGFudHMuQ2hhckFycmF5X0pBVkFfSU9fT0JKRUNUT1VUUFVUU1RSRUFNLCBtZXRob2QucGFyYW1ldGVyc1swXS5yZWFkYWJsZU5hbWUoKSkpIHsKKwkJcmV0dXJuOworCX0KKwkvLyBubyByZXBvcnQgZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydCAnT2JqZWN0IHJlYWRSZXNvbHZlKCknCisJaWYgKCFtZXRob2QuaXNTdGF0aWMoKQorCQkJJiYgVHlwZUJpbmRpbmcuVF9PYmplY3QgPT0gbWV0aG9kLnJldHVyblR5cGUuaWQKKwkJCSYmIG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PSAwCisJCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtZXRob2Quc2VsZWN0b3IsIFR5cGVDb25zdGFudHMuUkVBRFJFU09MVkUpKSB7CisJCXJldHVybjsKKwl9CisJLy8gbm8gcmVwb3J0IGZvciBzZXJpYWxpemF0aW9uIHN1cHBvcnQgJ09iamVjdCB3cml0ZVJlcGxhY2UoKScKKwlpZiAoIW1ldGhvZC5pc1N0YXRpYygpCisJCQkmJiBUeXBlQmluZGluZy5UX09iamVjdCA9PSBtZXRob2QucmV0dXJuVHlwZS5pZAorCQkJJiYgbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID09IDAKKwkJCSYmIENoYXJPcGVyYXRpb24uZXF1YWxzKG1ldGhvZC5zZWxlY3RvciwgVHlwZUNvbnN0YW50cy5XUklURVJFUExBQ0UpKSB7CisJCXJldHVybjsKKwl9CisJdGhpcy5oYW5kbGUoCisJCQlJUHJvYmxlbS5VbnVzZWRQcml2YXRlTWV0aG9kLAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3MucmVhZGFibGVOYW1lKCkpLAorCQkJbmV3IFN0cmluZyhtZXRob2Quc2VsZWN0b3IpLAorCQkJcGFyYW1ldGVyc0FzU3RyaW5nKG1ldGhvZCkKKwkJIH0sIAorCQluZXcgU3RyaW5nW10geworCQkJbmV3IFN0cmluZyhtZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCQluZXcgU3RyaW5nKG1ldGhvZC5zZWxlY3RvciksCisJCQlwYXJhbWV0ZXJzQXNTaG9ydFN0cmluZyhtZXRob2QpCisJCSB9LCAKKwkJbWV0aG9kRGVjbC5zb3VyY2VTdGFydCwKKwkJbWV0aG9kRGVjbC5zb3VyY2VFbmQpOworfQorcHVibGljIHZvaWQgdW51c2VkUHJpdmF0ZVR5cGUoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJCisJaWYgKGNvbXB1dGVTZXZlcml0eShJUHJvYmxlbS5VbnVzZWRQcml2YXRlVHlwZSkgPT0gSWdub3JlKSByZXR1cm47CisKKwlSZWZlcmVuY2VCaW5kaW5nIHR5cGUgPSB0eXBlRGVjbC5iaW5kaW5nOworCXRoaXMuaGFuZGxlKAorCQkJSVByb2JsZW0uVW51c2VkUHJpdmF0ZVR5cGUsCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKHR5cGUucmVhZGFibGVOYW1lKCkpLAorCQkgfSwgCisJCW5ldyBTdHJpbmdbXSB7CisJCQluZXcgU3RyaW5nKHR5cGUuc2hvcnRSZWFkYWJsZU5hbWUoKSksCisJCSB9LCAKKwkJdHlwZURlY2wuc291cmNlU3RhcnQsCisJCXR5cGVEZWNsLnNvdXJjZUVuZCk7Cit9CiBwdWJsaWMgdm9pZCB1c2VBc3NlcnRBc0FuSWRlbnRpZmllcihpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uVXNlQXNzZXJ0QXNBbklkZW50aWZpZXIsCi0JCW5ldyBTdHJpbmdbMF0sCisJCU5vQXJndW1lbnQsCisJCU5vQXJndW1lbnQsCiAJCXNvdXJjZVN0YXJ0LAogCQlzb3VyY2VFbmQpOwkKIH0KIAogcHVibGljIHZvaWQgdmFyaWFibGVUeXBlQ2Fubm90QmVWb2lkKEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJEZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHZhckRlY2wubmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5WYXJpYWJsZVR5cGVDYW5ub3RCZVZvaWQsCi0JCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyh2YXJEZWNsLm5hbWUpfSwKKwkJYXJndW1lbnRzLAorCQlhcmd1bWVudHMsCiAJCXZhckRlY2wuc291cmNlU3RhcnQsCiAJCXZhckRlY2wuc291cmNlRW5kKTsKIH0KIHB1YmxpYyB2b2lkIHZhcmlhYmxlVHlwZUNhbm5vdEJlVm9pZEFycmF5KEFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiB2YXJEZWNsKSB7CisJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHZhckRlY2wubmFtZSl9OwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5WYXJpYWJsZVR5cGVDYW5ub3RCZVZvaWRBcnJheSwKLQkJbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKHZhckRlY2wubmFtZSl9LAorCQlhcmd1bWVudHMsCisJCWFyZ3VtZW50cywKIAkJdmFyRGVjbC5zb3VyY2VTdGFydCwKIAkJdmFyRGVjbC5zb3VyY2VFbmQpOwogfQpAQCAtMjM1MCw2ICszMTIyLDcgQEAKIAkJLy8gOC40LjYuMyAtIFRoZSBhY2Nlc3MgbW9kaWZpZXIgb2YgYW4gb3ZlcmlkaW5nIG1ldGhvZCBtdXN0IHByb3ZpZGUgYXQgbGVhc3QgYXMgbXVjaCBhY2Nlc3MgYXMgdGhlIG92ZXJyaWRlbiBtZXRob2QuCiAJCUlQcm9ibGVtLk1ldGhvZFJlZHVjZXNWaXNpYmlsaXR5LAogCQluZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW5oZXJpdGVkTWV0aG9kLmRlY2xhcmluZ0NsYXNzLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbmhlcml0ZWRNZXRob2QuZGVjbGFyaW5nQ2xhc3Muc2hvcnRSZWFkYWJsZU5hbWUoKSl9LAogCQljdXJyZW50TWV0aG9kLnNvdXJjZVN0YXJ0KCksCiAJCWN1cnJlbnRNZXRob2Quc291cmNlRW5kKCkpOwogfQpAQCAtMjM1NywxNSArMzEzMCwxMSBAQAogCS8vdGhlIHR3byBjYXRjaCBibG9jayB1bmRlciBhbmQgdXBwZXIgYXJlIGluIGFuIGluY29ycmVjdCBvcmRlci4KIAkvL3VuZGVyIHNob3VsZCBiZSBkZWZpbmUgQkVGT1JFIHVwcGVyIGluIHRoZSBzb3VyY2UKIAotCS8vbm90aWNlIHRoYXQgdGhlIGNvbXBpbGVyIGNvdWxkIGFycmFuZ2UgYXV0b21hdGljYWxseSB0aGUKLQkvL2NvcnJlY3Qgb3JkZXIgLSBhbmQgdGhlIG9ubHkgZXJyb3Igd291bGQgYmUgb24gY3ljbGUgLi4uLgotCS8vb24gdGhpcyBvbmUgYWdhaW4gLCBqYXZhIGlzIGNvbXBpbGVyLWRyaXZlbiBpbnN0ZWFkIG9mIGJlaW5nCi0JLy91c2VyLWRyaXZlbiAuLi4uLgotCiAJVHlwZVJlZmVyZW5jZSB0eXBlUmVmID0gc3RhdGVtZW50LmNhdGNoQXJndW1lbnRzW3VuZGVyXS50eXBlOwogCXRoaXMuaGFuZGxlKAogCQlJUHJvYmxlbS5VbnJlYWNoYWJsZUNhdGNoLAotCQluZXcgU3RyaW5nWzBdLAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQl0eXBlUmVmLnNvdXJjZVN0YXJ0LAogCQl0eXBlUmVmLnNvdXJjZUVuZCk7CiB9CkBAIC0yMzczLDE1ICszMTQyLDI3IEBACiBwdWJsaWMgdm9pZCBub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsKEFzdE5vZGUgbG9jYXRpb24pIHsKIAl0aGlzLmhhbmRsZSgKIAkJSVByb2JsZW0uTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCwKLQkJbmV3IFN0cmluZ1tdIHt9LAorCQlOb0FyZ3VtZW50LAorCQlOb0FyZ3VtZW50LAogCQlsb2NhdGlvbi5zb3VyY2VTdGFydCwKIAkJbG9jYXRpb24uc291cmNlRW5kKTsKIH0KIAorcHVibGljIHZvaWQgbm9Nb3JlQXZhaWxhYmxlU3BhY2VGb3JDb25zdGFudChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisJdGhpcy5oYW5kbGUoCisJCUlQcm9ibGVtLlRvb01hbnlCeXRlc0ZvclN0cmluZ0NvbnN0YW50LAorCQluZXcgU3RyaW5nW117IG5ldyBTdHJpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcucmVhZGFibGVOYW1lKCkpfSwKKwkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nLnNob3J0UmVhZGFibGVOYW1lKCkpfSwKKwkJQWJvcnQgfCBFcnJvciwKKwkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQl0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kKTsKK30KKwogcHVibGljIHZvaWQgbm9Nb3JlQXZhaWxhYmxlU3BhY2VJbkNvbnN0YW50UG9vbChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CiAJdGhpcy5oYW5kbGUoCiAJCUlQcm9ibGVtLlRvb01hbnlDb25zdGFudHNJbkNvbnN0YW50UG9vbCwKIAkJbmV3IFN0cmluZ1tdeyBuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5iaW5kaW5nLnJlYWRhYmxlTmFtZSgpKX0sCisJCW5ldyBTdHJpbmdbXXsgbmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24uYmluZGluZy5zaG9ydFJlYWRhYmxlTmFtZSgpKX0sCiAJCUFib3J0IHwgRXJyb3IsCiAJCXR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwKIAkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCk7CkBAIC0yNDA2LDcgKzMxODcsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWludCBuZXh0VG9rZW49IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCWlmIChuZXh0VG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YKKwkJaWYgKG5leHRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YKIAkJCSYmIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiA9PSBzY2FubmVyLnNvdXJjZS5sZW5ndGgpIHsgLy8gdG8gaGFuZGxlIGNhc2Ugd2hlcmUgd2UgaGFkIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAKIAkJCQkJCQkJCQkJCQkJCSAgICAgLy8gd2hpbGUgcmVhZGluZyB0aGUgbGFzdCB0b2tlbgogCQkJc3dpdGNoKHRva2VuKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtU2V2ZXJpdGllcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vUHJvYmxlbVNldmVyaXRpZXMuamF2YQppbmRleCAxNjZlMDc4Li4zZWNiNDhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9Qcm9ibGVtU2V2ZXJpdGllcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Byb2JsZW1TZXZlcml0aWVzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbTsKIAogcHVibGljIGludGVyZmFjZSBQcm9ibGVtU2V2ZXJpdGllcyB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9TaG91bGROb3RJbXBsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCmluZGV4IDhmZGVhOGMuLjExNzdjNjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL1Nob3VsZE5vdEltcGxlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW07CiAKIC8qCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3Byb2JsZW0vbWVzc2FnZXMucHJvcGVydGllcwppbmRleCAyZDI3YzExLi5kODMxNDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvcHJvYmxlbS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9wcm9ibGVtL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsMyArMSwxMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIDAgPSB7MH0KIDEgPSBzdXBlciBjYW5ub3QgYmUgdXNlZCBpbiBqYXZhLmxhbmcuT2JqZWN0CiAyID0gezB9IGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSB0eXBlCkBAIC01LDIwICsxNSwyMSBAQAogNCA9IFRoZSB0eXBlIHswfSBpcyBhbWJpZ3VvdXMKIDUgPSBUaGUgdHlwZSB7MH0gaXMgZGVwcmVjYXRlZAogNiA9IFRoZSB0eXBlIHswfSBpcyBhbiBpbmNvcnJlY3RseSBzcGVjaWZpZWQgbmVzdGVkIHR5cGU7IHJlcGxhY2UgdGhlICcnJCcnIHdpdGggJycuJycKKzcgPSBUaGUgcHJpdmF0ZSB0eXBlIHswfSBpcyBuZXZlciB1c2VkIGxvY2FsbHkKIAogMTUgPSBJbmNvbXBhdGlibGUgb3BlcmFuZCB0eXBlcyB7MH0gYW5kIHsxfQogMTYgPSBJbmNvbXBhdGlibGUgY29uZGl0aW9uYWwgb3BlcmFuZCB0eXBlcyB7MH0gYW5kIHsxfQogMTcgPSBUeXBlIG1pc21hdGNoOiBjYW5ub3QgY29udmVydCBmcm9tIHswfSB0byB7MX0KIAotMjAgPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhlIHR5cGUgezB9IGlzIGFjY2Vzc2libGUgdG8gaW52b2tlIHRoZSBzdXBlciBjb25zdHJ1Y3Rvci4gTXVzdCBkZWZpbmUgYSBjb25zdHJ1Y3RvciBhbmQgZXhwbGljaXRseSBxdWFsaWZ5IGl0cyBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHdpdGggYW4gaW5zdGFuY2Ugb2YgezB9IChlLmcuIHguc3VwZXIoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCi0yMSA9IE11c3QgZXhwbGljaXRseSBxdWFsaWZ5IHRoZSBhbGxvY2F0aW9uIHdpdGggYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IChlLmcuIHgubmV3IEEoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCisyMCA9IE5vIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0eXBlIHswfSBpcyBhY2Nlc3NpYmxlIHRvIGludm9rZSB0aGUgc3VwZXIgY29uc3RydWN0b3IuIE11c3QgZGVmaW5lIGEgY29uc3RydWN0b3IgYW5kIGV4cGxpY2l0bHkgcXVhbGlmeSBpdHMgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiB3aXRoIGFuIGluc3RhbmNlIG9mIHswfSAoZS5nLiB4LnN1cGVyKCkgd2hlcmUgeCBpcyBhbiBpbnN0YW5jZSBvZiB7MH0pLgorMjEgPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZS4gTXVzdCBxdWFsaWZ5IHRoZSBhbGxvY2F0aW9uIHdpdGggYW4gZW5jbG9zaW5nIGluc3RhbmNlIG9mIHR5cGUgezB9IChlLmcuIHgubmV3IEEoKSB3aGVyZSB4IGlzIGFuIGluc3RhbmNlIG9mIHswfSkuCiAyMiA9IE5vIGVuY2xvc2luZyBpbnN0YW5jZSBvZiB0aGUgdHlwZSB7MH0gaXMgYWNjZXNzaWJsZSBpbiBzY29wZQogMjMgPSBJbGxlZ2FsIGVuY2xvc2luZyBpbnN0YW5jZSBzcGVjaWZpY2F0aW9uIGZvciB0eXBlIHswfQogMjQgPSBDYW5ub3QgZGVmaW5lIHN0YXRpYyBpbml0aWFsaXplciBpbiBpbm5lciB0eXBlIHswfQogMjUgPSBDYW5ub3QgcmVmZXIgdG8gYSBub24tZmluYWwgdmFyaWFibGUgezB9IGluc2lkZSBhbiBpbm5lciBjbGFzcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IG1ldGhvZAogMjYgPSBUaGUgbWVtYmVyIGludGVyZmFjZSB7MH0gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbnNpZGUgYSB0b3AtbGV2ZWwgY2xhc3Mgb3IgaW50ZXJmYWNlCiAyNyA9IENhbm5vdCB1c2UgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdHlwZSB7MH0gYXMgYSB2YWxpZCBlbmNsb3NpbmcgaW5zdGFuY2UKLQorMjggPSBObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdHlwZSB7MH0gaXMgYXZhaWxhYmxlIGR1ZSB0byBzb21lIGludGVybWVkaWF0ZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCiAyOSA9IEFuIGFub255bW91cyBjbGFzcyBjYW5ub3Qgc3ViY2xhc3MgdGhlIGZpbmFsIGNsYXNzIHswfQogCiA1MCA9IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQKQEAgLTI5LDIzICs0MCwyOCBAQAogNTUgPSBEdXBsaWNhdGUgbG9jYWwgdmFyaWFibGUgezB9CiA1NiA9IER1cGxpY2F0ZSBhcmd1bWVudCB7MH0KIDU3ID0gVGhlIGZpbmFsIGxvY2FsIHZhcmlhYmxlIHswfSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQKKzU4ID0gVGhlIGZpbmFsIGxvY2FsIHZhcmlhYmxlIHswfSBjYW5ub3QgYmUgYXNzaWduZWQuIEl0IG11c3QgYmUgYmxhbmsgYW5kIG5vdCB1c2luZyBhIGNvbXBvdW5kIGFzc2lnbm1lbnQKIAotNjAgPSBDYW5ub3QgYXNzaWduIHRvIHRoZSBmaW5hbCBsb2NhbCB2YXJpYWJsZSB7MH0gZGVmaW5lZCBvdXRzaWRlIHRoaXMgaW5uZXIgY2xhc3MKKzYwID0gVGhlIGZpbmFsIGxvY2FsIHZhcmlhYmxlIHswfSBjYW5ub3QgYmUgYXNzaWduZWQsIHNpbmNlIGl0IGlzIGRlZmluZWQgaW4gYW4gZW5jbG9zaW5nIHR5cGUKIDYxID0gVGhlIGxvY2FsIHZhcmlhYmxlIHswfSBpcyBuZXZlciByZWFkCiA2MiA9IFRoZSBhcmd1bWVudCB7MH0gaXMgbmV2ZXIgcmVhZAotNjMgPSBDb2RlIG9mIG1ldGhvZCB7MH0gaXMgZXhjZWVkaW5nIHRoZSA2NTUzNSBieXRlcyBsaW1pdAotNjQgPSBDb2RlIGZvciB0aGUgc3RhdGljIGluaXRpYWxpemVyIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQKKzYzID0gVGhlIGNvZGUgb2YgbWV0aG9kIHswfSh7MX0pIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQKKzY0ID0gVGhlIGNvZGUgZm9yIHRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIgaXMgZXhjZWVkaW5nIHRoZSA2NTUzNSBieXRlcyBsaW1pdAogNjUgPSBUb28gbWFueSBhcmd1bWVudHMsIHBhcmFtZXRlciB7MH0gaXMgZXhjZWVkaW5nIHRoZSBsaW1pdCBvZiAyNTUgd29yZHMgZWxpZ2libGUgZm9yIG1ldGhvZCBhcmd1bWVudHMKIDY2ID0gVG9vIG1hbnkgbG9jYWwgdmFyaWFibGVzLCBsb2NhbCB2YXJpYWJsZSB7MH0gaXMgZXhjZWVkaW5nIHRoZSBsaW1pdCBvZiA2NTUzNSB3b3JkcyBlbGlnaWJsZSBmb3IgbWV0aG9kIGxvY2FsIHZhcmlhYmxlcwotCis2NyA9IFRvbyBtYW55IHN5bnRoZXRpYyBhcmd1bWVudHMsIGVtdWxhdGVkIHBhcmFtZXRlciB7MH0gaXMgZXhjZWVkaW5nIHRoZSBsaW1pdCBvZiAyNTUgd29yZHMgZWxpZ2libGUgZm9yIG1ldGhvZCBhcmd1bWVudHMKKzY4ID0gVG9vIG1hbnkgYXJyYXkgZGltZW5zaW9ucy4gTWF4aW11bSBpcyAyNTUKKzY5ID0gVGhlIGNvZGUgb2YgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgZXhjZWVkaW5nIHRoZSA2NTUzNSBieXRlcyBsaW1pdAogNzAgPSB7MH0gY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIGZpZWxkCiA3MSA9IFRoZSBmaWVsZCB7MH0gaXMgbm90IHZpc2libGUKIDcyID0gVGhlIGZpZWxkIHswfSBpcyBhbWJpZ3VvdXMKIDczID0gVGhlIGZpZWxkIHswfS57MX0gaXMgZGVwcmVjYXRlZAogNzQgPSBDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgZmllbGQgezB9CiA3NSA9IENhbm5vdCByZWZlcmVuY2UgYSBmaWVsZCBiZWZvcmUgaXQgaXMgZGVmaW5lZAorNzYgPSBUaGUgc3RhdGljIGZpZWxkIHswfS57MX0gc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheQorNzcgPSBUaGUgcHJpdmF0ZSBmaWVsZCB7MH0uezF9IGlzIG5ldmVyIHVzZWQgbG9jYWxseQogCi04MCA9IENhbm5vdCBhc3NpZ24gYSB2YWx1ZSB0byB0aGUgZmluYWwgZmllbGQgezB9LnsxfQorODAgPSBUaGUgZmluYWwgZmllbGQgezB9LnsxfSBjYW5ub3QgYmUgYXNzaWduZWQuIEl0IG11c3QgYmUgYmxhbmsgaW4gdGhpcyBjb250ZXh0LCBub3QgcXVhbGlmaWVkIGFuZCBub3QgaW4gY29tcG91bmQgYXNzaWdubWVudAogODEgPSBUaGUgYmxhbmsgZmluYWwgZmllbGQgezB9IG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkCiA4MiA9IFRoZSBmaW5hbCBmaWVsZCB7MH0gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkCiAKQEAgLTY2LDExICs4MiwxNCBAQAogMTE0ID0gQ2Fubm90IGludm9rZSB7MX0oezJ9KSBvbiB0aGUgcHJpbWl0aXZlIHR5cGUgezB9CiAxMTUgPSBUaGUgbWV0aG9kIHsxfSh7Mn0pIGluIHRoZSB0eXBlIHswfSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoezN9KQogMTE2ID0gQ2Fubm90IGludm9rZSB7MX0oezJ9KSBvbiB0aGUgYXJyYXkgdHlwZSB7MH0KKzExNyA9IFRoZSBzdGF0aWMgbWV0aG9kIHsxfSh7Mn0pIGZyb20gdGhlIHR5cGUgezB9IHNob3VsZCBiZSBhY2Nlc3NlZCBpbiBhIHN0YXRpYyB3YXkKKzExOCA9IFRoZSBwcml2YXRlIG1ldGhvZCB7MX0oezJ9KSBmcm9tIHRoZSB0eXBlIHswfSBpcyBuZXZlciB1c2VkIGxvY2FsbHkKIAogMTMwID0gVGhlIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIHVuZGVmaW5lZAogMTMxID0gVGhlIGNvbnN0cnVjdG9yIHswfSh7MX0pIGlzIG5vdCB2aXNpYmxlCiAxMzIgPSBUaGUgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgYW1iaWd1b3VzCiAxMzMgPSBUaGUgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgZGVwcmVjYXRlZAorMTM0ID0gVGhlIHByaXZhdGUgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgbmV2ZXIgdXNlZCBsb2NhbGx5CiAxMzUgPSBDYW5ub3QgcmVmZXIgdG8gYW4gaW5zdGFuY2UgZmllbGQgezB9IHdoaWxlIGV4cGxpY2l0bHkgaW52b2tpbmcgYSBjb25zdHJ1Y3RvcgogMTM2ID0gQ2Fubm90IHJlZmVyIHRvIGFuIGluc3RhbmNlIG1ldGhvZCB3aGlsZSBleHBsaWNpdGx5IGludm9raW5nIGEgY29uc3RydWN0b3IKIDEzNyA9IFJlY3Vyc2l2ZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHswfSh7MX0pCkBAIC05MSw3ICsxMTAsNyBAQAogMTUzID0gY2FzZSBleHByZXNzaW9ucyBtdXN0IGJlIGNvbnN0YW50IGV4cHJlc3Npb25zCiAxNTQgPSB7MH0gaXMgb3V0IG9mIHJhbmdlIAogMTU2ID0gQ2Fubm90IGNhc3QgZnJvbSB7MH0gdG8gezF9Ci0xNTcgPSBDYW5ub3QgaW5zdGFudGlhdGUgezB9CisxNTcgPSBUaGUgdHlwZSB7MH0gY2Fubm90IGJlIGluc3RhbnRpYXRlZAogMTU4ID0gQ2Fubm90IGRlZmluZSBkaW1lbnNpb24gZXhwcmVzc2lvbnMgd2hlbiBhbiBhcnJheSBpbml0aWFsaXplciBpcyBwcm92aWRlZAogMTU5ID0gVmFyaWFibGUgbXVzdCBwcm92aWRlIGVpdGhlciBkaW1lbnNpb24gZXhwcmVzc2lvbnMgb3IgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKIDE2MCA9IFRoZSBvcGVyYXRvciB7MH0gaXMgdW5kZWZpbmVkIGZvciB0aGUgYXJndW1lbnQgdHlwZShzKSB7MX0KQEAgLTEwMCwyMyArMTE5LDI0IEBACiAxNjMgPSBJbml0aWFsaXplciBkb2VzIG5vdCBjb21wbGV0ZSBub3JtYWxseQogMTY0ID0gRXhwcmVzc2lvbiBtdXN0IHJldHVybiBhIHZhbHVlCiAxNjUgPSBDYXRjaCBibG9jayBpcyBoaWRkZW4gYnkgYW5vdGhlciBvbmUgaW4gdGhlIHNhbWUgdHJ5IHN0YXRlbWVudAotMTY2ID0gRHVwbGljYXRlIGRlZmF1bHQgY2FzZQorMTY2ID0gVGhlIGRlZmF1bHQgY2FzZSBpcyBhbHJlYWR5IGRlZmluZWQKIDE2NyA9IFVucmVhY2hhYmxlIGNhdGNoIGJsb2NrCiAxNjggPSBVbmhhbmRsZWQgZXhjZXB0aW9uIHR5cGUgezB9CiAxNjkgPSBjYXNlIGNvbnN0YW50IG11c3QgYmUgYSBjaGFyLCBieXRlLCBzaG9ydCwgb3IgaW50IGluc3RlYWQgb2YgezB9CiAxNzAgPSBEdXBsaWNhdGUgY2FzZSB7MH0KIDE3MSA9IER1cGxpY2F0ZSBsYWJlbCB7MH0KLTE3MiA9IE1pc3NpbmcgdmFsaWQgYnJlYWthYmxlIGxvY2F0aW9uCi0xNzMgPSBNaXNzaW5nIGxvb3AtY29udGludWF0aW9uIHBvaW50Ci0xNzQgPSBNaXNzaW5nIGxhYmVsIHswfQorMTcyID0gYnJlYWsgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIGxvb3Agb3IgYSBzd2l0Y2gKKzE3MyA9IGNvbnRpbnVlIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYSBsb29wCisxNzQgPSBUaGUgbGFiZWwgezB9IGlzIG1pc3NpbmcKIDE3NSA9IHswfSBpcyBub3QgYSB2YWxpZCB0eXBlJydzIGFyZ3VtZW50IGZvciB0aGUgc3luY2hyb25pemVkIHN0YXRlbWVudAogMTc2ID0gbnVsbCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgdGhlIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQKIDE3NyA9IENhbm5vdCB0aHJvdyBudWxsCisxNzggPSBUaGUgYXNzaWdubWVudCB0byB2YXJpYWJsZSB7MH0gaGFzIG5vIGVmZmVjdAogCi0xOTAgPSBSZWFkIGFjY2VzcyB0byBlbmNsb3NpbmcgZmllbGQgezB9LnsxfSBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QgCi0xOTEgPSBXcml0ZSBhY2Nlc3MgdG8gZW5jbG9zaW5nIGZpZWxkIHswfS57MX0gaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kCi0xOTIgPSBBY2Nlc3MgdG8gZW5jbG9zaW5nIG1ldGhvZCB7MX0oezJ9KSBmcm9tIHRoZSB0eXBlIHswfSBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QKLTE5MyA9IEFjY2VzcyB0byBlbmNsb3NpbmcgY29uc3RydWN0b3IgezB9KHsxfSkgaXMgZW11bGF0ZWQgYnkgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kCisxOTAgPSBSZWFkIGFjY2VzcyB0byBlbmNsb3NpbmcgZmllbGQgezB9LnsxfSBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QuIEluY3JlYXNpbmcgaXRzIHZpc2liaWxpdHkgd2lsbCBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UKKzE5MSA9IFdyaXRlIGFjY2VzcyB0byBlbmNsb3NpbmcgZmllbGQgezB9LnsxfSBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QuIEluY3JlYXNpbmcgaXRzIHZpc2liaWxpdHkgd2lsbCBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UKKzE5MiA9IEFjY2VzcyB0byBlbmNsb3NpbmcgbWV0aG9kIHsxfSh7Mn0pIGZyb20gdGhlIHR5cGUgezB9IGlzIGVtdWxhdGVkIGJ5IGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZC4gSW5jcmVhc2luZyBpdHMgdmlzaWJpbGl0eSB3aWxsIGltcHJvdmUgeW91ciBwZXJmb3JtYW5jZQorMTkzID0gQWNjZXNzIHRvIGVuY2xvc2luZyBjb25zdHJ1Y3RvciB7MH0oezF9KSBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QuIEluY3JlYXNpbmcgaXRzIHZpc2liaWxpdHkgd2lsbCBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UKIDE5NSA9IFRoZSBtZXRob2QgezF9IGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZQogMTk2ID0gVGhlIGZpZWxkIHswfSBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUgCiAxOTcgPSBUaGUgdHlwZSB7MH0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCkBAIC0xMzYsNiArMTU2LDkgQEAKIDIyMCA9IFVubWF0Y2hlZCBicmFja2V0CiAyMjEgPSBUaGUgcHJpbWl0aXZlIHR5cGUgezB9IG9mIHsxfSBkb2VzIG5vdCBoYXZlIGEgZmllbGQgezJ9CiAyMjIgPSBJbnZhbGlkIGV4cHJlc3Npb24gYXMgc3RhdGVtZW50CisyMjMgPSBUaGUgbGVmdC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBtdXN0IGJlIGEgdmFyaWFibGUKKzIyNCA9IE1pc3Npbmcgc2VtaWNvbG9uCisyMjUgPSBJbnZhbGlkIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbgogCiAyNTAgPSBVbmV4cGVjdGVkIGVuZCBvZiBmaWxlCiAyNTEgPSBJbnZhbGlkIGhleGEgbGl0ZXJhbCBudW1iZXIKQEAgLTE3OCw2ICsyMDEsNyBAQAogMzI2ID0gQSBwYWNrYWdlIG11c3QgYmUgc3BlY2lmaWVkIGluIHswfSBvciBhIGRlZmF1bHQgcGFja2FnZSBjcmVhdGVkCiAzMjcgPSBUaGUgaGllcmFyY2h5IG9mIHRoZSB0eXBlIHswfSBpcyBpbmNvbnNpc3RlbnQKIDMyOCA9IFRoZSBkZWNsYXJlZCBwYWNrYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBwYWNrYWdlIHswfQorMzI5ID0gVGhlIHR5cGUgamF2YS5sYW5nLk9iamVjdCBjYW5ub3QgaGF2ZSBhIHN1cGVyY2xhc3Mgb3Igc3VwZXJpbnRlcmZhY2VzCiAKIDMzMCA9IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgaXMgbm90IGEgdmFsaWQgc3VwZXJjbGFzcwogMzMxID0gU3VwZXJjbGFzcyB7MH0gaXMgbm90IHZpc2libGUKQEAgLTI1NiwxMiArMjgwLDIwIEBACiA0MDkgPSBDYW5ub3QgcmVkdWNlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGZyb20gezB9CiA0MTAgPSBUaGUgbWV0aG9kIHswfSBkb2VzIG5vdCBvdmVycmlkZSB0aGUgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIHsxfSBzaW5jZSBpdCBpcyBwcml2YXRlIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UuCiA0MTEgPSBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBpbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kIHsxfSwgYnV0IGNhbm5vdCBvdmVycmlkZSBpdCBzaW5jZSBpdCBpcyBub3QgdmlzaWJsZSBmcm9tIHswfS4gRWl0aGVyIG1ha2UgdGhlIHR5cGUgYWJzdHJhY3Qgb3IgbWFrZSB0aGUgaW5oZXJpdGVkIG1ldGhvZCB2aXNpYmxlLgotNDEyID0gVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIGRlcHJlY2F0ZWQgbWV0aG9kIGZyb20gezB9Cis0MTIgPSBUaGUgbWV0aG9kIHswfSBvdmVycmlkZXMgYSBkZXByZWNhdGVkIG1ldGhvZCBmcm9tIHsxfQorNDEzID0gVGhlIHJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHswfSwgdGh1cyB0aGlzIGludGVyZmFjZSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQKKzQxNCA9IEV4Y2VwdGlvbiB7MH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aHJvd3MgY2xhdXNlIGluIHsxfSwgdGh1cyB0aGlzIGludGVyZmFjZSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQKIAogNDIwID0gQ29kZSBzbmlwcGV0IHN1cHBvcnQgY2Fubm90IGZpbmQgdGhlIGNsYXNzIHswfQogNDIxID0gQ29kZSBzbmlwcGV0IHN1cHBvcnQgY2Fubm90IGZpbmQgdGhlIG1ldGhvZCB7MH0uezF9KHsyfSkgCiA0MjIgPSBzdXBlciBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgY29kZSBzbmlwcGV0IGNvZGUKIAogNDMwID0gVG9vIG1hbnkgY29uc3RhbnRzLCB0aGUgY29uc3RhbnQgcG9vbCBmb3IgezB9IHdvdWxkIGV4Y2VlZCA2NTUzNiBlbnRyaWVzCis0MzEgPSBUaGUgdHlwZSBnZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCByZXF1aXJlcyBtb3JlIHRoYW4gNjU1MzUgYnl0ZXMgdG8gZW5jb2RlIGluIFV0ZjggZm9ybWF0IGluIHRoZSBjb25zdGFudCBwb29sCiAKLTQ0MCA9ICcnYXNzZXJ0Jycgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIsIHNpbmNlIGl0IGlzIGEgcmVzZXJ2ZWQga2V5d29yZCBmcm9tIHNvdXJjZSBsZXZlbCAxLjQgb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis0MzIgPSBUb28gbWFueSBmaWVsZHMgZm9yIHR5cGUgezB9LiBNYXhpbXVtIGlzIDY1NTM1Cis0MzMgPSBUb28gbWFueSBtZXRob2RzIGZvciB0eXBlIHswfS4gTWF4aW11bSBpcyA2NTUzNQorCis0NDAgPSAnJ2Fzc2VydCcnIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyLCBzaW5jZSBpdCBpcyBhIHJlc2VydmVkIGtleXdvcmQgZnJvbSBzb3VyY2UgbGV2ZWwgMS40IG9uCisKKzQ1MCA9IHswfSB7MX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0NoYXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MDYxZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9DaGFyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyT3BlcmF0aW9uIHsKLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGFwcGVuZChjaGFyW10gYXJyYXksIGNoYXIgc3VmZml4KXsKLQlpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIG5ldyBjaGFyW117c3VmZml4fTsKLQlpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIGFycmF5ID0gbmV3IGNoYXJbbGVuZ3RoKzFdLCAwLCBsZW5ndGgpOwotCWFycmF5W2xlbmd0aF09c3VmZml4OwotCXJldHVybiBhcnJheTsKLX0JCi0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gYXJyYXlDb25jYXQoY2hhcltdW10gZmlyc3QsIGNoYXJbXVtdIHNlY29uZCkgewotCWlmIChmaXJzdCA9PSBudWxsKQotCQlyZXR1cm4gc2Vjb25kOwotCWlmIChzZWNvbmQgPT0gbnVsbCkKLQkJcmV0dXJuIGZpcnN0OwotCi0JaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7Ci0JaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOwotCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aDEgKyBsZW5ndGgyXVtdOwotLyogaWYgd2UgZG8gbm90IHRydXN0IFN5c3RlbS5hcnJheWNvcHkgb24gb3VyIFZNIHdpdGggY2hhcltdW10ncwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGgxOyBpKyspCi0JCXJlc3VsdFtpXSA9IGZpcnN0W2ldOwotCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoMjsgaisrKQotCQlyZXN1bHRbaSsrXSA9IHNlY29uZFtqXTsKLSovCi0JU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKLQlTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxLCBsZW5ndGgyKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBhcnJheUNvbmNhdChjaGFyW11bXSBmaXJzdCwgY2hhcltdIHNlY29uZCkgewotCWlmIChzZWNvbmQgPT0gbnVsbCkKLQkJcmV0dXJuIGZpcnN0OwotCWlmIChmaXJzdCA9PSBudWxsKQotCQlyZXR1cm4gbmV3IGNoYXJbXVtdIHtzZWNvbmR9OwotCi0JaW50IGxlbmd0aCA9IGZpcnN0Lmxlbmd0aDsKLQljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggKyAxXVtdOwotLyogaWYgd2UgZG8gbm90IHRydXN0IFN5c3RlbS5hcnJheWNvcHkgb24gb3VyIFZNIHdpdGggY2hhcltdW10ncwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCXJlc3VsdFtpXSA9IGZpcnN0W2ldOwotKi8KLQlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0LCAwLCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JcmVzdWx0W2xlbmd0aF0gPSBzZWNvbmQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQpIHsKLQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJcmV0dXJuIHNlY29uZDsKLQlpZiAoc2Vjb25kID09IG51bGwpCi0JCXJldHVybiBmaXJzdDsKLQotCWludCBsZW5ndGgxID0gZmlyc3QubGVuZ3RoOwotCWludCBsZW5ndGgyID0gc2Vjb25kLmxlbmd0aDsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDJdOwotCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7Ci0JU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSwgbGVuZ3RoMik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQsIGNoYXJbXSB0aGlyZCkgewotCWlmIChmaXJzdCA9PSBudWxsKQotCQlyZXR1cm4gY29uY2F0KHNlY29uZCwgdGhpcmQpOwotCWlmIChzZWNvbmQgPT0gbnVsbCkKLQkJcmV0dXJuIGNvbmNhdChmaXJzdCwgdGhpcmQpOwotCWlmICh0aGlyZCA9PSBudWxsKQotCQlyZXR1cm4gY29uY2F0KGZpcnN0LCBzZWNvbmQpOwotCi0JaW50IGxlbmd0aDEgPSBmaXJzdC5sZW5ndGg7Ci0JaW50IGxlbmd0aDIgPSBzZWNvbmQubGVuZ3RoOwotCWludCBsZW5ndGgzID0gdGhpcmQubGVuZ3RoOwotCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGgxICsgbGVuZ3RoMiArIGxlbmd0aDNdOwotCVN5c3RlbS5hcnJheWNvcHkoZmlyc3QsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoMSk7Ci0JU3lzdGVtLmFycmF5Y29weShzZWNvbmQsIDAsIHJlc3VsdCwgbGVuZ3RoMSwgbGVuZ3RoMik7Ci0JU3lzdGVtLmFycmF5Y29weSh0aGlyZCwgMCwgcmVzdWx0LCBsZW5ndGgxICsgbGVuZ3RoMiwgbGVuZ3RoMyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyW10gZmlyc3QsIGNoYXJbXSBzZWNvbmQsIGNoYXIgc2VwYXJhdG9yKSB7Ci0JaWYgKGZpcnN0ID09IG51bGwpCi0JCXJldHVybiBzZWNvbmQ7Ci0JaWYgKHNlY29uZCA9PSBudWxsKQotCQlyZXR1cm4gZmlyc3Q7Ci0KLQlpbnQgbGVuZ3RoMSA9IGZpcnN0Lmxlbmd0aDsKLQlpZiAobGVuZ3RoMSA9PSAwKQotCQlyZXR1cm4gc2Vjb25kOwotCWludCBsZW5ndGgyID0gc2Vjb25kLmxlbmd0aDsKLQlpZiAobGVuZ3RoMiA9PSAwKQotCQlyZXR1cm4gZmlyc3Q7Ci0KLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0LCAwLCByZXN1bHQsIDAsIGxlbmd0aDEpOwotCXJlc3VsdFtsZW5ndGgxXSA9IHNlcGFyYXRvcjsKLQlTeXN0ZW0uYXJyYXljb3B5KHNlY29uZCwgMCwgcmVzdWx0LCBsZW5ndGgxICsgMSwgbGVuZ3RoMik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyW10gZmlyc3QsIGNoYXIgc2VwMSwgY2hhcltdIHNlY29uZCwgY2hhciBzZXAyLCBjaGFyW10gdGhpcmQpIHsKLQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJcmV0dXJuIGNvbmNhdChzZWNvbmQsIHRoaXJkLCBzZXAyKTsKLQlpZiAoc2Vjb25kID09IG51bGwpCi0JCXJldHVybiBjb25jYXQoZmlyc3QsIHRoaXJkLCBzZXAxKTsKLQlpZiAodGhpcmQgPT0gbnVsbCkKLQkJcmV0dXJuIGNvbmNhdChmaXJzdCwgc2Vjb25kLCBzZXAxKTsKLQotCWludCBsZW5ndGgxID0gZmlyc3QubGVuZ3RoOwotCWludCBsZW5ndGgyID0gc2Vjb25kLmxlbmd0aDsKLQlpbnQgbGVuZ3RoMyA9IHRoaXJkLmxlbmd0aDsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsgMl07Ci0JU3lzdGVtLmFycmF5Y29weShmaXJzdCwgMCwgcmVzdWx0LCAwLCBsZW5ndGgxKTsKLQlyZXN1bHRbbGVuZ3RoMV0gPSBzZXAxOwotCVN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLCAwLCByZXN1bHQsIGxlbmd0aDEgKyAxLCBsZW5ndGgyKTsKLQlyZXN1bHRbbGVuZ3RoMStsZW5ndGgyKzFdID0gc2VwMjsKLQlTeXN0ZW0uYXJyYXljb3B5KHRoaXJkLCAwLCByZXN1bHQsIGxlbmd0aDEgKyBsZW5ndGgyICsgMiwgbGVuZ3RoMyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdChjaGFyIHByZWZpeCwgY2hhcltdIGFycmF5LCBjaGFyIHN1ZmZpeCkgewotCWlmIChhcnJheSA9PSBudWxsKQotCQlyZXR1cm4gbmV3IGNoYXJbXSB7cHJlZml4LCBzdWZmaXh9OwotCi0JaW50IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoICsgMl07Ci0JcmVzdWx0WzBdID0gcHJlZml4OwotCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMSwgbGVuZ3RoKTsKLQlyZXN1bHRbbGVuZ3RoICsgMV0gPSBzdWZmaXg7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIGNvbmNhdFdpdGgoY2hhcltdIG5hbWUsIGNoYXJbXVtdIGFycmF5LCBjaGFyIHNlcGFyYXRvcikgewotCWludCBuYW1lTGVuZ3RoID0gbmFtZSA9PSBudWxsID8gMCA6IG5hbWUubGVuZ3RoOwotCWlmIChuYW1lTGVuZ3RoID09IDApCi0JCXJldHVybiBjb25jYXRXaXRoKGFycmF5LCBzZXBhcmF0b3IpOwotCi0JaW50IGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIG5hbWU7Ci0KLQlpbnQgc2l6ZSA9IG5hbWVMZW5ndGg7Ci0JaW50IGluZGV4ID0gbGVuZ3RoOwotCXdoaWxlICgtLWluZGV4ID49IDApCi0JCWlmIChhcnJheVtpbmRleF0ubGVuZ3RoID4gMCkKLQkJCXNpemUgKz0gYXJyYXlbaW5kZXhdLmxlbmd0aCArIDE7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3NpemVdOwotCWluZGV4ID0gc2l6ZTsKLQlmb3IgKGludCBpID0gbGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWludCBzdWJMZW5ndGggPSBhcnJheVtpXS5sZW5ndGg7Ci0JCWlmIChzdWJMZW5ndGggPiAwKSB7Ci0JCQlpbmRleCAtPSBzdWJMZW5ndGg7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5W2ldLCAwLCByZXN1bHQsIGluZGV4LCBzdWJMZW5ndGgpOwotCQkJcmVzdWx0Wy0taW5kZXhdID0gc2VwYXJhdG9yOwotCQl9Ci0JfQotCVN5c3RlbS5hcnJheWNvcHkobmFtZSwgMCwgcmVzdWx0LCAwLCBuYW1lTGVuZ3RoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0V2l0aChjaGFyW11bXSBhcnJheSwgY2hhcltdIG5hbWUsIGNoYXIgc2VwYXJhdG9yKSB7Ci0JaW50IG5hbWVMZW5ndGggPSBuYW1lID09IG51bGwgPyAwIDogbmFtZS5sZW5ndGg7Ci0JaWYgKG5hbWVMZW5ndGggPT0gMCkKLQkJcmV0dXJuIGNvbmNhdFdpdGgoYXJyYXksIHNlcGFyYXRvcik7Ci0KLQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7Ci0JaWYgKGxlbmd0aCA9PSAwKQotCQlyZXR1cm4gbmFtZTsKLQotCWludCBzaXplID0gbmFtZUxlbmd0aDsKLQlpbnQgaW5kZXggPSBsZW5ndGg7Ci0Jd2hpbGUgKC0taW5kZXggPj0gMCkKLQkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPiAwKQotCQkJc2l6ZSArPSBhcnJheVtpbmRleF0ubGVuZ3RoICsgMTsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc2l6ZV07Ci0JaW5kZXggPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJaW50IHN1Ykxlbmd0aCA9IGFycmF5W2ldLmxlbmd0aDsKLQkJaWYgKHN1Ykxlbmd0aCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXlbaV0sIDAsIHJlc3VsdCwgaW5kZXgsIHN1Ykxlbmd0aCk7Ci0JCQlpbmRleCArPSBzdWJMZW5ndGg7Ci0JCQlyZXN1bHRbaW5kZXgrK10gPSBzZXBhcmF0b3I7Ci0JCX0KLQl9Ci0JU3lzdGVtLmFycmF5Y29weShuYW1lLCAwLCByZXN1bHQsIGluZGV4LCBuYW1lTGVuZ3RoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gY29uY2F0V2l0aChjaGFyW11bXSBhcnJheSwgY2hhciBzZXBhcmF0b3IpIHsKLQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7Ci0JaWYgKGxlbmd0aCA9PSAwKQotCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5Ob0NoYXI7Ci0KLQlpbnQgc2l6ZSA9IGxlbmd0aCAtIDE7Ci0JaW50IGluZGV4ID0gbGVuZ3RoOwotCXdoaWxlICgtLWluZGV4ID49IDApIHsKLQkJaWYgKGFycmF5W2luZGV4XS5sZW5ndGggPT0gMCkKLQkJCXNpemUtLTsKLQkJZWxzZQotCQkJc2l6ZSArPSBhcnJheVtpbmRleF0ubGVuZ3RoOwotCX0KLQlpZiAoc2l6ZSA8PSAwKQotCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5Ob0NoYXI7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3NpemVdOwotCWluZGV4ID0gbGVuZ3RoOwotCXdoaWxlICgtLWluZGV4ID49IDApIHsKLQkJbGVuZ3RoID0gYXJyYXlbaW5kZXhdLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXlbaW5kZXhdLCAwLCByZXN1bHQsIChzaXplIC09IGxlbmd0aCksIGxlbmd0aCk7Ci0JCQlpZiAoLS1zaXplID49IDApCi0JCQkJcmVzdWx0W3NpemVdID0gc2VwYXJhdG9yOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnMoY2hhciBjaGFyYWN0ZXIsIGNoYXJbXVtdIGFycmF5KSB7Ci0JZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KSB7Ci0JCWNoYXJbXSBzdWJhcnJheSA9IGFycmF5W2ldOwotCQlmb3IgKGludCBqID0gc3ViYXJyYXkubGVuZ3RoOyAtLWogPj0gMDspCi0JCQlpZiAoc3ViYXJyYXlbal0gPT0gY2hhcmFjdGVyKQotCQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnMoY2hhciBjaGFyYWN0ZXIsIGNoYXJbXSBhcnJheSkgewotCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKGFycmF5W2ldID09IGNoYXJhY3RlcikKLQkJCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gZGVlcENvcHkoY2hhcltdW10gdG9Db3B5KSB7Ci0JaW50IHRvQ29weUxlbmd0aCA9IHRvQ29weS5sZW5ndGg7Ci0JY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbdG9Db3B5TGVuZ3RoXVtdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Db3B5TGVuZ3RoOyBpKyspIHsKLQkJY2hhcltdIHRvRWxlbWVudCA9IHRvQ29weVtpXTsKLQkJaW50IHRvRWxlbWVudExlbmd0aCA9IHRvRWxlbWVudC5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHRFbGVtZW50ID0gbmV3IGNoYXJbdG9FbGVtZW50TGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0b0VsZW1lbnQsIDAsIHJlc3VsdEVsZW1lbnQsIDAsIHRvRWxlbWVudExlbmd0aCk7Ci0JCXJlc3VsdFtpXSA9IHJlc3VsdEVsZW1lbnQ7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlbmRzV2l0aChjaGFyW10gYXJyYXksIGNoYXJbXSB0b0JlRm91bmQpIHsKLQlpbnQgaSA9IHRvQmVGb3VuZC5sZW5ndGg7Ci0JaW50IGogPSBhcnJheS5sZW5ndGggLSBpOwotCQotCWlmIChqIDwgMCkKLQkJcmV0dXJuIGZhbHNlOwotCXdoaWxlICgtLWkgPj0gMCkKLQkJaWYgKHRvQmVGb3VuZFtpXSAhPSBhcnJheVtpICsgal0pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdW10gZmlyc3QsIGNoYXJbXVtdIHNlY29uZCkgewotCWlmIChmaXJzdCA9PSBzZWNvbmQpCi0JCXJldHVybiB0cnVlOwotCWlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlmb3IgKGludCBpID0gZmlyc3QubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICghZXF1YWxzKGZpcnN0W2ldLCBzZWNvbmRbaV0pKQotCQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGVxdWFscyhjaGFyW11bXSBmaXJzdCwgY2hhcltdW10gc2Vjb25kLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCi0JaWYgKGlzQ2FzZVNlbnNpdGl2ZSl7Ci0JCXJldHVybiBlcXVhbHMoZmlyc3QsIHNlY29uZCk7Ci0JfQotCWlmIChmaXJzdCA9PSBzZWNvbmQpCi0JCXJldHVybiB0cnVlOwotCWlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlmb3IgKGludCBpID0gZmlyc3QubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmICghZXF1YWxzKGZpcnN0W2ldLCBzZWNvbmRbaV0sIGZhbHNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kKSB7Ci0JaWYgKGZpcnN0ID09IHNlY29uZCkKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAoZmlyc3QubGVuZ3RoICE9IHNlY29uZC5sZW5ndGgpCi0JCXJldHVybiBmYWxzZTsKLQotCWZvciAoaW50IGkgPSBmaXJzdC5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKGZpcnN0W2ldICE9IHNlY29uZFtpXSkKLQkJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGZpcnN0LCBjaGFyW10gc2Vjb25kLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCi0JaWYgKGlzQ2FzZVNlbnNpdGl2ZSl7Ci0JCXJldHVybiBlcXVhbHMoZmlyc3QsIHNlY29uZCk7Ci0JfQotCWlmIChmaXJzdCA9PSBzZWNvbmQpCi0JCXJldHVybiB0cnVlOwotCWlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlmb3IgKGludCBpID0gZmlyc3QubGVuZ3RoOyAtLWkgPj0gMDspCi0JCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoZmlyc3RbaV0pICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWNvbmRbaV0pKQotCQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGZyYWdtZW50RXF1YWxzKGNoYXJbXSBmcmFnbWVudCwgY2hhcltdIG5hbWUsIGludCBzdGFydEluZGV4LCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCi0JaW50IG1heCA9IGZyYWdtZW50Lmxlbmd0aDsKLQlpZiAobmFtZS5sZW5ndGggPCBtYXgrc3RhcnRJbmRleCkgcmV0dXJuIGZhbHNlOwotCWlmIChpc0Nhc2VTZW5zaXRpdmUpewotCQlmb3IgKGludCBpID0gbWF4OyAtLWkgPj0gMDspIC8vIGFzc3VtZXMgdGhlIHByZWZpeCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIG5hbWUKLQkJCWlmIChmcmFnbWVudFtpXSAhPSBuYW1lW2kgKyBzdGFydEluZGV4XSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlmb3IgKGludCBpID0gbWF4OyAtLWkgPj0gMDspIC8vIGFzc3VtZXMgdGhlIHByZWZpeCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIG5hbWUKLQkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShmcmFnbWVudFtpXSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaSArIHN0YXJ0SW5kZXhdKSkKLQkJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhc2hDb2RlKGNoYXJbXSBhcnJheSkgewotCWludCBoYXNoID0gMDsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlpbnQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCWlmIChsZW5ndGggPCAxNikgewotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpID4gMDsgaS0tKQotCQkJaGFzaCA9IChoYXNoICogMzcpICsgYXJyYXlbb2Zmc2V0KytdOwotCX0gZWxzZSB7Ci0JCS8vIG9ubHkgc2FtcGxlIHNvbWUgY2hhcmFjdGVycwotCQlpbnQgc2tpcCA9IGxlbmd0aCAvIDg7Ci0JCWZvciAoaW50IGkgPSBsZW5ndGg7IGkgPiAwOyBpIC09IHNraXAsIG9mZnNldCArPSBza2lwKQotCQkJaGFzaCA9IChoYXNoICogMzkpICsgYXJyYXlbb2Zmc2V0XTsKLQl9Ci0JcmV0dXJuIGhhc2ggJiAweDdGRkZGRkZGOwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLQkJaWYgKHRvQmVGb3VuZCA9PSBhcnJheVtpXSkKLQkJCXJldHVybiBpOwotCXJldHVybiAtMTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGluZGV4T2YoY2hhciB0b0JlRm91bmQsIGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0JCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCi0JCQlyZXR1cm4gaTsKLQlyZXR1cm4gLTE7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7Ci0JZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgLS1pID49IDA7KQotCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKQotCQkJcmV0dXJuIGk7Ci0JcmV0dXJuIC0xOwotfQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGFzdEluZGV4T2YoY2hhciB0b0JlRm91bmQsIGNoYXJbXSBhcnJheSwgaW50IHN0YXJ0SW5kZXgpIHsKLQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyAtLWkgPj0gc3RhcnRJbmRleDspCi0JCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCi0JCQlyZXR1cm4gaTsKLQlyZXR1cm4gLTE7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXN0SW5kZXhPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JZm9yIChpbnQgaSA9IGVuZEluZGV4OyAtLWkgPj0gc3RhcnRJbmRleDspCi0JCWlmICh0b0JlRm91bmQgPT0gYXJyYXlbaV0pCi0JCQlyZXR1cm4gaTsKLQlyZXR1cm4gLTE7Ci19Ci0vKioKLSAqIEFuc3dlciB0aGUgbGFzdCBwb3J0aW9uIG9mIGEgbmFtZSBnaXZlbiBhIHNlcGFyYXRvcgotICogZS5nLiBsYXN0U2VnbWVudCgiamF2YS5sYW5nLk9iamVjdCIudG9DaGFyQXJyYXkoKSwnLicpIC0tPiBPYmplY3QKLSAqLwotZmluYWwgc3RhdGljIHB1YmxpYyBjaGFyW10gbGFzdFNlZ21lbnQoY2hhcltdIGFycmF5LCBjaGFyIHNlcGFyYXRvcikgewotCWludCBwb3MgPSBsYXN0SW5kZXhPZihzZXBhcmF0b3IsIGFycmF5KTsKLQlpZiAocG9zIDwgMCkgcmV0dXJuIGFycmF5OwotCXJldHVybiBzdWJhcnJheShhcnJheSwgcG9zKzEsIGFycmF5Lmxlbmd0aCk7Ci19Ci0vKioKLSAqIGNoYXJbXSBwYXR0ZXJuIG1hdGNoaW5nLCBhY2NlcHRpbmcgd2lsZC1jYXJkcyAnKicuCi0gKgotICogV2hlbiBub3QgY2FzZSBzZW5zaXRpdmUsIHRoZSBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBsb3dlcmNhc2VkLCB0aGUKLSAqIG5hbWUgd2lsbCBiZSBsb3dlcmNhc2VkIGNoYXJhY3RlciBwZXIgY2hhcmFjdGVyIGFzIGNvbXBhcmluZy4KLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIG1hdGNoKGNoYXJbXSBwYXR0ZXJuLCBjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQotCWlmIChuYW1lID09IG51bGwpIHJldHVybiBmYWxzZTsgLy8gbnVsbCBuYW1lIGNhbm5vdCBtYXRjaAotCWlmIChwYXR0ZXJuID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBudWxsIHBhdHRlcm4gaXMgZXF1aXZhbGVudCB0byAnKicKLQlpbnQgaVBhdHRlcm4gPSAwLCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7Ci0JaW50IGlOYW1lID0gMCwgbmFtZUxlbmd0aCA9IG5hbWUubGVuZ3RoOwotCi0JLyogY2hlY2sgZmlyc3Qgc2VnbWVudCAqLwotCWNoYXIgcGF0dGVybkNoYXIgPSAwOwotCXdoaWxlICgoaVBhdHRlcm4gPCBwYXR0ZXJuTGVuZ3RoKSAmJiAocGF0dGVybkNoYXIgPSBwYXR0ZXJuW2lQYXR0ZXJuXSkgIT0gJyonKXsKLQkJaWYgKGlOYW1lID09IG5hbWVMZW5ndGgpIHJldHVybiBmYWxzZTsKLQkJaWYgKHBhdHRlcm5DaGFyICE9IChpc0Nhc2VTZW5zaXRpdmUgCi0JCQkJCQkJCT8gbmFtZVtpTmFtZV0gCi0JCQkJCQkJCTogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaU5hbWVdKSkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlOYW1lKys7Ci0JCWlQYXR0ZXJuKys7Ci0JfQotCS8qIGNoZWNrIHNlcXVlbmNlIG9mIHN0YXIrc2VnbWVudCAqLwotCWludCBzZWdtZW50U3RhcnQ7Ci0JaWYgKHBhdHRlcm5DaGFyID09ICcqJyl7Ci0JCXNlZ21lbnRTdGFydCA9ICsraVBhdHRlcm47IC8vIHNraXAgc3RhcgotCX0gZWxzZSB7Ci0JCXNlZ21lbnRTdGFydCA9IDA7IC8vIGZvcmNlIGlOYW1lIGNoZWNrCi0JfQotCWludCBwcmVmaXhTdGFydCA9IGlOYW1lOwotCWNoZWNrU2VnbWVudDogd2hpbGUgKGlOYW1lIDwgbmFtZUxlbmd0aCAmJiBpUGF0dGVybiA8IHBhdHRlcm5MZW5ndGgpewotCQkvKiBzZWdtZW50IGlzIGVuZGluZyAqLwotCQlpZiAoKHBhdHRlcm5DaGFyID0gcGF0dGVybltpUGF0dGVybl0pID09ICcqJyl7Ci0JCQlzZWdtZW50U3RhcnQgPSArK2lQYXR0ZXJuOyAvLyBza2lwIHN0YXJ0Ci0JCQlwcmVmaXhTdGFydCA9IGlOYW1lOwotCQkJY29udGludWUgY2hlY2tTZWdtZW50OwotCQl9Ci0JCS8qIGNoZWNoIGN1cnJlbnQgbmFtZSBjaGFyYWN0ZXIgKi8KLQkJaWYgKChpc0Nhc2VTZW5zaXRpdmUgCi0JCQkJPyBuYW1lW2lOYW1lXSAKLQkJCQk6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lW2lOYW1lXSkpIT0gcGF0dGVybkNoYXIpewotCQkJaVBhdHRlcm4gPSBzZWdtZW50U3RhcnQ7IC8vIG1pc21hdGNoIC0gcmVzdGFydCBjdXJyZW50IHNlZ21lbnQKLQkJCWlOYW1lID0gKytwcmVmaXhTdGFydDsKLQkJCWNvbnRpbnVlIGNoZWNrU2VnbWVudDsKLQkJfQotCQlpTmFtZSsrOwotCQlpUGF0dGVybisrOwotCX0KLQotCXJldHVybiAoc2VnbWVudFN0YXJ0ID09IHBhdHRlcm5MZW5ndGgpCi0JCQl8fCAoaU5hbWUgPT0gbmFtZUxlbmd0aCAmJiBpUGF0dGVybiA9PSBwYXR0ZXJuTGVuZ3RoKQkKLQkJCXx8IChpUGF0dGVybiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSAmJiBwYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnKicpOyAKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9jY3VyZW5jZXNPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5KSB7Ci0JaW50IGNvdW50ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKSBjb3VudCsrOwotCXJldHVybiBjb3VudDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9jY3VyZW5jZXNPZihjaGFyIHRvQmVGb3VuZCwgY2hhcltdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQlpbnQgY291bnQgPSAwOwotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQotCQlpZiAodG9CZUZvdW5kID09IGFycmF5W2ldKSBjb3VudCsrOwotCXJldHVybiBjb3VudDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcmVmaXhFcXVhbHMoY2hhcltdIHByZWZpeCwgY2hhcltdIG5hbWUpIHsKLQotCWludCBtYXggPSBwcmVmaXgubGVuZ3RoOwotCWlmIChuYW1lLmxlbmd0aCA8IG1heCkgcmV0dXJuIGZhbHNlOwotCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQotCQlpZiAocHJlZml4W2ldICE9IG5hbWVbaV0pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcHJlZml4RXF1YWxzKGNoYXJbXSBwcmVmaXgsIGNoYXJbXSBuYW1lLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCi0JaW50IG1heCA9IHByZWZpeC5sZW5ndGg7Ci0JaWYgKG5hbWUubGVuZ3RoIDwgbWF4KSByZXR1cm4gZmFsc2U7Ci0JaWYgKGlzQ2FzZVNlbnNpdGl2ZSl7Ci0JCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQotCQkJaWYgKHByZWZpeFtpXSAhPSBuYW1lW2ldKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCWZvciAoaW50IGkgPSBtYXg7IC0taSA+PSAwOykgLy8gYXNzdW1lcyB0aGUgcHJlZml4IGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbmFtZQotCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHByZWZpeFtpXSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVbaV0pKQotCQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlcGxhY2UoCi0JY2hhcltdIGFycmF5LCAKLQljaGFyIHRvQmVSZXBsYWNlZCwgCi0JY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQlpZiAodG9CZVJlcGxhY2VkICE9IHJlcGxhY2VtZW50Q2hhcikgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJyYXkubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSB0b0JlUmVwbGFjZWQpCi0JCQkJYXJyYXlbaV0gPSByZXBsYWNlbWVudENoYXI7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIGEgY2hhcltdIHdpdGggc3Vic3RpdHV0aW9ucy4gTm8gc2lkZS1lZmZlY3QgaXMgb3BlcmF0ZWQgb24gdGhlIG9yaWdpbmFsCi0gKiBhcnJheSwgaW4gY2FzZSBubyBzdWJzdGl0dXRpb24gaGFwcGVuZWQsIHRoZW4gdGhlIHJlc3VsdCBtaWdodCBiZSB0aGUgc2FtZSBhcyB0aGUKLSAqIG9yaWdpbmFsIG9uZS4KLSAqIAotICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSByZXBsYWNlKAotCWNoYXJbXSBhcnJheSwgCi0JY2hhcltdIHRvQmVSZXBsYWNlZCwgCi0JY2hhcltdIHJlcGxhY2VtZW50Q2hhcnMpIHsKLQotCi0JaW50IG1heCA9IGFycmF5Lmxlbmd0aDsKLQlpbnQgcmVwbGFjZWRMZW5ndGggPSB0b0JlUmVwbGFjZWQubGVuZ3RoOwotCWludCByZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50Q2hhcnMubGVuZ3RoOwotCi0JaW50W10gc3RhcnRzID0gbmV3IGludFs1XTsKLQlpbnQgb2NjdXJyZW5jZUNvdW50ID0gMDsKLQkKLQlpZiAoIWVxdWFscyh0b0JlUmVwbGFjZWQscmVwbGFjZW1lbnRDaGFycykpIHsKLQkJCi0JCW5leHQ6IGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWludCBqID0gMDsKLQkJCXdoaWxlIChqIDwgcmVwbGFjZWRMZW5ndGgpewotCQkJCWlmIChpK2ogPT0gbWF4KSBjb250aW51ZSBuZXh0OwotCQkJCWlmIChhcnJheVtpICsgal0gIT0gdG9CZVJlcGxhY2VkW2orK10pIGNvbnRpbnVlIG5leHQ7Ci0JCQl9Ci0JCQlpZiAob2NjdXJyZW5jZUNvdW50ID09IHN0YXJ0cy5sZW5ndGgpewotCQkJCVN5c3RlbS5hcnJheWNvcHkoc3RhcnRzLCAwLCBzdGFydHMgPSBuZXcgaW50W29jY3VycmVuY2VDb3VudCAqIDJdLCAwLCBvY2N1cnJlbmNlQ291bnQpOwotCQkJfQotCQkJc3RhcnRzW29jY3VycmVuY2VDb3VudCsrXSA9IGk7Ci0JCX0KLQl9Ci0JaWYgKG9jY3VycmVuY2VDb3VudCA9PSAwKSByZXR1cm4gYXJyYXk7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW21heCArIG9jY3VycmVuY2VDb3VudCAqIChyZXBsYWNlbWVudExlbmd0aCAtIHJlcGxhY2VkTGVuZ3RoKV07Ci0JaW50IGluU3RhcnQgPSAwLCBvdXRTdGFydCA9IDA7Ci0JZm9yKCBpbnQgaSA9IDA7IGkgPCBvY2N1cnJlbmNlQ291bnQ7IGkrKyl7Ci0JCWludCBvZmZzZXQgPSBzdGFydHNbaV0gLSBpblN0YXJ0OwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpblN0YXJ0LCByZXN1bHQsIG91dFN0YXJ0LCBvZmZzZXQpOwotCQlpblN0YXJ0ICs9IG9mZnNldDsKLQkJb3V0U3RhcnQgKz0gb2Zmc2V0OwotCQlTeXN0ZW0uYXJyYXljb3B5KHJlcGxhY2VtZW50Q2hhcnMsIDAsIHJlc3VsdCwgb3V0U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJaW5TdGFydCArPSByZXBsYWNlZExlbmd0aDsKLQkJb3V0U3RhcnQgKz0gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluU3RhcnQsIHJlc3VsdCwgb3V0U3RhcnQsIG1heCAtIGluU3RhcnQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3BsaXRBbmRUcmltT24oY2hhciBkaXZpZGVyLCBjaGFyW10gYXJyYXkpIHsKLQlpbnQgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7Ci0JaWYgKGxlbmd0aCA9PSAwKQotCQlyZXR1cm4gVHlwZUNvbnN0YW50cy5Ob0NoYXJDaGFyOwotCi0JaW50IHdvcmRDb3VudCA9IDE7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpCi0JCQl3b3JkQ291bnQrKzsKLQljaGFyW11bXSBzcGxpdCA9IG5ldyBjaGFyW3dvcmRDb3VudF1bXTsKLQlpbnQgbGFzdCA9IDAsIGN1cnJlbnRXb3JkID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChhcnJheVtpXSA9PSBkaXZpZGVyKSB7Ci0JCQlpbnQgc3RhcnQgPSBsYXN0LCBlbmQgPSBpIC0gMTsKLQkJCXdoaWxlIChzdGFydCA8IGkgJiYgYXJyYXlbc3RhcnRdID09ICcgJykgc3RhcnQrKzsKLQkJCXdoaWxlIChlbmQgPiBzdGFydCAmJiBhcnJheVtlbmRdID09ICcgJykgZW5kLS07Ci0JCQlzcGxpdFtjdXJyZW50V29yZF0gPSBuZXcgY2hhcltlbmQgLSBzdGFydCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHNwbGl0W2N1cnJlbnRXb3JkKytdLCAwLCBlbmQgLSBzdGFydCArIDEpOwotCQkJbGFzdCA9IGkgKyAxOwotCQl9Ci0JfQotCWludCBzdGFydCA9IGxhc3QsIGVuZCA9IGxlbmd0aCAtIDE7Ci0Jd2hpbGUgKHN0YXJ0IDwgbGVuZ3RoICYmIGFycmF5W3N0YXJ0XSA9PSAnICcpIHN0YXJ0Kys7Ci0Jd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIGFycmF5W2VuZF0gPT0gJyAnKSBlbmQtLTsKLQlzcGxpdFtjdXJyZW50V29yZF0gPSBuZXcgY2hhcltlbmQgLSBzdGFydCArIDFdOwotCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCBzcGxpdFtjdXJyZW50V29yZCsrXSwgMCwgZW5kIC0gc3RhcnQgKyAxKTsKLQlyZXR1cm4gc3BsaXQ7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdW10gc3BsaXRPbihjaGFyIGRpdmlkZXIsIGNoYXJbXSBhcnJheSkgewotCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKLQlpZiAobGVuZ3RoID09IDApCi0JCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXI7Ci0KLQlpbnQgd29yZENvdW50ID0gMTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQlpZiAoYXJyYXlbaV0gPT0gZGl2aWRlcikKLQkJCXdvcmRDb3VudCsrOwotCWNoYXJbXVtdIHNwbGl0ID0gbmV3IGNoYXJbd29yZENvdW50XVtdOwotCWludCBsYXN0ID0gMCwgY3VycmVudFdvcmQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpIHsKLQkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2kgLSBsYXN0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGxhc3QsIHNwbGl0W2N1cnJlbnRXb3JkKytdLCAwLCBpIC0gbGFzdCk7Ci0JCQlsYXN0ID0gaSArIDE7Ci0JCX0KLQl9Ci0Jc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbbGVuZ3RoIC0gbGFzdF07Ci0JU3lzdGVtLmFycmF5Y29weShhcnJheSwgbGFzdCwgc3BsaXRbY3VycmVudFdvcmRdLCAwLCBsZW5ndGggLSBsYXN0KTsKLQlyZXR1cm4gc3BsaXQ7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIHNwbGl0T24oY2hhciBkaXZpZGVyLCBjaGFyW10gYXJyYXksIGludCBzdGFydCwgaW50IGVuZCkgewotCWludCBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKLQlpZiAobGVuZ3RoID09IDAgfHwgc3RhcnQgPiBlbmQpCi0JCXJldHVybiBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXI7Ci0KLQlpbnQgd29yZENvdW50ID0gMTsKLQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykKLQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpCi0JCQl3b3JkQ291bnQrKzsKLQljaGFyW11bXSBzcGxpdCA9IG5ldyBjaGFyW3dvcmRDb3VudF1bXTsKLQlpbnQgbGFzdCA9IHN0YXJ0LCBjdXJyZW50V29yZCA9IDA7Ci0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLQkJaWYgKGFycmF5W2ldID09IGRpdmlkZXIpIHsKLQkJCXNwbGl0W2N1cnJlbnRXb3JkXSA9IG5ldyBjaGFyW2kgLSBsYXN0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGxhc3QsIHNwbGl0W2N1cnJlbnRXb3JkKytdLCAwLCBpIC0gbGFzdCk7Ci0JCQlsYXN0ID0gaSArIDE7Ci0JCX0KLQl9Ci0Jc3BsaXRbY3VycmVudFdvcmRdID0gbmV3IGNoYXJbZW5kIC0gbGFzdCArIDFdOwotCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGxhc3QsIHNwbGl0W2N1cnJlbnRXb3JkXSwgMCwgZW5kIC0gbGFzdCArIDEpOwotCXJldHVybiBzcGxpdDsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdGFydHNXaXRoKGNoYXJbXSBhcnJheSwgY2hhcltdIHRvQmVGb3VuZCkgewotCWludCBpID0gdG9CZUZvdW5kLmxlbmd0aDsKLQlpZiAoaSA+IGFycmF5Lmxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCXdoaWxlICgtLWkgPj0gMCkKLQkJaWYgKHRvQmVGb3VuZFtpXSAhPSBhcnJheVtpXSkKLQkJCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qCi0gKiBjb3BpZXMgZnJvbSBhcnJheVtzdGFydF0gdGhyb3VnaCBhcnJheVtlbmQgLSAxXSAoZG9lcyBub3QgY29weSBhcnJheVtlbmRdKQotICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXVtdIHN1YmFycmF5KGNoYXJbXVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQlpZiAoZW5kID09IC0xKSBlbmQgPSBhcnJheS5sZW5ndGg7Ci0JaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gbnVsbDsKLQlpZiAoc3RhcnQgPCAwKSByZXR1cm4gbnVsbDsKLQlpZiAoZW5kID4gYXJyYXkubGVuZ3RoKSByZXR1cm4gbnVsbDsKLQotCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2VuZCAtIHN0YXJ0XVtdOwotLyogaWYgd2UgZG8gbm90IHRydXN0IFN5c3RlbS5hcnJheWNvcHkgb24gb3VyIFZNIHdpdGggY2hhcltdW10ncwotCWZvciAoaW50IGkgPSAwLCBzID0gc3RhcnQ7IHMgPCBlbmQ7IGkrKywgcysrKQotCQlyZXN1bHRbaV0gPSBhcnJheVtzXTsKLSovCi0JU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHJlc3VsdCwgMCwgZW5kIC0gc3RhcnQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vKgotICogY29waWVzIGZyb20gYXJyYXlbc3RhcnRdIHRocm91Z2ggYXJyYXlbZW5kIC0gMV0gKGRvZXMgbm90IGNvcHkgYXJyYXlbZW5kXSkKLSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gc3ViYXJyYXkoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQlpZiAoZW5kID09IC0xKSBlbmQgPSBhcnJheS5sZW5ndGg7Ci0JaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gbnVsbDsKLQlpZiAoc3RhcnQgPCAwKSByZXR1cm4gbnVsbDsKLQlpZiAoZW5kID4gYXJyYXkubGVuZ3RoKSByZXR1cm4gbnVsbDsKLQotCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07Ci0JU3lzdGVtLmFycmF5Y29weShhcnJheSwgc3RhcnQsIHJlc3VsdCwgMCwgZW5kIC0gc3RhcnQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqCUFuc3dlcnMgdGhlIHJlc3VsdCBvZiBhIGNoYXJbXSBjb252ZXJzaW9uIHRvIGxvd2VyY2FzZS4KLSAqCU5PVEU6IGlmIG5vIGNvbnZlcnNpb24gd2FzIG5lY2Vzc2FyeSwgdGhlbiBhbnN3ZXJzIGJhY2sgdGhlIGFyZ3VtZW50IG9uZS4KLSAqLwotZmluYWwgc3RhdGljIHB1YmxpYyBjaGFyW10gdG9Mb3dlckNhc2UoY2hhcltdIGNoYXJzKSB7Ci0JaWYgKGNoYXJzID09IG51bGwpIHJldHVybiBudWxsOwotCWludCBsZW5ndGggPSBjaGFycy5sZW5ndGg7Ci0JY2hhcltdIGxvd2VyQ2hhcnMgPSBudWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspewotCQljaGFyIGMgPSBjaGFyc1tpXTsKLQkJY2hhciBsYyA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKTsKLQkJaWYgKChjICE9IGxjKSB8fCAobG93ZXJDaGFycyAhPSBudWxsKSl7Ci0JCQlpZiAobG93ZXJDaGFycyA9PSBudWxsKXsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNoYXJzLCAwLCBsb3dlckNoYXJzID0gbmV3IGNoYXJbbGVuZ3RoXSwgMCwgaSk7Ci0JCQl9Ci0JCQlsb3dlckNoYXJzW2ldID0gbGM7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxvd2VyQ2hhcnMgPT0gbnVsbCA/IGNoYXJzIDogbG93ZXJDaGFyczsKLX0KLQotLyoqCi0gKiBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzCi0gKi8KLWZpbmFsIHN0YXRpYyBwdWJsaWMgY2hhcltdIHRyaW0oY2hhcltdIGNoYXJzKXsKLQkKLQlpZiAoY2hhcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JY2hhcltdIHJlc3VsdCA9IGNoYXJzOwotCWludCBzdGFydCA9IDAsIGxlbmd0aCA9IGNoYXJzLmxlbmd0aCwgZW5kID0gbGVuZ3RoIC0gMTsKLQl3aGlsZSAoc3RhcnQgPCBsZW5ndGggJiYgY2hhcnNbc3RhcnRdID09ICcgJykgewotCQlzdGFydCsrOwotCX0KLQl3aGlsZSAoZW5kID4gc3RhcnQgJiYgY2hhcnNbZW5kXSA9PSAnICcpewotCQllbmQtLTsKLQl9Ci0JaWYgKHN0YXJ0ICE9IDAgfHwgZW5kICE9IGxlbmd0aCAtIDEpewotCQlyZXR1cm4gc3ViYXJyYXkoY2hhcnMsIHN0YXJ0LCBlbmQrMSk7Ci0JfQotCXJldHVybiBjaGFyczsKLX0KLWZpbmFsIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXVtdIGFycmF5KSB7Ci0JY2hhcltdIHJlc3VsdCA9IGNvbmNhdFdpdGgoYXJyYXksICcuJyk7Ci0JaWYgKHJlc3VsdCA9PSBudWxsKQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvQ29tcG91bmROYW1lVmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YQppbmRleCAxNDAzY2EzLi5hZmFlMDQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9Db21wb3VuZE5hbWVWZWN0b3IuamF2YQpAQCAtMSwxNSArMSwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogcHVibGljIGZpbmFsIGNsYXNzIENvbXBvdW5kTmFtZVZlY3RvciB7CiAJc3RhdGljIGludCBJTklUSUFMX1NJWkUgPSAxMDsKICAgICAKQEAgLTY2LDQgKzY4LDQgQEAKIAl9CiAJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkludC5qYXZhCmluZGV4IDJkMTEyYTYuLjE4Y2YwYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mSW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZJbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogIAogIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZMb25nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZkxvbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZkN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZMb25nLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbDsKKyAKKyAvKioKKyAgKglIYXNodGFibGUgZm9yIG5vbi16ZXJvIGxvbmcga2V5cy4KKyAgKi8KKyAgCitwdWJsaWMgZmluYWwgY2xhc3MgSGFzaHRhYmxlT2ZMb25nIHsKKwkvLyB0byBhdm9pZCB1c2luZyBFbnVtZXJhdGlvbnMsIHdhbGsgdGhlIGluZGl2aWR1YWwgdGFibGVzIHNraXBwaW5nIG51bGxzCisJcHVibGljIGxvbmdbXSBrZXlUYWJsZTsKKwlwdWJsaWMgT2JqZWN0W10gdmFsdWVUYWJsZTsKKworCWludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQorCWludCB0aHJlc2hvbGQ7CitwdWJsaWMgSGFzaHRhYmxlT2ZMb25nKCkgeworCXRoaXMoMTMpOworfQorcHVibGljIEhhc2h0YWJsZU9mTG9uZyhpbnQgc2l6ZSkgeworCXRoaXMuZWxlbWVudFNpemUgPSAwOworCXRoaXMudGhyZXNob2xkID0gc2l6ZTsgLy8gc2l6ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMKKwlpbnQgZXh0cmFSb29tID0gKGludCkgKHNpemUgKiAxLjc1Zik7CisJaWYgKHRoaXMudGhyZXNob2xkID09IGV4dHJhUm9vbSkKKwkJZXh0cmFSb29tKys7CisJdGhpcy5rZXlUYWJsZSA9IG5ldyBsb25nW2V4dHJhUm9vbV07CisJdGhpcy52YWx1ZVRhYmxlID0gbmV3IE9iamVjdFtleHRyYVJvb21dOworfQorcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkobG9uZyBrZXkpIHsKKwlpbnQgaW5kZXggPSAoKGludCkoa2V5ID4+PiAzMikpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJbG9uZyBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaW5kZXggPSAoaW5kZXggKyAxKSAlIGtleVRhYmxlLmxlbmd0aDsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorcHVibGljIE9iamVjdCBnZXQobG9uZyBrZXkpIHsKKwlpbnQgaW5kZXggPSAoKGludCkoa2V5ID4+PiAzMikpICUgdmFsdWVUYWJsZS5sZW5ndGg7CisJbG9uZyBjdXJyZW50S2V5OworCXdoaWxlICgoY3VycmVudEtleSA9IGtleVRhYmxlW2luZGV4XSkgIT0gMCkgeworCQlpZiAoY3VycmVudEtleSA9PSBrZXkpICByZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07CisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7CisJfQorCXJldHVybiBudWxsOworfQorcHVibGljIE9iamVjdCBwdXQobG9uZyBrZXksIE9iamVjdCB2YWx1ZSkgeworCWludCBpbmRleCA9ICgoaW50KShrZXkgPj4+IDMyKSkgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKKwlsb25nIGN1cnJlbnRLZXk7CisJd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSAwKSB7CisJCWlmIChjdXJyZW50S2V5ID09IGtleSkgIHJldHVybiB2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOworCQlpbmRleCA9IChpbmRleCArIDEpICUga2V5VGFibGUubGVuZ3RoOworCX0KKwlrZXlUYWJsZVtpbmRleF0gPSBrZXk7CisJdmFsdWVUYWJsZVtpbmRleF0gPSB2YWx1ZTsKKworCS8vIGFzc3VtZXMgdGhlIHRocmVzaG9sZCBpcyBuZXZlciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgdGFibGUKKwlpZiAoKytlbGVtZW50U2l6ZSA+IHRocmVzaG9sZCkKKwkJcmVoYXNoKCk7CisJcmV0dXJuIHZhbHVlOworfQorcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKKwlIYXNodGFibGVPZkxvbmcgbmV3SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZU9mTG9uZyhlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cworCWxvbmcgY3VycmVudEtleTsKKwlmb3IgKGludCBpID0ga2V5VGFibGUubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmICgoY3VycmVudEtleSA9IGtleVRhYmxlW2ldKSAhPSAwKQorCQkJbmV3SGFzaHRhYmxlLnB1dChjdXJyZW50S2V5LCB2YWx1ZVRhYmxlW2ldKTsKKworCXRoaXMua2V5VGFibGUgPSBuZXdIYXNodGFibGUua2V5VGFibGU7CisJdGhpcy52YWx1ZVRhYmxlID0gbmV3SGFzaHRhYmxlLnZhbHVlVGFibGU7CisJdGhpcy50aHJlc2hvbGQgPSBuZXdIYXNodGFibGUudGhyZXNob2xkOworfQorcHVibGljIGludCBzaXplKCkgeworCXJldHVybiBlbGVtZW50U2l6ZTsKK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAorCU9iamVjdCBvYmplY3Q7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCWlmICgob2JqZWN0ID0gdmFsdWVUYWJsZVtpXSkgIT0gbnVsbCkKKwkJCXMgKz0ga2V5VGFibGVbaV0gKyAiIC0+ICIgKyBvYmplY3QudG9TdHJpbmcoKSArICJcbiI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAorCXJldHVybiBzOworfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mT2JqZWN0LmphdmEKaW5kZXggYjgzNjVkZi4uMGRiMGMyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZk9iamVjdC5qYXZhCkBAIC0xLDE1ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworCiAvKioKICAqIEhhc2h0YWJsZSBvZiB7Y2hhcltdIC0tPiBPYmplY3QgfQogICovCkBAIC0xNDUsNCArMTQ3LDQgQEAKIAkJCQlzICs9IG5ldyBTdHJpbmcoa2V5VGFibGVbaV0pICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mUGFja2FnZS5qYXZhCmluZGV4IGQxZjEzYmUuLmVjMDZlMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mUGFja2FnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL0hhc2h0YWJsZU9mUGFja2FnZS5qYXZhCkBAIC0xLDE1ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNodGFibGVPZlBhY2thZ2UgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvSGFzaHRhYmxlT2ZUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlR5cGUuamF2YQppbmRleCBjNDdkYTliLi45OThjMGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9IYXNodGFibGVPZlR5cGUuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBIYXNodGFibGVPZlR5cGUgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvT2JqZWN0VmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YQppbmRleCBiYzE0YTA2Li5lMDlhZTAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9PYmplY3RWZWN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0VmVjdG9yIHsKQEAgLTEyOSw0ICsxMjksNCBAQAogCQkJcyArPSB0aGlzLmVsZW1lbnRzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVOYW1lVmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9TaW1wbGVOYW1lVmVjdG9yLmphdmEKaW5kZXggMTVkM2FlYi4uYTU1NTcyMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvU2ltcGxlTmFtZVZlY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1NpbXBsZU5hbWVWZWN0b3IuamF2YQpAQCAtMSwxNSArMSwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZU5hbWVWZWN0b3IgewogCQogCXN0YXRpYyBpbnQgSU5JVElBTF9TSVpFID0gMTA7CkBAIC05MSw0ICs5Myw0IEBACiAJCX0KIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9VdGlsLmphdmEKaW5kZXggMjQ5MDA4ZS4uMTU1NzhlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL1V0aWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwpAQCAtMjMsNiArMjMsOCBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogcHVibGljIGNsYXNzIFV0aWwgewogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKQEAgLTM4LDcgKzQwLDggQEAKIAkJCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIERPVUJMRV9RVU9URVMgPSAiJyciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gU0lOR0xFX1FVT1RFID0gIiciLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFQURJTkdfU0laRSA9IDgxOTI7CisJCiAJLyogQnVuZGxlIGNvbnRhaW5pbmcgbWVzc2FnZXMgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9CkBAIC0xMjEsNyArMTI0LDEyIEBACiAJICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvY2FsaXplKCkgewotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCXRyeSB7CisJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyByZXNvdXJjZSA6ICIgKyBidW5kbGVOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5wcm9wZXJ0aWVzIGZvciBsb2NhbGUgIiArIExvY2FsZS5nZXREZWZhdWx0KCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJdGhyb3cgZTsKKwkJfQogCX0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBnaXZlbiBieXRlcyBhcyBhIGNoYXIgYXJyYXkgdXNpbmcgYSBnaXZlbiBlbmNvZGluZyAobnVsbCBtZWFucyBwbGF0Zm9ybSBkZWZhdWx0KS4KQEAgLTE4MSwyOCArMTg5LDI4IEBACiAJCWlmIChsZW5ndGggPT0gLTEpIHsKIAkJCWNvbnRlbnRzID0gbmV3IGJ5dGVbMF07CiAJCQlpbnQgY29udGVudHNMZW5ndGggPSAwOwotCQkJaW50IGJ5dGVzUmVhZCA9IC0xOworCQkJaW50IGFtb3VudFJlYWQgPSAtMTsKIAkJCWRvIHsKLQkJCQlpbnQgYXZhaWxhYmxlID0gc3RyZWFtLmF2YWlsYWJsZSgpOwotCisJCQkJaW50IGFtb3VudFJlcXVlc3RlZCA9IE1hdGgubWF4KHN0cmVhbS5hdmFpbGFibGUoKSwgREVGQVVMVF9SRUFESU5HX1NJWkUpOyAgLy8gcmVhZCBhdCBsZWFzdCA4SworCQkJCQogCQkJCS8vIHJlc2l6ZSBjb250ZW50cyBpZiBuZWVkZWQKLQkJCQlpZiAoY29udGVudHNMZW5ndGggKyBhdmFpbGFibGUgPiBjb250ZW50cy5sZW5ndGgpIHsKKwkJCQlpZiAoY29udGVudHNMZW5ndGggKyBhbW91bnRSZXF1ZXN0ZWQgPiBjb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSgKIAkJCQkJCWNvbnRlbnRzLAogCQkJCQkJMCwKLQkJCQkJCWNvbnRlbnRzID0gbmV3IGJ5dGVbY29udGVudHNMZW5ndGggKyBhdmFpbGFibGVdLAorCQkJCQkJY29udGVudHMgPSBuZXcgYnl0ZVtjb250ZW50c0xlbmd0aCArIGFtb3VudFJlcXVlc3RlZF0sCiAJCQkJCQkwLAogCQkJCQkJY29udGVudHNMZW5ndGgpOwogCQkJCX0KIAogCQkJCS8vIHJlYWQgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZQotCQkJCWJ5dGVzUmVhZCA9IHN0cmVhbS5yZWFkKGNvbnRlbnRzLCBjb250ZW50c0xlbmd0aCwgYXZhaWxhYmxlKTsKKwkJCQlhbW91bnRSZWFkID0gc3RyZWFtLnJlYWQoY29udGVudHMsIGNvbnRlbnRzTGVuZ3RoLCBhbW91bnRSZXF1ZXN0ZWQpOwogCi0JCQkJaWYgKGJ5dGVzUmVhZCA+IDApIHsKKwkJCQlpZiAoYW1vdW50UmVhZCA+IDApIHsKIAkJCQkJLy8gcmVtZW1iZXIgbGVuZ3RoIG9mIGNvbnRlbnRzCi0JCQkJCWNvbnRlbnRzTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKwkJCQkJY29udGVudHNMZW5ndGggKz0gYW1vdW50UmVhZDsKIAkJCQl9Ci0JCQl9IHdoaWxlIChieXRlc1JlYWQgPiAwKTsKKwkJCX0gd2hpbGUgKGFtb3VudFJlYWQgIT0gLTEpOyAKIAogCQkJLy8gcmVzaXplIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeQogCQkJaWYgKGNvbnRlbnRzTGVuZ3RoIDwgY29udGVudHMubGVuZ3RoKSB7CkBAIC0yNDIsMzAgKzI1MCwzMCBAQAogCQkJCQk6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIGVuY29kaW5nKTsKIAkJY2hhcltdIGNvbnRlbnRzOwogCQlpZiAobGVuZ3RoID09IC0xKSB7Ci0JCQljb250ZW50cyA9IG5ldyBjaGFyWzBdOworCQkJY29udGVudHMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQlpbnQgY29udGVudHNMZW5ndGggPSAwOwotCQkJaW50IGNoYXJzUmVhZCA9IC0xOworCQkJaW50IGFtb3VudFJlYWQgPSAtMTsKIAkJCWRvIHsKLQkJCQlpbnQgYXZhaWxhYmxlID0gc3RyZWFtLmF2YWlsYWJsZSgpOworCQkJCWludCBhbW91bnRSZXF1ZXN0ZWQgPSBNYXRoLm1heChzdHJlYW0uYXZhaWxhYmxlKCksIERFRkFVTFRfUkVBRElOR19TSVpFKTsgIC8vIHJlYWQgYXQgbGVhc3QgOEsKIAogCQkJCS8vIHJlc2l6ZSBjb250ZW50cyBpZiBuZWVkZWQKLQkJCQlpZiAoY29udGVudHNMZW5ndGggKyBhdmFpbGFibGUgPiBjb250ZW50cy5sZW5ndGgpIHsKKwkJCQlpZiAoY29udGVudHNMZW5ndGggKyBhbW91bnRSZXF1ZXN0ZWQgPiBjb250ZW50cy5sZW5ndGgpIHsKIAkJCQkJU3lzdGVtLmFycmF5Y29weSgKIAkJCQkJCWNvbnRlbnRzLAogCQkJCQkJMCwKLQkJCQkJCWNvbnRlbnRzID0gbmV3IGNoYXJbY29udGVudHNMZW5ndGggKyBhdmFpbGFibGVdLAorCQkJCQkJY29udGVudHMgPSBuZXcgY2hhcltjb250ZW50c0xlbmd0aCArIGFtb3VudFJlcXVlc3RlZF0sCiAJCQkJCQkwLAogCQkJCQkJY29udGVudHNMZW5ndGgpOwogCQkJCX0KIAogCQkJCS8vIHJlYWQgYXMgbWFueSBjaGFycyBhcyBwb3NzaWJsZQotCQkJCWNoYXJzUmVhZCA9IHJlYWRlci5yZWFkKGNvbnRlbnRzLCBjb250ZW50c0xlbmd0aCwgYXZhaWxhYmxlKTsKKwkJCQlhbW91bnRSZWFkID0gcmVhZGVyLnJlYWQoY29udGVudHMsIGNvbnRlbnRzTGVuZ3RoLCBhbW91bnRSZXF1ZXN0ZWQpOwogCi0JCQkJaWYgKGNoYXJzUmVhZCA+IDApIHsKKwkJCQlpZiAoYW1vdW50UmVhZCA+IDApIHsKIAkJCQkJLy8gcmVtZW1iZXIgbGVuZ3RoIG9mIGNvbnRlbnRzCi0JCQkJCWNvbnRlbnRzTGVuZ3RoICs9IGNoYXJzUmVhZDsKKwkJCQkJY29udGVudHNMZW5ndGggKz0gYW1vdW50UmVhZDsKIAkJCQl9Ci0JCQl9IHdoaWxlIChjaGFyc1JlYWQgPiAwKTsKKwkJCX0gd2hpbGUgKGFtb3VudFJlYWQgIT0gLTEpOwogCiAJCQkvLyByZXNpemUgY29udGVudHMgaWYgbmVjZXNzYXJ5CiAJCQlpZiAoY29udGVudHNMZW5ndGggPCBjb250ZW50cy5sZW5ndGgpIHsKQEAgLTM3Niw0ICszODQsNCBAQAogCQl9CiAJCXJldHVybiB0cnVlOwkJCiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9jb21waWxlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29tcGlsZXIvdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IGE5NmRjOWQuLjk5YTY5OTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMSwzICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIEVjbGlwc2UgSmF2YSBDb3JlIENvbXBpbGVyIG1lc3NhZ2VzLgogCiAjIyMgY29tcGlsYXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNULmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVC5qYXZhCmluZGV4IGFmMGEyMjMuLjBlZDc3YTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNULmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1QuamF2YQpAQCAtMSwyMSArMSwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwpAQCAtMjksNyArMzIsOCBAQAogICogQWJzdHJhY3Qgc3ludGF4IHRyZWVzIG1heSBiZSBoYW5kIGNvbnN0cnVjdGVkIGJ5IGNsaWVudHMsIHVzaW5nIHRoZQogICogPGNvZGU+bmV3PGl0PlRZUEU8L2l0PjwvY29kZT4gZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZSBuZXcgbm9kZXMsIGFuZCB0aGUKICAqIHZhcmlvdXMgPGNvZGU+c2V0PGl0PkNISUxEPC9pdD48L2NvZGU+IG1ldGhvZHMgCi0gKiAoc2VlIDxjb2RlPkFTVE5vZGU8L2NvZGU+IGFuZCBpdHMgc3ViY2xhc3NlcykgdG8gY29ubmVjdCB0aGVtIHRvZ2V0aGVyLgorICogKHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGUgQVNUTm9kZX0gYW5kIGl0cyBzdWJjbGFzc2VzKQorICogdG8gY29ubmVjdCB0aGVtIHRvZ2V0aGVyLgogICogPC9wPgogICogPHA+CiAgKiBFYWNoIEFTVCBub2RlIGJlbG9uZ3MgdG8gYSB1bmlxdWUgQVNUIGluc3RhbmNlLCBjYWxsZWQgdGhlIG93bmluZyBBU1QuCkBAIC0zOCwxMSArNDIsMjEgQEAKICAqIGJlIGNsb25lZCBmaXJzdCB0byBlbnN1cmVzIHRoYXQgdGhlIGFkZGVkIG5vZGVzIGhhdmUgdGhlIGNvcnJlY3Qgb3duaW5nIEFTVC4KICAqIDwvcD4KICAqIDxwPgotICogVGhlIHN0YXRpYyBtZXRob2QgPGNvZGU+cGFyc2VDb21waWxhdGlvblVuaXQ8L2NvZGU+IHBhcnNlcyBhIHN0cmluZworICogVGhlIHN0YXRpYyBtZXRob2QKKyAqIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUI3BhcnNlQ29tcGlsYXRpb25Vbml0KGNoYXJbXSkKKyAqIHBhcnNlQ29tcGlsYXRpb25Vbml0KGNoYXJbXSl9IHBhcnNlcyBhIHN0cmluZwogICogY29udGFpbmluZyBhIEphdmEgY29tcGlsYXRpb24gdW5pdCBhbmQgcmV0dXJucyB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUKICAqIGZvciBpdC4gVGhlIHJlc3VsdGluZyBub2RlcyBjYXJyeSBzb3VyY2UgcmFuZ2VzIHJlbGF0aW5nIHRoZSBub2RlIGJhY2sgdG8KLSAqIHRoZSBvcmlnaW5hbCBzb3VyY2UgY2hhcmFjdGVycy4gT3B0aW9uYWwgbmFtZSBhbmQgdHlwZSByZXNvbHV0aW9uIGNhbiBhbHNvCi0gKiBiZSByZXF1ZXN0ZWQgYXQgdGhlIHRpbWUgdGhlIEFTVCBpcyBjcmVhdGVkLgorICogdGhlIG9yaWdpbmFsIHNvdXJjZSBjaGFyYWN0ZXJzLiBPdGhlciBmb3JtcyBvZgorICogPGNvZGU+cGFyc2VDb21waWxhdGlvblVuaXQ8L2NvZGU+IGFsbG93IG9wdGlvbmFsIG5hbWUgYW5kIHR5cGUgcmVzb2x1dGlvbgorICogdG8gYmUgcmVxdWVzdGVkIGF0IHRoZSB0aW1lIHRoZSBBU1QgaXMgY3JlYXRlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGJ1aWx0LWluIHdheSB0byBzZXJpYWxpemUgYSBtb2RpZmllZCBBU1QgdG8gYSBzb3VyY2UKKyAqIGNvZGUgc3RyaW5nLiBOYWl2ZSBzZXJpYWxpemF0aW9uIG9mIGEgbmV3bHktY29uc3RydWN0ZWQgQVNUIHRvIGEgc3RyaW5nIGlzCisgKiBhIHN0cmFpZ2h0Zm9yd2FyZCBhcHBsaWNhdGlvbiBvZiBhbiBBU1QgdmlzaXRvci4gSG93ZXZlciwgcHJlc2VydmluZyBjb21tZW50cworICogYW5kIGZvcm1hdHRpbmcgZnJvbSB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGNvZGUgc3RyaW5nIGlzIGEgY2hhbGxlbmdpbmcKKyAqIHByb2JsZW0gKHN1cHBvcnQgZm9yIHRoaXMgaXMgcGxhbm5lZCBmb3IgYSBmdXR1cmUgcmVsZWFzZSkuCiAgKiA8L3A+CiAgKiA8cD4KICAqIENsaWVudHMgbWF5IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcywgd2hpY2ggaXMgbm90IGludGVuZGVkIHRvIGJlCkBAIC05NiwxNCArMTEwLDEzIEBACiAJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucwogCSAqLwogCXB1YmxpYyBBU1QoTWFwIG9wdGlvbnMpIHsKLQkJT2JqZWN0IHZhbHVlID0gb3B0aW9ucy5nZXQoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgiMS4zIi5lcXVhbHModmFsdWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHVzZSBhIDEuMyBzY2FubmVyIC0gdHJlYXRzIGFzc2VydCBhcyBhbiBpZGVudGlmaWVyCi0JCQl0aGlzLnNjYW5uZXIgPSBuZXcgU2Nhbm5lcigpOwotCQl9IGVsc2UgewotCQkJLy8gdXNlIGEgMS40IHNjYW5uZXIgLSB0cmVhdHMgYXNzZXJ0IGFzIGFuIGtleXdvcmQKLQkJCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQl9CisJCXRoaXMuc2Nhbm5lciA9IG5ldyBTY2FubmVyKAorCQkJdHJ1ZSAvKmNvbW1lbnQqLywgCisJCQl0cnVlIC8qd2hpdGVzcGFjZSovLCAKKwkJCWZhbHNlIC8qbmxzKi8sIAorCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzQuZXF1YWxzKG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSkpIC8qYXNzZXJ0Ki8sIAorCQkJbnVsbC8qdGFza1RhZyovLCAKKwkJCW51bGwvKnRhc2tQcmlvcml0aWVzKi8pOwogCX0KIAkJCiAJLyoqCkBAIC0xMzQsNyArMTQ3LDE2IEBACiAJcHVibGljIGxvbmcgbW9kaWZpY2F0aW9uQ291bnQoKSB7CiAJCXJldHVybiBtb2RDb3VudDsKIAl9Ci0JCisKKwkvKioKKwkgKiBTZXQgdGhlIG1vZGlmaWNhdGlvbiBjb3VudCB0byB0aGUgbmV3IHZhbHVlCisJICogCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUKKwkgKi8KKwl2b2lkIHNldE1vZGlmaWNhdGlvbkNvdW50KGxvbmcgdmFsdWUpIHsKKwkJdGhpcy5tb2RDb3VudCA9IHZhbHVlOworCX0KKwkJCiAJLyoqCiAJICogSW5kaWNhdGVzIHRoYXQgdGhpcyBBU1QgaXMgYWJvdXQgdG8gYmUgbW9kaWZpZWQuCiAJICogPHA+CkBAIC0xNTgsMTUgKzE4MCwyNyBAQAogCiAJCiAJLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNyZWF0ZXMgYW5kIAotCSAqIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFic3RyYWN0IHN5bnRheCB0cmVlLgorCSAqIFBhcnNlcyB0aGUgc291cmNlIHN0cmluZyBvZiB0aGUgZ2l2ZW4gSmF2YSBtb2RlbCBjb21waWxhdGlvbiB1bml0IGVsZW1lbnQKKwkgKiBhbmQgY3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3Qgc3ludGF4IHRyZWUuIFRoZSBzb3VyY2UgCisJICogc3RyaW5nIGlzIG9idGFpbmVkIGZyb20gdGhlIEphdmEgbW9kZWwgZWxlbWVudCB1c2luZworCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQuZ2V0U291cmNlKCk8L2NvZGU+LgogCSAqIDxwPgogCSAqIFRoZSByZXR1cm5lZCBjb21waWxhdGlvbiB1bml0IG5vZGUgaXMgdGhlIHJvb3Qgbm9kZSBvZiBhIG5ldyBBU1QuCiAJICogRWFjaCBub2RlIGluIHRoZSBzdWJ0cmVlIGNhcnJpZXMgc291cmNlIHJhbmdlKHMpIGluZm9ybWF0aW9uIHJlbGF0aW5nIGJhY2sKLQkgKiB0byBwb3NpdGlvbnMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgKHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nIGl0c2VsZgotCSAqIGlzIG5vdCByZW1lbWJlcmVkIHdpdGggdGhlIEFTVCkuIElmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkIHdoaWxlCi0JICogcGFyc2luZywgdGhlIHJlbGV2YW50IG5vZGUocykgb2YgdGhlIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIAotCSAqIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCisJICogdG8gcG9zaXRpb25zIGluIHRoZSBzb3VyY2Ugc3RyaW5nICh0aGUgc291cmNlIHN0cmluZyBpcyBub3QgcmVtZW1iZXJlZAorCSAqIHdpdGggdGhlIEFTVCkuCisJICogVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGJlZ2lucyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCB0b2tlbiAKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlOyBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSA8Yj5ub3Q8L2I+CisJICogaW5jbHVkZWQuIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBleHRlbmRzIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyIG9mCisJICogdGhlIGxhc3QgdG9rZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZTsgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQKKwkgKiBjb21tZW50cyBhcmUgPGI+bm90PC9iPiBpbmNsdWRlZC4gVGhlcmUgYXJlIGEgaGFuZGZ1bCBvZiBleGNlcHRpb25zCisJICogKGluY2x1ZGluZyBjb21waWxhdGlvbiB1bml0cyBhbmQgdGhlIHZhcmlvdXMgYm9keSBkZWNsYXJhdGlvbnMpOyB0aGUKKwkgKiBzcGVjaWZpY2F0aW9uIGZvciB0aGVzZSBub2RlIHR5cGUgc3BlbGxzIG91dCB0aGUgZGV0YWlscy4KKwkgKiBTb3VyY2UgcmFuZ2VzIG5lc3QgcHJvcGVybHk6IHRoZSBzb3VyY2UgcmFuZ2UgZm9yIGEgY2hpbGQgaXMgYWx3YXlzCisJICogd2l0aGluIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgaXRzIHBhcmVudCwgYW5kIHRoZSBzb3VyY2UgcmFuZ2VzIG9mIHNpYmxpbmcKKwkgKiBub2RlcyBuZXZlciBvdmVybGFwLgorCSAqIElmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkIHdoaWxlIHBhcnNpbmcsIHRoZSByZWxldmFudCBub2RlKHMpIG9mIHRoZQorCSAqIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCiAJICogPC9wPgogCSAqIDxwPgogCSAqIElmIDxjb2RlPnJlc29sdmVCaW5kaW5nczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YXJpb3VzIG5hbWVzCkBAIC0xNzksOSArMjEzLDExIEBACiAJICogcmVxdWVzdGVkIGZyaXZvbG91c2x5LiBUaGUgYWRkaXRpb25hbCBzcGFjZSBpcyBub3QgcmVjbGFpbWVkIHVudGlsIHRoZSAKIAkgKiBBU1QsIGFsbCBpdHMgbm9kZXMsIGFuZCBhbGwgaXRzIGJpbmRpbmdzIGJlY29tZSBnYXJiYWdlLiBTbyBpdCBpcyB2ZXJ5CiAJICogaW1wb3J0YW50IHRvIG5vdCByZXRhaW4gYW55IG9mIHRoZXNlIG9iamVjdHMgbG9uZ2VyIHRoYW4gYWJzb2x1dGVseQotCSAqIG5lY2Vzc2FyeS4gTm90ZSB0aGF0IGJpbmRpbmdzIGNhbiBvbmx5IGJlIHJlc29sdmVkIHdoaWxlIHRoZSBBU1QgcmVtYWlucwotCSAqIGluIGl0cyBvcmlnaW5hbCB1bm1vZGlmaWVkIHN0YXRlLiBPbmNlIHRoZSBBU1QgaXMgbW9kaWZpZWQsIGFsbCAKLQkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisJICogbmVjZXNzYXJ5LiBCaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlIEFTVCBpcyBjcmVhdGVkLiBTdWJzZXF1ZW50CisJICogbW9kaWZpY2F0aW9ucyB0byB0aGUgQVNUIGRvIG5vdCBhZmZlY3QgdGhlIGJpbmRpbmdzIHJldHVybmVkIGJ5CisJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgaW4gYW55IHdheTsgdGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlCisJICogc2FtZSBiaW5kaW5nIGFzIGJlZm9yZSB0aGUgQVNUIHdhcyBtb2RpZmllZCAoaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMKKwkgKiB0aGF0IHJlYXJyYW5nZSBzdWJ0cmVlcyBieSByZXBhcmVudGluZyBub2RlcykuCiAJICogSWYgPGNvZGU+cmVzb2x2ZUJpbmRpbmdzPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBhbmFseXNpcyAKIAkgKiBkb2VzIG5vdCBnbyBiZXlvbmQgcGFyc2luZyBhbmQgYnVpbGRpbmcgdGhlIHRyZWUsIGFuZCBhbGwgCiAJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZyb20gdGhlIApAQCAtMTkyLDYgKzIyOCw4IEBACiAJICogQHBhcmFtIHJlc29sdmVCaW5kaW5ncyA8Y29kZT50cnVlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgd2FudGVkLCAKIAkgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIG5vdCBvZiBpbnRlcmVzdAogCSAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQgZG9lcyBub3QgCisJICogZXhpc3Qgb3IgaWYgaXRzIHNvdXJjZSBzdHJpbmcgY2Fubm90IGJlIG9idGFpbmVkCiAJICogQHNlZSBBU1ROb2RlI2dldEZsYWdzKCkKIAkgKiBAc2VlIEFTVE5vZGUjTUFMRk9STUVECiAJICogQHNlZSBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKQpAQCAtMjE4LDcgKzI1Niw3IEBACiAJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gPSBDb21waWxhdGlvblVuaXRSZXNvbHZlci5yZXNvbHZlKAogCQkJCQl1bml0LAogCQkJCQluZXcgQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIoKSk7Ci0JCQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIodHJ1ZSk7CisJCQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIodW5pdC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSksIHRydWUpOwogCQkJCUFTVCBhc3QgPSBuZXcgQVNUKCk7CiAJCQkJQmluZGluZ1Jlc29sdmVyIHJlc29sdmVyID0gbmV3IERlZmF1bHRCaW5kaW5nUmVzb2x2ZXIoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uc2NvcGUpOwogCQkJCWFzdC5zZXRCaW5kaW5nUmVzb2x2ZXIocmVzb2x2ZXIpOwpAQCAtMjQxLDE1ICsyNzksMTM1IEBACiAJfQogCiAJLyoqCisJICogUGFyc2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEphdmEgY2xhc3MgZmlsZQorCSAqIGVsZW1lbnQgYW5kIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFic3RyYWN0IHN5bnRheCB0cmVlLgorCSAqIFRoZSBzb3VyY2Ugc3RyaW5nIGlzIG9idGFpbmVkIGZyb20gdGhlIEphdmEgbW9kZWwgZWxlbWVudCB1c2luZworCSAqIDxjb2RlPklDbGFzc0ZpbGUuZ2V0U291cmNlKCk8L2NvZGU+LCBhbmQgaXMgb25seSBhdmFpbGFibGUgZm9yIGEgY2xhc3MKKwkgKiBmaWxlcyB3aXRoIGF0dGFjaGVkIHNvdXJjZS4KKwkgKiA8cD4KKwkgKiBUaGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIGlzIHRoZSByb290IG5vZGUgb2YgYSBuZXcgQVNULgorCSAqIEVhY2ggbm9kZSBpbiB0aGUgc3VidHJlZSBjYXJyaWVzIHNvdXJjZSByYW5nZShzKSBpbmZvcm1hdGlvbiByZWxhdGluZyBiYWNrCisJICogdG8gcG9zaXRpb25zIGluIHRoZSBzb3VyY2Ugc3RyaW5nICh0aGUgc291cmNlIHN0cmluZyBpcyBub3QgcmVtZW1iZXJlZAorCSAqIHdpdGggdGhlIEFTVCkuCisJICogVGhlIHNvdXJjZSByYW5nZSB1c3VhbGx5IGJlZ2lucyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCB0b2tlbiAKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlOyBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGFyZSA8Yj5ub3Q8L2I+CisJICogaW5jbHVkZWQuIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBleHRlbmRzIHRocm91Z2ggdGhlIGxhc3QgY2hhcmFjdGVyIG9mCisJICogdGhlIGxhc3QgdG9rZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZTsgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQKKwkgKiBjb21tZW50cyBhcmUgPGI+bm90PC9iPiBpbmNsdWRlZC4gVGhlcmUgYXJlIGEgaGFuZGZ1bCBvZiBleGNlcHRpb25zCisJICogKGluY2x1ZGluZyBjb21waWxhdGlvbiB1bml0cyBhbmQgdGhlIHZhcmlvdXMgYm9keSBkZWNsYXJhdGlvbnMpOyB0aGUKKwkgKiBzcGVjaWZpY2F0aW9uIGZvciB0aGVzZSBub2RlIHR5cGUgc3BlbGxzIG91dCB0aGUgZGV0YWlscy4KKwkgKiBTb3VyY2UgcmFuZ2VzIG5lc3QgcHJvcGVybHk6IHRoZSBzb3VyY2UgcmFuZ2UgZm9yIGEgY2hpbGQgaXMgYWx3YXlzCisJICogd2l0aGluIHRoZSBzb3VyY2UgcmFuZ2Ugb2YgaXRzIHBhcmVudCwgYW5kIHRoZSBzb3VyY2UgcmFuZ2VzIG9mIHNpYmxpbmcKKwkgKiBub2RlcyBuZXZlciBvdmVybGFwLgorCSAqIElmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkIHdoaWxlIHBhcnNpbmcsIHRoZSByZWxldmFudCBub2RlKHMpIG9mIHRoZQorCSAqIHRyZWUgd2lsbCBiZSBmbGFnZ2VkIGFzIDxjb2RlPk1BTEZPUk1FRDwvY29kZT4uCisJICogPC9wPgorCSAqIDxwPgorCSAqIElmIDxjb2RlPnJlc29sdmVCaW5kaW5nczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YXJpb3VzIG5hbWVzCisJICogYW5kIHR5cGVzIGFwcGVhcmluZyBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgcmVzb2x2ZWQgdG8gImJpbmRpbmdzIgorCSAqIGJ5IGNhbGxpbmcgdGhlIDxjb2RlPnJlc29sdmVCaW5kaW5nPC9jb2RlPiBtZXRob2RzLiBUaGVzZSBiaW5kaW5ncyAKKwkgKiBkcmF3IGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHByb2dyYW0sIGFuZCAKKwkgKiBnZW5lcmFsbHkgYWZmb3JkIGEgbW9yZSBwb3dlcmZ1bCB2YW50YWdlIHBvaW50IGZvciBjbGllbnRzIHdobyB3aXNoIHRvCisJICogYW5hbHl6ZSBhIHByb2dyYW0ncyBzdHJ1Y3R1cmUgbW9yZSBkZWVwbHkuIFRoZXNlIGJpbmRpbmdzIGNvbWUgYXQgYSAKKwkgKiBjb25zaWRlcmFibGUgY29zdCBpbiBib3RoIHRpbWUgYW5kIHNwYWNlLCBob3dldmVyLCBhbmQgc2hvdWxkIG5vdCBiZQorCSAqIHJlcXVlc3RlZCBmcml2b2xvdXNseS4gVGhlIGFkZGl0aW9uYWwgc3BhY2UgaXMgbm90IHJlY2xhaW1lZCB1bnRpbCB0aGUgCisJICogQVNULCBhbGwgaXRzIG5vZGVzLCBhbmQgYWxsIGl0cyBiaW5kaW5ncyBiZWNvbWUgZ2FyYmFnZS4gU28gaXQgaXMgdmVyeQorCSAqIGltcG9ydGFudCB0byBub3QgcmV0YWluIGFueSBvZiB0aGVzZSBvYmplY3RzIGxvbmdlciB0aGFuIGFic29sdXRlbHkKKwkgKiBuZWNlc3NhcnkuIEJpbmRpbmdzIGFyZSByZXNvbHZlZCBhdCB0aGUgdGltZSB0aGUgQVNUIGlzIGNyZWF0ZWQuIFN1YnNlcXVlbnQKKwkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBBU1QgZG8gbm90IGFmZmVjdCB0aGUgYmluZGluZ3MgcmV0dXJuZWQgYnkKKwkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyBpbiBhbnkgd2F5OyB0aGVzZSBtZXRob2RzIHJldHVybiB0aGUKKwkgKiBzYW1lIGJpbmRpbmcgYXMgYmVmb3JlIHRoZSBBU1Qgd2FzIG1vZGlmaWVkIChpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucworCSAqIHRoYXQgcmVhcnJhbmdlIHN1YnRyZWVzIGJ5IHJlcGFyZW50aW5nIG5vZGVzKS4KKwkgKiBJZiA8Y29kZT5yZXNvbHZlQmluZGluZ3M8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGFuYWx5c2lzIAorCSAqIGRvZXMgbm90IGdvIGJleW9uZCBwYXJzaW5nIGFuZCBidWlsZGluZyB0aGUgdHJlZSwgYW5kIGFsbCAKKwkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gZnJvbSB0aGUgCisJICogb3V0c2V0LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NGaWxlIHRoZSBKYXZhIG1vZGVsIGNvbXBpbGF0aW9uIHVuaXQgd2hvc2Ugc291cmNlIGNvZGUgaXMgdG8gYmUgcGFyc2VkCisJICogQHBhcmFtIHJlc29sdmVCaW5kaW5ncyA8Y29kZT50cnVlPC9jb2RlPiBpZiBiaW5kaW5ncyBhcmUgd2FudGVkLCAKKwkgKiAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYmluZGluZ3MgYXJlIG5vdCBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgbm9kZQorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBKYXZhIGVsZW1lbnQgZG9lcyBub3QgCisJICogZXhpc3Qgb3IgaWYgaXRzIHNvdXJjZSBzdHJpbmcgY2Fubm90IGJlIG9idGFpbmVkCisJICogQHNlZSBBU1ROb2RlI2dldEZsYWdzKCkKKwkgKiBAc2VlIEFTVE5vZGUjTUFMRk9STUVECisJICogQHNlZSBBU1ROb2RlI2dldFN0YXJ0UG9zaXRpb24oKQorCSAqIEBzZWUgQVNUTm9kZSNnZXRMZW5ndGgoKQorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZUNvbXBpbGF0aW9uVW5pdCgKKwkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUsCisJCWJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlpZiAoY2xhc3NGaWxlID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQljaGFyW10gc291cmNlID0gbnVsbDsKKwkJCVN0cmluZyBzb3VyY2VTdHJpbmcgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlzb3VyY2VTdHJpbmcgPSBjbGFzc0ZpbGUuZ2V0U291cmNlKCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCWlmIChzb3VyY2VTdHJpbmcgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCXNvdXJjZSA9IHNvdXJjZVN0cmluZy50b0NoYXJBcnJheSgpOworCQkJaWYgKCFyZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZXR1cm4gQVNULnBhcnNlQ29tcGlsYXRpb25Vbml0KHNvdXJjZSk7CisJCQl9CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOyAvLyB0aGlzIGluY2x1ZGVzIHRoZSB0cmFpbGluZyAuY2xhc3MKKwkJCWJ1ZmZlci5pbnNlcnQoMCwgY2xhc3NGaWxlTmFtZS50b0NoYXJBcnJheSgpLCAwLCBjbGFzc0ZpbGVOYW1lLmluZGV4T2YoJy4nKSk7CisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGNsYXNzRmlsZS5nZXRKYXZhUHJvamVjdCgpOworCQkJdHJ5IHsKKwkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9CisJCQkJCUNvbXBpbGF0aW9uVW5pdFJlc29sdmVyLnJlc29sdmUoCisJCQkJCQlzb3VyY2UsCisJCQkJCQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBjbGFzc0ZpbGUuZ2V0VHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSksCisJCQkJCQlidWZmZXIudG9TdHJpbmcoKSwKKwkJCQkJCXByb2plY3QsCisJCQkJCQluZXcgQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvckFkYXB0ZXIoKSk7CisJCQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIocHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCB0cnVlKTsKKwkJCQlBU1QgYXN0ID0gbmV3IEFTVCgpOworCQkJCUJpbmRpbmdSZXNvbHZlciByZXNvbHZlciA9IG5ldyBEZWZhdWx0QmluZGluZ1Jlc29sdmVyKGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uLnNjb3BlKTsKKwkJCQlhc3Quc2V0QmluZGluZ1Jlc29sdmVyKHJlc29sdmVyKTsKKwkJCQljb252ZXJ0ZXIuc2V0QVNUKGFzdCk7CisJCQkKKwkJCQlDb21waWxhdGlvblVuaXQgY3UgPSBjb252ZXJ0ZXIuY29udmVydChjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiwgc291cmNlKTsKKwkJCQljdS5zZXRMaW5lRW5kVGFibGUoY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQubGluZVNlcGFyYXRvclBvc2l0aW9ucyk7CisJCQkJcmVzb2x2ZXIuc3RvcmVNb2RpZmljYXRpb25Db3VudChhc3QubW9kaWZpY2F0aW9uQ291bnQoKSk7CisJCQkJcmV0dXJuIGN1OworCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8qIGlmIGEgSmF2YU1vZGVsRXhjZXB0aW9uIGlzIHRocm93biB0cnlpbmcgdG8gcmV0cmlldmUgdGhlIG5hbWUgZW52aXJvbm1lbnQKKwkJCQkgKiB0aGVuIHdlIHNpbXBseSBkbyBhIHBhcnNpbmcgd2l0aG91dCBjcmVhdGluZyBiaW5kaW5ncy4KKwkJCQkgKiBUaGVyZWZvcmUgYWxsIGJpbmRpbmcgcmVzb2x1dGlvbiB3aWxsIHJldHVybiBudWxsLgorCQkJCSAqLworCQkJCXJldHVybiBwYXJzZUNvbXBpbGF0aW9uVW5pdChzb3VyY2UpOwkJCQorCQkJfQorCX0KKwkJCQorCS8qKgogCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIHRoZSBoeXBvdGhldGljYWwgY29udGVudHMgb2YgdGhlIG5hbWVkCiAJICogY29tcGlsYXRpb24gdW5pdCBhbmQgY3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3Qgc3ludGF4IHRyZWUuCiAJICogPHA+CiAJICogVGhlIHJldHVybmVkIGNvbXBpbGF0aW9uIHVuaXQgbm9kZSBpcyB0aGUgcm9vdCBub2RlIG9mIGEgbmV3IEFTVC4KIAkgKiBFYWNoIG5vZGUgaW4gdGhlIHN1YnRyZWUgY2FycmllcyBzb3VyY2UgcmFuZ2UocykgaW5mb3JtYXRpb24gcmVsYXRpbmcgYmFjawogCSAqIHRvIHBvc2l0aW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyAodGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcgaXRzZWxmCi0JICogaXMgbm90IHJlbWVtYmVyZWQgd2l0aCB0aGUgQVNUKS4gSWYgYSBzeW50YXggZXJyb3IgaXMgZGV0ZWN0ZWQgd2hpbGUKLQkgKiBwYXJzaW5nLCB0aGUgcmVsZXZhbnQgbm9kZShzKSBvZiB0aGUgdHJlZSB3aWxsIGJlIGZsYWdnZWQgYXMgCi0JICogPGNvZGU+TUFMRk9STUVEPC9jb2RlPi4KKwkgKiBpcyBub3QgcmVtZW1iZXJlZCB3aXRoIHRoZSBBU1QpLgorCSAqIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBiZWdpbnMgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgdG9rZW4gCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZTsgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgPGI+bm90PC9iPgorCSAqIGluY2x1ZGVkLiBUaGUgc291cmNlIHJhbmdlIHVzdWFsbHkgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZgorCSAqIHRoZSBsYXN0IHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGU7IHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kCisJICogY29tbWVudHMgYXJlIDxiPm5vdDwvYj4gaW5jbHVkZWQuIFRoZXJlIGFyZSBhIGhhbmRmdWwgb2YgZXhjZXB0aW9ucworCSAqIChpbmNsdWRpbmcgY29tcGlsYXRpb24gdW5pdHMgYW5kIHRoZSB2YXJpb3VzIGJvZHkgZGVjbGFyYXRpb25zKTsgdGhlCisJICogc3BlY2lmaWNhdGlvbiBmb3IgdGhlc2Ugbm9kZSB0eXBlIHNwZWxscyBvdXQgdGhlIGRldGFpbHMuCisJICogU291cmNlIHJhbmdlcyBuZXN0IHByb3Blcmx5OiB0aGUgc291cmNlIHJhbmdlIGZvciBhIGNoaWxkIGlzIGFsd2F5cworCSAqIHdpdGhpbiB0aGUgc291cmNlIHJhbmdlIG9mIGl0cyBwYXJlbnQsIGFuZCB0aGUgc291cmNlIHJhbmdlcyBvZiBzaWJsaW5nCisJICogbm9kZXMgbmV2ZXIgb3ZlcmxhcC4KKwkgKiBJZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZCB3aGlsZSBwYXJzaW5nLCB0aGUgcmVsZXZhbnQgbm9kZShzKSBvZiB0aGUKKwkgKiB0cmVlIHdpbGwgYmUgZmxhZ2dlZCBhcyA8Y29kZT5NQUxGT1JNRUQ8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBJZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSB2YXJpb3VzIG5hbWVzCkBAIC0yNjIsOSArNDIwLDExIEBACiAJICogcmVxdWVzdGVkIGZyaXZvbG91c2x5LiBUaGUgYWRkaXRpb25hbCBzcGFjZSBpcyBub3QgcmVjbGFpbWVkIHVudGlsIHRoZSAKIAkgKiBBU1QsIGFsbCBpdHMgbm9kZXMsIGFuZCBhbGwgaXRzIGJpbmRpbmdzIGJlY29tZSBnYXJiYWdlLiBTbyBpdCBpcyB2ZXJ5CiAJICogaW1wb3J0YW50IHRvIG5vdCByZXRhaW4gYW55IG9mIHRoZXNlIG9iamVjdHMgbG9uZ2VyIHRoYW4gYWJzb2x1dGVseQotCSAqIG5lY2Vzc2FyeS4gTm90ZSB0aGF0IGJpbmRpbmdzIGNhbiBvbmx5IGJlIHJlc29sdmVkIHdoaWxlIHRoZSBBU1QgcmVtYWlucwotCSAqIGluIGl0cyBvcmlnaW5hbCB1bm1vZGlmaWVkIHN0YXRlLiBPbmNlIHRoZSBBU1QgaXMgbW9kaWZpZWQsIGFsbCAKLQkgKiA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4gbWV0aG9kcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisJICogbmVjZXNzYXJ5LiBCaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlIEFTVCBpcyBjcmVhdGVkLiBTdWJzZXF1ZW50CisJICogbW9kaWZpY2F0aW9ucyB0byB0aGUgQVNUIGRvIG5vdCBhZmZlY3QgdGhlIGJpbmRpbmdzIHJldHVybmVkIGJ5CisJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgaW4gYW55IHdheTsgdGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlCisJICogc2FtZSBiaW5kaW5nIGFzIGJlZm9yZSB0aGUgQVNUIHdhcyBtb2RpZmllZCAoaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMKKwkgKiB0aGF0IHJlYXJyYW5nZSBzdWJ0cmVlcyBieSByZXBhcmVudGluZyBub2RlcykuCiAJICogSWYgdGhlIGdpdmVuIHByb2plY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBhbmFseXNpcyAKIAkgKiBkb2VzIG5vdCBnbyBiZXlvbmQgcGFyc2luZyBhbmQgYnVpbGRpbmcgdGhlIHRyZWUsIGFuZCBhbGwgCiAJICogPGNvZGU+cmVzb2x2ZUJpbmRpbmc8L2NvZGU+IG1ldGhvZHMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZyb20gdGhlIApAQCAtMzAzLDcgKzQ2Myw3IEBACiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KIAkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBqdXN0IHJldWNlcyB0byB0aGUgb3RoZXIgc2ltcGxlc3QgY2FzZQorCQkJLy8gdGhpcyBqdXN0IHJlZHVjZXMgdG8gdGhlIG90aGVyIHNpbXBsZXN0IGNhc2UKIAkJCXJldHVybiBwYXJzZUNvbXBpbGF0aW9uVW5pdChzb3VyY2UpOwogCQl9CiAJCkBAIC0zMTQsNyArNDc0LDcgQEAKIAkJCQkJdW5pdE5hbWUsCiAJCQkJCXByb2plY3QsCiAJCQkJCW5ldyBBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlcigpKTsKLQkJCUFTVENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQVNUQ29udmVydGVyKHRydWUpOworCQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIocHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCB0cnVlKTsKIAkJCUFTVCBhc3QgPSBuZXcgQVNUKCk7CiAJCQlCaW5kaW5nUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgRGVmYXVsdEJpbmRpbmdSZXNvbHZlcihjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5zY29wZSk7CiAJCQlhc3Quc2V0QmluZGluZ1Jlc29sdmVyKHJlc29sdmVyKTsKQEAgLTM0MCw5ICs1MDAsMjMgQEAKIAkgKiBUaGUgcmV0dXJuZWQgY29tcGlsYXRpb24gdW5pdCBub2RlIGlzIHRoZSByb290IG5vZGUgb2YgYSBuZXcgQVNULgogCSAqIEVhY2ggbm9kZSBpbiB0aGUgc3VidHJlZSBjYXJyaWVzIHNvdXJjZSByYW5nZShzKSBpbmZvcm1hdGlvbiByZWxhdGluZyBiYWNrCiAJICogdG8gcG9zaXRpb25zIGluIHRoZSBnaXZlbiBzb3VyY2Ugc3RyaW5nICh0aGUgZ2l2ZW4gc291cmNlIHN0cmluZyBpdHNlbGYKLQkgKiBpcyBub3QgcmVtZW1iZXJlZCB3aXRoIHRoZSBBU1QpLiBJZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZCB3aGlsZQotCSAqIHBhcnNpbmcsIHRoZSByZWxldmFudCBub2RlKHMpIG9mIHRoZSB0cmVlIHdpbGwgYmUgZmxhZ2dlZCBhcyAKLQkgKiA8Y29kZT5NQUxGT1JNRUQ8L2NvZGU+LgorCSAqIGlzIG5vdCByZW1lbWJlcmVkIHdpdGggdGhlIEFTVCkuIAorCSAqIFRoZSBzb3VyY2UgcmFuZ2UgdXN1YWxseSBiZWdpbnMgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgdG9rZW4gCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZTsgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgPGI+bm90PC9iPgorCSAqIGluY2x1ZGVkLiBUaGUgc291cmNlIHJhbmdlIHVzdWFsbHkgZXh0ZW5kcyB0aHJvdWdoIHRoZSBsYXN0IGNoYXJhY3RlciBvZgorCSAqIHRoZSBsYXN0IHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGU7IHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kCisJICogY29tbWVudHMgYXJlIDxiPm5vdDwvYj4gaW5jbHVkZWQuIFRoZXJlIGFyZSBhIGhhbmRmdWwgb2YgZXhjZXB0aW9ucworCSAqIChpbmNsdWRpbmcgY29tcGlsYXRpb24gdW5pdHMgYW5kIHRoZSB2YXJpb3VzIGJvZHkgZGVjbGFyYXRpb25zKTsgdGhlCisJICogc3BlY2lmaWNhdGlvbiBmb3IgdGhlc2Ugbm9kZSB0eXBlIHNwZWxscyBvdXQgdGhlIGRldGFpbHMuCisJICogU291cmNlIHJhbmdlcyBuZXN0IHByb3Blcmx5OiB0aGUgc291cmNlIHJhbmdlIGZvciBhIGNoaWxkIGlzIGFsd2F5cworCSAqIHdpdGhpbiB0aGUgc291cmNlIHJhbmdlIG9mIGl0cyBwYXJlbnQsIGFuZCB0aGUgc291cmNlIHJhbmdlcyBvZiBzaWJsaW5nCisJICogbm9kZXMgbmV2ZXIgb3ZlcmxhcC4KKwkgKiBJZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZCB3aGlsZSBwYXJzaW5nLCB0aGUgcmVsZXZhbnQgbm9kZShzKSBvZiB0aGUKKwkgKiB0cmVlIHdpbGwgYmUgZmxhZ2dlZCBhcyA8Y29kZT5NQUxGT1JNRUQ8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjb21wdXRlIGJpbmRpbmcgaW5mb3JtYXRpb247IGFsbCA8Y29kZT5yZXNvbHZlQmluZGluZzwvY29kZT4KKwkgKiBtZXRob2RzIGFwcGxpZWQgdG8gbm9kZXMgb2YgdGhlIHJlc3VsdGluZyBBU1QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcGFyYW0gc291cmNlIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkIGFzIGEgSmF2YSBjb21waWxhdGlvbiB1bml0CkBAIC0zNTYsOSArNTMwLDkgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IAotCQkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIucGFyc2Uoc291cmNlKTsKKwkJCUNvbXBpbGF0aW9uVW5pdFJlc29sdmVyLnBhcnNlKHNvdXJjZSwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsgLy8gbm8gYmV0dGVyIGN1c3RvbSBvcHRpb25zCiAKLQkJQVNUQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBBU1RDb252ZXJ0ZXIoZmFsc2UpOworCQlBU1RDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEFTVENvbnZlcnRlcihKYXZhQ29yZS5nZXRPcHRpb25zKCksIGZhbHNlKTsKIAkJQVNUIGFzdCA9IG5ldyBBU1QoKTsKIAkJYXN0LnNldEJpbmRpbmdSZXNvbHZlcihuZXcgQmluZGluZ1Jlc29sdmVyKCkpOwogCQljb252ZXJ0ZXIuc2V0QVNUKGFzdCk7CkBAIC02NzQsOCArODQ4LDggQEAKIAkgKiBDcmVhdGVzIGFuIHVucGFyZW50ZWQgbWV0aG9kIGRlY2xhcmF0aW9uIG5vZGUgb3duZWQgYnkgdGhpcyBBU1QuCiAJICogQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIG1ldGhvZCBvZiBhbiB1bnNwZWNpZmllZCwgYnV0IAogCSAqIGxlZ2FsLCBuYW1lOyBubyBtb2RpZmllcnM7IG5vIEphdmFkb2MgY29tbWVudDsgbm8gcGFyYW1ldGVyczsgcmV0dXJuCi0JICogdHlwZSB2b2lkOyBubyB0aHJvd24gZXhjZXB0aW9uczsgYW5kIG5vIGJvZHkgKGFzIG9wcG9zZWQgdG8gYW4gZW1wdHkKLQkgKiBib2R5KS4KKwkgKiB0eXBlIHZvaWQ7IG5vIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IG5vIHRocm93biBleGNlcHRpb25zOyBhbmQgbm8KKwkgKiBib2R5IChhcyBvcHBvc2VkIHRvIGFuIGVtcHR5IGJvZHkpLgogCSAqIDxwPgogCSAqIFRvIGNyZWF0ZSBhIGNvbnN0cnVjdG9yLCB1c2UgdGhpcyBtZXRob2QgYW5kIHRoZW4gY2FsbAogCSAqIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uLnNldENvbnN0cnVjdG9yKHRydWUpPC9jb2RlPiBhbmQKQEAgLTY5Myw3ICs4NjcsOCBAQAogCS8qKgogCSAqIENyZWF0ZXMgYW4gdW5wYXJlbnRlZCBzaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb24gbm9kZSBvd25lZCBieSB0aGlzIEFTVC4KIAkgKiBCeSBkZWZhdWx0LCB0aGUgZGVjbGFyYXRpb24gaXMgZm9yIGEgdmFyaWFibGUgd2l0aCBhbiB1bnNwZWNpZmllZCwgYnV0IAotCSAqIGxlZ2FsLCBuYW1lIGFuZCB0eXBlOyBubyBtb2RpZmllcnM7IGFuZCBubyBpbml0aWFsaXplci4KKwkgKiBsZWdhbCwgbmFtZSBhbmQgdHlwZTsgbm8gbW9kaWZpZXJzOyBubyBhcnJheSBkaW1lbnNpb25zIGFmdGVyIHRoZQorCSAqIHZhcmlhYmxlOyBhbmQgbm8gaW5pdGlhbGl6ZXIuCiAJICogCiAJICogQHJldHVybiBhIG5ldyB1bnBhcmVudGVkIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBub2RlCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RDb252ZXJ0ZXIuamF2YQppbmRleCBiNTg2YmJlLi45ZDNlNjljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVENvbnZlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUQ29udmVydGVyLmphdmEKQEAgLTEsMjEgKzEsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAoraW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOwogCiAvKioKICAqIEludGVybmFsIGNsYXNzIGZvciBjb252ZXJ0aW5nIGludGVybmFsIGNvbXBpbGVyIEFTVHMgaW50byBwdWJsaWMgQVNUcy4KQEAgLTI2LDEwICszNCwxOCBAQAogCXByaXZhdGUgY2hhcltdIGNvbXBpbGF0aW9uVW5pdFNvdXJjZTsKIAlwcml2YXRlIFNjYW5uZXIgc2Nhbm5lcjsKIAlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzOworCXByaXZhdGUgU2V0IHBlbmRpbmdUaGlzRXhwcmVzc2lvblNjb3BlUmVzb2x1dGlvbjsKKwlwcml2YXRlIFNldCBwZW5kaW5nTmFtZVNjb3BlUmVzb2x1dGlvbjsJCiAJCi0JcHVibGljIEFTVENvbnZlcnRlcihib29sZWFuIHJlc29sdmVCaW5kaW5ncykgeworCXB1YmxpYyBBU1RDb252ZXJ0ZXIoTWFwIG9wdGlvbnMsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzKSB7CiAJCXRoaXMucmVzb2x2ZUJpbmRpbmdzID0gcmVzb2x2ZUJpbmRpbmdzOwotCQlzY2FubmVyID0gbmV3IFNjYW5uZXIodHJ1ZSwgZmFsc2UpOworCQlzY2FubmVyID0gbmV3IFNjYW5uZXIoCisJCQkJCXRydWUgLypjb21tZW50Ki8sCisJCQkJCWZhbHNlIC8qd2hpdGVzcGFjZSovLAorCQkJCQlmYWxzZSAvKm5scyovLAorCQkJCQlKYXZhQ29yZS5WRVJTSU9OXzFfNC5lcXVhbHMob3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKSkgLyphc3NlcnQqLywgCisJCQkJCW51bGwgLyp0YXNrVGFncyovLAorCQkJCQludWxsLyp0YXNrUHJpb3JpdGllcyovKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgc2V0QVNUKEFTVCBhc3QpIHsKQEAgLTQ2LDcgKzYyLDggQEAKIAkJCXJlY29yZE5vZGVzKGNvbXBpbGF0aW9uVW5pdCwgdW5pdCk7CiAJCX0KIAkJaWYgKHVuaXQuY3VycmVudFBhY2thZ2UgIT0gbnVsbCkgewotCQkJY29tcGlsYXRpb25Vbml0LnNldFBhY2thZ2UoY29udmVydFBhY2thZ2UodW5pdC5jdXJyZW50UGFja2FnZSkpOworCQkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IGNvbnZlcnRQYWNrYWdlKHVuaXQpOworCQkJY29tcGlsYXRpb25Vbml0LnNldFBhY2thZ2UocGFja2FnZURlY2xhcmF0aW9uKTsKIAkJfQogCQlJbXBvcnRSZWZlcmVuY2VbXSBpbXBvcnRzID0gdW5pdC5pbXBvcnRzOwogCQlpZiAoaW1wb3J0cyAhPSBudWxsKSB7CkBAIC02NywxMCArODQsMTQgQEAKIAkJaWYgKHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50ICE9IDApIHsKIAkJCXByb3BhZ2F0ZUVycm9ycyhjb21waWxhdGlvblVuaXQsIHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbXMsIHVuaXQuY29tcGlsYXRpb25SZXN1bHQucHJvYmxlbUNvdW50KTsKIAkJfQorCQlpZiAocmVzb2x2ZUJpbmRpbmdzKSB7CisJCQlsb29rdXBGb3JTY29wZXMoKTsKKwkJfQogCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0OwogCX0KIAkKLQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGNvbnZlcnRQYWNrYWdlKEltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UpIHsKKwlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGNvbnZlcnRQYWNrYWdlKENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSB7CisJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWZlcmVuY2UgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi5jdXJyZW50UGFja2FnZTsKIAkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld1BhY2thZ2VEZWNsYXJhdGlvbigpOwogCQljaGFyW11bXSB0b2tlbnMgPSBpbXBvcnRSZWZlcmVuY2UudG9rZW5zOwogCQlpbnQgbGVuZ3RoID0gaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7CkBAIC04OCw2ICsxMDksNyBAQAogCQlwYWNrYWdlRGVjbGFyYXRpb24uc2V0TmFtZShuYW1lKTsKIAkJaWYgKHJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXMocGFja2FnZURlY2xhcmF0aW9uLCBpbXBvcnRSZWZlcmVuY2UpOworCQkJcmVjb3JkTm9kZXMobmFtZSwgY29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pOwogCQl9CiAJCXJldHVybiBwYWNrYWdlRGVjbGFyYXRpb247CiAJfQpAQCAtMTI2LDYgKzE0OCw4IEBACiAJCSAqIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIGJ1aWx0IG5vZGVzIHdpdGggaW52YWxpZCBtb2RpZmllcnMuCiAJCSAqLwogCQl0cnkgeworCQkJLy8gQWNjSnVzdEZsYWcgZG9lc24ndCBmbHVzaCBNb2RpZmllci5UUkFOU0lFTlQgb3IgTW9kaWZpZXIuVk9MQVRJTEUuCisJCQkvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBoYW5kbGUgdGhlc2UgY2FzZXMKIAkJCXR5cGVEZWNsLnNldE1vZGlmaWVycyhtb2RpZmllcnMpOwogCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJCQlpbnQgbGVnYWxNb2RpZmllcnMgPQpAQCAtMTM4LDcgKzE2Miw3IEBACiAJCXR5cGVEZWNsLnNldEludGVyZmFjZSh0eXBlRGVjbGFyYXRpb24uaXNJbnRlcmZhY2UoKSk7CiAJCVNpbXBsZU5hbWUgdHlwZU5hbWUgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZURlY2xhcmF0aW9uLm5hbWUpKTsKIAkJdHlwZU5hbWUuc2V0U291cmNlUmFuZ2UodHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uc291cmNlRW5kIC0gdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0ICsgMSk7Ci0JCXR5cGVEZWNsLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5uYW1lKSkpOworCQl0eXBlRGVjbC5zZXROYW1lKHR5cGVOYW1lKTsKIAkJdHlwZURlY2wuc2V0U291cmNlUmFuZ2UodHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIHR5cGVEZWNsYXJhdGlvbi5ib2R5RW5kIC0gdHlwZURlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgKyAxKTsKIAkJCiAJCS8vIG5lZWQgdG8gc2V0IHRoZSBzdXBlcmNsYXNzIGFuZCBzdXBlciBpbnRlcmZhY2VzIGhlcmUgc2luY2Ugd2UgY2Fubm90IGRpc3Rpbmd1aXNoIHRoZW0gYXQKQEAgLTE1OCw2ICsxODIsNyBAQAogCQlzZXRKYXZhRG9jQ29tbWVudCh0eXBlRGVjbCk7CiAJCWlmIChyZXNvbHZlQmluZGluZ3MpIHsKIAkJCXJlY29yZE5vZGVzKHR5cGVEZWNsLCB0eXBlRGVjbGFyYXRpb24pOworCQkJcmVjb3JkTm9kZXModHlwZU5hbWUsIHR5cGVEZWNsYXJhdGlvbik7CiAJCQl0eXBlRGVjbC5yZXNvbHZlQmluZGluZygpOwogCQl9CiAJCXJldHVybiB0eXBlRGVjbDsKQEAgLTMwMywzNCArMzI4LDU0IEBACiAJcHJpdmF0ZSBRdWFsaWZpZWROYW1lIHNldFF1YWxpZmllZE5hbWVOYW1lQW5kU291cmNlUmFuZ2VzKGNoYXJbXVtdIHR5cGVOYW1lLCBsb25nW10gcG9zaXRpb25zLCBBc3ROb2RlIG5vZGUpIHsKIAkJaW50IGxlbmd0aCA9IHR5cGVOYW1lLmxlbmd0aDsKIAkJU2ltcGxlTmFtZSBmaXJzdFRva2VuID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHR5cGVOYW1lWzBdKSk7CisJCWZpcnN0VG9rZW4uaW5kZXggPSBsZW5ndGggLSAxOwogCQlpbnQgc3RhcnQwID0gKGludCkocG9zaXRpb25zWzBdPj4+MzIpOwogCQlpbnQgc3RhcnQgPSBzdGFydDA7CiAJCWludCBlbmQgPSAoaW50KShwb3NpdGlvbnNbMF0gJiAweEZGRkZGRkZGKTsKIAkJZmlyc3RUb2tlbi5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJU2ltcGxlTmFtZSBzZWNvbmRUb2tlbiA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0eXBlTmFtZVsxXSkpOworCQlzZWNvbmRUb2tlbi5pbmRleCA9IGxlbmd0aCAtIDI7CiAJCXN0YXJ0ID0gKGludCkocG9zaXRpb25zWzFdPj4+MzIpOwogCQllbmQgPSAoaW50KShwb3NpdGlvbnNbMV0gJiAweEZGRkZGRkZGKTsKIAkJc2Vjb25kVG9rZW4uc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CiAJCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IHRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoZmlyc3RUb2tlbiwgc2Vjb25kVG9rZW4pOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHF1YWxpZmllZE5hbWUsIG5vZGUpOworCQkJcmVjb3JkUGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24ocXVhbGlmaWVkTmFtZSk7CisJCQlyZWNvcmROb2RlcyhmaXJzdFRva2VuLCBub2RlKTsKKwkJCXJlY29yZE5vZGVzKHNlY29uZFRva2VuLCBub2RlKTsKKwkJCXJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKGZpcnN0VG9rZW4pOworCQkJcmVjb3JkUGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24oc2Vjb25kVG9rZW4pOworCQl9CisJCXF1YWxpZmllZE5hbWUuaW5kZXggPSBsZW5ndGggLSAyOwogCQlxdWFsaWZpZWROYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0MCwgZW5kIC0gc3RhcnQwICsgMSk7CiAJCVNpbXBsZU5hbWUgbmV3UGFydCA9IG51bGw7CiAJCWZvciAoaW50IGkgPSAyOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCW5ld1BhcnQgPSB0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZU5hbWVbaV0pKTsKKwkJCW5ld1BhcnQuaW5kZXggPSBsZW5ndGggLSBpIC0gMTsKIAkJCXN0YXJ0ID0gKGludCkocG9zaXRpb25zW2ldPj4+MzIpOwogCQkJZW5kID0gKGludCkocG9zaXRpb25zW2ldICYgMHhGRkZGRkZGRik7CiAJCQluZXdQYXJ0LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCAgZW5kIC0gc3RhcnQgKyAxKTsKIAkJCXF1YWxpZmllZE5hbWUgPSB0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIG5ld1BhcnQpOworCQkJcXVhbGlmaWVkTmFtZS5pbmRleCA9IG5ld1BhcnQuaW5kZXg7CiAJCQlxdWFsaWZpZWROYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0MCwgZW5kIC0gc3RhcnQwICsgMSk7CisJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQlyZWNvcmROb2RlcyhxdWFsaWZpZWROYW1lLCBub2RlKTsKKwkJCQlyZWNvcmROb2RlcyhuZXdQYXJ0LCBub2RlKTsJCQkJCisJCQkJcmVjb3JkUGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24ocXVhbGlmaWVkTmFtZSk7CisJCQkJcmVjb3JkUGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24obmV3UGFydCk7CisJCQl9CiAJCX0KIAkJUXVhbGlmaWVkTmFtZSBuYW1lID0gcXVhbGlmaWVkTmFtZTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2RlcyhuYW1lLCBub2RlKTsKKwkJCXJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKG5hbWUpOwogCQl9CiAJCXJldHVybiBuYW1lOwogCX0KIAkKIAlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KFRoaXNSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gVGhpc1JlZmVyZW5jZS5UaGlzSW1wbGljaXQpIHsKKwkJaWYgKHJlZmVyZW5jZS5pc0ltcGxpY2l0VGhpcygpKSB7CiAJCQkvLyBUaGVyZSBpcyBubyBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGFuIGltcGxpY2l0IHRoaXMKIAkJCXJldHVybiBudWxsOwogCQl9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSB7CkBAIC0zMzksMjEgKzM4NCwyMyBAQAogCQkJcmV0dXJuIGNvbnZlcnQoKFF1YWxpZmllZFRoaXNSZWZlcmVuY2UpIHJlZmVyZW5jZSk7CiAJCX0gIGVsc2UgewogCQkJVGhpc0V4cHJlc3Npb24gdGhpc0V4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdUaGlzRXhwcmVzc2lvbigpOworCQkJdGhpc0V4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UocmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCByZWZlcmVuY2Uuc291cmNlRW5kIC0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICsgMSk7CiAJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKIAkJCQlyZWNvcmROb2Rlcyh0aGlzRXhwcmVzc2lvbiwgcmVmZXJlbmNlKTsKKwkJCQlyZWNvcmRQZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb24odGhpc0V4cHJlc3Npb24pOwogCQkJfQotCQkJdGhpc0V4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UocmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCByZWZlcmVuY2Uuc291cmNlRW5kIC0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICsgMSk7CiAJCQlyZXR1cm4gdGhpc0V4cHJlc3Npb247CiAJCX0KIAl9CiAKIAlwdWJsaWMgVGhpc0V4cHJlc3Npb24gY29udmVydChRdWFsaWZpZWRUaGlzUmVmZXJlbmNlIHJlZmVyZW5jZSkgewogCQlUaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1RoaXNFeHByZXNzaW9uKCk7Ci0JCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewotCQkJcmVjb3JkTm9kZXModGhpc0V4cHJlc3Npb24sIHJlZmVyZW5jZSk7Ci0JCX0KIAkJdGhpc0V4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UocmVmZXJlbmNlLnNvdXJjZVN0YXJ0LCByZWZlcmVuY2Uuc291cmNlRW5kIC0gcmVmZXJlbmNlLnNvdXJjZVN0YXJ0ICsgMSk7CiAJCXRoaXNFeHByZXNzaW9uLnNldFF1YWxpZmllcihjb252ZXJ0KHJlZmVyZW5jZS5xdWFsaWZpY2F0aW9uKSk7CisJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJcmVjb3JkTm9kZXModGhpc0V4cHJlc3Npb24sIHJlZmVyZW5jZSk7CisJCQlyZWNvcmRQZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb24odGhpc0V4cHJlc3Npb24pOworCQl9CiAJCXJldHVybiB0aGlzRXhwcmVzc2lvbjsKIAl9CiAKQEAgLTQ1MSw2ICs0OTgsOCBAQAogCQkgKiBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciBidWlsdCBub2RlcyB3aXRoIGludmFsaWQgbW9kaWZpZXJzLgogCQkgKi8KIAkJdHJ5IHsKKwkJCS8vIEFjY0p1c3RGbGFnIGRvZXNuJ3QgZmx1c2ggTW9kaWZpZXIuVFJBTlNJRU5UIG9yIE1vZGlmaWVyLlZPTEFUSUxFLgorCQkJLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gaGFuZGxlIHRoZXNlIGNhc2VzCiAJCQl0eXBlRGVjbC5zZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKIAkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCQkJaW50IGxlZ2FsTW9kaWZpZXJzID0KQEAgLTQ2Myw3ICs1MTIsNyBAQAogCQl0eXBlRGVjbC5zZXRJbnRlcmZhY2UodHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkpOwogCQlTaW1wbGVOYW1lIHR5cGVOYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5uYW1lKSk7CiAJCXR5cGVOYW1lLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOwotCQl0eXBlRGVjbC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0eXBlRGVjbGFyYXRpb24ubmFtZSkpKTsKKwkJdHlwZURlY2wuc2V0TmFtZSh0eXBlTmFtZSk7CiAJCXR5cGVEZWNsLnNldFNvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCB0eXBlRGVjbGFyYXRpb24uYm9keUVuZCAtIHR5cGVEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CiAJCQogCQkvLyBuZWVkIHRvIHNldCB0aGUgc3VwZXJjbGFzcyBhbmQgc3VwZXIgaW50ZXJmYWNlcyBoZXJlIHNpbmNlIHdlIGNhbm5vdCBkaXN0aW5ndWlzaCB0aGVtIGF0CkBAIC00ODIsMTEgKzUzMSwyNCBAQAogCQlzZXRKYXZhRG9jQ29tbWVudCh0eXBlRGVjbCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXModHlwZURlY2wsIHR5cGVEZWNsYXJhdGlvbik7CisJCQlyZWNvcmROb2Rlcyh0eXBlTmFtZSwgdHlwZURlY2xhcmF0aW9uKTsKIAkJCXR5cGVEZWNsLnJlc29sdmVCaW5kaW5nKCk7CiAJCX0KIAkJcmV0dXJuIHR5cGVEZWNsOwogCX0KIAorCXByaXZhdGUgdm9pZCBjb21wbGV0ZVJlY29yZChBcnJheVR5cGUgYXJyYXlUeXBlLCBBc3ROb2RlIGFzdE5vZGUpIHsKKwkJQXJyYXlUeXBlIGFycmF5ID0gYXJyYXlUeXBlOworCQlpbnQgZGltZW5zaW9ucyA9IGFycmF5LmdldERpbWVuc2lvbnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKwkJCVR5cGUgY29tcG9uZW50VHlwZSA9IGFycmF5LmdldENvbXBvbmVudFR5cGUoKTsKKwkJCXRoaXMucmVjb3JkTm9kZXMoY29tcG9uZW50VHlwZSwgYXN0Tm9kZSk7CisJCQlpZiAoY29tcG9uZW50VHlwZS5pc0FycmF5VHlwZSgpKSB7CisJCQkJYXJyYXkgPSAoQXJyYXlUeXBlKSBjb21wb25lbnRUeXBlOworCQkJfQorCQl9CisJfQorCQogCXB1YmxpYyBUeXBlIGNvbnZlcnRUeXBlKFR5cGVSZWZlcmVuY2UgdHlwZVJlZmVyZW5jZSkgewogCQlUeXBlIHR5cGUgPSBudWxsOwkJCQkKIAkJaW50IHNvdXJjZVN0YXJ0ID0gLTE7CkBAIC01MDAsMTkgKzU2MiwyMyBAQAogCQkJaWYgKGRpbWVuc2lvbnMgIT0gMCkgewogCQkJCS8vIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlIG9mIHByaW1pdGl2ZSB0eXBlcyBvciBub3QKIAkJCQlpZiAoaXNQcmltaXRpdmVUeXBlKG5hbWUpKSB7Ci0JCQkJCWludCBlbmQgPSByZXRyaWV2ZVN0YXJ0aW5nTGVmdEJyYWNrZXRQb3NpdGlvbihzb3VyY2VTdGFydCwgc291cmNlU3RhcnQgKyBsZW5ndGgpOworCQkJCQlpbnQgZW5kID0gcmV0cmlldmVFbmRPZkVsZW1lbnRUeXBlTmFtZVBvc2l0aW9uKHNvdXJjZVN0YXJ0LCBzb3VyY2VTdGFydCArIGxlbmd0aCk7CiAJCQkJCWlmIChlbmQgPT0gLTEpIHsKLQkJCQkJCWVuZCA9IHNvdXJjZVN0YXJ0ICsgbGVuZ3RoOworCQkJCQkJZW5kID0gc291cmNlU3RhcnQgKyBsZW5ndGggLSAxOwogCQkJCQl9CQkJCQkKIAkJCQkJUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlID0gdGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShnZXRQcmltaXRpdmVUeXBlQ29kZShuYW1lKSk7CiAJCQkJCXByaW1pdGl2ZVR5cGUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CiAJCQkJCXR5cGUgPSB0aGlzLmFzdC5uZXdBcnJheVR5cGUocHJpbWl0aXZlVHlwZSwgZGltZW5zaW9ucyk7CisJCQkJCWlmIChyZXNvbHZlQmluZGluZ3MpIHsKKwkJCQkJCS8vIHN0b3JlIGtleXMgZm9yIGlubmVyIHR5cGVzCisJCQkJCQljb21wbGV0ZVJlY29yZCgoQXJyYXlUeXBlKSB0eXBlLCB0eXBlUmVmZXJlbmNlKTsKKwkJCQkJfQogCQkJCQl0eXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOwogCQkJCX0gZWxzZSB7CiAJCQkJCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhuYW1lKSk7CiAJCQkJCS8vIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJyYWNlIGluIG9yZGVyIHRvIHNldCB0aGUgcHJvcGVyIGxlbmd0aAogCQkJCQkvLyBQUiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzU5Ci0JCQkJCWludCBlbmQgPSByZXRyaWV2ZVN0YXJ0aW5nTGVmdEJyYWNrZXRQb3NpdGlvbihzb3VyY2VTdGFydCwgc291cmNlU3RhcnQgKyBsZW5ndGgpOworCQkJCQlpbnQgZW5kID0gcmV0cmlldmVFbmRPZkVsZW1lbnRUeXBlTmFtZVBvc2l0aW9uKHNvdXJjZVN0YXJ0LCBzb3VyY2VTdGFydCArIGxlbmd0aCk7CiAJCQkJCWlmIChlbmQgPT0gLTEpIHsKIAkJCQkJCWVuZCA9IHNvdXJjZVN0YXJ0ICsgbGVuZ3RoIC0gMTsKIAkJCQkJfQpAQCAtNTIyLDYgKzU4OCw3IEBACiAJCQkJCXR5cGUgPSB0aGlzLmFzdC5uZXdBcnJheVR5cGUoc2ltcGxlVHlwZSwgZGltZW5zaW9ucyk7CiAJCQkJCXR5cGUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CiAJCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCQkJY29tcGxldGVSZWNvcmQoKEFycmF5VHlwZSkgdHlwZSwgdHlwZVJlZmVyZW5jZSk7CiAJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHNpbXBsZU5hbWUsIHR5cGVSZWZlcmVuY2UpOwogCQkJCQl9CiAJCQkJfQpAQCAtNTQ1LDEyICs2MTIsMTUgQEAKIAkJCWxvbmdbXSBwb3NpdGlvbnMgPSAoKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIHR5cGVSZWZlcmVuY2UpLnNvdXJjZVBvc2l0aW9uczsKIAkJCXNvdXJjZVN0YXJ0ID0gKGludCkocG9zaXRpb25zWzBdPj4+MzIpOwogCQkJbGVuZ3RoID0gKGludCkocG9zaXRpb25zW25hbWVMZW5ndGggLSAxXSAmIDB4RkZGRkZGRkYpIC0gc291cmNlU3RhcnQgKyAxOworCQkJTmFtZSBxdWFsaWZpZWROYW1lID0gdGhpcy5zZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyhuYW1lLCBwb3NpdGlvbnMsIHR5cGVSZWZlcmVuY2UpOwogCQkJaWYgKGRpbWVuc2lvbnMgIT0gMCkgewogCQkJCS8vIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhpcyBpcyBhbiBhcnJheSB0eXBlIG9mIHByaW1pdGl2ZSB0eXBlcyBvciBub3QKLQkJCQlOYW1lIHF1YWxpZmllZE5hbWUgPSB0aGlzLnNldFF1YWxpZmllZE5hbWVOYW1lQW5kU291cmNlUmFuZ2VzKG5hbWUsIHBvc2l0aW9ucywgdHlwZVJlZmVyZW5jZSk7CiAJCQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gdGhpcy5hc3QubmV3U2ltcGxlVHlwZShxdWFsaWZpZWROYW1lKTsKIAkJCQlzaW1wbGVUeXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOwogCQkJCXR5cGUgPSB0aGlzLmFzdC5uZXdBcnJheVR5cGUoc2ltcGxlVHlwZSwgZGltZW5zaW9ucyk7CisJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCWNvbXBsZXRlUmVjb3JkKChBcnJheVR5cGUpIHR5cGUsIHR5cGVSZWZlcmVuY2UpOworCQkJCX0JCQkJCiAJCQkJaW50IGVuZCA9IHJldHJpZXZlRW5kT2ZEaW1lbnNpb25zUG9zaXRpb24oc291cmNlU3RhcnQrbGVuZ3RoLCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGgpOwogCQkJCWlmIChlbmQgIT0gLTEpIHsKIAkJCQkJdHlwZS5zZXRTb3VyY2VSYW5nZShzb3VyY2VTdGFydCwgZW5kIC0gc291cmNlU3RhcnQgKyAxKTsKQEAgLTU1OCw3ICs2MjgsNiBAQAogCQkJCQl0eXBlLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBsZW5ndGgpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJTmFtZSBxdWFsaWZpZWROYW1lID0gdGhpcy5zZXRRdWFsaWZpZWROYW1lTmFtZUFuZFNvdXJjZVJhbmdlcyhuYW1lLCBwb3NpdGlvbnMsIHR5cGVSZWZlcmVuY2UpOwogCQkJCXR5cGUgPSB0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHF1YWxpZmllZE5hbWUpOwogCQkJCXR5cGUuc2V0U291cmNlUmFuZ2Uoc291cmNlU3RhcnQsIGxlbmd0aCk7CiAJCQl9CkBAIC01NzYsNiArNjQ1LDcgQEAKIAkJICogVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgYnVpbHQgbm9kZXMgd2l0aCBpbnZhbGlkIG1vZGlmaWVycy4KIAkJICovCiAJCXRyeSB7CisJCQkvLyBpZiBNb2RpZmllci5WT0xBVElMRSBpcyBzZXQsIHNldE1vZGlmaWVycyBpcyBub3QgYWxsb3dlZCwgYnV0IHRoZSBjb2RlIGhhcyBubyBzeW50YXggZXJyb3IuCiAJCQltZXRob2REZWNsLnNldE1vZGlmaWVycyhtZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNvbXBpbGVyTW9kaWZpZXJzLkFjY0p1c3RGbGFnKTsKIAkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCQkJaW50IGxlZ2FsTW9kaWZpZXJzID0KQEAgLTU4OCw3ICs2NTgsOSBAQAogCQlib29sZWFuIGlzQ29uc3RydWN0b3IgPSBtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCk7CiAJCW1ldGhvZERlY2wuc2V0Q29uc3RydWN0b3IoaXNDb25zdHJ1Y3Rvcik7CiAJCVNpbXBsZU5hbWUgbWV0aG9kTmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhtZXRob2REZWNsYXJhdGlvbi5zZWxlY3RvcikpOwotCQltZXRob2ROYW1lLnNldFNvdXJjZVJhbmdlKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQgLSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOworCQlpbnQgc3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwkJaW50IGVuZCA9IHJldHJpZXZlSWRlbnRpZmllckVuZFBvc2l0aW9uKHN0YXJ0LCBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VFbmQpOworCQltZXRob2ROYW1lLnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogCQltZXRob2REZWNsLnNldE5hbWUobWV0aG9kTmFtZSk7CiAJCVR5cGVSZWZlcmVuY2VbXSB0aHJvd25FeGNlcHRpb25zID0gbWV0aG9kRGVjbGFyYXRpb24udGhyb3duRXhjZXB0aW9uczsKIAkJaWYgKHRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgewpAQCAtNjA3LDE0ICs2NzksMjEgQEAKIAkJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBudWxsOwogCQlpZiAoaXNDb25zdHJ1Y3RvcikgewogCQkJLy8gc2V0IHRoZSByZXR1cm4gdHlwZSB0byBWT0lECi0JCQltZXRob2REZWNsLnNldFJldHVyblR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlZPSUQpKTsKKwkJCVByaW1pdGl2ZVR5cGUgcmV0dXJuVHlwZSA9IHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5WT0lEKTsKKwkJCXJldHVyblR5cGUuc2V0U291cmNlUmFuZ2UobWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIDApOworCQkJbWV0aG9kRGVjbC5zZXRSZXR1cm5UeXBlKHJldHVyblR5cGUpOwogCQkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uOwogCQkJZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yQ2FsbDsKIAkJfSBlbHNlIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uOwogCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gbWV0aG9kLnJldHVyblR5cGU7CiAJCQlpZiAodHlwZVJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJbWV0aG9kRGVjbC5zZXRSZXR1cm5UeXBlKGNvbnZlcnRUeXBlKHR5cGVSZWZlcmVuY2UpKTsKKwkJCQlUeXBlIHJldHVyblR5cGUgPSBjb252ZXJ0VHlwZSh0eXBlUmVmZXJlbmNlKTsKKwkJCQkvLyBnZXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgcmlnaHQgcGFyZW50aGVzaXMKKwkJCQlpbnQgcmlnaHRQYXJlbnRoZXNpc1Bvc2l0aW9uID0gcmV0cmlldmVFbmRPZlJpZ2h0UGFyZW50aGVzaXNQb3NpdGlvbihlbmQsIG1ldGhvZC5ib2R5RW5kKTsKKwkJCQlpbnQgZXh0cmFEaW1lbnNpb25zID0gcmV0cmlldmVFeHRyYURpbWVuc2lvbihyaWdodFBhcmVudGhlc2lzUG9zaXRpb24sIG1ldGhvZC5ib2R5RW5kKTsKKwkJCQltZXRob2REZWNsLnNldEV4dHJhRGltZW5zaW9ucyhleHRyYURpbWVuc2lvbnMpOworCQkJCXNldFR5cGVGb3JNZXRob2REZWNsYXJhdGlvbihtZXRob2REZWNsLCByZXR1cm5UeXBlLCBleHRyYURpbWVuc2lvbnMpOwogCQkJfQogCQl9CiAJCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gbWV0aG9kRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKQEAgLTYyNiwxMCArNzA1LDEwIEBACiAJCQogCQlpZiAoc3RhdGVtZW50cyAhPSBudWxsIHx8IGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsICE9IG51bGwpIHsKIAkJCUJsb2NrIGJsb2NrID0gdGhpcy5hc3QubmV3QmxvY2soKTsKLQkJCWludCBzdGFydCA9IHJldHJpZXZlU3RhcnRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCBkZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JCQlpbnQgZW5kID0gcmV0cmlldmVFbmRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGgpOworCQkJc3RhcnQgPSByZXRyaWV2ZVN0YXJ0QmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkJZW5kID0gcmV0cmlldmVFbmRCbG9ja1Bvc2l0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGgpOwogCQkJYmxvY2suc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7Ci0JCQlpZiAoZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgeworCQkJaWYgKGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsICE9IG51bGwgJiYgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSAhPSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKSB7CiAJCQkJYmxvY2suc3RhdGVtZW50cygpLmFkZChjb252ZXJ0KGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSk7CiAJCQl9CiAJCQlpbnQgc3RhdGVtZW50c0xlbmd0aCA9IHN0YXRlbWVudHMgPT0gbnVsbCA/IDAgOiBzdGF0ZW1lbnRzLmxlbmd0aDsKQEAgLTY0Miw4ICs3MjEsOCBAQAogCQkJfQogCQkJbWV0aG9kRGVjbC5zZXRCb2R5KGJsb2NrKTsKIAkJfSBlbHNlIGlmICghbWV0aG9kRGVjbGFyYXRpb24uaXNOYXRpdmUoKSAmJiAhbWV0aG9kRGVjbGFyYXRpb24uaXNBYnN0cmFjdCgpKSB7Ci0JCQlpbnQgc3RhcnQgPSByZXRyaWV2ZVN0YXJ0QmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotCQkJaW50IGVuZCA9IHJldHJpZXZlRW5kQmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCXN0YXJ0ID0gcmV0cmlldmVTdGFydEJsb2NrUG9zaXRpb24obWV0aG9kRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJCWVuZCA9IHJldHJpZXZlRW5kQmxvY2tQb3NpdGlvbihtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKIAkJCWlmIChzdGFydCAhPSAtMSAmJiBlbmQgIT0gLTEpIHsKIAkJCQkvKgogCQkJCSAqIHN0YXJ0IG9yIGVuZCBjYW4gYmUgZXF1YWwgdG8gLTEgaWYgd2UgaGF2ZSBhbiBpbnRlcmZhY2UncyBtZXRob2QuCkBAIC02NTYsMTMgKzczNSwxNCBAQAogCQlzZXRKYXZhRG9jQ29tbWVudChtZXRob2REZWNsKTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2RlcyhtZXRob2REZWNsLCBtZXRob2REZWNsYXJhdGlvbik7CisJCQlyZWNvcmROb2RlcyhtZXRob2ROYW1lLCBtZXRob2REZWNsYXJhdGlvbik7CiAJCQltZXRob2REZWNsLnJlc29sdmVCaW5kaW5nKCk7CiAJCX0KIAkJcmV0dXJuIG1ldGhvZERlY2w7CiAJfQkKIAogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGNoZWNrRm9yUGFyZW50aGVzaXMoZXhwcmVzc2lvbikpIHsKKwkJaWYgKChleHByZXNzaW9uLmJpdHMgJiBBc3ROb2RlLlBhcmVudGhlc2l6ZWRNQVNLKSAhPSAwKSB7CiAJCQlyZXR1cm4gY29udmVydFRvUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAJCX0KIAkJaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uKSB7CkBAIC03NzIsNiArODUyLDExIEBACiAJCX0KIAkJcGFyZW50aGVzaXplZEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CiAJCWFkanVzdFNvdXJjZVBvc2l0aW9uc0ZvclBhcmVudChleHByZXNzaW9uKTsKKwkJcmVtb3ZlRXh0cmFCbGFua3MoZXhwcmVzc2lvbik7CisJCS8vIGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBhcmVudGhlc2lzCisJCWludCBudW1iZXJPZlBhcmVudGhlc2lzID0gKGV4cHJlc3Npb24uYml0cyAmIEFzdE5vZGUuUGFyZW50aGVzaXplZE1BU0spID4+IEFzdE5vZGUuUGFyZW50aGVzaXplZFNISUZUOworCQlleHByZXNzaW9uLmJpdHMgJj0gfkFzdE5vZGUuUGFyZW50aGVzaXplZE1BU0s7CisJCWV4cHJlc3Npb24uYml0cyB8PSAobnVtYmVyT2ZQYXJlbnRoZXNpcyAtIDEpIDw8IEFzdE5vZGUuUGFyZW50aGVzaXplZFNISUZUOwogCQlwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbikpOwogCQlyZXR1cm4gcGFyZW50aGVzaXplZEV4cHJlc3Npb247CiAJfQpAQCAtOTEwLDYgKzk5NSw5IEBACiAJCQlhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwogCQl9IGVsc2UgewogCQkJYXJyYXlUeXBlID0gdGhpcy5hc3QubmV3QXJyYXlUeXBlKHR5cGUsIGRpbWVuc2lvbnNMZW5ndGgpOworCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJY29tcGxldGVSZWNvcmQoYXJyYXlUeXBlLCBleHByZXNzaW9uKTsKKwkJCX0JCQkKIAkJCWludCBzdGFydCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJaW50IGVuZCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpICsgdHlwZS5nZXRMZW5ndGgoKTsKIAkJCWludCBwcmV2aW91c1NlYXJjaFN0YXJ0ID0gZW5kOwpAQCAtOTI3LDkgKzEwMTUsNiBAQAogCQlpZiAoZXhwcmVzc2lvbi5pbml0aWFsaXplciAhPSBudWxsKSB7CiAJCQlhcnJheUNyZWF0aW9uLnNldEluaXRpYWxpemVyKGNvbnZlcnQoZXhwcmVzc2lvbi5pbml0aWFsaXplcikpOwogCQl9Ci0JCWlmIChleHByZXNzaW9uLmluaXRpYWxpemVyICE9IG51bGwpIHsKLQkJCWFycmF5Q3JlYXRpb24uc2V0SW5pdGlhbGl6ZXIoY29udmVydChleHByZXNzaW9uLmluaXRpYWxpemVyKSk7Ci0JCX0KIAkJcmV0dXJuIGFycmF5Q3JlYXRpb247CiAJfQogCkBAIC05NTIsMTIgKzEwMzcsMjAgQEAKIAkJCiAJCXZhcmlhYmxlRGVjbC5zZXRNb2RpZmllcnMoYXJndW1lbnQubW9kaWZpZXJzKTsKIAkJU2ltcGxlTmFtZSBuYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShhcmd1bWVudC5uYW1lKCkpOwotCQluYW1lLnNldFNvdXJjZVJhbmdlKGFyZ3VtZW50LnNvdXJjZVN0YXJ0LCBhcmd1bWVudC5zb3VyY2VFbmQgLSBhcmd1bWVudC5zb3VyY2VTdGFydCArIDEpOworCQlpbnQgc3RhcnQgPSBhcmd1bWVudC5zb3VyY2VTdGFydDsKKwkJaW50IG5hbWVFbmQgPSBhcmd1bWVudC5zb3VyY2VFbmQ7CisJCW5hbWUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIG5hbWVFbmQgLSBzdGFydCArIDEpOwogCQl2YXJpYWJsZURlY2wuc2V0TmFtZShuYW1lKTsKKwkJZmluYWwgaW50IGV4dHJhRGltZW5zaW9ucyA9IHJldHJpZXZlRXh0cmFEaW1lbnNpb24obmFtZUVuZCArIDEsIGFyZ3VtZW50LnR5cGUuc291cmNlRW5kKTsKKwkJdmFyaWFibGVEZWNsLnNldEV4dHJhRGltZW5zaW9ucyhleHRyYURpbWVuc2lvbnMpOwogCQlUeXBlIHR5cGUgPSBjb252ZXJ0VHlwZShhcmd1bWVudC50eXBlKTsKLQkJdmFyaWFibGVEZWNsLnNldFR5cGUodHlwZSk7CiAJCWludCB0eXBlRW5kID0gdHlwZS5nZXRTdGFydFBvc2l0aW9uKCkgKyB0eXBlLmdldExlbmd0aCgpIC0gMTsKIAkJaW50IHJpZ2h0RW5kID0gTWF0aC5tYXgodHlwZUVuZCwgYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQkvKgorCQkgKiBUaGVyZSBpcyBleHRyYSB3b3JrIHRvIGRvIHRvIHNldCB0aGUgcHJvcGVyIHR5cGUgcG9zaXRpb25zCisJCSAqIFNlZSBQUiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4NAorCQkgKi8KKwkJc2V0VHlwZUZvclNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsLCB0eXBlLCBleHRyYURpbWVuc2lvbnMpOwogCQl2YXJpYWJsZURlY2wuc2V0U291cmNlUmFuZ2UoYXJndW1lbnQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgcmlnaHRFbmQgLSBhcmd1bWVudC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXMobmFtZSwgYXJndW1lbnQpOwpAQCAtMTExMywxMCArMTIwNiwxMSBAQAogCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7CiAJCWNhc3RFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKGV4cHJlc3Npb24uc291cmNlU3RhcnQsIGV4cHJlc3Npb24uc291cmNlRW5kIC0gZXhwcmVzc2lvbi5zb3VyY2VTdGFydCArIDEpOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gdHlwZSA9IGV4cHJlc3Npb24udHlwZTsKKwkJcmVtb3ZlRXh0cmFCbGFua3ModHlwZSk7CiAJCWlmICh0eXBlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSApIHsKLQkJCWNhc3RFeHByZXNzaW9uLnNldFR5cGUoY29udmVydFR5cGUoKFR5cGVSZWZlcmVuY2UpZXhwcmVzc2lvbi50eXBlKSk7CisJCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKGNvbnZlcnRUeXBlKChUeXBlUmVmZXJlbmNlKXR5cGUpKTsKIAkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgTmFtZVJlZmVyZW5jZSkgewotCQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZShjb252ZXJ0VG9UeXBlKChOYW1lUmVmZXJlbmNlKWV4cHJlc3Npb24udHlwZSkpOworCQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZShjb252ZXJ0VG9UeXBlKChOYW1lUmVmZXJlbmNlKXR5cGUpKTsKIAkJfQogCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKSk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewpAQCAtMTI5NSw3ICsxMzg5LDcgQEAKIAkJcmV0dXJuIGxpdGVyYWw7CiAJfQogCQotCXB1YmxpYyBJbmZpeEV4cHJlc3Npb24gY29udmVydChCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJdGhpcy5yZWNvcmROb2RlcyhpbmZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOwpAQCAtMTM2MSw0MiArMTQ1NSw2MiBAQAogCQkJCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7CiAJCX07CiAJCQotCQlpZiAoZXhwcmVzc2lvbi5sZWZ0IGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbi5sZWZ0IGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbiAmJiAoKGV4cHJlc3Npb24ubGVmdC5iaXRzICYgQXN0Tm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPT0gMCkpIHsKIAkJCS8vIGNyZWF0ZSBhbiBleHRlbmRlZCBzdHJpbmcgbGl0ZXJhbCBlcXVpdmFsZW50ID0+IHVzZSB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMgbGlzdAogCQkJaW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKS5hZGQoY29udmVydChleHByZXNzaW9uLnJpZ2h0KSk7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gbGVmdE9wZXJhbmQgPSBleHByZXNzaW9uLmxlZnQ7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gcmlnaHRPcGVyYW5kID0gbnVsbDsKIAkJCWRvIHsKLQkJCQlpZiAoKChsZWZ0T3BlcmFuZC5iaXRzICYgT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU0hJRlQpICE9IGV4cHJlc3Npb25PcGVyYXRvcklEKSB7Ci0JCQkJCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuY2xlYXIoKTsKLQkJCQkJRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGNvbnZlcnQoZXhwcmVzc2lvbi5sZWZ0KTsKLQkJCQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxlZnRFeHByZXNzaW9uKTsKLQkJCQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZChjb252ZXJ0KGV4cHJlc3Npb24ucmlnaHQpKTsKLQkJCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBsZWZ0RXhwcmVzc2lvbi5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJcmlnaHRPcGVyYW5kID0gKChCaW5hcnlFeHByZXNzaW9uKSBsZWZ0T3BlcmFuZCkucmlnaHQ7CisJCQkJaWYgKCgoKGxlZnRPcGVyYW5kLmJpdHMgJiBPcGVyYXRvckV4cHJlc3Npb24uT3BlcmF0b3JNQVNLKSA+PiBPcGVyYXRvckV4cHJlc3Npb24uT3BlcmF0b3JTSElGVCkgIT0gZXhwcmVzc2lvbk9wZXJhdG9ySUQgJiYgKChsZWZ0T3BlcmFuZC5iaXRzICYgQXN0Tm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPT0gMCkpCisJCQkJIHx8ICgocmlnaHRPcGVyYW5kIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbiAmJiAoKHJpZ2h0T3BlcmFuZC5iaXRzICYgT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yTUFTSykgPj4gT3BlcmF0b3JFeHByZXNzaW9uLk9wZXJhdG9yU0hJRlQpICE9IGV4cHJlc3Npb25PcGVyYXRvcklEKSAmJiAoKHJpZ2h0T3BlcmFuZC5iaXRzICYgQXN0Tm9kZS5QYXJlbnRoZXNpemVkTUFTSykgPT0gMCkpKSB7CisJCQkJIAlMaXN0IGV4dGVuZGVkT3BlcmFuZHMgPSBpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpOworCQkJCSAJSW5maXhFeHByZXNzaW9uIHRlbXAgPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKKwkJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CisJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHRlbXAsIGV4cHJlc3Npb24pOworCQkJCQl9CisJCQkJIAl0ZW1wLnNldE9wZXJhdG9yKGdldE9wZXJhdG9yRm9yKGV4cHJlc3Npb25PcGVyYXRvcklEKSk7CisJCQkJIAlFeHByZXNzaW9uIGxlZnRTaWRlID0gY29udmVydChsZWZ0T3BlcmFuZCk7CisJCQkJCXRlbXAuc2V0TGVmdE9wZXJhbmQobGVmdFNpZGUpOworCQkJCQl0ZW1wLnNldFNvdXJjZVJhbmdlKGxlZnRTaWRlLmdldFN0YXJ0UG9zaXRpb24oKSwgbGVmdFNpZGUuZ2V0TGVuZ3RoKCkpOworCQkJCQlpbnQgc2l6ZSA9IGV4dGVuZGVkT3BlcmFuZHMuc2l6ZSgpOworCQkJCSAJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisJCQkJIAkJRXhwcmVzc2lvbiBleHByID0gdGVtcDsKKwkJCQkgCQl0ZW1wID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7CisJCQkJIAkJCisJCQkJCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCQkJCQl0aGlzLnJlY29yZE5vZGVzKHRlbXAsIGV4cHJlc3Npb24pOworCQkJCQkJfQkJCQkgCQorCQkJCSAJCXRlbXAuc2V0TGVmdE9wZXJhbmQoZXhwcik7CisJCQkJCSAJdGVtcC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvckZvcihleHByZXNzaW9uT3BlcmF0b3JJRCkpOworCQkJCQkJdGVtcC5zZXRTb3VyY2VSYW5nZShleHByLmdldFN0YXJ0UG9zaXRpb24oKSwgZXhwci5nZXRMZW5ndGgoKSk7CisJCQkJIAl9CisJCQkJIAlpbmZpeEV4cHJlc3Npb24gPSB0ZW1wOworCQkJCSAJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkgCQlFeHByZXNzaW9uIGV4dGVuZGVkT3BlcmFuZCA9IChFeHByZXNzaW9uKSBleHRlbmRlZE9wZXJhbmRzLnJlbW92ZShzaXplIC0gMSAtIGkpOworCQkJCSAJCXRlbXAuc2V0UmlnaHRPcGVyYW5kKGV4dGVuZGVkT3BlcmFuZCk7CisJCQkJIAkJaW50IHN0YXJ0UG9zaXRpb24gPSB0ZW1wLmdldExlZnRPcGVyYW5kKCkuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCSAJCXRlbXAuc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZXh0ZW5kZWRPcGVyYW5kLmdldFN0YXJ0UG9zaXRpb24oKSArIGV4dGVuZGVkT3BlcmFuZC5nZXRMZW5ndGgoKSAtIHN0YXJ0UG9zaXRpb24pOworCQkJCSAJCWlmICh0ZW1wLmdldExlZnRPcGVyYW5kKCkuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLklORklYX0VYUFJFU1NJT04pIHsKKwkJCQkgCQkJdGVtcCA9IChJbmZpeEV4cHJlc3Npb24pIHRlbXAuZ2V0TGVmdE9wZXJhbmQoKTsKKwkJCQkgCQl9CisJCQkJIAl9CisJCQkJCWludCBzdGFydFBvc2l0aW9uID0gaW5maXhFeHByZXNzaW9uLmdldExlZnRPcGVyYW5kKCkuZ2V0U3RhcnRQb3NpdGlvbigpOwogCQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBzdGFydFBvc2l0aW9uICsgMSk7CisJCQkJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgeworCQkJCQkJdGhpcy5yZWNvcmROb2RlcyhpbmZpeEV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworCQkJCQl9CiAJCQkJCXJldHVybiBpbmZpeEV4cHJlc3Npb247CiAJCQkJfQotCQkJCXJpZ2h0T3BlcmFuZCA9ICgoQmluYXJ5RXhwcmVzc2lvbikgbGVmdE9wZXJhbmQpLnJpZ2h0OwogCQkJCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKDAsIGNvbnZlcnQocmlnaHRPcGVyYW5kKSk7CiAJCQkJbGVmdE9wZXJhbmQgPSAoKEJpbmFyeUV4cHJlc3Npb24pIGxlZnRPcGVyYW5kKS5sZWZ0OwotCQkJfSB3aGlsZSAobGVmdE9wZXJhbmQgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKTsKLQkJCS8vIGNoZWNrIHRoYXQgdGhlIHJpZ2h0IG9wZXJhbmQgd2Fzbid0IGEgQmluYXJ5RXhwcmVzc2lvbgotCQkJaWYgKHJpZ2h0T3BlcmFuZCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKLQkJCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmNsZWFyKCk7Ci0JCQkJRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGNvbnZlcnQoZXhwcmVzc2lvbi5sZWZ0KTsKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOwotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoY29udmVydChleHByZXNzaW9uLnJpZ2h0KSk7Ci0JCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBsZWZ0RXhwcmVzc2lvbi5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JCQkJaW5maXhFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKHN0YXJ0UG9zaXRpb24sIGV4cHJlc3Npb24uc291cmNlRW5kIC0gc3RhcnRQb3NpdGlvbiArIDEpOwotCQkJCXJldHVybiBpbmZpeEV4cHJlc3Npb247Ci0JCQl9IGVsc2UgewotCQkJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGxlZnRPcGVyYW5kKTsKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGVmdEV4cHJlc3Npb24pOwotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoKEV4cHJlc3Npb24paW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKS5yZW1vdmUoMCkpOwotCQkJCWludCBzdGFydFBvc2l0aW9uID0gbGVmdEV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOwotCQkJCWluZml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHN0YXJ0UG9zaXRpb24gKyAxKTsKLQkJCQlyZXR1cm4gaW5maXhFeHByZXNzaW9uOwotCQkJfQorCQkJfSB3aGlsZSAobGVmdE9wZXJhbmQgaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uICYmICgobGVmdE9wZXJhbmQuYml0cyAmIEFzdE5vZGUuUGFyZW50aGVzaXplZE1BU0spID09IDApKTsKKwkJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGxlZnRPcGVyYW5kKTsKKwkJCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsZWZ0RXhwcmVzc2lvbik7CisJCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKChFeHByZXNzaW9uKWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkucmVtb3ZlKDApKTsKKwkJCWludCBzdGFydFBvc2l0aW9uID0gbGVmdEV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJaW5maXhFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKHN0YXJ0UG9zaXRpb24sIGV4cHJlc3Npb24uc291cmNlRW5kIC0gc3RhcnRQb3NpdGlvbiArIDEpOworCQkJcmV0dXJuIGluZml4RXhwcmVzc2lvbjsKIAkJfQkJCiAJCUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBjb252ZXJ0KGV4cHJlc3Npb24ubGVmdCk7CiAJCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsZWZ0RXhwcmVzc2lvbik7CkBAIC0xNDU3LDYgKzE1NzEsNyBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoTWVzc2FnZVNlbmQgZXhwcmVzc2lvbikgewogCQkvLyB3aWxsIHJldHVybiBhIE1ldGhvZEludm9jYXRpb24gb3IgYSBTdXBlck1ldGhvZEludm9jYXRpb24gb3IKIAkJRXhwcmVzc2lvbiBleHByOworCQlpbnQgc291cmNlU3RhcnQgPSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0OwogCQlpZiAoZXhwcmVzc2lvbi5pc1N1cGVyQWNjZXNzKCkpIHsKIAkJCS8vIHJldHVybnMgYSBTdXBlck1ldGhvZEludm9jYXRpb24KIAkJCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlck1ldGhvZEludm9jYXRpb24oKTsKQEAgLTE0NzksNiArMTU5NCw5IEBACiAJCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQkJCXJlY29yZE5vZGVzKHF1YWxpZmllciwgZXhwcmVzc2lvbi5yZWNlaXZlcik7CiAJCQkJfQorCQkJCWlmIChxdWFsaWZpZXIgIT0gbnVsbCkgeworCQkJCQlzb3VyY2VTdGFydCA9IHF1YWxpZmllci5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJfQkJCQogCQkJfQogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uW10gYXJndW1lbnRzID0gZXhwcmVzc2lvbi5hcmd1bWVudHM7CiAJCQlpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKQEAgLTE1MjIsOSArMTY0MCwxMiBAQAogCQkJCXJlY29yZE5vZGVzKHF1YWxpZmllciwgZXhwcmVzc2lvbi5yZWNlaXZlcik7CiAJCQl9CiAJCQltZXRob2RJbnZvY2F0aW9uLnNldEV4cHJlc3Npb24ocXVhbGlmaWVyKTsKKwkJCWlmIChxdWFsaWZpZXIgIT0gbnVsbCkgeworCQkJCXNvdXJjZVN0YXJ0ID0gcXVhbGlmaWVyLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCX0KIAkJCWV4cHIgPSBtZXRob2RJbnZvY2F0aW9uOwogCQl9Ci0JCWV4cHIuc2V0U291cmNlUmFuZ2UoZXhwcmVzc2lvbi5zb3VyY2VTdGFydCwgZXhwcmVzc2lvbi5zb3VyY2VFbmQgLSBleHByZXNzaW9uLnNvdXJjZVN0YXJ0ICsgMSk7CQorCQlleHByLnNldFNvdXJjZVJhbmdlKHNvdXJjZVN0YXJ0LCBleHByZXNzaW9uLnNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0ICsgMSk7CQogCQlyZW1vdmVUcmFpbGluZ0NvbW1lbnRGcm9tRXhwcmVzc2lvbkVuZGluZ1dpdGhBUGFyZW4oZXhwcik7CiAJCXJldHVybiBleHByOwogCX0KQEAgLTE2NjksMTEgKzE3OTAsMTUgQEAKIAlwdWJsaWMgQXNzZXJ0U3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAJCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdBc3NlcnRTdGF0ZW1lbnQoKTsKIAkJYXNzZXJ0U3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuYXNzZXJ0RXhwcmVzc2lvbikpOworCQlpbnQgZW5kID0gc3RhdGVtZW50LmFzc2VydEV4cHJlc3Npb24uc291cmNlRW5kICsgMTsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FeHByZXNzaW9uIGV4Y2VwdGlvbkFyZ3VtZW50ID0gc3RhdGVtZW50LmV4Y2VwdGlvbkFyZ3VtZW50OwogCQlpZiAoZXhjZXB0aW9uQXJndW1lbnQgIT0gbnVsbCkgewogCQkJYXNzZXJ0U3RhdGVtZW50LnNldE1lc3NhZ2UoY29udmVydChleGNlcHRpb25Bcmd1bWVudCkpOworCQkJZW5kID0gZXhjZXB0aW9uQXJndW1lbnQuc291cmNlRW5kICsgMTsKIAkJfQotCQlhc3NlcnRTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CisJCWludCBzdGFydCA9IHN0YXRlbWVudC5zb3VyY2VTdGFydDsKKwkJaW50IHNvdXJjZUVuZCA9IHJldHJpZXZlRW5kaW5nU2VtaUNvbG9uUG9zaXRpb24oZW5kLCBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJYXNzZXJ0U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBzb3VyY2VFbmQgLSBzdGFydCArIDEpOwogCQlyZXR1cm4gYXNzZXJ0U3RhdGVtZW50OwogCX0KIApAQCAtMTcwNCw2ICsxODI5LDcgQEAKIAkJCXJldHJpZXZlSWRlbnRpZmllckFuZFNldFBvc2l0aW9ucyhzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQsIG5hbWUpOwogCQkJYnJlYWtTdGF0ZW1lbnQuc2V0TGFiZWwobmFtZSk7CiAJCX0KKwkJcmV0cmlldmVTZW1pQ29sb25Qb3NpdGlvbihicmVha1N0YXRlbWVudCk7CiAJCXJldHVybiBicmVha1N0YXRlbWVudDsKIAl9CiAKQEAgLTE3MTUsNiArMTg0MSw3IEBACiAJCQlyZXRyaWV2ZUlkZW50aWZpZXJBbmRTZXRQb3NpdGlvbnMoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kLCBuYW1lKTsKIAkJCWNvbnRpbnVlU3RhdGVtZW50LnNldExhYmVsKG5hbWUpOwogCQl9CisJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24oY29udGludWVTdGF0ZW1lbnQpOwogCQlyZXR1cm4gY29udGludWVTdGF0ZW1lbnQ7CiAJfQogCQkKQEAgLTE3MjMsNiArMTg1MCw3IEBACiAJCVN3aXRjaENhc2Ugc3dpdGNoQ2FzZSA9IHRoaXMuYXN0Lm5ld1N3aXRjaENhc2UoKTsKIAkJc3dpdGNoQ2FzZS5zZXRTb3VyY2VSYW5nZShzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQgLSBzdGF0ZW1lbnQuc291cmNlU3RhcnQgKyAxKTsKIAkJc3dpdGNoQ2FzZS5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LmNvbnN0YW50RXhwcmVzc2lvbikpOworCQlyZXRyaWV2ZUNvbG9uUG9zaXRpb24oc3dpdGNoQ2FzZSk7CiAJCXJldHVybiBzd2l0Y2hDYXNlOwogCX0KIAkKQEAgLTE3MzAsNiArMTg1OCw3IEBACiAJCVN3aXRjaENhc2Ugc3dpdGNoQ2FzZSA9IHRoaXMuYXN0Lm5ld1N3aXRjaENhc2UoKTsKIAkJc3dpdGNoQ2FzZS5zZXRFeHByZXNzaW9uKG51bGwpOwogCQlzd2l0Y2hDYXNlLnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlyZXRyaWV2ZUNvbG9uUG9zaXRpb24oc3dpdGNoQ2FzZSk7CQkKIAkJcmV0dXJuIHN3aXRjaENhc2U7CiAJfQogCQpAQCAtMTczNyw4ICsxODY2LDE1IEBACiAJCURvU3RhdGVtZW50IGRvU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RG9TdGF0ZW1lbnQoKTsKIAkJZG9TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CiAJCWRvU3RhdGVtZW50LnNldEV4cHJlc3Npb24oY29udmVydChzdGF0ZW1lbnQuY29uZGl0aW9uKSk7Ci0JCWlmIChzdGF0ZW1lbnQuYWN0aW9uICE9IG51bGwpIHsKKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgYWN0aW9uID0gc3RhdGVtZW50LmFjdGlvbjsKKwkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CiAJCQlkb1N0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoc3RhdGVtZW50LmFjdGlvbikpOworCQl9IGVsc2UgeworCQkJRW1wdHlTdGF0ZW1lbnQgZW1wdHlTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpOworCQkJaW50IHN0YXJ0ID0gcmV0cmlldmVTdGFydGluZ1NlbWlDb2xvblBvc2l0aW9uKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCQlpbnQgZW5kID0gcmV0cmlldmVFbmRpbmdTZW1pQ29sb25Qb3NpdGlvbihzdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCQllbXB0eVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCWRvU3RhdGVtZW50LnNldEJvZHkoZW1wdHlTdGF0ZW1lbnQpOwogCQl9CiAJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24oZG9TdGF0ZW1lbnQpOwogCQlyZXR1cm4gZG9TdGF0ZW1lbnQ7CkBAIC0xNzUyLDcgKzE4ODgsNyBAQAogCQogCXB1YmxpYyBTdGF0ZW1lbnQgY29udmVydChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBzdGF0ZW1lbnQpIHsKIAkJU3RhdGVtZW50IG5ld1N0YXRlbWVudDsKLQkJaWYgKHN0YXRlbWVudC5pc1N1cGVyQWNjZXNzKCkgfHwgc3RhdGVtZW50LmlzU3VwZXIoKSB8fCBzdGF0ZW1lbnQuaXNJbXBsaWNpdFN1cGVyKCkpIHsKKwkJaWYgKHN0YXRlbWVudC5pc1N1cGVyQWNjZXNzKCkgfHwgc3RhdGVtZW50LmlzU3VwZXIoKSkgewogCQkJU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpOwogCQkJaWYgKHN0YXRlbWVudC5xdWFsaWZpY2F0aW9uICE9IG51bGwpIHsKIAkJCQlzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5zZXRFeHByZXNzaW9uKGNvbnZlcnQoc3RhdGVtZW50LnF1YWxpZmljYXRpb24pKTsKQEAgLTE3NzcsNiArMTkxMyw3IEBACiAJCQluZXdTdGF0ZW1lbnQgPSBjb25zdHJ1Y3Rvckludm9jYXRpb247CiAJCX0KIAkJbmV3U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOworCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKG5ld1N0YXRlbWVudCk7CiAJCWlmICh0aGlzLnJlc29sdmVCaW5kaW5ncykgewogCQkJcmVjb3JkTm9kZXMobmV3U3RhdGVtZW50LCBzdGF0ZW1lbnQpOwogCQl9CkBAIC0xNzg4LDkgKzE5MjUsMTkgQEAKIAkJZm9yU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCAtIHN0YXRlbWVudC5zb3VyY2VTdGFydCArIDEpOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudFtdIGluaXRpYWxpemF0aW9ucyA9IHN0YXRlbWVudC5pbml0aWFsaXphdGlvbnM7CiAJCWlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgewotCQkJaW50IGluaXRpYWxpemF0aW9uc0xlbmd0aCA9IGluaXRpYWxpemF0aW9ucy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemF0aW9uc0xlbmd0aDsgaSsrKSB7Ci0JCQkJZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpLmFkZChjb252ZXJ0VG9FeHByZXNzaW9uKGluaXRpYWxpemF0aW9uc1tpXSkpOworCQkJLy8gd2Uga25vdyB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGluaXRpYWxpemF0aW9uCisJCQlpZiAoaW5pdGlhbGl6YXRpb25zWzBdIGluc3RhbmNlb2YgTG9jYWxEZWNsYXJhdGlvbikgeworCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKExvY2FsRGVjbGFyYXRpb24pIGluaXRpYWxpemF0aW9uc1swXSk7CisJCQkJaW50IGluaXRpYWxpemF0aW9uc0xlbmd0aCA9IGluaXRpYWxpemF0aW9ucy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBpbml0aWFsaXphdGlvbnNMZW5ndGg7IGkrKykgeworCQkJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5mcmFnbWVudHMoKS5hZGQoY29udmVydFRvVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KChMb2NhbERlY2xhcmF0aW9uKWluaXRpYWxpemF0aW9uc1tpXSkpOworCQkJCX0KKwkJCQlmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGluaXRpYWxpemF0aW9uc0xlbmd0aCA9IGluaXRpYWxpemF0aW9ucy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsaXphdGlvbnNMZW5ndGg7IGkrKykgeworCQkJCQlmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCkuYWRkKGNvbnZlcnRUb0V4cHJlc3Npb24oaW5pdGlhbGl6YXRpb25zW2ldKSk7CisJCQkJfQogCQkJfQogCQl9CiAJCWlmIChzdGF0ZW1lbnQuY29uZGl0aW9uICE9IG51bGwpIHsKQEAgLTE4MDYsMTIgKzE5NTMsMTIgQEAKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgYWN0aW9uID0gc3RhdGVtZW50LmFjdGlvbjsKIAkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CiAJCQlmb3JTdGF0ZW1lbnQuc2V0Qm9keShjb252ZXJ0KHN0YXRlbWVudC5hY3Rpb24pKTsKLQkJCWlmICghKGFjdGlvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2spKSB7Ci0JCQkJLy8gc2V0IHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGZvciBzdGF0ZW1lbnQgb24gdGhlIHNlbWktY29sb24KLQkJCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKGZvclN0YXRlbWVudCk7Ci0JCQl9CiAJCX0gZWxzZSB7Ci0JCQlyZXRyaWV2ZVNlbWlDb2xvblBvc2l0aW9uKGZvclN0YXRlbWVudCk7CisJCQlFbXB0eVN0YXRlbWVudCBlbXB0eVN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0VtcHR5U3RhdGVtZW50KCk7CisJCQlpbnQgc3RhcnQgPSByZXRyaWV2ZVN0YXJ0aW5nU2VtaUNvbG9uUG9zaXRpb24oc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCWludCBlbmQgPSByZXRyaWV2ZUVuZGluZ1NlbWlDb2xvblBvc2l0aW9uKHN0YXJ0LCBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCWVtcHR5U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQkJZm9yU3RhdGVtZW50LnNldEJvZHkoZW1wdHlTdGF0ZW1lbnQpOwogCQl9CiAJCXJldHVybiBmb3JTdGF0ZW1lbnQ7CiAJfQpAQCAtMTgxOSw0MSArMTk2Niw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gY29udmVydFRvRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKIAkJaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgewogCQkJcmV0dXJuIGNvbnZlcnQoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbikgc3RhdGVtZW50KTsKLQkJfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7Ci0JCQlMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24gPSAoTG9jYWxEZWNsYXJhdGlvbikgc3RhdGVtZW50OwotCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJU2ltcGxlTmFtZSBuYW1lID0gdGhpcy5hc3QubmV3U2ltcGxlTmFtZShsb2NhbERlY2xhcmF0aW9uLm5hbWUoKSk7Ci0JCQluYW1lLnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uc291cmNlU3RhcnQsIGxvY2FsRGVjbGFyYXRpb24uc291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VTdGFydCArIDEpOwotCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUobmFtZSk7Ci0JCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7Ci0JCQlpZiAobG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbiAhPSBudWxsKSB7Ci0JCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNvbnZlcnQobG9jYWxEZWNsYXJhdGlvbi5pbml0aWFsaXphdGlvbikpOwotCQkJfQotCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7Ci0JCQkJcmVjb3JkTm9kZXModmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LCBsb2NhbERlY2xhcmF0aW9uKTsKLQkJCX0KLQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZUVuZCAtIGxvY2FsRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpOwotCQkJLyoqCi0JCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjMzCi0JCQkgKiBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciBidWlsdCB2YXJpYWJsZXMgd2l0aCBpbnZhbGlkIG1vZGlmaWVycy4KLQkJCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IGlzIHRhZ2dlZCBhcyBoYXZpbmcgd3JvbmcgbW9kaWZpZXJzIGZvciB0aGUgbG9jYWwuCi0JCQkgKiBPbmx5IGZpbmFsIGlzIGFsbG93ZWQgaW4gdGhpcyBjYXNlLgotCQkJICovCi0JCQl0cnkgewotCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldE1vZGlmaWVycyhsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyk7Ci0JCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKGxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgTW9kaWZpZXIuRklOQUwpOwotCQkJCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKLQkJCX0KLQkJCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMocmV0cmlldmVFeHRyYURpbWVuc2lvbihsb2NhbERlY2xhcmF0aW9uLnNvdXJjZUVuZCArIDEsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCkpOwotCQkJVHlwZSB0eXBlID0gY29udmVydFR5cGUobG9jYWxEZWNsYXJhdGlvbi50eXBlKTsKLQkJCXNldFR5cGVGb3JWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgdHlwZSwgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEV4dHJhRGltZW5zaW9ucygpKTsKLQkJCXJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKLQkJfSBlbHNlIHsKLQkJCS8vIHVuc3VwcG9ydGVkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkOiBjb252ZXJ0KCIgKyBzdGF0ZW1lbnQuZ2V0Q2xhc3MoKSArICIpIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJfQorCQkvLyB1bnN1cHBvcnRlZAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkOiBjb252ZXJ0KCIgKyBzdGF0ZW1lbnQuZ2V0Q2xhc3MoKSArICIpIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAl9CiAJCiAJcHVibGljIElmU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JZlN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKQEAgLTE4NjQsMTQgKzE5NzksMjQgQEAKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TdGF0ZW1lbnQgZWxzZVN0YXRlbWVudCA9IHN0YXRlbWVudC5lbHNlU3RhdGVtZW50OwogCQlpZiAodGhlblN0YXRlbWVudCAhPSBudWxsKSB7CiAJCQlpZiAodGhlblN0YXRlbWVudCA9PSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrLk5vbmUpIHsKLQkJCQlpZlN0YXRlbWVudC5zZXRUaGVuU3RhdGVtZW50KHRoaXMuYXN0Lm5ld0VtcHR5U3RhdGVtZW50KCkpOworCQkJCUVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKTsKKwkJCQlpbnQgc3RhcnQgPSByZXRyaWV2ZVN0YXJ0aW5nU2VtaUNvbG9uUG9zaXRpb24oc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kKTsKKwkJCQlpbnQgZW5kID0gcmV0cmlldmVFbmRpbmdTZW1pQ29sb25Qb3NpdGlvbihzdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCk7CisJCQkJZW1wdHlTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJaWZTdGF0ZW1lbnQuc2V0VGhlblN0YXRlbWVudChlbXB0eVN0YXRlbWVudCk7CiAJCQl9IGVsc2UgewogCQkJCWlmU3RhdGVtZW50LnNldFRoZW5TdGF0ZW1lbnQoY29udmVydChzdGF0ZW1lbnQudGhlblN0YXRlbWVudCkpOwogCQkJfQogCQl9CiAJCWlmIChlbHNlU3RhdGVtZW50ICE9IG51bGwpIHsKIAkJCWlmIChlbHNlU3RhdGVtZW50ID09IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQmxvY2suTm9uZSkgewotCQkJCWlmU3RhdGVtZW50LnNldEVsc2VTdGF0ZW1lbnQodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7CisJCQkJLy8gcmV0cmlldmUgdGhlIGVsc2UgcG9zaXRpb24KKwkJCQlFbXB0eVN0YXRlbWVudCBlbXB0eVN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0VtcHR5U3RhdGVtZW50KCk7CisJCQkJaW50IHN0YXJ0ID0gcmV0cmlldmVFbHNlRW5kaW5nUG9zaXRpb24oc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kKTsKKwkJCQlzdGFydCA9IHJldHJpZXZlU3RhcnRpbmdTZW1pQ29sb25Qb3NpdGlvbihzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQpOworCQkJCWludCBlbmQgPSByZXRyaWV2ZUVuZGluZ1NlbWlDb2xvblBvc2l0aW9uKHN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kKTsKKwkJCQllbXB0eVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQlpZlN0YXRlbWVudC5zZXRFbHNlU3RhdGVtZW50KGVtcHR5U3RhdGVtZW50KTsKIAkJCX0gZWxzZSB7CiAJCQkJaWZTdGF0ZW1lbnQuc2V0RWxzZVN0YXRlbWVudChjb252ZXJ0KGVsc2VTdGF0ZW1lbnQpKTsKIAkJCX0KQEAgLTE4ODIsNyArMjAwNywxNiBAQAogCXB1YmxpYyBMYWJlbGVkU3RhdGVtZW50IGNvbnZlcnQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5MYWJlbGVkU3RhdGVtZW50IHN0YXRlbWVudCkgewogCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdMYWJlbGVkU3RhdGVtZW50KCk7CiAJCWxhYmVsZWRTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBzdGF0ZW1lbnQuc291cmNlRW5kIC0gc3RhdGVtZW50LnNvdXJjZVN0YXJ0ICsgMSk7CQotCQlsYWJlbGVkU3RhdGVtZW50LnNldEJvZHkoY29udmVydChzdGF0ZW1lbnQuc3RhdGVtZW50KSk7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RhdGVtZW50IGJvZHkgPSBzdGF0ZW1lbnQuc3RhdGVtZW50OworCQlpZiAoYm9keSA9PSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrLk5vbmUpIHsKKwkJCUVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKTsKKwkJCWludCBzdGFydCA9IHJldHJpZXZlU3RhcnRpbmdTZW1pQ29sb25Qb3NpdGlvbihzdGF0ZW1lbnQuc291cmNlU3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQpOworCQkJaW50IGVuZCA9IHJldHJpZXZlRW5kaW5nU2VtaUNvbG9uUG9zaXRpb24oc3RhcnQsIHN0YXRlbWVudC5zb3VyY2VFbmQpOworCQkJZW1wdHlTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQlsYWJlbGVkU3RhdGVtZW50LnNldEJvZHkoZW1wdHlTdGF0ZW1lbnQpOworCQl9IGVsc2UgeworCQkJbGFiZWxlZFN0YXRlbWVudC5zZXRCb2R5KGNvbnZlcnQoYm9keSkpOworCQl9CiAJCVNpbXBsZU5hbWUgbmFtZSA9IHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyhzdGF0ZW1lbnQubGFiZWwpKTsKIAkJcmV0cmlldmVJZGVudGlmaWVyQW5kU2V0UG9zaXRpb25zKHN0YXRlbWVudC5zb3VyY2VTdGFydCwgc3RhdGVtZW50LnNvdXJjZUVuZCwgbmFtZSk7CiAJCWxhYmVsZWRTdGF0ZW1lbnQuc2V0TGFiZWwobmFtZSk7CkBAIC0xOTY2LDYgKzIxMDAsMTMgQEAKIAkJCQkvLyBzZXQgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgZm9yIHN0YXRlbWVudCBvbiB0aGUgc2VtaS1jb2xvbgogCQkJCXJldHJpZXZlU2VtaUNvbG9uUG9zaXRpb24od2hpbGVTdGF0ZW1lbnQpOwogCQkJfQorCQl9IGVsc2UgeworCQkJRW1wdHlTdGF0ZW1lbnQgZW1wdHlTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpOworCQkJcmV0cmlldmVTZW1pQ29sb25Qb3NpdGlvbih3aGlsZVN0YXRlbWVudCk7CisJCQlpbnQgc3RhcnQgPSByZXRyaWV2ZVN0YXJ0aW5nU2VtaUNvbG9uUG9zaXRpb24oc3RhdGVtZW50LnNvdXJjZVN0YXJ0LCBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCWludCBlbmQgPSByZXRyaWV2ZUVuZGluZ1NlbWlDb2xvblBvc2l0aW9uKHN0YXJ0LCBjb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKKwkJCWVtcHR5U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQkJd2hpbGVTdGF0ZW1lbnQuc2V0Qm9keShlbXB0eVN0YXRlbWVudCk7CiAJCX0KIAkJcmV0dXJuIHdoaWxlU3RhdGVtZW50OwogCX0KQEAgLTIxMzYsMzAgKzIyNzcsMzAgQEAKIAkJc2Nhbm5lci5yZXNldFRvKGVuZCwgdGhpcy5jb21waWxhdGlvblVuaXRTb3VyY2UubGVuZ3RoKTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lU0VNSUNPTE9OOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTjoKIAkJCQkJCWlmIChjb3VudCA9PSAwKSB7CiAJCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydCk7CiAJCQkJCQkJcmV0dXJuOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0UgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSA6CiAJCQkJCQljb3VudCsrOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0UgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSA6CiAJCQkJCQljb3VudC0tOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMUEFSRU4gOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiA6CiAJCQkJCQljb3VudCsrOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSUEFSRU4gOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiA6CiAJCQkJCQljb3VudC0tOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0tFVCA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNLRVQgOgogCQkJCQkJY291bnQrKzsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNLRVQgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUIDoKIAkJCQkJCWNvdW50LS07CiAJCQkJfQogCQkJfQpAQCAtMjE2OCwxOSArMjMwOSwyMCBAQAogCX0KIAogCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSByaWdodCBlbmQgcG9zaXRpb24gZm9yIHN3aXRjaCBhbmQgCi0JICogdHJ5IHN0YXRlbWVudHMuIFRoZXkgZG9uJ3QgaW5jbHVkZSB0aGUgY2xvc2UgfS4gCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIHJpZ2h0IGVuZCBwb3NpdGlvbiBmb3IgZXhwcmVzc2lvbgorCSAqIHN0YXRlbWVudC4gVGhlIGFjdHVhbCBBU1Qgbm9kZXMgZG9uJ3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLgorCSAqIFRoaXMgbWV0aG9kIGZpeGVzIHRoZSBsZW5ndGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZS4KIAkgKi8KLQlwcml2YXRlIHZvaWQgcmV0cmlldmVSaWdodEJyYWNlUG9zaXRpb24oQVNUTm9kZSBub2RlKSB7CisJcHJpdmF0ZSB2b2lkIHJldHJpZXZlQ29sb25Qb3NpdGlvbihBU1ROb2RlIG5vZGUpIHsKIAkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7CiAJCWludCBsZW5ndGggPSBub2RlLmdldExlbmd0aCgpOwogCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7CiAJCXNjYW5uZXIucmVzZXRUbyhlbmQsIHRoaXMuY29tcGlsYXRpb25Vbml0U291cmNlLmxlbmd0aCk7CiAJCXRyeSB7CiAJCQlpbnQgdG9rZW47Ci0JCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCQlzd2l0Y2godG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDRToKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT0xPTjoKIAkJCQkJCW5vZGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gc3RhcnQpOwogCQkJCQkJcmV0dXJuOwogCQkJCX0KQEAgLTIxODksNiArMjMzMSw5MyBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSBpbnQgcmV0cmlldmVTdGFydGluZ1NlbWlDb2xvblBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlpbnQgY291bnQgPSAwOworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OOgorCQkJCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQkJCQlyZXR1cm4gc2Nhbm5lci5zdGFydFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFIDoKKwkJCQkJCWNvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSQlJBQ0UgOgorCQkJCQkJY291bnQtLTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiA6CisJCQkJCQljb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOIDoKKwkJCQkJCWNvdW50LS07CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0tFVCA6CisJCQkJCQljb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQgOgorCQkJCQkJY291bnQtLTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcHJpdmF0ZSBpbnQgcmV0cmlldmVFbmRpbmdTZW1pQ29sb25Qb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOworCQl0cnkgeworCQkJaW50IHRva2VuOworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgeworCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTjoKKwkJCQkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJCQkJcmV0dXJuIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSA6CisJCQkJCQljb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFIDoKKwkJCQkJCWNvdW50LS07CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4gOgorCQkJCQkJY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJQQVJFTiA6CisJCQkJCQljb3VudC0tOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNLRVQgOgorCQkJCQkJY291bnQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUIDoKKwkJCQkJCWNvdW50LS07CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCXByaXZhdGUgaW50IHJldHJpZXZlRWxzZUVuZGluZ1Bvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZWxzZToKKwkJCQkJCXJldHVybiBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcnJheSBkaW1lbnNpb24gZGVjbGFyZWQgYWZ0ZXIgdGhlCiAJICogbmFtZSBvZiBhIGxvY2FsIG9yIGEgZmllbGQgZGVjbGFyYXRpb24uCkBAIC0yMjAyLDE1ICsyNDMxLDE2IEBACiAJCWludCBkaW1lbnNpb25zID0gMDsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNLRVQ6Ly8xNjYgCisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQ6Ly8xNjYgCiAJCQkJCQlkaW1lbnNpb25zKys7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1BIDovLzkwCi0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVFUVVBTCA6Ly8xNjcKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVNFTUlDT0xPTiA6Ly82NAotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUlBBUkVOIDogLy84NgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxCUkFDRSA6Ly85MAkJCQkJCQorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BIDovLzkwCisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRVFVQUwgOi8vMTY3CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OIDovLzY0CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOIDogLy84NgogCQkJCQkJcmV0dXJuIGRpbWVuc2lvbnM7CiAJCQkJfQogCQkJfQpAQCAtMjIzMSwxNCArMjQ2MSwxNCBAQAogCQlpbnQgZm91bmRQb3NpdGlvbiA9IC0xOwogCQl0cnkgewogCQkJaW50IHRva2VuOwotCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJc3dpdGNoKHRva2VuKSB7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0tFVDoKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0s6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0M6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkU6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNLRVQ6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9CTE9DSzoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0M6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9MSU5FOgogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0tFVDovLzE2NgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUOi8vMTY2CiAJCQkJCQlmb3VuZFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CkBAIC0yMjU4LDkgKzI0ODgsOSBAQAogCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CiAJCXRyeSB7CiAJCQlpbnQgdG9rZW47Ci0JCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCQlzd2l0Y2godG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZWNhdGNoOi8vMjI1CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lY2F0Y2g6Ly8yMjUKIAkJCQkJCXJldHVybiBzY2FubmVyLnN0YXJ0UG9zaXRpb247CiAJCQkJfQogCQkJfQpAQCAtMjI3MywxNCArMjUwMywyMSBAQAogCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBsZWZ0IGJyYWNrZXQuCiAJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQogCSAqLwotCXByaXZhdGUgaW50IHJldHJpZXZlU3RhcnRpbmdMZWZ0QnJhY2tldFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHJldHJpZXZlRW5kT2ZFbGVtZW50VHlwZU5hbWVQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwogCQl0cnkgewogCQkJaW50IHRva2VuOwotCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSB7CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJc3dpdGNoKHRva2VuKSB7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMQlJBQ0tFVDovLzIyNQotCQkJCQkJcmV0dXJuIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVieXRlOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXI6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG91YmxlOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWZsb2F0OgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVsb25nOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXNob3J0OgorCQkJCQkJcmV0dXJuIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKQEAgLTIyOTYsOSArMjUzMyw5IEBACiAJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNLRVQ6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNLRVQ6CiAJCQkJCQlyZXR1cm4gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwogCQkJCX0KIAkJCX0KQEAgLTIzMDcsMTMgKzI1NDQsMzIgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSByaWdodCBwYXJlbnRoZXNpcy4KKwkgKiBAcmV0dXJuIGludCB0aGUgcG9zaXRpb24gZm91bmQKKwkgKi8KKwlwcml2YXRlIGludCByZXRyaWV2ZUVuZE9mUmlnaHRQYXJlbnRoZXNpc1Bvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOOgorCQkJCQkJcmV0dXJuIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiAtMTsKKwl9CisKIAlwcml2YXRlIGludCByZXRyaWV2ZVByb3BlclJpZ2h0QnJhY2tldFBvc2l0aW9uKGludCBicmFja2V0TnVtYmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwogCQl0cnkgewogCQkJaW50IHRva2VuLCBjb3VudCA9IDA7Ci0JCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCQlzd2l0Y2godG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDS0VUOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUOgogCQkJCQkJY291bnQrKzsKIAkJCQkJCWlmIChjb3VudCA9PSBicmFja2V0TnVtYmVyKSB7CiAJCQkJCQkJcmV0dXJuIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKQEAgLTIzMzMsOSArMjU4OSw5IEBACiAJCXNjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNFOi8vMTEwCisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFOi8vMTEwCiAJCQkJCQlyZXR1cm4gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJCX0KIAkJCX0KQEAgLTIzNDUsNiArMjYwMSwyNSBAQAogCX0KIAkKIAkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgYmxvY2suCisJICogQHJldHVybiBpbnQgdGhlIGRpbWVuc2lvbiBmb3VuZCwgLTEgaWYgbm9uZQorCSAqLworCXByaXZhdGUgaW50IHJldHJpZXZlSWRlbnRpZmllckVuZFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgeworCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcjovLzExMAorCQkJCQkJcmV0dXJuIHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuRW5kUG9zaXRpb24oKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQkKKwkKKwkvKioKIAkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGJsb2NrLgogCSAqIEByZXR1cm4gaW50IHRoZSBkaW1lbnNpb24gZm91bmQsIC0xIGlmIG5vbmUKIAkgKi8KQEAgLTIzNTMsMTIgKzI2MjgsMTIgQEAKIAkJaW50IGNvdW50ID0gMDsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNFOi8vMTEwCisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFOi8vMTEwCiAJCQkJCQljb3VudCsrOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0U6Ly85NQorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRTovLzk1CiAJCQkJCQljb3VudC0tOwogCQkJCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQkJCQlyZXR1cm4gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOwpAQCAtMjM4MCwxOSArMjY1NSwxOSBAQAogCQl0cnkgewogCQkJaW50IHRva2VuOwogCQkJaW50IGJyYWNlQ291bnRlciA9IDA7Ci0JCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCQlzd2l0Y2godG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxCUkFDRSA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFIDoKIAkJCQkJCWJyYWNlQ291bnRlcisrOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVSQlJBQ0UgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSA6CiAJCQkJCQlicmFjZUNvdW50ZXItLTsKIAkJCQkJCWlmIChicmFjZUNvdW50ZXIgPT0gMCkgewogCQkJCQkJCW5vZGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gc3RhcnQpOwogCQkJCQkJCXJldHVybjsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lU0VNSUNPTE9OIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04gOgogCQkJCQkJaWYgKGJyYWNlQ291bnRlciA9PSAwKSB7CiAJCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydCk7CiAJCQkJCQkJcmV0dXJuOwpAQCAtMjQxMiwyOCArMjY4NywyOCBAQAogCQlpbnQgYnJhY2VDb3VudGVyID0gMDsKIAkJdHJ5IHsKIAkJCWludCB0b2tlbjsKLQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBTY2FubmVyLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUgKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTEJSQUNFIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UgOgogCQkJCQkJYnJhY2VDb3VudGVyKys7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJCUkFDRSA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFIDoKIAkJCQkJCWJyYWNlQ291bnRlci0tOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMUEFSRU4gOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTiA6CiAJCQkJCQlicmFjZUNvdW50ZXIrKzsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUlBBUkVOIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU4gOgogCQkJCQkJYnJhY2VDb3VudGVyLS07CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxCUkFDS0VUIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0tFVCA6CiAJCQkJCQlicmFjZUNvdW50ZXIrKzsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lUkJSQUNLRVQgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDS0VUIDoKIAkJCQkJCWJyYWNlQ291bnRlci0tOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVDT01NQSA6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVTRU1JQ09MT04gOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVTRU1JQ09MT04gOgogCQkJCQkJaWYgKGJyYWNlQ291bnRlciA9PSAwKSB7CiAJCQkJCQkJcmV0dXJuIHNjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CiAJCQkJCQl9CkBAIC0yNDg5LDYgKzI3NjQsNyBAQAogCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKHJldHJpZXZlRXh0cmFEaW1lbnNpb24obG9jYWxEZWNsYXJhdGlvbi5zb3VyY2VFbmQgKyAxLCB0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZS5sZW5ndGgpKTsKIAkJaWYgKHRoaXMucmVzb2x2ZUJpbmRpbmdzKSB7CiAJCQlyZWNvcmROb2Rlcyh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQsIGxvY2FsRGVjbGFyYXRpb24pOworCQkJcmVjb3JkTm9kZXMobmFtZSwgbG9jYWxEZWNsYXJhdGlvbik7CiAJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKIAkJfQogCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwpAQCAtMjUzOCw3ICsyODE0LDcgQEAKIAkJICogT25seSBmaW5hbCBpcyBhbGxvd2VkIGluIHRoaXMgY2FzZS4KIAkJICovCiAJCXRyeSB7Ci0JCQl2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldE1vZGlmaWVycyhsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyk7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldE1vZGlmaWVycyhsb2NhbERlY2xhcmF0aW9uLm1vZGlmaWVycyAmIH5Db21waWxlck1vZGlmaWVycy5BY2NCbGFua0ZpbmFsKTsKIAkJfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogCQkJdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRNb2RpZmllcnMobG9jYWxEZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBNb2RpZmllci5GSU5BTCk7CiAJCQl2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKQEAgLTI1NDcsNiArMjgyMywzMCBAQAogCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKIAl9CiAJCisJcHJpdmF0ZSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBjb252ZXJ0VG9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihMb2NhbERlY2xhcmF0aW9uIGxvY2FsRGVjbGFyYXRpb24pIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IGNvbnZlcnRUb1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudChsb2NhbERlY2xhcmF0aW9uKTsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOworCQlpZiAodGhpcy5yZXNvbHZlQmluZGluZ3MpIHsKKwkJCXJlY29yZE5vZGVzKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwgbG9jYWxEZWNsYXJhdGlvbik7CisJCX0KKwkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UobG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBsb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kIC0gbG9jYWxEZWNsYXJhdGlvbi5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICsgMSk7CisJCVR5cGUgdHlwZSA9IGNvbnZlcnRUeXBlKGxvY2FsRGVjbGFyYXRpb24udHlwZSk7CisJCXNldFR5cGVGb3JWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgdHlwZSwgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEV4dHJhRGltZW5zaW9ucygpKTsKKwkJLyoqCisJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzMKKwkJICogVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgYnVpbHQgdmFyaWFibGVzIHdpdGggaW52YWxpZCBtb2RpZmllcnMuCisJCSAqIFRoZSBjb21waWxhdGlvbiB1bml0IGlzIHRhZ2dlZCBhcyBoYXZpbmcgd3JvbmcgbW9kaWZpZXJzIGZvciB0aGUgbG9jYWwuCisJCSAqIE9ubHkgZmluYWwgaXMgYWxsb3dlZCBpbiB0aGlzIGNhc2UuCisJCSAqLworCQl0cnkgeworCQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKGxvY2FsRGVjbGFyYXRpb24ubW9kaWZpZXJzICYgfkNvbXBpbGVyTW9kaWZpZXJzLkFjY0JsYW5rRmluYWwpOworCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRNb2RpZmllcnMobG9jYWxEZWNsYXJhdGlvbi5tb2RpZmllcnMgJiBNb2RpZmllci5GSU5BTCk7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRGbGFncyhBU1ROb2RlLk1BTEZPUk1FRCk7CisJCX0KKwkJcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOworCX0KKwkKIAlwcml2YXRlIHZvaWQgc2V0VHlwZUZvckZpZWxkKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKIAkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKIAkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKQEAgLTI1ODEsNiArMjg4MSw3NCBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVGb3JTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKKwkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKKwkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQlpbnQgcmVtYWluaW5nRGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkgLSBleHRyYURpbWVuc2lvbjsKKwkJCQlpZiAocmVtYWluaW5nRGltZW5zaW9ucyA9PSAwKSAgeworCQkJCQkvLyB0aGUgZGltZW5zaW9ucyBhcmUgYWZ0ZXIgdGhlIG5hbWUgc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkRGVjbGFyYXRpb24gaXMgYSBzaW1wbGVUeXBlCisJCQkJCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKKwkJCQkJZWxlbWVudFR5cGUuc2V0UGFyZW50KG51bGwpOworCQkJCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS51cGRhdGVLZXkodHlwZSwgZWxlbWVudFR5cGUpOworCQkJCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldFR5cGUoZWxlbWVudFR5cGUpOworCQkJCX0gZWxzZSB7CisJCQkJCWludCBzdGFydCA9IHR5cGUuZ2V0U3RhcnRQb3NpdGlvbigpOworCQkJCQlpbnQgbGVuZ3RoID0gdHlwZS5nZXRMZW5ndGgoKTsKKwkJCQkJQXJyYXlUeXBlIHN1YmFycmF5VHlwZSA9IGFycmF5VHlwZTsKKwkJCQkJaW50IGluZGV4ID0gZXh0cmFEaW1lbnNpb247CisJCQkJCXdoaWxlIChpbmRleCA+IDApIHsKKwkJCQkJCXN1YmFycmF5VHlwZSA9IChBcnJheVR5cGUpIHN1YmFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisJCQkJCQlpbmRleC0tOworCQkJCQl9CisJCQkJCWludCBlbmQgPSByZXRyaWV2ZVByb3BlclJpZ2h0QnJhY2tldFBvc2l0aW9uKHJlbWFpbmluZ0RpbWVuc2lvbnMsIHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CisJCQkJCXN1YmFycmF5VHlwZS5zZXRTb3VyY2VSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJc3ViYXJyYXlUeXBlLnNldFBhcmVudChudWxsKTsKKwkJCQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKHN1YmFycmF5VHlwZSk7CisJCQkJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnVwZGF0ZUtleSh0eXBlLCBzdWJhcnJheVR5cGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKHR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKHR5cGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVGb3JNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgVHlwZSB0eXBlLCBpbnQgZXh0cmFEaW1lbnNpb24pIHsKKwkJaWYgKGV4dHJhRGltZW5zaW9uICE9IDApIHsKKwkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQlpbnQgcmVtYWluaW5nRGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkgLSBleHRyYURpbWVuc2lvbjsKKwkJCQlpZiAocmVtYWluaW5nRGltZW5zaW9ucyA9PSAwKSAgeworCQkJCQkvLyB0aGUgZGltZW5zaW9ucyBhcmUgYWZ0ZXIgdGhlIG5hbWUgc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkRGVjbGFyYXRpb24gaXMgYSBzaW1wbGVUeXBlCisJCQkJCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKKwkJCQkJZWxlbWVudFR5cGUuc2V0UGFyZW50KG51bGwpOworCQkJCQl0aGlzLmFzdC5nZXRCaW5kaW5nUmVzb2x2ZXIoKS51cGRhdGVLZXkodHlwZSwgZWxlbWVudFR5cGUpOworCQkJCQltZXRob2REZWNsYXJhdGlvbi5zZXRSZXR1cm5UeXBlKGVsZW1lbnRUeXBlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgc3RhcnQgPSB0eXBlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQkJaW50IGxlbmd0aCA9IHR5cGUuZ2V0TGVuZ3RoKCk7CisJCQkJCUFycmF5VHlwZSBzdWJhcnJheVR5cGUgPSBhcnJheVR5cGU7CisJCQkJCWludCBpbmRleCA9IGV4dHJhRGltZW5zaW9uOworCQkJCQl3aGlsZSAoaW5kZXggPiAwKSB7CisJCQkJCQlzdWJhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSBzdWJhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworCQkJCQkJaW5kZXgtLTsKKwkJCQkJfQorCQkJCQlpbnQgZW5kID0gcmV0cmlldmVQcm9wZXJSaWdodEJyYWNrZXRQb3NpdGlvbihyZW1haW5pbmdEaW1lbnNpb25zLCBzdGFydCwgc3RhcnQgKyBsZW5ndGgpOworCQkJCQlzdWJhcnJheVR5cGUuc2V0U291cmNlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCXN1YmFycmF5VHlwZS5zZXRQYXJlbnQobnVsbCk7CisJCQkJCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUoc3ViYXJyYXlUeXBlKTsKKwkJCQkJdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkudXBkYXRlS2V5KHR5cGUsIHN1YmFycmF5VHlwZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltZXRob2REZWNsYXJhdGlvbi5zZXRSZXR1cm5UeXBlKHR5cGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UmV0dXJuVHlwZSh0eXBlKTsKKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCBzZXRUeXBlRm9yVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIFR5cGUgdHlwZSwgaW50IGV4dHJhRGltZW5zaW9uKSB7CiAJCWlmIChleHRyYURpbWVuc2lvbiAhPSAwKSB7CiAJCQlpZiAodHlwZS5pc0FycmF5VHlwZSgpKSB7CkBAIC0yNjUzLDkgKzMwMjEsOSBAQAogCQlzY2FubmVyLnJlc2V0VG8oYm9keURlY2xhcmF0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSwgYm9keURlY2xhcmF0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSArIGJvZHlEZWNsYXJhdGlvbi5nZXRMZW5ndGgoKSk7CiAJCXRyeSB7CiAJCQlpbnQgdG9rZW47Ci0JCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpIHsKKwkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKIAkJCQlzd2l0Y2godG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNPTU1FTlRfSkFWQURPQzogLy8xMDAzCisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DOiAvLzEwMDMKIAkJCQkJCUphdmFkb2MgamF2YWRvY0NvbW1lbnQgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7CiAJCQkJCQlpbnQgc3RhcnQgPSBzY2FubmVyLnN0YXJ0UG9zaXRpb247CiAJCQkJCQlpbnQgbGVuZ3RoID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSBzdGFydDsKQEAgLTI2NjUsNiArMzAzMyw4IEBACiAJCQkJCQlqYXZhZG9jQ29tbWVudC5zZXRTb3VyY2VSYW5nZShzdGFydCwgbGVuZ3RoKTsKIAkJCQkJCWJvZHlEZWNsYXJhdGlvbi5zZXRKYXZhZG9jKGphdmFkb2NDb21tZW50KTsKIAkJCQkJCXJldHVybjsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9IGNhdGNoKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CkBAIC0yNjgyLDYyICszMDUyLDUxIEBACiAJCUFTVFN5bnRheEVycm9yUHJvcGFnYXRvciBzeW50YXhFcnJvclByb3BhZ2F0b3IgPSBuZXcgQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yKHJlc2l6ZVByb2JsZW1zKTsKIAkJdW5pdC5hY2NlcHQoc3ludGF4RXJyb3JQcm9wYWdhdG9yKTsKIAkJLy8gc3RvcmUgdGhlIG1lc3NhZ2VzIGVycm9yIG9uIHRoZSBjb21wdWxhdGlvbiB1bml0Ci0JCU1lc3NhZ2VbXSBtZXNzYWdlcyA9IG5ldyBNZXNzYWdlW3Byb2JsZW1MZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1MZW5ndGg7IGkrKykgewotCQkJSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOwotCQkJaW50IHN0YXJ0ID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOwotCQkJaW50IGVuZCA9IHByb2JsZW0uZ2V0U291cmNlRW5kKCk7Ci0JCQltZXNzYWdlc1tpXSA9IG5ldyBNZXNzYWdlKHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKLQkJfQotCQl1bml0LnNldE1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQW5kVGFnQXNNYWxmb3JtZWQoQVNUTm9kZSBub2RlLCBpbnQgcG9zaXRpb24pIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JCWludCBlbmQgPSBzdGFydCArIG5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmICgoc3RhcnQgPD0gcG9zaXRpb24pICYmIChwb3NpdGlvbiA8PSBlbmQpKSB7Ci0JCQlub2RlLnNldEZsYWdzKEFTVE5vZGUuTUFMRk9STUVEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKKwkJdW5pdC5zZXRQcm9ibGVtcyhyZXNpemVQcm9ibGVtcyk7CiAJfQogCQogCXByaXZhdGUgdm9pZCByZWNvcmROb2RlcyhBU1ROb2RlIG5vZGUsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZSBvbGRBU1ROb2RlKSB7CiAJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnN0b3JlKG5vZGUsIG9sZEFTVE5vZGUpOwogCX0KIAkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JQYXJlbnRoZXNpcyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGhhbmRsZSBtdWx0aXBsZSBwYXJlbnRoZXNpcwotCQkgKi8KKwkvKioKKwkgKiBSZW1vdmUgd2hpdGVzcGFjZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgZXhwcmVzc2lvbi4KKwkgKi8JCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUV4dHJhQmxhbmtzKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAJCWludCBzdGFydCA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CiAJCWludCBlbmQgPSBleHByZXNzaW9uLnNvdXJjZUVuZDsKLQkJc2Nhbm5lci5yZXNldFRvKHN0YXJ0LCBlbmQpOwotCQlpbnQgZGFuZ2xpbmcgPSAwLCB0b2tlbjsKKwkJaW50IHRva2VuOworCQlpbnQgdHJpbUxlZnRQb3NpdGlvbiA9IGV4cHJlc3Npb24uc291cmNlU3RhcnQ7CisJCWludCB0cmltUmlndGhQb3NpdGlvbiA9IGV4cHJlc3Npb24uc291cmNlRW5kOwogCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJU2Nhbm5lciByZW1vdmVCbGFua1NjYW5uZXIgPSB0aGlzLmFzdC5zY2FubmVyOwogCQl0cnkgeworCQkJcmVtb3ZlQmxhbmtTY2FubmVyLnNldFNvdXJjZSh0aGlzLmNvbXBpbGF0aW9uVW5pdFNvdXJjZSk7CisJCQlyZW1vdmVCbGFua1NjYW5uZXIucmVzZXRUbyhzdGFydCwgZW5kKTsKIAkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCXRva2VuID0gcmVtb3ZlQmxhbmtTY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUxQQVJFTiA6Ci0JCQkJCQlkYW5nbGluZyArKzsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVXSElURVNQQUNFIDoKKwkJCQkJCWlmIChmaXJzdCkgeworCQkJCQkJCXRyaW1MZWZ0UG9zaXRpb24gPSByZW1vdmVCbGFua1NjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJfQorCQkJCQkJdHJpbVJpZ3RoUG9zaXRpb24gPSByZW1vdmVCbGFua1NjYW5uZXIuc3RhcnRQb3NpdGlvbiAtIDE7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJQQVJFTiA6Ci0JCQkJCQlpZiAoZmlyc3QpIHJldHVybiBmYWxzZTsKLQkJCQkJCWRhbmdsaW5nIC0tOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVFT0YgOgotCQkJCQkJaWYgKGZpcnN0KSByZXR1cm4gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gZGFuZ2xpbmcgPT0gMDsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YgOgorCQkJCQkJZXhwcmVzc2lvbi5zb3VyY2VTdGFydCA9IHRyaW1MZWZ0UG9zaXRpb247CisJCQkJCQlleHByZXNzaW9uLnNvdXJjZUVuZCA9IHRyaW1SaWd0aFBvc2l0aW9uOworCQkJCQkJcmV0dXJuOwogCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWlmIChmaXJzdCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJaWYgKGRhbmdsaW5nID09IDApIHJldHVybiBmYWxzZTsKKwkJCQkJCS8qCisJCQkJCQkgKiBpZiB3ZSBmaW5kIHNvbWV0aGluZyBlbHNlIHRoYW4gYSB3aGl0ZXNwYWNlLCB0aGVuIHdlIHJlc2V0IHRoZSB0cmltUmlndGhQb3NpdGlvbgorCQkJCQkJICogdG8gdGhlIGV4cHJlc3Npb24gc291cmNlIGVuZC4KKwkJCQkJCSAqLworCQkJCQkJdHJpbVJpZ3RoUG9zaXRpb24gPSBleHByZXNzaW9uLnNvdXJjZUVuZDsKIAkJCQl9CiAJCQkJZmlyc3QgPSBmYWxzZTsKIAkJCX0KIAkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpewogCQl9Ci0JCXJldHVybiBmYWxzZTsKIAl9CiAJCiAJcHJpdmF0ZSB2b2lkIGFkanVzdFNvdXJjZVBvc2l0aW9uc0ZvclBhcmVudChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb24gZXhwcmVzc2lvbikgewpAQCAtMjc1MCwxMiArMzEwOSwxMiBAQAogCQkJaW50IHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCWV4cHJlc3Npb24uc291cmNlU3RhcnQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbjsKIAkJCWJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCQkJd2hpbGUgKCFzdG9wICYmICgodG9rZW4gID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpKSB7CisJCQl3aGlsZSAoIXN0b3AgJiYgKCh0b2tlbiAgPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpKSB7CiAJCQkJc3dpdGNoKHRva2VuKSB7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMUEFSRU46CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTFBBUkVOOgogCQkJCQkJbGVmdFBhcmVudENvdW50Kys7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJQQVJFTjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU46CiAJCQkJCQlyaWdodFBhcmVudENvdW50Kys7CiAJCQkJCQlpZiAocmlnaHRQYXJlbnRDb3VudCA9PSBsZWZ0UGFyZW50Q291bnQpIHsKIAkJCQkJCQkvLyB3ZSBmb3VuZCB0aGUgbWF0Y2hpbmcgcGFyZW50aGVzaXMKQEAgLTI3NzQsOCArMzEzMyw4IEBACiAJCWludCB0b2tlbjsKIAkJaW50IGluZGV4ID0gMDsKIAkJdHJ5IHsKLQkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSAgewotCQkJCWlmICh0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgIHsKKwkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgewogCQkJCQlwb3NpdGlvbnNbaW5kZXhdID0gKCgobG9uZykgc2Nhbm5lci5zdGFydFBvc2l0aW9uKSA8PCAzMikgKyAoc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxKTsKIAkJCQkJaW5kZXgrKzsKIAkJCQl9CkBAIC0yNzg5LDggKzMxNDgsOCBAQAogCQlzY2FubmVyLnJlc2V0VG8oc3RhcnQsIGVuZCk7CiAJCWludCB0b2tlbjsKIAkJdHJ5IHsKLQkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSAgewotCQkJCWlmICh0b2tlbiA9PSBTY2FubmVyLlRva2VuTmFtZUlkZW50aWZpZXIpIHsKKwkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgIHsKKwkJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllcikgewogCQkJCQlpbnQgc3RhcnROYW1lID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJCQlpbnQgZW5kTmFtZSA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKIAkJCQkJbmFtZS5zZXRTb3VyY2VSYW5nZShzdGFydE5hbWUsIGVuZE5hbWUgLSBzdGFydE5hbWUgKyAxKTsKQEAgLTI4MTAsMTIgKzMxNjksMTIgQEAKIAkJaW50IHRva2VuOwogCQlpbnQgcGFyZW5Db3VudGVyID0gMDsKIAkJdHJ5IHsKLQkJCXdoaWxlKCh0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpICE9IFNjYW5uZXIuVG9rZW5OYW1lRU9GKSAgeworCQkJd2hpbGUoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSAgewogCQkJCXN3aXRjaCh0b2tlbikgewotCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lTFBBUkVOIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMUEFSRU4gOgogCQkJCQkJcGFyZW5Db3VudGVyKys7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVJQQVJFTiA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOIDoKIAkJCQkJCXBhcmVuQ291bnRlci0tOwogCQkJCQkJaWYgKHBhcmVuQ291bnRlciA9PSAwKSB7CiAJCQkJCQkJaW50IGVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKQEAgLTI4MzYsMjAgKzMxOTUsMjAgQEAKIAkJaW50IHRva2VuOwogCQlpbnQgc3RhcnRQb3NpdGlvbiA9IC0xOwogCQl0cnkgewotCQkJd2hpbGUoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gU2Nhbm5lci5Ub2tlbk5hbWVFT0YpICB7CisJCQl3aGlsZSgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpICB7CiAJCQkJc3dpdGNoKHRva2VuKSB7Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbCA6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVMb25nTGl0ZXJhbCA6Ci0JCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVEb3VibGVMaXRlcmFsIDoKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUludGVnZXJMaXRlcmFsIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbCA6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTG9uZ0xpdGVyYWwgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURvdWJsZUxpdGVyYWwgOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWwgOgogCQkJCQkJaWYgKHN0YXJ0UG9zaXRpb24gPT0gLTEpIHsKIAkJCQkJCQlzdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJCQkJfQogCQkJCQkJaW50IGVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOwogCQkJCQkJbm9kZS5zZXRTb3VyY2VSYW5nZShzdGFydFBvc2l0aW9uLCBlbmQgLSBzdGFydFBvc2l0aW9uKTsKIAkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZU1JTlVTIDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVNSU5VUyA6CiAJCQkJCQlzdGFydFBvc2l0aW9uID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjg1Nyw1ICszMjE2LDc5IEBACiAJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJfQogCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVjb3JkUGVuZGluZ1RoaXNFeHByZXNzaW9uU2NvcGVSZXNvbHV0aW9uKFRoaXNFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uKSB7CisJCWlmICh0aGlzLnBlbmRpbmdUaGlzRXhwcmVzc2lvblNjb3BlUmVzb2x1dGlvbiA9PSBudWxsKSB7CisJCQl0aGlzLnBlbmRpbmdUaGlzRXhwcmVzc2lvblNjb3BlUmVzb2x1dGlvbiA9IG5ldyBIYXNoU2V0KCk7CisJCX0KKwkJdGhpcy5wZW5kaW5nVGhpc0V4cHJlc3Npb25TY29wZVJlc29sdXRpb24uYWRkKHRoaXNFeHByZXNzaW9uKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlY29yZFBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uKE5hbWUgbmFtZSkgeworCQlpZiAodGhpcy5wZW5kaW5nTmFtZVNjb3BlUmVzb2x1dGlvbiA9PSBudWxsKSB7CisJCQl0aGlzLnBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uID0gbmV3IEhhc2hTZXQoKTsKKwkJfQorCQl0aGlzLnBlbmRpbmdOYW1lU2NvcGVSZXNvbHV0aW9uLmFkZChuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGxvb2t1cEZvclNjb3BlcygpIHsKKwkJaWYgKHRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24gIT0gbnVsbCkgeworCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucGVuZGluZ05hbWVTY29wZVJlc29sdXRpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKwkJCQlOYW1lIG5hbWUgPSAoTmFtZSkgaXRlcmF0b3IubmV4dCgpOworCQkJCXRoaXMuYXN0LmdldEJpbmRpbmdSZXNvbHZlcigpLnJlY29yZFNjb3BlKG5hbWUsIG5hbWUubG9va3VwU2NvcGUoKSk7CisJCQl9CisJCX0KKwkJaWYgKHRoaXMucGVuZGluZ1RoaXNFeHByZXNzaW9uU2NvcGVSZXNvbHV0aW9uICE9IG51bGwpIHsKKwkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnBlbmRpbmdUaGlzRXhwcmVzc2lvblNjb3BlUmVzb2x1dGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgeworCQkJCVRoaXNFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uID0gKFRoaXNFeHByZXNzaW9uKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJdGhpcy5hc3QuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVjb3JkU2NvcGUodGhpc0V4cHJlc3Npb24sIHRoaXNFeHByZXNzaW9uLmxvb2t1cFNjb3BlKCkpOworCQkJfQorCQl9CisJCQorCX0KKwkKKwlwcml2YXRlIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvciBnZXRPcGVyYXRvckZvcihpbnQgb3BlcmF0b3JJRCkgeworCQlzd2l0Y2ggKG9wZXJhdG9ySUQpIHsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuRVFVQUxfRVFVQUwgOgorCQkJCXJldHVybiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRVFVQUxTOworCQkJY2FzZSBPcGVyYXRvcklkcy5MRVNTX0VRVUFMIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1NfRVFVQUxTOworCQkJY2FzZSBPcGVyYXRvcklkcy5HUkVBVEVSX0VRVUFMIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVJfRVFVQUxTOworCQkJY2FzZSBPcGVyYXRvcklkcy5OT1RfRVFVQUwgOgorCQkJCXJldHVybiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9UX0VRVUFMUzsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuTEVGVF9TSElGVCA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRUZUX1NISUZUOworCQkJY2FzZSBPcGVyYXRvcklkcy5SSUdIVF9TSElGVCA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORUQ7CisJCQljYXNlIE9wZXJhdG9ySWRzLlVOU0lHTkVEX1JJR0hUX1NISUZUIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEOworCQkJY2FzZSBPcGVyYXRvcklkcy5PUl9PUiA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9PUjsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuQU5EX0FORCA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9BTkQ7CisJCQljYXNlIE9wZXJhdG9ySWRzLlBMVVMgOgorCQkJCXJldHVybiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUzsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuTUlOVVMgOgorCQkJCXJldHVybiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVM7CisJCQljYXNlIE9wZXJhdG9ySWRzLlJFTUFJTkRFUiA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SRU1BSU5ERVI7CisJCQljYXNlIE9wZXJhdG9ySWRzLlhPUiA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5YT1I7CisJCQljYXNlIE9wZXJhdG9ySWRzLkFORCA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5BTkQ7CisJCQljYXNlIE9wZXJhdG9ySWRzLk1VTFRJUExZIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTOworCQkJY2FzZSBPcGVyYXRvcklkcy5PUiA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5PUjsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuRElWSURFIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkRJVklERTsKKwkJCWNhc2UgT3BlcmF0b3JJZHMuR1JFQVRFUiA6CisJCQkJcmV0dXJuIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSOworCQkJY2FzZSBPcGVyYXRvcklkcy5MRVNTIDoKKwkJCQlyZXR1cm4gSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1M7CisJCX07CisJCXJldHVybiBudWxsOworCX0KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RNYXRjaGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE1hdGNoZXIuamF2YQppbmRleCBkOGE1Y2I5Li4xNDNmMDk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE1hdGNoZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVE1hdGNoZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtODgzLDYgKzg4MywxNCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+CisJICogPHA+CisJICogTm90ZSB0aGF0IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgYXJlIGNvbXBhcmVkIHNpbmNlIHRoZXkgYXJlIGFuCisJICogaW1wb3J0YW50IHBhcnQgb2YgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4KKwkgKiA8L3A+CisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBtZXRob2QgcmV0dXJuIHR5cGVzIGFyZSBjb21wYXJlZCBldmVuIGZvciBjb25zdHJ1Y3RvcgorCSAqIGRlY2xhcmF0aW9ucy4KKwkgKiA8L3A+CiAJICogCiAJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUKIAkgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KQEAgLTg5OSw5ICs5MDcsMTEgQEAKIAkJCShub2RlLmdldE1vZGlmaWVycygpID09IG8uZ2V0TW9kaWZpZXJzKCkpCiAJCQkJJiYgKG5vZGUuaXNDb25zdHJ1Y3RvcigpID09IG8uaXNDb25zdHJ1Y3RvcigpKQogCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRKYXZhZG9jKCksIG8uZ2V0SmF2YWRvYygpKQorCQkJCS8vIG4uYi4gY29tcGFyZSByZXR1cm4gdHlwZSBldmVuIGZvciBjb25zdHJ1Y3RvcnMKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0UmV0dXJuVHlwZSgpLCBvLmdldFJldHVyblR5cGUoKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0TmFtZSgpLCBvLmdldE5hbWUoKSkKIAkJCQkmJiBzYWZlU3VidHJlZUxpc3RNYXRjaChub2RlLnBhcmFtZXRlcnMoKSwgby5wYXJhbWV0ZXJzKCkpCisJIAkJCSYmIG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gby5nZXRFeHRyYURpbWVuc2lvbnMoKQogCQkJCSYmIHNhZmVTdWJ0cmVlTGlzdE1hdGNoKG5vZGUudGhyb3duRXhjZXB0aW9ucygpLCBvLnRocm93bkV4Y2VwdGlvbnMoKSkKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkpOwogCX0KQEAgLTExODUsNiArMTE5NSwxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+CisJICogPHA+CisJICogTm90ZSB0aGF0IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgYXJlIGNvbXBhcmVkIHNpbmNlIHRoZXkgYXJlIGFuCisJICogaW1wb3J0YW50IHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uLgorCSAqIDwvcD4KIAkgKiAKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgpAQCAtMTIwMSw2ICsxMjE1LDcgQEAKIAkJCShub2RlLmdldE1vZGlmaWVycygpID09IG8uZ2V0TW9kaWZpZXJzKCkpCiAJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldFR5cGUoKSwgby5nZXRUeXBlKCkpCiAJCQkJJiYgc2FmZVN1YnRyZWVNYXRjaChub2RlLmdldE5hbWUoKSwgby5nZXROYW1lKCkpCisJIAkJCSYmIG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gby5nZXRFeHRyYURpbWVuc2lvbnMoKQogCQkJCSYmIHNhZmVTdWJ0cmVlTWF0Y2gobm9kZS5nZXRJbml0aWFsaXplcigpLCBvLmdldEluaXRpYWxpemVyKCkpKTsKIAl9CiAKQEAgLTE1NDIsNiArMTU1NywxMCBAQAogCSAqIG90aGVyIG9iamVjdCBpcyBhIG5vZGUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIHN0cnVjdHVyYWxseSBpc29tb3JwaGljCiAJICogY2hpbGQgc3VidHJlZXMuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC4KIAkgKiA8L3A+CisJICogPHA+CisJICogTm90ZSB0aGF0IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgYXJlIGNvbXBhcmVkIHNpbmNlIHRoZXkgYXJlIGFuCisJICogaW1wb3J0YW50IHBhcnQgb2YgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLgorCSAqIDwvcD4KIAkgKiAKIAkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZQogCSAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgpAQCAtMTYwNyw0ICsxNjI2LDQgQEAKIAkJCQkmJiBzYWZlU3VidHJlZU1hdGNoKG5vZGUuZ2V0Qm9keSgpLCBvLmdldEJvZHkoKSkpOwogCX0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUTm9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKaW5kZXggNGZhM2EwNy4uY2YzYjA4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1ROb2RlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNDEsNyArNDEsMTAgQEAKICAqIEZvciBub2RlcyB3aXRoIHByb3BlcnRpZXMgdGhhdCBpbmNsdWRlIGEgbGlzdCBvZiBjaGlsZHJlbiAoZm9yIGV4YW1wbGUsCiAgKiA8Y29kZT5CbG9jazwvY29kZT4gd2hvc2UgPGNvZGU+c3RhdGVtZW50czwvY29kZT4gcHJvcGVydHkgaXMgYSBsaXN0CiAgKiBvZiBzdGF0ZW1lbnRzKSwgYWRkaW5nIG9yIHJlbW92aW5nIGFuIGVsZW1lbnQgdG8vZm9yIHRoZSBsaXN0IHByb3BlcnR5Ci0gKiBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBhcmVudCBsaW5rcy4KKyAqIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgcGFyZW50IGxpbmtzLiBUaGVzZSBsaXN0cyBzdXBwb3J0IHRoZSAKKyAqIDxjb2RlPkxpc3Quc2V0PC9jb2RlPiBtZXRob2Q7IGhvd2V2ZXIsIHRoZSBjb25zdHJhaW50IHRoYXQgdGhlIHNhbWUKKyAqIG5vZGUgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZSBtZWFucyB0aGF0IHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkCisgKiB0byBzd2FwIGVsZW1lbnRzIHdpdGhvdXQgZmlyc3QgcmVtb3ZpbmcgdGhlIG5vZGUuCiAgKiA8L3A+CiAgKiA8cD4KICAqIEFTVHMgbXVzdCBub3QgY29udGFpbiBjeWNsZXMuIEFsbCBvcGVyYXRpb25zIHRoYXQgY291bGQgY3JlYXRlIGEgY3ljbGUKQEAgLTk3LDYgKzEwMCwxMyBAQAogICogQVNUcyBhbHNvIHN1cHBvcnQgdGhlIHZpc2l0b3IgcGF0dGVybjsgc2VlIHRoZSBjbGFzcyA8Y29kZT5BU1RWaXNpdG9yPC9jb2RlPgogICogZm9yIGRldGFpbHMuCiAgKiA8L3A+CisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBidWlsdC1pbiB3YXkgdG8gc2VyaWFsaXplIGEgbW9kaWZpZWQgQVNUIHRvIGEgc291cmNlCisgKiBjb2RlIHN0cmluZy4gTmFpdmUgc2VyaWFsaXphdGlvbiBvZiBhIG5ld2x5LWNvbnN0cnVjdGVkIEFTVCB0byBhIHN0cmluZyBpcworICogYSBzdHJhaWdodGZvcndhcmQgYXBwbGljYXRpb24gb2YgYW4gQVNUIHZpc2l0b3IuIEhvd2V2ZXIsIHByZXNlcnZpbmcgY29tbWVudHMKKyAqIGFuZCBmb3JtYXR0aW5nIGZyb20gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBjb2RlIHN0cmluZyBpcyBhIGNoYWxsZW5naW5nCisgKiBwcm9ibGVtIChzdXBwb3J0IGZvciB0aGlzIGlzIHBsYW5uZWQgZm9yIGEgZnV0dXJlIHJlbGVhc2UpLgorICogPC9wPgogICogCiAgKiBAc2VlIEFTVCNwYXJzZUNvbXBpbGF0aW9uVW5pdAogICogQHNlZSBBU1RWaXNpdG9yCkBAIC02MjAsOCArNjMwLDEzIEBACiAJCSAqIDxwPgogCQkgKiBCZSBzdGluZ3kgb24gc3RvcmFnZSAtIGFzc3VtZSB0aGF0IGxpc3Qgd2lsbCBiZSBlbXB0eS4KIAkJICogPC9wPgorCQkgKiA8cD4KKwkJICogVGhpcyBmaWVsZCBkZWNsYXJlZCBkZWZhdWx0IHZpc2liaWxpdHkgKHJhdGhlciB0aGFuIHByaXZhdGUpCisJCSAqIHNvIHRoYXQgYWNjZXNzZXMgZnJvbSA8Y29kZT5Ob2RlTGlzdC5DdXJzb3I8L2NvZGU+IGRvIG5vdCByZXF1aXJlCisJCSAqIGEgc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZC4KKwkJICogPC9wPgogCQkgKi8KLQkJcHJpdmF0ZSBBcnJheUxpc3Qgc3RvcmUgPSBuZXcgQXJyYXlMaXN0KDApOworCQlBcnJheUxpc3Qgc3RvcmUgPSBuZXcgQXJyYXlMaXN0KDApOwogCQkKIAkJLyoqCiAJCSAqIEluZGljYXRlZCB3aGV0aGVyIGN5Y2xlcyBhcmUgYSByaXNrLiBBIGN5Y2xlIGlzIHBvc3NpYmxlCkBAIC0xMjYyLDcgKzEyNzcsOCBAQAogCSAqIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgQVNUcyBvZiB0aGUgZ2l2ZW4gbm9kZS4gCiAJICogRXZlbiBpZiB0aGUgZ2l2ZW4gbm9kZSBoYXMgYSBwYXJlbnQsIHRoZSByZXN1bHQgbm9kZSB3aWxsIGJlIHVucGFyZW50ZWQuCiAJICogPHA+Ci0JICogTm90ZSB0aGF0IGNsaWVudCBwcm9wZXJ0aWVzIGFyZSBub3QgY2FycmllZCBvdmVyIHRvIHRoZSBuZXcgbm9kZXMuCisJICogU291cmNlIHJhbmdlIGluZm9ybWF0aW9uIG9uIHRoZSBvcmlnaW5hbCBub2RlcyBpcyBhdXRvbWF0aWNhbGx5IGNvcGllZCB0byB0aGUgbmV3CisJICogbm9kZXMuIENsaWVudCBwcm9wZXJ0aWVzICg8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPikgYXJlIG5vdCBjYXJyaWVkIG92ZXIuCiAJICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSB0YXJnZXQgdGhlIEFTVCB0aGF0IGlzIHRvIG93biB0aGUgbm9kZXMgaW4gdGhlIHJlc3VsdApAQCAtMTI4NSw3ICsxMzAxLDggQEAKIAkgKiBFdmVuIGlmIHRoZSBub2RlcyBpbiB0aGUgbGlzdCBoYXZlIHBhcmVudHMsIHRoZSBub2RlcyBpbiB0aGUgcmVzdWx0CiAJICogd2lsbCBiZSB1bnBhcmVudGVkLgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBjbGllbnQgcHJvcGVydGllcyBhcmUgbm90IGNhcnJpZWQgb3ZlciB0byB0aGUgbmV3IG5vZGVzLgorCSAqIFNvdXJjZSByYW5nZSBpbmZvcm1hdGlvbiBvbiB0aGUgb3JpZ2luYWwgbm9kZXMgaXMgYXV0b21hdGljYWxseSBjb3BpZWQgdG8gdGhlIG5ldworCSAqIG5vZGVzLiBDbGllbnQgcHJvcGVydGllcyAoPGNvZGU+cHJvcGVydGllczwvY29kZT4pIGFyZSBub3QgY2FycmllZCBvdmVyLgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBBU1QgdGhhdCBpcyB0byBvd24gdGhlIG5vZGVzIGluIHRoZSByZXN1bHQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFN5bnRheEVycm9yUHJvcGFnYXRvci5qYXZhCmluZGV4IDA5ZTYzZDguLmNjYjAwODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUU3ludGF4RXJyb3JQcm9wYWdhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BU1RTeW50YXhFcnJvclByb3BhZ2F0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FTVFZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUVmlzaXRvci5qYXZhCmluZGV4IGJiNDAzYTUuLjExM2EyMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUVmlzaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQVNUVmlzaXRvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTQzMiw0ICs0MzIsNCBAQAogCX0KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaGlsZVN0YXRlbWVudCBub2RlKSB7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKaW5kZXggMmEwM2VlZS4uYmNhNzMyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjAsNiArNjAsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkQWxsKAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBib2R5RGVjbGFyYXRpb25zKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlBY2Nlc3MuamF2YQppbmRleCAxZmY1ZTU0Li5jN2RiNmJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5QWNjZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUFjY2Vzcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTYxLDYgKzYxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQXJyYXlBY2Nlc3MgcmVzdWx0ID0gbmV3IEFycmF5QWNjZXNzKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRBcnJheSgoRXhwcmVzc2lvbikgZ2V0QXJyYXkoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEluZGV4KChFeHByZXNzaW9uKSBnZXRJbmRleCgpLmNsb25lKHRhcmdldCkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtOTUsNyArOTYsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEFycmF5KCkgewogCQlpZiAoYXJyYXlFeHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0QXJyYXkobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gYXJyYXlFeHByZXNzaW9uOwogCX0KQEAgLTEyOSw3ICsxMzIsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEluZGV4KCkgewogCQlpZiAoaW5kZXhFeHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0SW5kZXgobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gaW5kZXhFeHByZXNzaW9uOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlDcmVhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEKaW5kZXggNDk2NGZmNy4uMDM2NWYxMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheUNyZWF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtODAsNiArODAsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlBcnJheUNyZWF0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUNyZWF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRUeXBlKChBcnJheVR5cGUpIGdldFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LmRpbWVuc2lvbnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBkaW1lbnNpb25zKCkpKTsKIAkJcmVzdWx0LnNldEluaXRpYWxpemVyKApAQCAtMTE3LDggKzExOCwxMCBAQAogCXB1YmxpYyBBcnJheVR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKGFycmF5VHlwZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFR5cGUoZ2V0QVNUKCkubmV3QXJyYXlUeXBlKAogCQkJCWdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGFycmF5VHlwZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5SW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlJbml0aWFsaXplci5qYXZhCmluZGV4IDdmZjQ5NjMuLmM3OThjZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlJbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlJbml0aWFsaXplci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTU0LDYgKzU0LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQXJyYXlJbml0aWFsaXplciByZXN1bHQgPSBuZXcgQXJyYXlJbml0aWFsaXplcih0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuZXhwcmVzc2lvbnMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBleHByZXNzaW9ucygpKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXJyYXlUeXBlLmphdmEKaW5kZXggODNhYTlhMS4uMGY2ODRjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9BcnJheVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0FycmF5VHlwZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTU1LDYgKzU1LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQXJyYXlUeXBlIHJlc3VsdCA9IG5ldyBBcnJheVR5cGUodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldENvbXBvbmVudFR5cGUoKFR5cGUpIGdldENvbXBvbmVudFR5cGUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC04Nyw3ICs4OCw5IEBACiAJcHVibGljIFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKIAkJaWYgKGNvbXBvbmVudFR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRDb21wb25lbnRUeXBlKG5ldyBTaW1wbGVUeXBlKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGNvbXBvbmVudFR5cGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NlcnRTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzZXJ0U3RhdGVtZW50LmphdmEKaW5kZXggNWI4YTVhNC4uZGY2OThmYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NlcnRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Fzc2VydFN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTYwLDcgKzYwLDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQXNzZXJ0U3RhdGVtZW50IHJlc3VsdCA9IG5ldyBBc3NlcnRTdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigKIAkJCShFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhwcmVzc2lvbigpKSk7CiAJCXJlc3VsdC5zZXRNZXNzYWdlKApAQCAtOTcsNyArOTgsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQXNzaWdubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NpZ25tZW50LmphdmEKaW5kZXggMmJiZjI2Mi4uODljZjUyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NpZ25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Bc3NpZ25tZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtOTQsMTAgKzk0LDEwIEBACiAJCS8qKiAmbHQ7Jmx0Oz09IG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIExFRlRfU0hJRlRfQVNTSUdOID0KIAkJCW5ldyBPcGVyYXRvcigiPDw9Iik7Ly8kTk9OLU5MUy0xJAotCQkvKiogJmd0OyZndDs9PSBvcGVyYXRvci4gKi8KKwkJLyoqICZndDsmZ3Q7PSBvcGVyYXRvci4gKi8KIAkJcHVibGljIHN0YXRpYyBmaW5hbCBPcGVyYXRvciBSSUdIVF9TSElGVF9TSUdORURfQVNTSUdOID0KIAkJCW5ldyBPcGVyYXRvcigiPj49Iik7Ly8kTk9OLU5MUy0xJAotCQkvKiogJmd0OyZndDsmZ3Q7PT0gb3BlcmF0b3IuICovCisJCS8qKiAmZ3Q7Jmd0OyZndDs9IG9wZXJhdG9yLiAqLwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdG9yIFJJR0hUX1NISUZUX1VOU0lHTkVEX0FTU0lHTiA9CiAJCQluZXcgT3BlcmF0b3IoIj4+Pj0iKTsvLyROT04tTkxTLTEkCiAJCQpAQCAtMTg0LDYgKzE4NCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUFzc2lnbm1lbnQgcmVzdWx0ID0gbmV3IEFzc2lnbm1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE9wZXJhdG9yKGdldE9wZXJhdG9yKCkpOwogCQlyZXN1bHQuc2V0TGVmdEhhbmRTaWRlKChFeHByZXNzaW9uKSBnZXRMZWZ0SGFuZFNpZGUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFJpZ2h0SGFuZFNpZGUoKEV4cHJlc3Npb24pIGdldFJpZ2h0SGFuZFNpZGUoKS5jbG9uZSh0YXJnZXQpKTsKQEAgLTI0Miw3ICsyNDMsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldExlZnRIYW5kU2lkZSgpIHsKIAkJaWYgKGxlZnRIYW5kU2lkZSAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRMZWZ0SGFuZFNpZGUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gbGVmdEhhbmRTaWRlOwogCX0KQEAgLTI3NSw3ICsyNzgsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldFJpZ2h0SGFuZFNpZGUoKSB7CiAJCWlmIChyaWdodEhhbmRTaWRlICA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFJpZ2h0SGFuZFNpZGUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gcmlnaHRIYW5kU2lkZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JpbmRpbmdSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CaW5kaW5nUmVzb2x2ZXIuamF2YQppbmRleCBlNmU3YzU1Li45MDhlNzM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JpbmRpbmdSZXNvbHZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmluZGluZ1Jlc29sdmVyLmphdmEKQEAgLTEsMTYgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CisKIC8qKgogICogQSBiaW5kaW5nIHJlc29sdmVyIGlzIGFuIGludGVybmFsIG1lY2hhbmlzbSBmb3IgZmlndXJpbmcgb3V0IHRoZSBiaW5kaW5nCiAgKiBmb3IgYSBtYWpvciBkZWNsYXJhdGlvbiwgdHlwZSwgb3IgbmFtZSByZWZlcmVuY2UuCkBAIC01MCw3ICs1Myw3IEBACiAJICogQHBhcmFtIG5ld05vZGUgdGhlIG5ldyBBU1Qgbm9kZQogCSAqIEBwYXJhbSBvbGROb2RlIHRoZSBvbGQgQVNUIG5vZGUKIAkgKi8KLQl2b2lkIHN0b3JlKEFTVE5vZGUgbmV3Tm9kZSwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlIG9sZEFTVE5vZGUpIHsKKwl2b2lkIHN0b3JlKEFTVE5vZGUgbmV3Tm9kZSwgQXN0Tm9kZSBvbGRBU1ROb2RlKSB7CiAJfQogCiAJLyoqCkBAIC0xODAsNyArMTgzLDQ2IEBACiAJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZU1ldGhvZChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCQorCS8qKgorCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBtZXRob2QgaW52b2NhdGlvbiBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgaXQuCisJICogPHA+CisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPk1ldGhvZEludm9jYXRpb24ucmVzb2x2ZU1ldGhvZEJpbmRpbmc8L2NvZGU+CisJICogZm9yd2FyZHMgdG8gdGhpcyBtZXRob2QuIEhvdyB0aGUgbWV0aG9kIHJlc29sdmVzIGlzIG9mdGVuIGEgZnVuY3Rpb24gb2YKKwkgKiB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbWV0aG9kIGludm9jYXRpb24gbm9kZSBpcyBlbWJlZGRlZCBhcyB3ZWxsIGFzCisJICogdGhlIG1ldGhvZCBpbnZvY2F0aW9uIHN1YnRyZWUgaXRzZWxmLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgaW52b2NhdGlvbiBvZiBpbnRlcmVzdAorCSAqIEByZXR1cm4gdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBtZXRob2QgaW52b2NhdGlvbiwgb3IgCisJICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYmluZGluZyBpcyBhdmFpbGFibGUKKwkgKi8KKwlJTWV0aG9kQmluZGluZyByZXNvbHZlTWV0aG9kKE1ldGhvZEludm9jYXRpb24gbWV0aG9kKSB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gbWV0aG9kIGludm9jYXRpb24gYW5kIHJldHVybnMgdGhlIGJpbmRpbmcgZm9yIGl0LgorCSAqIDxwPgorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5NZXRob2RJbnZvY2F0aW9uLnJlc29sdmVNZXRob2RCaW5kaW5nPC9jb2RlPgorCSAqIGZvcndhcmRzIHRvIHRoaXMgbWV0aG9kLiBIb3cgdGhlIG1ldGhvZCByZXNvbHZlcyBpcyBvZnRlbiBhIGZ1bmN0aW9uIG9mCisJICogdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIG1ldGhvZCBpbnZvY2F0aW9uIG5vZGUgaXMgZW1iZWRkZWQgYXMgd2VsbCBhcworCSAqIHRoZSBtZXRob2QgaW52b2NhdGlvbiBzdWJ0cmVlIGl0c2VsZi4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIGludm9jYXRpb24gb2YgaW50ZXJlc3QKKwkgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGludm9jYXRpb24sIG9yIAorCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJpbmRpbmcgaXMgYXZhaWxhYmxlCisJICovCisJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZU1ldGhvZChTdXBlck1ldGhvZEludm9jYXRpb24gbWV0aG9kKSB7CisJCXJldHVybiBudWxsOworCX0JCiAJLyoqCiAJICogUmVzb2x2ZXMgdGhlIGdpdmVuIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciBpdC4KIAkgKiA8cD4KQEAgLTM5Niw2ICs0MzgsMjEgQEAKIAl9CiAKIAkvKioKKwkgKiBGaW5kcyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBmcm9tIHdoaWNoIHRoZSBnaXZlbiBiaW5kaW5nIGtleSBvcmlnaW5hdGVkLgorCSAqIAorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBiaW5kaW5nS2V5IHRoZSBiaW5kaW5nIGtleQorCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB3aGVyZSB0aGUgYmluZGluZ3MgaXMgZGVjbGFyZWQsIAorCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlBU1ROb2RlIGZpbmREZWNsYXJpbmdOb2RlKFN0cmluZyBiaW5kaW5nS2V5KSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBuZXcgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9sZCB0eXBlIGJpbmRpbmcuCiAJICogPHA+CiAJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KQEAgLTQ2NCw0ICs1MjEsMzAgQEAKIAkgKi8KIAl2b2lkIHVwZGF0ZUtleShBU1ROb2RlIG5vZGUsIEFTVE5vZGUgbmV3Tm9kZSkgewogCX0KKwkKKwkvKioKKwkgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBvbGQvbmV3IHBhaXIgb2YKKwkgKiBBU1Qgbm9kZXMuCisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBjdXJyZW50Tm9kZSB0aGUgbmV3IG5vZGUKKwkgKiBAcmV0dXJuIEFzdE5vZGUKKwkgKi8KKwlBc3ROb2RlIGdldENvcnJlc3BvbmRpbmdOb2RlKEFTVE5vZGUgY3VycmVudE5vZGUpIHsKKwkJcmV0dXJuIG51bGw7CisJfSAKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBzY29wZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgbm9kZS4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisJICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCisJICogPC9wPgorCSAqIEBwYXJhbSBhc3ROb2RlCisJICovCQorCXZvaWQgcmVjb3JkU2NvcGUoQVNUTm9kZSBhc3ROb2RlLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jsb2NrLmphdmEKaW5kZXggYjc3M2FhZi4uMzUxNzk2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CbG9jay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQmxvY2suamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01Nyw3ICs1Nyw4IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUJsb2NrIHJlc3VsdCA9IG5ldyBCbG9jayh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zdGF0ZW1lbnRzKCkuYWRkQWxsKAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBzdGF0ZW1lbnRzKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JvZHlEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDUzMDYxYjEuLjY0YzY1NDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9keURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Cb2R5RGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Jvb2xlYW5MaXRlcmFsLmphdmEKaW5kZXggOWY0NjM0ZS4uNzM1ZDkyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Cb29sZWFuTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQm9vbGVhbkxpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01Myw2ICs1Myw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUJvb2xlYW5MaXRlcmFsIHJlc3VsdCA9IG5ldyBCb29sZWFuTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW5WYWx1ZSgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02OSw3ICs3MCw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KIAkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQnJlYWtTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQnJlYWtTdGF0ZW1lbnQuamF2YQppbmRleCBiOTQzMDI1Li4zODUxZmRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0JyZWFrU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9CcmVha1N0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTUzLDcgKzUzLDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQnJlYWtTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEJyZWFrU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldExhYmVsKChTaW1wbGVOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0TGFiZWwoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2FzdEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2FzdEV4cHJlc3Npb24uamF2YQppbmRleCBkNWU4MmZiLi45ZGI4NTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0Nhc3RFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXN0RXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTYwLDYgKzYwLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQ2FzdEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IENhc3RFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRUeXBlKChUeXBlKSBnZXRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05NCw3ICs5NSw5IEBACiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKHR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRUeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdHlwZTsKIAl9CkBAIC0xMjYsNyArMTI5LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gZXhwcmVzc2lvbjsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NhdGNoQ2xhdXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NhdGNoQ2xhdXNlLmphdmEKaW5kZXggNTJkYzVjNi4uYjM3MzIxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DYXRjaENsYXVzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2F0Y2hDbGF1c2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01OSw2ICs1OSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUNhdGNoQ2xhdXNlIHJlc3VsdCA9IG5ldyBDYXRjaENsYXVzZSh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0Qm9keSgoQmxvY2spIGdldEJvZHkoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEV4Y2VwdGlvbigKIAkJCShTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0RXhjZXB0aW9uKCkpKTsKQEAgLTk0LDcgKzk1LDkgQEAKIAlwdWJsaWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRFeGNlcHRpb24oKSB7CiAJCWlmIChleGNlcHRpb25EZWNsID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhjZXB0aW9uKG5ldyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGV4Y2VwdGlvbkRlY2w7CiAJfQpAQCAtMTI4LDcgKzEzMSw5IEBACiAJcHVibGljIEJsb2NrIGdldEJvZHkoKSB7CiAJCWlmIChib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0Qm9keShuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gYm9keTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NoYXJhY3RlckxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCmluZGV4IDhlYzVlN2YuLmVlNTNiOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTUyLDYgKzUyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQ2hhcmFjdGVyTGl0ZXJhbCByZXN1bHQgPSBuZXcgQ2hhcmFjdGVyTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0RXNjYXBlZFZhbHVlKGdldEVzY2FwZWRWYWx1ZSgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02OCw3ICs2OSw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KIAkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCmluZGV4IGQwNjk0ZjIuLjNjN2QyOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9DbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC04MCw2ICs4MCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiByZXN1bHQgPSBuZXcgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKIAkJcmVzdWx0LnNldE5hbWUoKE5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKQEAgLTE1MSw3ICsxNTIsOSBAQAogCXB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdHlwZU5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggM2NkZTYxNS4uZWViYWE1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDIzICsxLDI3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKKwogLyoqCiAgKiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgQVNUIG5vZGUgdHlwZS4gVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgcm9vdCBvZiBhbiBBU1QuCi0gKgotICogUmFuZ2UgMDogZmlyc3QgY2hhcmFjdGVyIHRocm91Z2ggbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHNvdXJjZSBmaWxlLgorICogPHA+CisgKiBUaGUgc291cmNlIHJhbmdlIGZvciB0aGlzIHR5cGUgb2Ygbm9kZSBpcyBvcmRpbmFyaWx5IHRoZSBlbnRpcmUgc291cmNlIGZpbGUsCisgKiBpbmNsdWRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuCisgKiA8L3A+CiAgKgogICogPHByZT4KICAqIENvbXBpbGF0aW9uVW5pdDoKQEAgLTY2LDEwICs3MCwxOSBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VbXSBFTVBUWV9NRVNTQUdFUyA9IG5ldyBNZXNzYWdlWzBdOwogCiAJLyoqCi0JICogTWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyBwYXJzaW5nIG9yIG5hbWUgcmVzb2x1dGlvbjsKLQkgKiBkZWZhdWx0cyB0byB0aGUgZW1wdHkgbGlzdC4KKwkgKiBDYW5vbmljYWwgZW1wdHkgbGlzdCBvZiBwcm9ibGVtcy4KIAkgKi8KLQlwcml2YXRlIE1lc3NhZ2VbXSBtZXNzYWdlcyA9IEVNUFRZX01FU1NBR0VTOworCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9ibGVtW10gRU1QVFlfUFJPQkxFTVMgPSBuZXcgSVByb2JsZW1bMF07CisKKwkvKioKKwkgKiBNZXNzYWdlcyByZXBvcnRlZCBieSB0aGUgY29tcGlsZXIgZHVyaW5nIHBhcnNpbmcgb3IgbmFtZSByZXNvbHV0aW9uLgorCSAqLworCXByaXZhdGUgTWVzc2FnZVtdIG1lc3NhZ2VzOworCQorCS8qKgorCSAqIFByb2JsZW1zIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgcGFyc2luZyBvciBuYW1lIHJlc29sdXRpb24uCisJICovCisJcHJpdmF0ZSBJUHJvYmxlbVtdIHByb2JsZW1zID0gRU1QVFlfUFJPQkxFTVM7CiAJIAogCS8qKgogCSAqIFNldHMgdGhlIGxpbmUgZW5kIHRhYmxlIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCkBAIC0xMTgsNiArMTMxLDcgQEAKIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQ29tcGlsYXRpb25Vbml0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblVuaXQodGFyZ2V0KTsKIAkJLy8gbi5iIGRvIG5vdCBjb3B5IGxpbmUgbnVtYmVyIHRhYmxlIG9yIG1lc3NhZ2VzCisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRQYWNrYWdlKAogCQkJKFBhY2thZ2VEZWNsYXJhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFBhY2thZ2UoKSkpOwogCQlyZXN1bHQuaW1wb3J0cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGltcG9ydHMoKSkpOwpAQCAtMjAyLDYgKzIxNiw4IEBACiAJICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgQVNUIG5vZGUgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSAKIAkgKiB3aGljaCB0aGUgZ2l2ZW4gYmluZGluZyBvcmlnaW5hdGVkLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQogCSAqIGJpbmRpbmcgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbm9kZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisJICogVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgYmluZGluZ3Mgd2VyZSBub3QgcmVxdWVzdGVkCisJICogd2hlbiB0aGlzIEFTVCB3YXMgYnVpbHQuCiAJICogPHA+CiAJICogVGhlIGZvbGxvd2luZyB0YWJsZSBpbmRpY2F0ZXMgdGhlIGV4cGVjdGVkIG5vZGUgdHlwZSBmb3IgdGhlIHZhcmlvdXMKIAkgKiBkaWZmZXJlbnQga2luZHMgb2YgYmluZGluZ3M6CkBAIC0yMjMsMTggKzIzOSw2MiBAQAogCSAqIDwvdWw+CiAJICogPC9wPgogCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKLQkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogRWFjaCBjYWxsIHRvIDxjb2RlPkFTVC5wYXJzZUNvbXBpbGF0aW9uVW5pdDwvY29kZT4gd2l0aCBhIHJlcXVlc3QgZm9yIGJpbmRpbmdzCisJICogZ2l2ZXMgcmlzZSB0byBzZXBhcmF0ZSB1bml2ZXJzZSBvZiBiaW5kaW5nIG9iamVjdHMuIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB0aGUgYmluZGluZyBvYmplY3QgY29tZXMgZnJvbSBhIGRpZmZlcmVudCBBU1QuCisJICogVXNlIDxjb2RlPmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcuZ2V0S2V5KCkpPC9jb2RlPiB3aGVuIHRoZSBiaW5kaW5nIGNvbWVzCisJICogZnJvbSBhIGRpZmZlcmVudCBBU1QuCiAJICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSBiaW5kaW5nIHRoZSBiaW5kaW5nCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIHdoZXJlIHRoZSBiaW5kaW5ncyBpcyBkZWNsYXJlZCwgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSB3aGVyZSB0aGUgZ2l2ZW4gYmluZGluZyBpcyBkZWNsYXJlZCwKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYmluZGluZyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgbm9kZSBpbiB0aGlzCisJICogY29tcGlsYXRpb24gdW5pdCBvciBpZiBiaW5kaW5ncyB3ZXJlIG5vdCByZXF1ZXN0ZWQgd2hlbiB0aGlzIEFTVCB3YXMgYnVpbHQKKwkgKiBAc2VlICNmaW5kRGVjbGFyaW5nTm9kZShqYXZhLmxhbmcuU3RyaW5nKQogCSAqLwogCXB1YmxpYyBBU1ROb2RlIGZpbmREZWNsYXJpbmdOb2RlKElCaW5kaW5nIGJpbmRpbmcpIHsKIAkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOwogCX0KLQkKKworCS8qKgorCSAqIEZpbmRzIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGZyb20gCisJICogd2hpY2ggdGhlIGJpbmRpbmcgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yaWdpbmF0ZWQuIFJldHVybnMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29ycmVzcG9uZGluZyBub2RlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorCSAqIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIGJpbmRpbmdzIHdlcmUgbm90IHJlcXVlc3RlZAorCSAqIHdoZW4gdGhpcyBBU1Qgd2FzIGJ1aWx0LgorCSAqIDxwPgorCSAqIFRoZSBmb2xsb3dpbmcgdGFibGUgaW5kaWNhdGVzIHRoZSBleHBlY3RlZCBub2RlIHR5cGUgZm9yIHRoZSB2YXJpb3VzCisJICogZGlmZmVyZW50IGtpbmRzIG9mIGJpbmRpbmcga2V5czoKKwkgKiA8dWw+CisJICogPGxpPjwvbGk+CisJICogPGxpPnBhY2thZ2UgLSBhIDxjb2RlPlBhY2thZ2VEZWNsYXJhdGlvbjwvY29kZT48L2xpPgorCSAqIDxsaT5jbGFzcyBvciBpbnRlcmZhY2UgLSBhIDxjb2RlPlR5cGVEZWNsYXJhdGlvbjwvY29kZT4gb3IgYQorCSAqICAgIDxjb2RlPkNsYXNzSW5zdGFuY2VDcmVhdGlvbjwvY29kZT4gKGZvciBhbm9ueW1vdXMgY2xhc3NlcykgPC9saT4KKwkgKiA8bGk+cHJpbWl0aXZlIHR5cGUgLSBub25lPC9saT4KKwkgKiA8bGk+YXJyYXkgdHlwZSAtIG5vbmU8L2xpPgorCSAqIDxsaT5maWVsZCAtIGEgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PC9jb2RlPiBpbiBhIAorCSAqICAgIDxjb2RlPkZpZWxkRGVjbGFyYXRpb248L2NvZGU+IDwvbGk+CisJICogPGxpPmxvY2FsIHZhcmlhYmxlIC0gYSA8Y29kZT5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPC9jb2RlPiwgb3IKKwkgKiAgICBhIDxjb2RlPlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDwvY29kZT4gaW4gYSAKKwkgKiAgICA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50PC9jb2RlPiBvciAKKwkgKiAgICA8Y29kZT5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjwvY29kZT48L2xpPgorCSAqIDxsaT5tZXRob2QgLSBhIDxjb2RlPk1ldGhvZERlY2xhcmF0aW9uPC9jb2RlPiA8L2xpPgorCSAqIDxsaT5jb25zdHJ1Y3RvciAtIGEgPGNvZGU+TWV0aG9kRGVjbGFyYXRpb248L2NvZGU+IDwvbGk+CisJICogPC91bD4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIGtleSB0aGUgYmluZGluZyBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBub2RlIHdoZXJlIGEgYmluZGluZyB3aXRoIHRoZSBnaXZlbgorCSAqIGtleSBpcyBkZWNsYXJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIG9yIGlmIHRoZSBrZXkgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIG5vZGUgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0CisJICogb3IgaWYgYmluZGluZ3Mgd2VyZSBub3QgcmVxdWVzdGVkIHdoZW4gdGhpcyBBU1Qgd2FzIGJ1aWx0CisJICogQHNlZSBJQmluZGluZyNnZXRLZXkKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIEFTVE5vZGUgZmluZERlY2xhcmluZ05vZGUoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZmluZERlY2xhcmluZ05vZGUoa2V5KTsKKwl9CisJCQogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZSBjaGFyYWN0ZXIKIAkgKiBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHN0cmluZy4gVGhlIGluaXRpYWwgbGluZSBvZiB0aGUgCkBAIC0yNDIsNyArMzAyLDcgQEAKIAkgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZW5kLW9mLWxpbmUgZGVsaW1pdGVyLiBUaGUgdmVyeSBsYXN0IGxpbmUgZXh0ZW5kcwogCSAqIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZyBhbmQgaGFzIG5vIGxpbmUgZGVsaW1pdGVyLgogCSAqIEZvciBleGFtcGxlLCB0aGUgc291cmNlIHN0cmluZyA8Y29kZT5jbGFzcyBBXG57XG59PC9jb2RlPiBoYXMgMyBsaW5lcwotCSAqIGNvcnJlc3BvbmRpbmcgdG8gaW5jbHVzaXZlIGNoYXJhY3RlciByYW5nZXMgWzAsOF0sIFs4LDldLCBhbmQgWzEwLDEwXS4KKwkgKiBjb3JyZXNwb25kaW5nIHRvIGluY2x1c2l2ZSBjaGFyYWN0ZXIgcmFuZ2VzIFswLDddLCBbOCw5XSwgYW5kIFsxMCwxMF0uCiAJICogUmV0dXJucyAxIGZvciBhIGNoYXJhY3RlciBwb3NpdGlvbiB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55CiAJICogc291cmNlIGxpbmUsIG9yIGlmIG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcwogCSAqIGNvbXBpbGF0aW9uIHVuaXQuCkBAIC0zMTEsMjUgKzM3MSw2NSBAQAogCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgcGFyc2luZyAKIAkgKiBvciB0aGUgdHlwZSBjaGVja2luZyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbGlzdCBtaWdodCBiZSBhIHN1YnNldCBvZiAKIAkgKiBlcnJvcnMgZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkIGJ5IGEgSmF2YSBjb21waWxlci4KLQkgKiAKKwkgKiA8cD4KKwkgKiBUaGlzIGxpc3Qgb2YgbWVzc2FnZXMgaXMgc3VpdGFibGUgZm9yIHNpbXBsZSBjbGllbnRzIHRoYXQgZG8gbGl0dGxlCisJICogbW9yZSB0aGFuIGxvZyB0aGUgbWVzc2FnZXMgb3IgZGlzcGxheSB0aGVtIHRvIHRoZSB1c2VyLiBDbGllbnRzIHRoYXQKKwkgKiBuZWVkIGZ1cnRoZXIgZGV0YWlscyBzaG91bGQgY2FsbCA8Y29kZT5nZXRQcm9ibGVtczwvY29kZT4gdG8gZ2V0CisJICogY29tcGlsZXIgcHJvYmxlbSBvYmplY3RzLgorCSAqIDwvcD4KKwkgKgogCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbWVzc2FnZXMsIHBvc3NpYmx5IGVtcHR5CisJICogQHNlZSAjZ2V0UHJvYmxlbXMKIAkgKiBAc2VlIEFTVCNwYXJzZUNvbXBpbGF0aW9uVW5pdAogCSAqLwogCXB1YmxpYyBNZXNzYWdlW10gZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBtZXNzYWdlczsKKwkJaWYgKHRoaXMubWVzc2FnZXMgPT0gbnVsbCkgeworCQkJaW50IHByb2JsZW1MZW5ndGggPSB0aGlzLnByb2JsZW1zLmxlbmd0aDsKKwkJCWlmIChwcm9ibGVtTGVuZ3RoID09IDApIHsKKwkJCQl0aGlzLm1lc3NhZ2VzID0gRU1QVFlfTUVTU0FHRVM7CisJCQl9IGVsc2UgeworCQkJCXRoaXMubWVzc2FnZXMgPSBuZXcgTWVzc2FnZVtwcm9ibGVtTGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1MZW5ndGg7IGkrKykgeworCQkJCQlJUHJvYmxlbSBwcm9ibGVtID0gdGhpcy5wcm9ibGVtc1tpXTsKKwkJCQkJaW50IHN0YXJ0ID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOworCQkJCQlpbnQgZW5kID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKKwkJCQkJbWVzc2FnZXNbaV0gPSBuZXcgTWVzc2FnZShwcm9ibGVtLmdldE1lc3NhZ2UoKSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0aGlzLm1lc3NhZ2VzOwogCX0KIAogCS8qKgotCSAqIFNldHMgdGhlIGFycmF5IG9mIG1lc3NhZ2VzIHJlcG9ydGVkIGJ5IHRoZSBjb21waWxlciBkdXJpbmcgdGhlIHBhcnNpbmcgb3IKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGRldGFpbGVkIHByb2JsZW0gcmVwb3J0cyBub3RlZCBieSB0aGUgY29tcGlsZXIKKwkgKiBkdXJpbmcgdGhlIHBhcnNpbmcgb3IgdGhlIHR5cGUgY2hlY2tpbmcgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LiBUaGlzCisJICogbGlzdCBtaWdodCBiZSBhIHN1YnNldCBvZiBlcnJvcnMgZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkIGJ5IGEgSmF2YQorCSAqIGNvbXBpbGVyLgorCSAqIDxwPgorCSAqIFNpbXBsZSBjbGllbnRzIHRoYXQgZG8gbGl0dGxlIG1vcmUgdGhhbiBsb2cgdGhlIG1lc3NhZ2VzIG9yIGRpc3BsYXkKKwkgKiB0aGVtIHRvIHRoZSB1c2VyIHNob3VsZCBwcm9iYWJseSBjYWxsIDxjb2RlPmdldE1lc3NhZ2VzPC9jb2RlPiBpbnN0ZWFkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGRldGFpbGVkIHByb2JsZW0gb2JqZWN0cywgcG9zc2libHkgZW1wdHkKKwkgKiBAc2VlICNnZXRNZXNzYWdlcworCSAqIEBzZWUgQVNUI3BhcnNlQ29tcGlsYXRpb25Vbml0CisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBJUHJvYmxlbVtdIGdldFByb2JsZW1zKCkgeworCQlyZXR1cm4gcHJvYmxlbXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgYXJyYXkgb2YgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyIGR1cmluZyB0aGUgcGFyc2luZyBvcgogCSAqIG5hbWUgcmVzb2x1dGlvbiBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCiAJICogCi0JICogQHBhcmFtIG1lc3NhZ2VzIHRoZSBsaXN0IG9mIG1lc3NhZ2VzCisJICogQHBhcmFtIHByb2JsZW1zIHRoZSBsaXN0IG9mIHByb2JsZW1zCiAJICovCi0Jdm9pZCBzZXRNZXNzYWdlcyhNZXNzYWdlW10gbWVzc2FnZXMpIHsKLQkJaWYgKG1lc3NhZ2VzID09IG51bGwpIHsKKwl2b2lkIHNldFByb2JsZW1zKElQcm9ibGVtW10gcHJvYmxlbXMpIHsKKwkJaWYgKHByb2JsZW1zID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQotCQl0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7CisJCXRoaXMucHJvYmxlbXMgPSBwcm9ibGVtczsKIAl9CiAJCQogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db21waWxhdGlvblVuaXRSZXNvbHZlci5qYXZhCmluZGV4IDI5YTUyNDEuLmJkOTY4YjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbXBpbGF0aW9uVW5pdFJlc29sdmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLio7CkBAIC0yNCw3ICsyNSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC4qOwogCkBAIC04NCw5ICs4NCwxMCBAQAogCQkvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQogCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKLQkJCQlzb3VyY2VUeXBlcywKLQkJCQl0cnVlLAotCQkJCXRydWUsCisJCQkJc291cmNlVHlwZXMsLy9zb3VyY2VUeXBlc1swXSBpcyBhbHdheXMgdG9wbGV2ZWwgaGVyZQorCQkJCXRydWUsIC8vIG5lZWQgZmllbGQgYW5kIG1ldGhvZHMKKwkJCQl0cnVlLCAvLyBuZWVkIG1lbWJlciB0eXBlcworCQkJCWZhbHNlLCAvLyBubyBuZWVkIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbgogCQkJCWxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwKIAkJCQlyZXN1bHQpOwogCkBAIC0xNDAsMTcgKzE0MSwxOCBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQljaGFyW10gZmlsZU5hbWUgPSB1bml0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdW5pdEVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKIAkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIgY29tcGlsYXRpb25Vbml0VmlzaXRvciA9CiAJCQluZXcgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIoCiAJCQkJZ2V0TmFtZUVudmlyb25tZW50KHVuaXRFbGVtZW50KSwKIAkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAotCQkJCUphdmFDb3JlLmdldE9wdGlvbnMoKSwKKwkJCQlwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCiAJCQkJZ2V0UmVxdWVzdG9yKCksCiAJCQkJZ2V0UHJvYmxlbUZhY3RvcnkoZmlsZU5hbWUsIHZpc2l0b3IpKTsKIAogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKIAkJdHJ5IHsKLQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCVN0cmluZyBlbmNvZGluZyA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCiAJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KXVuaXRFbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKIAkJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSBudWxsOwpAQCAtMTY0LDcgKzE2NiwxMCBAQAogCQkJCQkJdW5pdEVsZW1lbnQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwKIAkJCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUsCiAJCQkJCQluZXcgU3RyaW5nKGZpbGVOYW1lKSwKLQkJCQkJCWVuY29kaW5nKSk7CisJCQkJCQllbmNvZGluZyksCisJCQkJCXRydWUsIC8vIG1ldGhvZCB2ZXJpZmljYXRpb24KKwkJCQkJdHJ1ZSwgLy8gYW5hbHl6ZSBjb2RlCisJCQkJCXRydWUpOyAvLyBnZW5lcmF0ZSBjb2RlCiAJCQlyZXR1cm4gdW5pdDsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmICh1bml0ICE9IG51bGwpIHsKQEAgLTE3MywxMSArMTc4LDExIEBACiAJCX0KIAl9CiAJCi0JcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZShjaGFyW10gc291cmNlKSB7CisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZShjaGFyW10gc291cmNlLCBNYXAgc2V0dGluZ3MpIHsKIAkJaWYgKHNvdXJjZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwkJQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOwogCQlQYXJzZXIgcGFyc2VyID0KIAkJCW5ldyBQYXJzZXIoCiAJCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKQEAgLTE4NSw3ICsxOTAsNyBAQAogCQkJCQljb21waWxlck9wdGlvbnMsIAogCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSwKIAkJCWZhbHNlLAotCQkJY29tcGlsZXJPcHRpb25zLmFzc2VydE1vZGUpOworCQkJY29tcGlsZXJPcHRpb25zLnNvdXJjZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpOwogCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IAogCQkJbmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQoCiAJCQkJc291cmNlLCAKQEAgLTIxNiw3ICsyMjEsOCBAQAogCQkJcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCiAJCQkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCQkJaW50IHByb2JsZW1JZCwKLQkJCQlTdHJpbmdbXSBhcmd1bWVudHMsCisJCQkJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwkJCQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAogCQkJCWludCBzZXZlcml0eSwKIAkJCQlpbnQgc3RhcnRQb3NpdGlvbiwKIAkJCQlpbnQgZW5kUG9zaXRpb24sCkBAIC0yMjYsNyArMjMyLDggQEAKIAkJCQkJc3VwZXIuY3JlYXRlUHJvYmxlbSgKIAkJCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCQkJCQlwcm9ibGVtSWQsCi0JCQkJCQlhcmd1bWVudHMsCisJCQkJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJCQkJbWVzc2FnZUFyZ3VtZW50cywKIAkJCQkJCXNldmVyaXR5LAogCQkJCQkJc3RhcnRQb3NpdGlvbiwKIAkJCQkJCWVuZFBvc2l0aW9uLApAQCAtMjUxLDE4ICsyNTgsNjIgQEAKIAkJCW5ldyBDb21waWxhdGlvblVuaXRSZXNvbHZlcigKIAkJCQlnZXROYW1lRW52aXJvbm1lbnQoamF2YVByb2plY3QpLAogCQkJCWdldEhhbmRsaW5nUG9saWN5KCksCi0JCQkJSmF2YUNvcmUuZ2V0T3B0aW9ucygpLAorCQkJCWphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCiAJCQkJZ2V0UmVxdWVzdG9yKCksCiAJCQkJZ2V0UHJvYmxlbUZhY3RvcnkodW5pdE5hbWUudG9DaGFyQXJyYXkoKSwgdmlzaXRvcikpOwogCQogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKIAkJdHJ5IHsKLQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKLQkJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSBudWxsOwotCQorCQkJU3RyaW5nIGVuY29kaW5nID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOworCiAJCQl1bml0ID0KIAkJCQljb21waWxhdGlvblVuaXRWaXNpdG9yLnJlc29sdmUoCi0JCQkJCW5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdChzb3VyY2UsIGV4cGVjdGVkUGFja2FnZU5hbWUsIHVuaXROYW1lLCBlbmNvZGluZykpOworCQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQkJCQlzb3VyY2UsCisJCQkJCQludWxsLAorCQkJCQkJdW5pdE5hbWUsCisJCQkJCQllbmNvZGluZyksCisJCQkJCXRydWUsIC8vIG1ldGhvZCB2ZXJpZmljYXRpb24KKwkJCQkJdHJ1ZSwgLy8gYW5hbHl6ZSBjb2RlCisJCQkJCXRydWUpOyAvLyBnZW5lcmF0ZSBjb2RlCisJCQlyZXR1cm4gdW5pdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh1bml0ICE9IG51bGwpIHsKKwkJCQl1bml0LmNsZWFuVXAoKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVzb2x2ZSgKKwkJY2hhcltdIHNvdXJjZSwKKwkJY2hhcltdW10gcGFja2FnZU5hbWUsCisJCVN0cmluZyB1bml0TmFtZSwKKwkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAorCQlJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkKKwkJQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIgY29tcGlsYXRpb25Vbml0VmlzaXRvciA9CisJCQluZXcgQ29tcGlsYXRpb25Vbml0UmVzb2x2ZXIoCisJCQkJZ2V0TmFtZUVudmlyb25tZW50KGphdmFQcm9qZWN0KSwKKwkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAorCQkJCWphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCisJCQkJZ2V0UmVxdWVzdG9yKCksCisJCQkJZ2V0UHJvYmxlbUZhY3RvcnkodW5pdE5hbWUudG9DaGFyQXJyYXkoKSwgdmlzaXRvcikpOworCQorCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVN0cmluZyBlbmNvZGluZyA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLCB0cnVlKTsKKworCQkJdW5pdCA9CisJCQkJY29tcGlsYXRpb25Vbml0VmlzaXRvci5yZXNvbHZlKAorCQkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQkJCQlzb3VyY2UsCisJCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJCXVuaXROYW1lLAorCQkJCQkJZW5jb2RpbmcpLAorCQkJCQl0cnVlLCAvLyBtZXRob2QgdmVyaWZpY2F0aW9uCisJCQkJCXRydWUsIC8vIGFuYWx5emUgY29kZQorCQkJCQl0cnVlKTsgLy8gZ2VuZXJhdGUgY29kZQogCQkJcmV0dXJuIHVuaXQ7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAodW5pdCAhPSBudWxsKSB7CkBAIC0yNzAsNCArMzIxLDUgQEAKIAkJCX0KIAkJfQogCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKaW5kZXggOWVhMGQ3Zi4uYjJkMWRiNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25kaXRpb25hbEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTY3LDYgKzY3LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBDb25kaXRpb25hbEV4cHJlc3Npb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFRoZW5FeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIGdldFRoZW5FeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CkBAIC0xMDUsNyArMTA2LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoY29uZGl0aW9uRXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gY29uZGl0aW9uRXhwcmVzc2lvbjsKIAl9CkBAIC0xMzksNyArMTQyLDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRUaGVuRXhwcmVzc2lvbigpIHsKIAkJaWYgKHRoZW5FeHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0VGhlbkV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdGhlbkV4cHJlc3Npb247CiAJfQpAQCAtMTczLDcgKzE3OCw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RWxzZUV4cHJlc3Npb24oKSB7CiAJCWlmIChlbHNlRXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEVsc2VFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGVsc2VFeHByZXNzaW9uOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhCmluZGV4IDVlNzc0NGQuLmE1ZWViNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQpAQCAtMSwyNCArMSwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gZXhwcmVzc2lvbiBBU1Qgbm9kZSB0eXBlLgorICogQWx0ZXJuYXRlIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCiAgKgogICogPHByZT4KICAqIENvbnN0cnVjdG9ySW52b2NhdGlvbjoKLSAqCQk8Yj50aGlzPC9iPiA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj4sPC9iPiBFeHByZXNzaW9uIH0gXSA8Yj4pPC9iPgorICoJCTxiPnRoaXM8L2I+IDxiPig8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb24gfSBdIDxiPik8L2I+IDxiPjs8L2I+CiAgKiA8L3ByZT4KICAqIAogICogQHNpbmNlIDIuMApAQCAtNTQsNyArNTQsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlDb25zdHJ1Y3Rvckludm9jYXRpb24gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9ySW52b2NhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5hcmd1bWVudHMoKS5hZGRBbGwoQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBhcmd1bWVudHMoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vQ29udGludWVTdGF0ZW1lbnQuamF2YQppbmRleCA2NmY1MDU0Li41ZDY1YjI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0NvbnRpbnVlU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Db250aW51ZVN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTUzLDcgKzUzLDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJQ29udGludWVTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IENvbnRpbnVlU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldExhYmVsKChTaW1wbGVOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0TGFiZWwoKSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRGVmYXVsdEJpbmRpbmdSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEKaW5kZXggNWJiMDJmZC4uNzk1YWRlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9EZWZhdWx0QmluZGluZ1Jlc29sdmVyLmphdmEKQEAgLTEsNTEgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BbGxvY2F0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFycmF5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNoYXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GYWxzZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuT3BlcmF0b3JFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlF1YWxpZmllZFN1cGVyUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuUXVhbGlmaWVkVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhpc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRydWVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxhdGlvblVuaXRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogCiAvKioKICAqIEludGVybmFsIGNsYXNzIGZvciByZXNvbHZpbmcgYmluZGluZ3MgdXNpbmcgb2xkIEFTVHMuCkBAIC03NCwzMCArNDUsMzUgQEAKIAlNYXAgYmluZGluZ3NUb0FzdE5vZGVzOwogCQogCS8qKgorCSAqIFRoaXMgbWFwIGlzIHVzZWQgdG8gZ2V0IGFuIGFzdCBub2RlIGZyb20gaXRzIGJpbmRpbmcga2V5LgorCSAqLworCU1hcCBiaW5kaW5nS2V5c1RvQXN0Tm9kZXM7CisJCisJLyoqCiAJICogVGhpcyBtYXAgaXMgdXNlZCB0byBnZXQgYSBiaW5kaW5nIGZyb20gaXRzIGFzdCBub2RlCiAJICovCiAJTWFwIGFzdE5vZGVzVG9CaW5kaW5nczsKIAkKIAkvKioKKwkgKiBUaGlzIG1hcCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIHNjb3BlIGZvciBhIGFzdCBub2RlCisJICovCisJTWFwIGFzdE5vZGVzVG9CbG9ja1Njb3BlOworCQorCS8qKgogCSAqIENvbXBpbGF0aW9uIHVuaXQgc2NvcGUKIAkgKi8KIAlwcml2YXRlIENvbXBpbGF0aW9uVW5pdFNjb3BlIHNjb3BlOwogCQogCS8qKgotCSAqIENoZWNrIGlmIHRoZSBiaW5kaW5nIHJlc29sdmVyIGhhcyB0byBlbnN1cmUgdGhlIG1vZGlmaWNhdGlvbiBjb3VuZAotCSAqIGRpZG4ndCBjaGFuZ2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RpZmljYXRpb25Db3VudDsKLQkKLQkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEJpbmRpbmdSZXNvbHZlci4KIAkgKi8KIAlEZWZhdWx0QmluZGluZ1Jlc29sdmVyKCkgewotCQljaGVja01vZGlmaWNhdGlvbkNvdW50ID0gZmFsc2U7CiAJCXRoaXMubmV3QXN0VG9PbGRBc3QgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmFzdE5vZGVzVG9CaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisJCXRoaXMuYXN0Tm9kZXNUb0Jsb2NrU2NvcGUgPSBuZXcgSGFzaE1hcCgpOworCQl0aGlzLmJpbmRpbmdLZXlzVG9Bc3ROb2RlcyA9IG5ldyBIYXNoTWFwKCk7CiAJfQogCQogCS8qKgpAQCAtMTEyLDE4NiArODgsMjQ5IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KIAkgKi8KIAlJQmluZGluZyByZXNvbHZlTmFtZShOYW1lIG5hbWUpIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IG5hbWUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgewotCQkJcmV0dXJuIG51bGw7CisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChuYW1lKTsKKwkJaW50IGluZGV4ID0gbmFtZS5pbmRleDsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CisJCQlRdWFsaWZpZWROYW1lUmVmZXJlbmNlIHF1YWxpZmllZE5hbWVSZWZlcmVuY2UgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgbm9kZTsKKwkJCWZpbmFsIGNoYXJbXVtdIHRva2VucyA9IHF1YWxpZmllZE5hbWVSZWZlcmVuY2UudG9rZW5zOworCQkJaW50IHF1YWxpZmllZE5hbWVMZW5ndGggPSB0b2tlbnMubGVuZ3RoOworCQkJaW50IGluZGV4SW5RdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZUxlbmd0aCAtIGluZGV4OyAvLyBvbmUtYmFzZWQKKwkJCWludCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsgLy8gb25lLWJhc2VkCisJCQlpbnQgb3RoZXJCaW5kaW5nTGVuZ3RoID0gcXVhbGlmaWVkTmFtZUxlbmd0aCAtIGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKKwkJCWlmIChpbmRleEluUXVhbGlmaWVkTmFtZSA8IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZykgeworCQkJCS8vIGEgZXh0cmEgbG9va3VwIGlzIHJlcXVpcmVkCisJCQkJQmxvY2tTY29wZSBpbnRlcm5hbFNjb3BlID0gKEJsb2NrU2NvcGUpIHRoaXMuYXN0Tm9kZXNUb0Jsb2NrU2NvcGUuZ2V0KG5hbWUpOworCQkJCUJpbmRpbmcgYmluZGluZyA9IG51bGw7CisJCQkJaWYgKGludGVybmFsU2NvcGUgPT0gbnVsbCkgeworCQkJCQliaW5kaW5nID0gdGhpcy5zY29wZS5nZXRUeXBlT3JQYWNrYWdlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkodG9rZW5zLCAwLCBpbmRleEluUXVhbGlmaWVkTmFtZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWJpbmRpbmcgPSBpbnRlcm5hbFNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheSh0b2tlbnMsIDAsIGluZGV4SW5RdWFsaWZpZWROYW1lKSk7CisJCQkJfQorCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgeworCQkJCQlyZXR1cm4gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKKwkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CisJCQkJCS8vIGl0IGlzIGEgdHlwZQorCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGluZGV4SW5RdWFsaWZpZWROYW1lID09IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZykgeworCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7CisJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKXF1YWxpZmllZE5hbWVSZWZlcmVuY2UuYmluZGluZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQmluZGluZyBiaW5kaW5nID0gcXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5iaW5kaW5nOworCQkJCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQkJCQlpZiAoYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZykgYmluZGluZyk7CQkJCQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCQkJCQkJUHJvYmxlbUZpZWxkQmluZGluZyBwcm9ibGVtRmllbGRCaW5kaW5nID0gKFByb2JsZW1GaWVsZEJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCQkJCXN3aXRjaChwcm9ibGVtRmllbGRCaW5kaW5nLnByb2JsZW1JZCgpKSB7CisJCQkJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOiAKKwkJCQkJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gcHJvYmxlbUZpZWxkQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCQkJCQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkgeworCQkJCQkJCQkJCQlGaWVsZEJpbmRpbmcgZXhhY3RCaW5kaW5nID0gZGVjbGFyaW5nQ2xhc3MuZ2V0RmllbGQodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSk7CisJCQkJCQkJCQkJCWlmIChleGFjdEJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCQkJCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQoZXhhY3RCaW5kaW5nKTsKKwkJCQkJCQkJCQkJCWlmICh2YXJpYWJsZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkJCQkJCQkJCXJldHVybiB2YXJpYWJsZUJpbmRpbmc7CisJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQl2YXJpYWJsZUJpbmRpbmcgPSBuZXcgVmFyaWFibGVCaW5kaW5nKHRoaXMsIGV4YWN0QmluZGluZyk7CisJCQkJCQkJCQkJCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dChleGFjdEJpbmRpbmcsIHZhcmlhYmxlQmluZGluZyk7CisJCQkJCQkJCQkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5hbWUgd2hpY2ggaXMgcGFydCBvZiBhIHF1YWxpZmllZCBuYW1lIHRoYXQKKwkJCQkgKiBjYW5ub3QgYmUgcmVzb2x2ZWQuIFNlZSBQUiAxMzA2My4KKwkJCQkgKi8KKwkJCQlpZiAocXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5vdGhlckJpbmRpbmdzID09IG51bGwgfHwgKG90aGVyQmluZGluZ0xlbmd0aCAtIGluZGV4IC0gMSkgPCAwKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhxdWFsaWZpZWROYW1lUmVmZXJlbmNlLm90aGVyQmluZGluZ3Nbb3RoZXJCaW5kaW5nTGVuZ3RoIC0gaW5kZXggLSAxXSk7CQkJCQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgeworCQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlID0gKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIG5vZGU7CisJCQlpZiAocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5yZXNvbHZlZFR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKGluZGV4ID09IDApIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnJlc29sdmVkVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IHF1YWxpZmllZFR5cGVMZW5ndGggPSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7CisJCQkJaW50IGluZGV4SW5RdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkVHlwZUxlbmd0aCAtIGluZGV4OyAvLyBvbmUtYmFzZWQKKwkJCQlpZiAoaW5kZXhJblF1YWxpZmllZE5hbWUgPj0gMCkgeworCQkJCQlCbG9ja1Njb3BlIGludGVybmFsU2NvcGUgPSAoQmxvY2tTY29wZSkgdGhpcy5hc3ROb2Rlc1RvQmxvY2tTY29wZS5nZXQobmFtZSk7CisJCQkJCUJpbmRpbmcgYmluZGluZyA9IG51bGw7CisJCQkJCWlmIChpbnRlcm5hbFNjb3BlID09IG51bGwpIHsKKwkJCQkJCWJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VucywgMCwgaW5kZXhJblF1YWxpZmllZE5hbWUpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJpbmRpbmcgPSBpbnRlcm5hbFNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VucywgMCwgaW5kZXhJblF1YWxpZmllZE5hbWUpKTsKKwkJCQkJfQorCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpIHsKKwkJCQkJCXJldHVybiB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CisJCQkJCQkvLyBpdCBpcyBhIHR5cGUKKwkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgeworCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIG5vZGU7CisJCQlpbnQgaW1wb3J0UmVmZXJlbmNlTGVuZ3RoID0gaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7CisJCQlpbnQgaW5kZXhJbkltcG9ydFJlZmVyZW5jZSA9IGltcG9ydFJlZmVyZW5jZUxlbmd0aCAtIGluZGV4OyAvLyBvbmUtYmFzZWQKKwkJCWlmIChpbmRleEluSW1wb3J0UmVmZXJlbmNlID49IDApIHsKKwkJCQlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShpbXBvcnRSZWZlcmVuY2UudG9rZW5zLCAwLCBpbmRleEluSW1wb3J0UmVmZXJlbmNlKSk7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpIHsKKwkJCQkJCXJldHVybiB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CisJCQkJCQkvLyBpdCBpcyBhIHR5cGUKKwkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKWJpbmRpbmcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uKSB7CisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiA9IChDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbikgbm9kZTsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXREZWNsYXJhdGlvbi50eXBlczsKKwkJCWlmICh0eXBlcyA9PSBudWxsIHx8IHR5cGVzLmxlbmd0aCA9PSAwKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB0eXBlc1swXTsKKwkJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHR5cGUuYmluZGluZyk7CisJCQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKKwkJCWlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsKSB7CisJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHRoaXMuZ2V0TWV0aG9kQmluZGluZyhtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgbm9kZTsKKwkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOworCQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQl9CisJCX0gaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7CisJCQlTaW5nbGVOYW1lUmVmZXJlbmNlIHNpbmdsZU5hbWVSZWZlcmVuY2UgPSAoU2luZ2xlTmFtZVJlZmVyZW5jZSkgbm9kZTsKKwkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKFJlZmVyZW5jZUJpbmRpbmcpc2luZ2xlTmFtZVJlZmVyZW5jZS5iaW5kaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gdGhpcyBpcyBhIHZhcmlhYmxlIG9yIGEgZmllbGQKKwkJCQlCaW5kaW5nIGJpbmRpbmcgPSBzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmc7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQlpZiAoYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKTsJCQkJCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKgorCQkJCQkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0OQorCQkJCQkJICovCisJCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCQkJCQlQcm9ibGVtRmllbGRCaW5kaW5nIHByb2JsZW1GaWVsZEJpbmRpbmcgPSAoUHJvYmxlbUZpZWxkQmluZGluZykgYmluZGluZzsKKwkJCQkJCQlzd2l0Y2gocHJvYmxlbUZpZWxkQmluZGluZy5wcm9ibGVtSWQoKSkgeworCQkJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOiAKKwkJCQkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQgOgorCQkJCQkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluQ29uc3RydWN0b3JJbnZvY2F0aW9uIDoKKwkJCQkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgZGVjbGFyaW5nQ2xhc3MgPSBwcm9ibGVtRmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzOworCQkJCQkJCQkJRmllbGRCaW5kaW5nIGV4YWN0QmluZGluZyA9IGRlY2xhcmluZ0NsYXNzLmdldEZpZWxkKHByb2JsZW1GaWVsZEJpbmRpbmcubmFtZSk7CisJCQkJCQkJCQlpZiAoZXhhY3RCaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZzIgPSAoSVZhcmlhYmxlQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQoZXhhY3RCaW5kaW5nKTsKKwkJCQkJCQkJCQlpZiAodmFyaWFibGVCaW5kaW5nMiAhPSBudWxsKSB7CisJCQkJCQkJCQkJCXJldHVybiB2YXJpYWJsZUJpbmRpbmcyOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl2YXJpYWJsZUJpbmRpbmcyID0gbmV3IFZhcmlhYmxlQmluZGluZyh0aGlzLCBleGFjdEJpbmRpbmcpOworCQkJCQkJCQkJCXRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KGV4YWN0QmluZGluZywgdmFyaWFibGVCaW5kaW5nMik7CisJCQkJCQkJCQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzI7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkgCQkJfQkJCQkKKwkJCX0KKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UpIHsKKwkJCVF1YWxpZmllZFN1cGVyUmVmZXJlbmNlIHF1YWxpZmllZFN1cGVyUmVmZXJlbmNlID0gKFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSBub2RlOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcocXVhbGlmaWVkU3VwZXJSZWZlcmVuY2UucXVhbGlmaWNhdGlvbi5yZXNvbHZlZFR5cGUpOworCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBMb2NhbERlY2xhcmF0aW9uKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoKChMb2NhbERlY2xhcmF0aW9uKW5vZGUpLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZFJlZmVyZW5jZSkgeworCQkJcmV0dXJuIGdldFZhcmlhYmxlQmluZGluZygoKEZpZWxkUmVmZXJlbmNlKSBub2RlKS5iaW5kaW5nKTsKKwkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlVHlwZVJlZmVyZW5jZSkgeworCQkJU2luZ2xlVHlwZVJlZmVyZW5jZSBzaW5nbGVUeXBlUmVmZXJlbmNlID0gKFNpbmdsZVR5cGVSZWZlcmVuY2UpIG5vZGU7CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIGJpbmRpbmcgPSBzaW5nbGVUeXBlUmVmZXJlbmNlLnJlc29sdmVkVHlwZTsKKwkJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhiaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgbm9kZTsKKwkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZERlY2xhcmF0aW9uLmJpbmRpbmcpOworCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgeworCQkJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIG5vZGU7CisJCQlyZXR1cm4gZ2V0TWV0aG9kQmluZGluZyhtZXNzYWdlU2VuZC5iaW5kaW5nKTsKIAkJfQotCQlBU1ROb2RlIHBhcmVudCA9IG5hbWUuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiAmJiBuYW1lLmVxdWFscygoKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJlbnQpLmdldE5hbWUoKSkpIHsKLQkJCXJldHVybiB0aGlzLnJlc29sdmVNZXRob2QoKE1ldGhvZERlY2xhcmF0aW9uKXBhcmVudCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbiAmJiBuYW1lLmVxdWFscygoKFR5cGVEZWNsYXJhdGlvbikgcGFyZW50KS5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlVHlwZSgoVHlwZURlY2xhcmF0aW9uKXBhcmVudCk7Ci0JCX0KLQkJaWYgKChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uICYmIG5hbWUuZXF1YWxzKCgoTWV0aG9kSW52b2NhdGlvbikgcGFyZW50KS5nZXROYW1lKCkpKQotCQkJfHwgKHBhcmVudCBpbnN0YW5jZW9mIFN1cGVyTWV0aG9kSW52b2NhdGlvbiAmJiBuYW1lLmVxdWFscygoKFN1cGVyTWV0aG9kSW52b2NhdGlvbikgcGFyZW50KS5nZXROYW1lKCkpKSkgewotCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvck1ldGhvZEludm9jYXRpb24obmFtZSk7Ci0JCX0KLQkJaWYgKChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZEFjY2VzcyAmJiBuYW1lLmVxdWFscygoKEZpZWxkQWNjZXNzKSBwYXJlbnQpLmdldE5hbWUoKSkpCi0JCSAgIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBTdXBlckZpZWxkQWNjZXNzICYmIG5hbWUuZXF1YWxzKCgoU3VwZXJGaWVsZEFjY2VzcykgcGFyZW50KS5nZXROYW1lKCkpKSkgewotCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvckZpZWxkQWNjZXNzKG5hbWUpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYWNrYWdlRGVjbGFyYXRpb24gJiYgbmFtZS5lcXVhbHMoKChQYWNrYWdlRGVjbGFyYXRpb24pIHBhcmVudCkuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclBhY2thZ2VEZWNsYXJhdGlvbihuYW1lKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2ltcGxlVHlwZSAmJiBuYW1lLmVxdWFscygoKFNpbXBsZVR5cGUpIHBhcmVudCkuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclNpbXBsZVR5cGUobmFtZSk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRoaXNFeHByZXNzaW9uKSB7Ci0JCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yVGhpc0V4cHJlc3Npb24obmFtZSk7Ci0JCX0KLQkJaWYgKG5hbWUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yUXVhbGlmaWVkTmFtZShuYW1lKTsKLQkJfQotCQlpZiAobmFtZSBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVOYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlTmFtZShuYW1lKTsKKwkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yUGFja2FnZURlY2xhcmF0aW9uKE5hbWUgbmFtZSkgewotCQlQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gKFBhY2thZ2VEZWNsYXJhdGlvbikgbmFtZS5nZXRQYXJlbnQoKTsKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBwYWNrYWdlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0JCUxpc3QgdHlwZXMgPSB1bml0LnR5cGVzKCk7Ci0JCWlmICh0eXBlcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIHN1cGVyLnJlc29sdmVOYW1lKG5hbWUpOwotCQl9Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCXJldHVybiB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JfQogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KIAkgKi8KIAlJVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSB0eXBlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CiAJCS8vIHJldHJpZXZlIHRoZSBvbGQgYXN0IG5vZGUKLQkJaW50IGluZGV4ID0gMDsKLQkJQVNUTm9kZSBwYXJlbnRUeXBlID0gdHlwZS5nZXRQYXJlbnQoKTsKLQkJVHlwZSBhcnJheVR5cGUgPSBudWxsOwogCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodHlwZSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCWlmIChwYXJlbnRUeXBlIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbikgewotCQkJCW5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQocGFyZW50VHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIHRyeSB0byByZXRyaWV2ZSB0aGUgdHlwZSBhcyBhbiBlbGVtZW50IHR5cGUgb2YgYW4gYXJyYXkgdHlwZQotCQkJCXdoaWxlICgocGFyZW50VHlwZSBpbnN0YW5jZW9mIFR5cGUpICYmICgoVHlwZSkgcGFyZW50VHlwZSkuaXNBcnJheVR5cGUoKSkgewotCQkJCQlhcnJheVR5cGUgPSAoVHlwZSkgcGFyZW50VHlwZTsKLQkJCQkJcGFyZW50VHlwZSA9IHBhcmVudFR5cGUuZ2V0UGFyZW50KCk7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCAhPSAwKSB7Ci0JCQkJCW5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoYXJyYXlUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKwkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyBiaW5kaW5nID0gbnVsbDsKIAkJaWYgKG5vZGUgIT0gbnVsbCkgewogCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7CiAJCQkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmZXJlbmNlID0gKFR5cGVSZWZlcmVuY2UpIG5vZGU7Ci0JCQkJaWYgKHR5cGVSZWZlcmVuY2UuYmluZGluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKHR5cGVSZWZlcmVuY2UuYmluZGluZyk7Ci0JCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpdHlwZVJlZmVyZW5jZS5iaW5kaW5nOwotCQkJCQkJaWYgKGluZGV4ID09IGFycmF5QmluZGluZy5kaW1lbnNpb25zKSB7Ci0JCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0eXBlLmlzQXJyYXlUeXBlKCkpIHsKLQkJCQkJCUFycmF5VHlwZSBhcnJheSA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCQkJCQlpZiAodHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpICE9IGFycmF5LmdldERpbWVuc2lvbnMoKSkgewotCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXR5cGVSZWZlcmVuY2UuYmluZGluZzsKLQkJCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpIC0gYXJyYXkuZ2V0RGltZW5zaW9ucygpOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCQkJYXJyYXlCaW5kaW5nID0gKEFycmF5QmluZGluZykgYXJyYXlCaW5kaW5nLmVsZW1lbnRzVHlwZSh0aGlzLnNjb3BlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh0eXBlQmluZGluZy5pc0FycmF5KCkgJiYgdHlwZS5pc1NpbXBsZVR5cGUoKSkgewotCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKChBcnJheUJpbmRpbmcpdHlwZVJlZmVyZW5jZS5iaW5kaW5nKS5sZWFmQ29tcG9uZW50VHlwZSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgewotCQkJCVNpbmdsZU5hbWVSZWZlcmVuY2Ugc2luZ2xlTmFtZVJlZmVyZW5jZSA9IChTaW5nbGVOYW1lUmVmZXJlbmNlKSBub2RlOwotCQkJCWlmIChzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKHNpbmdsZU5hbWVSZWZlcmVuY2UuaXNUeXBlUmVmZXJlbmNlKCkpIHsKLQkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZygoUmVmZXJlbmNlQmluZGluZylzaW5nbGVOYW1lUmVmZXJlbmNlLmJpbmRpbmcpOwotCQkJCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXNpbmdsZU5hbWVSZWZlcmVuY2UuYmluZGluZzsKLQkJCQkJCQlpZiAoaW5kZXggPT0gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnMpIHsKLQkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLQkJCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaXQgc2hvdWxkIGJlIGEgdHlwZSByZWZlcmVuY2UKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSkgewotCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBub2RlOwotCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7Ci0JCQkJCWlmIChxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZygoUmVmZXJlbmNlQmluZGluZylxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmcpOwotCQkJCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKXF1YWxpZmllZE5hbWVSZWZlcmVuY2UuYmluZGluZzsKLQkJCQkJCQlpZiAoaW5kZXggPT0gYXJyYXlCaW5kaW5nLmRpbWVuc2lvbnMpIHsKLQkJCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLQkJCQkJCQkJCWFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGFycmF5QmluZGluZy5lbGVtZW50c1R5cGUodGhpcy5zY29wZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlCaW5kaW5nKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpdCBzaG91bGQgYmUgYSB0eXBlIHJlZmVyZW5jZQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9CisJCQkJYmluZGluZyA9IHR5cGVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlOworCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSAmJiAoKFNpbmdsZU5hbWVSZWZlcmVuY2Upbm9kZSkuaXNUeXBlUmVmZXJlbmNlKCkpIHsKKwkJCQliaW5kaW5nID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpICgoKFNpbmdsZU5hbWVSZWZlcmVuY2Upbm9kZSkuYmluZGluZyk7CisJCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlICYmICgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlub2RlKS5pc1R5cGVSZWZlcmVuY2UoKSkgeworCQkJCWJpbmRpbmcgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgKCgoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlub2RlKS5iaW5kaW5nKTsKIAkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pIHsKLQkJCQlBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uIGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24gPSAoQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbikgbm9kZTsKLQkJCQlBcnJheUJpbmRpbmcgYXJyYXlCaW5kaW5nID0gYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5hcnJheVRiOwotCQkJCWlmIChhcnJheUJpbmRpbmcgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQliaW5kaW5nID0gKChBcnJheUFsbG9jYXRpb25FeHByZXNzaW9uKSBub2RlKS5yZXNvbHZlZFR5cGU7CisJCQl9CisJCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQkJaWYgKHR5cGUuaXNBcnJheVR5cGUoKSkgeworCQkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKwkJCQkJaWYgKGJpbmRpbmcuaXNBcnJheVR5cGUoKSkgeworCQkJCQkJQXJyYXlCaW5kaW5nIGFycmF5QmluZGluZyA9IChBcnJheUJpbmRpbmcpIGJpbmRpbmc7CisJCQkJCQlyZXR1cm4gZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5jcmVhdGVBcnJheShhcnJheUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUsIGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBnZXRUeXBlQmluZGluZyh0aGlzLnNjb3BlLmNyZWF0ZUFycmF5KGJpbmRpbmcsIGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCkpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChiaW5kaW5nLmlzQXJyYXlUeXBlKCkpIHsKKwkJCQkJCUFycmF5QmluZGluZyBhcnJheUJpbmRpbmcgPSAoQXJyYXlCaW5kaW5nKSBiaW5kaW5nOworCQkJCQkJcmV0dXJuIGdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZy5sZWFmQ29tcG9uZW50VHlwZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gZ2V0VHlwZUJpbmRpbmcoYmluZGluZyk7CisJCQkJCX0KIAkJCQl9Ci0JCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5jcmVhdGVBcnJheShhcnJheUJpbmRpbmcubGVhZkNvbXBvbmVudFR5cGUsIGFycmF5QmluZGluZy5kaW1lbnNpb25zIC0gaW5kZXgpKTsKLQkJCQl9IAotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5QmluZGluZyk7CisJCQl9CisJCX0gZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeworCQkJaWYgKCgoUHJpbWl0aXZlVHlwZSkgdHlwZSkuZ2V0UHJpbWl0aXZlVHlwZUNvZGUoKSA9PSBQcmltaXRpdmVUeXBlLlZPSUQpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhCYXNlVHlwZUJpbmRpbmcuVm9pZEJpbmRpbmcpOwogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwogCX0KKwkKIAkvKgogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCiAJICovCkBAIC0zMjMsODMgKzM2MiwxNjMgQEAKIAkJfSBlbHNlIGlmICgiamF2YS5sYW5nLkNsYXNzIi5lcXVhbHMobmFtZSkpIHsvLyROT04tTkxTLTEkIAogCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ0NsYXNzKCkpOwogCSAgICB9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLnJlc29sdmVXZWxsS25vd25UeXBlKG5hbWUpOworCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9CiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShUeXBlRGVjbGFyYXRpb24gdHlwZSkgewotCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gdHlwZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJZmluYWwgT2JqZWN0IG5vZGUgPSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldCh0eXBlKTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7CisJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0eXBlRGVjbGFyYXRpb24uYmluZGluZyk7CisJCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh0eXBlQmluZGluZywgdHlwZSk7CisJCQkJU3RyaW5nIGtleSA9IHR5cGVCaW5kaW5nLmdldEtleSgpOworCQkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCQl0aGlzLmJpbmRpbmdLZXlzVG9Bc3ROb2Rlcy5wdXQoa2V5LCB0eXBlKTsJCQkJCisJCQkJfQorCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCX0KIAkJfQotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHR5cGUpOwotCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcodHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOwotCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHR5cGVCaW5kaW5nLCB0eXBlKTsKLQkJCXJldHVybiB0eXBlQmluZGluZzsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVR5cGUodHlwZSk7CisJCXJldHVybiBudWxsOwogCX0KIAkvKgogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCiAJICovCiAJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZU1ldGhvZChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IG1ldGhvZC5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJT2JqZWN0IG9sZE5vZGUgPSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChtZXRob2QpOworCQlpZiAob2xkTm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKKwkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgb2xkTm9kZTsKKwkJCWlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsKSB7CisJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHRoaXMuZ2V0TWV0aG9kQmluZGluZyhtZXRob2REZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQobWV0aG9kQmluZGluZywgbWV0aG9kKTsKKwkJCQlTdHJpbmcga2V5ID0gbWV0aG9kQmluZGluZy5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQkJdGhpcy5iaW5kaW5nS2V5c1RvQXN0Tm9kZXMucHV0KGtleSwgbWV0aG9kKTsJCQkJCisJCQkJfQorCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJfQogCQl9Ci0JCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobWV0aG9kKTsKLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSB0aGlzLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uYmluZGluZyk7Ci0JCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQobWV0aG9kQmluZGluZywgbWV0aG9kKTsKLQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgorCSAqLworCUlNZXRob2RCaW5kaW5nIHJlc29sdmVNZXRob2QoTWV0aG9kSW52b2NhdGlvbiBtZXRob2QpIHsKKwkJT2JqZWN0IG9sZE5vZGUgPSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChtZXRob2QpOworCQlpZiAob2xkTm9kZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7CisJCQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgb2xkTm9kZTsKKwkJCWlmIChtZXNzYWdlU2VuZCAhPSBudWxsKSB7CisJCQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHRoaXMuZ2V0TWV0aG9kQmluZGluZyhtZXNzYWdlU2VuZC5iaW5kaW5nKTsKKwkJCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQobWV0aG9kQmluZGluZywgbWV0aG9kKTsKKwkJCQlTdHJpbmcga2V5ID0gbWV0aG9kQmluZGluZy5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQkJdGhpcy5iaW5kaW5nS2V5c1RvQXN0Tm9kZXMucHV0KGtleSwgbWV0aG9kKTsJCQkJCisJCQkJfQorCQkJCXJldHVybiBtZXRob2RCaW5kaW5nOworCQkJfQogCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlTWV0aG9kKG1ldGhvZCk7CisJCXJldHVybiBudWxsOworCX0KKwkvKgorCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCisJICovCisJSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZU1ldGhvZChTdXBlck1ldGhvZEludm9jYXRpb24gbWV0aG9kKSB7CisJCU9iamVjdCBvbGROb2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobWV0aG9kKTsKKwkJaWYgKG9sZE5vZGUgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgeworCQkJTWVzc2FnZVNlbmQgbWVzc2FnZVNlbmQgPSAoTWVzc2FnZVNlbmQpIG9sZE5vZGU7CisJCQlpZiAobWVzc2FnZVNlbmQgIT0gbnVsbCkgeworCQkJCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSB0aGlzLmdldE1ldGhvZEJpbmRpbmcobWVzc2FnZVNlbmQuYmluZGluZyk7CisJCQkJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KG1ldGhvZEJpbmRpbmcsIG1ldGhvZCk7CisJCQkJU3RyaW5nIGtleSA9IG1ldGhvZEJpbmRpbmcuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSAhPSBudWxsKSB7CisJCQkJCXRoaXMuYmluZGluZ0tleXNUb0FzdE5vZGVzLnB1dChrZXksIG1ldGhvZCk7CQkJCQorCQkJCX0KKwkJCQlyZXR1cm4gbWV0aG9kQmluZGluZzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCUlWYXJpYWJsZUJpbmRpbmcgcmVzb2x2ZVZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IHZhcmlhYmxlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldCh2YXJpYWJsZSk7Ci0JCWlmIChhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24pIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOwotCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZyhmaWVsZERlY2xhcmF0aW9uLmJpbmRpbmcpOworCQlmaW5hbCBPYmplY3Qgbm9kZSA9IHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHZhcmlhYmxlKTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKKwkJCUFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBhYnN0cmFjdFZhcmlhYmxlRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgeworCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uOworCQkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKKwkJCQlTdHJpbmcga2V5ID0gdmFyaWFibGVCaW5kaW5nLmdldEtleSgpOworCQkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCQl0aGlzLmJpbmRpbmdLZXlzVG9Bc3ROb2Rlcy5wdXQoa2V5LCB2YXJpYWJsZSk7CQkJCQorCQkJCX0KKwkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOworCQkJfQorCQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSB0aGlzLmdldFZhcmlhYmxlQmluZGluZygoKExvY2FsRGVjbGFyYXRpb24pIGFic3RyYWN0VmFyaWFibGVEZWNsYXJhdGlvbikuYmluZGluZyk7CisJCQlpZiAodmFyaWFibGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKKwkJCVN0cmluZyBrZXkgPSB2YXJpYWJsZUJpbmRpbmcuZ2V0S2V5KCk7CisJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQl0aGlzLmJpbmRpbmdLZXlzVG9Bc3ROb2Rlcy5wdXQoa2V5LCB2YXJpYWJsZSk7CQkJCQorCQkJfQogCQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzsKIAkJfQotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKCgoTG9jYWxEZWNsYXJhdGlvbikgYWJzdHJhY3RWYXJpYWJsZURlY2xhcmF0aW9uKS5iaW5kaW5nKTsKLQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHZhcmlhYmxlQmluZGluZywgdmFyaWFibGUpOwotCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOworCQlyZXR1cm4gbnVsbDsKIAl9CiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCUlWYXJpYWJsZUJpbmRpbmcgcmVzb2x2ZVZhcmlhYmxlKEZpZWxkRGVjbGFyYXRpb24gdmFyaWFibGUpIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IHZhcmlhYmxlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKLQkJCXJldHVybiBudWxsOworCQlmaW5hbCBPYmplY3Qgbm9kZSA9IHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KHZhcmlhYmxlKTsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgbm9kZTsKKwkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKTsKKwkJCWlmICh2YXJpYWJsZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJdGhpcy5iaW5kaW5nc1RvQXN0Tm9kZXMucHV0KHZhcmlhYmxlQmluZGluZywgdmFyaWFibGUpOworCQkJU3RyaW5nIGtleSA9IHZhcmlhYmxlQmluZGluZy5nZXRLZXkoKTsKKwkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCXRoaXMuYmluZGluZ0tleXNUb0FzdE5vZGVzLnB1dChrZXksIHZhcmlhYmxlKTsJCQkJCisJCQl9CisJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nOwogCQl9Ci0JCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodmFyaWFibGUpOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKGZpZWxkRGVjbGFyYXRpb24uYmluZGluZyk7Ci0JCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIHZhcmlhYmxlKTsKLQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZzsKKwkJcmV0dXJuIG51bGw7CiAJfQogCS8qCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEJpbmRpbmdSZXNvbHZlci4KIAkgKi8KIAlJVHlwZUJpbmRpbmcgcmVzb2x2ZUV4cHJlc3Npb25UeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gZXhwcmVzc2lvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQogCQlpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VDcmVhdGlvbikgewogCQkJQXN0Tm9kZSBhc3ROb2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwogCQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgewogCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgYXN0Tm9kZTsKIAkJCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKIAkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyh0eXBlRGVjbGFyYXRpb24uYmluZGluZyk7Ci0JCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dCh0eXBlQmluZGluZywgZXhwcmVzc2lvbik7CisJCQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQogCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTQyNiwxMiArNTQ1LDEyIEBACiAJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlJbml0aWFsaXplciBvbGRBc3QgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BcnJheUluaXRpYWxpemVyKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKIAkJCWlmIChvbGRBc3QgPT0gbnVsbCB8fCBvbGRBc3QuYmluZGluZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlc29sdmVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uKTsKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKG9sZEFzdC5iaW5kaW5nKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbikgewogCQkJQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbiBhcnJheUFsbG9jYXRpb25FeHByZXNzaW9uID0gKEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbi5hcnJheVRiKTsKKwkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzaWdubWVudCkgewogCQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpIGV4cHJlc3Npb247CiAJCQlyZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblR5cGUoYXNzaWdubWVudC5nZXRMZWZ0SGFuZFNpZGUoKSk7CkBAIC00NDMsMTUgKzU2Miw5IEBACiAJCQlyZXR1cm4gdGhpcy5yZXNvbHZlRXhwcmVzc2lvblR5cGUocHJlRml4RXhwcmVzc2lvbi5nZXRPcGVyYW5kKCkpOwogCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbikgewogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5DYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNhc3RFeHByZXNzaW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKLQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKGNhc3RFeHByZXNzaW9uLmNhc3RUYik7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhjYXN0RXhwcmVzc2lvbi5yZXNvbHZlZFR5cGUpOwogCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN0cmluZ0xpdGVyYWwpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gdGhpcy5yZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKGV4cHJlc3Npb24pOwotCQkJaWYgKGJsb2NrU2NvcGUgPT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdTdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHN0cmluZ0xpdGVyYWwubGl0ZXJhbFR5cGUoYmxvY2tTY29wZSkpOwotCQkJfQorCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpcy5zY29wZS5nZXRKYXZhTGFuZ1N0cmluZygpKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVHlwZUxpdGVyYWwpIHsKIAkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHRoaXMuc2NvcGUuZ2V0SmF2YUxhbmdDbGFzcygpKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQm9vbGVhbkxpdGVyYWwpIHsKQEAgLTQ3NCwxMCArNTg3LDEwIEBACiAJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhsaXRlcmFsLmxpdGVyYWxUeXBlKG51bGwpKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSW5maXhFeHByZXNzaW9uKSB7CiAJCQlPcGVyYXRvckV4cHJlc3Npb24gb3BlcmF0b3JFeHByZXNzaW9uID0gKE9wZXJhdG9yRXhwcmVzc2lvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhvcGVyYXRvckV4cHJlc3Npb24udHlwZUJpbmRpbmcpOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcob3BlcmF0b3JFeHByZXNzaW9uLnJlc29sdmVkVHlwZSk7CiAJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEluc3RhbmNlb2ZFeHByZXNzaW9uKSB7CiAJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lkluc3RhbmNlT2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5zdGFuY2VPZkV4cHJlc3Npb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoaW5zdGFuY2VPZkV4cHJlc3Npb24udHlwZUJpbmRpbmcpOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoaW5zdGFuY2VPZkV4cHJlc3Npb24ucmVzb2x2ZWRUeXBlKTsKIAkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgRmllbGRBY2Nlc3MpIHsKIAkJCUZpZWxkUmVmZXJlbmNlIGZpZWxkUmVmZXJlbmNlID0gKEZpZWxkUmVmZXJlbmNlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChleHByZXNzaW9uKTsKIAkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGRSZWZlcmVuY2UuYmluZGluZyk7CkBAIC00OTYsMTUgKzYwOSwxNiBAQAogCQkJfQogCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUFjY2VzcykgewogCQkJQXJyYXlSZWZlcmVuY2UgYXJyYXlSZWZlcmVuY2UgPSAoQXJyYXlSZWZlcmVuY2UpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXJyYXlSZWZlcmVuY2UuYXJyYXlFbGVtZW50QmluZGluZyk7CisJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhhcnJheVJlZmVyZW5jZS5yZXNvbHZlZFR5cGUpOwogCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBUaGlzRXhwcmVzc2lvbikgewogCQkJVGhpc1JlZmVyZW5jZSB0aGlzUmVmZXJlbmNlID0gKFRoaXNSZWZlcmVuY2UpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwotCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gdGhpcy5yZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKGV4cHJlc3Npb24pOworCQkJQmxvY2tTY29wZSBibG9ja1Njb3BlID0gKEJsb2NrU2NvcGUpIHRoaXMuYXN0Tm9kZXNUb0Jsb2NrU2NvcGUuZ2V0KGV4cHJlc3Npb24pOwogCQkJaWYgKGJsb2NrU2NvcGUgPT0gbnVsbCkgewogCQkJCXJldHVybiBudWxsOwogCQkJfQogCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcodGhpc1JlZmVyZW5jZS5yZXNvbHZlVHlwZShibG9ja1Njb3BlKSk7Ci0JCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pIHsKKwkJfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbgorCQkJCXx8IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdXBlck1ldGhvZEludm9jYXRpb24pIHsKIAkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSAgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CiAJCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gdGhpcy5nZXRNZXRob2RCaW5kaW5nKG1lc3NhZ2VTZW5kLmJpbmRpbmcpOwogCQkJaWYgKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgewpAQCAtNTE3LDU4ICs2MzEsNzUgQEAKIAkJCXJldHVybiB0aGlzLnJlc29sdmVFeHByZXNzaW9uVHlwZShwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkpOwogCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhjb25kaXRpb25hbEV4cHJlc3Npb24udHlwZUJpbmRpbmcpOworCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoY29uZGl0aW9uYWxFeHByZXNzaW9uLnJlc29sdmVkVHlwZSk7CisJCX0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSB7CisJCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKwkJCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmdldFR5cGUoKTsKKwkJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdHlwZS5yZXNvbHZlQmluZGluZygpOworCQkJfQogCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbik7CisJCXJldHVybiBudWxsOwogCX0KIAogCS8qCiAJICogQHNlZSBCaW5kaW5nUmVzb2x2ZXIjcmVzb2x2ZUltcG9ydChJbXBvcnREZWNsYXJhdGlvbikKIAkgKi8KIAlJQmluZGluZyByZXNvbHZlSW1wb3J0KEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmNoZWNrTW9kaWZpY2F0aW9uQ291bnQgJiYgdGhpcy5tb2RpZmljYXRpb25Db3VudCAhPSBpbXBvcnREZWNsYXJhdGlvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQogCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoaW1wb3J0RGVjbGFyYXRpb24pOwogCQlpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgewogCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIG5vZGU7CiAJCQlpZiAoaW1wb3J0UmVmZXJlbmNlLm9uRGVtYW5kKSB7CiAJCQkJQmluZGluZyBiaW5kaW5nID0gdGhpcy5zY29wZS5nZXRUeXBlT3JQYWNrYWdlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoaW1wb3J0UmVmZXJlbmNlLnRva2VucywgMCwgaW1wb3J0UmVmZXJlbmNlLnRva2Vucy5sZW5ndGgpKTsKLQkJCQlpZiAoKGJpbmRpbmcgIT0gbnVsbCkgJiYgKGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkpIHsKLQkJCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgYmluZGluZyk7Ci0JCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dChwYWNrYWdlQmluZGluZywgaW1wb3J0RGVjbGFyYXRpb24pOwotCQkJCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQlpZiAoYmluZGluZy5iaW5kaW5nVHlwZSgpID09IEJpbmRpbmcuUEFDS0FHRSkgeworCQkJCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgYmluZGluZyk7CisJCQkJCQlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIHBhY2thZ2VCaW5kaW5nOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gaWYgaXQgaXMgbm90IGEgcGFja2FnZSwgaXQgaGFzIHRvIGJlIGEgdHlwZQorCQkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZykgYmluZGluZyk7CisJCQkJCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCQkJCXJldHVybiBudWxsOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoaW1wb3J0UmVmZXJlbmNlLnRva2Vucyk7Ci0JCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CiAJCQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpIGJpbmRpbmcpOwotCQkJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQodHlwZUJpbmRpbmcsIGltcG9ydERlY2xhcmF0aW9uKTsKLQkJCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJCQlyZXR1cm4gdHlwZUJpbmRpbmcgPT0gbnVsbCA/IG51bGwgOiB0eXBlQmluZGluZzsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJcmV0dXJuIHN1cGVyLnJlc29sdmVJbXBvcnQoaW1wb3J0RGVjbGFyYXRpb24pOworCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKgogCSAqIEBzZWUgQmluZGluZ1Jlc29sdmVyI3Jlc29sdmVQYWNrYWdlKFBhY2thZ2VEZWNsYXJhdGlvbikKIAkgKi8KIAlJUGFja2FnZUJpbmRpbmcgcmVzb2x2ZVBhY2thZ2UoUGFja2FnZURlY2xhcmF0aW9uIHBrZykgewotCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gcGtnLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CiAJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChwa2cpOwogCQlpZiAobm9kZSBpbnN0YW5jZW9mIEltcG9ydFJlZmVyZW5jZSkgewogCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZmVyZW5jZSA9IChJbXBvcnRSZWZlcmVuY2UpIG5vZGU7CiAJCQlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShpbXBvcnRSZWZlcmVuY2UudG9rZW5zLCAwLCBpbXBvcnRSZWZlcmVuY2UudG9rZW5zLmxlbmd0aCkpOwogCQkJaWYgKChiaW5kaW5nICE9IG51bGwpICYmIChiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpKSB7CiAJCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZykgYmluZGluZyk7CisJCQkJaWYgKHBhY2thZ2VCaW5kaW5nID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQogCQkJCXRoaXMuYmluZGluZ3NUb0FzdE5vZGVzLnB1dChwYWNrYWdlQmluZGluZywgcGtnKTsKKwkJCQlTdHJpbmcga2V5ID0gcGFja2FnZUJpbmRpbmcuZ2V0S2V5KCk7CisJCQkJaWYgKGtleSAhPSBudWxsKSB7CisJCQkJCXRoaXMuYmluZGluZ0tleXNUb0FzdE5vZGVzLnB1dChrZXksIHBrZyk7CQkJCQorCQkJCX0KIAkJCQlyZXR1cm4gcGFja2FnZUJpbmRpbmc7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIHN1cGVyLnJlc29sdmVQYWNrYWdlKHBrZyk7CisJCXJldHVybiBudWxsOwogCX0KIAogCS8qCkBAIC01ODAsNiArNzExLDE0IEBACiAJCX0KIAkJcmV0dXJuIChBU1ROb2RlKSB0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5nZXQoYmluZGluZyk7CiAJfQorCQorCUFTVE5vZGUgZmluZERlY2xhcmluZ05vZGUoU3RyaW5nIGJpbmRpbmdLZXkpIHsKKwkJaWYgKGJpbmRpbmdLZXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChBU1ROb2RlKSB0aGlzLmJpbmRpbmdLZXlzVG9Bc3ROb2Rlcy5nZXQoYmluZGluZ0tleSk7CisJfQorCQkKIAkvKgogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCiAJICovCkBAIC02MDEsMTYgKzc0MCwzNiBAQAogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCiAJICovCiAJcHJvdGVjdGVkIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcpIHsKLQkJaWYgKHJlZmVyZW5jZUJpbmRpbmcgPT0gbnVsbCB8fCAhcmVmZXJlbmNlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCWlmIChyZWZlcmVuY2VCaW5kaW5nID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwotCQl9Ci0JCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHJlZmVyZW5jZUJpbmRpbmcpOwotCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCX0gZWxzZSBpZiAoIXJlZmVyZW5jZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgeworCQkJc3dpdGNoKHJlZmVyZW5jZUJpbmRpbmcucHJvYmxlbUlkKCkpIHsKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vdFZpc2libGUgOiAKKwkJCQljYXNlIFByb2JsZW1SZWFzb25zLk5vblN0YXRpY1JlZmVyZW5jZUluU3RhdGljQ29udGV4dCA6CisJCQkJCWlmIChyZWZlcmVuY2VCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCVByb2JsZW1SZWZlcmVuY2VCaW5kaW5nIHByb2JsZW1SZWZlcmVuY2VCaW5kaW5nID0gKFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSByZWZlcmVuY2VCaW5kaW5nOworCQkJCQkJQmluZGluZyBiaW5kaW5nMiA9IHByb2JsZW1SZWZlcmVuY2VCaW5kaW5nLm9yaWdpbmFsOworCQkJCQkJaWYgKGJpbmRpbmcyICE9IG51bGwgJiYgYmluZGluZzIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nKSB7CisJCQkJCQkJVHlwZUJpbmRpbmcgYmluZGluZyA9IChUeXBlQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQoYmluZGluZzIpOworCQkJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJcmV0dXJuIGJpbmRpbmc7CisJCQkJCQkJfQorCQkJCQkJCWJpbmRpbmcgPSBuZXcgVHlwZUJpbmRpbmcodGhpcywgKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpIGJpbmRpbmcyKTsKKwkJCQkJCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dChiaW5kaW5nMiwgYmluZGluZyk7CisJCQkJCQkJcmV0dXJuIGJpbmRpbmc7CisJCQkJCQl9IAorCQkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSAoVHlwZUJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHJlZmVyZW5jZUJpbmRpbmcpOworCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCXJldHVybiBiaW5kaW5nOworCQkJfQorCQkJYmluZGluZyA9IG5ldyBUeXBlQmluZGluZyh0aGlzLCByZWZlcmVuY2VCaW5kaW5nKTsKKwkJCXRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KHJlZmVyZW5jZUJpbmRpbmcsIGJpbmRpbmcpOwogCQkJcmV0dXJuIGJpbmRpbmc7CiAJCX0KLQkJYmluZGluZyA9IG5ldyBUeXBlQmluZGluZyh0aGlzLCByZWZlcmVuY2VCaW5kaW5nKTsKLQkJdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQocmVmZXJlbmNlQmluZGluZywgYmluZGluZyk7Ci0JCXJldHVybiBiaW5kaW5nOwogCX0KIAkvKgogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBCaW5kaW5nUmVzb2x2ZXIuCkBAIC02MzEsMjg5ICs3OTAsODEgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCXByb3RlY3RlZCBJVmFyaWFibGVCaW5kaW5nIGdldFZhcmlhYmxlQmluZGluZyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcpIHsKLQkJaWYgKHZhcmlhYmxlQmluZGluZyA9PSBudWxsIHx8ICF2YXJpYWJsZUJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHZhcmlhYmxlQmluZGluZyk7Ci0JCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBiaW5kaW5nOwotCQl9Ci0JCWJpbmRpbmcgPSBuZXcgVmFyaWFibGVCaW5kaW5nKHRoaXMsIHZhcmlhYmxlQmluZGluZyk7Ci0JCXRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MucHV0KHZhcmlhYmxlQmluZGluZywgYmluZGluZyk7Ci0JCXJldHVybiBiaW5kaW5nOworIAkJaWYgKHZhcmlhYmxlQmluZGluZyAhPSBudWxsKSB7CisJIAkJaWYgKHZhcmlhYmxlQmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7CisJCQkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KHZhcmlhYmxlQmluZGluZyk7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gYmluZGluZzsKKwkJCQl9CisJCQkJYmluZGluZyA9IG5ldyBWYXJpYWJsZUJpbmRpbmcodGhpcywgdmFyaWFibGVCaW5kaW5nKTsKKwkJCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dCh2YXJpYWJsZUJpbmRpbmcsIGJpbmRpbmcpOworCQkJCXJldHVybiBiaW5kaW5nOworCSAJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDQ5CisJCQkJICovCisJCQkJaWYgKHZhcmlhYmxlQmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1GaWVsZEJpbmRpbmcpIHsKKwkJCQkJUHJvYmxlbUZpZWxkQmluZGluZyBwcm9ibGVtRmllbGRCaW5kaW5nID0gKFByb2JsZW1GaWVsZEJpbmRpbmcpIHZhcmlhYmxlQmluZGluZzsKKwkJCQkJc3dpdGNoKHByb2JsZW1GaWVsZEJpbmRpbmcucHJvYmxlbUlkKCkpIHsKKwkJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm90VmlzaWJsZSA6IAorCQkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJblN0YXRpY0NvbnRleHQgOgorCQkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbiA6CisJCQkJCQkJUmVmZXJlbmNlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IHByb2JsZW1GaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3M7CisJCQkJCQkJRmllbGRCaW5kaW5nIGV4YWN0QmluZGluZyA9IGRlY2xhcmluZ0NsYXNzLmdldEZpZWxkKHByb2JsZW1GaWVsZEJpbmRpbmcubmFtZSk7CisJCQkJCQkJaWYgKGV4YWN0QmluZGluZyAhPSBudWxsKSB7CisJCQkJCQkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nMiA9IChJVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChleGFjdEJpbmRpbmcpOworCQkJCQkJCQlpZiAodmFyaWFibGVCaW5kaW5nMiAhPSBudWxsKSB7CisJCQkJCQkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nMjsKKwkJCQkJCQkJfQorCQkJCQkJCQl2YXJpYWJsZUJpbmRpbmcyID0gbmV3IFZhcmlhYmxlQmluZGluZyh0aGlzLCBleGFjdEJpbmRpbmcpOworCQkJCQkJCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dChleGFjdEJpbmRpbmcsIHZhcmlhYmxlQmluZGluZzIpOworCQkJCQkJCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nMjsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJIAkJfQorIAkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAJCiAJLyoKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQmluZGluZ1Jlc29sdmVyLgogCSAqLwogCXByb3RlY3RlZCBJTWV0aG9kQmluZGluZyBnZXRNZXRob2RCaW5kaW5nKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwgfHwgIW1ldGhvZEJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IChJTWV0aG9kQmluZGluZykgdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5nZXQobWV0aG9kQmluZGluZyk7Ci0JCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBiaW5kaW5nOwotCQl9Ci0JCWJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZyh0aGlzLCBtZXRob2RCaW5kaW5nKTsKLQkJdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQobWV0aG9kQmluZGluZywgYmluZGluZyk7Ci0JCXJldHVybiBiaW5kaW5nOwotCX0KLQotCXByaXZhdGUgQmxvY2tTY29wZSByZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKEFTVE5vZGUgbm9kZSkgewotCQlBU1ROb2RlIGN1cnJlbnROb2RlID0gbm9kZTsKLQkJd2hpbGUoY3VycmVudE5vZGUgIT0gbnVsbAotCQkJJiYhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCi0JCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpCi0JCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKLQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7Ci0JCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgY3VycmVudE5vZGU7Ci0JCQl3aGlsZSghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgewotCQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoY3VycmVudE5vZGUpOwotCQkJaWYgKChpbml0aWFsaXplci5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgewotCQkJCXJldHVybiB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKLQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBjdXJyZW50Tm9kZTsKLQkJCXdoaWxlKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pKSB7Ci0JCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChjdXJyZW50Tm9kZSk7Ci0JCQlpZiAoKGZpZWxkRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDApIHsKLQkJCQlyZXR1cm4gdHlwZURlY2wuc3RhdGljSW5pdGlhbGl6ZXJTY29wZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHR5cGVEZWNsLmluaXRpYWxpemVyU2NvcGU7Ci0JCQl9Ci0JCX0KLQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBhYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uID0gKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGN1cnJlbnROb2RlKTsKLQkJcmV0dXJuIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uc2NvcGU7Ci0JfQkKLQkKLQlwcml2YXRlIElCaW5kaW5nIGludGVybmFsUmVzb2x2ZU5hbWVGb3JRdWFsaWZpZWROYW1lKE5hbWUgbmFtZSkgewotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgbmFtZTsKLQkJQVNUTm9kZSBwYXJlbnQgPSBxdWFsaWZpZWROYW1lLmdldFBhcmVudCgpOwotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgewotCQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiByZXR1cm5CaW5kaW5nRm9yUXVhbGlmaWVkTmFtZVBhcnQocXVhbGlmaWVkTmFtZSwgaW5kZXgpOwotCX0KLQotCXByaXZhdGUgSUJpbmRpbmcgcmV0dXJuQmluZGluZ0ZvclF1YWxpZmllZE5hbWVQYXJ0KEFTVE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJLy8gbm93IHdlIGNhbiByZXRyaWV2ZSB0aGUgY29tcGlsZXIncyBub2RlCi0JCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChwYXJlbnQpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UpIHsKLQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcXVhbGlmaWVkTmFtZVJlZmVyZW5jZSA9IChRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSBub2RlOwotCQkJaW50IHF1YWxpZmllZE5hbWVMZW5ndGggPSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnRva2Vucy5sZW5ndGg7Ci0JCQlpbnQgaW5kZXhJblF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lTGVuZ3RoIC0gaW5kZXg7IC8vIG9uZS1iYXNlZAotCQkJaW50IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZyA9IHF1YWxpZmllZE5hbWVSZWZlcmVuY2UuaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOyAvLyBvbmUtYmFzZWQKLQkJCWludCBvdGhlckJpbmRpbmdMZW5ndGggPSBxdWFsaWZpZWROYW1lTGVuZ3RoIC0gaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nOwotCQkJaWYgKGluZGV4SW5RdWFsaWZpZWROYW1lIDwgaW5kZXhPZkZpcnN0RmllbGRCaW5kaW5nKSB7Ci0JCQkJLy8gYSBleHRyYSBsb29rdXAgaXMgcmVxdWlyZWQKLQkJCQlCbG9ja1Njb3BlIGludGVybmFsU2NvcGUgPSByZXRyaWV2ZUVuY2xvc2luZ1Njb3BlKHBhcmVudCk7Ci0JCQkJQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQkJCQlpZiAoaW50ZXJuYWxTY29wZSA9PSBudWxsKSB7Ci0JCQkJCWJpbmRpbmcgPSB0aGlzLnNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWROYW1lUmVmZXJlbmNlLnRva2VucywgMCwgaW5kZXhJblF1YWxpZmllZE5hbWUpKTsKLQkJCQl9IGVsc2UgewotCQkJCQliaW5kaW5nID0gaW50ZXJuYWxTY29wZS5nZXRUeXBlT3JQYWNrYWdlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkocXVhbGlmaWVkTmFtZVJlZmVyZW5jZS50b2tlbnMsIDAsIGluZGV4SW5RdWFsaWZpZWROYW1lKSk7CisJCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIHsKKwkJCWlmIChtZXRob2RCaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKKwkJCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gKElNZXRob2RCaW5kaW5nKSB0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLmdldChtZXRob2RCaW5kaW5nKTsKKwkJCQlpZiAoYmluZGluZyAhPSBudWxsKSB7CisJCQkJCXJldHVybiBiaW5kaW5nOwogCQkJCX0KLQkJCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmcpIHsKLQkJCQkJCXJldHVybiB0aGlzLmdldFBhY2thZ2VCaW5kaW5nKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKWJpbmRpbmcpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gaXQgaXMgYSB0eXBlCi0JCQkJCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyliaW5kaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKKwkJCQliaW5kaW5nID0gbmV3IE1ldGhvZEJpbmRpbmcodGhpcywgbWV0aG9kQmluZGluZyk7CisJCQkJdGhpcy5jb21waWxlckJpbmRpbmdzVG9BU1RCaW5kaW5ncy5wdXQobWV0aG9kQmluZGluZywgYmluZGluZyk7CisJCQkJcmV0dXJuIGJpbmRpbmc7CiAJCQl9IGVsc2UgewotCQkJCWlmIChpbmRleEluUXVhbGlmaWVkTmFtZSA9PSBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcpIHsKLQkJCQkJaWYgKHF1YWxpZmllZE5hbWVSZWZlcmVuY2UuaXNUeXBlUmVmZXJlbmNlKCkpIHsKLQkJCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKXF1YWxpZmllZE5hbWVSZWZlcmVuY2UuYmluZGluZyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlCaW5kaW5nIGJpbmRpbmcgPSBxdWFsaWZpZWROYW1lUmVmZXJlbmNlLmJpbmRpbmc7Ci0JCQkJCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuaXNWYWxpZEJpbmRpbmcoKSkgewotCQkJCQkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOwkJCQkKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJLyoKKwkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTk3CisJCQkJICovCisJCQkJc3dpdGNoKG1ldGhvZEJpbmRpbmcucHJvYmxlbUlkKCkpIHsKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob3RWaXNpYmxlIDogCisJCQkJCWNhc2UgUHJvYmxlbVJlYXNvbnMuTm9uU3RhdGljUmVmZXJlbmNlSW5TdGF0aWNDb250ZXh0IDoKKwkJCQkJY2FzZSBQcm9ibGVtUmVhc29ucy5Ob25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbiA6CisJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzczsKKwkJCQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7CisJCQkJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIGV4YWN0QmluZGluZyA9IGRlY2xhcmluZ0NsYXNzLmdldEV4YWN0TWV0aG9kKG1ldGhvZEJpbmRpbmcuc2VsZWN0b3IsIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycyk7CisJCQkJCQkJaWYgKGV4YWN0QmluZGluZyAhPSBudWxsKSB7CisJCQkJCQkJCUlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSAoSU1ldGhvZEJpbmRpbmcpIHRoaXMuY29tcGlsZXJCaW5kaW5nc1RvQVNUQmluZGluZ3MuZ2V0KGV4YWN0QmluZGluZyk7CisJCQkJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCQkJCXJldHVybiBiaW5kaW5nOworCQkJCQkJCQl9CisJCQkJCQkJCWJpbmRpbmcgPSBuZXcgTWV0aG9kQmluZGluZyh0aGlzLCBleGFjdEJpbmRpbmcpOworCQkJCQkJCQl0aGlzLmNvbXBpbGVyQmluZGluZ3NUb0FTVEJpbmRpbmdzLnB1dChleGFjdEJpbmRpbmcsIGJpbmRpbmcpOworCQkJCQkJCQlyZXR1cm4gYmluZGluZzsKKwkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5hbWUgd2hpY2ggaXMgcGFydCBvZiBhIHF1YWxpZmllZCBuYW1lIHRoYXQKLQkJCQkJICogY2Fubm90IGJlIHJlc29sdmVkLiBTZWUgUFIgMTMwNjMuCi0JCQkJCSAqLwotCQkJCQlpZiAocXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5vdGhlckJpbmRpbmdzID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVCaW5kaW5nKHF1YWxpZmllZE5hbWVSZWZlcmVuY2Uub3RoZXJCaW5kaW5nc1tvdGhlckJpbmRpbmdMZW5ndGggLSBpbmRleCAtIDFdKTsJCQkJCi0JCQkJCX0KKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSkgewotCQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxdWFsaWZpZWRUeXBlUmVmZXJlbmNlID0gKFF1YWxpZmllZFR5cGVSZWZlcmVuY2UpIG5vZGU7Ci0JCQlpZiAocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5iaW5kaW5nID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcocXVhbGlmaWVkVHlwZVJlZmVyZW5jZS5iaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgcXVhbGlmaWVkVHlwZUxlbmd0aCA9IHF1YWxpZmllZFR5cGVSZWZlcmVuY2UudG9rZW5zLmxlbmd0aDsKLQkJCQlpbnQgaW5kZXhJblF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWRUeXBlTGVuZ3RoIC0gaW5kZXg7IC8vIG9uZS1iYXNlZAotCQkJCUJsb2NrU2NvcGUgaW50ZXJuYWxTY29wZSA9IHJldHJpZXZlRW5jbG9zaW5nU2NvcGUocGFyZW50KTsKLQkJCQlCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotCQkJCWlmIChpbnRlcm5hbFNjb3BlID09IG51bGwpIHsKLQkJCQkJYmluZGluZyA9IHRoaXMuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHF1YWxpZmllZFR5cGVSZWZlcmVuY2UudG9rZW5zLCAwLCBpbmRleEluUXVhbGlmaWVkTmFtZSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJpbmRpbmcgPSBpbnRlcm5hbFNjb3BlLmdldFR5cGVPclBhY2thZ2UoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShxdWFsaWZpZWRUeXBlUmVmZXJlbmNlLnRva2VucywgMCwgaW5kZXhJblF1YWxpZmllZE5hbWUpKTsKLQkJCQl9Ci0JCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKLQkJCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5nZXRQYWNrYWdlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZyliaW5kaW5nKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGl0IGlzIGEgdHlwZQotCQkJCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpYmluZGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShOYW1lIG5hbWUpIHsKLQkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlBU1ROb2RlIHBhcmVudCA9IG5hbWUuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgewotCQkJCS8vIHJldHJpZXZlIHRoZSBxdWFsaWZpZWQgbmFtZSBhbmQgcmVtZW1iZXIgYXQgd2hpY2ggcG9zaXRpb24gaXMgdGhlIHNpbXBsZSBuYW1lCi0JCQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIHBhcmVudDsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlpZiAocXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKSA9PSBuYW1lKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCXdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKSB7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcGFyZW50OwotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCXJldHVybiByZXR1cm5CaW5kaW5nRm9yUXVhbGlmaWVkTmFtZVBhcnQocXVhbGlmaWVkTmFtZSwgaW5kZXgpOwotCQkJfQotCQl9Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgU2luZ2xlTmFtZVJlZmVyZW5jZSkgewotCQkJU2luZ2xlTmFtZVJlZmVyZW5jZSBzaW5nbGVOYW1lUmVmZXJlbmNlID0gKFNpbmdsZU5hbWVSZWZlcmVuY2UpIG5vZGU7Ci0JCQlpZiAoc2luZ2xlTmFtZVJlZmVyZW5jZS5pc1R5cGVSZWZlcmVuY2UoKSkgewotCQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKChSZWZlcmVuY2VCaW5kaW5nKXNpbmdsZU5hbWVSZWZlcmVuY2UuYmluZGluZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoaXMgaXMgYSB2YXJpYWJsZSBvciBhIGZpZWxkCi0JCQkJQmluZGluZyBiaW5kaW5nID0gc2luZ2xlTmFtZVJlZmVyZW5jZS5iaW5kaW5nOwotCQkJCWlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5pc1ZhbGlkQmluZGluZygpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5WYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcpOwkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFF1YWxpZmllZFN1cGVyUmVmZXJlbmNlKSB7Ci0JCQlRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSBxdWFsaWZpZWRTdXBlclJlZmVyZW5jZSA9IChRdWFsaWZpZWRTdXBlclJlZmVyZW5jZSkgbm9kZTsKLQkJCXJldHVybiB0aGlzLmdldFR5cGVCaW5kaW5nKHF1YWxpZmllZFN1cGVyUmVmZXJlbmNlLnF1YWxpZmljYXRpb24uYmluZGluZyk7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIExvY2FsRGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiB0aGlzLmdldFZhcmlhYmxlQmluZGluZygoKExvY2FsRGVjbGFyYXRpb24pbm9kZSkuYmluZGluZyk7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEZpZWxkUmVmZXJlbmNlKSB7Ci0JCQlyZXR1cm4gZ2V0VmFyaWFibGVCaW5kaW5nKCgoRmllbGRSZWZlcmVuY2UpIG5vZGUpLmJpbmRpbmcpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKSB7Ci0JCQlTaW5nbGVUeXBlUmVmZXJlbmNlIHNpbmdsZVR5cGVSZWZlcmVuY2UgPSAoU2luZ2xlVHlwZVJlZmVyZW5jZSkgbm9kZTsKLQkJCWlmIChzaW5nbGVUeXBlUmVmZXJlbmNlLmJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoc2luZ2xlVHlwZVJlZmVyZW5jZS5iaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCkpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb24pIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbikgbm9kZTsKLQkJCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdGhpcy5nZXRWYXJpYWJsZUJpbmRpbmcoZmllbGREZWNsYXJhdGlvbi5iaW5kaW5nKTsKLQkJCXJldHVybiB2YXJpYWJsZUJpbmRpbmc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJQmluZGluZyBpbnRlcm5hbFJlc29sdmVOYW1lRm9yTWV0aG9kSW52b2NhdGlvbihOYW1lIG5hbWUpIHsKLQkJQVNUTm9kZSBwYXJlbnQgPSBuYW1lLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbikgewotCQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIHBhcmVudDsKLQkJCWlmIChuYW1lID09IG1ldGhvZEludm9jYXRpb24uZ2V0RXhwcmVzc2lvbigpKSB7Ci0JCQkJaWYgKG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclF1YWxpZmllZE5hbWUobmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclNpbXBsZU5hbWUobmFtZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobmFtZSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBNZXNzYWdlU2VuZCkgewotCQkJCQlNZXNzYWdlU2VuZCBtZXNzYWdlU2VuZCA9IChNZXNzYWdlU2VuZCkgbm9kZTsKLQkJCQkJcmV0dXJuIGdldE1ldGhvZEJpbmRpbmcobWVzc2FnZVNlbmQuYmluZGluZyk7Ci0JCQkJfSBlbHNlIGlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JRdWFsaWZpZWROYW1lKG5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmludGVybmFsUmVzb2x2ZU5hbWVGb3JTaW1wbGVOYW1lKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSAoU3VwZXJNZXRob2RJbnZvY2F0aW9uKSBwYXJlbnQ7Ci0JCQlpZiAobmFtZSA9PSBzdXBlck1ldGhvZEludm9jYXRpb24uZ2V0UXVhbGlmaWVyKCkpIHsKLQkJCQlpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSkgewotCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yUXVhbGlmaWVkTmFtZShuYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShuYW1lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChuYW1lKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIE1lc3NhZ2VTZW5kKSB7Ci0JCQkJCU1lc3NhZ2VTZW5kIG1lc3NhZ2VTZW5kID0gKE1lc3NhZ2VTZW5kKSBub2RlOwotCQkJCQlyZXR1cm4gZ2V0TWV0aG9kQmluZGluZyhtZXNzYWdlU2VuZC5iaW5kaW5nKTsKLQkJCQl9IGVsc2UgaWYgKG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclF1YWxpZmllZE5hbWUobmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclNpbXBsZU5hbWUobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlTmFtZUZvckZpZWxkQWNjZXNzKE5hbWUgbmFtZSkgewotCQlpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSkgewotCQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxSZXNvbHZlTmFtZUZvclF1YWxpZmllZE5hbWUobmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFJlc29sdmVOYW1lRm9yU2ltcGxlTmFtZShuYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlTmFtZUZvclNpbXBsZVR5cGUoTmFtZSBuYW1lKSB7Ci0JCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldChuYW1lKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nIGJpbmRpbmcgPSAoKFR5cGVSZWZlcmVuY2UpIG5vZGUpLmJpbmRpbmc7Ci0JCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlQmluZGluZyhiaW5kaW5nLmxlYWZDb21wb25lbnRUeXBlKCkpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lUmVmZXJlbmNlKSB7Ci0JCQlOYW1lUmVmZXJlbmNlIG5hbWVSZWZlcmVuY2UgPSAoTmFtZVJlZmVyZW5jZSkgbm9kZTsKLQkJCWlmIChuYW1lUmVmZXJlbmNlLmlzVHlwZVJlZmVyZW5jZSgpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcpIG5hbWVSZWZlcmVuY2UuYmluZGluZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQotCXByaXZhdGUgSUJpbmRpbmcgaW50ZXJuYWxSZXNvbHZlTmFtZUZvclRoaXNFeHByZXNzaW9uKE5hbWUgbmFtZSkgewotCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQobmFtZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZUJpbmRpbmcoKChUeXBlUmVmZXJlbmNlKSBub2RlKS5iaW5kaW5nKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC05MjIsOSArODczLDYgQEAKIAkgKiBAc2VlIEJpbmRpbmdSZXNvbHZlciNyZXNvbHZlQ29uc3RydWN0b3IoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQogCSAqLwogCUlNZXRob2RCaW5kaW5nIHJlc29sdmVDb25zdHJ1Y3RvcihDbGFzc0luc3RhbmNlQ3JlYXRpb24gZXhwcmVzc2lvbikgewotCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gZXhwcmVzc2lvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQogCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CiAJCWlmIChub2RlIGluc3RhbmNlb2YgQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pIHsKIAkJCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uID0gKEFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKSBub2RlOwpAQCAtOTM5LDkgKzg4Nyw2IEBACiAJICogQHNlZSBCaW5kaW5nUmVzb2x2ZXIjcmVzb2x2ZUNvbnN0cnVjdG9yKENvbnN0cnVjdG9ySW52b2NhdGlvbikKIAkgKi8KIAlJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3IoQ29uc3RydWN0b3JJbnZvY2F0aW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IGV4cHJlc3Npb24uZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KIAkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHRoaXMubmV3QXN0VG9PbGRBc3QuZ2V0KGV4cHJlc3Npb24pOwogCQlpZiAobm9kZSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSB7CiAJCQlFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBleHBsaWNpdENvbnN0cnVjdG9yQ2FsbCA9IChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgbm9kZTsKQEAgLTk1NCw5ICs4OTksNiBAQAogCSAqIEBzZWUgQmluZGluZ1Jlc29sdmVyI3Jlc29sdmVDb25zdHJ1Y3RvcihTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikKIAkgKi8KIAlJTWV0aG9kQmluZGluZyByZXNvbHZlQ29uc3RydWN0b3IoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gZXhwcmVzc2lvbikgewotCQlpZiAodGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ICYmIHRoaXMubW9kaWZpY2F0aW9uQ291bnQgIT0gZXhwcmVzc2lvbi5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQogCQlBc3ROb2RlIG5vZGUgPSAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoZXhwcmVzc2lvbik7CiAJCWlmIChub2RlIGluc3RhbmNlb2YgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwpIHsKIAkJCUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsIGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKSBub2RlOwpAQCAtOTY4LDI1ICs5MTAsMzMgQEAKIAkgKiBAc2VlIEJpbmRpbmdSZXNvbHZlciNyZXNvbHZlVHlwZShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQogCSAqLwogCUlUeXBlQmluZGluZyByZXNvbHZlVHlwZShBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIHR5cGUpIHsKLQkJaWYgKHRoaXMuY2hlY2tNb2RpZmljYXRpb25Db3VudCAmJiB0aGlzLm1vZGlmaWNhdGlvbkNvdW50ICE9IHR5cGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSkgewotCQkJcmV0dXJuIG51bGw7CisJCWZpbmFsIE9iamVjdCBub2RlID0gdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQodHlwZSk7CisJCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgeworCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKSBub2RlOworCQkJaWYgKGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKKwkJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uLmJpbmRpbmcpOworCQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQodHlwZUJpbmRpbmcsIHR5cGUpOworCQkJCVN0cmluZyBrZXkgPSB0eXBlQmluZGluZy5nZXRLZXkoKTsKKwkJCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCQkJdGhpcy5iaW5kaW5nS2V5c1RvQXN0Tm9kZXMucHV0KGtleSwgdHlwZSk7CQkJCQorCQkJCX0KKwkJCQlyZXR1cm4gdHlwZUJpbmRpbmc7CisJCQl9CiAJCX0KLQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiBhbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uKSB0aGlzLm5ld0FzdFRvT2xkQXN0LmdldCh0eXBlKTsKLQkJaWYgKGFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcoYW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24uYmluZGluZyk7Ci0JCQl0aGlzLmJpbmRpbmdzVG9Bc3ROb2Rlcy5wdXQodHlwZUJpbmRpbmcsIHR5cGUpOwotCQkJcmV0dXJuIHR5cGVCaW5kaW5nOwotCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlVHlwZSh0eXBlKTsKKwkJcmV0dXJuIG51bGw7CiAJfQogCisJQXN0Tm9kZSBnZXRDb3JyZXNwb25kaW5nTm9kZShBU1ROb2RlIGN1cnJlbnROb2RlKSB7CisJCXJldHVybiAoQXN0Tm9kZSkgdGhpcy5uZXdBc3RUb09sZEFzdC5nZXQoY3VycmVudE5vZGUpOworCX0gCiAJLyoqCi0JICogU3RvcmUgdGhlIG51bWJlciBvZiBtb2RpZmljYXRpb25zIGRvbmUgdXNpbmcgdGhlIGFzdC4gVGhpcyBpcyB1c2VkIHRvIHZhbGlkYXRlCi0JICogcmVzb2x2ZUJpbmRpbmcgbWV0aG9kcy4gSWYgdGhlIG51bWJlciBjaGFuZ2VkLCBhbGwgcmVzb2x2ZSBiaW5kaW5ncyBtZXRob2RzCi0JICogc2ltcGx5IHJldHVybiBudWxsLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJpbmRpbmdSZXNvbHZlciNyZWNvcmRTY29wZShBU1ROb2RlLCBCbG9ja1Njb3BlKQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlTW9kaWZpY2F0aW9uQ291bnQobG9uZyBtb2RpZmljYXRpb25Db3VudCkgewotCQlzdXBlci5zdG9yZU1vZGlmaWNhdGlvbkNvdW50KG1vZGlmaWNhdGlvbkNvdW50KTsKLQkJdGhpcy5jaGVja01vZGlmaWNhdGlvbkNvdW50ID0gdHJ1ZTsKKwl2b2lkIHJlY29yZFNjb3BlKEFTVE5vZGUgYXN0Tm9kZSwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7CisJCXRoaXMuYXN0Tm9kZXNUb0Jsb2NrU2NvcGUucHV0KGFzdE5vZGUsIGJsb2NrU2NvcGUpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRG9TdGF0ZW1lbnQuamF2YQppbmRleCBkYzYxZjAwLi42OTAzYTBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0RvU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Eb1N0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTYwLDcgKzYwLDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJRG9TdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IERvU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEJvZHkoKFN0YXRlbWVudCkgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtODEsOCArODIsOCBAQAogCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQlpZiAodmlzaXRDaGlsZHJlbikgewogCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0RXhwcmVzc2lvbigpKTsKIAkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEJvZHkoKSk7CisJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwogCQl9CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQpAQCAtOTUsNyArOTYsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KQEAgLTEyOCw3ICsxMzEsOSBAQAogCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKIAkJaWYgKGJvZHkgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRCb2R5KG5ldyBCbG9jayhnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBib2R5OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW1wdHlTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRW1wdHlTdGF0ZW1lbnQuamF2YQppbmRleCBjMDMxMGQxLi4zNjhmZmM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0VtcHR5U3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FbXB0eVN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTQ3LDcgKzQ3LDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJRW1wdHlTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IEVtcHR5U3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTYzLDcgKzY0LDcgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQppbmRleCAwNThhZWYxLi4yMDdhODNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0V4cHJlc3Npb25TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCmluZGV4IGYwZjM4NmQuLmUxZTA4ODQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTU4LDcgKzU4LDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJRXhwcmVzc2lvblN0YXRlbWVudCByZXN1bHQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtOTAsNyArOTEsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgTWV0aG9kSW52b2NhdGlvbihnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGRBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGRBY2Nlc3MuamF2YQppbmRleCAzMDVjZGQ3Li5iYmIxY2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZpZWxkQWNjZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZEFjY2Vzcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTE4LDYgKzE4LDM4IEBACiAgKiBGaWVsZEFjY2VzczogCiAgKiAJCUV4cHJlc3Npb24gPGI+LjwvYj4gSWRlbnRpZmllcgogICogPC9wcmU+CisgKiAKKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGtpbmRzIG9mIGV4cHJlc3Npb25zIHRoYXQgcmVzZW1ibGUgZmllbGQgYWNjZXNzCisgKiBleHByZXNzaW9uczogcXVhbGlmaWVkIG5hbWVzLCB0aGlzIGV4cHJlc3Npb25zLCBhbmQgc3VwZXIgZmllbGQgYWNjZXNzCisgKiBleHByZXNzaW9ucy4gVGhlIGZvbGxvd2luZyBndWlkZWxpbmVzIGhlbHAgd2l0aCBjb3JyZWN0IHVzYWdlOgorICogPHVsPgorICogICA8bGk+QW4gZXhwcmVzc2lvbiBsaWtlICJmb28udGhpcyIgY2FuIG9ubHkgYmUgcmVwcmVzZW50ZWQgYXMgYSB0aGlzCisgKiAgIGV4cHJlc3Npb24gKDxjb2RlPlRoaXNFeHByZXNzaW9uPC9jb2RlPikgY29udGFpbmluZyBhIHNpbXBsZSBuYW1lLgorICogICAidGhpcyIgaXMgYSBrZXl3b3JkLCBhbmQgdGhlcmVmb3JlIGludmFsaWQgYXMgYW4gaWRlbnRpZmllci48L2xpPgorICogICA8bGk+QW4gZXhwcmVzc2lvbiBsaWtlICJ0aGlzLmZvbyIgY2FuIG9ubHkgYmUgcmVwcmVzZW50ZWQgYXMgYSBmaWVsZAorICogICBhY2Nlc3MgZXhwcmVzc2lvbiAoPGNvZGU+RmllbGRBY2Nlc3M8L2NvZGU+KSBjb250YWluaW5nIGEgdGhpcyBleHByZXNzaW9uCisgKiAgIGFuZCBhIHNpbXBsZSBuYW1lLiBBZ2FpbiwgdGhpcyBpcyBiZWNhdXNlICJ0aGlzIiBpcyBhIGtleXdvcmQsIGFuZAorICogICB0aGVyZWZvcmUgaW52YWxpZCBhcyBhbiBpZGVudGlmaWVyLjwvbGk+CisgKiAgIDxsaT5BbiBleHByZXNzaW9uIHdpdGggInN1cGVyIiBjYW4gb25seSBiZSByZXByZXNlbnRlZCBhcyBhIHN1cGVyIGZpZWxkCisgKiAgIGFjY2VzcyBleHByZXNzaW9uICg8Y29kZT5TdXBlckZpZWxkQWNjZXNzPC9jb2RlPikuICJzdXBlciIgaXMgYSBhbHNvCisgKiAgIGtleXdvcmQsIGFuZCB0aGVyZWZvcmUgaW52YWxpZCBhcyBhbiBpZGVudGlmaWVyLjwvbGk+CisgKiAgIDxsaT5BbiBleHByZXNzaW9uIGxpa2UgImZvby5iYXIiIGNhbiBiZSByZXByZXNlbnRlZCBlaXRoZXIgYXMgYQorICogICBxdWFsaWZpZWQgbmFtZSAoPGNvZGU+UXVhbGlmaWVkTmFtZTwvY29kZT4pIG9yIGFzIGEgZmllbGQgYWNjZXNzCisgKiAgIGV4cHJlc3Npb24gKDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPikgY29udGFpbmluZyBzaW1wbGUgbmFtZXMuIEVpdGhlcgorICogICBpcyBhY2NlcHRhYmxlLCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGNob29zZSBiZXR3ZWVuIHRoZW0gd2l0aG91dAorICogICBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoZSBuYW1lcyByZXNvbHZlIHRvCisgKiAgICg8Y29kZT5BU1QucGFyc2VDb21waWxhdGlvblVuaXQ8L2NvZGU+IG1heSByZXR1cm4gZWl0aGVyKS48L2xpPgorICogICA8bGk+T3RoZXIgZXhwcmVzc2lvbnMgZW5kaW5nIGluIGFuIGlkZW50aWZpZXIsIHN1Y2ggYXMgImZvbygpLmJhciIgY2FuCisgKiAgIG9ubHkgYmUgcmVwcmVzZW50ZWQgYXMgZmllbGQgYWNjZXNzIGV4cHJlc3Npb25zCisgKiAgICg8Y29kZT5GaWVsZEFjY2VzczwvY29kZT4pLjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogCisgKiBAc2VlIFF1YWxpZmllZE5hbWUKKyAqIEBzZWUgVGhpc0V4cHJlc3Npb24KKyAqIEBzZWUgU3VwZXJGaWVsZEFjY2VzcworICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKIAkKQEAgLTU5LDYgKzkxLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJRmllbGRBY2Nlc3MgcmVzdWx0ID0gbmV3IEZpZWxkQWNjZXNzKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05Myw3ICsxMjYsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KQEAgLTEyNSw3ICsxNjAsMTAgQEAKIAkgKi8gCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gZmllbGROYW1lOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKaW5kZXggOGU4NmM5Yy4uZWEwNmJlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9GaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtOTEsNiArOTEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlGaWVsZERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRKYXZhZG9jKAogCQkJKEphdmFkb2MpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LChBU1ROb2RlKSBnZXRKYXZhZG9jKCkpKTsKIAkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CkBAIC0xNjgsNyArMTY5LDkgQEAKIAlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogCQlpZiAoYmFzZVR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRUeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gYmFzZVR5cGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Gb3JTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vRm9yU3RhdGVtZW50LmphdmEKaW5kZXggZjkyNDdkNC4uNmFlMTIyMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Gb3JTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ZvclN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTI0LDggKzI0LDggQEAKICAqIAkJCVsgRm9yVXBkYXRlIF0gPGI+KTwvYj4KICAqIAkJCVN0YXRlbWVudAogICogRm9ySW5pdDoKLSAqIAkJKCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbiApCi0gKiAJCQl7IDxiPiw8L2I+ICggU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb24gKSB9CisgKiAJCSggVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24KKyAqIAkJCSB8IHsgRXhwcmVzc2lvbiB7PGI+LDwvYj4gRXhwcmVzc2lvbiB9IH0KICAqIEZvclVwZGF0ZToKICAqIAkJRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb24gfQogICogPC9wcmU+CkBAIC04Miw3ICs4Miw4IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUZvclN0YXRlbWVudCByZXN1bHQgPSBuZXcgRm9yU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LmluaXRpYWxpemVycygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGluaXRpYWxpemVycygpKSk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKQEAgLTEyMCw5ICsxMjEsOCBAQAogCSAqIHN0YXRlbWVudC4KIAkgKiA8cD4KIAkgKiBUaGUgbGlzdCBzaG91bGQgY29uc2lzdCBvZiBlaXRoZXIgYSBsaXN0IG9mIHNvIGNhbGxlZCBzdGF0ZW1lbnQgCi0JICogZXhwcmVzc2lvbnMgKEpMUzIsIDE0LjgpLCBvciBhIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gZXhwcmVzc2lvbnMKLQkgKiBhbGwgd2l0aCB0aGUgc2FtZSB0eXBlLiBPdGhlcndpc2UsIHRoZSBmb3Igc3RhdGVtZW50IHdvdWxkIGhhdmUgbm8gSmF2YQotCSAqIHNvdXJjZSBlcXVpdmFsZW50LgorCSAqIGV4cHJlc3Npb25zIChKTFMyLCAxNC44KSwgb3IgYSBzaW5nbGUgPGNvZGU+VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb248L2NvZGU+LiAKKwkgKiBPdGhlcndpc2UsIHRoZSBmb3Igc3RhdGVtZW50IHdvdWxkIGhhdmUgbm8gSmF2YSBzb3VyY2UgZXF1aXZhbGVudC4KIAkgKiA8L3A+CiAJICogCiAJICogQHJldHVybiB0aGUgbGl2ZSBsaXN0IG9mIGluaXRpYWxpemVyIGV4cHJlc3Npb25zIApAQCAtMTg0LDcgKzE4NCw5IEBACiAJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgewogCQlpZiAoYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEJvZHkobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGJvZHk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JQmluZGluZy5qYXZhCmluZGV4IDk4MGE1MTkuLjE4ODA1YWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lCaW5kaW5nLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTc1LDQgKzE3NSw0IEBACiAJICogQHJldHVybiBhIGRlYnVnIHN0cmluZyAKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWV0aG9kQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JTWV0aG9kQmluZGluZy5qYXZhCmluZGV4IGYxM2E3MWIuLjk5ZTRiNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSU1ldGhvZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lNZXRob2RCaW5kaW5nLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtODEsNCArODEsNCBAQAogCSAqICAgdGhyb3duIGJ5IHRoaXMgbWV0aG9kIG9yIGNvbnN0cnVjdG9yCiAJICovCiAJcHVibGljIElUeXBlQmluZGluZ1tdIGdldEV4Y2VwdGlvblR5cGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JUGFja2FnZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVBhY2thZ2VCaW5kaW5nLmphdmEKaW5kZXggZGE1ZTBhNS4uODA2ODhlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JUGFja2FnZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lQYWNrYWdlQmluZGluZy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTcwLDQgKzcwLDQgQEAKIC8vCSAqICAgaWYgdGhlcmUgaXMgbm8gc3VjaCB0eXBlCiAvLwkgKi8KIC8vCXB1YmxpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVCaW5kaW5nKFN0cmluZyBuYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lUeXBlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVHlwZUJpbmRpbmcuamF2YQppbmRleCAwYjY1NTVlLi4xNzA4OTYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lUeXBlQmluZGluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSVR5cGVCaW5kaW5nLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTQxLDYgKzE0MSw3IEBACiAJICogCiAJICogQHJldHVybiB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIGJpbmRpbmcsIGFuCiAJICogICAgZW1wdHkgc3RyaW5nIHRoaXMgaXMgYW4gYW5vbnltb3VzIHR5cGUsIG9yICJudWxsIiBmb3IgdGhlIG51bGwgdHlwZQorCSAqIEBzZWUgI2dldFF1YWxpZmllZE5hbWUKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKIAkJCQpAQCAtMTgwLDYgKzE4MSwxMiBAQAogCSAqIHN1cGVyY2xhc3Mgb2YgdGhpcyBjbGFzcyBpcyByZXR1cm5lZC4gSWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cwogCSAqIHRoZSBjbGFzcyA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiBpcwogCSAqIHJldHVybmVkLgorCSAqIDxwPgorCSAqIExvb3BzIHRoYXQgYXNjZW5kIHRoZSBjbGFzcyBoaWVyYXJjaHkgbmVlZCBhIHN1aXRhYmxlIHRlcm1pbmF0aW9uIHRlc3QuCisJICogUmF0aGVyIHRoYW4gdGVzdCB0aGUgc3VwZXJjbGFzcyBmb3IgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIG1vcmUgCisJICogdHJhbnNwYXJlbnQgdG8gY2hlY2sgd2hldGhlciB0aGUgY2xhc3MgaXMgPGNvZGU+T2JqZWN0PC9jb2RlPiwgYnkgCisJICogY29tcGFyaW5nIHdoZXRoZXIgdGhlIGNsYXNzIGJpbmRpbmcgaXMgaWRlbnRpY2FsIHRvIAorCSAqIDxjb2RlPmFzdC5yZXNvbHZlV2VsbEtub3duVHlwZSgiamF2YS5sYW5nLk9iamVjdCIpPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+CiAJICogSWYgdGhpcyB0eXBlIGJpbmRpbmcgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UsIGFuIGFycmF5IHR5cGUsIGEKQEAgLTE4OCw2ICsxOTUsNyBAQAogCSAqCiAJICogQHJldHVybiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyB0eXBlIGJpbmRpbmcsCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzZWUgQVNUI3Jlc29sdmVXZWxsS25vd25UeXBlCiAJICovCiAJcHVibGljIElUeXBlQmluZGluZyBnZXRTdXBlcmNsYXNzKCk7CiAJCkBAIC0zNzYsNCArMzg0LDM4IEBACiAJICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0Zyb21Tb3VyY2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhpcyAKKwkgKiBiaW5kaW5nIGlmIGl0IGhhcyBvbmUuCisJICogPHVsPgorCSAqIDxsaT5Gb3IgdG9wLWxldmVsIHR5cGVzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mCisJICogdGhlIHR5cGUgcXVhbGlmaWVkIGJ5IHRoZSBwYWNrYWdlIG5hbWUgKG9yIHVucXVhbGlmaWVkIGlmIGluIGEgZGVmYXVsdAorCSAqIHBhY2thZ2UpLgorCSAqIEV4YW1wbGU6IDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4uPC9saT4KKwkgKiA8bGk+Rm9yIG1lbWJlcnMgb2YgdG9wLWxldmVsIHR5cGVzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaXMgdGhlCisJICogc2ltcGxlIG5hbWUgb2YgdGhlIHR5cGUgcXVhbGlmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKKwkgKiBlbmNsb3NpbmcgdHlwZS4KKwkgKiBFeGFtcGxlOiA8Y29kZT4iamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbS5HZXRGaWVsZCI8L2NvZGU+LjwvbGk+CisJICogPGxpPkZvciBwcmltaXRpdmUgdHlwZXMsIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyB0aGUga2V5d29yZCBmb3IKKwkgKiB0aGUgcHJpbWl0aXZlIHR5cGUuCisJICogRXhhbXBsZTogPGNvZGU+ImludCI8L2NvZGU+LjwvbGk+CisJICogPGxpPkZvciBhcnJheSB0eXBlcyB3aG9zZSBjb21wb25lbnQgdHlwZSBoYXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgCisJICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY29tcG9uZW50CisJICogdHlwZSBmb2xsb3dlZCBieSAiW10iLgorCSAqIEV4YW1wbGU6IDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nW10iPC9jb2RlPi48L2xpPgorCSAqIDxsaT5Gb3IgdGhlIG51bGwgdHlwZSwgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGlzIHRoZSBzdHJpbmcgCisJICogIm51bGwiLjwvbGk+CisJICogPGxpPkxvY2FsIHR5cGVzIChpbmNsdWRpbmcgYW5vbnltb3VzIGNsYXNzZXMpIGFuZCBtZW1iZXJzIG9mIGxvY2FsCisJICogdHlwZXMgZG8gbm90IGhhdmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gRm9yIHRoZXNlIHR5cGVzLCBhbmQgYXJyYXkKKwkgKiB0eXBlcyB0aGVyZW9mLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy48L2xpPgorCSAqIDwvdWw+CisJICogCisJICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhpcyAKKwkgKiAgICBiaW5kaW5nLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhpcyB0eXBlIGRvZXMgbm90IGhhdmUgc3VjaCBhbgorCSAqICAgIHVuYW1iaWd1b3VzIG5hbWUKKwkgKiBAc2VlICNnZXROYW1lCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JVmFyaWFibGVCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lWYXJpYWJsZUJpbmRpbmcuamF2YQppbmRleCBhNTA2OGJiLi42MTcxZGJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lWYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lWYXJpYWJsZUJpbmRpbmcuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC05MSw0ICs5MSw0IEBACiAJICogQHJldHVybiBhIHNtYWxsIG5vbi1uZWdhdGl2ZSB2YXJpYWJsZSBpZAogCSAqLwogCXB1YmxpYyBpbnQgZ2V0VmFyaWFibGVJZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSWZTdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSWZTdGF0ZW1lbnQuamF2YQppbmRleCA4YmNmMjI3Li5mZDZjNjg1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0lmU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JZlN0YXRlbWVudC5qYXZhCkBAIC0xLDI0ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIC8qKgogICogSWYgc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCi0gKgotICogUmFuZ2UgMDogZmlyc3QgY2hhcmFjdGVyIG9mICJpZiIga2V5d29yZCB0aHJvdWdoIGxhc3QgY2hhcmFjdGVyIG9mCi0gKiB0aGUgbGFzdCBzdGF0ZW1lbnQuCi0gKiBSYW5nZSAxOiBmaXJzdCBjaGFyYWN0ZXIgb2YgImVsc2UiIGtleXdvcmQgdGhyb3VnaCBsYXN0IGNoYXJhY3RlciBvZgotICogdGhlIGxhc3Qgc3RhdGVtZW50OyBpZiAiZWxzZSIga2V5d29yZCBpcyBhYnNlbnQgdGhlbiBhbiBlbXB0eSByYW5nZQotICoKICAqIDxwcmU+CiAgKiBJZlN0YXRlbWVudDoKICAqICAgIDxiPmlmPC9iPiA8Yj4oPC9iPiBFeHByZXNzaW9uIDxiPik8L2I+IFN0YXRlbWVudCBbIDxiPmVsc2U8L2I+IFN0YXRlbWVudF0KQEAgLTcyLDcgKzY2LDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJSWZTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IElmU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFRoZW5TdGF0ZW1lbnQoCiAJCQkoU3RhdGVtZW50KSBnZXRUaGVuU3RhdGVtZW50KCkuY2xvbmUodGFyZ2V0KSk7CkBAIC0xMTEsNyArMTA2LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gZXhwcmVzc2lvbjsKIAl9CkBAIC0xNDQsNyArMTQxLDkgQEAKIAlwdWJsaWMgU3RhdGVtZW50IGdldFRoZW5TdGF0ZW1lbnQoKSB7CiAJCWlmICh0aGVuU3RhdGVtZW50ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0VGhlblN0YXRlbWVudChuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdGhlblN0YXRlbWVudDsKIAl9CkBAIC0yMTksNyArMjE4LDcgQEAKIAlpbnQgdHJlZVNpemUoKSB7CiAJCXJldHVybgogCQkJbWVtU2l6ZSgpCi0JCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RWxzZVN0YXRlbWVudCgpLnRyZWVTaXplKCkpCisJCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCiAJCQkrICh0aGVuU3RhdGVtZW50ID09IG51bGwgPyAwIDogZ2V0VGhlblN0YXRlbWVudCgpLnRyZWVTaXplKCkpCiAJCQkrIChvcHRpb25hbEVsc2VTdGF0ZW1lbnQgPT0gbnVsbCA/IDAgOiBnZXRFbHNlU3RhdGVtZW50KCkudHJlZVNpemUoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCmluZGV4IDQzYzAyMzYuLmE1NjRkMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW1wb3J0RGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNjEsNiArNjEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlJbXBvcnREZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE9uRGVtYW5kKGlzT25EZW1hbmQoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05Nyw4ICs5OCwxMCBAQAogCXB1YmxpYyBOYW1lIGdldE5hbWUoKSAgewogCQlpZiAoaW1wb3J0TmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUoZ2V0QVNUKCkubmV3UXVhbGlmaWVkTmFtZSgKIAkJCQluZXcgU2ltcGxlTmFtZShnZXRBU1QoKSksIG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBpbXBvcnROYW1lOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5maXhFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luZml4RXhwcmVzc2lvbi5qYXZhCmluZGV4IDc3ZTFjMjMuLjFhNjdlYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5maXhFeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbmZpeEV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0xNywxMSArMTcsNiBAQAogCiAvKioKICAqIEluZml4IGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KLSAqCi0gKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgb2YgbGVmdCBvcGVyYW5kIGV4cHJlc3Npb24gdGhyb3VnaCBsYXN0IGNoYXJhY3RlcgotICogb2YgdGhlIGxhc3QgZXh0ZW5kZWQgb3BlcmFuZCBleHByZXNzaW9uLiBJZiB0aGVyZSBhcmUgbm8gZXh0ZW5kZWQgb3BlcmFuZHMsCi0gKiB0aGUgcmFuZ2UgZW5kcyBhZnRlciB0aGUgcmlnaHQgb3BlcmFuZCBleHByZXNzaW9uLgotICoKICAqIDxwcmU+CiAgKiBJbmZpeEV4cHJlc3Npb246CiAgKiAgICBFeHByZXNzaW9uIEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB7IEluZml4T3BlcmF0b3IgRXhwcmVzc2lvbiB9IApAQCAtMjIyLDYgKzIxNyw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUluZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgSW5maXhFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYXRvcihnZXRPcGVyYXRvcigpKTsKIAkJcmVzdWx0LnNldExlZnRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRMZWZ0T3BlcmFuZCgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0UmlnaHRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRSaWdodE9wZXJhbmQoKS5jbG9uZSh0YXJnZXQpKTsKQEAgLTI4OSw3ICsyODUsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldExlZnRPcGVyYW5kKCkgewogCQlpZiAobGVmdE9wZXJhbmQgID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0TGVmdE9wZXJhbmQobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gbGVmdE9wZXJhbmQ7CiAJfQpAQCAtMzIyLDcgKzMyMCw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gZ2V0UmlnaHRPcGVyYW5kKCkgewogCQlpZiAocmlnaHRPcGVyYW5kICA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFJpZ2h0T3BlcmFuZChuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiByaWdodE9wZXJhbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Jbml0aWFsaXplci5qYXZhCmluZGV4IGM0YmM3NGIuLjBhYzU2Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luaXRpYWxpemVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNjUsNiArNjUsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlJbml0aWFsaXplciByZXN1bHQgPSBuZXcgSW5pdGlhbGl6ZXIodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CiAJCXJlc3VsdC5zZXRKYXZhZG9jKAogCQkJKEphdmFkb2MpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LChBU1ROb2RlKSBnZXRKYXZhZG9jKCkpKTsKQEAgLTEzMSw3ICsxMzIsOSBAQAogCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgewogCQlpZiAoYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEJvZHkobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGJvZHk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9JbnN0YW5jZW9mRXhwcmVzc2lvbi5qYXZhCmluZGV4IGRkYWRiY2EuLjQ0NDQwOGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSW5zdGFuY2VvZkV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0luc3RhbmNlb2ZFeHByZXNzaW9uLmphdmEKQEAgLTEsMjIgKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAogLyoqCiAgKiBJbnN0YW5jZW9mIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KLSAqCi0gKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgb2YgbGVmdCBvcGVyYW5kIGV4cHJlc3Npb24gdGhyb3VnaCBsYXN0IGNoYXJhY3RlcgotICogb2YgdGhlIHJpZ2h0IG9wZXJhbmQgZXhwcmVzc2lvbi4KLSAqCiAgKiA8cHJlPgogICogSW5zdGFuY2VvZkV4cHJlc3Npb246CiAgKiAgICBFeHByZXNzaW9uIDxiPmluc3RhbmNlb2Y8L2I+IFR5cGUKQEAgLTYxLDYgKzU3LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJSW5zdGFuY2VvZkV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IEluc3RhbmNlb2ZFeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRMZWZ0T3BlcmFuZCgoRXhwcmVzc2lvbikgZ2V0TGVmdE9wZXJhbmQoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldFJpZ2h0T3BlcmFuZCgoVHlwZSkgZ2V0UmlnaHRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05NSw3ICs5Miw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gZ2V0TGVmdE9wZXJhbmQoKSB7CiAJCWlmIChsZWZ0T3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRMZWZ0T3BlcmFuZChuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBsZWZ0T3BlcmFuZDsKIAl9CkBAIC0xMjgsNyArMTI3LDkgQEAKIAlwdWJsaWMgVHlwZSBnZXRSaWdodE9wZXJhbmQoKSB7CiAJCWlmIChyaWdodE9wZXJhbmQgID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0UmlnaHRPcGVyYW5kKG5ldyBTaW1wbGVUeXBlKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHJpZ2h0T3BlcmFuZDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0phdmFkb2MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhCmluZGV4IDUzNDBmMzkuLmI3Mzk5NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vSmF2YWRvYy5qYXZhCkBAIC0xLDE2ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CisKIC8qKgogICogQVNUIG5vZGUgZm9yIGEgSmF2YWRvYyBjb21tZW50LgogICogCkBAIC01MSw2ICs1NSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUphdmFkb2MgcmVzdWx0ID0gbmV3IEphdmFkb2ModGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldENvbW1lbnQoZ2V0Q29tbWVudCgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02Nyw3ICs3Miw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KIApAQCAtOTMsNyArOTgsMjkgQEAKIAkJaWYgKGphdmFkb2NDb21tZW50ID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJfQotCQlpZiAoamF2YWRvY0NvbW1lbnQubGVuZ3RoKCkgPCA1IHx8ICFqYXZhZG9jQ29tbWVudC5zdGFydHNXaXRoKCIvKioiKSB8fCAhamF2YWRvY0NvbW1lbnQuZW5kc1dpdGgoIiovIikpIHsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQljaGFyW10gc291cmNlID0gamF2YWRvY0NvbW1lbnQudG9DaGFyQXJyYXkoKTsKKwkJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5nZXRBU1QoKS5zY2FubmVyOworCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CisJCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW47CisJCQlib29sZWFuIG9ubHlPbmVDb21tZW50ID0gZmFsc2U7CisJCQl3aGlsZSAoKHRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUVOVF9KQVZBRE9DIDoKKwkJCQkJCWlmIChvbmx5T25lQ29tbWVudCkgeworCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQkJCX0KKwkJCQkJCW9ubHlPbmVDb21tZW50ID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJb25seU9uZUNvbW1lbnQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIW9ubHlPbmVDb21tZW50KSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9CiAJCW1vZGlmeWluZygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9MYWJlbGVkU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQppbmRleCBkNWNhMWMwLi41MDgzYjZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL0xhYmVsZWRTdGF0ZW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC02MSw2ICs2MSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCUxhYmVsZWRTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IExhYmVsZWRTdGF0ZW1lbnQodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldExhYmVsKAogCQkJKFNpbXBsZU5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRMYWJlbCgpKSk7CiAJCXJlc3VsdC5zZXRCb2R5KApAQCAtOTcsNyArOTgsOSBAQAogCXB1YmxpYyBTaW1wbGVOYW1lIGdldExhYmVsKCkgewogCQlpZiAobGFiZWxOYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0TGFiZWwobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gbGFiZWxOYW1lOwogCX0KQEAgLTEyOCw3ICsxMzEsOSBAQAogCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKIAkJaWYgKGJvZHkgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRCb2R5KG5ldyBFbXB0eVN0YXRlbWVudChnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBib2R5OwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWVzc2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXNzYWdlLmphdmEKaW5kZXggZGNlMmQ1OC4uZGFjOWQ5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXNzYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXNzYWdlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RCaW5kaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEJpbmRpbmcuamF2YQppbmRleCBmYzY2NWM0Li42ODE0ZTY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEJpbmRpbmcuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0xNDIsNyArMTQyLDEwIEBACiAJICovCiAJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0UmV0dXJuVHlwZSgpLmdldEtleSgpKTsKKwkJSVR5cGVCaW5kaW5nIHJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKCk7CisJCWlmIChyZXR1cm5UeXBlICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQocmV0dXJuVHlwZS5nZXRLZXkoKSk7CisJCX0KIAkJaWYgKCFpc0NvbnN0cnVjdG9yKCkpIHsKIAkJCWJ1ZmZlci5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwogCQkJYnVmZmVyLmFwcGVuZCgnLycpOwpAQCAtMTYwLDUgKzE2MywxMiBAQAogCQl9CiAJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKIAl9Ci0KKwkKKwkvKiAKKwkgKiBGb3IgZGVidWdnaW5nIHB1cnBvc2Ugb25seS4KKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcudG9TdHJpbmcoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZERlY2xhcmF0aW9uLmphdmEKaW5kZXggYzUwZmI3YS4uYjc2NzY2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2REZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0yOCwyMSArMjgsOCBAQAogICogICAgWyBKYXZhZG9jIF0geyBNb2RpZmllciB9IElkZW50aWZpZXIgPGI+KDwvYj4KICAqIAkJICBbIEZvcm1hbFBhcmFtZXRlcgogICogCQkJIHsgPGI+LDwvYj4gRm9ybWFsUGFyYW1ldGVyIH0gXSA8Yj4pPC9iPgotICogICAgICAgIFs8Yj50aHJvd3M8L2I+IFR5cGVOYW1lIHsgPGI+LDwvYj4gVHlwZU5hbWUgfSBdIE1ldGhvZEJvZHkKKyAqICAgICAgICBbPGI+dGhyb3dzPC9iPiBUeXBlTmFtZSB7IDxiPiw8L2I+IFR5cGVOYW1lIH0gXSBCbG9jawogICogPC9wcmU+Ci0gKiBOb3JtYWwgZm9ybToKLSAqIDxwcmU+Ci0gKiBNZXRob2REZWNsYXJhdGlvbjoKLSAqICAgIFsgSmF2YWRvYyBdIHsgTW9kaWZpZXIgfSAoIFR5cGUgfCA8Yj52b2lkPC9iPiApIElkZW50aWZpZXIKLSAqICAgICAgICA8Yj4oPC9iPiBbIEZvcm1hbFBhcmFtdGVyIHsgPGI+LDwvYj4gRm9ybWFsUGFyYW1ldGVyIH0gXSA8Yj4pPC9iPgotICogICAgICAgIFsgPGI+dGhyb3dzPC9iPiBUeXBlTmFtZSB7IDxiPiw8L2I+IFR5cGVOYW1lIH0gXQotICogICAgICAgICggQmxvY2sgfCA8Yj47PC9iPiApCi0gKiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOgotICogICAgWyBKYXZhZG9jIF0geyBNb2RpZmllciB9IElkZW50aWZpZXIKLSAqICAgICAgICA8Yj4oPC9iPiBbIEZvcm1hbFBhcmFtZXRlciB7IDxiPiw8L2I+IEZvcm1hbFBhcmFtZXRlciB9IF0gPGI+KTwvYj4KLSAqICAgICAgICBbIDxiPnRocm93czwvYj4gVHlwZU5hbWUgeyA8Yj4sPC9iPiBUeXBlTmFtZSB9IF0KLSAqICAgICAgICBCbG9jawotICogPC9wcmU+IAogICogPHA+CiAgKiBXaGVuIGEgSmF2YWRvYyBjb21tZW50IGlzIHByZXNlbnQsIHRoZSBzb3VyY2UKICAqIHJhbmdlIGJlZ2lucyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlICIvKioiIGNvbW1lbnQgZGVsaW1pdGVyLgpAQCAtOTAsNyArNzcsNyBAQAogCSAqIERlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3QuCiAJICovCiAJcHJpdmF0ZSBBU1ROb2RlLk5vZGVMaXN0IHBhcmFtZXRlcnMgPQotCQluZXcgQVNUTm9kZS5Ob2RlTGlzdCh0cnVlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzKTs7CisJCW5ldyBBU1ROb2RlLk5vZGVMaXN0KHRydWUsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uY2xhc3MpOwogCQogCS8qKgogCSAqIFRoZSByZXR1cm4gdHlwZTsgbGF6aWx5IGluaXRpYWxpemVkOyBkZWZhdWx0cyB0byB2b2lkLiBOb3RlIHRoYXQgdGhpcyAKQEAgLTk5LDYgKzg2LDE0IEBACiAJcHJpdmF0ZSBUeXBlIHJldHVyblR5cGUgPSBudWxsOwogCQogCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgYXJyYXkgZGltZW5zaW9ucyB0aGF0IGFwcGVhciBhZnRlciB0aGUgcGFyYW1ldGVycywgcmF0aGVyCisJICogdGhhbiBhZnRlciB0aGUgcmV0dXJuIHR5cGUgaXRzZWxmOyBkZWZhdWx0cyB0byAwLgorCSAqIAorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwcml2YXRlIGludCBleHRyYUFycmF5RGltZW5zaW9ucyA9IDA7CisKKwkvKioKIAkgKiBUaGUgbGlzdCBvZiB0aHJvd24gZXhjZXB0aW9uIG5hbWVzIChlbGVtZW50IHR5cGU6IDxjb2RlPk5hbWU8L2NvZGU+KS4KIAkgKiBEZWZhdWx0cyB0byBhbiBlbXB0eSBsaXN0LgogCSAqLwpAQCAtMTE1LDggKzExMCw4IEBACiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSBtZXRob2QgZGVjbGFyYXRpb24gb3duZWQgCiAJICogYnkgdGhlIGdpdmVuIEFTVC4gQnkgZGVmYXVsdCwgdGhlIGRlY2xhcmF0aW9uIGlzIGZvciBhIG1ldGhvZCBvZiBhbgogCSAqIHVuc3BlY2lmaWVkLCBidXQgbGVnYWwsIG5hbWU7IG5vIG1vZGlmaWVyczsgbm8gamF2YWRvYzsgbm8gcGFyYW1ldGVyczsgCi0JICogdm9pZCByZXR1cm4gdHlwZTsgbm8gdGhyb3duIGV4Y2VwdGlvbnM7IGFuZCBubyBib2R5IChhcyBvcHBvc2VkIHRvIGFuCi0JICogZW1wdHkgYm9keSkuCisJICogdm9pZCByZXR1cm4gdHlwZTsgbm8gYXJyYXkgZGltZW5zaW9ucyBhZnRlciB0aGUgcGFyYW1ldGVyczsgbm8gdGhyb3duCisJICogZXhjZXB0aW9uczsgYW5kIG5vIGJvZHkgKGFzIG9wcG9zZWQgdG8gYW4gZW1wdHkgYm9keSkuCiAJICogPHA+CiAJICogTi5CLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZTsgYWxsIHN1YmNsYXNzZXMgbXVzdCBiZSAKIAkgKiBkZWNsYXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlOyBjbGllbnRzIGFyZSB1bmFibGUgdG8gZGVjbGFyZSAKQEAgLTE0MSwxMiArMTM2LDE0IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCU1ldGhvZERlY2xhcmF0aW9uIHJlc3VsdCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwoQVNUTm9kZSkgZ2V0SmF2YWRvYygpKSk7CiAJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOwogCQlyZXN1bHQuc2V0Q29uc3RydWN0b3IoaXNDb25zdHJ1Y3RvcigpKTsKIAkJcmVzdWx0LnNldFJldHVyblR5cGUoCiAJCQkoVHlwZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldFJldHVyblR5cGUoKSkpOworCQlyZXN1bHQuc2V0RXh0cmFEaW1lbnNpb25zKGdldEV4dHJhRGltZW5zaW9ucygpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnBhcmFtZXRlcnMoKS5hZGRBbGwoCiAJCQlBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIHBhcmFtZXRlcnMoKSkpOwpAQCAtMTczLDYgKzE3MCw3IEBACiAJCWlmICh2aXNpdENoaWxkcmVuKSB7CiAJCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCiAJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRKYXZhZG9jKCkpOworCQkJLy8gbi5iLiB2aXNpdCByZXR1cm4gdHlwZSBldmVuIGZvciBjb25zdHJ1Y3RvcnMKIAkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFJldHVyblR5cGUoKSk7CiAJCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXROYW1lKCkpOwogCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgcGFyYW1ldGVycyk7CkBAIC0yNDgsNyArMjQ2LDkgQEAKIAlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgewogCQlpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gbWV0aG9kTmFtZTsKIAl9CkBAIC0yOTcsMTEgKzI5NywxMyBAQAogCQogCS8qKgogCSAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZGVjbGFyZWQgaW4gdGhpcyBtZXRob2QgCi0JICogZGVjbGFyYXRpb24uIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdoZXJlIHRoZSB2b2lkIHR5cGUgCi0JICogaXMgbWVhbmluZ2Z1bC4KKwkgKiBkZWNsYXJhdGlvbiwgZXhjbHVzaXZlIG9mIGFueSBleHRyYSBhcnJheSBkaW1lbnNpb25zLiAKKwkgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIGlzIG1lYW5pbmdmdWwuCiAJICogPHA+CiAJICogTm90ZSB0aGF0IHRoaXMgY2hpbGQgaXMgbm90IHJlbGV2YW50IGZvciBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMKLQkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucykuCisJICogKGFsdGhvdWdoIGl0IGRvZXMgc3RpbGwgZmlndXJlIGluIHN1YnRyZWUgZXF1YWxpdHkgY29tcGFyaXNvbnMKKwkgKiBhbmQgdmlzaXRzKSwgYW5kIGlzIGRldm9pZCBvZiB0aGUgYmluZGluZyBpbmZvcm1hdGlvbiBvcmRpbmFyaWx5CisJICogYXZhaWxhYmxlLgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcmV0dXJuIHRoZSByZXR1cm4gdHlwZSwgcG9zc2libHkgdGhlIHZvaWQgcHJpbWl0aXZlIHR5cGUKQEAgLTMwOSwxOCArMzExLDIwIEBACiAJcHVibGljIFR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsKIAkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRSZXR1cm5UeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5WT0lEKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHJldHVyblR5cGU7CiAJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGlzIG1ldGhvZCBkZWNsYXJhdGlvbgotCSAqIHRvIHRoZSBnaXZlbiB0eXBlLiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3aGVyZSB0aGUgdm9pZCB0eXBlIGlzCi0JICogbWVhbmluZ2Z1bC4KKwkgKiB0byB0aGUgZ2l2ZW4gdHlwZSwgZXhjbHVzaXZlIG9mIGFueSBleHRyYSBhcnJheSBkaW1lbnNpb25zLiBUaGlzIGlzIG9uZQorCSAqIG9mIHRoZSBmZXcgcGxhY2VzIHdoZXJlIHRoZSB2b2lkIHR5cGUgaXMgbWVhbmluZ2Z1bC4KIAkgKiA8cD4KIAkgKiBOb3RlIHRoYXQgdGhpcyBjaGlsZCBpcyBub3QgcmVsZXZhbnQgZm9yIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucwotCSAqIChhbHRob3VnaCBpdCBkb2VzIHN0aWxsIGZpZ3VyZSBpbiBzdWJ0cmVlIGVxdWFsaXR5IGNvbXBhcmlzb25zKS4KKwkgKiAoYWx0aG91Z2ggaXQgZG9lcyBzdGlsbCBmaWd1cmUgaW4gc3VidHJlZSBlcXVhbGl0eSBjb21wYXJpc29ucyBhbmQgdmlzaXRzKS4KIAkgKiA8L3A+CiAJICogCiAJICogQHBhcmFtIHR5cGUgdGhlIG5ldyByZXR1cm4gdHlwZSwgcG9zc2libHkgdGhlIHZvaWQgcHJpbWl0aXZlIHR5cGUKQEAgLTMzOSw2ICszNDMsNTAgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUgCisJICogZXhwbGljaXRseS1zcGVjaWZpZWQgcmV0dXJuIHR5cGUuCisJICogPHA+CisJICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCBmb28oKVtdW108L2NvZGU+IGhhcyBhIHJldHVybiB0eXBlIG9mIAorCSAqIDxjb2RlPmludDwvY29kZT4gYW5kIHR3byBleHRyYSBhcnJheSBkaW1lbnNpb25zOyAKKwkgKiA8Y29kZT5pbnRbXVtdIGZvbygpPC9jb2RlPiBoYXMgYSByZXR1cm4gdHlwZSBvZiA8Y29kZT5pbnRbXVtdPC9jb2RlPgorCSAqIGFuZCB6ZXJvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMuIFRoZSB0d28gY29uc3RydWN0cyBoYXZlIGRpZmZlcmVudAorCSAqIEFTVHMsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSByZWFsbHkgc3ludGFjdGljIHZhcmlhbnRzIG9mIHRoZSBzYW1lCisJICogbWV0aG9kIGRlY2xhcmF0aW9uLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8gCisJcHVibGljIGludCBnZXRFeHRyYURpbWVuc2lvbnMoKSB7CisJCXJldHVybiBleHRyYUFycmF5RGltZW5zaW9uczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUgCisJICogZXhwbGljaXRseS1zcGVjaWZpZWQgcmV0dXJuIHR5cGUuCisJICogPHA+CisJICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCBmb28oKVtdW108L2NvZGU+IGlzIHJlbmRlcmVkIGFzIGEgcmV0dXJuCisJICogdHlwZSBvZiA8Y29kZT5pbnQ8L2NvZGU+IHdpdGggdHdvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnM7IAorCSAqIDxjb2RlPmludFtdW10gZm9vKCk8L2NvZGU+IGlzIHJlbmRlcmVkIGFzIGEgcmV0dXJuIHR5cGUgb2YgCisJICogPGNvZGU+aW50W11bXTwvY29kZT4gd2l0aCB6ZXJvIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMuIFRoZSB0d28KKwkgKiBjb25zdHJ1Y3RzIGhhdmUgZGlmZmVyZW50IEFTVHMsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSByZWFsbHkgc3ludGFjdGljCisJICogdmFyaWFudHMgb2YgdGhlIHNhbWUgbWV0aG9kIGRlY2xhcmF0aW9uLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZGltZW5zaW9ucyB0aGUgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMKKwkgKiAgICBuZWdhdGl2ZQorCSAqIEBzaW5jZSAyLjEKKwkgKi8gCisJcHVibGljIHZvaWQgc2V0RXh0cmFEaW1lbnNpb25zKGludCBkaW1lbnNpb25zKSB7CisJCWlmIChkaW1lbnNpb25zIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCW1vZGlmeWluZygpOworCQl0aGlzLmV4dHJhQXJyYXlEaW1lbnNpb25zID0gZGltZW5zaW9uczsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKIAkgKiB0aGlzIG1ldGhvZCBoYXMgPGI+bm88L2I+IGJvZHkuCiAJICogPHA+CkBAIC00MTksNyArNDY3LDcgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlpbnQgbWVtU2l6ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLm1lbVNpemUoKSArIDcgKiA0OworCQlyZXR1cm4gc3VwZXIubWVtU2l6ZSgpICsgOCAqIDQ7CiAJfQogCQogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9NZXRob2RJbnZvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEludm9jYXRpb24uamF2YQppbmRleCA1MzVjMmNkLi43MWQ2YmExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEludm9jYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01ldGhvZEludm9jYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC02Nyw2ICs2Nyw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCU1ldGhvZEludm9jYXRpb24gcmVzdWx0ID0gbmV3IE1ldGhvZEludm9jYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE5hbWUoKFNpbXBsZU5hbWUpIGdldE5hbWUoKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oCiAJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEV4cHJlc3Npb24oKSkpOwpAQCAtMTMyLDcgKzEzMyw5IEBACiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIG1ldGhvZE5hbWU7CiAJfQpAQCAtMTY3LDYgKzE3MCwyMiBAQAogCQlyZXR1cm4gYXJndW1lbnRzOwogCX0KIAorCS8qKgorCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSBiaW5kaW5nIGZvciB0aGUgbWV0aG9kIGludm9rZWQgYnkgdGhpcworCSAqIGV4cHJlc3Npb24uCisJICogPHA+CisJICogTm90ZSB0aGF0IGJpbmRpbmdzIGFyZSBnZW5lcmFsbHkgdW5hdmFpbGFibGUgdW5sZXNzIHJlcXVlc3RlZCB3aGVuIHRoZQorCSAqIEFTVCBpcyBiZWluZyBidWlsdC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJpbmRpbmcgY2Fubm90CisJICogYmUgcmVzb2x2ZWQKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIElNZXRob2RCaW5kaW5nIHJlc29sdmVNZXRob2RCaW5kaW5nKCkgeworCQlyZXR1cm4gZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkucmVzb2x2ZU1ldGhvZCh0aGlzKTsKKwl9CisKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTW9kaWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTW9kaWZpZXIuamF2YQppbmRleCBhNjg1MzMwLi43ZmUzMGE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL01vZGlmaWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Nb2RpZmllci5qYXZhCkBAIC0xLDE0ICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIC8qKgpAQCAtMzQsNiArMzMsMTAgQEAKICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29uc3RhbnRzIGFuZCBzdGF0aWMgbWV0aG9kcyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQKICAqIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkLgogICogPC9wPgorICogPHA+CisgKiBOb3RlIHRoYXQgSmF2YSBtb2RlbCBjbGFzcyA8Y29kZT5GbGFnczwvY29kZT4gcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eQorICogYXMgdGhpcyBjbGFzcywgb25seSBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L2NvZGU+IHBhY2thZ2UuCisgKiA8L3A+CiAgKiAKICAqIEBzaW5jZSAyLjAKICAqLwpAQCAtNDIsNzMgKzQ1LDczIEBACiAJLyoqCiAJICogTW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrLCB2YWx1ZSAwKSBpbmRpY2F0aW5nIG5vIG1vZGlmaWVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBOT05FID0gMHgwMDAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAweDAwMDA7CiAKIAkvKioKIAkgKiAicHVibGljIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycywgYW5kIGZpZWxkcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBQVUJMSUMgPSAweDAwMDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMHgwMDAxOwogCiAJLyoqCiAJICogInByaXZhdGUiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCiAJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgZmllbGRzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFBSSVZBVEUgPSAweDAwMDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IDB4MDAwMjsKIAogCS8qKgogCSAqICJwcm90ZWN0ZWQiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCiAJICogQXBwbGljYWJsZSB0byB0eXBlcywgbWV0aG9kcywgY29uc3RydWN0b3JzLCBhbmQgZmllbGRzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFBST1RFQ1RFRCA9IDB4MDAwNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNURUQgPSAweDAwMDQ7CiAKIAkvKioKIAkgKiAic3RhdGljIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGZpZWxkcywgYW5kIGluaXRpYWxpemVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBTVEFUSUMgPSAweDAwMDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDID0gMHgwMDA4OwogCiAJLyoqCiAJICogImZpbmFsIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgogCSAqIEFwcGxpY2FibGUgdG8gdHlwZXMsIG1ldGhvZHMsIGZpZWxkcywgYW5kIHZhcmlhYmxlcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBGSU5BTCA9IDB4MDAxMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTCA9IDB4MDAxMDsKIAogCS8qKgogCSAqICJzeW5jaHJvbml6ZWQiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCiAJICogQXBwbGljYWJsZSBvbmx5IHRvIG1ldGhvZHMuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgU1lOQ0hST05JWkVEID0gMHgwMDIwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTkNIUk9OSVpFRCA9IDB4MDAyMDsKIAogCS8qKgogCSAqICJ2b2xhdGlsZSIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KIAkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFZPTEFUSUxFID0gMHgwMDQwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTEFUSUxFID0gMHgwMDQwOwogCiAJLyoqCiAJICogInRyYW5zaWVudCIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KIAkgKiBBcHBsaWNhYmxlIG9ubHkgdG8gZmllbGRzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFRSQU5TSUVOVCA9IDB4MDA4MDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lFTlQgPSAweDAwODA7CiAKIAkvKioKIAkgKiAibmF0aXZlIiBtb2RpZmllciBjb25zdGFudCAoYml0IG1hc2spLgogCSAqIEFwcGxpY2FibGUgb25seSB0byBtZXRob2RzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IE5BVElWRSA9IDB4MDEwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVRJVkUgPSAweDAxMDA7CiAKIAkvKioKIAkgKiAiYWJzdHJhY3QiIG1vZGlmaWVyIGNvbnN0YW50IChiaXQgbWFzaykuCiAJICogQXBwbGljYWJsZSB0byB0eXBlcyBhbmQgbWV0aG9kcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBBQlNUUkFDVCA9IDB4MDQwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVCA9IDB4MDQwMDsKIAogCS8qKgogCSAqICJzdHJpY3RmcCIgbW9kaWZpZXIgY29uc3RhbnQgKGJpdCBtYXNrKS4KIAkgKiBBcHBsaWNhYmxlIHRvIHR5cGVzIGFuZCBtZXRob2RzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IFNUUklDVEZQID0gMHgwODAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklDVEZQID0gMHgwODAwOwogCiAJLyoqCiAJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFncyBpbmNsdWRlcyB0aGUgInB1YmxpYyIgbW9kaWZpZXIuCkBAIC0yNDgsNCArMjUxLDQgQEAKIAlwcml2YXRlIE1vZGlmaWVyKCkgewogCX0KIAkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05haXZlQVNURmxhdHRlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL05haXZlQVNURmxhdHRlbmVyLmphdmEKaW5kZXggMWFmMTkyYi4uNGE5MThjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYWl2ZUFTVEZsYXR0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFpdmVBU1RGbGF0dGVuZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKLSAqIEludGVybmFsIEFTVCB2aXNpdG9yIGZvciBzZXJpYWxpemluZyBhbiBBU1QgaW4gYSBxdWNpayBhbmQgZGlydHkgZmFzaGlvbi4KKyAqIEludGVybmFsIEFTVCB2aXNpdG9yIGZvciBzZXJpYWxpemluZyBhbiBBU1QgaW4gYSBxdWljayBhbmQgZGlydHkgZmFzaGlvbi4KICAqIEZvciB2YXJpb3VzIHJlYXNvbnMgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgbm90IG5lY2Vzc2FyaWx5IGxlZ2FsCiAgKiBKYXZhIGNvZGU7IGFuZCBldmVuIGlmIGl0IGlzIGxlZ2FsIEphdmEgY29kZSwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzdHJpbmcKICAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIEFTVC4gQWx0aG91Z2ggdXNlbGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgaXQncwpAQCAtNDI1LDE0ICs0MjUsMTQgQEAKIAkJCWUuYWNjZXB0KHRoaXMpOwogCQl9CiAJCWJ1ZmZlci5hcHBlbmQoIjsgIik7Ly8kTk9OLU5MUy0xJAorCQlpZiAobm9kZS5nZXRFeHByZXNzaW9uKCkgIT0gbnVsbCkgeworCQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOworCQl9CisJCWJ1ZmZlci5hcHBlbmQoIjsgIik7Ly8kTk9OLU5MUy0xJAogCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZS51cGRhdGVycygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CiAJCQlFeHByZXNzaW9uIGUgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOwogCQkJZS5hY2NlcHQodGhpcyk7CiAJCX0KLQkJYnVmZmVyLmFwcGVuZCgiOyAiKTsvLyROT04tTkxTLTEkCi0JCWlmIChub2RlLmdldEV4cHJlc3Npb24oKSAhPSBudWxsKSB7Ci0JCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCX0KIAkJYnVmZmVyLmFwcGVuZCgiKSAiKTsvLyROT04tTkxTLTEkCiAJCW5vZGUuZ2V0Qm9keSgpLmFjY2VwdCh0aGlzKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNzY1LDkgKzc2NSwxMyBAQAogCSAqIEBzZWUgQVNUVmlzaXRvciN2aXNpdChTd2l0Y2hDYXNlKQogCSAqLwogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCJjYXNlICIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCI6ICIpOy8vJE5PTi1OTFMtMSQKKwkJaWYgKG5vZGUuaXNEZWZhdWx0KCkpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoImRlZmF1bHQgOiAiKTsvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlidWZmZXIuYXBwZW5kKCJjYXNlICIpOy8vJE5PTi1OTFMtMSQKKwkJCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIjogIik7Ly8kTk9OLU5MUy0xJAorCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYW1lLmphdmEKaW5kZXggMTBlM2Y2Yi4uM2Y1ZmIxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OYW1lLmphdmEKQEAgLTEsMTYgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CisKIC8qKgogICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEFTVCBub2RlcyB0aGF0IHJlcHJlc2VudCBuYW1lcy4KICAqIFRoZXJlIGFyZSBleGFjdGx5IHR3byBraW5kcyBvZiBuYW1lOiBzaW1wbGUgb25lcyAKQEAgLTI4LDYgKzMxLDExIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZSBleHRlbmRzIEV4cHJlc3Npb24gewogCQogCS8qKgorCSAqIFRoaXMgaW5kZXggcmVwcmVuc2VudHMgdGhlIHBvc2l0aW9uIGluc2lkZSBhIHF1YWxpZmllZCBuYW1lLgorCSAqLworCWludCBpbmRleDsKKwkKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IEFTVCBub2RlIGZvciBhIG5hbWUgb3duZWQgYnkgdGhlIGdpdmVuIEFTVC4KIAkgKiA8cD4KIAkgKiBOLkIuIFRoaXMgY29uc3RydWN0b3IgaXMgcGFja2FnZS1wcml2YXRlLgpAQCAtNzQsNCArODIsNDMgQEAKIAlwdWJsaWMgZmluYWwgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKSB7CiAJCXJldHVybiBnZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5yZXNvbHZlTmFtZSh0aGlzKTsKIAl9CisKKwlCbG9ja1Njb3BlIGxvb2t1cFNjb3BlKCkgeworCQlBU1ROb2RlIGN1cnJlbnROb2RlID0gdGhpczsKKwkJd2hpbGUoY3VycmVudE5vZGUgIT0gbnVsbAorCQkJJiYhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCisJCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpCisJCQkmJiAhKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKKwkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKSB7CisJCQlJbml0aWFsaXplciBpbml0aWFsaXplciA9IChJbml0aWFsaXplcikgY3VycmVudE5vZGU7CisJCQl3aGlsZSghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgeworCQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisJCQl9CisJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbikgdGhpcy5nZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5nZXRDb3JyZXNwb25kaW5nTm9kZShjdXJyZW50Tm9kZSk7CisJCQlpZiAoKGluaXRpYWxpemVyLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKSB7CisJCQkJcmV0dXJuIHR5cGVEZWNsLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0eXBlRGVjbC5pbml0aWFsaXplclNjb3BlOworCQkJfQorCQl9IGVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIGN1cnJlbnROb2RlOworCQkJd2hpbGUoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHsKKwkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCQkJfQorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMuZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZ2V0Q29ycmVzcG9uZGluZ05vZGUoY3VycmVudE5vZGUpOworCQkJaWYgKChmaWVsZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKSB7CisJCQkJcmV0dXJuIHR5cGVEZWNsLnN0YXRpY0luaXRpYWxpemVyU2NvcGU7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0eXBlRGVjbC5pbml0aWFsaXplclNjb3BlOworCQkJfQorCQl9CisJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gYWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiA9IChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKSB0aGlzLmdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLmdldENvcnJlc3BvbmRpbmdOb2RlKGN1cnJlbnROb2RlKTsKKwkJcmV0dXJuIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uc2NvcGU7CisJfQkKKwkKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVsbExpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vTnVsbExpdGVyYWwuamF2YQppbmRleCBhNWI1NjU5Li5mYjBjMWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bGxMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdWxsTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTQwLDcgKzQwLDkgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbCh0YXJnZXQpOworCQlOdWxsTGl0ZXJhbCByZXN1bHQgPSBuZXcgTnVsbExpdGVyYWwodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKQEAgLTU1LDcgKzU3LDcgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9OdW1iZXJMaXRlcmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bWJlckxpdGVyYWwuamF2YQppbmRleCBjNzM0ZmM0Li5iZDIxNjZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bWJlckxpdGVyYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL051bWJlckxpdGVyYWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01MSw2ICs1MSw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCU51bWJlckxpdGVyYWwgcmVzdWx0ID0gbmV3IE51bWJlckxpdGVyYWwodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFRva2VuKGdldFRva2VuKCkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTY3LDcgKzY4LDcgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQogCQpAQCAtOTYsNiArOTcsOCBAQAogCQljaGFyW10gc291cmNlID0gdG9rZW4udG9DaGFyQXJyYXkoKTsKIAkJc2Nhbm5lci5zZXRTb3VyY2Uoc291cmNlKTsKIAkJc2Nhbm5lci5yZXNldFRvKDAsIHNvdXJjZS5sZW5ndGgpOworCQlzY2FubmVyLnRva2VuaXplQ29tbWVudHMgPSBmYWxzZTsKKwkJc2Nhbm5lci50b2tlbml6ZVdoaXRlU3BhY2UgPSBmYWxzZTsKIAkJdHJ5IHsKIAkJCWludCB0b2tlblR5cGUgPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJc3dpdGNoKHRva2VuVHlwZSkgewpAQCAtMTIxLDYgKzEyNCw5IEBACiAJCQl9CiAJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXNjYW5uZXIudG9rZW5pemVDb21tZW50cyA9IHRydWU7CisJCQlzY2FubmVyLnRva2VuaXplV2hpdGVTcGFjZSA9IHRydWU7CiAJCX0KIAkJbW9kaWZ5aW5nKCk7CiAJCXRoaXMudG9rZW5WYWx1ZSA9IHRva2VuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlQmluZGluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlQmluZGluZy5qYXZhCmluZGV4IDcxNTVlZTcuLmQ3NDg0MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhY2thZ2VCaW5kaW5nLmphdmEKQEAgLTEsMTcgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHBhY2thZ2UgYmluZGluZ3MuCkBAIC05NCwxOCArOTQsOSBAQAogCQlyZXR1cm4gZ2V0TmFtZSgpOwogCX0KIAkKLQlwcml2YXRlIFN0cmluZyBjb25jYXQoU3RyaW5nW10gYXJyYXksIGNoYXIgYykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJyYXkubGVuZ3RoOyBpIDwgbWF4IC0gMTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGFycmF5W2ldKS5hcHBlbmQoYyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChhcnJheVthcnJheS5sZW5ndGggLSAxXSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KIAlwcml2YXRlIHZvaWQgY29tcHV0ZU5hbWVBbmRDb21wb25lbnRzKCkgewogCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSB0aGlzLmJpbmRpbmcuY29tcG91bmROYW1lOwotCQlpZiAoY29tcG91bmROYW1lID09IFR5cGVDb25zdGFudHMuTm9DaGFyQ2hhciB8fCBjb21wb3VuZE5hbWUgPT0gbnVsbCkgeworCQlpZiAoY29tcG91bmROYW1lID09IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSIHx8IGNvbXBvdW5kTmFtZSA9PSBudWxsKSB7CiAJCQluYW1lID0gVU5OQU1FRDsKIAkJCWNvbXBvbmVudHMgPSBOT19OQU1FX0NPTVBPTkVOVFM7CiAJCX0gZWxzZSB7CkBAIC0xMjAsNSArMTExLDEzIEBACiAJCQlidWZmZXIuYXBwZW5kKGNvbXBvdW5kTmFtZVtsZW5ndGggLSAxXSk7CiAJCQluYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7CiAJCX0KLQl9CQkKKwl9CisJCisJLyogCisJICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkuCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy5iaW5kaW5nLnRvU3RyaW5nKCk7CisJfQkKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCmluZGV4IGQzM2MyN2EuLjUwYmYzYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFja2FnZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYWNrYWdlRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01Niw2ICs1Niw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVBhY2thZ2VEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtODcsNyArODgsOSBAQAogCXB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CiAJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gcGFja2FnZU5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5qYXZhCmluZGV4IGExZmI2MmYuLjI3NWU4ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNTQsNiArNTQsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGdldEV4cHJlc3Npb24oKS5jbG9uZSh0YXJnZXQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC04NSw3ICs4Niw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGV4cHJlc3Npb247CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhCmluZGV4IGRjZDM2MjAuLjNhYjIxOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUG9zdGZpeEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Bvc3RmaXhFeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTM2LDYgKzEzNiw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVBvc3RmaXhFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0T3BlcmF0b3IoZ2V0T3BlcmF0b3IoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xOTEsNyArMTkyLDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRPcGVyYW5kKCkgewogCQlpZiAob3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRPcGVyYW5kKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIG9wZXJhbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QcmVmaXhFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YQppbmRleCBlZjBjNGIyLi41Zjg4NDc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByZWZpeEV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0xNTIsNiArMTUyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJUHJlZml4RXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgUHJlZml4RXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0T3BlcmF0b3IoZ2V0T3BlcmF0b3IoKSk7CiAJCXJlc3VsdC5zZXRPcGVyYW5kKChFeHByZXNzaW9uKSBnZXRPcGVyYW5kKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0yMDgsNyArMjA5LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRPcGVyYW5kKCkgewogCQlpZiAob3BlcmFuZCAgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRPcGVyYW5kKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIG9wZXJhbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9QcmltaXRpdmVUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByaW1pdGl2ZVR5cGUuamF2YQppbmRleCBmNTdiYTg4Li5jMTAwMDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByaW1pdGl2ZVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ByaW1pdGl2ZVR5cGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0xNzYsNiArMTc2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJUHJpbWl0aXZlVHlwZSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlVHlwZSh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0UHJpbWl0aXZlVHlwZUNvZGUoZ2V0UHJpbWl0aXZlVHlwZUNvZGUoKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTkyLDcgKzE5Myw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KIAkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUXVhbGlmaWVkTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKaW5kZXggZDA0NDc3MC4uOTJhYjg1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9RdWFsaWZpZWROYW1lLmphdmEKQEAgLTEsMTYgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAorCiAvKioKICAqIEFTVCBub2RlIGZvciBhIHF1YWxpZmllZCBuYW1lLiBBIHF1YWxpZmllZCBuYW1lIGlzIGRlZmluZWQgcmVjdXJzaXZlbHkKICAqIGFzIGEgc2ltcGxlIG5hbWUgcHJlY2VkZWQgYnkgYSBuYW1lLCB3aGljaCBxdWFsaWZpZXMgaXQuIEV4cHJlc3NpbmcgaXQgdGhpcwpAQCAtMTksMTAgKzIwLDEyIEBACiAgKiBRdWFsaWZpZWROYW1lOgogICogICAgTmFtZSA8Yj4uPC9iPiBTaW1wbGVOYW1lCiAgKiA8L3ByZT4KLSAqCi0gKiBSYW5nZSAwOiBmaXJzdCBjaGFyYWN0ZXIgb2YgcXVhbGlmaWVkIG5hbWUgdGhyb3VnaCB0aGUgbGFzdCBjaGFyYWN0ZXIKLSAqIG9mIHRoZSBzaW1wbGUgbmFtZS4KLSAqCisgKiA8cD4KKyAqIFNlZSA8Y29kZT5GaWVsZEFjY2VzczwvY29kZT4gZm9yIGd1aWRlbGluZXMgb24gaGFuZGxpbmcgb3RoZXIgZXhwcmVzc2lvbnMKKyAqIHRoYXQgcmVzZW1ibGUgcXVhbGlmaWVkIG5hbWVzLgorICogPC9wPgorICogCisgKiBAc2VlIEZpZWxkQWNjZXNzCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lIGV4dGVuZHMgTmFtZSB7CkBAIC02NCw2ICs2Nyw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gbmV3IFF1YWxpZmllZE5hbWUodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldFF1YWxpZmllcigoTmFtZSkgZ2V0UXVhbGlmaWVyKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05OCw3ICsxMDIsOSBAQAogCXB1YmxpYyBOYW1lIGdldFF1YWxpZmllcigpIHsKIAkJaWYgKHF1YWxpZmllciA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFF1YWxpZmllcihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBxdWFsaWZpZXI7CiAJfQpAQCAtMTMxLDcgKzEzNyw5IEBACiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKG5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIG5hbWU7CiAJfQpAQCAtMTU4LDcgKzE2Niw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJaW50IG1lbVNpemUoKSB7Ci0JCXJldHVybiBCQVNFX05PREVfU0laRSArIDIgKiA0OworCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyAzICogNDsKIAl9CiAJCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JldHVyblN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9SZXR1cm5TdGF0ZW1lbnQuamF2YQppbmRleCAwMWQ2ZjFjLi44ZTllNWQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1JldHVyblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vUmV0dXJuU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNTAsNyArNTAsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlSZXR1cm5TdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFJldHVyblN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKaW5kZXggMTdiNTA4Mi4uM2YxZGI0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVOYW1lLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTcsOSArMTcsNiBAQAogLyoqCiAgKiBBU1Qgbm9kZSBmb3IgYSBzaW1wbGUgbmFtZS4gQSBzaW1wbGUgbmFtZSBpcyBhbiBpZGVudGlmaWVyIG90aGVyIHRoYW4KICAqIGEga2V5d29yZCwgYm9vbGVhbiBsaXRlcmFsICgidHJ1ZSIsICJmYWxzZSIpIG9yIG51bGwgbGl0ZXJhbCAoIm51bGwiKS4KLSAqIDxwPgotICogUmFuZ2UgMDogZmlyc3QgY2hhcmFjdGVyIHRocm91Z2ggbGFzdCBjaGFyYWN0ZXIgb2YgaWRlbnRpZmllci4KLSAqIDwvcD4KICAqIDxwcmU+CiAgKiBTaW1wbGVOYW1lOgogICogICAgIElkZW50aWZpZXIKQEAgLTY2LDEyICs2Myw4IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVNpbXBsZU5hbWUgcmVzdWx0ID0gbmV3IFNpbXBsZU5hbWUodGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldElkZW50aWZpZXIoZ2V0SWRlbnRpZmllcigpKTsKLQkJaW50IHN0YXJ0UG9zaXRpb24gPSBnZXRTdGFydFBvc2l0aW9uKCk7Ci0JCWludCBsZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJaWYgKHN0YXJ0UG9zaXRpb24gPj0gMCAmJiBsZW5ndGggPiAwKSB7Ci0JCQlyZXN1bHQuc2V0U291cmNlUmFuZ2Uoc3RhcnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJfQogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAkKQEAgLTg3LDcgKzgwLDcgQEAKIAkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUTm9kZS4KIAkgKi8KIAl2b2lkIGFjY2VwdDAoQVNUVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7CisJCXZpc2l0b3IudmlzaXQodGhpcyk7CiAJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CiAJfQogCkBAIC0xOTEsNyArMTg0LDcgQEAKIAlpbnQgbWVtU2l6ZSgpIHsKIAkJaW50IHNpemUgPSBCQVNFX05PREVfU0laRSArIDEgKiA0OwogCQlpZiAoaWRlbnRpZmllciAhPSBudWxsKSB7Ci0JCQlzaXplICs9IEhFQURFUlMgKyAyICogNCArIEhFQURFUlMgKyAyICogaWRlbnRpZmllci5sZW5ndGgoKTsKKwkJCXNpemUgKz0gSEVBREVSUyArIDMgKiA0ICsgSEVBREVSUyArIDIgKiBpZGVudGlmaWVyLmxlbmd0aCgpOwogCQl9CiAJCXJldHVybiBzaXplOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU2ltcGxlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVUeXBlLmphdmEKaW5kZXggOTAyODNiNy4uMTZhMTI2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW1wbGVUeXBlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNTIsNiArNTIsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlTaW1wbGVUeXBlIHJlc3VsdCA9IG5ldyBTaW1wbGVUeXBlKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChOYW1lKSAoKEFTVE5vZGUpIGdldE5hbWUoKSkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtODMsNyArODQsOSBAQAogCXB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdHlwZU5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQppbmRleCA3YThjNGM5Li4zMWQyZjdlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMSw0MyArMSwyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCiAvKioKLSAqIFZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gQVNUIG5vZGUgdHlwZS4gVW5pb24gb2YgZmllbGQgZGVjbGFyYXRpb24sCi0gKiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgYW5kIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uCisgKiBTaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb24gQVNUIG5vZGUgdHlwZS4gU2luZ2xlIHZhcmlhYmxlCisgKiBkZWNsYXJhdGlvbiBub2RlcyBhcmUgdXNlZCBpbiBhIGxpbWl0ZWQgbnVtYmVyIG9mIHBsYWNlcywgaW5jbHVkaW5nIGZvcm1hbAorICogcGFyYW1ldGVyIGxpc3RzIGFuZCBjYXRjaCBjbGF1c2VzLiBUaGV5IGFyZSBub3QgdXNlZCBmb3IgZmllbGQgZGVjbGFyYXRpb25zCisgKiBhbmQgcmVndWxhciB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgogICoKICAqIDxwcmU+Ci0gKiBGaWVsZERlY2xhcmF0aW9uOgotICogICAgeyBNb2RpZmllciB9IFR5cGUgSWRlbnRpZmllciB7IDxiPls8L2I+PGI+XTwvYj4gfSBbIDxiPj08L2I+IEV4cHJlc3Npb24gXQotICogICAgICAgIHsgPGI+LDwvYj4gSWRlbnRpZmllciB7IDxiPls8L2I+PGI+XTwvYj4gfSBbIDxiPj08L2I+IEV4cHJlc3Npb25dIH0KLSAqICAgICAgICA8Yj47PC9iPgotICogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uOgotICogICAgeyA8Yj5maW5hbDwvYj4gfSBUeXBlCi0gKiAJCUlkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0gWyA8Yj49PC9iPiBFeHByZXNzaW9uIF0KLSAqICAgICAgeyA8Yj4sPC9iPiBJZGVudGlmaWVyIHsgPGI+WzwvYj48Yj5dPC9iPiB9IFsgPGI+PTwvYj4gRXhwcmVzc2lvbl0gfQotICogICAgICA8Yj47PC9iPgotICogRm9ybWFsUGFyYW1ldGVyOgotICogICAgeyA8Yj5maW5hbDwvYj4gfSBUeXBlIElkZW50aWZpZXIgeyA8Yj5bPC9iPjxiPl08L2I+IH0KLSAqIDwvcHJlPgotICogU2ltcGxpZmllZCBub3JtYWxpemVkIGZvcm06Ci0gKiA8cHJlPgogICogU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjoKLSAqICAgIHsgTW9kaWZpZXIgfSBUeXBlIElkZW50aWZpZXIgWyA8Yj49PC9iPiBFeHByZXNzaW9uIF0KLSAqIEZpZWxkRGVjbGFyYXRpb246Ci0gKiAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIDxiPjs8L2I+Ci0gKiBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb246Ci0gKiAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIDxiPjs8L2I+Ci0gKiBGb3JtYWxQYXJhbWV0ZXI6Ci0gKiAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCisgKiAgICB7IE1vZGlmaWVyIH0gVHlwZSBJZGVudGlmaWVyIHsgPGI+WzwvYj48Yj5dPC9iPiB9IFsgPGI+PTwvYj4gRXhwcmVzc2lvbiBdCiAgKiA8L3ByZT4KICAqIAogICogQHNpbmNlIDIuMApAQCAtNzEsNiArNTMsMTQgQEAKIAlwcml2YXRlIFR5cGUgdHlwZSA9IG51bGw7CiAKIAkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgdGhlIHZhcmlhYmxlOworCSAqIGRlZmF1bHRzIHRvIDAuCisJICogCisJICogQHNpbmNlIDIuMQorCSAqLworCXByaXZhdGUgaW50IGV4dHJhQXJyYXlEaW1lbnNpb25zID0gMDsKKworCS8qKgogCSAqIFRoZSBpbml0aWFsaXplciBleHByZXNzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lOwogCSAqIGRlZmF1bHRzIHRvIG5vbmUuCiAJICovCkBAIC04MCw3ICs3MCw3IEBACiAJICogQ3JlYXRlcyBhIG5ldyBBU1Qgbm9kZSBmb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvd25lZCBieSB0aGUgZ2l2ZW4gCiAJICogQVNULiBCeSBkZWZhdWx0LCB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaGFzOiBubyBtb2RpZmllcnMsIGFuIAogCSAqIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHR5cGUsIGFuIHVuc3BlY2lmaWVkIChidXQgbGVnYWwpIHZhcmlhYmxlIG5hbWUsIAotCSAqIG5vIGluaXRpYWxpemVyLgorCSAqIDAgZGltZW5zaW9ucyBhZnRlciB0aGUgdmFyaWFibGU7IG5vIGluaXRpYWxpemVyLgogCSAqIDxwPgogCSAqIE4uQi4gVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlLXByaXZhdGUuCiAJICogPC9wPgpAQCAtMTAzLDggKzkzLDEwIEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcmVzdWx0ID0gbmV3IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24odGFyZ2V0KTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKIAkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CiAJCXJlc3VsdC5zZXRUeXBlKChUeXBlKSBnZXRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CisJCXJlc3VsdC5zZXRFeHRyYURpbWVuc2lvbnMoZ2V0RXh0cmFEaW1lbnNpb25zKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgZ2V0TmFtZSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0SW5pdGlhbGl6ZXIoCiAJCQkoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldEluaXRpYWxpemVyKCkpKTsKQEAgLTE3Myw3ICsxNjUsOSBAQAogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmICh2YXJpYWJsZU5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHZhcmlhYmxlTmFtZTsKIAl9CkBAIC0xOTAsMjEgKzE4NCwyNCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUgZGVjbGFyZWQgaW4gdGhpcyB2YXJpYWJsZSBkZWNsYXJhdGlvbiwKKwkgKiBleGNsdXNpdmUgb2YgYW55IGV4dHJhIGFycmF5IGRpbWVuc2lvbnMuCiAJICogCiAJICogQHJldHVybiB0aGUgdHlwZQogCSAqLyAKIAlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogCQlpZiAodHlwZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFR5cGUoZ2V0QVNUKCkubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiB0eXBlOwogCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24gdG8gCi0JICogdGhlIGdpdmVuIHR5cGUuCisJICogdGhlIGdpdmVuIHR5cGUsIGV4Y2x1c2l2ZSBvZiBhbnkgZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4KIAkgKiAKIAkgKiBAcGFyYW0gdHlwZSB0aGUgbmV3IHR5cGUKIAkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZjoKQEAgLTIyMyw2ICsyMjAsMjYgQEAKIAogCS8qIChvbWl0IGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQogCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWYXJpYWJsZURlY2xhcmF0aW9uLgorCSAqIEBzaW5jZSAyLjEKKwkgKi8gCisJcHVibGljIGludCBnZXRFeHRyYURpbWVuc2lvbnMoKSB7CisJCXJldHVybiBleHRyYUFycmF5RGltZW5zaW9uczsKKwl9CisKKwkvKiAob21pdCBqYXZhZG9jIGZvciB0aGlzIG1ldGhvZCkKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gVmFyaWFibGVEZWNsYXJhdGlvbi4KKwkgKiBAc2luY2UgMi4xCisJICovIAorCXB1YmxpYyB2b2lkIHNldEV4dHJhRGltZW5zaW9ucyhpbnQgZGltZW5zaW9ucykgeworCQlpZiAoZGltZW5zaW9ucyA8IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQltb2RpZnlpbmcoKTsKKwkJdGhpcy5leHRyYUFycmF5RGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7CisJfQorCisJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIFZhcmlhYmxlRGVjbGFyYXRpb24uCiAJICovIAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEluaXRpYWxpemVyKCkgewogCQlyZXR1cm4gb3B0aW9uYWxJbml0aWFsaXplcjsKQEAgLTI0Myw3ICsyNjAsNyBAQAogCSAqLwogCWludCBtZW1TaXplKCkgewogCQkvLyB0cmVhdCBPcGVyYXRvciBhcyBmcmVlCi0JCXJldHVybiBCQVNFX05PREVfU0laRSArIDQgKiA0OworCQlyZXR1cm4gQkFTRV9OT0RFX1NJWkUgKyA1ICogNDsKIAl9CiAJCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdGF0ZW1lbnQuamF2YQppbmRleCA2MDE4NWNhLi40OWM4ZWUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RhdGVtZW50LmphdmEKQEAgLTEsMTYgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKKwogLyoqCiAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIEFTVCBub2RlcyB0aGF0IHJlcHJlc2VudCBzdGF0ZW1lbnRzLgogICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2Ygc3RhdGVtZW50cy4KQEAgLTQ4LDYgKzUyLDggQEAKIAkvKioKIAkgKiBUaGUgbGVhZGluZyBjb21tZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgogCSAqIERlZmF1bHRzIHRvIG5vbmUuCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhlIGxlYWRpbmcgY29tbWVudCBmZWF0dXJlIHdhcyByZW1vdmVkIGluIDIuMS4KIAkgKi8KIAlwcml2YXRlIFN0cmluZyBvcHRpb25hbExlYWRpbmdDb21tZW50ID0gbnVsbDsKIAkKQEAgLTY3LDEzICs3MywyMSBAQAogCSAqIFJldHVybnMgdGhlIGxlYWRpbmcgY29tbWVudCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcKIAkgKiBhbmQgZW5kaW5nIGNvbW1lbnQgZGVsaW1pdGVycywgYW5kIGFueSBlbWJlZGRlZCBsaW5lIGJyZWFrcy4KIAkgKiA8cD4KLQkgKiBBIGxlYWRpbmcgY29tbWVudCBpcyBvbmUgdGhhdCBhcHBlYXJzIGJlZm9yZSB0aGUgc3RhdGVtZW50LgotCSAqIEl0IG1heSBiZSBlaXRoZXIgYW4gZW5kLW9mLWxpbmUgb3IgYSBtdWx0aS1saW5lIGNvbW1lbnQuCi0JICogTXVsdGktbGluZSBjb21tZW50cyBtYXkgY29udGFpbiBsaW5lIGJyZWFrczsgZW5kLW9mLWxpbmUKLQkgKiBjb21tZW50cyBtdXN0IG5vdC4KKwkgKiBBIGxlYWRpbmcgY29tbWVudCBpcyBhIGNvbW1lbnQgdGhhdCBhcHBlYXJzIGJlZm9yZSB0aGUgc3RhdGVtZW50LgorCSAqIEl0IG1heSBiZSBlaXRoZXIgYSB0cmFkaXRpb25hbCBjb21tZW50IG9yIGFuIGVuZC1vZi1saW5lIGNvbW1lbnQuCisJICogVHJhZGl0aW9uYWwgY29tbWVudHMgbXVzdCBiZWdpbiB3aXRoICIvJiM0MjssIG1heSBjb250YWluIGxpbmUgYnJlYWtzLAorCSAqIGFuZCBtdXN0IGVuZCB3aXRoICImIzQyOy8uIEVuZC1vZi1saW5lIGNvbW1lbnRzIG11c3QgYmVnaW4gd2l0aCAiLy8iLAorCSAqIG11c3QgZW5kIHdpdGggYSBsaW5lIGRlbGltaXRlciAoYXMgcGVyIEpMUyAzLjcpLCBhbmQgbXVzdCBub3QgY29udGFpbgorCSAqIGxpbmUgYnJlYWtzLgogCSAqIDwvcD4KIAkgKiAKIAkgKiBAcmV0dXJuIHRoZSBjb21tZW50IHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBkZXByZWNhdGVkIFRoaXMgZmVhdHVyZSB3YXMgcmVtb3ZlZCBpbiB0aGUgMi4xIHJlbGVhc2UgYmVjYXVzZSBpdCB3YXMKKwkgKiBvbmx5IGEgcGFydGlhbCwgYW5kIGluYWRlcXVhdGUsIHNvbHV0aW9uIHRvIHRoZSBpc3N1ZSBvZiBhc3NvY2lhdGluZworCSAqIGNvbW1lbnRzIHdpdGggc3RhdGVtZW50cy4gRnVydGhlcm1vcmUsIEFTVC5wYXJzZUNvbXBpbGF0aW9uVW5pdCBkaWQgbm90CisJICogYXNzb2NpYXRlIGxlYWRpbmcgY29tbWVudHMsIG1ha2luZyB0aGlzIG1vb3QuIENsaWVudHMgdGhhdCBuZWVkIHRvIGFjY2VzcworCSAqIGNvbW1lbnRzIHByZWNlZGluZyBhIHN0YXRlbWVudCBzaG91bGQgdXNlIGEgc2Nhbm5lciB0byByZWFuYWx5emUgdGhlCisJICogc291cmNlIHRleHQgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBzdGF0ZW1lbnQncyBzb3VyY2UgcmFuZ2UuCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRMZWFkaW5nQ29tbWVudCgpIHsKIAkJcmV0dXJuIG9wdGlvbmFsTGVhZGluZ0NvbW1lbnQ7CkBAIC04NCw0MiArOTgsNzYgQEAKIAkgKiBzdHJpbmcgbXVzdCBpbmNsdWRlIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIGNvbW1lbnQgZGVsaW1pdGVycywKIAkgKiBhbmQgYW55IGVtYmVkZGVkIGxpbmVicmVha3MuCiAJICogPHA+Ci0JICogQSBsZWFkaW5nIGNvbW1lbnQgaXMgb25lIHRoYXQgYXBwZWFycyBiZWZvcmUgdGhlIHN0YXRlbWVudC4KLQkgKiBJdCBtYXkgYmUgZWl0aGVyIGFuIGVuZC1vZi1saW5lIG9yIGEgbXVsdGktbGluZSBjb21tZW50LgotCSAqIE11bHRpLWxpbmUgY29tbWVudHMgbWF5IGNvbnRhaW4gbGluZSBicmVha3M7IGVuZC1vZi1saW5lCi0JICogY29tbWVudHMgbXVzdCBub3QuCisJICogQSBsZWFkaW5nIGNvbW1lbnQgaXMgYSBjb21tZW50IHRoYXQgYXBwZWFycyBiZWZvcmUgdGhlIHN0YXRlbWVudC4KKwkgKiBJdCBtYXkgYmUgZWl0aGVyIGEgdHJhZGl0aW9uYWwgY29tbWVudCBvciBhbiBlbmQtb2YtbGluZSBjb21tZW50LgorCSAqIFRyYWRpdGlvbmFsIGNvbW1lbnRzIG11c3QgYmVnaW4gd2l0aCAiLyYjNDI7LCBtYXkgY29udGFpbiBsaW5lIGJyZWFrcywKKwkgKiBhbmQgbXVzdCBlbmQgd2l0aCAiJiM0MjsvLiBFbmQtb2YtbGluZSBjb21tZW50cyBtdXN0IGJlZ2luIHdpdGggIi8vIgorCSAqIChhcyBwZXIgSkxTIDMuNyksIGFuZCBtdXN0IG5vdCBjb250YWluIGxpbmUgYnJlYWtzLgogCSAqIDwvcD4KIAkgKiA8cD4KIAkgKiBFeGFtcGxlczoKIAkgKiA8Y29kZT4KIAkgKiA8cHJlPgotCSAqIHNldExlYWRpbmdDb21tZW50KCIvJiM0Mjsgc2luZ2xlLWxpbmUgY29tbWVudCAmIzQyOy8iKSAtIGNvcnJlY3QKLQkgKiBzZXRMZWFkaW5nQ29tbWVudCgibWlzc2luZyBjb21tZW50IGRlbGltaXRlcnMiKSAtIHdyb25nIQotCSAqIHNldExlYWRpbmdDb21tZW50KCIvJiM0MjsgdW50ZXJtaW5hdGVkIGNvbW1lbnQgIikgLSB3cm9uZyEKLQkgKiBzZXRMZWFkaW5nQ29tbWVudCgiLy8gZW5kLW9mLWxpbmUgY29tbWVudCIpIC0gY29ycmVjdAotCSAqIHNldExlYWRpbmdDb21tZW50KCIvJiM0MjsgbXVsdGktbGluZVxuIGNvbW1lbnQgJiM0MjsvIikgIC0gY29ycmVjdAotCSAqIHNldExlYWRpbmdDb21tZW50KCIvLyBicm9rZW4gZW5kLW9mLWxpbmVcbiBjb21tZW50ICIpIC0gd3JvbmchCisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8mIzQyOyB0cmFkaXRpb25hbCBjb21tZW50ICYjNDI7LyIpOyAgLy8gY29ycmVjdAorCSAqIHNldExlYWRpbmdDb21tZW50KCJtaXNzaW5nIGNvbW1lbnQgZGVsaW1pdGVycyIpOyAgLy8gd3JvbmcKKwkgKiBzZXRMZWFkaW5nQ29tbWVudCgiLyYjNDI7IHVudGVybWluYXRlZCB0cmFkaXRpb25hbCBjb21tZW50ICIpOyAgLy8gd3JvbmcKKwkgKiBzZXRMZWFkaW5nQ29tbWVudCgiLyYjNDI7IGJyb2tlblxuIHRyYWRpdGlvbmFsIGNvbW1lbnQgJiM0MjsvIik7ICAvLyBjb3JyZWN0CisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8vIGVuZC1vZi1saW5lIGNvbW1lbnRcbiIpOyAgLy8gY29ycmVjdAorCSAqIHNldExlYWRpbmdDb21tZW50KCIvLyBlbmQtb2YtbGluZSBjb21tZW50IHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9yIik7ICAvLyBjb3JyZWN0CisJICogc2V0TGVhZGluZ0NvbW1lbnQoIi8vIGJyb2tlblxuIGVuZC1vZi1saW5lIGNvbW1lbnRcbiIpOyAgLy8gd3JvbmcKIAkgKiA8L3ByZT4KIAkgKiA8L2NvZGU+CiAJICogPC9wPgogCSAqIAogCSAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQogCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb21tZW50IHN0cmluZyBpcyBpbnZhbGlkCisJICogQGRlcHJlY2F0ZWQgVGhpcyBmZWF0dXJlIHdhcyByZW1vdmVkIGluIHRoZSAyLjEgcmVsZWFzZSBiZWNhdXNlIGl0IHdhcworCSAqIG9ubHkgYSBwYXJ0aWFsLCBhbmQgaW5hZGVxdWF0ZSwgc29sdXRpb24gdG8gdGhlIGlzc3VlIG9mIGFzc29jaWF0aW5nCisJICogY29tbWVudHMgd2l0aCBzdGF0ZW1lbnRzLgogCSAqLwogCXB1YmxpYyB2b2lkIHNldExlYWRpbmdDb21tZW50KFN0cmluZyBjb21tZW50KSB7CiAJCWlmIChjb21tZW50ICE9IG51bGwpIHsKLQkJCWlmIChjb21tZW50LnN0YXJ0c1dpdGgoIi8qIikgJiYgY29tbWVudC5lbmRzV2l0aCgiKi8iKSAmJiBjb21tZW50Lmxlbmd0aCgpID49IDQpIHsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCS8vIHRoaXMgaXMgb2sKLQkJCX0gZWxzZSBpZiAoY29tbWVudC5zdGFydHNXaXRoKCIvLyIpICYmIGNvbW1lbnQuaW5kZXhPZignXG4nKSA8IDApIHsvLyROT04tTkxTLTEkCi0JCQkJLy8gdGhpcyBpcyBvayB0b28KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYnV0IGFueXRoaW5nIGVsc2UgaWYgbm90IGdvb2QKKwkJCWNoYXJbXSBzb3VyY2UgPSBjb21tZW50LnRvQ2hhckFycmF5KCk7CisJCQlTY2FubmVyIHNjYW5uZXIgPSB0aGlzLmdldEFTVCgpLnNjYW5uZXI7CisJCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CisJCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOworCQkJdHJ5IHsKKwkJCQlpbnQgdG9rZW47CisJCQkJYm9vbGVhbiBvbmx5T25lQ29tbWVudCA9IGZhbHNlOworCQkJCXdoaWxlICgodG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKSAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHsKKwkJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfQkxPQ0sgOgorCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0pBVkFET0MgOgorCQkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NRU5UX0xJTkUgOgorCQkJCQkJCWlmIChvbmx5T25lQ29tbWVudCkgeworCQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQkJCQkJfQorCQkJCQkJCW9ubHlPbmVDb21tZW50ID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJb25seU9uZUNvbW1lbnQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIW9ubHlPbmVDb21tZW50KSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCQl9CisJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJCX0KIAkJfQogCQltb2RpZnlpbmcoKTsKIAkJdGhpcy5vcHRpb25hbExlYWRpbmdDb21tZW50ID0gY29tbWVudDsKIAl9CisKKwkvKioKKwkgKiBDb3BpZXMgdGhlIGxlYWRpbmcgY29tbWVudCBmcm9tIHRoZSBnaXZlbiBzdGF0ZW1lbnQuCisJICogCisJICogQHBhcmFtIHNvdXJjZSB0aGUgc3RhdGVtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGxlYWRpbmcgY29tbWVudAorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwl2b2lkIGNvcHlMZWFkaW5nQ29tbWVudChTdGF0ZW1lbnQgc291cmNlKSB7CisJCXNldExlYWRpbmdDb21tZW50KHNvdXJjZS5nZXRMZWFkaW5nQ29tbWVudCgpKTsKKwl9CiAJCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N0cmluZ0xpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RyaW5nTGl0ZXJhbC5qYXZhCmluZGV4IDM1OGQwNzQuLjFlMmMxYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RyaW5nTGl0ZXJhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3RyaW5nTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTUyLDYgKzUyLDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJU3RyaW5nTGl0ZXJhbCByZXN1bHQgPSBuZXcgU3RyaW5nTGl0ZXJhbCh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0RXNjYXBlZFZhbHVlKGdldEVzY2FwZWRWYWx1ZSgpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02OCw3ICs2OSw3IEBACiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCiAJdm9pZCBhY2NlcHQwKEFTVFZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOworCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwogCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwogCX0KIAkKQEAgLTE0OSw5NiArMTUwLDIyIEBACiAJCWlmIChsZW4gPCAyIHx8IHMuY2hhckF0KDApICE9ICdcIicgfHwgcy5jaGFyQXQobGVuLTEpICE9ICdcIicgKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCX0KLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiAtIDIpOwotCQlmb3IgKGludCBpID0gMTsgaTwgbGVuIC0gMTsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjID09ICdcIicpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQorCQlTY2FubmVyIHNjYW5uZXIgPSBnZXRBU1QoKS5zY2FubmVyOworCQljaGFyW10gc291cmNlID0gcy50b0NoYXJBcnJheSgpOworCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2UpOworCQlzY2FubmVyLnJlc2V0VG8oMCwgc291cmNlLmxlbmd0aCk7CisJCXRyeSB7CisJCQlpbnQgdG9rZW5UeXBlID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCXN3aXRjaCh0b2tlblR5cGUpIHsKKwkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDoKKwkJCQkJcmV0dXJuIG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSk7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQkJfQotCQkJaWYgKGMgPT0gJ1xcJykgewotCQkJCS8vIGxlZ2FsOiBiLCB0LCBuLCBmLCByLCAiLCAnLCBcLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCBvciA3Ci0JCQkJY2hhciBuZXh0Q2hhcjsKLQkJCQlpZiAoKGkgKyAxKSA8IGxlbiAtIDEpIHsKLQkJCQkJbmV4dENoYXIgPSBzLmNoYXJBdChpICsgMSk7Ci0JCQkJCWkrKzsKLQkJCQkJc3dpdGNoKG5leHRDaGFyKSB7Ci0JCQkJCQljYXNlICdiJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1xiJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICd0JyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1x0Jyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICduJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1xuJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdmJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1xmJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdyJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1xyJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdcIic6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wiJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdcJyc6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wnJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdcXCc6Ci0JCQkJCQkJYi5hcHBlbmQoJ1xcJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICcwJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wwJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICcxJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wxJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICcyJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wyJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICczJyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1wzJyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICc0JyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1w0Jyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICc1JyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1w1Jyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICc2JyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1w2Jyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICc3JyA6Ci0JCQkJCQkJYi5hcHBlbmQoJ1w3Jyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICd1JyA6Ci0JCQkJCQkJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KLQkJCQkJCQlpbnQgY3VycmVudFBvc2l0aW9uID0gaSArIDE7Ci0JCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKLQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMxIDwgMAotCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzIgPCAwCi0JCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMyA8IDAKLQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGM0IDwgMCl7Ci0JCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RyaW5nIGxpdGVyYWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWIuYXBwZW5kKChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KSk7Ci0JCQkJCQkJCWkgPSBjdXJyZW50UG9zaXRpb24gLSAxOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdHJpbmcgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RyaW5nIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQliLmFwcGVuZChjKTsKLQkJCX0KKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl9Ci0JCXJldHVybiBiLnRvU3RyaW5nKCk7CQkJCiAJfQogCiAJLyoqCkBAIC0zNDYsNCArMjczLDMgQEAKIAkJcmV0dXJuIG1lbVNpemUoKTsKIAl9CiB9Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24uamF2YQppbmRleCBhM2FjNGY1Li5hOGU0ZWQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbi5qYXZhCkBAIC0xLDI1ICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBTdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGV4cHJlc3Npb24gQVNUIG5vZGUgdHlwZS4KKyAqIFN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3RhdGVtZW50IEFTVCBub2RlIHR5cGUuCiAgKgogICogPHByZT4KICAqIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uOgogICoJCVsgRXhwcmVzc2lvbiA8Yj4uPC9iPiBdIDxiPnN1cGVyPC9iPgotICogCQkJCTxiPig8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPiw8L2I+IEV4cHJlc3Npb24gfSBdIDxiPik8L2I+CisgKiAJCQkJPGI+KDwvYj4gWyBFeHByZXNzaW9uIHsgPGI+LDwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+KTwvYj4gPGI+OzwvYj4KICAqIDwvcHJlPgogICogCiAgKiBAc2luY2UgMi4wCkBAIC02MCw3ICs2MCw4IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHJlc3VsdCA9IG5ldyBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbih0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKIAkJcmVzdWx0LmFyZ3VtZW50cygpLmFkZEFsbChBU1ROb2RlLmNvcHlTdWJ0cmVlcyh0YXJnZXQsIGFyZ3VtZW50cygpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyRmllbGRBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCmluZGV4IDU1ZWI1ZDcuLjE5NTlhNDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJGaWVsZEFjY2Vzcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTE5LDYgKzE5LDEyIEBACiAgKiAgICAgWyBDbGFzc05hbWUgPGI+LjwvYj4gXSA8Yj5zdXBlcjwvYj4gPGI+LjwvYj4gSWRlbnRpZmllcgogICogPC9wcmU+CiAgKiAKKyAqIDxwPgorICogU2VlIDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPiBmb3IgZ3VpZGVsaW5lcyBvbiBoYW5kbGluZyBvdGhlciBleHByZXNzaW9ucworICogdGhhdCByZXNlbWJsZSBxdWFsaWZpZWQgbmFtZXMuCisgKiA8L3A+CisgKiAKKyAqIEBzZWUgRmllbGRBY2Nlc3MKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGNsYXNzIFN1cGVyRmllbGRBY2Nlc3MgZXh0ZW5kcyBFeHByZXNzaW9uIHsKQEAgLTYwLDYgKzY2LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJU3VwZXJGaWVsZEFjY2VzcyByZXN1bHQgPSBuZXcgU3VwZXJGaWVsZEFjY2Vzcyh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgQVNUTm9kZS5jb3B5U3VidHJlZSh0YXJnZXQsIGdldE5hbWUoKSkpOwogCQlyZXN1bHQuc2V0UXVhbGlmaWVyKChOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0UXVhbGlmaWVyKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTEyMSw3ICsxMjgsMTAgQEAKIAkgKi8gCiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSB7CisJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gZmllbGROYW1lOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJNZXRob2RJbnZvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N1cGVyTWV0aG9kSW52b2NhdGlvbi5qYXZhCmluZGV4IGVjNGI2ZDguLjExOTAzMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3VwZXJNZXRob2RJbnZvY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TdXBlck1ldGhvZEludm9jYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC02Nyw2ICs2Nyw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVN1cGVyTWV0aG9kSW52b2NhdGlvbiByZXN1bHQgPSBuZXcgU3VwZXJNZXRob2RJbnZvY2F0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXROYW1lKChTaW1wbGVOYW1lKSBnZXROYW1lKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRRdWFsaWZpZXIoKE5hbWUpIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRRdWFsaWZpZXIoKSkpOwogCQlyZXN1bHQuYXJndW1lbnRzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgYXJndW1lbnRzKCkpKTsKQEAgLTEzMCw3ICsxMzEsOSBAQAogCXB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CiAJCWlmIChtZXRob2ROYW1lID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0TmFtZShuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBtZXRob2ROYW1lOwogCX0KQEAgLTE2NSw2ICsxNjgsMjIgQEAKIAkJcmV0dXJuIGFyZ3VtZW50czsKIAl9CiAKKwkvKioKKwkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUgYmluZGluZyBmb3IgdGhlIG1ldGhvZCBpbnZva2VkIGJ5IHRoaXMKKwkgKiBleHByZXNzaW9uLgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCBiaW5kaW5ncyBhcmUgZ2VuZXJhbGx5IHVuYXZhaWxhYmxlIHVubGVzcyByZXF1ZXN0ZWQgd2hlbiB0aGUKKwkgKiBBU1QgaXMgYmVpbmcgYnVpbHQuCisJICogPC9wPgorCSAqCisJICogQHJldHVybiB0aGUgbWV0aG9kIGJpbmRpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBiaW5kaW5nIGNhbm5vdAorCSAqIGJlIHJlc29sdmVkCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBJTWV0aG9kQmluZGluZyByZXNvbHZlTWV0aG9kQmluZGluZygpIHsKKwkJcmV0dXJuIGdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLnJlc29sdmVNZXRob2QodGhpcyk7CisJfQorCiAJLyogKG9taXQgamF2YWRvYyBmb3IgdGhpcyBtZXRob2QpCiAJICogTWV0aG9kIGRlY2xhcmVkIG9uIEFTVE5vZGUuCiAJICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoQ2FzZS5qYXZhCmluZGV4IGU2YTQ0ZDQuLmRmOTMxOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoQ2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoQ2FzZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTYwLDcgKzYwLDggQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJU3dpdGNoQ2FzZSByZXN1bHQgPSBuZXcgU3dpdGNoQ2FzZSh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKAogCQkJKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodGFyZ2V0LCBnZXRFeHByZXNzaW9uKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTk0LDcgKzk1LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoIWV4cHJlc3Npb25Jbml0aWFsaXplZCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIG9wdGlvbmFsRXhwcmVzc2lvbjsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9Td2l0Y2hTdGF0ZW1lbnQuamF2YQppbmRleCBiNDljMjE2Li5lMmE3MmQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N3aXRjaFN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3dpdGNoU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNzIsNyArNzIsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlTd2l0Y2hTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFN3aXRjaFN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zdGF0ZW1lbnRzKCkuYWRkQWxsKEFTVE5vZGUuY29weVN1YnRyZWVzKHRhcmdldCwgc3RhdGVtZW50cygpKSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xMDcsNyArMTA4LDkgQEAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewogCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEV4cHJlc3Npb24obmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gZXhwcmVzc2lvbjsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9TeW5jaHJvbml6ZWRTdGF0ZW1lbnQuamF2YQppbmRleCAwMTc0MWVjLi5hNDE0OGM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNjAsNyArNjAsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtOTUsNyArOTYsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KQEAgLTEyOSw3ICsxMzIsOSBAQAogCXB1YmxpYyBCbG9jayBnZXRCb2R5KCkgewogCQlpZiAoYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEJvZHkobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGJvZHk7CiAJfQpAQCAtMTcwLDQgKzE3NSw0IEBACiAJCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpCiAJCQkrIChib2R5ID09IG51bGwgPyAwIDogZ2V0Qm9keSgpLnRyZWVTaXplKCkpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RoaXNFeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RoaXNFeHByZXNzaW9uLmphdmEKaW5kZXggNTg5NjA1Yy4uMjIzMGM4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaGlzRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhpc0V4cHJlc3Npb24uamF2YQpAQCAtMSwxNiArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKKwogLyoqCiAgKiBTaW1wbGUgb3IgcXVhbGlmaWVkICJ0aGlzIiBBU1Qgbm9kZSB0eXBlLgogICoKQEAgLTE4LDcgKzIxLDEyIEBACiAgKiBUaGlzRXhwcmVzc2lvbjoKICAqICAgICBbIENsYXNzTmFtZSA8Yj4uPC9iPiBdIDxiPnRoaXM8L2I+CiAgKiA8L3ByZT4KKyAqIDxwPgorICogU2VlIDxjb2RlPkZpZWxkQWNjZXNzPC9jb2RlPiBmb3IgZ3VpZGVsaW5lcyBvbiBoYW5kbGluZyBvdGhlciBleHByZXNzaW9ucworICogdGhhdCByZXNlbWJsZSBxdWFsaWZpZWQgbmFtZXMuCisgKiA8L3A+CiAgKiAKKyAqIEBzZWUgRmllbGRBY2Nlc3MKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIGNsYXNzIFRoaXNFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CkBAIC01MCw2ICs1OCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVRoaXNFeHByZXNzaW9uIHJlc3VsdCA9IG5ldyBUaGlzRXhwcmVzc2lvbih0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0UXVhbGlmaWVyKChOYW1lKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwgZ2V0UXVhbGlmaWVyKCkpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0xMTYsNCArMTI1LDQyIEBACiAJCQltZW1TaXplKCkKIAkJCSsgKG9wdGlvbmFsUXVhbGlmaWVyID09IG51bGwgPyAwIDogZ2V0UXVhbGlmaWVyKCkudHJlZVNpemUoKSk7CiAJfQorCisJQmxvY2tTY29wZSBsb29rdXBTY29wZSgpIHsKKwkJQVNUTm9kZSBjdXJyZW50Tm9kZSA9IHRoaXM7CisJCXdoaWxlKGN1cnJlbnROb2RlICE9IG51bGwKKwkJCSYmIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKQorCQkJJiYgIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEluaXRpYWxpemVyKQorCQkJJiYgIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pKSB7CisJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCQl9CisJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgeworCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSAoSW5pdGlhbGl6ZXIpIGN1cnJlbnROb2RlOworCQkJd2hpbGUoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHsKKwkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCQkJfQorCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb24pIHRoaXMuZ2V0QVNUKCkuZ2V0QmluZGluZ1Jlc29sdmVyKCkuZ2V0Q29ycmVzcG9uZGluZ05vZGUoY3VycmVudE5vZGUpOworCQkJaWYgKChpbml0aWFsaXplci5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgeworCQkJCXJldHVybiB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBjdXJyZW50Tm9kZTsKKwkJCXdoaWxlKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pKSB7CisJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uKSB0aGlzLmdldEFTVCgpLmdldEJpbmRpbmdSZXNvbHZlcigpLmdldENvcnJlc3BvbmRpbmdOb2RlKGN1cnJlbnROb2RlKTsKKwkJCWlmICgoZmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgeworCQkJCXJldHVybiB0eXBlRGVjbC5zdGF0aWNJbml0aWFsaXplclNjb3BlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZURlY2wuaW5pdGlhbGl6ZXJTY29wZTsKKwkJCX0KKwkJfQorCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIGFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbikgdGhpcy5nZXRBU1QoKS5nZXRCaW5kaW5nUmVzb2x2ZXIoKS5nZXRDb3JyZXNwb25kaW5nTm9kZShjdXJyZW50Tm9kZSk7CisJCXJldHVybiBhYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uLnNjb3BlOworCX0JCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Rocm93U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1Rocm93U3RhdGVtZW50LmphdmEKaW5kZXggNjQ4ZTNkYy4uMmQ0ZTVhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UaHJvd1N0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVGhyb3dTdGF0ZW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC01NSw3ICs1NSw4IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVRocm93U3RhdGVtZW50IHJlc3VsdCA9IG5ldyBUaHJvd1N0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBnZXRFeHByZXNzaW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtODcsNyArODgsOSBAQAogCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CiAJCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0RXhwcmVzc2lvbihuZXcgU2ltcGxlTmFtZShnZXRBU1QoKSkpOworCQkJZ2V0QVNUKCkuc2V0TW9kaWZpY2F0aW9uQ291bnQoY291bnQpOwogCQl9CiAJCXJldHVybiBleHByZXNzaW9uOwogCX0KQEAgLTEyOCw0ICsxMzEsNCBAQAogCQkJbWVtU2l6ZSgpCiAJCQkrIChleHByZXNzaW9uID09IG51bGwgPyAwIDogZ2V0RXhwcmVzc2lvbigpLnRyZWVTaXplKCkpOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RyeVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UcnlTdGF0ZW1lbnQuamF2YQppbmRleCBjNWNiYWI1Li44NzU3NWZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1RyeVN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHJ5U3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNzIsNyArNzIsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlUcnlTdGF0ZW1lbnQgcmVzdWx0ID0gbmV3IFRyeVN0YXRlbWVudCh0YXJnZXQpOwotCQlyZXN1bHQuc2V0TGVhZGluZ0NvbW1lbnQoZ2V0TGVhZGluZ0NvbW1lbnQoKSk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CisJCXJlc3VsdC5jb3B5TGVhZGluZ0NvbW1lbnQodGhpcyk7CiAJCXJlc3VsdC5zZXRCb2R5KChCbG9jaykgZ2V0Qm9keSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuY2F0Y2hDbGF1c2VzKCkuYWRkQWxsKAogCQkJQVNUTm9kZS5jb3B5U3VidHJlZXModGFyZ2V0LCBjYXRjaENsYXVzZXMoKSkpOwpAQCAtMTExLDcgKzExMiw5IEBACiAJcHVibGljIEJsb2NrIGdldEJvZHkoKSB7CiAJCWlmIChib2R5ID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0Qm9keShuZXcgQmxvY2soZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gYm9keTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhCmluZGV4IDg4OTgwNGMuLjUzMzJmOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUJpbmRpbmcuamF2YQppbmRleCA2OGQ3NjM3Li4zOGE5MDY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVCaW5kaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlQmluZGluZy5qYXZhCkBAIC0xLDIxICsxLDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmFzZVR5cGVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdHlwZSBiaW5kaW5ncy4KQEAgLTMwLDggKzMxLDYgQEAKIAkKIAlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmcgYmluZGluZzsKIAlwcml2YXRlIEJpbmRpbmdSZXNvbHZlciByZXNvbHZlcjsKLQlwcml2YXRlIElWYXJpYWJsZUJpbmRpbmdbXSBmaWVsZHM7Ci0JcHJpdmF0ZSBJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHM7CiAJCiAJcHVibGljIFR5cGVCaW5kaW5nKEJpbmRpbmdSZXNvbHZlciByZXNvbHZlciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZyBiaW5kaW5nKSB7CiAJCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7CkBAIC00Miw3ICs0MSw3IEBACiAJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNQcmltaXRpdmUoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gYmluZGluZy5pc0Jhc2VUeXBlKCk7CisJCXJldHVybiAhaXNOdWxsVHlwZSgpICYmIGJpbmRpbmcuaXNCYXNlVHlwZSgpOwogCX0KIAogCS8qCkBAIC0yNjQsNyArMjYzLDcgQEAKIAlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewogCQlpZiAodGhpcy5iaW5kaW5nLmlzQ2xhc3MoKSB8fCB0aGlzLmJpbmRpbmcuaXNJbnRlcmZhY2UoKSkgewogCQkJUmVmZXJlbmNlQmluZGluZyByZWZlcmVuY2VCaW5kaW5nID0gKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMuYmluZGluZzsKLQkJCXJldHVybiByZWZlcmVuY2VCaW5kaW5nLmlzTG9jYWxUeXBlKCk7CisJCQlyZXR1cm4gcmVmZXJlbmNlQmluZGluZy5pc0xvY2FsVHlwZSgpICYmICFyZWZlcmVuY2VCaW5kaW5nLmlzTWVtYmVyVHlwZSgpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0zMjQsOSArMzIzLDE2IEBACiAJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5iaW5kaW5nOwogCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHJlZmVyZW5jZUJpbmRpbmcubWV0aG9kcygpOwogCQkJaW50IGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOworCQkJaW50IHJlbW92ZVN5bnRoZXRpY3NDb3VudGVyID0gMDsKIAkJCUlNZXRob2RCaW5kaW5nW10gbmV3TWV0aG9kcyA9IG5ldyBJTWV0aG9kQmluZGluZ1tsZW5ndGhdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCW5ld01ldGhvZHNbaV0gPSB0aGlzLnJlc29sdmVyLmdldE1ldGhvZEJpbmRpbmcobWV0aG9kc1tpXSk7CisJCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RzW2ldOworCQkJCWlmICghc2hvdWxkQmVSZW1vdmVkKG1ldGhvZEJpbmRpbmcpKSB7IAorCQkJCQluZXdNZXRob2RzW3JlbW92ZVN5bnRoZXRpY3NDb3VudGVyKytdID0gdGhpcy5yZXNvbHZlci5nZXRNZXRob2RCaW5kaW5nKG1ldGhvZEJpbmRpbmcpOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZW1vdmVTeW50aGV0aWNzQ291bnRlciAhPSBsZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld01ldGhvZHMsIDAsIChuZXdNZXRob2RzID0gbmV3IElNZXRob2RCaW5kaW5nW3JlbW92ZVN5bnRoZXRpY3NDb3VudGVyXSksIDAsIHJlbW92ZVN5bnRoZXRpY3NDb3VudGVyKTsKIAkJCX0KIAkJCXJldHVybiBuZXdNZXRob2RzOwogCQl9IGVsc2UgewpAQCAtMzM0LDYgKzM0MCwxMCBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSBib29sZWFuIHNob3VsZEJlUmVtb3ZlZChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQlyZXR1cm4gbWV0aG9kQmluZGluZy5pc0RlZmF1bHRBYnN0cmFjdCgpIHx8IG1ldGhvZEJpbmRpbmcuaXNTeW50aGV0aWMoKSB8fCAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkgJiYgaXNJbnRlcmZhY2UoKSk7CisJfQorCQogCS8qCiAJICogQHNlZSBJVHlwZUJpbmRpbmcjaXNGcm9tU291cmNlKCkKIAkgKi8KQEAgLTM5OCw0ICs0MDgsNTggQEAKIAkJcmV0dXJuIHRoaXMuYmluZGluZyA9PSBCYXNlVHlwZXMuTnVsbEJpbmRpbmc7CiAJfQogCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nI2dldFF1YWxpZmllZE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKwkJaWYgKGlzQW5vbnltb3VzKCkgfHwgaXNMb2NhbCgpKSB7CisJCQlyZXR1cm4gTk9fTkFNRTsKKwkJfQorCQkKKwkJaWYgKGlzUHJpbWl0aXZlKCkgfHwgaXNOdWxsVHlwZSgpKSB7CisJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCQorCQlpZiAoaXNBcnJheSgpKSB7CisJCQlJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZSgpOworCQkJU3RyaW5nIGVsZW1lbnRUeXBlUXVhbGlmaWVkTmFtZSA9IGVsZW1lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKKwkJCWlmIChlbGVtZW50VHlwZVF1YWxpZmllZE5hbWUubGVuZ3RoKCkgIT0gMCkgeworCQkJCWludCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucygpOworCQkJCWNoYXJbXSBicmFja2V0cyA9IG5ldyBjaGFyW2RpbWVuc2lvbnMgKiAyXTsKKwkJCQlmb3IgKGludCBpID0gZGltZW5zaW9ucyAqIDIgLSAxOyBpID49IDA7IGkgLT0gMikgeworCQkJCQlicmFja2V0c1tpXSA9ICddJzsKKwkJCQkJYnJhY2tldHNbaSAtIDFdID0gJ1snOworCQkJCX0KKwkJCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlbGVtZW50VHlwZVF1YWxpZmllZE5hbWUpOworCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoYnJhY2tldHMpOworCQkJCXJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIE5PX05BTUU7CisJCQl9CisJCX0KKwkJCisJCWlmIChpc1RvcExldmVsKCkgfHwgaXNNZW1iZXIoKSkgeworCQkJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0aGlzLmJpbmRpbmcuZ2V0UGFja2FnZSgpOworCQkJCisJCQlpZiAocGFja2FnZUJpbmRpbmcgPT0gbnVsbCB8fCBwYWNrYWdlQmluZGluZy5jb21wb3VuZE5hbWUgPT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpIHsKKwkJCQlyZXR1cm4gbmV3IFN0cmluZyh0aGlzLmJpbmRpbmcucXVhbGlmaWVkU291cmNlTmFtZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQlzdHJpbmdCdWZmZXIKKwkJCQkJLmFwcGVuZCh0aGlzLmJpbmRpbmcucXVhbGlmaWVkUGFja2FnZU5hbWUoKSkKKwkJCQkJLmFwcGVuZCgnLicpCisJCQkJCS5hcHBlbmQodGhpcy5iaW5kaW5nLnF1YWxpZmllZFNvdXJjZU5hbWUoKSk7CisJCQkJcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOworCQkJfQorCQl9CisJCXJldHVybiBOT19OQU1FOworCX0KKwkKKwkvKiAKKwkgKiBGb3IgZGVidWdnaW5nIHB1cnBvc2Ugb25seS4KKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiB0aGlzLmJpbmRpbmcudG9TdHJpbmcoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlRGVjbGFyYXRpb24uamF2YQppbmRleCBjODRiNjg2Li4xZWI2MDNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtMTI0LDYgKzEyNCw3IEBACiAJICovCiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSBuZXcgVHlwZURlY2xhcmF0aW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOwogCQlyZXN1bHQuc2V0SmF2YWRvYygKIAkJCShKYXZhZG9jKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHRhcmdldCwoQVNUTm9kZSkgZ2V0SmF2YWRvYygpKSk7CkBAIC0yMzAsNyArMjMxLDkgQEAKIAlwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgewogCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXROYW1lKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHR5cGVOYW1lOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCmluZGV4IGI4MzgzZmYuLjRiMDVmNTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC02MCw3ICs2MCw4IEBACiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCByZXN1bHQgPSAKIAkJCW5ldyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0VHlwZURlY2xhcmF0aW9uKAogCQkJKFR5cGVEZWNsYXJhdGlvbikgZ2V0VHlwZURlY2xhcmF0aW9uKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05NCw3ICs5NSw5IEBACiAJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oKSB7CiAJCWlmICh0eXBlRGVjbCA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldFR5cGVEZWNsYXJhdGlvbihuZXcgVHlwZURlY2xhcmF0aW9uKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHR5cGVEZWNsOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUxpdGVyYWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVHlwZUxpdGVyYWwuamF2YQppbmRleCA2ZmM2YjBhLi4zY2Y2Mzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1R5cGVMaXRlcmFsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9UeXBlTGl0ZXJhbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTU0LDYgKzU0LDcgQEAKIAkgKi8KIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJVHlwZUxpdGVyYWwgcmVzdWx0ID0gbmV3IFR5cGVMaXRlcmFsKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRUeXBlKChUeXBlKSBnZXRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtODUsNyArODYsOSBAQAogCXB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CiAJCWlmICh0eXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0VHlwZShnZXRBU1QoKS5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIHR5cGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZUJpbmRpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVCaW5kaW5nLmphdmEKaW5kZXggYjBiYmQwZi4uZmU4N2UzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZUJpbmRpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlQmluZGluZy5qYXZhCkBAIC0xLDE2ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNb2RpZmllckNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKIAogLyoqCkBAIC04NSw2ICs4Niw5IEBACiAJCWlmIChpc0ZpZWxkKCkpIHsKIAkJCXJldHVybiAoKEZpZWxkQmluZGluZykgdGhpcy5iaW5kaW5nKS5nZXRBY2Nlc3NGbGFncygpOwogCQl9CisJCWlmIChiaW5kaW5nLmlzRmluYWwoKSkgeworCQkJcmV0dXJuIElNb2RpZmllckNvbnN0YW50cy5BQ0NfRklOQUw7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMzAsNCArMTM0LDExIEBACiAJCXJldHVybiB0aGlzLmJpbmRpbmcuaWQ7CiAJfQogCisJLyogCisJICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkuCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy5iaW5kaW5nLnRvU3RyaW5nKCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQppbmRleCA2ZTczODBlLi44ZDA2MzY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC02MSw2ICs2MSw0MiBAQAogCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5hbWUoU2ltcGxlTmFtZSB2YXJpYWJsZU5hbWUpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgb3ZlciBhbmQgYWJvdmUgdGhlIAorCSAqIGV4cGxpY2l0bHktc3BlY2lmaWVkIHR5cGUuCisJICogPHA+CisJICogRm9yIGV4YW1wbGUsIDxjb2RlPmludCB4W11bXTwvY29kZT4gaGFzIGEgdHlwZSBvZiAKKwkgKiA8Y29kZT5pbnQ8L2NvZGU+IGFuZCB0d28gZXh0cmEgYXJyYXkgZGltZW5zaW9uczsgCisJICogPGNvZGU+aW50W11bXSB4PC9jb2RlPiBoYXMgYSB0eXBlIG9mIDxjb2RlPmludFtdW108L2NvZGU+CisJICogYW5kIHplcm8gZXh0cmEgYXJyYXkgZGltZW5zaW9ucy4gVGhlIHR3byBjb25zdHJ1Y3RzIGhhdmUgZGlmZmVyZW50CisJICogQVNUcywgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIHJlYWxseSBzeW50YWN0aWMgdmFyaWFudHMgb2YgdGhlIHNhbWUKKwkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMKKwkgKiBAc2luY2UgMi4xCisJICovIAorCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyBvdmVyIGFuZCBhYm92ZSB0aGUgCisJICogZXhwbGljaXRseS1zcGVjaWZpZWQgdHlwZS4KKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwgPGNvZGU+aW50IHhbXVtdPC9jb2RlPiBoYXMgYSB0eXBlIG9mIAorCSAqIDxjb2RlPmludDwvY29kZT4gYW5kIHR3byBleHRyYSBhcnJheSBkaW1lbnNpb25zOyAKKwkgKiA8Y29kZT5pbnRbXVtdIHg8L2NvZGU+IGhhcyBhIHR5cGUgb2YgPGNvZGU+aW50W11bXTwvY29kZT4KKwkgKiBhbmQgemVybyBleHRyYSBhcnJheSBkaW1lbnNpb25zLiBUaGUgdHdvIGNvbnN0cnVjdHMgaGF2ZSBkaWZmZXJlbnQKKwkgKiBBU1RzLCBldmVuIHRob3VnaCB0aGVyZSBhcmUgcmVhbGx5IHN5bnRhY3RpYyB2YXJpYW50cyBvZiB0aGUgc2FtZQorCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZGltZW5zaW9ucyB0aGUgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgaXMKKwkgKiAgICBuZWdhdGl2ZQorCSAqIEBzaW5jZSAyLjEKKwkgKi8gCisJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXh0cmFEaW1lbnNpb25zKGludCBkaW1lbnNpb25zKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIGluaXRpYWxpemVyIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24sIG9yIAogCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vbmUuCiAJICogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggMDNkMDFhOS4uZDVkNzQ1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC04NCw2ICs4NCw3IEBACiAJQVNUTm9kZSBjbG9uZShBU1QgdGFyZ2V0KSB7CiAJCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHJlc3VsdCA9IAogCQkJbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHRhcmdldCk7CisJCXJlc3VsdC5zZXRTb3VyY2VSYW5nZSh0aGlzLmdldFN0YXJ0UG9zaXRpb24oKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAJCXJlc3VsdC5zZXRNb2RpZmllcnMoZ2V0TW9kaWZpZXJzKCkpOwogCQlyZXN1bHQuc2V0VHlwZSgoVHlwZSkgZ2V0VHlwZSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuZnJhZ21lbnRzKCkuYWRkQWxsKApAQCAtMTU5LDcgKzE2MCw5IEBACiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKIAkJaWYgKGJhc2VUeXBlID09IG51bGwpIHsKIAkJCS8vIGxhenkgaW5pdGlhbGl6ZSAtIHVzZSBzZXR0ZXIgdG8gZW5zdXJlIHBhcmVudCBsaW5rIHNldCB0b28KKwkJCWxvbmcgY291bnQgPSBnZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwogCQkJc2V0VHlwZShnZXRBU1QoKS5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGJhc2VUeXBlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5qYXZhCmluZGV4IDhkNWI0YzkuLjAwYzM5NjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tOwogCkBAIC0zNCw3ICszNCw3IEBACiAJcHJpdmF0ZSBTaW1wbGVOYW1lIHZhcmlhYmxlTmFtZSA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMgdGhhdCB0aGlzIHZhcmlhYmxlOworCSAqIFRoZSBudW1iZXIgb2YgZXh0cmEgYXJyYXkgZGltZW5zaW9ucyB0aGF0IHRoaXMgdmFyaWFibGUgaGFzOwogCSAqIGRlZmF1bHRzIHRvIDAuCiAJICovCiAJcHJpdmF0ZSBpbnQgZXh0cmFBcnJheURpbWVuc2lvbnMgPSAwOwpAQCAtNzEsNiArNzEsNyBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgcmVzdWx0ID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCh0YXJnZXQpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOwogCQlyZXN1bHQuc2V0TmFtZSgoU2ltcGxlTmFtZSkgZ2V0TmFtZSgpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0RXh0cmFEaW1lbnNpb25zKGdldEV4dHJhRGltZW5zaW9ucygpKTsKIAkJcmVzdWx0LnNldEluaXRpYWxpemVyKApAQCAtMTA1LDcgKzEwNiw5IEBACiAJcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKIAkJaWYgKHZhcmlhYmxlTmFtZSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldE5hbWUobmV3IFNpbXBsZU5hbWUoZ2V0QVNUKCkpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gdmFyaWFibGVOYW1lOwogCX0KQEAgLTEzMSw3ICsxMzQsNyBAQAogCSAqIGRpbWVuc2lvbnMsIHJlc3BlY3RpdmVseS4KIAkgKiA8L3A+CiAJICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMKKwkgKiBAc2luY2UgMi4wCiAJICovIAogCXB1YmxpYyBpbnQgZ2V0RXh0cmFEaW1lbnNpb25zKCkgewogCQlyZXR1cm4gZXh0cmFBcnJheURpbWVuc2lvbnM7CkBAIC0xNDAsMTAgKzE0MywxNCBAQAogCS8qKgogCSAqIFNldHMgdGhlIG51bWJlciBvZiBleHRyYSBhcnJheSBkaW1lbnNpb25zIHRoaXMgdmFyaWFibGUgaGFzIG92ZXIKIAkgKiBhbmQgYWJvdmUgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBlbmNsb3NpbmcgZGVjbGFyYXRpb24uCisJICogPHA+CisJICogRm9yIGV4YW1wbGUsIGluIHRoZSBBU1QgZm9yIDxjb2RlPmludFtdIGksIGpbXSwga1tdW108L2NvZGU+IHRoZSAKKwkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgPGNvZGU+aTwvY29kZT4sCisJICogPGNvZGU+ajwvY29kZT4sIGFuZCA8Y29kZT5rPC9jb2RlPiwgaGF2ZSAwLCAxLCBhbmQgMiBleHRyYSBhcnJheQorCSAqIGRpbWVuc2lvbnMsIHJlc3BlY3RpdmVseS4KKwkgKiA8L3A+CiAJICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4dHJhIGFycmF5IGRpbWVuc2lvbnMKLQkgKiBAc2VlIE1vZGlmaWVyCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGlzIG5lZ2F0aXZlCisJICogQHNpbmNlIDIuMAogCSAqLyAKIAlwdWJsaWMgdm9pZCBzZXRFeHRyYURpbWVuc2lvbnMoaW50IGRpbWVuc2lvbnMpIHsKIAkJaWYgKGRpbWVuc2lvbnMgPCAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCmluZGV4IGE5ZDViOGMuLmRhMDBjMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb207CiAKQEAgLTgyLDcgKzgyLDggQEAKIAlBU1ROb2RlIGNsb25lKEFTVCB0YXJnZXQpIHsKIAkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCByZXN1bHQgPSAKIAkJCW5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRhcmdldCk7Ci0JCXJlc3VsdC5zZXRMZWFkaW5nQ29tbWVudChnZXRMZWFkaW5nQ29tbWVudCgpKTsKKwkJcmVzdWx0LnNldFNvdXJjZVJhbmdlKHRoaXMuZ2V0U3RhcnRQb3NpdGlvbigpLCB0aGlzLmdldExlbmd0aCgpKTsKKwkJcmVzdWx0LmNvcHlMZWFkaW5nQ29tbWVudCh0aGlzKTsKIAkJcmVzdWx0LnNldE1vZGlmaWVycyhnZXRNb2RpZmllcnMoKSk7CiAJCXJlc3VsdC5zZXRUeXBlKChUeXBlKSBnZXRUeXBlKCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJlc3VsdC5mcmFnbWVudHMoKS5hZGRBbGwoCkBAIC0xNTcsNyArMTU4LDkgQEAKIAlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogCQlpZiAoYmFzZVR5cGUgPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRUeXBlKGdldEFTVCgpLm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKKwkJCWdldEFTVCgpLnNldE1vZGlmaWNhdGlvbkNvdW50KGNvdW50KTsKIAkJfQogCQlyZXR1cm4gYmFzZVR5cGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaGlsZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9XaGlsZVN0YXRlbWVudC5qYXZhCmluZGV4IDY3ZThlMWYuLmM2ZWNiMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2RvbS9vcmcvZWNsaXBzZS9qZHQvY29yZS9kb20vV2hpbGVTdGF0ZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL1doaWxlU3RhdGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbTsKIApAQCAtNjEsNyArNjEsOCBAQAogCSAqLwogCUFTVE5vZGUgY2xvbmUoQVNUIHRhcmdldCkgewogCQlXaGlsZVN0YXRlbWVudCByZXN1bHQgPSBuZXcgV2hpbGVTdGF0ZW1lbnQodGFyZ2V0KTsKLQkJcmVzdWx0LnNldExlYWRpbmdDb21tZW50KGdldExlYWRpbmdDb21tZW50KCkpOworCQlyZXN1bHQuc2V0U291cmNlUmFuZ2UodGhpcy5nZXRTdGFydFBvc2l0aW9uKCksIHRoaXMuZ2V0TGVuZ3RoKCkpOworCQlyZXN1bHQuY29weUxlYWRpbmdDb21tZW50KHRoaXMpOwogCQlyZXN1bHQuc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZ2V0RXhwcmVzc2lvbigpLmNsb25lKHRhcmdldCkpOwogCQlyZXN1bHQuc2V0Qm9keSgoU3RhdGVtZW50KSBnZXRCb2R5KCkuY2xvbmUodGFyZ2V0KSk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC05Niw3ICs5Nyw5IEBACiAJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJLy8gbGF6eSBpbml0aWFsaXplIC0gdXNlIHNldHRlciB0byBlbnN1cmUgcGFyZW50IGxpbmsgc2V0IHRvbworCQkJbG9uZyBjb3VudCA9IGdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCQlzZXRFeHByZXNzaW9uKG5ldyBTaW1wbGVOYW1lKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGV4cHJlc3Npb247CiAJfQpAQCAtMTI5LDcgKzEzMiw5IEBACiAJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgewogCQlpZiAoYm9keSA9PSBudWxsKSB7CiAJCQkvLyBsYXp5IGluaXRpYWxpemUgLSB1c2Ugc2V0dGVyIHRvIGVuc3VyZSBwYXJlbnQgbGluayBzZXQgdG9vCisJCQlsb25nIGNvdW50ID0gZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJCXNldEJvZHkobmV3IEJsb2NrKGdldEFTVCgpKSk7CisJCQlnZXRBU1QoKS5zZXRNb2RpZmljYXRpb25Db3VudChjb3VudCk7CiAJCX0KIAkJcmV0dXJuIGJvZHk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZG9tL29yZy9lY2xpcHNlL2pkdC9jb3JlL2RvbS9wYWNrYWdlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3BhY2thZ2UuaHRtbAppbmRleCBiYzA4NmRiLi5iNWQzZjY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3BhY2thZ2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9kb20vb3JnL2VjbGlwc2UvamR0L2NvcmUvZG9tL3BhY2thZ2UuaHRtbApAQCAtNywxMyArNywxNyBAQAogICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KLVRoZSBKYXZhIERPTSBpcyB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBtb2RlbCBKYXZhIHByb2dyYW0gYXMgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgorVGhlIEphdmEgRE9NIGlzIHRoZSBzZXQgb2YgY2xhc3NlcyB0aGF0IG1vZGVsIHRoZSBzb3VyY2UgY29kZSBvZiBhIEphdmEgcHJvZ3JhbQorYXMgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgogCiA8aDI+CiBQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgogCi08cD48YnI+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIERPTSBjbGFzc2VzLiBBbiBBUEkgZm9yIG1hbmlwdWxhdGluZyBhIEphdmEgcHJvZ3JhbSAKLWFzIGEgc3RydWN0dXJlZCBkb2N1bWVudC4gSW4gcGFydGljdWxhciwgaXQgcHJvdmlkZXMgYSBmdWxsIGFic3RyYWN0IHN5bnRheCB0cmVlLCB3aGljaCAKLWNhbiBiZSBxdWVyaWVkIGZvciByZXNvbHZlZCB0eXBlIGluZm9ybWF0aW9uLCBhbmQgbW9kaWZpZWQuCis8cD48YnI+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIERPTSBjbGFzc2VzLiBBbiBBUEkgZm9yIG1hbmlwdWxhdGluZyB0aGUKK3NvdXJjZSBjb2RlIG9mIGEgSmF2YSBwcm9ncmFtIGFzIGEgc3RydWN0dXJlZCBkb2N1bWVudC4gSW4gcGFydGljdWxhciwgaXQgcHJvdmlkZXMKK2EgZnVsbCBhYnN0cmFjdCBzeW50YXggdHJlZSBmb3IgYSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQsIHdoaWNoIGNhbiBiZSBxdWVyaWVkIGZvcgorcmVzb2x2ZWQgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIG1vZGlmaWVkLiAKK1RoZSBwcmluY2lwYWwgY2xhc3NlcyBhcmUge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QgQVNUfQorYW5kIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZSBBU1ROb2RlfS4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRBbGxvY2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKaW5kZXggNWNjMzM0Zi4uZThiODExMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEFsbG9jYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWxsb2NhdGlvbkV4cHJlc3Npb247CkBAIC00NiwxMyArNDYsMTMgQEAKIAkJLy8gYmV0dGVyIGhpZ2hsaWdodCBmb3IgYWxsb2NhdGlvbjogZGlzcGxheSB0aGUgdHlwZSBpbmRpdmlkdWFsbHkKIAkJY29kZVN0cmVhbS5yZWNvcmRQb3NpdGlvbnNGcm9tKHBjLCB0eXBlLnNvdXJjZVN0YXJ0KTsKIAotCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24KKwkJLy8gaGFuZGxpbmcgaW5uZXJjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uIC0gZW5jbG9zaW5nIGluc3RhbmNlIGFyZ3VtZW50cwogCQlpZiAoYWxsb2NhdGVkVHlwZS5pc05lc3RlZFR5cGUoKSkgewotCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0FyZ3VtZW50VmFsdWVzKAotCQkJCWN1cnJlbnRTY29wZSwgCi0JCQkJYWxsb2NhdGVkVHlwZSwgCi0JCQkJZW5jbG9zaW5nSW5zdGFuY2UoKSwgCi0JCQkJdGhpcyk7IAorCQkJY29kZVN0cmVhbS5nZW5lcmF0ZVN5bnRoZXRpY0VuY2xvc2luZ0luc3RhbmNlVmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCWVuY2xvc2luZ0luc3RhbmNlKCksCisJCQkJdGhpcyk7CiAJCX0KIAkJLy8gZ2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IKIAkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CkBAIC02MCw2ICs2MCwxMyBAQAogCQkJCWFyZ3VtZW50c1tpXS5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKIAkJCX0KIAkJfQorCQkvLyBoYW5kbGluZyBpbm5lcmNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gLSBvdXRlciBsb2NhbCBhcmd1bWVudHMKKwkJaWYgKGFsbG9jYXRlZFR5cGUuaXNOZXN0ZWRUeXBlKCkpIHsKKwkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVTeW50aGV0aWNPdXRlckFyZ3VtZW50VmFsdWVzKAorCQkJCWN1cnJlbnRTY29wZSwKKwkJCQlhbGxvY2F0ZWRUeXBlLAorCQkJCXRoaXMpOworCQl9CiAJCS8vIGludm9rZSBjb25zdHJ1Y3RvcgogCQljb2RlU3RyZWFtLmludm9rZXNwZWNpYWwoYmluZGluZyk7CiAJfSBlbHNlIHsKQEAgLTEwNyw3ICsxMTQsNyBAQAogcHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHsKIAkvLyBQcm9wYWdhdGUgdGhlIHR5cGUgY2hlY2tpbmcgdG8gdGhlIGFyZ3VtZW50cywgYW5kIGNoZWNrIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkLgogCWNvbnN0YW50ID0gTm90QUNvbnN0YW50OwotCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlVHlwZShzY29wZSk7IC8vIHdpbGwgY2hlY2sgZm9yIG51bGwgYWZ0ZXIgYXJncyBhcmUgcmVzb2x2ZWQKKwl0aGlzLnJlc29sdmVkVHlwZSA9IHR5cGUucmVzb2x2ZVR5cGUoc2NvcGUpOyAvLyB3aWxsIGNoZWNrIGZvciBudWxsIGFmdGVyIGFyZ3MgYXJlIHJlc29sdmVkCiAKIAkvLyBidWZmZXJpbmcgdGhlIGFyZ3VtZW50cycgdHlwZXMKIAlUeXBlQmluZGluZ1tdIGFyZ3VtZW50VHlwZXMgPSBOb1BhcmFtZXRlcnM7CkBAIC0xMTksMTYgKzEyNiwxNiBAQAogCQkJaWYgKChhcmd1bWVudFR5cGVzW2ldID0gYXJndW1lbnRzW2ldLnJlc29sdmVUeXBlKHNjb3BlKSkgPT0gbnVsbCkKIAkJCQlhcmdIYXNFcnJvciA9IHRydWU7CiAJCWlmIChhcmdIYXNFcnJvcikKLQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JaWYgKHR5cGVCaW5kaW5nID09IG51bGwpCisJaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09IG51bGwpCiAJCXJldHVybiBudWxsOwogCi0JaWYgKCF0eXBlQmluZGluZy5jYW5CZUluc3RhbnRpYXRlZCgpKSB7Ci0JCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmNhbm5vdEluc3RhbnRpYXRlKHR5cGUsIHR5cGVCaW5kaW5nKTsKLQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCWlmICghdGhpcy5yZXNvbHZlZFR5cGUuY2FuQmVJbnN0YW50aWF0ZWQoKSkgeworCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RJbnN0YW50aWF0ZSh0eXBlLCB0aGlzLnJlc29sdmVkVHlwZSk7CisJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAl9Ci0JUmVmZXJlbmNlQmluZGluZyBhbGxvY2F0ZWRUeXBlID0gKFJlZmVyZW5jZUJpbmRpbmcpIHR5cGVCaW5kaW5nOworCVJlZmVyZW5jZUJpbmRpbmcgYWxsb2NhdGVkVHlwZSA9IChSZWZlcmVuY2VCaW5kaW5nKSB0aGlzLnJlc29sdmVkVHlwZTsKIAlpZiAoIShiaW5kaW5nID0gc2NvcGUuZ2V0Q29uc3RydWN0b3IoYWxsb2NhdGVkVHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcykpLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtTWV0aG9kQmluZGluZwogCQkJJiYgKChQcm9ibGVtTWV0aG9kQmluZGluZykgYmluZGluZykucHJvYmxlbUlkKCkgPT0gTm90VmlzaWJsZSkgewpAQCAtMTM4LDEzICsxNDUsMTMgQEAKIAkJCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKIAkJCQkJCWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPSBhbGxvY2F0ZWRUeXBlOwogCQkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7Ci0JCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCQkJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKIAkJCQkJYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9IGFsbG9jYXRlZFR5cGU7CiAJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZENvbnN0cnVjdG9yKHRoaXMsIGJpbmRpbmcpOwotCQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCQlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGU7CiAJCQl9CiAJCQlDb2RlU25pcHBldFNjb3BlIGxvY2FsU2NvcGUgPSBuZXcgQ29kZVNuaXBwZXRTY29wZShzY29wZSk7CQkJCiAJCQlNZXRob2RCaW5kaW5nIHByaXZhdGVCaW5kaW5nID0gbG9jYWxTY29wZS5nZXRDb25zdHJ1Y3RvcigoUmVmZXJlbmNlQmluZGluZylkZWxlZ2F0ZVRoaXMudHlwZSwgYXJndW1lbnRUeXBlcywgdGhpcyk7CkBAIC0xNTIsNyArMTU5LDcgQEAKIAkJCQlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyA9PSBudWxsKQogCQkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGVkVHlwZTsKIAkJCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5pbnZhbGlkQ29uc3RydWN0b3IodGhpcywgYmluZGluZyk7Ci0JCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJCX0gZWxzZSB7CiAJCQkJYmluZGluZyA9IHByaXZhdGVCaW5kaW5nOwogCQkJfQkJCQkKQEAgLTE2MCw3ICsxNjcsNyBAQAogCQkJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkKIAkJCQliaW5kaW5nLmRlY2xhcmluZ0NsYXNzID0gYWxsb2NhdGVkVHlwZTsKIAkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmludmFsaWRDb25zdHJ1Y3Rvcih0aGlzLCBiaW5kaW5nKTsKLQkJCXJldHVybiB0eXBlQmluZGluZzsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZTsKIAkJfQogCX0KIAlpZiAoaXNNZXRob2RVc2VEZXByZWNhdGVkKGJpbmRpbmcsIHNjb3BlKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDbGFzc0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDbGFzc0ZpbGUuamF2YQppbmRleCA4NWU5Y2I5Li4xYzRiMzE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q2xhc3NGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENsYXNzRmlsZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKQEAgLTE4LDcgKzE4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZzsKQEAgLTg2LDE2ICs4NSw2IEBACiAJYWNjZXNzRmxhZ3MgJj0gfkFjY1N0cmljdGZwOwogCiAJdGhpcy5lbmNsb3NpbmdDbGFzc0ZpbGUgPSBlbmNsb3NpbmdDbGFzc0ZpbGU7Ci0JLy8gaW5uZXJjbGFzc2VzIGdldCB0aGVpciBuYW1lcyBjb21wdXRlZCBhdCBjb2RlIGdlbiB0aW1lCi0JaWYgKGFUeXBlLmlzTG9jYWxUeXBlKCkpIHsKLQkJKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkuY29uc3RhbnRQb29sTmFtZSgKLQkJCWNvbXB1dGVDb25zdGFudFBvb2xOYW1lKChMb2NhbFR5cGVCaW5kaW5nKSBhVHlwZSkpOwotCQlSZWZlcmVuY2VCaW5kaW5nW10gbWVtYmVyVHlwZXMgPSBhVHlwZS5tZW1iZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVyVHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCSgoTG9jYWxUeXBlQmluZGluZykgbWVtYmVyVHlwZXNbaV0pLmNvbnN0YW50UG9vbE5hbWUoCi0JCQkJY29tcHV0ZUNvbnN0YW50UG9vbE5hbWUoKExvY2FsVHlwZUJpbmRpbmcpIG1lbWJlclR5cGVzW2ldKSk7Ci0JCX0KLQl9CiAJY29udGVudHMgPSBuZXcgYnl0ZVtJTklUSUFMX0NPTlRFTlRTX1NJWkVdOwogCS8vIG5vdyB3ZSBjb250aW51ZSB0byBnZW5lcmF0ZSB0aGUgYnl0ZXMgaW5zaWRlIHRoZSBjb250ZW50cyBhcnJheQogCWNvbnRlbnRzW2NvbnRlbnRzT2Zmc2V0KytdID0gKGJ5dGUpIChhY2Nlc3NGbGFncyA+PiA4KTsKQEAgLTE2Miw3ICsxNTEsNyBAQAogCWlmICgoZmllbGRzICE9IG51bGwpICYmIChmaWVsZHMgIT0gTm9GaWVsZHMpKSB7CiAJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJCWlmIChmaWVsZHNbaV0uY29uc3RhbnQgPT0gbnVsbCkgewotCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkc1tpXSwgZmFsc2UsIG51bGwsIG51bGwsIDApOworCQkJCUZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkc1tpXSwgbnVsbCwgZmFsc2UsIG51bGwpOwogCQkJfQogCQl9CiAJCWNsYXNzRmlsZS5hZGRGaWVsZEluZm9zKCk7CkBAIC0xNzgsNyArMTY3LDcgQEAKIAlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uW10gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLm1ldGhvZHM7CiAJaW50IG1heE1ldGhvZERlY2wgPSBtZXRob2REZWNsYXJhdGlvbnMgPT0gbnVsbCA/IDAgOiBtZXRob2REZWNsYXJhdGlvbnMubGVuZ3RoOwogCWludCBwcm9ibGVtc0xlbmd0aDsKLQlJUHJvYmxlbVtdIHByb2JsZW1zID0gdW5pdFJlc3VsdC5nZXRQcm9ibGVtcygpOworCUlQcm9ibGVtW10gcHJvYmxlbXMgPSB1bml0UmVzdWx0LmdldEVycm9ycygpOwogCWlmIChwcm9ibGVtcyA9PSBudWxsKSB7CiAJCXByb2JsZW1zID0gbmV3IElQcm9ibGVtWzBdOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb2RlU3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29kZVN0cmVhbS5qYXZhCmluZGV4IDJjMDU1YmYuLmM5NjcyM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb2RlU3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvZGVTdHJlYW0uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29kZVN0cmVhbTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb21waWxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEKaW5kZXggNDQxMDdhYS4uNzJjYWZjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbXBpbGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNywyNiArMTcsMzQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogCiAvKioKICAqIEEgY29tcGlsZXIgdGhhdCBjb21waWxlcyBjb2RlIHNuaXBwZXRzLiAKICAqLwogcHVibGljIGNsYXNzIENvZGVTbmlwcGV0Q29tcGlsZXIgZXh0ZW5kcyBDb21waWxlciB7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IGNvbXBpbGVyIGluaXRpYWxpemVkIHdpdGggYSBjb2RlIHNuaXBwZXQgcGFyc2VyLgotICovCi1wdWJsaWMgQ29kZVNuaXBwZXRDb21waWxlcigKLQkJSU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgCi0JCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSwgCi0JCU1hcCBzZXR0aW5ncywgCi0JCUlDb21waWxlclJlcXVlc3RvciByZXF1ZXN0b3IsIAorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IGNvbXBpbGVyIGluaXRpYWxpemVkIHdpdGggYSBjb2RlIHNuaXBwZXQgcGFyc2VyLgorCSAqLworCXB1YmxpYyBDb2RlU25pcHBldENvbXBpbGVyKAorCQlJTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LAorCQlJRXJyb3JIYW5kbGluZ1BvbGljeSBwb2xpY3ksCisJCU1hcCBzZXR0aW5ncywKKwkJSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciwKIAkJSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5LAogCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCwKIAkJaW50IGNvZGVTbmlwcGV0U3RhcnQsCiAJCWludCBjb2RlU25pcHBldEVuZCkgewotCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIHNldHRpbmdzLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsKLQl0aGlzLnBhcnNlciA9IAotCQluZXcgQ29kZVNuaXBwZXRQYXJzZXIocHJvYmxlbVJlcG9ydGVyLCBldmFsdWF0aW9uQ29udGV4dCwgdGhpcy5vcHRpb25zLnBhcnNlTGl0ZXJhbEV4cHJlc3Npb25zQXNDb25zdGFudHMsIHRoaXMub3B0aW9ucy5hc3NlcnRNb2RlLCBjb2RlU25pcHBldFN0YXJ0LCBjb2RlU25pcHBldEVuZCk7Ci0JdGhpcy5wYXJzZVRocmVzaG9sZCA9IDE7IC8vIGZ1bGx5IHBhcnNlIG9ubHkgdGhlIGNvZGUgc25pcHBldCBjb21waWxhdGlvbiB1bml0Ci19CisJCXN1cGVyKGVudmlyb25tZW50LCBwb2xpY3ksIHNldHRpbmdzLCByZXF1ZXN0b3IsIHByb2JsZW1GYWN0b3J5KTsKKwkJdGhpcy5wYXJzZXIgPQorCQkJbmV3IENvZGVTbmlwcGV0UGFyc2VyKAorCQkJCXByb2JsZW1SZXBvcnRlciwKKwkJCQlldmFsdWF0aW9uQ29udGV4dCwKKwkJCQl0aGlzLm9wdGlvbnMucGFyc2VMaXRlcmFsRXhwcmVzc2lvbnNBc0NvbnN0YW50cywKKwkJCQl0aGlzLm9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCwKKwkJCQljb2RlU25pcHBldFN0YXJ0LAorCQkJCWNvZGVTbmlwcGV0RW5kKTsKKwkJdGhpcy5wYXJzZVRocmVzaG9sZCA9IDE7CisJCS8vIGZ1bGx5IHBhcnNlIG9ubHkgdGhlIGNvZGUgc25pcHBldCBjb21waWxhdGlvbiB1bml0CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbnN0YW50UG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldENvbnN0YW50UG9vbC5qYXZhCmluZGV4IDJhOTE4M2QuLmVkYTIxMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRDb25zdGFudFBvb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0Q29uc3RhbnRQb29sLmphdmEKQEAgLTEsMjIgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNvZGVnZW4uQ29uc3RhbnRQb29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQXJyYXlCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKiBUaGlzIGNvbnN0YW50IHBvb2wgaXMgdXNlZCB0byBtYW5hZ2Ugd2VsbCBrbm93biBtZXRob2RzIGFuZCBmaWVsZHMgcmVsYXRlZCBzcGVjaWZpY2FsbHkgdG8gdGhlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFbnZpcm9ubWVudC5qYXZhCmluZGV4IDExNjE5YTguLmNmMTM0YTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFbnZpcm9ubWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFbnZpcm9ubWVudC5qYXZhCkBAIC0xLDIyICsxLDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKiBBbiBlbnZpcm9ubWVudCB0aGF0IHdyYXBzIHRoZSBjbGllbnQncyBuYW1lIGVudmlyb25tZW50LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEV2YWx1YXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEV2YWx1YXRvci5qYXZhCmluZGV4IDYyYWM0ZjYuLjIwNTBkNzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRFdmFsdWF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RXZhbHVhdG9yLmphdmEKQEAgLTEsMTcgKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOwpAQCAtMjIsNyArMjMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEEgY29kZSBzbmlwcGV0IGV2YWx1YXRvciBjb21waWxlcyBhbmQgcmV0dXJucyBjbGFzcyBmaWxlIGZvciBhIGNvZGUgc25pcHBldC4KQEAgLTEwNCw3ICsxMDQsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5FdmFsdWF0b3IKICAqLwogcHJvdGVjdGVkIGNoYXJbXSBnZXRDbGFzc05hbWUoKSB7Ci0JcmV0dXJuIENoYXJPcGVyYXRpb24uY29uY2F0KENPREVfU05JUFBFVF9DTEFTU19OQU1FX1BSRUZJWCwgSW50ZWdlci50b1N0cmluZyh0aGlzLmNvbnRleHQuQ09ERV9TTklQUEVUX0NPVU5URVIgKyAxKS50b0NoYXJBcnJheSgpKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQoQ09ERV9TTklQUEVUX0NMQVNTX05BTUVfUFJFRklYLCBJbnRlZ2VyLnRvU3RyaW5nKEV2YWx1YXRpb25Db250ZXh0LkNPREVfU05JUFBFVF9DT1VOVEVSICsgMSkudG9DaGFyQXJyYXkoKSk7CiB9CiAvKioKICAqIEBzZWUgRXZhbHVhdG9yLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldEZpZWxkUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YQppbmRleCAyMDg4MzNhLi5iZjkxNzllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0RmllbGRSZWZlcmVuY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzaWdubWVudDsKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkludExpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UaGlzUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jb2RlZ2VuLkNvZGVTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKQEAgLTcyLDYgKzcxLDcgQEAKICAqIEBwYXJhbSB2YWx1ZVJlcXVpcmVkIGJvb2xlYW4KICAqLwogcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgeworCiAJaW50IHBjID0gY29kZVN0cmVhbS5wb3NpdGlvbjsKIAlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CiAJCWlmICh2YWx1ZVJlcXVpcmVkKSB7CkBAIC03OSw3ICs3OSw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlib29sZWFuIGlzU3RhdGljID0gdGhpcy5jb2RlZ2VuQmluZGluZy5pc1N0YXRpYygpOwotCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB2YWx1ZVJlcXVpcmVkICYmICghaXNTdGF0aWMpICYmICh0aGlzLmNvZGVnZW5CaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudCkpOworCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOwogCQlpZiAodmFsdWVSZXF1aXJlZCkgewogCQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuY29uc3RhbnQgPT0gTm90QUNvbnN0YW50KSB7CiAJCQkJaWYgKHRoaXMuY29kZWdlbkJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgPT0gbnVsbCkgeyAvLyBhcnJheSBsZW5ndGgKQEAgLTEwMSwxMiArMTAxLDIyIEBACiAJCQkJfQogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0gZWxzZSB7CisJCQkJaWYgKCFpc1N0YXRpYykgeworCQkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCQljb2RlU3RyZWFtLnBvcCgpOworCQkJCX0KIAkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQodGhpcy5jb2RlZ2VuQmluZGluZy5jb25zdGFudCwgaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghaXNTdGF0aWMpeworCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCisJCQkJY29kZVN0cmVhbS5wb3AoKTsKKwkJCX0KIAkJfQogCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogfQorCiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbXBvdW5kQXNzaWdubWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBvcGVyYXRvciwgaW50IGFzc2lnbm1lbnRJbXBsaWNpdENvbnZlcnNpb24sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewogCQogCWJvb2xlYW4gaXNTdGF0aWM7CkBAIC0yNzQsMTIgKzI4NCwxMiBAQAogCiAJLy8gaWYgdGhlIGJpbmRpbmcgZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCB2aXNpYmxlLCBuZWVkIHNwZWNpYWwgYWN0aW9uCiAJLy8gZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBvbiAxLjIgVk1zIDogY2hhbmdlIHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgdGhlIGJpbmRpbmcKLQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCS8vIE5PVEU6IGZyb20gdGFyZ2V0IDEuMiBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQogCWlmIChiaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IHRoaXMucmVjZWl2ZXJUeXBlCiAJCSYmICF0aGlzLnJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCiAJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCAvLyBhcnJheS5sZW5ndGgKIAkJJiYgYmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKLQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80CisJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMgogCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpIC8vbm8gY2hhbmdlIGZvciBPYmplY3QgZmllbGRzIChpbiBjYXNlIHRoZXJlIHdhcykKIAkJCXx8ICFiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKXsKIAkJCXRoaXMuY29kZWdlbkJpbmRpbmcgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmdldFVwZGF0ZWRGaWVsZEJpbmRpbmcoYmluZGluZywgKFJlZmVyZW5jZUJpbmRpbmcpIHRoaXMucmVjZWl2ZXJUeXBlKTsKQEAgLTI5MywxMiArMzAzLDEyIEBACiAKIAkvLyBpZiB0aGUgYmluZGluZyBkZWNsYXJpbmcgY2xhc3MgaXMgbm90IHZpc2libGUsIG5lZWQgc3BlY2lhbCBhY3Rpb24KIAkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCS8vIE5PVEU6IGZyb20gMS40IG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBmaWVsZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCiAJaWYgKGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gdGhpcy5yZWNlaXZlclR5cGUKIAkJJiYgIXRoaXMucmVjZWl2ZXJUeXBlLmlzQXJyYXlUeXBlKCkKIAkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSBudWxsIC8vIGFycmF5Lmxlbmd0aAogCQkmJiBiaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAotCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMuY29tcGxpYW5jZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQKKwkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLnRhcmdldEpESyA+PSBDb21waWxlck9wdGlvbnMuSkRLMV8yCiAJCQkJJiYgYmluZGluZy5kZWNsYXJpbmdDbGFzcy5pZCAhPSBUX09iamVjdCkgLy9ubyBjaGFuZ2UgZm9yIE9iamVjdCBmaWVsZHMgKGluIGNhc2UgdGhlcmUgd2FzKQogCQkJfHwgIWJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuY2FuQmVTZWVuQnkoY3VycmVudFNjb3BlKSkpewogCQkJdGhpcy5jb2RlZ2VuQmluZGluZyA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZ2V0VXBkYXRlZEZpZWxkQmluZGluZyhiaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5yZWNlaXZlclR5cGUpOwpAQCAtMzUzLDEwICszNjMsMTAgQEAKIAkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZGVwcmVjYXRlZEZpZWxkKGJpbmRpbmcsIHRoaXMpOwogCiAJLy8gY2hlY2sgZm9yIHRoaXMueCBpbiBzdGF0aWMgaXMgZG9uZSBpbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVjZWl2ZXIKLQljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGJpbmRpbmcsIHJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0LCB0aGlzLCBzY29wZSwgMCk7CisJY29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihiaW5kaW5nLCB0aGlzLCByZWNlaXZlci5pc0ltcGxpY2l0VGhpcygpLCBzY29wZSk7CiAJaWYgKCFyZWNlaXZlci5pc1RoaXMoKSkKIAkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7CiAKLQlyZXR1cm4gYmluZGluZy50eXBlOworCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGJpbmRpbmcudHlwZTsKIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRNZXNzYWdlU2VuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldE1lc3NhZ2VTZW5kLmphdmEKaW5kZXggYWFiNGE4Ny4uY2Q5MDFiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldE1lc3NhZ2VTZW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldE1lc3NhZ2VTZW5kLmphdmEKQEAgLTEsMTggKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWVzc2FnZVNlbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5OYW1lUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVGhpc1JlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY29kZWdlbi5Db2RlU3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkFycmF5QmluZGluZzsKQEAgLTU0LDE1ICs1MywxMyBAQAogCQkvLyBvdXRlciBhY2Nlc3MgPwogCQlpZiAoIWlzU3RhdGljICYmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkpIHsKIAkJCS8vIG91dGVyIG1ldGhvZCBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIGVtdWxhdGlvbgotCQkJT2JqZWN0W10gcGF0aCA9Ci0JCQkJY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aCgKLQkJCQkJY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoCi0JCQkJCQkoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOworCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOworCQkJT2JqZWN0W10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwogCQkJaWYgKHBhdGggPT0gbnVsbCkgewogCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQogCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKIAkJCX0gZWxzZSB7Ci0JCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7CisJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlyZWNlaXZlci5nZW5lcmF0ZUNvZGUoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCAhaXNTdGF0aWMpOwpAQCAtMTY0LDEyICsxNjEsMTIgQEAKIAogCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgogCS8vIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHkgb24gMS4yIFZNcyA6IGNoYW5nZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIHRoZSBiaW5kaW5nCi0JLy8gTk9URTogZnJvbSAxLjQgb24sIG1ldGhvZCdzIGRlY2xhcmluZyBjbGFzcyBpcyB0b3VjaGVkIGlmIGFueSBkaWZmZXJlbnQgZnJvbSByZWNlaXZlciB0eXBlCisJLy8gTk9URTogZnJvbSB0YXJnZXQgMS4yIG9uLCBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQogCS8vIGFuZCBub3QgZnJvbSBPYmplY3Qgb3IgaW1wbGljaXQgc3RhdGljIG1ldGhvZCBjYWxsLgkKIAlpZiAoYmluZGluZy5kZWNsYXJpbmdDbGFzcyAhPSB0aGlzLnF1YWxpZnlpbmdUeXBlCiAJCSYmICF0aGlzLnF1YWxpZnlpbmdUeXBlLmlzQXJyYXlUeXBlKCkKLQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80Ci0JCQkJJiYgKHJlY2VpdmVyICE9IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0IHx8ICFiaW5kaW5nLmlzU3RhdGljKCkpCisJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy50YXJnZXRKREsgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfMgorCQkJCSYmICghcmVjZWl2ZXIuaXNJbXBsaWNpdFRoaXMoKSB8fCAhYmluZGluZy5pc1N0YXRpYygpKQogCQkJCSYmIGJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MuaWQgIT0gVF9PYmplY3QpIC8vIG5vIGNoYW5nZSBmb3IgT2JqZWN0IG1ldGhvZHMKIAkJCXx8ICFiaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmNhbkJlU2VlbkJ5KGN1cnJlbnRTY29wZSkpKSB7CiAJCWNvZGVnZW5CaW5kaW5nID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5nZXRVcGRhdGVkTWV0aG9kQmluZGluZyhiaW5kaW5nLCAoUmVmZXJlbmNlQmluZGluZykgdGhpcy5xdWFsaWZ5aW5nVHlwZSk7CkBAIC0yMDMsNyArMjAwLDcgQEAKIAl9CiAKIAliaW5kaW5nID0gCi0JCXJlY2VpdmVyID09IFRoaXNSZWZlcmVuY2UuVGhpc0ltcGxpY2l0CisJCXJlY2VpdmVyLmlzSW1wbGljaXRUaGlzKCkKIAkJCT8gc2NvcGUuZ2V0SW1wbGljaXRNZXRob2Qoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIHRoaXMpCiAJCQk6IHNjb3BlLmdldE1ldGhvZChyZWNlaXZlclR5cGUsIHNlbGVjdG9yLCBhcmd1bWVudFR5cGVzLCB0aGlzKTsgCiAJaWYgKCFiaW5kaW5nLmlzVmFsaWRCaW5kaW5nKCkpIHsKQEAgLTI3Nyw2ICsyNzQsNiBAQAogCWlmIChpc01ldGhvZFVzZURlcHJlY2F0ZWQoYmluZGluZywgc2NvcGUpKQogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkTWV0aG9kKGJpbmRpbmcsIHRoaXMpOwogCi0JcmV0dXJuIGJpbmRpbmcucmV0dXJuVHlwZTsKKwlyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBiaW5kaW5nLnJldHVyblR5cGU7CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UGFyc2VyLmphdmEKaW5kZXggMDk3OGUxZC4uMzczYTRlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRQYXJzZXIuamF2YQpAQCAtMSwyMSArMSwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogLyoqCiAgKiBBIHBhcnNlciBmb3IgY29kZSBzbmlwcGV0cy4KQEAgLTc5LDggKzgwLDggQEAKIAkJYXN0UHRyLS07CiAJCWFzdExlbmd0aFB0ci0tOwogCi0JCS8vIG1hcmsgZmllbGRzIGFuZCBpbml0aWFsaXplciB3aXRoIGxvY2FsIHR5cGUgbWFyayBpZiBuZWVkZWQKLQkJbWFya0ZpZWxkc1dpdGhMb2NhbFR5cGUoYW5vbnltb3VzVHlwZURlY2xhcmF0aW9uKTsKKwkJLy8gbWFyayBpbml0aWFsaXplcnMgd2l0aCBsb2NhbCB0eXBlIG1hcmsgaWYgbmVlZGVkCisJCW1hcmtJbml0aWFsaXplcnNXaXRoTG9jYWxUeXBlKGFub255bW91c1R5cGVEZWNsYXJhdGlvbik7CiAJfQogfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZUNsYXNzRGVjbGFyYXRpb24oKSB7CkBAIC0xMDAsNyArMTAxLDcgQEAKIAl9IGVsc2UgewogCQkvLyBSZWNvcmQgdGhhdCB0aGUgYmxvY2sgaGFzIGEgZGVjbGFyYXRpb24gZm9yIGxvY2FsIHR5cGVzCiAJCXR5cGVEZWNsID0gbmV3IExvY2FsVHlwZURlY2xhcmF0aW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJbWFya0N1cnJlbnRNZXRob2RXaXRoTG9jYWxUeXBlKCk7CisJCW1hcmtFbmNsb3NpbmdNZW1iZXJXaXRoTG9jYWxUeXBlKCk7CiAJCWJsb2NrUmVhbCgpOwogCX0KIApAQCAtMTc4LDcgKzE3OSw3IEBACiAJfSBlbHNlIHsKIAkJLy8gUmVjb3JkIHRoYXQgdGhlIGJsb2NrIGhhcyBhIGRlY2xhcmF0aW9uIGZvciBsb2NhbCB0eXBlcwogCQl0eXBlRGVjbCA9IG5ldyBMb2NhbFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21waWxhdGlvblJlc3VsdCk7Ci0JCW1hcmtDdXJyZW50TWV0aG9kV2l0aExvY2FsVHlwZSgpOyAKKwkJbWFya0VuY2xvc2luZ01lbWJlcldpdGhMb2NhbFR5cGUoKTsgCiAJCWJsb2NrUmVhbCgpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRRdWFsaWZpZWROYW1lUmVmZXJlbmNlLmphdmEKaW5kZXggNjcwMjkxMS4uZjYzMmI3MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFF1YWxpZmllZE5hbWVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CkBAIC01Niw3ICs1Niw4IEBACiAJcmV0dXJuIGdldE90aGVyRmllbGRCaW5kaW5ncyhzY29wZSk7CiB9CiBwdWJsaWMgdm9pZCBnZW5lcmF0ZUFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKLQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCisJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkvLyB0aGUgbGFzdCBmaWVsZCBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKIAkJYXNzaWdubWVudC5leHByZXNzaW9uLmdlbmVyYXRlQ29kZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOwpAQCAtODUsMTMgKzg2LDE3IEBACiAJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQoY29uc3RhbnQsIGltcGxpY2l0Q29udmVyc2lvbik7CiAJCX0KIAl9IGVsc2UgewotCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHZhbHVlUmVxdWlyZWQpOworCQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOyAKIAkJaWYgKHZhbHVlUmVxdWlyZWQpIHsKIAkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzID09IG51bGwpIHsgLy8gYXJyYXkgbGVuZ3RoCiAJCQkJY29kZVN0cmVhbS5hcnJheWxlbmd0aCgpOwogCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVJbXBsaWNpdENvbnZlcnNpb24oaW1wbGljaXRDb252ZXJzaW9uKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KSB7CisJCQkJCWlmICghbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKKwkJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsKKwkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCX0KIAkJCQkJLy8gaW5saW5lIHRoZSBsYXN0IGZpZWxkIGNvbnN0YW50CiAJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50LCBpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0gZWxzZSB7CQpAQCAtMTA3LDEzICsxMTIsMTggQEAKIAkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUltcGxpY2l0Q29udmVyc2lvbihpbXBsaWNpdENvbnZlcnNpb24pOwogCQkJCX0KIAkJCX0KLQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcgIT0gbnVsbCAmJiAhbGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKXsKKwkJCQljb2RlU3RyZWFtLmludm9rZU9iamVjdEdldENsYXNzKCk7IC8vIHBlcmZvcm0gbnVsbCBjaGVjaworCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQl9CisJCX0JCQogCX0KIAljb2RlU3RyZWFtLnJlY29yZFBvc2l0aW9uc0Zyb20ocGMsIHRoaXMuc291cmNlU3RhcnQpOwogfQogcHVibGljIHZvaWQgZ2VuZXJhdGVDb21wb3VuZEFzc2lnbm1lbnQoQmxvY2tTY29wZSBjdXJyZW50U2NvcGUsIENvZGVTdHJlYW0gY29kZVN0cmVhbSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgb3BlcmF0b3IsIGludCBhc3NpZ25tZW50SW1wbGljaXRDb252ZXJzaW9uLCBib29sZWFuIHZhbHVlUmVxdWlyZWQpIHsKIAkKLQlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0sIHRydWUpOworCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSk7CiAJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKIAkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CiAJCQljb2RlU3RyZWFtLmdldHN0YXRpYyhsYXN0RmllbGRCaW5kaW5nKTsKQEAgLTE5Myw3ICsyMDMsNyBAQAogCX0KIH0KIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9zdEluY3JlbWVudChCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtLCBDb21wb3VuZEFzc2lnbm1lbnQgcG9zdEluY3JlbWVudCwgYm9vbGVhbiB2YWx1ZVJlcXVpcmVkKSB7Ci0JZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtLCB0cnVlKTsKKwlnZW5lcmF0ZVJlYWRTZXF1ZW5jZShjdXJyZW50U2NvcGUsIGNvZGVTdHJlYW0pOwogCiAJaWYgKGxhc3RGaWVsZEJpbmRpbmcuY2FuQmVTZWVuQnkoZ2V0UmVjZWl2ZXJUeXBlKGN1cnJlbnRTY29wZSksIHRoaXMsIGN1cnJlbnRTY29wZSkpIHsKIAkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSl7CkBAIC0yMzksNyArMjQ5LDcgQEAKIAkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQl9IGVsc2UgewotCQkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KIAkJCWNvZGVTdHJlYW0uZHVwX3gyKCk7CiAJCQljb2RlU3RyZWFtLnBvcCgpOwkJCQkJCkBAIC0yNDksNyArMjU5LDcgQEAKIAkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQl9IGVsc2UgewotCQkJCWdlbmVyYXRlUmVhZFNlcXVlbmNlKGN1cnJlbnRTY29wZSwgY29kZVN0cmVhbSwgdHJ1ZSk7CisJCQkJZ2VuZXJhdGVSZWFkU2VxdWVuY2UoY3VycmVudFNjb3BlLCBjb2RlU3RyZWFtKTsKIAkJCX0KIAkJCWNvZGVTdHJlYW0uZHVwX3gxKCk7CiAJCQljb2RlU3RyZWFtLnBvcCgpOwkJCQkJCkBAIC0yNjQsNDEgKzI3NCwyOSBAQAogICogR2VuZXJhdGUgY29kZSBmb3IgYWxsIGJpbmRpbmdzIChsb2NhbCBhbmQgZmllbGRzKSBleGNsdWRpbmcgdGhlIGxhc3Qgb25lLCB3aGljaCBtYXkgdGhlbiBiZSBnZW5lcmF0ZWQgY29kZQogICogZm9yIGEgcmVhZCBvciB3cml0ZSBhY2Nlc3MuCiAgKi8KLXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVhZFNlcXVlbmNlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0sIGJvb2xlYW4gdmFsdWVSZXF1aXJlZCkgewotCitwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlYWRTZXF1ZW5jZShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJLy8gZGV0ZXJtaW5lIHRoZSByYW5rIHVudGlsIHdoaWNoIHdlIG5vdyB3ZSBkbyBub3QgbmVlZCBhbnkgYWN0dWFsIHZhbHVlIGZvciB0aGUgZmllbGQgYWNjZXNzCiAJaW50IG90aGVyQmluZGluZ3NDb3VudCA9IHRoaXMub3RoZXJDb2RlZ2VuQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBvdGhlckNvZGVnZW5CaW5kaW5ncy5sZW5ndGg7Ci0JaW50IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQ7Ci0JaWYgKHZhbHVlUmVxdWlyZWQpIHsKLQkJaW5kZXhPZkZpcnN0VmFsdWVSZXF1aXJlZCA9IG90aGVyQmluZGluZ3NDb3VudDsKLQkJd2hpbGUgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPiAwKSB7Ci0JCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gdGhpcy5vdGhlckNvZGVnZW5CaW5kaW5nc1tpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMV07Ci0JCQlpZiAob3RoZXJCaW5kaW5nLmlzU3RhdGljKCkgfHwgb3RoZXJCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkKLQkJCQlicmVhazsgLy8gbm8gbG9uZ2VyIG5lZWQgYW55IHZhbHVlIGJlZm9yZSB0aGlzIHBvaW50Ci0JCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkLS07Ci0JCX0KLQl9IGVsc2UgewotCQlpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkID0gb3RoZXJCaW5kaW5nc0NvdW50ICsgMTsKLQl9Ci0JaWYgKGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCkgewotCQlzd2l0Y2ggKGJpdHMgJiBSZXN0cmljdGl2ZUZsYWdNQVNLKSB7Ci0JCQljYXNlIEZJRUxEIDoKLQkJCQlsYXN0RmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZzsKLQkJCQkvLyBpZiBmaXJzdCBmaWVsZCBpcyBhY3R1YWxseSBjb25zdGFudCwgd2UgY2FuIGlubGluZSBpdAotCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50ICE9IE5vdEFDb25zdGFudCkgewotCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCwgMCk7IC8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24KLQkJCQkJbGFzdEZpZWxkQmluZGluZyA9IG51bGw7IC8vIHdpbGwgbm90IGdlbmVyYXRlIGl0IGFnYWluCi0JCQkJCWJyZWFrOwotCQkJCX0KKworCWJvb2xlYW4gbmVlZFZhbHVlID0gb3RoZXJCaW5kaW5nc0NvdW50ID09IDAgfHwgIXRoaXMub3RoZXJCaW5kaW5nc1swXS5pc1N0YXRpYygpOworCXN3aXRjaCAoYml0cyAmIFJlc3RyaWN0aXZlRmxhZ01BU0spIHsKKwkJY2FzZSBGSUVMRCA6CisJCQlsYXN0RmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCS8vIGlmIGZpcnN0IGZpZWxkIGlzIGFjdHVhbGx5IGNvbnN0YW50LCB3ZSBjYW4gaW5saW5lIGl0CisJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChuZWVkVmFsdWUpIHsKIAkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkJCQlpZiAoIWxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewogCQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKKwkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOwogCQkJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKIAkJCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKIAkJCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOwogCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOworCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CkBAIC0zMTYsNTkgKzMxNCw3NCBAQAogCQkJCQl9IGVsc2UgewogCQkJCQkJY29kZVN0cmVhbS5hY29uc3RfbnVsbCgpOwogCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBMT0NBTCA6IC8vIHJlYWRpbmcgdGhlIGZpcnN0IGxvY2FsIHZhcmlhYmxlCi0JCQkJbGFzdEZpZWxkQmluZGluZyA9IG51bGw7Ci0JCQkJTG9jYWxWYXJpYWJsZUJpbmRpbmcgbG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSB0aGlzLmNvZGVnZW5CaW5kaW5nOwotCi0JCQkJLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSByZWFkCi0JCQkJaWYgKGxvY2FsQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKLQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZUNvbnN0YW50KGxvY2FsQmluZGluZy5jb25zdGFudCwgMCk7IC8vIG5vIGltcGxpY2l0IGNvbnZlcnNpb24KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBvdXRlciBsb2NhbD8KLQkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQkvLyBvdXRlciBsb2NhbCBjYW4gYmUgcmVhY2hlZCBlaXRoZXIgdGhyb3VnaCBhIHN5bnRoZXRpYyBhcmcgb3IgYSBzeW50aGV0aWMgZmllbGQKLQkJCQkJCVZhcmlhYmxlQmluZGluZ1tdIHBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChsb2NhbEJpbmRpbmcpOwotCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQotCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCQl9CisJCQkJfQkJCQkKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIExPQ0FMIDogLy8gcmVhZGluZyB0aGUgZmlyc3QgbG9jYWwgdmFyaWFibGUKKwkJCWlmICghbmVlZFZhbHVlKSBicmVhazsgLy8gbm8gdmFsdWUgbmVlZGVkCisJCQlsYXN0RmllbGRCaW5kaW5nID0gbnVsbDsKKwkJCUxvY2FsVmFyaWFibGVCaW5kaW5nIGxvY2FsQmluZGluZyA9IChMb2NhbFZhcmlhYmxlQmluZGluZykgdGhpcy5jb2RlZ2VuQmluZGluZzsKKwkJCS8vIHJlZ3VsYXIgbG9jYWwgdmFyaWFibGUgcmVhZAorCQkJaWYgKGxvY2FsQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQljb2RlU3RyZWFtLmdlbmVyYXRlQ29uc3RhbnQobG9jYWxCaW5kaW5nLmNvbnN0YW50LCAwKTsKKwkJCQkvLyBubyBpbXBsaWNpdCBjb252ZXJzaW9uCisJCQl9IGVsc2UgeworCQkJCS8vIG91dGVyIGxvY2FsPworCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgeworCQkJCQkvLyBvdXRlciBsb2NhbCBjYW4gYmUgcmVhY2hlZCBlaXRoZXIgdGhyb3VnaCBhIHN5bnRoZXRpYyBhcmcgb3IgYSBzeW50aGV0aWMgZmllbGQKKwkJCQkJVmFyaWFibGVCaW5kaW5nW10gcGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKGxvY2FsQmluZGluZyk7CisJCQkJCWlmIChwYXRoID09IG51bGwpIHsKKwkJCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQorCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOwogCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZVN0cmVhbS5sb2FkKGxvY2FsQmluZGluZyk7CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgbG9jYWxCaW5kaW5nLCBjdXJyZW50U2NvcGUpOwogCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJbGFzdEZpZWxkQmluZGluZyA9IG51bGw7Ci0JfQotCS8vIGFsbCBpbnRlcm1lZGlhdGUgZmllbGQgYWNjZXNzZXMgYXJlIHJlYWQgYWNjZXNzZXMKLQkvLyBvbmx5IHRoZSBsYXN0IGZpZWxkIGJpbmRpbmcgaXMgYSB3cml0ZSBhY2Nlc3MKLQlpZiAob3RoZXJCaW5kaW5ncyAhPSBudWxsKSB7Ci0JCWludCBzdGFydCA9IGluZGV4T2ZGaXJzdFZhbHVlUmVxdWlyZWQgPT0gMCA/IDAgOiBpbmRleE9mRmlyc3RWYWx1ZVJlcXVpcmVkIC0gMTsKLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgb3RoZXJCaW5kaW5nc0NvdW50OyBpKyspIHsKLQkJCWlmIChsYXN0RmllbGRCaW5kaW5nICE9IG51bGwpIHsKLQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewotCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKQotCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJKChDb2RlU25pcHBldENvZGVTdHJlYW0pIGNvZGVTdHJlYW0pLmdlbmVyYXRlRW11bGF0ZWRSZWFkQWNjZXNzRm9yRmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCWNvZGVTdHJlYW0ubG9hZChsb2NhbEJpbmRpbmcpOwogCQkJCX0KIAkJCX0KKwl9CiAKLQkJCWxhc3RGaWVsZEJpbmRpbmcgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2ldOworCS8vIGFsbCBpbnRlcm1lZGlhdGUgZmllbGQgYWNjZXNzZXMgYXJlIHJlYWQgYWNjZXNzZXMKKwkvLyBvbmx5IHRoZSBsYXN0IGZpZWxkIGJpbmRpbmcgaXMgYSB3cml0ZSBhY2Nlc3MKKwlpZiAodGhpcy5vdGhlckNvZGVnZW5CaW5kaW5ncyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJCaW5kaW5nc0NvdW50OyBpKyspIHsKKwkJCUZpZWxkQmluZGluZyBuZXh0RmllbGQgPSB0aGlzLm90aGVyQ29kZWdlbkJpbmRpbmdzW2ldOworCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcgIT0gbnVsbCkgeworCQkJCW5lZWRWYWx1ZSA9ICFuZXh0RmllbGQuaXNTdGF0aWMoKTsKKwkJCQlpZiAobmVlZFZhbHVlKSB7CisJCQkJCWlmIChsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CisJCQkJCQlpZiAobGFzdEZpZWxkQmluZGluZy5jb25zdGFudCAhPSBOb3RBQ29uc3RhbnQpIHsKKwkJCQkJCQlpZiAodGhpcy5sYXN0RmllbGRCaW5kaW5nICE9IHRoaXMuY29kZWdlbkJpbmRpbmcgJiYgIXRoaXMubGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJCWNvZGVTdHJlYW0uaW52b2tlT2JqZWN0R2V0Q2xhc3MoKTsgLy8gcGVyZm9ybSBudWxsIGNoZWNrCisJCQkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCQkJfQorCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVDb25zdGFudChsYXN0RmllbGRCaW5kaW5nLmNvbnN0YW50LCAwKTsKKwkJCQkJCX0gZWxzZSBpZiAobGFzdEZpZWxkQmluZGluZy5pc1N0YXRpYygpKSB7CisJCQkJCQkJY29kZVN0cmVhbS5nZXRzdGF0aWMobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNvZGVTdHJlYW0uZ2V0ZmllbGQobGFzdEZpZWxkQmluZGluZyk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkoKENvZGVTbmlwcGV0Q29kZVN0cmVhbSkgY29kZVN0cmVhbSkuZ2VuZXJhdGVFbXVsYXRlZFJlYWRBY2Nlc3NGb3JGaWVsZChsYXN0RmllbGRCaW5kaW5nKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0aGlzLmNvZGVnZW5CaW5kaW5nICE9IHRoaXMubGFzdEZpZWxkQmluZGluZyAmJiAhdGhpcy5sYXN0RmllbGRCaW5kaW5nLmlzU3RhdGljKCkpeworCQkJCQkJY29kZVN0cmVhbS5pbnZva2VPYmplY3RHZXRDbGFzcygpOyAvLyBwZXJmb3JtIG51bGwgY2hlY2sKKwkJCQkJCWNvZGVTdHJlYW0ucG9wKCk7CisJCQkJCX0JCQkJCQkKKwkJCQl9CisJCQl9CisJCQl0aGlzLmxhc3RGaWVsZEJpbmRpbmcgPSBuZXh0RmllbGQ7CiAJCQlpZiAobGFzdEZpZWxkQmluZGluZyAhPSBudWxsICYmICFsYXN0RmllbGRCaW5kaW5nLmNhbkJlU2VlbkJ5KGdldFJlY2VpdmVyVHlwZShjdXJyZW50U2NvcGUpLCB0aGlzLCBjdXJyZW50U2NvcGUpKSB7CiAJCQkJaWYgKGxhc3RGaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkgewogCQkJCQljb2RlU3RyZWFtLmFjb25zdF9udWxsKCk7CiAJCQkJfQogCQkJfQotCQl9CisJCX0JCQkKIAl9CiB9CisKIHB1YmxpYyB2b2lkIGdlbmVyYXRlUmVjZWl2ZXIoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJY29kZVN0cmVhbS5hbG9hZF8wKCk7CiAJaWYgKGRlbGVnYXRlVGhpcyAhPSBudWxsKSBjb2RlU3RyZWFtLmdldGZpZWxkKGRlbGVnYXRlVGhpcyk7IC8vIGRlbGVnYXRlZCBmaWVsZCBhY2Nlc3MKQEAgLTM5Nyw3ICs0MTAsNyBAQAogCWludCBpbmRleCA9IGluZGV4T2ZGaXJzdEZpZWxkQmluZGluZzsKIAlpbnQgbGVuZ3RoID0gdG9rZW5zLmxlbmd0aDsKIAlpZiAoaW5kZXggPT0gbGVuZ3RoKSB7IC8vCXJlc3RyaWN0aXZlRmxhZyA9PSBGSUVMRAotCQljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcsIGZhbHNlLCB0aGlzLCBzY29wZSwgaW5kZXggLSAxKTsKKwkJY29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcigoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCB0aGlzLCBmYWxzZSwgc2NvcGUpOwogCQlyZXR1cm4gdHlwZTsKIAl9CiAKQEAgLTQwOCw3ICs0MjEsNyBAQAogCS8vIGZpbGwgdGhlIGZpcnN0IGNvbnN0YW50ICh0aGUgb25lIG9mIHRoZSBiaW5kaW5nKQogCWNvbnN0YW50ID0KIAkJKChiaXRzICYgRklFTEQpICE9IDApCi0JCQk/IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKChGaWVsZEJpbmRpbmcpIGJpbmRpbmcsIGZhbHNlLCB0aGlzLCBzY29wZSwgaW5kZXggLSAxKQorCQkJPyBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcigoRmllbGRCaW5kaW5nKSBiaW5kaW5nLCB0aGlzLCBmYWxzZSwgc2NvcGUpCiAJCQk6ICgoVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS5jb25zdGFudDsKIAogCS8vIGl0ZXJhdGlvbiBvbiBlYWNoIGZpZWxkCQpAQCAtNDI4LDcgKzQ0MSw5IEBACiAJCQkJCQlyZXR1cm4gc3VwZXIucmVwb3J0RXJyb3Ioc2NvcGUpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLnJlcG9ydEVycm9yKHNjb3BlKTsKKwkJCQkJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7IC8vZG9uJ3QgZmlsbCBvdGhlciBjb25zdGFudHMgc2xvdHMuLi4KKwkJCQkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuaW52YWxpZEZpZWxkKHRoaXMsIGZpZWxkLCBpbmRleCwgdHlwZSk7CisJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCX0KIAkJCWZpZWxkID0gbG9jYWxTY29wZS5nZXRGaWVsZEZvckNvZGVTbmlwcGV0KGRlbGVnYXRlVGhpcy50eXBlLCB0b2tlbiwgdGhpcyk7CkBAIC00MzcsNyArNDUyLDcgQEAKIAkJaWYgKGZpZWxkLmlzVmFsaWRCaW5kaW5nKCkpIHsKIAkJCWlmIChpc0ZpZWxkVXNlRGVwcmVjYXRlZChmaWVsZCwgc2NvcGUpKQogCQkJCXNjb3BlLnByb2JsZW1SZXBvcnRlcigpLmRlcHJlY2F0ZWRGaWVsZChmaWVsZCwgdGhpcyk7Ci0JCQlDb25zdGFudCBzb21lQ29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZCwgZmFsc2UsIHRoaXMsIHNjb3BlLCBwbGFjZSk7CisJCQlDb25zdGFudCBzb21lQ29uc3RhbnQgPSBGaWVsZFJlZmVyZW5jZS5nZXRDb25zdGFudEZvcihmaWVsZCwgdGhpcywgZmFsc2UsIHNjb3BlKTsKIAkJCS8vIGNvbnN0YW50IHByb3BhZ2F0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBhcyBsb25nIGFzIHRoZSBwcmV2aW91cyBvbmUgaXMgYSBjb25zdGFudCB0b28uCiAJCQlpZiAoY29uc3RhbnQgIT0gTm90QUNvbnN0YW50KXsKIAkJCQljb25zdGFudCA9IHNvbWVDb25zdGFudDsKQEAgLTQ3Niw3ICs0OTEsNyBAQAogCiAJCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgogCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKIAkJYm9vbGVhbiB1c2VEZWxlZ2F0ZSA9IGluZGV4ID09IDAgJiYgdGhpcy5kZWxlZ2F0ZVRoaXMgIT0gbnVsbDsKIAkJaWYgKHVzZURlbGVnYXRlKSBsYXN0UmVjZWl2ZXJUeXBlID0gdGhpcy5kZWxlZ2F0ZVRoaXMudHlwZTsKIApAQCAtNDg0LDcgKzQ5OSw3IEBACiAJCQkmJiAhbGFzdFJlY2VpdmVyVHlwZS5pc0FycmF5VHlwZSgpCQkJCiAJCQkmJiBmaWVsZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbAogCQkJJiYgZmllbGRCaW5kaW5nLmNvbnN0YW50ID09IE5vdEFDb25zdGFudAotCQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLmNvbXBsaWFuY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80CisJCQkmJiAoKGN1cnJlbnRTY29wZS5lbnZpcm9ubWVudCgpLm9wdGlvbnMudGFyZ2V0SkRLID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzIKIAkJCQkJJiYgKGluZGV4ID4gMCB8fCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAxIHx8ICFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkKIAkJCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KQogCQkJCXx8ICEodXNlRGVsZWdhdGUKQEAgLTUxMSw3ICs1MjYsNyBAQAogCiAJCS8vIGlmIHRoZSBiaW5kaW5nIGRlY2xhcmluZyBjbGFzcyBpcyBub3QgdmlzaWJsZSwgbmVlZCBzcGVjaWFsIGFjdGlvbgogCQkvLyBmb3IgcnVudGltZSBjb21wYXRpYmlsaXR5IG9uIDEuMiBWTXMgOiBjaGFuZ2UgdGhlIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgYmluZGluZwotCQkvLyBOT1RFOiBmcm9tIDEuNCBvbiwgZmllbGQncyBkZWNsYXJpbmcgY2xhc3MgaXMgdG91Y2hlZCBpZiBhbnkgZGlmZmVyZW50IGZyb20gcmVjZWl2ZXIgdHlwZQorCQkvLyBOT1RFOiBmcm9tIHRhcmdldCAxLjIgb24sIGZpZWxkJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRvdWNoZWQgaWYgYW55IGRpZmZlcmVudCBmcm9tIHJlY2VpdmVyIHR5cGUKIAkJYm9vbGVhbiB1c2VEZWxlZ2F0ZSA9IGZpZWxkQmluZGluZyA9PSBiaW5kaW5nICYmIHRoaXMuZGVsZWdhdGVUaGlzICE9IG51bGw7CiAJCWlmICh1c2VEZWxlZ2F0ZSkgbGFzdFJlY2VpdmVyVHlwZSA9IHRoaXMuZGVsZWdhdGVUaGlzLnR5cGU7CiAKQEAgLTUxOSw3ICs1MzQsNyBAQAogCQkJJiYgIWxhc3RSZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKQkJCQogCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzICE9IG51bGwKIAkJCSYmIGZpZWxkQmluZGluZy5jb25zdGFudCA9PSBOb3RBQ29uc3RhbnQKLQkJCSYmICgoY3VycmVudFNjb3BlLmVudmlyb25tZW50KCkub3B0aW9ucy5jb21wbGlhbmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNAorCQkJJiYgKChjdXJyZW50U2NvcGUuZW52aXJvbm1lbnQoKS5vcHRpb25zLnRhcmdldEpESyA+PSBDb21waWxlck9wdGlvbnMuSkRLMV8yCiAJCQkJCSYmIChmaWVsZEJpbmRpbmcgIT0gYmluZGluZyB8fCBpbmRleE9mRmlyc3RGaWVsZEJpbmRpbmcgPiAxIHx8ICFmaWVsZEJpbmRpbmcuaXNTdGF0aWMoKSkKIAkJCQkJJiYgZmllbGRCaW5kaW5nLmRlY2xhcmluZ0NsYXNzLmlkICE9IFRfT2JqZWN0KQogCQkJCXx8ICEodXNlRGVsZWdhdGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRSZXR1cm5TdGF0ZW1lbnQuamF2YQppbmRleCBlNDRiNjI1Li5lYzlkN2ZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0UmV0dXJuU3RhdGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFJldHVyblN0YXRlbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cHJlc3Npb247CkBAIC00NSwxMiArNDUsMTIgQEAKICAqIER1bXAgdGhlIHN1aXRhYmxlIHJldHVybiBieXRlY29kZSBmb3IgYSByZXR1cm4gc3RhdGVtZW50CiAgKgogICovCi1wdWJsaWMgdm9pZCBnZW5lcmF0ZVJldHVybkJ5dGVjb2RlKEJsb2NrU2NvcGUgY3VycmVudFNjb3BlLCBDb2RlU3RyZWFtIGNvZGVTdHJlYW0pIHsKK3B1YmxpYyB2b2lkIGdlbmVyYXRlUmV0dXJuQnl0ZWNvZGUoQ29kZVN0cmVhbSBjb2RlU3RyZWFtKSB7CiAJCiAJLy8gb3V0cHV0IHRoZSByZXR1cm4gYnl0ZWNvZGUKIAljb2RlU3RyZWFtLnJldHVybl8oKTsKIH0KLXB1YmxpYyB2b2lkIGdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShCbG9ja1Njb3BlIGN1cnJlbnRTY29wZSwgQ29kZVN0cmVhbSBjb2RlU3RyZWFtKXsKK3B1YmxpYyB2b2lkIGdlbmVyYXRlU3RvcmVTYXZlVmFsdWVJZk5lY2Vzc2FyeShDb2RlU3RyZWFtIGNvZGVTdHJlYW0pewogCiAJLy8gcHVzaCByZWNlaXZlcgogCWNvZGVTdHJlYW0uYWxvYWRfMCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQppbmRleCBjZTExMTI2Li5jNTcwM2VjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2NvcGUuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwpAQCAtMjcsNyArMjgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKIAogLyoqCkBAIC0yNjYsNiArMjY2LDExIEBACiAJaWYgKHJlY2VpdmVyVHlwZS5pc0Jhc2VUeXBlKCkpCiAJCXJldHVybiBudWxsOwogCWlmIChyZWNlaXZlclR5cGUuaXNBcnJheVR5cGUoKSkgeworCQlUeXBlQmluZGluZyBsZWFmVHlwZSA9IHJlY2VpdmVyVHlwZS5sZWFmQ29tcG9uZW50VHlwZSgpOworCQlpZiAobGVhZlR5cGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKQorCQlpZiAoISgoUmVmZXJlbmNlQmluZGluZylsZWFmVHlwZSkuY2FuQmVTZWVuQnkodGhpcykpIHsKKwkJCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZygoUmVmZXJlbmNlQmluZGluZylsZWFmVHlwZSwgZmllbGROYW1lLCBSZWNlaXZlclR5cGVOb3RWaXNpYmxlKTsKKwkJfQogCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMoZmllbGROYW1lLCBMRU5HVEgpKQogCQkJcmV0dXJuIEFycmF5QmluZGluZy5MZW5ndGhGaWVsZDsKIAkJcmV0dXJuIG51bGw7CkBAIC0yNzMsNyArMjc4LDcgQEAKIAogCVJlZmVyZW5jZUJpbmRpbmcgY3VycmVudFR5cGUgPSAoUmVmZXJlbmNlQmluZGluZykgcmVjZWl2ZXJUeXBlOwogCWlmICghY3VycmVudFR5cGUuY2FuQmVTZWVuQnkodGhpcykpCi0JCXJldHVybiBuZXcgUHJvYmxlbUZpZWxkQmluZGluZyhjdXJyZW50VHlwZSwgZmllbGROYW1lLCBOb3RWaXNpYmxlKTsgLy8gKioqIE5lZWQgYSBuZXcgcHJvYmxlbSBpZCAtIFR5cGVOb3RWaXNpYmxlPworCQlyZXR1cm4gbmV3IFByb2JsZW1GaWVsZEJpbmRpbmcoY3VycmVudFR5cGUsIGZpZWxkTmFtZSwgUmVjZWl2ZXJUeXBlTm90VmlzaWJsZSk7CiAKIAlGaWVsZEJpbmRpbmcgZmllbGQgPSBjdXJyZW50VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOwogCWlmIChmaWVsZCAhPSBudWxsKSB7CkBAIC00NjUsNyArNDcwLDcgQEAKIAkJCWlmIChpbnRlcmZhY2VNZXRob2QgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZDsKIAkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoCiAJCQkJY2FuZGlkYXRlc1swXS5zZWxlY3RvciwKLQkJCQlhcmd1bWVudFR5cGVzLAorCQkJCWNhbmRpZGF0ZXNbMF0ucGFyYW1ldGVycywKIAkJCQljYW5kaWRhdGVzWzBdLmRlY2xhcmluZ0NsYXNzLAogCQkJCU5vdFZpc2libGUpOwogCQl9CQpAQCAtNDk2LDcgKzUwMSw3IEBACiAJCWlmICghYXJlUGFyYW1ldGVyc0Fzc2lnbmFibGUobWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBhcmd1bWVudFR5cGVzKSkKIAkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZywgc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIE5vdEZvdW5kKTsKIAkJaWYgKCFjYW5CZVNlZW5CeUZvckNvZGVTbmlwcGV0KG1ldGhvZEJpbmRpbmcsIHJlY2VpdmVyVHlwZSwgaW52b2NhdGlvblNpdGUsIHRoaXMpKQotCQkJcmV0dXJuIG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywgTm90VmlzaWJsZSk7CisJCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKHNlbGVjdG9yLCBtZXRob2RCaW5kaW5nLnBhcmFtZXRlcnMsIG1ldGhvZEJpbmRpbmcuZGVjbGFyaW5nQ2xhc3MsIE5vdFZpc2libGUpOwogCX0KIAlyZXR1cm4gbWV0aG9kQmluZGluZzsKIH0KQEAgLTYzMyw3ICs2MzgsNyBAQAogCWlmICh2aXNpYmxlSW5kZXggPT0gMSkKIAkJcmV0dXJuIHZpc2libGVbMF07CiAJaWYgKHZpc2libGVJbmRleCA9PSAwKQotCQlyZXR1cm4gbmV3IFByb2JsZW1NZXRob2RCaW5kaW5nKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uQ29uc3RhbnRQb29sTmFtZSwgYXJndW1lbnRUeXBlcywgTm90VmlzaWJsZSk7CisJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5Db25zdGFudFBvb2xOYW1lLCBjb21wYXRpYmxlWzBdLnBhcmFtZXRlcnMsIE5vdFZpc2libGUpOwogCXJldHVybiBtb3N0U3BlY2lmaWNDbGFzc01ldGhvZEJpbmRpbmcodmlzaWJsZSwgdmlzaWJsZUluZGV4KTsKIH0KIC8qIEFQSQpAQCAtNjk3LDcgKzcwMiw3IEBACiAJCQkJcmV0dXJuIG1ldGhvZEJpbmRpbmc7CiAJCQllbHNlCiAJCQkJLy8gbWFrZSB0aGUgdXNlciBxdWFsaWZ5IHRoZSBtZXRob2QsIGxpa2VseSB3YW50cyB0aGUgZmlyc3QgaW5oZXJpdGVkIG1ldGhvZCAoamF2YWMgZ2VuZXJhdGVzIGFuIGFtYmlndW91cyBlcnJvciBpbnN0ZWFkKQotCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIGFyZ3VtZW50VHlwZXMsIEluaGVyaXRlZE5hbWVIaWRlc0VuY2xvc2luZ05hbWUpOworCQkJCXJldHVybiBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcoc2VsZWN0b3IsIG1ldGhvZEJpbmRpbmcucGFyYW1ldGVycywgSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSk7CiAJCX0KIAogCQlQcm9ibGVtTWV0aG9kQmluZGluZyBmdXp6eVByb2JsZW0gPSBudWxsOwpAQCAtNzExLDYgKzcxNiw3IEBACiAJCQkJCWZ1enp5UHJvYmxlbSA9IG5ldyBQcm9ibGVtTWV0aG9kQmluZGluZyhzZWxlY3RvciwgYXJndW1lbnRUeXBlcywgbWV0aG9kQmluZGluZy5kZWNsYXJpbmdDbGFzcywgTm90VmlzaWJsZSk7CiAJCQkJfQogCQkJfQorCQkJLy9UT0RPOiAocGhpbGlwcGUpIHNob3VsZCBzZXQgY2xvc2VzdCBtYXRjaAogCQkJaWYgKGZ1enp5UHJvYmxlbSA9PSBudWxsICYmICFtZXRob2RCaW5kaW5nLmlzU3RhdGljKCkpIHsKIAkJCQlpZiAoaW5zaWRlQ29uc3RydWN0b3JDYWxsKSB7CiAJCQkJCWluc2lkZVByb2JsZW0gPSBuZXcgUHJvYmxlbU1ldGhvZEJpbmRpbmcobWV0aG9kQmluZGluZy5zZWxlY3RvciwgbWV0aG9kQmluZGluZy5wYXJhbWV0ZXJzLCBOb25TdGF0aWNSZWZlcmVuY2VJbkNvbnN0cnVjdG9ySW52b2NhdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNpbmdsZU5hbWVSZWZlcmVuY2UuamF2YQppbmRleCAyODliNGJjLi43ODEzYzc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXNzaWdubWVudDsKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93Q29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZmxvdy5GbG93SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CbG9ja1Njb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ2xhc3NTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKQEAgLTQyLDYgKzQzLDcgQEAKIAogCUV2YWx1YXRpb25Db250ZXh0IGV2YWx1YXRpb25Db250ZXh0OwogCUZpZWxkQmluZGluZyBkZWxlZ2F0ZVRoaXM7CisJCiBwdWJsaWMgQ29kZVNuaXBwZXRTaW5nbGVOYW1lUmVmZXJlbmNlKGNoYXJbXSBzb3VyY2UsIGxvbmcgcG9zLCBFdmFsdWF0aW9uQ29udGV4dCBldmFsdWF0aW9uQ29udGV4dCkgewogCXN1cGVyKHNvdXJjZSwgcG9zKTsKIAl0aGlzLmV2YWx1YXRpb25Db250ZXh0ID0gZXZhbHVhdGlvbkNvbnRleHQ7CkBAIC01Miw3ICs1NCw4IEBACiAJCWNhc2UgRklFTEQgOiAvLyByZWFkaW5nIGEgZmllbGQKIAkJCS8vIGNoZWNrIGlmIHJlYWRpbmcgYSBmaW5hbCBibGFuayBmaWVsZAogCQkJRmllbGRCaW5kaW5nIGZpZWxkQmluZGluZzsKLQkJCWlmICgoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZykgYmluZGluZykuaXNGaW5hbCgpICYmIGN1cnJlbnRTY29wZS5hbGxvd0JsYW5rRmluYWxGaWVsZEFzc2lnbm1lbnQoZmllbGRCaW5kaW5nKSkgeworCQkJaWYgKChmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKSBiaW5kaW5nKS5pc0JsYW5rRmluYWwoKSAKKwkJCQkJJiYgY3VycmVudFNjb3BlLmFsbG93QmxhbmtGaW5hbEZpZWxkQXNzaWdubWVudChmaWVsZEJpbmRpbmcpKSB7CiAJCQkJaWYgKCFmbG93SW5mby5pc0RlZmluaXRlbHlBc3NpZ25lZChmaWVsZEJpbmRpbmcpKSB7CiAJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkQmxhbmtGaW5hbEZpZWxkKGZpZWxkQmluZGluZywgdGhpcyk7CiAJCQkJfQpAQCAtNjMsNyArNjYsMTEgQEAKIAkJCWlmICghZmxvd0luZm8uaXNEZWZpbml0ZWx5QXNzaWduZWQobG9jYWxCaW5kaW5nID0gKExvY2FsVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKSkgewogCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS51bmluaXRpYWxpemVkTG9jYWxWYXJpYWJsZShsb2NhbEJpbmRpbmcsIHRoaXMpOwogCQkJfQotCQkJaWYgKCFmbG93SW5mby5pc0Zha2VSZWFjaGFibGUoKSkgbG9jYWxCaW5kaW5nLnVzZWQgPSB0cnVlOwkJCQorCQkJaWYgKGZsb3dJbmZvLmlzUmVhY2hhYmxlKCkpIHsKKwkJCQlsb2NhbEJpbmRpbmcudXNlRmxhZyA9IExvY2FsVmFyaWFibGVCaW5kaW5nLlVTRUQ7CisJCQl9IGVsc2UgaWYgKGxvY2FsQmluZGluZy51c2VGbGFnID09IExvY2FsVmFyaWFibGVCaW5kaW5nLlVOVVNFRCkgeworCQkJCWxvY2FsQmluZGluZy51c2VGbGFnID0gTG9jYWxWYXJpYWJsZUJpbmRpbmcuRkFLRV9VU0VEOworCQkJfQogCX0KIAlyZXR1cm4gZmxvd0luZm87CiB9CkBAIC04Nyw3ICs5NCw3IEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KLQljb25zdGFudCA9IEZpZWxkUmVmZXJlbmNlLmdldENvbnN0YW50Rm9yKGZpZWxkQmluZGluZywgdHJ1ZSwgdGhpcywgc2NvcGUsIDApOworCWNvbnN0YW50ID0gRmllbGRSZWZlcmVuY2UuZ2V0Q29uc3RhbnRGb3IoZmllbGRCaW5kaW5nLCB0aGlzLCB0cnVlLCBzY29wZSk7CiAJaWYgKGlzRmllbGRVc2VEZXByZWNhdGVkKGZpZWxkQmluZGluZywgc2NvcGUpKQogCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5kZXByZWNhdGVkRmllbGQoZmllbGRCaW5kaW5nLCB0aGlzKTsKIApAQCAtMTIzLDEzICsxMzAsOSBAQAogCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkJCWlmICghZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpIHsgLy8gbmVlZCBhIHJlY2VpdmVyPwogCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7Ci0JCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKLQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQkJfQorCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOworCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQl0aGlzLmdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCX0KQEAgLTIyMCwxMyArMjIzLDkgQEAKIAkJCQkJCQlib29sZWFuIGlzU3RhdGljOwogCQkJCQkJCWlmICghKGlzU3RhdGljID0gZmllbGRCaW5kaW5nLmlzU3RhdGljKCkpKSB7CiAJCQkJCQkJCWlmICgoYml0cyAmIERlcHRoTUFTSykgIT0gMCkgewotCQkJCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFeGFjdEVtdWxhdGlvblBhdGgoY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpKTsKLQkJCQkJCQkJCWlmIChlbXVsYXRpb25QYXRoID09IG51bGwpIHsKLQkJCQkJCQkJCQkvLyBpbnRlcm5hbCBlcnJvciwgcGVyIGNvbnN0cnVjdGlvbiB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBpdAotCQkJCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCQkJCQl9CisJCQkJCQkJCQlSZWZlcmVuY2VCaW5kaW5nIHRhcmdldFR5cGUgPSBjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCk7CisJCQkJCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEVtdWxhdGlvblBhdGgodGFyZ2V0VHlwZSwgdHJ1ZSAvKm9ubHkgZXhhY3QgbWF0Y2gqLywgZmFsc2UvKmNvbnNpZGVyIGVuY2xvc2luZyBhcmcqLyk7CisJCQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgdGFyZ2V0VHlwZSwgY3VycmVudFNjb3BlKTsKIAkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCWdlbmVyYXRlUmVjZWl2ZXIoY29kZVN0cmVhbSk7CiAJCQkJCQkJCX0KQEAgLTI2NSwxMiArMjY0LDcgQEAKIAkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7CiAJCQkJCQkvLyBvdXRlciBsb2NhbCBjYW4gYmUgcmVhY2hlZCBlaXRoZXIgdGhyb3VnaCBhIHN5bnRoZXRpYyBhcmcgb3IgYSBzeW50aGV0aWMgZmllbGQKIAkJCQkJCVZhcmlhYmxlQmluZGluZ1tdIHBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aChsb2NhbEJpbmRpbmcpOwotCQkJCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCQkJCS8vIGVtdWxhdGlvbiB3YXMgbm90IHBvc3NpYmxlIChzaG91bGQgbm90IGhhcHBlbiBwZXIgY29uc3RydWN0aW9uKQotCQkJCQkJCWN1cnJlbnRTY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5uZWVkSW1wbGVtZW50YXRpb24oKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKHBhdGgsIHRoaXMsIGN1cnJlbnRTY29wZSk7Ci0JCQkJCQl9CisJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MocGF0aCwgdGhpcywgbG9jYWxCaW5kaW5nLCBjdXJyZW50U2NvcGUpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJLy8gcmVndWxhciBsb2NhbCB2YXJpYWJsZSByZWFkCiAJCQkJCQljb2RlU3RyZWFtLmxvYWQobG9jYWxCaW5kaW5nKTsKQEAgLTMwNCwxMyArMjk4LDkgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGZpZWxkQmluZGluZy5jYW5CZVNlZW5CeShnZXRSZWNlaXZlclR5cGUoY3VycmVudFNjb3BlKSwgdGhpcywgY3VycmVudFNjb3BlKSkgewogCQkJCQlpZiAoKGJpdHMgJiBEZXB0aE1BU0spICE9IDApIHsKLQkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RXhhY3RFbXVsYXRpb25QYXRoKGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKSk7Ci0JCQkJCQlpZiAoZW11bGF0aW9uUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaW50ZXJuYWwgZXJyb3IsIHBlciBjb25zdHJ1Y3Rpb24gd2Ugc2hvdWxkIGhhdmUgZm91bmQgaXQKLQkJCQkJCQljdXJyZW50U2NvcGUucHJvYmxlbVJlcG9ydGVyKCkubmVlZEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCBjdXJyZW50U2NvcGUpOwotCQkJCQkJfQorCQkJCQkJUmVmZXJlbmNlQmluZGluZyB0YXJnZXRUeXBlID0gY3VycmVudFNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKS5lbmNsb3NpbmdUeXBlQXQoKGJpdHMgJiBEZXB0aE1BU0spID4+IERlcHRoU0hJRlQpOworCQkJCQkJT2JqZWN0W10gZW11bGF0aW9uUGF0aCA9IGN1cnJlbnRTY29wZS5nZXRFbXVsYXRpb25QYXRoKHRhcmdldFR5cGUsIHRydWUgLypvbmx5IGV4YWN0IG1hdGNoKi8sIGZhbHNlLypjb25zaWRlciBlbmNsb3NpbmcgYXJnKi8pOworCQkJCQkJY29kZVN0cmVhbS5nZW5lcmF0ZU91dGVyQWNjZXNzKGVtdWxhdGlvblBhdGgsIHRoaXMsIHRhcmdldFR5cGUsIGN1cnJlbnRTY29wZSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlnZW5lcmF0ZVJlY2VpdmVyKGNvZGVTdHJlYW0pOwogCQkJCQl9CkBAIC00MjksMTMgKzQxOSw5IEBACiAJCQkJCWNvZGVTdHJlYW0uZ2V0c3RhdGljKGZpZWxkQmluZGluZyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKChiaXRzICYgRGVwdGhNQVNLKSAhPSAwKSB7Ci0JCQkJCQlPYmplY3RbXSBlbXVsYXRpb25QYXRoID0gY3VycmVudFNjb3BlLmdldEV4YWN0RW11bGF0aW9uUGF0aChjdXJyZW50U2NvcGUuZW5jbG9zaW5nU291cmNlVHlwZSgpLmVuY2xvc2luZ1R5cGVBdCgoYml0cyAmIERlcHRoTUFTSykgPj4gRGVwdGhTSElGVCkpOwotCQkJCQkJaWYgKGVtdWxhdGlvblBhdGggPT0gbnVsbCkgewotCQkJCQkJCS8vIGludGVybmFsIGVycm9yLCBwZXIgY29uc3RydWN0aW9uIHdlIHNob3VsZCBoYXZlIGZvdW5kIGl0Ci0JCQkJCQkJY3VycmVudFNjb3BlLnByb2JsZW1SZXBvcnRlcigpLm5lZWRJbXBsZW1lbnRhdGlvbigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb2RlU3RyZWFtLmdlbmVyYXRlT3V0ZXJBY2Nlc3MoZW11bGF0aW9uUGF0aCwgdGhpcywgY3VycmVudFNjb3BlKTsKLQkJCQkJCX0KKwkJCQkJCVJlZmVyZW5jZUJpbmRpbmcgdGFyZ2V0VHlwZSA9IGN1cnJlbnRTY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCkuZW5jbG9zaW5nVHlwZUF0KChiaXRzICYgRGVwdGhNQVNLKSA+PiBEZXB0aFNISUZUKTsKKwkJCQkJCU9iamVjdFtdIGVtdWxhdGlvblBhdGggPSBjdXJyZW50U2NvcGUuZ2V0RW11bGF0aW9uUGF0aCh0YXJnZXRUeXBlLCB0cnVlIC8qb25seSBleGFjdCBtYXRjaCovLCBmYWxzZS8qY29uc2lkZXIgZW5jbG9zaW5nIGFyZyovKTsKKwkJCQkJCWNvZGVTdHJlYW0uZ2VuZXJhdGVPdXRlckFjY2VzcyhlbXVsYXRpb25QYXRoLCB0aGlzLCB0YXJnZXRUeXBlLCBjdXJyZW50U2NvcGUpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJZ2VuZXJhdGVSZWNlaXZlcihjb2RlU3RyZWFtKTsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFNrZWxldG9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQppbmRleCBkZmU4YzA0Li5iNjcxZDc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U2tlbGV0b24uamF2YQpAQCAtMSwyMSArMSwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlGaWVsZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlNZXRob2Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TmVzdGVkVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIFRoZSBza2VsZXRvbiBvZiB0aGUgY2xhc3MgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLnRhcmdldC5Db2RlU25pcHBldCcKQEAgLTU1LDcgKzU1LDcgQEAKIAkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKIAkJCXRoaXMubWV0aG9kRGVzY3JpcHRvciA9IG1ldGhvZERlc2NyaXB0b3I7CiAJCQl0aGlzLmV4Y2VwdGlvblR5cGVOYW1lcyA9IGV4Y2VwdGlvblR5cGVOYW1lczsKLQkJCXRoaXMuaXNDb25zdHJ1Y3RvciA9IHRoaXMuaXNDb25zdHJ1Y3RvcjsKKwkJCXRoaXMuaXNDb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3I7CiAJCX0KIAkJCiAJCXB1YmxpYyBjaGFyW11bXSBnZXRFeGNlcHRpb25UeXBlTmFtZXMoKSB7CkBAIC04Nyw3ICs4Nyw3IEBACiAJCXB1YmxpYyBjaGFyW11bXSBnZXRBcmd1bWVudE5hbWVzKCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQ0KKwogfQogCQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0U3VwZXJSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZS5qYXZhCmluZGV4IDQzOWI4M2UuLmJiMjJjNzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRTdXBlclJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlN1cGVyUmVmZXJlbmNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUaGlzUmVmZXJlbmNlLmphdmEKaW5kZXggODg5OTI2OS4uOGU5ZDRhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRoaXNSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VGhpc1JlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlRoaXNSZWZlcmVuY2U7CkBAIC0zOCw3ICszOCw3IEBACiAJdGhpcy5ldmFsdWF0aW9uQ29udGV4dCA9IGV2YWx1YXRpb25Db250ZXh0OwogCXRoaXMuaXNJbXBsaWNpdCA9IGlzSW1wbGljaXQ7CiB9Ci1wcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0FjY2VzcyhNZXRob2RTY29wZSBtZXRob2RTY29wZSkgeworcHVibGljIGJvb2xlYW4gY2hlY2tBY2Nlc3MoTWV0aG9kU2NvcGUgbWV0aG9kU2NvcGUpIHsKIAkvLyB0aGlzL3N1cGVyIGNhbm5vdCBiZSB1c2VkIGluIGNvbnN0cnVjdG9yIGNhbGwKIAlpZiAoZXZhbHVhdGlvbkNvbnRleHQuaXNDb25zdHJ1Y3RvckNhbGwpIHsKIAkJbWV0aG9kU2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuZmllbGRzT3JUaGlzQmVmb3JlQ29uc3RydWN0b3JJbnZvY2F0aW9uKHRoaXMpOwpAQCAtNzgsOCArNzgsOCBAQAogCQogCWRlbGVnYXRlVGhpcyA9IHNjb3BlLmdldEZpZWxkKHNuaXBwZXRUeXBlLCBERUxFR0FURV9USElTLCB0aGlzKTsKIAlpZiAoZGVsZWdhdGVUaGlzID09IG51bGwpIHJldHVybiBudWxsOyAvLyBpbnRlcm5hbCBlcnJvciwgZmllbGQgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZAotCWlmIChkZWxlZ2F0ZVRoaXMuaXNWYWxpZEJpbmRpbmcoKSkgcmV0dXJuIGRlbGVnYXRlVGhpcy50eXBlOwotCXJldHVybiBzbmlwcGV0VHlwZTsKKwlpZiAoZGVsZWdhdGVUaGlzLmlzVmFsaWRCaW5kaW5nKCkpIHJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IGRlbGVnYXRlVGhpcy50eXBlOworCXJldHVybiB0aGlzLnJlc29sdmVkVHlwZSA9IHNuaXBwZXRUeXBlOwogfQogcHVibGljIHZvaWQgc2V0QWN0dWFsUmVjZWl2ZXJUeXBlKFJlZmVyZW5jZUJpbmRpbmcgcmVjZWl2ZXJUeXBlKSB7CiAJLy8gaWdub3JlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUb0N1TWFwcGVyLmphdmEKaW5kZXggZTgwZjk0Yy4uNGUzYjM5YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFRvQ3VNYXBwZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VG9DdU1hcHBlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiAvKioKQEAgLTQwLDE3ICs0MCwxNyBAQAogCXB1YmxpYyBpbnQgc3RhcnRQb3NPZmZzZXQgPSAwOwogCiAJLy8gSW50ZXJuYWwgZmllbGRzCi0JcHJpdmF0ZSBjaGFyW10gY29kZVNuaXBwZXQ7Ci0JcHJpdmF0ZSBjaGFyW10gcGFja2FnZU5hbWU7Ci0JcHJpdmF0ZSBjaGFyW11bXSBpbXBvcnRzOwotCWNoYXJbXSBjbGFzc05hbWU7IC8vIE5COiBNYWtlIGl0IHBhY2thZ2UgZGVmYXVsdCB2aXNpYmlsaXR5IHRvIG9wdGltaXplIGFjY2VzcyBmcm9tIGlubmVyIGNsYXNzZXMKLQlwcml2YXRlIGNoYXJbXSB2YXJDbGFzc05hbWU7CisJY2hhcltdIGNvZGVTbmlwcGV0OworCWNoYXJbXSBwYWNrYWdlTmFtZTsKKwljaGFyW11bXSBpbXBvcnRzOworCWNoYXJbXSBjbGFzc05hbWU7IAorCWNoYXJbXSB2YXJDbGFzc05hbWU7CiAKIAkvLyBNYXBwaW5nIG9mIGV4dGVybmFsIGxvY2FsIHZhcmlhYmxlcwotCXByaXZhdGUgY2hhcltdW10gbG9jYWxWYXJOYW1lczsKLQlwcml2YXRlIGNoYXJbXVtdIGxvY2FsVmFyVHlwZU5hbWVzOwotCXByaXZhdGUgaW50W10gbG9jYWxWYXJNb2RpZmllcnM7Ci0JcHJpdmF0ZSBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWU7CisJY2hhcltdW10gbG9jYWxWYXJOYW1lczsKKwljaGFyW11bXSBsb2NhbFZhclR5cGVOYW1lczsKKwlpbnRbXSBsb2NhbFZhck1vZGlmaWVyczsKKwljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWU7CiAKIC8qKgogICogUmVidWlsZCBzb3VyY2UgaW4gcHJlc2VuY2Ugb2YgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGVzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0NvZGVTbmlwcGV0VHlwZURlY2xhcmF0aW9uLmphdmEKaW5kZXggMWUzYWExOS4uMjcyMmZhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9Db2RlU25pcHBldFR5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvQ29kZVNuaXBwZXRUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKaW5kZXggZTM2ZDI5My4uMzE2ZmI4NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29uc3RhbnRzLmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGludGVyZmFjZSBFdmFsdWF0aW9uQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBDT0RFX1NOSVBQRVRfQ0xBU1NfTkFNRV9QUkVGSVggPSAiQ29kZVNuaXBwZXRfIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25Db250ZXh0LmphdmEKaW5kZXggNDQwMjE3Ny4uNGM2OGQxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0aW9uQ29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvbkNvbnRleHQuamF2YQpAQCAtMSwxOSArMSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5Db21wbGV0aW9uRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50OwpAQCAtMjUsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWwuSUV2YWx1YXRpb25Db250ZXh0CkBAIC00NCw4ICs0NCw4IEBACiAKIAlHbG9iYWxWYXJpYWJsZVtdIHZhcmlhYmxlcyA9IG5ldyBHbG9iYWxWYXJpYWJsZVs1XTsKIAlpbnQgdmFyaWFibGVDb3VudCA9IDA7Ci0JY2hhcltdW10gaW1wb3J0cyA9IG5ldyBjaGFyWzBdW107Ci0JY2hhcltdIHBhY2thZ2VOYW1lID0gbmV3IGNoYXJbMF07CisJY2hhcltdW10gaW1wb3J0cyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCWNoYXJbXSBwYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlib29sZWFuIHZhcnNDaGFuZ2VkID0gdHJ1ZTsKIAlWYXJpYWJsZXNJbmZvIGluc3RhbGxlZFZhcnM7CiAJSUJpbmFyeVR5cGUgY29kZVNuaXBwZXRCaW5hcnk7CkBAIC04Nyw3ICs4Nyw3IEBACiAgKiAgQHBhcmFtIG9wdGlvbnMKICAqCQlzZXQgb2Ygb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY29kZSBhc3Npc3QgZW5naW5lLgogICovCi1wdWJsaWMgdm9pZCBjb21wbGV0ZShjaGFyW10gY29kZVNuaXBwZXQsIGludCBjb21wbGV0aW9uUG9zaXRpb24sIElTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIE1hcCBvcHRpb25zKSB7CitwdWJsaWMgdm9pZCBjb21wbGV0ZShjaGFyW10gY29kZVNuaXBwZXQsIGludCBjb21wbGV0aW9uUG9zaXRpb24sIElTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IsIE1hcCBvcHRpb25zLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewogCWZpbmFsIGNoYXJbXSBjbGFzc05hbWUgPSAiQ29kZVNuaXBwZXRDb21wbGV0aW9uIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAJZmluYWwgQ29kZVNuaXBwZXRUb0N1TWFwcGVyIG1hcHBlciA9IG5ldyBDb2RlU25pcHBldFRvQ3VNYXBwZXIoCiAJCWNvZGVTbmlwcGV0LCAKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9OwotCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIG1hcHBlci5nZXRDb21wbGV0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIG9wdGlvbnMpOworCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIG1hcHBlci5nZXRDb21wbGV0aW9uUmVxdWVzdG9yKHJlcXVlc3RvciksIG9wdGlvbnMsIHByb2plY3QpOwogCWVuZ2luZS5jb21wbGV0ZShzb3VyY2VVbml0LCBtYXBwZXIuc3RhcnRQb3NPZmZzZXQgKyBjb21wbGV0aW9uUG9zaXRpb24sIDApOwogfQogLyoqCkBAIC0yODgsMTUgKzI4OCwxOCBAQAogCQkJCQkJcGFja2FnZU5hbWUgPSBzcGxpdERlY2xhcmF0aW9uW3NwbGl0TGVuZ3RoIC0gMl07CiAJCQkJfQogCQkJCWlmICghZW52aXJvbm1lbnQuaXNQYWNrYWdlKHBhcmVudE5hbWUsIHBhY2thZ2VOYW1lKSkgewotCQkJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW1wb3J0RGVjbGFyYXRpb24pfSwgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CisJCQkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbXBvcnREZWNsYXJhdGlvbil9OworCQkJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBhcmd1bWVudHMsIGFyZ3VtZW50cywgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoZW52aXJvbm1lbnQuZmluZFR5cGUoc3BsaXREZWNsYXJhdGlvbikgPT0gbnVsbCkgewotCQkJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoaW1wb3J0RGVjbGFyYXRpb24pfSwgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CisJCQkJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZyhpbXBvcnREZWNsYXJhdGlvbil9OworCQkJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBhcmd1bWVudHMsIGFyZ3VtZW50cywgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewotCQkJcHJvYmxlbXNbMF0gPSBwcm9ibGVtRmFjdG9yeS5jcmVhdGVQcm9ibGVtKGltcG9ydERlY2xhcmF0aW9uLCBJUHJvYmxlbS5JbXBvcnROb3RGb3VuZCwgbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGltcG9ydERlY2xhcmF0aW9uKX0sIFByb2JsZW1TZXZlcml0aWVzLldhcm5pbmcsIDAsIGltcG9ydERlY2xhcmF0aW9uLmxlbmd0aCAtIDEsIGkpOworCQkJU3RyaW5nW10gYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKGltcG9ydERlY2xhcmF0aW9uKX07CisJCQlwcm9ibGVtc1swXSA9IHByb2JsZW1GYWN0b3J5LmNyZWF0ZVByb2JsZW0oaW1wb3J0RGVjbGFyYXRpb24sIElQcm9ibGVtLkltcG9ydE5vdEZvdW5kLCBhcmd1bWVudHMsIGFyZ3VtZW50cywgUHJvYmxlbVNldmVyaXRpZXMuV2FybmluZywgMCwgaW1wb3J0RGVjbGFyYXRpb24ubGVuZ3RoIC0gMSwgaSk7CiAJCX0KIAkJaWYgKHByb2JsZW1zWzBdICE9IG51bGwpIHsKIAkJCXJlcXVlc3Rvci5hY2NlcHRQcm9ibGVtKHByb2JsZW1zWzBdLCBpbXBvcnREZWNsYXJhdGlvbiwgRXZhbHVhdGlvblJlc3VsdC5UX0lNUE9SVCk7CkBAIC0zNjQsNyArMzY3LDcgQEAKIGJ1ZmZlci50b1N0cmluZygpCiBdCiAgKi8KLXByaXZhdGUgYnl0ZVtdIGdldENvZGVTbmlwcGV0Qnl0ZXMoKSB7CitieXRlW10gZ2V0Q29kZVNuaXBwZXRCeXRlcygpIHsKIAlyZXR1cm4gbmV3IGJ5dGVbXSB7CiAJCS01NCwgLTIsIC03MCwgLTY2LCAwLCAzLCAwLCA0NSwgMCwgMzUsIDEsIDAsIDQ4LCAxMTEsIDExNCwgMTAzLCA0NywgMTAxLCA5OSwgMTA4LCAxMDUsIDExMiwgMTE1LCAxMDEsIDQ3LCAxMDYsIDEwMCwgMTE2LCA0NywgMTA1LCAxMTAsIDExNiwgMTAxLCAxMTQsIDExMCwgOTcsIDEwOCwgNDcsIDEwMSwgMTE4LCA5NywgMTA4LCA0NywgMTE2LCA5NywgMTE0LCAxMDMsIDEwMSwgMTE2LCA0NywgNjcsIDExMSwgMTAwLCAxMDEsIDgzLCAxMTAsIDEwNSwgMTEyLCAxMTIsIDEwMSwgMTE2LCA3LCAwLCAxLCAxLCAwLCAxNiwgMTA2LCA5NywgMTE4LCA5NywgNDcsIDEwOCwgOTcsIDExMCwgMTAzLCA0NywgNzksIDk4LCAxMDYsIDEwMSwgOTksIDExNiwgNywgMCwgMywgMSwgMCwgMTAsIDExNCwgMTAxLCAxMTUsIDExNywgMTA4LCAxMTYsIDg0LCAxMjEsIDExMiwgMTAxLCAxLCAwLCAxNywgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDY3LCAxMDgsIDk3LCAxMTUsIDExNSwgNTksIDEsIDAsIDExLCAxMTQsIDEwMSwgMTE1LCAxMTcsIDEwOCwgMTE2LCA4NiwgOTcsIDEwOCwgMTE3LCAxMDEsIDEsIDAsIDE4LCA3NiwgMTA2LCA5NywgMTE4LCA5NywgNDcsIDEwOCwgOTcsIDExMCwgMTAzLCA0NywgNzksIDk4LCAxMDYsIDEwMSwgOTksIDExNiwgNTksIDEsIDAsIDcsIDk5LCAxMDgsIDk3LCAxMTUsIDExNSwgMzYsIDQ4LCAxLCAwLCA5LCA4MywgMTIxLCAxMTAsIDExNiwgMTA0LCAxMDEsIDExNiwgMTA1LCA5OSwgMSwgMCwgNiwgNjAsIDEwNSwgMTEwLCAxMDUsIDExNiwgNjIsIDEsIDAsIDMsIDQwLCA0MSwgODYsIDEsIDAsIDQsIDY3LCAxMTEsIDEwMCwgMTAxLCAxMiwgMCwgMTEsIDAsIDEyLCAxMCwgMCwgNCwgMCwgMTQsIDEsIDAsIDE0LCAxMDYsIDk3LCAxMTgsIDk3LCA0NywgMTA4LCA5NywgMTEwLCAxMDMsIDQ3LCA4NiwgMTExLCAxMDUsIDEwMCwgNywgMCwgMTYsIDEsIDAsIDQsIDg0LCA4OSwgODAsIDY5LCAxMiwgMCwgMTgsIDAsIDYsIDksIDAsIDE3LCAwLCAxOSwgMTIsIDAsIDUsIDAsIDYsIDksIDAsIDIsIDAsIDIxLCAxMiwgMCwgNywgMCwgOCwgOSwgMCwgMiwgMCwgMjMsIDEsIDAsIDE1LCA3NiwgMTA1LCAxMTAsIDEwMSwgNzgsIDExNywgMTA5LCA5OCwgMTAxLCAxMTQsIDg0LCA5NywgOTgsIDEwOCwgMTAxLCAxLCAwLCAxMywgMTAzLCAxMDEsIDExNiwgODIsIDEwMSwgMTE1LCAxMTcsIDEwOCwgMTE2LCA4NCwgMTIxLCAxMTIsIDEwMSwgMSwgMCwgMTksIDQwLCA0MSwgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDY3LCAxMDgsIDk3LCAxMTUsIDExNSwgNTksIDEsIDAsIDE0LCAxMDMsIDEwMSwgMTE2LCA4MiwgMTAxLCAxMTUsIDExNywgMTA4LCAxMTYsIDg2LCA5NywgMTA4LCAxMTcsIDEwMSwgMSwgMCwgMjAsIDQwLCA0MSwgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDc5LCA5OCwgMTA2LCAxMDEsIDk5LCAxMTYsIDU5LCAxLCAwLCAzLCAxMTQsIDExNywgMTEwLCAxLCAwLCA5LCAxMTUsIDEwMSwgMTE2LCA4MiwgMTAxLCAxMTUsIDExNywgMTA4LCAxMTYsIDEsIDAsIDM4LCA0MCwgNzYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDc5LCA5OCwgMTA2LCAxMDEsIDk5LCAxMTYsIDU5LCA3NiwgMTA2LCA5NywgMTE4LCA5NywgNDcsIDEwOCwgOTcsIDExMCwgMTAzLCA0NywgNjcsIDEwOCwgOTcsIDExNSwgMTE1LCA1OSwgNDEsIDg2LCAxLCAwLCAxMCwgODMsIDExMSwgMTE3LCAxMTQsIDk5LCAxMDEsIDcwLCAxMDUsIDEwOCwgMTAxLCAxLCAwLCAxNiwgNjcsIDExMSwgMTAwLCAxMDEsIDgzLCAxMTAsIDEwNSwgMTEyLCAxMTIsIDEwMSwgMTE2LCA0NiwgMTA2LCA5NywgMTE4LCA5NywgMCwgMzMsIDAsIDIsIDAsIDQsIDAsIDAsIDAsIDMsIDAsIDIsIDAsIDUsIDAsIDYsIDAsIDAsIDAsIDIsIDAsIDcsIDAsIDgsIDAsIDAsIDAsIDgsIDAsIDksIDAsIDYsIDAsIDEsIDAsIDEwLCAwLCAwLCAwLCAwLCAwLCA1LCAwLCAxLCAwLCAxMSwgMCwgMTIsIDAsIDEsIDAsIDEzLCAwLCAwLCAwLCA1MywgMCwgMiwgMCwgMSwgMCwgMCwgMCwgMTcsIDQyLCAtNzMsIDAsIDE1LCA0MiwgLTc4LCAwLCAyMCwgLTc1LCAwLCAyMiwgNDIsIDEsIC03NSwgMCwgMjQsIC03OSwgMCwgMCwgMCwgMSwgMCwgMjUsIDAsIDAsIDAsIDE4LCAwLCA0LCAwLCAwLCAwLCAxNywgMCwgNCwgMCwgMTgsIDAsIDExLCAwLCAxOSwgMCwgMTYsIDAsIDE3LCAwLCAxLCAwLCAyNiwgMCwgMjcsIDAsIDEsIDAsIDEzLCAwLCAwLCAwLCAyOSwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgNSwgNDIsIC03NiwgMCwgMjIsIC04MCwgMCwgMCwgMCwgMSwgMCwgMjUsIDAsIDAsIDAsIDYsIDAsIDEsIDAsIDAsIDAsIDI0LCAwLCAxLCAwLCAyOCwgMCwgMjksIDAsIDEsIDAsIDEzLCAwLCAwLCAwLCAyOSwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgNSwgNDIsIC03NiwgMCwgMjQsIC04MCwgMCwgMCwgMCwgMSwgMCwgMjUsIDAsIDAsIDAsIDYsIDAsIDEsIDAsIDAsIDAsIDMwLCAwLCAxLCAwLCAzMCwgMCwgMTIsIDAsIDEsIDAsIDEzLCAwLCAwLCAwLCAyNSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgLTc5LCAwLCAwLCAwLCAxLCAwLCAyNSwgMCwgMCwgMCwgNiwgMCwgMSwgMCwgMCwgMCwgMzYsIDAsIDEsIDAsIDMxLCAwLCAzMiwgMCwgMSwgMCwgMTMsIDAsIDAsIDAsIDQzLCAwLCAyLCAwLCAzLCAwLCAwLCAwLCAxMSwgNDIsIDQzLCAtNzUsIDAsIDI0LCA0MiwgNDQsIC03NSwgMCwgMjIsIC03OSwgMCwgMCwgMCwgMSwgMCwgMjUsIDAsIDAsIDAsIDE0LCAwLCAzLCAwLCAwLCAwLCA0MiwgMCwgNSwgMCwgNDMsIDAsIDEwLCAwLCA0MSwgMCwgMSwgMCwgMzMsIDAsIDAsIDAsIDIsIDAsIDM0CiAJfTsKQEAgLTQ0NiwxNiArNDQ5LDYgQEAKIAlyZXR1cm4gdGhpcy5jb2RlU25pcHBldEJpbmFyeTsKIH0KIC8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoaW5jbHVkaW5nIHRoZSBwYWNrYWdlIG5hbWUpIG9mIHRoZSBnaXZlbiBjbGFzcyBmaWxlLgotICogVGhlIHNpbXBsZSBuYW1lIGRvZXNuJ3QgY29udGFpbiB0aGUgZXh0ZW5zaW9uICIuY2xhc3MiLgotICogVGhlIHJldHVybmVkIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGEgIi8iCi0gKi8KLXByaXZhdGUgU3RyaW5nIGdldFN1cHBvcnRDbGFzc0ZpbGVOYW1lKFN0cmluZyBzaW1wbGVOYW1lKSB7Ci0JY2hhciBzZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JY2hhcltdW10gY29tcG91bmRQYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIFBBQ0tBR0VfTkFNRSk7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kUGFja2FnZU5hbWUsIHNlcGFyYXRvcikpICsgc2VwYXJhdG9yICsgc2ltcGxlTmFtZSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi19Ci0vKioKICAqIENyZWF0ZXMgYSBuZXcgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIHR5cGUgYW5kIGluaXRpYWxpemVyLgogICogSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBpbml0aWFsaXplZCwgdGhlIGluaXRpYWxpemVyIGNhbiBiZSBudWxsLgogICogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBpbnN0YWxsIGl0IHRvIHRoaXMgZXZhbHVhdGlvbiBjb250ZXh0J3MgVk0uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRpb25SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCmluZGV4IGI1NzU3NDMuLjlhYjNiZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdGlvblJlc3VsdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKQEAgLTIxMCw3ICsyMTAsNyBAQAogCQkJYnJlYWs7CiAJfQogCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQlidWZmZXIuYXBwZW5kKHRoaXMuZXZhbHVhdGlvbklEKTsKKwlidWZmZXIuYXBwZW5kKHRoaXMuZXZhbHVhdGlvbklEID09IG51bGwgPyAiPHVua25vd24+Ii50b0NoYXJBcnJheSgpIDogdGhpcy5ldmFsdWF0aW9uSUQpOyAgLy8kTk9OLU5MUy0xJAogCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKIAlpZiAoaGFzUHJvYmxlbXMoKSkgewogCQlidWZmZXIuYXBwZW5kKCJQcm9ibGVtczpcbiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9FdmFsdWF0b3IuamF2YQppbmRleCAyOTFkZjU2Li5jNTM1N2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0V2YWx1YXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvRXZhbHVhdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xNSw2ICsxNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwpAQCAtMjQsNyArMjUsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEEgZXZhbHVhdG9yIGJ1aWxkcyBhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGNvbXBpbGVzIGl0IGludG8gY2xhc3MgZmlsZXMuCkBAIC02MSw3ICs2MSw3IEBACiAgKi8KIHByb3RlY3RlZCBFdmFsdWF0aW9uUmVzdWx0W10gZXZhbHVhdGlvblJlc3VsdHNGb3JDb21waWxhdGlvblByb2JsZW1zKENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIGN1U291cmNlKSB7CiAJLy8gQnJlYWsgZG93biB0aGUgcHJvYmxlbXMgYW5kIGdyb3VwIHRoZW0gYnkgaWRzIGluIGV2YWx1YXRpb24gcmVzdWx0cwotCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKKwlJUHJvYmxlbVtdIHByb2JsZW1zID0gcmVzdWx0LmdldEFsbFByb2JsZW1zKCk7CiAJSGFzaE1hcCByZXN1bHRzQnlJRHMgPSBuZXcgSGFzaE1hcCg1KTsKIAlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKSB7CiAJCWFkZEV2YWx1YXRpb25SZXN1bHRGb3JDb21waWxhdGlvblByb2JsZW0ocmVzdWx0c0J5SURzLCBwcm9ibGVtc1tpXSwgY3VTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9HbG9iYWxWYXJpYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9HbG9iYWxWYXJpYWJsZS5qYXZhCmluZGV4IGJkMzhjZWUuLjhhYmRmMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvR2xvYmFsVmFyaWFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0dsb2JhbFZhcmlhYmxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL0lSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSVJlcXVlc3Rvci5qYXZhCmluZGV4IGE3Y2U2ZWMuLjQ2ZGIyOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSVJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvSW5zdGFsbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JbnN0YWxsRXhjZXB0aW9uLmphdmEKaW5kZXggNDI3ZDBhNy4uMDcyYmIzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JbnN0YWxsRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9JbnN0YWxsRXhjZXB0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9WYXJpYWJsZXNFdmFsdWF0b3IuamF2YQppbmRleCA2YzU4ZDU5Li42NDg5YTBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0V2YWx1YXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2V2YWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2V2YWwvVmFyaWFibGVzRXZhbHVhdG9yLmphdmEKQEAgLTEsMTcgKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOwpAQCAtMjEsNyArMjIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CiAKIC8qKgpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRvcgogICovCiBwcm90ZWN0ZWQgY2hhcltdIGdldENsYXNzTmFtZSgpIHsKLQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5jb25jYXQodGhpcy5jb250ZXh0LkdMT0JBTF9WQVJTX0NMQVNTX05BTUVfUFJFRklYLCBJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuY29udGV4dC5WQVJfQ0xBU1NfQ09VTlRFUiArIDEpLnRvQ2hhckFycmF5KCkpOworCXJldHVybiBDaGFyT3BlcmF0aW9uLmNvbmNhdChFdmFsdWF0aW9uQ29udGV4dC5HTE9CQUxfVkFSU19DTEFTU19OQU1FX1BSRUZJWCwgSW50ZWdlci50b1N0cmluZyhFdmFsdWF0aW9uQ29udGV4dC5WQVJfQ0xBU1NfQ09VTlRFUiArIDEpLnRvQ2hhckFycmF5KCkpOwogfQogLyoqCiAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29tcGlsZXIgZm9yIHRoaXMgZXZhbHVhdG9yLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZXZhbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZXZhbC9WYXJpYWJsZXNJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0luZm8uamF2YQppbmRleCAyZmZmZDc2Li5jOTczNjA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ldmFsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9ldmFsL1ZhcmlhYmxlc0luZm8uamF2YQpAQCAtMSwxNyArMSwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGFsbGVkIHZhcmlhYmxlcyBzdWNoIGFzCkBAIC0yMCw3ICsyMCw3IEBACiAgKiBjb21waWxpbmcgdGhlIGNvZGUgc25pcHBldCkuCiAgKi8KIHB1YmxpYyBjbGFzcyBWYXJpYWJsZXNJbmZvIHsKLQlHbG9iYWxWYXJpYWJsZVtdIHZhcmlhYmxlczs7CisJR2xvYmFsVmFyaWFibGVbXSB2YXJpYWJsZXM7CiAJaW50IHZhcmlhYmxlQ291bnQ7CiAJY2hhcltdIHBhY2thZ2VOYW1lOwogCWNoYXJbXSBjbGFzc05hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9Db2RlRm9ybWF0dGVyLmphdmEKaW5kZXggZTAxMmRhNy4uYTdjMzEwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29kZUZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL0NvZGVGb3JtYXR0ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXI7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwpAQCAtMTgsMTAgKzE4LDExIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbmZpZ3VyYWJsZU9wdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmltcGwuRm9ybWF0dGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmltcGwuU3BsaXRMaW5lOwogCkBAIC0zMSwxNCArMzIsMTQgQEAKICAqIG9uIHRoaXMgaW5zdGFuY2UgdG8gZm9ybWF0IDxjb2RlPmFTdHJpbmc8L2NvZGU+LgogICogSXQgd2lsbCByZXR1cm4gdGhlIGZvcm1hdHRlZCBzdHJpbmcuPC91bD4KICovCi1wdWJsaWMgY2xhc3MgQ29kZUZvcm1hdHRlciBpbXBsZW1lbnRzIElUZXJtaW5hbFN5bWJvbHMsIElDb2RlRm9ybWF0dGVyIHsKK3B1YmxpYyBjbGFzcyBDb2RlRm9ybWF0dGVyIGltcGxlbWVudHMgVGVybWluYWxUb2tlbnMsIElDb2RlRm9ybWF0dGVyIHsKIAogCXB1YmxpYyBGb3JtYXR0ZXJPcHRpb25zIG9wdGlvbnM7CiAKIAkvKiogCiAJICogUmVwcmVzZW50cyBhIGJsb2NrIGluIHRoZSA8Y29kZT5jb25zdHJ1Y3Rpb25zPC9jb2RlPiBzdGFjay4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSyA9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMT0NLID0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lTEJSQUNFOwogCiAJLyoqIAogCSAqIFJlcHJlc2VudHMgYSBibG9jayBmb2xsb3dpbmcgYSBjb250cm9sIHN0YXRlbWVudCBpbiB0aGUgPGNvZGU+Y29uc3RydWN0aW9uczwvY29kZT4gc3RhY2suCkBAIC0xNDIsMjIgKzE0MywxNCBAQAogCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQ29kZSBGb3JtYXR0ZXIgdXNpbmcgdGhlIGdpdmVuIHNldHRpbmdzLgogCSAqLwogCXB1YmxpYyBDb2RlRm9ybWF0dGVyKE1hcCBzZXR0aW5ncykgewotCi0JCS8vIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUKLQkJY29uc3RydWN0aW9uc0NvdW50ID0gMDsKLQkJY29uc3RydWN0aW9ucyA9IG5ldyBpbnRbMTBdOwotCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsID0gaW5pdGlhbEluZGVudGF0aW9uTGV2ZWw7Ci0JCWN1cnJlbnRDb21tZW50T2Zmc2V0ID0gLTE7Ci0KIAkJLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgc2Nhbm5lcnMKLQkJc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUsIHRydWUpOyAvLyByZWd1bGFyIHNjYW5uZXIgZm9yIGZvcm1pbmcgbGluZXMKKwkJc2Nhbm5lciA9IG5ldyBTY2FubmVyKHRydWUgLypjb21tZW50Ki8sIHRydWUgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIGZhbHNlIC8qYXNzZXJ0Ki8sIG51bGwgLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovKTsgLy8gcmVndWxhciBzY2FubmVyIGZvciBmb3JtaW5nIGxpbmVzCisJCS8vIHRvIHJlY29yZCBwb3NpdGlvbnMgb2YgdGhlIGJlZ2lubmluZyBvZiBsaW5lcy4KIAkJc2Nhbm5lci5yZWNvcmRMaW5lU2VwYXJhdG9yID0gdHJ1ZTsKLQkJLy8gdG8gcmVtaW5kIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotCQlzcGxpdFNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0cnVlLCB0cnVlKTsKLQkJLy8gc2Vjb25kYXJ5IHNjYW5uZXIgdG8gc3BsaXQgbG9uZyBsaW5lcyBmb3JtZWQgYnkgcHJpbWFyeSBzY2FubmluZwogCi0JCS8vIGluaXRpYWxpemUgY3VycmVudCBsaW5lIGJ1ZmZlcgotCQljdXJyZW50TGluZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJLy8gc2Vjb25kYXJ5IHNjYW5uZXIgdG8gc3BsaXQgbG9uZyBsaW5lcyBmb3JtZWQgYnkgcHJpbWFyeSBzY2FubmluZworCQlzcGxpdFNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0cnVlIC8qY29tbWVudCovLCB0cnVlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBmYWxzZSAvKmFzc2VydCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CisKIAkJdGhpcy5vcHRpb25zID0gbmV3IEZvcm1hdHRlck9wdGlvbnMoc2V0dGluZ3MpOwogCX0KIApAQCAtMTc2LDcgKzE2OSw3IEBACiAJCX0KIAl9CiAJCi0JCS8qKiAKKwkvKiogCiAJICogQGRlcHJlY2F0ZWQgYmFja3BvcnQgMS4wIGludGVybmFsIGZ1bmN0aW9uYWxpdHkKIAkgKi8KIAlwcml2YXRlIHN0YXRpYyBNYXAgY29udmVydENvbmZpZ3VyYWJsZU9wdGlvbnMoQ29uZmlndXJhYmxlT3B0aW9uW10gc2V0dGluZ3MpIHsKQEAgLTIxMyw2ICsyMDYsOCBAQAogCQkJCQogCQkJCX0gZWxzZSBpZihvcHRpb25OYW1lLmVxdWFscygidGFidWxhdGlvbi5zaXplIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIsIFN0cmluZy52YWx1ZU9mKHZhbHVlSW5kZXgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfSBlbHNlIGlmIChvcHRpb25OYW1lLmVxdWFscygic3BhY2UuY2FzdGV4cHJlc3Npb24iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9wdGlvbnMucHV0KCJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuc3BhY2UuY2FzdGV4cHJlc3Npb24iLCB2YWx1ZUluZGV4ID09IDAgPyAiaW5zZXJ0IiA6ICJkbyBub3QgaW5zZXJ0IiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjg3LDEyICsyODIsMTYgQEAKIAkJCX0KIAkJfQogCQl1cGRhdGVNYXBwZWRQb3NpdGlvbnMoc2Nhbm5lci5zdGFydFBvc2l0aW9uKTsKKwkJCisJCXVwZGF0ZVJlbWFpbmluZ01hcHBlZFBvc2l0aW9ucygpOwogCX0KIAogCS8qKiAKIAkgKiBGb3JtYXRzIHRoZSBpbnB1dCBzdHJpbmcuCiAJICovCiAJcHJpdmF0ZSB2b2lkIGZvcm1hdCgpIHsKKwkJcmVzZXQoKTsKKwkJCiAJCWludCB0b2tlbiA9IDA7CiAJCWludCBwcmV2aW91c1Rva2VuID0gMDsKIAkJaW50IHByZXZpb3VzQ29tcGlsYWJsZVRva2VuID0gMDsKQEAgLTM0Niw2ICszNDUsMjIgQEAKIAkJCQkvLyBleGl0IHRoZSBsb29wLgogCQkJCXRyeSB7CiAJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQkJCisJCQkJCS8vIFBhdGNoIGZvciBsaW5lIGNvbW1lbnQKKwkJCQkJLy8gU2VlIFBSIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwOTYKKwkJCQkJaWYgKHRva2VuID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1FTlRfTElORSkgeworCQkJCQkJaW50IGxlbmd0aCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJCQkJbG9vcDogZm9yIChpbnQgaW5kZXggPSBsZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisJCQkJCQkJc3dpdGNoKHNjYW5uZXIuc291cmNlW2luZGV4XSkgeworCQkJCQkJCQljYXNlICdccicgOgorCQkJCQkJCQljYXNlICdcbicgOgorCQkJCQkJCQkJc2Nhbm5lci5jdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCQlpZiAoIWhhbmRsZUludmFsaWRUb2tlbihlKSkgewogCQkJCQkJdGhyb3cgZTsKQEAgLTkwMiw4ICs5MTcsMzggQEAKIAkJCQkJCQkmJiAocHJldmlvdXNUb2tlbiA9PSBUb2tlbk5hbWVMQlJBQ0UgfHwgdG9rZW4gPT0gVG9rZW5OYW1lUkJSQUNFKSkKIAkJCQkJCSYmIHByZXZpb3VzVG9rZW4gIT0gU2Nhbm5lci5Ub2tlbk5hbWVDT01NRU5UX0xJTkUpIHsKIAkJCQkJCWlmICgoIShvcHRpb25zLmNvbXBhY3RBc3NpZ25tZW50TW9kZSAmJiB0b2tlbiA9PSBUb2tlbk5hbWVFUVVBTCkpCi0JCQkJCQkJJiYgIW9wZW5BbmRDbG9zZUJyYWNlKQotCQkJCQkJCXNwYWNlKCk7CisJCQkJCQkJJiYgIW9wZW5BbmRDbG9zZUJyYWNlKSB7CisJCQkJCQkJCWlmIChwcmV2aW91c0NvbXBpbGFibGVUb2tlbiA9PSBUb2tlbk5hbWVSUEFSRU4pIHsKKwkJCQkJCQkJCXN3aXRjaCh0b2tlbikgeworCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lSWRlbnRpZmllciA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVEb3VibGVMaXRlcmFsIDoKKwkJCQkJCQkJCQljYXNlIFRva2VuTmFtZUludGVnZXJMaXRlcmFsIDoKKwkJCQkJCQkJCQljYXNlIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsIDoKKwkJCQkJCQkJCQljYXNlIFRva2VuTmFtZVN0cmluZ0xpdGVyYWwgOgorCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lQ2hhcmFjdGVyTGl0ZXJhbCA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVMb25nTGl0ZXJhbCA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVuZXcgOgorCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1ldGhpcyA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVzdXBlciA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVib29sZWFuIDoKKwkJCQkJCQkJCQljYXNlIFRva2VuTmFtZWJ5dGUgOgorCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lY2hhciA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVpbnQgOgorCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lbG9uZyA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVzaG9ydCA6CisJCQkJCQkJCQkJY2FzZSBUb2tlbk5hbWVkb3VibGUgOgorCQkJCQkJCQkJCWNhc2UgVG9rZW5OYW1lZmxvYXQgOgorCQkJCQkJCQkJCQlpZiAob3B0aW9ucy5pc0FkZGluZFNwYWNlSW5DYXN0RXhwcmVzc2lvbigpKSB7CisJCQkJCQkJCQkJCQlzcGFjZSgpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQkJCXNwYWNlKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlzcGFjZSgpOworCQkJCQkJCQl9CisJCQkJCQl9CiAJCQkJCX0KIAkJCQkJLy8gQWRkIHRoZSBuZXh0IHRva2VuIHRvIHRoZSBmb3JtYXR0ZWQgc291cmNlIHN0cmluZy4KIAkJCQkJb3V0cHV0Q3VycmVudFRva2VuKHRva2VuKTsKQEAgLTEwNjgsNyArMTExMyw4IEBACiAJCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJsaW5lLnNwbGl0IiwgIGxvY2FsZSwgb3B0aW9ucy5tYXhMaW5lTGVuZ3RoKSwvLyROT04tTkxTLTEkCiAJCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJzdHlsZS5jb21wYWN0QXNzaWdubWVudCIsICBsb2NhbGUsIG9wdGlvbnMuY29tcGFjdEFzc2lnbm1lbnRNb2RlID8gMCA6IDEpLCAvLyROT04tTkxTLTEkCiAJCQluZXcgQ29uZmlndXJhYmxlT3B0aW9uKGNvbXBvbmVudE5hbWUsICJ0YWJ1bGF0aW9uLmNoYXIiLCAgbG9jYWxlLCBvcHRpb25zLmluZGVudFdpdGhUYWIgPyAwIDogMSksIC8vJE5PTi1OTFMtMSQKLQkJCW5ldyBDb25maWd1cmFibGVPcHRpb24oY29tcG9uZW50TmFtZSwgInRhYnVsYXRpb24uc2l6ZSIsICBsb2NhbGUsIG9wdGlvbnMudGFiU2l6ZSkJLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAidGFidWxhdGlvbi5zaXplIiwgIGxvY2FsZSwgb3B0aW9ucy50YWJTaXplKSwJLy8kTk9OLU5MUy0xJAorCQkJbmV3IENvbmZpZ3VyYWJsZU9wdGlvbihjb21wb25lbnROYW1lLCAic3BhY2UuY2FzdGV4cHJlc3Npb24iLCAgbG9jYWxlLCBvcHRpb25zLnNwYWNlSW5DYXN0RXhwcmVzc2lvbiA/IDAgOiAxKQkvLyROT04tTkxTLTEkCiAJCX07CiAJfQogCkBAIC0xNzYxLDM3ICsxODA3LDYgQEAKIAl9CiAJCiAJLyoqCi0JICogUG9wcyB0aGUgdG9wIHN0YXRlbWVudCBvZiB0aGUgc3RhY2sgaWYgaXQgaXMgYSA8Y29kZT5CTE9DSzwvY29kZT4gb3IgYSA8Y29kZT5OT05JTkRFTlRfQkxPQ0s8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgaW50IHBvcEJsb2NrKCkgewotCQlpbnQgZGVsdGEgPSAwOwotCQlpZiAoKGNvbnN0cnVjdGlvbnNDb3VudCA+IDApCi0JCQkmJiAoKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gQkxPQ0spCi0JCQkJfHwgKGNvbnN0cnVjdGlvbnNbY29uc3RydWN0aW9uc0NvdW50IC0gMV0gPT0gTk9OSU5ERU5UX0JMT0NLKSkpIHsKLQkJCWlmIChjb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCAtIDFdID09IEJMT0NLKQotCQkJCWRlbHRhLS07Ci0JCQljb25zdHJ1Y3Rpb25zQ291bnQtLTsKLQkJfQotCQlyZXR1cm4gZGVsdGE7Ci0JfQotCQotCS8qKgotCSAqIFBvcHMgZWxlbWVudHMgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5IG9yIHRoZSB0b3AgZWxlbWVudCBpcyA8Y29kZT50b2tlbjwvY29kZT4uPGJyPgotCSAqIERvZXMgbm90IHJlbW92ZSA8Y29kZT50b2tlbjwvY29kZT4gZnJvbSB0aGUgc3RhY2suCi0JICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiB0byBiZSBsZWZ0IGFzIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICovCi0JcHJpdmF0ZSBpbnQgcG9wRXhjbHVzaXZlVW50aWwoaW50IHRva2VuKSB7Ci0JCWludCBkZWx0YSA9IDA7Ci0JCWludCBzdGFydENvdW50ID0gY29uc3RydWN0aW9uc0NvdW50OwotCQlmb3IgKGludCBpID0gc3RhcnRDb3VudCAtIDE7IGkgPj0gMCAmJiBjb25zdHJ1Y3Rpb25zW2ldICE9IHRva2VuOyBpLS0pIHsKLQkJCWlmIChjb25zdHJ1Y3Rpb25zW2ldICE9IE5PTklOREVOVF9CTE9DSykKLQkJCQlkZWx0YS0tOwotCQkJY29uc3RydWN0aW9uc0NvdW50LS07Ci0JCX0KLQkJcmV0dXJuIGRlbHRhOwotCX0KLQkKLQkvKioKIAkgKiBQb3BzIGVsZW1lbnRzIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSBvciB0aGUgdG9wIGVsZW1lbnQgaXMKIAkgKiBhIDxjb2RlPkJMT0NLPC9jb2RlPiBvciBhIDxjb2RlPk5PTklOREVOVF9CTE9DSzwvY29kZT4uPGJyPgogCSAqIERvZXMgbm90IHJlbW92ZSBpdCBmcm9tIHRoZSBzdGFjay4KQEAgLTE5MTQsNyArMTkyOSwyMCBAQAogCQljb25zdHJ1Y3Rpb25zW2NvbnN0cnVjdGlvbnNDb3VudCsrXSA9IHRva2VuOwogCQlyZXR1cm4gMTsKIAl9Ci0JCisKKwlwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisJCS8vIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUKKwkJY29uc3RydWN0aW9uc0NvdW50ID0gMDsKKwkJaWYgKGNvbnN0cnVjdGlvbnMgPT0gbnVsbCkgeworCQkJY29uc3RydWN0aW9ucyA9IG5ldyBpbnRbMTBdOwkJCisJCX0KKwkJY3VycmVudExpbmVJbmRlbnRhdGlvbkxldmVsID0gaW5kZW50YXRpb25MZXZlbCA9IGluaXRpYWxJbmRlbnRhdGlvbkxldmVsOworCQljdXJyZW50Q29tbWVudE9mZnNldCA9IC0xOworCisJCS8vIGluaXRpYWxpemUgY3VycmVudCBsaW5lIGJ1ZmZlcgorCQljdXJyZW50TGluZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwl9CisKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlcGFyYXRlRmlyc3RBcmd1bWVudE9uKGludCBjdXJyZW50VG9rZW4pIHsKIAkJLy9yZXR1cm4gKGN1cnJlbnRUb2tlbiA9PSBUb2tlbk5hbWVDT01NQSB8fCBjdXJyZW50VG9rZW4gPT0gVG9rZW5OYW1lU0VNSUNPTE9OKTsKIAkJcmV0dXJuIGN1cnJlbnRUb2tlbiAhPSBUb2tlbk5hbWVpZgpAQCAtMjQ3Niw3ICsyNTA0LDcgQEAKIAkJCQlpbmRleFRvTWFwID0gcG9zaXRpb25zVG9NYXAubGVuZ3RoOyAvLyBubyBtb3JlIG1hcHBpbmcKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzb3VyY2VbcG9zVG9NYXBdKSkgeworCQkJaWYgKENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKHNvdXJjZVtwb3NUb01hcF0pKSB7CiAJCQkJbWFwcGVkUG9zaXRpb25zW2luZGV4VG9NYXBdID0gc3RhcnRQb3NpdGlvbiArIGdsb2JhbERlbHRhICsgbGluZURlbHRhOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAocG9zVG9NYXAgPT0gc291cmNlTGVuZ3RoIC0gMSkgewpAQCAtMjUwMyw2ICsyNTMxLDIwIEBACiAJCQlpbmRleEluTWFwKys7CiAJCX0KIAl9CisKKwkvKioKKwkgKiBVcGRhdGUgcG9zaXRpb25zIHdoaWNoIGFyZSBiZXlvbmQgdGhlIHNvdXJjZSBsZW5ndGgKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlUmVtYWluaW5nTWFwcGVkUG9zaXRpb25zKCkgeworCQlpZiAocG9zaXRpb25zVG9NYXAgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBzb3VyY2VMZW5ndGggPSBmb3JtYXR0ZWRTb3VyY2UubGVuZ3RoKCk7CisJCXdoaWxlIChpbmRleFRvTWFwIDwgcG9zaXRpb25zVG9NYXAubGVuZ3RoKSB7CisJCQltYXBwZWRQb3NpdGlvbnNbaW5kZXhUb01hcF0gPSBzb3VyY2VMZW5ndGggLSAxOworCQkJaW5kZXhUb01hcCsrOworCQl9CisJfQogCQogCXByaXZhdGUgaW50IGdldExlbmd0aChTdHJpbmcgcywgaW50IHRhYkRlcHRoKSB7CiAJCWludCBsZW5ndGggPSAwOwpAQCAtMjUzMiw0ICsyNTc0LDQgQEAKIAkJdGhpcy5pbml0aWFsSW5kZW50YXRpb25MZXZlbCA9CiAJCQljdXJyZW50TGluZUluZGVudGF0aW9uTGV2ZWwgPSBpbmRlbnRhdGlvbkxldmVsID0gbmV3SW5kZW50YXRpb25MZXZlbDsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9Gb3JtYXR0ZXJPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQppbmRleCBiZGFhNjkzLi40YWI5YjY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL0Zvcm1hdHRlck9wdGlvbnMuamF2YQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL1NwbGl0TGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvaW1wbC9TcGxpdExpbmUuamF2YQppbmRleCA2ZWRkOTY2Li5lNzE4NjExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9pbXBsL1NwbGl0TGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvZm9ybWF0dGVyL2ltcGwvU3BsaXRMaW5lLmphdmEKQEAgLTEsMjAgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZm9ybWF0dGVyLmltcGw7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuVGVybWluYWxUb2tlbnM7CiAKIC8qKiBSZXByZXNlbnRzIGEgc3BsaXQgbGluZTogY29udGFpbnMgYW4gb3BlcmF0b3IgYW5kIGFsbCBzdWJzdHJpbmdzCiAqLwotcHVibGljIGNsYXNzIFNwbGl0TGluZSBpbXBsZW1lbnRzIElUZXJtaW5hbFN5bWJvbHN7CitwdWJsaWMgY2xhc3MgU3BsaXRMaW5lIGltcGxlbWVudHMgVGVybWluYWxUb2tlbnN7CiAJcHVibGljIGludFtdIG9wZXJhdG9yczsgLy8gdGhlIG9wZXJhdG9yIG9uIHdoaWNoIHRoZSBzdHJpbmcgd2FzIHNwbGl0LgogCXB1YmxpYyBTdHJpbmdbXSBzdWJzdHJpbmdzOwogCXB1YmxpYyBpbnRbXSBzdGFydFN1YnN0cmluZ3NJbmRleGVzOwpAQCAtNDQsOCArNDQsOCBAQAogCWZvciAoaW50IGk9MCxtYXg9c3Vic3RyaW5ncy5sZW5ndGg7aTxtYXg7aSsrKXsKIAkJaW50IGN1cnJlbnRPcGVyYXRvciA9IG9wZXJhdG9yc1tpXTsKIAkJU3RyaW5nIGN1cnJlbnRTdHJpbmcgPSBzdWJzdHJpbmdzW2ldOwotCQlib29sZWFuIHBsYWNlT3BlcmF0b3JBaGVhZCA9IGN1cnJlbnRPcGVyYXRvciAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1BICYmIGN1cnJlbnRPcGVyYXRvciAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVNFTUlDT0xPTjsKLQkJYm9vbGVhbiBwbGFjZU9wZXJhdG9yQmVoaW5kID0gY3VycmVudE9wZXJhdG9yID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudE9wZXJhdG9yID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lU0VNSUNPTE9OOworCQlib29sZWFuIHBsYWNlT3BlcmF0b3JBaGVhZCA9IGN1cnJlbnRPcGVyYXRvciAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQSAmJiBjdXJyZW50T3BlcmF0b3IgIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lU0VNSUNPTE9OOworCQlib29sZWFuIHBsYWNlT3BlcmF0b3JCZWhpbmQgPSBjdXJyZW50T3BlcmF0b3IgPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lQ09NTUEgfHwgY3VycmVudE9wZXJhdG9yID09IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVNFTUlDT0xPTjsKIAkJCiAKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvb3B0aW9ucy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZm9ybWF0dGVyL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9mb3JtYXR0ZXIvb3B0aW9ucy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGFiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9mb3JtYXR0ZXIvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2Zvcm1hdHRlci9vcHRpb25zLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK25ld2xpbmUub3BlbmluZ0JyYWNlLm51bWJlcj0xCituZXdsaW5lLm9wZW5pbmdCcmFjZS5jYXRlZ29yeT1OZXdsaW5lCituZXdsaW5lLm9wZW5pbmdCcmFjZS5uYW1lPUkmbnNlcnQgbmV3IGxpbmUgYmVmb3JlIG9wZW5pbmcgYnJhY2UKK25ld2xpbmUub3BlbmluZ0JyYWNlLnBvc3NpYmxlVmFsdWVzPTJ8SW5zZXJ0fERvIG5vdCBpbnNlcnQKK25ld2xpbmUub3BlbmluZ0JyYWNlLmRlc2NyaXB0aW9uPVdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJlZm9yZSBhbiBvcGVuaW5nIGJyYWNlLCBvdGhlcndpc2Ugbm90aGluZyBpcyBpbnNlcnRlZAorCituZXdsaW5lLmNvbnRyb2xTdGF0ZW1lbnQubnVtYmVyPTIKK25ld2xpbmUuY29udHJvbFN0YXRlbWVudC5jYXRlZ29yeT1OZXdsaW5lCituZXdsaW5lLmNvbnRyb2xTdGF0ZW1lbnQubmFtZT1JbnNlcnQgbmV3ICZsaW5lIGluIGNvbnRyb2wgc3RhdGVtZW50CituZXdsaW5lLmNvbnRyb2xTdGF0ZW1lbnQucG9zc2libGVWYWx1ZXM9MnxJbnNlcnR8RG8gbm90IGluc2VydAorbmV3bGluZS5jb250cm9sU3RhdGVtZW50LmRlc2NyaXB0aW9uPVdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJldHdlZW4gfSBhbmQgZWxzZSwgY2F0Y2gsIGZpbmFsbHkKKworbmV3bGluZS5jbGVhckFsbC5udW1iZXI9MworbmV3bGluZS5jbGVhckFsbC5jYXRlZ29yeT1OZXdsaW5lCituZXdsaW5lLmNsZWFyQWxsLm5hbWU9Q2xlYXIgYWxsICZibGFuayBsaW5lcworbmV3bGluZS5jbGVhckFsbC5wb3NzaWJsZVZhbHVlcz0yfENsZWFyfFByZXNlcnZlIG9uZQorbmV3bGluZS5jbGVhckFsbC5kZXNjcmlwdGlvbj1XaGVuIENsZWFyLCBhbGwgYmxhbmsgbGluZXMgYXJlIHJlbW92ZWQuIFdoZW4gUHJlc2VydmUgb25lLCBvbmx5IG9uZSBpcyBrZXB0IGFuZCBhbGwgb3RoZXJzIHJlbW92ZWQuCisKK25ld2xpbmUuZWxzZUlmLm51bWJlcj00CituZXdsaW5lLmVsc2VJZi5jYXRlZ29yeT1OZXdsaW5lCituZXdsaW5lLmVsc2VJZi5uYW1lPSZLZWVwIGVsc2UgaWYgb24gdGhlIHNhbWUgbGluZQorbmV3bGluZS5lbHNlSWYucG9zc2libGVWYWx1ZXM9MnxZZXN8Tm8KK25ld2xpbmUuZWxzZUlmLmRlc2NyaXB0aW9uPVdoZW4gWWVzLCBhIGJsYW5rIGxpbmUgaXMgaW5zZXJ0ZWQgYmV0d2VlbiBhIGVsc2UgYW5kIGEgaWYgd2hlbiB0aGV5IGFyZSBjb250aWd1b3VzCisKK25ld2xpbmUuZW1wdHlCbG9jay5udW1iZXI9NQorbmV3bGluZS5lbXB0eUJsb2NrLmNhdGVnb3J5PU5ld2xpbmUKK25ld2xpbmUuZW1wdHlCbG9jay5uYW1lPUluJnNlcnQgYSBuZXcgbGluZSBpbnNpZGUgYW4gZW1wdHkgYmxvY2sKK25ld2xpbmUuZW1wdHlCbG9jay5wb3NzaWJsZVZhbHVlcz0yfEluc2VydHxEbyBub3QgaW5zZXJ0CituZXdsaW5lLmVtcHR5QmxvY2suZGVzY3JpcHRpb249V2hlbiBpbnNlcnQsIGEgbGluZSBicmVhayBpcyBpbnNlcnRlZCBiZXR3ZWVuIGNvbnRpZ3VvdXMgeyBhbmQgfSwgaWYgfSBpcyBub3QgZm9sbG93ZWQgYnkgYSBrZXl3b3JkLgorCitsaW5lLnNwbGl0Lm51bWJlcj02CitsaW5lLnNwbGl0LmNhdGVnb3J5PUxpbmUgc3BsaXR0aW5nCitsaW5lLnNwbGl0Lm5hbWU9TWEmeGltdW0gbGluZSBsZW5ndGgKK2xpbmUuc3BsaXQucG9zc2libGVWYWx1ZXM9LTEKK2xpbmUuc3BsaXQuZGVzY3JpcHRpb249RW5hYmxlIHNwbGl0dGluZyBvZiBsb25nIGxpbmVzIChleGNlZWRpbmcgdGhlIGNvbmZpZ3VyYWJsZSBsZW5ndGgpLiBMZW5ndGggb2YgMCB3aWxsIGRpc2FibGUgbGluZSBzcGxpdHRpbmcKKworc3R5bGUuY29tcGFjdEFzc2lnbm1lbnQubnVtYmVyPTcKK3N0eWxlLmNvbXBhY3RBc3NpZ25tZW50LmNhdGVnb3J5PVN0eWxlCitzdHlsZS5jb21wYWN0QXNzaWdubWVudC5uYW1lPSZDb21wYWN0IGFzc2lnbm1lbnQKK3N0eWxlLmNvbXBhY3RBc3NpZ25tZW50LnBvc3NpYmxlVmFsdWVzPTJ8Q29tcGFjdHxOb3JtYWwKK3N0eWxlLmNvbXBhY3RBc3NpZ25tZW50LmRlc2NyaXB0aW9uPUFzc2lnbm1lbnRzIGNhbiBiZSBmb3JtYXR0ZWQgYXN5bW1ldHJpY2FsbHksIGUuZy4gJ2ludCB4PSAyOycsIHdoZW4gTm9ybWFsLCBhIHNwYWNlIGlzIGluc2VydGVkIGJlZm9yZSB0aGUgYXNzaWdubWVudCBvcGVyYXRvcgorCitzdHlsZS5yZXVzZUV4aXN0aW5nTGF5b3V0Lm51bWJlcj04CitzdHlsZS5yZXVzZUV4aXN0aW5nTGF5b3V0LmNhdGVnb3J5PVN0eWxlCitzdHlsZS5yZXVzZUV4aXN0aW5nTGF5b3V0Lm5hbWU9JlJldXNlIGV4aXN0aW5nIGxheW91dAorc3R5bGUucmV1c2VFeGlzdGluZ0xheW91dC5wb3NzaWJsZVZhbHVlcz0yfFJldXNlfERvIG5vdCByZXVzZQorc3R5bGUucmV1c2VFeGlzdGluZ0xheW91dC5kZXNjcmlwdGlvbj1JZiB0aGUgdXNlciBoYXMgZm9ybWF0dGVkIGhpcyBjb2RlIGEgY2VydGFpbiB3YXksIHRoZSBmb3JtYXR0ZXIgZG9lcyBub3QgdHJ5IHRvIHJlZm9ybWF0IGl0CisKK3RhYnVsYXRpb24uY2hhci5udW1iZXI9OQordGFidWxhdGlvbi5jaGFyLmNhdGVnb3J5PVN0eWxlCit0YWJ1bGF0aW9uLmNoYXIubmFtZT1JbmRlbnRhdGlvbiBpcyByZXByZXNlbnRlZCBieSAmdGFiCit0YWJ1bGF0aW9uLmNoYXIucG9zc2libGVWYWx1ZXM9MnxUYWJ8U3BhY2VzCit0YWJ1bGF0aW9uLmNoYXIuZGVzY3JpcHRpb249RWl0aGVyIGNob29zZSB0byBpbmRlbnQgd2l0aCB0YWIgY2hhcmFjdGVycyBvciBzcGFjZXMKKwordGFidWxhdGlvbi5zaXplLm51bWJlcj0xMAordGFidWxhdGlvbi5zaXplLmNhdGVnb3J5PVN0eWxlCit0YWJ1bGF0aW9uLnNpemUubmFtZT0mQW1vdW50IG9mIHNwYWNlcyByZXByZXNlbnRpbmcgYSB0YWIKK3RhYnVsYXRpb24uc2l6ZS5wb3NzaWJsZVZhbHVlcz0tMQordGFidWxhdGlvbi5zaXplLmRlc2NyaXB0aW9uPVRhYnVsYXRpb24gc2l6ZSBpbiB0ZXJtIG9mIHNwYWNlIGNoYXJhY3RlcnMKKworc3BhY2UuY2FzdGV4cHJlc3Npb24ubnVtYmVyPTExCitzcGFjZS5jYXN0ZXhwcmVzc2lvbi5jYXRlZ29yeT1TdHlsZQorc3BhY2UuY2FzdGV4cHJlc3Npb24ubmFtZT0mSW5zZXJ0IGEgc3BhY2UgaW4gY2FzdCBleHByZXNzaW9uCitzcGFjZS5jYXN0ZXhwcmVzc2lvbi5zaXplLnBvc3NpYmxlVmFsdWVzPTJ8SW5zZXJ0fERvIG5vdCBpbnNlcnQKK3NwYWNlLmNhc3RleHByZXNzaW9uLmRlc2NyaXB0aW9uPVdoZW4gaW5zZXJ0LCBhIHNwYWNlIGlzIGFkZGVkIGJldHdlZW4gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIHRoZSBleHByZXNzaW9uIG9mIHRoZSBjYXN0IGV4cHJlc3Npb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ncmFtbWFyL2phdmFfMV80LmcgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ncmFtbWFyL2phdmFfMV80LmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwY2E3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2dyYW1tYXIvamF2YV8xXzQuZwpAQCAtMCwwICsxLDEyNDkgQEAKKy0tbWFpbiBvcHRpb25zCislb3B0aW9ucyBBQ1RJT04sIEFOPUphdmFBY3Rpb24uamF2YSwgR1A9amF2YSwgCislb3B0aW9ucyBGSUxFLVBSRUZJWD1qYXZhLCBFU0NBUEU9JCwgUFJFRklYPVRva2VuTmFtZSwgT1VUUFVULVNJWkU9MTI1ICwKKyVvcHRpb25zIE5PR09UTy1ERUZBVUxULCBTSU5HTEUtUFJPRFVDVElPTlMsIExBTFI9MSAsIFRBQkxFPVRJTUUgLCAKKworLS1lcnJvciByZWNvdmVyaW5nIG9wdGlvbnMuLi4uLgorJW9wdGlvbnMgRVJST1JfTUFQUyAKKworLS1ncmFtbWFyIHVuZGVyc3RhbmRpbmcgb3B0aW9ucworJW9wdGlvbnMgZmlyc3QgZm9sbG93Cislb3B0aW9ucyBUUkFDRT1GVUxMICwKKyVvcHRpb25zIFZFUkJPU0UKKworLS1Vc2VmdWxsIG1hY3JvcyBoZWxwaW5nIHJlYWRpbmcvd3JpdGluZyBzZW1hbnRpYyBhY3Rpb25zCiskRGVmaW5lIAorJHB1dENhc2UgCisvLiAgICBjYXNlICRydWxlX251bWJlciA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJHJ1bGVfdGV4dCIpOyAgCisJCSAgIC4vCisKKyRicmVhaworLy4gCisJCQlicmVhayA7CisuLworCistLSBoZXJlIGl0IHN0YXJ0cyByZWFsbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskVGVybWluYWxzCisKKwlJZGVudGlmaWVyCisKKwlhYnN0cmFjdCBhc3NlcnQgYm9vbGVhbiBicmVhayBieXRlIGNhc2UgY2F0Y2ggY2hhciBjbGFzcyAKKwljb250aW51ZSBkZWZhdWx0IGRvIGRvdWJsZSBlbHNlIGV4dGVuZHMgZmFsc2UgZmluYWwgZmluYWxseSBmbG9hdAorCWZvciBpZiBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIGludAorCWludGVyZmFjZSBsb25nIG5hdGl2ZSBuZXcgbnVsbCBwYWNrYWdlIHByaXZhdGUKKwlwcm90ZWN0ZWQgcHVibGljIHJldHVybiBzaG9ydCBzdGF0aWMgc3RyaWN0ZnAgc3VwZXIgc3dpdGNoCisJc3luY2hyb25pemVkIHRoaXMgdGhyb3cgdGhyb3dzIHRyYW5zaWVudCB0cnVlIHRyeSB2b2lkCisJdm9sYXRpbGUgd2hpbGUKKworCUludGVnZXJMaXRlcmFsCisJTG9uZ0xpdGVyYWwKKwlGbG9hdGluZ1BvaW50TGl0ZXJhbAorCURvdWJsZUxpdGVyYWwKKwlDaGFyYWN0ZXJMaXRlcmFsCisJU3RyaW5nTGl0ZXJhbAorCisJUExVU19QTFVTCisJTUlOVVNfTUlOVVMKKwlFUVVBTF9FUVVBTAorCUxFU1NfRVFVQUwKKwlHUkVBVEVSX0VRVUFMCisJTk9UX0VRVUFMCisJTEVGVF9TSElGVAorCVJJR0hUX1NISUZUCisJVU5TSUdORURfUklHSFRfU0hJRlQKKwlQTFVTX0VRVUFMCisJTUlOVVNfRVFVQUwKKwlNVUxUSVBMWV9FUVVBTAorCURJVklERV9FUVVBTAorCUFORF9FUVVBTAorCU9SX0VRVUFMCisJWE9SX0VRVUFMCisJUkVNQUlOREVSX0VRVUFMCisJTEVGVF9TSElGVF9FUVVBTAorCVJJR0hUX1NISUZUX0VRVUFMCisJVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwKKwlPUl9PUgorCUFORF9BTkQKKwlQTFVTCisJTUlOVVMKKwlOT1QKKwlSRU1BSU5ERVIKKwlYT1IKKwlBTkQKKwlNVUxUSVBMWQorCU9SCisJVFdJRERMRQorCURJVklERQorCUdSRUFURVIKKwlMRVNTCisJTFBBUkVOCisJUlBBUkVOCisJTEJSQUNFCisJUkJSQUNFCisJTEJSQUNLRVQKKwlSQlJBQ0tFVAorCVNFTUlDT0xPTgorCVFVRVNUSU9OCisJQ09MT04KKwlDT01NQQorCURPVAorCUVRVUFMCisKKy0tICAgIEJvZHlNYXJrZXIKKworJEFsaWFzCisKKwknKysnICAgOjo9IFBMVVNfUExVUworCSctLScgICA6Oj0gTUlOVVNfTUlOVVMKKwknPT0nICAgOjo9IEVRVUFMX0VRVUFMCisJJzw9JyAgIDo6PSBMRVNTX0VRVUFMCisJJz49JyAgIDo6PSBHUkVBVEVSX0VRVUFMCisJJyE9JyAgIDo6PSBOT1RfRVFVQUwKKwknPDwnICAgOjo9IExFRlRfU0hJRlQKKwknPj4nICAgOjo9IFJJR0hUX1NISUZUCisJJz4+PicgIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVAorCScrPScgICA6Oj0gUExVU19FUVVBTAorCSctPScgICA6Oj0gTUlOVVNfRVFVQUwKKwknKj0nICAgOjo9IE1VTFRJUExZX0VRVUFMCisJJy89JyAgIDo6PSBESVZJREVfRVFVQUwKKwknJj0nICAgOjo9IEFORF9FUVVBTAorCSd8PScgICA6Oj0gT1JfRVFVQUwKKwknXj0nICAgOjo9IFhPUl9FUVVBTAorCSclPScgICA6Oj0gUkVNQUlOREVSX0VRVUFMCisJJzw8PScgIDo6PSBMRUZUX1NISUZUX0VRVUFMCisJJz4+PScgIDo6PSBSSUdIVF9TSElGVF9FUVVBTAorCSc+Pj49JyA6Oj0gVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwKKwknfHwnICAgOjo9IE9SX09SCisJJyYmJyAgIDo6PSBBTkRfQU5ECisKKwknKycgICAgOjo9IFBMVVMKKwknLScgICAgOjo9IE1JTlVTCisJJyEnICAgIDo6PSBOT1QKKwknJScgICAgOjo9IFJFTUFJTkRFUgorCSdeJyAgICA6Oj0gWE9SCisJJyYnICAgIDo6PSBBTkQKKwknKicgICAgOjo9IE1VTFRJUExZCisJJ3wnICAgIDo6PSBPUgorCSd+JyAgICA6Oj0gVFdJRERMRQorCScvJyAgICA6Oj0gRElWSURFCisJJz4nICAgIDo6PSBHUkVBVEVSCisJJzwnICAgIDo6PSBMRVNTCisJJygnICAgIDo6PSBMUEFSRU4KKwknKScgICAgOjo9IFJQQVJFTgorCSd7JyAgICA6Oj0gTEJSQUNFCisJJ30nICAgIDo6PSBSQlJBQ0UKKwknWycgICAgOjo9IExCUkFDS0VUCisJJ10nICAgIDo6PSBSQlJBQ0tFVAorCSc7JyAgICA6Oj0gU0VNSUNPTE9OCisJJz8nICAgIDo6PSBRVUVTVElPTgorCSc6JyAgICA6Oj0gQ09MT04KKwknLCcgICAgOjo9IENPTU1BCisJJy4nICAgIDo6PSBET1QKKwknPScgICAgOjo9IEVRVUFMCisJCiskU3RhcnQKKwlHb2FsCisKKyRSdWxlcworCisvLiAvLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5ICAKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVSdWxlKGludCBhY3QpIHsKKyAgc3dpdGNoICggYWN0ICkgeworLi8KKworCisKK0dvYWwgOjo9ICcrKycgQ29tcGlsYXRpb25Vbml0CitHb2FsIDo6PSAnLS0nIE1ldGhvZEJvZHkKK0dvYWwgOjo9ICc9PScgQ29uc3RydWN0b3JCb2R5CistLSBJbml0aWFsaXplcgorR29hbCA6Oj0gJz4+JyBTdGF0aWNJbml0aWFsaXplcgorR29hbCA6Oj0gJz4+JyBJbml0aWFsaXplcgorLS0gZXJyb3IgcmVjb3ZlcnkKK0dvYWwgOjo9ICc+Pj4nIEhlYWRlcnMKK0dvYWwgOjo9ICcqJyBCbG9ja1N0YXRlbWVudHMKK0dvYWwgOjo9ICcqJyBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyCitHb2FsIDo6PSAnKicgQ2F0Y2hIZWFkZXIKKy0tIEpET00KK0dvYWwgOjo9ICcmJicgRmllbGREZWNsYXJhdGlvbgorR29hbCA6Oj0gJ3x8JyBJbXBvcnREZWNsYXJhdGlvbgorR29hbCA6Oj0gJz8nIFBhY2thZ2VEZWNsYXJhdGlvbgorR29hbCA6Oj0gJysnIFR5cGVEZWNsYXJhdGlvbgorR29hbCA6Oj0gJy8nIEdlbmVyaWNNZXRob2REZWNsYXJhdGlvbgorR29hbCA6Oj0gJyYnIENsYXNzQm9keURlY2xhcmF0aW9uCistLSBjb2RlIHNuaXBwZXQKK0dvYWwgOjo9ICclJyBFeHByZXNzaW9uCistLSBjb21wbGV0aW9uIHBhcnNlcgorR29hbCA6Oj0gJyEnIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0CitHb2FsIDo6PSAnficgQmxvY2tTdGF0ZW1lbnRzb3B0CisKK0xpdGVyYWwgLT4gSW50ZWdlckxpdGVyYWwKK0xpdGVyYWwgLT4gTG9uZ0xpdGVyYWwKK0xpdGVyYWwgLT4gRmxvYXRpbmdQb2ludExpdGVyYWwKK0xpdGVyYWwgLT4gRG91YmxlTGl0ZXJhbAorTGl0ZXJhbCAtPiBDaGFyYWN0ZXJMaXRlcmFsCitMaXRlcmFsIC0+IFN0cmluZ0xpdGVyYWwKK0xpdGVyYWwgLT4gbnVsbAorTGl0ZXJhbCAtPiBCb29sZWFuTGl0ZXJhbAorQm9vbGVhbkxpdGVyYWwgLT4gdHJ1ZQorQm9vbGVhbkxpdGVyYWwgLT4gZmFsc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS1hIFR5cGUgcmVzdWx0cyBpbiBib3RoIGEgcHVzaCBvZiBpdHMgZGltZW5zaW9uKHMpIGFuZCBpdHMgbmFtZShzKS4KKworVHlwZSA6Oj0gUHJpbWl0aXZlVHlwZQorIC8uJHB1dENhc2UgY29uc3VtZVByaW1pdGl2ZVR5cGUoKTsgJGJyZWFrIC4vCitUeXBlIC0+IFJlZmVyZW5jZVR5cGUKKworUHJpbWl0aXZlVHlwZSAtPiBOdW1lcmljVHlwZQorTnVtZXJpY1R5cGUgLT4gSW50ZWdyYWxUeXBlCitOdW1lcmljVHlwZSAtPiBGbG9hdGluZ1BvaW50VHlwZQorCitQcmltaXRpdmVUeXBlIC0+ICdib29sZWFuJworUHJpbWl0aXZlVHlwZSAtPiAndm9pZCcKK0ludGVncmFsVHlwZSAtPiAnYnl0ZScKK0ludGVncmFsVHlwZSAtPiAnc2hvcnQnCitJbnRlZ3JhbFR5cGUgLT4gJ2ludCcKK0ludGVncmFsVHlwZSAtPiAnbG9uZycKK0ludGVncmFsVHlwZSAtPiAnY2hhcicKK0Zsb2F0aW5nUG9pbnRUeXBlIC0+ICdmbG9hdCcKK0Zsb2F0aW5nUG9pbnRUeXBlIC0+ICdkb3VibGUnCisKK1JlZmVyZW5jZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICAkYnJlYWsgLi8KK1JlZmVyZW5jZVR5cGUgLT4gQXJyYXlUeXBlIC0tIGhlcmUgYSBwdXNoIG9mIGRpbWVuc2lvbnMgaXMgZG9uZSwgdGhhdCBleHBsYWlucyB0aGUgdHdvIHByZXZpb3VzIHB1c2ggMAorCitDbGFzc09ySW50ZXJmYWNlVHlwZSAtPiBOYW1lCisKKy0tCistLSBUaGVzZSBydWxlcyBoYXZlIGJlZW4gcmV3cml0dGVuIHRvIGF2b2lkIHNvbWUgY29uZmxpY3RzIGludHJvZHVjZWQKKy0tIGJ5IGFkZGluZyB0aGUgMS4xIGZlYXR1cmVzCistLQorLS0gQXJyYXlUeXBlIDo6PSBQcmltaXRpdmVUeXBlICdbJyAnXScKKy0tIEFycmF5VHlwZSA6Oj0gTmFtZSAnWycgJ10nCistLSBBcnJheVR5cGUgOjo9IEFycmF5VHlwZSAnWycgJ10nCistLQorCitBcnJheVR5cGUgOjo9IFByaW1pdGl2ZVR5cGUgRGltcworQXJyYXlUeXBlIDo6PSBOYW1lIERpbXMKKworQ2xhc3NUeXBlIC0+IENsYXNzT3JJbnRlcmZhY2VUeXBlCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgLT4gU2ltcGxlTmFtZQorTmFtZSAtPiBRdWFsaWZpZWROYW1lCisKK1NpbXBsZU5hbWUgLT4gJ0lkZW50aWZpZXInCisKK1F1YWxpZmllZE5hbWUgOjo9IE5hbWUgJy4nIFNpbXBsZU5hbWUgCisvLiRwdXRDYXNlIGNvbnN1bWVRdWFsaWZpZWROYW1lKCk7ICRicmVhayAuLworCitDb21waWxhdGlvblVuaXQgOjo9IEVudGVyQ29tcGlsYXRpb25Vbml0IFBhY2thZ2VEZWNsYXJhdGlvbm9wdCBJbXBvcnREZWNsYXJhdGlvbnNvcHQgVHlwZURlY2xhcmF0aW9uc29wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ29tcGlsYXRpb25Vbml0KCk7ICRicmVhayAuLworCitFbnRlckNvbXBpbGF0aW9uVW5pdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbnRlckNvbXBpbGF0aW9uVW5pdCgpOyAkYnJlYWsgLi8KKworSGVhZGVycyAtPiBIZWFkZXIKK0hlYWRlcnMgOjo9IEhlYWRlcnMgSGVhZGVyCisKK0hlYWRlciAtPiBJbXBvcnREZWNsYXJhdGlvbgorSGVhZGVyIC0+IFBhY2thZ2VEZWNsYXJhdGlvbgorSGVhZGVyIC0+IENsYXNzSGVhZGVyCitIZWFkZXIgLT4gSW50ZXJmYWNlSGVhZGVyCitIZWFkZXIgLT4gU3RhdGljSW5pdGlhbGl6ZXIKK0hlYWRlciAtPiBNZXRob2RIZWFkZXIKK0hlYWRlciAtPiBDb25zdHJ1Y3RvckhlYWRlcgorSGVhZGVyIC0+IEZpZWxkRGVjbGFyYXRpb24KK0hlYWRlciAtPiBBbGxvY2F0aW9uSGVhZGVyCisKK0NhdGNoSGVhZGVyIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICd7JworLy4kcHV0Q2FzZSBjb25zdW1lQ2F0Y2hIZWFkZXIoKTsgJGJyZWFrIC4vCisKK0ltcG9ydERlY2xhcmF0aW9ucyAtPiBJbXBvcnREZWNsYXJhdGlvbgorSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgSW1wb3J0RGVjbGFyYXRpb24gCisvLiRwdXRDYXNlIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnMoKTsgJGJyZWFrIC4vCisKK1R5cGVEZWNsYXJhdGlvbnMgLT4gVHlwZURlY2xhcmF0aW9uCitUeXBlRGVjbGFyYXRpb25zIDo6PSBUeXBlRGVjbGFyYXRpb25zIFR5cGVEZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBjb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOyAkYnJlYWsgLi8KKworUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lICc7JworLy4kcHV0Q2FzZSAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gJ3BhY2thZ2UnIE5hbWUKKy8uJHB1dENhc2UgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLworCitJbXBvcnREZWNsYXJhdGlvbiAtPiBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24KK0ltcG9ydERlY2xhcmF0aW9uIC0+IFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uCisKK1NpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSAnOycKKy8uJHB1dENhc2UgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKwkJCSAgCitTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLworCQkJICAKK1R5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PSBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lICcuJyAnKicKKy8uJHB1dENhc2UgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOyAkYnJlYWsgLi8KKworVHlwZURlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KK1R5cGVEZWNsYXJhdGlvbiAtPiBJbnRlcmZhY2VEZWNsYXJhdGlvbgorLS0gdGhpcyBkZWNsYXJhdGlvbiBpbiBwYXJ0IG9mIGEgbGlzdCBvZCBkZWNsYXJhdGlvbiBhbmQgd2Ugd2lsbAorLS0gdXNlIGFuZCBvcHRpbWl6ZWQgbGlzdCBsZW5ndGggY2FsY3VsYXRpb24gcHJvY2VzcyAKKy0tIHRodXMgd2UgZGVjcmVtZW50IHRoZSBudW1iZXIgd2hpbGUgaXQgd2lsbCBiZSBpbmNyZW1lbmQuLi4uLgorVHlwZURlY2xhcmF0aW9uIDo6PSAnOycgCisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKKy0tMTguNyBPbmx5IGluIHRoZSBMQUxSKDEpIEdyYW1tYXIKKworTW9kaWZpZXJzIDo6PSBNb2RpZmllcgorTW9kaWZpZXJzIDo6PSBNb2RpZmllcnMgTW9kaWZpZXIKKworTW9kaWZpZXIgLT4gJ3B1YmxpYycgCitNb2RpZmllciAtPiAncHJvdGVjdGVkJworTW9kaWZpZXIgLT4gJ3ByaXZhdGUnCitNb2RpZmllciAtPiAnc3RhdGljJworTW9kaWZpZXIgLT4gJ2Fic3RyYWN0JworTW9kaWZpZXIgLT4gJ2ZpbmFsJworTW9kaWZpZXIgLT4gJ25hdGl2ZScKK01vZGlmaWVyIC0+ICdzeW5jaHJvbml6ZWQnCitNb2RpZmllciAtPiAndHJhbnNpZW50JworTW9kaWZpZXIgLT4gJ3ZvbGF0aWxlJworTW9kaWZpZXIgLT4gJ3N0cmljdGZwJworCistLTE4LjggUHJvZHVjdGlvbnMgZnJvbSA4OiBDbGFzcyBEZWNsYXJhdGlvbnMKKy0tQ2xhc3NNb2RpZmllciA6Oj0KKy0tICAgICAgJ2Fic3RyYWN0JworLS0gICAgfCAnZmluYWwnCistLSAgICB8ICdwdWJsaWMnCistLTE4LjguMSBQcm9kdWN0aW9ucyBmcm9tIDguMTogQ2xhc3MgRGVjbGFyYXRpb25zCisKK0NsYXNzRGVjbGFyYXRpb24gOjo9IENsYXNzSGVhZGVyIENsYXNzQm9keQorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXIgOjo9IENsYXNzSGVhZGVyTmFtZSBDbGFzc0hlYWRlckV4dGVuZHNvcHQgQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0hlYWRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgJ2NsYXNzJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXJFeHRlbmRzIDo6PSAnZXh0ZW5kcycgQ2xhc3NUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0hlYWRlckV4dGVuZHMoKTsgJGJyZWFrIC4vCisKK0NsYXNzSGVhZGVySW1wbGVtZW50cyA6Oj0gJ2ltcGxlbWVudHMnIEludGVyZmFjZVR5cGVMaXN0CisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0hlYWRlckltcGxlbWVudHMoKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZVR5cGVMaXN0IC0+IEludGVyZmFjZVR5cGUKK0ludGVyZmFjZVR5cGVMaXN0IDo6PSBJbnRlcmZhY2VUeXBlTGlzdCAnLCcgSW50ZXJmYWNlVHlwZQorLy4kcHV0Q2FzZSBjb25zdW1lSW50ZXJmYWNlVHlwZUxpc3QoKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VUeXBlKCk7ICRicmVhayAuLworCitDbGFzc0JvZHkgOjo9ICd7JyBDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgJ30nCisKK0NsYXNzQm9keURlY2xhcmF0aW9ucyA6Oj0gQ2xhc3NCb2R5RGVjbGFyYXRpb24KK0NsYXNzQm9keURlY2xhcmF0aW9ucyA6Oj0gQ2xhc3NCb2R5RGVjbGFyYXRpb25zIENsYXNzQm9keURlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnMoKTsgJGJyZWFrIC4vCisKK0NsYXNzQm9keURlY2xhcmF0aW9uIC0+IENsYXNzTWVtYmVyRGVjbGFyYXRpb24KK0NsYXNzQm9keURlY2xhcmF0aW9uIC0+IFN0YXRpY0luaXRpYWxpemVyCitDbGFzc0JvZHlEZWNsYXJhdGlvbiAtPiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCistLTEuMSBmZWF0dXJlCitDbGFzc0JvZHlEZWNsYXJhdGlvbiA6Oj0gRGlldCBOZXN0ZWRNZXRob2QgQmxvY2sKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9uKCk7ICRicmVhayAuLworRGlldCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVEaWV0KCk7ICRicmVhay4vCisKK0luaXRpYWxpemVyIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jaworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKK0NsYXNzTWVtYmVyRGVjbGFyYXRpb24gLT4gRmllbGREZWNsYXJhdGlvbgorQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiAtPiBNZXRob2REZWNsYXJhdGlvbgorLS0xLjEgZmVhdHVyZQorQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiAtPiBDbGFzc0RlY2xhcmF0aW9uCistLTEuMSBmZWF0dXJlCitDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IEludGVyZmFjZURlY2xhcmF0aW9uCisKKy0tIEVtcHR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHZhbGlkIEphdmEgQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbnMuCistLSBIb3dldmVyLCBzaW5jZSB0aGUgY3VycmVudCAoMi8xNC85NykgSmF2YSBjb21waWxlciBhY2NlcHRzIHRoZW0gCistLSAoaW4gZmFjdCwgc29tZSBvZiB0aGUgb2ZmaWNpYWwgdGVzdHMgY29udGFpbiB0aGlzIGVycm9uZW91cworLS0gc3ludGF4KQorCitHZW5lcmljTWV0aG9kRGVjbGFyYXRpb24gLT4gTWV0aG9kRGVjbGFyYXRpb24KK0dlbmVyaWNNZXRob2REZWNsYXJhdGlvbiAtPiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCisKK0NsYXNzTWVtYmVyRGVjbGFyYXRpb24gOjo9ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlDbGFzc01lbWJlckRlY2xhcmF0aW9uKCk7ICRicmVhay4vCisKKy0tMTguOC4yIFByb2R1Y3Rpb25zIGZyb20gOC4zOiBGaWVsZCBEZWNsYXJhdGlvbnMKKy0tVmFyaWFibGVNb2RpZmllciA6Oj0KKy0tICAgICAgJ3B1YmxpYycKKy0tICAgIHwgJ3Byb3RlY3RlZCcKKy0tICAgIHwgJ3ByaXZhdGUnCistLSAgICB8ICdzdGF0aWMnCistLSAgICB8ICdmaW5hbCcKKy0tICAgIHwgJ3RyYW5zaWVudCcKKy0tICAgIHwgJ3ZvbGF0aWxlJworCitGaWVsZERlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JzICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRmllbGREZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworVmFyaWFibGVEZWNsYXJhdG9ycyAtPiBWYXJpYWJsZURlY2xhcmF0b3IgCitWYXJpYWJsZURlY2xhcmF0b3JzIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JzICcsJyBWYXJpYWJsZURlY2xhcmF0b3IKKy8uJHB1dENhc2UgY29uc3VtZVZhcmlhYmxlRGVjbGFyYXRvcnMoKTsgJGJyZWFrIC4vCisKK1ZhcmlhYmxlRGVjbGFyYXRvciA6Oj0gVmFyaWFibGVEZWNsYXJhdG9ySWQgRW50ZXJWYXJpYWJsZSBFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24KKworVmFyaWFibGVEZWNsYXJhdG9yIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JJZCBFbnRlclZhcmlhYmxlICc9JyBGb3JjZU5vRGlldCBWYXJpYWJsZUluaXRpYWxpemVyIFJlc3RvcmVEaWV0IEV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbgorCitFbnRlclZhcmlhYmxlIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVudGVyVmFyaWFibGUoKTsgJGJyZWFrIC4vCisKK0V4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRoSW5pdGlhbGl6YXRpb24oKTsgJGJyZWFrIC4vCisKK0V4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbiA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFeGl0VmFyaWFibGVXaXRob3V0SW5pdGlhbGl6YXRpb24oKTsgJGJyZWFrIC4vCisKK0ZvcmNlTm9EaWV0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUZvcmNlTm9EaWV0KCk7ICRicmVhayAuLworUmVzdG9yZURpZXQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lUmVzdG9yZURpZXQoKTsgJGJyZWFrIC4vCisKK1ZhcmlhYmxlRGVjbGFyYXRvcklkIDo6PSAnSWRlbnRpZmllcicgRGltc29wdAorCitWYXJpYWJsZUluaXRpYWxpemVyIC0+IEV4cHJlc3Npb24KK1ZhcmlhYmxlSW5pdGlhbGl6ZXIgLT4gQXJyYXlJbml0aWFsaXplcgorCistLTE4LjguMyBQcm9kdWN0aW9ucyBmcm9tIDguNDogTWV0aG9kIERlY2xhcmF0aW9ucworLS1NZXRob2RNb2RpZmllciA6Oj0KKy0tICAgICAgJ3B1YmxpYycKKy0tICAgIHwgJ3Byb3RlY3RlZCcKKy0tICAgIHwgJ3ByaXZhdGUnCistLSAgICB8ICdzdGF0aWMnCistLSAgICB8ICdhYnN0cmFjdCcKKy0tICAgIHwgJ2ZpbmFsJworLS0gICAgfCAnbmF0aXZlJworLS0gICAgfCAnc3luY2hyb25pemVkJworLS0KKworTWV0aG9kRGVjbGFyYXRpb24gLT4gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgorTWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciBNZXRob2RCb2R5IAorLy4kcHV0Q2FzZSAvLyBzZXQgdG8gdHJ1ZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGggYSBib2R5CisgIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbih0cnVlKTsgICRicmVhayAuLworCitBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIDo6PSBNZXRob2RIZWFkZXIgJzsnCisvLiRwdXRDYXNlIC8vIHNldCB0byBmYWxzZSB0byBjb25zdW1lIGEgbWV0aG9kIHdpdGhvdXQgYm9keQorICBjb25zdW1lTWV0aG9kRGVjbGFyYXRpb24oZmFsc2UpOyAkYnJlYWsgLi8KKworTWV0aG9kSGVhZGVyIDo6PSBNZXRob2RIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIE1ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICRicmVhayAuLworCitNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyIDo6PSBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlckV4dGVuZGVkRGltcyBNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZEhlYWRlcigpOyAkYnJlYWsgLi8KKworTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUgOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hNb2RpZmllcnMgJ0lkZW50aWZpZXInICcoJyAKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzICdJZGVudGlmaWVyJyAnKCcgCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworTWV0aG9kSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgJ0lkZW50aWZpZXInICcoJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworTWV0aG9kSGVhZGVyUGFyYW1ldGVycyA6Oj0gRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCAnKScKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZEhlYWRlclBhcmFtZXRlcnMoKTsgJGJyZWFrIC4vCisKK01ldGhvZEhlYWRlckV4dGVuZGVkRGltcyA6Oj0gRGltc29wdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zKCk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2UgOjo9ICd0aHJvd3MnIENsYXNzVHlwZUxpc3QKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZEhlYWRlclRocm93c0NsYXVzZSgpOyAkYnJlYWsgLi8KKworQ29uc3RydWN0b3JIZWFkZXIgOjo9IENvbnN0cnVjdG9ySGVhZGVyTmFtZSBNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIE1ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ29uc3RydWN0b3JIZWFkZXIoKTsgJGJyZWFrIC4vCisKK0NvbnN0cnVjdG9ySGVhZGVyTmFtZSA6Oj0gIE1vZGlmaWVyc29wdCAnSWRlbnRpZmllcicgJygnCisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisKK0Zvcm1hbFBhcmFtZXRlckxpc3QgLT4gRm9ybWFsUGFyYW1ldGVyCitGb3JtYWxQYXJhbWV0ZXJMaXN0IDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0ICcsJyBGb3JtYWxQYXJhbWV0ZXIKKy8uJHB1dENhc2UgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3QoKTsgJGJyZWFrIC4vCisKKy0tMS4xIGZlYXR1cmUKK0Zvcm1hbFBhcmFtZXRlciA6Oj0gTW9kaWZpZXJzb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ySWQKKy8uJHB1dENhc2UgLy8gdGhlIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBtb2RpZmllcnMgc2hvdWxkIGJlIHJlc2V0CisgCWNvbnN1bWVGb3JtYWxQYXJhbWV0ZXIoKTsgJGJyZWFrIC4vCisKK0NsYXNzVHlwZUxpc3QgLT4gQ2xhc3NUeXBlRWx0CitDbGFzc1R5cGVMaXN0IDo6PSBDbGFzc1R5cGVMaXN0ICcsJyBDbGFzc1R5cGVFbHQKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzVHlwZUxpc3QoKTsgJGJyZWFrIC4vCisKK0NsYXNzVHlwZUVsdCA6Oj0gQ2xhc3NUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc1R5cGVFbHQoKTsgJGJyZWFrIC4vCisKKworTWV0aG9kQm9keSA6Oj0gTmVzdGVkTWV0aG9kICd7JyBCbG9ja1N0YXRlbWVudHNvcHQgJ30nIAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kQm9keSgpOyAkYnJlYWsgLi8KKworTmVzdGVkTWV0aG9kIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZU5lc3RlZE1ldGhvZCgpOyAkYnJlYWsgLi8KKworLS0xOC44LjQgUHJvZHVjdGlvbnMgZnJvbSA4LjU6IFN0YXRpYyBJbml0aWFsaXplcnMKKworU3RhdGljSW5pdGlhbGl6ZXIgOjo9ICBTdGF0aWNPbmx5IEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0aWNJbml0aWFsaXplcigpOyAkYnJlYWsuLworCitTdGF0aWNPbmx5IDo6PSAnc3RhdGljJworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGljT25seSgpOyAkYnJlYWsgLi8KKworLS0xOC44LjUgUHJvZHVjdGlvbnMgZnJvbSA4LjY6IENvbnN0cnVjdG9yIERlY2xhcmF0aW9ucworLS1Db25zdHJ1Y3Rvck1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAncHJvdGVjdGVkJworLS0gICAgfCAncHJpdmF0ZScKKy0tCistLQorQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5CisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgOyAkYnJlYWsgLi8gCisKKy0tIFRoZXNlIHJ1bGVzIGFyZSBhZGRlZCB0byBiZSBhYmxlIHRvIHBhcnNlIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGJvZHkKK0NvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyICc7JworLy4kcHV0Q2FzZSBjb25zdW1lSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICRicmVhayAuLyAKKworLS0gdGhlIHJ1bGVzIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9ub3B0IGhhcyBiZWVuIGV4cGFuZGVkCistLSBpbiB0aGUgcnVsZSBiZWxvdyBpbiBvcmRlciB0byBtYWtlIHRoZSBncmFtbWFyIGxhbHIoMSkuCistLSBDb25zdHJ1Y3RvckJvZHkgOjo9ICd7JyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbm9wdCBCbG9ja1N0YXRlbWVudHNvcHQgJ30nCistLSBPdGhlciBpbmxpbmluZyBoYXMgb2NjdXJlZCBpbnRvIHRoZSBuZXh0IHJ1bGUgdG9vLi4uLgorCitDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAgJ3snIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0ICd9JworLy4kcHV0Q2FzZSBjb25zdW1lQ29uc3RydWN0b3JCb2R5KCk7ICRicmVhayAuLworCitDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCAtPiBCbG9ja1N0YXRlbWVudHNvcHQKKworQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgLT4gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24KKworQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgOjo9IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIEJsb2NrU3RhdGVtZW50cworLy4kcHV0Q2FzZSAgY29uc3VtZUNvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzKCk7ICRicmVhayAuLworCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMCxFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5UaGlzKTsgJGJyZWFrIC4vCisKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMCxFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3N1cGVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgJGJyZWFrIC4vCisKKy0tMS4xIGZlYXR1cmUKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lICcuJyAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICd0aGlzJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDEsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICd0aGlzJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKDIsIEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAkYnJlYWsgLi8KKworLS0xOC45IFByb2R1Y3Rpb25zIGZyb20gOTogSW50ZXJmYWNlIERlY2xhcmF0aW9ucworCistLTE4LjkuMSBQcm9kdWN0aW9ucyBmcm9tIDkuMTogSW50ZXJmYWNlIERlY2xhcmF0aW9ucworLS1JbnRlcmZhY2VNb2RpZmllciA6Oj0KKy0tICAgICAgJ3B1YmxpYycKKy0tICAgIHwgJ2Fic3RyYWN0JworLS0KK0ludGVyZmFjZURlY2xhcmF0aW9uIDo6PSBJbnRlcmZhY2VIZWFkZXIgSW50ZXJmYWNlQm9keQorLy4kcHV0Q2FzZSBjb25zdW1lSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZUhlYWRlciA6Oj0gSW50ZXJmYWNlSGVhZGVyTmFtZSBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXIoKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZUhlYWRlck5hbWUgOjo9IE1vZGlmaWVyc29wdCAnaW50ZXJmYWNlJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZUhlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisKKy0tIFRoaXMgcnVsZSB3aWxsIGJlIHVzZWQgdG8gYWNjZXB0IGlubmVyIGxvY2FsIGludGVyZmFjZSBhbmQgdGhlbiByZXBvcnQgYSByZWxldmFudCBlcnJvciBtZXNzYWdlCitJbnZhbGlkSW50ZXJmYWNlRGVjbGFyYXRpb24gLT4gSW50ZXJmYWNlSGVhZGVyIEludGVyZmFjZUJvZHkKKworSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcyA6Oj0gJ2V4dGVuZHMnIEludGVyZmFjZVR5cGVMaXN0CisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJFeHRlbmRzKCk7ICRicmVhayAuLworCitJbnRlcmZhY2VCb2R5IDo6PSAneycgSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0ICd9JyAKKworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIC0+IEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgOjo9IEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBjb25zdW1lSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zKCk7ICRicmVhayAuLworCistLXNhbWUgYXMgZm9yIGNsYXNzIG1lbWJlcnMKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIDo6PSAnOycKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKKy0tIFRoaXMgcnVsZSBpcyBhZGRlZCB0byBiZSBhYmxlIHRvIHBhcnNlIG5vbiBhYnN0cmFjdCBtZXRob2QgaW5zaWRlIGludGVyZmFjZSBhbmQgdGhlbiByZXBvcnQgYSByZWxldmVudCBlcnJvciBtZXNzYWdlCitJbnZhbGlkTWV0aG9kRGVjbGFyYXRpb24gLT4gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkKKworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gLT4gQ29uc3RhbnREZWNsYXJhdGlvbgorSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9IEludmFsaWRNZXRob2REZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBpZ25vcmVNZXRob2RCb2R5KCk7ICRicmVhayAuLworCistLSBUaGVzZSBydWxlcyBhcmUgYWRkZWQgdG8gYmUgYWJsZSB0byBwYXJzZSBjb25zdHJ1Y3RvcnMgaW5zaWRlIGludGVyZmFjZSBhbmQgdGhlbiByZXBvcnQgYSByZWxldmVudCBlcnJvciBtZXNzYWdlCitJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgQ29uc3RydWN0b3JCb2R5CisvLiRwdXRDYXNlIGlnbm9yZUludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRydWUpOyAgJGJyZWFrIC4vCisKK0ludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciAnOycKKy8uJHB1dENhc2UgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24oZmFsc2UpOyAgJGJyZWFrIC4vCisKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24KK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCisgCistLTEuMSBmZWF0dXJlCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiAtPiBDbGFzc0RlY2xhcmF0aW9uCistLTEuMSBmZWF0dXJlCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiAtPiBJbnRlcmZhY2VEZWNsYXJhdGlvbgorCitDb25zdGFudERlY2xhcmF0aW9uIC0+IEZpZWxkRGVjbGFyYXRpb24KKworQXJyYXlJbml0aWFsaXplciA6Oj0gJ3snICxvcHQgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUFycmF5SW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCitBcnJheUluaXRpYWxpemVyIDo6PSAneycgVmFyaWFibGVJbml0aWFsaXplcnMgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7ICRicmVhayAuLworQXJyYXlJbml0aWFsaXplciA6Oj0gJ3snIFZhcmlhYmxlSW5pdGlhbGl6ZXJzICwgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUluaXRpYWxpemVyKCk7ICRicmVhayAuLworCitWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcgorVmFyaWFibGVJbml0aWFsaXplcnMgOjo9IFZhcmlhYmxlSW5pdGlhbGl6ZXJzICcsJyBWYXJpYWJsZUluaXRpYWxpemVyCisvLiRwdXRDYXNlIGNvbnN1bWVWYXJpYWJsZUluaXRpYWxpemVycygpOyAkYnJlYWsgLi8KKworQmxvY2sgOjo9IE9wZW5CbG9jayAneycgQmxvY2tTdGF0ZW1lbnRzb3B0ICd9JworLy4kcHV0Q2FzZSBjb25zdW1lQmxvY2soKTsgJGJyZWFrIC4vCitPcGVuQmxvY2sgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lT3BlbkJsb2NrKCkgOyAkYnJlYWsgLi8KKworQmxvY2tTdGF0ZW1lbnRzIC0+IEJsb2NrU3RhdGVtZW50CitCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyBCbG9ja1N0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lQmxvY2tTdGF0ZW1lbnRzKCkgOyAkYnJlYWsgLi8KKworQmxvY2tTdGF0ZW1lbnQgLT4gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50CitCbG9ja1N0YXRlbWVudCAtPiBTdGF0ZW1lbnQKKy0tMS4xIGZlYXR1cmUKK0Jsb2NrU3RhdGVtZW50IC0+IENsYXNzRGVjbGFyYXRpb24KK0Jsb2NrU3RhdGVtZW50IDo6PSBJbnZhbGlkSW50ZXJmYWNlRGVjbGFyYXRpb24KKy8uJHB1dENhc2UgaWdub3JlSW50ZXJmYWNlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKK0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA6Oj0gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uICc7JworLy4kcHV0Q2FzZSBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KCk7ICRicmVhayAuLworCitMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzCisvLiRwdXRDYXNlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKKy0tIDEuMSBmZWF0dXJlCistLSBUaGUgbW9kaWZpZXJzIHBhcnQgb2YgdGhpcyBydWxlIG1ha2VzIHRoZSBncmFtbWFyIG1vcmUgcGVybWlzc2l2ZS4gCistLSBUaGUgb25seSBtb2RpZmllciBoZXJlIGlzIGZpbmFsLiBXZSBwdXQgTW9kaWZpZXJzIHRvIGFsbG93IG11bHRpcGxlIG1vZGlmaWVycworLS0gVGhpcyB3aWxsIHJlcXVpcmUgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBtb2RpZmllcgorCitMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVycyBUeXBlIFB1c2hNb2RpZmllcnMgVmFyaWFibGVEZWNsYXJhdG9ycworLy4kcHV0Q2FzZSBjb25zdW1lTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitQdXNoTW9kaWZpZXJzIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZVB1c2hNb2RpZmllcnMoKTsgJGJyZWFrIC4vCisKK1N0YXRlbWVudCAtPiBTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBMYWJlbGVkU3RhdGVtZW50CitTdGF0ZW1lbnQgLT4gSWZUaGVuU3RhdGVtZW50CitTdGF0ZW1lbnQgLT4gSWZUaGVuRWxzZVN0YXRlbWVudAorU3RhdGVtZW50IC0+IFdoaWxlU3RhdGVtZW50CitTdGF0ZW1lbnQgLT4gRm9yU3RhdGVtZW50CisKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBMYWJlbGVkU3RhdGVtZW50Tm9TaG9ydElmCitTdGF0ZW1lbnROb1Nob3J0SWYgLT4gSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZgorU3RhdGVtZW50Tm9TaG9ydElmIC0+IFdoaWxlU3RhdGVtZW50Tm9TaG9ydElmCitTdGF0ZW1lbnROb1Nob3J0SWYgLT4gRm9yU3RhdGVtZW50Tm9TaG9ydElmCisKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBBc3NlcnRTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBCbG9jaworU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEVtcHR5U3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gRXhwcmVzc2lvblN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFN3aXRjaFN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IERvU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gQnJlYWtTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBDb250aW51ZVN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFJldHVyblN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFN5bmNocm9uaXplZFN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IFRocm93U3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gVHJ5U3RhdGVtZW50CisKK0VtcHR5U3RhdGVtZW50IDo6PSAnOycKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5U3RhdGVtZW50KCk7ICRicmVhayAuLworCitMYWJlbGVkU3RhdGVtZW50IDo6PSAnSWRlbnRpZmllcicgJzonIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICRicmVhayAuLworCitMYWJlbGVkU3RhdGVtZW50Tm9TaG9ydElmIDo6PSAnSWRlbnRpZmllcicgJzonIFN0YXRlbWVudE5vU2hvcnRJZgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50TGFiZWwoKSA7ICRicmVhayAuLworCitFeHByZXNzaW9uU3RhdGVtZW50IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uICc7JworLy4gJHB1dENhc2UgY29uc3VtZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTsgJGJyZWFrIC4vCisKK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IEFzc2lnbm1lbnQKK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IFByZUluY3JlbWVudEV4cHJlc3Npb24KK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IFByZURlY3JlbWVudEV4cHJlc3Npb24KK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RJbmNyZW1lbnRFeHByZXNzaW9uCitTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0RGVjcmVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gTWV0aG9kSW52b2NhdGlvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbgorCitJZlRoZW5TdGF0ZW1lbnQgOjo9ICAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudElmTm9FbHNlKCk7ICRicmVhayAuLworCitJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSAgJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyBTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudElmV2l0aEVsc2UoKTsgJGJyZWFrIC4vCisKK0lmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudE5vU2hvcnRJZgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAkYnJlYWsgLi8KKworU3dpdGNoU3RhdGVtZW50IDo6PSAnc3dpdGNoJyBPcGVuQmxvY2sgJygnIEV4cHJlc3Npb24gJyknIFN3aXRjaEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRTd2l0Y2goKSA7ICRicmVhayAuLworCitTd2l0Y2hCbG9jayA6Oj0gJ3snICd9JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlTd2l0Y2hCbG9jaygpIDsgJGJyZWFrIC4vCisKK1N3aXRjaEJsb2NrIDo6PSAneycgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzICd9JworU3dpdGNoQmxvY2sgOjo9ICd7JyBTd2l0Y2hMYWJlbHMgJ30nCitTd2l0Y2hCbG9jayA6Oj0gJ3snIFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hMYWJlbHMgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVTd2l0Y2hCbG9jaygpIDsgJGJyZWFrIC4vCisKK1N3aXRjaEJsb2NrU3RhdGVtZW50cyAtPiBTd2l0Y2hCbG9ja1N0YXRlbWVudAorU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIDo6PSBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgU3dpdGNoQmxvY2tTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaEJsb2NrU3RhdGVtZW50cygpIDsgJGJyZWFrIC4vCisKK1N3aXRjaEJsb2NrU3RhdGVtZW50IDo6PSBTd2l0Y2hMYWJlbHMgQmxvY2tTdGF0ZW1lbnRzCisvLiRwdXRDYXNlIGNvbnN1bWVTd2l0Y2hCbG9ja1N0YXRlbWVudCgpIDsgJGJyZWFrIC4vCisKK1N3aXRjaExhYmVscyAtPiBTd2l0Y2hMYWJlbAorU3dpdGNoTGFiZWxzIDo6PSBTd2l0Y2hMYWJlbHMgU3dpdGNoTGFiZWwKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaExhYmVscygpIDsgJGJyZWFrIC4vCisKK1N3aXRjaExhYmVsIDo6PSAnY2FzZScgQ29uc3RhbnRFeHByZXNzaW9uICc6JworLy4gJHB1dENhc2UgY29uc3VtZUNhc2VMYWJlbCgpOyAkYnJlYWsgLi8KKworU3dpdGNoTGFiZWwgOjo9ICdkZWZhdWx0JyAnOicKKy8uICRwdXRDYXNlIGNvbnN1bWVEZWZhdWx0TGFiZWwoKTsgJGJyZWFrIC4vCisKK1doaWxlU3RhdGVtZW50IDo6PSAnd2hpbGUnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFdoaWxlKCkgOyAkYnJlYWsgLi8KKworV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICd3aGlsZScgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudE5vU2hvcnRJZgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICRicmVhayAuLworCitEb1N0YXRlbWVudCA6Oj0gJ2RvJyBTdGF0ZW1lbnQgJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnREbygpIDsgJGJyZWFrIC4vCisKK0ZvclN0YXRlbWVudCA6Oj0gJ2ZvcicgJygnIEZvckluaXRvcHQgJzsnIEV4cHJlc3Npb25vcHQgJzsnIEZvclVwZGF0ZW9wdCAnKScgU3RhdGVtZW50CisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRGb3IoKSA7ICRicmVhayAuLworRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSAnZm9yJyAnKCcgRm9ySW5pdG9wdCAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudEZvcigpIDsgJGJyZWFrIC4vCisKKy0tdGhlIG1pbnVzIG9uZSBhbGxvd3MgdG8gYXZvaWQgYSBzdGFjay10by1zdGFjayB0cmFuc2ZlcgorRm9ySW5pdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QKKy8uJHB1dENhc2UgY29uc3VtZUZvckluaXQoKSA7ICRicmVhayAuLworRm9ySW5pdCAtPiBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24KKworRm9yVXBkYXRlIC0+IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0CisKK1N0YXRlbWVudEV4cHJlc3Npb25MaXN0IC0+IFN0YXRlbWVudEV4cHJlc3Npb24KK1N0YXRlbWVudEV4cHJlc3Npb25MaXN0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCAnLCcgU3RhdGVtZW50RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QoKSA7ICRicmVhayAuLworCistLSAxLjQgZmVhdHVyZQorQXNzZXJ0U3RhdGVtZW50IDo6PSAnYXNzZXJ0JyBFeHByZXNzaW9uICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU2ltcGxlQXNzZXJ0U3RhdGVtZW50KCkgOyAkYnJlYWsgLi8KKworQXNzZXJ0U3RhdGVtZW50IDo6PSAnYXNzZXJ0JyBFeHByZXNzaW9uICc6JyBFeHByZXNzaW9uICc7JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzZXJ0U3RhdGVtZW50KCkgOyAkYnJlYWsgLi8KKyAgICAgICAgICAKK0JyZWFrU3RhdGVtZW50IDo6PSAnYnJlYWsnICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50QnJlYWsoKSA7ICRicmVhayAuLworCitCcmVha1N0YXRlbWVudCA6Oj0gJ2JyZWFrJyBJZGVudGlmaWVyICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50QnJlYWtXaXRoTGFiZWwoKSA7ICRicmVhayAuLworCitDb250aW51ZVN0YXRlbWVudCA6Oj0gJ2NvbnRpbnVlJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudENvbnRpbnVlKCkgOyAkYnJlYWsgLi8KKworQ29udGludWVTdGF0ZW1lbnQgOjo9ICdjb250aW51ZScgSWRlbnRpZmllciAnOycKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudENvbnRpbnVlV2l0aExhYmVsKCkgOyAkYnJlYWsgLi8KKworUmV0dXJuU3RhdGVtZW50IDo6PSAncmV0dXJuJyBFeHByZXNzaW9ub3B0ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50UmV0dXJuKCkgOyAkYnJlYWsgLi8KKworVGhyb3dTdGF0ZW1lbnQgOjo9ICd0aHJvdycgRXhwcmVzc2lvbiAnOycKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRocm93KCk7CiskYnJlYWsgLi8KKworU3luY2hyb25pemVkU3RhdGVtZW50IDo6PSBPbmx5U3luY2hyb25pemVkICcoJyBFeHByZXNzaW9uICcpJyAgICBCbG9jaworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50U3luY2hyb25pemVkKCk7ICRicmVhayAuLworT25seVN5bmNocm9uaXplZCA6Oj0gJ3N5bmNocm9uaXplZCcKKy8uJHB1dENhc2UgY29uc3VtZU9ubHlTeW5jaHJvbml6ZWQoKTsgJGJyZWFrIC4vCisKKworVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgICBCbG9jayBDYXRjaGVzCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRUcnkoZmFsc2UpOyAkYnJlYWsgLi8KK1RyeVN0YXRlbWVudCA6Oj0gJ3RyeScgICAgQmxvY2sgQ2F0Y2hlc29wdCBGaW5hbGx5CisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRUcnkodHJ1ZSk7ICRicmVhayAuLworCitDYXRjaGVzIC0+IENhdGNoQ2xhdXNlCitDYXRjaGVzIDo6PSBDYXRjaGVzIENhdGNoQ2xhdXNlCisvLiRwdXRDYXNlIGNvbnN1bWVDYXRjaGVzKCk7ICRicmVhayAuLworCitDYXRjaENsYXVzZSA6Oj0gJ2NhdGNoJyAnKCcgRm9ybWFsUGFyYW1ldGVyICcpJyAgICBCbG9jaworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Q2F0Y2goKSA7ICRicmVhayAuLworCitGaW5hbGx5IDo6PSAnZmluYWxseScgICAgQmxvY2sKKworLS0xOC4xMiBQcm9kdWN0aW9ucyBmcm9tIDE0OiBFeHByZXNzaW9ucworCistLWZvciBzb3VyY2UgcG9zaXRpb25uaW5nIHB1cnBvc2UKK1B1c2hMUEFSRU4gOjo9ICcoJworLy4kcHV0Q2FzZSBjb25zdW1lTGVmdFBhcmVuKCk7ICRicmVhayAuLworUHVzaFJQQVJFTiA6Oj0gJyknCisvLiRwdXRDYXNlIGNvbnN1bWVSaWdodFBhcmVuKCk7ICRicmVhayAuLworCitQcmltYXJ5IC0+IFByaW1hcnlOb05ld0FycmF5CitQcmltYXJ5IC0+IEFycmF5Q3JlYXRpb25XaXRoQXJyYXlJbml0aWFsaXplcgorUHJpbWFyeSAtPiBBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIKKworUHJpbWFyeU5vTmV3QXJyYXkgLT4gTGl0ZXJhbAorUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICd0aGlzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gIFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIAorLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IC0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24KK1ByaW1hcnlOb05ld0FycmF5IC0+IEZpZWxkQWNjZXNzCistLTEuMSBmZWF0dXJlCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSAnLicgJ3RoaXMnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVUaGlzKCk7ICRicmVhayAuLworUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICdzdXBlcicKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVN1cGVyKCk7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCistLVByaW1hcnlOb05ld0FycmF5IDo6PSBUeXBlICcuJyAnY2xhc3MnICAgCistLWlubGluZSBUeXBlIGluIHRoZSBwcmV2aW91cyBydWxlIGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxIGluc3RlYWQgCistLSBvZiBMTDIuIFRoZSByZXN1bHQgaXMgdGhlIDMgbmV4dCBydWxlcy4KK1ByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lICcuJyAnY2xhc3MnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgJy4nICdjbGFzcycKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHJpbWl0aXZlVHlwZSAnLicgJ2NsYXNzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBNZXRob2RJbnZvY2F0aW9uCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBBcnJheUFjY2VzcworCistLTEuMSBmZWF0dXJlCistLQorLS0gSW4gSmF2YSAxLjAgYSBDbGFzc0JvZHkgY291bGQgbm90IGFwcGVhciBhdCBhbGwgaW4gYQorLS0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbi4KKy0tCisKK0FsbG9jYXRpb25IZWFkZXIgOjo9ICduZXcnIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lQWxsb2NhdGlvbkhlYWRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KKy0tMS4xIGZlYXR1cmUKKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpIDsgJGJyZWFrIC4vCisKK0NsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIDo6PSBOYW1lICcuJworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUoKSA7ICRicmVhayAuLworCitDbGFzc0JvZHlvcHQgOjo9ICRlbXB0eSAtLXRlc3QgbWFkZSB1c2luZyBudWxsIGFzIGNvbnRlbnRzCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlvcHQoKTsgJGJyZWFrIC4vCitDbGFzc0JvZHlvcHQgOjo9IEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IENsYXNzQm9keQorCitFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOyAkYnJlYWsgLi8KKworQXJndW1lbnRMaXN0IDo6PSBFeHByZXNzaW9uCitBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCAnLCcgRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICRicmVhayAuLworCitBcnJheUNyZWF0aW9uV2l0aG91dEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIFByaW1pdGl2ZVR5cGUgRGltV2l0aE9yV2l0aE91dEV4cHJzCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhvdXRJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KKworQXJyYXlDcmVhdGlvbldpdGhBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KKworQXJyYXlDcmVhdGlvbldpdGhvdXRBcnJheUluaXRpYWxpemVyIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5Q3JlYXRpb25FeHByZXNzaW9uV2l0aG91dEluaXRpYWxpemVyKCk7ICRicmVhayAuLworCitBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgOjo9ICduZXcnIENsYXNzT3JJbnRlcmZhY2VUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbldpdGhJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KKworRGltV2l0aE9yV2l0aE91dEV4cHJzIDo6PSBEaW1XaXRoT3JXaXRoT3V0RXhwcgorRGltV2l0aE9yV2l0aE91dEV4cHJzIDo6PSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgRGltV2l0aE9yV2l0aE91dEV4cHIKKy8uJHB1dENhc2UgY29uc3VtZURpbVdpdGhPcldpdGhPdXRFeHBycygpOyAkYnJlYWsgLi8KKworRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9ICdbJyBFeHByZXNzaW9uICddJworRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9ICdbJyAnXScKKy8uICRwdXRDYXNlIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcigpOyAkYnJlYWsgLi8KKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RpbXMgOjo9IERpbXNMb29wCisvLiAkcHV0Q2FzZSBjb25zdW1lRGltcygpOyAkYnJlYWsgLi8KK0RpbXNMb29wIC0+IE9uZURpbUxvb3AKK0RpbXNMb29wIDo6PSBEaW1zTG9vcCBPbmVEaW1Mb29wCitPbmVEaW1Mb29wIDo6PSAnWycgJ10nCisvLiAkcHV0Q2FzZSBjb25zdW1lT25lRGltTG9vcCgpOyAkYnJlYWsgLi8KKworRmllbGRBY2Nlc3MgOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJworLy4kcHV0Q2FzZSBjb25zdW1lRmllbGRBY2Nlc3MoZmFsc2UpOyAkYnJlYWsgLi8KKworRmllbGRBY2Nlc3MgOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJworLy4kcHV0Q2FzZSBjb25zdW1lRmllbGRBY2Nlc3ModHJ1ZSk7ICRicmVhayAuLworCitNZXRob2RJbnZvY2F0aW9uIDo6PSBOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uTmFtZSgpOyAkYnJlYWsgLi8KKworTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uUHJpbWFyeSgpOyAkYnJlYWsgLi8KKworTWV0aG9kSW52b2NhdGlvbiA6Oj0gJ3N1cGVyJyAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RJbnZvY2F0aW9uU3VwZXIoKTsgJGJyZWFrIC4vCisKK0FycmF5QWNjZXNzIDo6PSBOYW1lICdbJyBFeHByZXNzaW9uICddJworLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlBY2Nlc3ModHJ1ZSk7ICRicmVhayAuLworQXJyYXlBY2Nlc3MgOjo9IFByaW1hcnlOb05ld0FycmF5ICdbJyBFeHByZXNzaW9uICddJworLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlBY2Nlc3MoZmFsc2UpOyAkYnJlYWsgLi8KK0FycmF5QWNjZXNzIDo6PSBBcnJheUNyZWF0aW9uV2l0aEFycmF5SW5pdGlhbGl6ZXIgJ1snIEV4cHJlc3Npb24gJ10nCisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUFjY2VzcyhmYWxzZSk7ICRicmVhayAuLworCitQb3N0Zml4RXhwcmVzc2lvbiAtPiBQcmltYXJ5CitQb3N0Zml4RXhwcmVzc2lvbiA6Oj0gTmFtZQorLy4kcHV0Q2FzZSBjb25zdW1lUG9zdGZpeEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitQb3N0Zml4RXhwcmVzc2lvbiAtPiBQb3N0SW5jcmVtZW50RXhwcmVzc2lvbgorUG9zdGZpeEV4cHJlc3Npb24gLT4gUG9zdERlY3JlbWVudEV4cHJlc3Npb24KKworUG9zdEluY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uICcrKycKKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyx0cnVlKTsgJGJyZWFrIC4vCisKK1Bvc3REZWNyZW1lbnRFeHByZXNzaW9uIDo6PSBQb3N0Zml4RXhwcmVzc2lvbiAnLS0nCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTLHRydWUpOyAkYnJlYWsgLi8KKworLS1mb3Igc291cmNlIG1hbmFnbWVudCBwdXJwb3NlCitQdXNoUG9zaXRpb24gOjo9ICRlbXB0eQorIC8uJHB1dENhc2UgY29uc3VtZVB1c2hQb3NpdGlvbigpOyAkYnJlYWsgLi8KKworVW5hcnlFeHByZXNzaW9uIC0+IFByZUluY3JlbWVudEV4cHJlc3Npb24KK1VuYXJ5RXhwcmVzc2lvbiAtPiBQcmVEZWNyZW1lbnRFeHByZXNzaW9uCitVbmFyeUV4cHJlc3Npb24gOjo9ICcrJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMpOyAkYnJlYWsgLi8KK1VuYXJ5RXhwcmVzc2lvbiA6Oj0gJy0nIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMpOyAkYnJlYWsgLi8KK1VuYXJ5RXhwcmVzc2lvbiAtPiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKworUHJlSW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gJysrJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMsZmFsc2UpOyAkYnJlYWsgLi8KKworUHJlRGVjcmVtZW50RXhwcmVzc2lvbiA6Oj0gJy0tJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTLGZhbHNlKTsgJGJyZWFrIC4vCisKK1VuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyAtPiBQb3N0Zml4RXhwcmVzc2lvbgorVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIDo6PSAnficgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5UV0lERExFKTsgJGJyZWFrIC4vCitVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9ICchJyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk5PVCk7ICRicmVhayAuLworVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIC0+IENhc3RFeHByZXNzaW9uCisKK0Nhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIFByaW1pdGl2ZVR5cGUgRGltc29wdCBQdXNoUlBBUkVOIEluc2lkZUNhc3RFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCisgQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KKy0tIEV4cHJlc3Npb24gaXMgaGVyZSBvbmx5IGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxCitDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gSW5zaWRlQ2FzdEV4cHJlc3Npb25MTDEgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbkxMMSgpOyAkYnJlYWsgLi8KKworSW5zaWRlQ2FzdEV4cHJlc3Npb24gOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lSW5zaWRlQ2FzdEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVJbnNpZGVDYXN0RXhwcmVzc2lvbkxMMSgpOyAkYnJlYWsgLi8KKworTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIC0+IFVuYXJ5RXhwcmVzc2lvbgorTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJyonIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTVVMVElQTFkpOyAkYnJlYWsgLi8KK011bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICcvJyBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkRJVklERSk7ICRicmVhayAuLworTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDo6PSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJyUnIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUkVNQUlOREVSKTsgJGJyZWFrIC4vCisKK0FkZGl0aXZlRXhwcmVzc2lvbiAtPiBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK0FkZGl0aXZlRXhwcmVzc2lvbiA6Oj0gQWRkaXRpdmVFeHByZXNzaW9uICcrJyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlBMVVMpOyAkYnJlYWsgLi8KK0FkZGl0aXZlRXhwcmVzc2lvbiA6Oj0gQWRkaXRpdmVFeHByZXNzaW9uICctJyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1JTlVTKTsgJGJyZWFrIC4vCisKK1NoaWZ0RXhwcmVzc2lvbiAtPiBBZGRpdGl2ZUV4cHJlc3Npb24KK1NoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc8PCcgIEFkZGl0aXZlRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVGVF9TSElGVCk7ICRicmVhayAuLworU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJz4+JyAgQWRkaXRpdmVFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5SSUdIVF9TSElGVCk7ICRicmVhayAuLworU2hpZnRFeHByZXNzaW9uIDo6PSBTaGlmdEV4cHJlc3Npb24gJz4+PicgQWRkaXRpdmVFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5VTlNJR05FRF9SSUdIVF9TSElGVCk7ICRicmVhayAuLworCitSZWxhdGlvbmFsRXhwcmVzc2lvbiAtPiBTaGlmdEV4cHJlc3Npb24KK1JlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPCcgIFNoaWZ0RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTUyk7ICRicmVhayAuLworUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc+JyAgU2hpZnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5HUkVBVEVSKTsgJGJyZWFrIC4vCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJzw9JyBTaGlmdEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFU1NfRVFVQUwpOyAkYnJlYWsgLi8KK1JlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPj0nIFNoaWZ0RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uR1JFQVRFUl9FUVVBTCk7ICRicmVhayAuLworUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICdpbnN0YW5jZW9mJyBSZWZlcmVuY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVJbnN0YW5jZU9mRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uSU5TVEFOQ0VPRik7ICRicmVhayAuLworCitFcXVhbGl0eUV4cHJlc3Npb24gLT4gUmVsYXRpb25hbEV4cHJlc3Npb24KK0VxdWFsaXR5RXhwcmVzc2lvbiA6Oj0gRXF1YWxpdHlFeHByZXNzaW9uICc9PScgUmVsYXRpb25hbEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uRVFVQUxfRVFVQUwpOyAkYnJlYWsgLi8KK0VxdWFsaXR5RXhwcmVzc2lvbiA6Oj0gRXF1YWxpdHlFeHByZXNzaW9uICchPScgUmVsYXRpb25hbEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUVxdWFsaXR5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTk9UX0VRVUFMKTsgJGJyZWFrIC4vCisKK0FuZEV4cHJlc3Npb24gLT4gRXF1YWxpdHlFeHByZXNzaW9uCitBbmRFeHByZXNzaW9uIDo6PSBBbmRFeHByZXNzaW9uICcmJyBFcXVhbGl0eUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkFORCk7ICRicmVhayAuLworCitFeGNsdXNpdmVPckV4cHJlc3Npb24gLT4gQW5kRXhwcmVzc2lvbgorRXhjbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBFeGNsdXNpdmVPckV4cHJlc3Npb24gJ14nIEFuZEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlhPUik7ICRicmVhayAuLworCitJbmNsdXNpdmVPckV4cHJlc3Npb24gLT4gRXhjbHVzaXZlT3JFeHByZXNzaW9uCitJbmNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEluY2x1c2l2ZU9yRXhwcmVzc2lvbiAnfCcgRXhjbHVzaXZlT3JFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUik7ICRicmVhayAuLworCitDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gLT4gSW5jbHVzaXZlT3JFeHByZXNzaW9uCitDb25kaXRpb25hbEFuZEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiAnJiYnIEluY2x1c2l2ZU9yRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EX0FORCk7ICRicmVhayAuLworCitDb25kaXRpb25hbE9yRXhwcmVzc2lvbiAtPiBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24KK0NvbmRpdGlvbmFsT3JFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiAnfHwnIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uT1JfT1IpOyAkYnJlYWsgLi8KKworQ29uZGl0aW9uYWxFeHByZXNzaW9uIC0+IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uCitDb25kaXRpb25hbEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uICc/JyBFeHByZXNzaW9uICc6JyBDb25kaXRpb25hbEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUVVFU1RJT05DT0xPTikgOyAkYnJlYWsgLi8KKworQXNzaWdubWVudEV4cHJlc3Npb24gLT4gQ29uZGl0aW9uYWxFeHByZXNzaW9uCitBc3NpZ25tZW50RXhwcmVzc2lvbiAtPiBBc3NpZ25tZW50CisKK0Fzc2lnbm1lbnQgOjo9IFBvc3RmaXhFeHByZXNzaW9uIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudCgpOyAkYnJlYWsgLi8KKworLS0gdGhpcyBydWxlIGlzIGFkZGVkIHRvIHBhcnNlIGFuIGFycmF5IGluaXRpYWxpemVyIGluIGEgYXNzaWdtZW50IGFuZCB0aGVuIHJlcG9ydCBhIHN5bnRheCBlcnJvciBrbm93aW5nIHRoZSBleGFjdCBzZW5hcmlvCitJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50IDo6PSBQb3N0Zml4RXhwcmVzc2lvbiBBc3NpZ25tZW50T3BlcmF0b3IgQXJyYXlJbml0aWFsaXplcgorQXNzaWdubWVudCA6Oj0gSW52YWxpZEFycmF5SW5pdGlhbGl6ZXJBc3NpZ25lbWVudAorLy4kcHV0Y2FzZSBpZ25vcmVFeHByZXNzaW9uQXNzaWdubWVudCgpOyRicmVhayAuLworCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEVRVUFMKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcqPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNVUxUSVBMWSk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnLz0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRElWSURFKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICclPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJys9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFBMVVMpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJy09JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE1JTlVTKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc8PD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTEVGVF9TSElGVCk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnPj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc+Pj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcmPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJ149JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFhPUik7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnfD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoT1IpOyAkYnJlYWsgLi8KKworRXhwcmVzc2lvbiAtPiBBc3NpZ25tZW50RXhwcmVzc2lvbgorCitDb25zdGFudEV4cHJlc3Npb24gLT4gRXhwcmVzc2lvbgorCistLSBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBmb3Igb3B0aW9uYWwgbm9udGVybWluYWxzLgorLS0KKworUGFja2FnZURlY2xhcmF0aW9ub3B0IC0+ICRlbXB0eSAKK1BhY2thZ2VEZWNsYXJhdGlvbm9wdCAtPiBQYWNrYWdlRGVjbGFyYXRpb24KKworQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IDo6PSAkZW1wdHkKK0NsYXNzSGVhZGVyRXh0ZW5kc29wdCAtPiBDbGFzc0hlYWRlckV4dGVuZHMKKworRXhwcmVzc2lvbm9wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitFeHByZXNzaW9ub3B0IC0+IEV4cHJlc3Npb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSBUaGUgcnVsZXMgYmVsb3cgYXJlIGZvciBvcHRpb25hbCB0ZXJtaW5hbCBzeW1ib2xzLiAgQW4gb3B0aW9uYWwgY29tbWEsCistLSBpcyBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgLSBJdCBpcyBhCistLSAic3ludGFjdGljIHN1Z2FyIiB0aGF0IG90aGVyd2lzZSBzZXJ2ZXMgbm8gb3RoZXIgcHVycG9zZS4gQnkgY29udHJhc3QsCistLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgYSBicmVhayBhbmQgCistLSBjb250aW51ZSBzdGF0ZW1lbnQuIFdoZW4gdGhlIGlkZW50aWZpZXIgZG9lcyBub3QgYXBwZWFyLCBhIE5VTEwKKy0tIGlzIHByb2R1Y2VkLiBXaGVuIHRoZSBpZGVudGlmaWVyIGlzIHByZXNlbnQsIHRoZSB1c2VyIHNob3VsZCB1c2UgdGhlCistLSBjb3JyZXNwb25kaW5nIFRPS0VOKGkpIG1ldGhvZC4gU2VlIGJyZWFrIHN0YXRlbWVudCBhcyBhbiBleGFtcGxlLgorLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCissb3B0IC0+ICRlbXB0eQorLG9wdCAtPiAsCisKK0ltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUltcG9ydERlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KK0ltcG9ydERlY2xhcmF0aW9uc29wdCA6Oj0gSW1wb3J0RGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCisKKworVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eVR5cGVEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCitUeXBlRGVjbGFyYXRpb25zb3B0IDo6PSBUeXBlRGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlRGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworCitDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCitDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQgOjo9IE5lc3RlZFR5cGUgQ2xhc3NCb2R5RGVjbGFyYXRpb25zCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCisKK01vZGlmaWVyc29wdCA6Oj0gJGVtcHR5IAorLy4gJHB1dENhc2UgY29uc3VtZURlZmF1bHRNb2RpZmllcnMoKTsgJGJyZWFrIC4vCitNb2RpZmllcnNvcHQgOjo9IE1vZGlmaWVycyAKKy8uJHB1dENhc2UgY29uc3VtZU1vZGlmaWVycygpOyAkYnJlYWsgLi8gCisKK0Jsb2NrU3RhdGVtZW50c29wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUJsb2NrU3RhdGVtZW50c29wdCgpOyAkYnJlYWsgLi8KK0Jsb2NrU3RhdGVtZW50c29wdCAtPiBCbG9ja1N0YXRlbWVudHMKKworRGltc29wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlEaW1zb3B0KCk7ICRicmVhayAuLworRGltc29wdCAtPiBEaW1zCisKK0FyZ3VtZW50TGlzdG9wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlBcmd1bWVudExpc3RvcHQoKTsgJGJyZWFrIC4vCitBcmd1bWVudExpc3RvcHQgLT4gQXJndW1lbnRMaXN0CisKK01ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdCA6Oj0gJGVtcHR5CitNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQgLT4gTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlCisgICAKK0Zvcm1hbFBhcmFtZXRlckxpc3RvcHQgOjo9ICRlbXB0eQorLy4kcHV0Y2FzZSBjb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdG9wdCgpOyAkYnJlYWsgLi8KK0Zvcm1hbFBhcmFtZXRlckxpc3RvcHQgLT4gRm9ybWFsUGFyYW1ldGVyTGlzdAorCitDbGFzc0hlYWRlckltcGxlbWVudHNvcHQgOjo9ICRlbXB0eQorQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0IC0+IENsYXNzSGVhZGVySW1wbGVtZW50cworCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucworLy4gJHB1dENhc2UgY29uc3VtZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KKworTmVzdGVkVHlwZSA6Oj0gJGVtcHR5IAorLy4kcHV0Q2FzZSBjb25zdW1lTmVzdGVkVHlwZSgpOyAkYnJlYWsuLworCitGb3JJbml0b3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUZvckluaXRvcHQoKTsgJGJyZWFrIC4vCitGb3JJbml0b3B0IC0+IEZvckluaXQKKworRm9yVXBkYXRlb3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUZvclVwZGF0ZW9wdCgpOyAkYnJlYWsgLi8KKyBGb3JVcGRhdGVvcHQgLT4gRm9yVXBkYXRlCisKK0ludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQgOjo9ICRlbXB0eQorSW50ZXJmYWNlSGVhZGVyRXh0ZW5kc29wdCAtPiBJbnRlcmZhY2VIZWFkZXJFeHRlbmRzCisKK0NhdGNoZXNvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5Q2F0Y2hlc29wdCgpOyAkYnJlYWsgLi8KK0NhdGNoZXNvcHQgLT4gQ2F0Y2hlcworCisvLgl9Cit9IC4vCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiskbmFtZXMKKworLS0gQm9keU1hcmtlciA6Oj0gJyJjbGFzcyBJZGVudGlmaWVyIHsgLi4uIE1ldGhvZEhlYWRlciAiJworCistLSB2b2lkIDo6PSAndm9pZCcKKworUExVU19QTFVTIDo6PSAgICAnKysnICAgCitNSU5VU19NSU5VUyA6Oj0gICAgJy0tJyAgIAorRVFVQUxfRVFVQUwgOjo9ICAgICc9PScgICAKK0xFU1NfRVFVQUwgOjo9ICAgICc8PScgICAKK0dSRUFURVJfRVFVQUwgOjo9ICAgICc+PScgICAKK05PVF9FUVVBTCA6Oj0gICAgJyE9JyAgIAorTEVGVF9TSElGVCA6Oj0gICAgJzw8JyAgIAorUklHSFRfU0hJRlQgOjo9ICAgICc+PicgICAKK1VOU0lHTkVEX1JJR0hUX1NISUZUIDo6PSAgICAnPj4+JyAgCitQTFVTX0VRVUFMIDo6PSAgICAnKz0nICAgCitNSU5VU19FUVVBTCA6Oj0gICAgJy09JyAgIAorTVVMVElQTFlfRVFVQUwgOjo9ICAgICcqPScgICAKK0RJVklERV9FUVVBTCA6Oj0gICAgJy89JyAgIAorQU5EX0VRVUFMIDo6PSAgICAnJj0nICAgCitPUl9FUVVBTCA6Oj0gICAgJ3w9JyAgIAorWE9SX0VRVUFMIDo6PSAgICAnXj0nICAgCitSRU1BSU5ERVJfRVFVQUwgOjo9ICAgICclPScgICAKK0xFRlRfU0hJRlRfRVFVQUwgOjo9ICAgICc8PD0nICAKK1JJR0hUX1NISUZUX0VRVUFMIDo6PSAgICAnPj49JyAgCitVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTCA6Oj0gICAgJz4+Pj0nIAorT1JfT1IgOjo9ICAgICd8fCcgICAKK0FORF9BTkQgOjo9ICAgICcmJicgICAKKworUExVUyA6Oj0gICAgJysnICAgIAorTUlOVVMgOjo9ICAgICctJyAgICAKK05PVCA6Oj0gICAgJyEnICAgIAorUkVNQUlOREVSIDo6PSAgICAnJScgICAgCitYT1IgOjo9ICAgICdeJyAgICAKK0FORCA6Oj0gICAgJyYnICAgIAorTVVMVElQTFkgOjo9ICAgICcqJyAgICAKK09SIDo6PSAgICAnfCcgICAgCitUV0lERExFIDo6PSAgICAnficgICAgCitESVZJREUgOjo9ICAgICcvJyAgICAKK0dSRUFURVIgOjo9ICAgICc+JyAgICAKK0xFU1MgOjo9ICAgICc8JyAgICAKK0xQQVJFTiA6Oj0gICAgJygnICAgIAorUlBBUkVOIDo6PSAgICAnKScgICAgCitMQlJBQ0UgOjo9ICAgICd7JyAgICAKK1JCUkFDRSA6Oj0gICAgJ30nICAgIAorTEJSQUNLRVQgOjo9ICAgICdbJyAgICAKK1JCUkFDS0VUIDo6PSAgICAnXScgICAgCitTRU1JQ09MT04gOjo9ICAgICc7JyAgICAKK1FVRVNUSU9OIDo6PSAgICAnPycgICAgCitDT0xPTiA6Oj0gICAgJzonICAgIAorQ09NTUEgOjo9ICAgICcsJyAgICAKK0RPVCA6Oj0gICAgJy4nICAgIAorRVFVQUwgOjo9ICAgICc9JyAgICAKKworJGVuZAorLS0gbmVlZCBhIGNhcnJpYWdlIHJldHVybiBhZnRlciB0aGUgJGVuZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvZ3JhbW1hci9qYXZhXzFfNS5nIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvZ3JhbW1hci9qYXZhXzFfNS5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjUxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ncmFtbWFyL2phdmFfMV81LmcKQEAgLTAsMCArMSwxMzQwIEBACistLW1haW4gb3B0aW9ucworJW9wdGlvbnMgQUNUSU9OLCBBTj1KYXZhQWN0aW9uLmphdmEsIEdQPWphdmEsIENPTkZMSUNUUywgV0FSTklOR1MsCislb3B0aW9ucyBGSUxFLVBSRUZJWD1qYXZhLCBFU0NBUEU9JCwgUFJFRklYPVRva2VuTmFtZSwgT1VUUFVULVNJWkU9MTI1ICwKKyVvcHRpb25zIE5PR09UTy1ERUZBVUxULCBTSU5HTEUtUFJPRFVDVElPTlMsIExBTFI9MSAsIFRBQkxFPVRJTUUgLCAKKworLS1lcnJvciByZWNvdmVyaW5nIG9wdGlvbnMuLi4uLgorJW9wdGlvbnMgRVJST1JfTUFQUyAKKworLS1ncmFtbWFyIHVuZGVyc3RhbmRpbmcgb3B0aW9ucworJW9wdGlvbnMgZmlyc3QgZm9sbG93Cislb3B0aW9ucyBUUkFDRT1GVUxMICwKKyVvcHRpb25zIFZFUkJPU0UKKworLS1Vc2VmdWxsIG1hY3JvcyBoZWxwaW5nIHJlYWRpbmcvd3JpdGluZyBzZW1hbnRpYyBhY3Rpb25zCiskRGVmaW5lIAorJHB1dENhc2UgCisvLiAgICBjYXNlICRydWxlX251bWJlciA6IC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJHJ1bGVfdGV4dCIpOyAgCisJCSAgIC4vCisKKyRicmVhaworLy4gCisJCQlicmVhayA7CisuLworCistLSBoZXJlIGl0IHN0YXJ0cyByZWFsbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskVGVybWluYWxzCisKKwlJZGVudGlmaWVyCisKKwlhYnN0cmFjdCBhc3NlcnQgYm9vbGVhbiBicmVhayBieXRlIGNhc2UgY2F0Y2ggY2hhciBjbGFzcyAKKwljb250aW51ZSBkZWZhdWx0IGRvIGRvdWJsZSBlbHNlIGV4dGVuZHMgZmFsc2UgZmluYWwgZmluYWxseSBmbG9hdAorCWZvciBpZiBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIGludAorCWludGVyZmFjZSBsb25nIG5hdGl2ZSBuZXcgbnVsbCBwYWNrYWdlIHByaXZhdGUKKwlwcm90ZWN0ZWQgcHVibGljIHJldHVybiBzaG9ydCBzdGF0aWMgc3RyaWN0ZnAgc3VwZXIgc3dpdGNoCisJc3luY2hyb25pemVkIHRoaXMgdGhyb3cgdGhyb3dzIHRyYW5zaWVudCB0cnVlIHRyeSB2b2lkCisJdm9sYXRpbGUgd2hpbGUKKworCUludGVnZXJMaXRlcmFsCisJTG9uZ0xpdGVyYWwKKwlGbG9hdGluZ1BvaW50TGl0ZXJhbAorCURvdWJsZUxpdGVyYWwKKwlDaGFyYWN0ZXJMaXRlcmFsCisJU3RyaW5nTGl0ZXJhbAorCisJUExVU19QTFVTCisJTUlOVVNfTUlOVVMKKwlFUVVBTF9FUVVBTAorCUxFU1NfRVFVQUwKKwlHUkVBVEVSX0VRVUFMCisJTk9UX0VRVUFMCisJTEVGVF9TSElGVAorCVJJR0hUX1NISUZUCisJVU5TSUdORURfUklHSFRfU0hJRlQKKwlQTFVTX0VRVUFMCisJTUlOVVNfRVFVQUwKKwlNVUxUSVBMWV9FUVVBTAorCURJVklERV9FUVVBTAorCUFORF9FUVVBTAorCU9SX0VRVUFMCisJWE9SX0VRVUFMCisJUkVNQUlOREVSX0VRVUFMCisJTEVGVF9TSElGVF9FUVVBTAorCVJJR0hUX1NISUZUX0VRVUFMCisJVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwKKwlPUl9PUgorCUFORF9BTkQKKwlQTFVTCisJTUlOVVMKKwlOT1QKKwlSRU1BSU5ERVIKKwlYT1IKKwlBTkQKKwlNVUxUSVBMWQorCU9SCisJVFdJRERMRQorCURJVklERQorCUdSRUFURVIKKwlMRVNTCisJTFBBUkVOCisJUlBBUkVOCisJTEJSQUNFCisJUkJSQUNFCisJTEJSQUNLRVQKKwlSQlJBQ0tFVAorCVNFTUlDT0xPTgorCVFVRVNUSU9OCisJQ09MT04KKwlDT01NQQorCURPVAorCUVRVUFMCisKKy0tICAgIEJvZHlNYXJrZXIKKworJEFsaWFzCisKKwknKysnICAgOjo9IFBMVVNfUExVUworCSctLScgICA6Oj0gTUlOVVNfTUlOVVMKKwknPT0nICAgOjo9IEVRVUFMX0VRVUFMCisJJzw9JyAgIDo6PSBMRVNTX0VRVUFMCisJJz49JyAgIDo6PSBHUkVBVEVSX0VRVUFMCisJJyE9JyAgIDo6PSBOT1RfRVFVQUwKKwknPDwnICAgOjo9IExFRlRfU0hJRlQKKwknPj4nICAgOjo9IFJJR0hUX1NISUZUCisJJz4+PicgIDo6PSBVTlNJR05FRF9SSUdIVF9TSElGVAorCScrPScgICA6Oj0gUExVU19FUVVBTAorCSctPScgICA6Oj0gTUlOVVNfRVFVQUwKKwknKj0nICAgOjo9IE1VTFRJUExZX0VRVUFMCisJJy89JyAgIDo6PSBESVZJREVfRVFVQUwKKwknJj0nICAgOjo9IEFORF9FUVVBTAorCSd8PScgICA6Oj0gT1JfRVFVQUwKKwknXj0nICAgOjo9IFhPUl9FUVVBTAorCSclPScgICA6Oj0gUkVNQUlOREVSX0VRVUFMCisJJzw8PScgIDo6PSBMRUZUX1NISUZUX0VRVUFMCisJJz4+PScgIDo6PSBSSUdIVF9TSElGVF9FUVVBTAorCSc+Pj49JyA6Oj0gVU5TSUdORURfUklHSFRfU0hJRlRfRVFVQUwKKwknfHwnICAgOjo9IE9SX09SCisJJyYmJyAgIDo6PSBBTkRfQU5ECisKKwknKycgICAgOjo9IFBMVVMKKwknLScgICAgOjo9IE1JTlVTCisJJyEnICAgIDo6PSBOT1QKKwknJScgICAgOjo9IFJFTUFJTkRFUgorCSdeJyAgICA6Oj0gWE9SCisJJyYnICAgIDo6PSBBTkQKKwknKicgICAgOjo9IE1VTFRJUExZCisJJ3wnICAgIDo6PSBPUgorCSd+JyAgICA6Oj0gVFdJRERMRQorCScvJyAgICA6Oj0gRElWSURFCisJJz4nICAgIDo6PSBHUkVBVEVSCisJJzwnICAgIDo6PSBMRVNTCisJJygnICAgIDo6PSBMUEFSRU4KKwknKScgICAgOjo9IFJQQVJFTgorCSd7JyAgICA6Oj0gTEJSQUNFCisJJ30nICAgIDo6PSBSQlJBQ0UKKwknWycgICAgOjo9IExCUkFDS0VUCisJJ10nICAgIDo6PSBSQlJBQ0tFVAorCSc7JyAgICA6Oj0gU0VNSUNPTE9OCisJJz8nICAgIDo6PSBRVUVTVElPTgorCSc6JyAgICA6Oj0gQ09MT04KKwknLCcgICAgOjo9IENPTU1BCisJJy4nICAgIDo6PSBET1QKKwknPScgICAgOjo9IEVRVUFMCisJCiskU3RhcnQKKwlHb2FsCisKKyRSdWxlcworCisvLiAvLyBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGF1dG9tYXRpYyBnZW5lcmF0aW9uIDogZG8gTk9UIGVkaXQtbW9kaWZ5ICAKK3Byb3RlY3RlZCB2b2lkIGNvbnN1bWVSdWxlKGludCBhY3QpIHsKKyAgc3dpdGNoICggYWN0ICkgeworLi8KKworR29hbCA6Oj0gJysrJyBDb21waWxhdGlvblVuaXQKK0dvYWwgOjo9ICctLScgTWV0aG9kQm9keQorR29hbCA6Oj0gJz09JyBDb25zdHJ1Y3RvckJvZHkKKworLS0gSW5pdGlhbGl6ZXIKK0dvYWwgOjo9ICc+PicgU3RhdGljSW5pdGlhbGl6ZXIKK0dvYWwgOjo9ICc+PicgSW5pdGlhbGl6ZXIKKworLS0gZXJyb3IgcmVjb3ZlcnkKK0dvYWwgOjo9ICc+Pj4nIEhlYWRlcnMKK0dvYWwgOjo9ICcqJyBCbG9ja1N0YXRlbWVudHMKK0dvYWwgOjo9ICcqJyBNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyCitHb2FsIDo6PSAnKicgQ2F0Y2hIZWFkZXIKKworLS0gSkRPTQorR29hbCA6Oj0gJyYmJyBGaWVsZERlY2xhcmF0aW9uCitHb2FsIDo6PSAnfHwnIEltcG9ydERlY2xhcmF0aW9uCitHb2FsIDo6PSAnPycgUGFja2FnZURlY2xhcmF0aW9uCitHb2FsIDo6PSAnKycgVHlwZURlY2xhcmF0aW9uCitHb2FsIDo6PSAnLycgR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uCitHb2FsIDo6PSAnJicgQ2xhc3NCb2R5RGVjbGFyYXRpb24KKworLS0gY29kZSBzbmlwcGV0CitHb2FsIDo6PSAnJScgRXhwcmVzc2lvbgorCistLSBjb21wbGV0aW9uIHBhcnNlcgorR29hbCA6Oj0gJyEnIENvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0CitHb2FsIDo6PSAnficgQmxvY2tTdGF0ZW1lbnRzb3B0CisKK0xpdGVyYWwgLT4gSW50ZWdlckxpdGVyYWwKK0xpdGVyYWwgLT4gTG9uZ0xpdGVyYWwKK0xpdGVyYWwgLT4gRmxvYXRpbmdQb2ludExpdGVyYWwKK0xpdGVyYWwgLT4gRG91YmxlTGl0ZXJhbAorTGl0ZXJhbCAtPiBDaGFyYWN0ZXJMaXRlcmFsCitMaXRlcmFsIC0+IFN0cmluZ0xpdGVyYWwKK0xpdGVyYWwgLT4gbnVsbAorTGl0ZXJhbCAtPiBCb29sZWFuTGl0ZXJhbAorQm9vbGVhbkxpdGVyYWwgLT4gdHJ1ZQorQm9vbGVhbkxpdGVyYWwgLT4gZmFsc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS1hIFR5cGUgcmVzdWx0cyBpbiBib3RoIGEgcHVzaCBvZiBpdHMgZGltZW5zaW9uKHMpIGFuZCBpdHMgbmFtZShzKS4KKworVHlwZSA6Oj0gUHJpbWl0aXZlVHlwZQorIC8uJHB1dENhc2UgY29uc3VtZVByaW1pdGl2ZVR5cGUoKTsgJGJyZWFrIC4vCitUeXBlIC0+IFJlZmVyZW5jZVR5cGUKKworUHJpbWl0aXZlVHlwZSAtPiBOdW1lcmljVHlwZQorTnVtZXJpY1R5cGUgLT4gSW50ZWdyYWxUeXBlCitOdW1lcmljVHlwZSAtPiBGbG9hdGluZ1BvaW50VHlwZQorCitQcmltaXRpdmVUeXBlIC0+ICdib29sZWFuJworUHJpbWl0aXZlVHlwZSAtPiAndm9pZCcKK0ludGVncmFsVHlwZSAtPiAnYnl0ZScKK0ludGVncmFsVHlwZSAtPiAnc2hvcnQnCitJbnRlZ3JhbFR5cGUgLT4gJ2ludCcKK0ludGVncmFsVHlwZSAtPiAnbG9uZycKK0ludGVncmFsVHlwZSAtPiAnY2hhcicKK0Zsb2F0aW5nUG9pbnRUeXBlIC0+ICdmbG9hdCcKK0Zsb2F0aW5nUG9pbnRUeXBlIC0+ICdkb3VibGUnCisKK1JlZmVyZW5jZVR5cGUgOjo9IENsYXNzT3JJbnRlcmZhY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVSZWZlcmVuY2VUeXBlKCk7ICAkYnJlYWsgLi8KK1JlZmVyZW5jZVR5cGUgLT4gQXJyYXlUeXBlIC0tIGhlcmUgYSBwdXNoIG9mIGRpbWVuc2lvbnMgaXMgZG9uZSwgdGhhdCBleHBsYWlucyB0aGUgdHdvIHByZXZpb3VzIHB1c2ggMAorCitDbGFzc09ySW50ZXJmYWNlVHlwZSAtPiBOYW1lCistLSAxLjUgZmVhdHVyZQorQ2xhc3NPckludGVyZmFjZVR5cGUgOjo9IE5hbWUgJzwnIFJlZmVyZW5jZVR5cGVMaXN0MQorCistLSBCRUdJTi0xLjUgOiBBZGRpdGlvbmFsIHJ1bGVzIHRvIGFkZHJlc3MgMS41IGdlbmVyaWNzCistLSBUaGVzZSBydWxlcyBhcmUgZGVhbGluZyB3aXRoIHRoZSBmYWN0IHRoYXQgbmVzdGVkIHR5cGUgcGFyYW1ldGVycyBtYXkgdXNlIHNlcXVlbmNlcworLS0gb2YgJz4nIHdoaWNoIHdvdWxkIGJlIHRva2VuaXplZCBhcyBkaXN0aW5jdCB0b2tlbnMgKCc+PicgaXMgcmlnaHQgc2hpZnQgb3BlcmF0b3IsICc+Pj4nIGlzIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IG9wZXJhdG9yKS4KKworVHlwZVZhcmlhYmxlIC0+ICdJZGVudGlmaWVyJworCitSZWZlcmVuY2VUeXBlTGlzdCAtPiBSZWZlcmVuY2VUeXBlCitSZWZlcmVuY2VUeXBlTGlzdCA6Oj0gUmVmZXJlbmNlVHlwZUxpc3QgJywnIFJlZmVyZW5jZVR5cGUKKworUmVmZXJlbmNlVHlwZUxpc3QxIC0+IFJlZmVyZW5jZVR5cGUxCitSZWZlcmVuY2VUeXBlTGlzdDEgOjo9IFJlZmVyZW5jZVR5cGVMaXN0ICcsJyBSZWZlcmVuY2VUeXBlMQorCitSZWZlcmVuY2VUeXBlMSA6Oj0gUmVmZXJlbmNlVHlwZSAnPicKK1JlZmVyZW5jZVR5cGUxIDo6PSBOYW1lICc8JyBSZWZlcmVuY2VUeXBlTGlzdDIKKworUmVmZXJlbmNlVHlwZUxpc3QyIC0+IFJlZmVyZW5jZVR5cGUyCitSZWZlcmVuY2VUeXBlTGlzdDIgOjo9IFJlZmVyZW5jZVR5cGVMaXN0ICcsJyBSZWZlcmVuY2VUeXBlMgorCitSZWZlcmVuY2VUeXBlMiA6Oj0gUmVmZXJlbmNlVHlwZSAnPj4nCitSZWZlcmVuY2VUeXBlMiA6Oj0gTmFtZSAnPCcgUmVmZXJlbmNlVHlwZUxpc3QzCisKK1JlZmVyZW5jZVR5cGVMaXN0MyAtPiBSZWZlcmVuY2VUeXBlMworUmVmZXJlbmNlVHlwZUxpc3QzIDo6PSBSZWZlcmVuY2VUeXBlTGlzdCAnLCcgUmVmZXJlbmNlVHlwZTMKKworUmVmZXJlbmNlVHlwZTMgOjo9IFJlZmVyZW5jZVR5cGUgJz4+PicKKworVHlwZVBhcmFtZXRlcnMgOjo9ICc8JyBUeXBlUGFyYW1ldGVyTGlzdDEKKworVHlwZVBhcmFtZXRlckxpc3QxIC0+IFR5cGVQYXJhbWV0ZXIxCitUeXBlUGFyYW1ldGVyTGlzdDEgOjo9IFR5cGVQYXJhbWV0ZXJMaXN0MSAnLCcgVHlwZVBhcmFtZXRlcjEKKworVHlwZVBhcmFtZXRlcjEgOjo9IFR5cGVQYXJhbWV0ZXIgJz4nCitUeXBlUGFyYW1ldGVyMSA6Oj0gVHlwZVZhcmlhYmxlICdleHRlbmRzJyBSZWZlcmVuY2VUeXBlMgorCistLSBmb2xsb3dpbmcgaXNuJ3Qgc3VwcG9ydGVkCistLSBUeXBlUGFyYW1ldGVyMSA6Oj0gVHlwZVZhcmlhYmxlICdpbXBsZW1lbnRzJyBSZWZlcmVuY2VUeXBlMgorCitUeXBlUGFyYW1ldGVyIDo6PSBUeXBlVmFyaWFibGUgVHlwZUJvdW5kb3B0CisKK1R5cGVCb3VuZCA6Oj0gJ2V4dGVuZHMnIENsYXNzT3JJbnRlcmZhY2VUeXBlIEFkZGl0aW9uYWxCb3VuZExpc3RvcHQKKworQWRkaXRpb25hbEJvdW5kTGlzdCAtPiBBZGRpdGlvbmFsQm91bmQKK0FkZGl0aW9uYWxCb3VuZExpc3QgOjo9IEFkZGl0aW9uYWxCb3VuZExpc3QgJywnIEFkZGl0aW9uYWxCb3VuZAorCitBZGRpdGlvbmFsQm91bmQgOjo9ICcmJyBJbnRlcmZhY2VUeXBlCisKKy0tIEVORC0xLjUgOiBBZGRpdGlvbmFsIHJ1bGVzIHRvIGFkZHJlc3MgMS41IGdlbmVyaWNzCisKKy0tCistLSBUaGVzZSBydWxlcyBoYXZlIGJlZW4gcmV3cml0dGVuIHRvIGF2b2lkIHNvbWUgY29uZmxpY3RzIGludHJvZHVjZWQKKy0tIGJ5IGFkZGluZyB0aGUgMS4xIGZlYXR1cmVzCistLQorLS0gQXJyYXlUeXBlIDo6PSBQcmltaXRpdmVUeXBlICdbJyAnXScKKy0tIEFycmF5VHlwZSA6Oj0gTmFtZSAnWycgJ10nCistLSBBcnJheVR5cGUgOjo9IEFycmF5VHlwZSAnWycgJ10nCistLQorCitBcnJheVR5cGUgOjo9IFByaW1pdGl2ZVR5cGUgRGltcworQXJyYXlUeXBlIDo6PSBOYW1lIERpbXMKKworQ2xhc3NUeXBlIC0+IENsYXNzT3JJbnRlcmZhY2VUeXBlCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgLT4gU2ltcGxlTmFtZQorTmFtZSAtPiBRdWFsaWZpZWROYW1lCisKK1NpbXBsZU5hbWUgLT4gJ0lkZW50aWZpZXInCisKK1F1YWxpZmllZE5hbWUgOjo9IE5hbWUgJy4nIFNpbXBsZU5hbWUgCisvLiRwdXRDYXNlIGNvbnN1bWVRdWFsaWZpZWROYW1lKCk7ICRicmVhayAuLworCitDb21waWxhdGlvblVuaXQgOjo9IEVudGVyQ29tcGlsYXRpb25Vbml0IFBhY2thZ2VEZWNsYXJhdGlvbm9wdCBJbXBvcnREZWNsYXJhdGlvbnNvcHQgVHlwZURlY2xhcmF0aW9uc29wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ29tcGlsYXRpb25Vbml0KCk7ICRicmVhayAuLworCitFbnRlckNvbXBpbGF0aW9uVW5pdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbnRlckNvbXBpbGF0aW9uVW5pdCgpOyAkYnJlYWsgLi8KKworSGVhZGVycyAtPiBIZWFkZXIKK0hlYWRlcnMgOjo9IEhlYWRlcnMgSGVhZGVyCisKK0hlYWRlciAtPiBJbXBvcnREZWNsYXJhdGlvbgorSGVhZGVyIC0+IFBhY2thZ2VEZWNsYXJhdGlvbgorSGVhZGVyIC0+IENsYXNzSGVhZGVyCitIZWFkZXIgLT4gSW50ZXJmYWNlSGVhZGVyCitIZWFkZXIgLT4gU3RhdGljSW5pdGlhbGl6ZXIKK0hlYWRlciAtPiBNZXRob2RIZWFkZXIKK0hlYWRlciAtPiBDb25zdHJ1Y3RvckhlYWRlcgorSGVhZGVyIC0+IEZpZWxkRGVjbGFyYXRpb24KK0hlYWRlciAtPiBBbGxvY2F0aW9uSGVhZGVyCisKK0NhdGNoSGVhZGVyIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICd7JworLy4kcHV0Q2FzZSBjb25zdW1lQ2F0Y2hIZWFkZXIoKTsgJGJyZWFrIC4vCisKK0ltcG9ydERlY2xhcmF0aW9ucyAtPiBJbXBvcnREZWNsYXJhdGlvbgorSW1wb3J0RGVjbGFyYXRpb25zIDo6PSBJbXBvcnREZWNsYXJhdGlvbnMgSW1wb3J0RGVjbGFyYXRpb24gCisvLiRwdXRDYXNlIGNvbnN1bWVJbXBvcnREZWNsYXJhdGlvbnMoKTsgJGJyZWFrIC4vCisKK1R5cGVEZWNsYXJhdGlvbnMgLT4gVHlwZURlY2xhcmF0aW9uCitUeXBlRGVjbGFyYXRpb25zIDo6PSBUeXBlRGVjbGFyYXRpb25zIFR5cGVEZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBjb25zdW1lVHlwZURlY2xhcmF0aW9ucygpOyAkYnJlYWsgLi8KKworUGFja2FnZURlY2xhcmF0aW9uIDo6PSBQYWNrYWdlRGVjbGFyYXRpb25OYW1lICc7JworLy4kcHV0Q2FzZSAgY29uc3VtZVBhY2thZ2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworUGFja2FnZURlY2xhcmF0aW9uTmFtZSA6Oj0gJ3BhY2thZ2UnIE5hbWUKKy8uJHB1dENhc2UgIGNvbnN1bWVQYWNrYWdlRGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLworCitJbXBvcnREZWNsYXJhdGlvbiAtPiBTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24KK0ltcG9ydERlY2xhcmF0aW9uIC0+IFR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uCisKK1NpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbiA6Oj0gU2luZ2xlVHlwZUltcG9ydERlY2xhcmF0aW9uTmFtZSAnOycKKy8uJHB1dENhc2UgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKwkJCSAgCitTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVTaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb25OYW1lKCk7ICRicmVhayAuLworCQkJICAKK1R5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uIDo6PSBUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbk5hbWUgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworVHlwZUltcG9ydE9uRGVtYW5kRGVjbGFyYXRpb25OYW1lIDo6PSAnaW1wb3J0JyBOYW1lICcuJyAnKicKKy8uJHB1dENhc2UgY29uc3VtZVR5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uTmFtZSgpOyAkYnJlYWsgLi8KKworVHlwZURlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KK1R5cGVEZWNsYXJhdGlvbiAtPiBJbnRlcmZhY2VEZWNsYXJhdGlvbgorLS0gdGhpcyBkZWNsYXJhdGlvbiBpbiBwYXJ0IG9mIGEgbGlzdCBvZCBkZWNsYXJhdGlvbiBhbmQgd2Ugd2lsbAorLS0gdXNlIGFuZCBvcHRpbWl6ZWQgbGlzdCBsZW5ndGggY2FsY3VsYXRpb24gcHJvY2VzcyAKKy0tIHRodXMgd2UgZGVjcmVtZW50IHRoZSBudW1iZXIgd2hpbGUgaXQgd2lsbCBiZSBpbmNyZW1lbmQuLi4uLgorVHlwZURlY2xhcmF0aW9uIDo6PSAnOycgCisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKKy0tMTguNyBPbmx5IGluIHRoZSBMQUxSKDEpIEdyYW1tYXIKKworTW9kaWZpZXJzIDo6PSBNb2RpZmllcgorTW9kaWZpZXJzIDo6PSBNb2RpZmllcnMgTW9kaWZpZXIKKworTW9kaWZpZXIgLT4gJ3B1YmxpYycgCitNb2RpZmllciAtPiAncHJvdGVjdGVkJworTW9kaWZpZXIgLT4gJ3ByaXZhdGUnCitNb2RpZmllciAtPiAnc3RhdGljJworTW9kaWZpZXIgLT4gJ2Fic3RyYWN0JworTW9kaWZpZXIgLT4gJ2ZpbmFsJworTW9kaWZpZXIgLT4gJ25hdGl2ZScKK01vZGlmaWVyIC0+ICdzeW5jaHJvbml6ZWQnCitNb2RpZmllciAtPiAndHJhbnNpZW50JworTW9kaWZpZXIgLT4gJ3ZvbGF0aWxlJworTW9kaWZpZXIgLT4gJ3N0cmljdGZwJworCistLTE4LjggUHJvZHVjdGlvbnMgZnJvbSA4OiBDbGFzcyBEZWNsYXJhdGlvbnMKKy0tQ2xhc3NNb2RpZmllciA6Oj0KKy0tICAgICAgJ2Fic3RyYWN0JworLS0gICAgfCAnZmluYWwnCistLSAgICB8ICdwdWJsaWMnCistLTE4LjguMSBQcm9kdWN0aW9ucyBmcm9tIDguMTogQ2xhc3MgRGVjbGFyYXRpb25zCisKK0NsYXNzRGVjbGFyYXRpb24gOjo9IENsYXNzSGVhZGVyIENsYXNzQm9keQorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXIgOjo9IENsYXNzSGVhZGVyTmFtZSBDbGFzc0hlYWRlclBhcmFtZXRlcnNvcHQgQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IENsYXNzSGVhZGVySW1wbGVtZW50c29wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NIZWFkZXIoKTsgJGJyZWFrIC4vCisKK0NsYXNzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzb3B0ICdjbGFzcycgJ0lkZW50aWZpZXInCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0hlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisKK0NsYXNzSGVhZGVyUGFyYW1ldGVycyAtPiBUeXBlUGFyYW1ldGVycworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NIZWFkZXJQYXJhbWV0ZXJzKCk7ICRicmVhayAuLworCitDbGFzc0hlYWRlckV4dGVuZHMgOjo9ICdleHRlbmRzJyBDbGFzc1R5cGUKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVyRXh0ZW5kcygpOyAkYnJlYWsgLi8KKworQ2xhc3NIZWFkZXJJbXBsZW1lbnRzIDo6PSAnaW1wbGVtZW50cycgSW50ZXJmYWNlVHlwZUxpc3QKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVySW1wbGVtZW50cygpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlVHlwZUxpc3QgLT4gSW50ZXJmYWNlVHlwZQorSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0ICcsJyBJbnRlcmZhY2VUeXBlCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VUeXBlTGlzdCgpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlVHlwZSA6Oj0gQ2xhc3NPckludGVyZmFjZVR5cGUKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZVR5cGUoKTsgJGJyZWFrIC4vCisKK0NsYXNzQm9keSA6Oj0gJ3snIENsYXNzQm9keURlY2xhcmF0aW9uc29wdCAnfScKKworQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbgorQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDo6PSBDbGFzc0JvZHlEZWNsYXJhdGlvbnMgQ2xhc3NCb2R5RGVjbGFyYXRpb24KKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzQm9keURlY2xhcmF0aW9ucygpOyAkYnJlYWsgLi8KKworQ2xhc3NCb2R5RGVjbGFyYXRpb24gLT4gQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbgorQ2xhc3NCb2R5RGVjbGFyYXRpb24gLT4gU3RhdGljSW5pdGlhbGl6ZXIKK0NsYXNzQm9keURlY2xhcmF0aW9uIC0+IENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0NsYXNzQm9keURlY2xhcmF0aW9uIDo6PSBEaWV0IE5lc3RlZE1ldGhvZCBCbG9jaworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCitEaWV0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZURpZXQoKTsgJGJyZWFrLi8KKworSW5pdGlhbGl6ZXIgOjo9IERpZXQgTmVzdGVkTWV0aG9kIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiAtPiBGaWVsZERlY2xhcmF0aW9uCitDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IE1ldGhvZERlY2xhcmF0aW9uCistLTEuMSBmZWF0dXJlCitDbGFzc01lbWJlckRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0NsYXNzTWVtYmVyRGVjbGFyYXRpb24gLT4gSW50ZXJmYWNlRGVjbGFyYXRpb24KKworLS0gRW1wdHkgZGVjbGFyYXRpb25zIGFyZSBub3QgdmFsaWQgSmF2YSBDbGFzc01lbWJlckRlY2xhcmF0aW9ucy4KKy0tIEhvd2V2ZXIsIHNpbmNlIHRoZSBjdXJyZW50ICgyLzE0Lzk3KSBKYXZhIGNvbXBpbGVyIGFjY2VwdHMgdGhlbSAKKy0tIChpbiBmYWN0LCBzb21lIG9mIHRoZSBvZmZpY2lhbCB0ZXN0cyBjb250YWluIHRoaXMgZXJyb25lb3VzCistLSBzeW50YXgpCisKK0dlbmVyaWNNZXRob2REZWNsYXJhdGlvbiAtPiBNZXRob2REZWNsYXJhdGlvbgorR2VuZXJpY01ldGhvZERlY2xhcmF0aW9uIC0+IENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKworQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUNsYXNzTWVtYmVyRGVjbGFyYXRpb24oKTsgJGJyZWFrLi8KKworLS0xOC44LjIgUHJvZHVjdGlvbnMgZnJvbSA4LjM6IEZpZWxkIERlY2xhcmF0aW9ucworLS1WYXJpYWJsZU1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAncHJvdGVjdGVkJworLS0gICAgfCAncHJpdmF0ZScKKy0tICAgIHwgJ3N0YXRpYycKKy0tICAgIHwgJ2ZpbmFsJworLS0gICAgfCAndHJhbnNpZW50JworLS0gICAgfCAndm9sYXRpbGUnCisKK0ZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCBUeXBlIFZhcmlhYmxlRGVjbGFyYXRvcnMgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVGaWVsZERlY2xhcmF0aW9uKCk7ICRicmVhayAuLworCitWYXJpYWJsZURlY2xhcmF0b3JzIC0+IFZhcmlhYmxlRGVjbGFyYXRvciAKK1ZhcmlhYmxlRGVjbGFyYXRvcnMgOjo9IFZhcmlhYmxlRGVjbGFyYXRvcnMgJywnIFZhcmlhYmxlRGVjbGFyYXRvcgorLy4kcHV0Q2FzZSBjb25zdW1lVmFyaWFibGVEZWNsYXJhdG9ycygpOyAkYnJlYWsgLi8KKworVmFyaWFibGVEZWNsYXJhdG9yIDo6PSBWYXJpYWJsZURlY2xhcmF0b3JJZCBFbnRlclZhcmlhYmxlIEV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbgorCitWYXJpYWJsZURlY2xhcmF0b3IgOjo9IFZhcmlhYmxlRGVjbGFyYXRvcklkIEVudGVyVmFyaWFibGUgJz0nIEZvcmNlTm9EaWV0IFZhcmlhYmxlSW5pdGlhbGl6ZXIgUmVzdG9yZURpZXQgRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uCisKK0VudGVyVmFyaWFibGUgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW50ZXJWYXJpYWJsZSgpOyAkYnJlYWsgLi8KKworRXhpdFZhcmlhYmxlV2l0aEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhJbml0aWFsaXphdGlvbigpOyAkYnJlYWsgLi8KKworRXhpdFZhcmlhYmxlV2l0aG91dEluaXRpYWxpemF0aW9uIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUV4aXRWYXJpYWJsZVdpdGhvdXRJbml0aWFsaXphdGlvbigpOyAkYnJlYWsgLi8KKworRm9yY2VOb0RpZXQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRm9yY2VOb0RpZXQoKTsgJGJyZWFrIC4vCitSZXN0b3JlRGlldCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVSZXN0b3JlRGlldCgpOyAkYnJlYWsgLi8KKworVmFyaWFibGVEZWNsYXJhdG9ySWQgOjo9ICdJZGVudGlmaWVyJyBEaW1zb3B0CisKK1ZhcmlhYmxlSW5pdGlhbGl6ZXIgLT4gRXhwcmVzc2lvbgorVmFyaWFibGVJbml0aWFsaXplciAtPiBBcnJheUluaXRpYWxpemVyCisKKy0tMTguOC4zIFByb2R1Y3Rpb25zIGZyb20gOC40OiBNZXRob2QgRGVjbGFyYXRpb25zCistLU1ldGhvZE1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAncHJvdGVjdGVkJworLS0gICAgfCAncHJpdmF0ZScKKy0tICAgIHwgJ3N0YXRpYycKKy0tICAgIHwgJ2Fic3RyYWN0JworLS0gICAgfCAnZmluYWwnCistLSAgICB8ICduYXRpdmUnCistLSAgICB8ICdzeW5jaHJvbml6ZWQnCistLQorCitNZXRob2REZWNsYXJhdGlvbiAtPiBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uCitNZXRob2REZWNsYXJhdGlvbiA6Oj0gTWV0aG9kSGVhZGVyIE1ldGhvZEJvZHkgCisvLiRwdXRDYXNlIC8vIHNldCB0byB0cnVlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aCBhIGJvZHkKKyAgY29uc3VtZU1ldGhvZERlY2xhcmF0aW9uKHRydWUpOyAgJGJyZWFrIC4vCisKK0Fic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gOjo9IE1ldGhvZEhlYWRlciAnOycKKy8uJHB1dENhc2UgLy8gc2V0IHRvIGZhbHNlIHRvIGNvbnN1bWUgYSBtZXRob2Qgd2l0aG91dCBib2R5CisgIGNvbnN1bWVNZXRob2REZWNsYXJhdGlvbihmYWxzZSk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXIgOjo9IE1ldGhvZEhlYWRlck5hbWUgTWV0aG9kSGVhZGVyUGFyYW1ldGVycyBNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXIoKTsgJGJyZWFrIC4vCisKK01ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXIgOjo9IE1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIE1ldGhvZEhlYWRlclRocm93c0NsYXVzZW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyKCk7ICRicmVhayAuLworCitNZXRob2RQdXNoTW9kaWZpZXJzSGVhZGVyTmFtZSA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyAnSWRlbnRpZmllcicgJygnIAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kUHVzaE1vZGlmaWVyc0hlYWRlck5hbWUoKTsgJGJyZWFrIC4vCisKK01ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lIDo6PSBUeXBlIFB1c2hNb2RpZmllcnMgJ0lkZW50aWZpZXInICcoJyAKKy8uJHB1dENhc2UgY29uc3VtZU1ldGhvZFB1c2hNb2RpZmllcnNIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgVHlwZSAnSWRlbnRpZmllcicgJygnCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCitNZXRob2RIZWFkZXJQYXJhbWV0ZXJzIDo6PSBGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyUGFyYW1ldGVycygpOyAkYnJlYWsgLi8KKworTWV0aG9kSGVhZGVyRXh0ZW5kZWREaW1zIDo6PSBEaW1zb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RIZWFkZXJFeHRlbmRlZERpbXMoKTsgJGJyZWFrIC4vCisKK01ldGhvZEhlYWRlclRocm93c0NsYXVzZSA6Oj0gJ3Rocm93cycgQ2xhc3NUeXBlTGlzdAorLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlKCk7ICRicmVhayAuLworCitDb25zdHJ1Y3RvckhlYWRlciA6Oj0gQ29uc3RydWN0b3JIZWFkZXJOYW1lIE1ldGhvZEhlYWRlclBhcmFtZXRlcnMgTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckhlYWRlcigpOyAkYnJlYWsgLi8KKworQ29uc3RydWN0b3JIZWFkZXJOYW1lIDo6PSAgTW9kaWZpZXJzb3B0ICdJZGVudGlmaWVyJyAnKCcKKy8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9ySGVhZGVyTmFtZSgpOyAkYnJlYWsgLi8KKworRm9ybWFsUGFyYW1ldGVyTGlzdCAtPiBGb3JtYWxQYXJhbWV0ZXIKK0Zvcm1hbFBhcmFtZXRlckxpc3QgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3QgJywnIEZvcm1hbFBhcmFtZXRlcgorLy4kcHV0Q2FzZSBjb25zdW1lRm9ybWFsUGFyYW1ldGVyTGlzdCgpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRm9ybWFsUGFyYW1ldGVyIDo6PSBNb2RpZmllcnNvcHQgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZAorLy4kcHV0Q2FzZSAvLyB0aGUgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG1vZGlmaWVycyBzaG91bGQgYmUgcmVzZXQKKyAJY29uc3VtZUZvcm1hbFBhcmFtZXRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NUeXBlTGlzdCAtPiBDbGFzc1R5cGVFbHQKK0NsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgJywnIENsYXNzVHlwZUVsdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NUeXBlTGlzdCgpOyAkYnJlYWsgLi8KKworQ2xhc3NUeXBlRWx0IDo6PSBDbGFzc1R5cGUKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzVHlwZUVsdCgpOyAkYnJlYWsgLi8KKworCitNZXRob2RCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIEJsb2NrU3RhdGVtZW50c29wdCAnfScgCisvLiRwdXRDYXNlIGNvbnN1bWVNZXRob2RCb2R5KCk7ICRicmVhayAuLworCitOZXN0ZWRNZXRob2QgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lTmVzdGVkTWV0aG9kKCk7ICRicmVhayAuLworCistLTE4LjguNCBQcm9kdWN0aW9ucyBmcm9tIDguNTogU3RhdGljIEluaXRpYWxpemVycworCitTdGF0aWNJbml0aWFsaXplciA6Oj0gIFN0YXRpY09ubHkgQmxvY2sKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRpY0luaXRpYWxpemVyKCk7ICRicmVhay4vCisKK1N0YXRpY09ubHkgOjo9ICdzdGF0aWMnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0aWNPbmx5KCk7ICRicmVhayAuLworCistLTE4LjguNSBQcm9kdWN0aW9ucyBmcm9tIDguNjogQ29uc3RydWN0b3IgRGVjbGFyYXRpb25zCistLUNvbnN0cnVjdG9yTW9kaWZpZXIgOjo9CistLSAgICAgICdwdWJsaWMnCistLSAgICB8ICdwcm90ZWN0ZWQnCistLSAgICB8ICdwcml2YXRlJworLS0KKy0tCitDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkKKy8uJHB1dENhc2UgY29uc3VtZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSA7ICRicmVhayAuLyAKKworLS0gVGhlc2UgcnVsZXMgYXJlIGFkZGVkIHRvIGJlIGFibGUgdG8gcGFyc2UgY29uc3RydWN0b3JzIHdpdGggbm8gYm9keQorQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA6Oj0gQ29uc3RydWN0b3JIZWFkZXIgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIDsgJGJyZWFrIC4vIAorCistLSB0aGUgcnVsZXMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25vcHQgaGFzIGJlZW4gZXhwYW5kZWQKKy0tIGluIHRoZSBydWxlIGJlbG93IGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgbGFscigxKS4KKy0tIENvbnN0cnVjdG9yQm9keSA6Oj0gJ3snIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9ub3B0IEJsb2NrU3RhdGVtZW50c29wdCAnfScKKy0tIE90aGVyIGlubGluaW5nIGhhcyBvY2N1cmVkIGludG8gdGhlIG5leHQgcnVsZSB0b28uLi4uCisKK0NvbnN0cnVjdG9yQm9keSA6Oj0gTmVzdGVkTWV0aG9kICAneycgQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHNvcHQgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVDb25zdHJ1Y3RvckJvZHkoKTsgJGJyZWFrIC4vCisKK0NvbnN0cnVjdG9yQmxvY2tTdGF0ZW1lbnRzb3B0IC0+IEJsb2NrU3RhdGVtZW50c29wdAorCitDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCAtPiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgorCitDb25zdHJ1Y3RvckJsb2NrU3RhdGVtZW50c29wdCA6Oj0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gQmxvY2tTdGF0ZW1lbnRzCisvLiRwdXRDYXNlICBjb25zdW1lQ29uc3RydWN0b3JCbG9ja1N0YXRlbWVudHMoKTsgJGJyZWFrIC4vCisKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAndGhpcycgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlRoaXMpOyAkYnJlYWsgLi8KKworRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9ICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigwLEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLlN1cGVyKTsgJGJyZWFrIC4vCisKKy0tMS4xIGZlYXR1cmUKK0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5ICcuJyAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuU3VwZXIpOyAkYnJlYWsgLi8KKworLS0xLjEgZmVhdHVyZQorRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigyLCBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5TdXBlcik7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMSwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSAnLicgJ3RoaXMnICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oMiwgRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwuVGhpcyk7ICRicmVhayAuLworCistLTE4LjkgUHJvZHVjdGlvbnMgZnJvbSA5OiBJbnRlcmZhY2UgRGVjbGFyYXRpb25zCisKKy0tMTguOS4xIFByb2R1Y3Rpb25zIGZyb20gOS4xOiBJbnRlcmZhY2UgRGVjbGFyYXRpb25zCistLUludGVyZmFjZU1vZGlmaWVyIDo6PQorLS0gICAgICAncHVibGljJworLS0gICAgfCAnYWJzdHJhY3QnCistLQorSW50ZXJmYWNlRGVjbGFyYXRpb24gOjo9IEludGVyZmFjZUhlYWRlciBJbnRlcmZhY2VCb2R5CisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworSW50ZXJmYWNlSGVhZGVyIDo6PSBJbnRlcmZhY2VIZWFkZXJOYW1lIEludGVyZmFjZUhlYWRlclBhcmFtZXRlcnNvcHQgSW50ZXJmYWNlSGVhZGVyRXh0ZW5kc29wdAorLy4kcHV0Q2FzZSBjb25zdW1lSW50ZXJmYWNlSGVhZGVyKCk7ICRicmVhayAuLworCitJbnRlcmZhY2VIZWFkZXJOYW1lIDo6PSBNb2RpZmllcnNvcHQgJ2ludGVyZmFjZScgJ0lkZW50aWZpZXInCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJOYW1lKCk7ICRicmVhayAuLworCistLSBUaGlzIHJ1bGUgd2lsbCBiZSB1c2VkIHRvIGFjY2VwdCBpbm5lciBsb2NhbCBpbnRlcmZhY2UgYW5kIHRoZW4gcmVwb3J0IGEgcmVsZXZhbnQgZXJyb3IgbWVzc2FnZQorSW52YWxpZEludGVyZmFjZURlY2xhcmF0aW9uIC0+IEludGVyZmFjZUhlYWRlciBJbnRlcmZhY2VCb2R5CisKKy0tIDEuNSBmZWF0dXJlCitJbnRlcmZhY2VIZWFkZXJQYXJhbWV0ZXJzIC0+IFR5cGVQYXJhbWV0ZXJzCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJQYXJhbWV0ZXJzKCk7ICRicmVhayAuLworCitJbnRlcmZhY2VIZWFkZXJFeHRlbmRzIDo6PSAnZXh0ZW5kcycgSW50ZXJmYWNlVHlwZUxpc3QKKy8uJHB1dENhc2UgY29uc3VtZUludGVyZmFjZUhlYWRlckV4dGVuZHMoKTsgJGJyZWFrIC4vCisKK0ludGVyZmFjZUJvZHkgOjo9ICd7JyBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQgJ30nIAorCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMgLT4gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24KK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKTsgJGJyZWFrIC4vCisKKy0tc2FtZSBhcyBmb3IgY2xhc3MgbWVtYmVycworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gOjo9ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworLS0gVGhpcyBydWxlIGlzIGFkZGVkIHRvIGJlIGFibGUgdG8gcGFyc2Ugbm9uIGFic3RyYWN0IG1ldGhvZCBpbnNpZGUgaW50ZXJmYWNlIGFuZCB0aGVuIHJlcG9ydCBhIHJlbGV2ZW50IGVycm9yIG1lc3NhZ2UKK0ludmFsaWRNZXRob2REZWNsYXJhdGlvbiAtPiBNZXRob2RIZWFkZXIgTWV0aG9kQm9keQorCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiAtPiBDb25zdGFudERlY2xhcmF0aW9uCitJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbiA6Oj0gSW52YWxpZE1ldGhvZERlY2xhcmF0aW9uCisvLiRwdXRDYXNlIGlnbm9yZU1ldGhvZEJvZHkoKTsgJGJyZWFrIC4vCisKKy0tIFRoZXNlIHJ1bGVzIGFyZSBhZGRlZCB0byBiZSBhYmxlIHRvIHBhcnNlIGNvbnN0cnVjdG9ycyBpbnNpZGUgaW50ZXJmYWNlIGFuZCB0aGVuIHJlcG9ydCBhIHJlbGV2ZW50IGVycm9yIG1lc3NhZ2UKK0ludmFsaWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDo6PSBDb25zdHJ1Y3RvckhlYWRlciBDb25zdHJ1Y3RvckJvZHkKKy8uJHB1dENhc2UgaWdub3JlSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24odHJ1ZSk7ICAkYnJlYWsgLi8KKworSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOjo9IENvbnN0cnVjdG9ySGVhZGVyICc7JworLy4kcHV0Q2FzZSBpZ25vcmVJbnZhbGlkQ29uc3RydWN0b3JEZWNsYXJhdGlvbihmYWxzZSk7ICAkYnJlYWsgLi8KKworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gLT4gQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbgorSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24gLT4gSW52YWxpZENvbnN0cnVjdG9yRGVjbGFyYXRpb24KKyAKKy0tMS4xIGZlYXR1cmUKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb24KKy0tMS4xIGZlYXR1cmUKK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uIC0+IEludGVyZmFjZURlY2xhcmF0aW9uCisKK0NvbnN0YW50RGVjbGFyYXRpb24gLT4gRmllbGREZWNsYXJhdGlvbgorCitBcnJheUluaXRpYWxpemVyIDo6PSAneycgLG9wdCAnfScKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5QXJyYXlJbml0aWFsaXplcigpOyAkYnJlYWsgLi8KK0FycmF5SW5pdGlhbGl6ZXIgOjo9ICd7JyBWYXJpYWJsZUluaXRpYWxpemVycyAnfScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCitBcnJheUluaXRpYWxpemVyIDo6PSAneycgVmFyaWFibGVJbml0aWFsaXplcnMgLCAnfScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5SW5pdGlhbGl6ZXIoKTsgJGJyZWFrIC4vCisKK1ZhcmlhYmxlSW5pdGlhbGl6ZXJzIDo6PSBWYXJpYWJsZUluaXRpYWxpemVyCitWYXJpYWJsZUluaXRpYWxpemVycyA6Oj0gVmFyaWFibGVJbml0aWFsaXplcnMgJywnIFZhcmlhYmxlSW5pdGlhbGl6ZXIKKy8uJHB1dENhc2UgY29uc3VtZVZhcmlhYmxlSW5pdGlhbGl6ZXJzKCk7ICRicmVhayAuLworCitCbG9jayA6Oj0gT3BlbkJsb2NrICd7JyBCbG9ja1N0YXRlbWVudHNvcHQgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVCbG9jaygpOyAkYnJlYWsgLi8KK09wZW5CbG9jayA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVPcGVuQmxvY2soKSA7ICRicmVhayAuLworCitCbG9ja1N0YXRlbWVudHMgLT4gQmxvY2tTdGF0ZW1lbnQKK0Jsb2NrU3RhdGVtZW50cyA6Oj0gQmxvY2tTdGF0ZW1lbnRzIEJsb2NrU3RhdGVtZW50CisvLiRwdXRDYXNlIGNvbnN1bWVCbG9ja1N0YXRlbWVudHMoKSA7ICRicmVhayAuLworCitCbG9ja1N0YXRlbWVudCAtPiBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKK0Jsb2NrU3RhdGVtZW50IC0+IFN0YXRlbWVudAorLS0xLjEgZmVhdHVyZQorQmxvY2tTdGF0ZW1lbnQgLT4gQ2xhc3NEZWNsYXJhdGlvbgorQmxvY2tTdGF0ZW1lbnQgOjo9IEludmFsaWRJbnRlcmZhY2VEZWNsYXJhdGlvbgorLy4kcHV0Q2FzZSBpZ25vcmVJbnRlcmZhY2VEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IDo6PSBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsgJGJyZWFrIC4vCisKK0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gVHlwZSBQdXNoTW9kaWZpZXJzIFZhcmlhYmxlRGVjbGFyYXRvcnMKKy8uJHB1dENhc2UgY29uc3VtZUxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpOyAkYnJlYWsgLi8KKworLS0gMS4xIGZlYXR1cmUKKy0tIFRoZSBtb2RpZmllcnMgcGFydCBvZiB0aGlzIHJ1bGUgbWFrZXMgdGhlIGdyYW1tYXIgbW9yZSBwZXJtaXNzaXZlLiAKKy0tIFRoZSBvbmx5IG1vZGlmaWVyIGhlcmUgaXMgZmluYWwuIFdlIHB1dCBNb2RpZmllcnMgdG8gYWxsb3cgbXVsdGlwbGUgbW9kaWZpZXJzCistLSBUaGlzIHdpbGwgcmVxdWlyZSB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG1vZGlmaWVyCisKK0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiA6Oj0gTW9kaWZpZXJzIFR5cGUgUHVzaE1vZGlmaWVycyBWYXJpYWJsZURlY2xhcmF0b3JzCisvLiRwdXRDYXNlIGNvbnN1bWVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKTsgJGJyZWFrIC4vCisKK1B1c2hNb2RpZmllcnMgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lUHVzaE1vZGlmaWVycygpOyAkYnJlYWsgLi8KKworU3RhdGVtZW50IC0+IFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudAorU3RhdGVtZW50IC0+IExhYmVsZWRTdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBJZlRoZW5TdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBJZlRoZW5FbHNlU3RhdGVtZW50CitTdGF0ZW1lbnQgLT4gV2hpbGVTdGF0ZW1lbnQKK1N0YXRlbWVudCAtPiBGb3JTdGF0ZW1lbnQKKworU3RhdGVtZW50Tm9TaG9ydElmIC0+IFN0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudAorU3RhdGVtZW50Tm9TaG9ydElmIC0+IExhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBJZlRoZW5FbHNlU3RhdGVtZW50Tm9TaG9ydElmCitTdGF0ZW1lbnROb1Nob3J0SWYgLT4gV2hpbGVTdGF0ZW1lbnROb1Nob3J0SWYKK1N0YXRlbWVudE5vU2hvcnRJZiAtPiBGb3JTdGF0ZW1lbnROb1Nob3J0SWYKKworU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEFzc2VydFN0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IEJsb2NrCitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gRW1wdHlTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBFeHByZXNzaW9uU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gU3dpdGNoU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gRG9TdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBCcmVha1N0YXRlbWVudAorU3RhdGVtZW50V2l0aG91dFRyYWlsaW5nU3Vic3RhdGVtZW50IC0+IENvbnRpbnVlU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gUmV0dXJuU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gU3luY2hyb25pemVkU3RhdGVtZW50CitTdGF0ZW1lbnRXaXRob3V0VHJhaWxpbmdTdWJzdGF0ZW1lbnQgLT4gVGhyb3dTdGF0ZW1lbnQKK1N0YXRlbWVudFdpdGhvdXRUcmFpbGluZ1N1YnN0YXRlbWVudCAtPiBUcnlTdGF0ZW1lbnQKKworRW1wdHlTdGF0ZW1lbnQgOjo9ICc7JworLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlTdGF0ZW1lbnQoKTsgJGJyZWFrIC4vCisKK0xhYmVsZWRTdGF0ZW1lbnQgOjo9ICdJZGVudGlmaWVyJyAnOicgU3RhdGVtZW50CisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0xhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdJZGVudGlmaWVyJyAnOicgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0V4cHJlc3Npb25TdGF0ZW1lbnQgOjo9IFN0YXRlbWVudEV4cHJlc3Npb24gJzsnCisvLiAkcHV0Q2FzZSBjb25zdW1lRXhwcmVzc2lvblN0YXRlbWVudCgpOyAkYnJlYWsgLi8KKworU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gQXNzaWdubWVudAorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUHJlSW5jcmVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUHJlRGVjcmVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdEluY3JlbWVudEV4cHJlc3Npb24KK1N0YXRlbWVudEV4cHJlc3Npb24gOjo9IFBvc3REZWNyZW1lbnRFeHByZXNzaW9uCitTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBNZXRob2RJbnZvY2F0aW9uCitTdGF0ZW1lbnRFeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uCisKK0lmVGhlblN0YXRlbWVudCA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZOb0Vsc2UoKTsgJGJyZWFrIC4vCisKK0lmVGhlbkVsc2VTdGF0ZW1lbnQgOjo9ICAnaWYnICcoJyBFeHByZXNzaW9uICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50SWZXaXRoRWxzZSgpOyAkYnJlYWsgLi8KKworSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudE5vU2hvcnRJZiAnZWxzZScgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRJZldpdGhFbHNlKCk7ICRicmVhayAuLworCitTd2l0Y2hTdGF0ZW1lbnQgOjo9ICdzd2l0Y2gnIE9wZW5CbG9jayAnKCcgRXhwcmVzc2lvbiAnKScgU3dpdGNoQmxvY2sKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFN3aXRjaCgpIDsgJGJyZWFrIC4vCisKK1N3aXRjaEJsb2NrIDo6PSAneycgJ30nCisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eVN3aXRjaEJsb2NrKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2sgOjo9ICd7JyBTd2l0Y2hCbG9ja1N0YXRlbWVudHMgJ30nCitTd2l0Y2hCbG9jayA6Oj0gJ3snIFN3aXRjaExhYmVscyAnfScKK1N3aXRjaEJsb2NrIDo6PSAneycgU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIFN3aXRjaExhYmVscyAnfScKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaEJsb2NrKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2tTdGF0ZW1lbnRzIC0+IFN3aXRjaEJsb2NrU3RhdGVtZW50CitTd2l0Y2hCbG9ja1N0YXRlbWVudHMgOjo9IFN3aXRjaEJsb2NrU3RhdGVtZW50cyBTd2l0Y2hCbG9ja1N0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3dpdGNoQmxvY2tTdGF0ZW1lbnRzKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoQmxvY2tTdGF0ZW1lbnQgOjo9IFN3aXRjaExhYmVscyBCbG9ja1N0YXRlbWVudHMKKy8uJHB1dENhc2UgY29uc3VtZVN3aXRjaEJsb2NrU3RhdGVtZW50KCkgOyAkYnJlYWsgLi8KKworU3dpdGNoTGFiZWxzIC0+IFN3aXRjaExhYmVsCitTd2l0Y2hMYWJlbHMgOjo9IFN3aXRjaExhYmVscyBTd2l0Y2hMYWJlbAorLy4kcHV0Q2FzZSBjb25zdW1lU3dpdGNoTGFiZWxzKCkgOyAkYnJlYWsgLi8KKworU3dpdGNoTGFiZWwgOjo9ICdjYXNlJyBDb25zdGFudEV4cHJlc3Npb24gJzonCisvLiAkcHV0Q2FzZSBjb25zdW1lQ2FzZUxhYmVsKCk7ICRicmVhayAuLworCitTd2l0Y2hMYWJlbCA6Oj0gJ2RlZmF1bHQnICc6JworLy4gJHB1dENhc2UgY29uc3VtZURlZmF1bHRMYWJlbCgpOyAkYnJlYWsgLi8KKworV2hpbGVTdGF0ZW1lbnQgOjo9ICd3aGlsZScgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudAorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50V2hpbGUoKSA7ICRicmVhayAuLworCitXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRXaGlsZSgpIDsgJGJyZWFrIC4vCisKK0RvU3RhdGVtZW50IDo6PSAnZG8nIFN0YXRlbWVudCAnd2hpbGUnICcoJyBFeHByZXNzaW9uICcpJyAnOycKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudERvKCkgOyAkYnJlYWsgLi8KKworRm9yU3RhdGVtZW50IDo6PSAnZm9yJyAnKCcgRm9ySW5pdG9wdCAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnQKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudEZvcigpIDsgJGJyZWFrIC4vCitGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyBFeHByZXNzaW9ub3B0ICc7JyBGb3JVcGRhdGVvcHQgJyknIFN0YXRlbWVudE5vU2hvcnRJZgorLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Rm9yKCkgOyAkYnJlYWsgLi8KKworLS10aGUgbWludXMgb25lIGFsbG93cyB0byBhdm9pZCBhIHN0YWNrLXRvLXN0YWNrIHRyYW5zZmVyCitGb3JJbml0IDo6PSBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdAorLy4kcHV0Q2FzZSBjb25zdW1lRm9ySW5pdCgpIDsgJGJyZWFrIC4vCitGb3JJbml0IC0+IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbgorCitGb3JVcGRhdGUgLT4gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QKKworU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgLT4gU3RhdGVtZW50RXhwcmVzc2lvbgorU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgOjo9IFN0YXRlbWVudEV4cHJlc3Npb25MaXN0ICcsJyBTdGF0ZW1lbnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCgpIDsgJGJyZWFrIC4vCisKKy0tIDEuNCBmZWF0dXJlCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTaW1wbGVBc3NlcnRTdGF0ZW1lbnQoKSA7ICRicmVhayAuLworCitBc3NlcnRTdGF0ZW1lbnQgOjo9ICdhc3NlcnQnIEV4cHJlc3Npb24gJzonIEV4cHJlc3Npb24gJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NlcnRTdGF0ZW1lbnQoKSA7ICRicmVhayAuLworICAgICAgICAgIAorQnJlYWtTdGF0ZW1lbnQgOjo9ICdicmVhaycgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRCcmVhaygpIDsgJGJyZWFrIC4vCisKK0JyZWFrU3RhdGVtZW50IDo6PSAnYnJlYWsnIElkZW50aWZpZXIgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRCcmVha1dpdGhMYWJlbCgpIDsgJGJyZWFrIC4vCisKK0NvbnRpbnVlU3RhdGVtZW50IDo6PSAnY29udGludWUnICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Q29udGludWUoKSA7ICRicmVhayAuLworCitDb250aW51ZVN0YXRlbWVudCA6Oj0gJ2NvbnRpbnVlJyBJZGVudGlmaWVyICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50Q29udGludWVXaXRoTGFiZWwoKSA7ICRicmVhayAuLworCitSZXR1cm5TdGF0ZW1lbnQgOjo9ICdyZXR1cm4nIEV4cHJlc3Npb25vcHQgJzsnCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRSZXR1cm4oKSA7ICRicmVhayAuLworCitUaHJvd1N0YXRlbWVudCA6Oj0gJ3Rocm93JyBFeHByZXNzaW9uICc7JworLy4kcHV0Q2FzZSBjb25zdW1lU3RhdGVtZW50VGhyb3coKTsKKyRicmVhayAuLworCitTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgJygnIEV4cHJlc3Npb24gJyknICAgIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRTeW5jaHJvbml6ZWQoKTsgJGJyZWFrIC4vCitPbmx5U3luY2hyb25pemVkIDo6PSAnc3luY2hyb25pemVkJworLy4kcHV0Q2FzZSBjb25zdW1lT25seVN5bmNocm9uaXplZCgpOyAkYnJlYWsgLi8KKworCitUcnlTdGF0ZW1lbnQgOjo9ICd0cnknICAgIEJsb2NrIENhdGNoZXMKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeShmYWxzZSk7ICRicmVhayAuLworVHJ5U3RhdGVtZW50IDo6PSAndHJ5JyAgICBCbG9jayBDYXRjaGVzb3B0IEZpbmFsbHkKKy8uJHB1dENhc2UgY29uc3VtZVN0YXRlbWVudFRyeSh0cnVlKTsgJGJyZWFrIC4vCisKK0NhdGNoZXMgLT4gQ2F0Y2hDbGF1c2UKK0NhdGNoZXMgOjo9IENhdGNoZXMgQ2F0Y2hDbGF1c2UKKy8uJHB1dENhc2UgY29uc3VtZUNhdGNoZXMoKTsgJGJyZWFrIC4vCisKK0NhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyBGb3JtYWxQYXJhbWV0ZXIgJyknICAgIEJsb2NrCisvLiRwdXRDYXNlIGNvbnN1bWVTdGF0ZW1lbnRDYXRjaCgpIDsgJGJyZWFrIC4vCisKK0ZpbmFsbHkgOjo9ICdmaW5hbGx5JyAgICBCbG9jaworCistLTE4LjEyIFByb2R1Y3Rpb25zIGZyb20gMTQ6IEV4cHJlc3Npb25zCisKKy0tZm9yIHNvdXJjZSBwb3NpdGlvbm5pbmcgcHVycG9zZQorUHVzaExQQVJFTiA6Oj0gJygnCisvLiRwdXRDYXNlIGNvbnN1bWVMZWZ0UGFyZW4oKTsgJGJyZWFrIC4vCitQdXNoUlBBUkVOIDo6PSAnKScKKy8uJHB1dENhc2UgY29uc3VtZVJpZ2h0UGFyZW4oKTsgJGJyZWFrIC4vCisKK1ByaW1hcnkgLT4gUHJpbWFyeU5vTmV3QXJyYXkKK1ByaW1hcnkgLT4gQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24KKworUHJpbWFyeU5vTmV3QXJyYXkgLT4gTGl0ZXJhbAorUHJpbWFyeU5vTmV3QXJyYXkgOjo9ICd0aGlzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlUaGlzKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gIFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIAorLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXkoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IC0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24KK1ByaW1hcnlOb05ld0FycmF5IC0+IEZpZWxkQWNjZXNzCistLTEuMSBmZWF0dXJlCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gTmFtZSAnLicgJ3RoaXMnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWVUaGlzKCk7ICRicmVhayAuLworUHJpbWFyeU5vTmV3QXJyYXkgOjo9IE5hbWUgJy4nICdzdXBlcicKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5TmFtZVN1cGVyKCk7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCistLVByaW1hcnlOb05ld0FycmF5IDo6PSBUeXBlICcuJyAnY2xhc3MnICAgCistLWlubGluZSBUeXBlIGluIHRoZSBwcmV2aW91cyBydWxlIGluIG9yZGVyIHRvIG1ha2UgdGhlIGdyYW1tYXIgTEwxIGluc3RlYWQgCistLSBvZiBMTDIuIFRoZSByZXN1bHQgaXMgdGhlIDMgbmV4dCBydWxlcy4KK1ByaW1hcnlOb05ld0FycmF5IDo6PSBOYW1lICcuJyAnY2xhc3MnCisvLiRwdXRDYXNlIGNvbnN1bWVQcmltYXJ5Tm9OZXdBcnJheU5hbWUoKTsgJGJyZWFrIC4vCisKK1ByaW1hcnlOb05ld0FycmF5IDo6PSBBcnJheVR5cGUgJy4nICdjbGFzcycKKy8uJHB1dENhc2UgY29uc3VtZVByaW1hcnlOb05ld0FycmF5QXJyYXlUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHJpbWl0aXZlVHlwZSAnLicgJ2NsYXNzJworLy4kcHV0Q2FzZSBjb25zdW1lUHJpbWFyeU5vTmV3QXJyYXlQcmltaXRpdmVUeXBlKCk7ICRicmVhayAuLworCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBNZXRob2RJbnZvY2F0aW9uCitQcmltYXJ5Tm9OZXdBcnJheSAtPiBBcnJheUFjY2VzcworCistLTEuMSBmZWF0dXJlCistLQorLS0gSW4gSmF2YSAxLjAgYSBDbGFzc0JvZHkgY291bGQgbm90IGFwcGVhciBhdCBhbGwgaW4gYQorLS0gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbi4KKy0tCisKK0FsbG9jYXRpb25IZWFkZXIgOjo9ICduZXcnIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lQWxsb2NhdGlvbkhlYWRlcigpOyAkYnJlYWsgLi8KKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KKy0tMS4xIGZlYXR1cmUKKworQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25RdWFsaWZpZWQoKSA7ICRicmVhayAuLworCistLTEuMSBmZWF0dXJlCitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblF1YWxpZmllZCgpIDsgJGJyZWFrIC4vCisKK0NsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lIDo6PSBOYW1lICcuJworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWUoKSA7ICRicmVhayAuLworCitDbGFzc0JvZHlvcHQgOjo9ICRlbXB0eSAtLXRlc3QgbWFkZSB1c2luZyBudWxsIGFzIGNvbnRlbnRzCisvLiRwdXRDYXNlIGNvbnN1bWVDbGFzc0JvZHlvcHQoKTsgJGJyZWFrIC4vCitDbGFzc0JvZHlvcHQgOjo9IEVudGVyQW5vbnltb3VzQ2xhc3NCb2R5IENsYXNzQm9keQorCitFbnRlckFub255bW91c0NsYXNzQm9keSA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbnRlckFub255bW91c0NsYXNzQm9keSgpOyAkYnJlYWsgLi8KKworQXJndW1lbnRMaXN0IDo6PSBFeHByZXNzaW9uCitBcmd1bWVudExpc3QgOjo9IEFyZ3VtZW50TGlzdCAnLCcgRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXJndW1lbnRMaXN0KCk7ICRicmVhayAuLworCistLVRoZXNzIHJ1bGVzIGFyZSByZS13cml0dGVuIGluIG9yZGVyIHRvIGJlIGxsMSAKKy0tQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIEFycmF5VHlwZSBBcnJheUluaXRpYWxpemVyCistLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbUV4cHJzIERpbXNvcHQgCistLUFycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1FeHBycyBEaW1zb3B0CistLURpbUV4cHJzIDo6PSBEaW1FeHByCistLURpbUV4cHJzIDo6PSBEaW1FeHBycyBEaW1FeHByCisKK0FycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBQcmltaXRpdmVUeXBlIERpbVdpdGhPcldpdGhPdXRFeHBycyBBcnJheUluaXRpYWxpemVyb3B0CisvLiRwdXRDYXNlIGNvbnN1bWVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK0FycmF5Q3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1XaXRoT3JXaXRoT3V0RXhwcnMgQXJyYXlJbml0aWFsaXplcm9wdAorLy4kcHV0Q2FzZSBjb25zdW1lQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCisKK0RpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHIKK0RpbVdpdGhPcldpdGhPdXRFeHBycyA6Oj0gRGltV2l0aE9yV2l0aE91dEV4cHJzIERpbVdpdGhPcldpdGhPdXRFeHByCisvLiRwdXRDYXNlIGNvbnN1bWVEaW1XaXRoT3JXaXRoT3V0RXhwcnMoKTsgJGJyZWFrIC4vCisKK0RpbVdpdGhPcldpdGhPdXRFeHByIDo6PSAnWycgRXhwcmVzc2lvbiAnXScKK0RpbVdpdGhPcldpdGhPdXRFeHByIDo6PSAnWycgJ10nCisvLiAkcHV0Q2FzZSBjb25zdW1lRGltV2l0aE9yV2l0aE91dEV4cHIoKTsgJGJyZWFrIC4vCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEaW1zIDo6PSBEaW1zTG9vcAorLy4gJHB1dENhc2UgY29uc3VtZURpbXMoKTsgJGJyZWFrIC4vCitEaW1zTG9vcCAtPiBPbmVEaW1Mb29wCitEaW1zTG9vcCA6Oj0gRGltc0xvb3AgT25lRGltTG9vcAorT25lRGltTG9vcCA6Oj0gJ1snICddJworLy4gJHB1dENhc2UgY29uc3VtZU9uZURpbUxvb3AoKTsgJGJyZWFrIC4vCisKK0ZpZWxkQWNjZXNzIDo6PSBQcmltYXJ5ICcuJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUZpZWxkQWNjZXNzKGZhbHNlKTsgJGJyZWFrIC4vCisKK0ZpZWxkQWNjZXNzIDo6PSAnc3VwZXInICcuJyAnSWRlbnRpZmllcicKKy8uJHB1dENhc2UgY29uc3VtZUZpZWxkQWNjZXNzKHRydWUpOyAkYnJlYWsgLi8KKworTWV0aG9kSW52b2NhdGlvbiA6Oj0gTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvbk5hbWUoKTsgJGJyZWFrIC4vCisKK01ldGhvZEludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvblByaW1hcnkoKTsgJGJyZWFrIC4vCisKK01ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJyAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJworLy4kcHV0Q2FzZSBjb25zdW1lTWV0aG9kSW52b2NhdGlvblN1cGVyKCk7ICRicmVhayAuLworCitBcnJheUFjY2VzcyA6Oj0gTmFtZSAnWycgRXhwcmVzc2lvbiAnXScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5QWNjZXNzKHRydWUpOyAkYnJlYWsgLi8KK0FycmF5QWNjZXNzIDo6PSBQcmltYXJ5Tm9OZXdBcnJheSAnWycgRXhwcmVzc2lvbiAnXScKKy8uJHB1dENhc2UgY29uc3VtZUFycmF5QWNjZXNzKGZhbHNlKTsgJGJyZWFrIC4vCisKK1Bvc3RmaXhFeHByZXNzaW9uIC0+IFByaW1hcnkKK1Bvc3RmaXhFeHByZXNzaW9uIDo6PSBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVQb3N0Zml4RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK1Bvc3RmaXhFeHByZXNzaW9uIC0+IFBvc3RJbmNyZW1lbnRFeHByZXNzaW9uCitQb3N0Zml4RXhwcmVzc2lvbiAtPiBQb3N0RGVjcmVtZW50RXhwcmVzc2lvbgorCitQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiA6Oj0gUG9zdGZpeEV4cHJlc3Npb24gJysrJworLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTLHRydWUpOyAkYnJlYWsgLi8KKworUG9zdERlY3JlbWVudEV4cHJlc3Npb24gOjo9IFBvc3RmaXhFeHByZXNzaW9uICctLScKKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsdHJ1ZSk7ICRicmVhayAuLworCistLWZvciBzb3VyY2UgbWFuYWdtZW50IHB1cnBvc2UKK1B1c2hQb3NpdGlvbiA6Oj0gJGVtcHR5CisgLy4kcHV0Q2FzZSBjb25zdW1lUHVzaFBvc2l0aW9uKCk7ICRicmVhayAuLworCitVbmFyeUV4cHJlc3Npb24gLT4gUHJlSW5jcmVtZW50RXhwcmVzc2lvbgorVW5hcnlFeHByZXNzaW9uIC0+IFByZURlY3JlbWVudEV4cHJlc3Npb24KK1VuYXJ5RXhwcmVzc2lvbiA6Oj0gJysnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyk7ICRicmVhayAuLworVW5hcnlFeHByZXNzaW9uIDo6PSAnLScgUHVzaFBvc2l0aW9uIFVuYXJ5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lVW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyk7ICRicmVhayAuLworVW5hcnlFeHByZXNzaW9uIC0+IFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCitQcmVJbmNyZW1lbnRFeHByZXNzaW9uIDo6PSAnKysnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUExVUyxmYWxzZSk7ICRicmVhayAuLworCitQcmVEZWNyZW1lbnRFeHByZXNzaW9uIDo6PSAnLS0nIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTUlOVVMsZmFsc2UpOyAkYnJlYWsgLi8KKworVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIC0+IFBvc3RmaXhFeHByZXNzaW9uCitVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9ICd+JyBQdXNoUG9zaXRpb24gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVVbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlRXSURETEUpOyAkYnJlYWsgLi8KK1VuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyA6Oj0gJyEnIFB1c2hQb3NpdGlvbiBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZVVuYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTk9UKTsgJGJyZWFrIC4vCitVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgLT4gQ2FzdEV4cHJlc3Npb24KKworQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gUHJpbWl0aXZlVHlwZSBEaW1zb3B0IFB1c2hSUEFSRU4gVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVDYXN0RXhwcmVzc2lvbigpOyAkYnJlYWsgLi8KK0Nhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIE5hbWUgRGltcyBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworLy4kcHV0Q2FzZSBjb25zdW1lQ2FzdEV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCistLSBFeHByZXNzaW9uIGlzIGhlcmUgb25seSBpbiBvcmRlciB0byBtYWtlIHRoZSBncmFtbWFyIExMMQorQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gRXhwcmVzc2lvbiBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworLy4kcHV0Q2FzZSBjb25zdW1lQ2FzdEV4cHJlc3Npb25MTDEoKTsgJGJyZWFrIC4vCisKK011bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAtPiBVbmFyeUV4cHJlc3Npb24KK011bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICcqJyBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk1VTFRJUExZKTsgJGJyZWFrIC4vCitNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnLycgVW5hcnlFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5ESVZJREUpOyAkYnJlYWsgLi8KK011bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICclJyBVbmFyeUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLlJFTUFJTkRFUik7ICRicmVhayAuLworCitBZGRpdGl2ZUV4cHJlc3Npb24gLT4gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCitBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiAnKycgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5QTFVTKTsgJGJyZWFrIC4vCitBZGRpdGl2ZUV4cHJlc3Npb24gOjo9IEFkZGl0aXZlRXhwcmVzc2lvbiAnLScgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5NSU5VUyk7ICRicmVhayAuLworCitTaGlmdEV4cHJlc3Npb24gLT4gQWRkaXRpdmVFeHByZXNzaW9uCitTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiAnPDwnICBBZGRpdGl2ZUV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkxFRlRfU0hJRlQpOyAkYnJlYWsgLi8KK1NoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc+PicgIEFkZGl0aXZlRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uUklHSFRfU0hJRlQpOyAkYnJlYWsgLi8KK1NoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc+Pj4nIEFkZGl0aXZlRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uVU5TSUdORURfUklHSFRfU0hJRlQpOyAkYnJlYWsgLi8KKworUmVsYXRpb25hbEV4cHJlc3Npb24gLT4gU2hpZnRFeHByZXNzaW9uCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJzwnICBTaGlmdEV4cHJlc3Npb24gCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5MRVNTKTsgJGJyZWFrIC4vCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJz4nICBTaGlmdEV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLkdSRUFURVIpOyAkYnJlYWsgLi8KK1JlbGF0aW9uYWxFeHByZXNzaW9uIDo6PSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAnPD0nIFNoaWZ0RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uTEVTU19FUVVBTCk7ICRicmVhayAuLworUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc+PScgU2hpZnRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5HUkVBVEVSX0VRVUFMKTsgJGJyZWFrIC4vCitSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJ2luc3RhbmNlb2YnIFJlZmVyZW5jZVR5cGUKKy8uJHB1dENhc2UgY29uc3VtZUluc3RhbmNlT2ZFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GKTsgJGJyZWFrIC4vCisKK0VxdWFsaXR5RXhwcmVzc2lvbiAtPiBSZWxhdGlvbmFsRXhwcmVzc2lvbgorRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gJz09JyBSZWxhdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5FUVVBTF9FUVVBTCk7ICRicmVhayAuLworRXF1YWxpdHlFeHByZXNzaW9uIDo6PSBFcXVhbGl0eUV4cHJlc3Npb24gJyE9JyBSZWxhdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lRXF1YWxpdHlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5OT1RfRVFVQUwpOyAkYnJlYWsgLi8KKworQW5kRXhwcmVzc2lvbiAtPiBFcXVhbGl0eUV4cHJlc3Npb24KK0FuZEV4cHJlc3Npb24gOjo9IEFuZEV4cHJlc3Npb24gJyYnIEVxdWFsaXR5RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uQU5EKTsgJGJyZWFrIC4vCisKK0V4Y2x1c2l2ZU9yRXhwcmVzc2lvbiAtPiBBbmRFeHByZXNzaW9uCitFeGNsdXNpdmVPckV4cHJlc3Npb24gOjo9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiAnXicgQW5kRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQmluYXJ5RXhwcmVzc2lvbihPcGVyYXRvckV4cHJlc3Npb24uWE9SKTsgJGJyZWFrIC4vCisKK0luY2x1c2l2ZU9yRXhwcmVzc2lvbiAtPiBFeGNsdXNpdmVPckV4cHJlc3Npb24KK0luY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uICd8JyBFeGNsdXNpdmVPckV4cHJlc3Npb24KKy8uJHB1dENhc2UgY29uc3VtZUJpbmFyeUV4cHJlc3Npb24oT3BlcmF0b3JFeHByZXNzaW9uLk9SKTsgJGJyZWFrIC4vCisKK0NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiAtPiBJbmNsdXNpdmVPckV4cHJlc3Npb24KK0NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICcmJicgSW5jbHVzaXZlT3JFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5BTkRfQU5EKTsgJGJyZWFrIC4vCisKK0NvbmRpdGlvbmFsT3JFeHByZXNzaW9uIC0+IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uICd8fCcgQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uCisvLiRwdXRDYXNlIGNvbnN1bWVCaW5hcnlFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5PUl9PUik7ICRicmVhayAuLworCitDb25kaXRpb25hbEV4cHJlc3Npb24gLT4gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24KK0NvbmRpdGlvbmFsRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gJz8nIEV4cHJlc3Npb24gJzonIENvbmRpdGlvbmFsRXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQ29uZGl0aW9uYWxFeHByZXNzaW9uKE9wZXJhdG9yRXhwcmVzc2lvbi5RVUVTVElPTkNPTE9OKSA7ICRicmVhayAuLworCitBc3NpZ25tZW50RXhwcmVzc2lvbiAtPiBDb25kaXRpb25hbEV4cHJlc3Npb24KK0Fzc2lnbm1lbnRFeHByZXNzaW9uIC0+IEFzc2lnbm1lbnQKKworQXNzaWdubWVudCA6Oj0gTGVmdEhhbmRTaWRlIEFzc2lnbm1lbnRPcGVyYXRvciBBc3NpZ25tZW50RXhwcmVzc2lvbgorLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudCgpOyAkYnJlYWsgLi8KKworLS0gdGhpcyBydWxlIGlzIGFkZGVkIHRvIHBhcnNlIGFuIGFycmF5IGluaXRpYWxpemVyIGluIGEgYXNzaWdtZW50IGFuZCB0aGVuIHJlcG9ydCBhIHN5bnRheCBlcnJvciBrbm93aW5nIHRoZSBleGFjdCBzZW5hcmlvCitJbnZhbGlkQXJyYXlJbml0aWFsaXplckFzc2lnbmVtZW50IDo6PSBMZWZ0SGFuZFNpZGUgQXNzaWdubWVudE9wZXJhdG9yIEFycmF5SW5pdGlhbGl6ZXIKK0Fzc2lnbm1lbnQgOjo9IEludmFsaWRBcnJheUluaXRpYWxpemVyQXNzaWduZW1lbnQKKy8uJHB1dGNhc2UgaWdub3JlRXhwcmVzc2lvbkFzc2lnbm1lbnQoKTskYnJlYWsgLi8KKworTGVmdEhhbmRTaWRlIDo6PSBOYW1lCisvLiRwdXRDYXNlIGNvbnN1bWVMZWZ0SGFuZFNpZGUoKTsgJGJyZWFrIC4vCitMZWZ0SGFuZFNpZGUgLT4gRmllbGRBY2Nlc3MKK0xlZnRIYW5kU2lkZSAtPiBBcnJheUFjY2VzcworCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKEVRVUFMKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcqPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihNVUxUSVBMWSk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnLz0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoRElWSURFKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICclPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihSRU1BSU5ERVIpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJys9JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFBMVVMpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJy09JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKE1JTlVTKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc8PD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoTEVGVF9TSElGVCk7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnPj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFJJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICc+Pj49JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFVOU0lHTkVEX1JJR0hUX1NISUZUKTsgJGJyZWFrIC4vCitBc3NpZ25tZW50T3BlcmF0b3IgOjo9ICcmPScKKy8uJHB1dENhc2UgY29uc3VtZUFzc2lnbm1lbnRPcGVyYXRvcihBTkQpOyAkYnJlYWsgLi8KK0Fzc2lnbm1lbnRPcGVyYXRvciA6Oj0gJ149JworLy4kcHV0Q2FzZSBjb25zdW1lQXNzaWdubWVudE9wZXJhdG9yKFhPUik7ICRicmVhayAuLworQXNzaWdubWVudE9wZXJhdG9yIDo6PSAnfD0nCisvLiRwdXRDYXNlIGNvbnN1bWVBc3NpZ25tZW50T3BlcmF0b3IoT1IpOyAkYnJlYWsgLi8KKworRXhwcmVzc2lvbiAtPiBBc3NpZ25tZW50RXhwcmVzc2lvbgorCitDb25zdGFudEV4cHJlc3Npb24gLT4gRXhwcmVzc2lvbgorCistLSBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBmb3Igb3B0aW9uYWwgbm9udGVybWluYWxzLgorLS0KKworUGFja2FnZURlY2xhcmF0aW9ub3B0IC0+ICRlbXB0eSAKK1BhY2thZ2VEZWNsYXJhdGlvbm9wdCAtPiBQYWNrYWdlRGVjbGFyYXRpb24KKworQ2xhc3NIZWFkZXJFeHRlbmRzb3B0IDo6PSAkZW1wdHkKK0NsYXNzSGVhZGVyRXh0ZW5kc29wdCAtPiBDbGFzc0hlYWRlckV4dGVuZHMKKworRXhwcmVzc2lvbm9wdCA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUV4cHJlc3Npb24oKTsgJGJyZWFrIC4vCitFeHByZXNzaW9ub3B0IC0+IEV4cHJlc3Npb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSBUaGUgcnVsZXMgYmVsb3cgYXJlIGZvciBvcHRpb25hbCB0ZXJtaW5hbCBzeW1ib2xzLiAgQW4gb3B0aW9uYWwgY29tbWEsCistLSBpcyBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgLSBJdCBpcyBhCistLSAic3ludGFjdGljIHN1Z2FyIiB0aGF0IG90aGVyd2lzZSBzZXJ2ZXMgbm8gb3RoZXIgcHVycG9zZS4gQnkgY29udHJhc3QsCistLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIGlzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgYSBicmVhayBhbmQgCistLSBjb250aW51ZSBzdGF0ZW1lbnQuIFdoZW4gdGhlIGlkZW50aWZpZXIgZG9lcyBub3QgYXBwZWFyLCBhIE5VTEwKKy0tIGlzIHByb2R1Y2VkLiBXaGVuIHRoZSBpZGVudGlmaWVyIGlzIHByZXNlbnQsIHRoZSB1c2VyIHNob3VsZCB1c2UgdGhlCistLSBjb3JyZXNwb25kaW5nIFRPS0VOKGkpIG1ldGhvZC4gU2VlIGJyZWFrIHN0YXRlbWVudCBhcyBhbiBleGFtcGxlLgorLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCissb3B0IC0+ICRlbXB0eQorLG9wdCAtPiAsCisKKy0tIDEuNSBmZWF0dXJlCitUeXBlQm91bmRvcHQgIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5VHlwZUJvdW5kb3B0KCk7ICRicmVhayAuLworLS0gMS41IGZlYXR1cmUKK1R5cGVCb3VuZG9wdCA6Oj0gVHlwZUJvdW5kCisvLiRwdXRDYXNlIGNvbnN1bWVUeXBlQm91bmRvcHQoKTsgJGJyZWFrIC4vCisKKy0tIDEuNSBmZWF0dXJlCitBZGRpdGlvbmFsQm91bmRMaXN0b3B0ICA6Oj0gJGVtcHR5CisvLiRwdXRDYXNlIGNvbnN1bWVFbXB0eUFkZGl0aW9uYWxCb3VuZExpc3RvcHQoKTsgJGJyZWFrIC4vCistLSAxLjUgZmVhdHVyZQorQWRkaXRpb25hbEJvdW5kTGlzdG9wdCA6Oj0gQWRkaXRpb25hbEJvdW5kTGlzdAorLy4kcHV0Q2FzZSBjb25zdW1lQWRkaXRpb25hbEJvdW5kTGlzdG9wdCgpOyAkYnJlYWsgLi8KKworLS0gMS41IGZlYXR1cmUKK0NsYXNzSGVhZGVyUGFyYW1ldGVyc29wdCAgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlDbGFzc0hlYWRlclBhcmFtZXRlcnNvcHQoKTsgJGJyZWFrIC4vCistLSAxLjUgZmVhdHVyZQorQ2xhc3NIZWFkZXJQYXJhbWV0ZXJzb3B0IDo6PSBDbGFzc0hlYWRlclBhcmFtZXRlcnMKKy8uJHB1dENhc2UgY29uc3VtZUNsYXNzSGVhZGVyUGFyYW1ldGVyc29wdCgpOyAkYnJlYWsgLi8KKworLS0gMS41IGZlYXR1cmUKK0ludGVyZmFjZUhlYWRlclBhcmFtZXRlcnNvcHQgIDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5SW50ZXJmYWNlSGVhZGVyUGFyYW1ldGVyc29wdCgpOyAkYnJlYWsgLi8KKy0tIDEuNSBmZWF0dXJlCitJbnRlcmZhY2VIZWFkZXJQYXJhbWV0ZXJzb3B0IDo6PSBJbnRlcmZhY2VIZWFkZXJQYXJhbWV0ZXJzCisvLiRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VIZWFkZXJQYXJhbWV0ZXJzb3B0KCk7ICRicmVhayAuLworCitJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlJbXBvcnREZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCitJbXBvcnREZWNsYXJhdGlvbnNvcHQgOjo9IEltcG9ydERlY2xhcmF0aW9ucworLy4kcHV0Q2FzZSBjb25zdW1lSW1wb3J0RGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworCisKK1R5cGVEZWNsYXJhdGlvbnNvcHQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlUeXBlRGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworVHlwZURlY2xhcmF0aW9uc29wdCA6Oj0gVHlwZURlY2xhcmF0aW9ucworLy4kcHV0Q2FzZSBjb25zdW1lVHlwZURlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KKworQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSAkZW1wdHkKKy8uJHB1dENhc2UgY29uc3VtZUVtcHR5Q2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0IDo6PSBOZXN0ZWRUeXBlIENsYXNzQm9keURlY2xhcmF0aW9ucworLy4kcHV0Q2FzZSBjb25zdW1lQ2xhc3NCb2R5RGVjbGFyYXRpb25zb3B0KCk7ICRicmVhayAuLworCitNb2RpZmllcnNvcHQgOjo9ICRlbXB0eSAKKy8uICRwdXRDYXNlIGNvbnN1bWVEZWZhdWx0TW9kaWZpZXJzKCk7ICRicmVhayAuLworTW9kaWZpZXJzb3B0IDo6PSBNb2RpZmllcnMgCisvLiRwdXRDYXNlIGNvbnN1bWVNb2RpZmllcnMoKTsgJGJyZWFrIC4vIAorCitCbG9ja1N0YXRlbWVudHNvcHQgOjo9ICRlbXB0eQorLy4kcHV0Q2FzZSBjb25zdW1lRW1wdHlCbG9ja1N0YXRlbWVudHNvcHQoKTsgJGJyZWFrIC4vCitCbG9ja1N0YXRlbWVudHNvcHQgLT4gQmxvY2tTdGF0ZW1lbnRzCisKK0RpbXNvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5RGltc29wdCgpOyAkYnJlYWsgLi8KK0RpbXNvcHQgLT4gRGltcworCitBcmd1bWVudExpc3RvcHQgOjo9ICRlbXB0eQorLy4gJHB1dENhc2UgY29uc3VtZUVtcHR5QXJndW1lbnRMaXN0b3B0KCk7ICRicmVhayAuLworQXJndW1lbnRMaXN0b3B0IC0+IEFyZ3VtZW50TGlzdAorCitNZXRob2RIZWFkZXJUaHJvd3NDbGF1c2VvcHQgOjo9ICRlbXB0eQorTWV0aG9kSGVhZGVyVGhyb3dzQ2xhdXNlb3B0IC0+IE1ldGhvZEhlYWRlclRocm93c0NsYXVzZQorICAgCitGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IDo6PSAkZW1wdHkKKy8uJHB1dGNhc2UgY29uc3VtZUZvcm1hbFBhcmFtZXRlckxpc3RvcHQoKTsgJGJyZWFrIC4vCitGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0IC0+IEZvcm1hbFBhcmFtZXRlckxpc3QKKworQ2xhc3NIZWFkZXJJbXBsZW1lbnRzb3B0IDo6PSAkZW1wdHkKK0NsYXNzSGVhZGVySW1wbGVtZW50c29wdCAtPiBDbGFzc0hlYWRlckltcGxlbWVudHMKKworSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCgpOyAkYnJlYWsgLi8KK0ludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uc29wdCA6Oj0gTmVzdGVkVHlwZSBJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMKKy8uICRwdXRDYXNlIGNvbnN1bWVJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnNvcHQoKTsgJGJyZWFrIC4vCisKK05lc3RlZFR5cGUgOjo9ICRlbXB0eSAKKy8uJHB1dENhc2UgY29uc3VtZU5lc3RlZFR5cGUoKTsgJGJyZWFrLi8KKworRm9ySW5pdG9wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlGb3JJbml0b3B0KCk7ICRicmVhayAuLworRm9ySW5pdG9wdCAtPiBGb3JJbml0CisKK0ZvclVwZGF0ZW9wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlGb3JVcGRhdGVvcHQoKTsgJGJyZWFrIC4vCisgRm9yVXBkYXRlb3B0IC0+IEZvclVwZGF0ZQorCitJbnRlcmZhY2VIZWFkZXJFeHRlbmRzb3B0IDo6PSAkZW1wdHkKK0ludGVyZmFjZUhlYWRlckV4dGVuZHNvcHQgLT4gSW50ZXJmYWNlSGVhZGVyRXh0ZW5kcworCitDYXRjaGVzb3B0IDo6PSAkZW1wdHkKKy8uICRwdXRDYXNlIGNvbnN1bWVFbXB0eUNhdGNoZXNvcHQoKTsgJGJyZWFrIC4vCitDYXRjaGVzb3B0IC0+IENhdGNoZXMKKworQXJyYXlJbml0aWFsaXplcm9wdCA6Oj0gJGVtcHR5CisvLiAkcHV0Q2FzZSBjb25zdW1lRW1wdHlBcnJheUluaXRpYWxpemVyb3B0KCk7ICRicmVhayAuLworQXJyYXlJbml0aWFsaXplcm9wdCAtPiBBcnJheUluaXRpYWxpemVyCisKKy8uCX0KK30gLi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyRuYW1lcworCistLSBCb2R5TWFya2VyIDo6PSAnImNsYXNzIElkZW50aWZpZXIgeyAuLi4gTWV0aG9kSGVhZGVyICInCisKKy0tIHZvaWQgOjo9ICd2b2lkJworCitQTFVTX1BMVVMgOjo9ICAgICcrKycgICAKK01JTlVTX01JTlVTIDo6PSAgICAnLS0nICAgCitFUVVBTF9FUVVBTCA6Oj0gICAgJz09JyAgIAorTEVTU19FUVVBTCA6Oj0gICAgJzw9JyAgIAorR1JFQVRFUl9FUVVBTCA6Oj0gICAgJz49JyAgIAorTk9UX0VRVUFMIDo6PSAgICAnIT0nICAgCitMRUZUX1NISUZUIDo6PSAgICAnPDwnICAgCitSSUdIVF9TSElGVCA6Oj0gICAgJz4+JyAgIAorVU5TSUdORURfUklHSFRfU0hJRlQgOjo9ICAgICc+Pj4nICAKK1BMVVNfRVFVQUwgOjo9ICAgICcrPScgICAKK01JTlVTX0VRVUFMIDo6PSAgICAnLT0nICAgCitNVUxUSVBMWV9FUVVBTCA6Oj0gICAgJyo9JyAgIAorRElWSURFX0VRVUFMIDo6PSAgICAnLz0nICAgCitBTkRfRVFVQUwgOjo9ICAgICcmPScgICAKK09SX0VRVUFMIDo6PSAgICAnfD0nICAgCitYT1JfRVFVQUwgOjo9ICAgICdePScgICAKK1JFTUFJTkRFUl9FUVVBTCA6Oj0gICAgJyU9JyAgIAorTEVGVF9TSElGVF9FUVVBTCA6Oj0gICAgJzw8PScgIAorUklHSFRfU0hJRlRfRVFVQUwgOjo9ICAgICc+Pj0nICAKK1VOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDo6PSAgICAnPj4+PScgCitPUl9PUiA6Oj0gICAgJ3x8JyAgIAorQU5EX0FORCA6Oj0gICAgJyYmJyAgIAorCitQTFVTIDo6PSAgICAnKycgICAgCitNSU5VUyA6Oj0gICAgJy0nICAgIAorTk9UIDo6PSAgICAnIScgICAgCitSRU1BSU5ERVIgOjo9ICAgICclJyAgICAKK1hPUiA6Oj0gICAgJ14nICAgIAorQU5EIDo6PSAgICAnJicgICAgCitNVUxUSVBMWSA6Oj0gICAgJyonICAgIAorT1IgOjo9ICAgICd8JyAgICAKK1RXSURETEUgOjo9ICAgICd+JyAgICAKK0RJVklERSA6Oj0gICAgJy8nICAgIAorR1JFQVRFUiA6Oj0gICAgJz4nICAgIAorTEVTUyA6Oj0gICAgJzwnICAgIAorTFBBUkVOIDo6PSAgICAnKCcgICAgCitSUEFSRU4gOjo9ICAgICcpJyAgICAKK0xCUkFDRSA6Oj0gICAgJ3snICAgIAorUkJSQUNFIDo6PSAgICAnfScgICAgCitMQlJBQ0tFVCA6Oj0gICAgJ1snICAgIAorUkJSQUNLRVQgOjo9ICAgICddJyAgICAKK1NFTUlDT0xPTiA6Oj0gICAgJzsnICAgIAorUVVFU1RJT04gOjo9ICAgICc/JyAgICAKK0NPTE9OIDo6PSAgICAnOicgICAgCitDT01NQSA6Oj0gICAgJywnICAgIAorRE9UIDo6PSAgICAnLicgICAgCitFUVVBTCA6Oj0gICAgJz0nICAgIAorCiskZW5kCistLSBuZWVkIGEgY2FycmlhZ2UgcmV0dXJuIGFmdGVyIHRoZSAkZW5kCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvamR0Q29tcGlsZXJBZGFwdGVyLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2pkdENvbXBpbGVyQWRhcHRlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjMzNDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvamR0Q29tcGlsZXJBZGFwdGVyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0J1ZmZlckNoYW5nZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKaW5kZXggM2M0ZDY2Ny4uZTExNjkyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQnVmZmVyQ2hhbmdlZEV2ZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKQEAgLTYyLDYgKzYyLDExIEBACiAKIC8qKgogICogQ3JlYXRlcyBhIG5ldyBidWZmZXIgY2hhbmdlZCBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIGdpdmVuIGJ1ZmZlciBoYXMgY2hhbmdlZC4KKyAqIAorICogQHBhcmFtIGJ1ZmZlciB0aGUgZ2l2ZW4gYnVmZmVyCisgKiBAcGFyYW0gb2Zmc2V0IHRoZSBnaXZlbiBvZmZzZXQKKyAqIEBwYXJhbSBsZW5ndGggdGhlIGdpdmVuIGxlbmd0aAorICogQHBhcmFtIHRleHQgdGhlIGdpdmVuIHRleHQKICAqLwogcHVibGljIEJ1ZmZlckNoYW5nZWRFdmVudChJQnVmZmVyIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKIAlzdXBlcihidWZmZXIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKaW5kZXggNGE0MDU0OS4uOTkxNGRmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCkBAIC0xLDE0ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBzdXBwb3J0IGZvciByZXF1ZXN0aW5nIHVwZGF0ZXMgb2YgYSBwYXJ0aWN1bGFyCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyIGZvciBnZW5lcmljIGNvbnRhaW5lciBvcGVyYXRpb25zLgorICogCQkJCQkJIC0gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpCisgKiAJCQkJCQkgLSByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElQYXRoLCBJSmF2YVByb2plY3QsIElDbGFzc3BhdGhDb250YWluZXIpCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWxsb3cgaW5pdGlhbGl6ZXJzIHRvIHByb3ZpZGUgYSByZWFkYWJsZSBkZXNjcmlwdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgIG9mIGEgY29udGFpbmVyIHJlZmVyZW5jZSwgYWhlYWQgb2YgYWN0dWFsIHJlc29sdXRpb24uCisgKiAJCQkJCQkgLSBnZXREZXNjcmlwdGlvbihJUGF0aCwgSUphdmFQcm9qZWN0KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CkBAIC02Niw1ICs3Miw2NSBAQAogICAgICAqIEBzZWUgSUNsYXNzcGF0aENvbnRhaW5lcgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250YWluZXIgaW5pdGlhbGl6ZXIgY2FuIGJlIHJlcXVlc3RlZCB0byBwZXJmb3JtIHVwZGF0ZXMgCisgICAgICogb24gaXRzIG93biBjb250YWluZXIgdmFsdWVzLiBJZiBzbywgdGhlbiBhbiB1cGRhdGUgcmVxdWVzdCB3aWxsIGJlIHBlcmZvcm1lZCB1c2luZworICAgICAqIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI3JlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGU8L2NvZGU+LworICAgICAqIDxwPgorICAgICAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBwYXRoIG9mIHRoZSBjb250YWluZXIgd2hpY2ggcmVxdWlyZXMgdG8gYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB3aGljaCB0aGUgY29udGFpbmVyIGlzIHRvIGJlIHVwZGF0ZWQKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRhaW5lciBjYW4gYmUgdXBkYXRlZAorICAgICAqIEBzaW5jZSAyLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKyAgICAJCisJCS8vIEJ5IGRlZmF1bHQsIGNsYXNzcGF0aCBjb250YWluZXIgaW5pdGlhbGl6ZXJzIGRvIG5vdCBhY2NlcHQgdXBkYXRpbmcgY29udGFpbmVycworICAgIAlyZXR1cm4gZmFsc2U7IAorICAgIH0KKworCS8qKgorCSAqIFJlcXVlc3QgYSByZWdpc3RlcmVkIGNvbnRhaW5lciBkZWZpbml0aW9uIHRvIGJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIGEgY29udGFpbmVyIHN1Z2dlc3Rpb24uIFRoZSBjb250YWluZXIgc3VnZ2VzdGlvbiAKKwkgKiBvbmx5IGFjdHMgYXMgYSBwbGFjZS1ob2xkZXIgdG8gcGFzcyBhbG9uZyB0aGUgaW5mb3JtYXRpb24gdG8gdXBkYXRlIHRoZSBtYXRjaGluZyBjb250YWluZXIgZGVmaW5pdGlvbihzKSBoZWxkIGJ5IHRoZSAKKwkgKiBjb250YWluZXIgaW5pdGlhbGl6ZXIuIEluIHBhcnRpY3VsYXIsIGl0IGlzIG5vdCBleHBlY3RlZCB0byBzdG9yZSB0aGUgY29udGFpbmVyIHN1Z2dlc3Rpb24gYXMgaXMsIGJ1dCByYXRoZXIgYWRqdXN0IAorCSAqIHRoZSBhY3R1YWwgY29udGFpbmVyIGRlZmluaXRpb24gYmFzZWQgb24gc3VnZ2VzdGVkIGNoYW5nZXMuCisJICogPHA+CisJICogSU1QT1JUQU5UOiBJbiByZWFjdGlvbiB0byByZWNlaXZpbmcgYW4gdXBkYXRlIHJlcXVlc3QsIGEgY29udGFpbmVyIGluaXRpYWxpemVyIHdpbGwgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nCisJICogY29udGFpbmVyIGRlZmluaXRpb24gKGFmdGVyIHJlY29uY2lsaW5nIGNoYW5nZXMpIGF0IGl0cyBlYXJsaWVzdCBjb252ZW5pZW5jZSwgdXNpbmcgCisJICogPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3RbXSwgSUNsYXNzcGF0aENvbnRhaW5lcltdLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4uIAorCSAqIFVudGlsIGl0IGRvZXMgc28sIHRoZSB1cGRhdGUgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSBKYXZhIE1vZGVsLgorCSAqIDxwPgorCSAqIEluIG9yZGVyIHRvIGFudGljaXBhdGUgd2hldGhlciB0aGUgY29udGFpbmVyIGluaXRpYWxpemVyIGFsbG93cyB0byB1cGRhdGUgaXRzIGNvbnRhaW5lcnMsIHRoZSBwcmVkaWNhdGUKKwkgKiA8Y29kZT5KYXZhQ29yZSNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkLgorCSAqIDxwPgorCSAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBwYXRoIG9mIHRoZSBjb250YWluZXIgd2hpY2ggcmVxdWlyZXMgdG8gYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB3aGljaCB0aGUgY29udGFpbmVyIGlzIHRvIGJlIHVwZGF0ZWQKKwkgKiBAcGFyYW0gY29udGFpbmVyU3VnZ2VzdGlvbiBhIHN1Z2dlc3Rpb24gdG8gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRhaW5lciBkZWZpbml0aW9uCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHdoZW4gPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiB3b3VsZCB0aHJvdyBhbnkuCisJICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdFtdLCBJQ2xhc3NwYXRoQ29udGFpbmVyW10sIElQcm9ncmVzc01vbml0b3IpCisJICogQHNlZSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCkKKwkgKiBAc2luY2UgMi4xCisJICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gQnkgZGVmYXVsdCwgY2xhc3NwYXRoIGNvbnRhaW5lciBpbml0aWFsaXplcnMgZG8gbm90IGFjY2VwdCB1cGRhdGluZyBjb250YWluZXJzCisgICAgfQorCisJLyoqCisJICogUmV0dXJucyBhIHJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGNvbnRhaW5lciBwYXRoLiBBIHJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGNvbnRhaW5lciBwYXRoIGNhbiBiZQorCSAqIHVzZWQgZm9yIGltcHJvdmluZyB0aGUgZGlzcGxheSBvZiByZWZlcmVuY2VzIHRvIGNvbnRhaW5lciwgd2l0aG91dCBhY3R1YWxseSBuZWVkaW5nIHRvIHJlc29sdmUgdGhlbS4KKwkgKiBBIGdvb2QgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFuc3dlciBhIGRlc2NyaXB0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc29jaWF0ZWQgCisJICogdGFyZ2V0IGNvbnRhaW5lciAoc2VlIDxjb2RlPklDbGFzc3BhdGhDb250YWluZXIuZ2V0RGVzY3JpcHRpb24oKTwvY29kZT4pLgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJQYXRoIHRoZSBwYXRoIG9mIHRoZSBjb250YWluZXIgd2hpY2ggcmVxdWlyZXMgYSByZWFkYWJsZSBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZyb20gd2hpY2ggdGhlIGNvbnRhaW5lciBpcyByZWZlcmVuY2VkCisJICogQHJldHVybiBhIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGFpbmVyCisJICogQHNpbmNlIDIuMQorCSAqLyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisgICAgCQorICAgIAkvLyBCeSBkZWZhdWx0LCBhIGNvbnRhaW5lciBwYXRoIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBkZXNjcmlwdGlvbgorICAgIAlyZXR1cm4gY29udGFpbmVyUGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhCmluZGV4IDljZjc1YTkuLjNiYzFkMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9DbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29tcGxldGlvblJlcXVlc3RvckFkYXB0ZXIuamF2YQppbmRleCA5NjQ5MzQ2Li5kYjQzZTdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yQWRhcHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvbXBsZXRpb25SZXF1ZXN0b3JBZGFwdGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29ycmVjdGlvbkVuZ2luZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvQ29ycmVjdGlvbkVuZ2luZS5qYXZhCmluZGV4IDdlNDg0OTMuLjNhODRmMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0NvcnJlY3Rpb25FbmdpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Db3JyZWN0aW9uRW5naW5lLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xOCw3ICsxOCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogCiAvKioKQEAgLTI2MCwxNyArMjU5LDE3IEBACiAJCQkKIAkJCXNjYW5uZXIucmVzZXRUbyhjb3JyZWN0aW9uU3RhcnQsIGNvcnJlY3Rpb25FbmQpOwogCQkJaW50IHRva2VuID0gMDsKLQkJCWNoYXJbXSBhcmd1bWVudFNvdXJjZSA9IG5ldyBjaGFyWzBdOworCQkJY2hhcltdIGFyZ3VtZW50U291cmNlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCQkJCiAJCQkvLyBzZWFyY2ggbGFzdCBzZWdtZW50IHBvc2l0aW9uCiAJCQl3aGlsZSh0cnVlKSB7CiAJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJCWlmICh0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgcmV0dXJuOworCQkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpIHJldHVybjsKIAkJCQkKIAkJCQljaGFyW10gdG9rZW5Tb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwogCQkJCQogCQkJCWFyZ3VtZW50U291cmNlID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoYXJndW1lbnRTb3VyY2UsIHRva2VuU291cmNlKTsKLQkJCQlpZighQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGFyZ3VtZW50LCBhcmd1bWVudFNvdXJjZSkpCisJCQkJaWYoIUNoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKGFyZ3VtZW50U291cmNlLCBhcmd1bWVudCkpCiAJCQkJCXJldHVybjsKIAkJCQkKIAkJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhhcmd1bWVudCwgYXJndW1lbnRTb3VyY2UpKSB7CkBAIC00MTEsNCArNDEwLDE5IEBACiAJCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLGNoYXJbXSB0eXBlTmFtZSxjaGFyW10gY29tcGxldGlvbk5hbWUsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkge30KIAkJcHVibGljIHZvaWQgYWNjZXB0VmFyaWFibGVOYW1lKGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGNoYXJbXSBuYW1lLGNoYXJbXSBjb21wbGV0aW9uTmFtZSxpbnQgY29tcGxldGlvblN0YXJ0LGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7fQogCX07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorCS8qKgorCSAqIEhlbHBlciBtZXRob2QgZm9yIGRlY29kaW5nIHByb2JsZW0gbWFya2VyIGF0dHJpYnV0ZXMuIFJldHVybnMgYW4gYXJyYXkgb2YgU3RyaW5nIGFyZ3VtZW50cworCSAqIGV4dHJhY3RlZCBmcm9tIHRoZSBwcm9ibGVtIG1hcmtlciAiYXJndW1lbnRzIiBhdHRyaWJ1dGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXJrZXIgCisJICogImFyZ3VtZW50cyIgYXR0cmlidXRlIGlzIG1pc3Npbmcgb3IgaWxsLWZvcm1lZC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvYmxlbU1hcmtlcgorCSAqIAkJdGhlIHByb2JsZW0gbWFya2VyIHRvIGRlY29kZSBhcmd1bWVudHMgZnJvbS4KKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZyBhcmd1bWVudHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBleHRyYWN0IGFyZ3VtZW50cworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2JsZW1Bcmd1bWVudHMoSU1hcmtlciBwcm9ibGVtTWFya2VyKXsKKwkJU3RyaW5nIGFyZ3VtZW50c1N0cmluZyA9IHByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQVJHVU1FTlRTLCBudWxsKTsKKwkJcmV0dXJuIFV0aWwuZ2V0UHJvYmxlbUFyZ3VtZW50c0Zyb21NYXJrZXIoYXJndW1lbnRzU3RyaW5nKTsKKwl9CQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRWxlbWVudENoYW5nZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRWxlbWVudENoYW5nZWRFdmVudC5qYXZhCmluZGV4IDU1NjA5YTguLjIxOTA5N2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0VsZW1lbnRDaGFuZ2VkRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9FbGVtZW50Q2hhbmdlZEV2ZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9GbGFncy5qYXZhCmluZGV4IDUyZTM2NWEuLmNhOWEzZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0ZsYWdzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvRmxhZ3MuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOwpAQCAtMTgsNiArMTgsMTIgQEAKICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCiAgKiBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgogICogPC9wPgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZXNlIGZsYWdzIG1hdGNoIHRoZSBvbmVzIGZvciBjbGFzcyBmaWxlcworICogYXMgZGVzY3JpYmVkIGluIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uLiBUaGUgQVNUIGNsYXNzCisgKiA8Y29kZT5Nb2RpZmllcjwvY29kZT4gcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGlzIGNsYXNzLCBvbmx5IGluCisgKiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tPC9jb2RlPiBwYWNrYWdlLgorICogPC9wPgogICoKICAqIEBzZWUgSU1lbWJlciNnZXRGbGFncwogICovCkBAIC0yOTEsNCArMjk3LDQgQEAKIAkJc2Iuc2V0TGVuZ3RoKGxlbiAtIDEpOwogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlci5qYXZhCmluZGV4IGFjZWY5YmEuLjAzODhjZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJDaGFuZ2VkTGlzdGVuZXIuamF2YQppbmRleCBhNmYwZjg2Li4wNDQxNjRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lCdWZmZXJGYWN0b3J5LmphdmEKaW5kZXggOTYwMzRmNC4uNDgxNjkxOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUJ1ZmZlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQnVmZmVyRmFjdG9yeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzRmlsZS5qYXZhCmluZGV4IGNkZWFjNjYuLjYxMTBlNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NGaWxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmluZGV4IDI2N2M5YTUuLmQ5MjhjZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDbGFzc3BhdGhFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEKaW5kZXggZTYyZWE1Mi4uNzhlZjYzOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKQEAgLTI3LDcgKzI3LDExIEBACiAgKgkJcmVwcmVzZW50IGNvbXBpbGF0aW9uIHVuaXRzLiBBbGwgY29tcGlsYXRpb24gdW5pdHMgd2lsbCBiZSBjb21waWxlZCB3aGVuCiAgKiAJCXRoZSBwcm9qZWN0IGlzIGJ1aWx0LiBUaGUgY2xhc3NwYXRoIGVudHJ5IG11c3Qgc3BlY2lmeSB0aGUKICAqCQlhYnNvbHV0ZSBwYXRoIHRvIHRoZSByb290IGZvbGRlci4gRW50cmllcyBvZiB0aGlzIGtpbmQgYXJlIAotICoJCWFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4gY29uc3RhbnQuPC9saT4KKyAqCQlhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGNvbnN0YW50LgorICogICAgICBTb3VyY2UgY2xhc3NwYXRoIGVudHJpZXMgY2FuIGNhcnJ5IHBhdHRlcm5zIHRvIGV4Y2x1ZGUgc2VsZWN0ZWQgZmlsZXMuCisgKiAgICAgIEV4Y2x1ZGVkIDxjb2RlPi5qYXZhPC9jb2RlPiBzb3VyY2UgZmlsZXMgZG8gbm90IGFwcGVhciBhcyBjb21waWxhdGlvbgorICogICAgICB1bml0cyBhbmQgYXJlIG5vdCBjb21waWxlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGJ1aWx0LgorICogIDwvbGk+CiAgKiAKICAqCTxsaT5BIGJpbmFyeSBsaWJyYXJ5IGluIHRoZSBjdXJyZW50IHByb2plY3QsIGluIGFub3RoZXIgcHJvamVjdCwgb3IgaW4gdGhlIGV4dGVybmFsCiAgKgkJZmlsZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB0aGUgZW50cnkgaWRlbnRpZmllcyBhIEpBUiAob3Igcm9vdCBmb2xkZXIpIGNvbnRhaW5pbmcKQEAgLTkwLDkgKzk0LDEwIEBACiAgKiA8cD4KICAqIEFueSBjbGFzc3BhdGggZW50cnkgb3RoZXIgdGhhbiBhIHNvdXJjZSBmb2xkZXIgKGtpbmQgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4pIGNhbgogICogYmUgbWFya2VkIGFzIGJlaW5nIGV4cG9ydGVkLiBFeHBvcnRlZCBlbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnRyaWJ1dGVkIHRvCi0gKiBkZXBlbmRlbnQgcHJvamVjdHMsIGFsb25nIHdpdGggdGhlIHByb2plY3QncyBvdXRwdXQgZm9sZGVyLCB3aGljaCBpcyBpbXBsaWNpdGx5Ci0gKiBleHBvcnRlZC4gVGhlIHByb2plY3QncyBvdXRwdXQgZm9sZGVyIGlzIGFsd2F5cyBsaXN0ZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZQotICogYW55IGV4cG9ydGVkIGVudHJpZXMuCisgKiBkZXBlbmRlbnQgcHJvamVjdHMsIGFsb25nIHdpdGggdGhlIHByb2plY3QncyBkZWZhdWx0IG91dHB1dCBmb2xkZXIsIHdoaWNoIGlzCisgKiBpbXBsaWNpdGx5IGV4cG9ydGVkLCBhbmQgYW55IGF1eGlsaWFyeSBvdXRwdXQgZm9sZGVycyBzcGVjaWZpZWQgb24gc291cmNlCisgKiBjbGFzc3BhdGggZW50cmllcy4gVGhlIHByb2plY3QncyBvdXRwdXQgZm9sZGVyKHMpIGFyZSBhbHdheXMgbGlzdGVkIGZpcnN0LAorICogZm9sbG93ZWQgYnkgdGhlIGFueSBleHBvcnRlZCBlbnRyaWVzLgogICogPHA+CiAgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KICAqIENsYXNzcGF0aCBlbnRyaWVzIGNhbiBiZSBjcmVhdGVkIHZpYSBtZXRob2RzIG9uIDxjb2RlPkphdmFDb3JlPC9jb2RlPi4KQEAgLTEwMyw4ICsxMDgsOCBAQAogICogQHNlZSBKYXZhQ29yZSNuZXdTb3VyY2VFbnRyeQogICogQHNlZSBKYXZhQ29yZSNuZXdWYXJpYWJsZUVudHJ5CiAgKiBAc2VlIEphdmFDb3JlI25ld0NvbnRhaW5lckVudHJ5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKKyAqIEBzZWUgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcgorICogQHNlZSBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDbGFzc3BhdGhFbnRyeSB7CiAKQEAgLTExMywyNiArMTE4LDI2IEBACiAJICogbGlicmFyeS4gQSBsaWJyYXJ5IGlzIGEgZm9sZGVyIG9yIEpBUiBjb250YWluaW5nIHBhY2thZ2UKIAkgKiBmcmFnbWVudHMgY29uc2lzdGluZyBvZiBwcmUtY29tcGlsZWQgYmluYXJpZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BFX0xJQlJBUlkgPSAxOworCWludCBDUEVfTElCUkFSWSA9IDE7CiAKIAkvKioKIAkgKiBFbnRyeSBraW5kIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBjbGFzc3BhdGggZW50cnkgaWRlbnRpZnlpbmcgYQogCSAqIHJlcXVpcmVkIHByb2plY3QuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1BFX1BST0pFQ1QgPSAyOworCWludCBDUEVfUFJPSkVDVCA9IDI7CiAKIAkvKioKIAkgKiBFbnRyeSBraW5kIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBjbGFzc3BhdGggZW50cnkgaWRlbnRpZnlpbmcgYQogCSAqIGZvbGRlciBjb250YWluaW5nIHBhY2thZ2UgZnJhZ21lbnRzIHdpdGggc291cmNlIGNvZGUKIAkgKiB0byBiZSBjb21waWxlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUEVfU09VUkNFID0gMzsKKwlpbnQgQ1BFX1NPVVJDRSA9IDM7CiAKIAkvKioKIAkgKiBFbnRyeSBraW5kIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBjbGFzc3BhdGggZW50cnkgZGVmaW5lZCB1c2luZwogCSAqIGEgcGF0aCB0aGF0IGJlZ2lucyB3aXRoIGEgY2xhc3NwYXRoIHZhcmlhYmxlIHJlZmVyZW5jZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUEVfVkFSSUFCTEUgPSA0OworCWludCBDUEVfVkFSSUFCTEUgPSA0OwogCiAJLyoqCiAJICogRW50cnkga2luZCBjb25zdGFudCBkZXNjcmliaW5nIGEgY2xhc3NwYXRoIGVudHJ5IHJlcHJlc2VudGluZwpAQCAtMTQwLDcgKzE0NSw3IEBACiAJICogCiAJICogQHNpbmNlIDIuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENQRV9DT05UQUlORVIgPSA1OworCWludCBDUEVfQ09OVEFJTkVSID0gNTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgZmlsZXMgZm91bmQgaW4gdGhlIHBhY2thZ2UgZnJhZ21lbnRzIGlkZW50aWZpZWQgYnkgdGhpcwpAQCAtMTc1LDYgKzE4MCwxMDQgQEAKIAlpbnQgZ2V0RW50cnlLaW5kKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgcGF0dGVybnMgdXNlZCB0byBleGNsdWRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGgKKwkgKiB0aGlzIHNvdXJjZSBlbnRyeS4KKwkgKiA8cD4KKwkgKiBFeGNsdXNpb24gcGF0dGVybnMgYWxsb3cgc3BlY2lmaWVkIHBvcnRpb25zIG9mIHRoZSByZXNvdXJjZSB0cmVlIHJvb3RlZAorCSAqIGF0IHRoaXMgc291cmNlIGVudHJ5J3MgcGF0aCB0byBiZSBmaWx0ZXJlZCBvdXQuIElmIG5vIGV4Y2x1c2lvbiBwYXR0ZXJucworCSAqIGFyZSBzcGVjaWZpZWQsIHRoaXMgc291cmNlIGVudHJ5IGluY2x1ZGVzIGFsbCByZWxldmVudCBmaWxlcy4gRWFjaCBwYXRoCisJICogc3BlY2lmaWVkIG11c3QgYmUgYSByZWxhdGl2ZSBwYXRoLCBhbmQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZQorCSAqIHRvIHRoaXMgc291cmNlIGVudHJ5J3MgcGF0aC4gRmlsZSBwYXR0ZXJucyBhcmUgY2FzZS1zZW5zaXRpdmUuIEEgZmlsZQorCSAqIG1hdGNoZWQgYnkgb25lIG9yIG1vcmUgb2YgdGhlc2UgcGF0dGVybnMgaXMgZXhjbHVkZWQgZnJvbSB0aGUgCisJICogY29ycmVzcG9uZGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCisJICogPC9wPgorCSAqIDxwPgorCSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1cHBseSBhIHBhdHRlcm4gdG8gZXhjbHVkZSAiLmNsYXNzIiBmaWxlcworCSAqIGJlY2F1c2UgYSBzb3VyY2UgZW50cnkgZmlsdGVycyB0aGVzZSBvdXQgYXV0b21hdGljYWxseS4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIHBhdHRlcm4gbWVjaGFuaXNtIGlzIHNpbWlsYXIgdG8gQW50J3MuIEVhY2ggcGF0dGVybiBpcyByZXByZXNlbnRlZCBhcworCSAqIGEgcmVsYXRpdmUgcGF0aC4gVGhlIHBhdGggc2VnbWVudHMgY2FuIGJlIHJlZ3VsYXIgZmlsZSBvciBmb2xkZXIgbmFtZXMgb3Igc2ltcGxlIHBhdHRlcm5zCisJICogaW52b2x2aW5nIHN0YW5kYXJkIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisJICogPC9wPgorCSAqIDxwPgorCSAqICcqJyBtYXRjaGVzIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIHdpdGhpbiBhIHNlZ21lbnQuIFNvCisJICogPGNvZGU+Ki5qYXZhPC9jb2RlPiBtYXRjaGVzIDxjb2RlPi5qYXZhPC9jb2RlPiwgPGNvZGU+YS5qYXZhPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5Gb28uamF2YTwvY29kZT4sIGJ1dCBub3QgPGNvZGU+Rm9vLnByb3BlcnRpZXM8L2NvZGU+CisJICogKGRvZXMgbm90IGVuZCB3aXRoIDxjb2RlPi5qYXZhPC9jb2RlPikuCisJICogPC9wPgorCSAqIDxwPgorCSAqICc/JyBtYXRjaGVzIDEgY2hhcmFjdGVyIHdpdGhpbiBhIHNlZ21lbnQuIFNvIDxjb2RlPj8uamF2YTwvY29kZT4gCisJICogbWF0Y2hlcyA8Y29kZT5hLmphdmE8L2NvZGU+LCA8Y29kZT5BLmphdmE8L2NvZGU+LCAKKwkgKiBidXQgbm90IDxjb2RlPi5qYXZhPC9jb2RlPiBvciA8Y29kZT54eXouamF2YTwvY29kZT4gKG5laXRoZXIgaGF2ZQorCSAqIGp1c3Qgb25lIGNoYXJhY3RlciBiZWZvcmUgPGNvZGU+LmphdmE8L2NvZGU+KS4KKwkgKiA8L3A+CisJICogPHA+CisJICogQ29tYmluYXRpb25zIG9mIConcyBhbmQgPydzIGFyZSBhbGxvd2VkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBUaGUgc3BlY2lhbCBwYXR0ZXJuICcqKicgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMuIEEgcGF0aCAKKwkgKiBsaWtlIDxjb2RlPnRlc3RzLzwvY29kZT4gdGhhdCBlbmRzIGluIGEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIGludGVycHJldGVkCisJICogYXMgPGNvZGU+dGVzdHMvJiM0MjsmIzQyOzwvY29kZT4sIGFuZCB3b3VsZCBtYXRjaCBhbGwgZmlsZXMgdW5kZXIgdGhlIAorCSAqIHRoZSBmb2xkZXIgbmFtZWQgPGNvZGU+dGVzdHM8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBFeGFtcGxlczoKKwkgKiA8dWw+CisJICogPGxpPgorCSAqIDxjb2RlPnRlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+IChvciBzaW1wbHkgPGNvZGU+dGVzdHMvPC9jb2RlPikgCisJICogbWF0Y2hlcyBhbGwgZmlsZXMgdW5kZXIgYSByb290IGZvbGRlcgorCSAqIG5hbWVkIDxjb2RlPnRlc3RzPC9jb2RlPi4gVGhpcyBpbmNsdWRlcyA8Y29kZT50ZXN0cy9Gb28uamF2YTwvY29kZT4KKwkgKiBhbmQgPGNvZGU+dGVzdHMvY29tL2V4YW1wbGUvRm9vLmphdmE8L2NvZGU+LCBidXQgbm90IAorCSAqIDxjb2RlPmNvbS9leGFtcGxlL3Rlc3RzL0Zvby5qYXZhPC9jb2RlPiAobm90IHVuZGVyIGEgcm9vdCBmb2xkZXIgbmFtZWQKKwkgKiA8Y29kZT50ZXN0czwvY29kZT4pLgorCSAqIDwvbGk+CisJICogPGxpPgorCSAqIDxjb2RlPnRlc3RzLyYjNDI7PC9jb2RlPiBtYXRjaGVzIGFsbCBmaWxlcyBkaXJlY3RseSBiZWxvdyBhIHJvb3QgCisJICogZm9sZGVyIG5hbWVkIDxjb2RlPnRlc3RzPC9jb2RlPi4gVGhpcyBpbmNsdWRlcyA8Y29kZT50ZXN0cy9Gb28uamF2YTwvY29kZT4KKwkgKiBhbmQgPGNvZGU+dGVzdHMvRm9vSGVscC5qYXZhPC9jb2RlPgorCSAqIGJ1dCBub3QgPGNvZGU+dGVzdHMvY29tL2V4YW1wbGUvRm9vLmphdmE8L2NvZGU+IChub3QgZGlyZWN0bHkgdW5kZXIKKwkgKiBhIGZvbGRlciBuYW1lZCA8Y29kZT50ZXN0czwvY29kZT4pIG9yIAorCSAqIDxjb2RlPmNvbS9Gb28uamF2YTwvY29kZT4gKG5vdCB1bmRlciBhIGZvbGRlciBuYW1lZCA8Y29kZT50ZXN0czwvY29kZT4pLgorCSAqIDwvbGk+CisJICogPGxpPgorCSAqIDxjb2RlPiYjNDI7JiM0MjsvdGVzdHMvJiM0MjsmIzQyOzwvY29kZT4gbWF0Y2hlcyBhbGwgZmlsZXMgdW5kZXIgYW55CisJICogZm9sZGVyIG5hbWVkIDxjb2RlPnRlc3RzPC9jb2RlPi4gVGhpcyBpbmNsdWRlcyA8Y29kZT50ZXN0cy9Gb28uamF2YTwvY29kZT4sCisJICogPGNvZGU+Y29tL2V4YW1wbGVzL3Rlc3RzL0Zvby5qYXZhPC9jb2RlPiwgYW5kIAorCSAqIDxjb2RlPmNvbS9leGFtcGxlcy90ZXN0cy91bml0L0Zvby5qYXZhPC9jb2RlPiwgYnV0IG5vdCAKKwkgKiA8Y29kZT5jb20vZXhhbXBsZS9Gb28uamF2YTwvY29kZT4gKG5vdCB1bmRlciBhIGZvbGRlciBuYW1lZAorCSAqIDxjb2RlPnRlc3RzPC9jb2RlPikuCisJICogPC9saT4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIHJlc291cmNlIGV4Y2x1c2lvbiBwYXR0ZXJucyAKKwkgKiAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvdXJjZSBlbnRyeSwgYW5kIDxjb2RlPm51bGw8L2NvZGU+IGZvciBvdGhlcgorCSAqICAga2luZHMgb2YgY2xhc3NwYXRoIGVudHJpZXMKKwkgKiBAc2luY2UgMi4xCisJICovCisJSVBhdGhbXSBnZXRFeGNsdXNpb25QYXR0ZXJucygpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgc3BlY2lmaWMgbG9jYXRpb24gd2hlcmUgdGhlIGJ1aWxkZXIgd3JpdGVzIAorCSAqIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgZ2VuZXJhdGVkIGZvciB0aGlzIHNvdXJjZSBlbnRyeSAKKwkgKiAoZW50cnkga2luZCA8Y29kZT5DUEVfU09VUkNFPC9jb2RlPikuCisJICogPHA+CisJICogU291cmNlIGVudHJpZXMgY2FuIG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uLgorCSAqIElmIG5vbmUgaXMgcHJvdmlkZWQsIHRoZSBzb3VyY2UgZW50cnkgd2lsbCBiZSBpbXBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCBpdHMgcHJvamVjdAorCSAqIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIChzZWUgPGNvZGU+SUphdmFQcm9qZWN0I2dldE91dHB1dExvY2F0aW9uPC9jb2RlPikuCisJICogPC9wPjxwPgorCSAqIE5PVEU6IEEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uIGNhbm5vdCBjb2luY2lkYXRlIHdpdGggYW5vdGhlciBzb3VyY2UvbGlicmFyeSBlbnRyeS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzcGVjaWZpYyBsb2NhdGlvbiB3aGVyZSB0aGUgYnVpbGRlciB3cml0ZXMgCisJICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBmb3IgdGhpcyBzb3VyY2UgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgdXNpbmcgZGVmYXVsdCBvdXRwdXQgZm9sZGVyCisJICogQHNpbmNlIDIuMQorCSAqLworCUlQYXRoIGdldE91dHB1dExvY2F0aW9uKCk7CisJCisJLyoqCiAJICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGlzIGNsYXNzcGF0aCBlbnRyeS4KIAkgKgogCSAqIFRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGRlcGVuZHMgb24gaXRzIGVudHJ5IGtpbmQ6PHVsPgpAQCAtMjA0LDI5ICszMDcsMzAgQEAKIAlJUGF0aCBnZXRQYXRoKCk7CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlciBhc3NvY2lhdGVkIHdpdGggdGhpcwogCSAqIGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBjbGFzc3BhdGggZW50cnkgaGFzIG5vCiAJICogc291cmNlIGF0dGFjaG1lbnQuCiAJICogPHA+CiAJICogT25seSBsaWJyYXJ5IGFuZCB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcyBtYXkgaGF2ZSBzb3VyY2UgYXR0YWNobWVudHMuCiAJICogRm9yIGxpYnJhcnkgY2xhc3NwYXRoIGVudHJpZXMsIHRoZSByZXN1bHQgcGF0aCAoaWYgcHJlc2VudCkgbG9jYXRlcyBhIHNvdXJjZQotCSAqIGFyY2hpdmUuIEZvciB2YXJpYWJsZSBjbGFzc3BhdGggZW50cmllcywgdGhlIHJlc3VsdCBwYXRoIChpZiBwcmVzZW50KSBoYXMKLQkgKiBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUgdmFyaWFibGUgcGF0aCwgbmFtZWx5IHRoZSBmaXJzdCBzZWdtZW50IAotCSAqIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgorCSAqIGFyY2hpdmUgb3IgZm9sZGVyLiBUaGlzIGFyY2hpdmUgb3IgZm9sZGVyIGNhbiBiZSBsb2NhdGVkIGluIGEgcHJvamVjdCBvZiB0aGUgCisJICogd29ya3NwYWNlIG9yIG91dHNpZGUgdGhyIHdvcmtzcGFjZS4gRm9yIHZhcmlhYmxlIGNsYXNzcGF0aCBlbnRyaWVzLCB0aGUgCisJICogcmVzdWx0IHBhdGggKGlmIHByZXNlbnQpIGhhcyBhbiBhbmFsb2dvdXMgZm9ybSBhbmQgbWVhbmluZyBhcyB0aGUgCisJICogdmFyaWFibGUgcGF0aCwgbmFtZWx5IHRoZSBmaXJzdCBzZWdtZW50IGlzIHRoZSBuYW1lIG9mIGEgY2xhc3NwYXRoIHZhcmlhYmxlLgogCSAqIDwvcD4KIAkgKgotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBhcmNoaXZlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCiAJICovCiAJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSB3aGVyZSBwYWNrYWdlIGZyYWdtZW50cworCSAqIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIgd2hlcmUgcGFja2FnZSBmcmFnbWVudHMKIAkgKiBhcmUgbG9jYXRlZC4gQW4gZW1wdHkgcGF0aCBpbmRpY2F0ZXMgdGhhdCBwYWNrYWdlcyBhcmUgbG9jYXRlZCBhdAotCSAqIHRoZSByb290IG9mIHRoZSBzb3VyY2UgYXJjaGl2ZS4gUmV0dXJucyBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZQorCSAqIHRoZSByb290IG9mIHRoZSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIuIFJldHVybnMgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUKIAkgKiBpZiBhbmQgb25seSBpZiA8Y29kZT5nZXRTb3VyY2VBdHRhY2htZW50UGF0aDwvY29kZT4gcmV0dXJucyAKIAkgKiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KIAkgKgotCSAqIEByZXR1cm4gdGhlIHBhdGggd2l0aGluIHRoZSBzb3VyY2UgYXJjaGl2ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiBAcmV0dXJuIHRoZSBwYXRoIHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgogCSAqICAgIG5vdCBhcHBsaWNhYmxlCiAJICovCiAJSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7CkBAIC0yNjMsNCArMzY3LDQgQEAKIAkgKiBAZGVwcmVjYXRlZCAtIHVzZSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KC4uLikKIAkgKi8KIAlJQ2xhc3NwYXRoRW50cnkgZ2V0UmVzb2x2ZWRFbnRyeSgpOwkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUFzc2lzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVBc3Npc3QuamF2YQppbmRleCBiOGRkNTkwLi5lZTk2ZGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUFzc2lzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQXNzaXN0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCkBAIC03OCw0ICs3OCw0IEBACiAJICovCiAJdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGY1YzRjOWMuLmVkZDllZDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb2RlRm9ybWF0dGVyLmphdmEKaW5kZXggYjNmZDIwNi4uMzlmMWViYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvZGVGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29kZUZvcm1hdHRlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpAQCAtMzEsMTAgKzMxLDEwIEBACiAJICogICAgICBsZXZlbCBvZiB6ZXJvIGhhcyBubyBlZmZlY3QuCiAJICogQHBhcmFtIHBvc2l0aW9ucyBhbiBhcnJheSBvZiBwb3NpdGlvbnMgdG8gbWFwLiBUaGVzZSBhcmUKIAkgKiAgICAgIGNoYXJhY3Rlci1iYXNlZCBzb3VyY2UgcG9zaXRpb25zIGluc2lkZSB0aGUgb3JpZ2luYWwgc291cmNlLAotCSAqICAgICBmb3Igd2hpY2ggY29ycmVzcG9uZGluZyBwb3NpdGlvbnMgaW4gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugd2lsbAotCSAqICAgICBiZSBjb21wdXRlZCAoc28gYXMgdG8gcmVsb2NhdGUgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbAotCSAqICAgICBzb3VyY2UpLiBJdCB1cGRhdGVzIHRoZSBwb3NpdGlvbnMgYXJyYXkgd2l0aCB1cGRhdGVkIHBvc2l0aW9ucy4KLQkgKiAgICAgSWYgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIG5vIHBvc2l0aW9ucyBhcmUgbWFwcGVkLgorCSAqIAkJYXJyYW5nZWQgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIsIGZvciB3aGljaCBjb3JyZXNwb25kaW5nIHBvc2l0aW9ucyBpbiAKKwkgKiAgICAgdGhlIGZvcm1hdHRlZCBzb3VyY2Ugd2lsbCBiZSBjb21wdXRlZCAoc28gYXMgdG8gcmVsb2NhdGUgZWxlbWVudHMgYXNzb2NpYXRlZCAKKwkgKiAgICAgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlKS4gSXQgdXBkYXRlcyB0aGUgcG9zaXRpb25zIGFycmF5IHdpdGggdXBkYXRlZCAKKwkgKiAgICAgcG9zaXRpb25zLiBJZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gbm8gcG9zaXRpb25zIGFyZSBtYXBwZWQuCiAJICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgdGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZSBpbiBmb3JtYXR0ZWQgc291cmNlLAogCSAqICAgICBpZiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQgb25lIHdpbGwgYmUgdXNlZC4KIAkgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IHN0cmluZy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21waWxhdGlvblVuaXQuamF2YQppbmRleCA0YmJiMTFlLi44NDlhNTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29tcGxldGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IDJlYzc1MjUuLmVkY2NlMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb21wbGV0aW9uUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvbXBsZXRpb25SZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29ycmVjdGlvblJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUNvcnJlY3Rpb25SZXF1ZXN0b3IuamF2YQppbmRleCBhODkxN2JhLi5mYjhlNTRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JQ29ycmVjdGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lDb3JyZWN0aW9uUmVxdWVzdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuamF2YQppbmRleCBiNDY3YWJkLi40YTQ4NzQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lGaWVsZC5qYXZhCmluZGV4IDgzODlhYzguLjMyNjBkODYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lGaWVsZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lGaWVsZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUltcG9ydENvbnRhaW5lci5qYXZhCmluZGV4IDVmNDZlZDIuLjM1NmFkMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnRDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0Q29udGFpbmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCmluZGV4IDI4ZjcxNzkuLmMwMDBiOTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lJbXBvcnREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW5pdGlhbGl6ZXIuamF2YQppbmRleCA1YjQxMjQyLi5lMjkxZDE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSW5pdGlhbGl6ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50LmphdmEKaW5kZXggMzdiNzBiZS4uMWZhOGMxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKQEAgLTM2LDI0MCArMzYsMjY5IEBACiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgSmF2YSBtb2RlbCAod29ya3NwYWNlIGxldmVsIG9iamVjdCkuCiAJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTU9ERUwgPSAxOworCWludCBKQVZBX01PREVMID0gMTsKIAogCS8qKgogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgcHJvamVjdC4KIAkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1BST0pFQ1QgPSAyOworCWludCBKQVZBX1BST0pFQ1QgPSAyOwogCiAJLyoqCiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBmcmFnbWVudCByb290LgogCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9GUkFHTUVOVF9ST09UID0gMzsKKwlpbnQgUEFDS0FHRV9GUkFHTUVOVF9ST09UID0gMzsKIAogCS8qKgogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIHBhY2thZ2UgZnJhZ21lbnQuCiAJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfRlJBR01FTlQgPSA0OworCWludCBQQUNLQUdFX0ZSQUdNRU5UID0gNDsKIAogCS8qKgogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgY29tcGlsYXRpb24gdW5pdC4KIAkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUElMQVRJT05fVU5JVCA9IDU7CisJaW50IENPTVBJTEFUSU9OX1VOSVQgPSA1OwogCiAJLyoqCiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgY2xhc3MgZmlsZS4KIAkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUNsYXNzRmlsZTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfRklMRSA9IDY7CisJaW50IENMQVNTX0ZJTEUgPSA2OwogCiAJLyoqCiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgdHlwZSAoYSBjbGFzcyBvciBpbnRlcmZhY2UpLgogCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JVHlwZTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDc7CisJaW50IFRZUEUgPSA3OwogCiAJLyoqCiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgZmllbGQuCiAJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklGaWVsZDwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSA4OworCWludCBGSUVMRCA9IDg7CiAKIAkvKioKIAkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IuCiAJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklNZXRob2Q8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDk7CisJaW50IE1FVEhPRCA9IDk7CiAKIAkvKioKIAkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBzdGFuZC1hbG9uZSBpbnN0YW5jZSBvciBjbGFzcyBpbml0aWFsaXplci4KIAkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpFUiA9IDEwOworCWludCBJTklUSUFMSVpFUiA9IDEwOwogCiAJLyoqCiAJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0LgogCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZURlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gMTE7CisJaW50IFBBQ0tBR0VfREVDTEFSQVRJT04gPSAxMTsKIAogCS8qKgogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhbGwgaW1wb3J0IGRlY2xhcmF0aW9ucyB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0LgogCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JSW1wb3J0Q29udGFpbmVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlRfQ09OVEFJTkVSID0gMTI7CisJaW50IElNUE9SVF9DT05UQUlORVIgPSAxMjsKIAogCS8qKgogCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhbiBpbXBvcnQgZGVjbGFyYXRpb24gd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4KIAkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUltcG9ydERlY2xhcmF0aW9uPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlRfREVDTEFSQVRJT04gPSAxMzsKKwlpbnQgSU1QT1JUX0RFQ0xBUkFUSU9OID0gMTM7CiAKLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSmF2YSBlbGVtZW50IGV4aXN0cyBpbiB0aGUgbW9kZWwuCi0gKgotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBKYXZhIG1vZGVsCi0gKi8KLWJvb2xlYW4gZXhpc3RzKCk7Ci0vKioKLSAqIFJldHVybnMgdGhlIGZpcnN0IGFuY2VzdG9yIG9mIHRoaXMgSmF2YSBlbGVtZW50IHRoYXQgaGFzIHRoZSBnaXZlbiB0eXBlLgotICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGFuIGFuY2VzdG9yIGNhbiBiZSBmb3VuZC4KLSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSBhbmNlc3RvclR5cGUgdGhlIGdpdmVuIHR5cGUKLSAqIEByZXR1cm4gdGhlIGZpcnN0IGFuY2VzdG9yIG9mIHRoaXMgSmF2YSBlbGVtZW50IHRoYXQgaGFzIHRoZSBnaXZlbiB0eXBlLCBudWxsIGlmIG5vIHN1Y2ggYW4gYW5jZXN0b3IgY2FuIGJlIGZvdW5kCi0gKiBAc2luY2UgMi4wCi0gKi8KLUlKYXZhRWxlbWVudCBnZXRBbmNlc3RvcihpbnQgYW5jZXN0b3JUeXBlKTsKLS8qKgotICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyBkaXJlY3RseSB0byB0aGlzIGVsZW1lbnQsCi0gKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvCi0gKiB0aGlzIGVsZW1lbnQuCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmb3IgYW4gPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4KLSAqIGlzIGl0cyB1bmRlcmx5aW5nIDxjb2RlPklGaWxlPC9jb2RlPi4gVGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZm9yCi0gKiBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPiB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYW4gYXJjaGl2ZSAKLSAqIGlzIGl0cyB1bmRlcmx5aW5nIDxjb2RlPklGb2xkZXI8L2NvZGU+LiBBbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPgotICogY29udGFpbmVkIGluIGFuIGFyY2hpdmUgaGFzIG5vIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuIFNpbWlsYXJseSwgdGhlcmUKLSAqIGFyZSBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBmb3IgPGNvZGU+SU1ldGhvZHM8L2NvZGU+LAotICogPGNvZGU+SUZpZWxkczwvY29kZT4sIGV0Yy4KLSAqIDxwPgotICoKLSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgotICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCi0gKi8KLUlSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4gVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBlbGVtZW50IG5hbWUKLSAqLwotU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Ci0vKioKLSAqIFJldHVybnMgdGhpcyBlbGVtZW50J3Mga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIuCi0gKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICoKLSAqIEByZXR1cm4gdGhlIGtpbmQgb2YgZWxlbWVudDsgb25lIG9mIHRoZSBjb25zdGFudHMgZGVjbGFyZWQgaW4KLSAqICAgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpOwotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZWxlbWVudCBoYW5kbGUuIFRoZSBmb3JtYXQgb2YKLSAqIHRoZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZDsgaG93ZXZlciwgdGhlIGlkZW50aWZpZXIgaXMgc3RhYmxlIGFjcm9zcwotICogd29ya3NwYWNlIHNlc3Npb25zLCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhpcyBoYW5kbGUgdmlhIHRoZSAKLSAqIDxjb2RlPkphdmFDb3JlLmNyZWF0ZShTdHJpbmcpPC9jb2RlPiBtZXRob2QuCi0gKgotICogQHJldHVybiB0aGUgc3RyaW5nIGhhbmRsZSBpZGVudGlmaWVyCi0gKiBAc2VlIEphdmFDb3JlI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1TdHJpbmcgZ2V0SGFuZGxlSWRlbnRpZmllcigpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBKYXZhIG1vZGVsLgotICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBKYXZhIG1vZGVsCi0gKi8KLUlKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCk7Ci0vKioKLSAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkIGluLAotICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gYW55IEphdmEgcHJvamVjdAotICogKGZvciBpbnN0YW5jZSwgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+IGlzIG5vdCBjb250YWluZWQgaW4gYW55IEphdmEgCi0gKiBwcm9qZWN0KS4KLSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKgotICogQHJldHVybiB0aGUgY29udGFpbmluZyBKYXZhIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcwotICogICBub3QgY29udGFpbmVkIGluIGEgSmF2YSBwcm9qZWN0Ci0gKi8KLUlKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBvcGVuYWJsZSBwYXJlbnQuIElmIHRoaXMgZWxlbWVudCBpcyBvcGVuYWJsZSwgdGhlIGVsZW1lbnQKLSAqIGl0c2VsZiBpcyByZXR1cm5lZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgZG9lc24ndCBoYXZlCi0gKiBhbiBvcGVuYWJsZSBwYXJlbnQuCi0gKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCi0gKiBAcmV0dXJuIHRoZSBmaXJzdCBvcGVuYWJsZSBwYXJlbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXNuJ3QgaGF2ZQotICogYW4gb3BlbmFibGUgcGFyZW50LgotICogQHNpbmNlIDIuMAotICovCi1JT3BlbmFibGUgZ2V0T3BlbmFibGUoKTsKLS8qKgotICogUmV0dXJucyB0aGUgZWxlbWVudCBkaXJlY3RseSBjb250YWluaW5nIHRoaXMgZWxlbWVudCwKLSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBoYXMgbm8gcGFyZW50LgotICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBwYXJlbnQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQKLSAqLwotSUphdmFFbGVtZW50IGdldFBhcmVudCgpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudC4gCi0gKiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUsIAotICogdGhlIHBhdGggcmV0dXJuZWQgaXMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggdG8gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UsIAotICogcmVsYXRpdmUgdG8gdGhlIHdvcmtiZW5jaC4gCi0gKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgYXJjaGl2ZSwgCi0gKiB0aGUgcGF0aCByZXR1cm5lZCBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYXJjaGl2ZSBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgotICogCi0gKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudAotICogQHNpbmNlIDIuMAotICovCi1JUGF0aCBnZXRQYXRoKCk7Ci0vKioKLSAqIFJldHVybnMgdGhlIGlubmVybW9zdCByZXNvdXJjZSBlbmNsb3NpbmcgdGhpcyBlbGVtZW50LiAKLSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBhcmNoaXZlIGFuZCB0aGlzIGFyY2hpdmUgaXMgbm90IGV4dGVybmFsLCAKLSAqIHRoaXMgaXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgY29ycmVzcG9uZGluZyB0byB0aGUgYXJjaGl2ZS4gCi0gKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgYXJjaGl2ZSwgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGlzIHJldHVybmVkLgotICogSWYgdGhpcyBlbGVtZW50IGlzIGEgd29ya2luZyBjb3B5LCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKiAKLSAqIEByZXR1cm4gdGhlIGlubmVybW9zdCByZXNvdXJjZSBlbmNsb3NpbmcgdGhpcyBlbGVtZW50LCA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIAotICogZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weSBvciBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlCi0gKiBAc2luY2UgMi4wCi0gKi8KLUlSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCB1bmRlcmx5aW5nIHJlc291cmNlIHRoYXQgY29udGFpbnMKLSAqIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQKLSAqIGluIGEgcmVzb3VyY2UuCi0gKgotICogQHJldHVybiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCi0gKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UKLSAqLwotSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBpcyByZWFkLW9ubHkuIEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5Ci0gKiBpZiBpdHMgc3RydWN0dXJlIGNhbm5vdCBiZSBtb2RpZmllZCBieSB0aGUgamF2YSBtb2RlbC4gCi0gKiA8cD4KLSAqIE5vdGUgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBJUmVzb3VyY2UuaXNSZWFkT25seSgpLiBGb3IgZXhhbXBsZSwgLmphcgotICogZmlsZXMgYXJlIHJlYWQtb25seSBhcyB0aGUgamF2YSBtb2RlbCBkb2Vzbid0IGtub3cgaG93IHRvIGFkZC9yZW1vdmUgCi0gKiBlbGVtZW50cyBpbiB0aGlzIGZpbGUsIGJ1dCB0aGUgdW5kZXJseWluZyBJRmlsZSBjYW4gYmUgd3JpdGFibGUuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCi0gKgotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5Ci0gKi8KLWJvb2xlYW4gaXNSZWFkT25seSgpOwotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGVsZW1lbnQgaXMga25vd24uIEZvciBleGFtcGxlLCBmb3IgYQotICogY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvdWxkIG5vdCBiZSBwYXJzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAqIElmIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gZWxlbWVudCBpcyB1bmtub3duLCBuYXZpZ2F0aW9ucyB3aWxsIHJldHVybiByZWFzb25hYmxlCi0gKiBkZWZhdWx0cy4gRm9yIGV4YW1wbGUsIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiB3aWxsIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBOb3RlOiBUaGlzIGRvZXMgbm90IGltcGx5IGFueXRoaW5nIGFib3V0IGNvbnNpc3RlbmN5IHdpdGggdGhlCi0gKiB1bmRlcmx5aW5nIHJlc291cmNlL2J1ZmZlciBjb250ZW50cy4KLSAqIDwvcD4KLSAqCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50IGlzIGtub3duCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KLSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQotICovCi1ib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBleGlzdHMgaW4gdGhlIG1vZGVsLgorCSAqIDxwPgorCSAqIEphdmEgZWxlbWVudHMgYXJlIGhhbmRsZSBvYmplY3RzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYmFja2VkIGJ5IGFuCisJICogYWN0dWFsIGVsZW1lbnQuIEphdmEgZWxlbWVudHMgdGhhdCBhcmUgYmFja2VkIGJ5IGFuIGFjdHVhbCBlbGVtZW50IGFyZQorCSAqIHNhaWQgdG8gImV4aXN0IiwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uIEZvciBKYXZhCisJICogZWxlbWVudHMgdGhhdCBhcmUgbm90IHdvcmtpbmcgY29waWVzLCBpdCBpcyBhbHdheXMgdGhlIGNhc2UgdGhhdCBpZiB0aGUKKwkgKiBlbGVtZW50IGV4aXN0cywgdGhlbiBpdHMgcGFyZW50IGFsc28gZXhpc3RzIChwcm92aWRlZCBpdCBoYXMgb25lKSBhbmQKKwkgKiBpbmNsdWRlcyB0aGUgZWxlbWVudCBhcyBvbmUgb2YgaXRzIGNoaWxkcmVuLiBJdCBpcyB0aGVyZWZvcmUgcG9zc2libGUKKwkgKiB0byBuYXZpZ2F0ZWQgdG8gYW55IGV4aXN0aW5nIEphdmEgZWxlbWVudCBmcm9tIHRoZSByb290IG9mIHRoZSBKYXZhIG1vZGVsCisJICogYWxvbmcgYSBjaGFpbiBvZiBleGlzdGluZyBKYXZhIGVsZW1lbnRzLiBPbiB0aGUgb3RoZXIgaGFuZCwgd29ya2luZworCSAqIGNvcGllcyBhcmUgc2FpZCB0byBleGlzdCB1bnRpbCB0aGV5IGFyZSBkZXN0cm95ZWQgKHdpdGgKKwkgKiA8Y29kZT5JV29ya2luZ0NvcHkuZGVzdHJveTwvY29kZT4pLiBVbmxpa2UgcmVndWxhciBKYXZhIGVsZW1lbnRzLCBhCisJICogd29ya2luZyBjb3B5IG5ldmVyIHNob3dzIHVwIGFtb25nIHRoZSBjaGlsZHJlbiBvZiBpdHMgcGFyZW50IGVsZW1lbnQKKwkgKiAod2hpY2ggbWF5IG9yIG1heSBub3QgZXhpc3QpLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGV4aXN0cyBpbiB0aGUgSmF2YSBtb2RlbCwgYW5kCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdAorCSAqLworCWJvb2xlYW4gZXhpc3RzKCk7CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgYW5jZXN0b3Igb2YgdGhpcyBKYXZhIGVsZW1lbnQgdGhhdCBoYXMgdGhlIGdpdmVuIHR5cGUuCisJICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGFuIGFuY2VzdG9yIGNhbiBiZSBmb3VuZC4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqIAorCSAqIEBwYXJhbSBhbmNlc3RvclR5cGUgdGhlIGdpdmVuIHR5cGUKKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBhbmNlc3RvciBvZiB0aGlzIEphdmEgZWxlbWVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdHlwZSwgbnVsbCBpZiBubyBzdWNoIGFuIGFuY2VzdG9yIGNhbiBiZSBmb3VuZAorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIGRpcmVjdGx5IHRvIHRoaXMgZWxlbWVudCwKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvCisJICogdGhpcyBlbGVtZW50LgorCSAqIDxwPgorCSAqIEZvciBleGFtcGxlLCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmb3IgYW4gPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4KKwkgKiBpcyBpdHMgdW5kZXJseWluZyA8Y29kZT5JRmlsZTwvY29kZT4uIFRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIGZvcgorCSAqIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+IHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlIAorCSAqIGlzIGl0cyB1bmRlcmx5aW5nIDxjb2RlPklGb2xkZXI8L2NvZGU+LiBBbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPgorCSAqIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlIGhhcyBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlLiBTaW1pbGFybHksIHRoZXJlCisJICogYXJlIG5vIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGZvciA8Y29kZT5JTWV0aG9kczwvY29kZT4sCisJICogPGNvZGU+SUZpZWxkczwvY29kZT4sIGV0Yy4KKwkgKiA8cD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKwkgKi8KKwlJUmVzb3VyY2UgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqCisJICogQHJldHVybiB0aGUgZWxlbWVudCBuYW1lCisJICovCisJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIGtpbmQgZW5jb2RlZCBhcyBhbiBpbnRlZ2VyLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGVsZW1lbnQ7IG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlY2xhcmVkIGluCisJICogICA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+CisJICogQHNlZSBJSmF2YUVsZW1lbnQKKwkgKi8KKwlpbnQgZ2V0RWxlbWVudFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBlbGVtZW50IGhhbmRsZS4gVGhlIGZvcm1hdCBvZgorCSAqIHRoZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZDsgaG93ZXZlciwgdGhlIGlkZW50aWZpZXIgaXMgc3RhYmxlIGFjcm9zcworCSAqIHdvcmtzcGFjZSBzZXNzaW9ucywgYW5kIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoaXMgaGFuZGxlIHZpYSB0aGUgCisJICogPGNvZGU+SmF2YUNvcmUuY3JlYXRlKFN0cmluZyk8L2NvZGU+IG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHN0cmluZyBoYW5kbGUgaWRlbnRpZmllcgorCSAqIEBzZWUgSmF2YUNvcmUjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJU3RyaW5nIGdldEhhbmRsZUlkZW50aWZpZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIEphdmEgbW9kZWwuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIEphdmEgbW9kZWwKKwkgKi8KKwlJSmF2YU1vZGVsIGdldEphdmFNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgSmF2YSBwcm9qZWN0IHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQgaW4sCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gYW55IEphdmEgcHJvamVjdAorCSAqIChmb3IgaW5zdGFuY2UsIHRoZSA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPiBpcyBub3QgY29udGFpbmVkIGluIGFueSBKYXZhIAorCSAqIHByb2plY3QpLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb250YWluaW5nIEphdmEgcHJvamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzCisJICogICBub3QgY29udGFpbmVkIGluIGEgSmF2YSBwcm9qZWN0CisJICovCisJSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCBvcGVuYWJsZSBwYXJlbnQuIElmIHRoaXMgZWxlbWVudCBpcyBvcGVuYWJsZSwgdGhlIGVsZW1lbnQKKwkgKiBpdHNlbGYgaXMgcmV0dXJuZWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXNuJ3QgaGF2ZQorCSAqIGFuIG9wZW5hYmxlIHBhcmVudC4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG9wZW5hYmxlIHBhcmVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgZG9lc24ndCBoYXZlCisJICogYW4gb3BlbmFibGUgcGFyZW50LgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlJT3BlbmFibGUgZ2V0T3BlbmFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgZGlyZWN0bHkgY29udGFpbmluZyB0aGlzIGVsZW1lbnQsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHBhcmVudCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIHBhcmVudAorCSAqLworCUlKYXZhRWxlbWVudCBnZXRQYXJlbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGlubmVybW9zdCByZXNvdXJjZSBlbmNsb3NpbmcgdGhpcyBlbGVtZW50LiAKKwkgKiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUsIAorCSAqIHRoZSBwYXRoIHJldHVybmVkIGlzIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLCAKKwkgKiByZWxhdGl2ZSB0byB0aGUgd29ya2JlbmNoLiAKKwkgKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgYXJjaGl2ZSwgCisJICogdGhlIHBhdGggcmV0dXJuZWQgaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGFyY2hpdmUgaW4gdGhlIGZpbGUgc3lzdGVtLgorCSAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuCisJICogCisJICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQKKwkgKiBAc2luY2UgMi4wCisJICovCisJSVBhdGggZ2V0UGF0aCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5uZXJtb3N0IHJlc291cmNlIGVuY2xvc2luZyB0aGlzIGVsZW1lbnQuIAorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBhcmNoaXZlIGFuZCB0aGlzIGFyY2hpdmUgaXMgbm90IGV4dGVybmFsLCAKKwkgKiB0aGlzIGlzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyY2hpdmUuIAorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLCA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlzIHJldHVybmVkLgorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisJICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyAKKwkgKiBlbGVtZW50IGlzIGEgd29ya2luZyBjb3B5IG9yIGlzIGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUKKwkgKiBAc2luY2UgMi4wCisJICovCisJSVJlc291cmNlIGdldFJlc291cmNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCB1bmRlcmx5aW5nIHJlc291cmNlIHRoYXQgY29udGFpbnMKKwkgKiB0aGlzIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBub3QgY29udGFpbmVkCisJICogaW4gYSByZXNvdXJjZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KKwkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkgKi8KKwlJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBpcyByZWFkLW9ubHkuIEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5CisJICogaWYgaXRzIHN0cnVjdHVyZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGphdmEgbW9kZWwuIAorCSAqIDxwPgorCSAqIE5vdGUgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBJUmVzb3VyY2UuaXNSZWFkT25seSgpLiBGb3IgZXhhbXBsZSwgLmphcgorCSAqIGZpbGVzIGFyZSByZWFkLW9ubHkgYXMgdGhlIGphdmEgbW9kZWwgZG9lc24ndCBrbm93IGhvdyB0byBhZGQvcmVtb3ZlIAorCSAqIGVsZW1lbnRzIGluIHRoaXMgZmlsZSwgYnV0IHRoZSB1bmRlcmx5aW5nIElGaWxlIGNhbiBiZSB3cml0YWJsZS4KKwkgKiA8cD4KKwkgKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5CisJICovCisJYm9vbGVhbiBpc1JlYWRPbmx5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGVsZW1lbnQgaXMga25vd24uIEZvciBleGFtcGxlLCBmb3IgYQorCSAqIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBjb3VsZCBub3QgYmUgcGFyc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCisJICogSWYgdGhlIHN0cnVjdHVyZSBvZiBhbiBlbGVtZW50IGlzIHVua25vd24sIG5hdmlnYXRpb25zIHdpbGwgcmV0dXJuIHJlYXNvbmFibGUKKwkgKiBkZWZhdWx0cy4gRm9yIGV4YW1wbGUsIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiB3aWxsIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLgorCSAqIDxwPgorCSAqIE5vdGU6IFRoaXMgZG9lcyBub3QgaW1wbHkgYW55dGhpbmcgYWJvdXQgY29uc2lzdGVuY3kgd2l0aCB0aGUKKwkgKiB1bmRlcmx5aW5nIHJlc291cmNlL2J1ZmZlciBjb250ZW50cy4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50IGlzIGtub3duCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisJICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlCisJICovCisJYm9vbGVhbiBpc1N0cnVjdHVyZUtub3duKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudERlbHRhLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YUVsZW1lbnREZWx0YS5qYXZhCmluZGV4IGYzMjlhZjMuLjRlNTdjNGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhRWxlbWVudERlbHRhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFFbGVtZW50RGVsdGEuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CkBAIC0xMjAsNyArMTIwLDcgQEAKIAkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IGhhcyBiZWVuIGNoYW5nZWQsCiAJICogYXMgZGVzY3JpYmVkIGJ5IHRoZSBjaGFuZ2UgZmxhZ3MuCiAJICogCi0JICogQHNlZSBnZXRGbGFncworCSAqIEBzZWUgI2dldEZsYWdzCiAJICovCiAJcHVibGljIGludCBDSEFOR0VEID0gNDsKIApAQCAtMTY5LDggKzE2OSwxNyBAQAogCS8qKgogCSAqIENoYW5nZSBmbGFnIGluZGljYXRpbmcgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50IGhhcyBjaGFuZ2VkIHBvc2l0aW9uIGluIHRoZSBwcm9qZWN0J3MgCiAJICogY2xhc3NwYXRoLiBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBpZiB0aGUgZWxlbWVudCBpcyBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uCisJICogQGRlcHJlY2F0ZWQgVXNlIEZfUkVPUkRFUiBpbnN0ZWFkLgogCSAqLwogCXB1YmxpYyBpbnQgRl9DTEFTU1BBVEhfUkVPUkRFUiA9IDB4MDEwMDsKKwkvKioKKwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgcG9zaXRpb24gcmVsYXRpdmVseSB0byBpdHMgc2libGluZ3MuIAorCSAqIElmIHRoZSBlbGVtZW50IGlzIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiwgIGEgY2xhc3NwYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgCisJICogdG8gdGhlIGVsZW1lbnQgaGFzIGNoYW5nZWQgcG9zaXRpb24gaW4gdGhlIHByb2plY3QncyBjbGFzc3BhdGguCisJICogCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBpbnQgRl9SRU9SREVSID0gMHgwMTAwOwogCiAJLyoqCiAJICogQ2hhbmdlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSB1bmRlcmx5aW5nIDxjb2RlPklQcm9qZWN0PC9jb2RlPiBoYXMgYmVlbgpAQCAtMjI5LDggKzIzOCwyMSBAQAogCSAqLwogCXB1YmxpYyBpbnQgRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRCA9IDB4ODAwMDsKIAorLy8JLyoqCisvLwkgKiBDaGFuZ2UgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHByb2plY3QgY3VzdG9tIG9wdGlvbnMgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbSwKKy8vCSAqIGkuZS4gaW5kZXBlbmRlbnRseSBmcm9tIGEgY2hhbmdlIHBlcmZvcm1lZCB1c2luZyB0aGUgPGNvZGU+SUphdmFQcm9qZWN0I3NldE9wdGlvbnM8L2NvZGU+CisvLwkgKiBmdW5jdGlvbmFsaXR5LgorLy8JICogVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGVsZW1lbnQgaXMgYW4gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgorLy8JICogCisvLwkgKiBAc2VlIElKYXZhUHJvamVjdCNzZXRPcHRpb25zKE1hcCkKKy8vCSAqIEBzaW5jZSAyLjEKKy8vCSAqLworLy8JcHVibGljIGludCBGX09QVElPTlNfQ0hBTkdFRCA9IDB4MTAwMDA7CisJCisKIC8qKgogICogUmV0dXJucyBkZWx0YXMgZm9yIHRoZSBjaGlsZHJlbiB0aGF0IGhhdmUgYmVlbiBhZGRlZC4KKyAqIEByZXR1cm4gZGVsdGFzIGZvciB0aGUgY2hpbGRyZW4gdGhhdCBoYXZlIGJlZW4gYWRkZWQKICAqLwogcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZ2V0QWRkZWRDaGlsZHJlbigpOwogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsLmphdmEKaW5kZXggYjIwZDRjYS4uNGM1YjA0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWwuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiAKQEAgLTM0LDYgKzM1LDIyIEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUphdmFNb2RlbCBleHRlbmRzIElKYXZhRWxlbWVudCwgSU9wZW5hYmxlLCBJUGFyZW50IHsKIC8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSmF2YSBtb2RlbCBjb250YWlucyBhbiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IHdob3NlCisgKiByZXNvdXJjZSBpcyB0aGUgZ2l2ZW4gcmVzb3VyY2Ugb3IgYSBub24tSmF2YSByZXNvdXJjZSB3aGljaCBpcyB0aGUgZ2l2ZW4gcmVzb3VyY2UuCisgKiA8cD4KKyAqIE5vdGU6IG5vIGV4aXN0ZW5jeSBjaGVjayBpcyBwZXJmb3JtZWQgb24gdGhlIGFyZ3VtZW50IHJlc291cmNlLiBJZiBpdCBpcyBub3QgYWNjZXNzaWJsZSAKKyAqIChzZWUgPGNvZGU+SVJlc291cmNlLmlzQWNjZXNzaWJsZSgpPC9jb2RlPikgeWV0IGJ1dCB3b3VsZCBiZSBsb2NhdGVkIGluIEphdmEgbW9kZWwgCisgKiByYW5nZSwgdGhlbiBpdCB3aWxsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KKyAqIDwvcD48cD4KKyAqIElmIHRoZSByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLCBpdCBjYW4gYmUgcmVhY2hlZCBieSBuYXZpZ2F0aW5nIHRoZSBKYXZhIG1vZGVsIGRvd24gdXNpbmcgdGhlCisgKiA8Y29kZT5nZXRDaGlsZHJlbigpPC9jb2RlPiBhbmQvb3IgPGNvZGU+Z2V0Tm9uSmF2YVJlc291cmNlcygpPC9jb2RlPiBtZXRob2RzLgorICogPC9wPgorICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0byBjaGVjaworICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIEphdmEgbW9kZWwKKyAqIEBzaW5jZSAyLjEKKyAqLworYm9vbGVhbiBjb250YWlucyhJUmVzb3VyY2UgcmVzb3VyY2UpOworLyoqCiAgKiBDb3BpZXMgdGhlIGdpdmVuIGVsZW1lbnRzIHRvIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyKHMpLgogICogSWYgb25lIGNvbnRhaW5lciBpcyBzcGVjaWZpZWQsIGFsbCBlbGVtZW50cyBhcmUgY29waWVkIHRvIHRoYXQKICAqIGNvbnRhaW5lci4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWluZXIgaXMgc3BlY2lmaWVkLCB0aGUgbnVtYmVyIG9mCkBAIC02OCwxNCArODUsMTUgQEAKICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgY29waWVkLiBSZWFzb25zIGluY2x1ZGU6CiAgKiA8dWw+CisgKiA8bGk+IFRoZXJlIGlzIG5vIGVsZW1lbnQgdG8gcHJvY2VzcyAoTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUykuIFRoZSBnaXZlbiBlbGVtZW50cyBpcyBudWxsIG9yIGVtcHR5PC9saT4KICAqIDxsaT4gQSBzcGVjaWZpZWQgZWxlbWVudCwgY29udGFpbmVyLCBvciBzaWJsaW5nIGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+Ci0gKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQotICogPGxpPiBBIGNvbnRhaW5lciBpcyBvZiBhbiBpbmNvbXBhdGlibGUgdHlwZSAoPGNvZGU+SU5WQUxJRF9ERVNUSU5BVElPTjwvY29kZT4pCi0gKiA8bGk+IEEgc2libGluZyBpcyBub3QgYSBjaGlsZCBvZiBpdCBhc3NvY2lhdGVkIGNvbnRhaW5lciAoPGNvZGU+SU5WQUxJRF9TSUJMSU5HPC9jb2RlPikKLSAqIDxsaT4gQSBuZXcgbmFtZSBpcyBpbnZhbGlkICg8Y29kZT5JTlZBTElEX05BTUU8L2NvZGU+KQorICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2U8L2xpPgorICogPGxpPiBBIGNvbnRhaW5lciBpcyBvZiBhbiBpbmNvbXBhdGlibGUgdHlwZSAoPGNvZGU+SU5WQUxJRF9ERVNUSU5BVElPTjwvY29kZT4pPC9saT4KKyAqIDxsaT4gQSBzaWJsaW5nIGlzIG5vdCBhIGNoaWxkIG9mIGl0IGFzc29jaWF0ZWQgY29udGFpbmVyICg8Y29kZT5JTlZBTElEX1NJQkxJTkc8L2NvZGU+KTwvbGk+CisgKiA8bGk+IEEgbmV3IG5hbWUgaXMgaW52YWxpZCAoPGNvZGU+SU5WQUxJRF9OQU1FPC9jb2RlPik8L2xpPgogICogPGxpPiBBIGNoaWxkIGluIGl0cyBhc3NvY2lhdGVkIGNvbnRhaW5lciBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lCi0gKiAJCW5hbWUgYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4gKDxjb2RlPk5BTUVfQ09MTElTSU9OPC9jb2RlPikKLSAqIDxsaT4gQSBjb250YWluZXIgb3IgZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pIAorICogCQluYW1lIGFuZCA8Y29kZT5yZXBsYWNlPC9jb2RlPiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT5OQU1FX0NPTExJU0lPTjwvY29kZT4pPC9saT4KKyAqIDxsaT4gQSBjb250YWluZXIgb3IgZWxlbWVudCBpcyByZWFkLW9ubHkgKDxjb2RlPlJFQURfT05MWTwvY29kZT4pIDwvbGk+CiAgKiA8L3VsPgogICovCiB2b2lkIGNvcHkoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwpAQCAtODgsOSArMTA2LDEwIEBACiAgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGFuIGVsZW1lbnQgY291bGQgbm90IGJlIGRlbGV0ZWQuIFJlYXNvbnMgaW5jbHVkZToKICAqIDx1bD4KKyAqIDxsaT4gVGhlcmUgaXMgbm8gZWxlbWVudCB0byBwcm9jZXNzIChOT19FTEVNRU5UU19UT19QUk9DRVNTKS4gVGhlIGdpdmVuIGVsZW1lbnRzIGlzIG51bGwgb3IgZW1wdHk8L2xpPgogICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+Ci0gKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQotICogPGxpPiBBbiBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgCisgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZTwvbGk+CisgKiA8bGk+IEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5ICg8Y29kZT5SRUFEX09OTFk8L2NvZGU+KSA8L2xpPgogICogPC91bD4KICAqLwogdm9pZCBkZWxldGUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKQEAgLTExMSw2ICsxMzAsMjAgQEAKICAqLwogSUphdmFQcm9qZWN0W10gZ2V0SmF2YVByb2plY3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIC8qKgorICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tSmF2YSByZXNvdXJjZXMgKGkuZS4gbm9uLUphdmEgcHJvamVjdHMpIGluCisgKiB0aGUgd29ya3NwYWNlLgorICogPHA+CisgKiBOb24tSmF2YSBwcm9qZWN0cyBpbmNsdWRlIGFsbCBwcm9qZWN0cyB0aGF0IGFyZSBjbG9zZWQgKGV2ZW4gaWYgdGhleSBoYXZlIHRoZQorICogSmF2YSBuYXR1cmUpLgorICogPC9wPgorICogCisgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHByb2plY3RzIGNvbnRhaW5lZCBpbiB0aGUgd29ya3NwYWNlLgorICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCisgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKKyAqIEBzaW5jZSAyLjEKKyAqLworT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisvKioKICAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXZhIG1vZGVsLgogICogCiAgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YSBtb2RlbApAQCAtMTUxLDE0ICsxODQsMTUgQEAKICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgbW92ZWQuIFJlYXNvbnMgaW5jbHVkZToKICAqIDx1bD4KKyAqIDxsaT4gVGhlcmUgaXMgbm8gZWxlbWVudCB0byBwcm9jZXNzIChOT19FTEVNRU5UU19UT19QUk9DRVNTKS4gVGhlIGdpdmVuIGVsZW1lbnRzIGlzIG51bGwgb3IgZW1wdHk8L2xpPgogICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50LCBjb250YWluZXIsIG9yIHNpYmxpbmcgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KLSAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCi0gKiA8bGk+IEEgY29udGFpbmVyIGlzIG9mIGFuIGluY29tcGF0aWJsZSB0eXBlICg8Y29kZT5JTlZBTElEX0RFU1RJTkFUSU9OPC9jb2RlPikKLSAqIDxsaT4gQSBzaWJsaW5nIGlzIG5vdCBhIGNoaWxkIG9mIGl0IGFzc29jaWF0ZWQgY29udGFpbmVyICg8Y29kZT5JTlZBTElEX1NJQkxJTkc8L2NvZGU+KQotICogPGxpPiBBIG5ldyBuYW1lIGlzIGludmFsaWQgKDxjb2RlPklOVkFMSURfTkFNRTwvY29kZT4pCisgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZTwvbGk+CisgKiA8bGk+IEEgY29udGFpbmVyIGlzIG9mIGFuIGluY29tcGF0aWJsZSB0eXBlICg8Y29kZT5JTlZBTElEX0RFU1RJTkFUSU9OPC9jb2RlPik8L2xpPgorICogPGxpPiBBIHNpYmxpbmcgaXMgbm90IGEgY2hpbGQgb2YgaXQgYXNzb2NpYXRlZCBjb250YWluZXIgKDxjb2RlPklOVkFMSURfU0lCTElORzwvY29kZT4pPC9saT4KKyAqIDxsaT4gQSBuZXcgbmFtZSBpcyBpbnZhbGlkICg8Y29kZT5JTlZBTElEX05BTUU8L2NvZGU+KTwvbGk+CiAgKiA8bGk+IEEgY2hpbGQgaW4gaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUKLSAqIAkJbmFtZSBhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiAoPGNvZGU+TkFNRV9DT0xMSVNJT048L2NvZGU+KQotICogPGxpPiBBIGNvbnRhaW5lciBvciBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgCisgKiAJCW5hbWUgYW5kIDxjb2RlPnJlcGxhY2U8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4gKDxjb2RlPk5BTUVfQ09MTElTSU9OPC9jb2RlPik8L2xpPgorICogPGxpPiBBIGNvbnRhaW5lciBvciBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgPC9saT4KICAqIDwvdWw+CiAgKgogICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYW55IGVsZW1lbnQgb3IgY29udGFpbmVyIGlzIDxjb2RlPm51bGw8L2NvZGU+CkBAIC0yMDksNiArMjQzLDcgQEAKICAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgcmVuYW1lZC4gUmVhc29ucyBpbmNsdWRlOgogICogPHVsPgorICogPGxpPiBUaGVyZSBpcyBubyBlbGVtZW50IHRvIHByb2Nlc3MgKE5PX0VMRU1FTlRTX1RPX1BST0NFU1MpLiBUaGUgZ2l2ZW4gZWxlbWVudHMgaXMgbnVsbCBvciBlbXB0eTwvbGk+CiAgKiA8bGk+IEEgc3BlY2lmaWVkIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KICAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlCiAgKiA8bGk+IEEgbmV3IG5hbWUgaXMgaW52YWxpZCAoPGNvZGU+SU5WQUxJRF9OQU1FPC9jb2RlPikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxNYXJrZXIuamF2YQppbmRleCBkMjdhZmU3Li41Y2M3ZjRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsTWFya2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbE1hcmtlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpAQCAtMzQsMTggKzM0LDMxIEBACiAJICogZGV0ZWN0ZWQgYnkgdGhlIG91dGxpbmVyLCBvciBhIHByb2JsZW0gZGV0ZWN0ZWQgZHVyaW5nIGEgY29kZSBjb21wbGV0aW9uKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TSUVOVF9QUk9CTEVNID0gSmF2YUNvcmUuUExVR0lOX0lEICsgIi50cmFuc2llbnRfcHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEphdmEgbW9kZWwgdGFzayBtYXJrZXIgdHlwZSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRhc2siPC9jb2RlPikuCisJICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgdGFzayBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kIHRvIHRhc2tzCisJICogc3BlY2lmaWVkIGluIEphdmEgc291cmNlIGNvbW1lbnRzIGFuZCBkZXRlY3RlZCBkdXJpbmcgY29tcGlsYXRpb24gKGUuZy4gJ1RPLURPOiAuLi4nKS4KKwkgKiBUYXNrcyBhcmUgaWRlbnRpZmllZCBieSBhIHRhc2sgdGFnLCB3aGljaCBjYW4gYmUgY3VzdG9taXplZCB0aHJvdWdoIDxjb2RlPkphdmFDb3JlPC9jb2RlPgorCSAqIG9wdGlvbiA8Y29kZT4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIudGFza1RhZyI8L2NvZGU+LgorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX01BUktFUiA9IEphdmFDb3JlLlBMVUdJTl9JRCArICIudGFzayI7IC8vJE5PTi1OTFMtMSQKKwogICAgIAogICAgIC8qKiAKIAkgKiBJZCBtYXJrZXIgYXR0cmlidXRlICh2YWx1ZSA8Y29kZT4iYXJndW1lbnRzIjwvY29kZT4pLgotCSAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgotCSAqIAorCSAqIEFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGludG8gb25lIFN0cmluZywgcHJlZml4ZWQgd2l0aCBhbiBhcmd1bWVudCBjb3VudCAoZm9sbG93ZWQgd2l0aCBjb2xvbgorCSAqIHNlcGFyYXRvcikgYW5kIHNlcGFyYXRlZCB3aXRoICcjJyBjaGFyYWN0ZXJzLgorCSAqIGUuZy4gCisJICogICAgIHsgImZvbyIsICJiYXIiIH0gaXMgZW5jb2RlZCBhcyAiMjpmb28jYmFyIiwgICAgIAorCSAqICAgICB7ICB9IGlzIGVuY29kZWQgYXMgIjA6ICIKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UUyA9ICJhcmd1bWVudHMiOyAvLyROT04tTkxTLTEkCiAgICAgCiAJLyoqIAogCSAqIElkIG1hcmtlciBhdHRyaWJ1dGUgKHZhbHVlIDxjb2RlPiJpZCI8L2NvZGU+KS4KLQkgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KIAkgKi8KIAkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXMuamF2YQppbmRleCBjNDFhODg5Li4zYjA5OWJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1cy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CkBAIC02Nyw2ICs2Nyw3IEBACiAgKgogICogQHJldHVybiB0aGUgc3RyaW5nIGN1bHByaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKICAqIEBzZWUgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cworICogQGRlcHJlY2F0ZWQgVXNlIElTdGF0dXMjZ2V0TWVzc2FnZSBpbnN0ZWFkCiAgKi8KIFN0cmluZyBnZXRTdHJpbmcoKTsKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5qYXZhCmluZGV4IDQ5NTJhYzMuLmRhODE0OWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCkBAIC0yNDksNCArMjQ5LDM1IEBACiAJICogaGFzIGJlZW4gbWFkZSBsb2NhbGx5IGF2YWlsYWJsZS4KIAkgKi8KIAkgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fTE9DQUxfQ09OVEVOVFMgPSA5OTk7CisJIAorCSAvKioKKwkgICogU3RhdHVzIGluZGljYXRpbmcgdGhhdCBhIC5jbGFzc3BhdGggZmlsZSBpcyBpbGwtZm9ybWVkLCBhbmQgdGh1cyBjYW5ub3QKKwkgICogYmUgcmVhZC93cml0dGVuIHN1Y2Nlc3NmdWxseS4KKwkgICogQHNpbmNlIDIuMQorCSAgKi8KKwkgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DTEFTU1BBVEhfRklMRV9GT1JNQVQgPSAxMDAwOworCisJIC8qKgorCSAgKiBTdGF0dXMgaW5kaWNhdGluZyB0aGF0IGEgcHJvamVjdCBpcyBpbnZvbHZlZCBpbiBhIGJ1aWxkIHBhdGggY3ljbGUuCisJICAqIEBzaW5jZSAyLjEKKwkgICovCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTUEFUSF9DWUNMRSA9IDEwMDE7CisJIAorCS8qKgorCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgYW4gZXhjbHVzaW9uIHBhdHRlcm4gZ290IHNwZWNpZmllZAorCSAqIG9uIGEgY2xhc3NwYXRoIHNvdXJjZSBlbnRyeSwgdGhvdWdoIGl0IHdhcyBleHBsaWNpdGVseSBkaXNhYmxlZCAKKwkgKiBhY2NvcmRpbmcgdG8gaXRzIHByb2plY3QgcHJlZmVyZW5jZSBzZXR0aW5ncy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCNnZXRPcHRpb25zKGJvb2xlYW4pCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEX0NQX0VYQ0xVU0lPTl9QQVRURVJOUyA9IDEwMDI7CisKKwkvKioKKwkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uIGdvdCBhc3NvY2lhdGVkCisJICogd2l0aCBhIHNvdXJjZSBlbnRyeSwgdGhvdWdoIGl0IHdhcyBleHBsaWNpdGVseSBkaXNhYmxlZCBhY2NvcmRpbmcgdG8gaXRzIHByb2plY3QKKwkgKiBwcmVmZXJlbmNlIHNldHRpbmdzLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0I2dldE9wdGlvbnMoYm9vbGVhbikKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRURfQ1BfTVVMVElQTEVfT1VUUFVUX0xPQ0FUSU9OUyA9IDEwMDM7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JSmF2YVByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhUHJvamVjdC5qYXZhCmluZGV4IDY2NzJmZDkuLjdhZmYzZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lKYXZhUHJvamVjdC5qYXZhCkBAIC0xLDE1ICsxLDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgZ2V0T3B0aW9uKFN0cmluZywgYm9vbGVhbiksIGdldE9wdGlvbnMoYm9vbGVhbikgYW5kIHNldE9wdGlvbnMoTWFwKQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGRlcHJlY2F0ZWQgZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5KSBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5KQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIGlzT25DbGFzc3BhdGgoSVJlc291cmNlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKQEAgLTI4LDExICszNCwxMCBAQAogICogZGVmaW5pbmcgd2hlcmUgdGhlIGJ1aWxkZXIgd3JpdGVzIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuIEEgcHJvamVjdCB0aGF0CiAgKiByZWZlcmVuY2VzIHBhY2thZ2VzIGluIGFub3RoZXIgcHJvamVjdCBjYW4gYWNjZXNzIHRoZSBwYWNrYWdlcyBieSBpbmNsdWRpbmcKICAqIHRoZSByZXF1aXJlZCBwcm9qZWN0IGluIGEgY2xhc3NwYXRoIGVudHJ5LiBUaGUgSmF2YSBtb2RlbCB3aWxsIHByZXNlbnQgdGhlCi0gKiBzb3VyY2UgZWxlbWVudHMgaW4gdGhlIHJlcXVpcmVkIHByb2plY3QsIGFuZCB3aGVuIGJ1aWxkaW5nLCB0aGUgY29tcGlsZXIgd2lsbAotICogdXNlIHRoZSBiaW5hcmllcyBmcm9tIHRoYXQgcHJvamVjdCAodGhhdCBpcywgdGhlIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgCi0gKiByZXF1aXJlZCBwcm9qZWN0IGlzIHVzZWQgYXMgYSBsaWJyYXJ5KS4gVGhlIGNsYXNzcGF0aCBmb3JtYXQgaXMgYSBzZXF1ZW5jZSAKLSAqIG9mIGNsYXNzcGF0aCBlbnRyaWVzIGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIGFuZCBjb250ZW50cyBvZiBwYWNrYWdlIGZyYWdtZW50Ci0gKiByb290cy4KKyAqIHNvdXJjZSBlbGVtZW50cyBpbiB0aGUgcmVxdWlyZWQgcHJvamVjdDsgd2hlbiBidWlsZGluZywgdGhlIGNvbXBpbGVyIHdpbGwgdXNlCisgKiB0aGUgY29ycmVzcG9uZGluZyBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgZnJvbSB0aGUgcmVxdWlyZWQgcHJvamVjdCdzIG91dHB1dAorICogbG9jYXRpb24ocykpLiBUaGUgY2xhc3NwYXRoIGZvcm1hdCBpcyBhIHNlcXVlbmNlIG9mIGNsYXNzcGF0aCBlbnRyaWVzCisgKiBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBhbmQgY29udGVudHMgb2YgcGFja2FnZSBmcmFnbWVudCByb290cy4KICAqIDwvcD4KICAqIEphdmEgcHJvamVjdCBlbGVtZW50cyBuZWVkIHRvIGJlIG9wZW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgbmF2aWdhdGVkIG9yIG1hbmlwdWxhdGVkLgogICogVGhlIGNoaWxkcmVuIG9mIGEgSmF2YSBwcm9qZWN0IGFyZSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyB0aGF0IGFyZSAKQEAgLTEwNiwxMiArMTExLDM3IEBACiAJSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggcGF0aCkKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5LgorCSAqIE5vdGUgdGhhdCBhIGNsYXNzcGF0aCBlbnRyeSB0aGF0IHJlZmVycyB0byBhbm90aGVyIHByb2plY3QgbWF5CisJICogaGF2ZSBtb3JlIHRoYW4gb25lIHJvb3QgKGlmIHRoYXQgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uIHJvb3QKKwkgKiBjb250YWluaW5nIHNvdXJjZSksIGFuZCBjbGFzc3BhdGggZW50cmllcyB3aXRoaW4gdGhlIGN1cnJlbnQKKwkgKiBwcm9qZWN0IGlkZW50aWZ5IGEgc2luZ2xlIHJvb3QuCisJICogPHA+CisJICogSWYgdGhlIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgdmFyaWFibGUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYW5kIHJldHVybgorCSAqIHRoZSByb290cyBvZiB0aGUgdGFyZ2V0IGVudHJ5IChlbXB0eSBpZiBub3QgcmVzb2x2YWJsZSkuCisJICogPHA+CisJICogSWYgdGhlIGNsYXNzcGF0aCBlbnRyeSBkZW5vdGVzIGEgY29udGFpbmVyLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFuZCByZXR1cm4KKwkgKiB0aGUgcm9vdHMgY29ycmVzcG9uZGluZyB0byB0aGUgc2V0IG9mIGNvbnRhaW5lciBlbnRyaWVzIChlbXB0eSBpZiBub3QgcmVzb2x2YWJsZSkuCisJICogCisJICogQHBhcmFtIGVudHJ5IHRoZSBnaXZlbiBlbnRyeQorCSAqIEByZXR1cm4gdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gZW50cnkKKwkgKiBAc2VlIElDbGFzc3BhdGhDb250YWluZXIKKwkgKiBAc2luY2UgMi4xCisJICovCisJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KTsKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGlzIHByb2plY3QncyBjbGFzc3BhdGggCiAJICogd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZC4KIAkgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgaXMgYSBkb3Qtc2VwYXJhdGVkIG5hbWUuIEZvciBleGFtcGxlLAogCSAqIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIHR5cGUgb2YgYSBjbGFzcyBBIGluIHBhY2thZ2UgeC55IHNob3VsZCBoYXZlIGEgCiAJICogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lICJ4LnkuQS5CIi4KIAkgKiAKKwkgKiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYmUgZm91bmQsIGEgdHlwZSBuYW1lIChvciBpdHMgdG9wbGV2ZWwgZW5jbG9zaW5nCisJICogdHlwZSBuYW1lKSBtdXN0IG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQgbmFtZS4gQXMgYSAKKwkgKiBjb25zZXF1ZW5jZSwgc2Vjb25kYXJ5IHR5cGVzIGNhbm5vdCBiZSBmb3VuZCB1c2luZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCisJICogU2Vjb25kYXJ5IHR5cGVzIGNhbiBob3dldmVyIGJlIGV4cGxpY2l0ZWx5IGFjY2Vzc2VkIHRocm91Z2ggdGhlaXIgZW5jbG9zaW5nCisJICogdW5pdCBvciBmb3VuZCBieSB0aGUgPGNvZGU+U2VhcmNoRW5naW5lPC9jb2RlPi4KKwkgKiAKIAkgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZQogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQpAQCAtMTMwLDYgKzE2MCwxMiBAQAogCSAqIGEgY2xhc3MgQiBkZWZpbmVkIGFzIGEgbWVtYmVyIHR5cGUgb2YgYSBjbGFzcyBBIHNob3VsZCBoYXZlIHRoZSAKIAkgKiB0eXBlIHF1YWxpZmllZCBuYW1lICJBLkIiLgogCSAqIAorCSAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byBiZSBmb3VuZCwgYSB0eXBlIG5hbWUgKG9yIGl0cyB0b3BsZXZlbCBlbmNsb3NpbmcKKwkgKiB0eXBlIG5hbWUpIG11c3QgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdCBuYW1lLiBBcyBhIAorCSAqIGNvbnNlcXVlbmNlLCBzZWNvbmRhcnkgdHlwZXMgY2Fubm90IGJlIGZvdW5kIHVzaW5nIHRoaXMgZnVuY3Rpb25hbGl0eS4KKwkgKiBTZWNvbmRhcnkgdHlwZXMgY2FuIGhvd2V2ZXIgYmUgZXhwbGljaXRlbHkgYWNjZXNzZWQgdGhyb3VnaCB0aGVpciBlbmNsb3NpbmcKKwkgKiB1bml0IG9yIGZvdW5kIGJ5IHRoZSA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+LgorCSAqIAogCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCiAJICogQHBhcmFtIHR5cGVRdWFsaWZpZWROYW1lIHRoZSBnaXZlbiB0eXBlIHF1YWxpZmllZCBuYW1lCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuCkBAIC0xMzgsNiArMTc0LDcgQEAKIAkgKiB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgcXVhbGlmaWVkIG5hbWUKIAkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGZvdW5kCiAJICogQHNlZSBJVHlwZSNnZXRUeXBlUXVhbGlmaWVkTmFtZShjaGFyKQorCiAJICogQHNpbmNlIDIuMAogCSAqLwogCUlUeXBlIGZpbmRUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVRdWFsaWZpZWROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwpAQCAtMTU3LDE4ICsxOTQsNzEgQEAKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBkaXJlY3RseSBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0LgogCSAqIEl0IGRvZXMgbm90IHRyYW5zaXRpdmVseSBhbnN3ZXIgbm9uLUphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiBmb2xkZXJzOwogCSAqIHRoZXNlIHdvdWxkIGhhdmUgdG8gYmUgZXhwbGljaXRseSBpdGVyYXRlZCBvdmVyLgorCSAqIDxwPgorCSAqIE5vbi1KYXZhIHJlc291cmNlcyBpbmNsdWRlcyBvdGhlciBmaWxlcyBhbmQgZm9sZGVycyBsb2NhdGVkIGluIHRoZQorCSAqIHByb2plY3Qgbm90IGFjY291bnRlZCBmb3IgYnkgYW55IG9mIGl0IHNvdXJjZSBvciBiaW5hcnkgcGFja2FnZSBmcmFnbWVudAorCSAqIHJvb3RzLiBJZiB0aGUgcHJvamVjdCBpcyBhIHNvdXJjZSBmb2xkZXIgaXRzZWxmLCByZXNvdXJjZXMgZXhjbHVkZWQgZnJvbSB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIHNvdXJjZSBjbGFzc3BhdGggZW50cnkgYnkgb25lIG9yIG1vcmUgZXhjbHVzaW9uIHBhdHRlcm5zCisJICogYXJlIGNvbnNpZGVyZWQgbm9uLUphdmEgcmVzb3VyY2VzIGFuZCB3aWxsIGFwcGVhciBpbiB0aGUgcmVzdWx0CisJICogKHBvc3NpYmx5IGluIGEgZm9sZGVyKQorCSAqIDwvcD4KKwkgKiAKIAkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBkaXJlY3RseSBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0Ci0JICovCi0JT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgYnVpbGRlciB3cml0ZXMgCi0JICogPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy4KLQkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgogCSAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQotCSAqIEByZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJ1aWxkZXIgd3JpdGVzIAotCSAqIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMKKwkgKi8KKwlPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEhlbHBlciBtZXRob2QgZm9yIHJldHVybmluZyBvbmUgb3B0aW9uIHZhbHVlIG9ubHkuIEVxdWl2YWxlbnQgdG8gPGNvZGU+KFN0cmluZyl0aGlzLmdldE9wdGlvbnMoaW5oZXJpdEphdmFDb3JlT3B0aW9ucykuZ2V0KG9wdGlvbk5hbWUpPC9jb2RlPgorCSAqIE5vdGUgdGhhdCBpdCBtYXkgYW5zd2VyIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb3B0aW9uIGRvZXMgbm90IGV4aXN0LCBvciBpZiB0aGVyZSBpcyBubyBjdXN0b20gdmFsdWUgZm9yIGl0LgorCSAqIDxwPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG9wdGlvbk5hbWUgdGhlIG5hbWUgb2YgYW4gb3B0aW9uCisJICogQHBhcmFtIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBKYXZhQ29yZSBvcHRpb25zIHNob3VsZCBiZSBpbmhlcml0ZWQgYXMgd2VsbAorCSAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiBhIGdpdmVuIG9wdGlvbgorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0YWJsZSBvZiB0aGUgY3VycmVudCBjdXN0b20gb3B0aW9ucyBmb3IgdGhpcyBwcm9qZWN0LiBQcm9qZWN0cyByZW1lbWJlciB0aGVpciBjdXN0b20gb3B0aW9ucywKKwkgKiBpLmUuIG9ubHkgdGhlIG9wdGlvbnMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBKYXZhQ29yZSBnbG9iYWwgb3B0aW9ucyBmb3IgdGhlIHdvcmtzcGFjZS4KKwkgKiBBIGJvb2xlYW4gYXJndW1lbnQgYWxsb3dzIHRvIGRpcmVjdGx5IG1lcmdlIHRoZSBwcm9qZWN0IG9wdGlvbnMgd2l0aCBnbG9iYWwgb25lcyBmcm9tIDxjb2RlPkphdmFDb3JlPC9jb2RlPi4KKwkgKiA8cD4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBpbmhlcml0SmF2YUNvcmVPcHRpb25zIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgSmF2YUNvcmUgb3B0aW9ucyBzaG91bGQgYmUgaW5oZXJpdGVkIGFzIHdlbGwKKwkgKiBAcmV0dXJuIHRhYmxlIG9mIGN1cnJlbnQgc2V0dGluZ3Mgb2YgYWxsIG9wdGlvbnMgCisJICogICAoa2V5IHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT47IHZhbHVlIHR5cGU6IDxjb2RlPlN0cmluZzwvY29kZT4pCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlNYXAgZ2V0T3B0aW9ucyhib29sZWFuIGluaGVyaXRKYXZhQ29yZU9wdGlvbnMpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoaXMgcHJvamVjdCBhcyBhIHdvcmtzcGFjZS0KKwkgKiByZWxhdGl2ZSBhYnNvbHV0ZSBwYXRoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBpcyB3aGVyZSBjbGFzcyBmaWxlcyBhcmUgb3JkaW5hcmlseSBnZW5lcmF0ZWQKKwkgKiAoYW5kIHJlc291cmNlIGZpbGVzLCBjb3BpZWQpLiBFYWNoIHNvdXJjZSBjbGFzc3BhdGggZW50cnkgY2FuIGFsc28KKwkgKiBzcGVjaWZ5IGFuIG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyAoYW5kIGNvcGllZAorCSAqIHJlc291cmNlIGZpbGVzKSBjb3JyZXNwb25kaW5nIHRvIGNvbXBpbGF0aW9uIHVuaXRzIHVuZGVyIHRoYXQgc291cmNlCisJICogZm9sZGVyLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFycmFuZ2UgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIGZvcgorCSAqIGRpZmZlcmVudCBzb3VyY2UgZm9sZGVycyBpbiBkaWZmZXJlbnQgb3V0cHV0IGZvbGRlcnMsIGFuZCBub3QKKwkgKiBuZWNlc3NhcmlseSB0aGUgZGVmYXVsdCBvdXRwdXQgZm9sZGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGdlbmVyYXRlZAorCSAqIGNsYXNzIGZpbGVzIGZvciB0aGUgcHJvamVjdCBtYXkgZW5kIHVwIHNjYXR0ZXJlZCBhY3Jvc3Mgc2V2ZXJhbCBmb2xkZXJzLAorCSAqIHJhdGhlciB0aGFuIGFsbCBpbiB0aGUgZGVmYXVsdCBvdXRwdXQgZm9sZGVyICh3aGljaCBpcyBtb3JlIHN0YW5kYXJkKS4KKwkgKiA8L3A+CisJICogCisJICogQHJldHVybiB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlcgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdAorCSAqIEBzZWUgI3NldE91dHB1dExvY2F0aW9uCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkjZ2V0T3V0cHV0TG9jYXRpb24KIAkgKi8KIAlJUGF0aCBnZXRPdXRwdXRMb2NhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAKQEAgLTIyNyw2ICszMTcsNyBAQAogCSAqIEBwYXJhbSBlbnRyeSB0aGUgZ2l2ZW4gZW50cnkKIAkgKiBAcmV0dXJuIHRoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5CiAJICogQHNlZSBJQ2xhc3NwYXRoQ29udGFpbmVyCisJICogQGRlcHJlY2F0ZWQgVXNlIElKYXZhUHJvamVjdCNmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMgaW5zdGVhZAogCSAqLwogCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KTsKIApAQCAtMjU0LDM0ICszNDUsNiBAQAogCUlQcm9qZWN0IGdldFByb2plY3QoKTsKIAogCS8qKgotCSAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHJldHVybmluZyB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdCwgYXMgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzLCAKLQkgKiB3aGVyZSBhbGwgY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGFuZCBzdWJzdGl0dXRlZCB3aXRoIHRoZWlyIGZpbmFsIHRhcmdldCBlbnRyaWVzLgotCSAqIDxwPgotCSAqIEEgcmVzb2x2ZWQgY2xhc3NwYXRoIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbnN0YW5jZSBvZiB0aGUgcmF3IGNsYXNzcGF0aCBib3VuZCBpbiB0aGUgY29udGV4dCBvZiAKLQkgKiB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHJlZmVycmVkIHZhcmlhYmxlcywgYW5kIHRodXMgc2hvdWxkIG5vdCBiZSBwZXJzaXN0ZWQuCi0JICogPHA+Ci0JICogQSBjbGFzc3BhdGggdmFyaWFibGUgcHJvdmlkZXMgYW4gaW5kaXJlY3Rpb24gbGV2ZWwgZm9yIGJldHRlciBzaGFyaW5nIGEgY2xhc3NwYXRoLiBBcyBhbiBleGFtcGxlLCBpdCBhbGxvd3MKLQkgKiBhIGNsYXNzcGF0aCB0byBubyBsb25nZXIgcmVmZXIgZGlyZWN0bHkgdG8gZXh0ZXJuYWwgSkFScyBsb2NhdGVkIGluIHNvbWUgdXNlciBzcGVjaWZpYyBsb2NhdGlvbi4gVGhlIGNsYXNzcGF0aAotCSAqIGNhbiBzaW1wbHkgcmVmZXIgdG8gc29tZSB2YXJpYWJsZXMgZGVmaW5pbmcgdGhlIHByb3BlciBsb2NhdGlvbnMgb2YgdGhlc2UgZXh0ZXJuYWwgSkFScy4KLQkgKiA8cD4KLQkgKiBUaGUgYm9vbGVhbiBhcmd1bWVudCA8Y29kZT5pZ25vcmVVbnJlc29sdmVkVmFyaWFibGU8L2NvZGU+IGFsbG93cyB0byBzcGVjaWZ5IGhvdyB0byBoYW5kbGUgdW5yZXNvbHZhYmxlIHZhcmlhYmxlcywKLQkgKiB3aGVuIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgbWlzc2luZyB2YXJpYWJsZXMgYXJlIHNpbXBseSBpZ25vcmVkLCB0aGUgcmVzdWx0aW5nIHBhdGggaXMgdGhlbiBvbmx5IGZvcm1lZCBvZiB0aGUKLQkgKiByZXNvbHZhYmxlIGVudHJpZXMsIHdpdGhvdXQgYW55IGluZGljYXRpb24gYWJvdXQgd2hpY2ggdmFyaWFibGUocykgd2FzIGlnbm9yZWQuIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgYQotCSAqIEphdmFNb2RlbEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmb3IgdGhlIGZpcnN0IHVucmVzb2x2ZWQgdmFyaWFibGUgKGZyb20gbGVmdCB0byByaWdodCkuCi0JICogCi0JICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaW4gb25lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpdHVhdGlvbjoKLQkgKiA8dWw+Ci0JICogICAgPGxpPiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgPC9saT4KLQkgKiAgICA8bGk+IGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlIDwvbGk+Ci0JICogICAgPGxpPiBhIGNsYXNzcGF0aCB2YXJpYWJsZSB3YXMgbm90IHJlc29sdmFibGUgYW5kIDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZTwvY29kZT4gd2FzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIDwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIAotCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5IAotCSAqLwotLy8JSUNsYXNzcGF0aEVudHJ5W10gZ2V0RXhwYW5kZWRDbGFzc3BhdGgoYm9vbGVhbiBpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUpCi0vLwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQotCS8qKgogCSAqIFJldHVybnMgdGhlIHJhdyBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LCBhcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGV4YWN0IHNldAogCSAqIG9mIGVudHJpZXMgd2hpY2ggd2VyZSBhc3NpZ25lZCB1c2luZyA8Y29kZT5zZXRSYXdDbGFzc3BhdGg8L2NvZGU+LCBpbiBwYXJ0aWN1bGFyIHN1Y2ggYSBjbGFzc3BhdGggbWF5IGNvbnRhaW4KIAkgKiBjbGFzc3BhdGggdmFyaWFibGUgZW50cmllcy4gQ2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMgY2FuIGJlIHJlc29sdmVkIGluZGl2aWR1YWxseSAoc2VlIDxjb2RlPkphdmFDb3JlI2dldENsYXNzcGF0aFZhcmlhYmxlPC9jb2RlPiksCkBAIC0zMDQsNDIgKzM2Nyw1MCBAQAogCS8qKgogCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBwcm9qZWN0cyB0aGF0IGFyZSBkaXJlY3RseSByZXF1aXJlZCBieSB0aGlzCiAJICogcHJvamVjdC4gQSBwcm9qZWN0IGlzIHJlcXVpcmVkIGlmIGl0IGlzIGluIGl0cyBjbGFzc3BhdGguCisJICogPHA+CisJICogVGhlIHByb2plY3QgbmFtZXMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBvbiB0aGUgY2xhc3NwYXRoLgogCSAqCiAJICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHByb2plY3RzIHRoYXQgYXJlIGRpcmVjdGx5IHJlcXVpcmVkIGJ5IHRoaXMKLQkgKiBwcm9qZWN0CisJICogcHJvamVjdCBpbiBjbGFzc3BhdGggb3JkZXIKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KIAkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKIAkgKi8KIAlTdHJpbmdbXSBnZXRSZXF1aXJlZFByb2plY3ROYW1lcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAKIAkvKioKLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCByZXR1cm5pbmcgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QsIGFzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcywgCi0JICogd2hlcmUgYWxsIGNsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGhhdmUgYmVlbiByZXNvbHZlZCBhbmQgc3Vic3RpdHV0ZWQgd2l0aCB0aGVpciBmaW5hbCB0YXJnZXQgZW50cmllcy4KKwkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCByZXR1cm5pbmcgdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QKKwkgKiBhcyBhIGxpc3Qgb2Ygc2ltcGxlIChub24tdmFyaWFibGUsIG5vbi1jb250YWluZXIpIGNsYXNzcGF0aCBlbnRyaWVzLgorCSAqIEFsbCBjbGFzc3BhdGggdmFyaWFibGUgYW5kIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcyBpbiB0aGUgcHJvamVjdCdzCisJICogcmF3IGNsYXNzcGF0aCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzaW1wbGUgY2xhc3NwYXRoIGVudHJpZXMgdGhleQorCSAqIHJlc29sdmUgdG8uCiAJICogPHA+Ci0JICogQSByZXNvbHZlZCBjbGFzc3BhdGggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSByYXcgY2xhc3NwYXRoIGJvdW5kIGluIHRoZSBjb250ZXh0IG9mIAotCSAqIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgcmVmZXJyZWQgdmFyaWFibGVzLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHBlcnNpc3RlZC4KLQkgKiA8cD4KLQkgKiBBIGNsYXNzcGF0aCB2YXJpYWJsZSBwcm92aWRlcyBhbiBpbmRpcmVjdGlvbiBsZXZlbCBmb3IgYmV0dGVyIHNoYXJpbmcgYSBjbGFzc3BhdGguIEFzIGFuIGV4YW1wbGUsIGl0IGFsbG93cwotCSAqIGEgY2xhc3NwYXRoIHRvIG5vIGxvbmdlciByZWZlciBkaXJlY3RseSB0byBleHRlcm5hbCBKQVJzIGxvY2F0ZWQgaW4gc29tZSB1c2VyIHNwZWNpZmljIGxvY2F0aW9uLiBUaGUgY2xhc3NwYXRoCi0JICogY2FuIHNpbXBseSByZWZlciB0byBzb21lIHZhcmlhYmxlcyBkZWZpbmluZyB0aGUgcHJvcGVyIGxvY2F0aW9ucyBvZiB0aGVzZSBleHRlcm5hbCBKQVJzLgotCSAqIDxwPgotCSAqIFRoZSBib29sZWFuIGFyZ3VtZW50IDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZTwvY29kZT4gYWxsb3dzIHRvIHNwZWNpZnkgaG93IHRvIGhhbmRsZSB1bnJlc29sdmFibGUgdmFyaWFibGVzLAotCSAqIHdoZW4gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBtaXNzaW5nIHZhcmlhYmxlcyBhcmUgc2ltcGx5IGlnbm9yZWQsIHRoZSByZXN1bHRpbmcgcGF0aCBpcyB0aGVuIG9ubHkgZm9ybWVkIG9mIHRoZQotCSAqIHJlc29sdmFibGUgZW50cmllcywgd2l0aG91dCBhbnkgaW5kaWNhdGlvbiBhYm91dCB3aGljaCB2YXJpYWJsZShzKSB3YXMgaWdub3JlZC4gV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCBhCi0JICogSmF2YU1vZGVsRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZvciB0aGUgZmlyc3QgdW5yZXNvbHZlZCB2YXJpYWJsZSAoZnJvbSBsZWZ0IHRvIHJpZ2h0KS4KKwkgKiBUaGUgcmVzdWx0aW5nIHJlc29sdmVkIGNsYXNzcGF0aCBpcyBhY2N1cmF0ZSBmb3IgdGhlIGdpdmVuIHBvaW50IGluIHRpbWUuCisJICogSWYgdGhlIHByb2plY3QncyByYXcgY2xhc3NwYXRoIGlzIGxhdGVyIG1vZGlmaWVkLCBvciBpZiBjbGFzc3BhdGgKKwkgKiB2YXJpYWJsZXMgYXJlIGNoYW5nZWQsIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggY2FuIGJlY29tZSBvdXQgb2YgZGF0ZS4KKwkgKiBCZWNhdXNlIG9mIHRoaXMsIGhhbmdpbmcgb24gcmVzb2x2ZWQgY2xhc3NwYXRoIGlzIG5vdCByZWNvbW1lbmRlZC4KKwkgKiA8L3A+CiAJICogCi0JICogQHBhcmFtIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSBzcGVjaWZ5IGhvdyB0byBoYW5kbGUgdW5yZXNvbHZhYmxlIHZhcmlhYmxlcwotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGNsYXNzcGF0aCBmb3IgdGhlIHByb2plY3QsIGFzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcywgCi0JICogd2hlcmUgYWxsIGNsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGhhdmUgYmVlbiByZXNvbHZlZCBhbmQgc3Vic3RpdHV0ZWQgd2l0aCB0aGVpciBmaW5hbCB0YXJnZXQgZW50cmllcworCSAqIEBwYXJhbSBpZ25vcmVVbnJlc29sdmVkRW50cnkgaW5kaWNhdGVzIGhvdyB0byBoYW5kbGUgdW5yZXNvbHZhYmxlCisJICogdmFyaWFibGVzIGFuZCBjb250YWluZXJzOyA8Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCBtaXNzaW5nCisJICogdmFyaWFibGVzIGFuZCB1bnJlc29sdmFibGUgY2xhc3NwYXRoIGNvbnRhaW5lcnMgc2hvdWxkIGJlIHNpbGVudGx5CisJICogaWdub3JlZCwgYW5kIHRoYXQgdGhlIHJlc3VsdGluZyBsaXN0IHNob3VsZCBjb25zaXN0IG9ubHkgb2YgdGhlCisJICogZW50cmllcyB0aGF0IGNvdWxkIGJlIHN1Y2Nlc3NmdWxseSByZXNvbHZlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcworCSAqIHRoYXQgYSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IHNob3VsZCBiZSB0aHJvd24gZm9yIHRoZSBmaXJzdAorCSAqIHVucmVzb2x2ZWQgdmFyaWFibGUgb3IgY29udGFpbmVyCisJICogQHJldHVybiB0aGUgcmVzb2x2ZWQgY2xhc3NwYXRoIGZvciB0aGUgcHJvamVjdCBhcyBhIGxpc3Qgb2Ygc2ltcGxlIAorCSAqIGNsYXNzcGF0aCBlbnRyaWVzLCB3aGVyZSBhbGwgY2xhc3NwYXRoIHZhcmlhYmxlIGFuZCBjb250YWluZXIgZW50cmllcworCSAqIGhhdmUgYmVlbiByZXNvbHZlZCBhbmQgc3Vic3RpdHV0ZWQgd2l0aCB0aGVpciBmaW5hbCB0YXJnZXQgZW50cmllcwogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGluIG9uZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzaXR1YXRpb246CiAJICogPHVsPgotCSAqICAgIDxsaT4gdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IDwvbGk+Ci0JICogICAgPGxpPiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZSA8L2xpPgotCSAqICAgIDxsaT4gYSBjbGFzc3BhdGggdmFyaWFibGUgd2FzIG5vdCByZXNvbHZhYmxlIGFuZCA8Y29kZT5pZ25vcmVVbnJlc29sdmVkVmFyaWFibGU8L2NvZGU+IHdhcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LiA8L2xpPgorCSAqICAgIDxsaT50aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Q8L2xpPgorCSAqICAgIDxsaT5hbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZTwvbGk+CisJICogICAgPGxpPmEgY2xhc3NwYXRoIHZhcmlhYmxlIG9yIGNsYXNzcGF0aCBjb250YWluZXIgd2FzIG5vdCByZXNvbHZhYmxlCisJICogICAgYW5kIDxjb2RlPmlnbm9yZVVucmVzb2x2ZWRFbnRyeTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+CiAJICogPC91bD4KLQkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSAKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQogCSAqLwotCUlDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKGJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCUlDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKGJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZEVudHJ5KQorCSAgICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAogCS8qKgogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb2plY3QgaGFzIGJlZW4gYnVpbHQgYXQgbGVhc3Qgb25jZSBhbmQgdGh1cyB3aGV0aGVyIGl0IGhhcyBhIGJ1aWxkIHN0YXRlLgpAQCAtMzU5LDE1ICs0MzAsMjkgQEAKIAkgKi8KIAlib29sZWFuIGhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpOwogCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdC4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsIAorCSAqIHRoYXQgaXMsIHJlZmVyZW5jZWQgZnJvbSBhIGNsYXNzcGF0aCBlbnRyeSBhbmQgbm90IGV4cGxpY2l0bHkgZXhjbHVkZWQKKwkgKiB1c2luZyBhbiBleGNsdXNpb24gcGF0dGVybi4gCiAJICogCiAJICogQHBhcmFtIGVsZW1lbnQgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KLQkgKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsIGZhbHNlIG90aGVyd2lzZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZgorCSAqIHRoaXMgcHJvamVjdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zCiAJICogQHNpbmNlIDIuMAogCSAqLwotCWJvb2xlYW4gaXNPbkNsYXNzcGF0aChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwlib29sZWFuIGlzT25DbGFzc3BhdGgoSUphdmFFbGVtZW50IGVsZW1lbnQpOworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIHByb2plY3QsCisJICogdGhhdCBpcywgcmVmZXJlbmNlZCBmcm9tIGEgY2xhc3NwYXRoIGVudHJ5IGFuZCBub3QgZXhwbGljaXRseSBleGNsdWRlZAorCSAqIHVzaW5nIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuLgorCSAqIAorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBnaXZlbiBlbGVtZW50CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgb24gdGhlIGNsYXNzcGF0aCBvZgorCSAqIHRoaXMgcHJvamVjdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zCisJICogQHNpbmNlIDIuMQorCSAqLworCWJvb2xlYW4gaXNPbkNsYXNzcGF0aChJUmVzb3VyY2UgcmVzb3VyY2UpOwogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBldmFsdWF0aW9uIGNvbnRleHQuCkBAIC00MTIsMjEgKzQ5Nyw0OSBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAJLyoqCi0JICogU2V0cyB0aGUgb3V0cHV0IGxvY2F0aW9uIG9mIHRoaXMgcHJvamVjdCB0byB0aGUgbG9jYXRpb24KLQkgKiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguCisJICogU2V0cyB0aGUgcHJvamVjdCBjdXN0b20gb3B0aW9ucy4gQWxsIGFuZCBvbmx5IHRoZSBvcHRpb25zIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIHRhYmxlIAorCSAqIGFyZSByZW1lbWJlcmVkOyBhbGwgcHJldmlvdXMgb3B0aW9uIHNldHRpbmdzIGFyZSBmb3Jnb3R0ZW4sIGluY2x1ZGluZyBvbmVzIG5vdCBleHBsaWNpdGx5CisJICogbWVudGlvbmVkLgogCSAqIDxwPgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIGdpdmVuIGFic29sdXRlIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHBhcmFtIG5ld09wdGlvbnMgdGhlIG5ldyBvcHRpb25zIChrZXkgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPjsgdmFsdWUgdHlwZTogPGNvZGU+U3RyaW5nPC9jb2RlPiksCisJICogICBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBmbHVzaCBhbGwgY3VzdG9tIG9wdGlvbnMgKGNsaWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZ2xvYmFsIEphdmFDb3JlIG9wdGlvbnMpLgorCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJdm9pZCBzZXRPcHRpb25zKE1hcCBuZXdPcHRpb25zKTsKKworCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoaXMgcHJvamVjdCB0byB0aGUgbG9jYXRpb24KKwkgKiBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIHdvcmtzcGFjZS1yZWxhdGl2ZSBhYnNvbHV0ZSBwYXRoLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBpcyB3aGVyZSBjbGFzcyBmaWxlcyBhcmUgb3JkaW5hcmlseSBnZW5lcmF0ZWQKKwkgKiAoYW5kIHJlc291cmNlIGZpbGVzLCBjb3BpZWQpLiBFYWNoIHNvdXJjZSBjbGFzc3BhdGggZW50cmllcyBjYW4gYWxzbworCSAqIHNwZWNpZnkgYW4gb3V0cHV0IGxvY2F0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIChhbmQgY29waWVkCisJICogcmVzb3VyY2UgZmlsZXMpIGNvcnJlc3BvbmRpbmcgdG8gY29tcGlsYXRpb24gdW5pdHMgdW5kZXIgdGhhdCBzb3VyY2UKKwkgKiBmb2xkZXIuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYXJyYW5nZSB0aGF0IGdlbmVyYXRlZCBjbGFzcyBmaWxlcyBmb3IKKwkgKiBkaWZmZXJlbnQgc291cmNlIGZvbGRlcnMgdG8gZW5kIHVwIGluIGRpZmZlcmVudCBvdXRwdXQgZm9sZGVycywgYW5kIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZ2VuZXJhdGVkCisJICogY2xhc3MgZmlsZXMgZm9yIHRoZSBwcm9qZWN0IG1heSBlbmQgdXAgc2NhdHRlcmVkIGFjcm9zcyBzZXZlcmFsIGZvbGRlcnMsCisJICogcmF0aGVyIHRoYW4gYWxsIGluIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgKHdoaWNoIGlzIG1vcmUgc3RhbmRhcmQpLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gcGF0aCB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0CisJICogZm9sZGVyCisJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKIAkgKiAKIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3NwYXRoIGNvdWxkIG5vdCBiZSBzZXQuIFJlYXNvbnMgaW5jbHVkZToKIAkgKiA8dWw+Ci0JICogIDxsaT5UaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgotCSAqCTxsaT5UaGUgcGF0aCByZWZlcnMgdG8gYSBsb2NhdGlvbiBub3QgY29udGFpbmVkIGluIHRoaXMgcHJvamVjdCAoPGNvZGU+UEFUSF9PVVRTSURFX1BST0pFQ1Q8L2NvZGU+KQotCSAqCTxsaT5UaGUgcGF0aCBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCAoPGNvZGU+UkVMQVRJVkVfUEFUSDwvY29kZT4pCi0JICogIDxsaT5UaGUgcGF0aCBpcyBuZXN0ZWQgaW5zaWRlIGEgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoaXMgcHJvamVjdCAoPGNvZGU+SU5WQUxJRF9QQVRIPC9jb2RlPikKKwkgKiAgPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqICA8bGk+IFRoZSBwYXRoIHJlZmVycyB0byBhIGxvY2F0aW9uIG5vdCBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0ICg8Y29kZT5QQVRIX09VVFNJREVfUFJPSkVDVDwvY29kZT4pCisJICogIDxsaT4gVGhlIHBhdGggaXMgbm90IGFuIGFic29sdXRlIHBhdGggKDxjb2RlPlJFTEFUSVZFX1BBVEg8L2NvZGU+KQorCSAqICA8bGk+IFRoZSBwYXRoIGlzIG5lc3RlZCBpbnNpZGUgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2YgdGhpcyBwcm9qZWN0ICg8Y29kZT5JTlZBTElEX1BBVEg8L2NvZGU+KQogCSAqICA8bGk+IFRoZSBvdXRwdXQgbG9jYXRpb24gaXMgYmVpbmcgbW9kaWZpZWQgZHVyaW5nIHJlc291cmNlIGNoYW5nZSBldmVudCBub3RpZmljYXRpb24gKENPUkVfRVhDRVBUSU9OKQkgCiAJICogPC91bD4KKwkgKiBAc2VlICNnZXRPdXRwdXRMb2NhdGlvbgorICAgICAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldE91dHB1dExvY2F0aW9uCiAJICovCiAJdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CkBAIC00NjMsMjkgKzU3NiwzNyBAQAogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCQkKIAkvKioKLQkgKiBTZXRzIHRoZSBib3RoIHRoZSBjbGFzc3BhdGggb2YgdGhpcyBwcm9qZWN0IGFuZCBpdHMgb3V0cHV0IGxvY2F0aW9uIGF0IG9uY2UuCi0JICogVGhlIGNsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcy4gSW4gcGFydGljdWxhciBzdWNoIGEgY2xhc3NwYXRoIG1heSBjb250YWluCi0JICogY2xhc3NwYXRoIHZhcmlhYmxlIGVudHJpZXMuIENsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGNhbiBiZSByZXNvbHZlZCBpbmRpdmlkdWFsbHkgKHNlZSA8Y29kZT5KYXZhQ29yZSNnZXRDbGFzc3BhdGhWYXJpYWJsZTwvY29kZT4pLAotCSAqIG9yIHRoZSBmdWxsIGNsYXNzcGF0aCBjYW4gYmUgcmVzb2x2ZWQgYXQgb25jZSB1c2luZyB0aGUgaGVscGVyIG1ldGhvZCA8Y29kZT5nZXRSZXNvbHZlZENsYXNzcGF0aDwvY29kZT4uCisJICogU2V0cyB0aGUgYm90aCB0aGUgY2xhc3NwYXRoIG9mIHRoaXMgcHJvamVjdCBhbmQgaXRzIGRlZmF1bHQgb3V0cHV0CisJICogbG9jYXRpb24gYXQgb25jZS4gVGhlIGNsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIGEgbGlzdCBvZiBjbGFzc3BhdGgKKwkgKiBlbnRyaWVzLiBJbiBwYXJ0aWN1bGFyLCBzdWNoIGEgY2xhc3NwYXRoIG1heSBjb250YWluIGNsYXNzcGF0aCB2YXJpYWJsZQorCSAqIGVudHJpZXMuIENsYXNzcGF0aCB2YXJpYWJsZSBlbnRyaWVzIGNhbiBiZSByZXNvbHZlZCBpbmRpdmlkdWFsbHkgKHNlZQorCSAqIDxjb2RlPkphdmFDb3JlI2dldENsYXNzcGF0aFZhcmlhYmxlPC9jb2RlPiksIG9yIHRoZSBmdWxsIGNsYXNzcGF0aCBjYW4gYmUKKwkgKiByZXNvbHZlZCBhdCBvbmNlIHVzaW5nIHRoZSBoZWxwZXIgbWV0aG9kCisJICogPGNvZGU+Z2V0UmVzb2x2ZWRDbGFzc3BhdGg8L2NvZGU+LgogCSAqIDxwPgotCSAqIEEgY2xhc3NwYXRoIHZhcmlhYmxlIHByb3ZpZGVzIGFuIGluZGlyZWN0aW9uIGxldmVsIGZvciBiZXR0ZXIgc2hhcmluZyBhIGNsYXNzcGF0aC4gQXMgYW4gZXhhbXBsZSwgaXQgYWxsb3dzCi0JICogYSBjbGFzc3BhdGggdG8gbm8gbG9uZ2VyIHJlZmVyIGRpcmVjdGx5IHRvIGV4dGVybmFsIEpBUnMgbG9jYXRlZCBpbiBzb21lIHVzZXIgc3BlY2lmaWMgbG9jYXRpb24uIFRoZSBjbGFzc3BhdGgKLQkgKiBjYW4gc2ltcGx5IHJlZmVyIHRvIHNvbWUgdmFyaWFibGVzIGRlZmluaW5nIHRoZSBwcm9wZXIgbG9jYXRpb25zIG9mIHRoZXNlIGV4dGVybmFsIEpBUnMuCisJICogQSBjbGFzc3BhdGggdmFyaWFibGUgcHJvdmlkZXMgYW4gaW5kaXJlY3Rpb24gbGV2ZWwgZm9yIGJldHRlciBzaGFyaW5nIGEKKwkgKiBjbGFzc3BhdGguIEFzIGFuIGV4YW1wbGUsIGl0IGFsbG93cyBhIGNsYXNzcGF0aCB0byBubyBsb25nZXIgcmVmZXIKKwkgKiBkaXJlY3RseSB0byBleHRlcm5hbCBKQVJzIGxvY2F0ZWQgaW4gc29tZSB1c2VyIHNwZWNpZmljIGxvY2F0aW9uLiBUaGUKKwkgKiBjbGFzc3BhdGggY2FuIHNpbXBseSByZWZlciB0byBzb21lIHZhcmlhYmxlcyBkZWZpbmluZyB0aGUgcHJvcGVyCisJICogbG9jYXRpb25zIG9mIHRoZXNlIGV4dGVybmFsIEpBUnMuCisJICogPC9wPgogCSAqIDxwPgogCSAqIFNldHRpbmcgdGhlIGNsYXNzcGF0aCB0byA8Y29kZT5udWxsPC9jb2RlPiBzcGVjaWZpZXMgYSBkZWZhdWx0IGNsYXNzcGF0aAogCSAqICh0aGUgcHJvamVjdCByb290KS4gU2V0dGluZyB0aGUgY2xhc3NwYXRoIHRvIGFuIGVtcHR5IGFycmF5IHNwZWNpZmllcyBhbgogCSAqIGVtcHR5IGNsYXNzcGF0aC4KKwkgKiA8L3A+CiAJICogPHA+Ci0JICogSWYgYSBjeWNsZSBpcyBkZXRlY3RlZCB3aGlsZSBzZXR0aW5nIHRoaXMgY2xhc3NwYXRoLCBhbiBlcnJvciBtYXJrZXIgd2lsbCBiZSBhZGRlZAotCSAqIHRvIHRoZSBwcm9qZWN0IGNsb3NpbmcgdGhlIGN5Y2xlLgotCSAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgdXNlIDxjb2RlPmhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpPC9jb2RlPgotCSAqIGJlZm9yZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGguCi0JICoKLQkgKiBAcGFyYW0gZW50cmllcyBhIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBwYXJhbSBvdXRwdXRMb2NhdGlvbiB0aGUgZ2l2ZW4gb3V0cHV0IGxvY2F0aW9uCisJICogSWYgYSBjeWNsZSBpcyBkZXRlY3RlZCB3aGlsZSBzZXR0aW5nIHRoaXMgY2xhc3NwYXRoLCBhbiBlcnJvciBtYXJrZXIgd2lsbAorCSAqIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGNsb3NpbmcgdGhlIGN5Y2xlLiBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHVzZQorCSAqIDxjb2RlPmhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpPC9jb2RlPiBiZWZvcmUgc2V0dGluZworCSAqIHRoZSBjbGFzc3BhdGguCisJICogPC9wPgogCSAqIAotCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjbGFzc3BhdGggY291bGQgbm90IGJlIHNldC4gUmVhc29ucyBpbmNsdWRlOgorCSAqIEBwYXJhbSBlbnRyaWVzIGEgbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcworCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCisJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjbGFzc3BhdGggY291bGQgbm90IGJlIHNldC4gUmVhc29ucworCSAqIGluY2x1ZGU6CiAJICogPHVsPgogCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KIAkgKiA8bGk+IFR3byBvciBtb3JlIGVudHJpZXMgc3BlY2lmeSBzb3VyY2Ugcm9vdHMgd2l0aCB0aGUgc2FtZSBvciBvdmVybGFwcGluZyBwYXRocyAoTkFNRV9DT0xMSVNJT04pCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWVtYmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWVtYmVyLmphdmEKaW5kZXggZTQwYzQ0Ni4uNGYwZTAwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1lbWJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lNZW1iZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiAvKioKQEAgLTQ5LDYgKzQ5LDEwIEBACiAvKioKICAqIFJldHVybnMgdGhlIG1vZGlmaWVyIGZsYWdzIGZvciB0aGlzIG1lbWJlci4gVGhlIGZsYWdzIGNhbiBiZSBleGFtaW5lZCB1c2luZyBjbGFzcwogICogPGNvZGU+RmxhZ3M8L2NvZGU+LgorICogPHA+CisgKiBOb3RlIHRoYXQgb25seSBmbGFncyBhcyBpbmRpY2F0ZWQgaW4gdGhlIHNvdXJjZSBhcmUgcmV0dXJuZWQuIFRodXMgaWYgYW4gaW50ZXJmYWNlCisgKiBkZWZpbmVzIGEgbWV0aG9kIDxjb2RlPnZvaWQgbXlNZXRob2QoKTs8L2NvZGU+IHRoZSBmbGFncyBkb24ndCBpbmNsdWRlIHRoZQorICogJ3B1YmxpYycgZmxhZy4KICAqCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4KICAqICAgICAgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JTWV0aG9kLmphdmEKaW5kZXggYmVjZTkxYS4uZGQwYWZjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lNZXRob2QuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lPcGVuYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU9wZW5hYmxlLmphdmEKaW5kZXggYzJjMjVkOC4uMmI4YThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU9wZW5hYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSU9wZW5hYmxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCmluZGV4IDE1YjFjZjIuLjBmODJmZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50LmphdmEKaW5kZXggZDE4MDcyZC4uMzZmN2E2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CkBAIC0xMzUsOCArMTM1LDE3IEBACiAJaW50IGdldEtpbmQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogCS8qKgogCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLUphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuCisJICogPHA+CisJICogTm9uLUphdmEgcmVzb3VyY2VzIGluY2x1ZGVzIG90aGVyIGZpbGVzIGFuZCBmb2xkZXJzIGxvY2F0ZWQgaW4gdGhlIHNhbWUKKwkgKiBkaXJlY3RvcnkgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXRzIG9yIGNsYXNzIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UgCisJICogZnJhZ21lbnQuIFNvdXJjZSBmaWxlcyBleGNsdWRlZCBmcm9tIHRoaXMgcGFja2FnZSBieSBvbmUgb3IgbW9yZQorCSAqIGV4Y2x1c2lvbiBwYXR0ZXJucyBvbiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY2xhc3NwYXRoIGVudHJ5IGFyZQorCSAqIGNvbnNpZGVyZWQgbm9uLUphdmEgcmVzb3VyY2VzIGFuZCB3aWxsIGFwcGVhciBpbiB0aGUgcmVzdWx0CisJICogKHBvc3NpYmx5IGluIGEgZm9sZGVyKS4KKwkgKiA8L3A+CiAJICogCiAJICogQHJldHVybiBhbiBhcnJheSBvZiBub24tSmF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudAorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zCiAJICovCiAJT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQppbmRleCBlZTVkMzFkLi5kZWQxZjc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTEsMTcgKzEsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBzcGVjaWZpZWQgdGhhdCBhIHNvdXJjZSBhcmNoaXZlIG9yIGEgc291cmNlIGZvbGRlciBjYW4gYmUgYXR0YWNoZWQgdG8gYSBiaW5hcnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCByb290IG1hbmlwdWxhdGlvbiBBUElzOiBjb3B5LCBkZWxldGUsIG1vdmUKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSAorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIE9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEgKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBOT19SRVNPVVJDRV9NT0RJRklDQVRJT04KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBSRVBMQUNFCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsgCiAKIC8qKgogICogQSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY29udGFpbnMgYSBzZXQgb2YgcGFja2FnZSBmcmFnbWVudHMuCkBAIC00NSwyOSArNTMsMTIyIEBACiAJICovCiAJU3RyaW5nIERFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSCA9ICIiOyAvLyROT04tTkxTLTEkCiAJLyoqCisJICogVXBkYXRlIG1vZGVsIGZsYWcgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCisJICogaXMgdG8gbm90IGNvcHkvbW92ZS9kZWxldGUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCByZXNvdXJjZS4KKwkgKiBAc2luY2UgMi4xCisJICovCisJaW50IE5PX1JFU09VUkNFX01PRElGSUNBVElPTiA9IDE7CisJLyoqCisJICogVXBkYXRlIG1vZGVsIGZsYWcgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDIpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCisJICogaXMgdG8gdXBkYXRlIHRoZSBjbGFzc3BhdGggb2YgdGhlIG9yaWdpbmF0aW5nIHByb2plY3QuCisJICogQHNpbmNlIDIuMQorCSAqLworCWludCBPUklHSU5BVElOR19QUk9KRUNUX0NMQVNTUEFUSCA9IDI7CisJLyoqCisJICogVXBkYXRlIG1vZGVsIGZsYWcgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDQpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCisJICogaXMgdG8gdXBkYXRlIHRoZSBjbGFzc3BhdGggb2YgYWxsIHJlZmVycmluZyBwcm9qZWN0cyBleGNlcHQgdGhlIG9yaWdpbmF0aW5nIHByb2plY3QuCisJICogQHNpbmNlIDIuMQorCSAqLworCWludCBPVEhFUl9SRUZFUlJJTkdfUFJPSkVDVFNfQ0xBU1NQQVRIID0gNDsKKwkvKioKKwkgKiBVcGRhdGUgbW9kZWwgZmxhZyBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgOCkgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24KKwkgKiBpcyB0byB1cGRhdGUgdGhlIGNsYXNzcGF0aCBvZiB0aGUgZGVzdGluYXRpb24gcHJvamVjdC4KKwkgKiBAc2luY2UgMi4xCisJICovCisJaW50IERFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIID0gODsJCisJLyoqCisJICogVXBkYXRlIG1vZGVsIGZsYWcgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDE2KSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbgorCSAqIGlzIHRvIHJlcGxhY2UgdGhlIHJlc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzIGNsYXNzcGF0aCBlbnRyeS4KKwkgKiBAc2luY2UgMi4xCisJICovCisJaW50IFJFUExBQ0UgPSAxNjsJCisJLyoqCiAJICogQXR0YWNoZXMgdGhlIHNvdXJjZSBhcmNoaXZlIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIHBhdGggdG8gdGhpcwotCSAqIEpBUiBwYWNrYWdlIGZyYWdtZW50IHJvb3QuIDxjb2RlPnJvb3RQYXRoPC9jb2RlPiBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uCi0JICogb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlICg8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdCkuCi0JICogT25jZSBhIHNvdXJjZSBhcmNoaXZlIGlzIGF0dGFjaGVkIHRvIHRoZSBKQVIsCisJICogYmluYXJ5IHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4gPGNvZGU+cm9vdFBhdGg8L2NvZGU+IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gCisJICogb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlIG9yIGZvbGRlciAoZW1wdHkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJvb3QgCisJICogYW5kIDxjb2RlPm51bGw8L2NvZGU+IHNwZWNpZmllcyB0aGUgcm9vdCBwYXRoIHNob3VsZCBiZSBkZXRlY3RlZCkuCisJICogT25jZSBhIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlciBpcyBhdHRhY2hlZCB0byB0aGUgcGFja2FnZSBmcmFnbWVudCByb290LAogCSAqIHRoZSA8Y29kZT5nZXRTb3VyY2U8L2NvZGU+IGFuZCA8Y29kZT5nZXRTb3VyY2VSYW5nZTwvY29kZT4KIAkgKiBtZXRob2RzIGJlY29tZSBvcGVyYXRpb25hbCBmb3IgYmluYXJ5IHR5cGVzL21lbWJlcnMuCi0JICogVG8gZGV0YWNoIGEgc291cmNlIGFyY2hpdmUgZnJvbSBhIEpBUiwgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUKLQkgKiBhcmNoaXZlUGF0aC4KKwkgKiBUbyBkZXRhY2ggYSBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIgZnJvbSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCwgc3BlY2lmeSAKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBhcyB0aGUgc291cmNlIHBhdGguCiAJICoKLQkgKiBAcGFyYW0gYXJjaGl2ZVBhdGggdGhlIGdpdmVuIGFic29sdXRlIHBhdGggdG8gdGhpcyBKQVIgcGFja2FnZSBmcmFnbWVudCByb290Ci0JICogQHBhcmFtIHJvb3RQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlICg8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdCkKKwkgKiBAcGFyYW0gc291cmNlUGF0aCB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCisJICogQHBhcmFtIHJvb3RQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3Qgd2l0aGluIHRoZSBhcmNoaXZlIAorCSAqICAgICAgICAgICAgICAoZW1wdHkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJvb3QgYW5kIDxjb2RlPm51bGw8L2NvZGU+IHNwZWNpZmllcyAKKwkgKiAgICAgICAgICAgICAgIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgdGhlIHJvb3QgcGF0aCkKIAkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxzLiBSZWFzb25zIGluY2x1ZGU6CiAJICogPHVsPgogCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KIAkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYSBzZXJ2ZXIgcHJvcGVydHkKLQkgKiA8bGk+IFRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIG5vdCBhIEpBUiAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQorCSAqIDxsaT4gVGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgbm90IG9mIGtpbmQgYmluYXJ5IChJTlZBTElEX0VMRU1FTlRfVFlQRVMpCiAJICogPGxpPiBUaGUgcGF0aCBwcm92aWRlZCBpcyBub3QgYWJzb2x1dGUgKFJFTEFUSVZFX1BBVEgpCiAJICogPC91bD4KIAkgKi8KLQl2b2lkIGF0dGFjaFNvdXJjZShJUGF0aCBhcmNoaXZlUGF0aCwgSVBhdGggcm9vdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwl2b2lkIGF0dGFjaFNvdXJjZShJUGF0aCBzb3VyY2VQYXRoLCBJUGF0aCByb290UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCQkKKworCS8qKgorCSAqIENvcGllcyB0aGUgcmVzb3VyY2Ugb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdG8gdGhlIGRlc3RpbmF0aW9uIHBhdGgKKwkgKiBhcyBzcGVjaWZpZWQgYnkgPGNvZGU+SVJlc291cmNlLmNvcHkoSVBhdGgsIGludCwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+CisJICogYnV0IGV4Y2x1ZGluZyBuZXN0ZWQgc291cmNlIGZvbGRlcnMuCisJICogPHA+CisJICogSWYgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPiBpcyBzcGVjaWZpZWQgaW4gCisJICogPGNvZGU+dXBkYXRlTW9kZWxGbGFnczwvY29kZT4gb3IgaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgZXh0ZXJuYWwsIAorCSAqIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3QgY29weSB0aGUgcmVzb3VyY2UuIDxjb2RlPnVwZGF0ZVJlc291cmNlRmxhZ3M8L2NvZGU+IAorCSAqIGlzIHRoZW4gaWdub3JlZC4KKwkgKiA8L3A+PHA+CisJICogSWYgPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlcyB0aGUgY2xhc3NwYXRoIG9mIHRoZSAKKwkgKiBkZXN0aW5hdGlvbidzIHByb2plY3QgKGlmIGl0IGlzIGEgSmF2YSBwcm9qZWN0KS4gSWYgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gCisJICogc2libGluZyBpcyBzcGVjaWZpZWQsIGEgY29weSBvZiB0aGlzIHJvb3QncyBjbGFzc3BhdGggZW50cnkgaXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSAKKwkgKiBzaWJsaW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgcmF3IGNsYXNzcGF0aC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgCisJICogc3BlY2lmaWVkLCB0aGUgY2xhc3NwYXRoIGVudHJ5IGlzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJhdyBjbGFzc3BhdGguCisJICogPC9wPjxwPgorCSAqIElmIDxjb2RlPlJFUExBQ0U8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwKKwkgKiBvdmVyd3JpdGVzIHRoZSByZXNvdXJjZSBhdCB0aGUgZGVzdGluYXRpb24gcGF0aCBpZiBhbnkuCisJICogSWYgdGhlIHNhbWUgY2xhc3NwYXRoIGVudHJ5IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MgcmF3CisJICogY2xhc3NwYXRoLCB0aGVuIHRoZSBzaWJsaW5nIGlzIGlnbm9yZWQgYW5kIHRoZSBuZXcgY2xhc3NwYXRoIGVudHJ5IHJlcGxhY2VzIHRoZSAKKwkgKiBleGlzdGluZyBvbmUuCisJICogPC9wPjxwPgorCSAqIElmIG5vIGZsYWdzIGlzIHNwZWNpZmllZCBpbiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiAodXNpbmcgCisJICogPGNvZGU+SVJlc291cmNlLk5PTkU8L2NvZGU+KSwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYXBwbGllczogdGhlCisJICogcmVzb3VyY2UgaXMgY29waWVkIChpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBub3QgZXh0ZXJuYWwpIGFuZCB0aGUKKwkgKiBjbGFzc3BhdGggaXMgbm90IHVwZGF0ZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gcGF0aAorCSAqIEBwYXJhbSB1cGRhdGVSZXNvdXJjZUZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cworCSAqICAgKDxjb2RlPklSZXNvdXJjZS5GT1JDRTwvY29kZT4gYW5kIDxjb2RlPklSZXNvdXJjZS5TSEFMTE9XPC9jb2RlPikKKwkgKiBAcGFyYW0gdXBkYXRlTW9kZWxGbGFncyBiaXQtd2lzZSBvciBvZiB1cGRhdGUgcmVzb3VyY2UgZmxhZyBjb25zdGFudHMKKwkgKiAgICg8Y29kZT5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4gYW5kIAorCSAqICAgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPikKKwkgKiBAcGFyYW0gc2libGluZyB0aGUgY2xhc3NwYXRoIGVudHJ5IGJlZm9yZSB3aGljaCBhIGNvcHkgb2YgdGhlIGNsYXNzcGF0aAorCSAqIGVudHJ5IHNob3VsZCBiZSBpbnNlcnRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIGVudHJ5IHNob3VsZAorCSAqIGJlIGluc2VydGVkIGF0IHRoZSBlbmQKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKwkgKiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHJvb3QgY291bGQgbm90IGJlIGNvcGllZC4gUmVhc29ucworCSAqIGluY2x1ZGU6CisJICogPHVsPgorCSAqIDxsaT4gVGhpcyByb290IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisJICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIGNvcHlpbmcgdGhlCisJICogcmVzb3VyY2Ugb3IgdXBkYXRpbmcgYSBjbGFzc3BhdGg8L2xpPgorCSAqIDxsaT4KKwkgKiBUaGUgZGVzdGluYXRpb24gaXMgbm90IGluc2lkZSBhbiBleGlzdGluZyBwcm9qZWN0IGFuZCA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPgorCSAqIGhhcyBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4gCisJICogKElOVkFMSURfREVTVElOQVRJT04pPC9saT4KKwkgKiA8bGk+IFRoZSBzaWJsaW5nIGlzIG5vdCBhIGNsYXNzcGF0aCBlbnRyeSBvbiB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzCisJICogcmF3IGNsYXNzcGF0aCAoSU5WQUxJRF9TSUJMSU5HKTwvbGk+CisJICogPGxpPiBUaGUgc2FtZSBjbGFzc3BhdGggZW50cnkgYWxyZWFkeSBleGlzdHMgb24gdGhlIGRlc3RpbmF0aW9uIHByb2plY3QncworCSAqIGNsYXNzcGF0aCAoTkFNRV9DT0xMSVNJT04pIGFuZCA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPgorCSAqIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+UkVQTEFDRTwvY29kZT48L2xpPgorCSAqIDwvdWw+CisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UjY29weQorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwl2b2lkIGNvcHkoSVBhdGggZGVzdGluYXRpb24sIGludCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBpbnQgdXBkYXRlTW9kZWxGbGFncywgSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcGFja2FnZSBmcmFnbWVudCBpbiB0aGlzIHJvb3Qgd2l0aCB0aGUgCiAJICogZ2l2ZW4gZG90LXNlcGFyYXRlZCBwYWNrYWdlIG5hbWUuICBBbiBlbXB0eSBzdHJpbmcgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHBhY2thZ2UuIApAQCAtOTcsNyArMTk4LDUxIEBACiAJCWJvb2xlYW4gZm9yY2UsCiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQkJCisJLyoqCisJICogRGVsZXRlcyB0aGUgcmVzb3VyY2Ugb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgYXMgc3BlY2lmaWVkIGJ5CisJICogPGNvZGU+SVJlc291cmNlLmRlbGV0ZShpbnQsIElQcm9ncmVzc01vbml0b3IpPC9jb2RlPiBidXQgZXhjbHVkaW5nIG5lc3RlZAorCSAqIHNvdXJjZSBmb2xkZXJzLgorCSAqIDxwPgorCSAqIElmIDxjb2RlPk5PX1JFU09VUkNFX01PRElGSUNBVElPTjwvY29kZT4gaXMgc3BlY2lmaWVkIGluIAorCSAqIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+IG9yIGlmIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIGV4dGVybmFsLCAKKwkgKiB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IGRlbGV0ZSB0aGUgcmVzb3VyY2UuIDxjb2RlPnVwZGF0ZVJlc291cmNlRmxhZ3M8L2NvZGU+IAorCSAqIGlzIHRoZW4gaWdub3JlZC4KKwkgKiA8L3A+PHA+CisJICogSWYgPGNvZGU+T1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRoIG9mIHRoaXMgcGFja2FnZSAKKwkgKiBmcmFnbWVudCByb290J3MgcHJvamVjdCBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggZW50cnkuCisJICogPC9wPjxwPgorCSAqIElmIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRocyBvZiBhbGwgb3RoZXIgSmF2YQorCSAqIHByb2plY3RzIHJlZmVycmluZyB0byB0aGlzIHJvb3QncyByZXNvdXJjZSBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggCisJICogZW50cmllcy4KKwkgKiA8L3A+PHA+CisJICogSWYgbm8gZmxhZ3MgaXMgc3BlY2lmaWVkIGluIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+ICh1c2luZyAKKwkgKiA8Y29kZT5JUmVzb3VyY2UuTk9ORTwvY29kZT4pLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBhcHBsaWVzOiB0aGUKKwkgKiByZXNvdXJjZSBpcyBkZWxldGVkIChpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBub3QgZXh0ZXJuYWwpIGFuZCBubworCSAqIGNsYXNzcGF0aHMgYXJlIHVwZGF0ZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSB1cGRhdGVSZXNvdXJjZUZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cworCSAqICAgKDxjb2RlPklSZXNvdXJjZS5GT1JDRTwvY29kZT4gYW5kIDxjb2RlPklSZXNvdXJjZS5LRUVQX0hJU1RPUlk8L2NvZGU+KQorCSAqIEBwYXJhbSB1cGRhdGVNb2RlbEZsYWdzIGJpdC13aXNlIG9yIG9mIHVwZGF0ZSByZXNvdXJjZSBmbGFnIGNvbnN0YW50cworCSAqICAgKDxjb2RlPk9SSUdJTkFUSU5HX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiwKKwkgKiAgIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGFuZCAKKwkgKiAgIDxjb2RlPk5PX1JFU09VUkNFX01PRElGSUNBVElPTjwvY29kZT4pCisJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCisJICogCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyByb290IGNvdWxkIG5vdCBiZSBkZWxldGVkLiBSZWFzb25zCisJICogaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIHJvb3QgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgZGVsZXRpbmcgdGhlIHJlc291cmNlIAorCSAqIG9yIHVwZGF0aW5nIGEgY2xhc3NwYXRoCisJICogPC9saT4KKwkgKiA8L3VsPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlI2RlbGV0ZQorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwl2b2lkIGRlbGV0ZShpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywgaW50IHVwZGF0ZU1vZGVsRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKIAkgKiBSZXR1cm5zIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3Mga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIuCiAJICogQSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY2FuIGNvbnRhaW4gPGNvZGU+LmphdmE8L2NvZGU+IHNvdXJjZSBmaWxlcywKQEAgLTExNyw4ICsyNjIsMTcgQEAKIAkKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1KYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0JICogCisJICogPHA+CisJICogTm9uLUphdmEgcmVzb3VyY2VzIGluY2x1ZGVzIG90aGVyIGZpbGVzIGFuZCBmb2xkZXJzIGxvY2F0ZWQgaW4gdGhlIHNhbWUKKwkgKiBkaXJlY3RvcmllcyBhcyB0aGUgY29tcGlsYXRpb24gdW5pdHMgb3IgY2xhc3MgZmlsZXMgdW5kZXIgdGhpcyBwYWNrYWdlCisJICogZnJhZ21lbnQgcm9vdC4gUmVzb3VyY2VzIGV4Y2x1ZGVkIGZyb20gdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QKKwkgKiBieSBvbmUgb3IgbW9yZSBleGNsdXNpb24gcGF0dGVybnMgb24gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNsYXNzcGF0aAorCSAqIGVudHJ5IGFyZSBjb25zaWRlcmVkIG5vbi1KYXZhIHJlc291cmNlcyBhbmQgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3VsdAorCSAqIChwb3NzaWJseSBpbiBhIGZvbGRlcikuIFRodXMgd2hlbiBhIG5lc3RlZCBzb3VyY2UgZm9sZGVyIGlzIGV4Y2x1ZGVkLCBpdCB3aWxsIGFwcGVhcgorCSAqIGluIHRoZSBub24tSmF2YSByZXNvdXJjZXMgb2YgdGhlIG91dGVyIGZvbGRlci4KKwkgKiA8L3A+CiAJICogQHJldHVybiBhbiBhcnJheSBvZiBub24tSmF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290CisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkjZ2V0RXhjbHVzaW9uUGF0dGVybnMKIAkgKi8KIAlPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkKQEAgLTE3Niw3ICszMzAsNyBAQAogCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHVuZGVybHlpbmcKIAkgKiByZXNvdXJjZSBpcyBhIGJpbmFyeSBhcmNoaXZlIChhIEpBUiBvciB6aXAgZmlsZSkuCiAJICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGFja2FnZSByYWdtZW50IHJvb3QncyB1bmRlcmx5aW5nIHJlc291cmNlIGlzIGEgYmluYXJ5IGFyY2hpdmUsIGZhbHNlIG90aGVyd2lzZQorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHVuZGVybHlpbmcgcmVzb3VyY2UgaXMgYSBiaW5hcnkgYXJjaGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlKCk7CiAJCkBAIC0xOTAsNCArMzQ0LDc3IEBACiAJICogdW5kZXJseWluZyByZXNvdXJjZSwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCiAJYm9vbGVhbiBpc0V4dGVybmFsKCk7CisJCisJLyoqCisJICogTW92ZXMgdGhlIHJlc291cmNlIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IHRvIHRoZSBkZXN0aW5hdGlvbiBwYXRoCisJICogYXMgc3BlY2lmaWVkIGJ5IDxjb2RlPklSZXNvdXJjZS5tb3ZlKElQYXRoLGludCxJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4KKwkgKiBidXQgZXhjbHVkaW5nIG5lc3RlZCBzb3VyY2UgZm9sZGVycy4KKwkgKiA8cD4KKwkgKiBJZiA8Y29kZT5OT19SRVNPVVJDRV9NT0RJRklDQVRJT048L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiBvciBpZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBleHRlcm5hbCwgCisJICogdGhpcyBvcGVyYXRpb24gZG9lc24ndCBtb3ZlIHRoZSByZXNvdXJjZS4gPGNvZGU+dXBkYXRlUmVzb3VyY2VGbGFnczwvY29kZT4gCisJICogaXMgdGhlbiBpZ25vcmVkLgorCSAqIDwvcD48cD4KKwkgKiBJZiA8Y29kZT5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSDwvY29kZT4gaXMgc3BlY2lmaWVkIGluIAorCSAqIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+LCB1cGRhdGVzIHRoZSBjbGFzc3BhdGggb2YgdGhlIAorCSAqIGRlc3RpbmF0aW9uJ3MgcHJvamVjdCAoaWYgaXQgaXMgYSBKYXZhIHByb2plY3QpLiBJZiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiAKKwkgKiBzaWJsaW5nIGlzIHNwZWNpZmllZCwgYSBjb3B5IG9mIHRoaXMgcm9vdCdzIGNsYXNzcGF0aCBlbnRyeSBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIAorCSAqIHNpYmxpbmcgb24gdGhlIGRlc3RpbmF0aW9uIHByb2plY3QncyByYXcgY2xhc3NwYXRoLiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcyAKKwkgKiBzcGVjaWZpZWQsIHRoZSBjbGFzc3BhdGggZW50cnkgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmF3IGNsYXNzcGF0aC4KKwkgKiA8L3A+PHA+CisJICogSWYgPGNvZGU+T1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRoIG9mIHRoaXMgcGFja2FnZSAKKwkgKiBmcmFnbWVudCByb290J3MgcHJvamVjdCBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggZW50cnkuCisJICogPC9wPjxwPgorCSAqIElmIDxjb2RlPk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEg8L2NvZGU+IGlzIHNwZWNpZmllZCBpbiAKKwkgKiA8Y29kZT51cGRhdGVNb2RlbEZsYWdzPC9jb2RlPiwgdXBkYXRlIHRoZSByYXcgY2xhc3NwYXRocyBvZiBhbGwgb3RoZXIgSmF2YQorCSAqIHByb2plY3RzIHJlZmVycmluZyB0byB0aGlzIHJvb3QncyByZXNvdXJjZSBieSByZW1vdmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc3BhdGggCisJICogZW50cmllcy4KKwkgKiA8L3A+PHA+CisJICogSWYgPGNvZGU+UkVQTEFDRTwvY29kZT4gaXMgc3BlY2lmaWVkIGluIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+LAorCSAqIG92ZXJ3cml0ZXMgdGhlIHJlc291cmNlIGF0IHRoZSBkZXN0aW5hdGlvbiBwYXRoIGlmIGFueS4KKwkgKiBJZiB0aGUgc2FtZSBjbGFzc3BhdGggZW50cnkgYWxyZWFkeSBleGlzdHMgb24gdGhlIGRlc3RpbmF0aW9uIHByb2plY3QncyByYXcKKwkgKiBjbGFzc3BhdGgsIHRoZW4gdGhlIHNpYmxpbmcgaXMgaWdub3JlZCBhbmQgdGhlIG5ldyBjbGFzc3BhdGggZW50cnkgcmVwbGFjZXMgdGhlIAorCSAqIGV4aXN0aW5nIG9uZS4KKwkgKiA8L3A+PHA+CisJICogSWYgbm8gZmxhZ3MgaXMgc3BlY2lmaWVkIGluIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+ICh1c2luZyAKKwkgKiA8Y29kZT5JUmVzb3VyY2UuTk9ORTwvY29kZT4pLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBhcHBsaWVzOiB0aGUKKwkgKiByZXNvdXJjZSBpcyBtb3ZlZCAoaWYgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgbm90IGV4dGVybmFsKSBhbmQgbm8KKwkgKiBjbGFzc3BhdGhzIGFyZSB1cGRhdGVkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIHBhdGgKKwkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgYml0LXdpc2Ugb3Igb2YgdXBkYXRlIGZsYWcgY29uc3RhbnRzCisJICogKDxjb2RlPklSZXNvdXJjZS5GT1JDRTwvY29kZT4sIDxjb2RlPklSZXNvdXJjZS5LRUVQX0hJU1RPUlk8L2NvZGU+IAorCSAqIGFuZCA8Y29kZT5JUmVzb3VyY2UuU0hBTExPVzwvY29kZT4pCisJICogQHBhcmFtIHVwZGF0ZU1vZGVsRmxhZ3MgYml0LXdpc2Ugb3Igb2YgdXBkYXRlIHJlc291cmNlIGZsYWcgY29uc3RhbnRzCisJICogICAoPGNvZGU+REVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+LAorCSAqICAgPGNvZGU+T1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEg8L2NvZGU+LAorCSAqICAgPGNvZGU+T1RIRVJfUkVGRVJSSU5HX1BST0pFQ1RTX0NMQVNTUEFUSDwvY29kZT4gYW5kIAorCSAqICAgPGNvZGU+Tk9fUkVTT1VSQ0VfTU9ESUZJQ0FUSU9OPC9jb2RlPikKKwkgKiBAcGFyYW0gc2libGluZyB0aGUgY2xhc3NwYXRoIGVudHJ5IGJlZm9yZSB3aGljaCBhIGNvcHkgb2YgdGhlIGNsYXNzcGF0aAorCSAqIGVudHJ5IHNob3VsZCBiZSBpbnNlcnRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2xhc3NwYXRoIGVudHJ5IHNob3VsZAorCSAqIGJlIGluc2VydGVkIGF0IHRoZSBlbmQKKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKKwkgKiAKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHJvb3QgY291bGQgbm90IGJlIG1vdmVkLiBSZWFzb25zCisJICogaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGlzIHJvb3QgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgY29weWluZyB0aGUKKwkgKiByZXNvdXJjZSBvciB1cGRhdGluZyBhIGNsYXNzcGF0aDwvbGk+CisJICogPGxpPgorCSAqIFRoZSBkZXN0aW5hdGlvbiBpcyBub3QgaW5zaWRlIGFuIGV4aXN0aW5nIHByb2plY3QgYW5kIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+CisJICogaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRIPC9jb2RlPiAKKwkgKiAoSU5WQUxJRF9ERVNUSU5BVElPTik8L2xpPgorCSAqIDxsaT4gVGhlIHNpYmxpbmcgaXMgbm90IGEgY2xhc3NwYXRoIGVudHJ5IG9uIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0J3MKKwkgKiByYXcgY2xhc3NwYXRoIChJTlZBTElEX1NJQkxJTkcpPC9saT4KKwkgKiA8bGk+IFRoZSBzYW1lIGNsYXNzcGF0aCBlbnRyeSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZGVzdGluYXRpb24gcHJvamVjdCdzCisJICogY2xhc3NwYXRoIChOQU1FX0NPTExJU0lPTikgYW5kIDxjb2RlPnVwZGF0ZU1vZGVsRmxhZ3M8L2NvZGU+CisJICogaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBhcyA8Y29kZT5SRVBMQUNFPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSNtb3ZlCisJICogQHNpbmNlIDIuMQorCSAqLworCXZvaWQgbW92ZShJUGF0aCBkZXN0aW5hdGlvbiwgaW50IHVwZGF0ZVJlc291cmNlRmxhZ3MsIGludCB1cGRhdGVNb2RlbEZsYWdzLCBJQ2xhc3NwYXRoRW50cnkgc2libGluZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYXJlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQYXJlbnQuamF2YQppbmRleCAxMTEyY2M2Li5hOWQ2NTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUGFyZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVBhcmVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEKaW5kZXggZWI0NDc3Zi4uM2ZmMzRhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUHJvYmxlbVJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lSZWdpb24uamF2YQppbmRleCA4MGU4ZDgxLi4yYmFhODU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JUmVnaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVJlZ2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZU1hbmlwdWxhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZU1hbmlwdWxhdGlvbi5qYXZhCmluZGV4IDExNzJiOGYuLjRhZDBjNjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VNYW5pcHVsYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlTWFuaXB1bGF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZVJhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmFuZ2UuamF2YQppbmRleCAzODkyM2U3Li4wZDk3MTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmFuZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmFuZ2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lTb3VyY2VSZWZlcmVuY2UuamF2YQppbmRleCAyNjg2NmJhLi4zMzBhYTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JU291cmNlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVNvdXJjZVJlZmVyZW5jZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlLmphdmEKaW5kZXggZDM2YjM1MC4uY2UwZjAyNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZS5qYXZhCkBAIC0xLDE1ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CiAKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiAKIC8qKgpAQCAtMzU0LDcgKzM1Niw3IEBACiAJICogRm9yIGNsYXNzZXMsIHRoaXMgZ2l2ZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuCiAJICogRm9yIGludGVyZmFjZXMsIHRoaXMgZ2l2ZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGludGVyZmFjZSBleHRlbmRzLgogCSAqIEFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQgaWYgdGhpcyB0eXBlIGRvZXMgbm90IGltcGxlbWVudCBvcgotCSAqIGV4dGVuZCBhbnkgaW50ZXJmYWNlcy4gRm9yIHNvdXJjZSB0eXBlcywgc2ltcGxlcyBuYW1lIGFyZSByZXR1cm5lZCwKKwkgKiBleHRlbmQgYW55IGludGVyZmFjZXMuIEZvciBzb3VyY2UgdHlwZXMsIHNpbXBsZSBuYW1lcyBhcmUgcmV0dXJuZWQsCiAJICogZm9yIGJpbmFyeSB0eXBlcywgcXVhbGlmaWVkIG5hbWVzIGFyZSByZXR1cm5lZC4KIAkgKgogCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbgpAQCAtNDczLDcgKzQ3NSwyNyBAQAogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlib29sZWFuIGlzTWVtYmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQorCS8qKgorCSAqIExvYWRzIGEgcHJldmlvdXNseSBzYXZlZCBJVHlwZUhpZXJhcmNoeSBmcm9tIGFuIGlucHV0IHN0cmVhbS4gQSB0eXBlIGhpZXJhcmNoeSBjYW4KKwkgKiBiZSBzdG9yZWQgdXNpbmcgSVR5cGVIaWVyYWNoeSNzdG9yZShPdXRwdXRTdHJlYW0pLgorCSAqIAorCSAqIE9ubHkgaGllcmFyY2hpZXMgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgbG9hZDoKKwkgKiA8dWw+CisJICogPGxpPklUeXBlI25ld1N1cGVydHlwZUhpZXJhcmNoeShJUHJvZ3Jlc3NNb25pdG9yKTwvbGk+CisJICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSUphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKTwvbGk+CisJICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvcik8L2xpPgorCSAqIDwvdT4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXQgc3RyZWFtIHdoZXJlIGhpZXJhcmNoeSB3aWxsIGJlIHJlYWQKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEByZXR1cm4gdGhlIHN0b3JlZCBoaWVyYXJjaHkKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgaGllcmFyY2h5IGNvdWxkIG5vdCBiZSByZXN0b3JlZCwgcmVhc29ucyBpbmNsdWRlOgorCSAqICAgICAgLSB0eXBlIGlzIG5vdCB0aGUgZm9jdXMgb2YgdGhlIGhpZXJhcmNoeSBvciAKKwkgKgkJLSB1bmFibGUgdG8gcmVhZCB0aGUgaW5wdXQgc3RyZWFtICh3cm9uZyBmb3JtYXQsIElPRXhjZXB0aW9uIGR1cmluZyByZWFkaW5nLCAuLi4pCisJICogQHNlZSBJVHlwZUhpZXJhcmNoeSNzdG9yZShPdXRwdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpCisJICogQHNpbmNlIDIuMQorCSAqLworCUlUeXBlSGllcmFyY2h5IGxvYWRUeXBlSGllcmFjaHkoSW5wdXRTdHJlYW0gaW5wdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAkvKioKIAkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdHlwZSBoaWVyYXJjaHkgZm9yIHRoaXMgdHlwZSBjb250YWluaW5nCiAJICogdGhpcyB0eXBlIGFuZCBhbGwgb2YgaXRzIHN1cGVydHlwZXMuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVIaWVyYXJjaHkuamF2YQppbmRleCAxZWFiNGRjLi5mZTQ4ODViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5LmphdmEKQEAgLTEsMTUgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAoraW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiAKIC8qKgpAQCAtMjc0LDQgKzI3NiwyMyBAQAogICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgogICovCiB2b2lkIHJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIoSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworLyoqCisgKiBTdG9yZXMgdGhlIHR5cGUgaGllcmFyY2h5IGluIGFuIG91dHB1dCBzdHJlYW0uIFRoaXMgc3RvcmVkIGhpZXJhcmNoeSBjYW4gYmUgbG9hZCBieQorICogSVR5cGUjbG9hZFR5cGVIaWVyYWNoeShJSmF2YVByb2plY3QsIElucHV0U3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yKS4KKyAqIExpc3RlbmVycyBvZiB0aGlzIGhpZXJhcmNoeSBhcmUgbm90IHN0b3JlZC4KKyAqIAorICogT25seSBoaWVyYXJjaGllcyBjcmVhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgc3RvcmU6CisgKiA8dWw+CisgKiA8bGk+SVR5cGUjbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IpPC9saT4KKyAqIDxsaT5JVHlwZSNuZXdUeXBlSGllcmFyY2h5KElKYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvcik8L2xpPgorICogPGxpPklUeXBlI25ld1R5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvcik8L2xpPgorICogPC91PgorICogCisgKiBAcGFyYW0gb3V0cHV0U3RyZWFtIG91dHB1dCBzdHJlYW0gd2hlcmUgdGhlIGhpZXJhcmNoeSB3aWxsIGJlIHN0b3JlZAorICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBzdG9yZSB0aGUgaGllcmFyY2h5IGluIHRoZSBvdXB1dCBzdHJlYW0KKyAqIEBzZWUgSVR5cGUjbG9hZFR5cGVIaWVyYWNoeShJbnB1dFN0cmVhbSwgSVByb2dyZXNzTW9uaXRvcikKKyAqIEBzaW5jZSAyLjEKKyAqLwordm9pZCBzdG9yZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIuamF2YQppbmRleCBjZDI0OWJiLi5mZmExYTgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9JV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCmluZGV4IDAyMzFhZGUuLjQ0YTI4NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0lXb3JraW5nQ29weS5qYXZhCkBAIC0xLDE1ICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJCi0gKiAgICBJQk0gQ29ycG9yYXRpb24sIDIwMDIvMDMvMDEtIGFkZGVkIG5vdGlvbiBvZiBzaGFyZWQgd29ya2luZyBjb3B5Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24sIDIwMDIvMjYvMDEtIGFkZGVkIG5vdGlvbiBvZiBJUHJvYmxlbVJlcXVlc3RvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CkBAIC02OCwxMyArNjYsMTYgQEAKIAkgKglhIHN1YnNlcXVlbnQgY2hhbmdlIGluIHRoZSByZXNvdXJjZTwvbGk+CiAJICogPGxpPiA8Y29kZT5mYWxzZTwvY29kZT4gLSBpbiB0aGlzIGNhc2UgYSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bjwvbGk+CiAJICogPC91bD4KLQkgKgorCSAqIDxwPgorCSAqIFNpbmNlIDIuMSwgYSB3b3JraW5nIGNvcHkgY2FuIGJlIGNyZWF0ZWQgb24gYSBub3QteWV0IGV4aXN0aW5nIGNvbXBpbGF0aW9uCisJICogdW5pdC4gSW4gcGFydGljdWxhciwgc3VjaCBhIHdvcmtpbmcgY29weSBjYW4gdGhlbiBiZSBjb21taXR0ZWQgaW4gb3JkZXIgdG8gY3JlYXRlCisJICogdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdC4KKwkgKiA8L3A+CiAJICogQHBhcmFtIGZvcmNlIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKIAkgKiBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZAogCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyB3b3JraW5nIGNvcHkgY291bGQgbm90IGNvbW1pdC4gUmVhc29ucyBpbmNsdWRlOgogCSAqIDx1bD4KLQkgKiA8bGk+IFRoZSBvcmlnaW5hbCBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KIAkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQogCSAqIDxsaT4gVGhpcyBlbGVtZW50IGlzIG5vdCBhIHdvcmtpbmcgY29weSAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQogCSAqIDxsaT4gQSB1cGRhdGUgY29uZmxpY3QgKGRlc2NyaWJlZCBhYm92ZSkgKFVQREFURV9DT05GTElDVCkKQEAgLTkxLDcgKzkyLDEwIEBACiAJICogSWYgdGhpcyB3b3JraW5nIGNvcHkgaXMgc2hhcmVkLCBpdCBpcyBkZXN0cm95ZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KIAkgKiA8Y29kZT5kZXN0cm95KCk8L2NvZGU+IGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gPGNvZGU+CiAJICogZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPi4gCi0JICogQSBSRU1PVkVEIElKYXZhRWxlbWVudERlbHRhIGlzIHRoZW4gcmVwb3J0ZWQgb24gdGhpcyB3b3JraW5nIGNvcHkuCisJICogPC9wPjxwPgorCSAqIFdoZW4gaXQgaXMgZGVzdHJveWVkLCBhIFJFTU9WRUQgSUphdmFFbGVtZW50RGVsdGEgaXMgcmVwb3J0ZWQgb24gdGhpcyAKKwkgKiB3b3JraW5nIGNvcHkuCisJICogPC9wPgogCSAqLwogCXZvaWQgZGVzdHJveSgpOwogCQpAQCAtMTkwLDEwICsxOTQsNyBAQAogCSAqIAlyZWNvbmNpbGluZyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLiBUaGUgcmVxdWVzdG9yIGNhbiBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZwogCSAqIAl0aGF0IHRoZSBjbGllbnQgaXMgbm90IGludGVyZXN0ZWQgaW4gcHJvYmxlbXMuCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWxlbWVudCBjYW4KLQkgKiAgIG5vdCBiZSBkZXRlcm1pbmVkLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KLQkgKiA8L3VsPgorCSAqICAgbm90IGJlIGRldGVybWluZWQuIAogCSAqIEByZXR1cm4gYSBzaGFyZWQgd29ya2luZyBjb3B5IG9uIHRoaXMgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSB0byBjcmVhdGUKIAkgKiB0aGUgYnVmZmVyLCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkKIAkgKiBAc2VlIElCdWZmZXJGYWN0b3J5CkBAIC0yMDksMTUgKzIxMCwxOSBAQAogCS8qKgogCSAqIFJldHVybnMgYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90CiAJICogYSB3b3JraW5nIGNvcHksIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weS4KLQkgKgorCSAqIDxwPgogCSAqIE5vdGU6IGlmIGludGVuZGluZyB0byBzaGFyZSBhIHdvcmtpbmcgY29weSBhbW9uZ3N0IHNldmVyYWwgY2xpZW50cywgdGhlbiAKIAkgKiA8Y29kZT4jZ2V0U2hhcmVkV29ya2luZ0NvcHk8L2NvZGU+IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICogCisJICogPC9wPjxwPgorCSAqIFdoZW4gdGhlIHdvcmtpbmcgY29weSBpbnN0YW5jZSBpcyBjcmVhdGVkLCBhbiBBRERFRCBJSmF2YUVsZW1lbnREZWx0YSBpcyAKKwkgKiByZXBvcnRlZCBvbiB0aGlzIHdvcmtpbmcgY29weS4KKwkgKiA8L3A+PHA+CisJICogU2luY2UgMi4xLCBhIHdvcmtpbmcgY29weSBjYW4gYmUgY3JlYXRlZCBvbiBhIG5vdC15ZXQgZXhpc3RpbmcgY29tcGlsYXRpb24KKwkgKiB1bml0LiBJbiBwYXJ0aWN1bGFyLCBzdWNoIGEgd29ya2luZyBjb3B5IGNhbiB0aGVuIGJlIGNvbW1pdHRlZCBpbiBvcmRlciB0byBjcmVhdGUKKwkgKiB0aGUgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0LgorCSAqIDwvcD4KIAkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBlbGVtZW50IGNhbgotCSAqICAgbm90IGJlIGRldGVybWluZWQuIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPiBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgotCSAqIDwvdWw+CisJICogICBub3QgYmUgZGV0ZXJtaW5lZC4gCiAJICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkgb2YgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBub3QKIAkgKiBhIHdvcmtpbmcgY29weSwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5CiAJICovCkBAIC0yMzAsMTAgKzIzNSwxNyBAQAogCSAqIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW5lZCwgdGhpcyBmYWN0b3J5IHdpbGwgYmUgcmV1c2VkLgogCSAqIFRoZSBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggdGhlIG9yaWdpbmFsJ3MgY29tcGlsYXRpb24gdW5pdCBjb250ZW50CiAJICogdXBvbiBjcmVhdGlvbi4KLQkgKgorCSAqIDxwPgogCSAqIE5vdGU6IGlmIGludGVuZGluZyB0byBzaGFyZSBhIHdvcmtpbmcgY29weSBhbW9uZ3N0IHNldmVyYWwgY2xpZW50cywgdGhlbiAKIAkgKiA8Y29kZT4jZ2V0U2hhcmVkV29ya2luZ0NvcHk8L2NvZGU+IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0JICoKKwkgKiA8L3A+PHA+CisJICogV2hlbiB0aGUgd29ya2luZyBjb3B5IGluc3RhbmNlIGlzIGNyZWF0ZWQsIGFuIEFEREVEIElKYXZhRWxlbWVudERlbHRhIGlzIAorCSAqIHJlcG9ydGVkIG9uIHRoaXMgd29ya2luZyBjb3B5LgorCSAqIDwvcD48cD4KKwkgKiBTaW5jZSAyLjEsIGEgd29ya2luZyBjb3B5IGNhbiBiZSBjcmVhdGVkIG9uIGEgbm90LXlldCBleGlzdGluZyBjb21waWxhdGlvbgorCSAqIHVuaXQuIEluIHBhcnRpY3VsYXIsIHN1Y2ggYSB3b3JraW5nIGNvcHkgY2FuIHRoZW4gYmUgY29tbWl0dGVkIGluIG9yZGVyIHRvIGNyZWF0ZQorCSAqIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQuCisJICogPC9wPgogCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyB3aGlsZSBvcGVuaW5nIHRoaXMgY29tcGlsYXRpb24gdW5pdAogCSAqICAgICAgICAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQgCiAJICogQHBhcmFtIGZhY3RvcnkgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGEgYnVmZmVyIHRoYXQgaXMgdXNlZCB0byBnZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHdvcmtpbmcgY29weQpAQCAtMjQyLDEwICsyNTQsNyBAQAogCSAqIAlyZWNvbmNpbGluZyBhcyB0aGV5IGFyZSBkaXNjb3ZlcmVkLiBUaGUgcmVxdWVzdG9yIGNhbiBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZwogCSAqIAl0aGF0IHRoZSBjbGllbnQgaXMgbm90IGludGVyZXN0ZWQgaW4gcHJvYmxlbXMuCiAJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWxlbWVudCBjYW4KLQkgKiAgIG5vdCBiZSBkZXRlcm1pbmVkLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT4gVGhpcyBKYXZhIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4KLQkgKiA8L3VsPgorCSAqICAgbm90IGJlIGRldGVybWluZWQuIAogCSAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSB0byBjcmVhdGUKIAkgKiB0aGUgYnVmZmVyLCBvciB0aGlzIGVsZW1lbnQgaWYgdGhpcyBlbGVtZW50IGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHkKIAkgKiBAc2luY2UgMi4wCkBAIC0zNDYsNCArMzU1LDQgQEAKIAkgKiA8L3VsPgogCSAqLwogCXZvaWQgcmVzdG9yZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvbnZlbnRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29udmVudGlvbnMuamF2YQppbmRleCBlNDg5YzBiLi44ZTY4YTI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29udmVudGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29udmVudGlvbnMuamF2YQpAQCAtMSwxNyArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIApAQCAtMjQsMTAgKzIzLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbFN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwpAQCAtNDAsNDkyICs0MCw2NDAgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb252ZW50aW9ucyB7CisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyIGZnRG90PSAnLic7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZnSkFWQT0gIkpBVkEiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2Nhbm5lciBTQ0FOTkVSID0gbmV3IFNjYW5uZXIoKTsKLS8qKgotICogTm90IGluc3RhbnRpYWJsZS4KLSAqLwotcHJpdmF0ZSBKYXZhQ29udmVudGlvbnMoKSB7fQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBwYXRocyBhcmUgY29uc2lkZXJlZAotICogdG8gb3ZlcmxhcC4KLSAqIDxwPgotICogVHdvIHJvb3QgcGF0aHMgb3ZlcmxhcCBpZiBvbmUgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLCBvciB0aGV5IHBvaW50IHRvCi0gKiB0aGUgc2FtZSBsb2NhdGlvbi4gSG93ZXZlciwgYSBKQVIgaXMgYWxsb3dlZCB0byBiZSBuZXN0ZWQgaW4gYSByb290LgotICoKLSAqIEBwYXJhbSByb290UGF0aDEgdGhlIGZpcnN0IHJvb3QgcGF0aAotICogQHBhcmFtIHJvb3RQYXRoMiB0aGUgc2Vjb25kIHJvb3QgcGF0aAotICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcGF0aHMgYXJlIGNvbnNpZGVyZWQgdG8gb3ZlcmxhcCwgZmFsc2Ugb3RoZXJ3aXNlCi0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc092ZXJsYXBwaW5nUm9vdHMoSVBhdGggcm9vdFBhdGgxLCBJUGF0aCByb290UGF0aDIpIHsKLQlpZiAocm9vdFBhdGgxID09IG51bGwgfHwgcm9vdFBhdGgyID09IG51bGwpIHsKLQkJcmV0dXJuIGZhbHNlOworCisJLyoqCisJICogTm90IGluc3RhbnRpYWJsZS4KKwkgKi8KKwlwcml2YXRlIEphdmFDb252ZW50aW9ucygpIHt9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcmd1bWVudCBwYXRocyB3aGljaCBpcyBzdHJpY3RseSBlbmNsb3NpbmcgdGhlIHBhdGggdG8gY2hlY2sKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZkVuY2xvc2luZ1BhdGgoSVBhdGggY2hlY2tlZFBhdGgsIElQYXRoW10gcGF0aHMsIGludCBwYXRoQ291bnQpIHsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhDb3VudDsgaSsrKXsKKwkJCWlmIChwYXRoc1tpXS5lcXVhbHMoY2hlY2tlZFBhdGgpKSBjb250aW51ZTsKKwkJCWlmIChwYXRoc1tpXS5pc1ByZWZpeE9mKGNoZWNrZWRQYXRoKSkgcmV0dXJuIGk7CisJCX0KKwkJcmV0dXJuIC0xOwogCX0KLQlTdHJpbmcgZXh0ZW5zaW9uMSA9IHJvb3RQYXRoMS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JU3RyaW5nIGV4dGVuc2lvbjIgPSByb290UGF0aDIuZ2V0RmlsZUV4dGVuc2lvbigpOwotCVN0cmluZyBqYXJFeHRlbnNpb24gPSAiSkFSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyB6aXBFeHRlbnNpb24gPSAiWklQIjsgLy8kTk9OLU5MUy0xJAotCWlmIChleHRlbnNpb24xICE9IG51bGwgJiYgKGV4dGVuc2lvbjEuZXF1YWxzSWdub3JlQ2FzZShqYXJFeHRlbnNpb24pIHx8IGV4dGVuc2lvbjEuZXF1YWxzSWdub3JlQ2FzZSh6aXBFeHRlbnNpb24pKSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfSAKLQlpZiAoZXh0ZW5zaW9uMiAhPSBudWxsICYmIChleHRlbnNpb24yLmVxdWFsc0lnbm9yZUNhc2UoamFyRXh0ZW5zaW9uKSB8fCBleHRlbnNpb24yLmVxdWFsc0lnbm9yZUNhc2UoemlwRXh0ZW5zaW9uKSkpIHsKLQkJcmV0dXJuIGZhbHNlOworCQorCS8qCisJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGFyZ3VtZW50IHBhdGhzIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBwYXRoIHRvIGNoZWNrCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZNYXRjaGluZ1BhdGgoSVBhdGggY2hlY2tlZFBhdGgsIElQYXRoW10gcGF0aHMsIGludCBwYXRoQ291bnQpIHsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhDb3VudDsgaSsrKXsKKwkJCWlmIChwYXRoc1tpXS5lcXVhbHMoY2hlY2tlZFBhdGgpKSByZXR1cm4gaTsKKwkJfQorCQlyZXR1cm4gLTE7CiAJfQotCXJldHVybiByb290UGF0aDEuaXNQcmVmaXhPZihyb290UGF0aDIpIHx8IHJvb3RQYXRoMi5pc1ByZWZpeE9mKHJvb3RQYXRoMSk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGN1cnJlbnQgaWRlbnRpZmllciBleHRyYWN0ZWQgYnkgdGhlIHNjYW5uZXIgKGllLiB3aXRob3V0IHVuaWNvZGVzKQotICogZnJvbSB0aGUgZ2l2ZW4gaWQuCi0gKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpZCB3YXMgbm90IHZhbGlkLgotICovCi1wcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgY2hhcltdIHNjYW5uZWRJZGVudGlmaWVyKFN0cmluZyBpZCkgewotCWlmIChpZCA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOworCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJndW1lbnQgcGF0aHMgd2hpY2ggaXMgc3RyaWN0bHkgbmVzdGVkIGluc2lkZSB0aGUgcGF0aCB0byBjaGVjaworCSAqLworCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mTmVzdGVkUGF0aChJUGF0aCBjaGVja2VkUGF0aCwgSVBhdGhbXSBwYXRocywgaW50IHBhdGhDb3VudCkgeworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aENvdW50OyBpKyspeworCQkJaWYgKGNoZWNrZWRQYXRoLmVxdWFscyhwYXRoc1tpXSkpIGNvbnRpbnVlOworCQkJaWYgKGNoZWNrZWRQYXRoLmlzUHJlZml4T2YocGF0aHNbaV0pKSByZXR1cm4gaTsKKwkJfQorCQlyZXR1cm4gLTE7CiAJfQotCVN0cmluZyB0cmltbWVkID0gaWQudHJpbSgpOwotCWlmICghdHJpbW1lZC5lcXVhbHMoaWQpKSB7Ci0JCXJldHVybiBudWxsOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcGF0aHMgYXJlIGNvbnNpZGVyZWQKKwkgKiB0byBvdmVybGFwLgorCSAqIDxwPgorCSAqIFR3byByb290IHBhdGhzIG92ZXJsYXAgaWYgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgb3IgdGhleSBwb2ludCB0bworCSAqIHRoZSBzYW1lIGxvY2F0aW9uLiBIb3dldmVyLCBhIEpBUiBpcyBhbGxvd2VkIHRvIGJlIG5lc3RlZCBpbiBhIHJvb3QuCisJICoKKwkgKiBAcGFyYW0gcm9vdFBhdGgxIHRoZSBmaXJzdCByb290IHBhdGgKKwkgKiBAcGFyYW0gcm9vdFBhdGgyIHRoZSBzZWNvbmQgcm9vdCBwYXRoCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgcGF0aHMgYXJlIGNvbnNpZGVyZWQgdG8gb3ZlcmxhcCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQGRlcHJlY2F0ZWQgT3ZlcmxhcHBpbmcgcm9vdHMgYXJlIGFsbG93ZWQgaW4gMi4xCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3ZlcmxhcHBpbmdSb290cyhJUGF0aCByb290UGF0aDEsIElQYXRoIHJvb3RQYXRoMikgeworCQlpZiAocm9vdFBhdGgxID09IG51bGwgfHwgcm9vdFBhdGgyID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTdHJpbmcgZXh0ZW5zaW9uMSA9IHJvb3RQYXRoMS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCVN0cmluZyBleHRlbnNpb24yID0gcm9vdFBhdGgyLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJU3RyaW5nIGphckV4dGVuc2lvbiA9ICJKQVIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyB6aXBFeHRlbnNpb24gPSAiWklQIjsgLy8kTk9OLU5MUy0xJAorCQlpZiAoZXh0ZW5zaW9uMSAhPSBudWxsICYmIChleHRlbnNpb24xLmVxdWFsc0lnbm9yZUNhc2UoamFyRXh0ZW5zaW9uKSB8fCBleHRlbnNpb24xLmVxdWFsc0lnbm9yZUNhc2UoemlwRXh0ZW5zaW9uKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSAKKwkJaWYgKGV4dGVuc2lvbjIgIT0gbnVsbCAmJiAoZXh0ZW5zaW9uMi5lcXVhbHNJZ25vcmVDYXNlKGphckV4dGVuc2lvbikgfHwgZXh0ZW5zaW9uMi5lcXVhbHNJZ25vcmVDYXNlKHppcEV4dGVuc2lvbikpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHJvb3RQYXRoMS5pc1ByZWZpeE9mKHJvb3RQYXRoMikgfHwgcm9vdFBhdGgyLmlzUHJlZml4T2Yocm9vdFBhdGgxKTsKIAl9Ci0JdHJ5IHsKLQkJU0NBTk5FUi5zZXRTb3VyY2UoaWQudG9DaGFyQXJyYXkoKSk7Ci0JCWludCB0b2tlbiA9IFNDQU5ORVIuZ2V0TmV4dFRva2VuKCk7Ci0JCWNoYXJbXSBjdXJyZW50SWRlbnRpZmllcjsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgaWRlbnRpZmllciBleHRyYWN0ZWQgYnkgdGhlIHNjYW5uZXIgKGllLiB3aXRob3V0IHVuaWNvZGVzKQorCSAqIGZyb20gdGhlIGdpdmVuIGlkLgorCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlkIHdhcyBub3QgdmFsaWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGNoYXJbXSBzY2FubmVkSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyB0cmltbWVkID0gaWQudHJpbSgpOworCQlpZiAoIXRyaW1tZWQuZXF1YWxzKGlkKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KIAkJdHJ5IHsKLQkJCWN1cnJlbnRJZGVudGlmaWVyID0gU0NBTk5FUi5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IG5leHRUb2tlbj0gU0NBTk5FUi5nZXROZXh0VG9rZW4oKTsKLQkJaWYgKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllciAKLQkJCSYmIG5leHRUb2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRgotCQkJJiYgU0NBTk5FUi5zdGFydFBvc2l0aW9uID09IFNDQU5ORVIuc291cmNlLmxlbmd0aCkgeyAvLyB0byBoYW5kbGUgY2FzZSB3aGVyZSB3ZSBoYWQgYW4gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIAotCQkJCQkJCQkJCQkJCQkJICAgICAvLyB3aGlsZSByZWFkaW5nIHRoZSBsYXN0IHRva2VuCi0JCQlyZXR1cm4gY3VycmVudElkZW50aWZpZXI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQljYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBuYW1lLgotICogQSBjb21waWxhdGlvbiB1bml0IG5hbWUgbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiA8dWw+Ci0gKiA8bGk+IGl0IG11c3Qgbm90IGJlIG51bGwKLSAqIDxsaT4gaXQgbXVzdCBpbmNsdWRlIHRoZSA8Y29kZT4iLmphdmEiPC9jb2RlPiBzdWZmaXgKLSAqIDxsaT4gaXRzIHByZWZpeCBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllcgotICogPGxpPiBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkIAotICoJCSAgIG9uIHRoZSBmaWxlIHN5c3RlbSBvbiB3aGljaCB3b3Jrc3BhY2Ugcm9vdCBpcyBsb2NhdGVkLgotICogPC91bD4KLSAqIDwvcD4KLSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgY29tcGlsYXRpb24gdW5pdAotICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0gKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBjb21waWxhdGlvbiB1bml0IG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKLSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKLSAqLwotcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZShTdHJpbmcgbmFtZSkgewotCWlmIChuYW1lID09IG51bGwpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnVuaXQubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JU3RyaW5nIGlkZW50aWZpZXI7Ci0JaW50IGluZGV4OwotCWluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCWlmIChpbmRleCA9PSAtMSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlpZGVudGlmaWVyID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpOwotCWlmICghc3RhdHVzLmlzT0soKSkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQlpZiAoIVV0aWwuaXNKYXZhRmlsZU5hbWUobmFtZSkpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnVuaXQubm90SmF2YU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0Jc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRklMRSk7Ci0JaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBnaXZlbiAuY2xhc3MgZmlsZSBuYW1lLgotICogQSAuY2xhc3MgZmlsZSBuYW1lIG11c3Qgb2JleSB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogPHVsPgotICogPGxpPiBpdCBtdXN0IG5vdCBiZSBudWxsCi0gKiA8bGk+IGl0IG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+Ii5jbGFzcyI8L2NvZGU+IHN1ZmZpeAotICogPGxpPiBpdHMgcHJlZml4IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCi0gKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCi0gKgkJICAgb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCi0gKiA8L3VsPgotICogPC9wPgotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSAuY2xhc3MgZmlsZQotICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0gKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSAuY2xhc3MgZmlsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCi0gKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUNsYXNzRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5jbGFzc0ZpbGUubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JU3RyaW5nIGlkZW50aWZpZXI7Ci0JaW50IGluZGV4OwotCWluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCWlmIChpbmRleCA9PSAtMSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uY2xhc3NGaWxlLm5vdEphdmFOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCWlkZW50aWZpZXIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcik7Ci0JaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCWlmICghVXRpbC5pc0NsYXNzRmlsZU5hbWUobmFtZSkpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmNsYXNzRmlsZS5ub3RDbGFzc0ZpbGVOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCXN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmFtZSwgSVJlc291cmNlLkZJTEUpOwotCWlmICghc3RhdHVzLmlzT0soKSkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmllbGQgbmFtZS4KLSAqIDxwPgotICogU3ludGF4IG9mIGEgZmllbGQgbmFtZSBjb3JyZXNwb25kcyB0byBWYXJpYWJsZURlY2xhcmF0b3JJZCAoSkxTMiA4LjMpLgotICogRm9yIGV4YW1wbGUsIDxjb2RlPiJ4IjwvY29kZT4uCi0gKgotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBmaWVsZAotICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0gKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBmaWVsZCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCi0gKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCi0gKi8KLXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUZpZWxkTmFtZShTdHJpbmcgbmFtZSkgewotCXJldHVybiB2YWxpZGF0ZUlkZW50aWZpZXIobmFtZSk7Ci19Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBKYXZhIGlkZW50aWZpZXIuCi0gKiBUaGUgaWRlbnRpZmllciBtdXN0IGhhdmUgdGhlIHNhbWUgc3BlbGxpbmcgYXMgYSBKYXZhIGtleXdvcmQsCi0gKiBib29sZWFuIGxpdGVyYWwgKDxjb2RlPiJ0cnVlIjwvY29kZT4sIDxjb2RlPiJmYWxzZSI8L2NvZGU+KSwgb3IgbnVsbCBsaXRlcmFsICg8Y29kZT4ibnVsbCI8L2NvZGU+KS4KLSAqIFNlZSBzZWN0aW9uIDMuOCBvZiB0aGUgPGVtPkphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb248L2VtPiAoSkxTMikuCi0gKiBBIHZhbGlkIGlkZW50aWZpZXIgY2FuIGFjdCBhcyBhIHNpbXBsZSB0eXBlIG5hbWUsIG1ldGhvZCBuYW1lIG9yIGZpZWxkIG5hbWUuCi0gKgotICogQHBhcmFtIGlkIHRoZSBKYXZhIGlkZW50aWZpZXIKLSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotICoJCXRoZSBnaXZlbiBpZGVudGlmaWVyIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLCBvdGhlcndpc2UgYSBzdGF0dXMgCi0gKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBpZGVudGlmaWVyCi0gKi8KLXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0JaWYgKHNjYW5uZWRJZGVudGlmaWVyKGlkKSAhPSBudWxsKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfSBlbHNlIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLmlsbGVnYWxJZGVudGlmaWVyIiwgaWQpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLS8qKgotICogVmFsaWRhdGUgdGhlIGdpdmVuIGltcG9ydCBkZWNsYXJhdGlvbiBuYW1lLgotICogPHA+Ci0gKiBUaGUgbmFtZSBvZiBhbiBpbXBvcnQgY29ycmVzcG9uZHMgdG8gYSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gKiBvciBhbiBvbi1kZW1hbmQgcGFja2FnZSBuYW1lIGFzIGRlZmluZWQgYnkgSW1wb3J0RGVjbGFyYXRpb24gKEpMUzIgNy41KS4KLSAqIEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS51dGlsLioiPC9jb2RlPiBvciA8Y29kZT4iamF2YS51dGlsLkhhc2h0YWJsZSI8L2NvZGU+LgotICoKLSAqIEBwYXJhbSBuYW1lIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24KLSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGFuIGltcG9ydCBkZWNsYXJhdGlvbiwgb3RoZXJ3aXNlIGEgc3RhdHVzIAotICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICovCi1wdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVJbXBvcnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgewotCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbXBvcnQubnVsbEltcG9ydCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0JaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsKLQkJaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAyKSA9PSAnLicpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVBhY2thZ2VOYW1lKG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaW1wb3J0LnVucXVhbGlmaWVkSW1wb3J0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JcmV0dXJuIHZhbGlkYXRlUGFja2FnZU5hbWUobmFtZSk7Ci19Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZSwgZWl0aGVyIHNpbXBsZSBvciBxdWFsaWZpZWQuCi0gKiBGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEubGFuZy5PYmplY3QiPC9jb2RlPiwgb3IgPGNvZGU+Ik9iamVjdCI8L2NvZGU+LgotICogPHA+Ci0gKgotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB0eXBlCi0gKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIEphdmEgdHlwZSBuYW1lLCAKLSAqICAgICAgYSBzdGF0dXMgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuV0FSTklORzwvY29kZT4KLSAqCQlpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgCi0gKiAgICAgIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggCi0gKiAgICAgIHRoZSBuYW1lCi0gKi8KLXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgbmFtZSkgewotCWlmIChuYW1lID09IG51bGwpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JU3RyaW5nIHRyaW1tZWQgPSBuYW1lLnRyaW0oKTsKLQlpZiAoIW5hbWUuZXF1YWxzKHRyaW1tZWQpKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLm5hbWVXaXRoQmxhbmtzIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQljaGFyW10gc2Nhbm5lZElEOwotCWlmIChpbmRleCA9PSAtMSkgewotCQkvLyBzaW1wbGUgbmFtZQotCQlzY2FubmVkSUQgPSBzY2FubmVkSWRlbnRpZmllcihuYW1lKTsKLQl9IGVsc2UgewotCQkvLyBxdWFsaWZpZWQgbmFtZQotCQlTdHJpbmcgcGtnID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZVBhY2thZ2VOYW1lKHBrZyk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkudHJpbSgpOwotCQlzY2FubmVkSUQgPSBzY2FubmVkSWRlbnRpZmllcih0eXBlKTsKLQl9Ci0KLQlpZiAoc2Nhbm5lZElEICE9IG51bGwpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5ldyBTdHJpbmcoc2Nhbm5lZElEKSwgSVJlc291cmNlLkZJTEUpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaWYgKENoYXJPcGVyYXRpb24uY29udGFpbnMoJyQnLCBzY2FubmVkSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmRvbGxhck5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKHNjYW5uZWRJRC5sZW5ndGggPiAwICYmIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzY2FubmVkSURbMF0pKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5sb3dlcmNhc2VOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9IGVsc2UgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5pbnZhbGlkTmFtZSIsIG5hbWUpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLS8qKgotICogVmFsaWRhdGUgdGhlIGdpdmVuIG1ldGhvZCBuYW1lLgotICogVGhlIHNwZWNpYWwgbmFtZXMgIiZsdDtpbml0Jmd0OyIgYW5kICImbHQ7Y2xpbml0Jmd0OyIgYXJlIG5vdCB2YWxpZC4KLSAqIDxwPgotICogVGhlIHN5bnRheCBmb3IgYSBtZXRob2QgIG5hbWUgaXMgZGVmaW5lZCBieSBJZGVudGlmaWVyCi0gKiBvZiBNZXRob2REZWNsYXJhdG9yIChKTFMyIDguNCkuIEZvciBleGFtcGxlICJwcmludGxuIi4KLSAqCi0gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIG1ldGhvZAotICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCi0gKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBtZXRob2QgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAotICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICovCi1wdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVNZXRob2ROYW1lKFN0cmluZyBuYW1lKSB7Ci0JcmV0dXJuIHZhbGlkYXRlSWRlbnRpZmllcihuYW1lKTsKLX0KLS8qKgotICogVmFsaWRhdGUgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KLSAqIDxwPgotICogVGhlIHN5bnRheCBvZiBhIHBhY2thZ2UgbmFtZSBjb3JyZXNwb25kcyB0byBQYWNrYWdlTmFtZSBhcwotICogZGVmaW5lZCBieSBQYWNrYWdlRGVjbGFyYXRpb24gKEpMUzIgNy40KS4gRm9yIGV4YW1wbGUsIDxjb2RlPiJqYXZhLmxhbmciPC9jb2RlPi4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZSBnaXZlbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgcGFja2FnZSBuYW1lIChpZS4gYXR0ZW1wdGluZyB0bwotICogdmFsaWRhdGUgdGhlIGRlZmF1bHQgcGFja2FnZSB3aWxsIHJldHVybiBhbiBlcnJvciBzdGF0dXMuKQotICogQWxzbyBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkIAotICogb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCi0gKgotICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBwYWNrYWdlCi0gKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKLSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIHBhY2thZ2UgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAotICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICovCi1wdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVQYWNrYWdlTmFtZShTdHJpbmcgbmFtZSkgewotCWlmIChuYW1lID09IG51bGwpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGxlbmd0aDsKLQlpZiAoKGxlbmd0aCA9IG5hbWUubGVuZ3RoKCkpID09IDApIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZW1wdHlOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCWlmIChuYW1lLmNoYXJBdCgwKSA9PSBmZ0RvdCB8fCBuYW1lLmNoYXJBdChsZW5ndGgtMSkgPT0gZmdEb3QpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZG90TmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShuYW1lLmNoYXJBdCgwKSkgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShuYW1lLmNoYXJBdChuYW1lLmxlbmd0aCgpIC0gMSkpKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5wYWNrYWdlLm5hbWVXaXRoQmxhbmtzIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCWludCBkb3QgPSAwOwotCXdoaWxlIChkb3QgIT0gLTEgJiYgZG90IDwgbGVuZ3RoLTEpIHsKLQkJaWYgKChkb3QgPSBuYW1lLmluZGV4T2YoZmdEb3QsIGRvdCsxKSkgIT0gLTEgJiYgZG90IDwgbGVuZ3RoLTEgJiYgbmFtZS5jaGFyQXQoZG90KzEpID09IGZnRG90KSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5jb25zZWN1dGl2ZURvdHNOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQlTQ0FOTkVSLnNldFNvdXJjZShpZC50b0NoYXJBcnJheSgpKTsKKwkJCWludCB0b2tlbiA9IFNDQU5ORVIuZ2V0TmV4dFRva2VuKCk7CisJCQljaGFyW10gY3VycmVudElkZW50aWZpZXI7CisJCQl0cnkgeworCQkJCWN1cnJlbnRJZGVudGlmaWVyID0gU0NBTk5FUi5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOworCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KLQl9Ci0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCBuZXcgU3RyaW5nKG5ldyBjaGFyW10ge2ZnRG90fSkpOwotCWJvb2xlYW4gZmlyc3RUb2tlbiA9IHRydWU7Ci0Jd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJdHlwZU5hbWUgPSB0eXBlTmFtZS50cmltKCk7IC8vIGdyYW1tYXIgYWxsb3dzIHNwYWNlcwotCQljaGFyW10gc2Nhbm5lZElEID0gc2Nhbm5lZElkZW50aWZpZXIodHlwZU5hbWUpOwotCQlpZiAoc2Nhbm5lZElEID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbGxlZ2FsSWRlbnRpZmllciIsIHR5cGVOYW1lKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCWludCBuZXh0VG9rZW49IFNDQU5ORVIuZ2V0TmV4dFRva2VuKCk7CisJCQlpZiAodG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lSWRlbnRpZmllciAKKwkJCQkmJiBuZXh0VG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GCisJCQkJJiYgU0NBTk5FUi5zdGFydFBvc2l0aW9uID09IFNDQU5ORVIuc291cmNlLmxlbmd0aCkgeyAvLyB0byBoYW5kbGUgY2FzZSB3aGVyZSB3ZSBoYWQgYW4gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIAorCQkJCQkJCQkJCQkJCQkJCSAgICAgLy8gd2hpbGUgcmVhZGluZyB0aGUgbGFzdCB0b2tlbgorCQkJCXJldHVybiBjdXJyZW50SWRlbnRpZmllcjsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKG5ldyBTdHJpbmcoc2Nhbm5lZElEKSwgSVJlc291cmNlLkZPTERFUik7CisJCWNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBuYW1lLgorCSAqIEEgY29tcGlsYXRpb24gdW5pdCBuYW1lIG11c3Qgb2JleSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCSAqIDx1bD4KKwkgKiA8bGk+IGl0IG11c3Qgbm90IGJlIG51bGwKKwkgKiA8bGk+IGl0IG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+Ii5qYXZhIjwvY29kZT4gc3VmZml4CisJICogPGxpPiBpdHMgcHJlZml4IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCisJICogPGxpPiBpdCBtdXN0IG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzIG9yIHN1YnN0cmluZ3MgdGhhdCBhcmUgbm90IHZhbGlkIAorCSAqCQkgICBvbiB0aGUgZmlsZSBzeXN0ZW0gb24gd2hpY2ggd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZC4KKwkgKiA8L3VsPgorCSAqIDwvcD4KKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBjb21waWxhdGlvbiB1bml0IG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZShTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICghVXRpbC5pc0phdmFGaWxlTmFtZShuYW1lKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnVuaXQubm90SmF2YU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmcgaWRlbnRpZmllcjsKKwkJaW50IGluZGV4OworCQlpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGluZGV4ID09IC0xKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udW5pdC5ub3RKYXZhTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlkZW50aWZpZXIgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpOwogCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJaWYgKGZpcnN0VG9rZW4gJiYgc2Nhbm5lZElELmxlbmd0aCA+IDAgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHNjYW5uZWRJRFswXSkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UudXBwZXJjYXNlTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQlzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCWZpcnN0VG9rZW4gPSBmYWxzZTsKKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIAl9Ci0JcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLX0KIAotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24sIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiA8dWw+Ci0gKiAgIDxsaT4gTm8gZHVwbGljYXRlIHBhdGggYW1vbmdzdCBjbGFzc3BhdGggZW50cmllcy4KLSAqICAgPGxpPiBPdXRwdXQgbG9jYXRpb24gcGF0aCBpcyBub3QgbnVsbCwgaXQgaXMgYWJzb2x1dGUgYW5kIGxvY2F0ZWQgaW5zaWRlIHRoZSBwcm9qZWN0LgotICogICA8bGk+IEEgcHJvamVjdCBjYW5ub3QgZGVwZW5kIG9uIGl0c2VsZiBkaXJlY3RseS4KLSAqICAgPGxpPiBTb3VyY2UvbGlicmFyeSBmb2xkZXJzIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBiaW5hcnkgb3V0cHV0LCBhbmQgcmVjaXByb2NhbGx5LgotICogICA8bGk+IFNvdXJjZS9saWJyYXJ5IGZvbGRlcnMgY2Fubm90IGJlIG5lc3RlZCBpbiBlYWNoIG90aGVyLgotICogICA8bGk+IE91dHB1dCBsb2NhdGlvbiBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgcHJvamVjdC4KLSAqIDwvdWw+Ci0gKiAKLSAqICBOb3RlIHRoYXQgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGFyZSBub3QgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkuIE9ubHkgYm91bmQgdmFyaWFibGVzIG9yIGNvbnRhaW5lcnMgYXJlIGNvbnNpZGVyZWQgCi0gKiAgaW4gdGhlIGNoZWNraW5nIHByb2Nlc3MgKHRoaXMgYWxsb3dzIHRvIHBlcmZvcm0gYSBjb25zaXN0ZW5jeSBjaGVjayBvbiBhIGNsYXNzcGF0aCB3aGljaCBoYXMgcmVmZXJlbmNlcyB0bwotICogIHlldCBub24gZXhpc3RpbmcgcHJvamVjdHMsIGZvbGRlcnMsIC4uLikuCi0gKiAKLSAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0Ci0gKiBAcGFyYW0gY2xhc3NwYXRoIGEgZ2l2ZW4gY2xhc3NwYXRoCi0gKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24gYSBnaXZlbiBvdXRwdXQgbG9jYXRpb24KLSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotICoJCXRoZSBnaXZlbiBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiBhcmUgY29tcGF0aWJsZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAotICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgY2xhc3NwYXRoIG9yIG91dHB1dCBsb2NhdGlvbgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgc3RhdGljIElKYXZhTW9kZWxTdGF0dXMgdmFsaWRhdGVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElQYXRoIG91dHB1dExvY2F0aW9uKSB7Ci0KLQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCUlQYXRoIHByb2plY3RQYXRoPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0KLQkvKiB2YWxpZGF0ZSBvdXRwdXQgbG9jYXRpb24gKi8KLQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5VTExfUEFUSCk7Ci0JfQotCWlmIChvdXRwdXRMb2NhdGlvbi5pc0Fic29sdXRlKCkpIHsKLQkJaWYgKCFwcm9qZWN0UGF0aC5pc1ByZWZpeE9mKG91dHB1dExvY2F0aW9uKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5QQVRIX09VVFNJREVfUFJPSkVDVCwgamF2YVByb2plY3QsIG91dHB1dExvY2F0aW9uLnRvU3RyaW5nKCkpOworCS8qKgorCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiAuY2xhc3MgZmlsZSBuYW1lLgorCSAqIEEgLmNsYXNzIGZpbGUgbmFtZSBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZyBydWxlczoKKwkgKiA8dWw+CisJICogPGxpPiBpdCBtdXN0IG5vdCBiZSBudWxsCisJICogPGxpPiBpdCBtdXN0IGluY2x1ZGUgdGhlIDxjb2RlPiIuY2xhc3MiPC9jb2RlPiBzdWZmaXgKKwkgKiA8bGk+IGl0cyBwcmVmaXggbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKKwkgKiA8bGk+IGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisJICoJCSAgIG9uIHRoZSBmaWxlIHN5c3RlbSBvbiB3aGljaCB3b3Jrc3BhY2Ugcm9vdCBpcyBsb2NhdGVkLgorCSAqIDwvdWw+CisJICogPC9wPgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgLmNsYXNzIGZpbGUKKwkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSAuY2xhc3MgZmlsZSBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVDbGFzc0ZpbGVOYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5jbGFzc0ZpbGUubnVsbE5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKIAkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVMQVRJVkVfUEFUSCwgb3V0cHV0TG9jYXRpb24pOworCQlpZiAoIVV0aWwuaXNDbGFzc0ZpbGVOYW1lKG5hbWUpKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uY2xhc3NGaWxlLm5vdENsYXNzRmlsZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmcgaWRlbnRpZmllcjsKKwkJaW50IGluZGV4OworCQlpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGluZGV4ID09IC0xKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uY2xhc3NGaWxlLm5vdEphdmFOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWRlbnRpZmllciA9IG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcik7CisJCWlmICghc3RhdHVzLmlzT0soKSkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CiAJfQogCi0JYm9vbGVhbiBhbGxvd05lc3RpbmdJbk91dHB1dCA9IGZhbHNlOwotCWJvb2xlYW4gaGFzU291cmNlID0gZmFsc2U7CisJLyoqCisJICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpZWxkIG5hbWUuCisJICogPHA+CisJICogU3ludGF4IG9mIGEgZmllbGQgbmFtZSBjb3JyZXNwb25kcyB0byBWYXJpYWJsZURlY2xhcmF0b3JJZCAoSkxTMiA4LjMpLgorCSAqIEZvciBleGFtcGxlLCA8Y29kZT4ieCI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBmaWVsZAorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIGZpZWxkIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRmllbGROYW1lKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiB2YWxpZGF0ZUlkZW50aWZpZXIobmFtZSk7CisJfQogCi0JLy8gdG9sZXJhdGUgbnVsbCBwYXRoLCBpdCB3aWxsIGJlIHJlc2V0IHRvIGRlZmF1bHQKLQlpbnQgbGVuZ3RoID0gY2xhc3NwYXRoID09IG51bGwgPyAwIDogY2xhc3NwYXRoLmxlbmd0aDsgCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGdpdmVuIEphdmEgaWRlbnRpZmllci4KKwkgKiBUaGUgaWRlbnRpZmllciBtdXN0IGhhdmUgdGhlIHNhbWUgc3BlbGxpbmcgYXMgYSBKYXZhIGtleXdvcmQsCisJICogYm9vbGVhbiBsaXRlcmFsICg8Y29kZT4idHJ1ZSI8L2NvZGU+LCA8Y29kZT4iZmFsc2UiPC9jb2RlPiksIG9yIG51bGwgbGl0ZXJhbCAoPGNvZGU+Im51bGwiPC9jb2RlPikuCisJICogU2VlIHNlY3Rpb24gMy44IG9mIHRoZSA8ZW0+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbjwvZW0+IChKTFMyKS4KKwkgKiBBIHZhbGlkIGlkZW50aWZpZXIgY2FuIGFjdCBhcyBhIHNpbXBsZSB0eXBlIG5hbWUsIG1ldGhvZCBuYW1lIG9yIGZpZWxkIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gaWQgdGhlIEphdmEgaWRlbnRpZmllcgorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorCSAqCQl0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGlkZW50aWZpZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVJZGVudGlmaWVyKFN0cmluZyBpZCkgeworCQlpZiAoc2Nhbm5lZElkZW50aWZpZXIoaWQpICE9IG51bGwpIHsKKwkJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIiLCBpZCksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CiAKLQlBcnJheUxpc3QgcmVzb2x2ZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeSByYXdFbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJc3dpdGNoKHJhd0VudHJ5LmdldEVudHJ5S2luZCgpKXsKLQkJCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkocmF3RW50cnkpOwotCQkJCWlmIChyZXNvbHZlZEVudHJ5ICE9IG51bGwpewotCQkJCQkvLyBjaGVjayBpZiBhbnkgc291cmNlIGVudHJpZXMgY29pbmNpZGF0ZXMgd2l0aCBiaW5hcnkgb3V0cHV0IC0gaW4gd2hpY2ggY2FzZSBuZXN0aW5nIGluc2lkZSBvdXRwdXQgaXMgbGVnYWwKLQkJCQkJaWYgKHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIGFsbG93TmVzdGluZ0luT3V0cHV0ID0gdHJ1ZTsKLQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKKwkvKioKKwkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIG5hbWUuCisJICogPHA+CisJICogVGhlIG5hbWUgb2YgYW4gaW1wb3J0IGNvcnJlc3BvbmRzIHRvIGEgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQorCSAqIG9yIGFuIG9uLWRlbWFuZCBwYWNrYWdlIG5hbWUgYXMgZGVmaW5lZCBieSBJbXBvcnREZWNsYXJhdGlvbiAoSkxTMiA3LjUpLgorCSAqIEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS51dGlsLioiPC9jb2RlPiBvciA8Y29kZT4iamF2YS51dGlsLkhhc2h0YWJsZSI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIGltcG9ydCBkZWNsYXJhdGlvbgorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhbiBpbXBvcnQgZGVjbGFyYXRpb24sIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi5pbXBvcnQubnVsbEltcG9ydCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9IAorCQlpZiAobmFtZS5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDEpID09ICcqJykgeworCQkJaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLSAyKSA9PSAnLicpIHsKKwkJCQlyZXR1cm4gdmFsaWRhdGVQYWNrYWdlTmFtZShuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaW1wb3J0LnVucXVhbGlmaWVkSW1wb3J0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbGlkYXRlUGFja2FnZU5hbWUobmFtZSk7CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZC4KKwkgKiBGb3IgZXhhbXBsZSwgPGNvZGU+ImphdmEubGFuZy5PYmplY3QiPC9jb2RlPiwgb3IgPGNvZGU+Ik9iamVjdCI8L2NvZGU+LgorCSAqIDxwPgorCSAqCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB0eXBlCisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCisJICoJCXRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIAorCSAqICAgICAgYSBzdGF0dXMgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuV0FSTklORzwvY29kZT4KKwkgKgkJaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsIAorCSAqICAgICAgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCAKKwkgKiAgICAgIHRoZSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLm51bGxOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJU3RyaW5nIHRyaW1tZWQgPSBuYW1lLnRyaW0oKTsKKwkJaWYgKCFuYW1lLmVxdWFscyh0cmltbWVkKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUubmFtZVdpdGhCbGFua3MiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCWNoYXJbXSBzY2FubmVkSUQ7CisJCWlmIChpbmRleCA9PSAtMSkgeworCQkJLy8gc2ltcGxlIG5hbWUKKwkJCXNjYW5uZWRJRCA9IHNjYW5uZWRJZGVudGlmaWVyKG5hbWUpOworCQl9IGVsc2UgeworCQkJLy8gcXVhbGlmaWVkIG5hbWUKKwkJCVN0cmluZyBwa2cgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOworCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZVBhY2thZ2VOYW1lKHBrZyk7CisJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQkJU3RyaW5nIHR5cGUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKTsKKwkJCXNjYW5uZWRJRCA9IHNjYW5uZWRJZGVudGlmaWVyKHR5cGUpOworCQl9CisJCisJCWlmIChzY2FubmVkSUQgIT0gbnVsbCkgeworCQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5ldyBTdHJpbmcoc2Nhbm5lZElEKSwgSVJlc291cmNlLkZJTEUpOworCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKwkJCWlmIChDaGFyT3BlcmF0aW9uLmNvbnRhaW5zKCckJywgc2Nhbm5lZElEKSkgeworCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnR5cGUuZG9sbGFyTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKChzY2FubmVkSUQubGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc2Nhbm5lZElEWzBdKSkpIHsKKwkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEphdmFDb3JlLlBMVUdJTl9JRCwgLTEsIFV0aWwuYmluZCgiY29udmVudGlvbi50eXBlLmxvd2VyY2FzZU5hbWUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24udHlwZS5pbnZhbGlkTmFtZSIsIG5hbWUpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGdpdmVuIG1ldGhvZCBuYW1lLgorCSAqIFRoZSBzcGVjaWFsIG5hbWVzICImbHQ7aW5pdCZndDsiIGFuZCAiJmx0O2NsaW5pdCZndDsiIGFyZSBub3QgdmFsaWQuCisJICogPHA+CisJICogVGhlIHN5bnRheCBmb3IgYSBtZXRob2QgIG5hbWUgaXMgZGVmaW5lZCBieSBJZGVudGlmaWVyCisJICogb2YgTWV0aG9kRGVjbGFyYXRvciAoSkxTMiA4LjQpLiBGb3IgZXhhbXBsZSAicHJpbnRsbiIuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIG1ldGhvZAorCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgorCSAqCQl0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIG1ldGhvZCBuYW1lLCBvdGhlcndpc2UgYSBzdGF0dXMgCisJICoJCW9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU1ldGhvZE5hbWUoU3RyaW5nIG5hbWUpIHsKKworCQlyZXR1cm4gdmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpOworCX0KKworCS8qKgorCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCisJICogPHA+CisJICogVGhlIHN5bnRheCBvZiBhIHBhY2thZ2UgbmFtZSBjb3JyZXNwb25kcyB0byBQYWNrYWdlTmFtZSBhcworCSAqIGRlZmluZWQgYnkgUGFja2FnZURlY2xhcmF0aW9uIChKTFMyIDcuNCkuIEZvciBleGFtcGxlLCA8Y29kZT4iamF2YS5sYW5nIjwvY29kZT4uCisJICogPHA+CisJICogTm90ZSB0aGF0IHRoZSBnaXZlbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgcGFja2FnZSBuYW1lIChpZS4gYXR0ZW1wdGluZyB0bworCSAqIHZhbGlkYXRlIHRoZSBkZWZhdWx0IHBhY2thZ2Ugd2lsbCByZXR1cm4gYW4gZXJyb3Igc3RhdHVzLikKKwkgKiBBbHNvIGl0IG11c3Qgbm90IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgb3Igc3Vic3RyaW5ncyB0aGF0IGFyZSBub3QgdmFsaWQgCisJICogb24gdGhlIGZpbGUgc3lzdGVtIG9uIHdoaWNoIHdvcmtzcGFjZSByb290IGlzIGxvY2F0ZWQuCisJICoKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKKwkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYKKwkgKgkJdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cyAKKwkgKgkJb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGFja2FnZU5hbWUoU3RyaW5nIG5hbWUpIHsKKworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24ucGFja2FnZS5udWxsTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWludCBsZW5ndGg7CisJCWlmICgobGVuZ3RoID0gbmFtZS5sZW5ndGgoKSkgPT0gMCkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZW1wdHlOYW1lIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKG5hbWUuY2hhckF0KDApID09IGZnRG90IHx8IG5hbWUuY2hhckF0KGxlbmd0aC0xKSA9PSBmZ0RvdCkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuZG90TmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShuYW1lLmNoYXJBdCgwKSkgfHwgQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2UobmFtZS5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDEpKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UubmFtZVdpdGhCbGFua3MiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpbnQgZG90ID0gMDsKKwkJd2hpbGUgKGRvdCAhPSAtMSAmJiBkb3QgPCBsZW5ndGgtMSkgeworCQkJaWYgKChkb3QgPSBuYW1lLmluZGV4T2YoZmdEb3QsIGRvdCsxKSkgIT0gLTEgJiYgZG90IDwgbGVuZ3RoLTEgJiYgbmFtZS5jaGFyQXQoZG90KzEpID09IGZnRG90KSB7CisJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UuY29uc2VjdXRpdmVEb3RzTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KLQkJCQlicmVhazsKKwkJfQorCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCBuZXcgU3RyaW5nKG5ldyBjaGFyW10ge2ZnRG90fSkpOworCQlib29sZWFuIGZpcnN0VG9rZW4gPSB0cnVlOworCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgdHlwZU5hbWUgPSBzdC5uZXh0VG9rZW4oKTsKKwkJCXR5cGVOYW1lID0gdHlwZU5hbWUudHJpbSgpOyAvLyBncmFtbWFyIGFsbG93cyBzcGFjZXMKKwkJCWNoYXJbXSBzY2FubmVkSUQgPSBzY2FubmVkSWRlbnRpZmllcih0eXBlTmFtZSk7CisJCQlpZiAoc2Nhbm5lZElEID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhQ29yZS5QTFVHSU5fSUQsIC0xLCBVdGlsLmJpbmQoImNvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIiLCB0eXBlTmFtZSksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUobmV3IFN0cmluZyhzY2FubmVkSUQpLCBJUmVzb3VyY2UuRk9MREVSKTsKKwkJCWlmICghc3RhdHVzLmlzT0soKSkgeworCQkJCXJldHVybiBzdGF0dXM7CisJCQl9CisJCQlpZiAoZmlyc3RUb2tlbiAmJiBzY2FubmVkSUQubGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc2Nhbm5lZElEWzBdKSkgeworCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSmF2YUNvcmUuUExVR0lOX0lELCAtMSwgVXRpbC5iaW5kKCJjb252ZW50aW9uLnBhY2thZ2UudXBwZXJjYXNlTmFtZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJZmlyc3RUb2tlbiA9IGZhbHNlOworCQl9CisJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJfQorCQorCS8qKgorCSAqIFZhbGlkYXRlIGEgZ2l2ZW4gY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb24gZm9yIGEgcHJvamVjdCwgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKKwkgKiA8dWw+CisJICogICA8bGk+IENsYXNzcGF0aCBlbnRyaWVzIGNhbm5vdCBjb2xsaWRlIHdpdGggZWFjaCBvdGhlciwgaS5lLiBhbGwgZW50cnkgcGF0aHMgbXVzdCBiZSB1bmlxdWUuCisJICogICA8bGk+IFRoZSBwcm9qZWN0IG91dHB1dCBsb2NhdGlvbiBwYXRoIGNhbm5vdCBiZSBudWxsLCBtdXN0IGJlIGFic29sdXRlIGFuZCBsb2NhdGVkIGluc2lkZSB0aGUgcHJvamVjdC4KKwkgKiAgIDxsaT4gU3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9ucyAoc3BlY2lmaWVkIG9uIHNvdXJjZSBlbnRyaWVzKSBjYW4gYmUgbnVsbCwgaWYgbm90IHRoZXkgbXVzdCBiZSBsb2NhdGVkIGluc2lkZSB0aGUgcHJvamVjdCwKKwkgKiAgIDxsaT4gQSBwcm9qZWN0IGVudHJ5IGNhbm5vdCByZWZlciB0byBpdHNlbGYgZGlyZWN0bHkgKGkuZS4gYSBwcm9qZWN0IGNhbm5vdCBwcmVyZXF1aXNpdGUgaXRzZWxmKS4KKyAgICAgKiAgIDxsaT4gQ2xhc3NwYXRoIGVudHJpZXMgb3Igb3V0cHV0IGxvY2F0aW9ucyBjYW5ub3QgY29pbmNpZGF0ZSBvciBiZSBuZXN0ZWQgaW4gZWFjaCBvdGhlciwgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIHNjZW5hcmlpIGxpc3RlZCBiZWxvdzoKKwkgKiAgICAgIDx1bD48bGk+IEEgc291cmNlIGZvbGRlciBjYW4gY29pbmNpZGF0ZSB3aXRoIGl0cyBvd24gb3V0cHV0IGxvY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoaXMgb3V0cHV0IGNhbiB0aGVuIGNvbnRhaW4gbGlicmFyeSBhcmNoaXZlcy4gCisJICogICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCBhbiBvdXRwdXQgbG9jYXRpb24gY2Fubm90IGNvaW5jaWRhdGUgd2l0aCBhbnkgbGlicmFyeSBvciBhIGRpc3RpbmN0IHNvdXJjZSBmb2xkZXIgdGhhbiB0aGUgb25lIHJlZmVycmluZyB0byBpdC4gPC9saT4gCisJICogICAgICAgICAgICAgIDxsaT4gQSBzb3VyY2UvbGlicmFyeSBmb2xkZXIgY2FuIGJlIG5lc3RlZCBpbiBhbnkgc291cmNlIGZvbGRlciBhcyBsb25nIGFzIHRoZSBuZXN0ZWQgZm9sZGVyIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIGVuY2xvc2luZyBvbmUuIDwvbGk+CisJICogCQkJPGxpPiBBbiBvdXRwdXQgbG9jYXRpb24gY2FuIGJlIG5lc3RlZCBpbiBhIHNvdXJjZSBmb2xkZXIsIGlmIHRoZSBzb3VyY2UgZm9sZGVyIGNvaW5jaWRhdGVzIHdpdGggdGhlIHByb2plY3QgaXRzZWxmLiA8L2xpPgorCSAqICAgICAgPC91bD4KKwkgKiA8L3VsPgorCSAqIAorCSAqICBOb3RlIHRoYXQgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGFyZSBub3QgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkuIE9ubHkgYm91bmQgdmFyaWFibGVzIG9yIGNvbnRhaW5lcnMgYXJlIGNvbnNpZGVyZWQgCisJICogIGluIHRoZSBjaGVja2luZyBwcm9jZXNzICh0aGlzIGFsbG93cyB0byBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgb24gYSBjbGFzc3BhdGggd2hpY2ggaGFzIHJlZmVyZW5jZXMgdG8KKwkgKiAgeWV0IG5vbiBleGlzdGluZyBwcm9qZWN0cywgZm9sZGVycywgLi4uKS4KKwkgKiAgPHA+CisJICogIFRoaXMgdmFsaWRhdGlvbiBpcyBpbnRlbmRlZCB0byBhbnRpY2lwYXRlIGNsYXNzcGF0aCBpc3N1ZXMgcHJpb3IgdG8gYXNzaWduaW5nIGl0IHRvIGEgcHJvamVjdC4gSW4gcGFydGljdWxhciwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5CisJICogIGJlIHBlcmZvcm1lZCBkdXJpbmcgdGhlIGNsYXNzcGF0aCBzZXR0aW5nIG9wZXJhdGlvbiAoaWYgdmFsaWRhdGlvbiBmYWlscywgdGhlIGNsYXNzcGF0aCBzZXR0aW5nIHdpbGwgbm90IGNvbXBsZXRlKS4KKwkgKiAgPHA+CisJICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBnaXZlbiBqYXZhIHByb2plY3QKKwkgKiBAcGFyYW0gY2xhc3NwYXRoIGEgZ2l2ZW4gY2xhc3NwYXRoCisJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIGEgZ2l2ZW4gb3V0cHV0IGxvY2F0aW9uCisJICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmCisJICoJCXRoZSBnaXZlbiBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiBhcmUgY29tcGF0aWJsZSwgb3RoZXJ3aXNlIGEgc3RhdHVzIAorCSAqCQlvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGNsYXNzcGF0aCBvciBvdXRwdXQgbG9jYXRpb24KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoLCBJUGF0aCBwcm9qZWN0T3V0cHV0TG9jYXRpb24pIHsKKwkKKwkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwkJSVBhdGggcHJvamVjdFBhdGg9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKKwkKKwkJLyogdmFsaWRhdGUgb3V0cHV0IGxvY2F0aW9uICovCisJCWlmIChwcm9qZWN0T3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OVUxMX1BBVEgpOworCQl9CisJCWlmIChwcm9qZWN0T3V0cHV0TG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7CisJCQlpZiAoIXByb2plY3RQYXRoLmlzUHJlZml4T2YocHJvamVjdE91dHB1dExvY2F0aW9uKSkgeworCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUEFUSF9PVVRTSURFX1BST0pFQ1QsIGphdmFQcm9qZWN0LCBwcm9qZWN0T3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFTEFUSVZFX1BBVEgsIHByb2plY3RPdXRwdXRMb2NhdGlvbik7CisJCX0KKwkKKwkJYm9vbGVhbiBoYXNTb3VyY2UgPSBmYWxzZTsKKwkJYm9vbGVhbiBoYXNMaWJGb2xkZXIgPSBmYWxzZTsKKwkKIAotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6Ci0JCQkJdHJ5IHsKLQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIocmF3RW50cnkuZ2V0UGF0aCgpLCBqYXZhUHJvamVjdCk7Ci0JCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCl7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCQkJCWlmIChjb250YWluZXJFbnRyaWVzICE9IG51bGwpewotCQkJCQkJCWZvciAoaW50IGogPSAwLCBjb250YWluZXJMZW5ndGggPSBjb250YWluZXJFbnRyaWVzLmxlbmd0aDsgaiA8IGNvbnRhaW5lckxlbmd0aDsgaisrKXsKLQkJCQkJCQkJLy9yZXNvbHZlZEVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShjb250YWluZXJFbnRyaWVzW2pdKTsKLQkJCQkJCQkJcmVzb2x2ZWRFbnRyeSA9IGNvbnRhaW5lckVudHJpZXNbal07Ci0JCQkJCQkJCWlmIChyZXNvbHZlZEVudHJ5ICE9IG51bGwpewotCQkJCQkJCQkJLy8gY2hlY2sgaWYgYW55IHNvdXJjZSBlbnRyaWVzIGNvaW5jaWRhdGVzIHdpdGggYmluYXJ5IG91dHB1dCAtIGluIHdoaWNoIGNhc2UgbmVzdGluZyBpbnNpZGUgb3V0cHV0IGlzIGxlZ2FsCi0JCQkJCQkJCQlpZiAocmVzb2x2ZWRFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG91dHB1dExvY2F0aW9uKSkgYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSB0cnVlOwotCQkJCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKKwkJLy8gdG9sZXJhdGUgbnVsbCBwYXRoLCBpdCB3aWxsIGJlIHJlc2V0IHRvIGRlZmF1bHQKKwkJaWYgKHJhd0NsYXNzcGF0aCA9PSBudWxsKSAKKwkJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJCQorCQkvLyByZXRyaWV2ZSByZXNvbHZlZCBjbGFzc3BhdGgKKwkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoOyAKKwkJdHJ5IHsKKwkJCWNsYXNzcGF0aCA9ICgoSmF2YVByb2plY3QpamF2YVByb2plY3QpLmdldFJlc29sdmVkQ2xhc3NwYXRoKHJhd0NsYXNzcGF0aCwgbnVsbCAvKm91dHB1dCovLCB0cnVlLyppZ25vcmUgcGIqLywgZmFsc2UvKm5vIG1hcmtlciovLCBudWxsIC8qbm8gcmV2ZXJzZSBtYXAqLyk7CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkJcmV0dXJuIGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CisJCX0KKwkJaW50IGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IAorCisJCWludCBvdXRwdXRDb3VudCA9IDE7CisJCUlQYXRoW10gb3V0cHV0TG9jYXRpb25zCT0gbmV3IElQYXRoW2xlbmd0aCsxXTsKKwkJYm9vbGVhbltdIGFsbG93TmVzdGluZ0luT3V0cHV0TG9jYXRpb25zID0gbmV3IGJvb2xlYW5bbGVuZ3RoKzFdOworCQlvdXRwdXRMb2NhdGlvbnNbMF0gPSBwcm9qZWN0T3V0cHV0TG9jYXRpb247CisJCQorCQkvLyByZXRyaWV2ZSBhbmQgY2hlY2sgb3V0cHV0IGxvY2F0aW9ucworCQlJUGF0aCBwb3RlbnRpYWxOZXN0ZWRPdXRwdXQgPSBudWxsOworCQlpbnQgc291cmNlRW50cnlDb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJCXN3aXRjaChyZXNvbHZlZEVudHJ5LmdldEVudHJ5S2luZCgpKXsKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQkJc291cmNlRW50cnlDb3VudCsrOworCisJCQkJCWlmIChyZXNvbHZlZEVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkgIT0gbnVsbCAmJiByZXNvbHZlZEVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCkubGVuZ3RoID4gMAorCQkJCQkJCSYmIEphdmFDb3JlLkRJU0FCTEVELmVxdWFscyhqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX0VYQ0xVU0lPTl9QQVRURVJOUywgdHJ1ZSkpKSB7CisJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkRJU0FCTEVEX0NQX0VYQ0xVU0lPTl9QQVRURVJOUywgcmVzb2x2ZWRFbnRyeS5nZXRQYXRoKCkpOworCQkJCQl9CisJCQkJCUlQYXRoIGN1c3RvbU91dHB1dDsgCisJCQkJCWlmICgoY3VzdG9tT3V0cHV0ID0gcmVzb2x2ZWRFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKSAhPSBudWxsKSB7CisKKwkJCQkJCWlmIChKYXZhQ29yZS5ESVNBQkxFRC5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TLCB0cnVlKSkpIHsKKwkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkRJU0FCTEVEX0NQX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMsIHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGVuc3VyZSBjdXN0b20gb3V0cHV0IGlzIGluIHByb2plY3QKKwkJCQkJCWlmIChjdXN0b21PdXRwdXQuaXNBYnNvbHV0ZSgpKSB7CisJCQkJCQkJaWYgKCFqYXZhUHJvamVjdC5nZXRQYXRoKCkuaXNQcmVmaXhPZihjdXN0b21PdXRwdXQpKSB7CisJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUEFUSF9PVVRTSURFX1BST0pFQ1QsIGphdmFQcm9qZWN0LCBjdXN0b21PdXRwdXQudG9TdHJpbmcoKSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFTEFUSVZFX1BBVEgsIGN1c3RvbU91dHB1dCk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCS8vIGVuc3VyZSBjdXN0b20gb3V0cHV0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBvdGhlciBvdXRwdXRzCisJCQkJCQlpbnQgaW5kZXg7CisJCQkJCQlpZiAoKGluZGV4ID0gaW5kZXhPZk1hdGNoaW5nUGF0aChjdXN0b21PdXRwdXQsIG91dHB1dExvY2F0aW9ucywgb3V0cHV0Q291bnQpKSAhPSAtMSkgeworCQkJCQkJCWNvbnRpbnVlOyAvLyBhbHJlYWR5IGZvdW5kCisJCQkJCQl9CisJCQkJCQlpZiAoKGluZGV4ID0gaW5kZXhPZkVuY2xvc2luZ1BhdGgoY3VzdG9tT3V0cHV0LCBvdXRwdXRMb2NhdGlvbnMsIG91dHB1dENvdW50KSkgIT0gLTEpIHsKKwkJCQkJCQlpZiAoaW5kZXggPT0gMCkgeworCQkJCQkJCQkvLyBjdXN0b20gb3V0cHV0IGlzIG5lc3RlZCBpbiBwcm9qZWN0J3Mgb3V0cHV0OiBuZWVkIHRvIGNoZWNrIGlmIGFsbCBzb3VyY2UgZW50cmllcyBoYXZlIGEgY3VzdG9tCisJCQkJCQkJCS8vIG91dHB1dCBiZWZvcmUgY29tcGxhaW5pbmcKKwkJCQkJCQkJaWYgKHBvdGVudGlhbE5lc3RlZE91dHB1dCA9PSBudWxsKSBwb3RlbnRpYWxOZXN0ZWRPdXRwdXQgPSBjdXN0b21PdXRwdXQ7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluT3V0cHV0IiwgY3VzdG9tT3V0cHV0Lm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIG91dHB1dExvY2F0aW9uc1tpbmRleF0ubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJb3V0cHV0TG9jYXRpb25zW291dHB1dENvdW50KytdID0gcmVzb2x2ZWRFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJCQl9CisJCQl9CQorCQl9CQorCQkvLyBhbGxvdyBjdXN0b20gb3V0cHV0IG5lc3RpbmcgaW4gcHJvamVjdCdzIG91dHB1dCBpZiBhbGwgc291cmNlIGVudHJpZXMgaGF2ZSBhIGN1c3RvbSBvdXRwdXQKKwkJaWYgKHBvdGVudGlhbE5lc3RlZE91dHB1dCAhPSBudWxsICYmIHNvdXJjZUVudHJ5Q291bnQgPiBvdXRwdXRDb3VudC0xKSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0T3V0cHV0SW5PdXRwdXQiLCBwb3RlbnRpYWxOZXN0ZWRPdXRwdXQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb25zWzBdLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IHJlc29sdmVkRW50cnkgPSBjbGFzc3BhdGhbaV07CisJCQlJUGF0aCBwYXRoID0gcmVzb2x2ZWRFbnRyeS5nZXRQYXRoKCk7CisJCQlpbnQgaW5kZXg7CisJCQlzd2l0Y2gocmVzb2x2ZWRFbnRyeS5nZXRFbnRyeUtpbmQoKSl7CisJCQkJCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CisJCQkJCWhhc1NvdXJjZSA9IHRydWU7CisJCQkJCWlmICgoaW5kZXggPSBpbmRleE9mTWF0Y2hpbmdQYXRoKHBhdGgsIG91dHB1dExvY2F0aW9ucywgb3V0cHV0Q291bnQpKSAhPSAtMSl7CisJCQkJCQlhbGxvd05lc3RpbmdJbk91dHB1dExvY2F0aW9uc1tpbmRleF0gPSB0cnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CisJCQkJCWhhc0xpYkZvbGRlciB8PSAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShwYXRoLmxhc3RTZWdtZW50KCkpOworCQkJCQlpZiAoKGluZGV4ID0gaW5kZXhPZk1hdGNoaW5nUGF0aChwYXRoLCBvdXRwdXRMb2NhdGlvbnMsIG91dHB1dENvdW50KSkgIT0gLTEpeworCQkJCQkJYWxsb3dOZXN0aW5nSW5PdXRwdXRMb2NhdGlvbnNbaW5kZXhdID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWhhc1NvdXJjZSAmJiAhaGFzTGliRm9sZGVyKSB7IC8vIGlmIG5vIHNvdXJjZSBhbmQgbm8gbGliIGZvbGRlciwgdGhlbiBhbGxvd2VkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dENvdW50OyBpKyspIGFsbG93TmVzdGluZ0luT3V0cHV0TG9jYXRpb25zW2ldID0gdHJ1ZTsKKwkJfQorCQkKKwkJSGFzaFNldCBwYXRoZXMgPSBuZXcgSGFzaFNldChsZW5ndGgpOworCQkKKwkJLy8gY2hlY2sgYWxsIGVudHJpZXMKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJCWlmIChlbnRyeSA9PSBudWxsKSBjb250aW51ZTsKKwkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCWludCBraW5kID0gZW50cnkuZ2V0RW50cnlLaW5kKCk7CisJCisJCQkvLyBjb21wbGFpbiBpZiBkdXBsaWNhdGUgcGF0aAorCQkJaWYgKCFwYXRoZXMuYWRkKGVudHJ5UGF0aCkpeworCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIFV0aWwuYmluZCgiY2xhc3NwYXRoLmR1cGxpY2F0ZUVudHJ5UGF0aCIsIGVudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCS8vIG5vIGZ1cnRoZXIgY2hlY2sgaWYgZW50cnkgY29pbmNpZGF0ZXMgd2l0aCBwcm9qZWN0IG9yIG91dHB1dCBsb2NhdGlvbgorCQkJaWYgKGVudHJ5UGF0aC5lcXVhbHMocHJvamVjdFBhdGgpKXsKKwkJCQkvLyBjb21wbGFpbiBpZiBzZWxmLXJlZmVycmluZyBwcm9qZWN0IGVudHJ5CisJCQkJaWYgKGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKXsKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdFJlZmVyVG9JdHNlbGYiLCBlbnRyeVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOy8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJLy8gdG9sZXJhdGUgbmVzdGluZyBvdXRwdXQgaW4gc3JjIGlmIHNyYz09cHJqCisJCQkJY29udGludWU7CisJCQl9CisJCisJCQkvLyBhbGxvdyBuZXN0aW5nIHNvdXJjZSBlbnRyaWVzIGluIGVhY2ggb3RoZXIgYXMgbG9uZyBhcyB0aGUgb3V0ZXIgZW50cnkgZXhjbHVkZXMgdGhlIGlubmVyIG9uZQorCQkJaWYgKGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgCisJCQkJCXx8IChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShlbnRyeVBhdGgubGFzdFNlZ21lbnQoKSkpKXsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aC5sZW5ndGg7IGorKyl7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBvdGhlckVudHJ5ID0gY2xhc3NwYXRoW2pdOworCQkJCQlpZiAob3RoZXJFbnRyeSA9PSBudWxsKSBjb250aW51ZTsKKwkJCQkJaW50IG90aGVyS2luZCA9IG90aGVyRW50cnkuZ2V0RW50cnlLaW5kKCk7CisJCQkJCUlQYXRoIG90aGVyUGF0aCA9IG90aGVyRW50cnkuZ2V0UGF0aCgpOworCQkJCQlpZiAoZW50cnkgIT0gb3RoZXJFbnRyeSAKKwkJCQkJCSYmIChvdGhlcktpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgCisJCQkJCQkJCXx8IChvdGhlcktpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIAorCQkJCQkJCQkJCSYmICFvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKG90aGVyUGF0aC5sYXN0U2VnbWVudCgpKSkpKXsKKwkJCQkJCWNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zOworCQkJCQkJaWYgKG90aGVyUGF0aC5pc1ByZWZpeE9mKGVudHJ5UGF0aCkgCisJCQkJCQkJCSYmICFvdGhlclBhdGguZXF1YWxzKGVudHJ5UGF0aCkKKwkJCQkJCQkJJiYgIVV0aWwuaXNFeGNsdWRlZChlbnRyeVBhdGguYXBwZW5kKCIqIiksIGV4Y2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSlvdGhlckVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQorCQkJCQkJCVN0cmluZyBleGNsdXNpb25QYXR0ZXJuID0gZW50cnlQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMob3RoZXJQYXRoLnNlZ21lbnRDb3VudCgpKS5zZWdtZW50KDApOworCQkJCQkJCWlmIChVdGlsLmlzRXhjbHVkZWQoZW50cnlQYXRoLCBleGNsdXNpb25QYXR0ZXJucykpIHsKKwkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgubXVzdEVuZFdpdGhTbGFzaCIsIGV4Y2x1c2lvblBhdHRlcm4sIGVudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlpZiAob3RoZXJLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJCQkJCQlleGNsdXNpb25QYXR0ZXJuICs9ICcvJzsKKwkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdE5lc3RFbnRyeUluRW50cnkiLCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLCBvdGhlckVudHJ5LmdldFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLCBleGNsdXNpb25QYXR0ZXJufSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0RW50cnlJbkxpYnJhcnkiLCBuZXcgU3RyaW5nW10ge2VudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpLCBvdGhlckVudHJ5LmdldFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoZSk7CiAJCQkJfQotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJaGFzU291cmNlID0gdHJ1ZTsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIGNoZWNrIGlmIGFueSBzb3VyY2UgZW50cmllcyBjb2luY2lkYXRlcyB3aXRoIGJpbmFyeSBvdXRwdXQgLSBpbiB3aGljaCBjYXNlIG5lc3RpbmcgaW5zaWRlIG91dHB1dCBpcyBsZWdhbAotCQkJCWlmIChyYXdFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG91dHB1dExvY2F0aW9uKSkgYWxsb3dOZXN0aW5nSW5PdXRwdXQgPSB0cnVlOwotCQkJCXJlc29sdmVkRW50cmllcy5hZGQocmF3RW50cnkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghaGFzU291cmNlKSBhbGxvd05lc3RpbmdJbk91dHB1dCA9IHRydWU7IC8vIGlmIG5vIHNvdXJjZSwgdGhlbiBhbGxvd2VkCi0JCi0JbGVuZ3RoID0gcmVzb2x2ZWRFbnRyaWVzLnNpemUoKTsKLQljbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aF07Ci0JcmVzb2x2ZWRFbnRyaWVzLnRvQXJyYXkoY2xhc3NwYXRoKTsKLQkKLQlIYXNoU2V0IHBhdGhlcyA9IG5ldyBIYXNoU2V0KGxlbmd0aCk7Ci0JCi0JLy8gY2hlY2sgYWxsIGVudHJpZXMKLQlmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0KLQkJaWYgKGVudHJ5ID09IG51bGwpIGNvbnRpbnVlOwotCi0JCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJaW50IGtpbmQgPSBlbnRyeS5nZXRFbnRyeUtpbmQoKTsKLQotCQkvLyBjb21wbGFpbiBpZiBkdXBsaWNhdGUgcGF0aAotCQlpZiAoIXBhdGhlcy5hZGQoZW50cnlQYXRoKSl7Ci0JCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCBVdGlsLmJpbmQoImNsYXNzcGF0aC5kdXBsaWNhdGVFbnRyeVBhdGgiLCBlbnRyeVBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gbm8gZnVydGhlciBjaGVjayBpZiBlbnRyeSBjb2luY2lkYXRlcyB3aXRoIHByb2plY3Qgb3Igb3V0cHV0IGxvY2F0aW9uCi0JCWlmIChlbnRyeVBhdGguZXF1YWxzKHByb2plY3RQYXRoKSl7Ci0JCQkvLyBjb21wbGFpbiBpZiBzZWxmLXJlZmVycmluZyBwcm9qZWN0IGVudHJ5Ci0JCQlpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpewotCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3RSZWZlclRvSXRzZWxmIiwgZW50cnlQYXRoLnRvU3RyaW5nKCkpKTsvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQljb250aW51ZTsKLQkJfQorCQkJCisJCQkvLyBwcmV2ZW50IG5lc3Rpbmcgb3V0cHV0IGxvY2F0aW9uIGluc2lkZSBlbnRyeQorCQkJaW50IGluZGV4OworCQkJaWYgKChpbmRleCA9IGluZGV4T2ZOZXN0ZWRQYXRoKGVudHJ5UGF0aCwgb3V0cHV0TG9jYXRpb25zLCBvdXRwdXRDb3VudCkpICE9IC0xKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluRW50cnkiLCBvdXRwdXRMb2NhdGlvbnNbaW5kZXhdLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIGVudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KIAotCQkvLyBwcmV2ZW50IG5lc3Rpbmcgc291cmNlIGVudHJpZXMgaW4gZWFjaCBvdGhlcgotCQlpZiAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSAKLQkJCQl8fCAoa2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgJiYgIW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZW50cnlQYXRoLmxhc3RTZWdtZW50KCkpKSl7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNsYXNzcGF0aC5sZW5ndGg7IGorKyl7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IG90aGVyRW50cnkgPSBjbGFzc3BhdGhbal07Ci0JCQkJaWYgKG90aGVyRW50cnkgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJaW50IG90aGVyS2luZCA9IG90aGVyRW50cnkuZ2V0RW50cnlLaW5kKCk7Ci0JCQkJaWYgKGVudHJ5ICE9IG90aGVyRW50cnkgCi0JCQkJCSYmIChvdGhlcktpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgCi0JCQkJCQkJfHwgKG90aGVyS2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgCi0JCQkJCQkJCQkmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShvdGhlckVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSkpKXsKLQkJCQkJaWYgKG90aGVyRW50cnkuZ2V0UGF0aCgpLmlzUHJlZml4T2YoZW50cnlQYXRoKSl7Ci0JCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0RW50cnlJbkVudHJ5IiwgZW50cnlQYXRoLnRvU3RyaW5nKCksIG90aGVyRW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJLy8gcHJldmVudCBuZXN0aW5nIGVudHJ5IGluc2lkZSBvdXRwdXQgbG9jYXRpb24gLSB3aGVuIGRpc3RpbmN0IGZyb20gcHJvamVjdCBvciBhIHNvdXJjZSBmb2xkZXIKKwkJCWlmICgoaW5kZXggPSBpbmRleE9mRW5jbG9zaW5nUGF0aChlbnRyeVBhdGgsIG91dHB1dExvY2F0aW9ucywgb3V0cHV0Q291bnQpKSAhPSAtMSkgeworCQkJCWlmICghYWxsb3dOZXN0aW5nSW5PdXRwdXRMb2NhdGlvbnNbaW5kZXhdKSB7CisJCQkJCS8vIGFsbG93IG5lc3RpbmcgaW4gcHJvamVjdCdzIG91dHB1dCBpZiBhbGwgc291cmNlIGVudHJpZXMgaGF2ZSBhIGN1c3RvbSBvdXRwdXQKKwkJCQkJaWYgKGluZGV4ICE9IDAgfHwgc291cmNlRW50cnlDb3VudCA+IG91dHB1dENvdW50IC0gMSkgeworCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdEVudHJ5SW5PdXRwdXQiLCBlbnRyeVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb25zW2luZGV4XS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCQkvLyBwcmV2ZW50IG5lc3Rpbmcgb3V0cHV0IGxvY2F0aW9uIGluc2lkZSBlbnRyeQotCQlpZiAoIWVudHJ5UGF0aC5lcXVhbHMob3V0cHV0TG9jYXRpb24pICYmIGVudHJ5UGF0aC5pc1ByZWZpeE9mKG91dHB1dExvY2F0aW9uKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90TmVzdEVudHJ5SW5PdXRwdXQiLGVudHJ5UGF0aC50b1N0cmluZygpLCBvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQorCQkvLyBlbnN1cmUgdGhhdCBubyBvdXRwdXQgaXMgY29pbmNpZGF0aW5nIHdpdGggYW5vdGhlciBzb3VyY2UgZm9sZGVyIChvbmx5IGFsbG93ZWQgaWYgbWF0Y2hpbmcgY3VycmVudCBzb3VyY2UgZm9sZGVyKQorCQkvLyBwZXJmb3JtIG9uZSBzZXBhcmF0ZSBpdGVyYXRpb24gc28gYXMgdG8gbm90IHRha2UgcHJlY2VkZW5jZSBvdmVyIHByZXZpb3VzbHkgY2hlY2tlZCBzY2VuYXJpaSAoaW4gcGFydGljdWxhciBzaG91bGQKKwkJLy8gZGlhZ25vc2UgbmVzdGluZyBzb3VyY2UgZm9sZGVyIGlzc3VlIGJlZm9yZSB0aGlzIG9uZSwgZS5nLiBbc3JjXSJQcm9qZWN0LyIsIFtzcmNdIlByb2plY3Qvc291cmNlLyIgYW5kIG91dHB1dD0iUHJvamVjdC8iIHNob3VsZAorCQkvLyBmaXJzdCBjb21wbGFpbiBhYm91dCBtaXNzaW5nIGV4Y2x1c2lvbiBwYXR0ZXJuCisJCWZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CisJCQlpZiAoZW50cnkgPT0gbnVsbCkgY29udGludWU7CisJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQlpbnQga2luZCA9IGVudHJ5LmdldEVudHJ5S2luZCgpOwogCi0JCS8vIHByZXZlbnQgbmVzdGluZyBlbnRyeSBpbnNpZGUgb3V0cHV0IGxvY2F0aW9uIC0gd2hlbiBkaXN0aW5jdCBmcm9tIHByb2plY3Qgb3IgYSBzb3VyY2UgZm9sZGVyCi0JCWlmICghYWxsb3dOZXN0aW5nSW5PdXRwdXQgJiYgb3V0cHV0TG9jYXRpb24uaXNQcmVmaXhPZihlbnRyeVBhdGgpKSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3ROZXN0T3V0cHV0SW5FbnRyeSIsIG91dHB1dExvY2F0aW9uLnRvU3RyaW5nKCksIGVudHJ5UGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJSVBhdGggb3V0cHV0ID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJCQlpZiAob3V0cHV0ID09IG51bGwpIG91dHB1dCA9IHByb2plY3RPdXRwdXRMb2NhdGlvbjsgLy8gaWYgbm8gc3BlY2lmaWMgb3V0cHV0LCBzdGlsbCBuZWVkIHRvIGNoZWNrIHVzaW5nIGRlZmF1bHQgb3V0cHV0CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgb3RoZXJFbnRyeSA9IGNsYXNzcGF0aFtqXTsKKwkJCQkJaWYgKG90aGVyRW50cnkgPT0gZW50cnkpIGNvbnRpbnVlOworCQkJCQlzd2l0Y2ggKG90aGVyRW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgorCQkJCQkJCWlmIChvdGhlckVudHJ5LmdldFBhdGgoKS5lcXVhbHMob3V0cHV0KSkgeworCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jYW5ub3RVc2VEaXN0aW5jdFNvdXJjZUZvbGRlckFzT3V0cHV0IiwgZW50cnlQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIG90aGVyRW50cnkuZ2V0UGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKKwkJCQkJCQlpZiAob3RoZXJFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG91dHB1dCkpIHsKKwkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90VXNlTGlicmFyeUFzT3V0cHV0IiwgZW50cnlQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIG90aGVyRW50cnkuZ2V0UGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0JCQkKIAkJfQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwkKIAl9Ci0JcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsJCi19Ci0KKwkKIAkvKioKIAkgKiBSZXR1cm5zIGEgamF2YSBtb2RlbCBzdGF0dXMgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGlmIGFueSwgCiAJICogYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgZmluZS4KQEAgLTU0MSw5ICs2ODksOCBAQAogCQkKIAkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CQkJCiAJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQogCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpewotCisJCiAJCQkvLyBjb250YWluZXIgZW50cnkgY2hlY2sKIAkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgogCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+PSAxKXsKQEAgLTU1MSw3ICs2OTgsNyBAQAogCQkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIocGF0aCwgamF2YVByb2plY3QpOwogCQkJCQkJLy8gY29udGFpbmVyIHJldHJpZXZhbCBpcyBwZXJmb3JtaW5nIHZhbGlkYXRpb24gY2hlY2sgb24gY29udGFpbmVyIGVudHJ5IGtpbmRzLgogCQkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKLQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kQ29udGFpbmVyUGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DUF9DT05UQUlORVJfUEFUSF9VTkJPVU5ELCBqYXZhUHJvamVjdCwgcGF0aCk7CiAJCQkJCQl9CiAJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKIAkJCQkJCWlmIChjb250YWluZXJFbnRyaWVzICE9IG51bGwpewpAQCAtNTYyLDkgKzcwOSw5IEBACiAJCQkJCQkJCQl8fCBraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFCiAJCQkJCQkJCQl8fCBraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUKIAkJCQkJCQkJCXx8IGtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpewotCQkJCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKAotCQkJCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ1BfQ09OVEFJTkVSX0VOVFJZLAotCQkJCQkJCQkJCQljb250YWluZXIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOworCQkJCQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbnRhaW5lci5nZXREZXNjcmlwdGlvbigpOworCQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSBkZXNjcmlwdGlvbiA9IHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ1BfQ09OVEFJTkVSX0VOVFJZLCBqYXZhUHJvamVjdCwgcGF0aCk7CiAJCQkJCQkJCX0KIAkJCQkJCQkJSUphdmFNb2RlbFN0YXR1cyBjb250YWluZXJFbnRyeVN0YXR1cyA9IHZhbGlkYXRlQ2xhc3NwYXRoRW50cnkoamF2YVByb2plY3QsIGNvbnRhaW5lckVudHJ5LCBjaGVja1NvdXJjZUF0dGFjaG1lbnQpOwogCQkJCQkJCQlpZiAoIWNvbnRhaW5lckVudHJ5U3RhdHVzLmlzT0soKSl7CkBAIC01NzYsMjAgKzcyMywyMCBAQAogCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoZSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsQ29udGFpbmVyUGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOwkJCQkJIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbENvbnRhaW5lclBhdGgiLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsJCQkJCSAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCisJCQkJCiAJCQkvLyB2YXJpYWJsZSBlbnRyeSBjaGVjawogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKIAkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPj0gMSl7CiAJCQkJCWVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSk7CiAJCQkJCWlmIChlbnRyeSA9PSBudWxsKXsKLQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRWYXJpYWJsZVBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DUF9WQVJJQUJMRV9QQVRIX1VOQk9VTkQsIGphdmFQcm9qZWN0LCBwYXRoKTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gdmFsaWRhdGVDbGFzc3BhdGhFbnRyeShqYXZhUHJvamVjdCwgZW50cnksIGNoZWNrU291cmNlQXR0YWNobWVudCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFZhcmlhYmxlUGF0aCIsIHBhdGgudG9TdHJpbmcoKSkpOwkJCQkJIC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFZhcmlhYmxlUGF0aCIsIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOwkJCQkJIC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAKIAkJCS8vIGxpYnJhcnkgZW50cnkgY2hlY2sKQEAgLTYwMSwxMyArNzQ4LDEyIEBACiAJCQkJCQlJUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKIAkJCQkJCXN3aXRjaChyZXNvbHZlZFJlc291cmNlLmdldFR5cGUoKSl7CiAJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvbHZlZFJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSB8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpeyAvLyBpbnRlcm5hbCBiaW5hcnkgYXJjaGl2ZSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJaWYgKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocmVzb2x2ZWRSZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7CiAJCQkJCQkJCQlpZiAoY2hlY2tTb3VyY2VBdHRhY2htZW50IAogCQkJCQkJCQkJCSYmIHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbAogCQkJCQkJCQkJCSYmICFzb3VyY2VBdHRhY2htZW50LmlzRW1wdHkoKQogCQkJCQkJCQkJCSYmIEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgc291cmNlQXR0YWNobWVudCwgdHJ1ZSkgPT0gbnVsbCl7Ci0JCQkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLCBzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLCBzb3VyY2VBdHRhY2htZW50Lm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCksIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQkJYnJlYWs7CkBAIC02MTYsNyArNzYyLDcgQEAKIAkJCQkJCQkJCSYmIHNvdXJjZUF0dGFjaG1lbnQgIT0gbnVsbCAKIAkJCQkJCQkJCSYmICFzb3VyY2VBdHRhY2htZW50LmlzRW1wdHkoKQogCQkJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsKLQkJCQkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlQXR0YWNobWVudCIsIHNvdXJjZUF0dGFjaG1lbnQudG9TdHJpbmcoKSwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCXJldHVybiAgbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlQXR0YWNobWVudCIsIHNvdXJjZUF0dGFjaG1lbnQubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSwgcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpewpAQCAtNjI0LDEzICs3NzAsMTMgQEAKIAkJCQkJCQkmJiBzb3VyY2VBdHRhY2htZW50ICE9IG51bGwgCiAJCQkJCQkJJiYgIXNvdXJjZUF0dGFjaG1lbnQuaXNFbXB0eSgpCiAJCQkJCQkJJiYgSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBzb3VyY2VBdHRhY2htZW50LCB0cnVlKSA9PSBudWxsKXsKLQkJCQkJCQlyZXR1cm4gIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZFNvdXJjZUF0dGFjaG1lbnQiLCBzb3VyY2VBdHRhY2htZW50LnRvU3RyaW5nKCksIHBhdGgudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJcmV0dXJuICBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50Iiwgc291cmNlQXR0YWNobWVudC50b1N0cmluZygpLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQogCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZExpYnJhcnkiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5ib3VuZExpYnJhcnkiLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbExpYnJhcnlQYXRoIiwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbExpYnJhcnlQYXRoIiwgcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAJCQkJYnJlYWs7CiAKQEAgLTY0MCw3ICs3ODYsNyBAQAogCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSk7CiAJCQkJCXRyeSB7CiAJCQkJCQlpZiAoIXByb2plY3QuZXhpc3RzKCkgfHwgIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpewotCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRQcm9qZWN0IiwgcGF0aC5zZWdtZW50KDApLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRQcm9qZWN0IiwgcGF0aC5tYWtlUmVsYXRpdmUoKS5zZWdtZW50KDApLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQogCQkJCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKXsKIAkJCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5jbG9zZWRQcm9qZWN0IiwgcGF0aC5zZWdtZW50KDApLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJApAQCAtNjU1LDE2ICs4MDEsMjQgQEAKIAogCQkJLy8gcHJvamVjdCBzb3VyY2UgZm9sZGVyCiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQlpZiAoZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKSAhPSBudWxsIAorCQkJCQkJJiYgZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKS5sZW5ndGggPiAwCisJCQkJCQkmJiBKYXZhQ29yZS5ESVNBQkxFRC5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMsIHRydWUpKSkgeworCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkRJU0FCTEVEX0NQX0VYQ0xVU0lPTl9QQVRURVJOUywgcGF0aCk7CisJCQkJfQorCQkJCWlmIChlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwgJiYgSmF2YUNvcmUuRElTQUJMRUQuZXF1YWxzKGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfTVVMVElQTEVfT1VUUFVUX0xPQ0FUSU9OUywgdHJ1ZSkpKSB7CisJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRElTQUJMRURfQ1BfTVVMVElQTEVfT1VUUFVUX0xPQ0FUSU9OUywgcGF0aCk7CisJCQkJfQogCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5pc0Fic29sdXRlKCkgJiYgIXBhdGguaXNFbXB0eSgpKSB7CiAJCQkJCUlQYXRoIHByb2plY3RQYXRoPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKIAkJCQkJaWYgKCFwcm9qZWN0UGF0aC5pc1ByZWZpeE9mKHBhdGgpIHx8IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgcGF0aCwgdHJ1ZSkgPT0gbnVsbCl7Ci0JCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kU291cmNlRm9sZGVyIiwgcGF0aC50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VGb2xkZXIiLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSCwgVXRpbC5iaW5kKCJjbGFzc3BhdGguaWxsZWdhbFNvdXJjZUZvbGRlclBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRILCBVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsU291cmNlRm9sZGVyUGF0aCIsIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJCWJyZWFrOwogCQl9Ci0JcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsJCQotfQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwkJCisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFDb3JlLmphdmEKaW5kZXggNzI5NzFhOC4uYjVjM2MwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YUNvcmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9KYXZhQ29yZS5qYXZhCkBAIC0xLDU1ICsxLDQ0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QSUxFUl9QQl9TVEFUSUNfQUNDRVNTX1JFQ0VJVkVSCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBJTEVSX1RBU0tfVEFHUworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JFX0NJUkNVTEFSX0NMQVNTUEFUSAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRICisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgcnVuKElXb3Jrc3BhY2VSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvcikKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBleGNsdXNpb24gcGF0dGVybnMgdG8gc291cmNlIGNsYXNzcGF0aCBlbnRyaWVzCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkZWQgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uIHRvIHNvdXJjZSBjbGFzc3BhdGggZW50cmllcworICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JFX0pBVkFfQlVJTERfQ0xFQU5fT1VUUFVUX0ZPTERFUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBTgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGFkZGVkIGdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKFN0cmluZykKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUFTU0lTVF9BUkdVTUVOVF9QUkVGSVhFUworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVBU1NJU1RfRklFTERfUFJFRklYRVMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVBU1NJU1RfTE9DQUxfU1VGRklYRVMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUElMRVJfUEJfQ0hBUl9BUlJBWV9JTl9TVFJJTkdfQ09OQ0FURU5BVElPTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC4qOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU2V0Q2xhc3NwYXRoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogCiAvKioKICAqIFRoZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MgZm9yIHRoZSBKYXZhIG1vZGVsIHBsdWctaW4gY29udGFpbmluZyB0aGUgY29yZQpAQCAtMTU5LDYgKzE0OCwxMiBAQAogCS8qKgogCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgogCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGUiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0sgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jayI7IC8vJE5PTi1OTFMtMSQKIAkvKioKQEAgLTE3NCw2ICsxNjksMTggQEAKIAkvKioKIAkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KIAkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX1dIRU5fSU1QTEVNRU5USU5HX0FCU1RSQUNUID0gUExVR0lOX0lEICsgIi5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX1dIRU5fT1ZFUlJJRElOR19DT05DUkVURSA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCiAJICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9JTVBPUlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0IjsgLy8kTk9OLU5MUy0xJApAQCAtMTk3LDYgKzIwNCwzNiBAQAogCS8qKgogCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgogCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1NUQVRJQ19BQ0NFU1NfUkVDRUlWRVIgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXIiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTk9fRUZGRUNUX0FTU0lHTk1FTlQgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50IjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0lOQ09NUEFUSUJMRV9OT05fSU5IRVJJVEVEX0lOVEVSRkFDRV9NRVRIT0QgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX1VOVVNFRF9QUklWQVRFX01FTUJFUiA9IFBMVUdJTl9JRCArICIuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX1BCX0NIQVJfQVJSQVlfSU5fU1RSSU5HX0NPTkNBVEVOQVRJT04gPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24iOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfUEJfTUFYX1BFUl9VTklUID0gUExVR0lOX0lEICsgIi5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdCI7IC8vJE5PTi1OTFMtMSQKQEAgLTIxNSw2ICsyNTIsMzYgQEAKIAkvKioKIAkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KIAkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVMgPSBQTFVHSU5fSUQgKyAiLmNvbXBpbGVyLnRhc2tQcmlvcml0aWVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIHZhbHVlIGZvciBDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVMuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19QUklPUklUWV9ISUdIID0gIkhJR0giOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUgZm9yIENPTVBJTEVSX1RBU0tfUFJJT1JJVElFUy4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9UQVNLX1BSSU9SSVRZX0xPVyA9ICJMT1ciOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gdmFsdWUgZm9yIENPTVBJTEVSX1RBU0tfUFJJT1JJVElFUy4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9UQVNLX1BSSU9SSVRZX05PUk1BTCA9ICJOT1JNQUwiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfVEFTS19UQUdTID0gUExVR0lOX0lEICsgIi5jb21waWxlci50YXNrVGFncyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucwogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9PUkRFUiA9IFBMVUdJTl9JRCArICIuY29tcHV0ZUphdmFCdWlsZE9yZGVyIjsgLy8kTk9OLU5MUy0xJAogCS8qKgpAQCAtMjI2LDYgKzI5MywzMCBAQAogCS8qKgogCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgogCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UgPSBQTFVHSU5fSUQgKyAiLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSID0gUExVR0lOX0lEICsgIi5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyIjsgLy8kTk9OLU5MUy0xJAkgCQorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSU5DT01QTEVURV9DTEFTU1BBVEggPSBQTFVHSU5fSUQgKyAiLmluY29tcGxldGVDbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEggPSBQTFVHSU5fSUQgKyAiLmNpcmN1bGFyQ2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCiAJICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCA9IFBMVUdJTl9JRCArICIuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJApAQCAtMjM4LDYgKzMyOSwyOCBAQAogCS8qKgogCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgogCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TID0gUExVR0lOX0lEICsgIi5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMgPSBQTFVHSU5fSUQgKyAiLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBEZWZhdWx0IHRhc2sgdGFnCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFTS19UQUcgPSAiVE9ETyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBEZWZhdWx0IHRhc2sgcHJpb3JpdHkKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVNLX1BSSU9SSVRZID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucwogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTkVXTElORV9PUEVOSU5HX0JSQUNFID0gUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIubmV3bGluZS5vcGVuaW5nQnJhY2UiOyAvLyROT04tTkxTLTEkCkBAIC0yOTAsNiArNDAzLDEyIEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX1RBQl9TSVpFID0gUExVR0lOX0lEICsgIi5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIjsgLy8kTk9OLU5MUy0xJAogCS8qKgorCSAqIFBvc3NpYmxlIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQKKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfU1BBQ0VfQ0FTVEVYUFJFU1NJT04gPSBQTFVHSU5fSUQgKyAiLmZvcm1hdHRlci5zcGFjZS5jYXN0ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKKwkvKioKIAkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KIAkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucwogCSAqIEBzaW5jZSAyLjAKQEAgLTMwMSw2ICs0MjAsNTQgQEAKIAkgKiBAc2luY2UgMi4wCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9JTVBMSUNJVF9RVUFMSUZJQ0FUSU9OID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyA9IFBMVUdJTl9JRCArICIuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogUG9zc2libGUgIGNvbmZpZ3VyYWJsZSBvcHRpb24gSUQuCisJICogQHNlZSAjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfRklFTERfU1VGRklYRVMgPSBQTFVHSU5fSUQgKyAiLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFBvc3NpYmxlICBjb25maWd1cmFibGUgb3B0aW9uIElELgorCSAqIEBzZWUgI2dldERlZmF1bHRPcHRpb25zCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcyI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiBJRC4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTID0gUExVR0lOX0lEICsgIi5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcyI7IC8vJE5PTi1OTFMtMSQKIAogCS8vICoqKioqKioqKioqKioqKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zLiAqKioqKioqKioqKioqKioqKioqKgogCQpAQCAtNDMyLDkgKzU5OSwxNiBAQAogCSAqIEBzaW5jZSAyLjAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRCA9ICJkaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiBQb3NzaWJsZSAgY29uZmlndXJhYmxlIG9wdGlvbiB2YWx1ZS4KKwkgKiBAc2VlICNnZXREZWZhdWx0T3B0aW9ucworCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTiA9ICJjbGVhbiI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBDcmVhdGVzIHRoZSBKYXZhIGNvcmUgcGx1Zy1pbi4KKwkgKiBAc2luY2UgMi4xCiAJICovCiAJcHVibGljIEphdmFDb3JlKElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IpIHsKIAkJc3VwZXIocGx1Z2luRGVzY3JpcHRvcik7CkBAIC02MDIsNyArNzc2LDcgQEAKIAkgKgk8bGk+YSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5JQ2xhc3NGaWxlPC9jb2RlPjwvbGk+CiAJICoJPGxpPmEgPGNvZGU+LmphcjwvY29kZT4gZmlsZSAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPjwvbGk+CiAJICogIDxsaT5hIGZvbGRlciAtIHRoZSBlbGVtZW50IHJldHVybmVkIGlzIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPgotCSAqCQkJb3IgPGNvZGU+SVBhY2thZ2VGcmFnbWVudDwvY29kZT48L2xpPgorCSAqICAgIAlvciA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPjwvbGk+CiAJICogIDxsaT50aGUgd29ya3NwYWNlIHJvb3QgcmVzb3VyY2UgLSB0aGUgZWxlbWVudCByZXR1cm5lZCBpcyB0aGUgPGNvZGU+SUphdmFNb2RlbDwvY29kZT48L2xpPgogCSAqCTwvdWw+CiAJICogPHA+CkBAIC03MDAsMTggKzg3NCwxNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aENvbnRhaW5lciBnZXRDbGFzc3BhdGhDb250YWluZXIoZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JCU1hcCBwcm9qZWN0Q29udGFpbmVycyA9IChNYXApSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzLmdldChwcm9qZWN0KTsKLQkJaWYgKHByb2plY3RDb250YWluZXJzID09IG51bGwpewotCQkJcHJvamVjdENvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCgxKTsKLQkJCUphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVycy5wdXQocHJvamVjdCwgcHJvamVjdENvbnRhaW5lcnMpOwotCQl9Ci0JCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpcHJvamVjdENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lclBhdGgpOwotCisJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YU1vZGVsTWFuYWdlci5jb250YWluZXJHZXQocHJvamVjdCwgY29udGFpbmVyUGF0aCk7CiAJCWlmIChjb250YWluZXIgPT0gSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpIHJldHVybiBudWxsOyAvLyBicmVhayBjeWNsZQorCiAJCWlmIChjb250YWluZXIgPT0gbnVsbCl7Ci0JCQlmaW5hbCBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBpbml0aWFsaXplciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoY29udGFpbmVyUGF0aC5zZWdtZW50KDApKTsKKwkJCWZpbmFsIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoY29udGFpbmVyUGF0aC5zZWdtZW50KDApKTsKIAkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKXsKLQkJCQlwcm9qZWN0Q29udGFpbmVycy5wdXQoY29udGFpbmVyUGF0aCwgSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3MpOyAvLyBhdm9pZCBpbml0aWFsaXphdGlvbiBjeWNsZXMKKwkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQQ29udGFpbmVyIElOSVQgLSB0cmlnZ2VyaW5nIGluaXRpYWxpemF0aW9uIG9mOiBbIitwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkrIl0gIiArIGNvbnRhaW5lclBhdGggKyAiIHVzaW5nIGluaXRpYWxpemVyOiAiKyBpbml0aWFsaXplcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKKwkJCQkJbmV3IEV4Y2VwdGlvbigiRkFLRSBleGNlcHRpb24gZm9yIGR1bXBpbmcgY3VycmVudCBDUENvbnRhaW5lciAoWyIrcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKyJdICIrIGNvbnRhaW5lclBhdGgrICIpSU5JVCBpbnZvY2F0aW9uIHN0YWNrIHRyYWNlIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAorCQkJCX0KKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLmNvbnRhaW5lclB1dChwcm9qZWN0LCBjb250YWluZXJQYXRoLCBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lckluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcyk7IC8vIGF2b2lkIGluaXRpYWxpemF0aW9uIGN5Y2xlcwogCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKIAkJCQl0cnkgewogCQkJCQkvLyB3cmFwIGluaXRpYWxpemVyIGNhbGwgd2l0aCBTYWZlIHJ1bm5hYmxlIGluIGNhc2UgaW5pdGlhbGl6ZXIgd291bGQgYmUgY2F1c2luZyBzb21lIGdyaWVmCkBAIC03MjUsMTcgKzg5OCwxNCBAQAogCQkJCQl9KTsKIAkJCQkJCiAJCQkJCS8vIHJldHJpZXZlIHZhbHVlIChpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCkKLQkJCQkJY29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpcHJvamVjdENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lclBhdGgpOworCQkJCQljb250YWluZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmNvbnRhaW5lckdldChwcm9qZWN0LCBjb250YWluZXJQYXRoKTsKIAkJCQkJaWYgKGNvbnRhaW5lciA9PSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lckluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlCiAJCQkJCW9rID0gdHJ1ZTsKIAkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoIW9rKSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMucHV0KHByb2plY3QsIG51bGwpOyAvLyBmbHVzaCBjYWNoZQotCQkJCX0KLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpewotCQkJCQlwcm9qZWN0Q29udGFpbmVycy5wdXQoY29udGFpbmVyUGF0aCwgY29udGFpbmVyKTsKKwkJCQkJaWYgKCFvaykgSmF2YU1vZGVsTWFuYWdlci5jb250YWluZXJQdXQocHJvamVjdCwgY29udGFpbmVyUGF0aCwgbnVsbCk7IC8vIGZsdXNoIGNhY2hlCiAJCQkJfQogCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSl7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQoIkNQQ29udGFpbmVyIElOSVQgLSBhZnRlciByZXNvbHV0aW9uOiAiICsgY29udGFpbmVyUGF0aCArICIgLS0+ICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJDUENvbnRhaW5lciBJTklUIC0gYWZ0ZXIgcmVzb2x1dGlvbjogWyIrcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKyJdICIgKyBjb250YWluZXJQYXRoICsgIiAtLT4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0zJAogCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpewogCQkJCQkJU3lzdGVtLm91dC5wcmludCgiY29udGFpbmVyOiAiK2NvbnRhaW5lci5nZXREZXNjcmlwdGlvbigpKyIgeyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAogCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CkBAIC03NTAsMTIgKzkyMCw1OCBAQAogCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ7dW5ib3VuZH0iKTsvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSl7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BDb250YWluZXIgSU5JVCAtIG5vIGluaXRpYWxpemVyIGZvdW5kIGZvcjogIitwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkrIl0gIiArIGNvbnRhaW5lclBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGNvbnRhaW5lcjsJCQkKIAl9CiAKIAkvKioKKwkgKiBIZWxwZXIgbWV0aG9kIGZpbmRpbmcgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgaW5pdGlhbGl6ZXIgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIElEIAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIGZvdW5kIHdoaWxlIGl0ZXJhdGluZyBvdmVyIHRoZSBjb250cmlidXRpb25zIHRvIGV4dGVuc2lvbiBwb2ludCB0bworCSAqIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi4KKwkgKiA8cD4KKwkgKiBBIGNvbnRhaW5lcklEIGlzIHRoZSBmaXJzdCBzZWdtZW50IG9mIGFueSBjb250YWluZXIgcGF0aCwgdXNlZCB0byBpZGVudGlmeSB0aGUgcmVnaXN0ZXJlZCBjb250YWluZXIgaW5pdGlhbGl6ZXIuCisJICogPHA+CisJICogQHBhcmFtIFN0cmluZyAtIGEgY29udGFpbmVySUQgaWRlbnRpZnlpbmcgYSByZWdpc3RlcmVkIGluaXRpYWxpemVyCisJICogQHJldHVybiBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAtIHRoZSByZWdpc3RlcmVkIGNsYXNzcGF0aCBjb250YWluZXIgaW5pdGlhbGl6ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisJICogbm9uZSB3YXMgZm91bmQuCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoU3RyaW5nIGNvbnRhaW5lcklEKXsKKwkJCisJCVBsdWdpbiBqZHRDb3JlUGx1Z2luID0gSmF2YUNvcmUuZ2V0UGx1Z2luKCk7CisJCWlmIChqZHRDb3JlUGx1Z2luID09IG51bGwpIHJldHVybiBudWxsOworCisJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb24gPSBqZHRDb3JlUGx1Z2luLmdldERlc2NyaXB0b3IoKS5nZXRFeHRlbnNpb25Qb2ludChKYXZhTW9kZWxNYW5hZ2VyLkNQQ09OVEFJTkVSX0lOSVRJQUxJWkVSX0VYVFBPSU5UX0lEKTsKKwkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7CisJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9ICBleHRlbnNpb24uZ2V0RXh0ZW5zaW9ucygpOworCQkJZm9yKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspeworCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQkJZm9yKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKXsKKwkJCQkJU3RyaW5nIGluaXRpYWxpemVySUQgPSBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGluaXRpYWxpemVySUQgIT0gbnVsbCAmJiBpbml0aWFsaXplcklELmVxdWFscyhjb250YWluZXJJRCkpeworCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDUENvbnRhaW5lciBJTklUIC0gZm91bmQgaW5pdGlhbGl6ZXI6ICIrY29udGFpbmVySUQgKyIgLS0+ICIgKyBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJCQkJfQkJCQkJCQorCQkJCQkJdHJ5IHsKKwkJCQkJCQlPYmplY3QgZXhlY0V4dCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlpZiAoZXhlY0V4dCBpbnN0YW5jZW9mIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKXsKKwkJCQkJCQkJcmV0dXJuIChDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcilleGVjRXh0OworCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHBhdGggaGVsZCBpbiB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlLgogCSAqIFJldHVybnMgPG5vZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGJpbmQuCiAJICogPHA+CkBAIC03NjQsNDYgKzk4MCw3MCBAQAogCSAqIDxwPgogCSAqIE5vdGUgdGhhdCBjbGFzc3BhdGggdmFyaWFibGVzIGNhbiBiZSBjb250cmlidXRlZCByZWdpc3RlcmVkIGluaXRpYWxpemVycyBmb3IsCiAJICogdXNpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIuCisJICogSWYgYW4gaW5pdGlhbGl6ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgYSB2YXJpYWJsZSwgaXRzIHBlcnNpc3RlZCB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQ6CisJICogaXRzIGluaXRpYWxpemVyIHdpbGwgdGh1cyBnZXQgdGhlIG9wcG9ydHVuaXR5IHRvIHJlYmluZCB0aGUgdmFyaWFibGUgZGlmZmVyZW50bHkgb24KKwkgKiBlYWNoIHNlc3Npb24uCiAJICoKIAkgKiBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggdmFyaWFibGUKIAkgKiBAcmV0dXJuIHRoZSBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIAogCSAqIEBzZWUgI3NldENsYXNzcGF0aFZhcmlhYmxlCiAJICovCiAJcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDbGFzc3BhdGhWYXJpYWJsZShmaW5hbCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7Ci0KLQkJSVBhdGggdmFyaWFibGVQYXRoID0gKElQYXRoKSBKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7CisJCisJCUlQYXRoIHZhcmlhYmxlUGF0aCA9IEphdmFNb2RlbE1hbmFnZXIudmFyaWFibGVHZXQodmFyaWFibGVOYW1lKTsKIAkJaWYgKHZhcmlhYmxlUGF0aCA9PSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKSByZXR1cm4gbnVsbDsgLy8gYnJlYWsgY3ljbGUKIAkJCi0JCWlmICh2YXJpYWJsZVBhdGggPT0gbnVsbCl7Ci0JCQlmaW5hbCBDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gZ2V0Q2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcih2YXJpYWJsZU5hbWUpOwotCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpewotCQkJCUphdmFNb2RlbE1hbmFnZXIudmFyaWFibGVQdXQodmFyaWFibGVOYW1lLCBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKTsgLy8gYXZvaWQgaW5pdGlhbGl6YXRpb24gY3ljbGVzCisJCWlmICh2YXJpYWJsZVBhdGggIT0gbnVsbCkgeworCQkJcmV0dXJuIHZhcmlhYmxlUGF0aDsKKwkJfQorCisJCS8vIGV2ZW4gaWYgcGVyc2lzdGVkIHZhbHVlIGV4aXN0cywgaW5pdGlhbGl6ZXIgaXMgZ2l2ZW4gcHJpb3JpdHksIG9ubHkgaWYgbm8gaW5pdGlhbGl6ZXIgaXMgZm91bmQgdGhlIHBlcnNpc3RlZCB2YWx1ZSBpcyByZXVzZWQKKwkJZmluYWwgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciBpbml0aWFsaXplciA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIodmFyaWFibGVOYW1lKTsKKwkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpeworCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQVmFyaWFibGUgSU5JVCAtIHRyaWdnZXJpbmcgaW5pdGlhbGl6YXRpb24gb2Y6ICIgKyB2YXJpYWJsZU5hbWUrICIgdXNpbmcgaW5pdGlhbGl6ZXI6ICIrIGluaXRpYWxpemVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJbmV3IEV4Y2VwdGlvbigiRkFLRSBleGNlcHRpb24gZm9yIGR1bXBpbmcgY3VycmVudCBDUFZhcmlhYmxlICgiK3ZhcmlhYmxlTmFtZSsgIilJTklUIGludm9jYXRpb24gc3RhY2sgdHJhY2UiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkJCUphdmFNb2RlbE1hbmFnZXIudmFyaWFibGVQdXQodmFyaWFibGVOYW1lLCBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKTsgLy8gYXZvaWQgaW5pdGlhbGl6YXRpb24gY3ljbGVzCisJCQlib29sZWFuIG9rID0gZmFsc2U7CisJCQl0cnkgewogCQkJCS8vIHdyYXAgaW5pdGlhbGl6ZXIgY2FsbCB3aXRoIFNhZmUgcnVubmFibGUgaW4gY2FzZSBpbml0aWFsaXplciB3b3VsZCBiZSBjYXVzaW5nIHNvbWUgZ3JpZWYKIAkJCQlQbGF0Zm9ybS5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CiAJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCQlVdGlsLmxvZyhleGNlcHRpb24sICJFeGNlcHRpb24gb2NjdXJyZWQgaW4gY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVyOiAiK2luaXRpYWxpemVyKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJVXRpbC5sb2coZXhjZXB0aW9uLCAiRXhjZXB0aW9uIG9jY3VycmVkIGluIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplcjogIitpbml0aWFsaXplcisiIHdoaWxlIGluaXRpYWxpemluZyB2YXJpYWJsZTogIit2YXJpYWJsZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJfQogCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCWluaXRpYWxpemVyLmluaXRpYWxpemUodmFyaWFibGVOYW1lKTsKIAkJCQkJfQogCQkJCX0pOwotCQkJCXZhcmlhYmxlUGF0aCA9IChJUGF0aCkgSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZUdldCh2YXJpYWJsZU5hbWUpOyAvLyByZXRyeQotCQkJCWlmICh2YXJpYWJsZVBhdGggPT0gSmF2YU1vZGVsTWFuYWdlci5WYXJpYWJsZUluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlCisJCQkJdmFyaWFibGVQYXRoID0gKElQYXRoKSBKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7IC8vIGluaXRpYWxpemVyIHNob3VsZCBoYXZlIHBlcmZvcm1lZCBzaWRlLWVmZmVjdAorCQkJCWlmICh2YXJpYWJsZVBhdGggPT0gSmF2YU1vZGVsTWFuYWdlci5WYXJpYWJsZUluaXRpYWxpemF0aW9uSW5Qcm9ncmVzcykgcmV0dXJuIG51bGw7IC8vIGJyZWFrIGN5Y2xlIChpbml0aWFsaXplciBkaWQgbm90IGluaXQgb3IgcmVlbnRlcmluZyBjYWxsKQogCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSl7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BWYXJpYWJsZSBJTklUIC0gYWZ0ZXIgaW5pdGlhbGl6YXRpb246ICIgKyB2YXJpYWJsZU5hbWUgKyAiIC0tPiAiICsgdmFyaWFibGVQYXRoKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKIAkJCQl9CisJCQkJb2sgPSB0cnVlOworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAoIW9rKSBKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlUHV0KHZhcmlhYmxlTmFtZSwgbnVsbCk7IC8vIGZsdXNoIGNhY2hlCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BWYXJpYWJsZSBJTklUIC0gbm8gaW5pdGlhbGl6ZXIgZm91bmQgZm9yOiAiICsgdmFyaWFibGVOYW1lKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiB2YXJpYWJsZVBhdGg7CiAJfQogCiAJLyoqCi0gCSAqIFJldHJpZXZlIHRoZSBjbGllbnQgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVyIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gdmFyaWFibGUgaWYgYW55Ci0gCSAqIAorCSAqIEhlbHBlciBtZXRob2QgZmluZGluZyB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVyIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWUgCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3YXMgZm91bmQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgdGhlIGNvbnRyaWJ1dGlvbnMgdG8gZXh0ZW5zaW9uIHBvaW50IHRvCisJICogdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIuCisJICogPHA+CiAgCSAqIEBwYXJhbSB0aGUgZ2l2ZW4gdmFyaWFibGUKLSAJICogQHJldHVybiB0aGUgY2xpZW50IGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplciByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHZhcmlhYmxlLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisgCSAqIEByZXR1cm4gQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciAtIHRoZSByZWdpc3RlcmVkIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKwkgKiBub25lIHdhcyBmb3VuZC4KKwkgKiBAc2luY2UgMi4xCiAgCSAqLwotCXByaXZhdGUgc3RhdGljIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgZ2V0Q2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcihTdHJpbmcgdmFyaWFibGUpeworCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciBnZXRDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyKFN0cmluZyB2YXJpYWJsZSl7CiAJCQogCQlQbHVnaW4gamR0Q29yZVBsdWdpbiA9IEphdmFDb3JlLmdldFBsdWdpbigpOwogCQlpZiAoamR0Q29yZVBsdWdpbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKQEAgLTgxMywyMyArMTA1MywyMCBAQAogCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSAgZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKTsKIAkJCWZvcihpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKXsKIAkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb25zW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW4gPSBleHRlbnNpb24uZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpOwotCQkJCQlpZiAocGx1Z2luLmlzUGx1Z2luQWN0aXZhdGVkKCkpIHsKLQkJCQkJCWZvcihpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKyl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHZhckF0dHJpYnV0ZSA9IGNvbmZpZ0VsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZSgidmFyaWFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAodmFyaWFibGUuZXF1YWxzKHZhckF0dHJpYnV0ZSkpIHsKLQkJCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BWYXJpYWJsZSBJTklUIC0gZm91bmQgaW5pdGlhbGl6ZXI6ICIrdmFyaWFibGUrIiAtLT4gIiArIGNvbmZpZ0VsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9CQkJCQkJCi0JCQkJCQkJCQlPYmplY3QgZXhlY0V4dCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWlmIChleGVjRXh0IGluc3RhbmNlb2YgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcil7Ci0JCQkJCQkJCQkJcmV0dXJuIChDbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyKWV4ZWNFeHQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7CisJCQkJZm9yKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKXsKKwkJCQkJdHJ5IHsKKwkJCQkJCVN0cmluZyB2YXJBdHRyaWJ1dGUgPSBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoInZhcmlhYmxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWlmICh2YXJpYWJsZS5lcXVhbHModmFyQXR0cmlidXRlKSkgeworCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSkgeworCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQVmFyaWFibGUgSU5JVCAtIGZvdW5kIGluaXRpYWxpemVyOiAiK3ZhcmlhYmxlKyIgLS0+ICIgKyBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0JCQkJCQkKKwkJCQkJCQlPYmplY3QgZXhlY0V4dCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlpZiAoZXhlY0V4dCBpbnN0YW5jZW9mIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIpeworCQkJCQkJCQlyZXR1cm4gKENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIpZXhlY0V4dDsKIAkJCQkJCQl9CiAJCQkJCQl9CisJCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCQkJfQogCQkJCQl9CiAJCQl9CQogCQl9CkBAIC04NjIsMjU3ICsxMDk5LDQyNSBAQAogCSAqIE5vdGU6IG1vcmUgb3B0aW9ucyBtaWdodCBiZSBhZGRlZCBpbiBmdXJ0aGVyIHJlbGVhc2VzLgogCSAqIDxwcmU+CiAJICogUkVDT0dOSVpFRCBPUFRJT05TOgotCSAqCUNPTVBJTEVSIC8gR2VuZXJhdGluZyBMb2NhbCBWYXJpYWJsZSBEZWJ1ZyBBdHRyaWJ1dGUKLSAJICoJCVdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSBsb2NhbCB2YXJpYWJsZSBuYW1lcyAKLQkgKgkJdG8gYmUgZGlzcGxheWVkIGluIGRlYnVnZ2VyLCBvbmx5IGluIHBsYWNlIHdoZXJlIHZhcmlhYmxlcyBhcmUgCi0JICoJCWRlZmluaXRlbHkgYXNzaWduZWQgKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKQotCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGUiCi0JICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImdlbmVyYXRlIiwgImRvIG5vdCBnZW5lcmF0ZSIgfQotCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiZ2VuZXJhdGUiCisJICogQ09NUElMRVIgLyBHZW5lcmF0aW5nIExvY2FsIFZhcmlhYmxlIERlYnVnIEF0dHJpYnV0ZQorIAkgKiAgICBXaGVuIGdlbmVyYXRlZCwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBlbmFibGUgbG9jYWwgdmFyaWFibGUgbmFtZXMgCisJICogICAgdG8gYmUgZGlzcGxheWVkIGluIGRlYnVnZ2VyLCBvbmx5IGluIHBsYWNlIHdoZXJlIHZhcmlhYmxlcyBhcmUgCisJICogICAgZGVmaW5pdGVseSBhc3NpZ25lZCAoLmNsYXNzIGZpbGUgaXMgdGhlbiBiaWdnZXIpCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImdlbmVyYXRlIgogCSAqCi0JICoJQ09NUElMRVIgLyBHZW5lcmF0aW5nIExpbmUgTnVtYmVyIERlYnVnIEF0dHJpYnV0ZSAKLQkgKgkJV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHNvdXJjZSBjb2RlIGhpZ2hsaWdodGluZyBpbiBkZWJ1Z2dlciAKLQkgKgkJKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKS4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImdlbmVyYXRlIgotCSAqCQkKLQkgKglDT01QSUxFUiAvIEdlbmVyYXRpbmcgU291cmNlIERlYnVnIEF0dHJpYnV0ZSAKLQkgKgkJV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHRoZSBkZWJ1Z2dlciB0byBwcmVzZW50IHRoZSAKLQkgKgkJY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJnZW5lcmF0ZSIsICJkbyBub3QgZ2VuZXJhdGUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImdlbmVyYXRlIgotCSAqCQkKLQkgKglDT01QSUxFUiAvIFByZXNlcnZpbmcgVW51c2VkIExvY2FsIFZhcmlhYmxlcwotCSAqCQlVbmxlc3MgcmVxdWVzdGVkIHRvIHByZXNlcnZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMgKGkuZS4gbmV2ZXIgcmVhZCksIHRoZSAKLQkgKgkJY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGVtIG91dCwgcG90ZW50aWFsbHkgYWx0ZXJpbmcgZGVidWdnaW5nCi0JICogICAgIAkJLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAicHJlc2VydmUiLCAib3B0aW1pemUgb3V0IiB9Ci0JICogICAgIAkJLSBkZWZhdWx0OgkJCSJwcmVzZXJ2ZSIKKwkgKiBDT01QSUxFUiAvIEdlbmVyYXRpbmcgTGluZSBOdW1iZXIgRGVidWcgQXR0cmlidXRlIAorCSAqICAgIFdoZW4gZ2VuZXJhdGVkLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGVuYWJsZSBzb3VyY2UgY29kZSBoaWdobGlnaHRpbmcgaW4gZGVidWdnZXIgCisJICogICAgKC5jbGFzcyBmaWxlIGlzIHRoZW4gYmlnZ2VyKS4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImdlbmVyYXRlIiwgImRvIG5vdCBnZW5lcmF0ZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZ2VuZXJhdGUiCisJICogICAgCisJICogQ09NUElMRVIgLyBHZW5lcmF0aW5nIFNvdXJjZSBEZWJ1ZyBBdHRyaWJ1dGUgCisJICogICAgV2hlbiBnZW5lcmF0ZWQsIHRoaXMgYXR0cmlidXRlIHdpbGwgZW5hYmxlIHRoZSBkZWJ1Z2dlciB0byBwcmVzZW50IHRoZSAKKwkgKiAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZSIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZ2VuZXJhdGUiLCAiZG8gbm90IGdlbmVyYXRlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJnZW5lcmF0ZSIKKwkgKiAgICAKKwkgKiBDT01QSUxFUiAvIFByZXNlcnZpbmcgVW51c2VkIExvY2FsIFZhcmlhYmxlcworCSAqICAgIFVubGVzcyByZXF1ZXN0ZWQgdG8gcHJlc2VydmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyAoaS5lLiBuZXZlciByZWFkKSwgdGhlIAorCSAqICAgIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgdGhlbSBvdXQsIHBvdGVudGlhbGx5IGFsdGVyaW5nIGRlYnVnZ2luZworCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAicHJlc2VydmUiLCAib3B0aW1pemUgb3V0IiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJwcmVzZXJ2ZSIKIAkgKiAKLQkgKglDT01QSUxFUiAvIERlZmluaW5nIFRhcmdldCBKYXZhIFBsYXRmb3JtCi0JICoJCUZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSByZWFzb24sIC5jbGFzcyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIHdpdGggY2VydGFpbiBWTSB2ZXJzaW9ucyBhbmQgbGF0ZXIuCi0JICoJCU5vdGUgdGhhdCAiMS40IiB0YXJnZXQgcmVxdWlyZSB0byB0b2dnbGUgY29tcGxpYW5jZSBtb2RlIHRvICIxLjQiIHRvby4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJIjEuMSIKKwkgKiBDT01QSUxFUiAvIERlZmluaW5nIFRhcmdldCBKYXZhIFBsYXRmb3JtCisJICogICAgRm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHJlYXNvbiwgLmNsYXNzIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gd2l0aCBjZXJ0YWluIFZNIHZlcnNpb25zIGFuZCBsYXRlci4KKwkgKiAgICBOb3RlIHRoYXQgIjEuNCIgdGFyZ2V0IHJlcXVpcmUgdG8gdG9nZ2xlIGNvbXBsaWFuY2UgbW9kZSB0byAiMS40IiB0b28uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICIxLjEiLCAiMS4yIiwgIjEuMyIsICIxLjQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIjEuMSIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIFVucmVhY2hhYmxlIENvZGUKLQkgKgkJVW5yZWFjaGFibGUgY29kZSBjYW4gb3B0aW9uYWxseSBiZSByZXBvcnRlZCBhcyBhbiBlcnJvciwgd2FybmluZyBvciBzaW1wbHkgCi0JICoJCWlnbm9yZWQuIFRoZSBieXRlY29kZSBnZW5lcmF0aW9uIHdpbGwgYWx3YXlzIG9wdGltaXplZCBpdCBvdXQuCi0JICogICAgIAkJLSBvcHRpb24gaWQ6CQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnJlYWNoYWJsZUNvZGUiCi0JICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIAkJLSBkZWZhdWx0OgkJCSJlcnJvciIKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbnJlYWNoYWJsZSBDb2RlCisJICogICAgVW5yZWFjaGFibGUgY29kZSBjYW4gb3B0aW9uYWxseSBiZSByZXBvcnRlZCBhcyBhbiBlcnJvciwgd2FybmluZyBvciBzaW1wbHkgCisJICogICAgaWdub3JlZC4gVGhlIGJ5dGVjb2RlIGdlbmVyYXRpb24gd2lsbCBhbHdheXMgb3B0aW1pemVkIGl0IG91dC4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5yZWFjaGFibGVDb2RlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiZXJyb3IiCiAJICoKLQkgKglDT01QSUxFUiAvIFJlcG9ydGluZyBJbnZhbGlkIEltcG9ydAotCSAqCQlBbiBpbXBvcnQgc3RhdGVtZW50IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIG1pZ2h0IG9wdGlvbmFsbHkgYmUgcmVwb3J0ZWQgCi0JICoJCWFzIGFuIGVycm9yLCBhcyBhIHdhcm5pbmcgb3IgaWdub3JlZC4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRJbXBvcnQiCi0JICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIAkJLSBkZWZhdWx0OgkJCSJlcnJvciIKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBJbnZhbGlkIEltcG9ydAorCSAqICAgIEFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgbWlnaHQgb3B0aW9uYWxseSBiZSByZXBvcnRlZCAKKwkgKiAgICBhcyBhbiBlcnJvciwgYXMgYSB3YXJuaW5nIG9yIGlnbm9yZWQuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRJbXBvcnQiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlcnJvciIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIEF0dGVtcHQgdG8gT3ZlcnJpZGUgUGFja2FnZS1EZWZhdWx0IE1ldGhvZAotCSAqCQlBIHBhY2thZ2UgZGVmYXVsdCBtZXRob2QgaXMgbm90IHZpc2libGUgaW4gYSBkaWZmZXJlbnQgcGFja2FnZSwgYW5kIHRodXMgCi0JICoJCWNhbm5vdCBiZSBvdmVycmlkZGVuLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgCi0JICoJCXN1Y2ggc2NlbmFyaWkgZWl0aGVyIGFzIGFuIGVycm9yIG9yIGEgd2FybmluZy4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZCIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJIndhcm5pbmciCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgQXR0ZW1wdCB0byBPdmVycmlkZSBQYWNrYWdlLURlZmF1bHQgTWV0aG9kCisJICogICAgQSBwYWNrYWdlIGRlZmF1bHQgbWV0aG9kIGlzIG5vdCB2aXNpYmxlIGluIGEgZGlmZmVyZW50IHBhY2thZ2UsIGFuZCB0aHVzIAorCSAqICAgIGNhbm5vdCBiZSBvdmVycmlkZGVuLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgCisJICogICAgc3VjaCBzY2VuYXJpaSBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2QiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgogCSAqCi0JICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgTWV0aG9kIFdpdGggQ29uc3RydWN0b3IgTmFtZQotCSAqCQlOYW1pbmcgYSBtZXRob2Qgd2l0aCBhIGNvbnN0cnVjdG9yIG5hbWUgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgcG9vciAKLQkgKgkJc3R5bGUgcHJvZ3JhbW1pbmcuIFdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24sIHRoZSBjb21waWxlciB3aWxsIHNpZ25hbCBzdWNoIAotCSAqCQlzY2VuYXJpaSBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgotCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZSIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJIndhcm5pbmciCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgTWV0aG9kIFdpdGggQ29uc3RydWN0b3IgTmFtZQorCSAqICAgIE5hbWluZyBhIG1ldGhvZCB3aXRoIGEgY29uc3RydWN0b3IgbmFtZSBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCBwb29yIAorCSAqICAgIHN0eWxlIHByb2dyYW1taW5nLiBXaGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLCB0aGUgY29tcGlsZXIgd2lsbCBzaWduYWwgc3VjaCAKKwkgKiAgICBzY2VuYXJpaSBlaXRoZXIgYXMgYW4gZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIERlcHJlY2F0aW9uCi0JICoJCVdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVzZSBvZiBkZXByZWNhdGVkIEFQSSBlaXRoZXIgYXMgYW4gCi0JICoJCWVycm9yIG9yIGEgd2FybmluZy4KLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAJCS0gZGVmYXVsdDoJCQkid2FybmluZyIKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBEZXByZWNhdGlvbgorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVzZSBvZiBkZXByZWNhdGVkIEFQSSBlaXRoZXIgYXMgYW4gCisJICogICAgZXJyb3Igb3IgYSB3YXJuaW5nLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCiAJICoKLQkgKglDT01QSUxFUiAvIFJlcG9ydGluZyBIaWRkZW4gQ2F0Y2ggQmxvY2sKLQkgKgkJTG9jYWxseSB0byBhIHRyeSBzdGF0ZW1lbnQsIHNvbWUgY2F0Y2ggYmxvY2tzIG1heSBoaWRlIG90aGVycyAsIGUuZy4KLQkgKgkJCXRyeSB7CXRocm93IG5ldyBqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uKCk7Ci0JICoJCQl9IGNhdGNoIChqYXZhLmlvLkNoYXJDb252ZXJzaW9uRXhjZXB0aW9uIGUpIHsKLQkgKiAgCSAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHt9LiAKLQkgKgkJV2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciBoaWRkZW4gCi0JICoJCWNhdGNoIGJsb2NrcyBjb3JyZXNwb25kaW5nIHRvIGNoZWNrZWQgZXhjZXB0aW9ucwotCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jayIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJIndhcm5pbmciCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgRGVwcmVjYXRpb24gSW5zaWRlIERlcHJlY2F0ZWQgQ29kZQorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVzZSBvZiBkZXByZWNhdGVkIEFQSSBpbnNpZGUgZGVwcmVjYXRlZCBjb2RlLgorCSAqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uIi4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBMb2NhbAotCSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgdW51c2VkIGxvY2FsIAotCSAqCQl2YXJpYWJsZXMgKGkuZS4gdmFyaWFibGVzIG5ldmVyIHJlYWQgZnJvbSkKLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIEhpZGRlbiBDYXRjaCBCbG9jaworCSAqICAgIExvY2FsbHkgdG8gYSB0cnkgc3RhdGVtZW50LCBzb21lIGNhdGNoIGJsb2NrcyBtYXkgaGlkZSBvdGhlcnMgLCBlLmcuCisJICogICAgICB0cnkgeyAgdGhyb3cgbmV3IGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oKTsKKwkgKiAgICAgIH0gY2F0Y2ggKGphdmEuaW8uQ2hhckNvbnZlcnNpb25FeGNlcHRpb24gZSkgeworCSAqICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7fS4gCisJICogICAgV2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciBoaWRkZW4gCisJICogICAgY2F0Y2ggYmxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gY2hlY2tlZCBleGNlcHRpb25zCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2siCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJ3YXJuaW5nIgogCSAqCi0JICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFBhcmFtZXRlcgotCSAqCQlXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgdW51c2VkIG1ldGhvZCAKLQkgKgkJcGFyYW1ldGVycyAoaS5lLiBwYXJhbWV0ZXJzIG5ldmVyIHJlYWQgZnJvbSkKLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImlnbm9yZSIKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbnVzZWQgTG9jYWwKKwkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyBmb3IgdW51c2VkIGxvY2FsIAorCSAqICAgIHZhcmlhYmxlcyAoaS5lLiB2YXJpYWJsZXMgbmV2ZXIgcmVhZCBmcm9tKQorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBJbXBvcnQKLQkgKgkJV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBpbXBvcnQgCi0JICoJCXJlZmVyZW5jZSAKLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydCIKLQkgKiAgICAgCQktIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgCQktIGRlZmF1bHQ6CQkJImlnbm9yZSIKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbnVzZWQgUGFyYW1ldGVyCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBtZXRob2QgCisJICogICAgcGFyYW1ldGVycyAoaS5lLiBwYXJhbWV0ZXJzIG5ldmVyIHJlYWQgZnJvbSkKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgogCSAqCi0JICoJQ09NUElMRVIgLyBSZXBvcnRpbmcgU3ludGhldGljIEFjY2VzcyBFbXVsYXRpb24KLQkgKgkJV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgaXQgZW11bGF0ZXMgCi0JICoJCWFjY2VzcyB0byBhIG5vbi1hY2Nlc3NpYmxlIG1lbWJlciBvZiBhbiBlbmNsb3NpbmcgdHlwZS4gU3VjaCBhY2Nlc3MgY2FuIGhhdmUKLQkgKgkJcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgotCSAqICAgICAJCS0gb3B0aW9uIGlkOgkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uIgotCSAqICAgICAJCS0gcG9zc2libGUgdmFsdWVzOgl7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQotCSAqICAgICAJCS0gZGVmYXVsdDoJCQkiaWdub3JlIgorCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBQYXJhbWV0ZXIgaWYgSW1wbGVtZW50aW5nIEFic3RyYWN0IE1ldGhvZAorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVudXNlZCBwYXJhbWV0ZXJzIGluIGFic3RyYWN0IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuCisJICogICAgVGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGlzIGNvbnRyb2xsZWQgd2l0aCBvcHRpb24gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyIi4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJkaXNhYmxlZCIKIAkgKgotCSAqCUNPTVBJTEVSIC8gUmVwb3J0aW5nIE5vbi1FeHRlcm5hbGl6ZWQgU3RyaW5nIExpdGVyYWwKLQkgKgkJV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIG5vbiBleHRlcm5hbGl6ZWQgCi0JICoJCVN0cmluZyBsaXRlcmFsIChpLmUuIG5vbiB0YWdnZWQgd2l0aCAvLyROT04tTkxTLTxuPiQpLiAKLQkgKiAgICAgCQktIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwiCi0JICogICAgIAkJLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9Ci0JICogICAgIAkJLSBkZWZhdWx0OgkJCSJpZ25vcmUiCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIFBhcmFtZXRlciBpZiBPdmVycmlkaW5nIENvbmNyZXRlIE1ldGhvZAorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgc2lnbmFsIHVudXNlZCBwYXJhbWV0ZXJzIGluIG1ldGhvZHMgb3ZlcnJpZGluZyBjb25jcmV0ZSBvbmVzLgorCSAqICAgIFRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSBpcyBjb250cm9sbGVkIHdpdGggb3B0aW9uICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlciIuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGUiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgorCSAqCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVW51c2VkIEltcG9ydAorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIGZvciB1bnVzZWQgaW1wb3J0IAorCSAqICAgIHJlZmVyZW5jZSAKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKKwkgKgorCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVudXNlZCBQcml2YXRlIE1lbWJlcnMKKwkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBhIHByaXZhdGUgCisJICogICAgbWV0aG9kIG9yIGZpZWxkIGlzIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkIHdpdGhpbiB0aGUgc2FtZSB1bml0LgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgorCSAqCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgU3ludGhldGljIEFjY2VzcyBFbXVsYXRpb24KKwkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciBpdCBlbXVsYXRlcyAKKwkgKiAgICBhY2Nlc3MgdG8gYSBub24tYWNjZXNzaWJsZSBtZW1iZXIgb2YgYW4gZW5jbG9zaW5nIHR5cGUuIFN1Y2ggYWNjZXNzIGNhbiBoYXZlCisJICogICAgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb24iCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCisJICoKKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBOb24tRXh0ZXJuYWxpemVkIFN0cmluZyBMaXRlcmFsCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIG5vbiBleHRlcm5hbGl6ZWQgCisJICogICAgU3RyaW5nIGxpdGVyYWwgKGkuZS4gbm9uIHRhZ2dlZCB3aXRoIC8vJE5PTi1OTFMtPG4+JCkuIAorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgogCSAqIAogCSAqIENPTVBJTEVSIC8gUmVwb3J0aW5nIFVzYWdlIG9mICdhc3NlcnQnIElkZW50aWZpZXIKIAkgKiAgICBXaGVuIGVuYWJsZWQsIHRoZSBjb21waWxlciB3aWxsIGlzc3VlIGFuIGVycm9yIG9yIGEgd2FybmluZyB3aGVuZXZlciAnYXNzZXJ0JyBpcyAKIAkgKiAgICB1c2VkIGFzIGFuIGlkZW50aWZpZXIgKHJlc2VydmVkIGtleXdvcmQgaW4gMS40KQotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJpZ25vcmUiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpZ25vcmUiCiAJICogCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgTm9uLVN0YXRpYyBSZWZlcmVuY2UgdG8gYSBTdGF0aWMgTWVtYmVyCisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgd2hlbmV2ZXIgYSBzdGF0aWMgZmllbGQKKwkgKiAgICBvciBtZXRob2QgaXMgYWNjZXNzZWQgd2l0aCBhbiBleHByZXNzaW9uIHJlY2VpdmVyLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCisJICogCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgQXNzaWdubWVudCB3aXRoIG5vIEVmZmVjdAorCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIGFzc2lnbm1lbnQKKwkgKiAgICBoYXMgbm8gZWZmZWN0IChlLmcgJ3ggPSB4JykuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCisJICogCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgSW50ZXJmYWNlIE1ldGhvZCBub3QgQ29tcGF0aWJsZSB3aXRoIG5vbi1Jbmhlcml0ZWQgTWV0aG9kcworCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGFuIGludGVyZmFjZQorCSAqICAgIGRlZmluZXMgYSBtZXRob2QgaW5jb21wYXRpYmxlIHdpdGggYSBub24taW5oZXJpdGVkIE9iamVjdCBvbmUuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiZXJyb3IiLCAid2FybmluZyIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIndhcm5pbmciCisJICogCisJICogQ09NUElMRVIgLyBSZXBvcnRpbmcgVXNhZ2Ugb2YgY2hhcltdIEV4cHJlc3Npb25zIGluIFN0cmluZyBDb25jYXRlbmF0aW9ucworCSAqICAgIFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgaXNzdWUgYW4gZXJyb3Igb3IgYSB3YXJuaW5nIHdoZW5ldmVyIGEgY2hhcltdIGV4cHJlc3Npb24KKwkgKiAgICBpcyB1c2VkIGluIFN0cmluZyBjb25jYXRlbmF0aW9ucyAoZS5nLiAiaGVsbG8iICsgbmV3IGNoYXJbXXsndycsJ28nLCdyJywnbCcsJ2QnfSkuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAid2FybmluZyIKKwkgKgogCSAqIENPTVBJTEVSIC8gU2V0dGluZyBTb3VyY2UgQ29tcGF0aWJpbGl0eSBNb2RlCiAJICogICAgU3BlY2lmeSB3aGV0aGVyIHNvdXJjZSBpcyAxLjMgb3IgMS40IGNvbXBhdGlibGUuIEZyb20gMS40IG9uLCAnYXNzZXJ0JyBpcyBhIGtleXdvcmQKIAkgKiAgICByZXNlcnZlZCBmb3IgYXNzZXJ0aW9uIHN1cHBvcnQuIEFsc28gbm90ZSwgdGhhbiB3aGVuIHRvZ2dsaW5nIHRvIDEuNCBtb2RlLCB0aGUgdGFyZ2V0IFZNCiAJICogICBsZXZlbCBzaG91bGQgYmUgc2V0IHRvICIxLjQiIGFuZCB0aGUgY29tcGxpYW5jZSBtb2RlIHNob3VsZCBiZSAiMS40Ii4KLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgIjEuMyIsICIxLjQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSIxLjMiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2UiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjEuMyIsICIxLjQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIjEuMyIKIAkgKiAKIAkgKiBDT01QSUxFUiAvIFNldHRpbmcgQ29tcGxpYW5jZSBMZXZlbAogCSAqICAgIFNlbGVjdCB0aGUgY29tcGxpYW5jZSBsZXZlbCBmb3IgdGhlIGNvbXBpbGVyLiBJbiAiMS4zIiBtb2RlLCBzb3VyY2UgYW5kIHRhcmdldCBzZXR0aW5ncwogCSAqICAgIHNob3VsZCBub3QgZ28gYmV5b25kICIxLjMiIGxldmVsLgotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgIjEuMyIsICIxLjQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSIxLjMiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICIxLjMiLCAiMS40IiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIxLjMiCiAJICogCiAJICogQ09NUElMRVIgLyBNYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBwZXIgY29tcGlsYXRpb24gdW5pdAogCSAqICAgIFNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGVhY2ggY29tcGlsYXRpb24gdW5pdC4KLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgkiPG4+IiB3aGVyZSA8bj4gaXMgemVybyBvciBhIHBvc2l0aXZlIGludGVnZXIgKGlmIHplcm8gdGhlbiBhbGwgcHJvYmxlbXMgYXJlIHJlcG9ydGVkKS4KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSIxMDAiCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIxMDAiCiAJICogCisJICogQ09NUElMRVIgLyBEZWZpbmUgdGhlIEF1dG9tYXRpYyBUYXNrIFRhZ3MKKwkgKiAgICBXaGVuIHRoZSB0YWcgaXMgbm9uIGVtcHR5LCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhIHRhc2sgbWFya2VyIHdoZW5ldmVyIGl0IGVuY291bnRlcnMKKwkgKiAgICBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdGFnIGluc2lkZSBhbnkgY29tbWVudCBpbiBKYXZhIHNvdXJjZSBjb2RlLgorCSAqICAgIEdlbmVyYXRlZCB0YXNrIG1lc3NhZ2VzIHdpbGwgaW5jbHVkZSB0aGUgdGFnLCBhbmQgcmFuZ2UgdW50aWwgdGhlIG5leHQgbGluZSBzZXBhcmF0b3Igb3IgY29tbWVudCBlbmRpbmcsIGFuZCB3aWxsIGJlIHRyaW1tZWQuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrVGFncyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiPHRhZz5bLDx0YWc+XSoiIH0gd2hlcmUgPHRhZz4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIAorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgorCSAqIAorCSAqIENPTVBJTEVSIC8gRGVmaW5lIHRoZSBBdXRvbWF0aWMgVGFzayBQcmlvcml0aWVzCisJICogICAgSW4gcGFyYWxsZWwgd2l0aCB0aGUgQXV0b21hdGljIFRhc2sgVGFncywgdGhpcyBsaXN0IGRlZmluZXMgdGhlIHByaW9yaXRpZXMgKGhpZ2gsIG5vcm1hbCBvciBsb3cpCisJICogICAgb2YgdGhlIHRhc2sgbWFya2VycyBpc3N1ZWQgYnkgdGhlIGNvbXBpbGVyLgorCSAqICAgIElmIHRoZSBkZWZhdWx0IGlzIHNwZWNpZmllZCwgdGhlIHByaW9yaXR5IG9mIGVhY2ggdGFzayBtYXJrZXIgaXMgIk5PUk1BTCIuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci50YXNrUHJpb3JpdGllcyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiPHByaW9yaXR5PlssPHByaW9yaXR5Pl0qIiB9IHdoZXJlIDxwcmlvcml0eT4gaXMgb25lIG9mICJISUdIIiwgIk5PUk1BTCIgb3IgIkxPVyIKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKKwkgKgogCSAqIEJVSUxERVIgLyBTcGVjaWZ5aW5nIEZpbHRlcnMgZm9yIFJlc291cmNlIENvcHlpbmcgQ29udHJvbAogCSAqICAgIEFsbG93IHRvIHNwZWNpZnkgc29tZSBmaWx0ZXJzIHRvIGNvbnRyb2wgdGhlIHJlc291cmNlIGNvcHkgcHJvY2Vzcy4KLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiPG5hbWU+Wyw8bmFtZT5dKiB9IHdoZXJlIDxuYW1lPiBpcyBhIGZpbGUgbmFtZSBwYXR0ZXJuIChvbmx5ICogd2lsZC1jYXJkcyBhbGxvd2VkKQorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjxuYW1lPlssPG5hbWU+XSogfSB3aGVyZSA8bmFtZT4gaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAoKiBhbmQgPyB3aWxkLWNhcmRzIGFsbG93ZWQpCiAJICogICAgICAgb3IgdGhlIG5hbWUgb2YgYSBmb2xkZXIgd2hpY2ggZW5kcyB3aXRoICcvJwotCSAqICAgICAtIGRlZmF1bHQ6CQkJIiIKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKIAkgKiAKIAkgKiBCVUlMREVSIC8gQWJvcnQgaWYgSW52YWxpZCBDbGFzc3BhdGgKIAkgKiAgICBBbGxvdyB0byB0b2dnbGUgdGhlIGJ1aWxkZXIgdG8gYWJvcnQgaWYgdGhlIGNsYXNzcGF0aCBpcyBpbnZhbGlkCi0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGgiCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJhYm9ydCIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJpZ25vcmUiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGgiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImFib3J0IiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaWdub3JlIgogCSAqIAotCSAqCUpBVkFDT1JFIC8gQ29tcHV0aW5nIFByb2plY3QgQnVpbGQgT3JkZXIKKwkgKiBCVUlMREVSIC8gQ2xlYW5pbmcgT3V0cHV0IEZvbGRlcihzKQorCSAqICAgIEluZGljYXRlIHdoZXRoZXIgdGhlIEphdmFCdWlsZGVyIGlzIGFsbG93ZWQgdG8gY2xlYW4gdGhlIG91dHB1dCBmb2xkZXJzCisJICogICAgd2hlbiBwZXJmb3JtaW5nIGZ1bGwgYnVpbGQgb3BlcmF0aW9ucy4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImNsZWFuIiwgImlnbm9yZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiY2xlYW4iCisJICogCisJICogSkFWQUNPUkUgLyBDb21wdXRpbmcgUHJvamVjdCBCdWlsZCBPcmRlcgogCSAqICAgIEluZGljYXRlIHdoZXRoZXIgSmF2YUNvcmUgc2hvdWxkIGVuZm9yY2UgdGhlIHByb2plY3QgYnVpbGQgb3JkZXIgdG8gYmUgYmFzZWQgb24KIAkgKiAgICB0aGUgY2xhc3NwYXRoIHByZXJlcXVpc2l0ZSBjaGFpbi4gV2hlbiByZXF1ZXN0aW5nIHRvIGNvbXB1dGUsIHRoaXMgdGFrZXMgb3ZlcgogCSAqICAgIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IG9yZGVyIChiYXNlZCBvbiBwcm9qZWN0IHJlZmVyZW5jZXMpLgotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcHV0ZUphdmFCdWlsZE9yZGVyIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiY29tcHV0ZSIsICJpZ25vcmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJpZ25vcmUiCSAKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXB1dGVKYXZhQnVpbGRPcmRlciIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiY29tcHV0ZSIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImlnbm9yZSIJIAogCSAqIAogCSAqIEpBVkFDT1JFIC8gU3BlY2lmeSBEZWZhdWx0IFNvdXJjZSBFbmNvZGluZyBGb3JtYXQKIAkgKiAgICBHZXQgdGhlIGVuY29kaW5nIGZvcm1hdCBmb3IgY29tcGlsZWQgc291cmNlcy4gVGhpcyBzZXR0aW5nIGlzIHJlYWQtb25seSwgaXQgaXMgZXF1aXZhbGVudAogCSAqICAgIHRvICdSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKScuCi0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5lbmNvZGluZyIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgYW55IG9mIHRoZSBzdXBwb3J0ZWQgZW5jb2RpbmcgbmFtZX0uCi0JICogICAgIC0gZGVmYXVsdDoJCQk8cGxhdGZvcm0gZGVmYXVsdD4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7IGFueSBvZiB0aGUgc3VwcG9ydGVkIGVuY29kaW5nIG5hbWV9LgorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICA8cGxhdGZvcm0gZGVmYXVsdD4KKwkgKiAKKwkgKiBKQVZBQ09SRSAvIFJlcG9ydGluZyBJbmNvbXBsZXRlIENsYXNzcGF0aAorCSAqICAgIEluZGljYXRlIHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSByZXBvcnRlZCB3aGVuIGFuIGVudHJ5IG9uIHRoZSBjbGFzc3BhdGggZG9lc24ndCBleGlzdCAKKwkgKiAgICBpcyBub3QgbGVnaXRlIG9yIGlzIG5vdCB2aXNpYmxlIChlLmcuIGEgcmVmZXJlbmNlZCBwcm9qZWN0IGlzIGNsb3NlZCkuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlcnJvciIsICJ3YXJuaW5nIn0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVycm9yIgorCSAqIAorCSAqIEpBVkFDT1JFIC8gUmVwb3J0aW5nIENsYXNzcGF0aCBDeWNsZQorCSAqICAgIEluZGljYXRlIHRoZSBzZXZlcml0eSBvZiB0aGUgcHJvYmxlbSByZXBvcnRlZCB3aGVuIGEgcHJvamVjdCBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xlLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGgiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVycm9yIiwgIndhcm5pbmciIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVycm9yIgorCSAqIAorCSAqIEpBVkFDT1JFIC8gRW5hYmxpbmcgVXNhZ2Ugb2YgQ2xhc3NwYXRoIEV4Y2x1c2lvbiBQYXR0ZXJucworCSAqICAgIFdoZW4gc2V0IHRvICJkaXNhYmxlZCIsIG5vIGVudHJ5IG9uIGEgcHJvamVjdCBjbGFzc3BhdGggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aAorCSAqICAgIGFuIGV4Y2x1c2lvbiBwYXR0ZXJuLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJlbmFibGVkIgorCSAqIAorCSAqIEpBVkFDT1JFIC8gRW5hYmxpbmcgVXNhZ2Ugb2YgQ2xhc3NwYXRoIE11bHRpcGxlIE91dHB1dCBMb2NhdGlvbnMKKwkgKiAgICBXaGVuIHNldCB0byAiZGlzYWJsZWQiLCBubyBlbnRyeSBvbiBhIHByb2plY3QgY2xhc3NwYXRoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICBhIHNwZWNpZmljIG91dHB1dCBsb2NhdGlvbiwgcHJldmVudGluZyB0aHVzIHVzYWdlIG9mIG11bHRpcGxlIG91dHB1dCBsb2NhdGlvbnMuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImVuYWJsZWQiCiAJICogCiAJICoJRk9STUFUVEVSIC8gSW5zZXJ0aW5nIE5ldyBMaW5lIEJlZm9yZSBPcGVuaW5nIEJyYWNlCiAJICogICAgV2hlbiBJbnNlcnQsIGEgbmV3IGxpbmUgaXMgaW5zZXJ0ZWQgYmVmb3JlIGFuIG9wZW5pbmcgYnJhY2UsIG90aGVyd2lzZSBub3RoaW5nCiAJICogICAgaXMgaW5zZXJ0ZWQKLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLm9wZW5pbmdCcmFjZSIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDoJCQkiZG8gbm90IGluc2VydCIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLm9wZW5pbmdCcmFjZSIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRvIG5vdCBpbnNlcnQiCiAJICogCiAJICoJRk9STUFUVEVSIC8gSW5zZXJ0aW5nIE5ldyBMaW5lIEluc2lkZSBDb250cm9sIFN0YXRlbWVudAogCSAqICAgIFdoZW4gSW5zZXJ0LCBhIG5ldyBsaW5lIGlzIGluc2VydGVkIGJldHdlZW4gfSBhbmQgZm9sbG93aW5nIGVsc2UsIGNhdGNoLCBmaW5hbGx5Ci0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5jb250cm9sU3RhdGVtZW50IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJkbyBub3QgaW5zZXJ0IgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ld2xpbmUuY29udHJvbFN0YXRlbWVudCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRvIG5vdCBpbnNlcnQiCiAJICogCiAJICoJRk9STUFUVEVSIC8gQ2xlYXJpbmcgQmxhbmsgTGluZXMKIAkgKiAgICBXaGVuIENsZWFyIGFsbCwgYWxsIGJsYW5rIGxpbmVzIGFyZSByZW1vdmVkLiBXaGVuIFByZXNlcnZlIG9uZSwgb25seSBvbmUgaXMga2VwdAogCSAqICAgIGFuZCBhbGwgb3RoZXJzIHJlbW92ZWQuCi0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5jbGVhckFsbCIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImNsZWFyIGFsbCIsICJwcmVzZXJ2ZSBvbmUiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJwcmVzZXJ2ZSBvbmUiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5jbGVhckFsbCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiY2xlYXIgYWxsIiwgInByZXNlcnZlIG9uZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAicHJlc2VydmUgb25lIgogCSAqIAogCSAqCUZPUk1BVFRFUiAvIEluc2VydGluZyBOZXcgTGluZSBCZXR3ZWVuIEVsc2UvSWYgCiAJICogICAgV2hlbiBJbnNlcnQsIGEgYmxhbmsgbGluZSBpcyBpbnNlcnRlZCBiZXR3ZWVuIGFuIGVsc2UgYW5kIGFuIGlmIHdoZW4gdGhleSBhcmUgCiAJICogICAgY29udGlndW91cy4gV2hlbiBjaG9vc2luZyB0byBub3QgaW5zZXJ0LCBlbHNlLWlmIHdpbGwgYmUga2VwdCBvbiB0aGUgc2FtZQogCSAqICAgIGxpbmUgd2hlbiBwb3NzaWJsZS4KLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmVsc2VJZiIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9Ci0JICogICAgIC0gZGVmYXVsdDoJCQkiZG8gbm90IGluc2VydCIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXdsaW5lLmVsc2VJZiIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRvIG5vdCBpbnNlcnQiCiAJICogCiAJICoJRk9STUFUVEVSIC8gSW5zZXJ0aW5nIE5ldyBMaW5lIEluIEVtcHR5IEJsb2NrCiAJICogICAgV2hlbiBpbnNlcnQsIGEgbGluZSBicmVhayBpcyBpbnNlcnRlZCBiZXR3ZWVuIGNvbnRpZ3VvdXMgeyBhbmQgfSwgaWYgfSBpcyBub3QgZm9sbG93ZWQKIAkgKiAgICBieSBhIGtleXdvcmQuCi0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5lbXB0eUJsb2NrIgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiaW5zZXJ0IiwgImRvIG5vdCBpbnNlcnQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJpbnNlcnQiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV3bGluZS5lbXB0eUJsb2NrIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICJpbnNlcnQiLCAiZG8gbm90IGluc2VydCIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiaW5zZXJ0IgogCSAqIAogCSAqCUZPUk1BVFRFUiAvIFNwbGl0dGluZyBMaW5lcyBFeGNlZWRpbmcgTGVuZ3RoCiAJICogICAgRW5hYmxlIHNwbGl0dGluZyBvZiBsb25nIGxpbmVzIChleGNlZWRpbmcgdGhlIGNvbmZpZ3VyYWJsZSBsZW5ndGgpLiBMZW5ndGggb2YgMCB3aWxsCiAJICogICAgZGlzYWJsZSBsaW5lIHNwbGl0dGluZwotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdCIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgkiPG4+Iiwgd2hlcmUgbiBpcyB6ZXJvIG9yIGEgcG9zaXRpdmUgaW50ZWdlcgotCSAqICAgICAtIGRlZmF1bHQ6CQkJIjgwIgorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiODAiCiAJICogCiAJICoJRk9STUFUVEVSIC8gQ29tcGFjdGluZyBBc3NpZ25tZW50CiAJICogICAgQXNzaWdubWVudHMgY2FuIGJlIGZvcm1hdHRlZCBhc3ltbWV0cmljYWxseSwgZS5nLiAnaW50IHg9IDI7Jywgd2hlbiBOb3JtYWwsIGEgc3BhY2UKIAkgKiAgICBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IKLQkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5zdHlsZS5hc3NpZ25tZW50IgotCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJeyAiY29tcGFjdCIsICJub3JtYWwiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJub3JtYWwiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuc3R5bGUuYXNzaWdubWVudCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiY29tcGFjdCIsICJub3JtYWwiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIm5vcm1hbCIKIAkgKiAKIAkgKglGT1JNQVRURVIgLyBEZWZpbmluZyBJbmRlbnRhdGlvbiBDaGFyYWN0ZXIKIAkgKiAgICBFaXRoZXIgY2hvb3NlIHRvIGluZGVudCB3aXRoIHRhYiBjaGFyYWN0ZXJzIG9yIHNwYWNlcwotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhciIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgInRhYiIsICJzcGFjZSIgfQotCSAqICAgICAtIGRlZmF1bHQ6CQkJInRhYiIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgInRhYiIsICJzcGFjZSIgfQorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAidGFiIgogCSAqIAogCSAqCUZPUk1BVFRFUiAvIERlZmluaW5nIFNwYWNlIEluZGVudGF0aW9uIExlbmd0aAogCSAqICAgIFdoZW4gdXNpbmcgc3BhY2VzLCBzZXQgdGhlIGFtb3VudCBvZiBzcGFjZSBjaGFyYWN0ZXJzIHRvIHVzZSBmb3IgZWFjaCAKIAkgKiAgICBpbmRlbnRhdGlvbiBtYXJrLgotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemUiCiAJICogICAgIC0gcG9zc2libGUgdmFsdWVzOgkiPG4+Iiwgd2hlcmUgbiBpcyBhIHBvc2l0aXZlIGludGVnZXIKLQkgKiAgICAgLSBkZWZhdWx0OgkJCSI0IgorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiNCIKKwkgKiAKKwkgKglGT1JNQVRURVIgLyBJbnNlcnRpbmcgc3BhY2UgaW4gY2FzdCBleHByZXNzaW9uCisJICogICAgV2hlbiBJbnNlcnQsIGEgc3BhY2UgaXMgYWRkZWQgYmV0d2VlbiB0aGUgdHlwZSBhbmQgdGhlIGV4cHJlc3Npb24gaW4gYSBjYXN0IGV4cHJlc3Npb24uCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuc3BhY2UuY2FzdGV4cHJlc3Npb24iCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImluc2VydCIsICJkbyBub3QgaW5zZXJ0IiB9CisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICJpbnNlcnQiCiAJICogCiAJICoJQ09ERUFTU0lTVCAvIEFjdGl2YXRlIFZpc2liaWxpdHkgU2Vuc2l0aXZlIENvbXBsZXRpb24KIAkgKiAgICBXaGVuIGFjdGl2ZSwgY29tcGxldGlvbiBkb2Vzbid0IHNob3cgdGhhdCB5b3UgY2FuIG5vdCBzZWUKIAkgKiAgICAoZS5nLiB5b3UgY2FuIG5vdCBzZWUgcHJpdmF0ZSBtZXRob2RzIG9mIGEgc3VwZXIgY2xhc3MpLgotCSAqICAgICAtIG9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayIKLQkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KLQkgKiAgICAgLSBkZWZhdWx0OgkJCSJkaXNhYmxlZCIKKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS52aXNpYmlsaXR5Q2hlY2siCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgogCSAqIAogCSAqCUNPREVBU1NJU1QgLyBBdXRvbWF0aWMgUXVhbGlmaWNhdGlvbiBvZiBJbXBsaWNpdCBNZW1iZXJzCiAJICogICAgV2hlbiBhY3RpdmUsIGNvbXBsZXRpb24gYXV0b21hdGljYWxseSBxdWFsaWZpZXMgY29tcGxldGlvbiBvbiBpbXBsaWNpdAogCSAqICAgIGZpZWxkIHJlZmVyZW5jZXMgYW5kIG1lc3NhZ2UgZXhwcmVzc2lvbnMuCi0JICogICAgIC0gb3B0aW9uIGlkOgkJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iCi0JICogICAgIC0gcG9zc2libGUgdmFsdWVzOgl7ICJlbmFibGVkIiwgImRpc2FibGVkIiB9Ci0JICogICAgIC0gZGVmYXVsdDoJCQkiZGlzYWJsZWQiCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgImVuYWJsZWQiLCAiZGlzYWJsZWQiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgImRpc2FibGVkIgorCSAqIAorCSAqICBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgRmllbGQgTmFtZQorCSAqICAgIFdoZW4gdGhlIHByZWZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjxwcmVmaXg+Wyw8cHJlZml4Pl0qIiB9IHdoZXJlIDxwcmVmaXg+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZCAKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKKwkgKiAKKwkgKiAgQ09ERUFTU0lTVCAvIERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIFN0YXRpYyBGaWVsZCBOYW1lCisJICogICAgV2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBzdGF0aWMgZmllbGQgbmFtZSB3aWxsIGJlZ2luIHdpdGgKKwkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHByZWZpeGVzLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjxwcmVmaXg+Wyw8cHJlZml4Pl0qIiB9IHdoZXJlIDxwcmVmaXg+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZCAKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKKwkgKiAKKwkgKiAgQ09ERUFTU0lTVCAvIERlZmluZSB0aGUgUHJlZml4ZXMgZm9yIExvY2FsIFZhcmlhYmxlIE5hbWUKKwkgKiAgICBXaGVuIHRoZSBwcmVmaXhlcyBpcyBub24gZW1wdHksIGNvbXBsZXRpb24gZm9yIGxvY2FsIHZhcmlhYmxlIG5hbWUgd2lsbCBiZWdpbiB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBwcmVmaXhlcy4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICI8cHJlZml4PlssPHByZWZpeD5dKiIgfSB3aGVyZSA8cHJlZml4PiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQgCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCisJICogCisJICogIENPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBBcmd1bWVudCBOYW1lCisJICogICAgV2hlbiB0aGUgcHJlZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBhcmd1bWVudCBuYW1lIHdpbGwgYmVnaW4gd2l0aAorCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgcHJlZml4ZXMuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiPHByZWZpeD5bLDxwcmVmaXg+XSoiIH0gd2hlcmUgPHByZWZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIAorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgorCSAqIAorCSAqICBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgRmllbGQgTmFtZQorCSAqICAgIFdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgZmllbGQgbmFtZSB3aWxsIGVuZCB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBzdWZmaXhlcy4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICI8c3VmZml4PlssPHN1ZmZpeD5dKiIgfSB3aGVyZSA8c3VmZml4PiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQgCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCisJICogCisJICogIENPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBTdGF0aWMgRmllbGQgTmFtZQorCSAqICAgIFdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3Igc3RhdGljIGZpZWxkIG5hbWUgd2lsbCBlbmQgd2l0aAorCSAqICAgIG9uZSBvZiB0aGUgcHJvcG9zZWQgc3VmZml4ZXMuCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcyIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICAgeyAiPHN1ZmZpeD5bLDxzdWZmaXg+XSoiIH0gd2hlcmUgPHN1ZmZpeD4gaXMgYSBTdHJpbmcgd2l0aG91dCBhbnkgd2lsZC1jYXJkIAorCSAqICAgICAtIGRlZmF1bHQ6ICAgICAgICAgICAiIgorCSAqIAorCSAqICBDT0RFQVNTSVNUIC8gRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgTG9jYWwgVmFyaWFibGUgTmFtZQorCSAqICAgIFdoZW4gdGhlIHN1ZmZpeGVzIGlzIG5vbiBlbXB0eSwgY29tcGxldGlvbiBmb3IgbG9jYWwgdmFyaWFibGUgbmFtZSB3aWxsIGVuZCB3aXRoCisJICogICAgb25lIG9mIHRoZSBwcm9wb3NlZCBzdWZmaXhlcy4KKwkgKiAgICAgLSBvcHRpb24gaWQ6ICAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzIgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczogICB7ICI8c3VmZml4PlssPHN1ZmZpeD5dKiIgfSB3aGVyZSA8c3VmZml4PiBpcyBhIFN0cmluZyB3aXRob3V0IGFueSB3aWxkLWNhcmQgCisJICogICAgIC0gZGVmYXVsdDogICAgICAgICAgICIiCisJICogCisJICogIENPREVBU1NJU1QgLyBEZWZpbmUgdGhlIFN1ZmZpeGVzIGZvciBBcmd1bWVudCBOYW1lCisJICogICAgV2hlbiB0aGUgc3VmZml4ZXMgaXMgbm9uIGVtcHR5LCBjb21wbGV0aW9uIGZvciBhcmd1bWVudCBuYW1lIHdpbGwgZW5kIHdpdGgKKwkgKiAgICBvbmUgb2YgdGhlIHByb3Bvc2VkIHN1ZmZpeGVzLgorCSAqICAgICAtIG9wdGlvbiBpZDogICAgICAgICAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXMiCisJICogICAgIC0gcG9zc2libGUgdmFsdWVzOiAgIHsgIjxzdWZmaXg+Wyw8c3VmZml4Pl0qIiB9IHdoZXJlIDxwcmVmaXg+IGlzIGEgU3RyaW5nIHdpdGhvdXQgYW55IHdpbGQtY2FyZCAKKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAgIiIKIAkgKiA8L3ByZT4KIAkgKiAKIAkgKiBAcmV0dXJuIGEgbXV0YWJsZSB0YWJsZSBjb250YWluaW5nIHRoZSBkZWZhdWx0IHNldHRpbmdzIG9mIGFsbCBrbm93biBvcHRpb25zCkBAIC0xMTI1LDcgKzE1MzAsNyBAQAogCiAJCS8vIHNlZSAjaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIGZvciBjaGFuZ2luZyBkZWZhdWx0IHNldHRpbmdzCiAJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJSGFzaFNldCBvcHRpb25OYW1lcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLk9wdGlvbk5hbWVzOworCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5PcHRpb25OYW1lczsKIAkJCiAJCS8vIGdldCBwcmVmZXJlbmNlcyBzZXQgdG8gdGhlaXIgZGVmYXVsdAogCQlTdHJpbmdbXSBkZWZhdWx0UHJvcGVydHlOYW1lcyA9IHByZWZlcmVuY2VzLmRlZmF1bHRQcm9wZXJ0eU5hbWVzKCk7CkBAIC0xMTU4LDI4ICsxNTYzLDYgQEAKIAlwdWJsaWMgc3RhdGljIEphdmFDb3JlIGdldEphdmFDb3JlKCkgewogCQlyZXR1cm4gKEphdmFDb3JlKSBnZXRQbHVnaW4oKTsKIAl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gPGNvZGU+SVByb2plY3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBKYXZhIG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlIGdpdmVuIDxjb2RlPklQcm9qZWN0PC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIDxjb2RlPklQcm9qZWN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgSmF2YSBuYXR1cmUKLQkgKi8KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoTkFUVVJFX0lEKSkgewotCQkJCUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBtb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KIAkKIAkvKioKIAkgKiBIZWxwZXIgbWV0aG9kIGZvciByZXR1cm5pbmcgb25lIG9wdGlvbiB2YWx1ZSBvbmx5LiBFcXVpdmFsZW50IHRvIDxjb2RlPihTdHJpbmcpSmF2YUNvcmUuZ2V0T3B0aW9ucygpLmdldChvcHRpb25OYW1lKTwvY29kZT4KQEAgLTExOTgsOSArMTU4MSw5IEBACiAJCWlmIChDT1JFX0VOQ09ESU5HLmVxdWFscyhvcHRpb25OYW1lKSl7CiAJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7CiAJCX0KLQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLk9wdGlvbk5hbWVzLmNvbnRhaW5zKG9wdGlvbk5hbWUpKXsKKwkJaWYgKEphdmFNb2RlbE1hbmFnZXIuT3B0aW9uTmFtZXMuY29udGFpbnMob3B0aW9uTmFtZSkpewogCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldFN0cmluZyhvcHRpb25OYW1lKTsKKwkJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRTdHJpbmcob3B0aW9uTmFtZSkudHJpbSgpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTEyMjEsMjggKzE2MDQsMzAgQEAKIAkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKIAogCQkvLyBzZWUgI2luaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSBmb3IgY2hhbmdpbmcgZGVmYXVsdCBzZXR0aW5ncwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUhhc2hTZXQgb3B0aW9uTmFtZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5PcHRpb25OYW1lczsKLQkJCi0JCS8vIGdldCBwcmVmZXJlbmNlcyBzZXQgdG8gdGhlaXIgZGVmYXVsdAotCQlTdHJpbmdbXSBkZWZhdWx0UHJvcGVydHlOYW1lcyA9IHByZWZlcmVuY2VzLmRlZmF1bHRQcm9wZXJ0eU5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdFByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGRlZmF1bHRQcm9wZXJ0eU5hbWVzW2ldOwotCQkJaWYgKG9wdGlvbk5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpewotCQkJCW9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHByb3BlcnR5TmFtZSkpOwotCQkJfQotCQl9CQkKLQkJLy8gZ2V0IHByZWZlcmVuY2VzIG5vdCBzZXQgdG8gdGhlaXIgZGVmYXVsdAotCQlTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzID0gcHJlZmVyZW5jZXMucHJvcGVydHlOYW1lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07Ci0JCQlpZiAob3B0aW9uTmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKSl7Ci0JCQkJb3B0aW9ucy5wdXQocHJvcGVydHlOYW1lLCBwcmVmZXJlbmNlcy5nZXRTdHJpbmcocHJvcGVydHlOYW1lKSk7Ci0JCQl9Ci0JCX0JCQotCQkvLyBnZXQgZW5jb2RpbmcgdGhyb3VnaCByZXNvdXJjZSBwbHVnaW4KLQkJb3B0aW9ucy5wdXQoQ09SRV9FTkNPRElORywgUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCkpOwotCisJCVBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4oKTsKKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5PcHRpb25OYW1lczsKKwkJCQorCQkJLy8gZ2V0IHByZWZlcmVuY2VzIHNldCB0byB0aGVpciBkZWZhdWx0CisJCQlTdHJpbmdbXSBkZWZhdWx0UHJvcGVydHlOYW1lcyA9IHByZWZlcmVuY2VzLmRlZmF1bHRQcm9wZXJ0eU5hbWVzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRQcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZGVmYXVsdFByb3BlcnR5TmFtZXNbaV07CisJCQkJaWYgKG9wdGlvbk5hbWVzLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpeworCQkJCQlvcHRpb25zLnB1dChwcm9wZXJ0eU5hbWUsIHByZWZlcmVuY2VzLmdldERlZmF1bHRTdHJpbmcocHJvcGVydHlOYW1lKSk7CisJCQkJfQorCQkJfQkJCisJCQkvLyBnZXQgcHJlZmVyZW5jZXMgbm90IHNldCB0byB0aGVpciBkZWZhdWx0CisJCQlTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzID0gcHJlZmVyZW5jZXMucHJvcGVydHlOYW1lcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKXsKKwkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lc1tpXTsKKwkJCQlpZiAob3B0aW9uTmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKSl7CisJCQkJCW9wdGlvbnMucHV0KHByb3BlcnR5TmFtZSwgcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHByb3BlcnR5TmFtZSkudHJpbSgpKTsKKwkJCQl9CisJCQl9CQkKKwkJCS8vIGdldCBlbmNvZGluZyB0aHJvdWdoIHJlc291cmNlIHBsdWdpbgorCQkJb3B0aW9ucy5wdXQoQ09SRV9FTkNPRElORywgUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCkpOworCQl9CiAJCXJldHVybiBvcHRpb25zOwogCX0KIAkJCkBAIC0xMjcwLDcgKzE2NTUsNyBAQAogCSAqIFZhcmlhYmxlIHNvdXJjZSBhdHRhY2htZW50IHBhdGggYW5kIHJvb3QgcGF0aCBhcmUgYWxzbyByZXNvbHZlZCBhbmQgcmVjb3JkZWQgaW4gdGhlIHJlc3VsdGluZyBjbGFzc3BhdGggZW50cnkuCiAJICogPHA+CiAJICogTk9URTogVGhpcyBoZWxwZXIgbWV0aG9kIGRvZXMgbm90IGhhbmRsZSBjbGFzc3BhdGggY29udGFpbmVycywgZm9yIHdoaWNoIHNob3VsZCByYXRoZXIgYmUgdXNlZAotCSAqIDxjb2RlPkphdmFDb3JlI2dldFJlc29sdmVkQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpPC9jb2RlPi4KKwkgKiA8Y29kZT5KYXZhQ29yZSNnZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGgsIElKYXZhUHJvamVjdCk8L2NvZGU+LgogCSAqIDxwPgogCSAqIAogCSAqIEBwYXJhbSBlbnRyeSB0aGUgZ2l2ZW4gdmFyaWFibGUgZW50cnkKQEAgLTEyNzgsMTkgKzE2NjMsMTkgQEAKIAkgKiAgIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBlbnRyeSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYSB2YWxpZCBjbGFzc3BhdGggZW50cnkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBnZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCisJCiAJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKQogCQkJcmV0dXJuIGVudHJ5OwotCisJCiAJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOwogCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKLQorCQogCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCByZXNvbHZlZFBhdGgsIGZhbHNlKTsKIAkJaWYgKHRhcmdldCA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7Ci0KKwkKIAkJLy8gaW5zaWRlIHRoZSB3b3Jrc3BhY2UKIAkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewogCQkJSVJlc291cmNlIHJlc29sdmVkUmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7CkBAIC0xMzAyLDkgKzE2ODcsNyBAQAogCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShyZXNvbHZlZFBhdGgsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CiAJCQkJCQkKIAkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6IAotCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSB8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHJlc29sdmVkUmVzb3VyY2UuZ2V0TmFtZSgpKSkgewogCQkJCQkJCS8vIGludGVybmFsIGJpbmFyeSBhcmNoaXZlCiAJCQkJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKIAkJCQkJCQkJCXJlc29sdmVkUGF0aCwKQEAgLTEzNTksMTkgKzE3NDIsMTkgQEAKIAkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB2YXJpYWJsZSBwYXRoIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJlc29sdmVkVmFyaWFibGVQYXRoKElQYXRoIHZhcmlhYmxlUGF0aCkgewotCisJCiAJCWlmICh2YXJpYWJsZVBhdGggPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCQlpbnQgY291bnQgPSB2YXJpYWJsZVBhdGguc2VnbWVudENvdW50KCk7CiAJCWlmIChjb3VudCA9PSAwKQogCQkJcmV0dXJuIG51bGw7Ci0KKwkKIAkJLy8gbG9va3VwIHZhcmlhYmxlCQogCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gdmFyaWFibGVQYXRoLnNlZ21lbnQoMCk7CiAJCUlQYXRoIHJlc29sdmVkUGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7CiAJCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwotCisJCiAJCS8vIGFwcGVuZCBwYXRoIHN1ZmZpeAogCQlpZiAoY291bnQgPiAxKSB7CiAJCQlyZXNvbHZlZFBhdGggPSByZXNvbHZlZFBhdGguYXBwZW5kKHZhcmlhYmxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKQEAgLTE0MDksNyArMTc5Miw3IEBACiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKIAkJCiAJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJSGFzaFNldCBvcHRpb25OYW1lcyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLk9wdGlvbk5hbWVzOworCQlIYXNoU2V0IG9wdGlvbk5hbWVzID0gSmF2YU1vZGVsTWFuYWdlci5PcHRpb25OYW1lczsKIAkJCiAJCS8vIENvbXBpbGVyIHNldHRpbmdzCiAJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfTE9DQUxfVkFSSUFCTEVfQVRUUiwgR0VORVJBVEUpOwpAQCAtMTQ0Miw2ICsxODI1LDkgQEAKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9ERVBSRUNBVElPTiwgV0FSTklORyk7CiAJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9ERVBSRUNBVElPTik7CiAKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUsIERJU0FCTEVEKTsKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSk7CisKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0ssIFdBUk5JTkcpOyAKIAkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSyk7CiAKQEAgLTE0NTEsOSArMTgzNywxOCBAQAogCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX1VOVVNFRF9QQVJBTUVURVIsIElHTk9SRSk7IAogCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUik7CiAKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9VTlVTRURfSU1QT1JULCBJR05PUkUpOyAKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX1dIRU5fSU1QTEVNRU5USU5HX0FCU1RSQUNULCBESVNBQkxFRCk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfVU5VU0VEX1BBUkFNRVRFUl9XSEVOX0lNUExFTUVOVElOR19BQlNUUkFDVCk7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9VTlVTRURfUEFSQU1FVEVSX1dIRU5fT1ZFUlJJRElOR19DT05DUkVURSwgRElTQUJMRUQpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX1VOVVNFRF9QQVJBTUVURVJfV0hFTl9PVkVSUklESU5HX0NPTkNSRVRFKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX1VOVVNFRF9JTVBPUlQsIFdBUk5JTkcpOyAKIAkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX1VOVVNFRF9JTVBPUlQpOwogCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfVU5VU0VEX1BSSVZBVEVfTUVNQkVSLCBJR05PUkUpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX1VOVVNFRF9QUklWQVRFX01FTUJFUik7CisKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9QQl9TWU5USEVUSUNfQUNDRVNTX0VNVUxBVElPTiwgSUdOT1JFKTsgCiAJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9QQl9TWU5USEVUSUNfQUNDRVNTX0VNVUxBVElPTik7CiAKQEAgLTE0NjMsNiArMTg1OCwyNCBAQAogCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSLCBJR05PUkUpOyAKIAkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSKTsKIAorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX1NUQVRJQ19BQ0NFU1NfUkVDRUlWRVIsIFdBUk5JTkcpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX1NUQVRJQ19BQ0NFU1NfUkVDRUlWRVIpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfTk9fRUZGRUNUX0FTU0lHTk1FTlQsIFdBUk5JTkcpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX05PX0VGRkVDVF9BU1NJR05NRU5UKTsKKworCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPTVBJTEVSX1BCX0lOQ09NUEFUSUJMRV9OT05fSU5IRVJJVEVEX0lOVEVSRkFDRV9NRVRIT0QsIFdBUk5JTkcpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPTVBJTEVSX1BCX0lOQ09NUEFUSUJMRV9OT05fSU5IRVJJVEVEX0lOVEVSRkFDRV9NRVRIT0QpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfUEJfQ0hBUl9BUlJBWV9JTl9TVFJJTkdfQ09OQ0FURU5BVElPTiwgV0FSTklORyk7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09NUElMRVJfUEJfQ0hBUl9BUlJBWV9JTl9TVFJJTkdfQ09OQ0FURU5BVElPTik7CisKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT01QSUxFUl9UQVNLX1RBR1MsIERFRkFVTFRfVEFTS19UQUcpOyAvLyROT04tTkxTLTEkCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9UQVNLX1RBR1MpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfVEFTS19QUklPUklUSUVTLCBERUZBVUxUX1RBU0tfUFJJT1JJVFkpOyAvLyROT04tTkxTLTEkCisJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9UQVNLX1BSSU9SSVRJRVMpOworCiAJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09NUElMRVJfU09VUkNFLCBWRVJTSU9OXzFfMyk7CiAJCW9wdGlvbk5hbWVzLmFkZChDT01QSUxFUl9TT1VSQ0UpOwogCkBAIC0xNDc4LDExICsxODkxLDMyIEBACiAKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgsIEFCT1JUKTsgCiAJCW9wdGlvbk5hbWVzLmFkZChDT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgpOworCQorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIFdBUk5JTkcpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UpOwogCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT1JFX0pBVkFfQlVJTERfQ0xFQU5fT1VUUFVUX0ZPTERFUiwgQ0xFQU4pOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfSkFWQV9CVUlMRF9DTEVBTl9PVVRQVVRfRk9MREVSKTsKKwogCQkvLyBKYXZhQ29yZSBzZXR0aW5ncwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPUkVfSkFWQV9CVUlMRF9PUkRFUiwgSUdOT1JFKTsgLy8kTk9OLU5MUy0xJAorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPUkVfSkFWQV9CVUlMRF9PUkRFUiwgSUdOT1JFKTsgCiAJCW9wdGlvbk5hbWVzLmFkZChDT1JFX0pBVkFfQlVJTERfT1JERVIpOwogCQorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCBFUlJPUik7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgpOworCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCBFUlJPUik7IAorCQlvcHRpb25OYW1lcy5hZGQoQ09SRV9JTkNPTVBMRVRFX0NMQVNTUEFUSCk7CisJCQorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMsIEVOQUJMRUQpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfRU5BQkxFX0NMQVNTUEFUSF9FWENMVVNJT05fUEFUVEVSTlMpOworCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09SRV9FTkFCTEVfQ0xBU1NQQVRIX01VTFRJUExFX09VVFBVVF9MT0NBVElPTlMsIEVOQUJMRUQpOyAKKwkJb3B0aW9uTmFtZXMuYWRkKENPUkVfRU5BQkxFX0NMQVNTUEFUSF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TKTsKKworCQkvLyBlbmNvZGluZyBzZXR0aW5nIGNvbWVzIGZyb20gcmVzb3VyY2UgcGx1Zy1pbgorCQlvcHRpb25OYW1lcy5hZGQoQ09SRV9FTkNPRElORyk7CisJCQogCQkvLyBGb3JtYXR0ZXIgc2V0dGluZ3MKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChGT1JNQVRURVJfTkVXTElORV9PUEVOSU5HX0JSQUNFLCBET19OT1RfSU5TRVJUKTsgCiAJCW9wdGlvbk5hbWVzLmFkZChGT1JNQVRURVJfTkVXTElORV9PUEVOSU5HX0JSQUNFKTsKQEAgLTE1MTEsNiArMTk0NSw5IEBACiAJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX1RBQl9TSVpFLCAiNCIpOyAvLyROT04tTkxTLTEkIAogCQlvcHRpb25OYW1lcy5hZGQoRk9STUFUVEVSX1RBQl9TSVpFKTsKIAkJCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoRk9STUFUVEVSX1NQQUNFX0NBU1RFWFBSRVNTSU9OLCBJTlNFUlQpOyAvLyROT04tTkxTLTEkIAorCQlvcHRpb25OYW1lcy5hZGQoRk9STUFUVEVSX1NQQUNFX0NBU1RFWFBSRVNTSU9OKTsKKwogCQkvLyBDb2RlQXNzaXN0IHNldHRpbmdzCiAJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09ERUFTU0lTVF9WSVNJQklMSVRZX0NIRUNLLCBESVNBQkxFRCk7IC8vJE5PTi1OTFMtMSQKIAkJb3B0aW9uTmFtZXMuYWRkKENPREVBU1NJU1RfVklTSUJJTElUWV9DSEVDSyk7CkBAIC0xNTE4LDYgKzE5NTUsMjkgQEAKIAkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0lNUExJQ0lUX1FVQUxJRklDQVRJT04sIERJU0FCTEVEKTsgLy8kTk9OLU5MUy0xJAogCQlvcHRpb25OYW1lcy5hZGQoQ09ERUFTU0lTVF9JTVBMSUNJVF9RVUFMSUZJQ0FUSU9OKTsKIAkJCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCisJCW9wdGlvbk5hbWVzLmFkZChDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKKwkJCisJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQlvcHRpb25OYW1lcy5hZGQoQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMpOworCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMpOworCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVMpOworCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJb3B0aW9uTmFtZXMuYWRkKENPREVBU1NJU1RfRklFTERfU1VGRklYRVMpOworCQkKKwkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUywgIiIpOyAvLyROT04tTkxTLTEkCisJCW9wdGlvbk5hbWVzLmFkZChDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUyk7CisJCQorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPREVBU1NJU1RfTE9DQUxfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQlvcHRpb25OYW1lcy5hZGQoQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUyk7CisJCQorCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KENPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQlvcHRpb25OYW1lcy5hZGQoQ09ERUFTU0lTVF9BUkdVTUVOVF9TVUZGSVhFUyk7CiAJfQogCQogCS8qKgpAQCAtMTY5MSw3ICsyMTUxLDcgQEAKIAkgKiBAcGFyYW0gY29udGFpbmVyUGF0aCB0aGUgcGF0aCBpZGVudGlmeWluZyB0aGUgY29udGFpbmVyLCBpdCBtdXN0IGJlIGZvcm1lZCBvZiBhdCBsZWFzdAogCSAqIAlvbmUgc2VnbWVudCAoSUQraGludHMpCiAJICogQHBhcmFtIGlzRXhwb3J0ZWQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudAotCSAqCQlwcm9qZWN0cyBpbiBhZGRpdGlvbiB0byB0aGUgb3V0cHV0IGxvY2F0aW9uCisJICogICAgcHJvamVjdHMgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dCBsb2NhdGlvbgogCSAqIEByZXR1cm4gYSBuZXcgY29udGFpbmVyIGNsYXNzcGF0aCBlbnRyeQogCSAqIAogCSAqIEBzZWUgSmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoLCBJSmF2YVByb2plY3QpCkBAIC0xNzAxLDE2ICsyMTYxLDE5IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3Q29udGFpbmVyRW50cnkoSVBhdGggY29udGFpbmVyUGF0aCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7CiAJCQkKLQkJQXNzZXJ0LmlzVHJ1ZSgKLQkJCWNvbnRhaW5lclBhdGggIT0gbnVsbCAmJiBjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCi0JCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsQ29udGFpbmVyUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQorCQlpZiAoY29udGFpbmVyUGF0aCA9PSBudWxsIHx8IGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkgPCAxKSB7CisJCQlBc3NlcnQuaXNUcnVlKAorCQkJCWZhbHNlLAorCQkJCSJJbGxlZ2FsIGNsYXNzcGF0aCBjb250YWluZXIgcGF0aDogXCciICsgY29udGFpbmVyUGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpICsgIlwnLCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQgKGNvbnRhaW5lcklEK2hpbnRzKSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQl9CiAJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCiAJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSwKIAkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSLAogCQkJY29udGFpbmVyUGF0aCwKLQkJCW51bGwsCi0JCQludWxsLAorCQkJQ2xhc3NwYXRoRW50cnkuTk9fRVhDTFVTSU9OX1BBVFRFUk5TLCAKKwkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50CisJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudCByb290CisJCQludWxsLCAvLyBzcGVjaWZpYyBvdXRwdXQgZm9sZGVyCiAJCQlpc0V4cG9ydGVkKTsKIAl9CiAKQEAgLTE3MzYsMTAgKzIxOTksMTAgQEAKIAkgKiA8cD4KIAkgKiAKIAkgKiBAcGFyYW0gcGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgYmluYXJ5IGFyY2hpdmUKLQkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUsIAorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSBvciBmb2xkZXIsIAogCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+YXJjaGl2ZVBhdGg8L2NvZGU+IGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgcm9vdCB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlcgorCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgbG9jYXRpb24gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuCiAJICogQHJldHVybiBhIG5ldyBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeQogCSAqIAogCSAqIEBzZWUgI25ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQpAQCAtMTc3MSwxMCArMjIzNCwxMCBAQAogCSAqIDxwPgogCSAqIAogCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBiaW5hcnkgYXJjaGl2ZQotCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgYXJjaGl2ZSwgCisJICogQHBhcmFtIHNvdXJjZUF0dGFjaG1lbnRQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBhcmNoaXZlIG9yIGZvbGRlciwgCiAJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5hcmNoaXZlUGF0aDwvY29kZT4gaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggdGhlIGxvY2F0aW9uIG9mIHRoZSByb290IHdpdGhpbiB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCisJICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBsb2NhdGlvbiBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4KIAkgKiBAcGFyYW0gaXNFeHBvcnRlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudAogCSAqIAkgIHByb2plY3RzIGluIGFkZGl0aW9uIHRvIHRoZSBvdXRwdXQgbG9jYXRpb24KIAkgKiBAcmV0dXJuIGEgbmV3IGxpYnJhcnkgY2xhc3NwYXRoIGVudHJ5CkBAIC0xNzg2LDE2ICsyMjQ5LDE2IEBACiAJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwKIAkJYm9vbGVhbiBpc0V4cG9ydGVkKSB7CiAJCQkKLQkJQXNzZXJ0LmlzVHJ1ZSgKLQkJCXBhdGguaXNBYnNvbHV0ZSgpLAotCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQorCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiUGF0aCBmb3IgSUNsYXNzcGF0aEVudHJ5IG11c3QgYmUgYWJzb2x1dGUiKTsgLy8kTk9OLU5MUy0xJAorCiAJCXJldHVybiBuZXcgQ2xhc3NwYXRoRW50cnkoCiAJCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSwKIAkJCUlDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSwKIAkJCUphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpLAorCQkJQ2xhc3NwYXRoRW50cnkuTk9fRVhDTFVTSU9OX1BBVFRFUk5TLCAKIAkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoLAogCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQkJbnVsbCwgLy8gc3BlY2lmaWMgb3V0cHV0IGZvbGRlcgogCQkJaXNFeHBvcnRlZCk7CiAJfQogCkBAIC0xODQ2LDE1ICsyMzA5LDE3IEBACiAJICogQHNpbmNlIDIuMAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSgKLQkJCXBhdGguaXNBYnNvbHV0ZSgpLAotCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIEFzc2VydC5pc1RydWUoZmFsc2UsICJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCisJCQogCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KAogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsCiAJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QsCiAJCQlwYXRoLAotCQkJbnVsbCwKLQkJCW51bGwsCisJCQlDbGFzc3BhdGhFbnRyeS5OT19FWENMVVNJT05fUEFUVEVSTlMsIAorCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQKKwkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50IHJvb3QKKwkJCW51bGwsIC8vIHNwZWNpZmljIG91dHB1dCBmb2xkZXIKIAkJCWlzRXhwb3J0ZWQpOwogCX0KIApAQCAtMTg2OCwzNyArMjMzMywxNzUgQEAKIAl9CiAKIAkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+IGZvciB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgCi0JICogaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBzcGVjaWZpZXMgdGhhdCBhbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgCi0JICogaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4KKwkgKiBmb3IgdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVyIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIAorCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLiBUaGlzIHNwZWNpZmllcyB0aGF0IGFsbCBwYWNrYWdlIGZyYWdtZW50cworCSAqIHdpdGhpbiB0aGUgcm9vdCB3aWxsIGhhdmUgY2hpbGRyZW4gb2YgdHlwZSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPi4KIAkgKiA8cD4KLQkgKiBUaGUgc291cmNlIGZvbGRlciBpcyByZWZlcnJlZCB0byB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCwgZS5nLiA8Y29kZT4iL1Byb2plY3Qvc3JjIjwvY29kZT4uCisJICogVGhlIHNvdXJjZSBmb2xkZXIgaXMgcmVmZXJyZWQgdG8gdXNpbmcgYW4gYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUKKwkgKiB3b3Jrc3BhY2Ugcm9vdCwgZS5nLiA8Y29kZT4vUHJvamVjdC9zcmM8L2NvZGU+LiBBIHByb2plY3QncyBzb3VyY2UgCisJICogZm9sZGVycyBhcmUgbG9jYXRlZCB3aXRoIHRoYXQgcHJvamVjdC4gVGhhdCBpcywgYSBzb3VyY2UgY2xhc3NwYXRoCisJICogZW50cnkgc3BlY2lmeWluZyB0aGUgcGF0aCA8Y29kZT4vUDEvc3JjPC9jb2RlPiBpcyBvbmx5IHVzYWJsZSBmb3IKKwkgKiBwcm9qZWN0IDxjb2RlPlAxPC9jb2RlPi4KIAkgKiA8L3A+CiAJICogPHA+Ci0JICogQSBzb3VyY2UgZW50cnkgaXMgdXNlZCB0byBzZXQgdXAgdGhlIGludGVybmFsIHNvdXJjZSBsYXlvdXQgb2YgYSBwcm9qZWN0LCBhbmQgY2Fubm90IGJlIHVzZWQgb3V0IG9mIHRoZQotCSAqIGNvbnRleHQgb2YgdGhlIGNvbnRhaW5pbmcgcHJvamVjdCAoYSBzb3VyY2UgZW50cnkgIlByb2oxL3NyYyIgY2Fubm90IGJlIHVzZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBQcm9qMikuCisJICogVGhlIHNvdXJjZSBjbGFzc3BhdGggZW50cnkgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCBpbmNsdWRlcyBhbGwgc291cmNlCisJICogZmlsZXMgYmVsb3cgdGhlIGdpdmVuIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLiBUbyBzZWxlY3RpdmVseSBleGNsdWRlCisJICogc29tZSBvZiB0aGVzZSBzb3VyY2UgZmlsZXMsIHVzZSB0aGUgZmFjdG9yeSBtZXRob2QgCisJICogPGNvZGU+SmF2YUNvcmUubmV3U291cmNlRW50cnkoSVBhdGgsSVBhdGhbXSk8L2NvZGU+IGluc3RlYWQuCiAJICogPC9wPgogCSAqIDxwPgotCSAqIEEgcGFydGljdWxhciBzb3VyY2UgZW50cnkgY2Fubm90IGJlIGV4cG9ydGVkIHRvIG90aGVyIHByb2plY3RzLiBBbGwgc291cmNlcy9iaW5hcmllcyBpbnNpZGUgYSBwcm9qZWN0IGFyZQotCSAqIGNvbnRyaWJ1dGVkIGFzIGEgd2hvbGUgdGhyb3VnaCBhIHByb2plY3QgZW50cnkgKHNlZSA8Y29kZT5KYXZhQ29yZS5uZXdQcm9qZWN0RW50cnk8L2NvZGU+KS4KKwkgKiBOb3RlIHRoYXQgYWxsIHNvdXJjZXMvYmluYXJpZXMgaW5zaWRlIGEgcHJvamVjdCBhcmUgY29udHJpYnV0ZWQgYXMgYSB3aG9sZSB0aHJvdWdoCisJICogYSBwcm9qZWN0IGVudHJ5IChzZWUgPGNvZGU+SmF2YUNvcmUubmV3UHJvamVjdEVudHJ5PC9jb2RlPikuIFBhcnRpY3VsYXIKKwkgKiBzb3VyY2UgZW50cmllcyBjYW5ub3QgYmUgc2VsZWN0aXZlbHkgZXhwb3J0ZWQuCiAJICogPC9wPgogCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGEgc291cmNlIGZvbGRlcgotCSAqIEByZXR1cm4gYSBuZXcgc291cmNlIGNsYXNzcGF0aCBlbnRyeQorCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBvZiBhIHNvdXJjZSBmb2xkZXIKKwkgKiBAcmV0dXJuIGEgbmV3IHNvdXJjZSBjbGFzc3BhdGggZW50cnkgd2l0aCBub3QgZXhjbHVzaW9uIHBhdHRlcm5zCisJICogCisJICogQHNlZSAjbmV3U291cmNlRW50cnkob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aFtdKQogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1NvdXJjZUVudHJ5KElQYXRoIHBhdGgpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSgKLQkJCXBhdGguaXNBYnNvbHV0ZSgpLAotCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGgubmVlZEFic29sdXRlUGF0aCIgKSk7IC8vJE5PTi1OTFMtMSQKKworCQlyZXR1cm4gbmV3U291cmNlRW50cnkocGF0aCwgQ2xhc3NwYXRoRW50cnkuTk9fRVhDTFVTSU9OX1BBVFRFUk5TLCBudWxsIC8qb3V0cHV0IGxvY2F0aW9uKi8pOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9TT1VSQ0U8L2NvZGU+CisJICogZm9yIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBhYnNvbHV0ZSAKKwkgKiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBidXQgZXhjbHVkaW5nIGFsbCBzb3VyY2UgZmlsZXMgd2l0aCBwYXRocworCSAqIG1hdGNoaW5nIGFueSBvZiB0aGUgZ2l2ZW4gcGF0dGVybnMuIFRoaXMgc3BlY2lmaWVzIHRoYXQgYWxsIHBhY2thZ2UKKwkgKiBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIAorCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSBzb3VyY2UgZm9sZGVyIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlCisJICogd29ya3NwYWNlIHJvb3QsIGUuZy4gPGNvZGU+L1Byb2plY3Qvc3JjPC9jb2RlPi4gQSBwcm9qZWN0J3Mgc291cmNlIAorCSAqIGZvbGRlcnMgYXJlIGxvY2F0ZWQgd2l0aCB0aGF0IHByb2plY3QuIFRoYXQgaXMsIGEgc291cmNlIGNsYXNzcGF0aAorCSAqIGVudHJ5IHNwZWNpZnlpbmcgdGhlIHBhdGggPGNvZGU+L1AxL3NyYzwvY29kZT4gaXMgb25seSB1c2FibGUgZm9yCisJICogcHJvamVjdCA8Y29kZT5QMTwvY29kZT4uCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBzb3VyY2UgY2xhc3NwYXRoIGVudHJ5IGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgaW5jbHVkZXMgYWxsIHNvdXJjZQorCSAqIGZpbGVzIGJlbG93IHRoZSBnaXZlbiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBleGNlcHQgZm9yIHRob3NlIG1hdGNoZWQKKwkgKiBieSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBnaXZlbiBleGNsdXNpb24gcGF0dGVybnMuIEVhY2ggZXhjbHVzaW9uIHBhdHRlcm4KKwkgKiBpcyByZXByZXNlbnRlZCBieSBhIHJlbGF0aXZlIHBhdGgsIHdoaWNoIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvCisJICogdGhlIHNvdXJjZSBmb2xkZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlIGZvbGRlciBwYXRoIGlzIAorCSAqIDxjb2RlPi9Qcm9qZWN0L3NyYzwvY29kZT4gYW5kIHRoZSBleGNsdXNpb24gcGF0dGVybiBpcyAKKwkgKiA8Y29kZT5jb20veHl6L3Rlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+LCB0aGVuIHNvdXJjZSBmaWxlcworCSAqIGxpa2UgPGNvZGU+L1Byb2plY3Qvc3JjL2NvbS94eXovRm9vLmphdmE8L2NvZGU+CisJICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3V0aWxzL0Jhci5qYXZhPC9jb2RlPiB3b3VsZCBiZSBpbmNsdWRlZCwKKwkgKiB3aGVyZWFzIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3Rlc3RzL1QxLmphdmE8L2NvZGU+CisJICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3Rlc3RzL3F1aWNrL1QyLmphdmE8L2NvZGU+IHdvdWxkIGJlCisJICogZXhjbHVkZWQuIEV4Y2x1c2lvbiBwYXR0ZXJucyBjYW4gY29udGFpbiBjYW4gY29udGFpbiAnKionLCAnKicgb3IgJz8nCisJICogd2lsZGNhcmRzOyBzZWUgPGNvZGU+SUNsYXNzcGF0aEVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zPC9jb2RlPgorCSAqIGZvciB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgZXhjbHVzaW9uCisJICogcGF0dGVybnMuCisJICogPC9wPgorCSAqIElmIHRoZSBlbXB0eSBsaXN0IG9mIGV4Y2x1c2lvbiBwYXR0ZXJucyBpcyBzcGVjaWZpZWQsIHRoZSBzb3VyY2UgZm9sZGVyCisJICogd2lsbCBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYWxsIHJlc291cmNlcyBsb2NhdGVkIGluc2lkZSB0aGUgc291cmNlCisJICogZm9sZGVyLiBJbiB0aGF0IGNhc2UsIHRoZSByZXN1bHQgaXMgZW50aXJlbHkgZXF1aXZhbGVudCB0byB1c2luZyB0aGUKKwkgKiBmYWN0b3J5IG1ldGhvZCA8Y29kZT5KYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShJUGF0aCk8L2NvZGU+LiAKKwkgKiA8L3A+CisJICogPHA+CisJICogTm90ZSB0aGF0IGFsbCBzb3VyY2VzL2JpbmFyaWVzIGluc2lkZSBhIHByb2plY3QgYXJlIGNvbnRyaWJ1dGVkIGFzIGEgd2hvbGUgdGhyb3VnaAorCSAqIGEgcHJvamVjdCBlbnRyeSAoc2VlIDxjb2RlPkphdmFDb3JlLm5ld1Byb2plY3RFbnRyeTwvY29kZT4pLiBQYXJ0aWN1bGFyCisJICogc291cmNlIGVudHJpZXMgY2Fubm90IGJlIHNlbGVjdGl2ZWx5IGV4cG9ydGVkLgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSBwYXRoIHRoZSBhYnNvbHV0ZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBvZiBhIHNvdXJjZSBmb2xkZXIKKwkgKiBAcGFyYW0gZXhjbHVzaW9uUGF0dGVybnMgdGhlIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgZXhjbHVzaW9uIHBhdHRlcm5zCisJICogICAgcmVwcmVzZW50ZWQgYXMgcmVsYXRpdmUgcGF0aHMKKwkgKiBAcmV0dXJuIGEgbmV3IHNvdXJjZSBjbGFzc3BhdGggZW50cnkgd2l0aCB0aGUgZ2l2ZW4gZXhjbHVzaW9uIHBhdHRlcm5zCisJICogQHNlZSAjbmV3U291cmNlRW50cnkob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zCisJICogCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1NvdXJjZUVudHJ5KElQYXRoIHBhdGgsIElQYXRoW10gZXhjbHVzaW9uUGF0dGVybnMpIHsKKworCQlyZXR1cm4gbmV3U291cmNlRW50cnkocGF0aCwgZXhjbHVzaW9uUGF0dGVybnMsIG51bGwgLypvdXRwdXQgbG9jYXRpb24qLyk7IAorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX1NPVVJDRTwvY29kZT4KKwkgKiBmb3IgdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVyIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGFic29sdXRlIAorCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIGJ1dCBleGNsdWRpbmcgYWxsIHNvdXJjZSBmaWxlcyB3aXRoIHBhdGhzCisJICogbWF0Y2hpbmcgYW55IG9mIHRoZSBnaXZlbiBwYXR0ZXJucywgYW5kIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIG91dHB1dCBsb2NhdGlvbgorCSAqIChpLmUuICIuY2xhc3MiIGZpbGVzIGFyZSBub3QgZ29pbmcgdG8gdGhlIHByb2plY3QgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24pLiAKKwkgKiBBbGwgcGFja2FnZSBmcmFnbWVudHMgd2l0aGluIHRoZSByb290IHdpbGwgaGF2ZSBjaGlsZHJlbiBvZiB0eXBlIAorCSAqIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqIDxwPgorCSAqIFRoZSBzb3VyY2UgZm9sZGVyIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlCisJICogd29ya3NwYWNlIHJvb3QsIGUuZy4gPGNvZGU+L1Byb2plY3Qvc3JjPC9jb2RlPi4gQSBwcm9qZWN0J3Mgc291cmNlIAorCSAqIGZvbGRlcnMgYXJlIGxvY2F0ZWQgd2l0aCB0aGF0IHByb2plY3QuIFRoYXQgaXMsIGEgc291cmNlIGNsYXNzcGF0aAorCSAqIGVudHJ5IHNwZWNpZnlpbmcgdGhlIHBhdGggPGNvZGU+L1AxL3NyYzwvY29kZT4gaXMgb25seSB1c2FibGUgZm9yCisJICogcHJvamVjdCA8Y29kZT5QMTwvY29kZT4uCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBzb3VyY2UgY2xhc3NwYXRoIGVudHJ5IGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgaW5jbHVkZXMgYWxsIHNvdXJjZQorCSAqIGZpbGVzIGJlbG93IHRoZSBnaXZlbiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBleGNlcHQgZm9yIHRob3NlIG1hdGNoZWQKKwkgKiBieSBvbmUgKG9yIG1vcmUpIG9mIHRoZSBnaXZlbiBleGNsdXNpb24gcGF0dGVybnMuIEVhY2ggZXhjbHVzaW9uIHBhdHRlcm4KKwkgKiBpcyByZXByZXNlbnRlZCBieSBhIHJlbGF0aXZlIHBhdGgsIHdoaWNoIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvCisJICogdGhlIHNvdXJjZSBmb2xkZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlIGZvbGRlciBwYXRoIGlzIAorCSAqIDxjb2RlPi9Qcm9qZWN0L3NyYzwvY29kZT4gYW5kIHRoZSBleGNsdXNpb24gcGF0dGVybiBpcyAKKwkgKiA8Y29kZT5jb20veHl6L3Rlc3RzLyYjNDI7JiM0Mjs8L2NvZGU+LCB0aGVuIHNvdXJjZSBmaWxlcworCSAqIGxpa2UgPGNvZGU+L1Byb2plY3Qvc3JjL2NvbS94eXovRm9vLmphdmE8L2NvZGU+CisJICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3V0aWxzL0Jhci5qYXZhPC9jb2RlPiB3b3VsZCBiZSBpbmNsdWRlZCwKKwkgKiB3aGVyZWFzIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3Rlc3RzL1QxLmphdmE8L2NvZGU+CisJICogYW5kIDxjb2RlPi9Qcm9qZWN0L3NyYy9jb20veHl6L3Rlc3RzL3F1aWNrL1QyLmphdmE8L2NvZGU+IHdvdWxkIGJlCisJICogZXhjbHVkZWQuIEV4Y2x1c2lvbiBwYXR0ZXJucyBjYW4gY29udGFpbiBjYW4gY29udGFpbiAnKionLCAnKicgb3IgJz8nCisJICogd2lsZGNhcmRzOyBzZWUgPGNvZGU+SUNsYXNzcGF0aEVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zPC9jb2RlPgorCSAqIGZvciB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgZXhjbHVzaW9uCisJICogcGF0dGVybnMuCisJICogPC9wPgorCSAqIElmIHRoZSBlbXB0eSBsaXN0IG9mIGV4Y2x1c2lvbiBwYXR0ZXJucyBpcyBzcGVjaWZpZWQsIHRoZSBzb3VyY2UgZm9sZGVyCisJICogd2lsbCBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYWxsIHJlc291cmNlcyBsb2NhdGVkIGluc2lkZSB0aGUgc291cmNlCisJICogZm9sZGVyLiBJbiB0aGF0IGNhc2UsIHRoZSByZXN1bHQgaXMgZW50aXJlbHkgZXF1aXZhbGVudCB0byB1c2luZyB0aGUKKwkgKiBmYWN0b3J5IG1ldGhvZCA8Y29kZT5KYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShJUGF0aCk8L2NvZGU+LiAKKwkgKiA8L3A+CisJICogPHA+CisJICogQWRkaXRpb25hbGx5LCBhIHNvdXJjZSBlbnRyeSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgb3V0cHV0IGxvY2F0aW9uLiAKKwkgKiBCeSBkb2luZyBzbywgdGhlIEphdmEgYnVpbGRlciB3aWxsIGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgIi5jbGFzcyIgZmlsZXMgd2lsbCAKKwkgKiBiZSBpc3N1ZWQgaW5zaWRlIHRoaXMgb3V0cHV0IGxvY2F0aW9uLCBhcyBvcHBvc2VkIHRvIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSAKKwkgKiBwcm9qZWN0IGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uICh3aGVuIG91dHB1dCBsb2NhdGlvbiBpcyA8Y29kZT5udWxsPC9jb2RlPikuIAorCSAqIE5vdGUgdGhhdCBtdWx0aXBsZSBzb3VyY2UgZW50cmllcyBtYXkgdGFyZ2V0IHRoZSBzYW1lIG91dHB1dCBsb2NhdGlvbi4KKwkgKiBUaGUgb3V0cHV0IGxvY2F0aW9uIGlzIHJlZmVycmVkIHRvIHVzaW5nIGFuIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIAorCSAqIHdvcmtzcGFjZSByb290LCBlLmcuIDxjb2RlPiIvUHJvamVjdC9iaW4iPC9jb2RlPiwgaXQgbXVzdCBiZSBsb2NhdGVkIGluc2lkZSAKKwkgKiB0aGUgc2FtZSBwcm9qZWN0IGFzIHRoZSBzb3VyY2UgZm9sZGVyLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBBbHNvIG5vdGUgdGhhdCBhbGwgc291cmNlcy9iaW5hcmllcyBpbnNpZGUgYSBwcm9qZWN0IGFyZSBjb250cmlidXRlZCBhcyBhIHdob2xlIHRocm91Z2gKKwkgKiBhIHByb2plY3QgZW50cnkgKHNlZSA8Y29kZT5KYXZhQ29yZS5uZXdQcm9qZWN0RW50cnk8L2NvZGU+KS4gUGFydGljdWxhcgorCSAqIHNvdXJjZSBlbnRyaWVzIGNhbm5vdCBiZSBzZWxlY3RpdmVseSBleHBvcnRlZC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gcGF0aCB0aGUgYWJzb2x1dGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggb2YgYSBzb3VyY2UgZm9sZGVyCisJICogQHBhcmFtIGV4Y2x1c2lvblBhdHRlcm5zIHRoZSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIGV4Y2x1c2lvbiBwYXR0ZXJucworCSAqICAgIHJlcHJlc2VudGVkIGFzIHJlbGF0aXZlIHBhdGhzCisJICogQHBhcmFtIG91dHB1dExvY2F0aW9uIHRoZSBzcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24gZm9yIHRoaXMgc291cmNlIGVudHJ5ICg8Y29kZT5udWxsPC9jb2RlPiBpZiB1c2luZyBwcm9qZWN0IGRlZmF1bHQgb3VwdXQgbG9jYXRpb24pCisJICogQHJldHVybiBhIG5ldyBzb3VyY2UgY2xhc3NwYXRoIGVudHJ5IHdpdGggdGhlIGdpdmVuIGV4Y2x1c2lvbiBwYXR0ZXJucworCSAqIEBzZWUgI25ld1NvdXJjZUVudHJ5KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNnZXRFeGNsdXNpb25QYXR0ZXJucworCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldE91dHB1dExvY2F0aW9uKCkKKwkgKiAKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3U291cmNlRW50cnkoSVBhdGggcGF0aCwgSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJucywgSVBhdGggc3BlY2lmaWNPdXRwdXRMb2NhdGlvbikgeworCisJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIEFzc2VydC5pc1RydWUoZmFsc2UsICJQYXRoIGZvciBJQ2xhc3NwYXRoRW50cnkgbXVzdCBiZSBhYnNvbHV0ZSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiRXhjbHVzaW9uIHBhdHRlcm4gc2V0IGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwogCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KAogCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsCiAJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSwKIAkJCXBhdGgsCi0JCQludWxsLAotCQkJbnVsbCwKKwkJCWV4Y2x1c2lvblBhdHRlcm5zLAorCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQKKwkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50IHJvb3QKKwkJCXNwZWNpZmljT3V0cHV0TG9jYXRpb24sIC8vIGN1c3RvbSBvdXRwdXQgbG9jYXRpb24KIAkJCWZhbHNlKTsKIAl9Ci0KKwkJCiAJLyoqCiAJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBub24tZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJ5IG9mIGtpbmQgPGNvZGU+Q1BFX1ZBUklBQkxFPC9jb2RlPgogCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGggaXMgdGhlIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUuCkBAIC0xOTQyLDkgKzI1NDUsNyBAQAogCQlJUGF0aCB2YXJpYWJsZVBhdGgsCiAJCUlQYXRoIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsCiAJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgewotCQlBc3NlcnQuaXNUcnVlKAotCQkJdmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCi0JCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsVmFyaWFibGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAorCiAJCXJldHVybiBuZXdWYXJpYWJsZUVudHJ5KHZhcmlhYmxlUGF0aCwgdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBmYWxzZSk7CiAJfQogCkBAIC0xOTg4LDE5ICsyNTg5LDIzIEBACiAJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3VmFyaWFibGVFbnRyeSgKIAkJSVBhdGggdmFyaWFibGVQYXRoLAogCQlJUGF0aCB2YXJpYWJsZVNvdXJjZUF0dGFjaG1lbnRQYXRoLAotCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCisJCUlQYXRoIHZhcmlhYmxlU291cmNlQXR0YWNobWVudFJvb3RQYXRoLAogCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKIAkJCQotCQlBc3NlcnQuaXNUcnVlKAotCQkJdmFyaWFibGVQYXRoICE9IG51bGwgJiYgdmFyaWFibGVQYXRoLnNlZ21lbnRDb3VudCgpID49IDEsCi0JCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsVmFyaWFibGVQYXRoIiApKTsgLy8kTk9OLU5MUy0xJAotCQkJCisJCWlmICh2YXJpYWJsZVBhdGggPT0gbnVsbCB8fCB2YXJpYWJsZVBhdGguc2VnbWVudENvdW50KCkgPCAxKSB7CisJCQlBc3NlcnQuaXNUcnVlKAorCQkJCWZhbHNlLAorCQkJCSJJbGxlZ2FsIGNsYXNzcGF0aCB2YXJpYWJsZSBwYXRoOiBcJyIgKyB2YXJpYWJsZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSArICJcJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCX0KKwkKIAkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeSgKIAkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAogCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSwKIAkJCXZhcmlhYmxlUGF0aCwKLQkJCXZhcmlhYmxlU291cmNlQXR0YWNobWVudFBhdGgsCi0JCQlzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCisJCQlDbGFzc3BhdGhFbnRyeS5OT19FWENMVVNJT05fUEFUVEVSTlMsIAorCQkJdmFyaWFibGVTb3VyY2VBdHRhY2htZW50UGF0aCwgLy8gc291cmNlIGF0dGFjaG1lbnQKKwkJCXZhcmlhYmxlU291cmNlQXR0YWNobWVudFJvb3RQYXRoLCAvLyBzb3VyY2UgYXR0YWNobWVudCByb290CQkJCisJCQludWxsLCAvLyBzcGVjaWZpYyBvdXRwdXQgZm9sZGVyCiAJCQlpc0V4cG9ydGVkKTsKIAl9CiAKQEAgLTIwNTYsNyArMjY2MSw0MyBAQAogCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwogCX0KLQorCS8qKgorCSAqIFJ1bnMgdGhlIGdpdmVuIGFjdGlvbiBhcyBhbiBhdG9taWMgamF2YSBtb2RlbCBvcGVyYXRpb24uCisJICogPHA+CisJICogQWZ0ZXIgcnVubmluZyBhIG1ldGhvZCB0aGF0IG1vZGlmaWVzIGphdmEgZWxlbWVudHMsCisJICogcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgcmVjZWl2ZSBhZnRlci10aGUtZmFjdCBub3RpZmljYXRpb24gb2YKKwkgKiB3aGF0IGp1c3QgdHJhbnNwaXJlZCwgaW4gdGhlIGZvcm0gb2YgYSBlbGVtZW50IGNoYW5nZWQgZXZlbnQuCisJICogVGhpcyBtZXRob2QgYWxsb3dzIGNsaWVudHMgdG8gY2FsbCBhIG51bWJlciBvZgorCSAqIG1ldGhvZHMgdGhhdCBtb2RpZnkgamF2YSBlbGVtZW50cyBhbmQgb25seSBoYXZlIGVsZW1lbnQKKwkgKiBjaGFuZ2VkIGV2ZW50IG5vdGlmaWNhdGlvbnMgcmVwb3J0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZW50aXJlCisJICogYmF0Y2guCisJICogPC9wPgorCSAqIDxwPgorCSAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvdXRzaWRlIHRoZSBkeW5hbWljIHNjb3BlIG9mIGFub3RoZXIgc3VjaAorCSAqIGNhbGwsIHRoaXMgbWV0aG9kIHJ1bnMgdGhlIGFjdGlvbiBhbmQgdGhlbiByZXBvcnRzIGEgc2luZ2xlCisJICogZWxlbWVudCBjaGFuZ2VkIGV2ZW50IGRlc2NyaWJpbmcgdGhlIG5ldCBlZmZlY3Qgb2YgYWxsIGNoYW5nZXMKKwkgKiBkb25lIHRvIGphdmEgZWxlbWVudHMgYnkgdGhlIGFjdGlvbi4KKwkgKiA8L3A+CisJICogPHA+CisJICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBkeW5hbWljIHNjb3BlIG9mIGFub3RoZXIgc3VjaAorCSAqIGNhbGwsIHRoaXMgbWV0aG9kIHNpbXBseSBydW5zIHRoZSBhY3Rpb24uCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIHBlcmZvcm0KKwkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCisJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCisJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLgorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcnVuKElXb3Jrc3BhY2VSdW5uYWJsZSBhY3Rpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJaWYgKHdvcmtzcGFjZS5pc1RyZWVMb2NrZWQoKSkgeworCQkJbmV3IEJhdGNoT3BlcmF0aW9uKGFjdGlvbikucnVuKG1vbml0b3IpOworCQl9IGVsc2UgeworCQkJLy8gdXNlIElXb3Jrc3BhY2UucnVuKC4uLikgdG8gZW5zdXJlIHRoYXQgYSBidWlsZCB3aWxsIGJlIGRvbmUgaW4gYXV0b2J1aWxkIG1vZGUKKwkJCXdvcmtzcGFjZS5ydW4obmV3IEJhdGNoT3BlcmF0aW9uKGFjdGlvbiksIG1vbml0b3IpOworCQl9CisJfQogCS8qKiAKIAkgKiBCaW5kIGEgY29udGFpbmVyIHJlZmVyZW5jZSBwYXRoIHRvIHNvbWUgYWN0dWFsIGNvbnRhaW5lcnMgKDxjb2RlPklDbGFzc3BhdGhDb250YWluZXI8L2NvZGU+KS4KIAkgKiBUaGlzIEFQSSBtdXN0IGJlIGludm9rZWQgd2hlbmV2ZXIgY2hhbmdlcyBpbiBjb250YWluZXIgbmVlZCB0byBiZSByZWZsZWN0ZWQgb250byB0aGUgSmF2YU1vZGVsLgpAQCAtMjA4Niw3ICsyNzI3LDEwIEBACiAJICogPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IGZvciBlYWNoIHJlZmVyZW5jZWQgY29udGFpbmVyIAogCSAqICh0aHJvdWdoIHRoZSBleHRlbnNpb24gcG9pbnQgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIikuCiAJICogPHA+Ci0JICogCisJICogTm90ZTogc2V0dGluZyBhIGNvbnRhaW5lciB0byA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGNhdXNlIGl0IHRvIGJlIGxhemlseSByZXNvbHZlZCBhZ2FpbiB3aGVuZXZlcgorCSAqIGl0cyB2YWx1ZSBpcyByZXF1aXJlZC4gSW4gcGFydGljdWxhciwgdGhpcyB3aWxsIGNhdXNlIGEgcmVnaXN0ZXJlZCBpbml0aWFsaXplciB0byBiZSBpbnZva2VkCisJICogYWdhaW4uCisJICogPHA+CiAJICogQHBhcmFtIGNvbnRhaW5lclBhdGggLSB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSwgd2hpY2ggaXMgYmVpbmcgdXBkYXRlZAogCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3RzIC0gdGhlIHNldCBvZiBwcm9qZWN0cyBmb3Igd2hpY2ggdGhpcyBjb250YWluZXIgaXMgYmVpbmcgYm91bmQKIAkgKiBAcGFyYW0gcmVzcGVjdGl2ZUNvbnRhaW5lcnMgLSB0aGUgc2V0IG9mIHJlc3BlY3RpdmUgY29udGFpbmVycyBmb3IgdGhlIGFmZmVjdGVkIHByb2plY3RzCkBAIC0yMDk3LDI3ICsyNzQxLDQyIEBACiAJICogQHNlZSBJQ2xhc3NwYXRoQ29udGFpbmVyCiAJICogQHNpbmNlIDIuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0W10gYWZmZWN0ZWRQcm9qZWN0cywgSUNsYXNzcGF0aENvbnRhaW5lcltdIHJlc3BlY3RpdmVDb250YWluZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc3BhdGhDb250YWluZXIoZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0W10gYWZmZWN0ZWRQcm9qZWN0cywgSUNsYXNzcGF0aENvbnRhaW5lcltdIHJlc3BlY3RpdmVDb250YWluZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JCUFzc2VydC5pc1RydWUoYWZmZWN0ZWRQcm9qZWN0cy5sZW5ndGggPT0gcmVzcGVjdGl2ZUNvbnRhaW5lcnMubGVuZ3RoLCBVdGlsLmJpbmQoImNsYXNzcGF0aC5taXNtYXRjaFByb2plY3RzQ29udGFpbmVycyIgKSk7IC8vJE5PTi1OTFMtMSQKLQorCQlpZiAoYWZmZWN0ZWRQcm9qZWN0cy5sZW5ndGggIT0gcmVzcGVjdGl2ZUNvbnRhaW5lcnMubGVuZ3RoKSBBc3NlcnQuaXNUcnVlKGZhbHNlLCAiUHJvamVjdHMgYW5kIGNvbnRhaW5lcnMgY29sbGVjdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2l6ZSIpOyAvLyROT04tTkxTLTEkCisJCiAJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKwkKKwkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BDb250YWluZXIgU0VUICAtIHNldHRpbmcgY29udGFpbmVyOiBbIitjb250YWluZXJQYXRoKyJdIGZvciBwcm9qZWN0czogeyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJKyAoVXRpbC50b1N0cmluZyhhZmZlY3RlZFByb2plY3RzLCAKKwkJCQkJCW5ldyBVdGlsLkRpc3BsYXlhYmxlKCl7IAorCQkJCQkJCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZyhPYmplY3QgbykgeyByZXR1cm4gKChJSmF2YVByb2plY3QpIG8pLmdldEVsZW1lbnROYW1lKCk7IH0KKwkJCQkJCX0pKQorCQkJCSsgIn0gd2l0aCB2YWx1ZXM6ICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgKFV0aWwudG9TdHJpbmcocmVzcGVjdGl2ZUNvbnRhaW5lcnMsIAorCQkJCQkJbmV3IFV0aWwuRGlzcGxheWFibGUoKXsgCisJCQkJCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IHJldHVybiAoKElDbGFzc3BhdGhDb250YWluZXIpIG8pLmdldERlc2NyaXB0aW9uKCk7IH0KKwkJCQkJCX0pKQorCQkJCQkpOworCQl9CiAKLQkJaW50IHByb2plY3RMZW5ndGggPSBhZmZlY3RlZFByb2plY3RzLmxlbmd0aDsKLQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdW10gb2xkUmVzb2x2ZWRQYXRocyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcHJvamVjdExlbmd0aF1bXTsKLQorCQlmaW5hbCBpbnQgcHJvamVjdExlbmd0aCA9IGFmZmVjdGVkUHJvamVjdHMubGVuZ3RoOworCQlmaW5hbCBJSmF2YVByb2plY3RbXSBtb2RpZmllZFByb2plY3RzOworCQlTeXN0ZW0uYXJyYXljb3B5KGFmZmVjdGVkUHJvamVjdHMsIDAsIG1vZGlmaWVkUHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W3Byb2plY3RMZW5ndGhdLCAwLCBwcm9qZWN0TGVuZ3RoKTsKKwkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W11bXSBvbGRSZXNvbHZlZFBhdGhzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtwcm9qZWN0TGVuZ3RoXVtdOworCQkJCiAJCS8vIGZpbHRlciBvdXQgdW5tb2RpZmllZCBwcm9qZWN0IGNvbnRhaW5lcnMKIAkJaW50IHJlbWFpbmluZyA9IDA7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdExlbmd0aDsgaSsrKXsKLQorCQogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOwotCisJCiAJCQlJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gYWZmZWN0ZWRQcm9qZWN0c1tpXTsKIAkJCUlDbGFzc3BhdGhDb250YWluZXIgbmV3Q29udGFpbmVyID0gcmVzcGVjdGl2ZUNvbnRhaW5lcnNbaV07Ci0JCQkKKwkJCWlmIChuZXdDb250YWluZXIgPT0gbnVsbCkgbmV3Q29udGFpbmVyID0gSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJJbml0aWFsaXphdGlvbkluUHJvZ3Jlc3M7IC8vIDMwOTIwIC0gcHJldmVudCBpbmZpbml0ZSBsb29wCiAJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlpZiAoYWZmZWN0ZWRQcm9qZWN0LmdldFByb2plY3QoKS5leGlzdHMoKSl7CisJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShhZmZlY3RlZFByb2plY3QuZ2V0UHJvamVjdCgpKSl7CiAJCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoID0gYWZmZWN0ZWRQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwogCQkJCWZvciAoaW50IGogPSAwLCBjcExlbmd0aCA9IHJhd0NsYXNzcGF0aC5sZW5ndGg7IGogPGNwTGVuZ3RoOyBqKyspIHsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcmF3Q2xhc3NwYXRoW2pdOwpAQCAtMjEyOCw3NSArMjc4Nyw4MCBAQAogCQkJCX0KIAkJCX0KIAkJCWlmICghZm91bmQpewotCQkJCWFmZmVjdGVkUHJvamVjdHNbaV0gPSBudWxsOyAvLyBmaWx0ZXIgb3V0IHRoaXMgcHJvamVjdCAtIGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgY29udGFpbmVyIHBhdGgKKwkJCQltb2RpZmllZFByb2plY3RzW2ldID0gbnVsbDsgLy8gZmlsdGVyIG91dCB0aGlzIHByb2plY3QgLSBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lciBwYXRoLCBvciBpc250J3QgeWV0IEphdmEgcHJvamVjdAorCQkJCUphdmFNb2RlbE1hbmFnZXIuY29udGFpbmVyUHV0KGFmZmVjdGVkUHJvamVjdCwgY29udGFpbmVyUGF0aCwgbmV3Q29udGFpbmVyKTsKKwkJCQljb250aW51ZTsKIAkJCX0KLQkJCQotCQkJTWFwIHBlclByb2plY3RDb250YWluZXJzID0gKE1hcClKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMuZ2V0KGFmZmVjdGVkUHJvamVjdCk7Ci0JCQlpZiAocGVyUHJvamVjdENvbnRhaW5lcnMgPT0gbnVsbCl7Ci0JCQkJcGVyUHJvamVjdENvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCUphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVycy5wdXQoYWZmZWN0ZWRQcm9qZWN0LCBwZXJQcm9qZWN0Q29udGFpbmVycyk7Ci0JCQl9IGVsc2UgewotCQkJCUlDbGFzc3BhdGhDb250YWluZXIgb2xkQ29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpIHBlclByb2plY3RDb250YWluZXJzLmdldChjb250YWluZXJQYXRoKTsKLQkJCQlpZiAob2xkQ29udGFpbmVyICE9IG51bGwgJiYgb2xkQ29udGFpbmVyLmVxdWFscyhyZXNwZWN0aXZlQ29udGFpbmVyc1tpXSkpewotCQkJCQlhZmZlY3RlZFByb2plY3RzW2ldID0gbnVsbDsgLy8gZmlsdGVyIG91dCB0aGlzIHByb2plY3QgLSBjb250YWluZXIgZGlkIG5vdCBjaGFuZ2UKLQkJCQkJY29udGludWU7CisJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IEphdmFNb2RlbE1hbmFnZXIuY29udGFpbmVyR2V0KGFmZmVjdGVkUHJvamVjdCwgY29udGFpbmVyUGF0aCk7CisJCQlpZiAob2xkQ29udGFpbmVyID09IEphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVySW5pdGlhbGl6YXRpb25JblByb2dyZXNzKSB7CisJCQkJTWFwIHByZXZpb3VzQ29udGFpbmVyVmFsdWVzID0gKE1hcClKYXZhTW9kZWxNYW5hZ2VyLlByZXZpb3VzU2Vzc2lvbkNvbnRhaW5lcnMuZ2V0KGFmZmVjdGVkUHJvamVjdCk7CisJCQkJaWYgKHByZXZpb3VzQ29udGFpbmVyVmFsdWVzICE9IG51bGwpeworCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIHByZXZpb3VzQ29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpcHJldmlvdXNDb250YWluZXJWYWx1ZXMuZ2V0KGNvbnRhaW5lclBhdGgpOworCQkJCQlpZiAocHJldmlvdXNDb250YWluZXIgIT0gbnVsbCkgeworCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQQ29udGFpbmVyIElOSVQgLSByZWVudGVyaW5nIGFjY2VzcyB0byBwcm9qZWN0IGNvbnRhaW5lcjogWyIrYWZmZWN0ZWRQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkrIl0gIiArIGNvbnRhaW5lclBhdGggKyAiIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24sIHdpbGwgc2VlIHByZXZpb3VzIHZhbHVlOiAiKyBwcmV2aW91c0NvbnRhaW5lci5nZXREZXNjcmlwdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkJCX0KKwkJCQkJCUphdmFNb2RlbE1hbmFnZXIuY29udGFpbmVyUHV0KGFmZmVjdGVkUHJvamVjdCwgY29udGFpbmVyUGF0aCwgcHJldmlvdXNDb250YWluZXIpOyAKKwkJCQkJfQorCQkJCQlvbGRDb250YWluZXIgPSBudWxsOyAvLzMzNjk1IC0gY2Fubm90IGZpbHRlciBvdXQgcmVzdG9yZWQgY29udGFpbmVyLCBtdXN0IHVwZGF0ZSBhZmZlY3RlZCBwcm9qZWN0IHRvIHJlc2V0IGNhY2hlZCBDUAorCQkJCX0gZWxzZSB7CisJCQkJCW9sZENvbnRhaW5lciA9IG51bGw7CiAJCQkJfQogCQkJfQotCQkJaWYgKGZvdW5kKXsKLQkJCQlyZW1haW5pbmcrKzsKLQkJCQlvbGRSZXNvbHZlZFBhdGhzW2ldID0gYWZmZWN0ZWRQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJaWYgKG9sZENvbnRhaW5lciAhPSBudWxsICYmIG9sZENvbnRhaW5lci5lcXVhbHMocmVzcGVjdGl2ZUNvbnRhaW5lcnNbaV0pKXsvLyBUT0RPOiBjb3VsZCBpbXByb3ZlIHRvIG9ubHkgY29tcGFyZSBlbnRyaWVzCisJCQkJbW9kaWZpZWRQcm9qZWN0c1tpXSA9IG51bGw7IC8vIGZpbHRlciBvdXQgdGhpcyBwcm9qZWN0IC0gY29udGFpbmVyIGRpZCBub3QgY2hhbmdlCisJCQkJY29udGludWU7CiAJCQl9Ci0JCQlwZXJQcm9qZWN0Q29udGFpbmVycy5wdXQoY29udGFpbmVyUGF0aCwgbmV3Q29udGFpbmVyKTsKKwkJCXJlbWFpbmluZysrOyAKKwkJCW9sZFJlc29sdmVkUGF0aHNbaV0gPSBhZmZlY3RlZFByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmNvbnRhaW5lclB1dChhZmZlY3RlZFByb2plY3QsIGNvbnRhaW5lclBhdGgsIG5ld0NvbnRhaW5lcik7CiAJCX0KIAkJCiAJCWlmIChyZW1haW5pbmcgPT0gMCkgcmV0dXJuOwogCQkKIAkJLy8gdHJpZ2dlciBtb2RlbCByZWZyZXNoCi0JCWJvb2xlYW4gd2FzRmlyaW5nID0gbWFuYWdlci5pc0ZpcmluZygpOwotCQlpbnQgY291bnQgPSAwOwogCQl0cnkgewotCQkJaWYgKHdhc0ZpcmluZykKLQkJCQltYW5hZ2VyLnN0b3BEZWx0YXMoKTsKLQkJCQkKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TGVuZ3RoOyBpKyspeworCQkJSmF2YUNvcmUucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgcHJvamVjdExlbmd0aDsgaSsrKXsKKwkJCisJCQkJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCQorCQkJCQkJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KW1vZGlmaWVkUHJvamVjdHNbaV07CisJCQkJCQlpZiAoYWZmZWN0ZWRQcm9qZWN0ID09IG51bGwpIGNvbnRpbnVlOyAvLyB3YXMgZmlsdGVyZWQgb3V0CisJCQkJCQkKKwkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSl7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDUENvbnRhaW5lciBTRVQgIC0gdXBkYXRpbmcgYWZmZWN0ZWQgcHJvamVjdDogWyIrYWZmZWN0ZWRQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkrIl0gZHVlIHRvIHNldHRpbmcgY29udGFpbmVyOiAiICsgY29udGFpbmVyUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJfQogCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOwotCi0JCQkJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KWFmZmVjdGVkUHJvamVjdHNbaV07Ci0JCQkJaWYgKGFmZmVjdGVkUHJvamVjdCA9PSBudWxsKSBjb250aW51ZTsgLy8gd2FzIGZpbHRlcmVkIG91dAotCQkJCQotCQkJCWlmICgrK2NvdW50ID09IHJlbWFpbmluZykgeyAvLyByZS1lbmFibGUgZmlyaW5nIGZvciB0aGUgbGFzdCBvcGVyYXRpb24KLQkJCQkJaWYgKHdhc0ZpcmluZykgewotCQkJCQkJd2FzRmlyaW5nID0gZmFsc2U7Ci0JCQkJCQltYW5hZ2VyLnN0YXJ0RGVsdGFzKCk7CisJCQkJCQkvLyBmb3JjZSBhIHJlZnJlc2ggb2YgdGhlIGFmZmVjdGVkIHByb2plY3QgKHdpbGwgY29tcHV0ZSBkZWx0YXMpCisJCQkJCQlhZmZlY3RlZFByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAorCQkJCQkJCQlhZmZlY3RlZFByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksCisJCQkJCQkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLAorCQkJCQkJCQltb25pdG9yLAorCQkJCQkJCQkhUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpLCAvLyBjYW4gc2F2ZSByZXNvdXJjZXMKKwkJCQkJCQkJb2xkUmVzb2x2ZWRQYXRoc1tpXSwKKwkJCQkJCQkJZmFsc2UsIC8vIHVwZGF0aW5nIC0gbm8gdmFsaWRhdGlvbgorCQkJCQkJCQlmYWxzZSk7IC8vIHVwZGF0aW5nIC0gbm8gbmVlZCB0byBzYXZlCiAJCQkJCX0KIAkJCQl9Ci0JCQkKLQkJCQkvLyBmb3JjZSBhIHJlZnJlc2ggb2YgdGhlIGFmZmVjdGVkIHByb2plY3QgKHdpbGwgY29tcHV0ZSBkZWx0YXMpCi0JCQkJYWZmZWN0ZWRQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCgKLQkJCQkJCWFmZmVjdGVkUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwKLQkJCQkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLAotCQkJCQkJbW9uaXRvciwKLQkJCQkJCSFKYXZhTW9kZWxNYW5hZ2VyLklzUmVzb3VyY2VUcmVlTG9ja2VkLCAvLyBjYW4gc2F2ZSByZXNvdXJjZXMKLQkJCQkJCSFKYXZhTW9kZWxNYW5hZ2VyLklzUmVzb3VyY2VUcmVlTG9ja2VkICYmIGFmZmVjdGVkUHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpLCAvLyBmb3JjZSBzYXZlPwotCQkJCQkJb2xkUmVzb2x2ZWRQYXRoc1tpXSwKLQkJCQkJCXJlbWFpbmluZyA9PSAxLCAvLyBubyBpbmRpdmlkdWFsIGN5Y2xlIGNoZWNrIGlmIG1vcmUgdGhhbiAxIHByb2plY3QKLQkJCQkJCWZhbHNlKTsgLy8gdXBkYXRpbmcgLSBubyB2YWxpZGF0aW9uCisJCQl9LAorCQkJbW9uaXRvcik7CisJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BDb250YWluZXIgU0VUICAtIEZBSUxFRCBEVUUgVE8gRVhDRVBUSU9OOiAiK2NvbnRhaW5lclBhdGgpOyAvLyROT04tTkxTLTEkCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCX0KLQkJCWlmIChyZW1haW5pbmcgPiAxKXsKLQkJCQkvLyB1c2Ugd29ya3NwYWNlIHJ1bm5hYmxlIHNvIGFzIHRvIGFsbG93IG1hcmtlciBjcmVhdGlvbiAtIHdvcmthcm91bmQgYnVnIDE0NzMzCi0vLwkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKAotLy8JCQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0vLwkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQlKYXZhUHJvamVjdC51cGRhdGVBbGxDeWNsZU1hcmtlcnMoKTsgLy8gdXBkYXRlIHRoZW0gYWxsIGF0IG9uY2UKLS8vCQkJCQkJfQotLy8JCQkJCX0sIAotLy8JCQkJCW1vbml0b3IpOwkJCQkJCisJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgeworCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pZTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCWlmICh3YXNGaXJpbmcpIHsKLQkJCQltYW5hZ2VyLnN0YXJ0RGVsdGFzKCk7Ci0JCQkJLy8gaW4gY2FzZSBvZiBleGNlcHRpb24gdHJhdmVyc2luZywgZGVsdGFzIG1heSBiZSBmaXJlZCBvbmx5IGluIHRoZSBuZXh0ICNmaXJlKCkgaXRlcmF0aW9uCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RMZW5ndGg7IGkrKykgeworCQkJCWlmIChyZXNwZWN0aXZlQ29udGFpbmVyc1tpXSA9PSBudWxsKSB7CisJCQkJCUphdmFNb2RlbE1hbmFnZXIuY29udGFpbmVyUHV0KGFmZmVjdGVkUHJvamVjdHNbaV0sIGNvbnRhaW5lclBhdGgsIG51bGwpOyAvLyByZXNldCBpbml0IGluIHByb2dyZXNzIG1hcmtlcgorCQkJCX0KIAkJCX0KIAkJfQogCQkJCQkKQEAgLTIyNDYsNyArMjkxMCw3IEBACiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJQXNzZXJ0LmlzVHJ1ZShwYXRoICE9IG51bGwsIFV0aWwuYmluZCgiY2xhc3NwYXRoLm51bGxWYXJpYWJsZVBhdGgiICkpOyAvLyROT04tTkxTLTEkCisJCWlmIChwYXRoID09IG51bGwpIEFzc2VydC5pc1RydWUoZmFsc2UsICJWYXJpYWJsZSBwYXRoIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAkJc2V0Q2xhc3NwYXRoVmFyaWFibGVzKG5ldyBTdHJpbmdbXXt2YXJpYWJsZU5hbWV9LCBuZXcgSVBhdGhbXXsgcGF0aCB9LCBtb25pdG9yKTsKIAl9CiAKQEAgLTIyNzQsNyArMjkzOCw4IEBACiAJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJQXNzZXJ0LmlzVHJ1ZSh2YXJpYWJsZU5hbWVzLmxlbmd0aCA9PSBwYXRocy5sZW5ndGgsIFV0aWwuYmluZCgiY2xhc3NwYXRoLm1pc21hdGNoTmFtZVBhdGgiICkpOyAvLyROT04tTkxTLTEkCisJCWlmICh2YXJpYWJsZU5hbWVzLmxlbmd0aCAhPSBwYXRocy5sZW5ndGgpCUFzc2VydC5pc1RydWUoZmFsc2UsICJWYXJpYWJsZSBuYW1lcyBhbmQgcGF0aHMgY29sbGVjdGlvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2l6ZSIpOyAvLyROT04tTkxTLTEkCisJCS8vVE9ETzogc2hvdWxkIGNoZWNrIHRoYXQgbnVsbCBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBwYXRocwogCQl1cGRhdGVWYXJpYWJsZVZhbHVlcyh2YXJpYWJsZU5hbWVzLCBwYXRocywgbW9uaXRvcik7CiAJfQogCkBAIC0yMzEyLDYgKzI5NzcsNyBAQAogCQlFbnVtZXJhdGlvbiBrZXlzID0gbmV3T3B0aW9ucy5rZXlzKCk7CiAJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKXsKIAkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKwkJCWlmICghSmF2YU1vZGVsTWFuYWdlci5PcHRpb25OYW1lcy5jb250YWlucyhrZXkpKSBjb250aW51ZTsgLy8gdW5yZWNvZ25pemVkIG9wdGlvbgogCQkJaWYgKGtleS5lcXVhbHMoQ09SRV9FTkNPRElORykpIGNvbnRpbnVlOyAvLyBza2lwcGVkLCBjb250cmlidXRlZCBieSByZXNvdXJjZSBwcmVmcwogCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyluZXdPcHRpb25zLmdldChrZXkpOwogCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7CkBAIC0yMzY2LDEyICszMDMyLDEzIEBACiAKIAkJCS8vIHJldHJpZXZlIHZhcmlhYmxlIHZhbHVlcwogCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBKYXZhTW9kZWxNYW5hZ2VyLlBsdWdpblByZWZlcmVuY2VzTGlzdGVuZXIoKSk7Ci0JCQltYW5hZ2VyLmxvYWRWYXJpYWJsZXMoKTsKKwkJCW1hbmFnZXIubG9hZFZhcmlhYmxlc0FuZENvbnRhaW5lcnMoKTsKIAogCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAJCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKIAkJCQltYW5hZ2VyLmRlbHRhUHJvY2Vzc29yLAogCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9BVVRPX0JVSUxECisJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9BVVRPX0JVSUxECiAJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UKIAkJCQkJfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFCiAJCQkJCXwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKTsKQEAgLTIzOTQsMjIgKzMwNjEsMzYgQEAKIAkJU3RyaW5nW10gdmFyaWFibGVOYW1lcywKIAkJSVBhdGhbXSB2YXJpYWJsZVBhdGhzLAogCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCisJCiAJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKIAkJCi0JCWJvb2xlYW4gbmVlZEN5Y2xlQ2hlY2sgPSBmYWxzZTsKKwkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BWYXJpYWJsZSBTRVQgIC0gc2V0dGluZyB2YXJpYWJsZXM6IHsiICsgVXRpbC50b1N0cmluZyh2YXJpYWJsZU5hbWVzKSAgLy8kTk9OLU5MUy0xJAorCQkJCSsgIn0gd2l0aCB2YWx1ZXM6ICIgKyBVdGlsLnRvU3RyaW5nKHZhcmlhYmxlUGF0aHMpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKIAkJaW50IHZhckxlbmd0aCA9IHZhcmlhYmxlTmFtZXMubGVuZ3RoOwogCQkKIAkJLy8gZ2F0aGVyIGNsYXNzcGF0aCBpbmZvcm1hdGlvbiBmb3IgdXBkYXRpbmcKLQkJSGFzaE1hcCBhZmZlY3RlZFByb2plY3RzID0gbmV3IEhhc2hNYXAoNSk7CisJCWZpbmFsIEhhc2hNYXAgYWZmZWN0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoTWFwKDUpOwogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJSUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7Ci0KKwkKIAkJLy8gZmlsdGVyIG91dCB1bm1vZGlmaWVkIHZhcmlhYmxlcwogCQlpbnQgZGlzY2FyZENvdW50ID0gMDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJMZW5ndGg7IGkrKyl7Ci0JCQlJUGF0aCBvbGRQYXRoID0gKElQYXRoKUphdmFNb2RlbE1hbmFnZXIudmFyaWFibGVHZXQodmFyaWFibGVOYW1lc1tpXSk7Ci0JCQlpZiAob2xkUGF0aCA9PSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKSBvbGRQYXRoID0gbnVsbDsKKwkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZU5hbWVzW2ldOworCQkJSVBhdGggb2xkUGF0aCA9IChJUGF0aClKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7IC8vIGlmIHJlZW50ZXJpbmcgd2lsbCBwcm92aWRlIHByZXZpb3VzIHNlc3Npb24gdmFsdWUgCisJCQlpZiAob2xkUGF0aCA9PSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKXsKKwkJCQlJUGF0aCBwcmV2aW91c1BhdGggPSAoSVBhdGgpSmF2YU1vZGVsTWFuYWdlci5QcmV2aW91c1Nlc3Npb25WYXJpYWJsZXMuZ2V0KHZhcmlhYmxlTmFtZSk7CisJCQkJaWYgKHByZXZpb3VzUGF0aCAhPSBudWxsKXsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFKXsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1BWYXJpYWJsZSBJTklUIC0gcmVlbnRlcmluZyBhY2Nlc3MgdG8gdmFyaWFibGU6ICIgKyB2YXJpYWJsZU5hbWUrICIgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiwgd2lsbCBzZWUgcHJldmlvdXMgdmFsdWU6ICIrIHByZXZpb3VzUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl9CisJCQkJCUphdmFNb2RlbE1hbmFnZXIudmFyaWFibGVQdXQodmFyaWFibGVOYW1lLCBwcmV2aW91c1BhdGgpOyAvLyByZXBsYWNlIHZhbHVlIHNvIHJlZW50ZXJpbmcgY2FsbHMgYXJlIHNlZWluZyBvbGQgdmFsdWUKKwkJCQl9CisJCQkJb2xkUGF0aCA9IG51bGw7ICAvLzMzNjk1IC0gY2Fubm90IGZpbHRlciBvdXQgcmVzdG9yZWQgdmFyaWFibGUsIG11c3QgdXBkYXRlIGFmZmVjdGVkIHByb2plY3QgdG8gcmVzZXQgY2FjaGVkIENQCisJCQl9CiAJCQlpZiAob2xkUGF0aCAhPSBudWxsICYmIG9sZFBhdGguZXF1YWxzKHZhcmlhYmxlUGF0aHNbaV0pKXsKIAkJCQl2YXJpYWJsZU5hbWVzW2ldID0gbnVsbDsKIAkJCQlkaXNjYXJkQ291bnQrKzsKQEAgLTI0NDUsMzMgKzMxMjYsMTkgQEAKIAkJCQkJCiAJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtqXTsKIAkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCB2YXJMZW5ndGg7IGsrKyl7Ci0KKwkKIAkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSB2YXJpYWJsZU5hbWVzW2tdOwkJCQkJCQogCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09ICBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFKXsKLQorCQogCQkJCQkJCWlmICh2YXJpYWJsZU5hbWUuZXF1YWxzKGVudHJ5LmdldFBhdGgoKS5zZWdtZW50KDApKSl7Ci0JCQkJCQkJCWFmZmVjdGVkUHJvamVjdHMucHV0KHByb2plY3QsICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkpOwotCQkJCQkJCQkKLQkJCQkJCQkJLy8gYWxzbyBjaGVjayB3aGV0aGVyIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBwcm9qIHJlZmVyZW5jZXMgYW5kIGN5Y2xlIG1hcmtlcnMKLQkJCQkJCQkJaWYgKCFuZWVkQ3ljbGVDaGVjayAmJiBlbnRyeS5nZXRQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gIDEpewotCQkJCQkJCQkJSVBhdGggb2xkUGF0aCA9IChJUGF0aClKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlR2V0KHZhcmlhYmxlTmFtZSk7Ci0JCQkJCQkJCQlpZiAob2xkUGF0aCA9PSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlSW5pdGlhbGl6YXRpb25JblByb2dyZXNzKSBvbGRQYXRoID0gbnVsbDsKLQkJCQkJCQkJCWlmIChvbGRQYXRoICE9IG51bGwgJiYgb2xkUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJCQkJCQkJbmVlZEN5Y2xlQ2hlY2sgPSB0cnVlOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlJUGF0aCBuZXdQYXRoID0gdmFyaWFibGVQYXRoc1trXTsKLQkJCQkJCQkJCQlpZiAobmV3UGF0aCAhPSBudWxsICYmIG5ld1BhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCQkJCQkJCQluZWVkQ3ljbGVDaGVjayA9IHRydWU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9CisJCQkJCQkJCWFmZmVjdGVkUHJvamVjdHMucHV0KHByb2plY3QsIHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkpOwogCQkJCQkJCQljb250aW51ZSBuZXh0UHJvamVjdDsKIAkJCQkJCQl9CiAJCQkJCQkJSVBhdGggc291cmNlUGF0aCwgc291cmNlUm9vdFBhdGg7CiAJCQkJCQkJaWYgKCgoc291cmNlUGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpICE9IG51bGwJJiYgdmFyaWFibGVOYW1lLmVxdWFscyhzb3VyY2VQYXRoLnNlZ21lbnQoMCkpKQogCQkJCQkJCQl8fCAoKHNvdXJjZVJvb3RQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpICE9IG51bGwJJiYgdmFyaWFibGVOYW1lLmVxdWFscyhzb3VyY2VSb290UGF0aC5zZWdtZW50KDApKSkpIHsKLQotCQkJCQkJCQlhZmZlY3RlZFByb2plY3RzLnB1dChwcm9qZWN0LCAoKEphdmFQcm9qZWN0KXByb2plY3QpLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpKTsKKwkKKwkJCQkJCQkJYWZmZWN0ZWRQcm9qZWN0cy5wdXQocHJvamVjdCwgcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSk7CiAJCQkJCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0OwogCQkJCQkJCX0KIAkJCQkJCX0JCQkJCQkJCQkJCQkKQEAgLTI0ODEsNTggKzMxNDgsNTAgQEAKIAkJfQogCQkvLyB1cGRhdGUgdmFyaWFibGVzCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyTGVuZ3RoOyBpKyspewotCQkJSVBhdGggcGF0aCA9IHZhcmlhYmxlUGF0aHNbaV07Ci0JCQlKYXZhTW9kZWxNYW5hZ2VyLnZhcmlhYmxlUHV0KHZhcmlhYmxlTmFtZXNbaV0sIHBhdGgpOworCQkJSmF2YU1vZGVsTWFuYWdlci52YXJpYWJsZVB1dCh2YXJpYWJsZU5hbWVzW2ldLCB2YXJpYWJsZVBhdGhzW2ldKTsKIAkJfQorCQlmaW5hbCBTdHJpbmdbXSBkYmdWYXJpYWJsZU5hbWVzID0gdmFyaWFibGVOYW1lczsKIAkJCQkKIAkJLy8gdXBkYXRlIGFmZmVjdGVkIHByb2plY3QgY2xhc3NwYXRocwotCQlpbnQgc2l6ZSA9IGFmZmVjdGVkUHJvamVjdHMuc2l6ZSgpOwotCQkKIAkJaWYgKCFhZmZlY3RlZFByb2plY3RzLmlzRW1wdHkoKSkgewotCQkJYm9vbGVhbiB3YXNGaXJpbmcgPSBtYW5hZ2VyLmlzRmlyaW5nKCk7CiAJCQl0cnkgewotCQkJCWlmICh3YXNGaXJpbmcpCi0JCQkJCW1hbmFnZXIuc3RvcERlbHRhcygpOwotCQkJCS8vIHByb3BhZ2F0ZSBjbGFzc3BhdGggY2hhbmdlCi0JCQkJSXRlcmF0b3IgcHJvamVjdHNUb1VwZGF0ZSA9IGFmZmVjdGVkUHJvamVjdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocHJvamVjdHNUb1VwZGF0ZS5oYXNOZXh0KCkpIHsKKwkJCQlKYXZhQ29yZS5ydW4oCisJCQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCQkJLy8gcHJvcGFnYXRlIGNsYXNzcGF0aCBjaGFuZ2UKKwkJCQkJCQlJdGVyYXRvciBwcm9qZWN0c1RvVXBkYXRlID0gYWZmZWN0ZWRQcm9qZWN0cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJCQkJCXdoaWxlIChwcm9qZWN0c1RvVXBkYXRlLmhhc05leHQoKSkgeworCQkJCisJCQkJCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKwkJCQorCQkJCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0c1RvVXBkYXRlLm5leHQoKTsKIAotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47Ci0KLQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgcHJvamVjdHNUb1VwZGF0ZS5uZXh0KCk7Ci0JCQkJCQotCQkJCQlpZiAoIXByb2plY3RzVG9VcGRhdGUuaGFzTmV4dCgpKSB7Ci0JCQkJCQkvLyByZS1lbmFibGUgZmlyaW5nIGZvciB0aGUgbGFzdCBvcGVyYXRpb24KLQkJCQkJCWlmICh3YXNGaXJpbmcpIHsKLQkJCQkJCQl3YXNGaXJpbmcgPSBmYWxzZTsKLQkJCQkJCQltYW5hZ2VyLnN0YXJ0RGVsdGFzKCk7CisJCQkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRSl7CisJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQVmFyaWFibGUgU0VUICAtIHVwZGF0aW5nIGFmZmVjdGVkIHByb2plY3Q6IFsiK3Byb2plY3QuZ2V0RWxlbWVudE5hbWUoKSsiXSBkdWUgdG8gc2V0dGluZyB2YXJpYWJsZXM6ICIrIFV0aWwudG9TdHJpbmcoZGJnVmFyaWFibGVOYW1lcykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJcHJvamVjdAorCQkJCQkJCQkJLnNldFJhd0NsYXNzcGF0aCgKKwkJCQkJCQkJCQlwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLAorCQkJCQkJCQkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLAorCQkJCQkJCQkJCW51bGwsIC8vIGRvbid0IGNhbGwgYmVnaW5UYXNrIG9uIHRoZSBtb25pdG9yIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzcxNykKKwkJCQkJCQkJCQkhUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpLCAvLyBjYW4gY2hhbmdlIHJlc291cmNlcworCQkJCQkJCQkJCShJQ2xhc3NwYXRoRW50cnlbXSkgYWZmZWN0ZWRQcm9qZWN0cy5nZXQocHJvamVjdCksCisJCQkJCQkJCQkJZmFsc2UsIC8vIHVwZGF0aW5nIC0gbm8gdmFsaWRhdGlvbgorCQkJCQkJCQkJCWZhbHNlKTsgLy8gdXBkYXRpbmcgLSBubyBuZWVkIHRvIHNhdmUKKwkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcHJvamVjdAotCQkJCQkJLnNldFJhd0NsYXNzcGF0aCgKLQkJCQkJCQlwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLAotCQkJCQkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLAotCQkJCQkJCW1vbml0b3IsCi0JCQkJCQkJIUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQsIC8vIGNhbiBjaGFuZ2UgcmVzb3VyY2VzCi0JCQkJCQkJIUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQgJiYgcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpLC8vIGZvcmNlIGJ1aWxkIGlmIGluIGF1dG8gYnVpbGQgbW9kZQotCQkJCQkJCShJQ2xhc3NwYXRoRW50cnlbXSkgYWZmZWN0ZWRQcm9qZWN0cy5nZXQocHJvamVjdCksCi0JCQkJCQkJc2l6ZSA9PSAxICYmIG5lZWRDeWNsZUNoZWNrLCAvLyBubyBpbmRpdmlkdWFsIGNoZWNrIGlmIG1vcmUgdGhhbiAxIHByb2plY3QgdG8gdXBkYXRlCi0JCQkJCQkJZmFsc2UpOyAvLyB1cGRhdGluZyAtIG5vIHZhbGlkYXRpb24KKwkJCQkJfSwKKwkJCQkJbW9uaXRvcik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0UpeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNQVmFyaWFibGUgU0VUICAtIEZBSUxFRCBEVUUgVE8gRVhDRVBUSU9OOiAiK1V0aWwudG9TdHJpbmcoZGJnVmFyaWFibGVOYW1lcykpOyAvLyROT04tTkxTLTEkCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJfQotCQkJCWlmIChzaXplID4gMSAmJiBuZWVkQ3ljbGVDaGVjayl7Ci0JCQkJCS8vIHVzZSB3b3Jrc3BhY2UgcnVubmFibGUgZm9yIHByb3RlY3RpbmcgbWFya2VyIG1hbmlwdWxhdGlvbgotLy8JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oCi0vLwkJCQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0vLwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQkJCUphdmFQcm9qZWN0LnVwZGF0ZUFsbEN5Y2xlTWFya2VycygpOyAvLyB1cGRhdGUgdGhlbSBhbGwgYXQgb25jZQotLy8JCQkJCQkJfQotLy8JCQkJCQl9LCAKLS8vCQkJCQkJbW9uaXRvcik7CQkJCQkKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh3YXNGaXJpbmcpIHsKLQkJCQkJbWFuYWdlci5zdGFydERlbHRhcygpOwotCQkJCQkvLyBpbiBjYXNlIG9mIGV4Y2VwdGlvbiB0cmF2ZXJzaW5nLCBkZWx0YXMgbWF5IGJlIGZpcmVkIG9ubHkgaW4gdGhlIG5leHQgI2ZpcmUoKSBpdGVyYXRpb24KKwkJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgeworCQkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJCQl9CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL0phdmFNb2RlbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YU1vZGVsRXhjZXB0aW9uLmphdmEKaW5kZXggOTM3MTg0Zi4uNzE2MzI2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YU1vZGVsRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvSmF2YU1vZGVsRXhjZXB0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvTmFtaW5nQ29udmVudGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL05hbWluZ0NvbnZlbnRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwOWNlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL05hbWluZ0NvbnZlbnRpb25zLmphdmEKQEAgLTAsMCArMSw4NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmltcGwuQXNzaXN0T3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JTmFtaW5nUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkludGVybmFsTmFtaW5nQ29udmVudGlvbnM7CisKKworLyoqCisgKiBQcm92aWRlcyBtZXRob2RzIGZvciBjb21wdXRpbmcgSmF2YS1zcGVjaWZpYyBuYW1lcy4KKyAqIDxwPgorICogVGhlIGJldmF2aW9yIG9mIHRoZSBtZXRob2RzIGlzIGRlcGVuZGVudCBvZiBzZXZlcmFsIEphdmFDb3JlIG9wdGlvbnMuPGJyPgorICogVGhlIHBvc3NpYmxlIG9wdGlvbnMgYXJlIDoKKyAqIDx1bD4KKyAqIDxsaT5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTIDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgRmllbGQgTmFtZS48L2xpPgorICogPGxpPkNPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTIDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgU3RhdGljIEZpZWxkIE5hbWUuPC9saT4KKyAqIDxsaT5DT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTIDogRGVmaW5lIHRoZSBQcmVmaXhlcyBmb3IgTG9jYWwgVmFyaWFibGUgTmFtZS48L2xpPgorICogPGxpPkNPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVMgOiBEZWZpbmUgdGhlIFByZWZpeGVzIGZvciBBcmd1bWVudCBOYW1lLjwvbGk+CisgKiA8bGk+Q09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyA6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIEZpZWxkIE5hbWUuPC9saT4KKyAqIDxsaT5DT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUyA6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIFN0YXRpYyBGaWVsZCBOYW1lLjwvbGk+CisgKiA8bGk+Q09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUyA6IERlZmluZSB0aGUgU3VmZml4ZXMgZm9yIExvY2FsIFZhcmlhYmxlIE5hbWUuPC9saT4KKyAqIDxsaT5DT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTIDogRGVmaW5lIHRoZSBTdWZmaXhlcyBmb3IgQXJndW1lbnQgTmFtZS48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogCisgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKyAqIAorICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBhbmQgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQorICogaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqIAorICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOYW1pbmdDb252ZW50aW9ucyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEdFVFRFUl9CT09MX05BTUUgPSAiaXMiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gR0VUVEVSX05BTUUgPSAiZ2V0Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNFVFRFUl9OQU1FID0gInNldCIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE5hbWluZ1JlcXVlc3RvciBpbXBsZW1lbnRzIElOYW1pbmdSZXF1ZXN0b3IgeworCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laRSA9IDEwOworCQkKKwkJLy8gZm9yIGFjY2VwdE5hbWVXaXRoUHJlZml4QW5kU3VmZml4CisJCXByaXZhdGUgY2hhcltdW10gZmlyc3RQcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOworCQlwcml2YXRlIGludCBmaXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50ID0gMDsKKwkJcHJpdmF0ZSBjaGFyW11bXSBmaXJzdFByZWZpeEFuZFN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOworCQlwcml2YXRlIGludCBmaXJzdFByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudCA9IDA7CisJCXByaXZhdGUgY2hhcltdW10gcHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKKwkJcHJpdmF0ZSBpbnQgcHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQgPSAwOworCQlwcml2YXRlIGNoYXJbXVtdIHByZWZpeEFuZFN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOworCQlwcml2YXRlIGludCBwcmVmaXhBbmRTdWZmaXhSZXN1bHRzQ291bnQgPSAwOworCQkKKwkJLy8gZm9yIGFjY2VwdE5hbWVXaXRoUHJlZml4CisJCXByaXZhdGUgY2hhcltdW10gZmlyc3RQcmVmaXhSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKKwkJcHJpdmF0ZSBpbnQgZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQgPSAwOworCQlwcml2YXRlIGNoYXJbXVtdIHByZWZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOworCQlwcml2YXRlIGludCBwcmVmaXhSZXN1bHRzQ291bnQgPSAwOworCQkKKwkJLy8gZm9yIGFjY2VwdE5hbWVXaXRoU3VmZml4CisJCXByaXZhdGUgY2hhcltdW10gZmlyc3RTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKKwkJcHJpdmF0ZSBpbnQgZmlyc3RTdWZmaXhSZXN1bHRzQ291bnQgPSAwOworCQlwcml2YXRlIGNoYXJbXVtdIHN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltTSVpFXVtdOworCQlwcml2YXRlIGludCBzdWZmaXhSZXN1bHRzQ291bnQgPSAwOworCQkKKwkJLy8gZm9yIGFjY2VwdE5hbWVXaXRob3V0UHJlZml4QW5kU3VmZml4CisJCXByaXZhdGUgY2hhcltdW10gb3RoZXJSZXN1bHRzID0gbmV3IGNoYXJbU0laRV1bXTsKKwkJcHJpdmF0ZSBpbnQgb3RoZXJSZXN1bHRzQ291bnQgPSAwOworCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aFByZWZpeEFuZFN1ZmZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0UHJlZml4LCBib29sZWFuIGlzRmlyc3RTdWZmaXgpIHsKKwkJCWlmKGlzRmlyc3RQcmVmaXggJiYgaXNGaXJzdFN1ZmZpeCkgeworCQkJCWludCBsZW5ndGggPSBmaXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0cy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IGZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzLAorCQkJCQkJMCwKKwkJCQkJCWZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbbGVuZ3RoICogMl1bXSwKKwkJCQkJCTAsCisJCQkJCQlsZW5ndGgpOworCQkJCX0KKwkJCQlmaXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c1tmaXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsJCQkKKwkJCX0gZWxzZSBpZiAoaXNGaXJzdFByZWZpeCkgeworCQkJCWludCBsZW5ndGggPSBmaXJzdFByZWZpeEFuZFN1ZmZpeFJlc3VsdHMubGVuZ3RoOworCQkJCWlmKGxlbmd0aCA9PSBmaXJzdFByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJZmlyc3RQcmVmaXhBbmRTdWZmaXhSZXN1bHRzLAorCQkJCQkJMCwKKwkJCQkJCWZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0cyA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdW10sCisJCQkJCQkwLAorCQkJCQkJbGVuZ3RoKTsKKwkJCQl9CisJCQkJZmlyc3RQcmVmaXhBbmRTdWZmaXhSZXN1bHRzW2ZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKKwkJCX0gZWxzZSBpZihpc0ZpcnN0U3VmZml4KSB7CisJCQkJaW50IGxlbmd0aCA9IHByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0cy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IHByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMsCisJCQkJCQkwLAorCQkJCQkJcHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbbGVuZ3RoICogMl1bXSwKKwkJCQkJCTAsCisJCQkJCQlsZW5ndGgpOworCQkJCX0KKwkJCQlwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNbcHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbGVuZ3RoID0gcHJlZml4QW5kU3VmZml4UmVzdWx0cy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IHByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudCkgeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJcHJlZml4QW5kU3VmZml4UmVzdWx0cywKKwkJCQkJCTAsCisJCQkJCQlwcmVmaXhBbmRTdWZmaXhSZXN1bHRzID0gbmV3IGNoYXJbbGVuZ3RoICogMl1bXSwKKwkJCQkJCTAsCisJCQkJCQlsZW5ndGgpOworCQkJCX0KKwkJCQlwcmVmaXhBbmRTdWZmaXhSZXN1bHRzW3ByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudCsrXSA9IG5hbWU7CisJCQl9CisJCX0KKworCQlwdWJsaWMgdm9pZCBhY2NlcHROYW1lV2l0aFByZWZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0UHJlZml4KSB7CisJCQlpZihpc0ZpcnN0UHJlZml4KSB7CisJCQkJaW50IGxlbmd0aCA9IGZpcnN0UHJlZml4UmVzdWx0cy5sZW5ndGg7CisJCQkJaWYobGVuZ3RoID09IGZpcnN0UHJlZml4UmVzdWx0c0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlmaXJzdFByZWZpeFJlc3VsdHMsCisJCQkJCQkwLAorCQkJCQkJZmlyc3RQcmVmaXhSZXN1bHRzID0gbmV3IGNoYXJbbGVuZ3RoICogMl1bXSwKKwkJCQkJCTAsCisJCQkJCQlsZW5ndGgpOworCQkJCX0KKwkJCQlmaXJzdFByZWZpeFJlc3VsdHNbZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQrK10gPSBuYW1lOworCQkJfSBlbHNleworCQkJCWludCBsZW5ndGggPSBwcmVmaXhSZXN1bHRzLmxlbmd0aDsKKwkJCQlpZihsZW5ndGggPT0gcHJlZml4UmVzdWx0c0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlwcmVmaXhSZXN1bHRzLAorCQkJCQkJMCwKKwkJCQkJCXByZWZpeFJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxlbmd0aCk7CisJCQkJfQorCQkJCXByZWZpeFJlc3VsdHNbcHJlZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRoU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RTdWZmaXgpIHsKKwkJCWlmKGlzRmlyc3RTdWZmaXgpIHsKKwkJCQlpbnQgbGVuZ3RoID0gZmlyc3RTdWZmaXhSZXN1bHRzLmxlbmd0aDsKKwkJCQlpZihsZW5ndGggPT0gZmlyc3RTdWZmaXhSZXN1bHRzQ291bnQpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJCWZpcnN0U3VmZml4UmVzdWx0cywKKwkJCQkJCTAsCisJCQkJCQlmaXJzdFN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxlbmd0aCk7CisJCQkJfQorCQkJCWZpcnN0U3VmZml4UmVzdWx0c1tmaXJzdFN1ZmZpeFJlc3VsdHNDb3VudCsrXSA9IG5hbWU7CisJCQl9IGVsc2UgeworCQkJCWludCBsZW5ndGggPSBzdWZmaXhSZXN1bHRzLmxlbmd0aDsKKwkJCQlpZihsZW5ndGggPT0gc3VmZml4UmVzdWx0c0NvdW50KSB7CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQlzdWZmaXhSZXN1bHRzLAorCQkJCQkJMCwKKwkJCQkJCXN1ZmZpeFJlc3VsdHMgPSBuZXcgY2hhcltsZW5ndGggKiAyXVtdLAorCQkJCQkJMCwKKwkJCQkJCWxlbmd0aCk7CisJCQkJfQorCQkJCXN1ZmZpeFJlc3VsdHNbc3VmZml4UmVzdWx0c0NvdW50KytdID0gbmFtZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIGFjY2VwdE5hbWVXaXRob3V0UHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lKSB7CisJCQlpbnQgbGVuZ3RoID0gb3RoZXJSZXN1bHRzLmxlbmd0aDsKKwkJCWlmKGxlbmd0aCA9PSBvdGhlclJlc3VsdHNDb3VudCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCW90aGVyUmVzdWx0cywKKwkJCQkJMCwKKwkJCQkJb3RoZXJSZXN1bHRzID0gbmV3IGNoYXJbbGVuZ3RoICogMl1bXSwKKwkJCQkJMCwKKwkJCQkJbGVuZ3RoKTsKKwkJCX0KKwkJCW90aGVyUmVzdWx0c1tvdGhlclJlc3VsdHNDb3VudCsrXSA9IG5hbWU7CisJCX0KKwkJcHVibGljIGNoYXJbXVtdIGdldFJlc3VsdHMoKXsKKwkJCWludCBjb3VudCA9IAorCQkJCWZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQKKwkJCQkrIGZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50CisJCQkJKyBwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNDb3VudAorCQkJCSsgcHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50CisJCQkJKyBmaXJzdFByZWZpeFJlc3VsdHNDb3VudAorCQkJCSsgcHJlZml4UmVzdWx0c0NvdW50CisJCQkJKyBmaXJzdFN1ZmZpeFJlc3VsdHNDb3VudAorCQkJCSsgc3VmZml4UmVzdWx0c0NvdW50CisJCQkJKyBvdGhlclJlc3VsdHNDb3VudDsKKwkJCQkKKwkJCWNoYXJbXVtdIHJlc3VsdHMgPSBuZXcgY2hhcltjb3VudF1bXTsKKwkJCQorCQkJaW50IGluZGV4ID0gMDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3RQcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCBmaXJzdFByZWZpeEFuZEZpcnN0U3VmZml4UmVzdWx0c0NvdW50KTsKKwkJCWluZGV4ICs9IGZpcnN0UHJlZml4QW5kRmlyc3RTdWZmaXhSZXN1bHRzQ291bnQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIGZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50KTsKKwkJCWluZGV4ICs9IGZpcnN0UHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50OworCQkJU3lzdGVtLmFycmF5Y29weShwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCBwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNDb3VudCk7CisJCQlpbmRleCArPSBwcmVmaXhBbmRGaXJzdFN1ZmZpeFJlc3VsdHNDb3VudDsJCQorCQkJU3lzdGVtLmFycmF5Y29weShwcmVmaXhBbmRTdWZmaXhSZXN1bHRzLCAwLCByZXN1bHRzLCBpbmRleCwgcHJlZml4QW5kU3VmZml4UmVzdWx0c0NvdW50KTsKKwkJCWluZGV4ICs9IHByZWZpeEFuZFN1ZmZpeFJlc3VsdHNDb3VudDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoZmlyc3RQcmVmaXhSZXN1bHRzLCAwLCByZXN1bHRzLCBpbmRleCwgZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQpOworCQkJaW5kZXggKz0gZmlyc3RQcmVmaXhSZXN1bHRzQ291bnQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHByZWZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCBwcmVmaXhSZXN1bHRzQ291bnQpOworCQkJaW5kZXggKz0gcHJlZml4UmVzdWx0c0NvdW50OworCQkJU3lzdGVtLmFycmF5Y29weShmaXJzdFN1ZmZpeFJlc3VsdHMsIDAsIHJlc3VsdHMsIGluZGV4LCBmaXJzdFN1ZmZpeFJlc3VsdHNDb3VudCk7CisJCQlpbmRleCArPSBmaXJzdFN1ZmZpeFJlc3VsdHNDb3VudDsKKwkJCVN5c3RlbS5hcnJheWNvcHkoc3VmZml4UmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIHN1ZmZpeFJlc3VsdHNDb3VudCk7CisJCQlpbmRleCArPSBzdWZmaXhSZXN1bHRzQ291bnQ7CisJCQlTeXN0ZW0uYXJyYXljb3B5KG90aGVyUmVzdWx0cywgMCwgcmVzdWx0cywgaW5kZXgsIG90aGVyUmVzdWx0c0NvdW50KTsKKwkJCQorCQkJcmV0dXJuIHJlc3VsdHM7CisJCX0KKwl9CisKKwkKKwkvKioKKwkgKiBOb3QgaW5zdGFudGlhYmxlLgorCSAqLworCXByaXZhdGUgTmFtaW5nQ29udmVudGlvbnMoKSB7fQorCisJcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJlbW92ZVByZWZpeEFuZFN1ZmZpeChjaGFyW10gbmFtZSwgY2hhcltdW10gcHJlZml4ZXMsIGNoYXJbXVtdIHN1ZmZpeGVzKSB7CisJCS8vIHJlbW92ZSBsb25nZXIgcHJlZml4CisJCWNoYXJbXSB3aXRob3V0UHJlZml4TmFtZSA9IG5hbWU7CisJCWlmIChwcmVmaXhlcyAhPSBudWxsKSB7CisJCQlpbnQgYmVzdExlbmd0aCA9IDA7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQljaGFyW10gcHJlZml4ID0gcHJlZml4ZXNbaV07CisJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHByZWZpeCwgbmFtZSkpIHsKKwkJCQkJaW50IGN1cnJMZW4gPSBwcmVmaXgubGVuZ3RoOworCQkJCQlib29sZWFuIGxhc3RDaGFySXNMZXR0ZXIgPSBDaGFyYWN0ZXIuaXNMZXR0ZXIocHJlZml4W2N1cnJMZW4gLSAxXSk7CisJCQkJCWlmKCFsYXN0Q2hhcklzTGV0dGVyIHx8IChsYXN0Q2hhcklzTGV0dGVyICYmIG5hbWUubGVuZ3RoID4gY3VyckxlbiAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZVtjdXJyTGVuXSkpKSB7CisJCQkJCQlpZiAoYmVzdExlbmd0aCA8IGN1cnJMZW4gJiYgbmFtZS5sZW5ndGggIT0gY3VyckxlbikgeworCQkJCQkJCXdpdGhvdXRQcmVmaXhOYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCBjdXJyTGVuLCBuYW1lLmxlbmd0aCk7CisJCQkJCQkJYmVzdExlbmd0aCA9IGN1cnJMZW47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIHJlbW92ZSBsb25nZXIgc3VmZml4CisJCWNoYXJbXSB3aXRob3V0U3VmZml4TmFtZSA9IHdpdGhvdXRQcmVmaXhOYW1lOworCQlpZihzdWZmaXhlcyAhPSBudWxsKSB7CisJCQlpbnQgYmVzdExlbmd0aCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJY2hhcltdIHN1ZmZpeCA9IHN1ZmZpeGVzW2ldOworCQkJCWlmKENoYXJPcGVyYXRpb24uZW5kc1dpdGgod2l0aG91dFByZWZpeE5hbWUsIHN1ZmZpeCkpIHsKKwkJCQkJaW50IGN1cnJMZW4gPSBzdWZmaXgubGVuZ3RoOworCQkJCQlpZihiZXN0TGVuZ3RoIDwgY3VyckxlbiAmJiB3aXRob3V0UHJlZml4TmFtZS5sZW5ndGggIT0gY3VyckxlbikgeworCQkJCQkJd2l0aG91dFN1ZmZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdpdGhvdXRQcmVmaXhOYW1lLCAwLCB3aXRob3V0UHJlZml4TmFtZS5sZW5ndGggLSBjdXJyTGVuKTsKKwkJCQkJCWJlc3RMZW5ndGggPSBjdXJyTGVuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQl3aXRob3V0U3VmZml4TmFtZVswXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh3aXRob3V0U3VmZml4TmFtZVswXSk7CisJCXJldHVybiB3aXRob3V0U3VmZml4TmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgcHJlZml4IGFuZCBzdWZmaXggZnJvbSBhbiBhcmd1bWVudCBuYW1lLjxicj4KKwkgKiBJZiBhcmd1bWVudCBuYW1lIHByZWZpeCBpcyA8Y29kZT5wcmU8L2NvZGU+IGFuZCBhcmd1bWVudCBuYW1lIHN1ZmZpeCBpcyA8Y29kZT5zdWY8L2NvZGU+CisJICogdGhlbiBmb3IgYW4gYXJndW1lbnQgbmFtZWQgPGNvZGU+cHJlQXJnc3VmPC9jb2RlPiB0aGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIDxjb2RlPmFyZzwvY29kZT4uCisJICogSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCBkZWZpbmVkIGluIEphdmFDb3JlIG9wdGlvbnMgdGhlIHJlc3VsdCBpcyB0aGUgdW5jaGFuZ2VkCisJICogbmFtZSA8Y29kZT5wcmVBcmdzdWY8L2NvZGU+Ljxicj4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTIGFuZAorCSAqIENPREVBU1NJU1RfQVJHVU1FTlRfU1VGRklYRVMuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorIAkgKiAKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCisJICogQHBhcmFtIGFyZ3VtZW50TmFtZSBhcmd1bWVudCdzIG5hbWUuCisJICogQHJldHVybiBjaGFyW10gdGhlIG5hbWUgd2l0aG91dCBwcmVmaXggYW5kIHN1ZmZpeC4KKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yQXJndW1lbnROYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGFyZ3VtZW50TmFtZSkgeworCQlBc3Npc3RPcHRpb25zIGFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKKwkJcmV0dXJuCXJlbW92ZVByZWZpeEFuZFN1ZmZpeCgKKwkJCWFyZ3VtZW50TmFtZSwKKwkJCWFzc2lzdE9wdGlvbnMuYXJndW1lbnRQcmVmaXhlcywKKwkJCWFzc2lzdE9wdGlvbnMuYXJndW1lbnRTdWZmaXhlcyk7CisJfQorCQorCS8qKgorCSAqIFJlbW92ZSBwcmVmaXggYW5kIHN1ZmZpeCBmcm9tIGFuIGFyZ3VtZW50IG5hbWUuPGJyPgorCSAqIElmIGFyZ3VtZW50IG5hbWUgcHJlZml4IGlzIDxjb2RlPnByZTwvY29kZT4gYW5kIGFyZ3VtZW50IG5hbWUgc3VmZml4IGlzIDxjb2RlPnN1ZjwvY29kZT4KKwkgKiB0aGVuIGZvciBhbiBhcmd1bWVudCBuYW1lZCA8Y29kZT5wcmVBcmdzdWY8L2NvZGU+IHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgPGNvZGU+YXJnPC9jb2RlPi4KKwkgKiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IGRlZmluZWQgaW4gSmF2YUNvcmUgb3B0aW9ucyB0aGUgcmVzdWx0IGlzIHRoZSB1bmNoYW5nZWQKKwkgKiBuYW1lIDxjb2RlPnByZUFyZ3N1ZjwvY29kZT4uPGJyPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IENPREVBU1NJU1RfQVJHVU1FTlRfUFJFRklYRVMgYW5kCisJICogQ09ERUFTU0lTVF9BUkdVTUVOVF9TVUZGSVhFUy48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisgCSAqIAorCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBhcmd1bWVudC4KKwkgKiBAcGFyYW0gYXJndW1lbnROYW1lIGFyZ3VtZW50J3MgbmFtZS4KKwkgKiBAcmV0dXJuIGNoYXJbXSB0aGUgbmFtZSB3aXRob3V0IHByZWZpeCBhbmQgc3VmZml4LgorCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucworCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JBcmd1bWVudE5hbWUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgYXJndW1lbnROYW1lKSB7CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihyZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JBcmd1bWVudE5hbWUoamF2YVByb2plY3QsIGFyZ3VtZW50TmFtZS50b0NoYXJBcnJheSgpKSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHByZWZpeCBhbmQgc3VmZml4IGZyb20gYSBmaWVsZCBuYW1lLjxicj4KKwkgKiBJZiBmaWVsZCBuYW1lIHByZWZpeCBpcyA8Y29kZT5wcmU8L2NvZGU+IGFuZCBmaWVsZCBuYW1lIHN1ZmZpeCBpcyA8Y29kZT5zdWY8L2NvZGU+CisJICogdGhlbiBmb3IgYSBmaWVsZCBuYW1lZCA8Y29kZT5wcmVGaWVsZHN1ZjwvY29kZT4gdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyA8Y29kZT5maWVsZDwvY29kZT4uCisJICogSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCBkZWZpbmVkIGluIEphdmFDb3JlIG9wdGlvbnMgdGhlIHJlc3VsdCBpcyB0aGUgdW5jaGFuZ2VkCisJICogbmFtZSA8Y29kZT5wcmVGaWVsZHN1ZjwvY29kZT4uPGJyPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IENPREVBU1NJU1RfRklFTERfUFJFRklYRVMsIAorCSAqIENPREVBU1NJU1RfRklFTERfU1VGRklYRVMgZm9yIGluc3RhbmNlIGZpZWxkIGFuZCBDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9QUkVGSVhFUywKKwkgKiBDT0RFQVNTSVNUX1NUQVRJQ19GSUVMRF9TVUZGSVhFUyBmb3Igc3RhdGljIGZpZWxkLjxicj4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgZmllbGQuCisJICogQHBhcmFtIGZpZWxkTmFtZSBmaWVsZCdzIG5hbWUuCisJICogQHBhcmFtIG1vZGlmaWVycyBmaWVsZCdzIG1vZGlmaWVycyBhcyBkZWZpbmVkIGJ5IHRoZSBjbGFzcworCSAqIDxjb2RlPkZsYWdzPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGNoYXJbXSB0aGUgbmFtZSB3aXRob3V0IHByZWZpeCBhbmQgc3VmZml4LgorCSAqIEBzZWUgRmxhZ3MKKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgY2hhcltdIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycykgeworCQlib29sZWFuIGlzU3RhdGljID0gRmxhZ3MuaXNTdGF0aWMobW9kaWZpZXJzKTsKKwkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMoamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7CisJCXJldHVybglyZW1vdmVQcmVmaXhBbmRTdWZmaXgoCisJCQlmaWVsZE5hbWUsCisJCQlpc1N0YXRpYyA/IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRQcmVmaXhlcyA6IGFzc2lzdE9wdGlvbnMuZmllbGRQcmVmaXhlcywKKwkJCWlzU3RhdGljID8gYXNzaXN0T3B0aW9ucy5zdGF0aWNGaWVsZFN1ZmZpeGVzIDogYXNzaXN0T3B0aW9ucy5maWVsZFN1ZmZpeGVzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgcHJlZml4IGFuZCBzdWZmaXggZnJvbSBhIGZpZWxkIG5hbWUuPGJyPgorCSAqIElmIGZpZWxkIG5hbWUgcHJlZml4IGlzIDxjb2RlPnByZTwvY29kZT4gYW5kIGZpZWxkIG5hbWUgc3VmZml4IGlzIDxjb2RlPnN1ZjwvY29kZT4KKwkgKiB0aGVuIGZvciBhIGZpZWxkIG5hbWVkIDxjb2RlPnByZUZpZWxkc3VmPC9jb2RlPiB0aGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIDxjb2RlPmZpZWxkPC9jb2RlPi4KKwkgKiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IGRlZmluZWQgaW4gSmF2YUNvcmUgb3B0aW9ucyB0aGUgcmVzdWx0IGlzIHRoZSB1bmNoYW5nZWQKKwkgKiBuYW1lIDxjb2RlPnByZUZpZWxkc3VmPC9jb2RlPi48YnI+CisJICogCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywgCisJICogQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyBmb3IgaW5zdGFuY2UgZmllbGQgYW5kIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTLAorCSAqIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTIGZvciBzdGF0aWMgZmllbGQuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZC4KKwkgKiBAcGFyYW0gZmllbGROYW1lIGZpZWxkJ3MgbmFtZS4KKwkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCisJICogPGNvZGU+RmxhZ3M8L2NvZGU+LgorCSAqIEByZXR1cm4gY2hhcltdIHRoZSBuYW1lIHdpdGhvdXQgcHJlZml4IGFuZCBzdWZmaXguCisJICogQHNlZSBGbGFncworCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucworCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JGaWVsZE5hbWUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzKSB7CisJCXJldHVybiBTdHJpbmcudmFsdWVPZihyZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JGaWVsZE5hbWUoamF2YVByb2plY3QsIGZpZWxkTmFtZS50b0NoYXJBcnJheSgpLCBtb2RpZmllcnMpKTsKKwl9CisJLyoqCisJICogUmVtb3ZlIHByZWZpeCBhbmQgc3VmZml4IGZyb20gYSBsb2NhbCB2YXJpYWJsZSBuYW1lLjxicj4KKwkgKiBJZiBsb2NhbCB2YXJpYWJsZSBuYW1lIHByZWZpeCBpcyA8Y29kZT5wcmU8L2NvZGU+IGFuZCBsb2NhbCB2YXJpYWJsZSBuYW1lIHN1ZmZpeCBpcyA8Y29kZT5zdWY8L2NvZGU+CisJICogdGhlbiBmb3IgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCA8Y29kZT5wcmVMb2NhbHN1ZjwvY29kZT4gdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyA8Y29kZT5sb2NhbDwvY29kZT4uCisJICogSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCBkZWZpbmVkIGluIEphdmFDb3JlIG9wdGlvbnMgdGhlIHJlc3VsdCBpcyB0aGUgdW5jaGFuZ2VkCisJICogbmFtZSA8Y29kZT5wcmVMb2NhbHN1ZjwvY29kZT4uPGJyPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IENPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMgYW5kIAorCSAqIENPREVBU1NJU1RfTE9DQUxfU1VGRklYRVMuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB2YXJpYWJsZS4KKwkgKiBAcGFyYW0gbG9jYWxOYW1lIHZhcmlhYmxlJ3MgbmFtZS4KKwkgKiBAcmV0dXJuIGNoYXJbXSB0aGUgbmFtZSB3aXRob3V0IHByZWZpeCBhbmQgc3VmZml4LgorCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucworCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JMb2NhbFZhcmlhYmxlTmFtZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBsb2NhbE5hbWUpIHsKKwkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMoamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7CisJCXJldHVybglyZW1vdmVQcmVmaXhBbmRTdWZmaXgoCisJCQlsb2NhbE5hbWUsCisJCQlhc3Npc3RPcHRpb25zLmFyZ3VtZW50UHJlZml4ZXMsCisJCQlhc3Npc3RPcHRpb25zLmFyZ3VtZW50U3VmZml4ZXMpOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmUgcHJlZml4IGFuZCBzdWZmaXggZnJvbSBhIGxvY2FsIHZhcmlhYmxlIG5hbWUuPGJyPgorCSAqIElmIGxvY2FsIHZhcmlhYmxlIG5hbWUgcHJlZml4IGlzIDxjb2RlPnByZTwvY29kZT4gYW5kIGxvY2FsIHZhcmlhYmxlIG5hbWUgc3VmZml4IGlzIDxjb2RlPnN1ZjwvY29kZT4KKwkgKiB0aGVuIGZvciBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkIDxjb2RlPnByZUxvY2Fsc3VmPC9jb2RlPiB0aGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIDxjb2RlPmxvY2FsPC9jb2RlPi4KKwkgKiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IGRlZmluZWQgaW4gSmF2YUNvcmUgb3B0aW9ucyB0aGUgcmVzdWx0IGlzIHRoZSB1bmNoYW5nZWQKKwkgKiBuYW1lIDxjb2RlPnByZUxvY2Fsc3VmPC9jb2RlPi48YnI+CisJICogCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUyBhbmQgCisJICogQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUy48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogCisJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlLgorCSAqIEBwYXJhbSBsb2NhbE5hbWUgdmFyaWFibGUncyBuYW1lLgorCSAqIEByZXR1cm4gY2hhcltdIHRoZSBuYW1lIHdpdGhvdXQgcHJlZml4IGFuZCBzdWZmaXguCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckxvY2FsVmFyaWFibGVOYW1lKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGxvY2FsTmFtZSkgeworCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YocmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yTG9jYWxWYXJpYWJsZU5hbWUoamF2YVByb2plY3QsIGxvY2FsTmFtZS50b0NoYXJBcnJheSgpKSk7CisJfQorCisJLyoqCisJICogU3VnZ2VzdCBuYW1lcyBmb3IgYW4gYXJndW1lbnQuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gYXJndW1lbnQncyB0eXBlCisJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC48YnI+CisJICogSWYgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiwgdGhlIHByZWZpeCBmb3IgYXJndW1lbnQgaXMgPGNvZGU+cHJlPC9jb2RlPgorCSAqIGFuZCB0aGUgc3VmZml4IGZvciBhcmd1bWVudCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Bvc2VkIG5hbWVzIGFyZSA8Y29kZT5wcmVUeXBlTmFtZXN1ZjwvY29kZT4KKwkgKiBhbmQgPGNvZGU+cHJlTmFtZXN1ZjwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHByZWZpeCBvciBzdWZmaXggdGhlIHByb3Bvc2FscyBhcmUgPGNvZGU+dHlwZU5hbWU8L2NvZGU+CisJICogYW5kIDxjb2RlPm5hbWU8L2NvZGU+Ljxicj4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTIGFuZCAKKwkgKiBDT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTLjxicj4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2Ugb2YgdGhlIGFyZ3VtZW50J3MgdHlwZS4KKwkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUgYXJndW1lbnQncyB0eXBlLgorCSAqIEBwYXJhbSBkaW0gYXJndW1lbnQncyBkaW1lbnNpb24gKDAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSkuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW11bXSBhbiBhcnJheSBvZiBuYW1lcy4KKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW11bXSBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7CisJCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7CisJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEFyZ3VtZW50TmFtZXMoCisJCQlqYXZhUHJvamVjdCwKKwkJCXBhY2thZ2VOYW1lLAorCQkJcXVhbGlmaWVkVHlwZU5hbWUsCisJCQlkaW0sCisJCQlleGNsdWRlZE5hbWVzLAorCQkJcmVxdWVzdG9yKTsKKworCQlyZXR1cm4gcmVxdWVzdG9yLmdldFJlc3VsdHMoKTsKKwl9CisJCisJLyoqCisJICogU3VnZ2VzdCBuYW1lcyBmb3IgYW4gYXJndW1lbnQuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gYXJndW1lbnQncyB0eXBlCisJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC48YnI+CisJICogSWYgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiwgdGhlIHByZWZpeCBmb3IgYXJndW1lbnQgaXMgPGNvZGU+cHJlPC9jb2RlPgorCSAqIGFuZCB0aGUgc3VmZml4IGZvciBhcmd1bWVudCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Bvc2VkIG5hbWVzIGFyZSA8Y29kZT5wcmVUeXBlTmFtZXN1ZjwvY29kZT4KKwkgKiBhbmQgPGNvZGU+cHJlTmFtZXN1ZjwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHByZWZpeCBvciBzdWZmaXggdGhlIHByb3Bvc2FscyBhcmUgPGNvZGU+dHlwZU5hbWU8L2NvZGU+CisJICogYW5kIDxjb2RlPm5hbWU8L2NvZGU+Ljxicj4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTIGFuZCAKKwkgKiBDT0RFQVNTSVNUX0FSR1VNRU5UX1NVRkZJWEVTLjxicj4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgYXJndW1lbnQuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2Ugb2YgdGhlIGFyZ3VtZW50J3MgdHlwZS4KKwkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUgYXJndW1lbnQncyB0eXBlLgorCSAqIEBwYXJhbSBkaW0gYXJndW1lbnQncyBkaW1lbnNpb24gKDAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSkuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW11bXSBhbiBhcnJheSBvZiBuYW1lcy4KKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBTdHJpbmdbXSBleGNsdWRlZE5hbWVzKSB7CisJCXJldHVybiBjb252ZXJ0Q2hhcnNUb1N0cmluZygKKwkJCXN1Z2dlc3RBcmd1bWVudE5hbWVzKAorCQkJCWphdmFQcm9qZWN0LAorCQkJCXBhY2thZ2VOYW1lLnRvQ2hhckFycmF5KCksCisJCQkJcXVhbGlmaWVkVHlwZU5hbWUudG9DaGFyQXJyYXkoKSwKKwkJCQlkaW0sCisJCQkJY29udmVydFN0cmluZ1RvQ2hhcnMoZXhjbHVkZWROYW1lcykpKTsKKwl9CisJLyoqCisJICogU3VnZ2VzdCBuYW1lcyBmb3IgYSBmaWVsZC4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBmaWVsZCdzIHR5cGUKKwkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIGFkZGVkLjxicj4KKwkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgaXMgPGNvZGU+VHlwZU5hbWU8L2NvZGU+LCB0aGUgcHJlZml4IGZvciBmaWVsZCBpcyA8Y29kZT5wcmU8L2NvZGU+CisJICogYW5kIHRoZSBzdWZmaXggZm9yIGZpZWxkIGlzIDxjb2RlPnN1ZjwvY29kZT4gdGhlbiB0aGUgcHJvcG9zZWQgbmFtZXMgYXJlIDxjb2RlPnByZVR5cGVOYW1lc3VmPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5wcmVOYW1lc3VmPC9jb2RlPi4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCB0aGUgcHJvcG9zYWxzIGFyZSA8Y29kZT50eXBlTmFtZTwvY29kZT4KKwkgKiBhbmQgPGNvZGU+bmFtZTwvY29kZT4uPGJyPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IENPREVBU1NJU1RfRklFTERfUFJFRklYRVMsIAorCSAqIENPREVBU1NJU1RfRklFTERfU1VGRklYRVMgYW5kIGZvciBpbnN0YW5jZSBmaWVsZCBhbmQgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsCisJICogQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVMgZm9yIHN0YXRpYyBmaWVsZC48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSBmaWVsZCdzIHR5cGUuCisJICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIGZpZWxkJ3MgdHlwZS4KKwkgKiBAcGFyYW0gZGltIGZpZWxkJ3MgZGltZW5zaW9uICgwIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkpLgorCSAqIEBwYXJhbSBtb2RpZmllcnMgZmllbGQncyBtb2RpZmllcnMgYXMgZGVmaW5lZCBieSB0aGUgY2xhc3MKKwkgKiA8Y29kZT5GbGFnczwvY29kZT4uCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW11bXSBhbiBhcnJheSBvZiBuYW1lcy4KKwkgKiBAc2VlIEZsYWdzCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdEZpZWxkTmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgaW50IG1vZGlmaWVycywgY2hhcltdW10gZXhjbHVkZWROYW1lcykgeworCQlOYW1pbmdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IE5hbWluZ1JlcXVlc3RvcigpOworCQlJbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAorCQkJamF2YVByb2plY3QsCisJCQlwYWNrYWdlTmFtZSwKKwkJCXF1YWxpZmllZFR5cGVOYW1lLAorCQkJZGltLAorCQkJbW9kaWZpZXJzLAorCQkJZXhjbHVkZWROYW1lcywKKwkJCXJlcXVlc3Rvcik7CisKKwkJcmV0dXJuIHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7CisJfQorCQorCS8qKgorCSAqIFN1Z2dlc3QgbmFtZXMgZm9yIGEgZmllbGQuIFRoZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gZmllbGQncyB0eXBlCisJICogYW5kIHBvc3NpYmxlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGFyZSBhZGRlZC48YnI+CisJICogSWYgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlzIDxjb2RlPlR5cGVOYW1lPC9jb2RlPiwgdGhlIHByZWZpeCBmb3IgZmllbGQgaXMgPGNvZGU+cHJlPC9jb2RlPgorCSAqIGFuZCB0aGUgc3VmZml4IGZvciBmaWVsZCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Bvc2VkIG5hbWVzIGFyZSA8Y29kZT5wcmVUeXBlTmFtZXN1ZjwvY29kZT4KKwkgKiBhbmQgPGNvZGU+cHJlTmFtZXN1ZjwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHByZWZpeCBvciBzdWZmaXggdGhlIHByb3Bvc2FscyBhcmUgPGNvZGU+dHlwZU5hbWU8L2NvZGU+CisJICogYW5kIDxjb2RlPm5hbWU8L2NvZGU+Ljxicj4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCAKKwkgKiBDT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTIGFuZCBmb3IgaW5zdGFuY2UgZmllbGQgYW5kIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTLAorCSAqIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTIGZvciBzdGF0aWMgZmllbGQuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIEBwYXJhbSBqYXZhUHJvamVjdCBwcm9qZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZC4KKwkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBvZiB0aGUgZmllbGQncyB0eXBlLgorCSAqIEBwYXJhbSBxdWFsaWZpZWRUeXBlTmFtZSBmaWVsZCdzIHR5cGUuCisJICogQHBhcmFtIGRpbSBmaWVsZCdzIGRpbWVuc2lvbiAoMCBpZiB0aGUgZmllbGQgaXMgbm90IGFuIGFycmF5KS4KKwkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCisJICogPGNvZGU+RmxhZ3M8L2NvZGU+LgorCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgorCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCisJICogQHNlZSBGbGFncworCSAqIEBzZWUgSmF2YUNvcmUjc2V0T3B0aW9ucworCSAqIEBzZWUgSmF2YUNvcmUjZ2V0RGVmYXVsdE9wdGlvbnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHN1Z2dlc3RGaWVsZE5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIGludCBtb2RpZmllcnMsIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsKKwkJcmV0dXJuIGNvbnZlcnRDaGFyc1RvU3RyaW5nKAorCQkJc3VnZ2VzdEZpZWxkTmFtZXMoCisJCQkJamF2YVByb2plY3QsCisJCQkJcGFja2FnZU5hbWUudG9DaGFyQXJyYXkoKSwKKwkJCQlxdWFsaWZpZWRUeXBlTmFtZS50b0NoYXJBcnJheSgpLAorCQkJCWRpbSwKKwkJCQltb2RpZmllcnMsCisJCQkJY29udmVydFN0cmluZ1RvQ2hhcnMoZXhjbHVkZWROYW1lcykpKTsKKwl9CisJCisJLyoqCisJICogU3VnZ2VzdCBuYW1lcyBmb3IgYSBsb2NhbCB2YXJpYWJsZS4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSB2YXJpYWJsZSdzIHR5cGUKKwkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIGFkZGVkLjxicj4KKwkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+VHlwZU5hbWU8L2NvZGU+LCB0aGUgcHJlZml4IGZvciBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5wcmU8L2NvZGU+CisJICogYW5kIHRoZSBzdWZmaXggZm9yIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPnN1ZjwvY29kZT4gdGhlbiB0aGUgcHJvcG9zZWQgbmFtZXMgYXJlIDxjb2RlPnByZVR5cGVOYW1lc3VmPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5wcmVOYW1lc3VmPC9jb2RlPi4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yIHN1ZmZpeCB0aGUgcHJvcG9zYWxzIGFyZSA8Y29kZT50eXBlTmFtZTwvY29kZT4KKwkgKiBhbmQgPGNvZGU+bmFtZTwvY29kZT4uPGJyPgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGlzIGFmZmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcgSmF2YUNvcmUgb3B0aW9ucyA6IENPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMgYW5kCisJICogQ09ERUFTU0lTVF9MT0NBTF9TVUZGSVhFUy48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogQHBhcmFtIGphdmFQcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIHZhcmlhYmxlLgorCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBwYWNrYWdlIG9mIHRoZSB2YXJpYWJsZSdzIHR5cGUuCisJICogQHBhcmFtIHF1YWxpZmllZFR5cGVOYW1lIHZhcmlhYmxlJ3MgdHlwZS4KKwkgKiBAcGFyYW0gZGltIHZhcmlhYmxlJ3MgZGltZW5zaW9uICgwIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgYW4gYXJyYXkpLgorCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgorCSAqIEByZXR1cm4gY2hhcltdW10gYW4gYXJyYXkgb2YgbmFtZXMuCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdW10gc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7CisJCU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgTmFtaW5nUmVxdWVzdG9yKCk7CisJCUludGVybmFsTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcygKKwkJCWphdmFQcm9qZWN0LAorCQkJcGFja2FnZU5hbWUsCisJCQlxdWFsaWZpZWRUeXBlTmFtZSwKKwkJCWRpbSwKKwkJCWV4Y2x1ZGVkTmFtZXMsCisJCQlyZXF1ZXN0b3IpOworCisJCXJldHVybiByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOworCX0KKwkKKwkvKioKKwkgKiBTdWdnZXN0IG5hbWVzIGZvciBhIGxvY2FsIHZhcmlhYmxlLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHZhcmlhYmxlJ3MgdHlwZQorCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgYWRkZWQuPGJyPgorCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBpcyA8Y29kZT5UeXBlTmFtZTwvY29kZT4sIHRoZSBwcmVmaXggZm9yIGxvY2FsIHZhcmlhYmxlIGlzIDxjb2RlPnByZTwvY29kZT4KKwkgKiBhbmQgdGhlIHN1ZmZpeCBmb3IgbG9jYWwgdmFyaWFibGUgaXMgPGNvZGU+c3VmPC9jb2RlPiB0aGVuIHRoZSBwcm9wb3NlZCBuYW1lcyBhcmUgPGNvZGU+cHJlVHlwZU5hbWVzdWY8L2NvZGU+CisJICogYW5kIDxjb2RlPnByZU5hbWVzdWY8L2NvZGU+LiBJZiB0aGVyZSBpcyBubyBwcmVmaXggb3Igc3VmZml4IHRoZSBwcm9wb3NhbHMgYXJlIDxjb2RlPnR5cGVOYW1lPC9jb2RlPgorCSAqIGFuZCA8Y29kZT5uYW1lPC9jb2RlPi48YnI+CisJICogCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUyBhbmQKKwkgKiBDT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTLjxicj4KKwkgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBjb25maWd1cmFibGUgb3B0aW9ucywgc2VlIDxjb2RlPmdldERlZmF1bHRPcHRpb25zPC9jb2RlPi4KKwkgKiBGb3IgcHJvZ3JhbW1hdGljYWx5IGNoYW5nZSB0aGVzZSBvcHRpb25zLCBzZWUgPGNvZGU+SmF2YUNvcmUjc2V0T3B0aW9ucygpPC9jb2RlPi4KKwkgKiBAcGFyYW0gamF2YVByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgdmFyaWFibGUuCisJICogQHBhcmFtIHBhY2thZ2VOYW1lIHBhY2thZ2Ugb2YgdGhlIHZhcmlhYmxlJ3MgdHlwZS4KKwkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUgdmFyaWFibGUncyB0eXBlLgorCSAqIEBwYXJhbSBkaW0gdmFyaWFibGUncyBkaW1lbnNpb24gKDAgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbiBhcnJheSkuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW11bXSBhbiBhcnJheSBvZiBuYW1lcy4KKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdWdnZXN0TG9jYWxWYXJpYWJsZU5hbWVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGludCBkaW0sIFN0cmluZ1tdIGV4Y2x1ZGVkTmFtZXMpIHsKKwkJcmV0dXJuIGNvbnZlcnRDaGFyc1RvU3RyaW5nKAorCQkJc3VnZ2VzdExvY2FsVmFyaWFibGVOYW1lcygKKwkJCQlqYXZhUHJvamVjdCwKKwkJCQlwYWNrYWdlTmFtZS50b0NoYXJBcnJheSgpLAorCQkJCXF1YWxpZmllZFR5cGVOYW1lLnRvQ2hhckFycmF5KCksCisJCQkJZGltLAorCQkJCWNvbnZlcnRTdHJpbmdUb0NoYXJzKGV4Y2x1ZGVkTmFtZXMpKSk7CisJfQorCQorCS8qKgorCSAqIFN1Z2dlc3QgbmFtZSBmb3IgYSBnZXR0ZXIgbWV0aG9kLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGZpZWxkJ3MgbmFtZQorCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgcmVtb3ZlZC48YnI+CisJICogSWYgdGhlIGZpZWxkIG5hbWUgaXMgPGNvZGU+cHJlRmllbGROYW1lc3VmPC9jb2RlPiBhbmQgdGhlIHByZWZpeCBmb3IgZmllbGQgaXMgPGNvZGU+cHJlPC9jb2RlPiBhbmQKKwkgKiB0aGUgc3VmZml4IGZvciBmaWVsZCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Nwb3NlZCBuYW1lIGlzIDxjb2RlPmlzRmllbGROYW1lPC9jb2RlPiBmb3IgYm9vbGVhbiBmaWVsZCBvcgorCSAqIDxjb2RlPmdldEZpZWxkTmFtZTwvY29kZT4gZm9yIG90aGVycy4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IGFuZCBzdWZmaXggdGhlIHByb3Bvc2FsIGlzIDxjb2RlPmlzUHJlRmllbGROYW1lc3VmPC9jb2RlPgorCSAqIGZvciBib29sZWFuIGZpZWxkIG9yIDxjb2RlPmdldFByZUZpZWxkTmFtZXN1ZjwvY29kZT4gZm9yIG90aGVycy48YnI+CisJICogCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywgCisJICogQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyBmb3IgaW5zdGFuY2UgZmllbGQgYW5kIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTLAorCSAqIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTIGZvciBzdGF0aWMgZmllbGQuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgorCSAqIEBwYXJhbSBmaWVsZE5hbWUgZmllbGQncyBuYW1lJ3MuCisJICogQHBhcmFtIG1vZGlmaWVycyBmaWVsZCdzIG1vZGlmaWVycyBhcyBkZWZpbmVkIGJ5IHRoZSBjbGFzcworCSAqIDxjb2RlPkZsYWdzPC9jb2RlPi4KKwkgKiBAcGFyYW0gaXNCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCdzIHR5cGUgaXMgYm9vbGVhbgorCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgorCSAqIEByZXR1cm4gY2hhcltdIGEgbmFtZS4KKwkgKiBAc2VlIEZsYWdzCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1Z2dlc3RHZXR0ZXJOYW1lKElKYXZhUHJvamVjdCBwcm9qZWN0LCBjaGFyW10gZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQm9vbGVhbiwgY2hhcltdW10gZXhjbHVkZWROYW1lcykgeworCQlpZiAoaXNCb29sZWFuKSB7CisJCQljaGFyW10gbmFtZSA9IHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShwcm9qZWN0LCBmaWVsZE5hbWUsIG1vZGlmaWVycyk7CisJCQlpbnQgcHJlZml4TGVuID0gIEdFVFRFUl9CT09MX05BTUUubGVuZ3RoOworCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKEdFVFRFUl9CT09MX05BTUUsIG5hbWUpIAorCQkJCSYmIG5hbWUubGVuZ3RoID4gcHJlZml4TGVuICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShuYW1lW3ByZWZpeExlbl0pKSB7CisJCQkJcmV0dXJuIHN1Z2dlc3ROZXdOYW1lKG5hbWUsIGV4Y2x1ZGVkTmFtZXMpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gc3VnZ2VzdE5ld05hbWUoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KEdFVFRFUl9CT09MX05BTUUsIHN1Z2dlc3RBY2Nlc3Nvck5hbWUocHJvamVjdCwgZmllbGROYW1lLCBtb2RpZmllcnMpKSwKKwkJCQkJZXhjbHVkZWROYW1lcworCQkJCSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gc3VnZ2VzdE5ld05hbWUoCisJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoR0VUVEVSX05BTUUsIHN1Z2dlc3RBY2Nlc3Nvck5hbWUocHJvamVjdCwgZmllbGROYW1lLCBtb2RpZmllcnMpKSwKKwkJCQlleGNsdWRlZE5hbWVzCisJCQkpOworCQl9CisJfQorCQorCS8qKgorCSAqIFN1Z2dlc3QgbmFtZSBmb3IgYSBnZXR0ZXIgbWV0aG9kLiBUaGUgbmFtZSBpcyBjb21wdXRlZCBmcm9tIGZpZWxkJ3MgbmFtZQorCSAqIGFuZCBwb3NzaWJsZSBwcmVmaXhlcyBvciBzdWZmaXhlcyBhcmUgcmVtb3ZlZC48YnI+CisJICogSWYgdGhlIGZpZWxkIG5hbWUgaXMgPGNvZGU+cHJlRmllbGROYW1lc3VmPC9jb2RlPiBhbmQgdGhlIHByZWZpeCBmb3IgZmllbGQgaXMgPGNvZGU+cHJlPC9jb2RlPiBhbmQKKwkgKiB0aGUgc3VmZml4IGZvciBmaWVsZCBpcyA8Y29kZT5zdWY8L2NvZGU+IHRoZW4gdGhlIHByb3Nwb3NlZCBuYW1lIGlzIDxjb2RlPmlzRmllbGROYW1lPC9jb2RlPiBmb3IgYm9vbGVhbiBmaWVsZCBvcgorCSAqIDxjb2RlPmdldEZpZWxkTmFtZTwvY29kZT4gZm9yIG90aGVycy4gSWYgdGhlcmUgaXMgbm8gcHJlZml4IGFuZCBzdWZmaXggdGhlIHByb3Bvc2FsIGlzIDxjb2RlPmlzUHJlRmllbGROYW1lc3VmPC9jb2RlPgorCSAqIGZvciBib29sZWFuIGZpZWxkIG9yIDxjb2RlPmdldFByZUZpZWxkTmFtZXN1ZjwvY29kZT4gZm9yIG90aGVycy48YnI+CisJICogCisJICogVGhpcyBtZXRob2QgaXMgYWZmZWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBKYXZhQ29yZSBvcHRpb25zIDogQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywgCisJICogQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyBmb3IgaW5zdGFuY2UgZmllbGQgYW5kIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1BSRUZJWEVTLAorCSAqIENPREVBU1NJU1RfU1RBVElDX0ZJRUxEX1NVRkZJWEVTIGZvciBzdGF0aWMgZmllbGQuPGJyPgorCSAqIEZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGNvbmZpZ3VyYWJsZSBvcHRpb25zLCBzZWUgPGNvZGU+Z2V0RGVmYXVsdE9wdGlvbnM8L2NvZGU+LgorCSAqIEZvciBwcm9ncmFtbWF0aWNhbHkgY2hhbmdlIHRoZXNlIG9wdGlvbnMsIHNlZSA8Y29kZT5KYXZhQ29yZSNzZXRPcHRpb25zKCk8L2NvZGU+LgorCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3Qgd2hpY2ggY29udGFpbnMgdGhlIGZpZWxkLgorCSAqIEBwYXJhbSBmaWVsZE5hbWUgZmllbGQncyBuYW1lJ3MuCisJICogQHBhcmFtIG1vZGlmaWVycyBmaWVsZCdzIG1vZGlmaWVycyBhcyBkZWZpbmVkIGJ5IHRoZSBjbGFzcworCSAqIDxjb2RlPkZsYWdzPC9jb2RlPi4KKwkgKiBAcGFyYW0gaXNCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCdzIHR5cGUgaXMgYm9vbGVhbgorCSAqIEBwYXJhbSBleGNsdWRlZE5hbWVzIGEgbGlzdCBvZiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc3VnZ2VzdGVkIChhbHJlYWR5IHVzZWQgbmFtZXMpLgorCSAqICAgICAgICAgQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGVkIG5hbWVzLgorCSAqIEByZXR1cm4gY2hhcltdIGEgbmFtZS4KKwkgKiBAc2VlIEZsYWdzCisJICogQHNlZSBKYXZhQ29yZSNzZXRPcHRpb25zCisJICogQHNlZSBKYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1Z2dlc3RHZXR0ZXJOYW1lKElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmllbGROYW1lLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIGlzQm9vbGVhbiwgU3RyaW5nW10gZXhjbHVkZWROYW1lcykgeworCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoCisJCQlzdWdnZXN0R2V0dGVyTmFtZSgKKwkJCQlwcm9qZWN0LAorCQkJCWZpZWxkTmFtZS50b0NoYXJBcnJheSgpLAorCQkJCW1vZGlmaWVycywKKwkJCQlpc0Jvb2xlYW4sCisJCQkJY29udmVydFN0cmluZ1RvQ2hhcnMoZXhjbHVkZWROYW1lcykpKTsKKwl9CisKKwkvKioKKwkgKiBTdWdnZXN0IG5hbWUgZm9yIGEgc2V0dGVyIG1ldGhvZC4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBmaWVsZCdzIG5hbWUKKwkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIHJlbW92ZWQuPGJyPgorCSAqIElmIHRoZSBmaWVsZCBuYW1lIGlzIDxjb2RlPnByZUZpZWxkTmFtZXN1ZjwvY29kZT4gYW5kIHRoZSBwcmVmaXggZm9yIGZpZWxkIGlzIDxjb2RlPnByZTwvY29kZT4gYW5kCisJICogdGhlIHN1ZmZpeCBmb3IgZmllbGQgaXMgPGNvZGU+c3VmPC9jb2RlPiB0aGVuIHRoZSBwcm9zcG9zZWQgbmFtZSBpcyA8Y29kZT5zZXRGaWVsZE5hbWU8L2NvZGU+LgorCSAqIElmIHRoZXJlIGlzIG5vIHByZWZpeCBhbmQgc3VmZml4IHRoZSBwcm9wb3NhbCBpcyA8Y29kZT5zZXRQcmVGaWVsZE5hbWVzdWY8L2NvZGU+Ljxicj4KKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCAKKwkgKiBDT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTIGZvciBpbnN0YW5jZSBmaWVsZCBhbmQgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsCisJICogQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVMgZm9yIHN0YXRpYyBmaWVsZC48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgZmllbGQuCisJICogQHBhcmFtIGZpZWxkTmFtZSBmaWVsZCdzIG5hbWUncy4KKwkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCisJICogPGNvZGU+RmxhZ3M8L2NvZGU+LgorCSAqIEBwYXJhbSBpc0Jvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpZWxkJ3MgdHlwZSBpcyBib29sZWFuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW10gYSBuYW1lLgorCSAqIEBzZWUgRmxhZ3MKKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW10gc3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0IHByb2plY3QsIGNoYXJbXSBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNCb29sZWFuLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzKSB7CisKKwkJaWYgKGlzQm9vbGVhbikgeworCQkJY2hhcltdIG5hbWUgPSByZW1vdmVQcmVmaXhBbmRTdWZmaXhGb3JGaWVsZE5hbWUocHJvamVjdCwgZmllbGROYW1lLCBtb2RpZmllcnMpOworCQkJaW50IHByZWZpeExlbiA9ICBHRVRURVJfQk9PTF9OQU1FLmxlbmd0aDsKKwkJCWlmIChDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhHRVRURVJfQk9PTF9OQU1FLCBuYW1lKSAKKwkJCQkmJiBuYW1lLmxlbmd0aCA+IHByZWZpeExlbiAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZVtwcmVmaXhMZW5dKSkgeworCQkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KG5hbWUsIHByZWZpeExlbiwgbmFtZS5sZW5ndGgpOworCQkJCXJldHVybiBzdWdnZXN0TmV3TmFtZSgKKwkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXQoU0VUVEVSX05BTUUsIHN1Z2dlc3RBY2Nlc3Nvck5hbWUocHJvamVjdCwgbmFtZSwgbW9kaWZpZXJzKSksCisJCQkJCWV4Y2x1ZGVkTmFtZXMKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gc3VnZ2VzdE5ld05hbWUoCisJCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KFNFVFRFUl9OQU1FLCBzdWdnZXN0QWNjZXNzb3JOYW1lKHByb2plY3QsIGZpZWxkTmFtZSwgbW9kaWZpZXJzKSksCisJCQkJCWV4Y2x1ZGVkTmFtZXMKKwkJCQkpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHN1Z2dlc3ROZXdOYW1lKAorCQkJCUNoYXJPcGVyYXRpb24uY29uY2F0KFNFVFRFUl9OQU1FLCBzdWdnZXN0QWNjZXNzb3JOYW1lKHByb2plY3QsIGZpZWxkTmFtZSwgbW9kaWZpZXJzKSksCisJCQkJZXhjbHVkZWROYW1lcworCQkJKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBTdWdnZXN0IG5hbWUgZm9yIGEgc2V0dGVyIG1ldGhvZC4gVGhlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSBmaWVsZCdzIG5hbWUKKwkgKiBhbmQgcG9zc2libGUgcHJlZml4ZXMgb3Igc3VmZml4ZXMgYXJlIHJlbW92ZWQuPGJyPgorCSAqIElmIHRoZSBmaWVsZCBuYW1lIGlzIDxjb2RlPnByZUZpZWxkTmFtZXN1ZjwvY29kZT4gYW5kIHRoZSBwcmVmaXggZm9yIGZpZWxkIGlzIDxjb2RlPnByZTwvY29kZT4gYW5kCisJICogdGhlIHN1ZmZpeCBmb3IgZmllbGQgaXMgPGNvZGU+c3VmPC9jb2RlPiB0aGVuIHRoZSBwcm9zcG9zZWQgbmFtZSBpcyA8Y29kZT5zZXRGaWVsZE5hbWU8L2NvZGU+LgorCSAqIElmIHRoZXJlIGlzIG5vIHByZWZpeCBhbmQgc3VmZml4IHRoZSBwcm9wb3NhbCBpcyA8Y29kZT5zZXRQcmVGaWVsZE5hbWVzdWY8L2NvZGU+Ljxicj4KKwkgKiBUaGlzIG1ldGhvZCBpcyBhZmZlY3RlZCBieSB0aGUgZm9sbG93aW5nIEphdmFDb3JlIG9wdGlvbnMgOiBDT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCAKKwkgKiBDT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTIGZvciBpbnN0YW5jZSBmaWVsZCBhbmQgQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsCisJICogQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfU1VGRklYRVMgZm9yIHN0YXRpYyBmaWVsZC48YnI+CisJICogRm9yIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlc2UgY29uZmlndXJhYmxlIG9wdGlvbnMsIHNlZSA8Y29kZT5nZXREZWZhdWx0T3B0aW9uczwvY29kZT4uCisJICogRm9yIHByb2dyYW1tYXRpY2FseSBjaGFuZ2UgdGhlc2Ugb3B0aW9ucywgc2VlIDxjb2RlPkphdmFDb3JlI3NldE9wdGlvbnMoKTwvY29kZT4uCisJICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgZmllbGQuCisJICogQHBhcmFtIGZpZWxkTmFtZSBmaWVsZCdzIG5hbWUncy4KKwkgKiBAcGFyYW0gbW9kaWZpZXJzIGZpZWxkJ3MgbW9kaWZpZXJzIGFzIGRlZmluZWQgYnkgdGhlIGNsYXNzCisJICogPGNvZGU+RmxhZ3M8L2NvZGU+LgorCSAqIEBwYXJhbSBpc0Jvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpZWxkJ3MgdHlwZSBpcyBib29sZWFuCisJICogQHBhcmFtIGV4Y2x1ZGVkTmFtZXMgYSBsaXN0IG9mIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzdWdnZXN0ZWQgKGFscmVhZHkgdXNlZCBuYW1lcykuCisJICogICAgICAgICBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXhjbHVkZWQgbmFtZXMuCisJICogQHJldHVybiBjaGFyW10gYSBuYW1lLgorCSAqIEBzZWUgRmxhZ3MKKwkgKiBAc2VlIEphdmFDb3JlI3NldE9wdGlvbnMKKwkgKiBAc2VlIEphdmFDb3JlI2dldERlZmF1bHRPcHRpb25zCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgc3VnZ2VzdFNldHRlck5hbWUoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWVsZE5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNCb29sZWFuLCBTdHJpbmdbXSBleGNsdWRlZE5hbWVzKSB7CisJCXJldHVybiBTdHJpbmcudmFsdWVPZigKKwkJCXN1Z2dlc3RTZXR0ZXJOYW1lKAorCQkJCXByb2plY3QsCisJCQkJZmllbGROYW1lLnRvQ2hhckFycmF5KCksCisJCQkJbW9kaWZpZXJzLAorCQkJCWlzQm9vbGVhbiwKKwkJCQljb252ZXJ0U3RyaW5nVG9DaGFycyhleGNsdWRlZE5hbWVzKSkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gc3VnZ2VzdEFjY2Vzc29yTmFtZShJSmF2YVByb2plY3QgcHJvamVjdCwgY2hhcltdIGZpZWxkTmFtZSwgaW50IG1vZGlmaWVycykgeworCQljaGFyW10gbmFtZSA9IHJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZShwcm9qZWN0LCBmaWVsZE5hbWUsIG1vZGlmaWVycyk7CisJCWlmIChuYW1lLmxlbmd0aCA+IDAgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKG5hbWVbMF0pKSB7CisJCQluYW1lWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG5hbWVbMF0pOworCQl9CisJCXJldHVybiBuYW1lOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gc3VnZ2VzdE5ld05hbWUoY2hhcltdIG5hbWUsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpeworCQlpZihleGNsdWRlZE5hbWVzID09IG51bGwpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCQorCQljaGFyW10gbmV3TmFtZSA9IG5hbWU7CisJCWludCBjb3VudCA9IDI7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKGkgPCBleGNsdWRlZE5hbWVzLmxlbmd0aCkgeworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmV3TmFtZSwgZXhjbHVkZWROYW1lc1tpXSwgZmFsc2UpKSB7CisJCQkJbmV3TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0KG5hbWUsIFN0cmluZy52YWx1ZU9mKGNvdW50KyspLnRvQ2hhckFycmF5KCkpOworCQkJCWkgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5ld05hbWU7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRDaGFyc1RvU3RyaW5nKGNoYXJbXVtdIGMpIHsKKwkJaW50IGxlbmd0aCA9IGMgPT0gbnVsbCA/IDAgOiBjLmxlbmd0aDsKKwkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJc1tpXSA9IFN0cmluZy52YWx1ZU9mKGNbaV0pOworCQl9CisJCXJldHVybiBzOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW11bXSBjb252ZXJ0U3RyaW5nVG9DaGFycyhTdHJpbmdbXSBzKSB7CisJCWludCBsZW5ndGggPSBzID09IG51bGwgPyAwIDogcy5sZW5ndGg7CisJCWNoYXJbXVtdIGMgPSBuZXcgY2hhcltsZW5ndGhdW107CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmKHNbaV0gPT0gbnVsbCkgeworCQkJCWNbaV0gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCQl9IGVsc2UgeworCQkJCWNbaV0gPSBzW2ldLnRvQ2hhckFycmF5KCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGM7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvU2lnbmF0dXJlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQppbmRleCA2MDFjNjJjLi44Mzg0NzUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9TaWduYXR1cmUuamF2YQpAQCAtMSwyMCArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247Ci0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogLyoqCiAgKiBQcm92aWRlcyBtZXRob2RzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdHlwZSBhbmQgbWV0aG9kIHNpZ25hdHVyZSBzdHJpbmdzLgogICogPHA+CkBAIC0yMjgsOCArMjI0LDYgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdfVk9JRAkJCT0gIlYiOyAvLyROT04tTkxTLTEkCiAJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE5PX0NIQVIgPSBuZXcgY2hhclswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW11bXSBOT19DSEFSX0NIQVIgPSBuZXcgY2hhclswXVtdOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCT09MRUFOID0geydiJywgJ28nLCAnbycsICdsJywgJ2UnLCAnYScsICduJ307CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJZVEUgPSB7J2InLCAneScsICd0JywgJ2UnfTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQ0hBUiA9IHsnYycsICdoJywgJ2EnLCAncid9OwpAQCAtMjQwLDYgKzIzNCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNIT1JUID0geydzJywgJ2gnLCAnbycsICdyJywgJ3QnfTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVk9JRCA9IHsndicsICdvJywgJ2knLCAnZCd9OwogCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9IG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5OT19DSEFSKTsKIAkKIC8qKgogICogTm90IGluc3RhbnRpYWJsZS4KQEAgLTQzNiw5MCArNDMxLDEzMiBAQAogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgc3RhdGljIGNoYXJbXSBjcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKGNoYXJbXSB0eXBlTmFtZSwgYm9vbGVhbiBpc1Jlc29sdmVkKSB7Ci0JdHJ5IHsKLQkJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTsKLQkJc2Nhbm5lci5zZXRTb3VyY2UodHlwZU5hbWUpOwotCQlpbnQgdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQlib29sZWFuIHByaW1pdGl2ZSA9IHRydWU7Ci0JCWNoYXIgcHJpbWl0aXZlU2lnID0gJyAnOwotCQlTdHJpbmdCdWZmZXIgc2lnID0gbnVsbDsKLQkJaW50IGFycmF5Q291bnQgPSAwOwotCQlzd2l0Y2ggKHRva2VuKSB7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllciA6Ci0JCQkJY2hhcltdIGlkU291cmNlID0gc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpOwotCQkJCXNpZyA9IG5ldyBTdHJpbmdCdWZmZXIoaWRTb3VyY2UubGVuZ3RoKTsKLQkJCQlzaWcuYXBwZW5kKGlkU291cmNlKTsKLQkJCQlwcmltaXRpdmUgPSBmYWxzZTsKKworCWlmICh0eXBlTmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKKwlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoOworCWlmIChsZW5ndGggPT0gMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuZXcgU3RyaW5nKHR5cGVOYW1lKSk7CisKKwlpbnQgYXJyYXlDb3VudCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCdbJywgdHlwZU5hbWUpOworCWNoYXJbXSBzaWc7CisJCisJc3dpdGNoICh0eXBlTmFtZVswXSkgeworCQkvLyBwcmltaXRpdmUgdHlwZT8KKwkJY2FzZSAnYicgOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHMoQk9PTEVBTiwgdHlwZU5hbWUsIDAsIHRydWUpKSB7CisJCQkJc2lnID0gbmV3IGNoYXJbYXJyYXlDb3VudCsxXTsKKwkJCQlzaWdbYXJyYXlDb3VudF0gPSBDX0JPT0xFQU47CiAJCQkJYnJlYWs7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYm9vbGVhbiA6Ci0JCQkJcHJpbWl0aXZlU2lnID0gU2lnbmF0dXJlLkNfQk9PTEVBTjsKKwkJCX0gZWxzZSBpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhCWVRFLCB0eXBlTmFtZSwgMCwgdHJ1ZSkpIHsKKwkJCQlzaWcgPSBuZXcgY2hhclthcnJheUNvdW50KzFdOworCQkJCXNpZ1thcnJheUNvdW50XSA9IENfQllURTsKIAkJCQlicmVhazsKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVieXRlIDoKLQkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19CWVRFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWNoYXIgOgotCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX0NIQVI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZG91YmxlIDoKLQkJCQlwcmltaXRpdmVTaWcgPSBTaWduYXR1cmUuQ19ET1VCTEU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZmxvYXQgOgotCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX0ZMT0FUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWludCA6Ci0JCQkJcHJpbWl0aXZlU2lnID0gU2lnbmF0dXJlLkNfSU5UOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWxvbmcgOgotCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX0xPTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc2hvcnQgOgotCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX1NIT1JUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXZvaWQgOgotCQkJCXByaW1pdGl2ZVNpZyA9IFNpZ25hdHVyZS5DX1ZPSUQ7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQl3aGlsZSAoIXByaW1pdGl2ZSAmJiB0b2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVCkgewotCQkJc2lnLmFwcGVuZChzY2FubmVyLmdldEN1cnJlbnRJZGVudGlmaWVyU291cmNlKCkpOwotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJaWYgKHRva2VuID09IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcikgewotCQkJCXNpZy5hcHBlbmQoc2Nhbm5lci5nZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpKTsKLQkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW4gPT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0tFVCkgewotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJaWYgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNLRVQpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJYXJyYXlDb3VudCsrOwotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQl9Ci0JCWlmICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJY2hhcltdIHJlc3VsdDsKLQkJaWYgKHByaW1pdGl2ZSkgewotCQkJcmVzdWx0ID0gbmV3IGNoYXJbYXJyYXlDb3VudCsxXTsKLQkJCXJlc3VsdFthcnJheUNvdW50XSA9IHByaW1pdGl2ZVNpZzsKLQkJfSBlbHNlIHsKLQkJCWludCBzaWdMZW5ndGggPSBzaWcubGVuZ3RoKCk7IAotCQkJaW50IHJlc3VsdExlbmd0aCA9IGFycmF5Q291bnQgKyAxICsgc2lnTGVuZ3RoICsgMTsgLy8gZS5nLiAnW1tbTGphdmEubGFuZy5TdHJpbmc7JwotCQkJcmVzdWx0ID0gbmV3IGNoYXJbcmVzdWx0TGVuZ3RoXTsKLQkJCXNpZy5nZXRDaGFycygwLCBzaWdMZW5ndGgsIHJlc3VsdCwgYXJyYXlDb3VudCArIDEpOwotCQkJcmVzdWx0W2FycmF5Q291bnRdID0gaXNSZXNvbHZlZCA/IENfUkVTT0xWRUQgOiBDX1VOUkVTT0xWRUQ7Ci0JCQlyZXN1bHRbcmVzdWx0TGVuZ3RoLTFdID0gQ19OQU1FX0VORDsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykgewotCQkJcmVzdWx0W2ldID0gQ19BUlJBWTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJY2FzZSAnYyc6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhDSEFSLCB0eXBlTmFtZSwgMCwgdHJ1ZSkpIHsKKwkJCQlzaWcgPSBuZXcgY2hhclthcnJheUNvdW50KzFdOworCQkJCXNpZ1thcnJheUNvdW50XSA9IENfQ0hBUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSAnZCc6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhET1VCTEUsIHR5cGVOYW1lLCAwLCB0cnVlKSkgeworCQkJCXNpZyA9IG5ldyBjaGFyW2FycmF5Q291bnQrMV07CisJCQkJc2lnW2FycmF5Q291bnRdID0gQ19ET1VCTEU7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgJ2YnOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHMoRkxPQVQsIHR5cGVOYW1lLCAwLCB0cnVlKSkgeworCQkJCXNpZyA9IG5ldyBjaGFyW2FycmF5Q291bnQrMV07CisJCQkJc2lnW2FycmF5Q291bnRdID0gQ19GTE9BVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSAnaSc6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhJTlQsIHR5cGVOYW1lLCAwLCB0cnVlKSkgeworCQkJCXNpZyA9IG5ldyBjaGFyW2FycmF5Q291bnQrMV07CisJCQkJc2lnW2FycmF5Q291bnRdID0gQ19JTlQ7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgJ2wnOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHMoTE9ORywgdHlwZU5hbWUsIDAsIHRydWUpKSB7CisJCQkJc2lnID0gbmV3IGNoYXJbYXJyYXlDb3VudCsxXTsKKwkJCQlzaWdbYXJyYXlDb3VudF0gPSBDX0xPTkc7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgJ3MnOgorCQkJaWYgKENoYXJPcGVyYXRpb24uZnJhZ21lbnRFcXVhbHMoU0hPUlQsIHR5cGVOYW1lLCAwLCB0cnVlKSkgeworCQkJCXNpZyA9IG5ldyBjaGFyW2FycmF5Q291bnQrMV07CisJCQkJc2lnW2FycmF5Q291bnRdID0gQ19TSE9SVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSAndic6CisJCQlpZiAoQ2hhck9wZXJhdGlvbi5mcmFnbWVudEVxdWFscyhWT0lELCB0eXBlTmFtZSwgMCwgdHJ1ZSkpIHsKKwkJCQlzaWcgPSBuZXcgY2hhclthcnJheUNvdW50KzFdOworCQkJCXNpZ1thcnJheUNvdW50XSA9IENfVk9JRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCS8vIG5vbiBwcmltaXRpdmUgdHlwZQorCQkJaW50IHNpZ0xlbmd0aCA9IGFycmF5Q291bnQgKyAxICsgbGVuZ3RoICsgMTsgLy8gZS5nLiAnW1tbTGphdmEubGFuZy5TdHJpbmc7JworCQkJc2lnID0gbmV3IGNoYXJbc2lnTGVuZ3RoXTsKKwkJCWludCBzaWdJbmRleCA9IGFycmF5Q291bnQrMTsgLy8gaW5kZXggaW4gc2lnCisJCQlpbnQgc3RhcnRJRCA9IDA7IC8vIHN0YXJ0IG9mIGN1cnJlbnQgSUQgaW4gdHlwZU5hbWUKKwkJCWludCBpbmRleCA9IDA7IC8vIGluZGV4IGluIHR5cGVOYW1lCisJCQl3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHsKKwkJCQljaGFyIGN1cnJlbnRDaGFyID0gdHlwZU5hbWVbaW5kZXhdOworCQkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQkJY2FzZSAnLic6CisJCQkJCQlpZiAoc3RhcnRJRCA9PSAtMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuZXcgU3RyaW5nKHR5cGVOYW1lKSk7CisJCQkJCQlpZiAoc3RhcnRJRCA8IGluZGV4KSB7CisJCQkJCQkJc2lnID0gQ2hhck9wZXJhdGlvbi5hcHBlbmQoc2lnLCBzaWdJbmRleCwgdHlwZU5hbWUsIHN0YXJ0SUQsIGluZGV4KTsKKwkJCQkJCQlzaWdJbmRleCArPSBpbmRleC1zdGFydElEOworCQkJCQkJfQorCQkJCQkJc2lnW3NpZ0luZGV4KytdID0gQ19ET1Q7CisJCQkJCQlpbmRleCsrOworCQkJCQkJc3RhcnRJRCA9IGluZGV4OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ1snOgorCQkJCQkJaWYgKHN0YXJ0SUQgIT0gLTEpIHsKKwkJCQkJCQlpZiAoc3RhcnRJRCA8IGluZGV4KSB7CisJCQkJCQkJCXNpZyA9IENoYXJPcGVyYXRpb24uYXBwZW5kKHNpZywgc2lnSW5kZXgsIHR5cGVOYW1lLCBzdGFydElELCBpbmRleCk7CisJCQkJCQkJCXNpZ0luZGV4ICs9IGluZGV4LXN0YXJ0SUQ7CisJCQkJCQkJfQorCQkJCQkJCXN0YXJ0SUQgPSAtMTsgLy8gbm8gbW9yZSBpZCBhZnRlciBbXQorCQkJCQkJfQorCQkJCQkJaW5kZXgrKzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmIChzdGFydElEICE9IC0xICYmIENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyKSkgeworCQkJCQkJCWlmIChzdGFydElEIDwgaW5kZXgpIHsKKwkJCQkJCQkJc2lnID0gQ2hhck9wZXJhdGlvbi5hcHBlbmQoc2lnLCBzaWdJbmRleCwgdHlwZU5hbWUsIHN0YXJ0SUQsIGluZGV4KTsKKwkJCQkJCQkJc2lnSW5kZXggKz0gaW5kZXgtc3RhcnRJRDsKKwkJCQkJCQl9CisJCQkJCQkJc3RhcnRJRCA9IGluZGV4KzE7CisJCQkJCQl9CisJCQkJCQlpbmRleCsrOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gbGFzdCBpZAorCQkJaWYgKHN0YXJ0SUQgIT0gLTEgJiYgc3RhcnRJRCA8IGluZGV4KSB7CisJCQkJc2lnID0gQ2hhck9wZXJhdGlvbi5hcHBlbmQoc2lnLCBzaWdJbmRleCwgdHlwZU5hbWUsIHN0YXJ0SUQsIGluZGV4KTsKKwkJCQlzaWdJbmRleCArPSBpbmRleC1zdGFydElEOworCQkJfQorCQkJCisJCQkvLyBhZGQgTCAob3IgUSkgYXQgdGhlIGJlaWdpbmluaWcgYW5kIDsgYXQgdGhlIGVuZAorCQkJc2lnW2FycmF5Q291bnRdID0gaXNSZXNvbHZlZCA/IENfUkVTT0xWRUQgOiBDX1VOUkVTT0xWRUQ7CisJCQlzaWdbc2lnSW5kZXgrK10gPSBDX05BTUVfRU5EOworCQkJCisJCQkvLyByZXNpemUgaWYgbmVlZGVkCisJCQlpZiAoc2lnTGVuZ3RoID4gc2lnSW5kZXgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHNpZywgMCwgc2lnID0gbmV3IGNoYXJbc2lnSW5kZXhdLCAwLCBzaWdJbmRleCk7CisJCQl9CiAJfQorCisJLy8gYWRkIGFycmF5IGluZm8KKwlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykgeworCQlzaWdbaV0gPSBDX0FSUkFZOworCX0KKwkKKwlyZXR1cm4gc2lnOwogfQogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IHR5cGUgc2lnbmF0dXJlIGZyb20gdGhlIGdpdmVuIHR5cGUgbmFtZS4gSWYgdGhlIHR5cGUgbmFtZSBpcyBxdWFsaWZpZWQsCkBAIC01NDUsNyArNTgyLDcgQEAKICAqIEByZXR1cm4gdGhlIGVuY29kZWQgdHlwZSBzaWduYXR1cmUKICAqLwogcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVHlwZVNpZ25hdHVyZShTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNSZXNvbHZlZCkgewotCXJldHVybiBjcmVhdGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLnRvQ2hhckFycmF5KCksIGlzUmVzb2x2ZWQpOworCXJldHVybiBjcmVhdGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lID09IG51bGwgPyBudWxsIDogdHlwZU5hbWUudG9DaGFyQXJyYXkoKSwgaXNSZXNvbHZlZCk7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIGFycmF5IGNvdW50IChhcnJheSBuZXN0aW5nIGRlcHRoKSBvZiB0aGUgZ2l2ZW4gdHlwZSBzaWduYXR1cmUuCkBAIC04MDYsMTMgKzg0MywxMyBAQAogICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKICAqIEByZXR1cm4gdGhlIHF1YWxpZmllciBwcmVmaXgsIG9yIHRoZSBlbXB0eSBjaGFyIGFycmF5IGlmIHRoZSBuYW1lIGNvbnRhaW5zIG5vCiAgKiAgIGRvdHMKLSAqIAorICogQGV4Y2VwdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBuYW1lIGlzIG51bGwKICAqIEBzaW5jZSAyLjAKICAqLwogcHVibGljIHN0YXRpYyBjaGFyW10gZ2V0UXVhbGlmaWVyKGNoYXJbXSBuYW1lKSB7CiAJaW50IGxhc3REb3QgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKENfRE9ULCBuYW1lKTsKIAlpZiAobGFzdERvdCA9PSAtMSkgewotCQlyZXR1cm4gTk9fQ0hBUjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCX0KIAlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCAwLCBsYXN0RG90KTsKIH0KQEAgLTgzMiw5ICs4NjksMTQgQEAKICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCiAgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZXIgcHJlZml4LCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSBuYW1lIGNvbnRhaW5zIG5vCiAgKiAgIGRvdHMKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCiAgKi8KIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YWxpZmllcihTdHJpbmcgbmFtZSkgewotCXJldHVybiBuZXcgU3RyaW5nKGdldFF1YWxpZmllcihuYW1lLnRvQ2hhckFycmF5KCkpKTsKKwlpbnQgbGFzdERvdCA9IG5hbWUubGFzdEluZGV4T2YoQ19ET1QpOworCWlmIChsYXN0RG90ID09IC0xKSB7CisJCXJldHVybiBFTVBUWTsKKwl9CisJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpOwogfQogLyoqCiAgKiBFeHRyYWN0cyB0aGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZS4gVGhlIG1ldGhvZCBzaWduYXR1cmUgaXMgCkBAIC04ODAsNyArOTIyLDcgQEAKICAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQogICogQHJldHVybiB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpZWQgbmFtZQotICogCisgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRTaW1wbGVOYW1lKGNoYXJbXSBuYW1lKSB7CkBAIC05MDQsOSArOTQ2LDE0IEBACiAgKgogICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKICAqIEByZXR1cm4gdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCiAgKi8KIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQlyZXR1cm4gbmV3IFN0cmluZyhnZXRTaW1wbGVOYW1lKG5hbWUudG9DaGFyQXJyYXkoKSkpOworCWludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZihDX0RPVCk7CisJaWYgKGxhc3REb3QgPT0gLTEpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCXJldHVybiBuYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSwgbmFtZS5sZW5ndGgoKSk7CiB9CiAvKioKICAqIFJldHVybnMgYWxsIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBkb3Qtc2VwYXJhdGVkIHF1YWxpZmllZCBuYW1lLgpAQCAtOTI0LDEyICs5NzEsMTIgQEAKICAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQogICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW1wbGUgbmFtZXMsIHBvc3NpYmx5IGVtcHR5Ci0gKiAKKyAqIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBzdGF0aWMgY2hhcltdW10gZ2V0U2ltcGxlTmFtZXMoY2hhcltdIG5hbWUpIHsKIAlpZiAobmFtZS5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gTk9fQ0hBUl9DSEFSOworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJfQogCWludCBkb3QgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoQ19ET1QsIG5hbWUpOwogCWlmIChkb3QgPT0gLTEpIHsKQEAgLTk2NSw2ICsxMDEyLDcgQEAKICAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQogICogQHJldHVybiB0aGUgbGlzdCBvZiBzaW1wbGUgbmFtZXMsIHBvc3NpYmx5IGVtcHR5CisgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAogICovCiBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNpbXBsZU5hbWVzKFN0cmluZyBuYW1lKSB7CiAJY2hhcltdW10gc2ltcGxlTmFtZXMgPSBnZXRTaW1wbGVOYW1lcyhuYW1lLnRvQ2hhckFycmF5KCkpOwpAQCAtMTE4NSw3ICsxMjMzLDcgQEAKIAkJaW50IHNpZ0xlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAKIAkJaWYgKHNpZ0xlbmd0aCA9PSAwIHx8IHNpZ25hdHVyZVswXSA9PSBDX1BBUkFNX1NUQVJUKSB7Ci0JCQlyZXR1cm4gdG9DaGFyQXJyYXkoc2lnbmF0dXJlLCBOT19DSEFSLCBudWxsLCB0cnVlLCB0cnVlKTsKKwkJCXJldHVybiB0b0NoYXJBcnJheShzaWduYXR1cmUsIENoYXJPcGVyYXRpb24uTk9fQ0hBUiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CiAJCX0KIAkJCiAJCS8vIGNvbXB1dGUgcmVzdWx0IGxlbmd0aApAQCAtMTI3MCw3ICsxMzE4LDcgQEAKICAqLwogcHVibGljIHN0YXRpYyBjaGFyW10gdG9RdWFsaWZpZWROYW1lKGNoYXJbXVtdIHNlZ21lbnRzKSB7CiAJaW50IGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsKLQlpZiAobGVuZ3RoID09IDApIHJldHVybiBOT19DSEFSOworCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlpZiAobGVuZ3RoID09IDEpIHJldHVybiBzZWdtZW50c1swXTsKIAkKIAlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1Rvb2xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9Ub29sRmFjdG9yeS5qYXZhCmluZGV4IGYwMjRjZTMuLmY1NTNkOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL1Rvb2xGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvVG9vbEZhY3RvcnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTYsMjMgKzE2LDIyIEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklTY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVEaXNhc3NlbWJsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNsYXNzRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkRpc2Fzc2VtYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlB1YmxpY1NjYW5uZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwogCiAvKioKQEAgLTY0LDE5ICs2MywxNiBAQAogCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCk7CiAJCQkJZm9yKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspewogCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb25zW2ldLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luID0gZXh0ZW5zaW9uLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKTsKLQkJCQkJCWlmIChwbHVnaW4uaXNQbHVnaW5BY3RpdmF0ZWQoKSkgewotCQkJCQkJCWZvcihpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKyl7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlPYmplY3QgZXhlY0V4dCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWlmIChleGVjRXh0IGluc3RhbmNlb2YgSUNvZGVGb3JtYXR0ZXIpewotCQkJCQkJCQkJCS8vIHVzZSBmaXJzdCBjb250cmlidXRpb24gZm91bmQKLQkJCQkJCQkJCQlyZXR1cm4gKElDb2RlRm9ybWF0dGVyKWV4ZWNFeHQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkJfQorCQkJCQlmb3IoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlPYmplY3QgZXhlY0V4dCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlpZiAoZXhlY0V4dCBpbnN0YW5jZW9mIElDb2RlRm9ybWF0dGVyKXsKKwkJCQkJCQkJLy8gdXNlIGZpcnN0IGNvbnRyaWJ1dGlvbiBmb3VuZAorCQkJCQkJCQlyZXR1cm4gKElDb2RlRm9ybWF0dGVyKWV4ZWNFeHQ7CiAJCQkJCQkJfQorCQkJCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewogCQkJCQkJfQorCQkJCQl9CiAJCQkJfQkKIAkJCX0KIAkJLy8gbm8gcHJvcGVyIGNvbnRyaWJ1dGlvbiBmb3VuZCwgdXNlIGRlZmF1bHQgZm9ybWF0dGVyCQkJCkBAIC0xMDcsMTUgKzEwMywyOSBAQAogCSAqIAogCSAqIEByZXR1cm4gYSBjbGFzc2ZpbGUgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyCiAJICogQHNlZSBJQ2xhc3NGaWxlRGlzYXNzZW1ibGVyCisJICogQGRlcHJlY2F0ZWQgLSBzaG91bGQgdXNlIGZhY3RvcnkgbWV0aG9kIGNyZWF0aW5nIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIGluc3RlYWQgCiAJICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlRGlzYXNzZW1ibGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVEaXNhc3NlbWJsZXIoKXsKLQkJcmV0dXJuIG5ldyBEaXNhc3NlbWJsZXIoKTsKKwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlciBjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlRGlzYXNzZW1ibGVyKCl7CisJCWNsYXNzIERlcHJlY2F0ZWREaXNhc3NlbWJsZXIgZXh0ZW5kcyBEaXNhc3NlbWJsZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVEaXNhc3NlbWJsZXIge307CisJCXJldHVybiBuZXcgRGVwcmVjYXRlZERpc2Fzc2VtYmxlcigpOwogCX0KIAkKIAkvKioKKwkgKiBDcmVhdGUgYSBjbGFzc2ZpbGUgYnl0ZWNvZGUgZGlzYXNzZW1ibGVyLCBhYmxlIHRvIHByb2R1Y2UgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUuCisJICogCisJICogQHJldHVybiBhIGNsYXNzZmlsZSBieXRlY29kZSBkaXNhc3NlbWJsZXIKKwkgKiBAc2VlIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyCisJICogQHNpbmNlIDIuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCl7CisJCXJldHVybiBuZXcgRGlzYXNzZW1ibGVyKCk7CisJfQorCisJLyoqCiAJICogQ3JlYXRlIGEgZGVmYXVsdCBjbGFzc2ZpbGUgcmVhZGVyLCBhYmxlIHRvIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBjbGFzc2ZpbGUKIAkgKiBhY2NvcmRpbmcgdG8gdGhlIGRlY29kaW5nIGZsYWcgdXNlZCB0byBpbml0aWFsaXplIHRoZSByZWFkZXIuCiAJICogQW5zd2VyIG51bGwgaWYgdGhlIGZpbGUgbmFtZWQgZmlsZU5hbWUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCAuY2xhc3MgZmlsZS4KKwkgKiBUaGUgZmlsZU5hbWUgaGFzIHRvIGJlIGFuIGFic29sdXRlIE9TIHBhdGggdG8gdGhlIGdpdmVuIC5jbGFzcyBmaWxlLgogCSAqIAogCSAqIFRoZSBkZWNvZGluZyBmbGFncyBhcmUgZGVzY3JpYmVkIGluIElDbGFzc0ZpbGVSZWFkZXIuCiAJICogCkBAIC0xNTEsMTEgKzE2MSw5IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlUmVhZGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoSUNsYXNzRmlsZSBjbGFzc2ZpbGUsIGludCBkZWNvZGluZ0ZsYWcpewogCi0JCUlQYXRoIGZpbGVQYXRoID0gY2xhc3NmaWxlLmdldFBhdGgoKTsKIAkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgY2xhc3NmaWxlLmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwogCQlpZiAocm9vdCAhPSBudWxsKXsKIAkJCXRyeSB7Ci0JCQkJSVBhdGggcm9vdFBhdGggPSByb290LmdldFBhdGgoKTsKIAkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKIAkJCQkJCQogCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSAoKEphclBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdCkuZ2V0SmFyKCkuZ2V0TmFtZSgpOwpAQCAtMTY4LDcgKzE3Niw5IEBACiAJCQkJCX0KIAkJCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoYXJjaGl2ZU5hbWUsIGVudHJ5TmFtZSwgZGVjb2RpbmdGbGFnKTsKIAkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihjbGFzc2ZpbGUuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIGRlY29kaW5nRmxhZyk7CisJCQkJCUlQYXRoIGxvY2F0aW9uID0gY2xhc3NmaWxlLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKKwkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBudWxsOworCQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihsb2NhdGlvbi50b09TU3RyaW5nKCksIGRlY29kaW5nRmxhZyk7CiAJCQkJfQogCQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewogCQkJfQpAQCAtMTkzLDYgKzIwMyw5IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NGaWxlUmVhZGVyIGNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoU3RyaW5nIHppcEZpbGVOYW1lLCBTdHJpbmcgemlwRW50cnlOYW1lLCBpbnQgZGVjb2RpbmdGbGFnKXsKIAkJdHJ5IHsKKwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIikgW1Rvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoKV0gQ3JlYXRpbmcgWmlwRmlsZSBvbiAiICsgemlwRmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKKwkJCX0KIAkJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGVOYW1lKTsKIAkJCVppcEVudHJ5IHppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh6aXBFbnRyeU5hbWUpOwogCQkJaWYgKHppcEVudHJ5ID09IG51bGwpIHsKQEAgLTIyNyw2ICsyNDAsMTAgQEAKIAkgKiA8L3ByZT4KIAkgKiA8L2NvZGU+CiAJICogCisJICogPHA+CisJICogVGhlIHJldHVybmVkIHNjYW5uZXIgd2lsbCB0b2xlcmF0ZSB1bnRlcm1pbmF0ZWQgbGluZSBjb21tZW50cyAobWlzc2luZyBsaW5lIHNlcGFyYXRvcikuIEl0IGNhbiBiZSBtYWRlIHN0cmljdGVyCisJICogYnkgdXNpbmcgQVBJIHdpdGggZXh0cmEgYm9vbGVhbiBwYXJhbWV0ZXIgKDxjb2RlPnN0cmljdENvbW1lbnRNb2RlPC9jb2RlPikuCisJICogPHA+CiAJICogQHBhcmFtIHRva2VuaXplQ29tbWVudHMgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgY29tbWVudHMgd2lsbCBiZSBzaWxlbnRseSBjb25zdW1lZAogCSAqIEBwYXJhbSB0b2tlbml6ZVdoaXRlU3BhY2UgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgd2hpdGUgc3BhY2VzIHdpbGwgYmUgc2lsZW50bHkgY29uc3VtZWQsCiAJICogQHBhcmFtIGFzc2VydEtleXdvcmQgaWYgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgb2NjdXJyZW5jZXMgb2YgJ2Fzc2VydCcgd2lsbCBiZSByZXBvcnRlZCBhcyBpZGVudGlmaWVycwpAQCAtMjM1LDE0ICsyNTIsMTUgQEAKIAkgKiBhIG5ldyAnYXNzZXJ0JyBrZXl3b3JkLgogCSAqIEBwYXJhbSByZWNvcmRMaW5lU2VwYXJhdG9yIGlmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHNjYW5uZXIgd2lsbCByZWNvcmQgcG9zaXRpb25zIG9mIGVuY291bnRlcmVkIGxpbmUgCiAJICogc2VwYXJhdG9yIGVuZHMuIEluIGNhc2Ugb2YgbXVsdGktY2hhcmFjdGVyIGxpbmUgc2VwYXJhdG9ycywgdGhlIGxhc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQuIFRoZXNlIHBvc2l0aW9ucwotCSAqIGNhbiB0aGVuIGJlIGV4dHJhY3RlZCB1c2luZyA8Y29kZT5JU2Nhbm5lciNnZXRMaW5lRW5kczwvY29kZT4KKwkgKiBjYW4gdGhlbiBiZSBleHRyYWN0ZWQgdXNpbmcgPGNvZGU+SVNjYW5uZXIjZ2V0TGluZUVuZHM8L2NvZGU+LiBPbmx5IG5vbi11bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIAorCSAqIGNvbnNpZGVyZWQgYXMgdmFsaWQgbGluZSBzZXBhcmF0b3JzLgogICAJICogQHJldHVybiBhIHNjYW5uZXIKLQkgKiAKKwkgKiBAc2VlIFRvb2xGYWN0b3J5I2NyZWF0ZVNjYW5uZXIoYm9vbGVhbixib29sZWFuLGJvb2xlYW4sYm9vbGVhbiwgYm9vbGVhbikKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklTY2FubmVyCiAJICovCiAJcHVibGljIHN0YXRpYyBJU2Nhbm5lciBjcmVhdGVTY2FubmVyKGJvb2xlYW4gdG9rZW5pemVDb21tZW50cywgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UsIGJvb2xlYW4gYXNzZXJ0TW9kZSwgYm9vbGVhbiByZWNvcmRMaW5lU2VwYXJhdG9yKXsKIAotCQlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcih0b2tlbml6ZUNvbW1lbnRzLCB0b2tlbml6ZVdoaXRlU3BhY2UsIGZhbHNlLCBhc3NlcnRNb2RlKTsKKwkJUHVibGljU2Nhbm5lciBzY2FubmVyID0gbmV3IFB1YmxpY1NjYW5uZXIodG9rZW5pemVDb21tZW50cywgdG9rZW5pemVXaGl0ZVNwYWNlLCBmYWxzZS8qbmxzKi8sIGFzc2VydE1vZGUgLyphc3NlcnQqLywgbnVsbC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CiAJCXNjYW5uZXIucmVjb3JkTGluZVNlcGFyYXRvciA9IHJlY29yZExpbmVTZXBhcmF0b3I7CiAJCXJldHVybiBzY2FubmVyOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JU2Nhbm5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lTY2FubmVyLmphdmEKaW5kZXggM2Y5NjllNS4uNTA4NzU0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVNjYW5uZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JU2Nhbm5lci5qYXZhCkBAIC0xLDE1ICsxLDE3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCi2gCi1Db250cmlidXRvcnM6Ci0gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKICAKICAvKioKICAgKiBEZWZpbml0aW9uIG9mIGEgSmF2YSBzY2FubmVyLCBhcyByZXR1cm5lZCBieSB0aGUgPGNvZGU+VG9vbEZhY3Rvcnk8L2NvZGU+LgpAQCAtMzYsNiArMzgsMTcgQEAKIAkgKiBiZWVuIHRyYW5zbGF0ZWQgaW50byB1bmljb2RlIGNoYXJhY3RlcnMKIAkgKi8KIAljaGFyW10gZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCisJLyoqCisJICogQW5zd2VycyB0aGUgY3VycmVudCBpZGVudGlmaWVyIHNvdXJjZSwgYmVmb3JlIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBoYXZlCisJICogYmVlbiB0cmFuc2xhdGVkIGludG8gdW5pY29kZSBjaGFyYWN0ZXJzLgorCSAqIGUuZy4gaWYgb3JpZ2luYWwgc291cmNlIHdhcyA8Y29kZT5cXHUwMDYxYmM8L2NvZGU+IHRoZW4gaXQgd2lsbCBhbnN3ZXIgPGNvZGU+XFx1MDA2MWJjPC9jb2RlPi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgc291cmNlLCBiZWZvcmUgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIGhhdmUKKwkgKiBiZWVuIHRyYW5zbGF0ZWQgaW50byB1bmljb2RlIGNoYXJhY3RlcnMKKwkgKiBAc2luY2UgMi4xCisJICovCisJY2hhcltdIGdldFJhd1Rva2VuU291cmNlKCk7CQogCiAJLyoqCiAJICogQW5zd2VycyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW5zaWRlIHRoZSBvcmlnaW5hbCBzb3VyY2UuCkBAIC0xMDMsNyArMTE2LDcgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIGFjdHVhbCB0b2tlbiBJRCB2YWx1ZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGlmIG5ldyBrZXl3b3JkcyB3ZXJlIGFkZGVkIHRvIHRoZSBsYW5ndWFnZQogCSAqIChpLmUuICdhc3NlcnQnIGtleXdvcmQgaW4gMS40KS4KIAkgKiAKLQkgKiBAdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiAtIGluIGNhc2UgYSBsZXhpY2FsIGVycm9yIHdhcyBkZXRlY3RlZCB3aGlsZSByZWFkaW5nIHRoZSBjdXJyZW50IHRva2VuCisJICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gaW4gY2FzZSBhIGxleGljYWwgZXJyb3Igd2FzIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgdGhlIGN1cnJlbnQgdG9rZW4KIAkgKi8KIAlpbnQgZ2V0TmV4dFRva2VuKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvY29tcGlsZXIvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVRlcm1pbmFsU3ltYm9scy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVRlcm1pbmFsU3ltYm9scy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvY29tcGlsZXIvSVRlcm1pbmFsU3ltYm9scy5qYXZhCmluZGV4IDE2ZmU1ZTMuLjdhYzZiYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2NvbXBpbGVyL29yZy9lY2xpcHNlL2pkdC9jb3JlL2NvbXBpbGVyL0lUZXJtaW5hbFN5bWJvbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9jb21waWxlci9JVGVybWluYWxTeW1ib2xzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41Ci13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKLaAKLUNvbnRyaWJ1dG9yczoKLSAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyOwogIApAQCAtNTQsNyArNTQsNyBAQAogICAgICAgVG9rZW5OYW1lZmxvYXQgPSAyMiwKICAgICAgIFRva2VuTmFtZWZvciA9IDEyMiwKICAgICAgIFRva2VuTmFtZWlmID0gMTIzLAotICAgICAgVG9rZW5OYW1laW1wbGVtZW50cyA9IDI2NywKKyAgICAgIFRva2VuTmFtZWltcGxlbWVudHMgPSAyNjgsCiAgICAgICBUb2tlbk5hbWVpbXBvcnQgPSAxOTEsCiAgICAgICBUb2tlbk5hbWVpbnN0YW5jZW9mID0gNjUsCiAgICAgICBUb2tlbk5hbWVpbnQgPSAyMywKQEAgLTcxLDEwICs3MSwxMCBAQAogICAgICAgVG9rZW5OYW1lc2hvcnQgPSAyNSwKICAgICAgIFRva2VuTmFtZXN0YXRpYyA9IDk0LAogICAgICAgVG9rZW5OYW1lc3RyaWN0ZnAgPSAxMDQsCi0gICAgICBUb2tlbk5hbWVzdXBlciA9IDM0LAorICAgICAgVG9rZW5OYW1lc3VwZXIgPSAzMywKICAgICAgIFRva2VuTmFtZXN3aXRjaCA9IDEyNSwKICAgICAgIFRva2VuTmFtZXN5bmNocm9uaXplZCA9IDg1LAotICAgICAgVG9rZW5OYW1ldGhpcyA9IDM1LAorICAgICAgVG9rZW5OYW1ldGhpcyA9IDM0LAogICAgICAgVG9rZW5OYW1ldGhyb3cgPSAxMjYsCiAgICAgICBUb2tlbk5hbWV0aHJvd3MgPSAyMjcsCiAgICAgICBUb2tlbk5hbWV0cmFuc2llbnQgPSAxMDUsCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICBUb2tlbk5hbWVTdHJpbmdMaXRlcmFsID0gNDUsCiAgICAgICBUb2tlbk5hbWVQTFVTX1BMVVMgPSAxLAogICAgICAgVG9rZW5OYW1lTUlOVVNfTUlOVVMgPSAyLAotICAgICAgVG9rZW5OYW1lRVFVQUxfRVFVQUwgPSAzMywKKyAgICAgIFRva2VuTmFtZUVRVUFMX0VRVUFMID0gMzUsCiAgICAgICBUb2tlbk5hbWVMRVNTX0VRVUFMID0gNjYsCiAgICAgICBUb2tlbk5hbWVHUkVBVEVSX0VRVUFMID0gNjcsCiAgICAgICBUb2tlbk5hbWVOT1RfRVFVQUwgPSAzNiwKQEAgLTEzNiw1ICsxMzYsNSBAQAogICAgICAgVG9rZW5OYW1lRE9UID0gNiwKICAgICAgIFRva2VuTmFtZUVRVUFMID0gMTY3LAogICAgICAgVG9rZW5OYW1lRU9GID0gMTU4LAotICAgICAgVG9rZW5OYW1lRVJST1IgPSAzMDc7CisgICAgICBUb2tlbk5hbWVFUlJPUiA9IDMwOTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUNvZGVTbmlwcGV0UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lDb2RlU25pcHBldFJlcXVlc3Rvci5qYXZhCmluZGV4IGY2ODI1YTIuLjMyZmRjN2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUNvZGVTbmlwcGV0UmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JQ29kZVNuaXBwZXRSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JRXZhbHVhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUV2YWx1YXRpb25Db250ZXh0LmphdmEKaW5kZXggYzJjNmY0MS4uNTJkYzQ3ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JRXZhbHVhdGlvbkNvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lFdmFsdWF0aW9uQ29udGV4dC5qYXZhCkBAIC0xLDE3ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuZXZhbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb2RlQ29tcGxldGlvblJlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwpAQCAtMzMzLDcgKzMzMiw3IEBACiAJcHVibGljIHZvaWQgY29kZUNvbXBsZXRlKAogCQlTdHJpbmcgY29kZVNuaXBwZXQsCiAJCWludCBwb3NpdGlvbiwKLQkJSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKKwkJb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUdsb2JhbFZhcmlhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9ldmFsL0lHbG9iYWxWYXJpYWJsZS5qYXZhCmluZGV4IGEzOWY2NjIuLjA3OWFjYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2V2YWwvSUdsb2JhbFZhcmlhYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvZXZhbC9JR2xvYmFsVmFyaWFibGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmV2YWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRXhjZXB0aW9uLmphdmEKaW5kZXggNDhmNjUyNi4uYzM0YWE1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9ET01FeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0RPTUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRmFjdG9yeS5qYXZhCmluZGV4IGZkNTUyNGEuLjU5ZDYxMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vRE9NRmFjdG9yeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCmluZGV4IDhjMjA1MTUuLmJlOGY5MjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GYWN0b3J5LmphdmEKaW5kZXggNGVmZTBmNy4uNzFmMmZlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZhY3RvcnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUZpZWxkLmphdmEKaW5kZXggODZmOTgzMS4uM2EyZjlhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NRmllbGQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01GaWVsZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01JbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCmluZGV4IDExNzU5OWIuLmFjYzdiODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUltcG9ydC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NSW5pdGlhbGl6ZXIuamF2YQppbmRleCBmMGM1OTFjLi4yMTZjYjNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Jbml0aWFsaXplci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTUluaXRpYWxpemVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWVtYmVyLmphdmEKaW5kZXggMmE1ZmM3NC4uZjk0NzVlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWVtYmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU1ldGhvZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWV0aG9kLmphdmEKaW5kZXggZjkzOWU4ZS4uYjc5ZTFiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTWV0aG9kLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTU5vZGUuamF2YQppbmRleCA2NGNhY2NjLi45NjdjOTRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01Ob2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NTm9kZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVBhY2thZ2UuamF2YQppbmRleCA4MmY2MmQyLi5lM2IxZjljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01QYWNrYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NUGFja2FnZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbTsKIC8qKgogICogUmVwcmVzZW50cyBhIHBhY2thZ2UgZGVjbGFyYXRpb24uIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvamRvbS9JRE9NVHlwZS5qYXZhCmluZGV4IDg2N2VkYjguLjg3N2I1NjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL2pkb20vSURPTVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS9qZG9tL0lET01UeXBlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQnl0ZUNvZGVWaXNpdG9yQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKaW5kZXggZjdjOWE3Ny4uZjA3Y2Q5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9CeXRlQ29kZVZpc2l0b3JBZGFwdGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRiZTdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgdG8gZGlzYXNzZW1ibGUKKyAqIGNsYXNzZmlsZSBieXRlcyBvbnRvIGEgU3RyaW5nIHVzaW5nIHRoZSBwcm9wZXIgbGluZSBzZXBhcmF0b3IuCisgKiAKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyIHsKKwkKKwkvKioKKwkgKiBUaGUgbW9kZSBpcyB0aGUgZGV0YWlsZWQgbW9kZSB0byBkaXNhc3NlbWJsZSBJQ2xhc3NGaWxlUmVhZGVyLiBJdCByZXR1cm5zIHRoZSBtYWdpYworCSAqIG51bWJlcnMsIHRoZSB2ZXJzaW9uIG51bWJlcnMgYW5kIGZpZWxkIGFuZCBtZXRob2QgZGVzY3JpcHRvcnMuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVUQUlMRUQgPSAxOworCQorCS8qKgorCSAqIFRoZSBtb2RlIGlzIHRoZSBkZWZhdWx0IG1vZGUgdG8gZGlzYXNzZW1ibGUgSUNsYXNzRmlsZVJlYWRlci4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljICBpbnQgREVGQVVMVCAgPSAyOworCisJLyoqCisJICogQW5zd2VycyBiYWNrIHRoZSBkaXNhc3NlbWJsZWQgc3RyaW5nIG9mIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgdXNpbmcgdGhlIGRlZmF1bHQKKwkgKiBtb2RlLgorCSAqIFRoaXMgaXMgYW4gb3V0cHV0IHF1aXRlIHNpbWlsYXIgdG8gdGhlIGphdmFwIHRvb2wsIHVzaW5nIERFRkFVTFQgbW9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NGaWxlQnl0ZXMgVGhlIGJ5dGVzIG9mIHRoZSBjbGFzc2ZpbGUKKwkgKiBAcGFyYW0gbGluZVNlcGFyYXRvciB0aGUgbGluZSBzZXBhcmF0b3IgdG8gdXNlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIElDbGFzc0ZpbGVSZWFkZXIgdXNpbmcgdGhlIGRlZmF1bHQgbW9kZS4KKwkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgYXJlIGlsbC1mb3JtZWQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGRpc2Fzc2VtYmxlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgU3RyaW5nIGxpbmVTZXBhcmF0b3IpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKKworCS8qKgorCSAqIEFuc3dlcnMgYmFjayB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgY2xhc3NmaWxlIGJ5dGVzIGFjY29yZGluZyB0byB0aGUKKwkgKiBtb2RlLgorCSAqIFRoaXMgaXMgYW4gb3V0cHV0IHF1aXRlIHNpbWlsYXIgdG8gdGhlIGphdmFwIHRvb2wuCisJICogCisJICogQHBhcmFtIGNsYXNzRmlsZUJ5dGVzIFRoZSBieXRlcyBvZiB0aGUgY2xhc3NmaWxlCisJICogQHBhcmFtIGxpbmVTZXBhcmF0b3IgdGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4KKwkgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSB1c2VkIHRvIGRpc2Fzc2VtYmxlIHRoZSBJQ2xhc3NGaWxlUmVhZGVyCisJICogCisJICogQHJldHVybiB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgSUNsYXNzRmlsZVJlYWRlciBhY2NvcmRpbmcgdG8gdGhlIG1vZGUKKwkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgYXJlIGlsbC1mb3JtZWQKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGRpc2Fzc2VtYmxlKGJ5dGVbXSBjbGFzc0ZpbGVCeXRlcywgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCBtb2RlKSAgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uOworCisJLyoqCisJICogQW5zd2VycyBhIHJlYWRhYmxlIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgZGlzYXNzZW1ibGVyCisJICogCisJICogQHJldHVybiBTdHJpbmcgLSBhIHN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgZGlzYXNzZW1ibGVyCisJICovCQorICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGb3JtYXRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvQ2xhc3NGb3JtYXRFeGNlcHRpb24uamF2YQppbmRleCAzMWMyMmNmLi5iNWUzOGNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NsYXNzRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9DbGFzc0Zvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0NvbXBpbGF0aW9uVW5pdFNvcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9Db21waWxhdGlvblVuaXRTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYwYzViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9Db21waWxhdGlvblVuaXRTb3J0ZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvcnRFbGVtZW50c09wZXJhdGlvbjsKKworLyoqCisgKiBPcGVyYXRpb24gZm9yIHNvcnRpbmcgbWVtYmVycyB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0LgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBmdW5jdGlvbmFsaXR5IHZpYSBzdGF0aWMgbWVtYmVyczsgaXQgaXMgbm90CisgKiBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcGlsYXRpb25Vbml0U29ydGVyIHsKKwkKKyAJLyoqCisgCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uLgorIAkgKi8KKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdFNvcnRlcigpIHsKKwl9IAorCQorCS8qKgorCSAqIE5hbWUgb2YgYXV4aWxsYXJ5IHByb3BlcnR5IHdob3NlIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUKKwkgKiBvcmlnaW5hbCByZWxhdGl2ZSBvcmRlciBvZiB0d28gYm9keSBkZWNsYXJhdGlvbnMuIFRoaXMgYWxsb3dzIGEKKwkgKiBjb21wYXJhdG9yIHRvIHByZXNlcnZlIHRoZSByZWxhdGl2ZSBwb3NpdGlvbnMgb2YgY2VydGFpbiBraW5kcyBvZgorCSAqIGJvZHkgZGVjbGFyYXRpb25zIHdoZW4gcmVxdWlyZWQuCisJICogPHA+CisJICogQWxsIGJvZHkgZGVjbGFyYXRpb25zIHBhc3NlZCB0byB0aGUgY29tcGFyYXRvcidzIDxjb2RlPmNvbXBhcmU8L2NvZGU+CisJICogbWV0aG9kIGJ5IDxjb2RlPkNvbXBpbGF0aW9uVW5pdFNvcnRlci5zb3J0PC9jb2RlPiBjYXJyeSBhbgorCSAqIEludGVnZXItdmFsdWVkIHByb3BlcnR5LiBUaGUgYm9keSBkZWNsYXJhdGlvbiB3aXRoIHRoZSBsb3dlciB2YWx1ZQorCSAqIGNvbWVzIGJlZm9yZSB0aGUgb25lIHdpdGggdGhlIGhpZ2hlciB2YWx1ZS4gVGhlIGV4YWN0IG51bWVyaWMgdmFsdWUKKwkgKiBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzIHVuc3BlY2lmaWVkLgorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBFeGFtcGxlIHVzYWdlOgorCSAqIDxwcmU+CisJICogQm9keURlY2xhcmF0aW9uIGIxID0gKEJvZHlEZWNsYXJhdGlvbikgb2JqZWN0MTsKKwkgKiBCb2R5RGVjbGFyYXRpb24gYjIgPSAoQm9keURlY2xhcmF0aW9uKSBvYmplY3QyOworCSAqIEludGVnZXIgaTEgPSAoSW50ZWdlcikgYjEuZ2V0UHJvcGVydHkoUkVMQVRJVkVfT1JERVIpOworCSAqIEludGVnZXIgaTIgPSAoSW50ZWdlcikgYjIuZ2V0UHJvcGVydHkoUkVMQVRJVkVfT1JERVIpOworCSAqIHJldHVybiBpMS5pbnRWYWx1ZSgpIC0gaTIuaW50VmFsdWUoKTsgLy8gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIKKwkgKiA8L3ByZT4KKwkgKiA8L3A+CisJICogCisJICogQHNlZSAjc29ydAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSVZFX09SREVSID0gInJlbGF0aXZlT3JkZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZW9yZGVycyB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LiBUaGUgY2FsbGVyIGlzCisJICogcmVzcG9uc2libGUgZm9yIGFycmFuZ2luZyBpbiBhZHZhbmNlIHRoYXQgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgaXMKKwkgKiBhIHdvcmtpbmcgY29weSwgYW5kIGZvciBzYXZpbmcgdGhlIGNoYW5nZXMgYWZ0ZXJ3YXJkcy4KKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVvcmRlcmluZyB0aGUgbWVtYmVycyB3aXRoaW4gYSB0eXBlIGRlY2xhcmF0aW9uIG1pZ2h0IGJlCisJICogbW9yZSB0aGFuIGEgY29zbWV0aWMgY2hhbmdlIGFuZCBjb3VsZCBoYXZlIHBvdGVudGlhbGx5IHNlcmlvdXMKKwkgKiByZXBlcmN1c3Npb25zLiBGaXJzdGx5LCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpZWxkcyBvZiBhIHR5cGUgYXJlCisJICogaW5pdGlhbGl6ZWQgaXMgc2lnbmlmaWNhbnQgaW4gdGhlIEphdmEgbGFuZ3VhZ2U7IHJlb3JkZXJpbmcgZmllbGRzCisJICogYW5kIGluaXRpYWxpemVycyBtYXkgcmVzdWx0IGluIGNvbXBpbGF0aW9uIGVycm9ycyBvciBjaGFuZ2UgdGhlIGV4ZWN1dGlvbgorCSAqIGJlaGF2aW9yIG9mIHRoZSBjb2RlLiBTZWNvbmRseSwgcmVvcmRlcmluZyBhIGNsYXNzJ3MgbWVtYmVycyBtYXkgYWZmZWN0CisJICogaG93IGl0cyBpbnN0YW5jZXMgYXJlIHNlcmlhbGl6ZWQuIFRoaXMgb3BlcmF0aW9uIHNob3VsZCB0aGVyZWZvcmUgYmUgdXNlZAorCSAqIHdpdGggY2F1dGlvbiBhbmQgZHVlIGNvbmNlcm4gZm9yIHBvdGVudGlhbCBuZWdhdGl2ZSBzaWRlIGVmZmVjdHMuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBvcHRpb25hbCA8Y29kZT5wb3NpdGlvbnM8L2NvZGU+IGFycmF5IGNvbnRhaW5zIGEgbm9uLWRlY3JlYXNpbmcgCisJICogb3JkZXJlZCBsaXN0IG9mIGNoYXJhY3Rlci1iYXNlZCBzb3VyY2UgcG9zaXRpb25zIHdpdGhpbiB0aGUgY29tcGlsYXRpb24KKwkgKiB1bml0J3Mgc291cmNlIGNvZGUgc3RyaW5nLiBVcG9uIHJldHVybiBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgcG9zaXRpb25zIGluCisJICogdGhlIGFycmF5IHJlZmxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgbmV3IGxvY2F0aW9ucyBpbiB0aGUgbW9kaWZpZWQgc291cmNlCisJICogY29kZSBzdHJpbmcsIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBtb2RpZmllcyB0aGUgZ2l2ZW4gYXJyYXkgaW4gcGxhY2UuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSA8Y29kZT5jb21wYXJlPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGdpdmVuIGNvbXBhcmF0b3IgaXMgcGFzc2VkIHBhaXJzCisJICogb2YgQVNUIGJvZHkgZGVjbGFyYXRpb25zIChzdWJjbGFzc2VzIG9mIDxjb2RlPkJvZHlEZWNsYXJhdGlvbjwvY29kZT4pIAorCSAqIHJlcHJlc2VudGluZyBib2R5IGRlY2xhcmF0aW9ucyBhdCB0aGUgc2FtZSBsZXZlbC4gVGhlIGNvbXBhcmF0b3IgaXMKKwkgKiBjYWxsZWQgb24gYm9keSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIGNsYXNzZXMsIGluY2x1ZGluZyBhbm9ueW1vdXMgYW5kCisJICogbG9jYWwgY2xhc3NlcywgYnV0IGFsd2F5cyBhdCB0aGUgc2FtZSBsZXZlbC4gQ2xpZW50cyBuZWVkIHRvIHByb3ZpZGUKKwkgKiBhIGNvbXBhcmF0b3IgaW1wbGVtZW50YXRpb24gKHRoZXJlIGlzIG5vIHN0YW5kYXJkIGNvbXBhcmF0b3IpLiBUaGUKKwkgKiA8Y29kZT5SRUxBVElWRV9PUkRFUjwvY29kZT4gcHJvcGVydHkgYXR0YWNoZWQgdG8gdGhlc2UgQVNUIG5vZGVzIGFmZm9ydHMKKwkgKiB0aGUgY29tcGFyYXRvciBhIHdheSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcmVsYXRpdmUgb3JkZXIuCisJICogPC9wPgorCSAqIDxwPgorCSAqIFRoZSBib2R5IGRlY2xhcmF0aW9ucyBwYXNzZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgY29tcGFyYXRvcgorCSAqIGFsd2F5cyBjYXJyeSBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc2lnbmF0dXJlIGluZm9ybWF0aW9uOgorCSAqIDxicj4KKwkgKiA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iODAlIiBjZWxscGFkZGluZz0iNSI+CisJICoJICA8dHI+CisJICoJICAgIDx0ZCB3aWR0aD0iMjAlIj48Y29kZT5UeXBlRGVjbGFyYXRpb248L2NvZGU+PC90ZD4KKwkgKgkgICAgPHRkIHdpZHRoPSI1MCUiPjxjb2RlPm1vZGlmaWVycywgaXNJbnRlcmZhY2UsIG5hbWUsIHN1cGVyY2xhc3MsCisJICoJICAgICAgc3VwZXJJbnRlcmZhY2VzPGJyPgorICAgICAqCQkgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPjwvdGQ+CisJICoJICA8L3RyPgorCSAqCSAgPHRyPgorCSAqCSAgICA8dGQgd2lkdGg9IjIwJSI+PGNvZGU+RmllbGREZWNsYXJhdGlvbjwvY29kZT48L3RkPgorCSAqCSAgICA8dGQgd2lkdGg9IjUwJSI+PGNvZGU+bW9kaWZpZXJzLCB0eXBlLCBmcmFnbWVudHMKKwkgKiAgICAgICAgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudHMKKwkgKgkgICAgICB3aXRoIG5hbWUgb25seSk8YnI+CisgICAgICoJCSAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+PC90ZD4KKwkgKgkgIDwvdHI+CisJICoJICA8dHI+CisJICoJICAgIDx0ZCB3aWR0aD0iMjAlIj48Y29kZT5NZXRob2REZWNsYXJhdGlvbjwvY29kZT48L3RkPgorCSAqCSAgICA8dGQgd2lkdGg9IjUwJSI+PGNvZGU+bW9kaWZpZXJzLCBpc0NvbnN0cnVjdG9yLCByZXR1cm5UeXBlLCBuYW1lLAorCSAqCQkgIHBhcmFtZXRlcnMKKwkgKgkgICAgICAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMgd2l0aCBuYW1lIGFuZCB0eXBlIG9ubHkpLAorCSAqCQkgIHRocm93bkV4Y2VwdGlvbnM8YnI+CisgICAgICoJCSAgUkVMQVRJVkVfT1JERVIgcHJvcGVydHk8L2NvZGU+PC90ZD4KKwkgKgkgIDwvdHI+CisJICoJICA8dHI+CisJICoJICAgIDx0ZCB3aWR0aD0iMjAlIj48Y29kZT5Jbml0aWFsaXplcjwvY29kZT48L3RkPgorCSAqCSAgICA8dGQgd2lkdGg9IjUwJSI+PGNvZGU+bW9kaWZpZXJzPGJyPgorICAgICAqCQkgIFJFTEFUSVZFX09SREVSIHByb3BlcnR5PC9jb2RlPjwvdGQ+CisJICoJICA8L3RyPgorCSAqIDwvdGFibGU+CisJICogQ2xpZW50cyBzaG91bGQgcmVseSBvbiB0aGUgQVNUIG5vZGVzIGJlaW5nIHByb3Blcmx5IHBhcmVudGVkIG9yIG9uCisJICogaGF2aW5nIHNvdXJjZSByYW5nZSBpbmZvcm1hdGlvbi4gKEZ1dHVyZSByZWxlYXNlcyBtYXkgcHJvdmlkZSBvcHRpb25zCisJICogZm9yIHJlcXVlc3RpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIHNvdXJjZSBwb3NpdGlvbnMsIGZ1bGwgQVNUcywKKwkgKiBub24tcmVjdXJzaXZlIHNvcnRpbmcsIGV0Yy4pCisJICogPC9wPgorCSAqCisJICogQHBhcmFtIGNvbXBpbGF0aW9uVW5pdCB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgd2hpY2ggbXVzdCBiZSBhIAorCSAqIHdvcmtpbmcgY29weQorCSAqIEBwYXJhbSBwb3NpdGlvbnMgYW4gYXJyYXkgb2Ygc291cmNlIHBvc2l0aW9ucyB0byBtYXAsIG9yIAorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIElmIHN1cHBsaWVkLCB0aGUgcG9zaXRpb25zIG11c3QgCisJICogY2hhcmFjdGVyLWJhc2VkIHNvdXJjZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSBmb3IKKwkgKiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCwgYXJyYW5nZWQgaW4gbm9uLWRlY3JlYXNpbmcgb3JkZXIuCisJICogVGhlIGFycmF5IGlzIHVwZGF0ZWQgaW4gcGxhY2Ugd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRvIHJlZmxlY3QgdGhlCisJICogY29ycmVzcG9uZGluZyBzb3VyY2UgcG9zaXRpb25zIGluIHRoZSBwZXJtdXRlZCBzb3VyY2UgY29kZSBzdHJpbmcKKwkgKiAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbnkgbG9uZ2VyIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyKS4KKwkgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBjYXBhYmxlIG9mIG9yZGVyaW5nIAorCSAqICAgPGNvZGU+Qm9keURlY2xhcmF0aW9uPC9jb2RlPnMKKwkgKiBAcGFyYW0gb3B0aW9ucyBiaXR3aXNlLW9yIG9mIG9wdGlvbiBmbGFnczsgPGNvZGU+MDwvY29kZT4gZm9yIGRlZmF1bHQKKwkgKiBiZWhhdmlvciAocmVzZXJ2ZWQgZm9yIGZ1dHVyZSBncm93dGgpCisJICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gbm90aWZ5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIG5vbmUKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gdW5pdCBjb3VsZCBub3QgYmUKKwkgKiBzb3J0ZWQuIFJlYXNvbnMgaW5jbHVkZToKKwkgKiA8dWw+CisJICogPGxpPiBUaGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorCSAqIDxsaT4gVGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGEgd29ya2luZyBjb3B5IChJTlZBTElEX0VMRU1FTlRfVFlQRVMpPC9saT4KKwkgKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nCisJICogcmVzb3VyY2UKKwkgKiA8L3VsPgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IGlzIG51bGwKKwkgKiBvciBpZiB0aGUgZ2l2ZW4gY29tcGFyYXRvciBpcyBudWxsLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbgorCSAqIEBzZWUgI1JFTEFUSVZFX09SREVSCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCisJICAgICAgICBpbnRbXSBwb3NpdGlvbnMsCisJICAgICAgICBDb21wYXJhdG9yIGNvbXBhcmF0b3IsCisJICAgICAgICBpbnQgb3B0aW9ucywKKwkgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChjb21waWxhdGlvblVuaXQgPT0gbnVsbCB8fCBjb21wYXJhdG9yID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlJQ29tcGlsYXRpb25Vbml0W10gY29tcGlsYXRpb25Vbml0cyA9IG5ldyBJQ29tcGlsYXRpb25Vbml0W10geyBjb21waWxhdGlvblVuaXQgfTsKKwkJU29ydEVsZW1lbnRzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBTb3J0RWxlbWVudHNPcGVyYXRpb24oY29tcGlsYXRpb25Vbml0cywgcG9zaXRpb25zLCBjb21wYXJhdG9yKTsKKwkJSmF2YUVsZW1lbnQucnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzLmphdmEKaW5kZXggZWFhMGU2My4uYTlhMGEwYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQXR0cmlidXRlTmFtZXNDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lBdHRyaWJ1dGVOYW1lc0NvbnN0YW50cy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lCeXRlY29kZVZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCmluZGV4IDk2OTdiOTIuLmZmZGM1ODQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUJ5dGVjb2RlVmlzaXRvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCkBAIC0yODIsNCArMjgyLDQgQEAKIAl2b2lkIF9icmVha3BvaW50KGludCBwYyk7CiAJdm9pZCBfaW1wZGVwMShpbnQgcGMpOwogCXZvaWQgX2ltcGRlcDIoaW50IHBjKTsJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YQppbmRleCA3ZGMxZTVlLi42ODQ5YWQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ2xhc3NGaWxlRGlzYXNzZW1ibGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuamF2YQppbmRleCBjZWIzYzY1Li43MTU4NWQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpAQCAtMTUsNiArMTUsNyBAQAogICogSUNsYXNzRmlsZVJlYWRlciBvbnRvIGEgU3RyaW5nIHVzaW5nIHRoZSBwcm9wZXIgbGluZSBzZXBhcmF0b3IuCiAgKiAKICAqIEBzaW5jZSAyLjAKKyAqIEBkZXByZWNhdGVkIC0gc2hvdWxkIHVzZSBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciBpbnN0ZWFkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzRmlsZURpc2Fzc2VtYmxlciB7CiAJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDbGFzc0ZpbGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZVJlYWRlci5qYXZhCmluZGV4IDJlMTM2YjAuLjA3YjNiZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNsYXNzRmlsZVJlYWRlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCkBAIC0yMjgsNCArMjI4LDQgQEAKIAkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWV0aG9kIGluZm9zCiAJICovCiAJaW50IGdldE1ldGhvZHNDb3VudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvZGVBdHRyaWJ1dGUuamF2YQppbmRleCBiNmE4YzY0Li4zY2IwMWU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb2RlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29kZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCkBAIC0xMDYsNCArMTA2LDQgQEAKIAkgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXhjZXB0aW9uIEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIG9wY29kZXMgY29udGFpbiBpbnZhbGlkIGJ5dGVzCiAJICovCiAJdm9pZCB0cmF2ZXJzZShJQnl0ZWNvZGVWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhCmluZGV4IGVkMzExYjkuLjcyM2ExMWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xDb25zdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sQ29uc3RhbnQuamF2YQppbmRleCA0YmU0NzQ5Li4wOTUwNzMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xDb25zdGFudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbENvbnN0YW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFBvb2xFbnRyeS5qYXZhCmluZGV4IDIwN2VkNDAuLmY2ZjU2ZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50UG9vbEVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRQb29sRW50cnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGQyNzhkNzQuLjEzMGZmOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUNvbnN0YW50VmFsdWVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lDb25zdGFudFZhbHVlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKaW5kZXggM2NkMmE5NS4uODI2YWZmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvblRhYmxlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUV4Y2VwdGlvblRhYmxlRW50cnkuamF2YQppbmRleCA1NWI2NzRiLi4wOTU0MzdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lFeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lGaWVsZEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCmluZGV4IDQ4ZGUwNGIuLjA0MGZhNTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUZpZWxkSW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCkBAIC0xMDcsNCArMTA3LDQgQEAKIAkgKiBSZXR1cm5zIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQogCSAqLwogCUlDbGFzc0ZpbGVBdHRyaWJ1dGVbXSBnZXRBdHRyaWJ1dGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQppbmRleCA0ZjBkNjYzLi5mYjgzMTdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKaW5kZXggMzIxMTQxOS4uMjA2MTgxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbDsKIAogLyoqCkBAIC04Myw0ICs4Myw0IEBACiAJICovCiAJY2hhcltdIGdldElubmVyQ2xhc3NOYW1lKCk7CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMaW5lTnVtYmVyQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMaW5lTnVtYmVyQXR0cmlidXRlLmphdmEKaW5kZXggZGIyOGRiMC4uM2QwZWMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxpbmVOdW1iZXJBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IGYxM2Y2M2EuLjM1NjE3NjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lMb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCmluZGV4IGY2YmQ5MjIuLjAwZDlkOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTWV0aG9kSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTWV0aG9kSW5mby5qYXZhCmluZGV4IDUxNjNjMDQuLjc5Y2Q2ZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1ldGhvZEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNZXRob2RJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKQEAgLTEzNCw0ICsxMzQsNCBAQAogCSAqIFJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCiAJICovCiAJSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNb2RpZmllckNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JTW9kaWZpZXJDb25zdGFudHMuamF2YQppbmRleCA0YTM5ZGFhLi40OWJkNTJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL0lNb2RpZmllckNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU1vZGlmaWVyQ29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSU9wY29kZU1uZW1vbmljcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JT3Bjb2RlTW5lbW9uaWNzLmphdmEKaW5kZXggNjE3OGVjNC4uMDA4OWIwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JT3Bjb2RlTW5lbW9uaWNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JT3Bjb2RlTW5lbW9uaWNzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvSVNvdXJjZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU291cmNlQXR0cmlidXRlLmphdmEKaW5kZXggZmJjZjBjNi4uOTE2YjU1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU291cmNlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9JU291cmNlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvT3Bjb2RlU3RyaW5nVmFsdWVzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvY29yZS91dGlsL09wY29kZVN0cmluZ1ZhbHVlcy5qYXZhCmluZGV4IDQyMGQzN2YuLjM0ZDk3ZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9jb3JlL3V0aWwvT3Bjb2RlU3RyaW5nVmFsdWVzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2NvcmUvdXRpbC9PcGNvZGVTdHJpbmdWYWx1ZXMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWw7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQXNzZXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YQppbmRleCAyMTNlZjI3Li4zMjRhMDhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKQEAgLTYxLDcgKzYxLDcgQEAKICAqLwogcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewogCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihVdGlsLmJpbmQoImFzc2VydC5udWxsQXJndW1lbnQiLG1lc3NhZ2UpKTsgLy8kTk9OLU5MUy0xJAorCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJudWxsIGFyZ3VtZW50OyAiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKIH0KIC8qKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMKICAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgpAQCAtODQsNyArODQsNyBAQAogICovCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKIAlpZiAoIWV4cHJlc3Npb24pCi0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJhc3NlcnQuZmFpbGVkIiwgbWVzc2FnZSkpOyAvLyROT04tTkxTLTEkCisJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIkFzc2VydGlvbiBmYWlsZWQ7ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAogCXJldHVybiBleHByZXNzaW9uOwogfQogCkBAIC05NSw0ICs5NSw0IEBACiAJCQlzdXBlcihkZXRhaWwpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Jhc2ljQ29tcGlsYXRpb25Vbml0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CYXNpY0NvbXBpbGF0aW9uVW5pdC5qYXZhCmluZGV4IGY3YWZhMjEuLmQyZWI1YWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Jhc2ljQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmFzaWNDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMSwxOCArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCkBAIC01Myw3ICs1NCw3IEBACiAJCXJldHVybiBVdGlsLmdldEZpbGVDaGFyQ29udGVudChuZXcgRmlsZShuZXcgU3RyaW5nKGZpbGVOYW1lKSksIHRoaXMuZW5jb2RpbmcpOwogCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAl9Ci0JcmV0dXJuIG5ldyBjaGFyWzBdOworCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiB9CiBwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgewogCXJldHVybiB0aGlzLmZpbGVOYW1lOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmF0Y2hPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JhdGNoT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4ODIxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JhdGNoT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQW4gb3BlcmF0aW9uIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgYSBjYWxsIHRvIEphdmFDb3JlLnJ1bihJV29ya3NwYWNlUnVubmFibGUsIElQcm9ncmVzc01vbml0b3IpCisgKiB0aGF0IGVuY2Fwc3VsYXRlcyBhIHVzZXIgZGVmaW5lZCBJV29ya3NwYWNlUnVubmFibGUuCisgKi8KK3B1YmxpYyBjbGFzcyBCYXRjaE9wZXJhdGlvbiBleHRlbmRzIEphdmFNb2RlbE9wZXJhdGlvbiB7CisJcHJvdGVjdGVkIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZTsKKwlwdWJsaWMgQmF0Y2hPcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisJCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxPcGVyYXRpb24jZXhlY3V0ZU9wZXJhdGlvbigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5ydW5uYWJsZS5ydW4oZk1vbml0b3IpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlpZiAoY2UgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5PUEVSQVRJT05fRkFJTEVEKSB7CisJCQkJCVRocm93YWJsZSBlPSBjZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKKwkJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7CisJCQkJCX0KKwkJCQl9CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7CisJCQl9CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsT3BlcmF0aW9uI3ZlcmlmeSgpCisJICovCisJcHJvdGVjdGVkIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCQkvLyBjYW5ub3QgdmVyaWZ5IHVzZXIgZGVmaW5lZCBvcGVyYXRpb24KKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwl9CisKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlGaWVsZC5qYXZhCmluZGV4IDc1ZDBhOWUuLmExNjA1MzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5RmllbGQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwpAQCAtMzIsMTQgKzMyLDE0IEBACiAgKiBAc2VlIElGaWVsZAogICovCiBwdWJsaWMgT2JqZWN0IGdldENvbnN0YW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeUZpZWxkIGluZm8gPSAoSUJpbmFyeUZpZWxkKSBnZXRFbGVtZW50SW5mbygpOwogCXJldHVybiBjb252ZXJ0Q29uc3RhbnQoaW5mby5nZXRDb25zdGFudCgpKTsKIH0KIC8qKgogICogQHNlZSBJTWVtYmVyCiAgKi8KIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQmluYXJ5RmllbGQgaW5mbyA9IChJQmluYXJ5RmllbGQpIGdldFJhd0luZm8oKTsKKwlJQmluYXJ5RmllbGQgaW5mbyA9IChJQmluYXJ5RmllbGQpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uZ2V0TW9kaWZpZXJzKCk7CiB9CiAvKioKQEAgLTUyLDcgKzUyLDcgQEAKICAqIEBzZWUgSUZpZWxkCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlGaWVsZCBpbmZvID0gKElCaW5hcnlGaWVsZCkgZ2V0UmF3SW5mbygpOworCUlCaW5hcnlGaWVsZCBpbmZvID0gKElCaW5hcnlGaWVsZCkgZ2V0RWxlbWVudEluZm8oKTsKIAlyZXR1cm4gbmV3IFN0cmluZyhDbGFzc0ZpbGUudHJhbnNsYXRlZE5hbWUoaW5mby5nZXRUeXBlTmFtZSgpKSk7CiB9CiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEKaW5kZXggMzZlODk0ZC4uNjhkZjYwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5TWVtYmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzUsOSArMzUsMTIgQEAKIC8qKgogICogQHNlZSBJU291cmNlUmVmZXJlbmNlCiAgKi8KLXB1YmxpYyBJU291cmNlUmFuZ2UgZ2V0TmFtZVJhbmdlKCkgeworcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlTb3VyY2VNYXBwZXIgbWFwcGVyPSBnZXRTb3VyY2VNYXBwZXIoKTsKIAlpZiAobWFwcGVyICE9IG51bGwpIHsKKwkJLy8gZW5zdXJlIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyIGlzIG9wZW4gc28gdGhhdCBzb3VyY2UgcmFuZ2VzIGFyZSBjb21wdXRlZAorCQkoKENsYXNzRmlsZSlnZXRDbGFzc0ZpbGUoKSkuZ2V0QnVmZmVyKCk7CisJCQogCQlyZXR1cm4gbWFwcGVyLmdldE5hbWVSYW5nZSh0aGlzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gU291cmNlTWFwcGVyLmZnVW5rbm93blJhbmdlOwpAQCAtNDksNiArNTIsOSBAQAogcHVibGljIElTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOwogCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQkvLyBlbnN1cmUgdGhlIGNsYXNzIGZpbGUncyBidWZmZXIgaXMgb3BlbiBzbyB0aGF0IHNvdXJjZSByYW5nZXMgYXJlIGNvbXB1dGVkCisJCSgoQ2xhc3NGaWxlKWdldENsYXNzRmlsZSgpKS5nZXRCdWZmZXIoKTsKKwogCQlyZXR1cm4gbWFwcGVyLmdldFNvdXJjZVJhbmdlKHRoaXMpOwogCX0gZWxzZSB7CiAJCXJldHVybiBTb3VyY2VNYXBwZXIuZmdVbmtub3duUmFuZ2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1ldGhvZC5qYXZhCmluZGV4IDhlMjNiZDMuLjBlZTE1YjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1ldGhvZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeU1ldGhvZC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKQEAgLTEwMyw3ICsxMDMsNyBAQAogICovCiBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoZkV4Y2VwdGlvblR5cGVzID09IG51bGwpIHsKLQkJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldFJhd0luZm8oKTsKKwkJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJCWNoYXJbXVtdIGVUeXBlTmFtZXMgPSBpbmZvLmdldEV4Y2VwdGlvblR5cGVOYW1lcygpOwogCQlpZiAoZVR5cGVOYW1lcyA9PSBudWxsIHx8IGVUeXBlTmFtZXMubGVuZ3RoID09IDApIHsKIAkJCWZFeGNlcHRpb25UeXBlcyA9IGZnRW1wdHlMaXN0OwpAQCAtMTI3LDcgKzEyNyw3IEBACiAgKiBAc2VlIElNZW1iZXIKICAqLwogcHVibGljIGludCBnZXRGbGFncygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uZ2V0TW9kaWZpZXJzKCk7CiB9CiAvKioKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQl9CiAJCS8vIGlmIHN0aWxsIG5vIHBhcmFtZXRlciBuYW1lcywgcHJvZHVjZSBmYWtlIG9uZXMKIAkJaWYgKGZQYXJhbWV0ZXJOYW1lcyA9PSBudWxsKSB7Ci0JCQlJQmluYXJ5TWV0aG9kIGluZm8gPSAoSUJpbmFyeU1ldGhvZCkgZ2V0UmF3SW5mbygpOworCQkJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChuZXcgU3RyaW5nKGluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcigpKSk7CiAJCQlmUGFyYW1ldGVyTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtQ291bnRdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUNvdW50OyBpKyspIHsKQEAgLTIwNyw3ICsyMDcsNyBAQAogICogQHNlZSBJTWV0aG9kCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJaWYgKGZSZXR1cm5UeXBlID09IG51bGwpIHsKIAkJU3RyaW5nIHJldHVyblR5cGU9IFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKIAkJZlJldHVyblR5cGU9IG5ldyBTdHJpbmcoQ2xhc3NGaWxlLnRyYW5zbGF0ZWROYW1lKHJldHVyblR5cGUudG9DaGFyQXJyYXkoKSkpOwpAQCAtMjE4LDE0ICsyMTgsMTQgQEAKICAqIEBzZWUgSU1ldGhvZAogICovCiBwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIG5ldyBTdHJpbmcoaW5mby5nZXRNZXRob2REZXNjcmlwdG9yKCkpOwogfQogLyoqCiAgKiBAc2VlIElNZXRob2QKICAqLwogcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlNZXRob2QgaW5mbyA9IChJQmluYXJ5TWV0aG9kKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeU1ldGhvZCBpbmZvID0gKElCaW5hcnlNZXRob2QpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uaXNDb25zdHJ1Y3RvcigpOwogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CaW5hcnlUeXBlLmphdmEKaW5kZXggZmQ0ZDU3YS4uNGRlMWNhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQmluYXJ5VHlwZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0JpbmFyeVR5cGUuamF2YQpAQCAtMSwzNyArMSwyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuQ29tcGxldGlvbkVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5LlR5cGVIaWVyYXJjaHk7CiAKIC8qKgogICogUGFyZW50IGlzIGFuIElDbGFzc0ZpbGUuCkBAIC01OCwyNiArNDYsMzYgQEAKIAkKIAlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7CiAJaWYgKGluZm8gIT0gbnVsbCkgewotCQlDbGFzc0ZpbGVJbmZvIGNmaSA9IGdldENsYXNzRmlsZUluZm8oKTsKLQkJaWYgKGNmaS5oYXNSZWFkQmluYXJ5Q2hpbGRyZW4oKSkgewotCQkJdHJ5IHsKLQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKLQkJCQkJSmF2YUVsZW1lbnQgY2hpbGQgPSAoSmF2YUVsZW1lbnQpIGNoaWxkcmVuW2ldOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCaW5hcnlUeXBlKSB7Ci0JCQkJCQkoKElPcGVuYWJsZSljaGlsZC5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNoaWxkLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlib29sZWFuIHdhc1ZlcmJvc2UgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNMT1NJTkcgRWxlbWVudCAoIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiKTogIiArIHRoaXMudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQl3YXNWZXJib3NlID0gdHJ1ZTsKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UgPSBmYWxzZTsKIAkJCX0KLQkJfQotCQljbG9zaW5nKGluZm8pOwotCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVJbmZvKHRoaXMpOwotCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gUGFja2FnZSBjYWNoZSBzaXplID0gIiArIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNhY2hlLnBrZ1NpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gT3BlbmFibGUgY2FjaGUgZmlsbGluZyByYXRpbyA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5vcGVuYWJsZUZpbGxpbmdSYXRpbygpICsgIiUiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCUNsYXNzRmlsZUluZm8gY2ZpID0gZ2V0Q2xhc3NGaWxlSW5mbygpOworCQkJaWYgKGNmaS5oYXNSZWFkQmluYXJ5Q2hpbGRyZW4oKSkgeworCQkJCXRyeSB7CisJCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKKwkJCQkJCUphdmFFbGVtZW50IGNoaWxkID0gKEphdmFFbGVtZW50KSBjaGlsZHJlbltpXTsKKwkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJpbmFyeVR5cGUpIHsKKwkJCQkJCQkoKElPcGVuYWJsZSljaGlsZC5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY2hpbGQuY2xvc2UoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQkJY2xvc2luZyhpbmZvKTsKKwkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZUluZm8odGhpcyk7CisJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IFBhY2thZ2UgY2FjaGUgc2l6ZSA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5wa2dTaXplKCkpOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCItPiBPcGVuYWJsZSBjYWNoZSBmaWxsaW5nIHJhdGlvID0gIiArIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNhY2hlLm9wZW5hYmxlRmlsbGluZ1JhdGlvKCkgKyAiJSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFID0gd2FzVmVyYm9zZTsKIAkJfQogCX0KIH0KQEAgLTg1LDkgKzgzLDYgQEAKICAqIFJlbW92ZSBteSBjYWNoZWQgY2hpbGRyZW4gZnJvbSB0aGUgSmF2YSBNb2RlbAogICovCiBwcm90ZWN0ZWQgdm9pZCBjbG9zaW5nKE9iamVjdCBpbmZvKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFKXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDTE9TSU5HIEVsZW1lbnQgKCIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkrIik6ICIgKyB0aGlzLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQogCUNsYXNzRmlsZUluZm8gY2ZpID0gZ2V0Q2xhc3NGaWxlSW5mbygpOwogCWNmaS5yZW1vdmVCaW5hcnlDaGlsZHJlbigpOwogCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpewpAQCAtMTAyLDE0ICs5NywxNCBAQAogCWlmIChyZXF1ZXN0b3IgPT0gbnVsbCkgewogCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiY29kZUFzc2lzdC5udWxsUmVxdWVzdG9yIikpOyAvLyROT04tTkxTLTEkCiAJfQotCQotCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IChTZWFyY2hhYmxlRW52aXJvbm1lbnQpICgoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCkpLmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsKLQlOYW1lTG9va3VwIG5hbWVMb29rdXAgPSAoKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpKS5nZXROYW1lTG9va3VwKCk7Ci0JQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvcixuYW1lTG9va3VwKSwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpOworCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IChTZWFyY2hhYmxlRW52aXJvbm1lbnQpIHByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpOworCUNvbXBsZXRpb25FbmdpbmUgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUoZW52aXJvbm1lbnQsIG5ldyBDb21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlcihyZXF1ZXN0b3IsbmFtZUxvb2t1cCksIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwgcHJvamVjdCk7CiAJCiAJU3RyaW5nIHNvdXJjZSA9IGdldENsYXNzRmlsZSgpLmdldFNvdXJjZSgpOwogCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBpbnNlcnRpb24gPiAtMSAmJiBpbnNlcnRpb24gPCBzb3VyY2UubGVuZ3RoKCkpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOyAKKwkJU3RyaW5nIGVuY29kaW5nID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSk7IAogCQkKIAkJY2hhcltdIHByZWZpeCA9IENoYXJPcGVyYXRpb24uY29uY2F0KHNvdXJjZS5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uKS50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdeyd7J30pOwogCQljaGFyW10gc3VmZml4ID0gIENoYXJPcGVyYXRpb24uY29uY2F0KG5ldyBjaGFyW117J30nfSwgc291cmNlLnN1YnN0cmluZyhpbnNlcnRpb24pLnRvQ2hhckFycmF5KCkpOwpAQCAtMTg2LDcgKzE4MSw3IEBACiAJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLmdldENsYXNzRmlsZSgpOwogCWlmIChjbGFzc0ZpbGUuaXNPcGVuKCkpIHsKIAkJdHJ5IHsKLQkJCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9ICgoSUJpbmFyeVR5cGUpIGdldFJhd0luZm8oKSkuZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKTsKKwkJCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9ICgoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCkpLmdldEVuY2xvc2luZ1R5cGVOYW1lKCk7CiAJCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWUgPT0gbnVsbCkgewogCQkJCXJldHVybiBudWxsOwogCQkJfQpAQCAtMjU0LDcgKzI0OSw3IEBACiAgKiBAc2VlIElNZW1iZXIjZ2V0RmxhZ3MoKQogICovCiBwdWJsaWMgaW50IGdldEZsYWdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0UmF3SW5mbygpOworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uZ2V0TW9kaWZpZXJzKCk7CiB9CiAvKioKQEAgLTMyNSw3ICszMjAsNyBAQAogICogQHNlZSBJVHlwZSNnZXRTdXBlcmNsYXNzTmFtZSgpCiAgKi8KIHB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0RWxlbWVudEluZm8oKTsKIAljaGFyW10gc3VwZXJjbGFzc05hbWUgPSBpbmZvLmdldFN1cGVyY2xhc3NOYW1lKCk7CiAJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7CkBAIC0zMzYsNyArMzMxLDcgQEAKICAqIEBzZWUgSVR5cGUjZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpCiAgKi8KIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBlckludGVyZmFjZU5hbWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0UmF3SW5mbygpOworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCk7CiAJY2hhcltdW10gbmFtZXM9IGluZm8uZ2V0SW50ZXJmYWNlTmFtZXMoKTsKIAlpbnQgbGVuZ3RoOwogCWlmIChuYW1lcyA9PSBudWxsIHx8IChsZW5ndGggPSBuYW1lcy5sZW5ndGgpID09IDApIHsKQEAgLTQwNyw3ICs0MDIsNyBAQAogICogQHNlZSBJVHlwZSNpc0Fub255bW91cygpCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0UmF3SW5mbygpOworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uaXNBbm9ueW1vdXMoKTsKIH0KIC8qKgpAQCAtNDIwLDcgKzQxNSw3IEBACiAgKiBAc2VlIElUeXBlI2lzSW50ZXJmYWNlKCkKICAqLwogcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRSYXdJbmZvKCk7CisJSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0RWxlbWVudEluZm8oKTsKIAlyZXR1cm4gaW5mby5pc0ludGVyZmFjZSgpOwogfQogCkBAIC00MjgsMTcgKzQyMywyMyBAQAogICogQHNlZSBJVHlwZSNpc0xvY2FsKCkKICAqLwogcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldFJhd0luZm8oKTsKKwlJQmluYXJ5VHlwZSBpbmZvID0gKElCaW5hcnlUeXBlKSBnZXRFbGVtZW50SW5mbygpOwogCXJldHVybiBpbmZvLmlzTG9jYWwoKTsKIH0KIC8qKgogICogQHNlZSBJVHlwZSNpc01lbWJlcigpCiAgKi8KIHB1YmxpYyBib29sZWFuIGlzTWVtYmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJpbmFyeVR5cGUgaW5mbyA9IChJQmluYXJ5VHlwZSkgZ2V0UmF3SW5mbygpOworCUlCaW5hcnlUeXBlIGluZm8gPSAoSUJpbmFyeVR5cGUpIGdldEVsZW1lbnRJbmZvKCk7CiAJcmV0dXJuIGluZm8uaXNNZW1iZXIoKTsKIH0KIC8qKgorICogQHNlZSBJVHlwZQorICovCitwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbG9hZFR5cGVIaWVyYWNoeShJbnB1dFN0cmVhbSBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gVHlwZUhpZXJhcmNoeS5sb2FkKHRoaXMsIGlucHV0KTsKK30KKy8qKgogICogQHNlZSBJVHlwZSNuZXdTdXBlcnR5cGVIaWVyYXJjaHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogICovCiBwdWJsaWMgSVR5cGVIaWVyYXJjaHkgbmV3U3VwZXJ0eXBlSGllcmFyY2h5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CkBAIC00ODUsOCArNDg2LDggQEAKIAl9CiAJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24oCiAJCXRoaXMsIAotCQludWxsLCAvLyBubyB3b3JraW5nIGNvcGllcwotCQlTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cHJvamVjdH0pLCAKKwkJKElXb3JraW5nQ29weVtdKW51bGwsIC8vIG5vIHdvcmtpbmcgY29waWVzCisJCXByb2plY3QsIAogCQl0cnVlKTsKIAlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOwogCXJldHVybiBvcC5nZXRSZXN1bHQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyLmphdmEKaW5kZXggODdmYmE1Ni4uNjdiMjY5NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0yMCwxMyArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5CdWZmZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogCiAvKioKICAqIEBzZWUgSUJ1ZmZlcgpAQCAtMzM2LDcgKzMzMCw3IEBACiAJCQkKIAkJLy8gdXNlIGEgcGxhdGZvcm0gb3BlcmF0aW9uIHRvIHVwZGF0ZSB0aGUgcmVzb3VyY2UgY29udGVudHMKIAkJdHJ5IHsKLQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCVN0cmluZyBlbmNvZGluZyA9ICgoSUphdmFFbGVtZW50KXRoaXMub3duZXIpLmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCQkJU3RyaW5nIGNvbnRlbnRzID0gdGhpcy5nZXRDb250ZW50cygpOwogCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHJldHVybjsKIAkJCWJ5dGVbXSBieXRlcyA9IGVuY29kaW5nID09IG51bGwgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyQ2FjaGUuamF2YQppbmRleCA0M2YyZDkyLi43MjcxNmZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlckNhY2hlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9CdWZmZXJNYW5hZ2VyLmphdmEKaW5kZXggOGExZTYyNi4uNDY3MjI0NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQnVmZmVyTWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0J1ZmZlck1hbmFnZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGUuamF2YQppbmRleCA2ZTFmZGMwLi5hNTQzNWI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwpAQCAtNjksMTMgKzY4LDEzIEBACiBwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7CiAJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKLQkJCisJCVN0cmluZyBlbmNvZGluZyA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSk7CisJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldEVsZW1lbnROYW1lKCk7CiAJCUJhc2ljQ29tcGlsYXRpb25Vbml0IGN1ID0gCiAJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCiAJCQkJZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwgCiAJCQkJbnVsbCwKLQkJCQlnZXRFbGVtZW50TmFtZSgpICsgIi5qYXZhIiwgLy8kTk9OLU5MUy0xJAorCQkJCWVsZW1lbnROYW1lLnN1YnN0cmluZygwLCBlbGVtZW50TmFtZS5sZW5ndGgoKS0iLmNsYXNzIi5sZW5ndGgoKSkgKyAiLmphdmEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQllbmNvZGluZyk7IAogCQljb2RlQ29tcGxldGUoY3UsIGN1LCBvZmZzZXQsIHJlcXVlc3Rvcik7CiAJfQpAQCAtMjQwLDYgKzIzOSw5IEBACiAJaWYgKG1hcHBlciA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0gZWxzZSB7CisJCS8vIGVuc3VyZSB0aGlzIGNsYXNzIGZpbGUncyBidWZmZXIgaXMgb3BlbiBzbyB0aGF0IHNvdXJjZSByYW5nZXMgYXJlIGNvbXB1dGVkCisJCWdldEJ1ZmZlcigpOworCiAJCUlUeXBlIHR5cGUgPSBnZXRUeXBlKCk7CiAJCXJldHVybiBmaW5kRWxlbWVudCh0eXBlLCBwb3NpdGlvbiwgbWFwcGVyKTsKIAl9CkBAIC00MTcsNiArNDE5LDExIEBACiAJfQogCXJldHVybiBudWxsOwogfQorcHJvdGVjdGVkIHZvaWQgb3BlbldoZW5DbG9zZWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZSgpOworCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCXN1cGVyLm9wZW5XaGVuQ2xvc2VkKHBtKTsKK30KIC8qCiAgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKICAqLwpAQCAtNTI2LDcgKzUzMyw3IEBACiAgKiBAc2VlIElDb2RlQXNzaXN0I2NvZGVDb21wbGV0ZShpbnQsIElDb2RlQ29tcGxldGlvblJlcXVlc3RvcikKICAqIEBkZXByZWNhdGVkIC0gc2hvdWxkIHVzZSBjb2RlQ29tcGxldGUoaW50LCBJQ29tcGxldGlvblJlcXVlc3RvcikgaW5zdGVhZAogICovCi1wdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgZmluYWwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CitwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgZmluYWwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCiAJaWYgKHJlcXVlc3RvciA9PSBudWxsKXsKIAkJY29kZUNvbXBsZXRlKG9mZnNldCwgKElDb21wbGV0aW9uUmVxdWVzdG9yKW51bGwpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlSW5mby5qYXZhCmluZGV4IDg2M2MzM2YuLmJmZjNlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZUluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVXb3JraW5nQ29weS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NGaWxlV29ya2luZ0NvcHkuamF2YQppbmRleCAzMTAwZmUzLi42NmYzMTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc0ZpbGVXb3JraW5nQ29weS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzRmlsZVdvcmtpbmdDb3B5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CkBAIC0xNiw3ICsxNiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0Q29udGFpbmVyOwpAQCAtNDk5LDcgKzQ5OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUFzc2lzdCNjb2RlQ29tcGxldGUoaW50LCBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IpCiAJICogQGRlcHJlY2F0ZWQKIAkgKi8KLQlwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKKwlwdWJsaWMgdm9pZCBjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ2xhc3NwYXRoRW50cnkuamF2YQppbmRleCAyMTg0OGM0Li41ZjMwYzg1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DbGFzc3BhdGhFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTEsMTkgKzEsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiAKIC8qKgogICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKQEAgLTI0LDE0ICszMCwxNCBAQAogCSAqIERlc2NyaWJlcyB0aGUga2luZCBvZiBjbGFzc3BhdGggZW50cnkgLSBvbmUgb2YgCiAJICogQ1BFX1BST0pFQ1QsIENQRV9MSUJSQVJZLCBDUEVfU09VUkNFLCBDUEVfVkFSSUFCTEUgb3IgQ1BFX0NPTlRBSU5FUgogCSAqLwotCXByb3RlY3RlZCBpbnQgZW50cnlLaW5kOworCXB1YmxpYyBpbnQgZW50cnlLaW5kOwogCiAJLyoqCiAJICogRGVzY3JpYmVzIHRoZSBraW5kIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgZm91bmQgb24KIAkgKiB0aGlzIGNsYXNzcGF0aCBlbnRyeSAtIGVpdGhlciBLX0JJTkFSWSBvciBLX1NPVVJDRSBvcgogCSAqIEtfT1VUUFVULgogCSAqLwotCXByb3RlY3RlZCBpbnQgY29udGVudEtpbmQ7CisJcHVibGljIGludCBjb250ZW50S2luZDsKIAogCS8qKgogCSAqIFRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoIG9mIGEgY2xhc3NwYXRoIGVudHJ5IGRlcGVuZHMgb24gaXRzIGVudHJ5IGtpbmQ6PHVsPgpAQCAtNTMsOSArNTksMjQgQEAKIAkgKiAJcmVnaXN0ZXJlZCksIGFuZCB0aGUgcmVtYWluaW5nIHNlZ21lbnRzIGFyZSB1c2VkIGFzIGFkZGl0aW9uYWwgaGludHMgZm9yIHJlc29sdmluZyB0aGUgY29udGFpbmVyIGVudHJ5IHRvCiAJICogCWFuIGFjdHVhbCA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPi48L2xpPgogCSAqLwotCXByb3RlY3RlZCBJUGF0aCBwYXRoOworCXB1YmxpYyBJUGF0aCBwYXRoOwogCiAJLyoqCisJICogUGF0dGVybnMgYWxsb3dpbmcgdG8gZXhjbHVkZSBwb3J0aW9ucyBvZiB0aGUgcmVzb3VyY2UgdHJlZSBkZW5vdGVkIGJ5IHRoaXMgZW50cnkgcGF0aC4KKwkgKi8KKwkKKwlwdWJsaWMgSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJuczsKKwlwcml2YXRlIGNoYXJbXVtdIGZ1bGxDaGFyRXhjbHVzaW9uUGF0dGVybnM7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdW10gVU5JTklUX1BBVFRFUk5TID0gbmV3IGNoYXJbXVtdIHsgIk5vbi1pbml0aWFsaXplZCB5ZXQiLnRvQ2hhckFycmF5KCkgfTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBTdHJpbmcgcm9vdElEOworCQorCS8qKgorCSAqIERlZmF1bHQgZXhjbHVzaW9uIHBhdHRlcm4gc2V0CisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBJUGF0aFtdIE5PX0VYQ0xVU0lPTl9QQVRURVJOUyA9IHt9OworCQkJCQorCS8qKgogCSAqIERlc2NyaWJlcyB0aGUgcGF0aCB0byB0aGUgc291cmNlIGFyY2hpdmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKIAkgKiBjbGFzc3BhdGggZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgY2xhc3NwYXRoIGVudHJ5IGhhcyBubwogCSAqIHNvdXJjZSBhdHRhY2htZW50LgpAQCAtNjYsNyArODcsNyBAQAogCSAqIGFuIGFuYWxvZ291cyBmb3JtIGFuZCBtZWFuaW5nIGFzIHRoZSB2YXJpYWJsZSBwYXRoLCBuYW1lbHkgdGhlIGZpcnN0IHNlZ21lbnQgCiAJICogaXMgdGhlIG5hbWUgb2YgYSBjbGFzc3BhdGggdmFyaWFibGUuCiAJICovCi0JcHJvdGVjdGVkIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoOworCXB1YmxpYyBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKIAogCS8qKgogCSAqIERlc2NyaWJlcyB0aGUgcGF0aCB3aXRoaW4gdGhlIHNvdXJjZSBhcmNoaXZlIHdoZXJlIHBhY2thZ2UgZnJhZ21lbnRzCkBAIC03NSwxNyArOTYsMjIgQEAKIAkgKiBpZiBhbmQgb25seSBpZiA8Y29kZT5nZXRTb3VyY2VBdHRhY2htZW50UGF0aDwvY29kZT4gcmV0dXJucyAKIAkgKiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KIAkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOworCXB1YmxpYyBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7CiAKIAkvKioKKwkgKiBTcGVjaWZpYyBvdXRwdXQgbG9jYXRpb24gKGZvciB0aGlzIHNvdXJjZSBlbnRyeSkKKwkgKi8KKwlwdWJsaWMgSVBhdGggc3BlY2lmaWNPdXRwdXRMb2NhdGlvbjsKKwkKKwkvKioKIAkgKiBBIGNvbnN0YW50IGluZGljYXRpbmcgYW4gb3V0cHV0IGxvY2F0aW9uLgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEtfT1VUUFVUID0gMTA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS19PVVRQVVQgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBleHBvcnQgZmxhZwogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwb3J0ZWQ7CisJcHVibGljIGJvb2xlYW4gaXNFeHBvcnRlZDsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBjbGFzcyBwYXRoIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQga2luZCB3aXRoIHRoZSBnaXZlbiBwYXRoLgpAQCAtOTQsMTggKzEyMCwxODYgQEAKIAkJaW50IGNvbnRlbnRLaW5kLAogCQlpbnQgZW50cnlLaW5kLAogCQlJUGF0aCBwYXRoLAorCQlJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zLAogCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwKIAkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLAorCQlJUGF0aCBzcGVjaWZpY091dHB1dExvY2F0aW9uLAogCQlib29sZWFuIGlzRXhwb3J0ZWQpIHsKIAogCQl0aGlzLmNvbnRlbnRLaW5kID0gY29udGVudEtpbmQ7CiAJCXRoaXMuZW50cnlLaW5kID0gZW50cnlLaW5kOwogCQl0aGlzLnBhdGggPSBwYXRoOworCQl0aGlzLmV4Y2x1c2lvblBhdHRlcm5zID0gZXhjbHVzaW9uUGF0dGVybnM7CisJCWlmIChleGNsdXNpb25QYXR0ZXJucy5sZW5ndGggPiAwKSB7CisJCQl0aGlzLmZ1bGxDaGFyRXhjbHVzaW9uUGF0dGVybnMgPSBVTklOSVRfUEFUVEVSTlM7CisJCX0KIAkJdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRQYXRoOwogCQl0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKKwkJdGhpcy5zcGVjaWZpY091dHB1dExvY2F0aW9uID0gc3BlY2lmaWNPdXRwdXRMb2NhdGlvbjsKIAkJdGhpcy5pc0V4cG9ydGVkID0gaXNFeHBvcnRlZDsKIAl9CiAJCisJLyoKKwkgKiBSZXR1cm5zIGEgY2hhciBiYXNlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjbHVzaW9ucyBwYXR0ZXJucyBmdWxsIHBhdGguCisJICovCisJcHVibGljIGNoYXJbXVtdIGZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSB7CisKKwkJaWYgKHRoaXMuZnVsbENoYXJFeGNsdXNpb25QYXR0ZXJucyA9PSBVTklOSVRfUEFUVEVSTlMpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsKKwkJCXRoaXMuZnVsbENoYXJFeGNsdXNpb25QYXR0ZXJucyA9IG5ldyBjaGFyW2xlbmd0aF1bXTsKKwkJCUlQYXRoIHByZWZpeFBhdGggPSBwYXRoLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5mdWxsQ2hhckV4Y2x1c2lvblBhdHRlcm5zW2ldID0gCisJCQkJCXByZWZpeFBhdGguYXBwZW5kKHRoaXMuZXhjbHVzaW9uUGF0dGVybnNbaV0pLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5mdWxsQ2hhckV4Y2x1c2lvblBhdHRlcm5zOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBYTUwgZW5jb2Rpbmcgb2YgdGhlIGNsYXNzIHBhdGguCisJICovCisJcHVibGljIEVsZW1lbnQgZWxlbWVudEVuY29kZSgKKwkJRG9jdW1lbnQgZG9jdW1lbnQsCisJCUlQYXRoIHByb2plY3RQYXRoKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGhlbnRyeSIpOyAvLyROT04tTkxTLTEkCisJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJraW5kIiwga2luZFRvU3RyaW5nKHRoaXMuZW50cnlLaW5kKSk7CS8vJE5PTi1OTFMtMSQKKwkJSVBhdGggeG1sUGF0aCA9IHRoaXMucGF0aDsKKwkJaWYgKHRoaXMuZW50cnlLaW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYgdGhpcy5lbnRyeUtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKKwkJCS8vIHRyYW5zbGF0ZSB0byBwcm9qZWN0IHJlbGF0aXZlIGZyb20gYWJzb2x1dGUgKHVubGVzcyBhIGRldmljZSBwYXRoKQorCQkJaWYgKHhtbFBhdGguaXNBYnNvbHV0ZSgpKSB7CisJCQkJaWYgKHByb2plY3RQYXRoICE9IG51bGwgJiYgcHJvamVjdFBhdGguaXNQcmVmaXhPZih4bWxQYXRoKSkgeworCQkJCQlpZiAoeG1sUGF0aC5zZWdtZW50KDApLmVxdWFscyhwcm9qZWN0UGF0aC5zZWdtZW50KDApKSkgeworCQkJCQkJeG1sUGF0aCA9IHhtbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKwkJCQkJCXhtbFBhdGggPSB4bWxQYXRoLm1ha2VSZWxhdGl2ZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJeG1sUGF0aCA9IHhtbFBhdGgubWFrZUFic29sdXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInBhdGgiLCB4bWxQYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCWlmICh0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoICE9IG51bGwpIHsKKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJzb3VyY2VwYXRoIiwgdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICh0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCAhPSBudWxsKSB7CisJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgicm9vdHBhdGgiLCB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICh0aGlzLmlzRXhwb3J0ZWQpIHsKKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJleHBvcnRlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJCQorCQlpZiAodGhpcy5leGNsdXNpb25QYXR0ZXJucy5sZW5ndGggPiAwKSB7CisJCQlTdHJpbmdCdWZmZXIgZXhjbHVkZVJ1bGUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0aGlzLmV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKwkJCQlpZiAoaSA+IDApIGV4Y2x1ZGVSdWxlLmFwcGVuZCgnfCcpOworCQkJCWV4Y2x1ZGVSdWxlLmFwcGVuZCh0aGlzLmV4Y2x1c2lvblBhdHRlcm5zW2ldKTsKKwkJCX0KKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJleGNsdWRpbmciLCBleGNsdWRlUnVsZS50b1N0cmluZygpKTsgIC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJaWYgKHRoaXMuc3BlY2lmaWNPdXRwdXRMb2NhdGlvbiAhPSBudWxsKSB7CisJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHRoaXMuc3BlY2lmaWNPdXRwdXRMb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5tYWtlUmVsYXRpdmUoKTsKKwkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJvdXRwdXQiLCBvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAKKwkJfQorCQlyZXR1cm4gZWxlbWVudDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgZWxlbWVudERlY29kZShFbGVtZW50IGVsZW1lbnQsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCisJCUlQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKKwkJU3RyaW5nIGtpbmRBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImtpbmQiKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgcGF0aEF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicGF0aCIpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gZW5zdXJlIHBhdGggaXMgYWJzb2x1dGUKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhBdHRyKTsgCQkKKwkJaW50IGtpbmQgPSBraW5kRnJvbVN0cmluZyhraW5kQXR0cik7CisJCWlmIChraW5kICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgJiYga2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJiAhcGF0aC5pc0Fic29sdXRlKCkpIHsKKwkJCXBhdGggPSBwcm9qZWN0UGF0aC5hcHBlbmQocGF0aCk7CisJCX0KKwkJLy8gc291cmNlIGF0dGFjaG1lbnQgaW5mbyAob3B0aW9uYWwpCisJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoID0gCisJCQllbGVtZW50Lmhhc0F0dHJpYnV0ZSgic291cmNlcGF0aCIpCS8vJE5PTi1OTFMtMSQKKwkJCT8gbmV3IFBhdGgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNvdXJjZXBhdGgiKSkgLy8kTk9OLU5MUy0xJAorCQkJOiBudWxsOworCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSAKKwkJCWVsZW1lbnQuaGFzQXR0cmlidXRlKCJyb290cGF0aCIpIC8vJE5PTi1OTFMtMSQKKwkJCT8gbmV3IFBhdGgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJvb3RwYXRoIikpIC8vJE5PTi1OTFMtMSQKKwkJCTogbnVsbDsKKwkJCisJCS8vIGV4cG9ydGVkIGZsYWcgKG9wdGlvbmFsKQorCQlib29sZWFuIGlzRXhwb3J0ZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZXhwb3J0ZWQiKS5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJLy8gZXhjbHVzaW9uIHBhdHRlcm5zIChvcHRpb25hbCkKKwkJU3RyaW5nIGV4Y2x1c2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJleGNsdWRpbmciKTsgLy8kTk9OLU5MUy0xJCAKKwkJSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJucyA9IENsYXNzcGF0aEVudHJ5Lk5PX0VYQ0xVU0lPTl9QQVRURVJOUzsKKwkJaWYgKCFleGNsdXNpb24uZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIAorCQkJY2hhcltdW10gcGF0dGVybnMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJ3wnLCBleGNsdXNpb24udG9DaGFyQXJyYXkoKSk7CisJCQlpbnQgcGF0dGVybkNvdW50OworCQkJaWYgKChwYXR0ZXJuQ291bnQgID0gcGF0dGVybnMubGVuZ3RoKSA+IDApIHsKKwkJCQlleGNsdXNpb25QYXR0ZXJucyA9IG5ldyBJUGF0aFtwYXR0ZXJuQ291bnRdOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGF0dGVybnMubGVuZ3RoOyBqKyspeworCQkJCQlleGNsdXNpb25QYXR0ZXJuc1tqXSA9IG5ldyBQYXRoKG5ldyBTdHJpbmcocGF0dGVybnNbal0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBjdXN0b20gb3V0cHV0IGxvY2F0aW9uCisJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoIm91dHB1dCIpID8gcHJvamVjdFBhdGguYXBwZW5kKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvdXRwdXQiKSkgOiBudWxsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCisJCS8vIHJlY3JlYXRlIHRoZSBDUCBlbnRyeQorCQlzd2l0Y2ggKGtpbmQpIHsKKworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCk7CisJCQkJCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CisJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSgKKwkJCQkJCQkJCQkJCXBhdGgsCisJCQkJCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJCQkJCQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwKKwkJCQkJCQkJCQkJCWlzRXhwb3J0ZWQpOworCQkJCQorCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CisJCQkJLy8gbXVzdCBiZSBhbiBlbnRyeSBpbiB0aGlzIHByb2plY3Qgb3Igc3BlY2lmeSBhbm90aGVyIHByb2plY3QKKwkJCQlTdHJpbmcgcHJvalNlZ21lbnQgPSBwYXRoLnNlZ21lbnQoMCk7CisJCQkJaWYgKHByb2pTZWdtZW50ICE9IG51bGwgJiYgcHJvalNlZ21lbnQuZXF1YWxzKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpIHsgLy8gdGhpcyBwcm9qZWN0CisJCQkJCXJldHVybiBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoLCBleGNsdXNpb25QYXR0ZXJucywgb3V0cHV0TG9jYXRpb24pOworCQkJCX0gZWxzZSB7IC8vIGFub3RoZXIgcHJvamVjdAorCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgsIGlzRXhwb3J0ZWQpOworCQkJCX0KKworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKKwkJCQlyZXR1cm4gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeSgKKwkJCQkJCXBhdGgsCisJCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKKwkJCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgCisJCQkJCQlpc0V4cG9ydGVkKTsKKwkJCQkKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgorCQkJCXJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSgKKwkJCQkJCXBhdGgsCisJCQkJCQlpc0V4cG9ydGVkKTsKKworCQkJY2FzZSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCA6CisJCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgcmV0dXJuIG51bGw7CisJCQkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeSgKKwkJCQkJCUNsYXNzcGF0aEVudHJ5LktfT1VUUFVULAorCQkJCQkJSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZLAorCQkJCQkJcGF0aCwKKwkJCQkJCUNsYXNzcGF0aEVudHJ5Lk5PX0VYQ0xVU0lPTl9QQVRURVJOUywgCisJCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAorCQkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAorCQkJCQkJbnVsbCwgLy8gY3VzdG9tIG91dHB1dCBsb2NhdGlvbgorCQkJCQkJZmFsc2UpOworCQkJZGVmYXVsdCA6CisJCQkJdGhyb3cgbmV3IEFzc2VydC5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJjbGFzc3BhdGgudW5rbm93bktpbmQiLCBraW5kQXR0cikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIGNsYXNzcGF0aCBlbnRyeQogCSAqIHdpdGggZXF1aXZhbGVudCBhdHRyaWJ1dGVzLgpAQCAtMTQ2LDYgKzM0MCwyNyBAQAogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUlQYXRoW10gb3RoZXJFeGNsdWRlcyA9IG90aGVyRW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKTsKKwkJCWlmICh0aGlzLmV4Y2x1c2lvblBhdHRlcm5zICE9IG90aGVyRXhjbHVkZXMpeworCQkJCWludCBleGNsdWRlTGVuZ3RoID0gdGhpcy5leGNsdXNpb25QYXR0ZXJucy5sZW5ndGg7CisJCQkJaWYgKG90aGVyRXhjbHVkZXMubGVuZ3RoICE9IGV4Y2x1ZGVMZW5ndGgpIAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlTGVuZ3RoOyBpKyspIHsKKwkJCQkJLy8gY29tcGFyZSB0b1N0cmluZ3MgaW5zdGVhZCBvZiBJUGF0aHMgCisJCQkJCS8vIHNpbmNlIElQYXRoLmVxdWFscyBpcyBzcGVjaWZpZWQgdG8gaWdub3JlIHRyYWlsaW5nIHNlcGFyYXRvcnMKKwkJCQkJaWYgKCF0aGlzLmV4Y2x1c2lvblBhdHRlcm5zW2ldLnRvU3RyaW5nKCkuZXF1YWxzKG90aGVyRXhjbHVkZXNbaV0udG9TdHJpbmcoKSkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJCisJCQlvdGhlclBhdGggPSBvdGhlckVudHJ5LmdldE91dHB1dExvY2F0aW9uKCk7CisJCQlpZiAodGhpcy5zcGVjaWZpY091dHB1dExvY2F0aW9uID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXJQYXRoICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCF0aGlzLnNwZWNpZmljT3V0cHV0TG9jYXRpb24uZXF1YWxzKG90aGVyUGF0aCkpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KIAkJCXJldHVybiB0cnVlOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTY3LDYgKzM4MiwyMCBAQAogCX0KIAogCS8qKgorCSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5I2dldEV4Y2x1c2lvblBhdHRlcm5zKCkKKwkgKi8KKwlwdWJsaWMgSVBhdGhbXSBnZXRFeGNsdXNpb25QYXR0ZXJucygpIHsKKwkJcmV0dXJuIHRoaXMuZXhjbHVzaW9uUGF0dGVybnM7CisJfQorCisJLyoqCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkjZ2V0T3V0cHV0TG9jYXRpb24oKQorCSAqLworCXB1YmxpYyBJUGF0aCBnZXRPdXRwdXRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWNPdXRwdXRMb2NhdGlvbjsKKwl9CisKKwkvKioKIAkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeQogCSAqLwogCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewpAQCAtMjAyLDYgKzQzMSw0OSBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgYSA8Y29kZT5QYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiBmcm9tIGl0cyA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvcm0uCisJICovCisJc3RhdGljIGludCBraW5kRnJvbVN0cmluZyhTdHJpbmcga2luZFN0cikgeworCisJCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInByaiIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ2YXIiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU7CisJCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImNvbiIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI7CisJCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInNyYyIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U7CisJCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImxpYiIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOworCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJvdXRwdXQiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSBraW5kIG9mIGEgY2xhc3MgcGF0aCBlbnRyeS4KKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGtpbmRUb1N0cmluZyhpbnQga2luZCkgeworCisJCXN3aXRjaCAoa2luZCkgeworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgorCQkJCXJldHVybiAic3JjIjsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSAvLyROT04tTkxTLTEkCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQlyZXR1cm4gInNyYyI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKKwkJCQlyZXR1cm4gImxpYiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6CisJCQkJcmV0dXJuICJ2YXIiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKKwkJCQlyZXR1cm4gImNvbiI7IC8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQgOgorCQkJCXJldHVybiAib3V0cHV0IjsgLy8kTk9OLU5MUy0xJAorCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCiAJICogUmV0dXJucyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzcGF0aCBlbnRyeS4KIAkgKi8KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtMjUxLDYgKzUyMywyMyBAQAogCQlidWZmZXIuYXBwZW5kKCJbaXNFeHBvcnRlZDoiKTsgLy8kTk9OLU5MUy0xJAogCQlidWZmZXIuYXBwZW5kKHRoaXMuaXNFeHBvcnRlZCk7CiAJCWJ1ZmZlci5hcHBlbmQoJ10nKTsKKwkJSVBhdGhbXSBwYXR0ZXJucyA9IGdldEV4Y2x1c2lvblBhdHRlcm5zKCk7CisJCWludCBsZW5ndGg7CisJCWlmICgobGVuZ3RoID0gcGF0dGVybnMubGVuZ3RoKSA+IDApIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIltleGNsdWRpbmc6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlidWZmZXIuYXBwZW5kKHBhdHRlcm5zW2ldKTsKKwkJCQlpZiAoaSAhPSBsZW5ndGgtMSkgeworCQkJCQlidWZmZXIuYXBwZW5kKCd8Jyk7CisJCQkJfQorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgnXScpOworCQl9CisJCWlmIChnZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIltvdXRwdXQ6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisJCQlidWZmZXIuYXBwZW5kKCddJyk7CisJCX0KIAkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KIAkKQEAgLTI1OSwyMSArNTQ4LDMwIEBACiAJICogZnJhZ21lbnQgcm9vdCBjb21wdXRhdGlvbnMKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIHJvb3RJRCgpewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJc3dpdGNoKHRoaXMuZW50cnlLaW5kKXsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gIltMSUJdIit0aGlzLnBhdGg7ICAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJcmV0dXJuICJbUFJKXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJcmV0dXJuICJbU1JDXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gIltWQVJdIit0aGlzLnBhdGg7ICAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKLQkJCQlyZXR1cm4gIltDT05dIit0aGlzLnBhdGg7ICAvLyROT04tTkxTLTEkCisKKwkJaWYgKHRoaXMucm9vdElEID09IG51bGwpIHsKKwkJCXN3aXRjaCh0aGlzLmVudHJ5S2luZCl7CisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgorCQkJCQl0aGlzLnJvb3RJRCA9ICJbTElCXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6CisJCQkJCXRoaXMucm9vdElEID0gIltQUkpdIit0aGlzLnBhdGg7ICAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgorCQkJCQl0aGlzLnJvb3RJRCA9ICJbU1JDXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgorCQkJCQl0aGlzLnJvb3RJRCA9ICJbVkFSXSIrdGhpcy5wYXRoOyAgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKKwkJCQkJdGhpcy5yb290SUQgPSAiW0NPTl0iK3RoaXMucGF0aDsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCXRoaXMucm9vdElEID0gIiI7ICAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJfQogCQl9Ci0JCXJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRoaXMucm9vdElEOwogCX0KIAkKIAkvKioKQEAgLTI4NCw1ICs1ODIsNCBAQAogCQogCQlyZXR1cm4gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeSh0aGlzKTsKIAl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKaW5kZXggNzZiMTY2My4uODJkOWFiNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21taXRXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CkBAIC0xNiw4ICsxNiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAvKioKQEAgLTQ2LDEzMyArNDQsMTAyIEBACiAgKiBjb250YWluaW5nIHRoZSBjb21waWxhdGlvbiB1bml0KS4KICAqLwogcHVibGljIGNsYXNzIENvbW1pdFdvcmtpbmdDb3B5T3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKLS8qKgotICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdG8gY29tbWl0IHRoZSBjb250ZW50cyBvZiBhIHdvcmtpbmcgY29weQotICogdG8gaXRzIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyBDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbihJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIGJvb2xlYW4gZm9yY2UpIHsKLQlzdXBlcihuZXcgSUphdmFFbGVtZW50W10ge2VsZW1lbnR9LCBmb3JjZSk7Ci19Ci0vKioKLSAqIENoZWNrcyB0aGF0IHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGluIHRoZSBjb21waWxhdGlvbiB1bml0IG1hdGNoZXMgdGhlIGFjdHVhbAotICogcGFja2FnZSBmcmFnbWVudCB0aGUgQ1UgaXMgZGVmaW5lZCBpbi4KLSAqCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiB3aXRoIGFuIDxjb2RlPklOVkFMSURfUEFDS0FHRTwvY29kZT4gSmF2YU1vZGVsU3RhdHVzIGlmIHRoZQotICogcGFja2FnZSBkZWNsYXJhdGlvbiBpcyBpbnZhbGlkLgotICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFDS0FHRQotICovCi1wcml2YXRlIHZvaWQgY2hlY2tQYWNrYWdlRGVjbGFyYXRpb24oSUNvbXBpbGF0aW9uVW5pdCBjdSkKLQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IGZyYWcgPSAoSVBhY2thZ2VGcmFnbWVudCkgY3UuZ2V0UGFyZW50KCk7Ci0JSVBhY2thZ2VEZWNsYXJhdGlvbltdIGRlY2xzID0gY3UuZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpOwotCVN0cmluZyBwa2dOYW1lID0gZnJhZy5nZXRFbGVtZW50TmFtZSgpOwotCWlmIChwa2dOYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgewotCQlpZiAoZGVjbHMgIT0gbnVsbCAmJiBkZWNscy5sZW5ndGggPiAwKSB7Ci0JCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKAotCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQUNLQUdFLCAKLQkJCQkJY3UsIAotCQkJCQlkZWNsc1swXS5nZXRFbGVtZW50TmFtZSgpKSk7IAotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGRlY2xzID09IG51bGwKLQkJCXx8IGRlY2xzLmxlbmd0aCAhPSAxCi0JCQl8fCAhcGtnTmFtZS5lcXVhbHMoZGVjbHNbMF0uZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oCi0JCQkJbmV3IEphdmFNb2RlbFN0YXR1cygKLQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBQ0tBR0UsIAotCQkJCQljdSwgCi0JCQkJCShkZWNscyA9PSBudWxsIHx8IGRlY2xzLmxlbmd0aCA9PSAwKSA/IElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUgOiBkZWNsc1swXS5nZXRFbGVtZW50TmFtZSgpKSk7IAotCQl9CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdG8gY29tbWl0IHRoZSBjb250ZW50cyBvZiBhIHdvcmtpbmcgY29weQorCSAqIHRvIGl0cyBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0LgorCSAqLworCXB1YmxpYyBDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbihJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQsIGJvb2xlYW4gZm9yY2UpIHsKKwkJc3VwZXIobmV3IElKYXZhRWxlbWVudFtdIHtlbGVtZW50fSwgZm9yY2UpOwogCX0KLX0KLS8qKgotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgc2V0dGluZyB0aGUgc291cmNlCi0gKiAJb2YgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgZmFpbHMKLSAqLwotcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRyeSB7Ci0JCWJlZ2luVGFzayhVdGlsLmJpbmQoIndvcmtpbmdDb3B5LmNvbW1pdCIpLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlXb3JraW5nQ29weSBjb3B5ID0gKFdvcmtpbmdDb3B5KWdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpIGNvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JCi0JCQotCQkvLyBjcmVhdGVzIHRoZSBkZWx0YSBidWlsZGVyICh0aGlzIHJlbWVtYmVycyB0aGUgY29udGVudCBvZiB0aGUgY3UpCQotCQlpZiAoIW9yaWdpbmFsLmlzT3BlbigpKSB7Ci0JCQkvLyBmb3JjZSBvcGVuaW5nIHNvIHRoYXQgdGhlIGRlbHRhIGJ1aWxkZXIgY2FuIGdldCB0aGUgb2xkIGluZm8KLQkJCW9yaWdpbmFsLm9wZW4obnVsbCk7Ci0JCX0KLQkJSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIgZGVsdGFCdWlsZGVyID0gbmV3IEphdmFFbGVtZW50RGVsdGFCdWlsZGVyKG9yaWdpbmFsKTsKLQkKLQkJLy8gc2F2ZSB0aGUgY3UKLQkJSUJ1ZmZlciBvcmlnaW5hbEJ1ZmZlciA9IG9yaWdpbmFsLmdldEJ1ZmZlcigpOwotCQlpZiAob3JpZ2luYWxCdWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCQljaGFyW10gb3JpZ2luYWxDb250ZW50cyA9IG9yaWdpbmFsQnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQkJYm9vbGVhbiBoYXNTYXZlZCA9IGZhbHNlOworCS8qKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHNldHRpbmcgdGhlIHNvdXJjZQorCSAqIAlvZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBmYWlscworCSAqLworCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdHJ5IHsKLQkJCUlCdWZmZXIgY29weUJ1ZmZlciA9IGNvcHkuZ2V0QnVmZmVyKCk7Ci0JCQlpZiAoY29weUJ1ZmZlciA9PSBudWxsKSByZXR1cm47Ci0JCQlvcmlnaW5hbEJ1ZmZlci5zZXRDb250ZW50cyhjb3B5QnVmZmVyLmdldENoYXJhY3RlcnMoKSk7Ci0JCQlvcmlnaW5hbC5zYXZlKGZNb25pdG9yLCBmRm9yY2UpOwotCQkJdGhpcy5oYXNNb2RpZmllZFJlc291cmNlID0gdHJ1ZTsKLQkJCWhhc1NhdmVkID0gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghaGFzU2F2ZWQpewotCQkJCS8vIHJlc3RvcmUgb3JpZ2luYWwgYnVmZmVyIGNvbnRlbnRzIHNpbmNlIHNvbWV0aGluZyB3ZW50IHdyb25nCi0JCQkJb3JpZ2luYWxCdWZmZXIuc2V0Q29udGVudHMob3JpZ2luYWxDb250ZW50cyk7CisJCQliZWdpblRhc2soVXRpbC5iaW5kKCJ3b3JraW5nQ29weS5jb21taXQiKSwgMik7IC8vJE5PTi1OTFMtMSQKKwkJCVdvcmtpbmdDb3B5IGNvcHkgPSAoV29ya2luZ0NvcHkpZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpIGNvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCk7CisJCQorCQkJCisJCQkvLyBjcmVhdGVzIHRoZSBkZWx0YSBidWlsZGVyICh0aGlzIHJlbWVtYmVycyB0aGUgY29udGVudCBvZiB0aGUgY3UpCQorCQkJaWYgKCFvcmlnaW5hbC5pc09wZW4oKSkgeworCQkJCS8vIGZvcmNlIG9wZW5pbmcgc28gdGhhdCB0aGUgZGVsdGEgYnVpbGRlciBjYW4gZ2V0IHRoZSBvbGQgaW5mbworCQkJCW9yaWdpbmFsLm9wZW4obnVsbCk7CiAJCQl9CisJCQlKYXZhRWxlbWVudERlbHRhQnVpbGRlciBkZWx0YUJ1aWxkZXI7CisJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKG9yaWdpbmFsKSkgeworCQkJCWRlbHRhQnVpbGRlciA9IG51bGw7CisJCQl9IGVsc2UgeworCQkJCWRlbHRhQnVpbGRlciA9IG5ldyBKYXZhRWxlbWVudERlbHRhQnVpbGRlcihvcmlnaW5hbCk7CisJCQl9CisJCQorCQkJLy8gc2F2ZSB0aGUgY3UKKwkJCUlCdWZmZXIgb3JpZ2luYWxCdWZmZXIgPSBvcmlnaW5hbC5nZXRCdWZmZXIoKTsKKwkJCWlmIChvcmlnaW5hbEJ1ZmZlciA9PSBudWxsKSByZXR1cm47CisJCQljaGFyW10gb3JpZ2luYWxDb250ZW50cyA9IG9yaWdpbmFsQnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJCWJvb2xlYW4gaGFzU2F2ZWQgPSBmYWxzZTsKKwkJCXRyeSB7CisJCQkJSUJ1ZmZlciBjb3B5QnVmZmVyID0gY29weS5nZXRCdWZmZXIoKTsKKwkJCQlpZiAoY29weUJ1ZmZlciA9PSBudWxsKSByZXR1cm47CisJCQkJb3JpZ2luYWxCdWZmZXIuc2V0Q29udGVudHMoY29weUJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkpOworCQkJCW9yaWdpbmFsLnNhdmUoZk1vbml0b3IsIGZGb3JjZSk7CisJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJCQloYXNTYXZlZCA9IHRydWU7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmICghaGFzU2F2ZWQpeworCQkJCQkvLyByZXN0b3JlIG9yaWdpbmFsIGJ1ZmZlciBjb250ZW50cyBzaW5jZSBzb21ldGhpbmcgd2VudCB3cm9uZworCQkJCQlvcmlnaW5hbEJ1ZmZlci5zZXRDb250ZW50cyhvcmlnaW5hbENvbnRlbnRzKTsKKwkJCQl9CisJCQl9CisJCQkvLyBtYWtlIHN1cmUgd29ya2luZyBjb3B5IGlzIGluIHN5bmMKKwkJCWNvcHkudXBkYXRlVGltZVN0YW1wKChDb21waWxhdGlvblVuaXQpb3JpZ2luYWwpOworCQkJY29weS5tYWtlQ29uc2lzdGVudCh0aGlzKTsKKwkJCXdvcmtlZCgxKTsKKwkJCisJCQlpZiAoZGVsdGFCdWlsZGVyICE9IG51bGwpIHsKKwkJCQkvLyBidWlsZCB0aGUgZGVsdGFzCisJCQkJZGVsdGFCdWlsZGVyLmJ1aWxkRGVsdGFzKCk7CisJCQkKKwkJCQkvLyBhZGQgdGhlIGRlbHRhcyB0byB0aGUgbGlzdCBvZiBkZWx0YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24KKwkJCQlpZiAoZGVsdGFCdWlsZGVyLmRlbHRhICE9IG51bGwpIHsKKwkJCQkJYWRkRGVsdGEoZGVsdGFCdWlsZGVyLmRlbHRhKTsKKwkJCQl9CisJCQl9CisJCQl3b3JrZWQoMSk7CisJCX0gZmluYWxseSB7CQorCQkJZG9uZSgpOwogCQl9Ci0JCS8vIG1ha2Ugc3VyZSB3b3JraW5nIGNvcHkgaXMgaW4gc3luYwotCQljb3B5LnVwZGF0ZVRpbWVTdGFtcCgoQ29tcGlsYXRpb25Vbml0KW9yaWdpbmFsKTsKLQkJY29weS5tYWtlQ29uc2lzdGVudCh0aGlzKTsKLQkJd29ya2VkKDEpOwotCQotCQkvLyBidWlsZCB0aGUgZGVsdGFzCi0JCWRlbHRhQnVpbGRlci5idWlsZERlbHRhcygpOwotCQotCQkvLyBhZGQgdGhlIGRlbHRhcyB0byB0aGUgbGlzdCBvZiBkZWx0YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24KLQkJaWYgKGRlbHRhQnVpbGRlci5kZWx0YSAhPSBudWxsKSB7Ci0JCQlhZGREZWx0YShkZWx0YUJ1aWxkZXIuZGVsdGEpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IHRoaXMgb3BlcmF0aW9uIGlzIHdvcmtpbmcgb24uCisJICovCisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgeworCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCX0KKwkvKioKKwkgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorCSAqCTxsaT5JTlZBTElEX0VMRU1FTlRfVFlQRVMgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBzdXBwbGllZCB0byB0aGlzCisJICoJCW9wZXJhdGlvbiBpcyBub3QgYSB3b3JraW5nIGNvcHkKKwkgKiAgPGxpPkVMRU1FTlRfTk9UX1BSRVNFTlQgLSB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGUgd29ya2luZyBjb3B5IGlzCisJICoJCWJhc2VkIG9uIG5vIGxvbmdlciBleGlzdHMuCisJICogIDxsaT5VUERBVEVfQ09ORkxJQ1QgLSB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBoYXMgY2hhbmdlZCBzaW5jZQorCSAqCQl0aGUgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkIGFuZCB0aGUgb3BlcmF0aW9uIHNwZWNpZmllcyBubyBmb3JjZQorCSAqICA8bGk+UkVBRF9PTkxZIC0gdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gcmVhZC1vbmx5IG1vZGUKKwkgKiAgPC91bD4KKwkgKi8KKwlwdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKKwkJaWYgKCFjdS5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBjdSk7CiAJCX0KLQkJd29ya2VkKDEpOwotCX0gZmluYWxseSB7CQotCQlkb25lKCk7CisJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldE9yaWdpbmFsRWxlbWVudCgpOworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBvcmlnaW5hbC5nZXRSZXNvdXJjZSgpOworCQlpZiAoIWN1LmlzQmFzZWRPbihyZXNvdXJjZSkgJiYgIWZGb3JjZSkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5VUERBVEVfQ09ORkxJQ1QpOworCQl9CisJCS8vIG5vIHJlYWQtb25seSBjaGVjaywgc2luY2Ugc29tZSByZXBvc2l0b3J5IGFkYXB0ZXJzIGNhbiBjaGFuZ2UgdGhlIGZsYWcgb24gc2F2ZQorCQkvLyBvcGVyYXRpb24uCQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCX0KIH0KLS8qKgotICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGlzIG9wZXJhdGlvbiBpcyB3b3JraW5nIG9uLgotICovCi1wcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KWdldEVsZW1lbnRUb1Byb2Nlc3MoKTsKLX0KLS8qKgotICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KLSAqCTxsaT5JTlZBTElEX0VMRU1FTlRfVFlQRVMgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBzdXBwbGllZCB0byB0aGlzCi0gKgkJb3BlcmF0aW9uIGlzIG5vdCBhIHdvcmtpbmcgY29weQotICogIDxsaT5FTEVNRU5UX05PVF9QUkVTRU5UIC0gdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhlIHdvcmtpbmcgY29weSBpcwotICoJCWJhc2VkIG9uIG5vIGxvbmdlciBleGlzdHMuCi0gKiAgPGxpPlVQREFURV9DT05GTElDVCAtIHRoZSBvcmlnaW5hbCBjb21waWxhdGlvbiB1bml0IGhhcyBjaGFuZ2VkIHNpbmNlCi0gKgkJdGhlIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCBhbmQgdGhlIG9wZXJhdGlvbiBzcGVjaWZpZXMgbm8gZm9yY2UKLSAqICA8bGk+UkVBRF9PTkxZIC0gdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgaXMgaW4gcmVhZC1vbmx5IG1vZGUKLSAqICA8L3VsPgotICovCi1wdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCWlmICghY3UuaXNXb3JraW5nQ29weSgpKSB7Ci0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBjdSk7Ci0JfQotCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldE9yaWdpbmFsRWxlbWVudCgpOwotCUlSZXNvdXJjZSByZXNvdXJjZT0gbnVsbDsKLQl0cnkgewotCQlyZXNvdXJjZSA9IG9yaWdpbmFsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBlLmdldEphdmFNb2RlbFN0YXR1cygpOwotCX0KLQlpZiAoIWN1LmlzQmFzZWRPbihyZXNvdXJjZSkgJiYgIWZGb3JjZSkgewotCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlVQREFURV9DT05GTElDVCk7Ci0JfQotCS8vIG5vIHJlYWQtb25seSBjaGVjaywgc2luY2Ugc29tZSByZXBvc2l0b3J5IGFkYXB0ZXJzIGNhbiBjaGFuZ2UgdGhlIGZsYWcgb24gc2F2ZQotCS8vIG9wZXJhdGlvbi4JCi0JcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggNTU5ZDY5Mi4uNzE4MDNkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsNTAgKzEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLio7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvcjsKQEAgLTUyLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuU291cmNlRWxlbWVudFBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OworCiAvKioKICAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdAogICovCkBAIC01OSw2ICszMSw5IEBACiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgT3BlbmFibGUgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0LCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQgewogCQogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBTSEFSRURfV0NfVkVSQk9TRSA9IGZhbHNlOworCQorCS8vIFRPRE86IFJlbW92ZSB3aGVuIHdlIGFyZSBjZXJ0YWluIHRoYXQgZXZlcnkgY2xpZW50IGlzIHJlYWR5IGZvciB0aGlzIGZpeAorCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSVhfQlVHMjUxODQgPSB0cnVlOwogCiAvKioKICAqIENvbnN0cnVjdHMgYSBoYW5kbGUgdG8gYSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlCkBAIC05OSwyMyArNzQsMTMgQEAKIAlyZW1vdmVJbmZvKCk7CiAKIAlIYXNoTWFwIG5ld0VsZW1lbnRzID0gbmV3IEhhc2hNYXAoMTEpOwotCWluZm8uc2V0SXNTdHJ1Y3R1cmVLbm93bihnZW5lcmF0ZUluZm9zKGluZm8sIG1vbml0b3IsIG5ld0VsZW1lbnRzLCBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkpOworCWluZm8uc2V0SXNTdHJ1Y3R1cmVLbm93bihnZW5lcmF0ZUluZm9zKGluZm8sIG1vbml0b3IsIG5ld0VsZW1lbnRzLCBnZXRSZXNvdXJjZSgpKSk7CiAJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0RWxlbWVudHNPdXRPZlN5bmNoV2l0aEJ1ZmZlcnMoKS5yZW1vdmUodGhpcyk7CiAJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3RWxlbWVudHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAJCUlKYXZhRWxlbWVudCBrZXkgPSAoSUphdmFFbGVtZW50KSBpdGVyLm5leHQoKTsKIAkJT2JqZWN0IHZhbHVlID0gbmV3RWxlbWVudHMuZ2V0KGtleSk7CiAJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnB1dEluZm8oa2V5LCB2YWx1ZSk7CiAJfQotCS8vIHByb2JsZW0gZGV0ZWN0aW9uIAotCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKLQotCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IgPSB0aGlzLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLQlpZiAocHJvYmxlbVJlcXVlc3RvciAhPSBudWxsICYmIHByb2JsZW1SZXF1ZXN0b3IuaXNBY3RpdmUoKSl7Ci0JCXByb2JsZW1SZXF1ZXN0b3IuYmVnaW5SZXBvcnRpbmcoKTsKLQkJQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5yZXNvbHZlKHRoaXMsIHByb2JsZW1SZXF1ZXN0b3IsIG1vbml0b3IpOwotCQlwcm9ibGVtUmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOwotCX0KLQkKIAkvLyBhZGQgdGhlIGluZm8gZm9yIHRoaXMgYXQgdGhlIGVuZCwgdG8gZW5zdXJlIHRoYXQgYSBnZXRJbmZvIGNhbm5vdCByZXBseSBudWxsIGluIGNhc2UgdGhlIExSVSBjYWNoZSBuZWVkcwogCS8vIHRvIGJlIGZsdXNoZWQuIE1pZ2h0IGxlYWQgdG8gcGVyZm9ybWFuY2UgaXNzdWVzLgogCS8vIHNlZSBQUiAxRzJLNVM3OiBJVFBKQ09SRTpBTEwgLSBOUEUgd2hlbiBhY2Nlc3Npbmcgc291cmNlIGZvciBhIGJpbmFyeSB0eXBlCkBAIC0zNDMsMTQgKzMwOCwxMyBAQAogCQkvLyBnZW5lcmF0ZSBzdHJ1Y3R1cmUKIAkJQ29tcGlsYXRpb25Vbml0U3RydWN0dXJlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IodGhpcywgdW5pdEluZm8sIG5ld0VsZW1lbnRzKTsKIAkJSVByb2JsZW1GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCk7Ci0JCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gbmV3IFNvdXJjZUVsZW1lbnRQYXJzZXIocmVxdWVzdG9yLCBmYWN0b3J5LCBuZXcgQ29tcGlsZXJPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSkpOworCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHJlcXVlc3RvciwgZmFjdG9yeSwgbmV3IENvbXBpbGVyT3B0aW9ucyhnZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpKTsKKwkJcmVxdWVzdG9yLnBhcnNlciA9IHBhcnNlcjsKIAkJcGFyc2VyLnBhcnNlQ29tcGlsYXRpb25Vbml0KHRoaXMsIGZhbHNlKTsKIAkJaWYgKGlzV29ya2luZ0NvcHkoKSkgewogCQkJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKENvbXBpbGF0aW9uVW5pdCkgZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JCQl1bml0SW5mby5mVGltZXN0YW1wID0gKChJRmlsZSkgb3JpZ2luYWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZih1bml0SW5mby5mVGltZXN0YW1wID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKXsKLQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1JFU09VUkNFKSk7Ci0JCQl9CisJCQkvLyBtaWdodCBiZSBJUmVzb3VyY2UuTlVMTF9TVEFNUCBpZiBvcmlnaW5hbCBkb2VzIG5vdCBleGlzdAorCQkJdW5pdEluZm8uZlRpbWVzdGFtcCA9ICgoSUZpbGUpIG9yaWdpbmFsLmdldFJlc291cmNlKCkpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CiAJCX0KIAkJcmV0dXJuIHVuaXRJbmZvLmlzU3RydWN0dXJlS25vd24oKTsKIAl9CkBAIC0zOTIsMTAgKzM1Niw4IEBACiAJdHJ5IHsKIAkJSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmdldEJ1ZmZlcigpOwogCQlyZXR1cm4gYnVmZmVyID09IG51bGwgPyBudWxsIDogYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7IC8vIGJ1ZmZlciBjb3VsZCBiZSBudWxsCi0JCXJldHVybiBuZXcgY2hhclswXTsKIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbmV3IGNoYXJbMF07CisJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJfQogfQogLyoqCkBAIC01MzMsMTMgKzQ5NSw2IEBACiAJfQogfQogCi0vKgotICogQW5zd2VyIHJlcXVlc3RvciB0byBub3RpZnkgd2l0aCBwcm9ibGVtcwotICovCi1wdWJsaWMgSVByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpewotCXJldHVybiBudWxsOwotfQotCiAvKioKICAqIEBzZWUgSVNvdXJjZVJlZmVyZW5jZSNnZXRTb3VyY2UoKQogICovCkBAIC01NjksNiArNTI0LDEzIEBACiAJbGlzdC50b0FycmF5KGFycmF5KTsKIAlyZXR1cm4gYXJyYXk7CiB9CitwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChGSVhfQlVHMjUxODQpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCX0gZWxzZSB7CisJCXJldHVybiBnZXRSZXNvdXJjZSgpOworCX0KK30KIC8qKgogICogQHNlZSBJV29ya2luZ0NvcHkjZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKQogICovCkBAIC01OTksMTkgKzU2MSw5IEBACiAKIAkJcmV0dXJuIHdvcmtpbmdDb3B5OwogCX0gZWxzZSB7Ci0JCXdvcmtpbmdDb3B5ID0gKFdvcmtpbmdDb3B5KXRoaXMuZ2V0V29ya2luZ0NvcHkocG0sIGZhY3RvcnksIHByb2JsZW1SZXF1ZXN0b3IpOwotCQlwZXJGYWN0b3J5V29ya2luZ0NvcGllcy5wdXQodGhpcywgd29ya2luZ0NvcHkpOwotCi0JCWlmIChTSEFSRURfV0NfVkVSQk9TRSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBzaGFyZWQgd29ya2luZyBjb3B5ICIgKyB3b3JraW5nQ29weS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHJlcG9ydCBhZGRlZCBqYXZhIGRlbHRhCi0JCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YSh0aGlzLmdldEphdmFNb2RlbCgpKTsKLQkJZGVsdGEuYWRkZWQod29ya2luZ0NvcHkpOwotCQltYW5hZ2VyLmZpcmUoZGVsdGEsIEphdmFNb2RlbE1hbmFnZXIuREVGQVVMVF9DSEFOR0VfRVZFTlQpOwotCi0JCXJldHVybiB3b3JraW5nQ29weTsKKwkJQ3JlYXRlV29ya2luZ0NvcHlPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlV29ya2luZ0NvcHlPcGVyYXRpb24odGhpcywgcGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMsIGZhY3RvcnksIHByb2JsZW1SZXF1ZXN0b3IpOworCQlydW5PcGVyYXRpb24ob3AsIHBtKTsKKwkJcmV0dXJuIG9wLmdldFJlc3VsdEVsZW1lbnRzKClbMF07CiAJfQogfQogLyoqCkBAIC02MjUsMTAgKzU3Nyw5IEBACiAgKiBAc2VlIElXb3JraW5nQ29weSNnZXRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSwgSVByb2JsZW1SZXF1ZXN0b3IpCiAgKi8KIHB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBwbSwgSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSwgSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBuZXcgV29ya2luZ0NvcHkoKElQYWNrYWdlRnJhZ21lbnQpZ2V0UGFyZW50KCksIGdldEVsZW1lbnROYW1lKCksIGZhY3RvcnksIHByb2JsZW1SZXF1ZXN0b3IpOwotCS8vIG9wZW4gdGhlIHdvcmtpbmcgY29weSBub3cgdG8gZW5zdXJlIGNvbnRlbnRzIGFyZSB0aGF0IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgZWxlbWVudAotCXdvcmtpbmdDb3B5Lm9wZW4ocG0pOwotCXJldHVybiB3b3JraW5nQ29weTsKKwlDcmVhdGVXb3JraW5nQ29weU9wZXJhdGlvbiBvcCA9IG5ldyBDcmVhdGVXb3JraW5nQ29weU9wZXJhdGlvbih0aGlzLCBudWxsLCBmYWN0b3J5LCBwcm9ibGVtUmVxdWVzdG9yKTsKKwlydW5PcGVyYXRpb24ob3AsIHBtKTsKKwlyZXR1cm4gb3AuZ2V0UmVzdWx0RWxlbWVudHMoKVswXTsKIH0KIAogLyoqCkBAIC02NzgsMTEgKzYyOSwxMSBAQAogLyoqCiAgKiBAc2VlIElPcGVuYWJsZSNtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yKQogICovCi1wdWJsaWMgdm9pZCBtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoIWlzQ29uc2lzdGVudCgpKSB7CitwdWJsaWMgdm9pZCBtYWtlQ29uc2lzdGVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmICghaXNDb25zaXN0ZW50KCkpIHsgLy8gVE9ETzogdGhpcyBjb2RlIGlzbid0IHN5bmNocm9uaXplZCB3aXRoIHJlZ3VsYXIgb3BlbmluZyBvZiBhIHdvcmtpbmcgY29weQogCQkvLyBjcmVhdGUgYSBuZXcgaW5mbyBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCBpbmZvCiAJCU9wZW5hYmxlRWxlbWVudEluZm8gaW5mbyA9IGNyZWF0ZUVsZW1lbnRJbmZvKCk7Ci0JCWJ1aWxkU3RydWN0dXJlKGluZm8sIHBtKTsKKwkJYnVpbGRTdHJ1Y3R1cmUoaW5mbywgbW9uaXRvcik7CiAJfQogfQogCkBAIC03MDQsNDUgKzY1NSw2IEBACiB9CiAKIC8qKgotICogQ2hhbmdlcyB0aGUgc291cmNlIGVuZCBpbmRleCBvZiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBjaGlsZHJlbiAoZm9sbG93aW5nCi0gKiA8Y29kZT5jaGlsZDwvY29kZT4pLiAKLSAqLwotcHVibGljIHZvaWQgb2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oaW50IGFtb3VudCwgSUphdmFFbGVtZW50IGNoaWxkKSB7Ci0JdHJ5IHsKLQkJQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8gY3VJbmZvID0gKENvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOwotCQljdUluZm8uc2V0U291cmNlTGVuZ3RoKGN1SW5mby5nZXRTb3VyY2VMZW5ndGgoKSArIGFtb3VudCk7Ci0JCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJYm9vbGVhbiBhZnRlckNoaWxkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGFDaGlsZC5lcXVhbHMoY2hpbGQpKSB7Ci0JCQkJYWZ0ZXJDaGlsZCA9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQlpZiAoYWZ0ZXJDaGlsZCkgewotCQkJCQkoKEphdmFFbGVtZW50KSBhQ2hpbGQpLm9mZnNldFNvdXJjZVJhbmdlKGFtb3VudCk7Ci0JCQkJfQotCQl9Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQlyZXR1cm47Ci0JfQotfQotLyoqCi0gKiBDaGFuZ2VzIHRoZSBzb3VyY2UgaW5kZXhlcyBvZiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBjaGlsZHJlbiBlbGVtZW50cy4KLSAqLwotcHVibGljIHZvaWQgb2Zmc2V0U291cmNlUmFuZ2UoaW50IGFtb3VudCkgewotCXRyeSB7Ci0JCUNvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvIGN1SW5mbyA9IChDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKTsKLQkJY3VJbmZvLnNldFNvdXJjZUxlbmd0aChjdUluZm8uZ2V0U291cmNlTGVuZ3RoKCkgKyBhbW91bnQpOwotCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCSgoSmF2YUVsZW1lbnQpIGFDaGlsZCkub2Zmc2V0U291cmNlUmFuZ2UoYW1vdW50KTsKLQkJfQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJcmV0dXJuOwotCX0KLX0KLS8qKgogICogQHNlZSBPcGVuYWJsZSNvcGVuQnVmZmVyKElQcm9ncmVzc01vbml0b3IpCiAgKi8KIHByb3RlY3RlZCBJQnVmZmVyIG9wZW5CdWZmZXIoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CkBAIC03NTQsNyArNjY2LDkgQEAKIAkKIAkvLyBzZXQgdGhlIGJ1ZmZlciBzb3VyY2UKIAlpZiAoYnVmZmVyLmdldENoYXJhY3RlcnMoKSA9PSBudWxsKXsKLQkJYnVmZmVyLnNldENvbnRlbnRzKFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KChJRmlsZSl0aGlzLmdldFJlc291cmNlKCkpKTsKKwkJSUZpbGUgZmlsZSA9IChJRmlsZSl0aGlzLmdldFJlc291cmNlKCk7CisJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwkJYnVmZmVyLnNldENvbnRlbnRzKFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KGZpbGUpKTsKIAl9CiAKIAkvLyBhZGQgYnVmZmVyIHRvIGJ1ZmZlciBjYWNoZQpAQCAtNzY1LDI3ICs2NzksMjYgQEAKIAkKIAlyZXR1cm4gYnVmZmVyOwogfQotLyoKLSAqIEBzZWUgT3BlbmFibGUjb3BlblBhcmVudChJUHJvZ3Jlc3NNb25pdG9yKQotICovCiBwcm90ZWN0ZWQgdm9pZCBvcGVuUGFyZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRyeSB7CisJaWYgKEZJWF9CVUcyNTE4NCkgewogCQlzdXBlci5vcGVuUGFyZW50KHBtKTsKLQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQkJLy8gYWxsb3cgcGFyZW50IHRvIG5vdCBleGlzdCBmb3IgZmFrZSB1bml0cyBkZWZpbmVkIG91dHNpZGUgY2xhc3NwYXRoCi0JCS8vIHdpbGwgYmUgb2sgZm9yIGJvdGggd29ya2luZyBjb3BpZXMgYW5kIGNvbXBpbGF0aW9uIHVuaXRzCi0JCWlmICghZS5pc0RvZXNOb3RFeGlzdCgpKXsgCi0JCQl0aHJvdyBlOworCX0gZWxzZSB7CisJCXRyeSB7CisJCQlzdXBlci5vcGVuUGFyZW50KHBtKTsKKwkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCQkvLyBhbGxvdyBwYXJlbnQgdG8gbm90IGV4aXN0IGZvciBjb21waWxhdGlvbiB1bml0cyBkZWZpbmVkIG91dHNpZGUgY2xhc3NwYXRoCisJCQlpZiAoIWUuaXNEb2VzTm90RXhpc3QoKSl7IAorCQkJCXRocm93IGU7CisJCQl9CiAJCX0KIAl9CiB9Ci0vKioKLSAqICBBbnN3ZXJzIHRydWUgaWYgdGhlIHBhcmVudCBleGlzdHMgKG51bGwgcGFyZW50IGlzIGFuc3dlcmluZyB0cnVlKQotICogCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIHBhcmVudEV4aXN0cygpewotCQotCXJldHVybiB0cnVlOyAvLyB0b2xlcmF0ZSB1bml0cyBvdXRzaWRlIGNsYXNzcGF0aAorcHJvdGVjdGVkIGJvb2xlYW4gcGFyZW50RXhpc3RzKCkgeworCWlmIChGSVhfQlVHMjUxODQpIHsKKwkJcmV0dXJuIHN1cGVyLnBhcmVudEV4aXN0cygpOworCX0gZWxzZSB7CisJCXJldHVybiB0cnVlOyAvLyB0b2xlcmF0ZSB1bml0cyBvdXRzaWRlIGNsYXNzcGF0aAorCX0KIH0KIAogLyoqCkBAIC04MjYsMjMgKzczOSw2IEBACiBwdWJsaWMgdm9pZCByZXN0b3JlICgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogfQogLyoqCi0gKiBVcGRhdGVzIHRoZSBzb3VyY2UgZW5kIGluZGV4IGZvciB0aGlzIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VFbmRPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKLQl0cnkgewotCQlDb21waWxhdGlvblVuaXRFbGVtZW50SW5mbyBjdUluZm8gPSAoQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKLQkJY3VJbmZvLnNldFNvdXJjZUxlbmd0aChjdUluZm8uZ2V0U291cmNlTGVuZ3RoKCkgKyBhbW91bnQpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJcmV0dXJuOwotCX0KLX0KLS8qKgotICogVXBkYXRlcyB0aGUgc291cmNlIGluZGV4ZXMgZm9yIHRoaXMgZWxlbWVudC4KLSAqLwotcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZVJhbmdlT2Zmc2V0KGludCBhbW91bnQsIGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kKSB7Ci0JdHJpZ2dlclNvdXJjZUVuZE9mZnNldChhbW91bnQsIG5hbWVTdGFydCwgbmFtZUVuZCk7Ci19Ci0vKioKICAqIEBzZWUgSUNvZGVBc3Npc3QjY29kZUNvbXBsZXRlKGludCwgSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yKQogICogQGRlcHJlY2F0ZWQgLSB1c2UgY29kZUNvbXBsZXRlKGludCwgSUNvbXBsZXRpb25SZXF1ZXN0b3IpCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRFbGVtZW50SW5mby5qYXZhCmluZGV4IDI5MzYzNTYuLmUxZTE0MGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0RWxlbWVudEluZm8uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlci5qYXZhCmluZGV4IDc2MjQxY2YuLmNhMzg5YzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC0xNSwxNSArMTUsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JQ29tcGlsZXJSZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklFcnJvckhhbmRsaW5nUG9saWN5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7CkBAIC0zNCw3ICszMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogUmVzcG9uc2libGUgZm9yIHJlc29sdmluZyB0eXBlcyBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0IGJlaW5nIHJlY29uY2lsZWQsCkBAIC05MSwxNCArODcsMjAgQEAKIAkgKiBBZGQgYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMKIAkgKi8KIAlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwkJLy8gZW5zdXJlIHRvIGp1bXAgYmFjayB0byB0b3BsZXZlbCB0eXBlIGZvciBmaXJzdCBvbmUgKGNvdWxkIGJlIGEgbWVtYmVyKQorLy8JCXdoaWxlIChzb3VyY2VUeXBlc1swXS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkKKy8vCQkJc291cmNlVHlwZXNbMF0gPSBzb3VyY2VUeXBlc1swXS5nZXRFbmNsb3NpbmdUeXBlKCk7CisKIAkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0KIAkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlc1swXS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwogCQkvLyBuZWVkIHRvIGhvbGQgb250byB0aGlzCiAJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQogCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKLQkJCQlzb3VyY2VUeXBlcywKLQkJCQl0cnVlLAotCQkJCXRydWUsCisJCQkJc291cmNlVHlwZXMsLy9zb3VyY2VUeXBlc1swXSBpcyBhbHdheXMgdG9wbGV2ZWwgaGVyZQorCQkJCXRydWUsIC8vIG5lZWQgZmllbGQgYW5kIG1ldGhvZHMKKwkJCQl0cnVlLCAvLyBuZWVkIG1lbWJlciB0eXBlcworCQkJCXRydWUsIC8vIG5lZWQgZmllbGQgaW5pdGlhbGl6YXRpb24KIAkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCiAJCQkJcmVzdWx0KTsKIApAQCAtMTMxLDQ2ICsxMzMsNiBAQAogCQl9OwogCX0KIAotCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcmVzb2x2ZSgKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0RWxlbWVudCwgCi0JCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IsCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJY2hhcltdIGZpbGVOYW1lID0gdW5pdEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOwotCQkKLQkJQ29tcGlsYXRpb25Vbml0UHJvYmxlbUZpbmRlciBwcm9ibGVtRmluZGVyID0KLQkJCW5ldyBDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyKAotCQkJCWdldE5hbWVFbnZpcm9ubWVudCh1bml0RWxlbWVudCksCi0JCQkJZ2V0SGFuZGxpbmdQb2xpY3koKSwKLQkJCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCi0JCQkJZ2V0UmVxdWVzdG9yKCksCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoZmlsZU5hbWUsIHByb2JsZW1SZXF1ZXN0b3IsIG1vbml0b3IpKTsKLQotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKLQkJCQotCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCl1bml0RWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCk7Ci0JCQljaGFyW11bXSBleHBlY3RlZFBhY2thZ2VOYW1lID0gbnVsbDsKLQkJCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCl7Ci0JCQkJZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpOwotCQkJfQotCQkJdW5pdCA9IHByb2JsZW1GaW5kZXIucmVzb2x2ZSgKLQkJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJdW5pdEVsZW1lbnQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwKLQkJCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUsCi0JCQkJCQluZXcgU3RyaW5nKGZpbGVOYW1lKSwKLQkJCQkJCWVuY29kaW5nKSk7Ci0JCQlyZXR1cm4gdW5pdDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh1bml0ICE9IG51bGwpIHsKLQkJCQl1bml0LmNsZWFuVXAoKTsKLQkJCX0KLQkJCXByb2JsZW1GaW5kZXIubG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsJCQkKLQkJfQotCX0KLQkKIAlwcm90ZWN0ZWQgc3RhdGljIElQcm9ibGVtRmFjdG9yeSBnZXRQcm9ibGVtRmFjdG9yeSgKIAkJZmluYWwgY2hhcltdIGZpbGVOYW1lLCAKIAkJZmluYWwgSVByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvciwKQEAgLTE4MCw3ICsxNDIsOCBAQAogCQkJcHVibGljIElQcm9ibGVtIGNyZWF0ZVByb2JsZW0oCiAJCQkJY2hhcltdIG9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCQkJaW50IHByb2JsZW1JZCwKLQkJCQlTdHJpbmdbXSBhcmd1bWVudHMsCisJCQkJU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cywKKwkJCQlTdHJpbmdbXSBtZXNzYWdlQXJndW1lbnRzLAogCQkJCWludCBzZXZlcml0eSwKIAkJCQlpbnQgc3RhcnRQb3NpdGlvbiwKIAkJCQlpbnQgZW5kUG9zaXRpb24sCkBAIC0xOTQsNyArMTU3LDggQEAKIAkJCQkJc3VwZXIuY3JlYXRlUHJvYmxlbSgKIAkJCQkJCW9yaWdpbmF0aW5nRmlsZU5hbWUsCiAJCQkJCQlwcm9ibGVtSWQsCi0JCQkJCQlhcmd1bWVudHMsCisJCQkJCQlwcm9ibGVtQXJndW1lbnRzLAorCQkJCQkJbWVzc2FnZUFyZ3VtZW50cywKIAkJCQkJCXNldmVyaXR5LAogCQkJCQkJc3RhcnRQb3NpdGlvbiwKIAkJCQkJCWVuZFBvc2l0aW9uLApAQCAtMjE1LDUgKzE3OSw0OCBAQAogCQl9OwogCX0KIAorCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcHJvY2VzcygKKwkJSUNvbXBpbGF0aW9uVW5pdCB1bml0RWxlbWVudCwgCisJCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwkJY2hhcltdIGZpbGVOYW1lID0gdW5pdEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkKKwkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB1bml0RWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOworCQlDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyIHByb2JsZW1GaW5kZXIgPQorCQkJbmV3IENvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIoCisJCQkJZ2V0TmFtZUVudmlyb25tZW50KHVuaXRFbGVtZW50KSwKKwkJCQlnZXRIYW5kbGluZ1BvbGljeSgpLAorCQkJCXByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSwKKwkJCQlnZXRSZXF1ZXN0b3IoKSwKKwkJCQlnZXRQcm9ibGVtRmFjdG9yeShmaWxlTmFtZSwgcHJvYmxlbVJlcXVlc3RvciwgbW9uaXRvcikpOworCisJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOworCQl0cnkgeworCQkJU3RyaW5nIGVuY29kaW5nID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSk7CisJCQkKKwkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpdW5pdEVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOworCQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IG51bGw7CisJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpeworCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCX0KKwkJCXVuaXQgPSBwcm9ibGVtRmluZGVyLnJlc29sdmUoCisJCQkJCW5ldyBCYXNpY0NvbXBpbGF0aW9uVW5pdCgKKwkJCQkJCXVuaXRFbGVtZW50LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCksCisJCQkJCQlleHBlY3RlZFBhY2thZ2VOYW1lLAorCQkJCQkJbmV3IFN0cmluZyhmaWxlTmFtZSksCisJCQkJCQllbmNvZGluZyksCisJCQkJCXRydWUsIC8vIHZlcmlmeSBtZXRob2RzCisJCQkJCXRydWUsIC8vIGFuYWx5emUgY29kZQorCQkJCQl0cnVlKTsgLy8gZ2VuZXJhdGUgY29kZQorCQkJcmV0dXJuIHVuaXQ7CisJCX0gZmluYWxseSB7CisJCQlpZiAodW5pdCAhPSBudWxsKSB7CisJCQkJdW5pdC5jbGVhblVwKCk7CisJCQl9CisJCQlwcm9ibGVtRmluZGVyLmxvb2t1cEVudmlyb25tZW50LnJlc2V0KCk7CQkJCisJCX0KKwl9CiB9CQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRTdHJ1Y3R1cmVSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhCmluZGV4IGY5NmY0MzcuLjE3NWYxYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFN0cnVjdHVyZVJlcXVlc3Rvci5qYXZhCkBAIC0xLDE5ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnRDb250YWluZXI7CkBAIC0yNyw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlJlZmVyZW5jZUluZm9BZGFwdGVyOwogCkBAIC0xMDQsNiArMTA2LDExIEBACiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3ludGF4RXJyb3JzID0gZmFsc2U7CiAJCisJLyoKKwkgKiBUaGUgcGFyc2VyIHRoaXMgcmVxdWVzdG9yIGlzIHVzaW5nLgorCSAqLworCXByb3RlY3RlZCBQYXJzZXIgcGFyc2VyOworCQogCS8qKgogCSAqIEVtcHR5IGNvbGxlY3Rpb25zIHVzZWQgZm9yIGVmZmljaWVudCBpbml0aWFsaXphdGlvbgogCSAqLwpAQCAtNTAwLDggKzUwNywyNiBAQAogLyoqCiAgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAgKi8KLXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQlleGl0TWVtYmVyKGRlY2xhcmF0aW9uRW5kKTsKK3B1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKKwlTb3VyY2VGaWVsZEVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlRmllbGRFbGVtZW50SW5mbykgZkluZm9TdGFjay5wb3AoKTsKKwlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkKKwkvLyByZW1lbWJlciBpbml0aWFsaXplciBzb3VyY2UgaWYgZmllbGQgaXMgYSBjb25zdGFudAorCWlmIChpbml0aWFsaXphdGlvblN0YXJ0ICE9IC0xKSB7CisJCWludCBmbGFncyA9IGluZm8uZmxhZ3M7CisJCU9iamVjdCB0eXBlSW5mbzsKKwkJaWYgKEZsYWdzLmlzU3RhdGljKGZsYWdzKSAmJiBGbGFncy5pc0ZpbmFsKGZsYWdzKQorCQkJCXx8ICgodHlwZUluZm8gPSBmSW5mb1N0YWNrLnBlZWsoKSkgaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8KKwkJCQkJICYmIChGbGFncy5pc0ludGVyZmFjZSgoKFNvdXJjZVR5cGVFbGVtZW50SW5mbyl0eXBlSW5mbykuZmxhZ3MpKSkpIHsKKwkJCWludCBsZW5ndGggPSBkZWNsYXJhdGlvbkVuZCAtIGluaXRpYWxpemF0aW9uU3RhcnQ7CisJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCWNoYXJbXSBpbml0aWFsaXplciA9IG5ldyBjaGFyW2xlbmd0aF07CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLnBhcnNlci5zY2FubmVyLnNvdXJjZSwgaW5pdGlhbGl6YXRpb25TdGFydCwgaW5pdGlhbGl6ZXIsIDAsIGxlbmd0aCk7CisJCQkJaW5mby5pbml0aWFsaXphdGlvblNvdXJjZSA9IGluaXRpYWxpemVyOworCQkJfQorCQl9CisJfQorCWZIYW5kbGVTdGFjay5wb3AoKTsKIH0KIC8qKgogICogQHNlZSBJU291cmNlRWxlbWVudFJlcXVlc3RvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0VmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGlsYXRpb25Vbml0VmlzaXRvci5qYXZhCmluZGV4IGE4YzNhOTUuLjI2NjQ5NjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBpbGF0aW9uVW5pdFZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21waWxhdGlvblVuaXRWaXNpdG9yLmphdmEKQEAgLTEsMjMgKzEsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGVyOwpAQCAtMzEsNyArMzMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUGFja2FnZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5Tb3VyY2VUeXBlQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0VmlzaXRvciBleHRlbmRzIENvbXBpbGVyIHsKIAkKQEAgLTg3LDkgKzg4LDEwIEBACiAJCS8vIG5lZWQgdG8gaG9sZCBvbnRvIHRoaXMKIAkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CiAJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAotCQkJCXNvdXJjZVR5cGVzLAotCQkJCXRydWUsCi0JCQkJdHJ1ZSwKKwkJCQlzb3VyY2VUeXBlcywvL3NvdXJjZVR5cGVzWzBdIGlzIGFsd2F5cyB0b3BsZXZlbCBoZXJlCisJCQkJdHJ1ZSwgLy8gbmVlZCBmaWVsZCBhbmQgbWV0aG9kcworCQkJCXRydWUsIC8vIG5lZWQgbWVtYmVyIHR5cGVzCisJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCiAJCQkJbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLAogCQkJCXJlc3VsdCk7CiAKQEAgLTEzNiwxNyArMTM4LDE4IEBACiAJCUlBYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yIHZpc2l0b3IpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCisJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdW5pdEVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKIAkJQ29tcGlsYXRpb25Vbml0VmlzaXRvciBjb21waWxhdGlvblVuaXRWaXNpdG9yID0KIAkJCW5ldyBDb21waWxhdGlvblVuaXRWaXNpdG9yKAogCQkJCWdldE5hbWVFbnZpcm9ubWVudCh1bml0RWxlbWVudCksCiAJCQkJZ2V0SGFuZGxpbmdQb2xpY3koKSwKLQkJCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCisJCQkJcHJvamVjdC5nZXRPcHRpb25zKHRydWUpLAogCQkJCWdldFJlcXVlc3RvcigpLAogCQkJCWdldFByb2JsZW1GYWN0b3J5KHZpc2l0b3IpKTsKIAogCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKIAkJdHJ5IHsKLQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwkJCVN0cmluZyBlbmNvZGluZyA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCiAJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KXVuaXRFbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKIAkJCWNoYXJbXVtdIGV4cGVjdGVkUGFja2FnZU5hbWUgPSBudWxsOwpAQCAtMTU5LDcgKzE2MiwxMCBAQAogCQkJCQkJdW5pdEVsZW1lbnQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKSwKIAkJCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUsCiAJCQkJCQl1bml0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLAotCQkJCQkJZW5jb2RpbmcpKTsKKwkJCQkJCWVuY29kaW5nKSwKKwkJCQkJdHJ1ZSwgLy8gbWV0aG9kIHZlcmlmaWNhdGlvbgorCQkJCQlmYWxzZSwgLy8gbm8gZmxvdyBhbmFseXNpcworCQkJCQlmYWxzZSk7IC8vIG5vIGNvZGUgZ2VuZXJhdGlvbgogCQkJaWYgKHVuaXQgIT0gbnVsbCkgewogCQkJCXVuaXQudHJhdmVyc2UodmlzaXRvciwgdW5pdC5zY29wZSk7CiAJCQl9CkBAIC0xNzYsNyArMTgyLDggQEAKIAkJCXB1YmxpYyBJUHJvYmxlbSBjcmVhdGVQcm9ibGVtKAogCQkJCWNoYXJbXSBvcmlnaW5hdGluZ0ZpbGVOYW1lLAogCQkJCWludCBwcm9ibGVtSWQsCi0JCQkJU3RyaW5nW10gYXJndW1lbnRzLAorCQkJCVN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMsCisJCQkJU3RyaW5nW10gbWVzc2FnZUFyZ3VtZW50cywKIAkJCQlpbnQgc2V2ZXJpdHksCiAJCQkJaW50IHN0YXJ0UG9zaXRpb24sCiAJCQkJaW50IGVuZFBvc2l0aW9uLApAQCAtMTg2LDcgKzE5Myw4IEBACiAJCQkJCXN1cGVyLmNyZWF0ZVByb2JsZW0oCiAJCQkJCQlvcmlnaW5hdGluZ0ZpbGVOYW1lLAogCQkJCQkJcHJvYmxlbUlkLAotCQkJCQkJYXJndW1lbnRzLAorCQkJCQkJcHJvYmxlbUFyZ3VtZW50cywKKwkJCQkJCW1lc3NhZ2VBcmd1bWVudHMsCiAJCQkJCQlzZXZlcml0eSwKIAkJCQkJCXN0YXJ0UG9zaXRpb24sCiAJCQkJCQllbmRQb3NpdGlvbiwKQEAgLTE5Niw0ICsyMDQsNCBAQAogCQkJfQogCQl9OwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIuamF2YQppbmRleCBhNTQwYTU1Li5mNjIxMTVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21wbGV0aW9uUmVxdWVzdG9yOwpAQCAtMTUsOSArMTUsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5Db21wbGV0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBDb21wbGV0aW9uUmVxdWVzdG9yV3JhcHBlciBpbXBsZW1lbnRzIElDb21wbGV0aW9uUmVxdWVzdG9yIHsKIAlzdGF0aWMgZmluYWwgY2hhcltdIEFSRyA9ICJhcmciLnRvQ2hhckFycmF5KCk7ICAvLyROT04tTkxTLTEkCkBAIC0yOTIsNyArMjkyLDYgQEAKIHB1YmxpYyB2b2lkIGFjY2VwdFZhcmlhYmxlTmFtZShjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKXsKIAkKIAlpZihDb21wbGV0aW9uRW5naW5lLkRFQlVHKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ09NUExFVElPTiAtIGFjY2VwdFZhcmlhYmxlTmFtZSIpOyAvLyROT04tTkxTLTEkCiAJCXByaW50RGVidWcoImFjY2VwdFZhcmlhYmxlTmFtZSIsICBuZXcgU3RyaW5nW117IC8vJE5PTi1OTFMtMSQKIAkJCVN0cmluZy52YWx1ZU9mKHR5cGVQYWNrYWdlTmFtZSksCiAJCQlTdHJpbmcudmFsdWVPZih0eXBlTmFtZSksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5RWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IDlhNjIyYmMuLmE3MTgzNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTNlODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKKwlJUGF0aCBkZXN0aW5hdGlvbjsKKwlpbnQgdXBkYXRlUmVzb3VyY2VGbGFnczsKKwlpbnQgdXBkYXRlTW9kZWxGbGFnczsKKwlJQ2xhc3NwYXRoRW50cnkgc2libGluZzsKKworCXB1YmxpYyBDb3B5UGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbigKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwKKwkJSVBhdGggZGVzdGluYXRpb24sCisJCWludCB1cGRhdGVSZXNvdXJjZUZsYWdzLAorCQlpbnQgdXBkYXRlTW9kZWxGbGFncywKKwkJSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcpIHsKKwkJCQorCQlzdXBlcihyb290KTsKKwkJdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworCQl0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MgPSB1cGRhdGVSZXNvdXJjZUZsYWdzOworCQl0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgPSB1cGRhdGVNb2RlbEZsYWdzOworCQl0aGlzLnNpYmxpbmcgPSBzaWJsaW5nOworCX0KKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXRoaXMuZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCQlJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5ID0gcm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOworCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKworCQkvLyBjb3B5IHJlc291cmNlCisJCWlmICghcm9vdC5pc0V4dGVybmFsKCkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk5PX1JFU09VUkNFX01PRElGSUNBVElPTikgPT0gMCkgeworCQkJY29weVJlc291cmNlKHJvb3QsIHJvb3RFbnRyeSwgd29ya3NwYWNlUm9vdCk7CisJCX0KKwkJCisJCS8vIHVwZGF0ZSBjbGFzc3BhdGggaWYgbmVlZGVkCisJCWlmICgodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuREVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEgpICE9IDApIHsKKwkJCWFkZEVudHJ5VG9DbGFzc3BhdGgocm9vdEVudHJ5LCB3b3Jrc3BhY2VSb290KTsKKwkJfQorCX0KKwlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVzb3VyY2UoCisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsCisJCUlDbGFzc3BhdGhFbnRyeSByb290RW50cnksCisJCWZpbmFsIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QpCisJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpcm9vdEVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CisJCUlSZXNvdXJjZSByb290UmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSB8fCBleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCUlSZXNvdXJjZSBkZXN0UmVzOworCQkJCWlmICgodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMCkgeworCQkJCQlpZiAocm9vdEVudHJ5LmdldFBhdGgoKS5lcXVhbHModGhpcy5kZXN0aW5hdGlvbikpIHJldHVybjsKKwkJCQkJaWYgKChkZXN0UmVzID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHRoaXMuZGVzdGluYXRpb24pKSAhPSBudWxsKSB7CisJCQkJCQlkZXN0UmVzLmRlbGV0ZSh0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyb290UmVzb3VyY2UuY29weSh0aGlzLmRlc3RpbmF0aW9uLCB0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmaW5hbCBpbnQgc291cmNlU2VnbWVudENvdW50ID0gcm9vdEVudHJ5LmdldFBhdGgoKS5zZWdtZW50Q291bnQoKTsKKwkJCWZpbmFsIElGb2xkZXIgZGVzdEZvbGRlciA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKHRoaXMuZGVzdGluYXRpb24pOworCQkJZmluYWwgSVBhdGhbXSBuZXN0ZWRGb2xkZXJzID0gZ2V0TmVzdGVkRm9sZGVycyhyb290KTsKKwkJCUlSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCQkJCUlQYXRoIHBhdGggPSBwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKTsKKwkJCQkJCWlmIChwcmVmaXhlc09uZU9mKHBhdGgsIG5lc3RlZEZvbGRlcnMpKSB7CisJCQkJCQkJaWYgKGVxdWFsc09uZU9mKHBhdGgsIG5lc3RlZEZvbGRlcnMpKSB7CisJCQkJCQkJCS8vIG5lc3RlZCBzb3VyY2UgZm9sZGVyCisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBmb2xkZXIgY29udGFpbmluZyBuZXN0ZWQgc291cmNlIGZvbGRlcgorCQkJCQkJCQlJRm9sZGVyIGZvbGRlciA9IGRlc3RGb2xkZXIuZ2V0Rm9sZGVyKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKKwkJCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJCQkJCSYmIGZvbGRlci5leGlzdHMoKSkgeworCQkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZm9sZGVyLmNyZWF0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCB0cnVlLCBmTW9uaXRvcik7CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gc3VidHJlZSBkb2Vzbid0IGNvbnRhaW4gYW55IG5lc3RlZCBzb3VyY2UgZm9sZGVycworCQkJCQkJCUlQYXRoIGRlc3RQYXRoID0gZGVzdGluYXRpb24uYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKKwkJCQkJCQlJUmVzb3VyY2UgZGVzdFJlczsKKwkJCQkJCQlpZiAoKHVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCisJCQkJCQkJCQkmJiAoZGVzdFJlcyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihkZXN0UGF0aCkpICE9IG51bGwpIHsKKwkJCQkJCQkJZGVzdFJlcy5kZWxldGUodXBkYXRlUmVzb3VyY2VGbGFncywgZk1vbml0b3IpOworCQkJCQkJCX0KKwkJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5jb3B5KGRlc3RQYXRoLCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJSVBhdGggcGF0aCA9IHByb3h5LnJlcXVlc3RGdWxsUGF0aCgpOworCQkJCQkJSVBhdGggZGVzdFBhdGggPSBkZXN0aW5hdGlvbi5hcHBlbmQocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZVNlZ21lbnRDb3VudCkpOworCQkJCQkJSVJlc291cmNlIGRlc3RSZXM7CisJCQkJCQlpZiAoKHVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCisJCQkJCQkJCSYmIChkZXN0UmVzID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGRlc3RQYXRoKSkgIT0gbnVsbCkgeworCQkJCQkJCWRlc3RSZXMuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQkJCX0KKwkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmNvcHkoZGVzdFBhdGgsIHVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCQl0cnkgeworCQkJCXJvb3RSZXNvdXJjZS5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLk5PTkUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfQorCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCX0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRyeVRvQ2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeSByb290RW50cnksIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwkJSVByb2plY3QgZGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QodGhpcy5kZXN0aW5hdGlvbi5zZWdtZW50KDApKTsKKwkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGRlc3RQcm9qZWN0KTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0galByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCWludCBsZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOworCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGg7CisJCQorCQkvLyBjYXNlIG9mIGV4aXN0aW5nIGVudHJ5IGFuZCBSRVBMQUNFIHdhcyBzcGVjaWZpZWQKKwkJaWYgKCh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwKSB7CisJCQkvLyBmaW5kIGV4aXN0aW5nIGVudHJ5CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHRoaXMuZGVzdGluYXRpb24uZXF1YWxzKGNsYXNzcGF0aFtpXS5nZXRQYXRoKCkpKSB7CisJCQkJCW5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGVuZ3RoXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgbGVuZ3RoKTsKKwkJCQkJbmV3Q2xhc3NwYXRoW2ldID0gY29weShyb290RW50cnkpOworCQkJCQlqUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBmTW9uaXRvcik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gCisJCQorCQkvLyBvdGhlciBjYXNlcworCQlpbnQgcG9zaXRpb247CisJCWlmICh0aGlzLnNpYmxpbmcgPT0gbnVsbCkgeworCQkJLy8gaW5zZXJ0IGF0IHRoZSBlbmQKKwkJCXBvc2l0aW9uID0gbGVuZ3RoOworCQl9IGVsc2UgeworCQkJLy8gaW5zZXJ0IGJlZm9yZSBzaWJsaW5nCisJCQlwb3NpdGlvbiA9IC0xOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmICh0aGlzLnNpYmxpbmcuZXF1YWxzKGNsYXNzcGF0aFtpXSkpIHsKKwkJCQkJcG9zaXRpb24gPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHBvc2l0aW9uID09IC0xKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1NJQkxJTkcsIHRoaXMuc2libGluZy50b1N0cmluZygpKSk7CisJCX0KKwkJbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW5ndGgrMV07CisJCWlmIChwb3NpdGlvbiAhPSAwKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoLCAwLCBwb3NpdGlvbik7CisJCX0KKwkJaWYgKHBvc2l0aW9uICE9IGxlbmd0aCkgeworCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIHBvc2l0aW9uLCBuZXdDbGFzc3BhdGgsIHBvc2l0aW9uKzEsIGxlbmd0aC1wb3NpdGlvbik7CisJCX0KKwkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gY29weShyb290RW50cnkpOworCQluZXdDbGFzc3BhdGhbcG9zaXRpb25dID0gbmV3RW50cnk7CisJCWpQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIGZNb25pdG9yKTsKKwl9CisJLyoKKwkgKiBDb3BpZXMgdGhlIGdpdmVuIGNsYXNzcGF0aCBlbnRyeSByZXBsYWNpbmcgaXRzIHBhdGggd2l0aCB0aGUgZGVzdGluYXRpb24gcGF0aAorCSAqIGlmIGl0IGlzIGEgc291cmNlIGZvbGRlciBvciBhIGxpYnJhcnkuCisJICovCisJcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBjb3B5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6CisJCQkJcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuaXNFeHBvcnRlZCgpKTsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgorCQkJCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkodGhpcy5kZXN0aW5hdGlvbiwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKKwkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuaXNFeHBvcnRlZCgpKTsKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6CisJCQkJcmV0dXJuIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHRoaXMuZGVzdGluYXRpb24sIGVudHJ5LmdldEV4Y2x1c2lvblBhdHRlcm5zKCksIGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkpOworCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgorCQkJCXJldHVybiBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMuZ2V0RWxlbWVudFRvUHJvY2VzcygpKSk7CisJCX0KKwl9CisJcHVibGljIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZlcmlmeSgpOworCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisJCWlmIChyb290ID09IG51bGwgfHwgIXJvb3QuZXhpc3RzKCkpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgcm9vdCk7CisJCX0KKworCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCWlmIChyZXNvdXJjZS5pc0xpbmtlZCgpKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1JFU09VUkNFLCByb290KTsKKwkJCX0KKwkJfQorCisJCWlmICgodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuREVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEgpICE9IDApIHsKKwkJCVN0cmluZyBkZXN0UHJvamVjdE5hbWUgPSB0aGlzLmRlc3RpbmF0aW9uLnNlZ21lbnQoMCk7CisJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGRlc3RQcm9qZWN0TmFtZSk7CisJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeworCQkJCXRyeSB7CisJCQkJCUlKYXZhUHJvamVjdCBkZXN0UHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZGVzdENsYXNzcGF0aCA9IGRlc3RQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQkJCQlib29sZWFuIGZvdW5kU2libGluZyA9IGZhbHNlOworCQkJCQlib29sZWFuIGZvdW5kRXhpc3RpbmdFbnRyeSA9IGZhbHNlOworCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZGVzdENsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZGVzdENsYXNzcGF0aFtpXTsKKwkJCQkJCWlmIChlbnRyeS5lcXVhbHModGhpcy5zaWJsaW5nKSkgeworCQkJCQkJCWZvdW5kU2libGluZyA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyh0aGlzLmRlc3RpbmF0aW9uKSkgeworCQkJCQkJCWZvdW5kRXhpc3RpbmdFbnRyeSA9IHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHRoaXMuc2libGluZyAhPSBudWxsICYmICFmb3VuZFNpYmxpbmcpIHsKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9TSUJMSU5HLCB0aGlzLnNpYmxpbmcgPT0gbnVsbCA/ICJudWxsIiA6IHRoaXMuc2libGluZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWlmIChmb3VuZEV4aXN0aW5nRW50cnkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpID09IDApIHsKKwkJCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAorCQkJCQkJCVV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCB0aGlzLmRlc3RpbmF0aW9uLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBmN2VlN2FiLi5lZjJmZTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Db3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsNDcgKzEsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5ET01GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKIAogLyoqCkBAIC04OSwzMTUgKzY3LDM5NSBAQAogCSAqIFRoZSBsaXN0IG9mIG5ldyByZXNvdXJjZXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvcGVyYXRpb24uCiAJICovCiAJcHJvdGVjdGVkIEFycmF5TGlzdCBmQ3JlYXRlZEVsZW1lbnRzOwotLyoqCi0gKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKLSAqIGdpdmVuIGNvbnRhaW5lcnMuICBUaGUgcmVzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbiBjb250YWluZXJzIG11c3QgYmUgaW4KLSAqIHRoZSBjb3JyZWN0IG9yZGVyLiBJZiB0aGVyZSBpcyA+IDEgZGVzdGluYXRpb24sIHRoZSBudW1iZXIgb2YgZGVzdGluYXRpb25zCi0gKiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGJlaW5nIGNvcGllZC9tb3ZlZC4KLSAqLwotcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50W10gZGVzdENvbnRhaW5lcnMsIGJvb2xlYW4gZm9yY2UpIHsKLQlzdXBlcihyZXNvdXJjZXNUb0NvcHksIGRlc3RDb250YWluZXJzLCBmb3JjZSk7Ci0JZkZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOwotfQotLyoqCi0gKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKLSAqIGdpdmVuIGNvbnRhaW5lci4KLSAqLwotcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50IGRlc3RDb250YWluZXIsIGJvb2xlYW4gZm9yY2UpIHsKLQl0aGlzKHJlc291cmNlc1RvQ29weSwgbmV3IElKYXZhRWxlbWVudFtde2Rlc3RDb250YWluZXJ9LCBmb3JjZSk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIDxjb2RlPnNvdXJjZTwvY29kZT4gd2hpY2ggYXJlIGFmZmVjdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgotICogSWYgPGNvZGU+c291cmNlPC9jb2RlPiBpcyBhIDxjb2RlPktfU09VUkNFPC9jb2RlPiwgdGhlc2UgYXJlIHRoZSA8Y29kZT4uamF2YTwvY29kZT4KLSAqIGZpbGVzLCBpZiBpdCBpcyBhIDxjb2RlPktfQklOQVJZPC9jb2RlPiwgdGhleSBhcmUgdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuCi0gKi8KLXByaXZhdGUgSVJlc291cmNlW10gY29sbGVjdFJlc291cmNlc09mSW50ZXJlc3QoSVBhY2thZ2VGcmFnbWVudCBzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gc291cmNlLmdldENoaWxkcmVuKCk7Ci0JaW50IGNoaWxkT2ZJbnRlcmVzdCA9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOwotCWlmIChzb3VyY2UuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZKSB7Ci0JCWNoaWxkT2ZJbnRlcmVzdCA9IElKYXZhRWxlbWVudC5DTEFTU19GSUxFOworCS8qKgorCSAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgY29weSB0aGUgZ2l2ZW4gcmVzb3VyY2VzIHRvIHRoZQorCSAqIGdpdmVuIGNvbnRhaW5lcnMuICBUaGUgcmVzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbiBjb250YWluZXJzIG11c3QgYmUgaW4KKwkgKiB0aGUgY29ycmVjdCBvcmRlci4gSWYgdGhlcmUgaXMgPiAxIGRlc3RpbmF0aW9uLCB0aGUgbnVtYmVyIG9mIGRlc3RpbmF0aW9ucworCSAqIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgYmVpbmcgY29waWVkL21vdmVkLgorCSAqLworCXB1YmxpYyBDb3B5UmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSByZXNvdXJjZXNUb0NvcHksIElKYXZhRWxlbWVudFtdIGRlc3RDb250YWluZXJzLCBib29sZWFuIGZvcmNlKSB7CisJCXN1cGVyKHJlc291cmNlc1RvQ29weSwgZGVzdENvbnRhaW5lcnMsIGZvcmNlKTsKKwkJZkZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOwogCX0KLQlBcnJheUxpc3QgY29ycmVjdEtpbmRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCUlKYXZhRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQlpZiAoY2hpbGQuZ2V0RWxlbWVudFR5cGUoKSA9PSBjaGlsZE9mSW50ZXJlc3QpIHsKLQkJCWNvcnJlY3RLaW5kQ2hpbGRyZW4uYWRkKGNoaWxkLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKKwkvKioKKwkgKiBXaGVuIGV4ZWN1dGVkLCB0aGlzIG9wZXJhdGlvbiB3aWxsIGNvcHkgdGhlIGdpdmVuIHJlc291cmNlcyB0byB0aGUKKwkgKiBnaXZlbiBjb250YWluZXIuCisJICovCisJcHVibGljIENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIHJlc291cmNlc1RvQ29weSwgSUphdmFFbGVtZW50IGRlc3RDb250YWluZXIsIGJvb2xlYW4gZm9yY2UpIHsKKwkJdGhpcyhyZXNvdXJjZXNUb0NvcHksIG5ldyBJSmF2YUVsZW1lbnRbXXtkZXN0Q29udGFpbmVyfSwgZm9yY2UpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbiBvZiA8Y29kZT5zb3VyY2U8L2NvZGU+IHdoaWNoIGFyZSBhZmZlY3RlZCBieSB0aGlzIG9wZXJhdGlvbi4KKwkgKiBJZiA8Y29kZT5zb3VyY2U8L2NvZGU+IGlzIGEgPGNvZGU+S19TT1VSQ0U8L2NvZGU+LCB0aGVzZSBhcmUgdGhlIDxjb2RlPi5qYXZhPC9jb2RlPgorCSAqIGZpbGVzLCBpZiBpdCBpcyBhIDxjb2RlPktfQklOQVJZPC9jb2RlPiwgdGhleSBhcmUgdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuCisJICovCisJcHJpdmF0ZSBJUmVzb3VyY2VbXSBjb2xsZWN0UmVzb3VyY2VzT2ZJbnRlcmVzdChJUGFja2FnZUZyYWdtZW50IHNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gc291cmNlLmdldENoaWxkcmVuKCk7CisJCWludCBjaGlsZE9mSW50ZXJlc3QgPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDsKKwkJaWYgKHNvdXJjZS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpIHsKKwkJCWNoaWxkT2ZJbnRlcmVzdCA9IElKYXZhRWxlbWVudC5DTEFTU19GSUxFOwogCQl9Ci0JfQotCS8vIEdhdGhlciBub24tamF2YSByZXNvdXJjZXMKLQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gc291cmNlLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQlpbnQgYWN0dWFsTm9uSmF2YVJlc291cmNlQ291bnQgPSAwOwotCWZvciAoaW50IGkgPSAwLCBtYXggPSBub25KYXZhUmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKLQkJaWYgKG5vbkphdmFSZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50Kys7Ci0JfQotCUlSZXNvdXJjZVtdIGFjdHVhbE5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW2FjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50XTsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gbm9uSmF2YVJlc291cmNlcy5sZW5ndGgsIGluZGV4ID0gMDsgaSA8IG1heDsgaSsrKXsKLQkJaWYgKG5vbkphdmFSZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIGFjdHVhbE5vbkphdmFSZXNvdXJjZXNbaW5kZXgrK10gPSAoSVJlc291cmNlKW5vbkphdmFSZXNvdXJjZXNbaV07Ci0JfQotCQotCWlmIChhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCAhPSAwKSB7Ci0JCWludCBjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSA9IGNvcnJlY3RLaW5kQ2hpbGRyZW4uc2l6ZSgpOwotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgSVJlc291cmNlW2NvcnJlY3RLaW5kQ2hpbGRyZW5TaXplICsgYWN0dWFsTm9uSmF2YVJlc291cmNlQ291bnRdOwotCQljb3JyZWN0S2luZENoaWxkcmVuLnRvQXJyYXkocmVzdWx0KTsKLQkJU3lzdGVtLmFycmF5Y29weShhY3R1YWxOb25KYXZhUmVzb3VyY2VzLCAwLCByZXN1bHQsIGNvcnJlY3RLaW5kQ2hpbGRyZW5TaXplLCBhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfSBlbHNlIHsKLQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVtjb3JyZWN0S2luZENoaWxkcmVuLnNpemUoKV07Ci0JCWNvcnJlY3RLaW5kQ2hpbGRyZW4udG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KLS8qKgotICogQ3JlYXRlcyBhbnkgZGVzdGluYXRpb24gcGFja2FnZSBmcmFnbWVudChzKSB3aGljaCBkbyBub3QgZXhpc3RzIHlldC4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZU5lZWRlZFBhY2thZ2VGcmFnbWVudHMoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgU3RyaW5nIG5ld0ZyYWdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhID0gZ2V0RGVsdGFGb3Iocm9vdC5nZXRKYXZhUHJvamVjdCgpKTsKLQlTdHJpbmdbXSBuYW1lcyA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lcyhuZXdGcmFnTmFtZSk7Ci0JU3RyaW5nQnVmZmVyIHNpZGVFZmZlY3RQYWNrYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBzdWJGb2xkZXJOYW1lID0gbmFtZXNbaV07Ci0JCXNpZGVFZmZlY3RQYWNrYWdlTmFtZS5hcHBlbmQoc3ViRm9sZGVyTmFtZSk7Ci0JCUlSZXNvdXJjZSBzdWJGb2xkZXIgPSBwYXJlbnRGb2xkZXIuZmluZE1lbWJlcihzdWJGb2xkZXJOYW1lKTsKLQkJaWYgKHN1YkZvbGRlciA9PSBudWxsKSB7Ci0JCQljcmVhdGVGb2xkZXIocGFyZW50Rm9sZGVyLCBzdWJGb2xkZXJOYW1lLCBmRm9yY2UpOwotCQkJcGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aChzdWJGb2xkZXJOYW1lKSk7Ci0JCQlJUGFja2FnZUZyYWdtZW50IHNpZGVFZmZlY3RQYWNrYWdlID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoc2lkZUVmZmVjdFBhY2thZ2VOYW1lLnRvU3RyaW5nKCkpOwotCQkJaWYgKGkgPCBuYW1lcy5sZW5ndGggLSAxKSB7IC8vIGFsbCBidXQgdGhlIGxhc3Qgb25lIGFyZSBzaWRlIGVmZmVjdCBwYWNrYWdlcwotCQkJCXByb2plY3REZWx0YS5hZGRlZChzaWRlRWZmZWN0UGFja2FnZSk7CisJCUFycmF5TGlzdCBjb3JyZWN0S2luZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbi5sZW5ndGgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YUVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCWlmIChjaGlsZC5nZXRFbGVtZW50VHlwZSgpID09IGNoaWxkT2ZJbnRlcmVzdCkgeworCQkJCWNvcnJlY3RLaW5kQ2hpbGRyZW4uYWRkKGNoaWxkLmdldFJlc291cmNlKCkpOwogCQkJfQotCQkJZkNyZWF0ZWRFbGVtZW50cy5hZGQoc2lkZUVmZmVjdFBhY2thZ2UpOworCQl9CisJCS8vIEdhdGhlciBub24tamF2YSByZXNvdXJjZXMKKwkJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IHNvdXJjZS5nZXROb25KYXZhUmVzb3VyY2VzKCk7CisJCWludCBhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCA9IDA7CisJCWZvciAoaW50IGkgPSAwLCBtYXggPSBub25KYXZhUmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKKwkJCWlmIChub25KYXZhUmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSBhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCsrOworCQl9CisJCUlSZXNvdXJjZVtdIGFjdHVhbE5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW2FjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50XTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoLCBpbmRleCA9IDA7IGkgPCBtYXg7IGkrKyl7CisJCQlpZiAobm9uSmF2YVJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgYWN0dWFsTm9uSmF2YVJlc291cmNlc1tpbmRleCsrXSA9IChJUmVzb3VyY2Upbm9uSmF2YVJlc291cmNlc1tpXTsKKwkJfQorCQkKKwkJaWYgKGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50ICE9IDApIHsKKwkJCWludCBjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSA9IGNvcnJlY3RLaW5kQ2hpbGRyZW4uc2l6ZSgpOworCQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVtjb3JyZWN0S2luZENoaWxkcmVuU2l6ZSArIGFjdHVhbE5vbkphdmFSZXNvdXJjZUNvdW50XTsKKwkJCWNvcnJlY3RLaW5kQ2hpbGRyZW4udG9BcnJheShyZXN1bHQpOworCQkJU3lzdGVtLmFycmF5Y29weShhY3R1YWxOb25KYXZhUmVzb3VyY2VzLCAwLCByZXN1bHQsIGNvcnJlY3RLaW5kQ2hpbGRyZW5TaXplLCBhY3R1YWxOb25KYXZhUmVzb3VyY2VDb3VudCk7CisJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGVsc2UgewotCQkJcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHN1YkZvbGRlcjsKKwkJCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbY29ycmVjdEtpbmRDaGlsZHJlbi5zaXplKCldOworCQkJY29ycmVjdEtpbmRDaGlsZHJlbi50b0FycmF5KHJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OwogCQl9Ci0JCXNpZGVFZmZlY3RQYWNrYWdlTmFtZS5hcHBlbmQoJy4nKTsKIAl9Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+IGZvciA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4sCi0gKiBjcmVhdGluZyBpdCBhbmQgcHV0dGluZyBpdCBpbiA8Y29kZT5mRGVsdGFzUGVyUHJvamVjdDwvY29kZT4gaWYKLSAqIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAqLwotcHJpdmF0ZSBKYXZhRWxlbWVudERlbHRhIGdldERlbHRhRm9yKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSAoSmF2YUVsZW1lbnREZWx0YSkgZkRlbHRhc1BlclByb2plY3QuZ2V0KGphdmFQcm9qZWN0KTsKLQlpZiAoZGVsdGEgPT0gbnVsbCkgewotCQlkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGphdmFQcm9qZWN0KTsKLQkJZkRlbHRhc1BlclByb2plY3QucHV0KGphdmFQcm9qZWN0LCBkZWx0YSk7Ci0JfQotCXJldHVybiBkZWx0YTsKLX0KLS8qKgotICogQHNlZSBNdWx0aU9wZXJhdGlvbgotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKLQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5iaW5kKCJvcGVyYXRpb24uY29weVJlc291cmNlUHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBTZXRzIHRoZSBkZWx0YXMgdG8gcmVnaXN0ZXIgdGhlIGNoYW5nZXMgcmVzdWx0aW5nIGZyb20gdGhpcyBvcGVyYXRpb24KLSAqIGZvciB0aGlzIHNvdXJjZSBlbGVtZW50IGFuZCBpdHMgZGVzdGluYXRpb24uCi0gKiBJZiB0aGUgb3BlcmF0aW9uIGlzIGEgY3Jvc3MgcHJvamVjdCBvcGVyYXRpb248dWw+Ci0gKiA8bGk+T24gYSBjb3B5LCB0aGUgZGVsdGEgc2hvdWxkIGJlIHJvb3RlZCBpbiB0aGUgZGVzdCBwcm9qZWN0Ci0gKiA8bGk+T24gYSBtb3ZlLCB0d28gZGVsdGFzIGFyZSBnZW5lcmF0ZWQ8dWw+Ci0gKiAJCQk8bGk+b25lIHJvb3RlZCBpbiB0aGUgc291cmNlIHByb2plY3QKLSAqCQkJPGxpPm9uZSByb290ZWQgaW4gdGhlIGRlc3RpbmF0aW9uIHByb2plY3Q8L3VsPjwvdWw+Ci0gKiBJZiB0aGUgb3BlcmF0aW9uIGlzIHJvb3RlZCBpbiBhIHNpbmdsZSBwcm9qZWN0LCB0aGUgZGVsdGEgaXMgcm9vdGVkIGluIHRoYXQgcHJvamVjdAotICogCSAKLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJlcGFyZURlbHRhcyhJSmF2YUVsZW1lbnQgc291cmNlRWxlbWVudCwgSUphdmFFbGVtZW50IGRlc3RpbmF0aW9uRWxlbWVudCkgewotCUlKYXZhUHJvamVjdCBkZXN0UHJvamVjdCA9IGRlc3RpbmF0aW9uRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwotCWlmIChpc01vdmUoKSkgewotCQlJSmF2YVByb2plY3Qgc291cmNlUHJvamVjdCA9IHNvdXJjZUVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLQkJZ2V0RGVsdGFGb3Ioc291cmNlUHJvamVjdCkubW92ZWRGcm9tKHNvdXJjZUVsZW1lbnQsIGRlc3RpbmF0aW9uRWxlbWVudCk7Ci0JCWdldERlbHRhRm9yKGRlc3RQcm9qZWN0KS5tb3ZlZFRvKGRlc3RpbmF0aW9uRWxlbWVudCwgc291cmNlRWxlbWVudCk7Ci0JfSBlbHNlIHsKLQkJZ2V0RGVsdGFGb3IoZGVzdFByb2plY3QpLmFkZGVkKGRlc3RpbmF0aW9uRWxlbWVudCk7Ci0JfQotfQotLyoqCi0gKiBDb3BpZXMvbW92ZXMgYSBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlIG5hbWUgPGNvZGU+bmV3Q1VOYW1lPC9jb2RlPgotICogdG8gdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UuPGJyPgotICogVGhlIHBhY2thZ2Ugc3RhdGVtZW50IGluIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIHVwZGF0ZWQgaWYgbmVjZXNzYXJ5LgotICogVGhlIG1haW4gdHlwZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyByZW5hbWVkIGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHVuYWJsZSB0bwotICogY29tcGxldGUKLSAqLwotcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21waWxhdGlvblVuaXRSZXNvdXJjZShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSwgSVBhY2thZ2VGcmFnbWVudCBkZXN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgbmV3Q1VOYW1lID0gZ2V0TmV3TmFtZUZvcihzb3VyY2UpOwotCVN0cmluZyBkZXN0TmFtZSA9IChuZXdDVU5hbWUgIT0gbnVsbCkgPyBuZXdDVU5hbWUgOiBzb3VyY2UuZ2V0RWxlbWVudE5hbWUoKTsKLQlTdHJpbmcgbmV3Q29udGVudCA9IHVwZGF0ZWRDb250ZW50KHNvdXJjZSwgZGVzdCwgbmV3Q1VOYW1lKTsgLy8gbnVsbCBpZiB1bmNoYW5nZWQKLQotCS8vIGNvcHkgcmVzb3VyY2UKLQlJRmlsZSBzb3VyY2VSZXNvdXJjZSA9IChJRmlsZSkoc291cmNlLmlzV29ya2luZ0NvcHkoKSA/IHNvdXJjZS5nZXRPcmlnaW5hbEVsZW1lbnQoKSA6IHNvdXJjZSkuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JSUNvbnRhaW5lciBkZXN0Rm9sZGVyID0gKElDb250YWluZXIpZGVzdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsgLy8gY2FuIGJlIGFuIElGb2xkZXIgb3IgYW4gSVByb2plY3QKLQlJRmlsZSBkZXN0RmlsZSA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChkZXN0TmFtZSkpOwotCWlmICghZGVzdEZpbGUuZXF1YWxzKHNvdXJjZVJlc291cmNlKSkgewotCQl0cnkgewotCQkJaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGZGb3JjZSkgewotCQkJCQkvLyB3ZSBjYW4gcmVtb3ZlIGl0Ci0JCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RGaWxlLCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBhYm9ydAotCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikpOworCS8qKgorCSAqIENyZWF0ZXMgYW55IGRlc3RpbmF0aW9uIHBhY2thZ2UgZnJhZ21lbnQocykgd2hpY2ggZG8gbm90IGV4aXN0cyB5ZXQuCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU5lZWRlZFBhY2thZ2VGcmFnbWVudHMoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIsIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZyBuZXdGcmFnTmFtZSwgYm9vbGVhbiBtb3ZlRm9sZGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRSZXNvdXJjZSgpOworCQlKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSA9IG51bGw7CisJCVN0cmluZ1tdIG5hbWVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5nZXRUcmltbWVkU2ltcGxlTmFtZXMobmV3RnJhZ05hbWUpOworCQlTdHJpbmdCdWZmZXIgc2lkZUVmZmVjdFBhY2thZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQljaGFyW11bXSBleGNsdXNpb25zUGF0dGVybnMgPSAoKFBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdCkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgc3ViRm9sZGVyTmFtZSA9IG5hbWVzW2ldOworCQkJc2lkZUVmZmVjdFBhY2thZ2VOYW1lLmFwcGVuZChzdWJGb2xkZXJOYW1lKTsKKwkJCUlSZXNvdXJjZSBzdWJGb2xkZXIgPSBwYXJlbnRGb2xkZXIuZmluZE1lbWJlcihzdWJGb2xkZXJOYW1lKTsKKwkJCWlmIChzdWJGb2xkZXIgPT0gbnVsbCkgeworCQkJCS8vIGNyZWF0ZSBkZWVwZXN0IGZvbGRlciBvbmx5IGlmIG5vdCBhIG1vdmUgKGZvbGRlciB3aWxsIGJlIG1vdmVkIGluIHByb2Nlc3NQYWNrYWdlRnJhZ21lbnRSZXNvdXJjZSkKKwkJCQlpZiAoIShtb3ZlRm9sZGVyICYmIGkgPT0gbmFtZXMubGVuZ3RoLTEpKSB7CisJCQkJCWNyZWF0ZUZvbGRlcihwYXJlbnRGb2xkZXIsIHN1YkZvbGRlck5hbWUsIGZGb3JjZSk7CiAJCQkJfQotCQkJfQotCQkJaW50IGZsYWdzID0gbmV3Q29udGVudCAhPSBudWxsID8gSVJlc291cmNlLk5PTkUgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZOwotCQkJaWYgKGZGb3JjZSkgZmxhZ3MgfD0gSVJlc291cmNlLkZPUkNFOwotCQkJaWYgKHRoaXMuaXNNb3ZlKCkpIHsKLQkJCQlzb3VyY2VSZXNvdXJjZS5tb3ZlKGRlc3RGaWxlLmdldEZ1bGxQYXRoKCksIGZsYWdzLCBnZXRTdWJQcm9ncmVzc01vbml0b3IoMSkpOworCQkJCXBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOworCQkJCXNvdXJjZUZvbGRlciA9IHNvdXJjZUZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOworCQkJCWlmIChzb3VyY2VGb2xkZXIuaXNSZWFkT25seSgpKSB7CisJCQkJCXBhcmVudEZvbGRlci5zZXRSZWFkT25seSh0cnVlKTsKKwkJCQl9CisJCQkJSVBhY2thZ2VGcmFnbWVudCBzaWRlRWZmZWN0UGFja2FnZSA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHNpZGVFZmZlY3RQYWNrYWdlTmFtZS50b1N0cmluZygpKTsKKwkJCQlpZiAoaSA8IG5hbWVzLmxlbmd0aCAtIDEgLy8gYWxsIGJ1dCB0aGUgbGFzdCBvbmUgYXJlIHNpZGUgZWZmZWN0IHBhY2thZ2VzCisJCQkJCQkmJiAhb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5pc0V4Y2x1ZGVkKHBhcmVudEZvbGRlciwgZXhjbHVzaW9uc1BhdHRlcm5zKSkgeyAKKwkJCQkJaWYgKHByb2plY3REZWx0YSA9PSBudWxsKSB7CisJCQkJCQlwcm9qZWN0RGVsdGEgPSBnZXREZWx0YUZvcihyb290LmdldEphdmFQcm9qZWN0KCkpOworCQkJCQl9CisJCQkJCXByb2plY3REZWx0YS5hZGRlZChzaWRlRWZmZWN0UGFja2FnZSk7CisJCQkJfQorCQkJCWZDcmVhdGVkRWxlbWVudHMuYWRkKHNpZGVFZmZlY3RQYWNrYWdlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJc291cmNlUmVzb3VyY2UuY29weShkZXN0RmlsZS5nZXRGdWxsUGF0aCgpLCBmbGFncywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCQlwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgc3ViRm9sZGVyOwogCQkJfQotCQkJdGhpcy5oYXNNb2RpZmllZFJlc291cmNlID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCXNpZGVFZmZlY3RQYWNrYWdlTmFtZS5hcHBlbmQoJy4nKTsKIAkJfQotCi0JCS8vIHVwZGF0ZSBuZXcgcmVzb3VyY2UgY29udGVudAotCQl0cnkgewotCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCl7Ci0JCQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOwotCQkJCWRlc3RGaWxlLnNldENvbnRlbnRzKAotCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RpbmcgPT0gbnVsbCA/IG5ld0NvbnRlbnQuZ2V0Qnl0ZXMoKSA6IG5ld0NvbnRlbnQuZ2V0Qnl0ZXMoZW5jb2RpbmcpKSwgCi0JCQkJCWZGb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAotCQkJCQlnZXRTdWJQcm9ncmVzc01vbml0b3IoMSkpOwotCQkJfQotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+IGZvciA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4sCisJICogY3JlYXRpbmcgaXQgYW5kIHB1dHRpbmcgaXQgaW4gPGNvZGU+ZkRlbHRhc1BlclByb2plY3Q8L2NvZGU+IGlmCisJICogaXQgZG9lcyBub3QgZXhpc3QgeWV0LgorCSAqLworCXByaXZhdGUgSmF2YUVsZW1lbnREZWx0YSBnZXREZWx0YUZvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKwkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IChKYXZhRWxlbWVudERlbHRhKSBmRGVsdGFzUGVyUHJvamVjdC5nZXQoamF2YVByb2plY3QpOworCQlpZiAoZGVsdGEgPT0gbnVsbCkgeworCQkJZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShqYXZhUHJvamVjdCk7CisJCQlmRGVsdGFzUGVyUHJvamVjdC5wdXQoamF2YVByb2plY3QsIGRlbHRhKTsKIAkJfQorCQlyZXR1cm4gZGVsdGE7CisJfQorCS8qKgorCSAqIEBzZWUgTXVsdGlPcGVyYXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwuYmluZCgib3BlcmF0aW9uLmNvcHlSZXNvdXJjZVByb2dyZXNzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJLyoqCisJICogU2V0cyB0aGUgZGVsdGFzIHRvIHJlZ2lzdGVyIHRoZSBjaGFuZ2VzIHJlc3VsdGluZyBmcm9tIHRoaXMgb3BlcmF0aW9uCisJICogZm9yIHRoaXMgc291cmNlIGVsZW1lbnQgYW5kIGl0cyBkZXN0aW5hdGlvbi4KKwkgKiBJZiB0aGUgb3BlcmF0aW9uIGlzIGEgY3Jvc3MgcHJvamVjdCBvcGVyYXRpb248dWw+CisJICogPGxpPk9uIGEgY29weSwgdGhlIGRlbHRhIHNob3VsZCBiZSByb290ZWQgaW4gdGhlIGRlc3QgcHJvamVjdAorCSAqIDxsaT5PbiBhIG1vdmUsIHR3byBkZWx0YXMgYXJlIGdlbmVyYXRlZDx1bD4KKwkgKiAJCQk8bGk+b25lIHJvb3RlZCBpbiB0aGUgc291cmNlIHByb2plY3QKKwkgKgkJCTxsaT5vbmUgcm9vdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0PC91bD48L3VsPgorCSAqIElmIHRoZSBvcGVyYXRpb24gaXMgcm9vdGVkIGluIGEgc2luZ2xlIHByb2plY3QsIHRoZSBkZWx0YSBpcyByb290ZWQgaW4gdGhhdCBwcm9qZWN0CisJICogCSAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRGVsdGFzKElKYXZhRWxlbWVudCBzb3VyY2VFbGVtZW50LCBJSmF2YUVsZW1lbnQgZGVzdGluYXRpb25FbGVtZW50LCBib29sZWFuIGlzTW92ZSkgeworCQlpZiAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5pc0V4Y2x1ZGVkKHNvdXJjZUVsZW1lbnQpIHx8IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwuaXNFeGNsdWRlZChkZXN0aW5hdGlvbkVsZW1lbnQpKSByZXR1cm47CisJCUlKYXZhUHJvamVjdCBkZXN0UHJvamVjdCA9IGRlc3RpbmF0aW9uRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOworCQlpZiAoaXNNb3ZlKSB7CisJCQlJSmF2YVByb2plY3Qgc291cmNlUHJvamVjdCA9IHNvdXJjZUVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKKwkJCWdldERlbHRhRm9yKHNvdXJjZVByb2plY3QpLm1vdmVkRnJvbShzb3VyY2VFbGVtZW50LCBkZXN0aW5hdGlvbkVsZW1lbnQpOworCQkJZ2V0RGVsdGFGb3IoZGVzdFByb2plY3QpLm1vdmVkVG8oZGVzdGluYXRpb25FbGVtZW50LCBzb3VyY2VFbGVtZW50KTsKKwkJfSBlbHNlIHsKKwkJCWdldERlbHRhRm9yKGRlc3RQcm9qZWN0KS5hZGRlZChkZXN0aW5hdGlvbkVsZW1lbnQpOworCQl9CisJfQorCS8qKgorCSAqIENvcGllcy9tb3ZlcyBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUgbmFtZSA8Y29kZT5uZXdDVU5hbWU8L2NvZGU+CisJICogdG8gdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UuPGJyPgorCSAqIFRoZSBwYWNrYWdlIHN0YXRlbWVudCBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyB1cGRhdGVkIGlmIG5lY2Vzc2FyeS4KKwkgKiBUaGUgbWFpbiB0eXBlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIHJlbmFtZWQgaWYgbmVjZXNzYXJ5LgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyB1bmFibGUgdG8KKwkgKiBjb21wbGV0ZQorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UsIElQYWNrYWdlRnJhZ21lbnQgZGVzdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVN0cmluZyBuZXdDVU5hbWUgPSBnZXROZXdOYW1lRm9yKHNvdXJjZSk7CisJCVN0cmluZyBkZXN0TmFtZSA9IChuZXdDVU5hbWUgIT0gbnVsbCkgPyBuZXdDVU5hbWUgOiBzb3VyY2UuZ2V0RWxlbWVudE5hbWUoKTsKKwkJU3RyaW5nIG5ld0NvbnRlbnQgPSB1cGRhdGVkQ29udGVudChzb3VyY2UsIGRlc3QsIG5ld0NVTmFtZSk7IC8vIG51bGwgaWYgdW5jaGFuZ2VkCiAJCi0JCS8vIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IGNoYW5nZSBkZWx0YXMKLQkJSUNvbXBpbGF0aW9uVW5pdCBkZXN0Q1UgPSBkZXN0LmdldENvbXBpbGF0aW9uVW5pdChkZXN0TmFtZSk7Ci0JCXByZXBhcmVEZWx0YXMoc291cmNlLCBkZXN0Q1UpOwotCQlpZiAobmV3Q1VOYW1lICE9IG51bGwpIHsKLQkJCS8vdGhlIG1haW4gdHlwZSBoYXMgYmVlbiByZW5hbWVkCi0JCQlTdHJpbmcgb2xkTmFtZSA9IHNvdXJjZS5nZXRFbGVtZW50TmFtZSgpOwotCQkJb2xkTmFtZSA9IG9sZE5hbWUuc3Vic3RyaW5nKDAsIG9sZE5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCVN0cmluZyBuZXdOYW1lID0gbmV3Q1VOYW1lOwotCQkJbmV3TmFtZSA9IG5ld05hbWUuc3Vic3RyaW5nKDAsIG5ld05hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCXByZXBhcmVEZWx0YXMoc291cmNlLmdldFR5cGUob2xkTmFtZSksIGRlc3RDVS5nZXRUeXBlKG5ld05hbWUpKTsKKwkJLy8gY29weSByZXNvdXJjZQorCQlJRmlsZSBzb3VyY2VSZXNvdXJjZSA9IChJRmlsZSkoc291cmNlLmlzV29ya2luZ0NvcHkoKSA/IHNvdXJjZS5nZXRPcmlnaW5hbEVsZW1lbnQoKSA6IHNvdXJjZSkuZ2V0UmVzb3VyY2UoKTsKKwkJSUNvbnRhaW5lciBkZXN0Rm9sZGVyID0gKElDb250YWluZXIpZGVzdC5nZXRSZXNvdXJjZSgpOyAvLyBjYW4gYmUgYW4gSUZvbGRlciBvciBhbiBJUHJvamVjdAorCQlJRmlsZSBkZXN0RmlsZSA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChkZXN0TmFtZSkpOworCQlpZiAoIWRlc3RGaWxlLmVxdWFscyhzb3VyY2VSZXNvdXJjZSkpIHsKKwkJCXRyeSB7CisJCQkJaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7CisJCQkJCWlmIChmRm9yY2UpIHsKKwkJCQkJCS8vIHdlIGNhbiByZW1vdmUgaXQKKwkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RGaWxlLCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGFib3J0CisJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCisJCQkJCQkJVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIsIGRlc3RGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJCWludCBmbGFncyA9IGZGb3JjZSA/IElSZXNvdXJjZS5GT1JDRSA6IElSZXNvdXJjZS5OT05FOworCQkJCWlmICh0aGlzLmlzTW92ZSgpKSB7CisJCQkJCWZsYWdzIHw9IElSZXNvdXJjZS5LRUVQX0hJU1RPUlk7CisJCQkJCXNvdXJjZVJlc291cmNlLm1vdmUoZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKSwgZmxhZ3MsIGdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCkgZmxhZ3MgfD0gSVJlc291cmNlLktFRVBfSElTVE9SWTsKKwkJCQkJc291cmNlUmVzb3VyY2UuY29weShkZXN0RmlsZS5nZXRGdWxsUGF0aCgpLCBmbGFncywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCQl9CisJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgZTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCQl9CisJCisJCQkvLyB1cGRhdGUgbmV3IHJlc291cmNlIGNvbnRlbnQKKwkJCXRyeSB7CisJCQkJaWYgKG5ld0NvbnRlbnQgIT0gbnVsbCl7CisJCQkJCVN0cmluZyBlbmNvZGluZyA9IHNvdXJjZS5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLCB0cnVlKTsKKwkJCQkJZGVzdEZpbGUuc2V0Q29udGVudHMoCisJCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RpbmcgPT0gbnVsbCA/IG5ld0NvbnRlbnQuZ2V0Qnl0ZXMoKSA6IG5ld0NvbnRlbnQuZ2V0Qnl0ZXMoZW5jb2RpbmcpKSwgCisJCQkJCQlmRm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwKKwkJCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQkJfQorCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJfQorCQkKKwkJCS8vIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IGNoYW5nZSBkZWx0YXMKKwkJCUlDb21waWxhdGlvblVuaXQgZGVzdENVID0gZGVzdC5nZXRDb21waWxhdGlvblVuaXQoZGVzdE5hbWUpOworCQkJcHJlcGFyZURlbHRhcyhzb3VyY2UsIGRlc3RDVSwgaXNNb3ZlKCkpOworCQkJaWYgKG5ld0NVTmFtZSAhPSBudWxsKSB7CisJCQkJLy90aGUgbWFpbiB0eXBlIGhhcyBiZWVuIHJlbmFtZWQKKwkJCQlTdHJpbmcgb2xkTmFtZSA9IHNvdXJjZS5nZXRFbGVtZW50TmFtZSgpOworCQkJCW9sZE5hbWUgPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxlbmd0aCgpIC0gNSk7CisJCQkJU3RyaW5nIG5ld05hbWUgPSBuZXdDVU5hbWU7CisJCQkJbmV3TmFtZSA9IG5ld05hbWUuc3Vic3RyaW5nKDAsIG5ld05hbWUubGVuZ3RoKCkgLSA1KTsKKwkJCQlwcmVwYXJlRGVsdGFzKHNvdXJjZS5nZXRUeXBlKG9sZE5hbWUpLCBkZXN0Q1UuZ2V0VHlwZShuZXdOYW1lKSwgaXNNb3ZlKCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFmRm9yY2UpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAorCQkJCQlVdGlsLmJpbmQoInN0YXR1cy5uYW1lQ29sbGlzaW9uIiwgZGVzdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQkvLyB1cGRhdGUgbmV3IHJlc291cmNlIGNvbnRlbnQKKwkJCS8vIGluIGNhc2Ugd2UgZG8gYSBzYXZlYXMgb24gdGhlIHNhbWUgcmVzb3VyY2Ugd2UgaGF2ZSB0byBzaW1wbHkgdXBkYXRlIHRoZSBjb250ZW50cworCQkJLy8gc2VlIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM1MQorCQkJdHJ5IHsKKwkJCQlpZiAobmV3Q29udGVudCAhPSBudWxsKXsKKwkJCQkJU3RyaW5nIGVuY29kaW5nID0gc291cmNlLmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOworCQkJCQlkZXN0RmlsZS5zZXRDb250ZW50cygKKwkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGluZyA9PSBudWxsID8gbmV3Q29udGVudC5nZXRCeXRlcygpIDogbmV3Q29udGVudC5nZXRCeXRlcyhlbmNvZGluZykpLCAKKwkJCQkJCWZGb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQkJfQorCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJfQogCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFmRm9yY2UpIHsKLQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKSk7CisJfQorCS8qKgorCSAqIFByb2Nlc3MgYWxsIG9mIHRoZSBjaGFuZ2VkIGRlbHRhcyBnZW5lcmF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlbHRhcygpIHsKKwkJZm9yIChJdGVyYXRvciBkZWx0YXMgPSB0aGlzLmZEZWx0YXNQZXJQcm9qZWN0LnZhbHVlcygpLml0ZXJhdG9yKCk7IGRlbHRhcy5oYXNOZXh0KCk7KXsKKwkJCWFkZERlbHRhKChJSmF2YUVsZW1lbnREZWx0YSkgZGVsdGFzLm5leHQoKSk7CiAJCX0KLQkJLy8gdXBkYXRlIG5ldyByZXNvdXJjZSBjb250ZW50Ci0JCS8vIGluIGNhc2Ugd2UgZG8gYSBzYXZlYXMgb24gdGhlIHNhbWUgcmVzb3VyY2Ugd2UgaGF2ZSB0byBzaW1wbHkgdXBkYXRlIHRoZSBjb250ZW50cwotCQkvLyBzZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzUxCisJfQorCS8qKgorCSAqIEBzZWUgTXVsdGlPcGVyYXRpb24KKwkgKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gPGNvZGU+cHJvY2Vzc0NvbXBpbGF0aW9uVW5pdFJlc291cmNlPC9jb2RlPiBvcgorCSAqIDxjb2RlPnByb2Nlc3NQYWNrYWdlRnJhZ21lbnRSZXNvdXJjZTwvY29kZT4sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZgorCSAqIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUphdmFFbGVtZW50IGRlc3QgPSBnZXREZXN0aW5hdGlvblBhcmVudChlbGVtZW50KTsKKwkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXRSZXNvdXJjZSgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCwgKElQYWNrYWdlRnJhZ21lbnQpIGRlc3QpOworCQkJCWZDcmVhdGVkRWxlbWVudHMuYWRkKCgoSVBhY2thZ2VGcmFnbWVudCkgZGVzdCkuZ2V0Q29tcGlsYXRpb25Vbml0KGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6CisJCQkJcHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlKChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50LCAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGRlc3QsIGdldE5ld05hbWVGb3IoZWxlbWVudCkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KSk7CisJCX0KKwl9CisJLyoqCisJICogQHNlZSBNdWx0aU9wZXJhdGlvbgorCSAqIE92ZXJyaWRkZW4gdG8gYWxsb3cgc3BlY2lhbCBwcm9jZXNzaW5nIG9mIDxjb2RlPkphdmFFbGVtZW50RGVsdGE8L2NvZGU+cworCSAqIGFuZCA8Y29kZT5mUmVzdWx0RWxlbWVudHM8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlmQ3JlYXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKTsKIAkJdHJ5IHsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpewotCQkJCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKLQkJCQlkZXN0RmlsZS5zZXRDb250ZW50cygKLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kaW5nID09IG51bGwgPyBuZXdDb250ZW50LmdldEJ5dGVzKCkgOiBuZXdDb250ZW50LmdldEJ5dGVzKGVuY29kaW5nKSksIAotCQkJCQlmRm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCi0JCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCQl9Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCXN1cGVyLnByb2Nlc3NFbGVtZW50cygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7CisJCQl0aHJvdyBqbWU7CisJCX0gZmluYWxseSB7CisJCQlmUmVzdWx0RWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W2ZDcmVhdGVkRWxlbWVudHMuc2l6ZSgpXTsKKwkJCWZDcmVhdGVkRWxlbWVudHMudG9BcnJheShmUmVzdWx0RWxlbWVudHMpOworCQkJcHJvY2Vzc0RlbHRhcygpOwogCQl9CiAJfQotfQotLyoqCi0gKiBQcm9jZXNzIGFsbCBvZiB0aGUgY2hhbmdlZCBkZWx0YXMgZ2VuZXJhdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVsdGFzKCkgewotCWZvciAoSXRlcmF0b3IgZGVsdGFzID0gdGhpcy5mRGVsdGFzUGVyUHJvamVjdC52YWx1ZXMoKS5pdGVyYXRvcigpOyBkZWx0YXMuaGFzTmV4dCgpOyl7Ci0JCWFkZERlbHRhKChJSmF2YUVsZW1lbnREZWx0YSkgZGVsdGFzLm5leHQoKSk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIE11bHRpT3BlcmF0aW9uCi0gKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gPGNvZGU+cHJvY2Vzc0NvbXBpbGF0aW9uVW5pdFJlc291cmNlPC9jb2RlPiBvcgotICogPGNvZGU+cHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlPC9jb2RlPiwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mCi0gKiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhRWxlbWVudCBkZXN0ID0gZ2V0RGVzdGluYXRpb25QYXJlbnQoZWxlbWVudCk7Ci0Jc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQsIChJUGFja2FnZUZyYWdtZW50KSBkZXN0KTsKLQkJCWZDcmVhdGVkRWxlbWVudHMuYWRkKCgoSVBhY2thZ2VGcmFnbWVudCkgZGVzdCkuZ2V0Q29tcGlsYXRpb25Vbml0KGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJcHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlKChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50LCAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGRlc3QsIGdldE5ld05hbWVGb3IoZWxlbWVudCkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQgOgotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KSk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIE11bHRpT3BlcmF0aW9uCi0gKiBPdmVycmlkZGVuIHRvIGFsbG93IHNwZWNpYWwgcHJvY2Vzc2luZyBvZiA8Y29kZT5KYXZhRWxlbWVudERlbHRhPC9jb2RlPnMKLSAqIGFuZCA8Y29kZT5mUmVzdWx0RWxlbWVudHM8L2NvZGU+LgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlmQ3JlYXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKTsKLQl0cnkgewotCQlzdXBlci5wcm9jZXNzRWxlbWVudHMoKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCXRocm93IGptZTsKLQl9IGZpbmFsbHkgewotCQlmUmVzdWx0RWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W2ZDcmVhdGVkRWxlbWVudHMuc2l6ZSgpXTsKLQkJZkNyZWF0ZWRFbGVtZW50cy50b0FycmF5KGZSZXN1bHRFbGVtZW50cyk7Ci0JCXByb2Nlc3NEZWx0YXMoKTsKLQl9Ci19Ci0vKioKLSAqIENvcGllcy9tb3ZlcyBhIHBhY2thZ2UgZnJhZ21lbnQgd2l0aCB0aGUgbmFtZSA8Y29kZT5uZXdOYW1lPC9jb2RlPgotICogdG8gdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UuPGJyPgotICoKLSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgdW5hYmxlIHRvCi0gKiBjb21wbGV0ZQotICovCi1wcml2YXRlIHZvaWQgcHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlKElQYWNrYWdlRnJhZ21lbnQgc291cmNlLCBJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJU3RyaW5nIG5ld0ZyYWdOYW1lID0gKG5ld05hbWUgPT0gbnVsbCkgPyBzb3VyY2UuZ2V0RWxlbWVudE5hbWUoKSA6IG5ld05hbWU7Ci0JCWNyZWF0ZU5lZWRlZFBhY2thZ2VGcmFnbWVudHMocm9vdCwgbmV3RnJhZ05hbWUpOwotCQlJUGFja2FnZUZyYWdtZW50IG5ld0ZyYWcgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChuZXdGcmFnTmFtZSk7Ci0KLQkJLy8gcHJvY2VzcyB0aGUgbGVhZiByZXNvdXJjZXMKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29sbGVjdFJlc291cmNlc09mSW50ZXJlc3Qoc291cmNlKTsKLQkJaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQlJUGF0aCBkZXN0UGF0aCA9IG5ld0ZyYWcuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChpc1JlbmFtZSgpKSB7Ci0JCQkJaWYgKCEgZGVzdFBhdGguZXF1YWxzKHNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpKSkgewotCQkJCQltb3ZlUmVzb3VyY2VzKHJlc291cmNlcywgZGVzdFBhdGgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXNNb3ZlKCkpIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlIGlmIHRoaXMgb3BlcmF0aW9uIHdhbnRzIHRvIG92ZXJyaWRlIGV4aXN0aW5nIHJlc291cmNlcwotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXNvdXJjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJSVJlc291cmNlIGRlc3RpbmF0aW9uUmVzb3VyY2UgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihkZXN0UGF0aC5hcHBlbmQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSkpOwotCQkJCQlpZiAoZGVzdGluYXRpb25SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZkZvcmNlKSB7Ci0JCQkJCQkJZGVsZXRlUmVzb3VyY2UoZGVzdGluYXRpb25SZXNvdXJjZSwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKSk7CisJLyoqCisJICogQ29waWVzL21vdmVzIGEgcGFja2FnZSBmcmFnbWVudCB3aXRoIHRoZSBuYW1lIDxjb2RlPm5ld05hbWU8L2NvZGU+CisJICogdG8gdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UuPGJyPgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyB1bmFibGUgdG8KKwkgKiBjb21wbGV0ZQorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzUGFja2FnZUZyYWdtZW50UmVzb3VyY2UoSVBhY2thZ2VGcmFnbWVudCBzb3VyY2UsIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVN0cmluZyBuZXdGcmFnTmFtZSA9IChuZXdOYW1lID09IG51bGwpID8gc291cmNlLmdldEVsZW1lbnROYW1lKCkgOiBuZXdOYW1lOworCQkJSVBhY2thZ2VGcmFnbWVudCBuZXdGcmFnID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQobmV3RnJhZ05hbWUpOworCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29sbGVjdFJlc291cmNlc09mSW50ZXJlc3Qoc291cmNlKTsKKwkJCQorCQkJLy8gaWYgaXNNb3ZlKCkgY2FuIHdlIG1vdmUgdGhlIGZvbGRlciBpdHNlbGYgPyAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNDU4KQorCQkJYm9vbGVhbiBzaG91bGRNb3ZlRm9sZGVyID0gaXNNb3ZlKCkgJiYgIW5ld0ZyYWcuZ2V0UmVzb3VyY2UoKS5leGlzdHMoKTsgLy8gaWYgbmV3IHBrZyBmcmFnbWVudCBleGlzdHMsIGl0IGlzIGFuIG92ZXJyaWRlCisJCQlJRm9sZGVyIHNyY0ZvbGRlciA9IChJRm9sZGVyKXNvdXJjZS5nZXRSZXNvdXJjZSgpOworCQkJSVBhdGggZGVzdFBhdGggPSBuZXdGcmFnLmdldFBhdGgoKTsKKwkJCWlmIChzaG91bGRNb3ZlRm9sZGVyKSB7CisJCQkJLy8gY2hlY2sgaWYgZGVzdGluYXRpb24gaXMgbm90IGluY2x1ZGVkIGluIHNvdXJjZQorCQkJCWlmIChzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKGRlc3RQYXRoKSkgeworCQkJCQlzaG91bGRNb3ZlRm9sZGVyID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIG5vIHN1Yi1wYWNrYWdlcworCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gc3JjRm9sZGVyLm1lbWJlcnMoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlpZiAoIG1lbWJlcnNbaV0gaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJCQkJc2hvdWxkTW92ZUZvbGRlciA9IGZhbHNlOworCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfQotCQkJCW1vdmVSZXNvdXJjZXMocmVzb3VyY2VzLCBkZXN0UGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gZGVsZXRlIHRoaXMgcmVzb3VyY2UgaWYgdGhpcyBvcGVyYXRpb24gd2FudHMgdG8gb3ZlcnJpZGUgZXhpc3RpbmcgcmVzb3VyY2VzCi0JCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgZGVzdGluYXRpb25SZXNvdXJjZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGRlc3RQYXRoLmFwcGVuZChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpKSk7Ci0JCQkJCWlmIChkZXN0aW5hdGlvblJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChmRm9yY2UpIHsKLQkJCQkJCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlIGlmIHRoaXMgb3BlcmF0aW9uIHdhbnRzIHRvIG92ZXJyaWRlIGV4aXN0aW5nIHJlc291cmNlcwotCQkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUmVzb3VyY2UsIElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNvcHlSZXNvdXJjZXMocmVzb3VyY2VzLCBkZXN0UGF0aCk7CisJCQkJfQkKIAkJCX0KKwkJCWNyZWF0ZU5lZWRlZFBhY2thZ2VGcmFnbWVudHMoKElDb250YWluZXIpIHNvdXJjZS5nZXRQYXJlbnQoKS5nZXRSZXNvdXJjZSgpLCByb290LCBuZXdGcmFnTmFtZSwgc2hvdWxkTW92ZUZvbGRlcik7CisJCisJCQkvLyBQcm9jZXNzIHJlc291cmNlcworCQkJaWYgKHNob3VsZE1vdmVGb2xkZXIpIHsKKwkJCQkvLyBtb3ZlIHVuZGVybHlpbmcgcmVzb3VyY2UKKwkJCQlzcmNGb2xkZXIubW92ZShkZXN0UGF0aCwgZkZvcmNlLCB0cnVlIC8qIGtlZXAgaGlzdG9yeSAqLywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJfSBlbHNlIHsKKwkJCQkvLyBwcm9jZXNzIHRoZSBsZWFmIHJlc291cmNlcworCQkJCWlmIChyZXNvdXJjZXMubGVuZ3RoID4gMCkgeworCQkJCQlpZiAoaXNSZW5hbWUoKSkgeworCQkJCQkJaWYgKCEgZGVzdFBhdGguZXF1YWxzKHNvdXJjZS5nZXRQYXRoKCkpKSB7CisJCQkJCQkJbW92ZVJlc291cmNlcyhyZXNvdXJjZXMsIGRlc3RQYXRoKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChpc01vdmUoKSkgeworCQkJCQkJLy8gd2UgbmVlZCB0byBkZWxldGUgdGhpcyByZXNvdXJjZSBpZiB0aGlzIG9wZXJhdGlvbiB3YW50cyB0byBvdmVycmlkZSBleGlzdGluZyByZXNvdXJjZXMKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXNvdXJjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlJUmVzb3VyY2UgZGVzdGluYXRpb25SZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihkZXN0UGF0aC5hcHBlbmQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSkpOworCQkJCQkJCWlmIChkZXN0aW5hdGlvblJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKGZGb3JjZSkgeworCQkJCQkJCQkJZGVsZXRlUmVzb3VyY2UoZGVzdGluYXRpb25SZXNvdXJjZSwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCisJCQkJCQkJCQkJVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIsIGRlc3RpbmF0aW9uUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQltb3ZlUmVzb3VyY2VzKHJlc291cmNlcywgZGVzdFBhdGgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gd2UgbmVlZCB0byBkZWxldGUgdGhpcyByZXNvdXJjZSBpZiB0aGlzIG9wZXJhdGlvbiB3YW50cyB0byBvdmVycmlkZSBleGlzdGluZyByZXNvdXJjZXMKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXNvdXJjZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlJUmVzb3VyY2UgZGVzdGluYXRpb25SZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihkZXN0UGF0aC5hcHBlbmQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSkpOworCQkJCQkJCWlmIChkZXN0aW5hdGlvblJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJCQkJaWYgKGZGb3JjZSkgeworCQkJCQkJCQkJLy8gd2UgbmVlZCB0byBkZWxldGUgdGhpcyByZXNvdXJjZSBpZiB0aGlzIG9wZXJhdGlvbiB3YW50cyB0byBvdmVycmlkZSBleGlzdGluZyByZXNvdXJjZXMKKwkJCQkJCQkJCWRlbGV0ZVJlc291cmNlKGRlc3RpbmF0aW9uUmVzb3VyY2UsIElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIAorCQkJCQkJCQkJCVV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCBkZXN0aW5hdGlvblJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJY29weVJlc291cmNlcyhyZXNvdXJjZXMsIGRlc3RQYXRoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkKKwkJCS8vIERpc2NhcmQgZW1wdHkgb2xkIHBhY2thZ2UgKGlmIHN0aWxsIGVtcHR5IGFmdGVyIHRoZSByZW5hbWUpCisJCQlib29sZWFuIGlzRW1wdHkgPSB0cnVlOworCQkJaWYgKGlzTW92ZSgpKSB7CisJCQkJLy8gZGVsZXRlIHJlbWFpbmluZyBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgKC5jbGFzcyBmaWxlIGluIHRoZSBjYXNlIHdoZXJlIFByb2o9c3JjPWJpbikKKwkJCQlpZiAoc3JjRm9sZGVyLmV4aXN0cygpKSB7CisJCQkJCUlSZXNvdXJjZVtdIHJlbWFpbmdGaWxlcyA9IHNyY0ZvbGRlci5tZW1iZXJzKCk7CisJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZW1haW5nRmlsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJCUlSZXNvdXJjZSBmaWxlID0gcmVtYWluZ0ZpbGVzW2ldOworCQkJCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQkJCXRoaXMuZGVsZXRlUmVzb3VyY2UoZmlsZSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlzRW1wdHkgPSBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaXNFbXB0eSkgeworCQkJCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlOworCQkJCQkvLyBjaGVjayBpZiBzb3VyY2UgaXMgaW5jbHVkZWQgaW4gZGVzdGluYXRpb24KKwkJCQkJaWYgKGRlc3RQYXRoLmlzUHJlZml4T2Yoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCQlyb290UmVzb3VyY2UgPSBuZXdGcmFnLmdldFJlc291cmNlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyb290UmVzb3VyY2UgPSAgc291cmNlLmdldFBhcmVudCgpLmdldFJlc291cmNlKCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIGRlbGV0ZSByZWN1cnNpdmVseSBlbXB0eSBmb2xkZXJzCisJCQkJCWRlbGV0ZUVtcHR5UGFja2FnZUZyYWdtZW50KHNvdXJjZSwgZmFsc2UsIHJvb3RSZXNvdXJjZSk7CisJCQkJfQorCQkJfQorCQorCQkJLy8gVXBkYXRlIHBhY2thZ2Ugc3RhdGVtZW50IGluIGNvbXBpbGF0aW9uIHVuaXQgaWYgbmVlZGVkCiAJCQlpZiAoIW5ld0ZyYWcuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoc291cmNlLmdldEVsZW1lbnROYW1lKCkpKSB7IC8vIGlmIHBhY2thZ2UgaGFzIGJlZW4gcmVuYW1lZCwgdXBkYXRlIHRoZSBjb21waWxhdGlvbiB1bml0cwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKQEAgLTQyNCwxNTcgKzQ4MiwxNDQgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfQotCi0JCS8vIGRpc2NhcmQgZW1wdHkgb2xkIHBhY2thZ2UgKGlmIHN0aWxsIGVtcHR5IGFmdGVyIHRoZSByZW5hbWUpCi0JCWlmIChpc01vdmUoKSkgewotCQkJLy8gZGVsZXRlIHJlbWFpbmluZyBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgKC5jbGFzcyBmaWxlIGluIHRoZSBjYXNlIHdoZXJlIFByb2o9c3JjPWJpbikKLQkJCUlSZXNvdXJjZVtdIHJlbWFpbmdGaWxlcyA9ICgoSUNvbnRhaW5lcilzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLm1lbWJlcnMoKTsKLQkJCWJvb2xlYW4gaXNFbXB0eSA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVtYWluZ0ZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIGZpbGUgPSByZW1haW5nRmlsZXNbaV07Ci0JCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQl0aGlzLmRlbGV0ZVJlc291cmNlKGZpbGUsIElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlzRW1wdHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNFbXB0eSkgewotCQkJCS8vIGRlbGV0ZSByZWN1cnNpdmVseSBlbXB0eSBmb2xkZXJzCi0JCQkJZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoc291cmNlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQkvL3JlZ2lzdGVyIHRoZSBjb3JyZWN0IGNoYW5nZSBkZWx0YXMKLQkJcHJlcGFyZURlbHRhcyhzb3VyY2UsIG5ld0ZyYWcpOwotCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBkb20pIHsKLQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihkb20sIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRE9NX0VYQ0VQVElPTik7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgZTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oY2UpOwotCX0KLX0KLS8qKgotICogVXBkYXRlcyB0aGUgY29udGVudCBvZiA8Y29kZT5jdTwvY29kZT4sIG1vZGlmeWluZyB0aGUgdHlwZSBuYW1lIGFuZC9vciBwYWNrYWdlCi0gKiBkZWNsYXJhdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHJldHVybiB0aGUgbmV3IHNvdXJjZQotICovCi1wcml2YXRlIFN0cmluZyB1cGRhdGVkQ29udGVudChJQ29tcGlsYXRpb25Vbml0IGN1LCBJUGFja2FnZUZyYWdtZW50IGRlc3QsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgY3VyclBhY2thZ2VOYW1lID0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQlTdHJpbmcgZGVzdFBhY2thZ2VOYW1lID0gZGVzdC5nZXRFbGVtZW50TmFtZSgpOwotCWlmIChjdXJyUGFja2FnZU5hbWUuZXF1YWxzKGRlc3RQYWNrYWdlTmFtZSkgJiYgbmV3TmFtZSA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOyAvL25vdGhpbmcgdG8gY2hhbmdlCi0JfSBlbHNlIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJSURPTUNvbXBpbGF0aW9uVW5pdCBjdURPTSA9IG51bGw7Ci0JCUlCdWZmZXIgYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCWNoYXJbXSBjb250ZW50cyA9IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJY3VET00gPSBmRmFjdG9yeS5jcmVhdGVDb21waWxhdGlvblVuaXQoY29udGVudHMsIHR5cGVOYW1lKTsKLQkJdXBkYXRlVHlwZU5hbWUoY3UsIGN1RE9NLCBjdS5nZXRFbGVtZW50TmFtZSgpLCBuZXdOYW1lKTsKLQkJdXBkYXRlUGFja2FnZVN0YXRlbWVudChjdURPTSwgZGVzdFBhY2thZ2VOYW1lKTsKLQkJcmV0dXJuIGN1RE9NLmdldENvbnRlbnRzKCk7Ci0JfQotfQotLyoqCi0gKiBNYWtlcyBzdXJlIHRoYXQgPGNvZGU+Y3U8L2NvZGU+IGRlY2xhcmVzIHRvIGJlIGluIHRoZSA8Y29kZT5wa2dOYW1lPC9jb2RlPiBwYWNrYWdlLgotICovCi1wcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZVN0YXRlbWVudChJRE9NQ29tcGlsYXRpb25Vbml0IGRvbUNVLCBTdHJpbmcgcGtnTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBkZWZhdWx0UGFja2FnZSA9IHBrZ05hbWUuZXF1YWxzKElQYWNrYWdlRnJhZ21lbnQuREVGQVVMVF9QQUNLQUdFX05BTUUpOwotCWJvb2xlYW4gc2VlblBhY2thZ2VOb2RlID0gZmFsc2U7Ci0JRW51bWVyYXRpb24gZW51bSA9IGRvbUNVLmdldENoaWxkcmVuKCk7Ci0Jd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZW51bS5uZXh0RWxlbWVudCgpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLlBBQ0tBR0UpIHsKLQkJCWlmICghIGRlZmF1bHRQYWNrYWdlKSB7Ci0JCQkJbm9kZS5zZXROYW1lKHBrZ05hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlub2RlLnJlbW92ZSgpOwotCQkJfQotCQkJc2VlblBhY2thZ2VOb2RlID0gdHJ1ZTsKLQkJCWJyZWFrOworCQorCQkJLy9yZWdpc3RlciB0aGUgY29ycmVjdCBjaGFuZ2UgZGVsdGFzCisJCQlwcmVwYXJlRGVsdGFzKHNvdXJjZSwgbmV3RnJhZywgaXNNb3ZlKCkgJiYgaXNFbXB0eSk7CisJCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBkb20pIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZG9tLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkRPTV9FWENFUFRJT04pOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7CiAJCX0KIAl9Ci0JaWYgKCFzZWVuUGFja2FnZU5vZGUgJiYgIWRlZmF1bHRQYWNrYWdlKSB7Ci0JCS8vdGhlIGN1IHdhcyBpbiBhIGRlZmF1bHQgcGFja2FnZS4uLm5vIHBhY2thZ2UgZGVjbGFyYXRpb24KLQkJLy9jcmVhdGUgdGhlIG5ldyBwYWNrYWdlIGRlY2xhcmF0aW9uIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY3UKLQkJSURPTVBhY2thZ2UgcGtnID0gZkZhY3RvcnkuY3JlYXRlUGFja2FnZSgicGFja2FnZSAiICsgcGtnTmFtZSArICI7IiArIFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IGRvbUNVLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkgewotCQkJZmlyc3RDaGlsZC5pbnNlcnRTaWJsaW5nKHBrZyk7Ci0JCX0gLy8gZWxzZSB0aGUgY3Ugd2FzIGVtcHR5OiBsZWF2ZSBpdCBlbXB0eQotCX0KLX0KIAkvKioKLQkgKiBSZW5hbWVzIHRoZSBtYWluIHR5cGUgaW4gPGNvZGU+Y3U8L2NvZGU+LgorCSAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgPGNvZGU+Y3U8L2NvZGU+LCBtb2RpZnlpbmcgdGhlIHR5cGUgbmFtZSBhbmQvb3IgcGFja2FnZQorCSAqIGRlY2xhcmF0aW9uIGFzIG5lY2Vzc2FyeS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIG5ldyBzb3VyY2UKIAkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVHlwZU5hbWUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSURPTUNvbXBpbGF0aW9uVW5pdCBkb21DVSwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKGZSZW5hbWVkQ29tcGlsYXRpb25Vbml0cyA9PSBudWxsKSB7Ci0JCQkJZlJlbmFtZWRDb21waWxhdGlvblVuaXRzPSBuZXcgQXJyYXlMaXN0KDEpOworCXByaXZhdGUgU3RyaW5nIHVwZGF0ZWRDb250ZW50KElDb21waWxhdGlvblVuaXQgY3UsIElQYWNrYWdlRnJhZ21lbnQgZGVzdCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlTdHJpbmcgY3VyclBhY2thZ2VOYW1lID0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJU3RyaW5nIGRlc3RQYWNrYWdlTmFtZSA9IGRlc3QuZ2V0RWxlbWVudE5hbWUoKTsKKwkJaWYgKGN1cnJQYWNrYWdlTmFtZS5lcXVhbHMoZGVzdFBhY2thZ2VOYW1lKSAmJiBuZXdOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOyAvL25vdGhpbmcgdG8gY2hhbmdlCisJCX0gZWxzZSB7CisJCQlTdHJpbmcgdHlwZU5hbWUgPSBjdS5nZXRFbGVtZW50TmFtZSgpOworCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKKwkJCUlET01Db21waWxhdGlvblVuaXQgY3VET00gPSBudWxsOworCQkJSUJ1ZmZlciBidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKKwkJCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQljaGFyW10gY29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIHJldHVybiBudWxsOworCQkJY3VET00gPSBmRmFjdG9yeS5jcmVhdGVDb21waWxhdGlvblVuaXQoY29udGVudHMsIHR5cGVOYW1lKTsKKwkJCXVwZGF0ZVR5cGVOYW1lKGN1LCBjdURPTSwgY3UuZ2V0RWxlbWVudE5hbWUoKSwgbmV3TmFtZSk7CisJCQl1cGRhdGVQYWNrYWdlU3RhdGVtZW50KGN1RE9NLCBkZXN0UGFja2FnZU5hbWUpOworCQkJcmV0dXJuIGN1RE9NLmdldENvbnRlbnRzKCk7CisJCX0KKwl9CisJLyoqCisJICogTWFrZXMgc3VyZSB0aGF0IDxjb2RlPmN1PC9jb2RlPiBkZWNsYXJlcyB0byBiZSBpbiB0aGUgPGNvZGU+cGtnTmFtZTwvY29kZT4gcGFja2FnZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZVN0YXRlbWVudChJRE9NQ29tcGlsYXRpb25Vbml0IGRvbUNVLCBTdHJpbmcgcGtnTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gZGVmYXVsdFBhY2thZ2UgPSBwa2dOYW1lLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsKKwkJYm9vbGVhbiBzZWVuUGFja2FnZU5vZGUgPSBmYWxzZTsKKwkJRW51bWVyYXRpb24gZW51bSA9IGRvbUNVLmdldENoaWxkcmVuKCk7CisJCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBlbnVtLm5leHRFbGVtZW50KCk7CisJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLlBBQ0tBR0UpIHsKKwkJCQlpZiAoISBkZWZhdWx0UGFja2FnZSkgeworCQkJCQlub2RlLnNldE5hbWUocGtnTmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbm9kZS5yZW1vdmUoKTsKKwkJCQl9CisJCQkJc2VlblBhY2thZ2VOb2RlID0gdHJ1ZTsKKwkJCQlicmVhazsKIAkJCX0KLQkJCWZSZW5hbWVkQ29tcGlsYXRpb25Vbml0cy5hZGQoY3UpOwotCQkJU3RyaW5nIG9sZFR5cGVOYW1lPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQlTdHJpbmcgbmV3VHlwZU5hbWU9IG5ld05hbWUuc3Vic3RyaW5nKDAsIG5ld05hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCS8vIHVwZGF0ZSBtYWluIHR5cGUgbmFtZQotCQkJSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHR5cGVzW2ldOwotCQkJCWlmIChjdXJyZW50VHlwZS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhvbGRUeXBlTmFtZSkpIHsKLQkJCQkJSURPTU5vZGUgdHlwZU5vZGUgPSAoKEphdmFFbGVtZW50KSBjdXJyZW50VHlwZSkuZmluZE5vZGUoZG9tQ1UpOwotCQkJCQlpZiAodHlwZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJdHlwZU5vZGUuc2V0TmFtZShuZXdUeXBlTmFtZSk7CisJCX0KKwkJaWYgKCFzZWVuUGFja2FnZU5vZGUgJiYgIWRlZmF1bHRQYWNrYWdlKSB7CisJCQkvL3RoZSBjdSB3YXMgaW4gYSBkZWZhdWx0IHBhY2thZ2UuLi5ubyBwYWNrYWdlIGRlY2xhcmF0aW9uCisJCQkvL2NyZWF0ZSB0aGUgbmV3IHBhY2thZ2UgZGVjbGFyYXRpb24gYXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBjdQorCQkJSURPTVBhY2thZ2UgcGtnID0gZkZhY3RvcnkuY3JlYXRlUGFja2FnZSgicGFja2FnZSAiICsgcGtnTmFtZSArICI7IiArIFV0aWwuTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCUlET01Ob2RlIGZpcnN0Q2hpbGQgPSBkb21DVS5nZXRGaXJzdENoaWxkKCk7CisJCQlpZiAoZmlyc3RDaGlsZCAhPSBudWxsKSB7CisJCQkJZmlyc3RDaGlsZC5pbnNlcnRTaWJsaW5nKHBrZyk7CisJCQl9IC8vIGVsc2UgdGhlIGN1IHdhcyBlbXB0eTogbGVhdmUgaXQgZW1wdHkKKwkJfQorCX0KKwkJLyoqCisJCSAqIFJlbmFtZXMgdGhlIG1haW4gdHlwZSBpbiA8Y29kZT5jdTwvY29kZT4uCisJCSAqLworCQlwcml2YXRlIHZvaWQgdXBkYXRlVHlwZU5hbWUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSURPTUNvbXBpbGF0aW9uVW5pdCBkb21DVSwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKKwkJCQlpZiAoZlJlbmFtZWRDb21waWxhdGlvblVuaXRzID09IG51bGwpIHsKKwkJCQkJZlJlbmFtZWRDb21waWxhdGlvblVuaXRzPSBuZXcgQXJyYXlMaXN0KDEpOworCQkJCX0KKwkJCQlmUmVuYW1lZENvbXBpbGF0aW9uVW5pdHMuYWRkKGN1KTsKKwkJCQlTdHJpbmcgb2xkVHlwZU5hbWU9IG9sZE5hbWUuc3Vic3RyaW5nKDAsIG9sZE5hbWUubGVuZ3RoKCkgLSA1KTsKKwkJCQlTdHJpbmcgbmV3VHlwZU5hbWU9IG5ld05hbWUuc3Vic3RyaW5nKDAsIG5ld05hbWUubGVuZ3RoKCkgLSA1KTsKKwkJCQkvLyB1cGRhdGUgbWFpbiB0eXBlIG5hbWUKKwkJCQlJVHlwZVtdIHR5cGVzID0gY3UuZ2V0VHlwZXMoKTsKKwkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdHlwZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJSVR5cGUgY3VycmVudFR5cGUgPSB0eXBlc1tpXTsKKwkJCQkJaWYgKGN1cnJlbnRUeXBlLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG9sZFR5cGVOYW1lKSkgeworCQkJCQkJSURPTU5vZGUgdHlwZU5vZGUgPSAoKEphdmFFbGVtZW50KSBjdXJyZW50VHlwZSkuZmluZE5vZGUoZG9tQ1UpOworCQkJCQkJaWYgKHR5cGVOb2RlICE9IG51bGwpIHsKKwkJCQkJCQl0eXBlTm9kZS5zZXROYW1lKG5ld1R5cGVOYW1lKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCX0KLS8qKgotICogUG9zc2libGUgZmFpbHVyZXM6Ci0gKiA8dWw+Ci0gKiAgPGxpPk5PX0VMRU1FTlRTX1RPX1BST0NFU1MgLSBubyBlbGVtZW50cyBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uCi0gKgk8bGk+SU5ERVhfT1VUX09GX0JPVU5EUyAtIHRoZSBudW1iZXIgb2YgcmVuYW1pbmdzIHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24KLSAqCQlkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgd2VyZSBzdXBwbGllZC4KLSAqIDwvdWw+Ci0gKi8KLXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKLQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZlcmlmeSgpOwotCWlmICghc3RhdHVzLmlzT0soKSkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCWlmIChmUmVuYW1pbmdzTGlzdCAhPSBudWxsICYmIGZSZW5hbWluZ3NMaXN0Lmxlbmd0aCAhPSBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5ERVhfT1VUX09GX0JPVU5EUyk7Ci0JfQotCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7Ci19Ci0vKioKLSAqIEBzZWUgTXVsdGlPcGVyYXRpb24KLSAqLwotcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFlbGVtZW50LmV4aXN0cygpKQotCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnQpOwotCQkKLQlpZiAoZWxlbWVudC5pc1JlYWRPbmx5KCkgJiYgKGlzUmVuYW1lKCkgfHwgaXNNb3ZlKCkpKQotCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgZWxlbWVudCk7Ci0KLQlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0KLQlpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLQkJaWYgKGlzTW92ZSgpICYmICgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCkuaXNXb3JraW5nQ29weSgpKQotCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOwotCX0gZWxzZSBpZiAoZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOwotCX0KKwkvKioKKwkgKiBQb3NzaWJsZSBmYWlsdXJlczoKKwkgKiA8dWw+CisJICogIDxsaT5OT19FTEVNRU5UU19UT19QUk9DRVNTIC0gbm8gZWxlbWVudHMgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorCSAqCTxsaT5JTkRFWF9PVVRfT0ZfQk9VTkRTIC0gdGhlIG51bWJlciBvZiByZW5hbWluZ3Mgc3VwcGxpZWQgdG8gdGhlIG9wZXJhdGlvbgorCSAqCQlkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgd2VyZSBzdXBwbGllZC4KKwkgKiA8L3VsPgorCSAqLworCXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CiAJCi0JSmF2YUVsZW1lbnQgZGVzdCA9IChKYXZhRWxlbWVudCkgZ2V0RGVzdGluYXRpb25QYXJlbnQoZWxlbWVudCk7Ci0JdmVyaWZ5RGVzdGluYXRpb24oZWxlbWVudCwgZGVzdCk7Ci0JaWYgKGZSZW5hbWluZ3MgIT0gbnVsbCkgewotCQl2ZXJpZnlSZW5hbWluZyhlbGVtZW50KTsKKwkJaWYgKGZSZW5hbWluZ3NMaXN0ICE9IG51bGwgJiYgZlJlbmFtaW5nc0xpc3QubGVuZ3RoICE9IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5ERVhfT1VUX09GX0JPVU5EUyk7CisJCX0KKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIAl9CisJLyoqCisJICogQHNlZSBNdWx0aU9wZXJhdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeShJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChlbGVtZW50ID09IG51bGwgfHwgIWVsZW1lbnQuZXhpc3RzKCkpCisJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIGVsZW1lbnQpOworCQkJCisJCWlmIChlbGVtZW50LmlzUmVhZE9ubHkoKSAmJiAoaXNSZW5hbWUoKSB8fCBpc01vdmUoKSkpCisJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgZWxlbWVudCk7CisKKwkJSVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgeworCQkJCWVycm9yKEphdmFNb2RlbFN0YXR1cy5JTlZBTElEX1JFU09VUkNFLCBlbGVtZW50KTsKKwkJCX0KKwkJfQorCQorCQlpbnQgZWxlbWVudFR5cGUgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7CisJCisJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQkJaWYgKGlzTW92ZSgpICYmICgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCkuaXNXb3JraW5nQ29weSgpKQorCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKKwkJfSBlbHNlIGlmIChlbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgeworCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOworCQl9CisJCQorCQlKYXZhRWxlbWVudCBkZXN0ID0gKEphdmFFbGVtZW50KSBnZXREZXN0aW5hdGlvblBhcmVudChlbGVtZW50KTsKKwkJdmVyaWZ5RGVzdGluYXRpb24oZWxlbWVudCwgZGVzdCk7CisJCWlmIChmUmVuYW1pbmdzICE9IG51bGwpIHsKKwkJCXZlcmlmeVJlbmFtaW5nKGVsZW1lbnQpOworCQl9CiB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVDb21waWxhdGlvblVuaXRPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbi5qYXZhCmluZGV4IDMzN2M2ODguLjNiYjNkMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUNvbXBpbGF0aW9uVW5pdE9wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtNzgsNyArNzgsNyBAQAogCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3SmF2YUVsZW1lbnREZWx0YSgpOwogCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKIAkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZ2V0UGFyZW50RWxlbWVudCgpOwotCQlJQ29udGFpbmVyIGZvbGRlciA9IChJQ29udGFpbmVyKSBwa2cuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCUlDb250YWluZXIgZm9sZGVyID0gKElDb250YWluZXIpIHBrZy5nZXRSZXNvdXJjZSgpOwogCQl3b3JrZWQoMSk7CiAJCUlGaWxlIGNvbXBpbGF0aW9uVW5pdEZpbGUgPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChmTmFtZSkpOwogCQlpZiAoY29tcGlsYXRpb25Vbml0RmlsZS5leGlzdHMoKSkgewpAQCAtODksMjIgKzg5LDI2IEBACiAJCQkJYnVmZmVyLnNldENvbnRlbnRzKGZTb3VyY2UpOwogCQkJCXVuaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBmYWxzZSk7CiAJCQkJZlJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHt1bml0fTsKLQkJCQlpZiAodW5pdC5nZXRQYXJlbnQoKS5leGlzdHMoKSkgeworCQkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKHVuaXQpCisJCQkJCQkmJiB1bml0LmdldFBhcmVudCgpLmV4aXN0cygpKSB7CiAJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlc3VsdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCQlkZWx0YS5jaGFuZ2VkKGZSZXN1bHRFbGVtZW50c1tpXSwgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKTsKIAkJCQkJfQogCQkJCQlhZGREZWx0YShkZWx0YSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikpOworCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cygKKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCisJCQkJCVV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCBjb21waWxhdGlvblVuaXRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9IGVsc2UgewogCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCQkJU3RyaW5nIGVuY29kaW5nID0gdW5pdC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLCB0cnVlKTsKIAkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RpbmcgPT0gbnVsbCA/IGZTb3VyY2UuZ2V0Qnl0ZXMoKSA6IGZTb3VyY2UuZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKIAkJCQljcmVhdGVGaWxlKGZvbGRlciwgdW5pdC5nZXRFbGVtZW50TmFtZSgpLCBzdHJlYW0sIGZhbHNlKTsKIAkJCQlmUmVzdWx0RWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10ge3VuaXR9OwotCQkJCWlmICh1bml0LmdldFBhcmVudCgpLmV4aXN0cygpKSB7CisJCQkJaWYgKCFVdGlsLmlzRXhjbHVkZWQodW5pdCkKKwkJCQkJCSYmIHVuaXQuZ2V0UGFyZW50KCkuZXhpc3RzKCkpIHsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVzdWx0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKIAkJCQkJCWRlbHRhLmFkZGVkKGZSZXN1bHRFbGVtZW50c1tpXSk7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbi5qYXZhCmluZGV4IDJlYTJkZDUuLmE3NTFkNGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRWxlbWVudEluQ1VPcGVyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKQEAgLTg3LDc3ICs4Nyw3OSBAQAogCSAqIG9yIC0xIGlmIHRoZSBuZXcgZWxlbWVudCBpcyBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgQ1UuCiAJICovCiAJcHJvdGVjdGVkIGludCBmUmVwbGFjZW1lbnRMZW5ndGggPSAtMTsKLS8qKgotICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdGhhdCBjcmVhdGVzIGEgSmF2YSBMYW5ndWFnZSBFbGVtZW50IHdpdGgKLSAqIHRoZSBzcGVjaWZpZWQgcGFyZW50LCBjb250YWluZWQgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4KLSAqLwotcHVibGljIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uKElKYXZhRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0Jc3VwZXIobnVsbCwgbmV3IElKYXZhRWxlbWVudFtde3BhcmVudEVsZW1lbnR9KTsKLQlpbml0aWFsaXplRGVmYXVsdFBvc2l0aW9uKCk7Ci19Ci0vKioKLSAqIE9ubHkgYWxsb3cgY2FuY2VsbGluZyBpZiB0aGlzIG9wZXJhdGlvbiBpcyBub3QgbmVzdGVkLgotICovCi1wcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCWlmICghZk5lc3RlZCkgewotCQlzdXBlci5jaGVja0NhbmNlbGVkKCk7CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBvcGVyYXRpb24gdGhhdCBjcmVhdGVzIGEgSmF2YSBMYW5ndWFnZSBFbGVtZW50IHdpdGgKKwkgKiB0aGUgc3BlY2lmaWVkIHBhcmVudCwgY29udGFpbmVkIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCisJICovCisJcHVibGljIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uKElKYXZhRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7CisJCXN1cGVyKG51bGwsIG5ldyBJSmF2YUVsZW1lbnRbXXtwYXJlbnRFbGVtZW50fSk7CisJCWluaXRpYWxpemVEZWZhdWx0UG9zaXRpb24oKTsKIAl9Ci19Ci0vKioKLSAqIEluc3RydWN0cyB0aGlzIG9wZXJhdGlvbiB0byBwb3NpdGlvbiB0aGUgbmV3IGVsZW1lbnQgYWZ0ZXIKLSAqIHRoZSBnaXZlbiBzaWJsaW5nLCBvciB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGNoaWxkCi0gKiBvZiBpdHMgcGFyZW50IGlmIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVBZnRlcihJSmF2YUVsZW1lbnQgc2libGluZykgewotCXNldFJlbGF0aXZlUG9zaXRpb24oc2libGluZywgSU5TRVJUX0FGVEVSKTsKLX0KLS8qKgotICogSW5zdHJ1Y3RzIHRoaXMgb3BlcmF0aW9uIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudCBiZWZvcmUKLSAqIHRoZSBnaXZlbiBzaWJsaW5nLCBvciB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGNoaWxkCi0gKiBvZiBpdHMgcGFyZW50IGlmIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVCZWZvcmUoSUphdmFFbGVtZW50IHNpYmxpbmcpIHsKLQlzZXRSZWxhdGl2ZVBvc2l0aW9uKHNpYmxpbmcsIElOU0VSVF9CRUZPUkUpOwotfQotLyoqCi0gKiBFeGVjdXRlIHRoZSBvcGVyYXRpb24gLSBnZW5lcmF0ZSBuZXcgc291cmNlIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdAotICogYW5kIHNhdmUgdGhlIHJlc3VsdHMuCi0gKgotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyB1bmFibGUgdG8gY29tcGxldGUKLSAqLwotcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRyeSB7Ci0JCWJlZ2luVGFzayhnZXRNYWluVGFza05hbWUoKSwgZ2V0TWFpbkFtb3VudE9mV29yaygpKTsKLQkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ld0phdmFFbGVtZW50RGVsdGEoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWdlbmVyYXRlTmV3Q29tcGlsYXRpb25Vbml0RE9NKHVuaXQpOwotCQlpZiAoZkNyZWF0aW9uT2NjdXJyZWQpIHsKLQkJCS8vYSBjaGFuZ2UgaGFzIHJlYWxseSBvY2N1cnJlZAotCQkJSUJ1ZmZlciBidWZmZXIgPSB1bml0LmdldEJ1ZmZlcigpOwotCQkJaWYgKGJ1ZmZlciAgPT0gbnVsbCkgcmV0dXJuOwotCQkJY2hhcltdIGJ1ZmZlckNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQkJCWlmIChidWZmZXJDb250ZW50cyA9PSBudWxsKSByZXR1cm47Ci0JCQljaGFyW10gZWxlbWVudENvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5ub3JtYWxpemVDUnMoZkNyZWF0ZWRFbGVtZW50LmdldENoYXJhY3RlcnMoKSwgYnVmZmVyQ29udGVudHMpOwotCQkJc3dpdGNoIChmUmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJCQljYXNlIC0xIDogCi0JCQkJCS8vIGVsZW1lbnQgaXMgYXBwZW5kIGF0IHRoZSBlbmQKLQkJCQkJYnVmZmVyLmFwcGVuZChlbGVtZW50Q29udGVudHMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDAgOgotCQkJCQkvLyBlbGVtZW50IGlzIGluc2VydGVkCi0JCQkJCWJ1ZmZlci5yZXBsYWNlKGZJbnNlcnRpb25Qb3NpdGlvbiwgMCwgZWxlbWVudENvbnRlbnRzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCS8vIGVsZW1lbnQgaXMgcmVwbGFjaW5nIHRoZSBwcmV2aW91cyBvbmUKLQkJCQkJYnVmZmVyLnJlcGxhY2UoZkluc2VydGlvblBvc2l0aW9uLCBmUmVwbGFjZW1lbnRMZW5ndGgsIGVsZW1lbnRDb250ZW50cyk7Ci0JCQl9Ci0JCQl1bml0LnNhdmUobnVsbCwgZmFsc2UpOwotCQkJYm9vbGVhbiBpc1dvcmtpbmdDb3B5ID0gdW5pdC5pc1dvcmtpbmdDb3B5KCk7Ci0JCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSAhaXNXb3JraW5nQ29weTsKLQkJCXdvcmtlZCgxKTsKLQkJCWZSZXN1bHRFbGVtZW50cyA9IGdlbmVyYXRlUmVzdWx0SGFuZGxlcygpOwotCQkJaWYgKCFpc1dvcmtpbmdDb3B5KSB7IC8vIGlmIHVuaXQgaXMgd29ya2luZyBjb3B5LCB0aGVuIHNhdmUgd2lsbCBoYXZlIGFscmVhZHkgZmlyZWQgdGhlIGRlbHRhCi0JCQkJaWYgKHVuaXQuZ2V0UGFyZW50KCkuZXhpc3RzKCkpIHsKKwkvKioKKwkgKiBPbmx5IGFsbG93IGNhbmNlbGxpbmcgaWYgdGhpcyBvcGVyYXRpb24gaXMgbm90IG5lc3RlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgeworCQlpZiAoIWZOZXN0ZWQpIHsKKwkJCXN1cGVyLmNoZWNrQ2FuY2VsZWQoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBJbnN0cnVjdHMgdGhpcyBvcGVyYXRpb24gdG8gcG9zaXRpb24gdGhlIG5ldyBlbGVtZW50IGFmdGVyCisJICogdGhlIGdpdmVuIHNpYmxpbmcsIG9yIHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQgYXMgdGhlIGxhc3QgY2hpbGQKKwkgKiBvZiBpdHMgcGFyZW50IGlmIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUFmdGVyKElKYXZhRWxlbWVudCBzaWJsaW5nKSB7CisJCXNldFJlbGF0aXZlUG9zaXRpb24oc2libGluZywgSU5TRVJUX0FGVEVSKTsKKwl9CisJLyoqCisJICogSW5zdHJ1Y3RzIHRoaXMgb3BlcmF0aW9uIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudCBiZWZvcmUKKwkgKiB0aGUgZ2l2ZW4gc2libGluZywgb3IgdG8gYWRkIHRoZSBuZXcgZWxlbWVudCBhcyB0aGUgbGFzdCBjaGlsZAorCSAqIG9mIGl0cyBwYXJlbnQgaWYgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQmVmb3JlKElKYXZhRWxlbWVudCBzaWJsaW5nKSB7CisJCXNldFJlbGF0aXZlUG9zaXRpb24oc2libGluZywgSU5TRVJUX0JFRk9SRSk7CisJfQorCS8qKgorCSAqIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiAtIGdlbmVyYXRlIG5ldyBzb3VyY2UgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0CisJICogYW5kIHNhdmUgdGhlIHJlc3VsdHMuCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIHVuYWJsZSB0byBjb21wbGV0ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWJlZ2luVGFzayhnZXRNYWluVGFza05hbWUoKSwgZ2V0TWFpbkFtb3VudE9mV29yaygpKTsKKwkJCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7CisJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKKwkJCWdlbmVyYXRlTmV3Q29tcGlsYXRpb25Vbml0RE9NKHVuaXQpOworCQkJaWYgKGZDcmVhdGlvbk9jY3VycmVkKSB7CisJCQkJLy9hIGNoYW5nZSBoYXMgcmVhbGx5IG9jY3VycmVkCisJCQkJSUJ1ZmZlciBidWZmZXIgPSB1bml0LmdldEJ1ZmZlcigpOworCQkJCWlmIChidWZmZXIgID09IG51bGwpIHJldHVybjsKKwkJCQljaGFyW10gYnVmZmVyQ29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOworCQkJCWlmIChidWZmZXJDb250ZW50cyA9PSBudWxsKSByZXR1cm47CisJCQkJY2hhcltdIGVsZW1lbnRDb250ZW50cyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwubm9ybWFsaXplQ1JzKGZDcmVhdGVkRWxlbWVudC5nZXRDaGFyYWN0ZXJzKCksIGJ1ZmZlckNvbnRlbnRzKTsKKwkJCQlzd2l0Y2ggKGZSZXBsYWNlbWVudExlbmd0aCkgeworCQkJCQljYXNlIC0xIDogCisJCQkJCQkvLyBlbGVtZW50IGlzIGFwcGVuZCBhdCB0aGUgZW5kCisJCQkJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRDb250ZW50cyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAwIDoKKwkJCQkJCS8vIGVsZW1lbnQgaXMgaW5zZXJ0ZWQKKwkJCQkJCWJ1ZmZlci5yZXBsYWNlKGZJbnNlcnRpb25Qb3NpdGlvbiwgMCwgZWxlbWVudENvbnRlbnRzKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCS8vIGVsZW1lbnQgaXMgcmVwbGFjaW5nIHRoZSBwcmV2aW91cyBvbmUKKwkJCQkJCWJ1ZmZlci5yZXBsYWNlKGZJbnNlcnRpb25Qb3NpdGlvbiwgZlJlcGxhY2VtZW50TGVuZ3RoLCBlbGVtZW50Q29udGVudHMpOworCQkJCX0KKwkJCQl1bml0LnNhdmUobnVsbCwgZmFsc2UpOworCQkJCWJvb2xlYW4gaXNXb3JraW5nQ29weSA9IHVuaXQuaXNXb3JraW5nQ29weSgpOworCQkJCWlmICghaXNXb3JraW5nQ29weSkKKwkJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOworCQkJCXdvcmtlZCgxKTsKKwkJCQlmUmVzdWx0RWxlbWVudHMgPSBnZW5lcmF0ZVJlc3VsdEhhbmRsZXMoKTsKKwkJCQlpZiAoIWlzV29ya2luZ0NvcHkgLy8gaWYgdW5pdCBpcyB3b3JraW5nIGNvcHksIHRoZW4gc2F2ZSB3aWxsIGhhdmUgYWxyZWFkeSBmaXJlZCB0aGUgZGVsdGEKKwkJCQkJCSYmICFVdGlsLmlzRXhjbHVkZWQodW5pdCkKKwkJCQkJCSYmIHVuaXQuZ2V0UGFyZW50KCkuZXhpc3RzKCkpIHsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVzdWx0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKIAkJCQkJCWRlbHRhLmFkZGVkKGZSZXN1bHRFbGVtZW50c1tpXSk7CiAJCQkJCX0KQEAgLTE2NSwxNTIgKzE2NywxNTAgQEAKIAkJCQl9IC8vIGVsc2UgdW5pdCBpcyBjcmVhdGVkIG91dHNpZGUgY2xhc3NwYXRoCiAJCQkJICAvLyBub24tamF2YSByZXNvdXJjZSBkZWx0YSB3aWxsIGJlIG5vdGlmaWVkIGJ5IGRlbHRhIHByb2Nlc3NvcgogCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZG9uZSgpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyBhIEpET00gZG9jdW1lbnQgZnJhZ21lbnQgZm9yIHRoZSBlbGVtZW50IGJlaW5nIGNyZWF0ZWQuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBJRE9NTm9kZSBnZW5lcmF0ZUVsZW1lbnRET00oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBET00gd2l0aCB0aGUgbmV3IHNvdXJjZSB0byB1c2UgZm9yIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgotICovCi1wcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5ld0NvbXBpbGF0aW9uVW5pdERPTShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCWNoYXJbXSBwcmV2U291cmNlID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKLQlpZiAocHJldlNvdXJjZSA9PSBudWxsKSByZXR1cm47Ci0KLQkvLyBjcmVhdGUgYSBKRE9NIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdAotCWZDVURPTSA9IChuZXcgRE9NRmFjdG9yeSgpKS5jcmVhdGVDb21waWxhdGlvblVuaXQocHJldlNvdXJjZSwgY3UuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JSURPTU5vZGUgY2hpbGQgPSBnZW5lcmF0ZUVsZW1lbnRET00oKTsKLQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQlpbnNlcnRET01Ob2RlKGZDVURPTSwgY2hpbGQpOwotCX0KLQl3b3JrZWQoMSk7Ci19Ci0vKioKLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGhhbmRsZSBmb3IgdGhlIGVsZW1lbnQgdGhpcyBvcGVyYXRpb24gY3JlYXRlZC4KLSAqLwotcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhRWxlbWVudCBnZW5lcmF0ZVJlc3VsdEhhbmRsZSgpOwotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBoYW5kbGVzIGZvciB0aGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gY3JlYXRlZC4KLSAqLwotcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGdlbmVyYXRlUmVzdWx0SGFuZGxlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJldHVybiBuZXcgSUphdmFFbGVtZW50W117Z2VuZXJhdGVSZXN1bHRIYW5kbGUoKX07Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaW4gd2hpY2ggdGhlIG5ldyBlbGVtZW50IGlzIGJlaW5nIGNyZWF0ZWQuCi0gKi8KLXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQlyZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0Rm9yKGdldFBhcmVudEVsZW1lbnQoKSk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGFtb3VudCBvZiB3b3JrIGZvciB0aGUgbWFpbiB0YXNrIG9mIHRoaXMgb3BlcmF0aW9uIGZvcgotICogcHJvZ3Jlc3MgcmVwb3J0aW5nLgotICovCi1wcm90ZWN0ZWQgaW50IGdldE1haW5BbW91bnRPZldvcmsoKXsKLQlyZXR1cm4gMjsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWFpbiB0YXNrIG9mIHRoaXMgb3BlcmF0aW9uIGZvcgotICogcHJvZ3Jlc3MgcmVwb3J0aW5nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBjcmVhdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgotICovCi1wdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0UmVzdWx0RWxlbWVudHMoKSB7Ci0JcmV0dXJuIGZSZXN1bHRFbGVtZW50czsKLX0KLS8qKgotICogU2V0cyB0aGUgZGVmYXVsdCBwb3NpdGlvbiBpbiB3aGljaCB0byBjcmVhdGUgdGhlIG5ldyB0eXBlCi0gKiBtZW1iZXIuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGFzIHRoZQotICogbGFzdCBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZC4KLSAqIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGEgZGlmZmVyZW50IGRlZmF1bHQgcG9zaXRpb24gbXVzdAotICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UG9zaXRpb24oKSB7Ci0KLX0KLS8qKgotICogSW5zZXJ0cyB0aGUgZ2l2ZW4gY2hpbGQgaW50byB0aGUgZ2l2ZW4gSkRPTSwgCi0gKiBiYXNlZCBvbiB0aGUgcG9zaXRpb24gc2V0dGluZ3Mgb2YgdGhpcyBvcGVyYXRpb24uCi0gKgotICogQHNlZSBjcmVhdGVBZnRlcihJSmF2YUVsZW1lbnQpCi0gKiBAc2VlIGNyZWF0ZUJlZm9yZShJSmF2YUVsZW1lbnQpOwotICovCi1wcm90ZWN0ZWQgdm9pZCBpbnNlcnRET01Ob2RlKElET01Ob2RlIHBhcmVudCwgSURPTU5vZGUgY2hpbGQpIHsKLQlpZiAoZkluc2VydGlvblBvbGljeSAhPSBJTlNFUlRfTEFTVCkgewotCQlJRE9NTm9kZSBzaWJsaW5nID0gKChKYXZhRWxlbWVudClmQW5jaG9yRWxlbWVudCkuZmluZE5vZGUoZkNVRE9NKTsKLQkJaWYgKHNpYmxpbmcgIT0gbnVsbCAmJiBmSW5zZXJ0aW9uUG9saWN5ID09IElOU0VSVF9BRlRFUikgewotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dE5vZGUoKTsKLQkJfQotCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5nLmluc2VydFNpYmxpbmcoY2hpbGQpOwotCQkJZkNyZWF0ZWRFbGVtZW50ID0gKERPTU5vZGUpY2hpbGQ7Ci0JCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSAoKERPTU5vZGUpc2libGluZykuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQkJZlJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLQkJCXJldHVybjsKKwkJfSBmaW5hbGx5IHsKKwkJCWRvbmUoKTsKIAkJfQogCX0KLQkvL2FkZCBhcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXJlbnQKLQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCWZDcmVhdGVkRWxlbWVudCA9IChET01Ob2RlKWNoaWxkOwotCURPTU5vZGUgbGFzdENoaWxkID0gKERPTU5vZGUpZkNyZWF0ZWRFbGVtZW50LmdldFByZXZpb3VzTm9kZSgpOwotCWZJbnNlcnRpb25Qb3NpdGlvbiA9ICgoRE9NTm9kZSlwYXJlbnQpLmdldEluc2VydGlvblBvc2l0aW9uKCk7Ci0vLwlmSW5zZXJ0aW9uUG9zaXRpb24gPSBsYXN0Q2hpbGQgPT0gbnVsbCA/ICgoRE9NTm9kZSlwYXJlbnQpLmdldEluc2VydGlvblBvc2l0aW9uKCkgOiBsYXN0Q2hpbGQuZ2V0SW5zZXJ0aW9uUG9zaXRpb24oKTsKLQlmUmVwbGFjZW1lbnRMZW5ndGggPSBwYXJlbnQuZ2V0UGFyZW50KCkgPT0gbnVsbCA/IC0xIDogMDsKLX0KLS8qKgotICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+RE9NTm9kZTwvY29kZT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8KLSAqIGNyZWF0ZSB0aGlzIG5ldyBlbGVtZW50LgotICogVXNlZCBieSB0aGUgPGNvZGU+Q29weUVsZW1lbnRzT3BlcmF0aW9uPC9jb2RlPiBmb3IgcmVuYW1pbmcuCi0gKiBPbmx5IHVzZWQgZm9yIDxjb2RlPkNyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb248L2NvZGU+Ci0gKi8KLXByb3RlY3RlZCB2b2lkIHNldEFsdGVyZWROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci19Ci0vKioKLSAqIEluc3RydWN0cyB0aGlzIG9wZXJhdGlvbiB0byBwb3NpdGlvbiB0aGUgbmV3IGVsZW1lbnQgcmVsYXRpdmUKLSAqIHRvIHRoZSBnaXZlbiBzaWJsaW5nLCBvciB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGNoaWxkCi0gKiBvZiBpdHMgcGFyZW50IGlmIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgPGNvZGU+cG9zaXRpb248L2NvZGU+Ci0gKiBtdXN0IGJlIG9uZSBvZiB0aGUgcG9zaXRpb24gY29uc3RhbnRzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRSZWxhdGl2ZVBvc2l0aW9uKElKYXZhRWxlbWVudCBzaWJsaW5nLCBpbnQgcG9saWN5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCWZBbmNob3JFbGVtZW50ID0gbnVsbDsKLQkJZkluc2VydGlvblBvbGljeSA9IElOU0VSVF9MQVNUOwotCX0gZWxzZSB7Ci0JCWZBbmNob3JFbGVtZW50ID0gc2libGluZzsKLQkJZkluc2VydGlvblBvbGljeSA9IHBvbGljeTsKLQl9Ci19Ci0vKioKLSAqIFBvc3NpYmxlIGZhaWx1cmVzOiA8dWw+Ci0gKiAgPGxpPk5PX0VMRU1FTlRTX1RPX1BST0NFU1MgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIGlzCi0gKiAJCTxjb2RlPm51bGw8L2NvZGU+LgotICogIDxsaT5JTlZBTElEX05BTUUgLSBubyBuYW1lLCBhIG5hbWUgd2FzIG51bGwgb3Igbm90IGEgdmFsaWQKLSAqIAkJaW1wb3J0IGRlY2xhcmF0aW9uIG5hbWUuCi0gKiAgPGxpPklOVkFMSURfU0lCTElORyAtIHRoZSBzaWJsaW5nIHByb3ZpZGVkIGZvciBwb3NpdGlvbmluZyBpcyBub3QgdmFsaWQuCi0gKiA8L3VsPgotICogQHNlZSBJSmF2YU1vZGVsU3RhdHVzCi0gKiBAc2VlIEphdmFDb252ZW50aW9ucwotICovCi1wdWJsaWMgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7Ci0JaWYgKGdldFBhcmVudEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyk7Ci0JfQotCWlmIChmQW5jaG9yRWxlbWVudCAhPSBudWxsKSB7Ci0JCUlKYXZhRWxlbWVudCBkb21QcmVzZW50UGFyZW50ID0gZkFuY2hvckVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0JCWlmIChkb21QcmVzZW50UGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LklNUE9SVF9DT05UQUlORVIpIHsKLQkJCWRvbVByZXNlbnRQYXJlbnQgPSBkb21QcmVzZW50UGFyZW50LmdldFBhcmVudCgpOworCS8qKgorCSAqIFJldHVybnMgYSBKRE9NIGRvY3VtZW50IGZyYWdtZW50IGZvciB0aGUgZWxlbWVudCBiZWluZyBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJRE9NTm9kZSBnZW5lcmF0ZUVsZW1lbnRET00oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFJldHVybnMgdGhlIERPTSB3aXRoIHRoZSBuZXcgc291cmNlIHRvIHVzZSBmb3IgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVOZXdDb21waWxhdGlvblVuaXRET00oSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlCdWZmZXIgYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7CisJCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuOworCQljaGFyW10gcHJldlNvdXJjZSA9IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7CisJCWlmIChwcmV2U291cmNlID09IG51bGwpIHJldHVybjsKKwkKKwkJLy8gY3JlYXRlIGEgSkRPTSBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQKKwkJZkNVRE9NID0gKG5ldyBET01GYWN0b3J5KCkpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwcmV2U291cmNlLCBjdS5nZXRFbGVtZW50TmFtZSgpKTsKKwkJSURPTU5vZGUgY2hpbGQgPSBnZW5lcmF0ZUVsZW1lbnRET00oKTsKKwkJaWYgKGNoaWxkICE9IG51bGwpIHsKKwkJCWluc2VydERPTU5vZGUoZkNVRE9NLCBjaGlsZCk7CiAJCX0KLQkJaWYgKCFkb21QcmVzZW50UGFyZW50LmVxdWFscyhnZXRQYXJlbnRFbGVtZW50KCkpKSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfU0lCTElORywgZkFuY2hvckVsZW1lbnQpOworCQl3b3JrZWQoMSk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGhhbmRsZSBmb3IgdGhlIGVsZW1lbnQgdGhpcyBvcGVyYXRpb24gY3JlYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFFbGVtZW50IGdlbmVyYXRlUmVzdWx0SGFuZGxlKCk7CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgaGFuZGxlcyBmb3IgdGhlIGVsZW1lbnRzIHRoaXMgb3BlcmF0aW9uIGNyZWF0ZWQuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGdlbmVyYXRlUmVzdWx0SGFuZGxlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IElKYXZhRWxlbWVudFtde2dlbmVyYXRlUmVzdWx0SGFuZGxlKCl9OworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IGluIHdoaWNoIHRoZSBuZXcgZWxlbWVudCBpcyBiZWluZyBjcmVhdGVkLgorCSAqLworCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdEZvcihnZXRQYXJlbnRFbGVtZW50KCkpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygd29yayBmb3IgdGhlIG1haW4gdGFzayBvZiB0aGlzIG9wZXJhdGlvbiBmb3IKKwkgKiBwcm9ncmVzcyByZXBvcnRpbmcuCisJICovCisJcHJvdGVjdGVkIGludCBnZXRNYWluQW1vdW50T2ZXb3JrKCl7CisJCXJldHVybiAyOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtYWluIHRhc2sgb2YgdGhpcyBvcGVyYXRpb24gZm9yCisJICogcHJvZ3Jlc3MgcmVwb3J0aW5nLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgZWxlbWVudHMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0UmVzdWx0RWxlbWVudHMoKSB7CisJCXJldHVybiBmUmVzdWx0RWxlbWVudHM7CisJfQorCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgcG9zaXRpb24gaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBuZXcgdHlwZQorCSAqIG1lbWJlci4gQnkgZGVmYXVsdCwgdGhlIG5ldyBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXMgdGhlCisJICogbGFzdCBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZC4KKwkgKiBPcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBhIGRpZmZlcmVudCBkZWZhdWx0IHBvc2l0aW9uIG11c3QKKwkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBvc2l0aW9uKCkgeworCQorCX0KKwkvKioKKwkgKiBJbnNlcnRzIHRoZSBnaXZlbiBjaGlsZCBpbnRvIHRoZSBnaXZlbiBKRE9NLCAKKwkgKiBiYXNlZCBvbiB0aGUgcG9zaXRpb24gc2V0dGluZ3Mgb2YgdGhpcyBvcGVyYXRpb24uCisJICoKKwkgKiBAc2VlIGNyZWF0ZUFmdGVyKElKYXZhRWxlbWVudCkKKwkgKiBAc2VlIGNyZWF0ZUJlZm9yZShJSmF2YUVsZW1lbnQpOworCSAqLworCXByb3RlY3RlZCB2b2lkIGluc2VydERPTU5vZGUoSURPTU5vZGUgcGFyZW50LCBJRE9NTm9kZSBjaGlsZCkgeworCQlpZiAoZkluc2VydGlvblBvbGljeSAhPSBJTlNFUlRfTEFTVCkgeworCQkJSURPTU5vZGUgc2libGluZyA9ICgoSmF2YUVsZW1lbnQpZkFuY2hvckVsZW1lbnQpLmZpbmROb2RlKGZDVURPTSk7CisJCQlpZiAoc2libGluZyAhPSBudWxsICYmIGZJbnNlcnRpb25Qb2xpY3kgPT0gSU5TRVJUX0FGVEVSKSB7CisJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dE5vZGUoKTsKKwkJCX0KKwkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKKwkJCQlzaWJsaW5nLmluc2VydFNpYmxpbmcoY2hpbGQpOworCQkJCWZDcmVhdGVkRWxlbWVudCA9IChET01Ob2RlKWNoaWxkOworCQkJCWZJbnNlcnRpb25Qb3NpdGlvbiA9ICgoRE9NTm9kZSlzaWJsaW5nKS5nZXRTdGFydFBvc2l0aW9uKCk7CisJCQkJZlJlcGxhY2VtZW50TGVuZ3RoID0gMDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLy9hZGQgYXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50CisJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisJCWZDcmVhdGVkRWxlbWVudCA9IChET01Ob2RlKWNoaWxkOworCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSAoKERPTU5vZGUpcGFyZW50KS5nZXRJbnNlcnRpb25Qb3NpdGlvbigpOworCS8vCWZJbnNlcnRpb25Qb3NpdGlvbiA9IGxhc3RDaGlsZCA9PSBudWxsID8gKChET01Ob2RlKXBhcmVudCkuZ2V0SW5zZXJ0aW9uUG9zaXRpb24oKSA6IGxhc3RDaGlsZC5nZXRJbnNlcnRpb25Qb3NpdGlvbigpOworCQlmUmVwbGFjZW1lbnRMZW5ndGggPSBwYXJlbnQuZ2V0UGFyZW50KCkgPT0gbnVsbCA/IC0xIDogMDsKKwl9CisJLyoqCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+RE9NTm9kZTwvY29kZT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8KKwkgKiBjcmVhdGUgdGhpcyBuZXcgZWxlbWVudC4KKwkgKiBVc2VkIGJ5IHRoZSA8Y29kZT5Db3B5RWxlbWVudHNPcGVyYXRpb248L2NvZGU+IGZvciByZW5hbWluZy4KKwkgKiBPbmx5IHVzZWQgZm9yIDxjb2RlPkNyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb248L2NvZGU+CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0QWx0ZXJlZE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwl9CisJLyoqCisJICogSW5zdHJ1Y3RzIHRoaXMgb3BlcmF0aW9uIHRvIHBvc2l0aW9uIHRoZSBuZXcgZWxlbWVudCByZWxhdGl2ZQorCSAqIHRvIHRoZSBnaXZlbiBzaWJsaW5nLCBvciB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGFzIHRoZSBsYXN0IGNoaWxkCisJICogb2YgaXRzIHBhcmVudCBpZiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIDxjb2RlPnBvc2l0aW9uPC9jb2RlPgorCSAqIG11c3QgYmUgb25lIG9mIHRoZSBwb3NpdGlvbiBjb25zdGFudHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVsYXRpdmVQb3NpdGlvbihJSmF2YUVsZW1lbnQgc2libGluZywgaW50IHBvbGljeSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJCWlmIChzaWJsaW5nID09IG51bGwpIHsKKwkJCWZBbmNob3JFbGVtZW50ID0gbnVsbDsKKwkJCWZJbnNlcnRpb25Qb2xpY3kgPSBJTlNFUlRfTEFTVDsKKwkJfSBlbHNlIHsKKwkJCWZBbmNob3JFbGVtZW50ID0gc2libGluZzsKKwkJCWZJbnNlcnRpb25Qb2xpY3kgPSBwb2xpY3k7CiAJCX0KIAl9Ci0JcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKLX0KKwkvKioKKwkgKiBQb3NzaWJsZSBmYWlsdXJlczogPHVsPgorCSAqICA8bGk+Tk9fRUxFTUVOVFNfVE9fUFJPQ0VTUyAtIHRoZSBjb21waWxhdGlvbiB1bml0IHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24gaXMKKwkgKiAJCTxjb2RlPm51bGw8L2NvZGU+LgorCSAqICA8bGk+SU5WQUxJRF9OQU1FIC0gbm8gbmFtZSwgYSBuYW1lIHdhcyBudWxsIG9yIG5vdCBhIHZhbGlkCisJICogCQlpbXBvcnQgZGVjbGFyYXRpb24gbmFtZS4KKwkgKiAgPGxpPklOVkFMSURfU0lCTElORyAtIHRoZSBzaWJsaW5nIHByb3ZpZGVkIGZvciBwb3NpdGlvbmluZyBpcyBub3QgdmFsaWQuCisJICogPC91bD4KKwkgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKKwkgKiBAc2VlIEphdmFDb252ZW50aW9ucworCSAqLworCXB1YmxpYyBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwkJaWYgKGdldFBhcmVudEVsZW1lbnQoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOworCQl9CisJCWlmIChmQW5jaG9yRWxlbWVudCAhPSBudWxsKSB7CisJCQlJSmF2YUVsZW1lbnQgZG9tUHJlc2VudFBhcmVudCA9IGZBbmNob3JFbGVtZW50LmdldFBhcmVudCgpOworCQkJaWYgKGRvbVByZXNlbnRQYXJlbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSU1QT1JUX0NPTlRBSU5FUikgeworCQkJCWRvbVByZXNlbnRQYXJlbnQgPSBkb21QcmVzZW50UGFyZW50LmdldFBhcmVudCgpOworCQkJfQorCQkJaWYgKCFkb21QcmVzZW50UGFyZW50LmVxdWFscyhnZXRQYXJlbnRFbGVtZW50KCkpKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1NJQkxJTkcsIGZBbmNob3JFbGVtZW50KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUZpZWxkT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVGaWVsZE9wZXJhdGlvbi5qYXZhCmluZGV4IDAwOTNjMzEuLjUxYWRhMzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUZpZWxkT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlRmllbGRPcGVyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwpAQCAtOTYsNyArOTYsOSBAQAogcHJvdGVjdGVkIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5TmFtZUNvbGxpc2lvbigpIHsKIAlJVHlwZSB0eXBlPSBnZXRUeXBlKCk7CiAJaWYgKHR5cGUuZ2V0RmllbGQoZkRPTU5vZGUuZ2V0TmFtZSgpKS5leGlzdHMoKSkgewotCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKKwkJCVV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCBmRE9NTm9kZS5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW1wb3J0T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQppbmRleCA4YzI4NWQ5Li44NjgxNzA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbXBvcnRPcGVyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlSW5pdGlhbGl6ZXJPcGVyYXRpb24uamF2YQppbmRleCAyYWVmZWI1Li4wZTI5MTM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVJbml0aWFsaXplck9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZUluaXRpYWxpemVyT3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZU1ldGhvZE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKaW5kZXggODkwYzVjYi4uNGJiYzU2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlTWV0aG9kT3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKQEAgLTEwNyw3ICsxMDcsOSBAQAogCQl9CiAJCVN0cmluZ1tdIHR5cGVzID0gY29udmVydERPTU1ldGhvZFR5cGVzVG9TaWduYXR1cmVzKCk7CiAJCWlmICh0eXBlLmdldE1ldGhvZChuYW1lLCB0eXBlcykuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCisJCQkJVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVQYWNrYWdlRGVjbGFyYXRpb25PcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCmluZGV4IGVjNDIwYTAuLjFjODhmZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VEZWNsYXJhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVBhY2thZ2VGcmFnbWVudE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKaW5kZXggZmZlMTJlMy4uZGMyYTI0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlUGFja2FnZUZyYWdtZW50T3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiAKIC8qKgogICogVGhpcyBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBwYWNrYWdlIGZyYWdtZW50IHVuZGVyIGEgZ2l2ZW4gcGFja2FnZSBmcmFnbWVudCByb290LiAKQEAgLTY1LDEzICs2NCwxNCBAQAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyB1bmFibGUgdG8gY29tcGxldGUKICAqLwogcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7CisJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG51bGw7CiAJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZ2V0UGFyZW50RWxlbWVudCgpOwotCVN0cmluZ1tdIG5hbWVzID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWVzKGZOYW1lKTsKKwlTdHJpbmdbXSBuYW1lcyA9IFV0aWwuZ2V0VHJpbW1lZFNpbXBsZU5hbWVzKGZOYW1lKTsKIAliZWdpblRhc2soVXRpbC5iaW5kKCJvcGVyYXRpb24uY3JlYXRlUGFja2FnZUZyYWdtZW50UHJvZ3Jlc3MiKSwgbmFtZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCUlDb250YWluZXIgcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJSUNvbnRhaW5lciBwYXJlbnRGb2xkZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRSZXNvdXJjZSgpOwogCVN0cmluZyBzaWRlRWZmZWN0UGFja2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAogCUFycmF5TGlzdCByZXN1bHRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QobmFtZXMubGVuZ3RoKTsKKwljaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoUGFja2FnZUZyYWdtZW50Um9vdClyb290KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CiAJCVN0cmluZyBzdWJGb2xkZXJOYW1lID0gbmFtZXNbaV07CkBAIC04MSw3ICs4MSwxMiBAQAogCQkJY3JlYXRlRm9sZGVyKHBhcmVudEZvbGRlciwgc3ViRm9sZGVyTmFtZSwgZkZvcmNlKTsKIAkJCXBhcmVudEZvbGRlciA9IHBhcmVudEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoc3ViRm9sZGVyTmFtZSkpOwogCQkJSVBhY2thZ2VGcmFnbWVudCBhZGRlZEZyYWcgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChzaWRlRWZmZWN0UGFja2FnZU5hbWUpOwotCQkJZGVsdGEuYWRkZWQoYWRkZWRGcmFnKTsKKwkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKHBhcmVudEZvbGRlciwgZXhjbHVzaW9uUGF0dGVybnMpKSB7CisJCQkJaWYgKGRlbHRhID09IG51bGwpIHsKKwkJCQkJZGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7CisJCQkJfQorCQkJCWRlbHRhLmFkZGVkKGFkZGVkRnJhZyk7CisJCQl9CiAJCQlyZXN1bHRFbGVtZW50cy5hZGQoYWRkZWRGcmFnKTsKIAkJfSBlbHNlIHsKIAkJCXBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSBzdWJGb2xkZXI7CkBAIC05Miw3ICs5Nyw5IEBACiAJaWYgKHJlc3VsdEVsZW1lbnRzLnNpemUoKSA+IDApIHsKIAkJZlJlc3VsdEVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtyZXN1bHRFbGVtZW50cy5zaXplKCldOwogCQlyZXN1bHRFbGVtZW50cy50b0FycmF5KGZSZXN1bHRFbGVtZW50cyk7Ci0JCWFkZERlbHRhKGRlbHRhKTsKKwkJaWYgKGRlbHRhICE9IG51bGwpIHsKKwkJCWFkZERlbHRhKGRlbHRhKTsKKwkJfQogCX0KIAlkb25lKCk7CiB9CkBAIC0xMjIsMjEgKzEyOSwxOSBAQAogCWlmIChyb290LmlzUmVhZE9ubHkoKSkgewogCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgcm9vdCk7CiAJfQotCVN0cmluZ1tdIG5hbWVzID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWVzKGZOYW1lKTsKLQl0cnkgewotCQlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2Ugc3ViRm9sZGVyID0gcGFyZW50Rm9sZGVyLmZpbmRNZW1iZXIobmFtZXNbaV0pOwotCQkJaWYgKHN1YkZvbGRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKHN1YkZvbGRlci5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKLQkJCQl9Ci0JCQkJcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHN1YkZvbGRlcjsKKwlTdHJpbmdbXSBuYW1lcyA9IFV0aWwuZ2V0VHJpbW1lZFNpbXBsZU5hbWVzKGZOYW1lKTsKKwlJQ29udGFpbmVyIHBhcmVudEZvbGRlciA9IChJQ29udGFpbmVyKSByb290LmdldFJlc291cmNlKCk7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCUlSZXNvdXJjZSBzdWJGb2xkZXIgPSBwYXJlbnRGb2xkZXIuZmluZE1lbWJlcihuYW1lc1tpXSk7CisJCWlmIChzdWJGb2xkZXIgIT0gbnVsbCkgeworCQkJaWYgKHN1YkZvbGRlci5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZPTERFUikgeworCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKKwkJCQkJVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIsIHN1YkZvbGRlci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQorCQkJcGFyZW50Rm9sZGVyID0gKElDb250YWluZXIpIHN1YkZvbGRlcjsKIAkJfQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJcmV0dXJuIG5wZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKIAl9CiAJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24uamF2YQppbmRleCAyMjBkMDJjLi5mYzAzZjYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlSGllcmFyY2h5T3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CkBAIC02Miw2ICs2MiwxNSBAQAogCXRoaXMud29ya2luZ0NvcGllcyA9IHdvcmtpbmdDb3BpZXM7CiB9CiAvKioKKyAqIENvbnN0cnVjdHMgYW4gb3BlcmF0aW9uIHRvIGNyZWF0ZSBhIHR5cGUgaGllcmFyY2h5IGZvciB0aGUKKyAqIGdpdmVuIHR5cGUgYW5kIHdvcmtpbmcgY29waWVzLgorICovCitwdWJsaWMgQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbihJVHlwZSBlbGVtZW50LCBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLCBJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBjb21wdXRlU3VidHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXN1cGVyKGVsZW1lbnQpOworCXRoaXMudHlwZUhpZXJhcmNoeSA9IG5ldyBUeXBlSGllcmFyY2h5KGVsZW1lbnQsIHByb2plY3QsIGNvbXB1dGVTdWJ0eXBlcyk7CisJdGhpcy53b3JraW5nQ29waWVzID0gd29ya2luZ0NvcGllczsKK30KKy8qKgogICogUGVyZm9ybXMgdGhlIG9wZXJhdGlvbiAtIGNyZWF0ZXMgdGhlIHR5cGUgaGllcmFyY2h5CiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBUaGUgb3BlcmF0aW9uIGhhcyBmYWlsZWQuCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVNZW1iZXJPcGVyYXRpb24uamF2YQppbmRleCBjNmI2Yjk2Li5iNTI3OGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlTWVtYmVyT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU1lbWJlck9wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvQ3JlYXRlVHlwZU9wZXJhdGlvbi5qYXZhCmluZGV4IDVlMDViZDMuLmVkYWFiMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVR5cGVPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVUeXBlT3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CkBAIC05MiwxMiArOTIsMTYgQEAKIAlpbnQgdHlwZSA9IHBhcmVudC5nZXRFbGVtZW50VHlwZSgpOwogCWlmICh0eXBlID09IElKYXZhRWxlbWVudC5UWVBFKSB7CiAJCWlmICgoKElUeXBlKSBwYXJlbnQpLmdldFR5cGUoZkRPTU5vZGUuZ2V0TmFtZSgpKS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cygKKwkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OLCAKKwkJCQlVdGlsLmJpbmQoInN0YXR1cy5uYW1lQ29sbGlzaW9uIiwgZkRPTU5vZGUuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0gZWxzZQogCQlpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewogCQkJaWYgKCgoSUNvbXBpbGF0aW9uVW5pdCkgcGFyZW50KS5nZXRUeXBlKGZET01Ob2RlLmdldE5hbWUoKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKKwkJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cygKKwkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgCisJCQkJCVV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCBmRE9NTm9kZS5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0NyZWF0ZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4N2U0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9DcmVhdGVXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB3b3JraW5nIGNvcHkgYW5kIHNpZ25hbCBpdHMgYWRkaXRpb24gdGhyb3VnaCBhIGRlbHRhLgorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlV29ya2luZ0NvcHlPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCQorCU1hcCBwZXJGYWN0b3J5V29ya2luZ0NvcGllczsKKwlJQnVmZmVyRmFjdG9yeSBmYWN0b3J5OworCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3I7CisJCisJLyoKKwkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGZyb20gdGhlIGdpdmVuIG9yaWdpbmFsIGN1IGFuZCB0aGUgZ2l2ZW4gYnVmZmVyIGZhY3RvcnkuCisJICogcGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMgbWFwIGlzIG5vdCBudWxsIGlmIHRoZSB3b3JraW5nIGNvcHkgaXMgYSBzaGFyZWQgd29ya2luZyBjb3B5LgorCSAqLworCXB1YmxpYyBDcmVhdGVXb3JraW5nQ29weU9wZXJhdGlvbihJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsRWxlbWVudCwgTWFwIHBlckZhY3RvcnlXb3JraW5nQ29waWVzLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yKSB7CisJCXN1cGVyKG5ldyBJSmF2YUVsZW1lbnRbXSB7b3JpZ2luYWxFbGVtZW50fSk7CisJCXRoaXMucGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMgPSBwZXJGYWN0b3J5V29ya2luZ0NvcGllczsKKwkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwkJdGhpcy5wcm9ibGVtUmVxdWVzdG9yID0gcHJvYmxlbVJlcXVlc3RvcjsKKwl9CisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisKKwkJV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBuZXcgV29ya2luZ0NvcHkoKElQYWNrYWdlRnJhZ21lbnQpY3UuZ2V0UGFyZW50KCksIGN1LmdldEVsZW1lbnROYW1lKCksIHRoaXMuZmFjdG9yeSwgdGhpcy5wcm9ibGVtUmVxdWVzdG9yKTsKKwkJLy8gb3BlbiB0aGUgd29ya2luZyBjb3B5IG5vdyB0byBlbnN1cmUgY29udGVudHMgYXJlIHRoYXQgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyBlbGVtZW50CisJCXdvcmtpbmdDb3B5Lm9wZW4odGhpcy5mTW9uaXRvcik7CisJCQorCQlpZiAodGhpcy5wZXJGYWN0b3J5V29ya2luZ0NvcGllcyAhPSBudWxsKSB7CisJCQl0aGlzLnBlckZhY3RvcnlXb3JraW5nQ29waWVzLnB1dChjdSwgd29ya2luZ0NvcHkpOworCQkJaWYgKENvbXBpbGF0aW9uVW5pdC5TSEFSRURfV0NfVkVSQk9TRSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgc2hhcmVkIHdvcmtpbmcgY29weSAiICsgd29ya2luZ0NvcHkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCQkvLyByZXBvcnQgYWRkZWQgamF2YSBkZWx0YQorCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEodGhpcy5nZXRKYXZhTW9kZWwoKSk7CisJCWRlbHRhLmFkZGVkKHdvcmtpbmdDb3B5KTsKKwkJYWRkRGVsdGEoZGVsdGEpOworCisJCWZSZXN1bHRFbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7d29ya2luZ0NvcHl9OworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IHRoaXMgb3BlcmF0aW9uIGlzIHdvcmtpbmcgb24uCisJICovCisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgeworCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCX0KKwkvKioKKwkgKiBAc2VlIEphdmFNb2RlbE9wZXJhdGlvbiNpc1JlYWRPbmx5CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBmZWYyMmM2Li41OTYwMmYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVJlZ2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLkRPTUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb20uRE9NTm9kZTsKQEAgLTM1LDcgKzM2LDYgQEAKICAqIHNob3VsZCBiZSB1c2VkLgogICovCiBwdWJsaWMgY2xhc3MgRGVsZXRlRWxlbWVudHNPcGVyYXRpb24gZXh0ZW5kcyBNdWx0aU9wZXJhdGlvbiB7Ci0JY2hhcltdIE5PX0NIQVIgPSBuZXcgY2hhclswXTsKIAkvKioKIAkgKiBUaGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gcHJvY2Vzc2VzIGdyb3VwZWQgYnkgY29tcGlsYXRpb24gdW5pdAogCSAqIEBzZWUgcHJvY2Vzc0VsZW1lbnRzKCkuIEtleXMgYXJlIGNvbXBpbGF0aW9uIHVuaXRzLApAQCAtNDgsMTE2ICs0OCwxMTYgQEAKIAkgKiA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPnMuCiAJICovCiAJcHJvdGVjdGVkIERPTUZhY3RvcnkgZkZhY3Rvcnk7Ci0vKioKLSAqIFdoZW4gZXhlY3V0ZWQsIHRoaXMgb3BlcmF0aW9uIHdpbGwgZGVsZXRlIHRoZSBnaXZlbiBlbGVtZW50cy4gVGhlIGVsZW1lbnRzCi0gKiB0byBkZWxldGUgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCBhbmQgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEKLSAqIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyBEZWxldGVFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvRGVsZXRlLCBib29sZWFuIGZvcmNlKSB7Ci0Jc3VwZXIoZWxlbWVudHNUb0RlbGV0ZSwgZm9yY2UpOwotCWZGYWN0b3J5ID0gbmV3IERPTUZhY3RvcnkoKTsKLX0KLQotLyoqCi0gKiBAc2VlIE11bHRpT3BlcmF0aW9uCi0gKi8KLXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCkgewotCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqCi0gKiBHcm91cHMgdGhlIGVsZW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGVpciBjb21waWxhdGlvbiB1bml0LgotICogSWYgcGFyZW50L2NoaWxkIGNvbWJpbmF0aW9ucyBhcmUgcHJlc2VudCwgY2hpbGRyZW4gYXJlCi0gKiBkaXNjYXJkZWQgKG9ubHkgdGhlIHBhcmVudHMgYXJlIHByb2Nlc3NlZCkuIFJlbW92ZXMgYW55Ci0gKiBkdXBsaWNhdGVzIHNwZWNpZmllZCBpbiBlbGVtZW50cyB0byBiZSBwcm9jZXNzZWQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGdyb3VwRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlmQ2hpbGRyZW5Ub1JlbW92ZSA9IG5ldyBIYXNoTWFwKDEpOwotCWludCB1bmlxdWVDVXMgPSAwOwotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJSUphdmFFbGVtZW50IGUgPSBmRWxlbWVudHNUb1Byb2Nlc3NbaV07Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXRGb3IoZSk7Ci0JCWlmIChjdSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSmF2YU1vZGVsU3RhdHVzLlJFQURfT05MWSwgZSkpOwotCQl9IGVsc2UgewotCQkJSVJlZ2lvbiByZWdpb24gPSAoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGN1KTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCXJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQlmQ2hpbGRyZW5Ub1JlbW92ZS5wdXQoY3UsIHJlZ2lvbik7Ci0JCQkJdW5pcXVlQ1VzICs9IDE7CisJLyoqCisJICogV2hlbiBleGVjdXRlZCwgdGhpcyBvcGVyYXRpb24gd2lsbCBkZWxldGUgdGhlIGdpdmVuIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMKKwkgKiB0byBkZWxldGUgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCBhbmQgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEKKwkgKiBjb21waWxhdGlvbiB1bml0LgorCSAqLworCXB1YmxpYyBEZWxldGVFbGVtZW50c09wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvRGVsZXRlLCBib29sZWFuIGZvcmNlKSB7CisJCXN1cGVyKGVsZW1lbnRzVG9EZWxldGUsIGZvcmNlKTsKKwkJZkZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVGFza05hbWUoKSB7CisJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkvKioKKwkgKiBHcm91cHMgdGhlIGVsZW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGVpciBjb21waWxhdGlvbiB1bml0LgorCSAqIElmIHBhcmVudC9jaGlsZCBjb21iaW5hdGlvbnMgYXJlIHByZXNlbnQsIGNoaWxkcmVuIGFyZQorCSAqIGRpc2NhcmRlZCAob25seSB0aGUgcGFyZW50cyBhcmUgcHJvY2Vzc2VkKS4gUmVtb3ZlcyBhbnkKKwkgKiBkdXBsaWNhdGVzIHNwZWNpZmllZCBpbiBlbGVtZW50cyB0byBiZSBwcm9jZXNzZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZ3JvdXBFbGVtZW50cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlmQ2hpbGRyZW5Ub1JlbW92ZSA9IG5ldyBIYXNoTWFwKDEpOworCQlpbnQgdW5pcXVlQ1VzID0gMDsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFFbGVtZW50IGUgPSBmRWxlbWVudHNUb1Byb2Nlc3NbaV07CisJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0Rm9yKGUpOworCQkJaWYgKGN1ID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSmF2YU1vZGVsU3RhdHVzLlJFQURfT05MWSwgZSkpOworCQkJfSBlbHNlIHsKKwkJCQlJUmVnaW9uIHJlZ2lvbiA9IChJUmVnaW9uKSBmQ2hpbGRyZW5Ub1JlbW92ZS5nZXQoY3UpOworCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgeworCQkJCQlyZWdpb24gPSBuZXcgUmVnaW9uKCk7CisJCQkJCWZDaGlsZHJlblRvUmVtb3ZlLnB1dChjdSwgcmVnaW9uKTsKKwkJCQkJdW5pcXVlQ1VzICs9IDE7CisJCQkJfQorCQkJCXJlZ2lvbi5hZGQoZSk7CiAJCQl9Ci0JCQlyZWdpb24uYWRkKGUpOworCQl9CisJCWZFbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbdW5pcXVlQ1VzXTsKKwkJSXRlcmF0b3IgaXRlciA9IGZDaGlsZHJlblRvUmVtb3ZlLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlmRWxlbWVudHNUb1Byb2Nlc3NbaSsrXSA9IChJSmF2YUVsZW1lbnQpIGl0ZXIubmV4dCgpOwogCQl9CiAJfQotCWZFbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbdW5pcXVlQ1VzXTsKLQlJdGVyYXRvciBpdGVyID0gZkNoaWxkcmVuVG9SZW1vdmUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQlpbnQgaSA9IDA7Ci0Jd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCWZFbGVtZW50c1RvUHJvY2Vzc1tpKytdID0gKElKYXZhRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JfQotfQotLyoqCi0gKiBEZWxldGVzIHRoaXMgZWxlbWVudCBmcm9tIGl0cyBjb21waWxhdGlvbiB1bml0LgotICogQHNlZSBNdWx0aU9wZXJhdGlvbgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OworCS8qKgorCSAqIERlbGV0ZXMgdGhpcyBlbGVtZW50IGZyb20gaXRzIGNvbXBpbGF0aW9uIHVuaXQuCisJICogQHNlZSBNdWx0aU9wZXJhdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OworCQorCQkvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbXBvcnQgc3RhdGVtZW50cyAtIGlmIGFsbCBhcmUgcmVtb3ZlZCwgZGVsZXRlCisJCS8vIHRoZSBpbXBvcnQgY29udGFpbmVyIChpLmUuIHJlcG9ydCBpdCBpbiB0aGUgZGVsdGEpCisJCWludCBudW1iZXJPZkltcG9ydHMgPSBjdS5nZXRJbXBvcnRzKCkubGVuZ3RoOworCQorCQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOworCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybjsKKwkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKGN1KTsKKwkJSUphdmFFbGVtZW50W10gY3VFbGVtZW50cyA9ICgoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGN1KSkuZ2V0RWxlbWVudHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGN1RWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBlID0gY3VFbGVtZW50c1tpXTsKKwkJCWlmIChlLmV4aXN0cygpKSB7CisJCQkJY2hhcltdIGNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJCQlpZiAoY29udGVudHMgPT0gbnVsbCkgY29udGludWU7CisJCQkJSURPTUNvbXBpbGF0aW9uVW5pdCBjdURPTSA9IGZGYWN0b3J5LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb250ZW50cywgY3UuZ2V0RWxlbWVudE5hbWUoKSk7CisJCQkJRE9NTm9kZSBub2RlID0gKERPTU5vZGUpKChKYXZhRWxlbWVudCkgZSkuZmluZE5vZGUoY3VET00pOworCQkJCWlmIChub2RlID09IG51bGwpIEFzc2VydC5pc1RydWUoZmFsc2UsICJGYWlsZWQgdG8gbG9jYXRlICIgKyBlLmdldEVsZW1lbnROYW1lKCkgKyAiIGluICIgKyBjdURPTS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCi0JLy8ga2VlcCB0cmFjayBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudHMgLSBpZiBhbGwgYXJlIHJlbW92ZWQsIGRlbGV0ZQotCS8vIHRoZSBpbXBvcnQgY29udGFpbmVyIChpLmUuIHJlcG9ydCBpdCBpbiB0aGUgZGVsdGEpCi0JaW50IG51bWJlck9mSW1wb3J0cyA9IGN1LmdldEltcG9ydHMoKS5sZW5ndGg7Ci0KLQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuOwotCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShjdSk7Ci0JSUphdmFFbGVtZW50W10gY3VFbGVtZW50cyA9ICgoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGN1KSkuZ2V0RWxlbWVudHMoKTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY3VFbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQlJSmF2YUVsZW1lbnQgZSA9IGN1RWxlbWVudHNbaV07Ci0JCWlmIChlLmV4aXN0cygpKSB7Ci0JCQljaGFyW10gY29udGVudHMgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCQkJaWYgKGNvbnRlbnRzID09IG51bGwpIGNvbnRpbnVlOwotCQkJSURPTUNvbXBpbGF0aW9uVW5pdCBjdURPTSA9IGZGYWN0b3J5LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb250ZW50cywgY3UuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlET01Ob2RlIG5vZGUgPSAoRE9NTm9kZSkoKEphdmFFbGVtZW50KSBlKS5maW5kTm9kZShjdURPTSk7Ci0JCQkvLyBUQkQKLQkJCUFzc2VydC5pc1RydWUobm9kZSAhPSBudWxsLCBVdGlsLmJpbmQoImVsZW1lbnQuY2Fubm90TG9jYXRlIiwgZS5nZXRFbGVtZW50TmFtZSgpLCBjdURPTS5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0UG9zaXRpb24sIG5vZGUuZ2V0RW5kUG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gKyAxLCBOT19DSEFSKTsKLQkJCWRlbHRhLnJlbW92ZWQoZSk7Ci0JCQlpZiAoZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04pIHsKLQkJCQludW1iZXJPZkltcG9ydHMtLTsKLQkJCQlpZiAobnVtYmVyT2ZJbXBvcnRzID09IDApIHsKLQkJCQkJZGVsdGEucmVtb3ZlZChjdS5nZXRJbXBvcnRDb250YWluZXIoKSk7CisJCQkJaW50IHN0YXJ0UG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKKwkJCQlidWZmZXIucmVwbGFjZShzdGFydFBvc2l0aW9uLCBub2RlLmdldEVuZFBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uICsgMSwgQ2hhck9wZXJhdGlvbi5OT19DSEFSKTsKKwkJCQlkZWx0YS5yZW1vdmVkKGUpOworCQkJCWlmIChlLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTikgeworCQkJCQludW1iZXJPZkltcG9ydHMtLTsKKwkJCQkJaWYgKG51bWJlck9mSW1wb3J0cyA9PSAwKSB7CisJCQkJCQlkZWx0YS5yZW1vdmVkKGN1LmdldEltcG9ydENvbnRhaW5lcigpKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCX0KLQlpZiAoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJY3Uuc2F2ZShnZXRTdWJQcm9ncmVzc01vbml0b3IoMSksIGZGb3JjZSk7Ci0JCWlmICghY3UuaXNXb3JraW5nQ29weSgpKSB7IC8vIGlmIHVuaXQgaXMgd29ya2luZyBjb3B5LCB0aGVuIHNhdmUgd2lsbCBoYXZlIGFscmVhZHkgZmlyZWQgdGhlIGRlbHRhCi0JCQlhZGREZWx0YShkZWx0YSk7Ci0JCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCQlpZiAoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKKwkJCWN1LnNhdmUoZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpLCBmRm9yY2UpOworCQkJaWYgKCFjdS5pc1dvcmtpbmdDb3B5KCkpIHsgLy8gaWYgdW5pdCBpcyB3b3JraW5nIGNvcHksIHRoZW4gc2F2ZSB3aWxsIGhhdmUgYWxyZWFkeSBmaXJlZCB0aGUgZGVsdGEKKwkJCQlhZGREZWx0YShkZWx0YSk7CisJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOworCQkJfQogCQl9CiAJfQotfQotLyoqCi0gKiBAc2VlIE11bHRpT3BlcmF0aW9uCi0gKiBUaGlzIG1ldGhvZCBmaXJzdCBncm91cCB0aGUgZWxlbWVudHMgYnkgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4sCi0gKiBhbmQgdGhlbiBwcm9jZXNzZXMgdGhlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgotICovCi1wcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlncm91cEVsZW1lbnRzKCk7Ci0Jc3VwZXIucHJvY2Vzc0VsZW1lbnRzKCk7Ci19Ci0vKioKLSAqIEBzZWUgTXVsdGlPcGVyYXRpb24KLSAqLwotcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSVJlZ2lvbikgZkNoaWxkcmVuVG9SZW1vdmUuZ2V0KGVsZW1lbnQpKS5nZXRFbGVtZW50cygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCWlmIChjaGlsZC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSAhPSBudWxsKQotCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGNoaWxkKTsKLQkJaWYgKGNoaWxkLmlzUmVhZE9ubHkoKSkKLQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCBjaGlsZCk7CisJLyoqCisJICogQHNlZSBNdWx0aU9wZXJhdGlvbgorCSAqIFRoaXMgbWV0aG9kIGZpcnN0IGdyb3VwIHRoZSBlbGVtZW50cyBieSA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPiwKKwkgKiBhbmQgdGhlbiBwcm9jZXNzZXMgdGhlIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlncm91cEVsZW1lbnRzKCk7CisJCXN1cGVyLnByb2Nlc3NFbGVtZW50cygpOwogCX0KLX0KKwkvKioKKwkgKiBAc2VlIE11bHRpT3BlcmF0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElSZWdpb24pIGZDaGlsZHJlblRvUmVtb3ZlLmdldChlbGVtZW50KSkuZ2V0RWxlbWVudHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJSUphdmFFbGVtZW50IGNoaWxkID0gY2hpbGRyZW5baV07CisJCQlpZiAoY2hpbGQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgIT0gbnVsbCkKKwkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgY2hpbGQpOworCQkJaWYgKGNoaWxkLmlzUmVhZE9ubHkoKSkKKwkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgY2hpbGQpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2JjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworCitwdWJsaWMgY2xhc3MgRGVsZXRlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbiBleHRlbmRzIEphdmFNb2RlbE9wZXJhdGlvbiB7CisKKwlpbnQgdXBkYXRlUmVzb3VyY2VGbGFnczsKKwlpbnQgdXBkYXRlTW9kZWxGbGFnczsKKworCXB1YmxpYyBEZWxldGVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uKAorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290LAorCQlpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywKKwkJaW50IHVwZGF0ZU1vZGVsRmxhZ3MpIHsKKwkJCQorCQlzdXBlcihyb290KTsKKwkJdGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzID0gdXBkYXRlUmVzb3VyY2VGbGFnczsKKwkJdGhpcy51cGRhdGVNb2RlbEZsYWdzID0gdXBkYXRlTW9kZWxGbGFnczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KXRoaXMuZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCQlJQ2xhc3NwYXRoRW50cnkgcm9vdEVudHJ5ID0gcm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOworCQkKKwkJLy8gZGVsZXRlIHJlc291cmNlCisJCWlmICghcm9vdC5pc0V4dGVybmFsKCkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk5PX1JFU09VUkNFX01PRElGSUNBVElPTikgPT0gMCkgeworCQkJZGVsZXRlUmVzb3VyY2Uocm9vdCwgcm9vdEVudHJ5KTsKKwkJfQorCisJCS8vIHVwZGF0ZSBjbGFzc3BhdGggaWYgbmVlZGVkCisJCWlmICgodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgpICE9IDApIHsKKwkJCXVwZGF0ZVByb2plY3RDbGFzc3BhdGgocm9vdEVudHJ5LmdldFBhdGgoKSwgcm9vdC5nZXRKYXZhUHJvamVjdCgpKTsKKwkJfQorCQlpZiAoKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEgpICE9IDApIHsKKwkJCXVwZGF0ZVJlZmVycmluZ1Byb2plY3RDbGFzc3BhdGhzKHJvb3RFbnRyeS5nZXRQYXRoKCksIHJvb3QuZ2V0SmF2YVByb2plY3QoKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZXNvdXJjZSgKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwKKwkJSUNsYXNzcGF0aEVudHJ5IHJvb3RFbnRyeSkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWZpbmFsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSlyb290RW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKKwkJSVJlc291cmNlIHJvb3RSZXNvdXJjZSA9IHJvb3QuZ2V0UmVzb3VyY2UoKTsKKwkJaWYgKHJvb3RFbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSB8fCBleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCXJvb3RSZXNvdXJjZS5kZWxldGUodGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmluYWwgSVBhdGhbXSBuZXN0ZWRGb2xkZXJzID0gZ2V0TmVzdGVkRm9sZGVycyhyb290KTsKKwkJCUlSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCQkJCUlQYXRoIHBhdGggPSBwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKTsKKwkJCQkJCWlmIChwcmVmaXhlc09uZU9mKHBhdGgsIG5lc3RlZEZvbGRlcnMpKSB7CisJCQkJCQkJLy8gZXF1YWxzIGlmIG5lc3RlZCBzb3VyY2UgZm9sZGVyCisJCQkJCQkJcmV0dXJuICFlcXVhbHNPbmVPZihwYXRoLCBuZXN0ZWRGb2xkZXJzKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gc3VidHJlZSBkb2Vzbid0IGNvbnRhaW4gYW55IG5lc3RlZCBzb3VyY2UgZm9sZGVycworCQkJCQkJCXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmRlbGV0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcHJveHkucmVxdWVzdFJlc291cmNlKCkuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCQl0cnkgeworCQkJCXJvb3RSZXNvdXJjZS5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLk5PTkUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfQorCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCX0KKworCisJLyoKKwkgKiBEZWxldGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBlcXVhbHMgdG8gdGhlIGdpdmVuIHJvb3RQYXRoIGZyb20gYWxsIEphdmEgcHJvamVjdHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVmZXJyaW5nUHJvamVjdENsYXNzcGF0aHMoSVBhdGggcm9vdFBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUphdmFNb2RlbCBtb2RlbCA9IHRoaXMuZ2V0SmF2YU1vZGVsKCk7CisJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCWlmIChwcm9qZWN0LmVxdWFscyhwcm9qZWN0T2ZSb290KSkgY29udGludWU7CisJCQl1cGRhdGVQcm9qZWN0Q2xhc3NwYXRoKHJvb3RQYXRoLCBwcm9qZWN0KTsKKwkJfQorCX0KKworCS8qCisJICogRGVsZXRlcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZXF1YWxzIHRvIHRoZSBnaXZlbiByb290UGF0aCBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RDbGFzc3BhdGgoSVBhdGggcm9vdFBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbnVsbDsKKwkJaW50IGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsKKwkJaW50IG5ld0NQSW5kZXggPSAtMTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBjcExlbmd0aDsgaisrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbal07CisJCQlpZiAocm9vdFBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKKwkJCQlpZiAobmV3Q2xhc3NwYXRoID09IG51bGwpIHsKKwkJCQkJbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjcExlbmd0aC0xXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgaik7CisJCQkJCW5ld0NQSW5kZXggPSBqOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobmV3Q2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQluZXdDbGFzc3BhdGhbbmV3Q1BJbmRleCsrXSA9IGVudHJ5OworCQkJfQorCQl9CisJCWlmIChuZXdDbGFzc3BhdGggIT0gbnVsbCkgeworCQkJaWYgKG5ld0NQSW5kZXggPCBuZXdDbGFzc3BhdGgubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShuZXdDbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q1BJbmRleF0sIDAsIG5ld0NQSW5kZXgpOworCQkJfQorCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBmTW9uaXRvcik7CisJCX0KKwl9CQorCXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMuZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCQlpZiAocm9vdCA9PSBudWxsIHx8ICFyb290LmV4aXN0cygpKSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHJvb3QpOworCQl9CisKKwkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5nZXRSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgeworCQkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9SRVNPVVJDRSwgcm9vdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIEphdmFNb2RlbFN0YXR1cy5WRVJJRklFRF9PSzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbGV0ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQppbmRleCBmZDM2MDE3Li4zNzVhMTQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsZXRlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKQEAgLTQwLDcgKzQwLDcgQEAKICAqLwogcHJpdmF0ZSB2b2lkIGRlbGV0ZVBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IGZyYWcpCiAJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVJlc291cmNlIHJlcyA9IGZyYWcuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7CisJSVJlc291cmNlIHJlcyA9IGZyYWcuZ2V0UmVzb3VyY2UoKTsKIAlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CiAJCS8vIGNvbGxlY3QgdGhlIGNoaWxkcmVuIHRvIHJlbW92ZQogCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbk9mSW50ZXJlc3QgPSBmcmFnLmdldENoaWxkcmVuKCk7CkBAIC04Myw3ICs4MywxMCBAQAogCQl9CiAJCWlmIChpc0VtcHR5KSB7CiAJCQkvLyBkZWxldGUgcmVjdXJzaXZlbHkgZW1wdHkgZm9sZGVycwotCQkJZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoZnJhZywgZmFsc2UpOworCQkJSVJlc291cmNlIGZyYWdSZXNvdXJjZSA9ICBmcmFnLmdldFJlc291cmNlKCk7CisJCQlpZiAoZnJhZ1Jlc291cmNlICE9IG51bGwpIHsKKwkJCQlkZWxldGVFbXB0eVBhY2thZ2VGcmFnbWVudChmcmFnLCBmYWxzZSwgZnJhZ1Jlc291cmNlLmdldFBhcmVudCgpKTsKKwkJCX0KIAkJfQogCX0KIH0KQEAgLTEwMSw3ICsxMDQsNyBAQAogCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CiAJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEUgOgogCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKLQkJCWRlbGV0ZVJlc291cmNlKGVsZW1lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCksIGZGb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZKTsKKwkJCWRlbGV0ZVJlc291cmNlKGVsZW1lbnQuZ2V0UmVzb3VyY2UoKSwgZkZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgogCQkJZGVsZXRlUGFja2FnZUZyYWdtZW50KChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50KTsKQEAgLTEyNiw1ICsxMjksMTEgQEAKIAkJZXJyb3IoSmF2YU1vZGVsU3RhdHVzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CiAJZWxzZSBpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50KQogCQllcnJvcihKYXZhTW9kZWxTdGF0dXMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7CisJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQlpZiAocmVzb3VyY2UuaXNMaW5rZWQoKSkgeworCQkJZXJyb3IoSmF2YU1vZGVsU3RhdHVzLklOVkFMSURfUkVTT1VSQ0UsIGVsZW1lbnQpOworCQl9CisJfQogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0RlbHRhUHJvY2Vzc29yLmphdmEKaW5kZXggYjY2OTZhZC4uMTllM2RmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRGVsdGFQcm9jZXNzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZWx0YVByb2Nlc3Nvci5qYXZhCkBAIC0xLDE3ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0xOSwxMiArMTksMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CkBAIC00NCw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuSmF2YUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKIAogLyoqCkBAIC02NCw0MCArNjYsMTM3IEBACiAJZmluYWwgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9KQVJfVU5DSEFOR0VEID0gImV4dGVybmFsIGphciB1bmNoYW5nZWQiOyAvLyROT04tTkxTLTEkCiAJZmluYWwgc3RhdGljIFN0cmluZyBJTlRFUk5BTF9KQVJfSUdOT1JFID0gImludGVybmFsIGphciBpZ25vcmUiOyAvLyROT04tTkxTLTEkCiAJCisJZmluYWwgc3RhdGljIGludCBOT05fSkFWQV9SRVNPVVJDRSA9IC0xOworCQogCS8qKgogCSAqIFRoZSA8Y29kZT5KYXZhRWxlbWVudERlbHRhPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4gYmVpbmcgdHJhbnNsYXRlZC4KIAkgKi8KLQlwcm90ZWN0ZWQgSmF2YUVsZW1lbnREZWx0YSBmQ3VycmVudERlbHRhOworCXByb3RlY3RlZCBKYXZhRWxlbWVudERlbHRhIGN1cnJlbnREZWx0YTsKIAkKIAlwcm90ZWN0ZWQgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG5ldyBJbmRleE1hbmFnZXIoKTsKIAkJCi0JLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBJSmF2YVByb2plY3QgKi8KLQlNYXAgcm9vdHM7CisJLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBSb290SW5mbyAqLworCXB1YmxpYyBNYXAgcm9vdHM7CiAJCi0JLyogQSB0YWJsZSBmcm9tIElQYXRoIChmcm9tIGEgY2xhc3NwYXRoIGVudHJ5KSB0byBIYXNoU2V0IG9mIElKYXZhUHJvamVjdAorCS8qIEEgdGFibGUgZnJvbSBJUGF0aCAoZnJvbSBhIGNsYXNzcGF0aCBlbnRyeSkgdG8gQXJyYXlMaXN0IG9mIFJvb3RJbmZvCiAJICogVXNlZCB3aGVuIGFuIElQYXRoIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbiBvbmUgcm9vdCAqLwogCU1hcCBvdGhlclJvb3RzOwogCQotCS8qIFRoZSBqYXZhIGVsZW1lbnQgdGhhdCB3YXMgbGFzdCBjcmVhdGVkIChzZWUgY3JlYXRlRWxlbWVudChJUmVzb3VyY2UpLiAKKwkvKiBXaGV0aGVyIHRoZSByb290cyB0YWJsZXMgc2hvdWxkIGJlIHJlY29tcHV0ZWQgKi8KKwlwdWJsaWMgYm9vbGVhbiByb290c0FyZVN0YWxlID0gdHJ1ZTsKKwkKKwkvKiBBIHRhYmxlIGZyb20gSVBhdGggKGZyb20gYSBjbGFzc3BhdGggZW50cnkpIHRvIFJvb3RJbmZvCisJICogZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBkZWx0YSBwcm9jZXNzb3Igd2FzIGludm9rZWQuICovCisJcHVibGljIE1hcCBvbGRSb290czsKKworCS8qIEEgdGFibGUgZnJvbSBJUGF0aCAoZnJvbSBhIGNsYXNzcGF0aCBlbnRyeSkgdG8gQXJyYXlMaXN0IG9mIFJvb3RJbmZvCisJICogZnJvbSB0aGUgbGFzdCB0aW1lIHRoZSBkZWx0YSBwcm9jZXNzb3Igd2FzIGludm9rZWQuCisJICogVXNlZCB3aGVuIGFuIElQYXRoIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbiBvbmUgcm9vdCAqLworCU1hcCBvbGRPdGhlclJvb3RzOworCQorCS8qIEEgdGFibGUgZnJvbSBJUGF0aCAoYSBzb3VyY2UgYXR0YWNobWVudCBwYXRoIGZyb20gYSBjbGFzc3BhdGggZW50cnkpIHRvIElQYXRoIChhIHJvb3QgcGF0aCkgKi8KKwlNYXAgc291cmNlQXR0YWNobWVudHM7CisKKwkvKiBUaGUgamF2YSBlbGVtZW50IHRoYXQgd2FzIGxhc3QgY3JlYXRlZCAoc2VlIGNyZWF0ZUVsZW1lbnQoSVJlc291cmNlKSkuIAogCSAqIFRoaXMgaXMgdXNlZCBhcyBhIHN0YWNrIG9mIGphdmEgZWxlbWVudHMgKHVzaW5nIGdldFBhcmVudCgpIHRvIHBvcCBpdCwgYW5kIAogCSAqIHVzaW5nIHRoZSB2YXJpb3VzIGdldCooLi4uKSB0byBwdXNoIGl0LiAqLwogCU9wZW5hYmxlIGN1cnJlbnRFbGVtZW50OwotCQotCS8qCi0JICogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgYmVpbmcgcHJvY2Vzc2VkIChzZWUgQ2hhbmdlZEVsZW1lbnRFdmVudCkKLQkgKi8KLQlpbnQgY3VycmVudEV2ZW50VHlwZTsKLQkKKwkJCiAJcHVibGljIEhhc2hNYXAgZXh0ZXJuYWxUaW1lU3RhbXBzID0gbmV3IEhhc2hNYXAoKTsKIAlwdWJsaWMgSGFzaFNldCBwcm9qZWN0c1RvVXBkYXRlID0gbmV3IEhhc2hTZXQoKTsKIAkvLyBsaXN0IG9mIHJvb3QgcHJvamVjdHMgd2hpY2ggbmFtZWxvb2t1cCBjYWNoZXMgbmVlZCB0byBiZSB1cGRhdGVkIGZvciBkZXBlbmRlbnRzCisJLy8gVE9ETzogKGplcm9tZSkgaXMgaXQgbmVlZGVkPyBwcm9qZWN0c1RvVXBkYXRlIG1pZ2h0IGJlIHN1ZmZpY2llbnQKIAlwdWJsaWMgSGFzaFNldCBwcm9qZWN0c0ZvckRlcGVuZGVudE5hbWVsb29rdXBSZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsgIAogCQogCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlcjsKLQotCXN0YXRpYyBmaW5hbCBJSmF2YUVsZW1lbnREZWx0YVtdIE5PX0RFTFRBID0gbmV3IElKYXZhRWxlbWVudERlbHRhWzBdOwotCisJCisJLyogQSB0YWJsZSBmcm9tIElKYXZhUHJvamVjdCB0byBhbiBhcnJheSBvZiBJUGFja2FnZUZyYWdtZW50Um9vdC4KKwkgKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBwa2cgZnJhZ21lbnQgcm9vdHMgb2YgdGhlIHByb2plY3QgdGhhdCBhcmUgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwlNYXAgcmVtb3ZlZFJvb3RzOworCQorCS8qCisJICogQSBsaXN0IG9mIElKYXZhRWxlbWVudCB1c2VkIGFzIGEgc2NvcGUgZm9yIGV4dGVybmFsIGFyY2hpdmVzIHJlZnJlc2ggZHVyaW5nIFBPU1RfQ0hBTkdFLgorCSAqIFRoaXMgaXMgbnVsbCBpZiBubyByZWZyZXNoIGlzIG5lZWRlZC4KKwkgKi8KKwlIYXNoU2V0IHJlZnJlc2hlZEVsZW1lbnRzOwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWRVJCT1NFID0gZmFsc2U7CisJCisJY2xhc3MgT3V0cHV0c0luZm8geworCQlJUGF0aFtdIHBhdGhzOworCQlpbnRbXSB0cmF2ZXJzZU1vZGVzOworCQlpbnQgb3V0cHV0Q291bnQ7CisJCU91dHB1dHNJbmZvKElQYXRoW10gcGF0aHMsIGludFtdIHRyYXZlcnNlTW9kZXMsIGludCBvdXRwdXRDb3VudCkgeworCQkJdGhpcy5wYXRocyA9IHBhdGhzOworCQkJdGhpcy50cmF2ZXJzZU1vZGVzID0gdHJhdmVyc2VNb2RlczsKKwkJCXRoaXMub3V0cHV0Q291bnQgPSBvdXRwdXRDb3VudDsKKwkJfQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJaWYgKHRoaXMucGF0aHMgPT0gbnVsbCkgcmV0dXJuICI8bm9uZT4iOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm91dHB1dENvdW50OyBpKyspIHsKKwkJCQlidWZmZXIuYXBwZW5kKCJwYXRoPSIpOyAvLyROT04tTkxTLTEkCisJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnBhdGhzW2ldLnRvU3RyaW5nKCkpOworCQkJCWJ1ZmZlci5hcHBlbmQoIlxuLT50cmF2ZXJzZT0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXN3aXRjaCAodGhpcy50cmF2ZXJzZU1vZGVzW2ldKSB7CisJCQkJCWNhc2UgQklOQVJZOgorCQkJCQkJYnVmZmVyLmFwcGVuZCgiQklOQVJZIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIElHTk9SRToKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoIklHTk9SRSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTT1VSQ0U6CisJCQkJCQlidWZmZXIuYXBwZW5kKCJTT1VSQ0UiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlidWZmZXIuYXBwZW5kKCI8dW5rbm93bj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlpZiAoaSsxIDwgdGhpcy5vdXRwdXRDb3VudCkgeworCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwkJfQorCX0KKwljbGFzcyBSb290SW5mbyB7CisJCUlKYXZhUHJvamVjdCBwcm9qZWN0OworCQlJUGF0aCByb290UGF0aDsKKwkJY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnM7CisJCVJvb3RJbmZvKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByb290UGF0aCwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMpIHsKKwkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CisJCQl0aGlzLnJvb3RQYXRoID0gcm9vdFBhdGg7CisJCQl0aGlzLmV4Y2x1c2lvblBhdHRlcm5zID0gZXhjbHVzaW9uUGF0dGVybnM7CisJCX0KKwkJYm9vbGVhbiBpc1Jvb3RPZlByb2plY3QoSVBhdGggcGF0aCkgeworCQkJcmV0dXJuIHRoaXMucm9vdFBhdGguZXF1YWxzKHBhdGgpICYmIHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigicHJvamVjdD0iKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHRoaXMucHJvamVjdCA9PSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5wcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiXG5wYXRoPSIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAodGhpcy5yb290UGF0aCA9PSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5yb290UGF0aC50b1N0cmluZygpKTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoIlxuZXhjbHVkaW5nPSIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAodGhpcy5leGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyh0aGlzLmV4Y2x1c2lvblBhdHRlcm5zW2ldKSk7CisJCQkJCWlmIChpIDwgbGVuZ3RoLTEpIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoInwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCQl9CisJfQogCiAJRGVsdGFQcm9jZXNzb3IoSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyKSB7CiAJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CkBAIC0xMDksMTAgKzIwOCwxMCBAQAogCSAqLwogCXZvaWQgYWRkRGVwZW5kZW50UHJvamVjdHMoSVBhdGggcHJvamVjdFBhdGgsIEhhc2hTZXQgcmVzdWx0KSB7CiAJCXRyeSB7Ci0JCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOworCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gKChKYXZhUHJvamVjdClwcm9qZWN0KS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKIAkJCQlmb3IgKGludCBqID0gMCwgbGVuZ3RoMiA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBsZW5ndGgyOyBqKyspIHsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOwogCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVApAQCAtMTI1LDYgKzIyNCwxNSBAQAogCQl9CiAJfQogCS8qCisJICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCB0byB0aGUgbGlzdCBvZiBlbGVtZW50cyB1c2VkIGFzIGEgc2NvcGUgZm9yIGV4dGVybmFsIGphcnMgcmVmcmVzaC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRGb3JSZWZyZXNoKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCWlmICh0aGlzLnJlZnJlc2hlZEVsZW1lbnRzID09IG51bGwpIHsKKwkJCXRoaXMucmVmcmVzaGVkRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOworCQl9CisJCXRoaXMucmVmcmVzaGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOworCX0KKwkvKgogCSAqIEFkZHMgdGhlIGdpdmVuIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbnRzIHRvIHRoZSBsaXN0IG9mIHRoZSBwcm9qZWN0cwogCSAqIHRvIHVwZGF0ZS4KIAkgKi8KQEAgLTE0MSw3ICsyNDksNyBAQAogCQlPcGVuYWJsZSBwYXJlbnQgPSAoT3BlbmFibGUpIGNoaWxkLmdldFBhcmVudCgpOwogCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzT3BlbigpKSB7CiAJCQl0cnkgewotCQkJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKXBhcmVudC5nZXRFbGVtZW50SW5mbygpOwogCQkJCWluZm8uYWRkQ2hpbGQoY2hpbGQpOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBkbyBub3RoaW5nIC0gd2UgYWxyZWFkeSBjaGVja2VkIGlmIG9wZW4KQEAgLTE0OSw4MSArMjU3LDY0IEBACiAJCX0KIAl9CiAKLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBnaXZlbiBlbGVtZW50LCB3aGljaCByZW1vdmVzIGl0IGZyb20gdGhlIGNhY2hlIG9mIG9wZW4gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsb3NlKE9wZW5hYmxlIGVsZW1lbnQpIHsKLQotCQl0cnkgewotCQkJZWxlbWVudC5jbG9zZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0KLXByaXZhdGUgdm9pZCBjbG9uZUN1cnJlbnREZWx0YShJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgewotCUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSAoSmF2YUVsZW1lbnREZWx0YSlmQ3VycmVudERlbHRhLmZpbmQocm9vdCk7Ci0JaWYgKGRlbHRhID09IG51bGwpIHJldHVybjsKLQlKYXZhRWxlbWVudERlbHRhIGNsb25lID0gKEphdmFFbGVtZW50RGVsdGEpZGVsdGEuY2xvbmUocHJvamVjdCk7Ci0JZkN1cnJlbnREZWx0YS5pbnNlcnREZWx0YVRyZWUoY2xvbmUuZ2V0RWxlbWVudCgpLCBjbG9uZSk7Ci0Jc3dpdGNoIChjbG9uZS5nZXRLaW5kKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRDoKLQkJCXRoaXMuYWRkVG9QYXJlbnRJbmZvKChPcGVuYWJsZSljbG9uZS5nZXRFbGVtZW50KCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRDoKLQkJCU9wZW5hYmxlIGVsZW1lbnQgPSAoT3BlbmFibGUpY2xvbmUuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQuaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQllbGVtZW50LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLnJlbW92ZUZyb21QYXJlbnRJbmZvKGVsZW1lbnQpOwotCQkJYnJlYWs7Ci0JfQotfQotCi0KLQkvKioKLQkgKiBHZW5lcmljIHByb2Nlc3NpbmcgZm9yIGVsZW1lbnRzIHdpdGggY2hhbmdlZCBjb250ZW50czo8dWw+Ci0JICogPGxpPlRoZSBlbGVtZW50IGlzIGNsb3NlZCBzdWNoIHRoYXQgYW55IHN1YnNlcXVlbnQgYWNjZXNzZXMgd2lsbCByZS1vcGVuCi0JICogdGhlIGVsZW1lbnQgcmVmbGVjdGluZyBpdHMgbmV3IHN0cnVjdHVyZS4KLQkgKiA8bGk+QW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgZGVsdGEgcmVwb3J0aW5nIGEgY29udGVudCBjaGFuZ2UgKEtfQ0hBTkdFIHdpdGggRl9DT05URU5UIGZsYWcgc2V0KS4KLQkgKiA8L3VsPgotCSAqIERlbHRhIGFyZ3VtZW50IGNvdWxkIGJlIG51bGwgaWYgcHJvY2Vzc2luZyBhbiBleHRlcm5hbCBKQVIgY2hhbmdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udGVudENoYW5nZWQoT3BlbmFibGUgZWxlbWVudCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQotCQljbG9zZShlbGVtZW50KTsKLQkJaW50IGZsYWdzID0gSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpewotCQkJZmxhZ3MgfD0gSUphdmFFbGVtZW50RGVsdGEuRl9BUkNISVZFX0NPTlRFTlRfQ0hBTkdFRDsKLQkJfQotCQlmQ3VycmVudERlbHRhLmNoYW5nZWQoZWxlbWVudCwgZmxhZ3MpOwotCX0KLQkKIAkvKioKIAkgKiBDaGVjayBhbGwgZXh0ZXJuYWwgYXJjaGl2ZSAocmVmZXJlbmNlZCBieSBnaXZlbiByb290cywgcHJvamVjdHMgb3IgbW9kZWwpIHN0YXR1cyBhbmQgaXNzdWUgYSBjb3JyZXNwb25kaW5nIHJvb3QgZGVsdGEuCiAJICogQWxzbyB0cmlnZ2VycyBpbmRleCB1cGRhdGVzCiAJICovCiAJcHVibGljIHZvaWQgY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKElKYXZhRWxlbWVudFtdIHJlZnJlc2hlZEVsZW1lbnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQl0cnkgewotCQkJSGFzaE1hcCBleHRlcm5hbEFyY2hpdmVzU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCUphdmFNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCk7CQkJCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVmcmVzaGVkRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQl0aGlzLmFkZEZvclJlZnJlc2gocmVmcmVzaGVkRWxlbWVudHNbaV0pOworCQkJfQorCQkJYm9vbGVhbiBoYXNEZWx0YSA9IHRoaXMuY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEobW9uaXRvcik7CisJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47IAorCQkJaWYgKGhhc0RlbHRhKXsKKwkJCQkvLyBmb3JjZSBjbGFzc3BhdGggbWFya2VyIHJlZnJlc2ggb2YgYWZmZWN0ZWQgcHJvamVjdHMKKwkJCQlKYXZhTW9kZWwuZmx1c2hFeHRlcm5hbEZpbGVDYWNoZSgpOworCQkJCUlKYXZhRWxlbWVudERlbHRhW10gcHJvamVjdERlbHRhcyA9IHRoaXMuY3VycmVudERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdERlbHRhcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IHByb2plY3REZWx0YXNbaV07CisJCQkJCSgoSmF2YVByb2plY3QpZGVsdGEuZ2V0RWxlbWVudCgpKS5nZXRSZXNvbHZlZENsYXNzcGF0aCgKKwkJCQkJCXRydWUsIC8vIGlnbm9yZVVucmVzb2x2ZWRFbnRyeQorCQkJCQkJdHJ1ZSk7IC8vIGdlbmVyYXRlTWFya2VyT25FcnJvcgorCQkJCX0JCQorCQkJCWlmICh0aGlzLmN1cnJlbnREZWx0YSAhPSBudWxsKSB7IC8vIGlmIGRlbHRhIGhhcyBub3QgYmVlbiBmaXJlZCB3aGlsZSBjcmVhdGluZyBtYXJrZXJzCisJCQkJCXRoaXMubWFuYWdlci5maXJlKHRoaXMuY3VycmVudERlbHRhLCBKYXZhTW9kZWxNYW5hZ2VyLkRFRkFVTFRfQ0hBTkdFX0VWRU5UKTsKKwkJCQl9CisJCQl9CisJCX0gZmluYWxseSB7CisJCQl0aGlzLmN1cnJlbnREZWx0YSA9IG51bGw7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KKwkvKgorCSAqIENoZWNrIGlmIGV4dGVybmFsIGFyY2hpdmVzIGhhdmUgY2hhbmdlZCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlbHRhcy4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb24gZGVsdGEgd2FzIGNyZWF0ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCWlmICh0aGlzLnJlZnJlc2hlZEVsZW1lbnRzID09IG51bGwpIHJldHVybiBmYWxzZTsKIAkJCQotCQkJLy8gZmluZCBKQVJzIHRvIHJlZnJlc2gKLQkJCUhhc2hTZXQgYXJjaGl2ZVBhdGhzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBlbGVtZW50c0xlbmd0aCA9IHJlZnJlc2hlZEVsZW1lbnRzLmxlbmd0aDsgaSA8IGVsZW1lbnRzTGVuZ3RoOyBpKyspewotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gcmVmcmVzaGVkRWxlbWVudHNbaV07CisJCUhhc2hNYXAgZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7CisJCWJvb2xlYW4gaGFzRGVsdGEgPSBmYWxzZTsKKwkJCisJCS8vIGZpbmQgSkFScyB0byByZWZyZXNoCisJCUhhc2hTZXQgYXJjaGl2ZVBhdGhzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKKwkJdHJ5IHsKKwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5yZWZyZXNoZWRFbGVtZW50cy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gKElKYXZhRWxlbWVudClpdGVyYXRvci5uZXh0KCk7CiAJCQkJc3dpdGNoKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSl7CiAJCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6CiAJCQkJCQlhcmNoaXZlUGF0aHNUb1JlZnJlc2guYWRkKGVsZW1lbnQuZ2V0UGF0aCgpKTsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gKChJSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50OworCQkJCQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QuZ2V0UHJvamVjdCgpKSkgeworCQkJCQkJCS8vIHByb2plY3QgaXMgbm90IGFjY2Vzc2libGUgb3IgaGFzIGxvc3QgaXRzIEphdmEgbmF0dXJlCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGNwTGVuZ3RoOyBqKyspewogCQkJCQkJCWlmIChjbGFzc3BhdGhbal0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKXsKIAkJCQkJCQkJYXJjaGl2ZVBhdGhzVG9SZWZyZXNoLmFkZChjbGFzc3BhdGhbal0uZ2V0UGF0aCgpKTsKQEAgLTIzMyw3ICszMjQsMTIgQEAKIAkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6CiAJCQkJCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZ2V0T2xkSmF2YVByb2plY3RzTGlzdCgpOwogCQkJCQkJZm9yIChpbnQgaiA9IDAsIHByb2plY3RzTGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBqIDwgcHJvamVjdHNMZW5ndGg7IGorKyl7Ci0JCQkJCQkJY2xhc3NwYXRoID0gKChJSmF2YVByb2plY3QpIHByb2plY3RzW2pdKS5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKKwkJCQkJCQlwcm9qZWN0ID0gcHJvamVjdHNbal07CisJCQkJCQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QuZ2V0UHJvamVjdCgpKSkgeworCQkJCQkJCQkvLyBwcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIG9yIGhhcyBsb3N0IGl0cyBKYXZhIG5hdHVyZQorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisJCQkJCQkJY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKIAkJCQkJCQlmb3IgKGludCBrID0gMCwgY3BMZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOyBrIDwgY3BMZW5ndGg7IGsrKyl7CiAJCQkJCQkJCWlmIChjbGFzc3BhdGhba10uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKXsKIAkJCQkJCQkJCWFyY2hpdmVQYXRoc1RvUmVmcmVzaC5hZGQoY2xhc3NwYXRoW2tdLmdldFBhdGgoKSk7CkBAIC0yNDMsMTE2ICszMzksMTIxIEBACiAJCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQkvLyBwZXJmb3JtIHJlZnJlc2gKLQkJCWZDdXJyZW50RGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShtb2RlbCk7Ci0JCQlib29sZWFuIGhhc0RlbHRhID0gZmFsc2U7Ci0KLQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbWFuYWdlci5nZXRKYXZhTW9kZWwoKS5nZXRPbGRKYXZhUHJvamVjdHNMaXN0KCk7Ci0JCQlJV29ya3NwYWNlUm9vdCB3a3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQotCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsgCi0JCQkJCi0JCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspewotCQkJCQlpZiAoZW50cmllc1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMucmVmcmVzaGVkRWxlbWVudHMgPSBudWxsOworCQl9CisJCQorCQkvLyBwZXJmb3JtIHJlZnJlc2gKKwkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtYW5hZ2VyLmdldEphdmFNb2RlbCgpLmdldE9sZEphdmFQcm9qZWN0c0xpc3QoKTsKKwkJSVdvcmtzcGFjZVJvb3Qgd2tzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCisJCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSBicmVhazsgCisJCQkKKwkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQlpZiAoIUphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7CisJCQkJLy8gcHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSBvciBoYXMgbG9zdCBpdHMgSmF2YSBuYXR1cmUKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKXsKKwkJCQlpZiAoZW50cmllc1tqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCQkJCisJCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJpZXNbal0uZ2V0UGF0aCgpOworCQkJCQkKKwkJCQkJaWYgKCFhcmNoaXZlUGF0aHNUb1JlZnJlc2guY29udGFpbnMoZW50cnlQYXRoKSkgY29udGludWU7IC8vIG5vdCBzdXBwb3NlZCB0byBiZSByZWZyZXNoZWQKKwkJCQkJCisJCQkJCVN0cmluZyBzdGF0dXMgPSAoU3RyaW5nKWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMuZ2V0KGVudHJ5UGF0aCk7IAorCQkJCQlpZiAoc3RhdHVzID09IG51bGwpewogCQkJCQkJCi0JCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyaWVzW2pdLmdldFBhdGgoKTsKLQkJCQkJCQotCQkJCQkJaWYgKCFhcmNoaXZlUGF0aHNUb1JlZnJlc2guY29udGFpbnMoZW50cnlQYXRoKSkgY29udGludWU7IC8vIG5vdCBzdXBwb3NlZCB0byBiZSByZWZyZXNoZWQKLQkJCQkJCQotCQkJCQkJU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5nZXQoZW50cnlQYXRoKTsgCi0JCQkJCQlpZiAoc3RhdHVzID09IG51bGwpeworCQkJCQkJLy8gY29tcHV0ZSBzaGFyZWQgc3RhdHVzCisJCQkJCQlPYmplY3QgdGFyZ2V0TGlicmFyeSA9IEphdmFNb2RlbC5nZXRUYXJnZXQod2tzUm9vdCwgZW50cnlQYXRoLCB0cnVlKTsKKwkJCisJCQkJCQlpZiAodGFyZ2V0TGlicmFyeSA9PSBudWxsKXsgLy8gbWlzc2luZyBKQVIKKwkJCQkJCQlpZiAodGhpcy5leHRlcm5hbFRpbWVTdGFtcHMuY29udGFpbnNLZXkoZW50cnlQYXRoKSl7CisJCQkJCQkJCXRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLnJlbW92ZShlbnRyeVBhdGgpOworCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9SRU1PVkVEKTsKKwkJCQkJCQkJLy8gdGhlIGphciB3YXMgcGh5c2ljYWxseSByZW1vdmVkOiByZW1vdmUgdGhlIGluZGV4CisJCQkJCQkJCWluZGV4TWFuYWdlci5yZW1vdmVJbmRleChlbnRyeVBhdGgpOworCQkJCQkJCX0KKwkJCisJCQkJCQl9IGVsc2UgaWYgKHRhcmdldExpYnJhcnkgaW5zdGFuY2VvZiBGaWxlKXsgLy8gZXh0ZXJuYWwgSkFSCisJCQorCQkJCQkJCUZpbGUgZXh0ZXJuYWxGaWxlID0gKEZpbGUpdGFyZ2V0TGlicmFyeTsKIAkJCQkJCQkKLQkJCQkJCQkvLyBjb21wdXRlIHNoYXJlZCBzdGF0dXMKLQkJCQkJCQlPYmplY3QgdGFyZ2V0TGlicmFyeSA9IEphdmFNb2RlbC5nZXRUYXJnZXQod2tzUm9vdCwgZW50cnlQYXRoLCB0cnVlKTsKLQotCQkJCQkJCWlmICh0YXJnZXRMaWJyYXJ5ID09IG51bGwpeyAvLyBtaXNzaW5nIEpBUgotCQkJCQkJCQlpZiAodGhpcy5leHRlcm5hbFRpbWVTdGFtcHMuY29udGFpbnNLZXkoZW50cnlQYXRoKSl7Ci0JCQkJCQkJCQl0aGlzLmV4dGVybmFsVGltZVN0YW1wcy5yZW1vdmUoZW50cnlQYXRoKTsKKwkJCQkJCQkvLyBjaGVjayB0aW1lc3RhbXAgdG8gZmlndXJlIGlmIEpBUiBoYXMgY2hhbmdlZCBpbiBzb21lIHdheQorCQkJCQkJCUxvbmcgb2xkVGltZXN0YW1wID0oTG9uZykgdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMuZ2V0KGVudHJ5UGF0aCk7CisJCQkJCQkJbG9uZyBuZXdUaW1lU3RhbXAgPSBnZXRUaW1lU3RhbXAoZXh0ZXJuYWxGaWxlKTsKKwkJCQkJCQlpZiAob2xkVGltZXN0YW1wICE9IG51bGwpeworCQkKKwkJCQkJCQkJaWYgKG5ld1RpbWVTdGFtcCA9PSAwKXsgLy8gZmlsZSBkb2Vzbid0IGV4aXN0CiAJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9SRU1PVkVEKTsKLQkJCQkJCQkJCS8vIHRoZSBqYXIgd2FzIHBoeXNpY2FsbHkgcmVtb3ZlZDogcmVtb3ZlIHRoZSBpbmRleAorCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucmVtb3ZlKGVudHJ5UGF0aCk7CisJCQkJCQkJCQkvLyByZW1vdmUgdGhlIGluZGV4CiAJCQkJCQkJCQlpbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgoZW50cnlQYXRoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfSBlbHNlIGlmICh0YXJnZXRMaWJyYXJ5IGluc3RhbmNlb2YgRmlsZSl7IC8vIGV4dGVybmFsIEpBUgotCi0JCQkJCQkJCUZpbGUgZXh0ZXJuYWxGaWxlID0gKEZpbGUpdGFyZ2V0TGlicmFyeTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIGNoZWNrIHRpbWVzdGFtcCB0byBmaWd1cmUgaWYgSkFSIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5Ci0JCQkJCQkJCUxvbmcgb2xkVGltZXN0YW1wID0oTG9uZykgdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMuZ2V0KGVudHJ5UGF0aCk7Ci0JCQkJCQkJCWxvbmcgbmV3VGltZVN0YW1wID0gZ2V0VGltZVN0YW1wKGV4dGVybmFsRmlsZSk7Ci0JCQkJCQkJCWlmIChvbGRUaW1lc3RhbXAgIT0gbnVsbCl7Ci0KLQkJCQkJCQkJCWlmIChuZXdUaW1lU3RhbXAgPT0gMCl7IC8vIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgRVhURVJOQUxfSkFSX1JFTU9WRUQpOwotCQkJCQkJCQkJCXRoaXMuZXh0ZXJuYWxUaW1lU3RhbXBzLnJlbW92ZShlbnRyeVBhdGgpOwotCQkJCQkJCQkJCS8vIHJlbW92ZSB0aGUgaW5kZXgKLQkJCQkJCQkJCQlpbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgoZW50cnlQYXRoKTsKLQotCQkJCQkJCQkJfSBlbHNlIGlmIChvbGRUaW1lc3RhbXAubG9uZ1ZhbHVlKCkgIT0gbmV3VGltZVN0YW1wKXsKLQkJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9DSEFOR0VEKTsKLQkJCQkJCQkJCQl0aGlzLmV4dGVybmFsVGltZVN0YW1wcy5wdXQoZW50cnlQYXRoLCBuZXcgTG9uZyhuZXdUaW1lU3RhbXApKTsKLQkJCQkJCQkJCQkvLyBmaXJzdCByZW1vdmUgdGhlIGluZGV4IHNvIHRoYXQgaXQgaXMgZm9yY2VkIHRvIGJlIHJlLWluZGV4ZWQKLQkJCQkJCQkJCQlpbmRleE1hbmFnZXIucmVtb3ZlSW5kZXgoZW50cnlQYXRoKTsKLQkJCQkJCQkJCQkvLyB0aGVuIGluZGV4IHRoZSBqYXIKLQkJCQkJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KGVudHJ5UGF0aCwgcHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9VTkNIQU5HRUQpOwotCQkJCQkJCQkJfQorCQkKKwkJCQkJCQkJfSBlbHNlIGlmIChvbGRUaW1lc3RhbXAubG9uZ1ZhbHVlKCkgIT0gbmV3VGltZVN0YW1wKXsKKwkJCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgRVhURVJOQUxfSkFSX0NIQU5HRUQpOworCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucHV0KGVudHJ5UGF0aCwgbmV3IExvbmcobmV3VGltZVN0YW1wKSk7CisJCQkJCQkJCQkvLyBmaXJzdCByZW1vdmUgdGhlIGluZGV4IHNvIHRoYXQgaXQgaXMgZm9yY2VkIHRvIGJlIHJlLWluZGV4ZWQKKwkJCQkJCQkJCWluZGV4TWFuYWdlci5yZW1vdmVJbmRleChlbnRyeVBhdGgpOworCQkJCQkJCQkJLy8gdGhlbiBpbmRleCB0aGUgamFyCisJCQkJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KGVudHJ5UGF0aCwgcHJvamVjdC5nZXRQcm9qZWN0KCkpOwogCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKG5ld1RpbWVTdGFtcCA9PSAwKXsgLy8gamFyIHN0aWxsIGRvZXNuJ3QgZXhpc3QKLQkJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9VTkNIQU5HRUQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9BRERFRCk7Ci0JCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucHV0KGVudHJ5UGF0aCwgbmV3IExvbmcobmV3VGltZVN0YW1wKSk7Ci0JCQkJCQkJCQkJLy8gaW5kZXggdGhlIG5ldyBqYXIKLQkJCQkJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhMaWJyYXJ5KGVudHJ5UGF0aCwgcHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkJfQorCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfVU5DSEFOR0VEKTsKIAkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7IC8vIGludGVybmFsIEpBUgotCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIElOVEVSTkFMX0pBUl9JR05PUkUpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmIChuZXdUaW1lU3RhbXAgPT0gMCl7IC8vIGphciBzdGlsbCBkb2Vzbid0IGV4aXN0CisJCQkJCQkJCQlleHRlcm5hbEFyY2hpdmVzU3RhdHVzLnB1dChlbnRyeVBhdGgsIEVYVEVSTkFMX0pBUl9VTkNIQU5HRUQpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJZXh0ZXJuYWxBcmNoaXZlc1N0YXR1cy5wdXQoZW50cnlQYXRoLCBFWFRFUk5BTF9KQVJfQURERUQpOworCQkJCQkJCQkJdGhpcy5leHRlcm5hbFRpbWVTdGFtcHMucHV0KGVudHJ5UGF0aCwgbmV3IExvbmcobmV3VGltZVN0YW1wKSk7CisJCQkJCQkJCQkvLyBpbmRleCB0aGUgbmV3IGphcgorCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLmluZGV4TGlicmFyeShlbnRyeVBhdGgsIHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7IC8vIGludGVybmFsIEpBUgorCQkJCQkJCWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMucHV0KGVudHJ5UGF0aCwgSU5URVJOQUxfSkFSX0lHTk9SRSk7CiAJCQkJCQl9Ci0JCQkJCQkvLyBhY2NvcmRpbmcgdG8gY29tcHV0ZWQgc3RhdHVzLCBnZW5lcmF0ZSBhIGRlbHRhCi0JCQkJCQlzdGF0dXMgPSAoU3RyaW5nKWV4dGVybmFsQXJjaGl2ZXNTdGF0dXMuZ2V0KGVudHJ5UGF0aCk7IAotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKXsKLQkJCQkJCQlpZiAoc3RhdHVzID09IEVYVEVSTkFMX0pBUl9BRERFRCl7Ci0JCQkJCQkJCVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCWlmIChWRVJCT1NFKXsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLSBFeHRlcm5hbCBKQVIgQURERUQsIGFmZmVjdGluZyByb290OiAiK3Jvb3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfSAKLQkJCQkJCQkJZWxlbWVudEFkZGVkKHJvb3QsIG51bGwpOwotCQkJCQkJCQloYXNEZWx0YSA9IHRydWU7Ci0JCQkJCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gRVhURVJOQUxfSkFSX0NIQU5HRUQpIHsKLQkJCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGVudHJ5UGF0aC50b1N0cmluZygpKTsKLQkJCQkJCQkJaWYgKFZFUkJPU0UpewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEV4dGVybmFsIEpBUiBDSEFOR0VELCBhZmZlY3Rpbmcgcm9vdDogIityb290LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcmVzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBidWlsdCBzdGF0ZSwgc2luY2UgdGhlIGJ1aWxkZXIgd291bGQgbWlzcyB0aGlzIGNoYW5nZQotCQkJCQkJCQl0aGlzLm1hbmFnZXIuc2V0TGFzdEJ1aWx0U3RhdGUocHJvamVjdC5nZXRQcm9qZWN0KCksIG51bGwgLypubyBzdGF0ZSovKTsKLQkJCQkJCQkJY29udGVudENoYW5nZWQocm9vdCwgbnVsbCk7Ci0JCQkJCQkJCWhhc0RlbHRhID0gdHJ1ZTsKLQkJCQkJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBFWFRFUk5BTF9KQVJfUkVNT1ZFRCkgewotCQkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQkJCQlpZiAoVkVSQk9TRSl7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gRXh0ZXJuYWwgSkFSIFJFTU9WRUQsIGFmZmVjdGluZyByb290OiAiK3Jvb3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQllbGVtZW50UmVtb3ZlZChyb290LCBudWxsKTsKLQkJCQkJCQkJaGFzRGVsdGEgPSB0cnVlOworCQkJCQl9CisJCQkJCS8vIGFjY29yZGluZyB0byBjb21wdXRlZCBzdGF0dXMsIGdlbmVyYXRlIGEgZGVsdGEKKwkJCQkJc3RhdHVzID0gKFN0cmluZylleHRlcm5hbEFyY2hpdmVzU3RhdHVzLmdldChlbnRyeVBhdGgpOyAKKwkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKXsKKwkJCQkJCWlmIChzdGF0dXMgPT0gRVhURVJOQUxfSkFSX0FEREVEKXsKKwkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvU3RyaW5nKCkpOworCQkJCQkJCWlmIChWRVJCT1NFKXsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEV4dGVybmFsIEpBUiBBRERFRCwgYWZmZWN0aW5nIHJvb3Q6ICIrcm9vdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0gCisJCQkJCQkJZWxlbWVudEFkZGVkKHJvb3QsIG51bGwsIG51bGwpOworCQkJCQkJCWhhc0RlbHRhID0gdHJ1ZTsKKwkJCQkJCX0gZWxzZSBpZiAoc3RhdHVzID09IEVYVEVSTkFMX0pBUl9DSEFOR0VEKSB7CisJCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGVudHJ5UGF0aC50b1N0cmluZygpKTsKKwkJCQkJCQlpZiAoVkVSQk9TRSl7CisJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLSBFeHRlcm5hbCBKQVIgQ0hBTkdFRCwgYWZmZWN0aW5nIHJvb3Q6ICIrcm9vdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCX0KKwkJCQkJCQkvLyByZXNldCB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IGJ1aWx0IHN0YXRlLCBzaW5jZSB0aGUgYnVpbGRlciB3b3VsZCBtaXNzIHRoaXMgY2hhbmdlCisJCQkJCQkJdGhpcy5tYW5hZ2VyLnNldExhc3RCdWlsdFN0YXRlKHByb2plY3QuZ2V0UHJvamVjdCgpLCBudWxsIC8qbm8gc3RhdGUqLyk7CisJCQkJCQkJY29udGVudENoYW5nZWQocm9vdCwgbnVsbCk7CisJCQkJCQkJaGFzRGVsdGEgPSB0cnVlOworCQkJCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gRVhURVJOQUxfSkFSX1JFTU9WRUQpIHsKKwkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvU3RyaW5nKCkpOworCQkJCQkJCWlmIChWRVJCT1NFKXsKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEV4dGVybmFsIEpBUiBSRU1PVkVELCBhZmZlY3Rpbmcgcm9vdDogIityb290LmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJCWVsZW1lbnRSZW1vdmVkKHJvb3QsIG51bGwsIG51bGwpOworCQkJCQkJCWhhc0RlbHRhID0gdHJ1ZTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCWlmIChoYXNEZWx0YSl7Ci0JCQkJdGhpcy5tYW5hZ2VyLmZpcmUoZkN1cnJlbnREZWx0YSwgSmF2YU1vZGVsTWFuYWdlci5ERUZBVUxUX0NIQU5HRV9FVkVOVCk7CQkJCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlmQ3VycmVudERlbHRhID0gbnVsbDsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOwogCQl9CisJCXJldHVybiBoYXNEZWx0YTsKKwl9CisJSmF2YUVsZW1lbnREZWx0YSBjdXJyZW50RGVsdGEoKSB7CisJCWlmICh0aGlzLmN1cnJlbnREZWx0YSA9PSBudWxsKSB7CisJCQl0aGlzLmN1cnJlbnREZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHRoaXMubWFuYWdlci5nZXRKYXZhTW9kZWwoKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMuY3VycmVudERlbHRhOwogCX0KIAkKIAkvKgpAQCAtMzkwLDcgKzQ5MSw3IEBACiAJCQkJCXRoaXMuYWRkVG9Qcm9qZWN0c1RvVXBkYXRlV2l0aERlcGVuZGVudHMocHJvamVjdCk7CiAJCQkJCQogCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKLQkJCQkJaWYgKHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeworCQkJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgewogCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CiAJCQkJCX0KIApAQCAtNDAyLDcgKzUwMyw3IEBACiAJCQkJCQkKIAkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAogCQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJCQlpZiAodGhpcy5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSB7CisJCQkJCQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsKIAkJCQkJCQkJdGhpcy5hZGRUb1BhcmVudEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKQEAgLTQxNyw3ICs1MTgsNyBAQAogCQkJCQkJfQogCQkJCQl9IGVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApIHsKIAkJCQkJCWJvb2xlYW4gd2FzSmF2YVByb2plY3QgPSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZmluZEphdmFQcm9qZWN0KHByb2plY3QpICE9IG51bGw7Ci0JCQkJCQlib29sZWFuIGlzSmF2YVByb2plY3QgPSB0aGlzLmhhc0phdmFOYXR1cmUocHJvamVjdCk7CisJCQkJCQlib29sZWFuIGlzSmF2YVByb2plY3QgPSBKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpOwogCQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0ICE9IGlzSmF2YVByb2plY3QpIHsKIAkJCQkJCQkvLyBqYXZhIG5hdHVyZSBhZGRlZCBvciByZW1vdmVkOiByZW1lbWJlciAgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVudHMKIAkJCQkJCQl0aGlzLmFkZFRvUHJvamVjdHNUb1VwZGF0ZVdpdGhEZXBlbmRlbnRzKHByb2plY3QpOwpAQCAtNDI3LDYgKzUyOCwxOCBAQAogCQkJCQkJCQl0aGlzLmFkZFRvUGFyZW50SW5mbygoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisJCQkJCQkJCQorCQkJCQkJCQkvLyBmbHVzaCBjbGFzc3BhdGggbWFya2VycworCQkJCQkJCQlqYXZhUHJvamVjdC4KKwkJCQkJCQkJCWZsdXNoQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcnMoCisJCQkJCQkJCQkJdHJ1ZSwgLy8gZmx1c2ggY3ljbGUgbWFya2VycworCQkJCQkJCQkJCXRydWUgIC8vZmx1c2ggY2xhc3NwYXRoIGZvcm1hdCBtYXJrZXJzCisJCQkJCQkJCQkpOworCQkJCQkJCQkJCisJCQkJCQkJCS8vIHJlbW92ZSBwcm9ibGVtcyBhbmQgdGFza3MgY3JlYXRlZCAgYnkgdGhlIGJ1aWxkZXIKKwkJCQkJCQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0Zvcihwcm9qZWN0KTsKKworCQkJCQkJCQkvLyBjbG9zZSBwcm9qZWN0CiAJCQkJCQkJCXRyeSB7CiAJCQkJCQkJCQlqYXZhUHJvamVjdC5jbG9zZSgpOwogCQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewpAQCAtNDM1LDE0ICs1NDgsMTQgQEAKIAkJCQkJCQl9CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCS8vIGluIGNhc2UgdGhlIHByb2plY3Qgd2FzIHJlbW92ZWQgdGhlbiBhZGRlZCB0aGVuIGNoYW5nZWQgKHNlZSBidWcgMTk3OTkpCi0JCQkJCQkJaWYgKHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeyAvLyBuZWVkIG5hdHVyZSBjaGVjayAtIDE4Njk4CisJCQkJCQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsgLy8gbmVlZCBuYXR1cmUgY2hlY2sgLSAxODY5OAogCQkJCQkJCQl0aGlzLmFkZFRvUGFyZW50SW5mbygoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQkvLyB3b3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKIAkJCQkJCS8vIGluIGNhc2UgdGhlIHByb2plY3Qgd2FzIHJlbW92ZWQgdGhlbiBhZGRlZCB0aGVuIGNoYW5nZWQKLQkJCQkJCWlmICh0aGlzLmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsgLy8gbmVlZCBuYXR1cmUgY2hlY2sgLSAxODY5OAorCQkJCQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsgLy8gbmVlZCBuYXR1cmUgY2hlY2sgLSAxODY5OAogCQkJCQkJCXRoaXMuYWRkVG9QYXJlbnRJbmZvKChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwogCQkJCQkJfQkJCQkJCQogCQkJCQl9CQkJCQkKQEAgLTQ1MSwxMSArNTY0LDcyIEBACiAJCX0KIAl9CiAKKwlwcml2YXRlIHZvaWQgY2hlY2tTb3VyY2VBdHRhY2htZW50Q2hhbmdlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2UgcmVzKSB7CisJCUlQYXRoIHJvb3RQYXRoID0gKElQYXRoKXRoaXMuc291cmNlQXR0YWNobWVudHMuZ2V0KHJlcy5nZXRGdWxsUGF0aCgpKTsKKwkJaWYgKHJvb3RQYXRoICE9IG51bGwpIHsKKwkJCVJvb3RJbmZvIHJvb3RJbmZvID0gdGhpcy5yb290SW5mbyhyb290UGF0aCwgZGVsdGEuZ2V0S2luZCgpKTsKKwkJCWlmIChyb290SW5mbyAhPSBudWxsKSB7CisJCQkJSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QgPSByb290SW5mby5wcm9qZWN0OworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCS8vIGNsb3NlIHRoZSByb290IHNvIHRoYXQgc291cmNlIGF0dGFjaGVtZW50IGNhY2hlIGlzIGZsdXNoZWQKKwkJCQkJcm9vdCA9IHByb2plY3RPZlJvb3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdFBhdGgpOworCQkJCQlpZiAocm9vdCAhPSBudWxsKSB7CisJCQkJCQlyb290LmNsb3NlKCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCQlpZiAocm9vdCA9PSBudWxsKSByZXR1cm47CisJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKKwkJCQkJCWN1cnJlbnREZWx0YSgpLnNvdXJjZUF0dGFjaGVkKHJvb3QpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKKwkJCQkJCWN1cnJlbnREZWx0YSgpLnNvdXJjZURldGFjaGVkKHJvb3QpOworCQkJCQkJY3VycmVudERlbHRhKCkuc291cmNlQXR0YWNoZWQocm9vdCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgorCQkJCQkJY3VycmVudERlbHRhKCkuc291cmNlRGV0YWNoZWQocm9vdCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IAorCQl9CisJfQorCisJLyoqCisJICogQ2xvc2VzIHRoZSBnaXZlbiBlbGVtZW50LCB3aGljaCByZW1vdmVzIGl0IGZyb20gdGhlIGNhY2hlIG9mIG9wZW4gZWxlbWVudHMuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNsb3NlKE9wZW5hYmxlIGVsZW1lbnQpIHsKKworCQl0cnkgeworCQkJZWxlbWVudC5jbG9zZSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJfQorCS8qKgorCSAqIEdlbmVyaWMgcHJvY2Vzc2luZyBmb3IgZWxlbWVudHMgd2l0aCBjaGFuZ2VkIGNvbnRlbnRzOjx1bD4KKwkgKiA8bGk+VGhlIGVsZW1lbnQgaXMgY2xvc2VkIHN1Y2ggdGhhdCBhbnkgc3Vic2VxdWVudCBhY2Nlc3NlcyB3aWxsIHJlLW9wZW4KKwkgKiB0aGUgZWxlbWVudCByZWZsZWN0aW5nIGl0cyBuZXcgc3RydWN0dXJlLgorCSAqIDxsaT5BbiBlbnRyeSBpcyBtYWRlIGluIHRoZSBkZWx0YSByZXBvcnRpbmcgYSBjb250ZW50IGNoYW5nZSAoS19DSEFOR0Ugd2l0aCBGX0NPTlRFTlQgZmxhZyBzZXQpLgorCSAqIDwvdWw+CisJICogRGVsdGEgYXJndW1lbnQgY291bGQgYmUgbnVsbCBpZiBwcm9jZXNzaW5nIGFuIGV4dGVybmFsIEpBUiBjaGFuZ2UKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb250ZW50Q2hhbmdlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCisJCWNsb3NlKGVsZW1lbnQpOworCQlpbnQgZmxhZ3MgPSBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQ7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCl7CisJCQlmbGFncyB8PSBJSmF2YUVsZW1lbnREZWx0YS5GX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEOworCQl9CisJCWN1cnJlbnREZWx0YSgpLmNoYW5nZWQoZWxlbWVudCwgZmxhZ3MpOworCX0KKwkKIAkvKioKIAkgKiBDcmVhdGVzIHRoZSBvcGVuYWJsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHJlc291cmNlLgogCSAqIFJldHVybnMgbnVsbCBpZiBub25lIHdhcyBmb3VuZC4KIAkgKi8KLQlwcm90ZWN0ZWQgT3BlbmFibGUgY3JlYXRlRWxlbWVudChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBlbGVtZW50VHlwZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwlwcm90ZWN0ZWQgT3BlbmFibGUgY3JlYXRlRWxlbWVudChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBlbGVtZW50VHlwZSwgUm9vdEluZm8gcm9vdEluZm8pIHsKIAkJaWYgKHJlc291cmNlID09IG51bGwpIHJldHVybiBudWxsOwogCQkKIAkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CkBAIC00NzUsMTMgKzY0OSwxMiBAQAogCQkJCQkJJiYgKChJSmF2YVByb2plY3QpdGhpcy5jdXJyZW50RWxlbWVudCkuZ2V0UHJvamVjdCgpLmVxdWFscyhyZXNvdXJjZSkpIHsKIAkJCQkJCXJldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50OwogCQkJCQl9Ci0JCQkJCWlmICAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhyZXNvdXJjZSkpewotCQkJCQkJZWxlbWVudCA9IChPcGVuYWJsZSlwcm9qZWN0OworCQkJCQlpZiAgKHJvb3RJbmZvICE9IG51bGwgJiYgcm9vdEluZm8ucHJvamVjdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlc291cmNlKSl7CisJCQkJCQllbGVtZW50ID0gKE9wZW5hYmxlKXJvb3RJbmZvLnByb2plY3Q7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KXJlc291cmNlOwotCQkJCQlib29sZWFuIGlzT3BlbmVkID0gcHJvai5pc09wZW4oKTsKLQkJCQkJaWYgKGlzT3BlbmVkICYmIHRoaXMuaGFzSmF2YU5hdHVyZShwcm9qKSkgeworCQkJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qKSkgewogCQkJCQkJZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIGphdmEgcHJvamVjdCBtYXkgaGF2ZSBiZWVuIGJlZW4gY2xvc2VkIG9yIHJlbW92ZWQgKGxvb2sgZm9yCkBAIC00OTEsMjAgKzY2NCwyMCBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDoKLQkJCQllbGVtZW50ID0gcHJvamVjdCA9PSBudWxsID8gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKSA6IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSk7CisJCQkJZWxlbWVudCA9IHJvb3RJbmZvID09IG51bGwgPyBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpIDogcm9vdEluZm8ucHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6CiAJCQkJLy8gZmluZCB0aGUgZWxlbWVudCB0aGF0IGVuY2xvc2VzIHRoZSByZXNvdXJjZQogCQkJCXRoaXMucG9wVW50aWxQcmVmaXhPZihwYXRoKTsKIAkJCQkKIAkJCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnQgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jcmVhdGUocmVzb3VyY2UsIHByb2plY3QpOworCQkJCQllbGVtZW50ID0gcm9vdEluZm8gPT0gbnVsbCA/IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSkgOiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZShyZXNvdXJjZSwgcm9vdEluZm8ucHJvamVjdCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gZmluZCB0aGUgcm9vdAogCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5jdXJyZW50RWxlbWVudC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAJCQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jcmVhdGUocmVzb3VyY2UsIHByb2plY3QpOwotCQkJCQl9IGVsc2UgaWYgKCFKYXZhTW9kZWxNYW5hZ2VyLmNvbmZsaWN0c1dpdGhPdXRwdXRMb2NhdGlvbihwYXRoLCAoSmF2YVByb2plY3Qpcm9vdC5nZXRKYXZhUHJvamVjdCgpKSkgeworCQkJCQkJZWxlbWVudCA9ICByb290SW5mbyA9PSBudWxsID8gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKSA6IEphdmFNb2RlbE1hbmFnZXIuY3JlYXRlKHJlc291cmNlLCByb290SW5mby5wcm9qZWN0KTsKKwkJCQkJfSBlbHNlIGlmICgoKEphdmFQcm9qZWN0KXJvb3QuZ2V0SmF2YVByb2plY3QoKSkuY29udGFpbnMocmVzb3VyY2UpKSB7CiAJCQkJCQkvLyBjcmVhdGUgcGFja2FnZSBoYW5kbGUKIAkJCQkJCUlQYXRoIHBrZ1BhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdC5nZXRQYXRoKCkuc2VnbWVudENvdW50KCkpOwogCQkJCQkJU3RyaW5nIHBrZyA9IFV0aWwucGFja2FnZU5hbWUocGtnUGF0aCk7CkBAIC01MTksNyArNjkyLDcgQEAKIAkJCQl0aGlzLnBvcFVudGlsUHJlZml4T2YocGF0aCk7CiAJCQkJCiAJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQllbGVtZW50ID0gZWxlbWVudCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNyZWF0ZShyZXNvdXJjZSwgcHJvamVjdCk7CisJCQkJCWVsZW1lbnQgPSAgcm9vdEluZm8gPT0gbnVsbCA/IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSkgOiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZShyZXNvdXJjZSwgcm9vdEluZm8ucHJvamVjdCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gZmluZCB0aGUgcGFja2FnZQogCQkJCQlJUGFja2FnZUZyYWdtZW50IHBrZ0ZyYWdtZW50ID0gbnVsbDsKQEAgLTU0NSw3ICs3MTgsNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWlmIChwa2dGcmFnbWVudCA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY3JlYXRlKHJlc291cmNlLCBwcm9qZWN0KTsKKwkJCQkJCWVsZW1lbnQgPSAgcm9vdEluZm8gPT0gbnVsbCA/IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSkgOiBKYXZhTW9kZWxNYW5hZ2VyLmNyZWF0ZShyZXNvdXJjZSwgcm9vdEluZm8ucHJvamVjdCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKIAkJCQkJCQkvLyBjcmVhdGUgY29tcGlsYXRpb24gdW5pdCBoYW5kbGUgCkBAIC01NzUsNyArNzQ4LDI3IEBACiAJcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewogCQkKIAkJdHJ5IHsKKwkJCS8vIGRpc2NhcmQgaW5kZXhpbmcgam9icyB0aGF0IGJlbG9uZyB0byB0aGlzIHByb2plY3Qgc28gdGhhdCB0aGUgcHJvamVjdCBjYW4gYmUgCisJCQkvLyBkZWxldGVkIHdpdGhvdXQgaW50ZXJmZXJlbmNlcyBmcm9tIHRoZSBpbmRleCBtYW5hZ2VyCisJCQl0aGlzLmluZGV4TWFuYWdlci5kaXNjYXJkSm9icyhwcm9qZWN0LmdldE5hbWUoKSk7CisKIAkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQorCQkJLy8gcmVtZW1iZXIgcm9vdHMgb2YgdGhpcyBwcm9qZWN0CisJCQlpZiAodGhpcy5yZW1vdmVkUm9vdHMgPT0gbnVsbCkgeworCQkJCXRoaXMucmVtb3ZlZFJvb3RzID0gbmV3IEhhc2hNYXAoKTsKKwkJCX0KKwkJCWlmIChqYXZhUHJvamVjdC5pc09wZW4oKSkgeworCQkJCXRoaXMucmVtb3ZlZFJvb3RzLnB1dChqYXZhUHJvamVjdCwgamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7CisJCQl9IGVsc2UgeworCQkJCS8vIGNvbXB1dGUgcm9vdHMgd2l0aG91dCBvcGVuaW5nIHByb2plY3QKKwkJCQl0aGlzLnJlbW92ZWRSb290cy5wdXQoCisJCQkJCWphdmFQcm9qZWN0LCAKKwkJCQkJamF2YVByb2plY3QuY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAorCQkJCQkJamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSksIAorCQkJCQkJZmFsc2UpKTsKKwkJCX0KKwkJCQogCQkJamF2YVByb2plY3QuY2xvc2UoKTsKIAogCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQgIApAQCAtNTkwLDYgKzc4Myw3IEBACiAJCXRoaXMuYWRkRGVwZW5kZW50UHJvamVjdHMocHJvamVjdC5nZXRGdWxsUGF0aCgpLCB0aGlzLnByb2plY3RzVG9VcGRhdGUpOwogCX0KIAorCiAJLyoqCiAJICogUHJvY2Vzc2luZyBmb3IgYW4gZWxlbWVudCB0aGF0IGhhcyBiZWVuIGFkZGVkOjx1bD4KIAkgKiA8bGk+SWYgdGhlIGVsZW1lbnQgaXMgYSBwcm9qZWN0LCBkbyBub3RoaW5nLCBhbmQgZG8gbm90IHByb2Nlc3MKQEAgLTYwMCwyMiArNzk0LDIzIEBACiAJICogPC91bD4KIAkgKiBEZWx0YSBhcmd1bWVudCBjb3VsZCBiZSBudWxsIGlmIHByb2Nlc3NpbmcgYW4gZXh0ZXJuYWwgSkFSIGNoYW5nZQogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRBZGRlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRBZGRlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgUm9vdEluZm8gcm9vdEluZm8pIHsKIAkJaW50IGVsZW1lbnRUeXBlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpOwogCQkKIAkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKIAkJCS8vIHByb2plY3QgYWRkIGlzIGhhbmRsZWQgYnkgSmF2YVByb2plY3QuY29uZmlndXJlKCkgYmVjYXVzZQogCQkJLy8gd2hlbiBhIHByb2plY3QgaXMgY3JlYXRlZCwgaXQgZG9lcyBub3QgeWV0IGhhdmUgYSBqYXZhIG5hdHVyZQotCQkJaWYgKGRlbHRhICE9IG51bGwgJiYgaGFzSmF2YU5hdHVyZSgoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKKwkJCWlmIChkZWx0YSAhPSBudWxsICYmIEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUoKElQcm9qZWN0KWRlbHRhLmdldFJlc291cmNlKCkpKSB7CiAJCQkJYWRkVG9QYXJlbnRJbmZvKGVsZW1lbnQpOwogCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDApIHsKIAkJCQkJT3BlbmFibGUgbW92ZWRGcm9tRWxlbWVudCA9IChPcGVuYWJsZSllbGVtZW50LmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KGRlbHRhLmdldE1vdmVkRnJvbVBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQkJZkN1cnJlbnREZWx0YS5tb3ZlZFRvKGVsZW1lbnQsIG1vdmVkRnJvbUVsZW1lbnQpOworCQkJCQljdXJyZW50RGVsdGEoKS5tb3ZlZFRvKGVsZW1lbnQsIG1vdmVkRnJvbUVsZW1lbnQpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWZDdXJyZW50RGVsdGEuYWRkZWQoZWxlbWVudCk7CisJCQkJCWN1cnJlbnREZWx0YSgpLmFkZGVkKGVsZW1lbnQpOwogCQkJCX0KIAkJCQl0aGlzLnByb2plY3RzVG9VcGRhdGUuYWRkKGVsZW1lbnQpOwogCQkJCXRoaXMudXBkYXRlUm9vdHMoZWxlbWVudC5nZXRQYXRoKCksIGRlbHRhKTsKKwkJCQl0aGlzLnByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2guYWRkKChKYXZhUHJvamVjdCkgZWxlbWVudCk7CiAJCQl9CiAJCX0gZWxzZSB7CQkJCiAJCQlhZGRUb1BhcmVudEluZm8oZWxlbWVudCk7CkBAIC02NDIsMzEgKzgzNywzMCBAQAogCQkJCX0KIAkJCQkKIAkJCQkvLyBmaW5kIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIG1vdmVkIGZyb20gZWxlbWVudAotCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290ID0gKElKYXZhUHJvamVjdCl0aGlzLnJvb3RzLmdldChtb3ZlZEZyb21QYXRoKTsKLQkJCQlib29sZWFuIGlzUGtnRnJhZ21lbnRSb290ID0gCi0JCQkJCXByb2plY3RPZlJvb3QgIT0gbnVsbCAKLQkJCQkJJiYgKHByb2plY3RPZlJvb3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihtb3ZlZEZyb21QYXRoKSk7CisJCQkJUm9vdEluZm8gbW92ZWRGcm9tSW5mbyA9IHRoaXMuZW5jbG9zaW5nUm9vdEluZm8obW92ZWRGcm9tUGF0aCwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCk7CiAJCQkJaW50IG1vdmVkRnJvbVR5cGUgPSAKIAkJCQkJdGhpcy5lbGVtZW50VHlwZSgKIAkJCQkJCW1vdmVkRnJvbVJlcywgCi0JCQkJCQlkZWx0YS5nZXRLaW5kKCksCi0JCQkJCQlkZWx0YS5nZXRGbGFncygpLAorCQkJCQkJSVJlc291cmNlRGVsdGEuUkVNT1ZFRCwKIAkJCQkJCWVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudFR5cGUoKSwgCi0JCQkJCQlpc1BrZ0ZyYWdtZW50Um9vdCk7CisJCQkJCQltb3ZlZEZyb21JbmZvKTsKIAkJCQkKKwkJCQkvLyByZXNldCBjdXJyZW50IGVsZW1lbnQgYXMgaXQgbWlnaHQgYmUgaW5zaWRlIGEgbmVzdGVkIHJvb3QgKHBvcFVudGlsUHJlZml4T2YoKSBtYXkgdXNlIHRoZSBvdXRlciByb290KQorCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSBudWxsOworCQkJCiAJCQkJLy8gY3JlYXRlIHRoZSBtb3ZlZCBmcm9tIGVsZW1lbnQKIAkJCQlPcGVuYWJsZSBtb3ZlZEZyb21FbGVtZW50ID0gCiAJCQkJCWVsZW1lbnRUeXBlICE9IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgJiYgbW92ZWRGcm9tVHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUID8gCiAJCQkJCQludWxsIDogLy8gb3V0c2lkZSBjbGFzc3BhdGgKLQkJCQkJCXRoaXMuY3JlYXRlRWxlbWVudChtb3ZlZEZyb21SZXMsIG1vdmVkRnJvbVR5cGUsIG51bGwpOyAvLyBwYXNzIG51bGwgZm9yIHRoZSBwcm9qZWN0IGluIGNhc2UgdGhlIGVsZW1lbnQgaXMgbW92aW5nIHRvIGFub3RoZXIgcHJvamVjdAorCQkJCQkJdGhpcy5jcmVhdGVFbGVtZW50KG1vdmVkRnJvbVJlcywgbW92ZWRGcm9tVHlwZSwgbW92ZWRGcm9tSW5mbyk7CiAJCQkJaWYgKG1vdmVkRnJvbUVsZW1lbnQgPT0gbnVsbCkgewogCQkJCQkvLyBtb3ZlZCBmcm9tIG91dHNpZGUgY2xhc3NwYXRoCi0JCQkJCWZDdXJyZW50RGVsdGEuYWRkZWQoZWxlbWVudCk7CisJCQkJCWN1cnJlbnREZWx0YSgpLmFkZGVkKGVsZW1lbnQpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWZDdXJyZW50RGVsdGEubW92ZWRUbyhlbGVtZW50LCBtb3ZlZEZyb21FbGVtZW50KTsKKwkJCQkJY3VycmVudERlbHRhKCkubW92ZWRUbyhlbGVtZW50LCBtb3ZlZEZyb21FbGVtZW50KTsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWZDdXJyZW50RGVsdGEuYWRkZWQoZWxlbWVudCk7CisJCQkJY3VycmVudERlbHRhKCkuYWRkZWQoZWxlbWVudCk7CiAJCQl9CiAJCQkKIAkJCXN3aXRjaCAoZWxlbWVudFR5cGUpIHsKQEAgLTY5NCwxMyArODg4LDE2IEBACiAJCQkJCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKIAkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjaGlsZC5nZXRSZXNvdXJjZSgpOwogCQkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCQkJU3RyaW5nIHN1YnBrZ05hbWUgPSAKLQkJCQkJCQkJCW5hbWUubGVuZ3RoKCkgPT0gMCA/IAotCQkJCQkJCQkJCXJlc291cmNlLmdldE5hbWUoKSA6IAotCQkJCQkJCQkJCW5hbWUgKyAiLiIgKyByZXNvdXJjZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJT3BlbmFibGUgc3VicGtnID0gKE9wZW5hYmxlKXJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHN1YnBrZ05hbWUpOwotCQkJCQkJCQl0aGlzLnVwZGF0ZUluZGV4KHN1YnBrZywgY2hpbGQpOwotCQkJCQkJCQl0aGlzLmVsZW1lbnRBZGRlZChzdWJwa2csIGNoaWxkKTsKKwkJCQkJCQkJU3RyaW5nIGZvbGRlck5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCQkJCQkJCWlmIChVdGlsLmlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShmb2xkZXJOYW1lKSkgeworCQkJCQkJCQkJU3RyaW5nIHN1YnBrZ05hbWUgPSAKKwkJCQkJCQkJCQluYW1lLmxlbmd0aCgpID09IDAgPyAKKwkJCQkJCQkJCQkJZm9sZGVyTmFtZSA6IAorCQkJCQkJCQkJCQluYW1lICsgIi4iICsgZm9sZGVyTmFtZTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJT3BlbmFibGUgc3VicGtnID0gKE9wZW5hYmxlKXJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHN1YnBrZ05hbWUpOworCQkJCQkJCQkJdGhpcy51cGRhdGVJbmRleChzdWJwa2csIGNoaWxkKTsKKwkJCQkJCQkJCXRoaXMuZWxlbWVudEFkZGVkKHN1YnBrZywgY2hpbGQsIHJvb3RJbmZvKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtNzA5LDEwICs5MDYsNiBAQAogCQl9CiAJfQogCi0KLQotCi0KIAkvKioKIAkgKiBHZW5lcmljIHByb2Nlc3NpbmcgZm9yIGEgcmVtb3ZlZCBlbGVtZW50Ojx1bD4KIAkgKiA8bGk+Q2xvc2UgdGhlIGVsZW1lbnQsIHJlbW92aW5nIGl0cyBzdHJ1Y3R1cmUgZnJvbSB0aGUgY2FjaGUKQEAgLTcyMSw3ICs5MTQsNyBAQAogCSAqIDwvdWw+CiAJICogRGVsdGEgYXJndW1lbnQgY291bGQgYmUgbnVsbCBpZiBwcm9jZXNzaW5nIGFuIGV4dGVybmFsIEpBUiBjaGFuZ2UKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50UmVtb3ZlZChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRSZW1vdmVkKE9wZW5hYmxlIGVsZW1lbnQsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBSb290SW5mbyByb290SW5mbykgewogCQkKIAkJaWYgKGVsZW1lbnQuaXNPcGVuKCkpIHsKIAkJCWNsb3NlKGVsZW1lbnQpOwpAQCAtNzQ3LDMxICs5NDAsMzAgQEAKIAkJCX0KIAogCQkJLy8gZmluZCB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBtb3ZlZCBmcm9tIGVsZW1lbnQKLQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290ID0gKElKYXZhUHJvamVjdCl0aGlzLnJvb3RzLmdldChtb3ZlZFRvUGF0aCk7Ci0JCQlib29sZWFuIGlzUGtnRnJhZ21lbnRSb290ID0gCi0JCQkJcHJvamVjdE9mUm9vdCAhPSBudWxsIAotCQkJCSYmIChwcm9qZWN0T2ZSb290LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YobW92ZWRUb1BhdGgpKTsKKwkJCVJvb3RJbmZvIG1vdmVkVG9JbmZvID0gdGhpcy5lbmNsb3NpbmdSb290SW5mbyhtb3ZlZFRvUGF0aCwgSVJlc291cmNlRGVsdGEuQURERUQpOwogCQkJaW50IG1vdmVkVG9UeXBlID0gCiAJCQkJdGhpcy5lbGVtZW50VHlwZSgKIAkJCQkJbW92ZWRUb1JlcywgCi0JCQkJCWRlbHRhLmdldEtpbmQoKSwKLQkJCQkJZGVsdGEuZ2V0RmxhZ3MoKSwKKwkJCQkJSVJlc291cmNlRGVsdGEuQURERUQsCiAJCQkJCWVsZW1lbnQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudFR5cGUoKSwgCi0JCQkJCWlzUGtnRnJhZ21lbnRSb290KTsKKwkJCQkJbW92ZWRUb0luZm8pOworCisJCQkvLyByZXNldCBjdXJyZW50IGVsZW1lbnQgYXMgaXQgbWlnaHQgYmUgaW5zaWRlIGEgbmVzdGVkIHJvb3QgKHBvcFVudGlsUHJlZml4T2YoKSBtYXkgdXNlIHRoZSBvdXRlciByb290KQorCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7CiAJCQkKIAkJCS8vIGNyZWF0ZSB0aGUgbW92ZWQgVG8gZWxlbWVudAogCQkJT3BlbmFibGUgbW92ZWRUb0VsZW1lbnQgPSAKIAkJCQllbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUICYmIG1vdmVkVG9UeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgPyAKIAkJCQkJbnVsbCA6IC8vIG91dHNpZGUgY2xhc3NwYXRoCi0JCQkJCXRoaXMuY3JlYXRlRWxlbWVudChtb3ZlZFRvUmVzLCBtb3ZlZFRvVHlwZSwgbnVsbCk7IC8vIHBhc3MgbnVsbCBmb3IgdGhlIHByb2plY3QgaW4gY2FzZSB0aGUgZWxlbWVudCBpcyBtb3ZpbmcgdG8gYW5vdGhlciBwcm9qZWN0CisJCQkJCXRoaXMuY3JlYXRlRWxlbWVudChtb3ZlZFRvUmVzLCBtb3ZlZFRvVHlwZSwgbW92ZWRUb0luZm8pOwogCQkJaWYgKG1vdmVkVG9FbGVtZW50ID09IG51bGwpIHsKIAkJCQkvLyBtb3ZlZCBvdXRzaWRlIGNsYXNzcGF0aAotCQkJCWZDdXJyZW50RGVsdGEucmVtb3ZlZChlbGVtZW50KTsKKwkJCQljdXJyZW50RGVsdGEoKS5yZW1vdmVkKGVsZW1lbnQpOwogCQkJfSBlbHNlIHsKLQkJCQlmQ3VycmVudERlbHRhLm1vdmVkRnJvbShlbGVtZW50LCBtb3ZlZFRvRWxlbWVudCk7CisJCQkJY3VycmVudERlbHRhKCkubW92ZWRGcm9tKGVsZW1lbnQsIG1vdmVkVG9FbGVtZW50KTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWZDdXJyZW50RGVsdGEucmVtb3ZlZChlbGVtZW50KTsKKwkJCWN1cnJlbnREZWx0YSgpLnJlbW92ZWQoZWxlbWVudCk7CiAJCX0KIAogCQlzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7CkBAIC03NzksOSArOTcxLDEwIEBACiAJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVzZXQoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlUGVyUHJvamVjdEluZm8oCisJCQkJdGhpcy5tYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKAogCQkJCQkoSmF2YVByb2plY3QpIGVsZW1lbnQpOwogCQkJCXRoaXMudXBkYXRlUm9vdHMoZWxlbWVudC5nZXRQYXRoKCksIGRlbHRhKTsKKwkJCQl0aGlzLnByb2plY3RzRm9yRGVwZW5kZW50TmFtZWxvb2t1cFJlZnJlc2guYWRkKChKYXZhUHJvamVjdCkgZWxlbWVudCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgogCQkJCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKQEAgLTgwNSwxMyArOTk4LDE2IEBACiAJCQkJCQlJUmVzb3VyY2VEZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKIAkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCQlTdHJpbmcgc3VicGtnTmFtZSA9IAotCQkJCQkJCQluYW1lLmxlbmd0aCgpID09IDAgPyAKLQkJCQkJCQkJCXJlc291cmNlLmdldE5hbWUoKSA6IAotCQkJCQkJCQkJbmFtZSArICIuIiArIHJlc291cmNlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCU9wZW5hYmxlIHN1YnBrZyA9IChPcGVuYWJsZSlyb290LmdldFBhY2thZ2VGcmFnbWVudChzdWJwa2dOYW1lKTsKLQkJCQkJCQl0aGlzLnVwZGF0ZUluZGV4KHN1YnBrZywgY2hpbGQpOwotCQkJCQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoc3VicGtnLCBjaGlsZCk7CisJCQkJCQkJU3RyaW5nIGZvbGRlck5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCQkJCQkJaWYgKFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKGZvbGRlck5hbWUpKSB7CisJCQkJCQkJCVN0cmluZyBzdWJwa2dOYW1lID0gCisJCQkJCQkJCQluYW1lLmxlbmd0aCgpID09IDAgPyAKKwkJCQkJCQkJCQlmb2xkZXJOYW1lIDogCisJCQkJCQkJCQkJbmFtZSArICIuIiArIGZvbGRlck5hbWU7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJT3BlbmFibGUgc3VicGtnID0gKE9wZW5hYmxlKXJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHN1YnBrZ05hbWUpOworCQkJCQkJCQl0aGlzLnVwZGF0ZUluZGV4KHN1YnBrZywgY2hpbGQpOworCQkJCQkJCQl0aGlzLmVsZW1lbnRSZW1vdmVkKHN1YnBrZywgY2hpbGQsIHJvb3RJbmZvKTsKKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CkBAIC04MTksNDAgKzEwMTUsNTQgQEAKIAkJfQogCX0KIAotCS8qKgotCSAqIEZpbHRlcnMgdGhlIGdlbmVyYXRlZCA8Y29kZT5KYXZhRWxlbWVudERlbHRhPC9jb2RlPnMgdG8gcmVtb3ZlIHRob3NlCi0JICogd2hpY2ggc2hvdWxkIG5vdCBiZSBmaXJlZCAoYmVjYXVzZSB0aGV5IGRvbid0IHJlcHJlc2VudCBhIHJlYWwgY2hhbmdlCi0JICogaW4gdGhlIEphdmEgTW9kZWwpLgorCS8qCisJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgamF2YSBlbGVtZW50IHRoZSBnaXZlbiBkZWx0YSBtYXRjaGVzIHRvLgorCSAqIFJldHVybnMgTk9OX0pBVkFfUkVTT1VSQ0UgaWYgdW5rbm93biAoZS5nLiBhIG5vbi1qYXZhIHJlc291cmNlIG9yIGV4Y2x1ZGVkIC5qYXZhIGZpbGUpCiAJICovCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudERlbHRhW10gZmlsdGVyUmVhbERlbHRhcyhJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcykgewotCi0JCWludCBsZW5ndGggPSBkZWx0YXMubGVuZ3RoOwotCQlJSmF2YUVsZW1lbnREZWx0YVtdIHJlYWxEZWx0YXMgPSBudWxsOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gKEphdmFFbGVtZW50RGVsdGEpZGVsdGFzW2ldOwotCQkJaWYgKGRlbHRhID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMAotCQkJCXx8IGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRAotCQkJCXx8IGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVECi0JCQkJfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMAotCQkJCXx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9PUEVORUQpICE9IDAKLQkJCQl8fCBkZWx0YS5yZXNvdXJjZURlbHRhc0NvdW50ZXIgPiAwKSB7Ci0KLQkJCQlpZiAocmVhbERlbHRhcyA9PSBudWxsKSB7Ci0JCQkJCXJlYWxEZWx0YXMgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbbGVuZ3RoXTsKKwlwcml2YXRlIGludCBlbGVtZW50VHlwZShJUmVzb3VyY2UgcmVzLCBpbnQga2luZCwgaW50IHBhcmVudFR5cGUsIFJvb3RJbmZvIHJvb3RJbmZvKSB7CisJCXN3aXRjaCAocGFyZW50VHlwZSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKKwkJCQkvLyBjYXNlIG9mIGEgbW92ZWRUbyBvciBtb3ZlZEZyb20gcHJvamVjdCAob3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgaW4gcHJvY2Vzc1Jlc291cmNlRGVsdGEoLi4uKQorCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOworCQkJY2FzZSBOT05fSkFWQV9SRVNPVVJDRToKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDoKKwkJCQlpZiAocm9vdEluZm8gPT0gbnVsbCkgeworCQkJCQlyb290SW5mbyA9IHRoaXMuZW5jbG9zaW5nUm9vdEluZm8ocmVzLmdldEZ1bGxQYXRoKCksIGtpbmQpOwogCQkJCX0KLQkJCQlyZWFsRGVsdGFzW2luZGV4KytdID0gZGVsdGE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID4gMCkgewotCQkJSUphdmFFbGVtZW50RGVsdGFbXSByZXN1bHQgPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbaW5kZXhdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZWFsRGVsdGFzLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTk9fREVMVEE7CisJCQkJaWYgKHJvb3RJbmZvICE9IG51bGwgJiYgcm9vdEluZm8uaXNSb290T2ZQcm9qZWN0KHJlcy5nZXRGdWxsUGF0aCgpKSkgeworCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gTk9OX0pBVkFfUkVTT1VSQ0U7IC8vIG5vdCB5ZXQgaW4gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb3Igcm9vdCBvZiBhbm90aGVyIHByb2plY3QKKwkJCQl9CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJCWlmIChyb290SW5mbyA9PSBudWxsKSB7CisJCQkJCXJvb3RJbmZvID0gdGhpcy5lbmNsb3NpbmdSb290SW5mbyhyZXMuZ2V0RnVsbFBhdGgoKSwga2luZCk7CisJCQkJfQorCQkJCWlmIChyb290SW5mbyA9PSBudWxsIHx8IFV0aWwuaXNFeGNsdWRlZChyZXMsIHJvb3RJbmZvLmV4Y2x1c2lvblBhdHRlcm5zKSkgeworCQkJCQlyZXR1cm4gTk9OX0pBVkFfUkVTT1VSQ0U7CisJCQkJfQorCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJCWlmIChVdGlsLmlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShyZXMuZ2V0TmFtZSgpKSkgeworCQkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIE5PTl9KQVZBX1JFU09VUkNFOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldE5hbWUoKTsKKwkJCQkJaWYgKFV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoZmlsZU5hbWUpKSB7CisJCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ7CisJCQkJCX0gZWxzZSBpZiAoVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSkpIHsKKwkJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRTsKKwkJCQkJfSBlbHNlIGlmICh0aGlzLnJvb3RJbmZvKHJlcy5nZXRGdWxsUGF0aCgpLCBraW5kKSAhPSBudWxsKSB7CisJCQkJCQkvLyBjYXNlIG9mIHByb2o9c3JjPWJpbiBhbmQgcmVzb3VyY2UgaXMgYSBqYXIgZmlsZSBvbiB0aGUgY2xhc3NwYXRoCisJCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBOT05fSkFWQV9SRVNPVVJDRTsKKwkJCQkJfQorCQkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PTl9KQVZBX1JFU09VUkNFOwogCQl9CiAJfQogCkBAIC04NjMsMjcgKzEwNzMsMTQ1IEBACiAJcHVibGljIHN0YXRpYyBsb25nIGdldFRpbWVTdGFtcChGaWxlIGZpbGUpIHsKIAkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCkgKyBmaWxlLmxlbmd0aCgpOwogCX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBjb250YWluZWQgaW4gYW4gb3BlbiBwcm9qZWN0Ci0gKiB3aXRoIGEgamF2YSBuYXR1cmUsIG90aGVyd2lzZSBmYWxzZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaGFzSmF2YU5hdHVyZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLyBlbnN1cmUgdGhlIHByb2plY3QgaGFzIGEgamF2YSBuYXR1cmUgKGlmIG9wZW4pCi0JSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQlpZiAocHJvamVjdC5pc09wZW4oKSkgeworCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJvb3RzKCkgeworCQkvLyByZW1lbWJlciByb290cyBpbmZvcyBhcyBvbGQgcm9vdHMgaW5mb3MKKwkJdGhpcy5vbGRSb290cyA9IHRoaXMucm9vdHMgPT0gbnVsbCA/IG5ldyBIYXNoTWFwKCkgOiB0aGlzLnJvb3RzOworCQl0aGlzLm9sZE90aGVyUm9vdHMgPSB0aGlzLm90aGVyUm9vdHMgPT0gbnVsbCA/IG5ldyBIYXNoTWFwKCkgOiB0aGlzLm90aGVyUm9vdHM7CisJCQorCQkvLyByZWNvbXB1dGUgcm9vdCBpbmZvcyBvbmx5IGlmIG5lY2Vzc2FyeQorCQlpZiAoIXJvb3RzQXJlU3RhbGUpIHJldHVybjsKKworCQl0aGlzLnJvb3RzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5vdGhlclJvb3RzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5zb3VyY2VBdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwKCk7CisJCQorCQlJSmF2YU1vZGVsIG1vZGVsID0gdGhpcy5tYW5hZ2VyLmdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0czsKIAkJdHJ5IHsKLQkJCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKKwkJCXByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lCisJCQlyZXR1cm47CiAJCX0KKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOworCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoOworCQkJdHJ5IHsKKwkJCQljbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBjb250aW51ZSB3aXRoIG5leHQgcHJvamVjdAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yIChpbnQgaj0gMCwgY2xhc3NwYXRoTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGNsYXNzcGF0aExlbmd0aDsgaisrKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2pdOworCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIGNvbnRpbnVlOworCQkJCQorCQkJCS8vIHJvb3QgcGF0aAorCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJaWYgKHRoaXMucm9vdHMuZ2V0KHBhdGgpID09IG51bGwpIHsKKwkJCQkJdGhpcy5yb290cy5wdXQocGF0aCwgbmV3IFJvb3RJbmZvKHByb2plY3QsIHBhdGgsICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCUFycmF5TGlzdCByb290TGlzdCA9IChBcnJheUxpc3QpdGhpcy5vdGhlclJvb3RzLmdldChwYXRoKTsKKwkJCQkJaWYgKHJvb3RMaXN0ID09IG51bGwpIHsKKwkJCQkJCXJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJCQkJdGhpcy5vdGhlclJvb3RzLnB1dChwYXRoLCByb290TGlzdCk7CisJCQkJCX0KKwkJCQkJcm9vdExpc3QuYWRkKG5ldyBSb290SW5mbyhwcm9qZWN0LCBwYXRoLCAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCkpKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gc291cmNlIGF0dGFjaG1lbnQgcGF0aAorCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIGNvbnRpbnVlOworCQkJCVF1YWxpZmllZE5hbWUgcU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJzb3VyY2VhdHRhY2htZW50OiAiICsgcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkOworCQkJCVN0cmluZyBwcm9wZXJ0eVN0cmluZyA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJcHJvcGVydHlTdHJpbmcgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShxTmFtZSk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKKwkJCQlpZiAocHJvcGVydHlTdHJpbmcgIT0gbnVsbCkgeworCQkJCQlpbnQgaW5kZXg9IHByb3BlcnR5U3RyaW5nLmxhc3RJbmRleE9mKEphclBhY2thZ2VGcmFnbWVudFJvb3QuQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIpOworCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCA9IChpbmRleCA8IDApID8gIG5ldyBQYXRoKHByb3BlcnR5U3RyaW5nKSA6IG5ldyBQYXRoKHByb3BlcnR5U3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwkJCQl9CisJCQkJaWYgKHNvdXJjZUF0dGFjaG1lbnRQYXRoICE9IG51bGwpIHsKKwkJCQkJdGhpcy5zb3VyY2VBdHRhY2htZW50cy5wdXQoc291cmNlQXR0YWNobWVudFBhdGgsIHBhdGgpOworCQkJCX0KKwkJCX0KKwkJfQorCQl0aGlzLnJvb3RzQXJlU3RhbGUgPSBmYWxzZTsKIAl9Ci0JcmV0dXJuIGZhbHNlOwotfQogCisJLyoKKwkgKiBSZXR1cm5zIHdoZXRoZXIgYSBnaXZlbiBkZWx0YSBjb250YWlucyBzb21lIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIHRoZSBKYXZhTW9kZWwsCisJICogaW4gcGFydGljdWxhciBpdCB3aWxsIG5vdCBjb25zaWRlciBTWU5DIG9yIE1BUktFUiBvbmx5IGRlbHRhcy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGVkQnkoSVJlc291cmNlRGVsdGEgcm9vdERlbHRhKXsKKwkJLy9pZiAocm9vdERlbHRhID09IG51bGwpIFN5c3RlbS5vdXQucHJpbnRsbigiTlVMTCBERUxUQSIpOworCQkvL2xvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJaWYgKHJvb3REZWx0YSAhPSBudWxsKSB7CisJCQkvLyB1c2UgbG9jYWwgZXhjZXB0aW9uIHRvIHF1aWNrbHkgZXNjYXBlIGZyb20gZGVsdGEgdHJhdmVyc2FsCisJCQljbGFzcyBGb3VuZFJlbGV2YW50RGVsdGFFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9CisJCQl0cnkgeworCQkJCXJvb3REZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKKwkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKXsKKwkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCQkJCQl0aHJvdyBuZXcgRm91bmRSZWxldmFudERlbHRhRXhjZXB0aW9uKCk7CisJCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKKwkJCQkJCQkJLy8gaWYgYW55IGZsYWcgaXMgc2V0IGJ1dCBTWU5DIG9yIE1BUktFUiwgdGhpcyBkZWx0YSBzaG91bGQgYmUgY29uc2lkZXJlZAorCQkJCQkJCQlpZiAoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAwIC8vIG9ubHkgY2hlY2sgbGVhZiBkZWx0YSBub2RlcworCQkJCQkJCQkJCSYmIChkZWx0YS5nZXRGbGFncygpICYgfihJUmVzb3VyY2VEZWx0YS5TWU5DIHwgSVJlc291cmNlRGVsdGEuTUFSS0VSUykpICE9IDApIHsKKwkJCQkJCQkJCXRocm93IG5ldyBGb3VuZFJlbGV2YW50RGVsdGFFeGNlcHRpb24oKTsKKwkJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0gY2F0Y2goRm91bmRSZWxldmFudERlbHRhRXhjZXB0aW9uIGUpIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVMRVZBTlQgREVMVEEgZGV0ZWN0ZWQgaW46ICIrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeyAvLyBpZ25vcmUgZGVsdGEgaWYgbm90IGFibGUgdG8gdHJhdmVyc2UKKwkJCX0KKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiSUdOT1JFIFNZTkMgREVMVEEgdG9vazogIisgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgaW4gb25lIG9mIHRoZSBnaXZlbiBvdXRwdXQgZm9sZGVycyBhbmQgaWYKKwkgKiBpdCBpcyBmaWx0ZXJlZCBvdXQgZnJvbSB0aGlzIG91dHB1dCBmb2xkZXIuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzUmVzRmlsdGVyZWRGcm9tT3V0cHV0KE91dHB1dHNJbmZvIGluZm8sIElSZXNvdXJjZSByZXMsIGludCBlbGVtZW50VHlwZSkgeworCQlpZiAoaW5mbyAhPSBudWxsKSB7CisJCQlJUGF0aCByZXNQYXRoID0gcmVzLmdldEZ1bGxQYXRoKCk7CisJCQlmb3IgKGludCBpID0gMDsgIGkgPCBpbmZvLm91dHB1dENvdW50OyBpKyspIHsKKwkJCQlpZiAoaW5mby5wYXRoc1tpXS5pc1ByZWZpeE9mKHJlc1BhdGgpKSB7CisJCQkJCWlmIChpbmZvLnRyYXZlcnNlTW9kZXNbaV0gIT0gSUdOT1JFKSB7CisJCQkJCQkvLyBjYXNlIG9mIGJpbj1zcmMKKwkJCQkJCWlmIChpbmZvLnRyYXZlcnNlTW9kZXNbaV0gPT0gU09VUkNFICYmIGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5DTEFTU19GSUxFKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGNhc2Ugb2YgLmNsYXNzIGZpbGUgdW5kZXIgcHJvamVjdCBhbmQgbm8gc291cmNlIGZvbGRlcgorCQkJCQkJCS8vIHByb2o9YmluCisJCQkJCQkJaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgCisJCQkJCQkJCQkmJiByZXMgaW5zdGFuY2VvZiBJRmlsZSAKKwkJCQkJCQkJCSYmIFV0aWwuaXNWYWxpZENsYXNzRmlsZU5hbWUocmVzLmdldE5hbWUoKSkpIHsKKwkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KIAotcHJpdmF0ZSBKYXZhTW9kZWxFeGNlcHRpb24gbmV3SW52YWxpZEVsZW1lbnRUeXBlKCkgewotCXJldHVybiBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMpKTsKLX0KIAkvKioKIAkgKiBHZW5lcmljIHByb2Nlc3NpbmcgZm9yIGVsZW1lbnRzIHdpdGggY2hhbmdlZCBjb250ZW50czo8dWw+CiAJICogPGxpPlRoZSBlbGVtZW50IGlzIGNsb3NlZCBzdWNoIHRoYXQgYW55IHN1YnNlcXVlbnQgYWNjZXNzZXMgd2lsbCByZS1vcGVuCkBAIC04OTYsMTUgKzEyMjQsMTkgQEAKIAogCQkvLyByZXNldCBub24tamF2YSByZXNvdXJjZXMgaWYgZWxlbWVudCB3YXMgb3BlbgogCQlpZiAoZWxlbWVudC5pc09wZW4oKSkgewotCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSBlbGVtZW50LmdldEVsZW1lbnRJbmZvKCk7CisJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IChKYXZhRWxlbWVudEluZm8pZWxlbWVudC5nZXRFbGVtZW50SW5mbygpOwogCQkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKKwkJCQkJKChKYXZhTW9kZWxJbmZvKSBpbmZvKS5ub25KYXZhUmVzb3VyY2VzID0gbnVsbDsKKwkJCQkJY3VycmVudERlbHRhKCkuYWRkUmVzb3VyY2VEZWx0YShkZWx0YSk7CisJCQkJCXJldHVybjsKIAkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgogCQkJCQkoKEphdmFQcm9qZWN0RWxlbWVudEluZm8pIGluZm8pLnNldE5vbkphdmFSZXNvdXJjZXMobnVsbCk7CiAJCiAJCQkJCS8vIGlmIGEgcGFja2FnZSBmcmFnbWVudCByb290IGlzIHRoZSBwcm9qZWN0LCBjbGVhciBpdCB0b28KKwkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgZWxlbWVudDsKIAkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCBwcm9qZWN0Um9vdCA9Ci0JCQkJCQkoUGFja2FnZUZyYWdtZW50Um9vdCkgKChKYXZhUHJvamVjdCkgZWxlbWVudCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgKLQkJCQkJCQluZXcgUGF0aChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSk7CisJCQkJCQkoUGFja2FnZUZyYWdtZW50Um9vdCkgcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0UHJvamVjdCgpKTsKIAkJCQkJaWYgKHByb2plY3RSb290LmlzT3BlbigpKSB7CiAJCQkJCQkoKFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBwcm9qZWN0Um9vdC5nZXRFbGVtZW50SW5mbygpKS5zZXROb25KYXZhUmVzb3VyY2VzKAogCQkJCQkJCW51bGwpOwpAQCAtOTE4LDEzICsxMjUwLDU3IEBACiAJCQl9CiAJCX0KIAotCQlKYXZhRWxlbWVudERlbHRhIGVsZW1lbnREZWx0YSA9IGZDdXJyZW50RGVsdGEuZmluZChlbGVtZW50KTsKKwkJSmF2YUVsZW1lbnREZWx0YSBlbGVtZW50RGVsdGEgPSBjdXJyZW50RGVsdGEoKS5maW5kKGVsZW1lbnQpOwogCQlpZiAoZWxlbWVudERlbHRhID09IG51bGwpIHsKLQkJCWZDdXJyZW50RGVsdGEuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOwotCQkJZWxlbWVudERlbHRhID0gZkN1cnJlbnREZWx0YS5maW5kKGVsZW1lbnQpOworCQkJY3VycmVudERlbHRhKCkuY2hhbmdlZChlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpOworCQkJZWxlbWVudERlbHRhID0gY3VycmVudERlbHRhKCkuZmluZChlbGVtZW50KTsKIAkJfQogCQllbGVtZW50RGVsdGEuYWRkUmVzb3VyY2VEZWx0YShkZWx0YSk7CiAJfQorCXByaXZhdGUgT3V0cHV0c0luZm8gb3V0cHV0c0luZm8oUm9vdEluZm8gcm9vdEluZm8sIElSZXNvdXJjZSByZXMpIHsKKwkJdHJ5IHsKKwkJCUlKYXZhUHJvamVjdCBwcm9qID0KKwkJCQlyb290SW5mbyA9PSBudWxsID8KKwkJCQkJKElKYXZhUHJvamVjdCl0aGlzLmNyZWF0ZUVsZW1lbnQocmVzLmdldFByb2plY3QoKSwgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCwgbnVsbCkgOgorCQkJCQlyb290SW5mby5wcm9qZWN0OworCQkJaWYgKHByb2ogIT0gbnVsbCkgeworCQkJCUlQYXRoIHByb2plY3RPdXRwdXQgPSBwcm9qLmdldE91dHB1dExvY2F0aW9uKCk7CisJCQkJaW50IHRyYXZlcnNlTW9kZSA9IElHTk9SRTsKKwkJCQlpZiAocHJvai5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5lcXVhbHMocHJvamVjdE91dHB1dCkpeyAvLyBjYXNlIG9mIHByb2o9PWJpbj09c3JjCisJCQkJCXJldHVybiBuZXcgT3V0cHV0c0luZm8obmV3IElQYXRoW10ge3Byb2plY3RPdXRwdXR9LCBuZXcgaW50W10ge1NPVVJDRX0sIDEpOworCQkJCX0gZWxzZSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2ouZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJCUlQYXRoW10gb3V0cHV0cyA9IG5ldyBJUGF0aFtjbGFzc3BhdGgubGVuZ3RoKzFdOworCQkJCQlpbnRbXSB0cmF2ZXJzZU1vZGVzID0gbmV3IGludFtjbGFzc3BhdGgubGVuZ3RoKzFdOworCQkJCQlpbnQgb3V0cHV0Q291bnQgPSAxOworCQkJCQlvdXRwdXRzWzBdID0gcHJvamVjdE91dHB1dDsKKwkJCQkJdHJhdmVyc2VNb2Rlc1swXSA9IHRyYXZlcnNlTW9kZTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJCQkJSVBhdGggb3V0cHV0ID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJCQkJCWlmIChvdXRwdXQgIT0gbnVsbCkgeworCQkJCQkJCW91dHB1dHNbb3V0cHV0Q291bnRdID0gb3V0cHV0OworCQkJCQkJCS8vIGNoZWNrIGNhc2Ugb2Ygc3JjPT1iaW4KKwkJCQkJCQlpZiAoZW50cnlQYXRoLmVxdWFscyhvdXRwdXQpKSB7CisJCQkJCQkJCXRyYXZlcnNlTW9kZXNbb3V0cHV0Q291bnQrK10gPSAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpID8gU09VUkNFIDogQklOQVJZOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRyYXZlcnNlTW9kZXNbb3V0cHV0Q291bnQrK10gPSBJR05PUkU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQkvLyBjaGVjayBjYXNlIG9mIHNyYz09YmluCisJCQkJCQlpZiAoZW50cnlQYXRoLmVxdWFscyhwcm9qZWN0T3V0cHV0KSkgeworCQkJCQkJCXRyYXZlcnNlTW9kZXNbMF0gPSAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpID8gU09VUkNFIDogQklOQVJZOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiBuZXcgT3V0cHV0c0luZm8ob3V0cHV0cywgdHJhdmVyc2VNb2Rlcywgb3V0cHV0Q291bnQpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAJCiAJLyoqCiAJICogQ2hlY2sgd2hldGhlciB0aGUgdXBkYXRlZCBmaWxlIGlzIGFmZmVjdGluZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGEgZ2l2ZW4gcHJvamVjdCAobGlrZQpAQCAtOTM4LDIwICsxMzE0LDQzIEBACiAJCUlKYXZhRWxlbWVudCBwYXJlbnQpIHsKIAkKIAkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpOworCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7CiAJCWJvb2xlYW4gcHJvY2Vzc0NoaWxkcmVuID0gZmFsc2U7CiAJCiAJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CiAJCiAJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKIAkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKKwkJCQkJZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7CiAJCQkJCXByb2Nlc3NDaGlsZHJlbiA9IHRydWU7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJLy8gZG8gbm90IHZpc2l0IG5vbi1qYXZhIHByb2plY3RzIChzZWUgYnVnIDE2MTQwIE5vbi1qYXZhIHByb2plY3QgZ2V0cyAuY2xhc3NwYXRoKQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiB0aGlzLmhhc0phdmFOYXR1cmUocmVzb3VyY2UpKSB7Ci0JCQkJCXByb2Nlc3NDaGlsZHJlbiA9IHRydWU7CisJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7CisJCQkJc3dpdGNoIChraW5kKSB7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKKwkJCQkJCS8vIGRvIG5vdCB2aXNpdCBub24tamF2YSBwcm9qZWN0cyAoc2VlIGJ1ZyAxNjE0MCBOb24tamF2YSBwcm9qZWN0IGdldHMgLmNsYXNzcGF0aCkKKwkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpcmVzb3VyY2U7CisJCQkJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeworCQkJCQkJCWVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpOworCQkJCQkJCXByb2Nlc3NDaGlsZHJlbiA9IHRydWU7CisJCQkJCQl9IGVsc2UgaWYgKEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmZpbmRKYXZhUHJvamVjdChwcm9qZWN0KSAhPSBudWxsKSB7CisJCQkJCQkJLy8gcHJvamVjdCBoYWQgdGhlIGphdmEgbmF0dXJlCisJCQkJCQkJdGhpcy5yb290c0FyZVN0YWxlID0gdHJ1ZTsKKworCQkJCQkJCS8vIHJlbW92ZSBjbGFzc3BhdGggY2FjaGUgc28gdGhhdCBpbml0aWFsaXplUm9vdHMoKSB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvamVjdCBoYXMgYSBjbGFzc3BhdGgKKwkJCQkJCQl0aGlzLm1hbmFnZXIucmVtb3ZlUGVyUHJvamVjdEluZm8oKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKKwkJCQkJCXRoaXMucm9vdHNBcmVTdGFsZSA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgorCQkJCQkJLy8gcmVtb3ZlIGNsYXNzcGF0aCBjYWNoZSBzbyB0aGF0IGluaXRpYWxpemVSb290cygpIHdpbGwgbm90IGNvbnNpZGVyIHRoZSBwcm9qZWN0IGhhcyBhIGNsYXNzcGF0aAorCQkJCQkJdGhpcy5tYW5hZ2VyLnJlbW92ZVBlclByb2plY3RJbmZvKChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpKTsKKwkJCQkJCQorCQkJCQkJdGhpcy5yb290c0FyZVN0YWxlID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgpAQCAtOTU5LDEwNSArMTM1OCwxNyBAQAogCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKIAkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgcGFyZW50OwogCQotCQkJCQkvKiBjaGVjayBjbGFzc3BhdGggcHJvcGVydHkgZmlsZSBjaGFuZ2UgKi8KLQkJCQkJUXVhbGlmaWVkTmFtZSBjbGFzc3BhdGhQcm9wOwotCQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCXByb2plY3QuY29tcHV0ZVNoYXJlZFByb3BlcnR5RmlsZU5hbWUoCi0JCQkJCQkJCWNsYXNzcGF0aFByb3AgPSBwcm9qZWN0LmdldENsYXNzcGF0aFByb3BlcnR5TmFtZSgpKSkpIHsKLQkKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDogLy8gcmVjcmVhdGUgb25lIGJhc2VkIG9uIGluLW1lbW9yeSBwYXRoCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwcm9qZWN0LnNhdmVDbGFzc3BhdGgocHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWlmIChwcm9qZWN0LmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3Qgc2F2ZSBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApCi0JCQkJCQkJCQlicmVhazsgLy8gb25seSBjb25zaWRlciBjb250ZW50IGNoYW5nZQotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQkJCQkvLyBjaGVjayBpZiBhbnkgYWN0dWFsIGRpZmZlcmVuY2UKLQkJCQkJCQkJcHJvamVjdC5mbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKGZhbHNlLCB0cnVlKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCS8vIGZvcmNlIHRvIChyZSlyZWFkIHRoZSBwcm9wZXJ0eSBmaWxlCi0JCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBmaWxlRW50cmllcyA9IG51bGw7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCVN0cmluZyBmaWxlQ2xhc3NwYXRoU3RyaW5nID0gcHJvamVjdC5sb2FkQ2xhc3NwYXRoKCk7Ci0JCQkJCQkJCQkJaWYgKGZpbGVDbGFzc3BhdGhTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlmaWxlRW50cmllcyA9IHByb2plY3QucmVhZFBhdGhzKGZpbGVDbGFzc3BhdGhTdHJpbmcpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQkJVXRpbC5sb2coZSwgCi0JCQkJCQkJCQkJCQkiRXhjZXB0aW9uIHdoaWxlIHJldHJpZXZpbmcgIisgcHJvamVjdC5nZXRQYXRoKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyIvLmNsYXNzcGF0aCwgaWdub3JlIGNoYW5nZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXByb2plY3QuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcigKLQkJCQkJCQkJCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGguY2Fubm90UmVhZENsYXNzcGF0aEZpbGUiLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IsCi0JCQkJCQkJCQkJCWZhbHNlLAkvLyAgY3ljbGUgZXJyb3IKLQkJCQkJCQkJCQkJdHJ1ZSk7CS8vCWZpbGUgZm9ybWF0IGVycm9yCi0JCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJaWYgKHByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJCVV0aWwubG9nKGUsIAotCQkJCQkJCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHByb2plY3QuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSsiLy5jbGFzc3BhdGgsIGlnbm9yZSBjaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlwcm9qZWN0LmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCi0JCQkJCQkJCQkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdFJlYWRDbGFzc3BhdGhGaWxlIiwgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlJTWFya2VyLlNFVkVSSVRZX0VSUk9SLAotCQkJCQkJCQkJCQlmYWxzZSwJLy8gIGN5Y2xlIGVycm9yCi0JCQkJCQkJCQkJCXRydWUpOwkvLwlmaWxlIGZvcm1hdCBlcnJvcgotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKGZpbGVFbnRyaWVzID09IG51bGwpCi0JCQkJCQkJCQkJYnJlYWs7IC8vIGNvdWxkIG5vdCByZWFkLCBpZ25vcmUgCi0JCQkJCQkJCQlpZiAocHJvamVjdC5pc0NsYXNzcGF0aEVxdWFsc1RvKHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSwgZmlsZUVudHJpZXMpKQotCQkJCQkJCQkJCWJyZWFrOwotCQotCQkJCQkJCQkJLy8gd2lsbCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGNsYXNzcGF0aC9vdXRwdXQgbG9jYXRpb24gYmFzZWQgb24gdGhlIGZpbGUgaW5mb3JtYXRpb24KLQkJCQkJCQkJCS8vIGV4dHJhY3Qgb3V0IHRoZSBvdXRwdXQgbG9jYXRpb24KLQkJCQkJCQkJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKLQkJCQkJCQkJCWlmIChmaWxlRW50cmllcyAhPSBudWxsICYmIGZpbGVFbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBmaWxlRW50cmllc1tmaWxlRW50cmllcy5sZW5ndGggLSAxXTsKLQkJCQkJCQkJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgewotCQkJCQkJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbZmlsZUVudHJpZXMubGVuZ3RoIC0gMV07Ci0JCQkJCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoZmlsZUVudHJpZXMsIDAsIGNvcHksIDAsIGNvcHkubGVuZ3RoKTsKLQkJCQkJCQkJCQkJZmlsZUVudHJpZXMgPSBjb3B5OwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIHJlc3RvcmUgb3V0cHV0IGxvY2F0aW9uCQkJCQotCQkJCQkJCQkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IFNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoCi0JCQkJCQkJCQkJZmlsZUVudHJpZXMsIAotCQkJCQkJCQkJCW91dHB1dExvY2F0aW9uLCAKLQkJCQkJCQkJCQludWxsLCAvLyBtb25pdG9yCi0JCQkJCQkJCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UKLQkJCQkJCQkJCQlmYWxzZSwgLy8gZm9yY2VTYXZlCi0JCQkJCQkJCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgLy8gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlCi0JCQkJCQkJCQkJdHJ1ZSwgLy8gbmVlZEN5Y2xlQ2hlY2sKLQkJCQkJCQkJCQl0cnVlKTsgLy8gbmVlZFZhbGlkYXRpb24KLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkvLyBzZXRSYXdDbGFzc3BhdGggbWlnaHQgZmlyZSBhIGRlbHRhLCBhbmQgYSBsaXN0ZW5lciBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJLy8gaGFwcGVucyBpZiB0aGUgLmNsYXNzcGF0aCBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byBkaXNrCi0JCQkJCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkKLQkJCQkJCX0KKwkJCQkJLyogY2hlY2sgY2xhc3NwYXRoIGZpbGUgY2hhbmdlICovCisJCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoSmF2YVByb2plY3QuQ0xBU1NQQVRIX0ZJTEVOQU1FKSkgeworCQkJCQkJcmVjb25jaWxlQ2xhc3NwYXRoRmlsZVVwZGF0ZShkZWx0YSwgZmlsZSwgcHJvamVjdCk7CisJCQkJCQl0aGlzLnJvb3RzQXJlU3RhbGUgPSB0cnVlOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KKy8vCQkJCQkvKiBjaGVjayBjdXN0b20gcHJlZmVyZW5jZSBmaWxlIGNoYW5nZSAqLworLy8JCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoSmF2YVByb2plY3QuUFJFRl9GSUxFTkFNRSkpIHsKKy8vCQkJCQkJcmVjb25jaWxlUHJlZmVyZW5jZUZpbGVVcGRhdGUoZGVsdGEsIGZpbGUsIHByb2plY3QpOworLy8JCQkJCQlicmVhazsKKy8vCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMDc1LDExICsxMzg2LDcgQEAKIAkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKIAkJCQljdXJyZW50RWxlbWVudFBhdGggPSAoKElQYWNrYWdlRnJhZ21lbnRSb290KXRoaXMuY3VycmVudEVsZW1lbnQpLmdldFBhdGgoKTsKIAkJCX0gZWxzZSB7Ci0JCQkJSVJlc291cmNlIGN1cnJlbnRFbGVtZW50UmVzb3VyY2UgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWN1cnJlbnRFbGVtZW50UmVzb3VyY2UgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQorCQkJCUlSZXNvdXJjZSBjdXJyZW50RWxlbWVudFJlc291cmNlID0gdGhpcy5jdXJyZW50RWxlbWVudC5nZXRSZXNvdXJjZSgpOwogCQkJCWlmIChjdXJyZW50RWxlbWVudFJlc291cmNlICE9IG51bGwpIHsKIAkJCQkJY3VycmVudEVsZW1lbnRQYXRoID0gY3VycmVudEVsZW1lbnRSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwogCQkJCX0KQEAgLTEwOTgsMTcgKzE0MDUsMTYgQEAKIAkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpdGhpcy5jdXJyZW50RWxlbWVudC5nZXRQYXJlbnQoKTsKIAkJfQogCX0KLQkKKwogCS8qKgogCSAqIENvbnZlcnRzIGEgPGNvZGU+SVJlc291cmNlRGVsdGE8L2NvZGU+IHJvb3RlZCBpbiBhIDxjb2RlPldvcmtzcGFjZTwvY29kZT4gaW50bwogCSAqIHRoZSBjb3JyZXNwb25kaW5nIHNldCBvZiA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4sIHJvb3RlZCBpbiB0aGUKIAkgKiByZWxldmFudCA8Y29kZT5KYXZhTW9kZWw8L2NvZGU+cy4KIAkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50RGVsdGFbXSBwcm9jZXNzUmVzb3VyY2VEZWx0YShJUmVzb3VyY2VEZWx0YSBjaGFuZ2VzLCBpbnQgZXZlbnRUeXBlKSB7CisJcHVibGljIElKYXZhRWxlbWVudERlbHRhIHByb2Nlc3NSZXNvdXJjZURlbHRhKElSZXNvdXJjZURlbHRhIGNoYW5nZXMpIHsKIAogCQl0cnkgewotCQkJdGhpcy5jdXJyZW50RXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQkJSUphdmFNb2RlbCBtb2RlbCA9IHRoaXMubWFuYWdlci5nZXRKYXZhTW9kZWwoKTsKIAkJCWlmICghbW9kZWwuaXNPcGVuKCkpIHsKIAkJCQkvLyBmb3JjZSBvcGVuaW5nIG9mIGphdmEgbW9kZWwgc28gdGhhdCBqYXZhIGVsZW1lbnQgZGVsdGEgYXJlIHJlcG9ydGVkCiAJCQkJdHJ5IHsKQEAgLTExMTcsMzMgKzE0MjMsNDUgQEAKIAkJCQkJaWYgKFZFUkJPU0UpIHsKIAkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJCX0KLQkJCQkJcmV0dXJuIE5PX0RFTFRBOworCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQl9Ci0JCQl0aGlzLmluaXRpYWxpemVSb290cyhtb2RlbCk7CisJCQl0aGlzLmluaXRpYWxpemVSb290cygpOwogCQkJdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7CiAJCQkKIAkJCS8vIGdldCB0aGUgd29ya3NwYWNlIGRlbHRhLCBhbmQgc3RhcnQgcHJvY2Vzc2luZyB0aGVyZS4KIAkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gY2hhbmdlcy5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YVtdIHRyYW5zbGF0ZWREZWx0YXMgPSBuZXcgSmF2YUVsZW1lbnREZWx0YVtkZWx0YXMubGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7CiAJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBkZWx0YXNbaV07CiAJCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJZkN1cnJlbnREZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKG1vZGVsKTsKIAkJCQkKLQkJCQkvLyBmaW5kIG91dCB3aGV0aGVyIHRoZSBkZWx0YSBpcyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0T2ZSb290ID0gKElKYXZhUHJvamVjdCl0aGlzLnJvb3RzLmdldChyZXMuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJYm9vbGVhbiBpc1BrZ0ZyYWdtZW50Um9vdCA9IHByb2plY3RPZlJvb3QgIT0gbnVsbDsKLQkJCQlpbnQgZWxlbWVudFR5cGUgPSAKLQkJCQkJdGhpcy5lbGVtZW50VHlwZSgKLQkJCQkJCXJlcywgCi0JCQkJCQlkZWx0YS5nZXRLaW5kKCksCi0JCQkJCQlkZWx0YS5nZXRGbGFncygpLAotCQkJCQkJSUphdmFFbGVtZW50LkpBVkFfTU9ERUwsIAotCQkJCQkJaXNQa2dGcmFnbWVudFJvb3QpOworCQkJCS8vIGZpbmQgb3V0IHRoZSBlbGVtZW50IHR5cGUKKwkJCQlSb290SW5mbyByb290SW5mbyA9IG51bGw7CisJCQkJaW50IGVsZW1lbnRUeXBlOworCQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpcmVzOworCQkJCWJvb2xlYW4gd2FzSmF2YVByb2plY3QgPSB0aGlzLm1hbmFnZXIuZ2V0SmF2YU1vZGVsKCkuZmluZEphdmFQcm9qZWN0KHByb2opICE9IG51bGw7CisJCQkJYm9vbGVhbiBpc0phdmFQcm9qZWN0ID0gSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qKTsKKwkJCQlpZiAoIXdhc0phdmFQcm9qZWN0ICYmICFpc0phdmFQcm9qZWN0KSB7CisJCQkJCWVsZW1lbnRUeXBlID0gTk9OX0pBVkFfUkVTT1VSQ0U7CisJCQkJfSBlbHNlIHsKKwkJCQkJcm9vdEluZm8gPSB0aGlzLmVuY2xvc2luZ1Jvb3RJbmZvKHJlcy5nZXRGdWxsUGF0aCgpLCBkZWx0YS5nZXRLaW5kKCkpOworCQkJCQlpZiAocm9vdEluZm8gIT0gbnVsbCAmJiByb290SW5mby5pc1Jvb3RPZlByb2plY3QocmVzLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCQllbGVtZW50VHlwZSA9IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllbGVtZW50VHlwZSA9IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q7IAorCQkJCQl9CisJCQkJfQogCQkJCQotCQkJCXRoaXMudHJhdmVyc2VEZWx0YShkZWx0YSwgZWxlbWVudFR5cGUsIHByb2plY3RPZlJvb3QsIG51bGwsIElHTk9SRSk7IC8vIHRyYXZlcnNlIGRlbHRhCi0JCQkJdHJhbnNsYXRlZERlbHRhc1tpXSA9IGZDdXJyZW50RGVsdGE7CisJCQkJLy8gdHJhdmVyc2UgZGVsdGEKKwkJCQlpZiAoIXRoaXMudHJhdmVyc2VEZWx0YShkZWx0YSwgZWxlbWVudFR5cGUsIHJvb3RJbmZvLCBudWxsKSAKKwkJCQkJCXx8ICh3YXNKYXZhUHJvamVjdCAhPSBpc0phdmFQcm9qZWN0ICYmIChkZWx0YS5nZXRLaW5kKCkpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpKSB7IC8vIHByb2plY3QgaGFzIGNoYW5nZWQgbmF0dXJlIChkZXNjcmlwdGlvbiBvciBvcGVuL2Nsb3NlZCkKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIGFkZCBjaGlsZCBhcyBub24gamF2YSByZXNvdXJjZQorCQkJCQkJbm9uSmF2YVJlc291cmNlc0NoYW5nZWQoKEphdmFNb2RlbCltb2RlbCwgZGVsdGEpOworCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJfQorCiAJCQl9CiAJCQkKIAkJCS8vIHVwZGF0ZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHByb2plY3RzIHRoYXQgd2VyZSBhZmZlY3RlZApAQCAtMTE1NSwxMTAgKzE0NzMsMTczIEBACiAJCiAJCQl1cGRhdGVEZXBlbmRlbnROYW1lbG9va3VwcygpOwogCi0JCQlyZXR1cm4gZmlsdGVyUmVhbERlbHRhcyh0cmFuc2xhdGVkRGVsdGFzKTsKKwkJCXJldHVybiB0aGlzLmN1cnJlbnREZWx0YTsKIAkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuY3VycmVudERlbHRhID0gbnVsbDsKIAkJCXRoaXMucHJvamVjdHNUb1VwZGF0ZS5jbGVhcigpOwogCQkJdGhpcy5wcm9qZWN0c0ZvckRlcGVuZGVudE5hbWVsb29rdXBSZWZyZXNoLmNsZWFyKCk7CiAJCX0KIAl9Ci0JCi0vKgotICogVXBkYXRlIHRoZSBjdXJyZW50IGRlbHRhIChpZS4gYWRkL3JlbW92ZS9jaGFuZ2UgdGhlIGdpdmVuIGVsZW1lbnQpIGFuZCB1cGRhdGUgdGhlIGNvcnJlcG9uZGluZyBpbmRleC4KLSAqIFJldHVybnMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGRlbHRhIG11c3QgYmUgcHJvY2Vzc2VkLgotICogQHRocm93cyBhIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZGVsdGEgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgamF2YSBlbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLgotICovCi1wcml2YXRlIGJvb2xlYW4gdXBkYXRlQ3VycmVudERlbHRhQW5kSW5kZXgoSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBlbGVtZW50VHlwZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCU9wZW5hYmxlIGVsZW1lbnQ7Ci0Jc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQlJUmVzb3VyY2UgZGVsdGFSZXMgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChkZWx0YVJlcywgZWxlbWVudFR5cGUsIHByb2plY3QpOwotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIG1pZ2h0IGJlIGNvbnRhaW5pbmcgc2hhcmVkIHJvb3RzIChzZWUgYnVnIDE5MDU4KQotCQkJCXRoaXMudXBkYXRlUm9vdHMoZGVsdGFSZXMuZ2V0RnVsbFBhdGgoKSwgZGVsdGEpOwotCQkJCXRocm93IG5ld0ludmFsaWRFbGVtZW50VHlwZSgpOwotCQkJfQotCQkJdGhpcy51cGRhdGVJbmRleChlbGVtZW50LCBkZWx0YSk7Ci0JCQl0aGlzLmVsZW1lbnRBZGRlZChlbGVtZW50LCBkZWx0YSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQlkZWx0YVJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KGRlbHRhUmVzLCBlbGVtZW50VHlwZSwgcHJvamVjdCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJLy8gcmVzb3VyY2UgbWlnaHQgYmUgY29udGFpbmluZyBzaGFyZWQgcm9vdHMgKHNlZSBidWcgMTkwNTgpCi0JCQkJdGhpcy51cGRhdGVSb290cyhkZWx0YVJlcy5nZXRGdWxsUGF0aCgpLCBkZWx0YSk7Ci0JCQkJdGhyb3cgbmV3SW52YWxpZEVsZW1lbnRUeXBlKCk7Ci0JCQl9Ci0JCQl0aGlzLnVwZGF0ZUluZGV4KGVsZW1lbnQsIGRlbHRhKTsKLQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoZWxlbWVudCwgZGVsdGEpOwogCi0JCQlpZiAoZGVsdGFSZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsJCQkKLQkJCQkvLyByZXNldCB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IGJ1aWx0IHN0YXRlLCBzaW5jZSBjYW5ub3QgcmV1c2UgaWYgYWRkZWQgYmFjawotCQkJCXRoaXMubWFuYWdlci5zZXRMYXN0QnVpbHRTdGF0ZSgoSVByb2plY3QpZGVsdGFSZXMsIG51bGwgLypubyBzdGF0ZSovKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkgewotCQkJCS8vIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KGRlbHRhLmdldFJlc291cmNlKCksIGVsZW1lbnRUeXBlLCBwcm9qZWN0KTsKLQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB0aHJvdyBuZXdJbnZhbGlkRWxlbWVudFR5cGUoKTsKLQkJCQl0aGlzLnVwZGF0ZUluZGV4KGVsZW1lbnQsIGRlbHRhKTsKLQkJCQl0aGlzLmNvbnRlbnRDaGFuZ2VkKGVsZW1lbnQsIGRlbHRhKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSB7Ci0JCQkJCS8vIHByb2plY3QgaGFzIGJlZW4gb3BlbmVkIG9yIGNsb3NlZAotCQkJCQlJUHJvamVjdCByZXMgPSAoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChyZXMsIGVsZW1lbnRUeXBlLCBwcm9qZWN0KTsKLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gcmVzb3VyY2UgbWlnaHQgYmUgY29udGFpbmluZyBzaGFyZWQgcm9vdHMgKHNlZSBidWcgMTkwNTgpCi0JCQkJCQl0aGlzLnVwZGF0ZVJvb3RzKHJlcy5nZXRGdWxsUGF0aCgpLCBkZWx0YSk7Ci0JCQkJCQl0aHJvdyBuZXdJbnZhbGlkRWxlbWVudFR5cGUoKTsKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFNb2RlbCBhY2NvcmRpbmcgdG8gYSAuY2xhc3NwYXRoIGZpbGUgY2hhbmdlLiBUaGUgZmlsZSBjYW4gaGF2ZSBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMKKwkgKiBjYWxsIHRvIEphdmFQcm9qZWN0I3NldFJhd0NsYXNzcGF0aCBvciBhcyBhIHJlc3VsdCBvZiBzb21lIHVzZXIgdXBkYXRlICh0aHJvdWdoIHJlcG9zaXRvcnkpCisJICovCisJdm9pZCByZWNvbmNpbGVDbGFzc3BhdGhGaWxlVXBkYXRlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJRmlsZSBmaWxlLCBKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisJCQkKKwkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKKwkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlY3JlYXRlIG9uZSBiYXNlZCBvbiBpbi1tZW1vcnkgY2xhc3NwYXRoCisJCQkJdHJ5IHsKKwkJCQkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm9DaGVja0V4aXN0ZW5jZShwcm9qZWN0LmdldFByb2plY3QoKSk7CisJCQkJCWlmIChpbmZvLmNsYXNzcGF0aCAhPSBudWxsKSB7IC8vIGlmIHRoZXJlIGlzIGFuIGluLW1lbW9yeSBjbGFzc3BhdGgKKwkJCQkJCXByb2plY3Quc2F2ZUNsYXNzcGF0aChpbmZvLmNsYXNzcGF0aCwgaW5mby5vdXRwdXRMb2NhdGlvbik7CiAJCQkJCX0KLQkJCQkJaWYgKHJlcy5pc09wZW4oKSkgewotCQkJCQkJaWYgKHRoaXMuaGFzSmF2YU5hdHVyZShyZXMpKSB7Ci0JCQkJCQkJdGhpcy5lbGVtZW50QWRkZWQoZWxlbWVudCwgZGVsdGEpOwotCQkJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLmluZGV4QWxsKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlKYXZhTW9kZWwgamF2YU1vZGVsID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCk7Ci0JCQkJCQlib29sZWFuIHdhc0phdmFQcm9qZWN0ID0gamF2YU1vZGVsLmZpbmRKYXZhUHJvamVjdChyZXMpICE9IG51bGw7Ci0JCQkJCQlpZiAod2FzSmF2YVByb2plY3QpIHsKLQkJCQkJCQl0aGlzLmVsZW1lbnRSZW1vdmVkKGVsZW1lbnQsIGRlbHRhKTsKLQkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5kaXNjYXJkSm9icyhlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLnJlbW92ZUluZGV4RmFtaWx5KHJlcy5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQkKLQkJCQkJCX0KKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlpZiAocHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJCVV0aWwubG9nKGUsICJDb3VsZCBub3Qgc2F2ZSBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsgLy8gd2hlbiBhIHByb2plY3QgaXMgb3Blbi9jbG9zZWQgZG9uJ3QgcHJvY2VzcyBjaGlsZHJlbgogCQkJCX0KLQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApIHsKLQkJCQkJSVByb2plY3QgcmVzID0gKElQcm9qZWN0KWRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKTsKLQkJCQkJYm9vbGVhbiB3YXNKYXZhUHJvamVjdCA9IGphdmFNb2RlbC5maW5kSmF2YVByb2plY3QocmVzKSAhPSBudWxsOwotCQkJCQlib29sZWFuIGlzSmF2YVByb2plY3QgPSB0aGlzLmhhc0phdmFOYXR1cmUocmVzKTsKLQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0ICE9IGlzSmF2YVByb2plY3QpIHsKLQkJCQkJCS8vIHByb2plY3QncyBuYXR1cmUgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZAotCQkJCQkJZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChyZXMsIGVsZW1lbnRUeXBlLCBwcm9qZWN0KTsKLQkJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHRocm93IG5ld0ludmFsaWRFbGVtZW50VHlwZSgpOyAvLyBub3RlIGl0cyByZXNvdXJjZXMgYXJlIHN0aWxsIHZpc2libGUgYXMgcm9vdHMgdG8gb3RoZXIgcHJvamVjdHMKLQkJCQkJCWlmIChpc0phdmFQcm9qZWN0KSB7Ci0JCQkJCQkJdGhpcy5lbGVtZW50QWRkZWQoZWxlbWVudCwgZGVsdGEpOwotCQkJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLmluZGV4QWxsKHJlcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDAgIC8vIG9ubHkgY29uc2lkZXIgY29udGVudCBjaGFuZ2UKKwkJCQkJCSYmIChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPT0gMCkgLy8gYW5kIGFsc28gbW92ZSBhbmQgb3ZlcmlkZSBzY2VuYXJpbyAoc2VlIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE0MjApCisJCQkJCWJyZWFrOworCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJLy8gY2hlY2sgaWYgYW55IGFjdHVhbCBkaWZmZXJlbmNlCisJCQkJcHJvamVjdC5mbHVzaENsYXNzcGF0aFByb2JsZW1NYXJrZXJzKGZhbHNlLCB0cnVlKTsKKwkJCQlib29sZWFuIHdhc1N1Y2Nlc3NmdWwgPSBmYWxzZTsgLy8gZmxhZyByZWNvcmRpbmcgaWYgLmNsYXNzcGF0aCBmaWxlIGNoYW5nZSBnb3QgcmVmbGVjdGVkCisJCQkJdHJ5IHsKKwkJCQkJLy8gZm9yY2UgdG8gKHJlKXJlYWQgdGhlIHByb3BlcnR5IGZpbGUKKwkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZmlsZUVudHJpZXMgPSBwcm9qZWN0LnJlYWRDbGFzc3BhdGhGaWxlKHRydWUvKmNyZWF0ZSBtYXJrZXJzKi8sIGZhbHNlLypkb24ndCBsb2cgcHJvYmxlbXMqLyk7CisJCQkJCWlmIChmaWxlRW50cmllcyA9PSBudWxsKQorCQkJCQkJYnJlYWs7IC8vIGNvdWxkIG5vdCByZWFkLCBpZ25vcmUgCisJCQkJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvQ2hlY2tFeGlzdGVuY2UocHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQkJCQlpZiAoaW5mby5jbGFzc3BhdGggIT0gbnVsbCkgeyAvLyBpZiB0aGVyZSBpcyBhbiBpbi1tZW1vcnkgY2xhc3NwYXRoCisJCQkJCQlpZiAocHJvamVjdC5pc0NsYXNzcGF0aEVxdWFsc1RvKGluZm8uY2xhc3NwYXRoLCBpbmZvLm91dHB1dExvY2F0aW9uLCBmaWxlRW50cmllcykpIHsKKwkJCQkJCQl3YXNTdWNjZXNzZnVsID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkKKwkJCQkJLy8gd2lsbCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGNsYXNzcGF0aC9vdXRwdXQgbG9jYXRpb24gYmFzZWQgb24gdGhlIGZpbGUgaW5mb3JtYXRpb24KKwkJCQkJLy8gZXh0cmFjdCBvdXQgdGhlIG91dHB1dCBsb2NhdGlvbgorCQkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7CisJCQkJCWlmIChmaWxlRW50cmllcyAhPSBudWxsICYmIGZpbGVFbnRyaWVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGZpbGVFbnRyaWVzW2ZpbGVFbnRyaWVzLmxlbmd0aCAtIDFdOworCQkJCQkJaWYgKGVudHJ5LmdldENvbnRlbnRLaW5kKCkgPT0gQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQpIHsKKwkJCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb3B5ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtmaWxlRW50cmllcy5sZW5ndGggLSAxXTsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVFbnRyaWVzLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7CisJCQkJCQkJZmlsZUVudHJpZXMgPSBjb3B5OworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vIHJlc3RvcmUgb3V0cHV0IGxvY2F0aW9uCQkJCQorCQkJCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgeworCQkJCQkJb3V0cHV0TG9jYXRpb24gPSBTZXRDbGFzc3BhdGhPcGVyYXRpb24uUmV1c2VPdXRwdXRMb2NhdGlvbjsKKwkJCQkJCS8vIGNsZWFuIG1vZGUgd2lsbCBhbHNvIGRlZmF1bHQgdG8gcmV1c2luZyBjdXJyZW50IG9uZQorCQkJCQl9CisJCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAorCQkJCQkJZmlsZUVudHJpZXMsIAorCQkJCQkJb3V0cHV0TG9jYXRpb24sIAorCQkJCQkJbnVsbCwgLy8gbW9uaXRvcgorCQkJCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UKKwkJCQkJCXByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSksIC8vIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZQorCQkJCQkJdHJ1ZSwgLy8gbmVlZFZhbGlkYXRpb24KKwkJCQkJCWZhbHNlKTsgLy8gbm8gbmVlZCB0byBzYXZlCisJCQkJCQorCQkJCQkvLyBpZiByZWFjaCB0aGF0IGZhciwgdGhlIGNsYXNzcGF0aCBmaWxlIGNoYW5nZSBnb3QgYWJzb3JiZWQKKwkJCQkJd2FzU3VjY2Vzc2Z1bCA9IHRydWU7CisJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIHNldFJhd0NsYXNzcGF0aCBtaWdodCBmaXJlIGEgZGVsdGEsIGFuZCBhIGxpc3RlbmVyIG1heSB0aHJvdyBhbiBleGNlcHRpb24KKwkJCQkJaWYgKHByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7CisJCQkJCQlVdGlsLmxvZyhlLCAiQ291bGQgbm90IHNldCBjbGFzc3BhdGggZm9yICIrIHByb2plY3QuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7IC8vIENQIGZhaWxlZCB2YWxpZGF0aW9uCisJCQkJCWlmIChwcm9qZWN0LmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgeworCQkJCQkJaWYgKGUuZ2V0SmF2YU1vZGVsU3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJCQkJLy8gaGFwcGVucyBpZiB0aGUgLmNsYXNzcGF0aCBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byBkaXNrCisJCQkJCQkJcHJvamVjdC5jcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRIX0ZJTEVfRk9STUFULAorCQkJCQkJCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGguY291bGROb3RXcml0ZUNsYXNzcGF0aEZpbGUiLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCksIGUuZ2V0TWVzc2FnZSgpKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoZWxlbWVudCwgZGVsdGEpOwotCQkJCQkJCXRoaXMuaW5kZXhNYW5hZ2VyLmRpc2NhcmRKb2JzKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXhGYW1pbHkocmVzLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCS8vIHJlc2V0IHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgYnVpbHQgc3RhdGUsIHNpbmNlIGNhbm5vdCByZXVzZSBpZiBhZGRlZCBiYWNrCi0JCQkJCQkJdGhpcy5tYW5hZ2VyLnNldExhc3RCdWlsdFN0YXRlKHJlcywgbnVsbCAvKm5vIHN0YXRlKi8pOworCQkJCQkJCXByb2plY3QuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKKwkJCQkJCQkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLmludmFsaWRDbGFzc3BhdGhJbkNsYXNzcGF0aEZpbGUiLCBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCksIGUuZ2V0TWVzc2FnZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CQkJCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaWYgKCF3YXNTdWNjZXNzZnVsKSB7IAorCQkJCQkJdHJ5IHsKKwkJCQkJCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aDAoSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEgpOworCQkJCQkJCXByb2plY3QudXBkYXRlUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIHdoZW4gYSBwcm9qZWN0J3MgbmF0dXJlIGlzIGFkZGVkL3JlbW92ZWQgZG9uJ3QgcHJvY2VzcyBjaGlsZHJlbgogCQkJCQl9CiAJCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7CisJCX0KIAl9Ci0JcmV0dXJuIHRydWU7Ci19CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFNb2RlbCBhY2NvcmRpbmcgdG8gYSAuanByZWZzIGZpbGUgY2hhbmdlLiBUaGUgZmlsZSBjYW4gaGF2ZSBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMKKwkgKiBjYWxsIHRvIEphdmFQcm9qZWN0I3NldE9wdGlvbnMgb3IgYXMgYSByZXN1bHQgb2Ygc29tZSB1c2VyIHVwZGF0ZSAodGhyb3VnaCByZXBvc2l0b3J5KQorCSAqIFVudXNlZCB1bnRpbCBwcmVmZXJlbmNlIGZpbGUgZ2V0IHNoYXJlZCAoLmpwcmVmKQorCSAqLworCXZvaWQgcmVjb25jaWxlUHJlZmVyZW5jZUZpbGVVcGRhdGUoSVJlc291cmNlRGVsdGEgZGVsdGEsIElGaWxlIGZpbGUsIEphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJCQorCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgeworCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDogLy8gZmx1c2ggcHJvamVjdCBjdXN0b20gc2V0dGluZ3MKKwkJCQlwcm9qZWN0LnNldE9wdGlvbnMobnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKKwkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwICAvLyBvbmx5IGNvbnNpZGVyIGNvbnRlbnQgY2hhbmdlCisJCQkJCQkmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pID09IDApIC8vIGFuZCBhbHNvIG1vdmUgYW5kIG92ZXJpZGUgc2NlbmFyaW8KKwkJCQkJYnJlYWs7CisJCQkJaWRlbnRpdHlDaGVjayA6IHsgLy8gY2hlY2sgaWYgYW55IGFjdHVhbCBkaWZmZXJlbmNlCisJCQkJCS8vIGZvcmNlIHRvIChyZSlyZWFkIHRoZSBwcm9wZXJ0eSBmaWxlCisJCQkJCVByZWZlcmVuY2VzIGZpbGVQcmVmZXJlbmNlcyA9IHByb2plY3QubG9hZFByZWZlcmVuY2VzKCk7CisJCQkJCWlmIChmaWxlUHJlZmVyZW5jZXMgPT0gbnVsbCl7IAorCQkJCQkJcHJvamVjdC5zZXRPcHRpb25zKG51bGwpOyAvLyBzaG91bGQgaGF2ZSBnb3QgcmVtb3ZlZCBkZWx0YS4KKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBwcm9qZWN0LmdldFByZWZlcmVuY2VzKCk7CisJCQkJCWlmIChwcm9qZWN0UHJlZmVyZW5jZXMgPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgYSBKYXZhIHByb2plY3QKKwkJCQkJCQorCQkJCQkvLyBjb21wYXJlIHByZWZlcmVuY2VzIHNldCB0byB0aGVpciBkZWZhdWx0CisJCQkJCVN0cmluZ1tdIGRlZmF1bHRQcm9qZWN0UHJvcGVydHlOYW1lcyA9IHByb2plY3RQcmVmZXJlbmNlcy5kZWZhdWx0UHJvcGVydHlOYW1lcygpOworCQkJCQlTdHJpbmdbXSBkZWZhdWx0RmlsZVByb3BlcnR5TmFtZXMgPSBmaWxlUHJlZmVyZW5jZXMuZGVmYXVsdFByb3BlcnR5TmFtZXMoKTsKKwkJCQkJaWYgKGRlZmF1bHRQcm9qZWN0UHJvcGVydHlOYW1lcy5sZW5ndGggPT0gZGVmYXVsdEZpbGVQcm9wZXJ0eU5hbWVzLmxlbmd0aCkgeworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0UHJvamVjdFByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspeworCQkJCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBkZWZhdWx0UHJvamVjdFByb3BlcnR5TmFtZXNbaV07CisJCQkJCQkJaWYgKCFwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHByb3BlcnR5TmFtZSkudHJpbSgpLmVxdWFscyhmaWxlUHJlZmVyZW5jZXMuZ2V0U3RyaW5nKHByb3BlcnR5TmFtZSkudHJpbSgpKSl7CisJCQkJCQkJCWJyZWFrIGlkZW50aXR5Q2hlY2s7CisJCQkJCQkJfQorCQkJCQkJfQkJCisJCQkJCX0gZWxzZSBicmVhayBpZGVudGl0eUNoZWNrOworCisJCQkJCS8vIGNvbXBhcmUgY3VzdG9tIHByZWZlcmVuY2VzIG5vdCBzZXQgdG8gdGhlaXIgZGVmYXVsdAorCQkJCQlTdHJpbmdbXSBwcm9qZWN0UHJvcGVydHlOYW1lcyA9IHByb2plY3RQcmVmZXJlbmNlcy5wcm9wZXJ0eU5hbWVzKCk7CisJCQkJCVN0cmluZ1tdIGZpbGVQcm9wZXJ0eU5hbWVzID0gZmlsZVByZWZlcmVuY2VzLnByb3BlcnR5TmFtZXMoKTsKKwkJCQkJaWYgKHByb2plY3RQcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSBmaWxlUHJvcGVydHlOYW1lcy5sZW5ndGgpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdFByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspeworCQkJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb2plY3RQcm9wZXJ0eU5hbWVzW2ldOworCQkJCQkJCWlmICghcHJvamVjdFByZWZlcmVuY2VzLmdldFN0cmluZyhwcm9wZXJ0eU5hbWUpLnRyaW0oKS5lcXVhbHMoZmlsZVByZWZlcmVuY2VzLmdldFN0cmluZyhwcm9wZXJ0eU5hbWUpLnRyaW0oKSkpeworCQkJCQkJCQlicmVhayBpZGVudGl0eUNoZWNrOworCQkJCQkJCX0KKwkJCQkJCX0JCQorCQkJCQl9IGVsc2UgYnJlYWsgaWRlbnRpdHlDaGVjazsKKwkJCQkJCisJCQkJCS8vIGlkZW50aWNhbCAtIGRvIG5vdGhpbmcKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgorCQkJCS8vIG5vdCBpZGVudGljYWwsIGNyZWF0ZSBkZWx0YSBhbmQgcmVzZXQgY2FjaGVkIHByZWZlcmVuY2VzCisJCQkJcHJvamVjdC5zZXRQcmVmZXJlbmNlcyhudWxsKTsKKwkJCQkvLyBjcmVhdGUgZGVsdGEKKwkJCQkvL2ZDdXJyZW50RGVsdGEuY2hhbmdlZChwcm9qZWN0LCBJSmF2YUVsZW1lbnREZWx0YS5GX09QVElPTlNfQ0hBTkdFRCk7CQkJCQorCQl9CisJfQogCiAJLyoqCiAJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIGl0cyBwYXJlbnRzIGNhY2hlIG9mIGNoaWxkcmVuLiBJZiB0aGUKQEAgLTEyNzAsNyArMTY1MSw3IEBACiAJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKIAkJCXRyeSB7Ci0JCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSBwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IChKYXZhRWxlbWVudEluZm8pcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CiAJCQkJaW5mby5yZW1vdmVDaGlsZChjaGlsZCk7CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCS8vIGRvIG5vdGhpbmcgLSB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgb3BlbgpAQCAtMTI4Nyw5ICsxNjY4LDcgQEAKIAkgKiBAc2VlIElSZXNvdXJjZSAKIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQlKYXZhTW9kZWxNYW5hZ2VyLklzUmVzb3VyY2VUcmVlTG9ja2VkID0gZmFsc2U7Ci0JCQorCQogCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7CiAJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwogCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwpAQCAtMTMwNywxMiArMTY4NiwxMiBAQAogCQkJCQlyZXR1cm47CiAJCQkJCQogCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0FVVE9fQlVJTEQgOgotCQkJCQlpZihkZWx0YSAhPSBudWxsKSB7CisJCQkJCWlmKGlzQWZmZWN0ZWRCeShkZWx0YSkpIHsgLy8gYXZvaWQgcG9wdWxhdGluZyBmb3IgU1lOQyBvciBNQVJLRVIgZGVsdGFzCiAJCQkJCQl0aGlzLmNoZWNrUHJvamVjdHNCZWluZ0FkZGVkT3JSZW1vdmVkKGRlbHRhKTsKIAkJCQkJCQogCQkJCQkJLy8gdXBkYXRlIHRoZSBjbGFzc3BhdGggcmVsYXRlZCBtYXJrZXJzCiAJCQkJCQl0aGlzLnVwZGF0ZUNsYXNzcGF0aE1hcmtlcnMoKTsKLQorCQogCQkJCQkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIGNsb3NlIHByb2plY3QgaWYgYWZmZWN0ZWQgYnkgdGhlIHByb3BlcnR5IGZpbGUgY2hhbmdlCiAJCQkJCQl0cnkgewogCQkJCQkJCS8vIGRvbid0IGZpcmUgY2xhc3NwYXRoIGNoYW5nZSBkZWx0YXMgcmlnaHQgYXdheSwgYnV0IGJhdGNoIHRoZW0KQEAgLTEzMjUsMTk0ICsxNzA0LDIxNiBAQAogCQkJCQkvLyBvbmx5IGZpcmUgYWxyZWFkeSBjb21wdXRlZCBkZWx0YXMgKHJlc291cmNlIG9uZXMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gcG9zdCBjaGFuZ2Ugb25seSkKIAkJCQkJdGhpcy5tYW5hZ2VyLmZpcmUobnVsbCwgRWxlbWVudENoYW5nZWRFdmVudC5QUkVfQVVUT19CVUlMRCk7CiAJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0FVVE9fQlVJTEQgOgorCQkJCQlKYXZhQnVpbGRlci5maW5pc2hlZEJ1aWxkaW5nKGV2ZW50KTsKKwkJCQkJYnJlYWs7CiAJCQkJCQogCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgOgotCQkJCQl0cnkgewotCQkJCQkJSmF2YU1vZGVsTWFuYWdlci5Jc1Jlc291cmNlVHJlZUxvY2tlZCA9IHRydWU7Ci0JCQkJCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJCQkJCUlKYXZhRWxlbWVudERlbHRhW10gdHJhbnNsYXRlZERlbHRhcyA9IHRoaXMucHJvY2Vzc1Jlc291cmNlRGVsdGEoZGVsdGEsIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCQkJCWlmICh0cmFuc2xhdGVkRGVsdGFzLmxlbmd0aCA+IDApIHsgCi0JCQkJCQkJCWZvciAoaW50IGk9IDA7IGkgPCB0cmFuc2xhdGVkRGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQl0aGlzLm1hbmFnZXIucmVnaXN0ZXJKYXZhTW9kZWxEZWx0YSh0cmFuc2xhdGVkRGVsdGFzW2ldKTsKKwkJCQkJaWYgKGlzQWZmZWN0ZWRCeShkZWx0YSkpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJaWYgKHRoaXMucmVmcmVzaGVkRWxlbWVudHMgIT0gbnVsbCkgeworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJY3JlYXRlRXh0ZXJuYWxBcmNoaXZlRGVsdGEobnVsbCk7CisJCQkJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJCQkJCQl9CiAJCQkJCQkJfQorCQkJCQkJCUlKYXZhRWxlbWVudERlbHRhIHRyYW5zbGF0ZWREZWx0YSA9IHRoaXMucHJvY2Vzc1Jlc291cmNlRGVsdGEoZGVsdGEpOworCQkJCQkJCWlmICh0cmFuc2xhdGVkRGVsdGEgIT0gbnVsbCkgeyAKKwkJCQkJCQkJdGhpcy5tYW5hZ2VyLnJlZ2lzdGVySmF2YU1vZGVsRGVsdGEodHJhbnNsYXRlZERlbHRhKTsKKwkJCQkJCQl9CiAJCQkJCQkJdGhpcy5tYW5hZ2VyLmZpcmUobnVsbCwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQkJCQl9CQkKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCS8vIHdvcmthcm91bmQgZm9yIGJ1ZyAxNTE2OCBjaXJjdWxhciBlcnJvcnMgbm90IHJlcG9ydGVkIAotCQkJCQkJdGhpcy5tYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID0gbnVsbDsKLQkJCQkJCUphdmFNb2RlbE1hbmFnZXIuSXNSZXNvdXJjZVRyZWVMb2NrZWQgPSBmYWxzZTsKKwkJCQkJCX0gZmluYWxseSB7CisJCQkJCQkJLy8gd29ya2Fyb3VuZCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQgCisJCQkJCQkJdGhpcy5tYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID0gbnVsbDsKKwkJCQkJCQl0aGlzLnJlbW92ZWRSb290cyA9IG51bGw7CisJCQkJCQl9CiAJCQkJCX0KIAkJCX0KIAkJfQogCX0KKwkvKgorCSAqIEZpbmRzIHRoZSByb290IGluZm8gdGhpcyBwYXRoIGlzIGluY2x1ZGVkIGluLgorCSAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuCisJICovCisJUm9vdEluZm8gZW5jbG9zaW5nUm9vdEluZm8oSVBhdGggcGF0aCwgaW50IGtpbmQpIHsKKwkJd2hpbGUgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgeworCQkJUm9vdEluZm8gcm9vdEluZm8gPSAgdGhpcy5yb290SW5mbyhwYXRoLCBraW5kKTsKKwkJCWlmIChyb290SW5mbyAhPSBudWxsKSByZXR1cm4gcm9vdEluZm87CisJCQlwYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCS8qCisJICogUmV0dXJucyB0aGUgcm9vdCBpbmZvIGZvciB0aGUgZ2l2ZW4gcGF0aC4gTG9vayBpbiB0aGUgb2xkIHJvb3RzIHRhYmxlIGlmIGtpbmQgaXMgUkVNT1ZFRC4KKwkgKi8KKwlSb290SW5mbyByb290SW5mbyhJUGF0aCBwYXRoLCBpbnQga2luZCkgeworCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQlyZXR1cm4gKFJvb3RJbmZvKXRoaXMub2xkUm9vdHMuZ2V0KHBhdGgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIChSb290SW5mbyl0aGlzLnJvb3RzLmdldChwYXRoKTsKKwkJfQorCX0KKwkvKgorCSAqIFJldHVybnMgdGhlIG90aGVyIHJvb3QgaW5mb3MgZm9yIHRoZSBnaXZlbiBwYXRoLiBMb29rIGluIHRoZSBvbGQgb3RoZXIgcm9vdHMgdGFibGUgaWYga2luZCBpcyBSRU1PVkVELgorCSAqLworCUFycmF5TGlzdCBvdGhlclJvb3RzSW5mbyhJUGF0aCBwYXRoLCBpbnQga2luZCkgeworCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisJCQlyZXR1cm4gKEFycmF5TGlzdCl0aGlzLm9sZE90aGVyUm9vdHMuZ2V0KHBhdGgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIChBcnJheUxpc3QpdGhpcy5vdGhlclJvb3RzLmdldChwYXRoKTsKKwkJfQorCX0JCiAKIAkvKioKIAkgKiBDb252ZXJ0cyBhbiA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4gYW5kIGl0cyBjaGlsZHJlbiBpbnRvCiAJICogdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SUphdmFFbGVtZW50RGVsdGE8L2NvZGU+cy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGVsdGEgY29ycmVzcG9uZHMgdG8gYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotCSAqIElmIGl0IGlzIG5vdCBhIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGgsIGl0IHdpbGwgYmUgYWRkZWQgYXMgYSBub24tamF2YQorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkZWx0YSBjb3JyZXNwb25kcyB0byBhIGphdmEgZWxlbWVudC4KKwkgKiBJZiBpdCBpcyBub3QgYSBqYXZhIGVsZW1lbnQsIGl0IHdpbGwgYmUgYWRkZWQgYXMgYSBub24tamF2YQogCSAqIHJlc291cmNlIGJ5IHRoZSBzZW5kZXIgb2YgdGhpcyBtZXRob2QuCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gdHJhdmVyc2VEZWx0YSgKIAkJSVJlc291cmNlRGVsdGEgZGVsdGEsIAogCQlpbnQgZWxlbWVudFR5cGUsIAotCQlJSmF2YVByb2plY3QgY3VycmVudFByb2plY3QsCi0JCUlQYXRoIGN1cnJlbnRPdXRwdXQsCi0JCWludCBvdXRwdXRUcmF2ZXJzZU1vZGUpIHsKKwkJUm9vdEluZm8gcm9vdEluZm8sCisJCU91dHB1dHNJbmZvIG91dHB1dHNJbmZvKSB7CiAJCQkKIAkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCisJCS8vIHNldCBzdGFjayBvZiBlbGVtZW50cworCQlpZiAodGhpcy5jdXJyZW50RWxlbWVudCA9PSBudWxsICYmIHJvb3RJbmZvICE9IG51bGwpIHsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpcm9vdEluZm8ucHJvamVjdDsKKwkJfQogCQkKIAkJLy8gcHJvY2VzcyBjdXJyZW50IGRlbHRhCiAJCWJvb2xlYW4gcHJvY2Vzc0NoaWxkcmVuID0gdHJ1ZTsKLQkJaWYgKGN1cnJlbnRQcm9qZWN0ICE9IG51bGwgfHwgcmVzIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50ID09IG51bGwgfHwgIXRoaXMuY3VycmVudEVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5lcXVhbHMoY3VycmVudFByb2plY3QpKSB7Ci0JCQkJLy8gZm9yY2UgdGhlIGN1cnJlbnRQcm9qZWN0IHRvIGJlIHVzZWQKLQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gKE9wZW5hYmxlKWN1cnJlbnRQcm9qZWN0OwotCQkJfQotCQkJdHJ5IHsKLQkJCQlwcm9jZXNzQ2hpbGRyZW4gPSB0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KGRlbHRhLCBlbGVtZW50VHlwZSwgY3VycmVudFByb2plY3QpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub24gamF2YSByZXNvdXJjZSBvciBpbnZhbGlkIHByb2plY3QKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CisJCWlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworCQkJcHJvY2Vzc0NoaWxkcmVuID0gCisJCQkJdGhpcy51cGRhdGVDdXJyZW50RGVsdGFBbmRJbmRleCgKKwkJCQkJZGVsdGEsIAorCQkJCQllbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UID8gCisJCQkJCQlJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDogLy8gY2FzZSBvZiBwcmo9c3JjCisJCQkJCQllbGVtZW50VHlwZSwgCisJCQkJCXJvb3RJbmZvKTsKKwkJfSBlbHNlIGlmIChyb290SW5mbyAhPSBudWxsKSB7CisJCQlwcm9jZXNzQ2hpbGRyZW4gPSB0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KGRlbHRhLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOwogCQl9IGVsc2UgewogCQkJLy8gbm90IHlldCBpbnNpZGUgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QKIAkJCXByb2Nlc3NDaGlsZHJlbiA9IHRydWU7CiAJCX0KIAkJCi0JCS8vIGdldCB0aGUgcHJvamVjdCdzIG91dHB1dCBsb2NhdGlvbgotCQlpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlKYXZhUHJvamVjdCBwcm9qID0KLQkJCQkJY3VycmVudFByb2plY3QgPT0gbnVsbCA/Ci0JCQkJCQkoSUphdmFQcm9qZWN0KXRoaXMuY3JlYXRlRWxlbWVudChyZXMuZ2V0UHJvamVjdCgpLCBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNULCBudWxsKSA6Ci0JCQkJCQljdXJyZW50UHJvamVjdDsKLQkJCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRPdXRwdXQgPSBwcm9qLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwcm9qLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmVxdWFscyhjdXJyZW50T3V0cHV0KSl7IC8vIGNhc2Ugb2YgcHJvaj09YmluPT1zcmMKLQkJCQkJCW91dHB1dFRyYXZlcnNlTW9kZSA9IFNPVVJDRTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNoZWNrIGNhc2Ugb2Ygc3JjPT1iaW4KLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2ouZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJCQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKGN1cnJlbnRPdXRwdXQpKSB7Ci0JCQkJCQkJCW91dHB1dFRyYXZlcnNlTW9kZSA9IChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgPyBTT1VSQ0UgOiBCSU5BUlk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQorCQkvLyBnZXQgdGhlIHByb2plY3QncyBvdXRwdXQgbG9jYXRpb25zIGFuZCB0cmF2ZXJzZSBtb2RlCisJCWlmIChvdXRwdXRzSW5mbyA9PSBudWxsKSBvdXRwdXRzSW5mbyA9IHRoaXMub3V0cHV0c0luZm8ocm9vdEluZm8sIHJlcyk7CisJCiAJCS8vIHByb2Nlc3MgY2hpbGRyZW4gaWYgbmVlZGVkCiAJCWlmIChwcm9jZXNzQ2hpbGRyZW4pIHsKIAkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CiAJCQlib29sZWFuIG9uZUNoaWxkT25DbGFzc3BhdGggPSBmYWxzZTsKIAkJCWludCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIG9ycGhhbkNoaWxkcmVuID0gbmV3IElSZXNvdXJjZURlbHRhW2xlbmd0aF07CisJCQlJUmVzb3VyY2VEZWx0YVtdIG9ycGhhbkNoaWxkcmVuID0gbnVsbDsKIAkJCU9wZW5hYmxlIHBhcmVudCA9IG51bGw7CiAJCQlib29sZWFuIGlzVmFsaWRQYXJlbnQgPSB0cnVlOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCUlSZXNvdXJjZURlbHRhIGNoaWxkID0gY2hpbGRyZW5baV07CiAJCQkJSVJlc291cmNlIGNoaWxkUmVzID0gY2hpbGQuZ2V0UmVzb3VyY2UoKTsKLQkJCQlJUGF0aCBjaGlsZFBhdGggPSBjaGlsZFJlcy5nZXRGdWxsUGF0aCgpOwotCisJCisJCQkJLy8gY2hlY2sgc291cmNlIGF0dGFjaG1lbnQgY2hhbmdlCisJCQkJdGhpcy5jaGVja1NvdXJjZUF0dGFjaG1lbnRDaGFuZ2UoY2hpbGQsIGNoaWxkUmVzKTsKKwkJCQkKIAkJCQkvLyBmaW5kIG91dCB3aGV0aGVyIHRoZSBjaGlsZCBpcyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiB0aGUgY3VycmVudCBwcm9qZWN0Ci0JCQkJSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QgPSAoSUphdmFQcm9qZWN0KXRoaXMucm9vdHMuZ2V0KGNoaWxkUGF0aCk7Ci0JCQkJYm9vbGVhbiBpc1BrZ0ZyYWdtZW50Um9vdCA9IAotCQkJCQlwcm9qZWN0T2ZSb290ICE9IG51bGwgCi0JCQkJCSYmIChwcm9qZWN0T2ZSb290LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YoY2hpbGRQYXRoKSk7CisJCQkJSVBhdGggY2hpbGRQYXRoID0gY2hpbGRSZXMuZ2V0RnVsbFBhdGgoKTsKKwkJCQlpbnQgY2hpbGRLaW5kID0gY2hpbGQuZ2V0S2luZCgpOworCQkJCVJvb3RJbmZvIGNoaWxkUm9vdEluZm8gPSB0aGlzLnJvb3RJbmZvKGNoaWxkUGF0aCwgY2hpbGRLaW5kKTsKKwkJCQlpZiAoY2hpbGRSb290SW5mbyAhPSBudWxsICYmICFjaGlsZFJvb3RJbmZvLmlzUm9vdE9mUHJvamVjdChjaGlsZFBhdGgpKSB7CisJCQkJCS8vIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiBhbm90aGVyIHByb2plY3QgKGRlYWx0IHdpdGggbGF0ZXIpCisJCQkJCWNoaWxkUm9vdEluZm8gPSBudWxsOworCQkJCX0KKwkJCQkKKwkJCQkvLyBjb21wdXRlIGNoaWxkIHR5cGUKIAkJCQlpbnQgY2hpbGRUeXBlID0gCiAJCQkJCXRoaXMuZWxlbWVudFR5cGUoCiAJCQkJCQljaGlsZFJlcywgCi0JCQkJCQljaGlsZC5nZXRLaW5kKCksCi0JCQkJCQljaGlsZC5nZXRGbGFncygpLAorCQkJCQkJY2hpbGRLaW5kLAogCQkJCQkJZWxlbWVudFR5cGUsIAotCQkJCQkJaXNQa2dGcmFnbWVudFJvb3QpOwotCQkJCQotCQkJCS8vIGZpbHRlciBvdXQgY2hhbmdlcyBpbiBvdXRwdXQgbG9jYXRpb24KLQkJCQlpZiAoY3VycmVudE91dHB1dCAhPSBudWxsICYmIGN1cnJlbnRPdXRwdXQuaXNQcmVmaXhPZihjaGlsZFBhdGgpKSB7Ci0JCQkJCWlmIChvdXRwdXRUcmF2ZXJzZU1vZGUgIT0gSUdOT1JFKSB7Ci0JCQkJCQkvLyBjYXNlIG9mIGJpbj1zcmMKLQkJCQkJCWlmIChvdXRwdXRUcmF2ZXJzZU1vZGUgPT0gU09VUkNFICYmIGNoaWxkVHlwZSA9PSBJSmF2YUVsZW1lbnQuQ0xBU1NfRklMRSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJLy8gY2FzZSBvZiAuY2xhc3MgZmlsZSB1bmRlciBwcm9qZWN0IGFuZCBubyBzb3VyY2UgZm9sZGVyCi0JCQkJCQkvLyBwcm9qPWJpbgotCQkJCQkJaWYgKGNoaWxkVHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIAotCQkJCQkJCSYmIGNoaWxkUmVzIGluc3RhbmNlb2YgSUZpbGUgCi0JCQkJCQkJJiYgVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShjaGlsZFJlcy5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJY29udGludWU7CisJCQkJCQlyb290SW5mbyA9PSBudWxsID8gY2hpbGRSb290SW5mbyA6IHJvb3RJbmZvCisJCQkJCSk7CisJCQkJCQkKKwkJCQkvLyBpcyBjaGlsZFJlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBhbmQgaXMgaXQgZmlsdGVyZWQgb3V0ID8KKwkJCQlib29sZWFuIGlzUmVzRmlsdGVyZWRGcm9tT3V0cHV0ID0gdGhpcy5pc1Jlc0ZpbHRlcmVkRnJvbU91dHB1dChvdXRwdXRzSW5mbywgY2hpbGRSZXMsIGNoaWxkVHlwZSk7CisKKwkJCQlib29sZWFuIGlzTmVzdGVkUm9vdCA9IHJvb3RJbmZvICE9IG51bGwgJiYgY2hpbGRSb290SW5mbyAhPSBudWxsOworCQkJCWlmICghaXNSZXNGaWx0ZXJlZEZyb21PdXRwdXQgCisJCQkJCQkmJiAhaXNOZXN0ZWRSb290KSB7IC8vIGRvIG5vdCB0cmVhdCBhcyBub24tamF2YSByc2MgaWYgbmVzdGVkIHJvb3QKKwkJCQkJaWYgKCF0aGlzLnRyYXZlcnNlRGVsdGEoY2hpbGQsIGNoaWxkVHlwZSwgcm9vdEluZm8gPT0gbnVsbCA/IGNoaWxkUm9vdEluZm8gOiByb290SW5mbywgb3V0cHV0c0luZm8pKSB7IC8vIHRyYXZlcnNlIGRlbHRhIGZvciBjaGlsZCBpbiB0aGUgc2FtZSBwcm9qZWN0CisJCQkJCQkvLyBpdCBpcyBhIG5vbi1qYXZhIHJlc291cmNlCisJCQkJCQl0cnkgeworCQkJCQkJCWlmIChyb290SW5mbyAhPSBudWxsKSB7IC8vIGlmIGluc2lkZSBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorCQkJCQkJCQlpZiAoIWlzVmFsaWRQYXJlbnQpIGNvbnRpbnVlOyAKKwkJCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQkJCQkJCQkvLyBmaW5kIHRoZSBwYXJlbnQgb2YgdGhlIG5vbi1qYXZhIHJlc291cmNlIHRvIGF0dGFjaCB0bworCQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCAKKwkJCQkJCQkJCQkJfHwgIXRoaXMuY3VycmVudEVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5lcXVhbHMocm9vdEluZm8ucHJvamVjdCkpIHsKKwkJCQkJCQkJCQkvLyBmb3JjZSB0aGUgY3VycmVudFByb2plY3QgdG8gYmUgdXNlZAorCQkJCQkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoT3BlbmFibGUpcm9vdEluZm8ucHJvamVjdDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCisJCQkJCQkJCQkJfHwgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgCisJCQkJCQkJCQkJCSYmIHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KSkgeyAKKwkJCQkJCQkJCQkvLyBOQjogYXR0YWNoIG5vbi1qYXZhIHJlc291cmNlIHRvIHByb2plY3QgKG5vdCB0byBpdHMgcGFja2FnZSBmcmFnbWVudCByb290KQorCQkJCQkJCQkJCXBhcmVudCA9IChPcGVuYWJsZSlyb290SW5mby5wcm9qZWN0OworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQlwYXJlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQocmVzLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCQkJCQkJCQkJaXNWYWxpZFBhcmVudCA9IGZhbHNlOworCQkJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8vIGFkZCBjaGlsZCBhcyBub24gamF2YSByZXNvdXJjZQorCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzQ2hhbmdlZChwYXJlbnQsIGNoaWxkKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyB0aGUgbm9uLWphdmEgcmVzb3VyY2UgKG9yIGl0cyBwYXJlbnQgZm9sZGVyKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBqYXZhIHByb2plY3QKKwkJCQkJCQkJaWYgKG9ycGhhbkNoaWxkcmVuID09IG51bGwpIG9ycGhhbkNoaWxkcmVuID0gbmV3IElSZXNvdXJjZURlbHRhW2xlbmd0aF07CisJCQkJCQkJCW9ycGhhbkNoaWxkcmVuW2ldID0gY2hpbGQ7CisJCQkJCQkJfQorCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIHRyYXZlcnNlIGRlbHRhIGZvciBjaGlsZCBpbiB0aGUgc2FtZSBwcm9qZWN0Ci0JCQkJaWYgKGNoaWxkVHlwZSA9PSAtMQotCQkJCQl8fCAhdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBjaGlsZFR5cGUsIChjdXJyZW50UHJvamVjdCA9PSBudWxsICYmIGlzUGtnRnJhZ21lbnRSb290KSA/IHByb2plY3RPZlJvb3QgOiBjdXJyZW50UHJvamVjdCwgY3VycmVudE91dHB1dCwgb3V0cHV0VHJhdmVyc2VNb2RlKSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGN1cnJlbnRQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIWlzVmFsaWRQYXJlbnQpIGNvbnRpbnVlOyAKLQkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkJCQkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPT0gbnVsbCB8fCAhdGhpcy5jdXJyZW50RWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmVxdWFscyhjdXJyZW50UHJvamVjdCkpIHsKLQkJCQkJCQkJCS8vIGZvcmNlIHRoZSBjdXJyZW50UHJvamVjdCB0byBiZSB1c2VkCi0JCQkJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50ID0gKE9wZW5hYmxlKWN1cnJlbnRQcm9qZWN0OwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCi0JCQkJCQkJCQl8fCAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCAmJiByZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsgCi0JCQkJCQkJCQkvLyBOQjogYXR0YWNoIG5vbi1qYXZhIHJlc291cmNlIHRvIHByb2plY3QgKG5vdCB0byBpdHMgcGFja2FnZSBmcmFnbWVudCByb290KQotCQkJCQkJCQkJcGFyZW50ID0gKE9wZW5hYmxlKWN1cnJlbnRQcm9qZWN0OwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcGFyZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KHJlcywgZWxlbWVudFR5cGUsIGN1cnJlbnRQcm9qZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkJCQkJCWlzVmFsaWRQYXJlbnQgPSBmYWxzZTsKLQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGFkZCBjaGlsZCBhcyBub24gamF2YSByZXNvdXJjZQotCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDaGFuZ2VkKHBhcmVudCwgY2hpbGQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlvcnBoYW5DaGlsZHJlbltpXSA9IGNoaWxkOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkJb25lQ2hpbGRPbkNsYXNzcGF0aCA9IHRydWU7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlvbmVDaGlsZE9uQ2xhc3NwYXRoID0gdHJ1ZTsKKwkJCQkJb25lQ2hpbGRPbkNsYXNzcGF0aCA9IHRydWU7IC8vIHRvIGF2b2lkIHJlcG9ydGluZyBjaGlsZCBkZWx0YSBhcyBub24tamF2YSByZXNvdXJjZSBkZWx0YQogCQkJCX0KLQkJCQkKLQkJCQkvLyBpZiBjaGlsZCBpcyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiBhbm90aGVyIHByb2plY3QsIHRyYXZlcnNlIGRlbHRhIHRvbwotCQkJCWlmIChwcm9qZWN0T2ZSb290ICE9IG51bGwgJiYgIWlzUGtnRnJhZ21lbnRSb290KSB7Ci0JCQkJCXRoaXMudHJhdmVyc2VEZWx0YShjaGlsZCwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcHJvamVjdE9mUm9vdCwgbnVsbCwgSUdOT1JFKTsgLy8gYmluYXJ5IG91dHB1dCBvZiBwcm9qZWN0T2ZSb290IGNhbm5vdCBiZSB0aGlzIHJvb3QKKwkJCQkJCQkJCisJCQkJLy8gaWYgY2hpbGQgaXMgYSBuZXN0ZWQgcm9vdCAKKwkJCQkvLyBvciBpZiBpdCBpcyBub3QgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2YgdGhlIGN1cnJlbnQgcHJvamVjdAorCQkJCS8vIGJ1dCBpdCBpcyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBvZiBhbm90aGVyIHByb2plY3QsIHRyYXZlcnNlIGRlbHRhIHRvbworCQkJCWlmIChpc05lc3RlZFJvb3QgCisJCQkJCQl8fCAoY2hpbGRSb290SW5mbyA9PSBudWxsICYmIChjaGlsZFJvb3RJbmZvID0gdGhpcy5yb290SW5mbyhjaGlsZFBhdGgsIGNoaWxkS2luZCkpICE9IG51bGwpKSB7CisJCQkJCXRoaXMudHJhdmVyc2VEZWx0YShjaGlsZCwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgY2hpbGRSb290SW5mbywgbnVsbCk7IC8vIGJpbmFyeSBvdXRwdXQgb2YgY2hpbGRSb290SW5mby5wcm9qZWN0IGNhbm5vdCBiZSB0aGlzIHJvb3QKIAkJCQkJLy8gTkI6IE5vIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBhcyB0aGUgY2hpbGQgY2FuIG9ubHkgYmUgb24gdGhlIGNsYXNzcGF0aAogCQkJCX0KLQkJCQkKKwkKIAkJCQkvLyBpZiB0aGUgY2hpbGQgaXMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2Ygb25lIG9yIHNldmVyYWwgb3RoZXIgcHJvamVjdHMKLQkJCQlIYXNoU2V0IHNldDsKLQkJCQlpZiAoKHNldCA9IChIYXNoU2V0KXRoaXMub3RoZXJSb290cy5nZXQoY2hpbGRQYXRoKSkgIT0gbnVsbCkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBjdXJyZW50Um9vdCA9IAotCQkJCQkJKGN1cnJlbnRQcm9qZWN0ID09IG51bGwgPyAKLQkJCQkJCQlwcm9qZWN0T2ZSb290IDogCi0JCQkJCQkJY3VycmVudFByb2plY3QpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoY2hpbGRSZXMpOwotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworCQkJCUFycmF5TGlzdCByb290TGlzdDsKKwkJCQlpZiAoKHJvb3RMaXN0ID0gdGhpcy5vdGhlclJvb3RzSW5mbyhjaGlsZFBhdGgsIGNoaWxkS2luZCkpICE9IG51bGwpIHsKKwkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByb290TGlzdC5pdGVyYXRvcigpOwogCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IChJSmF2YVByb2plY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXRoaXMuY2xvbmVDdXJyZW50RGVsdGEocHJvamVjdCwgY3VycmVudFJvb3QpOworCQkJCQkJY2hpbGRSb290SW5mbyA9IChSb290SW5mbykgaXRlcmF0b3IubmV4dCgpOworCQkJCQkJdGhpcy50cmF2ZXJzZURlbHRhKGNoaWxkLCBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09ULCBjaGlsZFJvb3RJbmZvLCBudWxsKTsgLy8gYmluYXJ5IG91dHB1dCBvZiBjaGlsZFJvb3RJbmZvLnByb2plY3QgY2Fubm90IGJlIHRoaXMgcm9vdAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaWYgKG9uZUNoaWxkT25DbGFzc3BhdGggfHwgcmVzIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkvLyBhZGQgb3JwaGFuIGNoaWxkcmVuIChjYXNlIG9mIG5vbiBqYXZhIHJlc291cmNlcyB1bmRlciBwcm9qZWN0KQorCQkJaWYgKG9ycGhhbkNoaWxkcmVuICE9IG51bGwKKwkJCQkJJiYgKG9uZUNoaWxkT25DbGFzc3BhdGggLy8gb3JwaGFuIGNoaWxkcmVuIGFyZSBzaWJsaW5ncyBvZiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAorCQkJCQkJfHwgcmVzIGluc3RhbmNlb2YgSVByb2plY3QpKSB7IC8vIG5vbi1qYXZhIHJlc291cmNlIGRpcmVjdGx5IHVuZGVyIGEgcHJvamVjdAorCQkJCQkJCisJCQkJLy8gYXR0YWNoIG9ycGhhbiBjaGlsZHJlbgogCQkJCUlQcm9qZWN0IHJzY1Byb2plY3QgPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJCUphdmFQcm9qZWN0IGFkb3B0aXZlUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5nZXRKYXZhQ29yZSgpLmNyZWF0ZShyc2NQcm9qZWN0KTsKKwkJCQlKYXZhUHJvamVjdCBhZG9wdGl2ZVByb2plY3QgPSAoSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKHJzY1Byb2plY3QpOwogCQkJCWlmIChhZG9wdGl2ZVByb2plY3QgIT0gbnVsbCAKLQkJCQkJJiYgdGhpcy5oYXNKYXZhTmF0dXJlKHJzY1Byb2plY3QpKSB7IC8vIGRlbHRhIGlmZiBKYXZhIHByb2plY3QgKDE4Njk4KQorCQkJCQkJJiYgSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShyc2NQcm9qZWN0KSkgeyAvLyBkZWx0YSBpZmYgSmF2YSBwcm9qZWN0ICgxODY5OCkKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQkJaWYgKG9ycGhhbkNoaWxkcmVuW2ldICE9IG51bGwpIHsKIAkJCQkJCQl0cnkgewpAQCAtMTUyMywxMyArMTkyNCwxMiBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSAvLyBlbHNlIHJlc291cmNlIGRlbHRhIHdpbGwgYmUgYWRkZWQgYnkgcGFyZW50Ci0JCQlyZXR1cm4gaXNWYWxpZFBhcmVudCAmJiAoY3VycmVudFByb2plY3QgIT0gbnVsbCB8fCBvbmVDaGlsZE9uQ2xhc3NwYXRoKTsKKwkJCXJldHVybiBlbGVtZW50VHlwZSAhPSBOT05fSkFWQV9SRVNPVVJDRTsgLy8gVE9ETzogKGplcm9tZSkgZG8gd2Ugc3RpbGwgbmVlZCB0byByZXR1cm4/IChjaGVjayBjb3VsZCBiZSBkb25lIGJ5IGNhbGxlcikKIAkJfSBlbHNlIHsKLQkJCS8vIGlmIG5vdCBvbiBjbGFzc3BhdGggb3IgaWYgdGhlIGVsZW1lbnQgdHlwZSBpcyAtMSwgCi0JCQkvLyBpdCdzIGEgbm9uLWphdmEgcmVzb3VyY2UKLQkJCXJldHVybiBjdXJyZW50UHJvamVjdCAhPSBudWxsICYmIGVsZW1lbnRUeXBlICE9IC0xOworCQkJcmV0dXJuIGVsZW1lbnRUeXBlICE9IE5PTl9KQVZBX1JFU09VUkNFOwogCQl9CiAJfQorCiAJLyoqCiAJICogVXBkYXRlIHRoZSBjbGFzc3BhdGggbWFya2VycyBhbmQgY3ljbGUgbWFya2VycyBmb3IgdGhlIHByb2plY3RzIHRvIHVwZGF0ZS4KIAkgKi8KQEAgLTE1NjIsNiArMTk2MiwxMDQgQEAKIAkJfQogCX0KIAorCS8qCisJICogVXBkYXRlIHRoZSBjdXJyZW50IGRlbHRhIChpZS4gYWRkL3JlbW92ZS9jaGFuZ2UgdGhlIGdpdmVuIGVsZW1lbnQpIGFuZCB1cGRhdGUgdGhlIGNvcnJlcG9uZGluZyBpbmRleC4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBkZWx0YSBtdXN0IGJlIHByb2Nlc3NlZC4KKwkgKiBAdGhyb3dzIGEgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBkZWx0YSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBqYXZhIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuCisJICovCisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgZWxlbWVudFR5cGUsIFJvb3RJbmZvIHJvb3RJbmZvKSB7CisJCU9wZW5hYmxlIGVsZW1lbnQ7CisJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKKwkJCQlJUmVzb3VyY2UgZGVsdGFSZXMgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOworCQkJCWVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZGVsdGFSZXMsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQkvLyByZXNvdXJjZSBtaWdodCBiZSBjb250YWluaW5nIHNoYXJlZCByb290cyAoc2VlIGJ1ZyAxOTA1OCkKKwkJCQkJdGhpcy51cGRhdGVSb290cyhkZWx0YVJlcy5nZXRGdWxsUGF0aCgpLCBkZWx0YSk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJdGhpcy51cGRhdGVJbmRleChlbGVtZW50LCBkZWx0YSk7CisJCQkJdGhpcy5lbGVtZW50QWRkZWQoZWxlbWVudCwgZGVsdGEsIHJvb3RJbmZvKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCWRlbHRhUmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KGRlbHRhUmVzLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOworCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKKwkJCQkJLy8gcmVzb3VyY2UgbWlnaHQgYmUgY29udGFpbmluZyBzaGFyZWQgcm9vdHMgKHNlZSBidWcgMTkwNTgpCisJCQkJCXRoaXMudXBkYXRlUm9vdHMoZGVsdGFSZXMuZ2V0RnVsbFBhdGgoKSwgZGVsdGEpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXRoaXMudXBkYXRlSW5kZXgoZWxlbWVudCwgZGVsdGEpOworCQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoZWxlbWVudCwgZGVsdGEsIHJvb3RJbmZvKTsKKwkKKwkJCQlpZiAoZGVsdGFSZXMuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKXsJCQkKKwkJCQkJLy8gcmVzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBidWlsdCBzdGF0ZSwgc2luY2UgY2Fubm90IHJldXNlIGlmIGFkZGVkIGJhY2sKKwkJCQkJdGhpcy5tYW5hZ2VyLnNldExhc3RCdWlsdFN0YXRlKChJUHJvamVjdClkZWx0YVJlcywgbnVsbCAvKm5vIHN0YXRlKi8pOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7CisJCQkJaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDApIHsKKwkJCQkJLy8gY29udGVudCBoYXMgY2hhbmdlZAorCQkJCQllbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KGRlbHRhLmdldFJlc291cmNlKCksIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCQkJdGhpcy51cGRhdGVJbmRleChlbGVtZW50LCBkZWx0YSk7CisJCQkJCXRoaXMuY29udGVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOworCQkJCX0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgeworCQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgeworCQkJCQkJLy8gcHJvamVjdCBoYXMgYmVlbiBvcGVuZWQgb3IgY2xvc2VkCisJCQkJCQlJUHJvamVjdCByZXMgPSAoSVByb2plY3QpZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJCWVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQocmVzLCBlbGVtZW50VHlwZSwgcm9vdEluZm8pOworCQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCQkJCS8vIHJlc291cmNlIG1pZ2h0IGJlIGNvbnRhaW5pbmcgc2hhcmVkIHJvb3RzIChzZWUgYnVnIDE5MDU4KQorCQkJCQkJCXRoaXMudXBkYXRlUm9vdHMocmVzLmdldEZ1bGxQYXRoKCksIGRlbHRhKTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlpZiAocmVzLmlzT3BlbigpKSB7CisJCQkJCQkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocmVzKSkgeworCQkJCQkJCQl0aGlzLmVsZW1lbnRBZGRlZChlbGVtZW50LCBkZWx0YSwgcm9vdEluZm8pOworCQkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5pbmRleEFsbChyZXMpOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJSmF2YU1vZGVsIGphdmFNb2RlbCA9IHRoaXMubWFuYWdlci5nZXRKYXZhTW9kZWwoKTsKKwkJCQkJCQlib29sZWFuIHdhc0phdmFQcm9qZWN0ID0gamF2YU1vZGVsLmZpbmRKYXZhUHJvamVjdChyZXMpICE9IG51bGw7CisJCQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0KSB7CisJCQkJCQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoZWxlbWVudCwgZGVsdGEsIHJvb3RJbmZvKTsKKwkJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXhGYW1pbHkocmVzLmdldEZ1bGxQYXRoKCkpOworCQkJCQkJCQkKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIHdoZW4gYSBwcm9qZWN0IGlzIG9wZW4vY2xvc2VkIGRvbid0IHByb2Nlc3MgY2hpbGRyZW4KKwkJCQkJfQorCQkJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApIHsKKwkJCQkJCUlQcm9qZWN0IHJlcyA9IChJUHJvamVjdClkZWx0YS5nZXRSZXNvdXJjZSgpOworCQkJCQkJSmF2YU1vZGVsIGphdmFNb2RlbCA9IHRoaXMubWFuYWdlci5nZXRKYXZhTW9kZWwoKTsKKwkJCQkJCWJvb2xlYW4gd2FzSmF2YVByb2plY3QgPSBqYXZhTW9kZWwuZmluZEphdmFQcm9qZWN0KHJlcykgIT0gbnVsbDsKKwkJCQkJCWJvb2xlYW4gaXNKYXZhUHJvamVjdCA9IEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocmVzKTsKKwkJCQkJCWlmICh3YXNKYXZhUHJvamVjdCAhPSBpc0phdmFQcm9qZWN0KSB7CisJCQkJCQkJLy8gcHJvamVjdCdzIG5hdHVyZSBoYXMgYmVlbiBhZGRlZCBvciByZW1vdmVkCisJCQkJCQkJZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChyZXMsIGVsZW1lbnRUeXBlLCByb290SW5mbyk7CisJCQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBub3RlIGl0cyByZXNvdXJjZXMgYXJlIHN0aWxsIHZpc2libGUgYXMgcm9vdHMgdG8gb3RoZXIgcHJvamVjdHMKKwkJCQkJCQlpZiAoaXNKYXZhUHJvamVjdCkgeworCQkJCQkJCQl0aGlzLmVsZW1lbnRBZGRlZChlbGVtZW50LCBkZWx0YSwgcm9vdEluZm8pOworCQkJCQkJCQl0aGlzLmluZGV4TWFuYWdlci5pbmRleEFsbChyZXMpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXRoaXMuZWxlbWVudFJlbW92ZWQoZWxlbWVudCwgZGVsdGEsIHJvb3RJbmZvKTsKKwkJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJCQkJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXhGYW1pbHkocmVzLmdldEZ1bGxQYXRoKCkpOworCQkJCQkJCQkvLyByZXNldCB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IGJ1aWx0IHN0YXRlLCBzaW5jZSBjYW5ub3QgcmV1c2UgaWYgYWRkZWQgYmFjaworCQkJCQkJCQl0aGlzLm1hbmFnZXIuc2V0TGFzdEJ1aWx0U3RhdGUocmVzLCBudWxsIC8qbm8gc3RhdGUqLyk7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiBmYWxzZTsgLy8gd2hlbiBhIHByb2plY3QncyBuYXR1cmUgaXMgYWRkZWQvcmVtb3ZlZCBkb24ndCBwcm9jZXNzIGNoaWxkcmVuCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCiAJLyoqCiAJICogVHJhdmVyc2UgdGhlIHNldCBvZiBwcm9qZWN0cyB3aGljaCBoYXZlIGNoYW5nZWQgbmFtZXNwYWNlLCBhbmQgcmVmcmVzaCB0aGVpciBkZXBlbmRlbnRzCiAJICovCkBAIC0xNTg1LDEwMSArMjA4Myw2IEBACiAJCQl9CiAJCX0KIAl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBqYXZhIGVsZW1lbnQgdGhlIGdpdmVuIGRlbHRhIG1hdGNoZXMgdG8uCi0JICogUmV0dXJucyAtMSBpZiB1bmtub3duIChlLmcuIGEgbm9uLWphdmEgcmVzb3VyY2UuKQotCSAqLwotCXByaXZhdGUgaW50IGVsZW1lbnRUeXBlKElSZXNvdXJjZSByZXMsIGludCBraW5kLCBpbnQgZmxhZ3MsIGludCBwYXJlbnRUeXBlLCBib29sZWFuIGlzUGtnRnJhZ21lbnRSb290KSB7Ci0JCXN3aXRjaCAocGFyZW50VHlwZSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKLQkJCQlpZiAoa2luZCAhPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCS8vIGNoYW5nZSBvbiB0aGUgcHJvamVjdCBpdHNlbGYKLQkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q7Ci0JCQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSB7Ci0JCQkJCS8vIHByb2plY3QgaXMgb3BlbmVkIG9yIGNsb3NlZAotCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDsKLQkJCQl9IGVsc2UgaWYgKChmbGFncyAmIElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSAhPSAwKSB7Ci0JCQkJCQkvLyBwcm9qZWN0J3MgZGVzY3JpcHRpb24gaGFzIGNoYW5nZWQ6IG5lZWQgdG8gY2hlY2sgaWYgamF2YSBuYXR1cmUgaGFzIGNoYW5nZWQKLQkJCQkJCUlQcm9qZWN0IHByb2ogPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJCQkJYm9vbGVhbiB3YXNKYXZhUHJvamVjdCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmZpbmRKYXZhUHJvamVjdChwcm9qKSAhPSBudWxsOwotCQkJCQkJYm9vbGVhbiBpc0phdmFQcm9qZWN0ID0gdGhpcy5oYXNKYXZhTmF0dXJlKHByb2opOwotCQkJCQkJaWYgKHdhc0phdmFQcm9qZWN0ICE9IGlzSmF2YVByb2plY3QpIHsKLQkJCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVDsKLQkJCQkJCX0KLQkJCQl9IC8vIGVsc2Ugc2VlIGJlbG93Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkJaWYgKGlzUGtnRnJhZ21lbnRSb290KSB7Ci0JCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUOyAvLyBub3QgeWV0IGluIGEgcGFja2FnZSBmcmFnbWVudCByb290Ci0JCQkJfQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlpZiAoVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UocmVzLmdldE5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlcy5nZXROYW1lKCk7Ci0JCQkJCWlmIChVdGlsLmlzVmFsaWRDb21waWxhdGlvblVuaXROYW1lKGZpbGVOYW1lKSkgewotCQkJCQkJcmV0dXJuIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOwotCQkJCQl9IGVsc2UgaWYgKFV0aWwuaXNWYWxpZENsYXNzRmlsZU5hbWUoZmlsZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU7Ci0JCQkJCX0gZWxzZSBpZiAodGhpcy5yb290cy5nZXQocmVzLmdldEZ1bGxQYXRoKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGNhc2Ugb2YgcHJvaj1zcmM9YmluIGFuZCByZXNvdXJjZSBpcyBhIGphciBmaWxlIG9uIHRoZSBjbGFzc3BhdGgKLQkJCQkJCXJldHVybiBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJvb3RzKElKYXZhTW9kZWwgbW9kZWwpIHsKLQl0aGlzLnJvb3RzID0gbmV3IEhhc2hNYXAoKTsKLQl0aGlzLm90aGVyUm9vdHMgPSBuZXcgSGFzaE1hcCgpOwotCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOwotCXRyeSB7Ci0JCXByb2plY3RzID0gKChKYXZhTW9kZWwpbW9kZWwpLmdldE9sZEphdmFQcm9qZWN0c0xpc3QoKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lCi0JCXJldHVybjsKLQl9Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKLQkJdHJ5IHsKLQkJCWNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb250aW51ZSB3aXRoIG5leHQgcHJvamVjdAotCQkJY29udGludWU7Ci0JCX0KLQkJZm9yIChpbnQgaj0gMCwgY2xhc3NwYXRoTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaiA8IGNsYXNzcGF0aExlbmd0aDsgaisrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbal07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSBjb250aW51ZTsKLQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQlpZiAodGhpcy5yb290cy5nZXQocGF0aCkgPT0gbnVsbCkgewotCQkJCXRoaXMucm9vdHMucHV0KHBhdGgsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQlIYXNoU2V0IHNldCA9IChIYXNoU2V0KXRoaXMub3RoZXJSb290cy5nZXQocGF0aCk7Ci0JCQkJaWYgKHNldCA9PSBudWxsKSB7Ci0JCQkJCXNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCXRoaXMub3RoZXJSb290cy5wdXQocGF0aCwgc2V0KTsKLQkJCQl9Ci0JCQkJc2V0LmFkZChwcm9qZWN0KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHJpdmF0ZSBib29sZWFuIGlzT25DbGFzc3BhdGgoSVBhdGggcGF0aCkgewotCXJldHVybiB0aGlzLnJvb3RzLmdldChwYXRoKSAhPSBudWxsOwotfQogCiBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmRleChPcGVuYWJsZSBlbGVtZW50LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewogCkBAIC0xNjkzLDggKzIwOTYsOCBAQAogCQkJCQl0aGlzLmluZGV4TWFuYWdlci5pbmRleEFsbChlbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJdGhpcy5pbmRleE1hbmFnZXIuZGlzY2FyZEpvYnMoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKIAkJCQkJdGhpcy5pbmRleE1hbmFnZXIucmVtb3ZlSW5kZXhGYW1pbHkoZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKKwkJCQkJLy8gTkI6IERpc2NhcmRpbmcgaW5kZXggam9icyBiZWxvbmdpbmcgdG8gdGhpcyBwcm9qZWN0IHdhcyBkb25lIGR1cmluZyBQUkVfREVMRVRFCiAJCQkJCWJyZWFrOwogCQkJCS8vIE5COiBVcGRhdGUgb2YgaW5kZXggaWYgcHJvamVjdCBpcyBvcGVuZWQsIGNsb3NlZCwgb3IgaXRzIGphdmEgbmF0dXJlIGlzIGFkZGVkIG9yIHJlbW92ZWQKIAkJCQkvLyAgICAgaXMgZG9uZSBpbiB1cGRhdGVDdXJyZW50RGVsdGFBbmRJbmRleApAQCAtMTc0OCwxMiArMjE1MSwxMiBAQAogCQkJCQkJSVJlc291cmNlRGVsdGEgY2hpbGQgPSBjaGlsZHJlbltpXTsKIAkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkLmdldFJlc291cmNlKCk7CiAJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCQkJaWYgKCJqYXZhIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlPcGVuYWJsZSBjdSA9IChPcGVuYWJsZSlwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCQkJCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUobmFtZSkpIHsKKwkJCQkJCQkJT3BlbmFibGUgY3UgPSAoT3BlbmFibGUpcGtnLmdldENvbXBpbGF0aW9uVW5pdChuYW1lKTsKIAkJCQkJCQkJdGhpcy51cGRhdGVJbmRleChjdSwgY2hpbGQpOwotCQkJCQkJCX0gZWxzZSBpZiAoImNsYXNzIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlPcGVuYWJsZSBjbGFzc0ZpbGUgPSAoT3BlbmFibGUpcGtnLmdldENsYXNzRmlsZShyZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQkJCX0gZWxzZSBpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUobmFtZSkpIHsKKwkJCQkJCQkJT3BlbmFibGUgY2xhc3NGaWxlID0gKE9wZW5hYmxlKXBrZy5nZXRDbGFzc0ZpbGUobmFtZSk7CiAJCQkJCQkJCXRoaXMudXBkYXRlSW5kZXgoY2xhc3NGaWxlLCBjaGlsZCk7CiAJCQkJCQkJfQogCQkJCQkJfQpAQCAtMTgyNywyNSArMjIzMCwzNCBAQAogICogVXBkYXRlIHRoZSByb290cyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUgYWRkaXRpb24gb3IgdGhlIHJlbW92YWwgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciByZXNvdXJjZS4KICAqLwogcHJpdmF0ZSB2b2lkIHVwZGF0ZVJvb3RzKElQYXRoIGNvbnRhaW5lclBhdGgsIElSZXNvdXJjZURlbHRhIGNvbnRhaW5lckRlbHRhKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLnJvb3RzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJTWFwIHJvb3RzOworCU1hcCBvdGhlclJvb3RzOworCWlmIChjb250YWluZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQlyb290cyA9IHRoaXMub2xkUm9vdHM7CisJCW90aGVyUm9vdHMgPSB0aGlzLm9sZE90aGVyUm9vdHM7CisJfSBlbHNlIHsKKwkJcm9vdHMgPSB0aGlzLnJvb3RzOworCQlvdGhlclJvb3RzID0gdGhpcy5vdGhlclJvb3RzOworCX0KKwlJdGVyYXRvciBpdGVyYXRvciA9IHJvb3RzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogCQlJUGF0aCBwYXRoID0gKElQYXRoKWl0ZXJhdG9yLm5leHQoKTsKIAkJaWYgKGNvbnRhaW5lclBhdGguaXNQcmVmaXhPZihwYXRoKSAmJiAhY29udGFpbmVyUGF0aC5lcXVhbHMocGF0aCkpIHsKIAkJCUlSZXNvdXJjZURlbHRhIHJvb3REZWx0YSA9IGNvbnRhaW5lckRlbHRhLmZpbmRNZW1iZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKIAkJCWlmIChyb290RGVsdGEgPT0gbnVsbCkgY29udGludWU7Ci0JCQlJSmF2YVByb2plY3Qgcm9vdFByb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMucm9vdHMuZ2V0KHBhdGgpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdFByb2plY3QpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCVJvb3RJbmZvIHJvb3RJbmZvID0gKFJvb3RJbmZvKXJvb3RzLmdldChwYXRoKTsKKworCQkJaWYgKCFyb290SW5mby5wcm9qZWN0LmdldFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpKSB7IC8vIG9ubHkgY29uc2lkZXIgcm9vdHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBjb250YWluZXIKKwkJCQl0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdEluZm8pOwogCQkJfQotCQkJSGFzaFNldCBzZXQgPSAoSGFzaFNldCl0aGlzLm90aGVyUm9vdHMuZ2V0KHBhdGgpOwotCQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3Igb3RoZXJQcm9qZWN0cyA9IHNldC5pdGVyYXRvcigpOworCQkJCisJCQlBcnJheUxpc3Qgcm9vdExpc3QgPSAoQXJyYXlMaXN0KW90aGVyUm9vdHMuZ2V0KHBhdGgpOworCQkJaWYgKHJvb3RMaXN0ICE9IG51bGwpIHsKKwkJCQlJdGVyYXRvciBvdGhlclByb2plY3RzID0gcm9vdExpc3QuaXRlcmF0b3IoKTsKIAkJCQl3aGlsZSAob3RoZXJQcm9qZWN0cy5oYXNOZXh0KCkpIHsKLQkJCQkJcm9vdFByb2plY3QgPSAoSUphdmFQcm9qZWN0KW90aGVyUHJvamVjdHMubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJdGhpcy51cGRhdGVDdXJyZW50RGVsdGFBbmRJbmRleChyb290RGVsdGEsIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QsIHJvb3RQcm9qZWN0KTsKLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcm9vdEluZm8gPSAoUm9vdEluZm8pb3RoZXJQcm9qZWN0cy5uZXh0KCk7CisJCQkJCWlmICghcm9vdEluZm8ucHJvamVjdC5nZXRQYXRoKCkuaXNQcmVmaXhPZihwYXRoKSkgeyAvLyBvbmx5IGNvbnNpZGVyIHJvb3RzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29udGFpbmVyCisJCQkJCQl0aGlzLnVwZGF0ZUN1cnJlbnREZWx0YUFuZEluZGV4KHJvb3REZWx0YSwgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcm9vdEluZm8pOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMTg1Myw0ICsyMjY1LDQgQEAKIAl9CiB9CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZXN0cm95V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0Rlc3Ryb3lXb3JraW5nQ29weU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDY2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9EZXN0cm95V29ya2luZ0NvcHlPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogRGVzdHJveXMgYSB3b3JraW5nIGNvcHkgKHJlbW92ZSBpdCBmcm9tIGl0cyBjYWNoZSBpZiBpdCBpcyBzaGFyZWQpCisgKiBhbmQgc2lnbmFsIGl0cyByZW1vdmFsIHRocm91Z2ggYSBkZWx0YS4KKyAqLworcHVibGljIGNsYXNzIERlc3Ryb3lXb3JraW5nQ29weU9wZXJhdGlvbiBleHRlbmRzIEphdmFNb2RlbE9wZXJhdGlvbiB7CisJCisJcHVibGljIERlc3Ryb3lXb3JraW5nQ29weU9wZXJhdGlvbihJSmF2YUVsZW1lbnQgd29ya2luZ0NvcHkpIHsKKwkJc3VwZXIobmV3IElKYXZhRWxlbWVudFtdIHt3b3JraW5nQ29weX0pOworCX0KKwkvKioKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBzZXR0aW5nIHRoZSBzb3VyY2UKKwkgKiAJb2YgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgZmFpbHMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gZ2V0V29ya2luZ0NvcHkoKTsKKwkJd29ya2luZ0NvcHkuY2xvc2UoKTsKKwkJCisJCS8vIGlmIG9yaWdpbmFsIGVsZW1lbnQgaXMgbm90IG9uIGNsYXNzcGF0aCBmbHVzaCBpdCBmcm9tIHRoZSBjYWNoZSAKKwkJSUphdmFFbGVtZW50IG9yaWdpbmFsRWxlbWVudCA9IHdvcmtpbmdDb3B5LmdldE9yaWdpbmFsRWxlbWVudCgpOworCQlpZiAoIXdvcmtpbmdDb3B5LmdldFBhcmVudCgpLmV4aXN0cygpKSB7CisJCQkoKENvbXBpbGF0aW9uVW5pdClvcmlnaW5hbEVsZW1lbnQpLmNsb3NlKCk7CisJCX0KKwkJCisJCS8vIHJlbW92ZSB3b3JraW5nIGNvcHkgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgc2hhcmVkCisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkKKwkJLy8gSW4gb3JkZXIgdG8gYmUgc2hhcmVkLCB3b3JraW5nIGNvcGllcyBoYXZlIHRvIGRlbm90ZSB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IAorCQkvLyBBTkQgdXNlIHRoZSBzYW1lIGJ1ZmZlciBmYWN0b3J5LgorCQkvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGxpdHRsZSBzZXQgb2YgYnVmZmVyIGZhY3RvcmllcywgdGhlbiB1c2UgYSAyIGxldmVsIE1hcCBjYWNoZS4KKwkJTWFwIHNoYXJlZFdvcmtpbmdDb3BpZXMgPSBtYW5hZ2VyLnNoYXJlZFdvcmtpbmdDb3BpZXM7CisJCQorCQlNYXAgcGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMgPSAoTWFwKSBzaGFyZWRXb3JraW5nQ29waWVzLmdldCh3b3JraW5nQ29weS5idWZmZXJGYWN0b3J5KTsKKwkJaWYgKHBlckZhY3RvcnlXb3JraW5nQ29waWVzICE9IG51bGwpeworCQkJaWYgKHBlckZhY3RvcnlXb3JraW5nQ29waWVzLnJlbW92ZShvcmlnaW5hbEVsZW1lbnQpICE9IG51bGwKKwkJCQkJJiYgQ29tcGlsYXRpb25Vbml0LlNIQVJFRF9XQ19WRVJCT1NFKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXN0cm95aW5nIHNoYXJlZCB3b3JraW5nIGNvcHkgIiArIHdvcmtpbmdDb3B5LnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJCisJCS8vIHJlcG9ydCByZW1vdmVkIGphdmEgZGVsdGEKKwkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHRoaXMuZ2V0SmF2YU1vZGVsKCkpOworCQlkZWx0YS5yZW1vdmVkKHdvcmtpbmdDb3B5KTsKKwkJYWRkRGVsdGEoZGVsdGEpOworCQlyZW1vdmVSZWNvbmNpbGVEZWx0YSh3b3JraW5nQ29weSk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSB0aGlzIG9wZXJhdGlvbiBpcyB3b3JraW5nIG9uLgorCSAqLworCXByb3RlY3RlZCBXb3JraW5nQ29weSBnZXRXb3JraW5nQ29weSgpIHsKKwkJcmV0dXJuIChXb3JraW5nQ29weSlnZXRFbGVtZW50VG9Qcm9jZXNzKCk7CisJfQorCS8qKgorCSAqIEBzZWUgSmF2YU1vZGVsT3BlcmF0aW9uI2lzUmVhZE9ubHkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9FbGVtZW50Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0VsZW1lbnRDYWNoZS5qYXZhCmluZGV4IDJiMTY0ZWUuLjUyZTllYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0VsZW1lbnRDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0VsZW1lbnRDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9GYWlsZWRSZWNvbmNpbGlhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvRmFpbGVkUmVjb25jaWxpYXRpb25FeGNlcHRpb24uamF2YQppbmRleCA1MDIzMThkLi4yNDdmNDVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9GYWlsZWRSZWNvbmNpbGlhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ZhaWxlZFJlY29uY2lsaWF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogcHVibGljIGNsYXNzIEZhaWxlZFJlY29uY2lsaWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9IYW5kbGVGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9IYW5kbGVGYWN0b3J5LmphdmEKaW5kZXggMmVhMzY0NC4uNWJjOGI0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSGFuZGxlRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0hhbmRsZUZhY3RvcnkuamF2YQpAQCAtMSwyMCArMSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5KYXJGaWxlRW50cnlEb2N1bWVudDsKIAogLyoqCkBAIC02MSwxNSArNjIsMTYgQEAKIAkgKiBOT1RFOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcmVzb3VyY2UgcGF0aCBpcyB0aGUgdG9TdHJpbmcoKSBvZiBhbiBJUGF0aCwgCiAJICogICAgICAgaS5lLiBpdCB1c2VzIHRoZSBJUGF0aC5TRVBBUkFUT1IgZm9yIGZpbGUgcGF0aAogCSAqICAgICAgICAgICAgYW5kIGl0IHVzZXMgJy8nIGZvciBlbnRyaWVzIGluIGEgemlwIGZpbGUuCisJICogSWYgbm90IG51bGwsIHVzZXMgdGhlIGdpdmVuIHNjb3BlIGFzIGEgaGludCBmb3IgZ2V0dGluZyBKYXZhIHByb2plY3QgaGFuZGxlcy4KIAkgKi8KLQlwdWJsaWMgT3BlbmFibGUgY3JlYXRlT3BlbmFibGUoU3RyaW5nIHJlc291cmNlUGF0aCkgeworCXB1YmxpYyBPcGVuYWJsZSBjcmVhdGVPcGVuYWJsZShTdHJpbmcgcmVzb3VyY2VQYXRoLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7CiAJCWludCBzZXBhcmF0b3JJbmRleDsKIAkJaWYgKChzZXBhcmF0b3JJbmRleD0gcmVzb3VyY2VQYXRoLmluZGV4T2YoSmFyRmlsZUVudHJ5RG9jdW1lbnQuSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SKSkgPiAtMSkgewogCQkJLy8gcGF0aCB0byBhIGNsYXNzIGZpbGUgaW5zaWRlIGEgamFyCiAJCQlTdHJpbmcgamFyUGF0aD0gcmVzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7CiAJCQkvLyBPcHRpbWl6YXRpb246IGNhY2hlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBoYW5kbGUgYW5kIHBhY2thZ2UgaGFuZGxlcwogCQkJaWYgKCFqYXJQYXRoLmVxdWFscyh0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoKSkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IHRoaXMuZ2V0SmFyUGtnRnJhZ21lbnRSb290KGphclBhdGgpOworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IHRoaXMuZ2V0SmFyUGtnRnJhZ21lbnRSb290KGphclBhdGgsIHNjb3BlKTsKIAkJCQlpZiAocm9vdCA9PSBudWxsKQogCQkJCQlyZXR1cm4gbnVsbDsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgKIAkJCQl0aGlzLmxhc3RQa2dGcmFnbWVudFJvb3RQYXRoPSBqYXJQYXRoOwpAQCAtMTIzLDE2ICsxMjUsMTggQEAKIC8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBqYXIgcGF0aC4KIAkgKiBTZWUgY3JlYXRlT3BlbmFibGUoLi4uKSBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgamFyIHBhdGggc3RyaW5nLgorCSAqIElmIG5vdCBudWxsLCB1c2VzIHRoZSBnaXZlbiBzY29wZSBhcyBhIGhpbnQgZm9yIGdldHRpbmcgSmF2YSBwcm9qZWN0IGhhbmRsZXMuCiAJICovCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXJQa2dGcmFnbWVudFJvb3QoU3RyaW5nIGphclBhdGhTdHJpbmcpIHsKKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEphclBrZ0ZyYWdtZW50Um9vdChTdHJpbmcgamFyUGF0aFN0cmluZywgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewogCiAJCUlQYXRoIGphclBhdGg9IG5ldyBQYXRoKGphclBhdGhTdHJpbmcpOwogCQkKLQkJSVJlc291cmNlIGphckZpbGU9IHRoaXMud29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKGphclBhdGgpOwotCQlpZiAoamFyRmlsZSAhPSBudWxsKSB7CisJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHRoaXMud29ya3NwYWNlLmdldFJvb3QoKSwgamFyUGF0aCwgZmFsc2UpOworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKIAkJCS8vIGludGVybmFsIGphcjogaXMgaXQgb24gdGhlIGNsYXNzcGF0aCBvZiBpdHMgcHJvamVjdD8KIAkJCS8vICBlLmcuIG9yZy5lY2xpcHNlLnN3dC53aW4zMi93cy93aW4zMi9zd3QuamFyIAogCQkJLy8gICAgICAgIGlzIE5PVCBvbiB0aGUgY2xhc3NwYXRoIG9mIG9yZy5lY2xpcHNlLnN3dC53aW4zMgorCQkJSUZpbGUgamFyRmlsZSA9IChJRmlsZSl0YXJnZXQ7CiAJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChqYXJGaWxlKTsKIAkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXM7CiAJCQl0cnkgewpAQCAtMTQ3LDI2ICsxNTEsNTMgQEAKIAkJCX0KIAkJfQogCQkKLQkJLy8gd2FsayBhbGwgcHJvamVjdHMgYW5kIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGhhcyB0aGUgZ2l2ZW4gamFyIHBhdGggaW4gaXRzIGNsYXNzcGF0aAorCQkvLyB3YWxrIHByb2plY3RzIGluIHRoZSBzY29wZSBhbmQgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaGFzIHRoZSBnaXZlbiBqYXIgcGF0aCBpbiBpdHMgY2xhc3NwYXRoCiAJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOworCQlpZiAoc2NvcGUgIT0gbnVsbCkgeworCQkJSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMgPSBzY29wZS5lbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKTsKKwkJCWludCBsZW5ndGggPSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMubGVuZ3RoOworCQkJcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W2xlbmd0aF07CisJCQlpbnQgaW5kZXggPSAwOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlQYXRoIHBhdGggPSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnNbaV07CisJCQkJaWYgKCFVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSkpIHsKKwkJCQkJcHJvamVjdHNbaW5kZXgrK10gPSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOworCQkJCX0KKwkJCX0KKwkJCWlmIChpbmRleCA8IGxlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdHMsIDAsIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtpbmRleF0sIDAsIGluZGV4KTsKKwkJCX0KKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRKYXJQa2dGcmFnbWVudFJvb3QoamFyUGF0aCwgdGFyZ2V0LCBwcm9qZWN0cyk7CisJCQlpZiAocm9vdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJvb3Q7CisJCQl9CisJCX0gCisJCQorCQkvLyBub3QgZm91bmQgaW4gdGhlIHNjb3BlLCB3YWxrIGFsbCBwcm9qZWN0cwogCQl0cnkgewogCQkJcHJvamVjdHMgPSB0aGlzLmphdmFNb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGphdmEgbW9kZWwgaXMgbm90IGFjY2Vzc2libGUKIAkJCXJldHVybiBudWxsOwogCQl9CisJCXJldHVybiBnZXRKYXJQa2dGcmFnbWVudFJvb3QoamFyUGF0aCwgdGFyZ2V0LCBwcm9qZWN0cyk7CisJfQorCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmFyUGtnRnJhZ21lbnRSb290KAorCQlJUGF0aCBqYXJQYXRoLAorCQlPYmplY3QgdGFyZ2V0LAorCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cykgewogCQlmb3IgKGludCBpPSAwLCBwcm9qZWN0Q291bnQ9IHByb2plY3RzLmxlbmd0aDsgaSA8IHByb2plY3RDb3VudDsgaSsrKSB7CiAJCQl0cnkgewogCQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0PSAoSmF2YVByb2plY3QpcHJvamVjdHNbaV07CiAJCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcz0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CiAJCQkJZm9yIChpbnQgaj0gMCwgZW50cnlDb3VudD0gY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGogPCBlbnRyeUNvdW50OyBqKyspIHsKIAkJCQkJaWYgKGNsYXNzcGF0aEVudHJpZXNbal0uZ2V0UGF0aCgpLmVxdWFscyhqYXJQYXRoKSkgewotCQkJCQkJaWYgKGphckZpbGUgIT0gbnVsbCkgeworCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7CiAJCQkJCQkJLy8gaW50ZXJuYWwgamFyCi0JCQkJCQkJcmV0dXJuIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyRmlsZSk7CisJCQkJCQkJcmV0dXJuIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElGaWxlKXRhcmdldCk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCS8vIGV4dGVybmFsIGphcgotCQkJCQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290MChqYXJQYXRoU3RyaW5nKTsKKwkJCQkJCQlyZXR1cm4gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAoamFyUGF0aCk7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CkBAIC0xOTEsOCArMjIyLDggQEAKIAkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3Q9IHRoaXMuamF2YU1vZGVsLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwogCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHM9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CiAJCQkJZm9yIChpbnQgaj0gMCwgcm9vdENvdW50PSByb290cy5sZW5ndGg7IGogPCByb290Q291bnQ7IGorKykgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSByb290c1tqXTsKLQkJCQkJaWYgKHJvb3QuZ2V0UGF0aCgpLmlzUHJlZml4T2YocGF0aCkpIHsKKwkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSAoUGFja2FnZUZyYWdtZW50Um9vdClyb290c1tqXTsKKwkJCQkJaWYgKHJvb3QuZ2V0UGF0aCgpLmlzUHJlZml4T2YocGF0aCkgJiYgIVV0aWwuaXNFeGNsdWRlZChwYXRoLCByb290LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSkpIHsKIAkJCQkJCXJldHVybiByb290OwogCQkJCQl9CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSUphdmFFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQppbmRleCAyMDg2NGY3Li5iMzhhMWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSU5hbWluZ1JlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSU5hbWluZ1JlcXVlc3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2IxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JTmFtaW5nUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworcHVibGljIGludGVyZmFjZSBJTmFtaW5nUmVxdWVzdG9yIHsKKwl2b2lkIGFjY2VwdE5hbWVXaXRoUHJlZml4QW5kU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RQcmVmaXgsIGJvb2xlYW4gaXNGaXJzdFN1ZmZpeCk7CisJdm9pZCBhY2NlcHROYW1lV2l0aFByZWZpeChjaGFyW10gbmFtZSwgYm9vbGVhbiBpc0ZpcnN0UHJlZml4KTsKKwl2b2lkIGFjY2VwdE5hbWVXaXRoU3VmZml4KGNoYXJbXSBuYW1lLCBib29sZWFuIGlzRmlyc3RTdWZmaXgpOworCXZvaWQgYWNjZXB0TmFtZVdpdGhvdXRQcmVmaXhBbmRTdWZmaXgoY2hhcltdIG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSVBhdGhSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0lQYXRoUmVxdWVzdG9yLmphdmEKaW5kZXggNTM4NzNkMS4uYTFjNzc3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSVBhdGhSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JUGF0aFJlcXVlc3Rvci5qYXZhCkBAIC0xLDE1ICsxLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSVBhdGhSZXF1ZXN0b3IgewogCXZvaWQgYWNjZXB0UGF0aChTdHJpbmcgcGF0aCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0Q29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQppbmRleCAyMmExY2JjLi5hNzUzNTJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnRDb250YWluZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKQEAgLTM1LDcgKzM1LDcgQEAKICAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCiAgKi8KIHByb3RlY3RlZCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSB7Ci0JQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgVXRpbC5iaW5kKCJhc3NlcnQuc2hvdWxkTm90SW1wbGVtZW50IikpOyAvLyROT04tTkxTLTEkCisJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlNob3VsZCBub3QgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gMDsKIH0KIC8qKgpAQCAtNzksNCArNzksMTQgQEAKIAkJKChKYXZhRWxlbWVudCljaGlsZHJlbltpXSkudG9TdHJpbmcodGFiLCBidWZmZXIpOwogCX0KIH0KKy8qKgorICogIERlYnVnZ2luZyBwdXJwb3NlcworICovCitwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOworCWJ1ZmZlci5hcHBlbmQoIltpbXBvcnQgY29udGFpbmVyXSIpOyAvLyROT04tTkxTLTEkCisJaWYgKGluZm8gPT0gbnVsbCkgeworCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCisJfQorfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0ltcG9ydERlY2xhcmF0aW9uLmphdmEKaW5kZXggM2QxNDVkYS4uMDY4YzJjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW1wb3J0RGVjbGFyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0Q29udGFpbmVyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyLmphdmEKaW5kZXggYzJjODliZS4uNmEzMjdhZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplci5qYXZhCkBAIC0xLDE5ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW5pdGlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CkBAIC03Miw2ICs3MywxMiBAQAogCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgdGhpcykpOwogfQogLyoqCisgKiBAc2VlIElNZW1iZXIKKyAqLworcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlyZXR1cm4gbnVsbDsKK30KKy8qKgogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KIHByb3RlY3RlZCB2b2lkIHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3QgaW5mbykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXJFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW5pdGlhbGl6ZXJFbGVtZW50SW5mby5qYXZhCmluZGV4IDhkN2Y0YTcuLjliNWVmNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0luaXRpYWxpemVyRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Jbml0aWFsaXplckVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogLyoqIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbE5hbWluZ0NvbnZlbnRpb25zLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5pbXBsLkFzc2lzdE9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOworCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxOYW1pbmdDb252ZW50aW9ucyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIERFRkFVTFRfTkFNRSA9ICJuYW1lIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBzdGF0aWMgU2Nhbm5lciBnZXROYW1lU2Nhbm5lcihDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zKSB7CisJCXJldHVybgorCQkJbmV3IFNjYW5uZXIoCisJCQkJZmFsc2UgLypjb21tZW50Ki8sIAorCQkJCWZhbHNlIC8qd2hpdGVzcGFjZSovLCAKKwkJCQlmYWxzZSAvKm5scyovLCAKKwkJCQljb21waWxlck9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCAvKmFzc2VydCovLCAKKwkJCQludWxsIC8qdGFza1RhZ3MqLywgCisJCQkJbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7CisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzdWdnZXN0QXJndW1lbnROYW1lcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLCBpbnQgZGltLCBjaGFyW11bXSBleGNsdWRlZE5hbWVzLCBJTmFtaW5nUmVxdWVzdG9yIHJlcXVlc3RvcikgeworCQlNYXAgb3B0aW9ucyA9IGphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7CisJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOworCQlBc3Npc3RPcHRpb25zIGFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhvcHRpb25zKTsKKworCQlzdWdnZXN0TmFtZXMoCisJCQlwYWNrYWdlTmFtZSwKKwkJCXF1YWxpZmllZFR5cGVOYW1lLAorCQkJZGltLAorCQkJYXNzaXN0T3B0aW9ucy5hcmd1bWVudFByZWZpeGVzLAorCQkJYXNzaXN0T3B0aW9ucy5hcmd1bWVudFN1ZmZpeGVzLAorCQkJZXhjbHVkZWROYW1lcywKKwkJCWdldE5hbWVTY2FubmVyKGNvbXBpbGVyT3B0aW9ucyksCisJCQlyZXF1ZXN0b3IpOworCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3VnZ2VzdEZpZWxkTmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgaW50IG1vZGlmaWVycywgY2hhcltdW10gZXhjbHVkZWROYW1lcywgSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJYm9vbGVhbiBpc1N0YXRpYyA9IEZsYWdzLmlzU3RhdGljKG1vZGlmaWVycyk7CisJCQorCQlNYXAgb3B0aW9ucyA9IGphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSk7CisJCUNvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOworCQlBc3Npc3RPcHRpb25zIGFzc2lzdE9wdGlvbnMgPSBuZXcgQXNzaXN0T3B0aW9ucyhvcHRpb25zKTsKKworCQlzdWdnZXN0TmFtZXMoCisJCQlwYWNrYWdlTmFtZSwKKwkJCXF1YWxpZmllZFR5cGVOYW1lLAorCQkJZGltLAorCQkJaXNTdGF0aWMgPyBhc3Npc3RPcHRpb25zLnN0YXRpY0ZpZWxkUHJlZml4ZXMgOiBhc3Npc3RPcHRpb25zLmZpZWxkUHJlZml4ZXMsCisJCQlpc1N0YXRpYyA/IGFzc2lzdE9wdGlvbnMuc3RhdGljRmllbGRTdWZmaXhlcyA6IGFzc2lzdE9wdGlvbnMuZmllbGRTdWZmaXhlcywKKwkJCWV4Y2x1ZGVkTmFtZXMsCisJCQlnZXROYW1lU2Nhbm5lcihjb21waWxlck9wdGlvbnMpLAorCQkJcmVxdWVzdG9yKTsKKwl9CisJcHVibGljIHN0YXRpYyB2b2lkIHN1Z2dlc3RMb2NhbFZhcmlhYmxlTmFtZXMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBxdWFsaWZpZWRUeXBlTmFtZSwgaW50IGRpbSwgY2hhcltdW10gZXhjbHVkZWROYW1lcywgSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJTWFwIG9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOworCQlDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKTsKKwkJQXNzaXN0T3B0aW9ucyBhc3Npc3RPcHRpb25zID0gbmV3IEFzc2lzdE9wdGlvbnMob3B0aW9ucyk7CisKKwkJc3VnZ2VzdE5hbWVzKAorCQkJcGFja2FnZU5hbWUsCisJCQlxdWFsaWZpZWRUeXBlTmFtZSwKKwkJCWRpbSwKKwkJCWFzc2lzdE9wdGlvbnMubG9jYWxQcmVmaXhlcywKKwkJCWFzc2lzdE9wdGlvbnMubG9jYWxTdWZmaXhlcywKKwkJCWV4Y2x1ZGVkTmFtZXMsCisJCQlnZXROYW1lU2Nhbm5lcihjb21waWxlck9wdGlvbnMpLAorCQkJcmVxdWVzdG9yKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdWdnZXN0TmFtZXMoCisJCWNoYXJbXSBwYWNrYWdlTmFtZSwKKwkJY2hhcltdIHF1YWxpZmllZFR5cGVOYW1lLAorCQlpbnQgZGltLAorCQljaGFyW11bXSBwcmVmaXhlcywKKwkJY2hhcltdW10gc3VmZml4ZXMsCisJCWNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMsCisJCVNjYW5uZXIgbmFtZVNjYW5uZXIsCisJCUlOYW1pbmdSZXF1ZXN0b3IgcmVxdWVzdG9yKXsKKwkJCisJCWlmKHF1YWxpZmllZFR5cGVOYW1lID09IG51bGwgfHwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisJCQorCQljaGFyW10gdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmxhc3RTZWdtZW50KHF1YWxpZmllZFR5cGVOYW1lLCAnLicpOworCQorCQlpZihwcmVmaXhlcyA9PSBudWxsIHx8IHByZWZpeGVzLmxlbmd0aCA9PSAwKSB7CisJCQlwcmVmaXhlcyA9IG5ldyBjaGFyWzFdWzBdOworCQl9IGVsc2UgeworCQkJaW50IGxlbmd0aCA9IHByZWZpeGVzLmxlbmd0aDsKKwkJCVN5c3RlbS5hcnJheWNvcHkocHJlZml4ZXMsIDAsIHByZWZpeGVzID0gbmV3IGNoYXJbbGVuZ3RoKzFdW10sIDAsIGxlbmd0aCk7CisJCQlwcmVmaXhlc1tsZW5ndGhdID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCQl9CisJCisJCWlmKHN1ZmZpeGVzID09IG51bGwgfHwgc3VmZml4ZXMubGVuZ3RoID09IDApIHsKKwkJCXN1ZmZpeGVzID0gbmV3IGNoYXJbMV1bMF07CisJCX0gZWxzZSB7CisJCQlpbnQgbGVuZ3RoID0gc3VmZml4ZXMubGVuZ3RoOworCQkJU3lzdGVtLmFycmF5Y29weShzdWZmaXhlcywgMCwgc3VmZml4ZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXSwgMCwgbGVuZ3RoKTsKKwkJCXN1ZmZpeGVzW2xlbmd0aF0gPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCX0KKwkKKwkJY2hhcltdW10gdGVtcE5hbWVzID0gbnVsbDsKKwkKKwkJLy8gY29tcHV0ZSB2YXJpYWJsZSBuYW1lIGZvciBiYXNlIHR5cGUKKwkJdHJ5eworCQkJbmFtZVNjYW5uZXIuc2V0U291cmNlKHR5cGVOYW1lKTsKKwkJCXN3aXRjaCAobmFtZVNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpIHsKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWludCA6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVieXRlIDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXNob3J0IDoKKwkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXIgOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lbG9uZyA6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVmbG9hdCA6CisJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVkb3VibGUgOgorCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYm9vbGVhbiA6CQorCQkJCQljaGFyW10gbmFtZSA9IGNvbXB1dGVCYXNlVHlwZU5hbWVzKHR5cGVOYW1lWzBdLCBleGNsdWRlZE5hbWVzKTsKKwkJCQkJaWYobmFtZSAhPSBudWxsKSB7CisJCQkJCQl0ZW1wTmFtZXMgPSAgbmV3IGNoYXJbXVtde25hbWV9OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQkKKwkJfSBjYXRjaChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSl7CisJCX0KKworCQkvLyBjb21wdXRlIHZhcmlhYmxlIG5hbWUgZm9yIG5vbiBiYXNlIHR5cGUKKwkJaWYodGVtcE5hbWVzID09IG51bGwpIHsKKwkJCXRlbXBOYW1lcyA9IGNvbXB1dGVOYW1lcyh0eXBlTmFtZSk7CisJCX0KKwkKKwkJYm9vbGVhbiBhY2NlcHREZWZhdWx0TmFtZSA9IHRydWU7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBOYW1lcy5sZW5ndGg7IGkrKykgeworCQkJY2hhcltdIHRlbXBOYW1lID0gdGVtcE5hbWVzW2ldOworCQkJaWYoZGltID4gMCkgeworCQkJCWludCBsZW5ndGggPSB0ZW1wTmFtZS5sZW5ndGg7CisJCQkJaWYgKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAncycpeworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBOYW1lLCAwLCB0ZW1wTmFtZSA9IG5ldyBjaGFyW2xlbmd0aCArIDJdLCAwLCBsZW5ndGgpOworCQkJCQl0ZW1wTmFtZVtsZW5ndGhdID0gJ2UnOworCQkJCQl0ZW1wTmFtZVtsZW5ndGgrMV0gPSAncyc7CisJCQkJfSBlbHNlIGlmKHRlbXBOYW1lW2xlbmd0aC0xXSA9PSAneScpIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAyXSwgMCwgbGVuZ3RoKTsKKwkJCQkJdGVtcE5hbWVbbGVuZ3RoLTFdID0gJ2knOworCQkJCQl0ZW1wTmFtZVtsZW5ndGhdID0gJ2UnOworCQkJCQl0ZW1wTmFtZVtsZW5ndGgrMV0gPSAncyc7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTmFtZSwgMCwgdGVtcE5hbWUgPSBuZXcgY2hhcltsZW5ndGggKyAxXSwgMCwgbGVuZ3RoKTsKKwkJCQkJdGVtcE5hbWVbbGVuZ3RoXSA9ICdzJzsKKwkJCQl9CisJCQl9CisJCQorCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykgeworCQkJCWlmKHByZWZpeGVzW2pdLmxlbmd0aCA+IDAKKwkJCQkJJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChwcmVmaXhlc1tqXVtwcmVmaXhlc1tqXS5sZW5ndGggLSAxXSkpIHsKKwkJCQkJdGVtcE5hbWVbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UodGVtcE5hbWVbMF0pOworCQkJCX0gZWxzZSB7CisJCQkJCXRlbXBOYW1lWzBdID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRlbXBOYW1lWzBdKTsKKwkJCQl9CisJCQkJY2hhcltdIHByZWZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXhlc1tqXSwgdGVtcE5hbWUpOworCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc3VmZml4ZXMubGVuZ3RoOyBrKyspIHsKKwkJCQkJY2hhcltdIHN1ZmZpeE5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdChwcmVmaXhOYW1lLCBzdWZmaXhlc1trXSk7CisJCQkJCXN1ZmZpeE5hbWUgPQorCQkJCQkJZXhjbHVkZU5hbWVzKAorCQkJCQkJCXN1ZmZpeE5hbWUsCisJCQkJCQkJcHJlZml4TmFtZSwKKwkJCQkJCQlzdWZmaXhlc1trXSwKKwkJCQkJCQlleGNsdWRlZE5hbWVzKTsKKwkJCQkJaWYoSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlRmllbGROYW1lKG5ldyBTdHJpbmcoc3VmZml4TmFtZSkpLmlzT0soKSkgeworCQkJCQkJYWNjZXB0TmFtZShzdWZmaXhOYW1lLCBwcmVmaXhlc1tqXSwgc3VmZml4ZXNba10sICBqID09IDAsIGsgPT0gMCwgcmVxdWVzdG9yKTsKKwkJCQkJCWFjY2VwdERlZmF1bHROYW1lID0gZmFsc2U7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdWZmaXhOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCQkJcHJlZml4TmFtZSwKKwkJCQkJCQlTdHJpbmcudmFsdWVPZigxKS50b0NoYXJBcnJheSgpLAorCQkJCQkJCXN1ZmZpeGVzW2tdCisJCQkJCQkpOworCQkJCQkJc3VmZml4TmFtZSA9CisJCQkJCQkJZXhjbHVkZU5hbWVzKAorCQkJCQkJCQlzdWZmaXhOYW1lLAorCQkJCQkJCQlwcmVmaXhOYW1lLAorCQkJCQkJCQlzdWZmaXhlc1trXSwKKwkJCQkJCQkJZXhjbHVkZWROYW1lcyk7CisJCQkJCQlpZihKYXZhQ29udmVudGlvbnMudmFsaWRhdGVGaWVsZE5hbWUobmV3IFN0cmluZyhzdWZmaXhOYW1lKSkuaXNPSygpKSB7CisJCQkJCQkJYWNjZXB0TmFtZShzdWZmaXhOYW1lLCBwcmVmaXhlc1tqXSwgc3VmZml4ZXNba10sIGogPT0gMCwgayA9PSAwLCByZXF1ZXN0b3IpOworCQkJCQkJCWFjY2VwdERlZmF1bHROYW1lID0gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkKKwkJCX0KKwkJfQorCQkvLyBpZiBubyBuYW1lcyB3ZXJlIGZvdW5kCisJCWlmKGFjY2VwdERlZmF1bHROYW1lKSB7CisJCQljaGFyW10gbmFtZSA9IGV4Y2x1ZGVOYW1lcyhERUZBVUxUX05BTUUsIERFRkFVTFRfTkFNRSwgQ2hhck9wZXJhdGlvbi5OT19DSEFSLCBleGNsdWRlZE5hbWVzKTsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aG91dFByZWZpeEFuZFN1ZmZpeChuYW1lKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFjY2VwdE5hbWUoCisJCWNoYXJbXSBuYW1lLAorCQljaGFyW10gcHJlZml4LAorCQljaGFyW10gc3VmZml4LAorCQlib29sZWFuIGlzRmlyc3RQcmVmaXgsCisJCWJvb2xlYW4gaXNGaXJzdFN1ZmZpeCwKKwkJSU5hbWluZ1JlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwkJaWYocHJlZml4Lmxlbmd0aCA+IDAgJiYgc3VmZml4Lmxlbmd0aCA+IDApIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aFByZWZpeEFuZFN1ZmZpeChuYW1lLCBpc0ZpcnN0UHJlZml4LCBpc0ZpcnN0U3VmZml4KTsKKwkJfSBlbHNlIGlmKHByZWZpeC5sZW5ndGggPiAwKXsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aFByZWZpeChuYW1lLCBpc0ZpcnN0UHJlZml4KTsKKwkJfSBlbHNlIGlmKHN1ZmZpeC5sZW5ndGggPiAwKXsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aFN1ZmZpeChuYW1lLCBpc0ZpcnN0U3VmZml4KTsKKwkJfSBlbHNlIHsKKwkJCXJlcXVlc3Rvci5hY2NlcHROYW1lV2l0aG91dFByZWZpeEFuZFN1ZmZpeChuYW1lKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29tcHV0ZUJhc2VUeXBlTmFtZXMoY2hhciBmaXJzdE5hbWUsIGNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpeworCQljaGFyW10gbmFtZSA9IG5ldyBjaGFyW117Zmlyc3ROYW1lfTsKKwkJCisJCWZvcihpbnQgaSA9IDAgOyBpIDwgZXhjbHVkZWROYW1lcy5sZW5ndGggOyBpKyspeworCQkJaWYoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgZXhjbHVkZWROYW1lc1tpXSwgZmFsc2UpKSB7CisJCQkJbmFtZVswXSsrOworCQkJCWlmKG5hbWVbMF0gPiAneicpCisJCQkJCW5hbWVbMF0gPSAnYSc7CisJCQkJaWYobmFtZVswXSA9PSBmaXJzdE5hbWUpCisJCQkJCXJldHVybiBudWxsOworCQkJCWkgPSAwOworCQkJfQkKKwkJfQorCQkKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNoYXJbXVtdIGNvbXB1dGVOYW1lcyhjaGFyW10gc291cmNlTmFtZSl7CisJCWNoYXJbXVtdIG5hbWVzID0gbmV3IGNoYXJbNV1bXTsKKwkJaW50IG5hbWVDb3VudCA9IDA7CisJCWJvb2xlYW4gcHJldmlvdXNJc1VwcGVyQ2FzZSA9IGZhbHNlOworCQlib29sZWFuIHByZXZpb3VzSXNMZXR0ZXIgPSB0cnVlOworCQlmb3IoaW50IGkgPSBzb3VyY2VOYW1lLmxlbmd0aCAtIDEgOyBpID49IDAgOyBpLS0peworCQkJYm9vbGVhbiBpc1VwcGVyQ2FzZSA9IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzb3VyY2VOYW1lW2ldKTsKKwkJCWJvb2xlYW4gaXNMZXR0ZXIgPSBDaGFyYWN0ZXIuaXNMZXR0ZXIoc291cmNlTmFtZVtpXSk7CisJCQlpZihpc1VwcGVyQ2FzZSAmJiAhcHJldmlvdXNJc1VwcGVyQ2FzZSAmJiBwcmV2aW91c0lzTGV0dGVyKXsKKwkJCQljaGFyW10gbmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc291cmNlTmFtZSxpLHNvdXJjZU5hbWUubGVuZ3RoKTsKKwkJCQlpZihuYW1lLmxlbmd0aCA+IDEpeworCQkJCQlpZihuYW1lQ291bnQgPT0gbmFtZXMubGVuZ3RoKSB7CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hbWVzLCAwLCBuYW1lcyA9IG5ldyBjaGFyW25hbWVDb3VudCAqIDJdW10sIDAsIG5hbWVDb3VudCk7CisJCQkJCX0KKwkJCQkJbmFtZVswXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShuYW1lWzBdKTsKKwkJCQkJbmFtZXNbbmFtZUNvdW50KytdID0gbmFtZTsKKwkJCQl9CisJCQl9CisJCQlwcmV2aW91c0lzVXBwZXJDYXNlID0gaXNVcHBlckNhc2U7CisJCQlwcmV2aW91c0lzTGV0dGVyID0gaXNMZXR0ZXI7CisJCX0KKwkJaWYobmFtZUNvdW50ID09IDApeworCQkJbmFtZXNbbmFtZUNvdW50KytdID0gQ2hhck9wZXJhdGlvbi50b0xvd2VyQ2FzZShzb3VyY2VOYW1lKTsJCQkJCisJCX0KKwkJU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgbmFtZXMgPSBuZXcgY2hhcltuYW1lQ291bnRdW10sIDAsIG5hbWVDb3VudCk7CisJCXJldHVybiBuYW1lczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjaGFyW10gZXhjbHVkZU5hbWVzKAorCQljaGFyW10gc3VmZml4TmFtZSwKKwkJY2hhcltdIHByZWZpeE5hbWUsCisJCWNoYXJbXSBzdWZmaXgsCisJCWNoYXJbXVtdIGV4Y2x1ZGVkTmFtZXMpIHsKKwkJaW50IGNvdW50ID0gMjsKKwkJaW50IG0gPSAwOworCQl3aGlsZSAobSA8IGV4Y2x1ZGVkTmFtZXMubGVuZ3RoKSB7CisJCQlpZihDaGFyT3BlcmF0aW9uLmVxdWFscyhzdWZmaXhOYW1lLCBleGNsdWRlZE5hbWVzW21dLCBmYWxzZSkpIHsKKwkJCQlzdWZmaXhOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoCisJCQkJCXByZWZpeE5hbWUsCisJCQkJCVN0cmluZy52YWx1ZU9mKGNvdW50KyspLnRvQ2hhckFycmF5KCksCisJCQkJCXN1ZmZpeAorCQkJCSk7CisJCQkJbSA9IDA7CisJCQl9IGVsc2UgeworCQkJCW0rKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VmZml4TmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJFbnRyeUZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RmlsZS5qYXZhCmluZGV4IGVlZTBiZGQuLmYzNDU5OTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phckVudHJ5RmlsZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnQuamF2YQppbmRleCA5NDA1ZWJlLi5lYTdhNTUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudEluZm8uamF2YQppbmRleCA4NTI1NzE0Li41ZDgyMzViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCmluZGV4IDQzMjhmMDIuLjM1ZGI0MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTEsNDQgKzEsMjQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklPcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogCiAvKioKICAqIEEgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgY29ycmVzcG9uZHMgdG8gYSAuamFyIG9yIC56aXAuCkBAIC02MywxNDcgKzQzLDIzIEBACiAJcHJvdGVjdGVkIGZpbmFsIElQYXRoIGphclBhdGg7CiAKIAkvKioKLQkgKiBUaGUgZGVsaW1pdGVyIGJldHdlZW4gdGhlIHppcCBwYXRoIGFuZCBzb3VyY2UgcGF0aCBpbiB0aGUKLQkgKiBhdHRhY2htZW50IHNlcnZlciBwcm9wZXJ0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXIgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVI9ICcqJzsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBtZXRhLWluZiBkaXJlY3Rvcnkgbm90IHRvIGJlIGluY2x1ZGVkIGFzIGEgCi0JICogamFyIHBhY2thZ2UgZnJhZ21lbnQuCi0JICogQHNlZSAjY29tcHV0ZUphckNoaWxkcmVuCi0JICovCi0JLy9wcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNRVRBX0lORl9OQU1FID0gIk1FVEEtSU5GLyI7Ci0JLyoqCiAJICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkgCiAJICogYmFzZWQgb24gYSBKQVIgZmlsZSB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGFuZAogCSAqIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgogCSAqLwotCXByb3RlY3RlZCBKYXJQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihudWxsLCBwcm9qZWN0LCBqYXJQYXRoKTsKLQkJdGhpcy5qYXJQYXRoID0gbmV3IFBhdGgoamFyUGF0aCk7CisJcHJvdGVjdGVkIEphclBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggamFyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIobnVsbCwgcHJvamVjdCwgamFyUGF0aC5sYXN0U2VnbWVudCgpKTsKKwkJdGhpcy5qYXJQYXRoID0gamFyUGF0aDsKIAl9CiAJLyoqCiAJICogQ29uc3RydWN0cyBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgSmF2YSBwYWNrYWdlIGRpcmVjdG9yeSBoaWVyYXJjaHkgCiAJICogYmFzZWQgb24gYSBKQVIgZmlsZS4KIAkgKi8KIAlwcm90ZWN0ZWQgSmFyUGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHJlc291cmNlLCBwcm9qZWN0KTsKKwkJc3VwZXIocmVzb3VyY2UsIHByb2plY3QsIHJlc291cmNlLmdldE5hbWUoKSk7CiAJCXRoaXMuamFyUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CiAJfQotCS8qKgotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRhY2hTb3VyY2UoSVBhdGggemlwUGF0aCwgSVBhdGggcm9vdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl2ZXJpZnlBdHRhY2hTb3VyY2UoemlwUGF0aCk7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soVXRpbC5iaW5kKCJlbGVtZW50LmF0dGFjaGluZ1NvdXJjZSIpLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU291cmNlTWFwcGVyIG1hcHBlcj0gbnVsbDsKLQkJCVNvdXJjZU1hcHBlciBvbGRNYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOwotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2U9IGdldEphdmFNb2RlbCgpLmdldFdvcmtzcGFjZSgpOwotCQkJYm9vbGVhbiByb290TmVlZHNUb0JlQ2xvc2VkPSBmYWxzZTsKIAotCQkJaWYgKHppcFBhdGggPT0gbnVsbCkgewotCQkJCS8vc291cmNlIGJlaW5nIGRldGFjaGVkCi0JCQkJcm9vdE5lZWRzVG9CZUNsb3NlZD0gdHJ1ZTsKLQkJCS8qIERpc2FibGUgZGVsdGFzIChzZWUgMUdEVFVTRCkKLQkJCQkvLyBmaXJlIGEgZGVsdGEgdG8gbm90aWZ5IHRoZSBVSSBhYm91dCB0aGUgc291cmNlIGRldGFjaGVtZW50LgotCQkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IChKYXZhTW9kZWxNYW5hZ2VyKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJCQlKYXZhTW9kZWwgbW9kZWwgPSAoSmF2YU1vZGVsKSBnZXRKYXZhTW9kZWwoKTsKLQkJCQlKYXZhRWxlbWVudERlbHRhIGF0dGFjaGVkU291cmNlRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShtb2RlbCk7Ci0JCQkJYXR0YWNoZWRTb3VyY2VEZWx0YSAuc291cmNlRGV0YWNoZWQodGhpcyk7IC8vIHRoaXMgd291bGQgYmUgYSBKYXJQYWNrYWdlRnJhZ21lbnRSb290Ci0JCQkJbWFuYWdlci5yZWdpc3RlclJlc291cmNlRGVsdGEoYXR0YWNoZWRTb3VyY2VEZWx0YSApOwotCQkJCW1hbmFnZXIuZmlyZSgpOyAvLyBtYXliZSB5b3Ugd2FudCB0byBmaXJlIHRoZSBjaGFuZ2UgbGF0ZXIuIExldCB1cyBrbm93IGFib3V0IGl0LgotCQkJKi8KLQkJCX0gZWxzZSB7Ci0JCQkvKgotCQkJCS8vIGZpcmUgYSBkZWx0YSB0byBub3RpZnkgdGhlIFVJIGFib3V0IHRoZSBzb3VyY2UgYXR0YWNoZW1lbnQuCi0JCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCQkJCUphdmFNb2RlbCBtb2RlbCA9IChKYXZhTW9kZWwpIGdldEphdmFNb2RlbCgpOwotCQkJCUphdmFFbGVtZW50RGVsdGEgYXR0YWNoZWRTb3VyY2VEZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKG1vZGVsKTsKLQkJCQlhdHRhY2hlZFNvdXJjZURlbHRhIC5zb3VyY2VBdHRhY2hlZCh0aGlzKTsgLy8gdGhpcyB3b3VsZCBiZSBhIEphclBhY2thZ2VGcmFnbWVudFJvb3QKLQkJCQltYW5hZ2VyLnJlZ2lzdGVyUmVzb3VyY2VEZWx0YShhdHRhY2hlZFNvdXJjZURlbHRhICk7Ci0JCQkJbWFuYWdlci5maXJlKCk7IC8vIG1heWJlIHlvdSB3YW50IHRvIGZpcmUgdGhlIGNoYW5nZSBsYXRlci4gTGV0IHVzIGtub3cgYWJvdXQgaXQuCi0JCQkgKi8KLQotCQkJCS8vY2hlY2sgaWYgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgYXR0YWNobWVudAotCQkJCUlQYXRoIHN0b3JlZFppcFBhdGg9IGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JCQkJSVBhdGggc3RvcmVkUm9vdFBhdGg9IGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWlmIChzdG9yZWRaaXBQYXRoICE9IG51bGwpIHsKLQkJCQkJaWYgKCEoc3RvcmVkWmlwUGF0aC5lcXVhbHMoemlwUGF0aCkgJiYgcm9vdFBhdGguZXF1YWxzKHN0b3JlZFJvb3RQYXRoKSkpIHsKLQkJCQkJCXJvb3ROZWVkc1RvQmVDbG9zZWQ9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCh6aXBQYXRoLmlzQWJzb2x1dGUoKSAmJiB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoemlwUGF0aCkgIT0gbnVsbCkgfHwgIXppcFBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCS8vIGludGVybmFsIHRvIHRoZSB3b3JrYmVuY2gKLQkJCQkJLy8gYSByZXNvdXJjZQotCQkJCQlJUmVzb3VyY2UgemlwRmlsZT0gd29ya3NwYWNlLmdldFJvb3QoKS5maW5kTWVtYmVyKHppcFBhdGgpOwotCQkJCQlpZiAoemlwRmlsZSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQl9Ci0JCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1BBVEgsIHppcFBhdGgpKTsKLQkJCQkJfQotCQkJCQlpZiAoISh6aXBGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpIHsKLQkJCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJCX0KLQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwgemlwUGF0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1hcHBlcj0gbmV3IFNvdXJjZU1hcHBlcih6aXBQYXRoLCByb290UGF0aC50b09TU3RyaW5nKCkpOwotCQkJfQotCQkJc2V0U291cmNlTWFwcGVyKG1hcHBlcik7Ci0JCQlpZiAoemlwUGF0aCA9PSBudWxsKSB7Ci0JCQkJc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KG51bGwpOyAvL3JlbW92ZSB0aGUgcHJvcGVydHkKLQkJCX0gZWxzZSB7Ci0JCQkJLy9zZXQgdGhlIHByb3BlcnR5IHRvIHRoZSBwYXRoIG9mIHRoZSBtYXBwZWQgemlwCi0JCQkJc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KHppcFBhdGgudG9TdHJpbmcoKSArIEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSICsgcm9vdFBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAocm9vdE5lZWRzVG9CZUNsb3NlZCkgewotCQkJCWlmIChvbGRNYXBwZXIgIT0gbnVsbCkgewotCQkJCQlvbGRNYXBwZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJQnVmZmVyTWFuYWdlciBtYW5hZ2VyPSBCdWZmZXJNYW5hZ2VyLmdldERlZmF1bHRCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJRW51bWVyYXRpb24gb3BlbkJ1ZmZlcnM9IG1hbmFnZXIuZ2V0T3BlbkJ1ZmZlcnMoKTsKLQkJCQl3aGlsZSAob3BlbkJ1ZmZlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJSUJ1ZmZlciBidWZmZXI9IChJQnVmZmVyKSBvcGVuQnVmZmVycy5uZXh0RWxlbWVudCgpOwotCQkJCQlJT3BlbmFibGUgcG9zc2libGVKYXJNZW1iZXI9IGJ1ZmZlci5nZXRPd25lcigpOwotCQkJCQlpZiAoaXNBbmNlc3Rvck9mKChJSmF2YUVsZW1lbnQpIHBvc3NpYmxlSmFyTWVtYmVyKSkgewotCQkJCQkJYnVmZmVyLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkobnVsbCk7IC8vIGxvb3NlIGluZm8gLSB3aWxsIGJlIHJlY29tcHV0ZWQKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2xvc2UgdGhlIGFzc29jaWF0ZWQgSkFSIGZpbGUgc3RvcmVkIGluIHRoZSBpbmZvIG9mIHRoaXMgZWxlbWVudC4gSWYKLQkgKiB0aGlzIGphciBoYXMgYW4gYXNzb2NpYXRlZCBaSVAgc291cmNlIGF0dGFjaG1lbnQsIGNsb3NlIGl0IHRvby4KLQkgKgotCSAqIEBzZWUgSU9wZW5hYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2luZyhPYmplY3QgaW5mbykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOwotCQlpZiAobWFwcGVyICE9IG51bGwpIHsKLQkJCW1hcHBlci5jbG9zZSgpOwotCQl9Ci0JCXN1cGVyLmNsb3NpbmcoaW5mbyk7Ci0JfQogCS8qKgogCSAqIENvbXB1dGUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgY2hpbGRyZW4gb2YgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCiAJICogVGhlc2UgYXJlIGFsbCBvZiB0aGUgZGlyZWN0b3J5IHppcCBlbnRyaWVzLCBhbmQgYW55IGRpcmVjdG9yaWVzIGltcGxpZWQKQEAgLTIzMywxMiArODksNiBAQAogCXRyeSB7CiAJCWphcj0gZ2V0SmFyKCk7CiAKLQkJaWYgKGlzRXh0ZXJuYWwoKSl7Ci0JCQkvLyByZW1lbWJlciB0aGUgdGltZXN0YW1wIG9mIHRoaXMgbGlicmFyeQotCQkJbG9uZyB0aW1lc3RhbXAgPSBEZWx0YVByb2Nlc3Nvci5nZXRUaW1lU3RhbXAobmV3IEZpbGUoZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFQcm9jZXNzb3IuZXh0ZXJuYWxUaW1lU3RhbXBzLnB1dChnZXRQYXRoKCksIG5ldyBMb25nKHRpbWVzdGFtcCkpOwkJCQotCQl9Ci0KIAkJSGFzaE1hcCBwYWNrYWdlRnJhZ1RvVHlwZXM9IG5ldyBIYXNoTWFwKCk7CiAKIAkJLy8gYWx3YXlzIGNyZWF0ZSB0aGUgZGVmYXVsdCBwYWNrYWdlCkBAIC0zMjUsNiArMTc1LDcgQEAKIAkJCXZDaGlsZHJlbi5hZGQocGFja0ZyYWcpOwogCQl9CiAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWU7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJfSBmaW5hbGx5IHsKIAkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2xvc2VaaXBGaWxlKGphcik7CkBAIC0zNjEsNzMgKzIxMiw2IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZmluZFNvdXJjZUF0dGFjaG1lbnRSZWNvbW1lbmRhdGlvbigpIHsKLQotCXRyeSB7Ci0KLQkJSVBhdGggcm9vdFBhdGggPSB0aGlzLmdldFBhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCi0JCS8vIHRyeSBvbiBlbmNsb3NpbmcgcHJvamVjdCBmaXJzdAotCQlKYXZhUHJvamVjdCBwYXJlbnRQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpOwotCQl0cnkgewotCQkJZW50cnkgPSBwYXJlbnRQcm9qZWN0LmdldENsYXNzcGF0aEVudHJ5Rm9yKHJvb3RQYXRoKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKXsKLQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB0cnVlKTsKLQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSB0YXJnZXQ7Ci0JCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSB8fCAiemlwIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSl7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUpewotCQkJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IChqYXZhLmlvLkZpbGUpIHRhcmdldDsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJaWYgKFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuamFyIikgfHwgVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi56aXAiKSl7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQkJfQotCQkKLQkJLy8gaXRlcmF0ZSBvdmVyIGFsbCBwcm9qZWN0cwotCQlJSmF2YU1vZGVsIG1vZGVsID0gZ2V0SmF2YU1vZGVsKCk7Ci0JCUlKYXZhUHJvamVjdFtdIGpQcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0galByb2plY3RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKLQkJCUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBqUHJvamVjdHNbaV07Ci0JCQlpZiAoalByb2plY3QgPT0gcGFyZW50UHJvamVjdCkgY29udGludWU7IC8vIGFscmVhZHkgZG9uZQotCQkJdHJ5IHsKLQkJCQllbnRyeSA9IGpQcm9qZWN0LmdldENsYXNzcGF0aEVudHJ5Rm9yKHJvb3RQYXRoKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCl7Ci0JCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIHRydWUpOwotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpewotCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgdGFyZ2V0OwotCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJCWlmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIpIHx8IFV0aWwuZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsICIuemlwIikpeyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gZW50cnk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSl7Ci0JCQkJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IChqYXZhLmlvLkZpbGUpIHRhcmdldDsKLQkJCQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoVXRpbC5lbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi5qYXIiKSB8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKXsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7Ci0JCQl9Ci0JCX0KLQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLQotCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFppcEZpbGUgZm9yIHRoaXMgSmFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KIAkgKgpAQCAtNDM3LDE3ICsyMjEsNiBAQAogCQlyZXR1cm4gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0WmlwRmlsZShnZXRQYXRoKCkpOwogCX0KIAkvKioKLQkgKiBAc2VlIElKYXZhRWxlbWVudAotCSAqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCUlKYXZhRWxlbWVudCBwYXJlbnQ9IGdldFBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhcmVudC5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JfQotCS8qKgogCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKIAkgKi8KIAlwdWJsaWMgaW50IGdldEtpbmQoKSB7CkBAIC00NzEsOTUgKzI0NCwzMSBAQAogCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKIAkgKi8KIAlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJaWYgKGZSZXNvdXJjZSA9PSBudWxsKSB7CisJCWlmIChpc0V4dGVybmFsKCkpIHsKIAkJCXJldHVybiB0aGlzLmphclBhdGg7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gc3VwZXIuZ2V0UGF0aCgpOwogCQl9CiAJfQotCS8qKgotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNlcnZlclBhdGhTdHJpbmc9IGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eSgpOwotCQlpZiAoc2VydmVyUGF0aFN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZSA9PSBudWxsKSB7CisJCQl0aGlzLnJlc291cmNlID0gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCB0aGlzLmphclBhdGgsIGZhbHNlKTsKIAkJfQotCQlpbnQgaW5kZXg9IHNlcnZlclBhdGhTdHJpbmcubGFzdEluZGV4T2YoQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIpOwotCQlpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHNlcnZlclppcFBhdGhTdHJpbmc9IHNlcnZlclBhdGhTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJcmV0dXJuIG5ldyBQYXRoKHNlcnZlclppcFBhdGhTdHJpbmcpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgcHJvcGVydHkgZm9yIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290J3MKLQkgKiBzb3VyY2UgYXR0YWNoZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByb3BlcnR5U3RyaW5nID0gbnVsbDsKLQkJUXVhbGlmaWVkTmFtZSBxTmFtZT0gZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZSgpOwotCQl0cnkgewotCQkJcHJvcGVydHlTdHJpbmcgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KHFOYW1lKTsKLQkJCQotCQkJLy8gaWYgbm8gZXhpc3Rpbmcgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24sIHRoZW4gbG9va3VwIGEgcmVjb21tZW5kYXRpb24gZnJvbSBjbGFzc3BhdGggZW50cmllcwotCQkJaWYgKHByb3BlcnR5U3RyaW5nID09IG51bGwgfHwgcHJvcGVydHlTdHJpbmcubGFzdEluZGV4T2YoQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVIpIDwgMCl7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IHJlY29tbWVuZGF0aW9uID0gZmluZFNvdXJjZUF0dGFjaG1lbnRSZWNvbW1lbmRhdGlvbigpOwotCQkJCWlmIChyZWNvbW1lbmRhdGlvbiAhPSBudWxsKXsKLQkJCQkJcHJvcGVydHlTdHJpbmcgPSByZWNvbW1lbmRhdGlvbi5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLnRvU3RyaW5nKCkgCi0JCQkJCQkJCQkJKyBBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUiAKLQkJCQkJCQkJCQkrIChyZWNvbW1lbmRhdGlvbi5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSA9PSBudWxsID8gIiIgOiByZWNvbW1lbmRhdGlvbi5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkocHJvcGVydHlTdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwcm9wZXJ0eVN0cmluZzsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSl7Ci0JCXRyeSB7Ci0JCQlnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KHRoaXMuZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNvdXJjZSBhdHRhY2htZW50IHByb3BlcnR5Ci0JICogb2YgdGhpcyBqYXIuCi0JICovCi0JcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoSmF2YUNvcmUuUExVR0lOX0lELCAic291cmNlYXR0YWNobWVudDogIiArIHRoaXMuamFyUGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzZXJ2ZXJQYXRoU3RyaW5nPSBnZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoKTsKLQkJaWYgKHNlcnZlclBhdGhTdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGluZGV4PSBzZXJ2ZXJQYXRoU3RyaW5nLmxhc3RJbmRleE9mKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSKTsKLQkJU3RyaW5nIHNlcnZlclJvb3RQYXRoU3RyaW5nPSBJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEg7Ci0JCWlmIChpbmRleCAhPSBzZXJ2ZXJQYXRoU3RyaW5nLmxlbmd0aCgpIC0gMSkgewotCQkJc2VydmVyUm9vdFBhdGhTdHJpbmc9IHNlcnZlclBhdGhTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHNlcnZlclJvb3RQYXRoU3RyaW5nKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBKYXZhRWxlbWVudAotCSAqLwotCXB1YmxpYyBTb3VyY2VNYXBwZXIgZ2V0U291cmNlTWFwcGVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuICgoSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldFNvdXJjZU1hcHBlcigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlpZiAodGhpcy5yZXNvdXJjZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKCk7CisJCX0gZWxzZSB7CisJCQkvLyBleHRlcm5hbCBqYXIKIAkJCXJldHVybiBudWxsOwogCQl9CiAJfQorCisKIAkvKioKIAkgKiBAc2VlIElKYXZhRWxlbWVudAogCSAqLwogCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChmUmVzb3VyY2UgPT0gbnVsbCkgeworCQlpZiAoaXNFeHRlcm5hbCgpKSB7CisJCQlpZiAoIWV4aXN0cygpKSB0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiBzdXBlci5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKQEAgLTU5MCw3ICsyOTksNyBAQAogCSAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgewotCQlyZXR1cm4gZlJlc291cmNlID09IG51bGw7CisJCXJldHVybiBnZXRSZXNvdXJjZSgpID09IG51bGw7CiAJfQogCS8qKgogCSAqIEphcnMgYW5kIGphciBlbnRyaWVzIGFyZSBhbGwgcmVhZCBvbmx5CkBAIC01OTgsNzQgKzMwNyw0MSBAQAogCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQkvKioKLQkgKiBAc2VlIE9wZW5hYmxlI29wZW5XaGVuQ2xvc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuV2hlbkNsb3NlZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIub3BlbldoZW5DbG9zZWQocG0pOwotCQl0cnkgewotCQkJLy9yZXN0b3JlIGFueSBzdG9yZWQgYXR0YWNoZWQgc291cmNlIHppcAotCQkJSVBhdGggemlwUGF0aD0gZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKLQkJCWlmICh6aXBQYXRoICE9IG51bGwpIHsKLQkJCQlJUGF0aCByb290UGF0aD0gZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCk7Ci0JCQkJYXR0YWNoU291cmNlKHppcFBhdGgsIHJvb3RQYXRoLCBwbSk7Ci0JCQl9Ci0JCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeyAvLyBubyBhdHRhY2hlZCBzb3VyY2UKLQkJfQotCX0KKwogCS8qKgogCSAqIEFuIGFyY2hpdmUgY2Fubm90IHJlZnJlc2ggaXRzIGNoaWxkcmVuLgogCSAqLwogCXB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKIAkJLy8gZG8gbm90aGluZwogCX0KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG9yIGFzc29jaWF0ZWQgZmlsZSBleGlzdHMKKyAqLworcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VFeGlzdHMoKSB7CisJaWYgKHRoaXMuaXNFeHRlcm5hbCgpKSB7CisJCXJldHVybiAKKwkJCUphdmFNb2RlbC5nZXRUYXJnZXQoCisJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgCisJCQkJdGhpcy5nZXRQYXRoKCksIC8vIGRvbid0IG1ha2UgdGhlIHBhdGggcmVsYXRpdmUgYXMgdGhpcyBpcyBhbiBleHRlcm5hbCBhcmNoaXZlCisJCQkJdHJ1ZSkgIT0gbnVsbDsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3VwZXIucmVzb3VyY2VFeGlzdHMoKTsKKwl9Cit9CiAvKgogICogQHNlZSBKYXZhRWxlbWVudCNyb290ZWRBdChJSmF2YVByb2plY3QpCiAgKi8KIHB1YmxpYyBJSmF2YUVsZW1lbnQgcm9vdGVkQXQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQlpZiAoZlJlc291cmNlID09IG51bGwpIHsKKwlpZiAoaXNFeHRlcm5hbCgpKSB7CiAJCXJldHVybgogCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoCi0JCQkJdGhpcy5qYXJQYXRoLnRvU3RyaW5nKCksCisJCQkJdGhpcy5qYXJQYXRoLAogCQkJCXByb2plY3QpOwogCX0gZWxzZSB7CiAJCXJldHVybgogCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoCi0JCQkJZlJlc291cmNlLAorCQkJCWdldFJlc291cmNlKCksCiAJCQkJcHJvamVjdCk7CiAJfQogfQotCi0JLyoqCi0JICogRm9yIHVzZSBieSA8Y29kZT5BdHRhY2hTb3VyY2VPcGVyYXRpb248L2NvZGU+IG9ubHkuCi0JICogU2V0cyB0aGUgc291cmNlIG1hcHBlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBqYXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlTWFwcGVyKFNvdXJjZU1hcHBlciBtYXBwZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkoKEphclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBnZXRFbGVtZW50SW5mbygpKS5zZXRTb3VyY2VNYXBwZXIobWFwcGVyKTsKLQl9Ci0JLyoqCi0JICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KLQkgKiAgPGxpPlJFTEFUSVZFX1BBVEggLSB0aGUgcGF0aCBzdXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbiBtdXN0IGJlCi0JICogICAgICBhbiBhYnNvbHV0ZSBwYXRoCi0JICogIDxsaT5FTEVNRU5UX05PVF9QUkVTRU5UIC0gdGhlIGphciBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uCi0JICogICAgICBkb2VzIG5vdCBleGlzdAotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QXR0YWNoU291cmNlKElQYXRoIHppcFBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoIWV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoemlwUGF0aCAhPSBudWxsICYmICF6aXBQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVMQVRJVkVfUEFUSCwgemlwUGF0aCkpOwotCQl9Ci0JfQotCi0vKioKLSAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlTWVtZW50bygpewotCVN0cmluZ0J1ZmZlciBidWZmPSBuZXcgU3RyaW5nQnVmZmVyKCgoSmF2YUVsZW1lbnQpZ2V0UGFyZW50KCkpLmdldEhhbmRsZU1lbWVudG8oKSk7Ci0JYnVmZi5hcHBlbmQoZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpKTsKLQlidWZmLmFwcGVuZCh0aGlzLmphclBhdGgudG9TdHJpbmcoKSk7IC8vIDFHRVA1MVUKLQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phclBhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKaW5kZXggMmViM2I3Ny4uMDNlZTA4MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmFyUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCkBAIC0xLDI0ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIC8qKgogICogVGhlIGVsZW1lbnQgaW5mbyBmb3IgPGNvZGU+SmFyUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT5zLgogICovCiBjbGFzcyBKYXJQYWNrYWdlRnJhZ21lbnRSb290SW5mbyBleHRlbmRzIFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvIHsKLQkvKioKLQkgKiBUaGUgU291cmNlTWFwcGVyIGZvciB0aGlzIEpBUiAob3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIEpBUiBkb2VzIG5vdCBoYXZlIHNvdXJjZSBhdHRhY2hlZCkuCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZU1hcHBlciBmU291cmNlTWFwcGVyPSBudWxsOwogLyoqCiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCkBAIC0yNiwxNyArMjEsNCBAQAogCWZOb25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwogCXJldHVybiBmTm9uSmF2YVJlc291cmNlczsKIH0KLS8qKgotICogUmV0dW5zIHRoZSBTb3VyY2VNYXBwZXIgZm9yIHRoaXMgSkFSLCBvciA8Y29kZT5udWxsPC9jb2RlPgotICogaWYgdGhpcyBKQVIgZG9lcyBub3QgaGF2ZSBhdHRhY2hlZCBzb3VyY2UuCi0gKi8KLXByb3RlY3RlZCBTb3VyY2VNYXBwZXIgZ2V0U291cmNlTWFwcGVyKCkgewotCXJldHVybiBmU291cmNlTWFwcGVyOwotfQotLyoqCi0gKiBTZXRzIHRoZSBTb3VyY2VNYXBwZXIgZm9yIHRoaXMgSkFSLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VNYXBwZXIoU291cmNlTWFwcGVyIG1hcHBlcikgewotCWZTb3VyY2VNYXBwZXI9IG1hcHBlcjsKLX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudC5qYXZhCmluZGV4IDRlMjQ4YzYuLmRmODk4YTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnQuamF2YQpAQCAtMSwzMyArMSwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYXJlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKIApAQCAtODEsNTk3ICs2OSw1NzkgQEAKIAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IE5PX0lORk8gPSBuZXcgT2JqZWN0KCk7CiAJCi0vKioKLSAqIENvbnN0cnVjdHMgYSBoYW5kbGUgZm9yIGEgamF2YSBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSwgd2l0aAotICogdGhlIGdpdmVuIHBhcmVudCBlbGVtZW50IGFuZCBuYW1lLgotICoKLSAqIEBwYXJhbSB0eXBlIC0gb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiBJSmF2YUxhbmd1YWdlRWxlbWVudAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIHZhbGlkCi0gKgkJSmF2YSBlbGVtZW50IHR5cGUgY29uc3RhbnRzCi0gKgotICovCi1wcm90ZWN0ZWQgSmF2YUVsZW1lbnQoaW50IHR5cGUsIElKYXZhRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQlpZiAodHlwZSA8IEpBVkFfTU9ERUwgfHwgdHlwZSA+IElNUE9SVF9ERUNMQVJBVElPTikgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbnZhbGlkVHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlmTEVUeXBlPSB0eXBlOwotCWZQYXJlbnQ9IHBhcmVudDsKLQlmTmFtZT0gbmFtZTsKLX0KLS8qKgotICogQHNlZSBJT3BlbmFibGUKLSAqLwotcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7Ci0JaWYgKGluZm8gIT0gbnVsbCkgewotCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFICYmIHRoaXMgaW5zdGFuY2VvZiBKYXZhTW9kZWwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ0xPU0lORyBKYXZhIE1vZGVsIik7ICAvLyROT04tTkxTLTEkCi0JCQkvLyBkb25lIG9ubHkgd2hlbiBleGl0aW5nIHRoZSB3b3JrYmVuY2g6IGRpc2FibGUgdmVyYm9zZQotCQkJSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFID0gZmFsc2U7CQkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgaGFuZGxlIGZvciBhIGphdmEgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUsIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gcGFyZW50IGVsZW1lbnQgYW5kIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gdHlwZSAtIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gSUphdmFMYW5ndWFnZUVsZW1lbnQKKwkgKgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIHZhbGlkCisJICoJCUphdmEgZWxlbWVudCB0eXBlIGNvbnN0YW50cworCSAqCisJICovCisJcHJvdGVjdGVkIEphdmFFbGVtZW50KGludCB0eXBlLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisJCWlmICh0eXBlIDwgSkFWQV9NT0RFTCB8fCB0eXBlID4gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgiZWxlbWVudC5pbnZhbGlkVHlwZSIpKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCWlmICh0aGlzIGluc3RhbmNlb2YgSVBhcmVudCkgewotCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbykgaW5mbykuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwLCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJSmF2YUVsZW1lbnQgY2hpbGQgPSAoSmF2YUVsZW1lbnQpIGNoaWxkcmVuW2ldOwotCQkJCWNoaWxkLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2xvc2luZyhpbmZvKTsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlSW5mbyh0aGlzKTsKLQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IFBhY2thZ2UgY2FjaGUgc2l6ZSA9ICIgKyBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5jYWNoZS5wa2dTaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IE9wZW5hYmxlIGNhY2hlIGZpbGxpbmcgcmF0aW8gPSAiICsgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuY2FjaGUub3BlbmFibGVGaWxsaW5nUmF0aW8oKSArICIlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KKwkJZkxFVHlwZT0gdHlwZTsKKwkJZlBhcmVudD0gcGFyZW50OworCQlmTmFtZT0gbmFtZTsKIAl9Ci19Ci0vKioKLSAqIFRoaXMgZWxlbWVudCBpcyBiZWluZyBjbG9zZWQuICBEbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNsb3NpbmcoT2JqZWN0IGluZm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UpewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNMT1NJTkcgRWxlbWVudCAoIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiKTogIiArIHRoaXMudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhbmRsZSByZXByZXNlbnRzIHRoZSBzYW1lIEphdmEgZWxlbWVudAotICogYXMgdGhlIGdpdmVuIGhhbmRsZS4gQnkgZGVmYXVsdCwgdHdvIGhhbmRsZXMgcmVwcmVzZW50IHRoZSBzYW1lCi0gKiBlbGVtZW50IGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB0eXBlCi0gKiBvZiBlbGVtZW50LCBoYXZlIGVxdWFsIG5hbWVzLCBwYXJlbnRzLCBhbmQgb2NjdXJyZW5jZSBjb3VudHMuCi0gKgotICogPHA+SWYgYSBzdWJjbGFzcyBoYXMgb3RoZXIgcmVxdWlyZW1lbnRzIGZvciBlcXVhbGl0eSwgdGhpcyBtZXRob2QKLSAqIG11c3QgYmUgb3ZlcnJpZGRlbi4KLSAqCi0gKiBAc2VlIE9iamVjdCNlcXVhbHMKLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCi0JaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0KLQkvLyBKYXZhIG1vZGVsIHBhcmVudCBpcyBudWxsCi0JaWYgKGZQYXJlbnQgPT0gbnVsbCkgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLQotCWlmIChvIGluc3RhbmNlb2YgSmF2YUVsZW1lbnQpIHsKLQkJSmF2YUVsZW1lbnQgb3RoZXIgPSAoSmF2YUVsZW1lbnQpIG87Ci0JCWlmIChmTEVUeXBlICE9IG90aGVyLmZMRVR5cGUpIHJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBmTmFtZS5lcXVhbHMob3RoZXIuZk5hbWUpICYmCi0JCQkJZlBhcmVudC5lcXVhbHMob3RoZXIuZlBhcmVudCkgJiYKLQkJCQlmT2NjdXJyZW5jZUNvdW50ID09IG90aGVyLmZPY2N1cnJlbmNlQ291bnQ7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgPGNvZGU+SmF2YUVsZW1lbnQ8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGdpdmVuCi0gKiA8Y29kZT5JRE9NTm9kZTwvY29kZT4uCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGVxdWFsc0RPTU5vZGUoSURPTU5vZGUgbm9kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBAc2VlIElKYXZhRWxlbWVudAotICovCi1wdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCi0JdHJ5IHsKLQkJZ2V0UmF3SW5mbygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgPGNvZGU+SURPTU5vZGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5KYXZhRWxlbWVudDwvY29kZT4KLSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgbm9kZS4KLSAqLwotcHVibGljIElET01Ob2RlIGZpbmROb2RlKElET01Db21waWxhdGlvblVuaXQgZG9tKSB7Ci0JaW50IHR5cGUgPSBnZXRFbGVtZW50VHlwZSgpOwotCWlmICh0eXBlID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIHx8IAotCQl0eXBlID09IElKYXZhRWxlbWVudC5GSUVMRCB8fCAKLQkJdHlwZSA9PSBJSmF2YUVsZW1lbnQuSU1QT1JUX0RFQ0xBUkFUSU9OIHx8IAotCQl0eXBlID09IElKYXZhRWxlbWVudC5JTklUSUFMSVpFUiB8fCAKLQkJdHlwZSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EIHx8IAotCQl0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OIHx8IAotCQl0eXBlID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCUFycmF5TGlzdCBwYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHRoaXM7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhRWxlbWVudC5JTVBPUlRfQ09OVEFJTkVSKSB7Ci0JCQkJLy8gdGhlIERPTSBkb2VzIG5vdCBoYXZlIGltcG9ydCBjb250YWluZXJzLCBzbyBza2lwIHRoZW0KLQkJCQlwYXRoLmFkZCgwLCBlbGVtZW50KTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXRoLnNpemUoKSA9PSAwKSB7CisJLyoqCisJICogQHNlZSBJT3BlbmFibGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7CisJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCWJvb2xlYW4gd2FzVmVyYm9zZSA9IGZhbHNlOwogCQkJdHJ5IHsKLQkJCQlpZiAoZXF1YWxzRE9NTm9kZShkb20pKSB7Ci0JCQkJCXJldHVybiBkb207Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7CisJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNMT1NJTkcgRWxlbWVudCAoIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiKTogIiArIHRoaXMudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJd2FzVmVyYm9zZSA9IHRydWU7CisJCQkJCUphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSA9IGZhbHNlOwogCQkJCX0KLQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKKwkJCQlpZiAodGhpcyBpbnN0YW5jZW9mIElQYXJlbnQpIHsKKwkJCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKEphdmFFbGVtZW50SW5mbykgaW5mbykuZ2V0Q2hpbGRyZW4oKTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBzaXplOyArK2kpIHsKKwkJCQkJCUphdmFFbGVtZW50IGNoaWxkID0gKEphdmFFbGVtZW50KSBjaGlsZHJlbltpXTsKKwkJCQkJCWNoaWxkLmNsb3NlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc2luZyhpbmZvKTsKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVJbmZvKHRoaXMpOworCQkJCWlmICh3YXNWZXJib3NlKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4gUGFja2FnZSBjYWNoZSBzaXplID0gIiArIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNhY2hlLnBrZ1NpemUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItPiBPcGVuYWJsZSBjYWNoZSBmaWxsaW5nIHJhdGlvID0gIiArIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNhY2hlLm9wZW5hYmxlRmlsbGluZ1JhdGlvKCkgKyAiJSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFID0gd2FzVmVyYm9zZTsKIAkJCX0KIAkJfQotCQlyZXR1cm4gKChKYXZhRWxlbWVudCkgcGF0aC5nZXQoMCkpLmZvbGxvd1BhdGgocGF0aCwgMCwgZG9tLmdldEZpcnN0Q2hpbGQoKSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIG51bGw7CiAJfQotfQotLyoqCi0gKi8KLXByb3RlY3RlZCBJRE9NTm9kZSBmb2xsb3dQYXRoKEFycmF5TGlzdCBwYXRoLCBpbnQgcG9zaXRpb24sIElET01Ob2RlIG5vZGUpIHsKLQotCXRyeSB7Ci0JCWlmIChlcXVhbHNET01Ob2RlKG5vZGUpKSB7Ci0JCQlpZiAocG9zaXRpb24gPT0gKHBhdGguc2l6ZSgpIC0gMSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKLQkJCQkJcG9zaXRpb24rKzsKLQkJCQkJcmV0dXJuICgoSmF2YUVsZW1lbnQpcGF0aC5nZXQocG9zaXRpb24pKS5mb2xsb3dQYXRoKHBhdGgsIHBvc2l0aW9uLCBub2RlLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQkJfSBlbHNlIHsKKwkvKioKKwkgKiBUaGlzIGVsZW1lbnQgaXMgYmVpbmcgY2xvc2VkLiAgRG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNsb3NpbmcoT2JqZWN0IGluZm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYW5kbGUgcmVwcmVzZW50cyB0aGUgc2FtZSBKYXZhIGVsZW1lbnQKKwkgKiBhcyB0aGUgZ2l2ZW4gaGFuZGxlLiBCeSBkZWZhdWx0LCB0d28gaGFuZGxlcyByZXByZXNlbnQgdGhlIHNhbWUKKwkgKiBlbGVtZW50IGlmIHRoZXkgYXJlIGlkZW50aWNhbCBvciBpZiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB0eXBlCisJICogb2YgZWxlbWVudCwgaGF2ZSBlcXVhbCBuYW1lcywgcGFyZW50cywgYW5kIG9jY3VycmVuY2UgY291bnRzLgorCSAqCisJICogPHA+SWYgYSBzdWJjbGFzcyBoYXMgb3RoZXIgcmVxdWlyZW1lbnRzIGZvciBlcXVhbGl0eSwgdGhpcyBtZXRob2QKKwkgKiBtdXN0IGJlIG92ZXJyaWRkZW4uCisJICoKKwkgKiBAc2VlIE9iamVjdCNlcXVhbHMKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJCisJCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworCQorCQkvLyBKYXZhIG1vZGVsIHBhcmVudCBpcyBudWxsCisJCWlmIChmUGFyZW50ID09IG51bGwpIHJldHVybiBzdXBlci5lcXVhbHMobyk7CisJCisJCWlmIChvIGluc3RhbmNlb2YgSmF2YUVsZW1lbnQpIHsKKwkJCUphdmFFbGVtZW50IG90aGVyID0gKEphdmFFbGVtZW50KSBvOworCQkJaWYgKGZMRVR5cGUgIT0gb3RoZXIuZkxFVHlwZSkgcmV0dXJuIGZhbHNlOworCQkJCisJCQlyZXR1cm4gZk5hbWUuZXF1YWxzKG90aGVyLmZOYW1lKSAmJgorCQkJCQlmUGFyZW50LmVxdWFscyhvdGhlci5mUGFyZW50KSAmJgorCQkJCQlmT2NjdXJyZW5jZUNvdW50ID09IG90aGVyLmZPY2N1cnJlbmNlQ291bnQ7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyA8Y29kZT5KYXZhRWxlbWVudDwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4KKwkgKiA8Y29kZT5JRE9NTm9kZTwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxzRE9NTm9kZShJRE9NTm9kZSBub2RlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKwkJCisJCXRyeSB7CisJCQlnZXRFbGVtZW50SW5mbygpOworCQkJcmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JRE9NTm9kZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIDxjb2RlPkphdmFFbGVtZW50PC9jb2RlPgorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgbm9kZS4KKwkgKi8KKwlwdWJsaWMgSURPTU5vZGUgZmluZE5vZGUoSURPTUNvbXBpbGF0aW9uVW5pdCBkb20pIHsKKwkJaW50IHR5cGUgPSBnZXRFbGVtZW50VHlwZSgpOworCQlpZiAodHlwZSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCB8fCAKKwkJCXR5cGUgPT0gSUphdmFFbGVtZW50LkZJRUxEIHx8IAorCQkJdHlwZSA9PSBJSmF2YUVsZW1lbnQuSU1QT1JUX0RFQ0xBUkFUSU9OIHx8IAorCQkJdHlwZSA9PSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgfHwgCisJCQl0eXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QgfHwgCisJCQl0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OIHx8IAorCQkJdHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgeworCQkJQXJyYXlMaXN0IHBhdGggPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHRoaXM7CisJCQl3aGlsZSAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgeworCQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFFbGVtZW50LklNUE9SVF9DT05UQUlORVIpIHsKKwkJCQkJLy8gdGhlIERPTSBkb2VzIG5vdCBoYXZlIGltcG9ydCBjb250YWluZXJzLCBzbyBza2lwIHRoZW0KKwkJCQkJcGF0aC5hZGQoMCwgZWxlbWVudCk7CisJCQkJfQorCQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOworCQkJfQorCQkJaWYgKHBhdGguc2l6ZSgpID09IDApIHsKKwkJCQl0cnkgeworCQkJCQlpZiAoZXF1YWxzRE9NTm9kZShkb20pKSB7CisJCQkJCQlyZXR1cm4gZG9tOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIGlmIChub2RlLmdldE5leHROb2RlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvbGxvd1BhdGgocGF0aCwgcG9zaXRpb24sIG5vZGUuZ2V0TmV4dE5vZGUoKSk7CisJCQlyZXR1cm4gKChKYXZhRWxlbWVudCkgcGF0aC5nZXQoMCkpLmZvbGxvd1BhdGgocGF0aCwgMCwgZG9tLmdldEZpcnN0Q2hpbGQoKSk7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJfQorCS8qKgorCSAqLworCXByb3RlY3RlZCBJRE9NTm9kZSBmb2xsb3dQYXRoKEFycmF5TGlzdCBwYXRoLCBpbnQgcG9zaXRpb24sIElET01Ob2RlIG5vZGUpIHsKKwkKKwkJdHJ5IHsKKwkJCWlmIChlcXVhbHNET01Ob2RlKG5vZGUpKSB7CisJCQkJaWYgKHBvc2l0aW9uID09IChwYXRoLnNpemUoKSAtIDEpKSB7CisJCQkJCXJldHVybiBub2RlOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7CisJCQkJCQlwb3NpdGlvbisrOworCQkJCQkJcmV0dXJuICgoSmF2YUVsZW1lbnQpcGF0aC5nZXQocG9zaXRpb24pKS5mb2xsb3dQYXRoKHBhdGgsIHBvc2l0aW9uLCBub2RlLmdldEZpcnN0Q2hpbGQoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAobm9kZS5nZXROZXh0Tm9kZSgpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZm9sbG93UGF0aChwYXRoLCBwb3NpdGlvbiwgbm9kZS5nZXROZXh0Tm9kZSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQorCX0KKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0QW5jZXN0b3IoaW50IGFuY2VzdG9yVHlwZSkgeworCQkKKwkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSB0aGlzOworCQl3aGlsZSAoZWxlbWVudCAhPSBudWxsKSB7CisJCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IGFuY2VzdG9yVHlwZSkgIHJldHVybiBlbGVtZW50OworCQkJZWxlbWVudD0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsJCQkJCisJfQorCS8qKgorCSAqIEBzZWUgSVBhcmVudCAKKwkgKi8KKwlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJcmV0dXJuICgoSmF2YUVsZW1lbnRJbmZvKWdldEVsZW1lbnRJbmZvKCkpLmdldENoaWxkcmVuKCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIChpbW1lZGlhdGUpIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBvZiB0aGUKKwkgKiBzcGVjaWZpZWQgdHlwZS4KKwkgKgorCSAqIEBwYXJhbSB0eXBlIC0gb25lIG9mIGNvbnN0YW50cyBkZWZpbmVkIGJ5IElKYXZhTGFuZ3VhZ2VFbGVtZW50VHlwZXMKKwkgKi8KKwlwdWJsaWMgQXJyYXlMaXN0IGdldENoaWxkcmVuT2ZUeXBlKGludCB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOworCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKKwkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQkJSmF2YUVsZW1lbnQgZWx0ID0gKEphdmFFbGVtZW50KWNoaWxkcmVuW2ldOworCQkJaWYgKGVsdC5nZXRFbGVtZW50VHlwZSgpID09IHR5cGUpIHsKKwkJCQlsaXN0LmFkZChlbHQpOworCQkJfQorCQl9CisJCXJldHVybiBsaXN0OworCX0KKwkvKioKKwkgKiBAc2VlIElNZW1iZXIKKwkgKi8KKwlwdWJsaWMgSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIElNZW1iZXIKKwkgKi8KKwlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmZvIGZvciB0aGlzIGhhbmRsZS4gIAorCSAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBvcGVuLCBpdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIGFyZSBvcGVuZWQuCisJICogRG9lcyBub3QgcmV0dXJuIG51bGwuCisJICogTk9URTogQmluYXJ5VHlwZSBpbmZvcyBhcmUgTkpPVCByb290ZWQgdW5kZXIgSmF2YUVsZW1lbnRJbmZvLgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9yIG5vdCBhY2Nlc3NpYmxlCisJICovCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50SW5mbygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCisJCS8vIHdvcmthcm91bmQgdG8gZW5zdXJlIHBhcmVudCBwcm9qZWN0IHJlc29sdmVkIGNsYXNzcGF0aCBpcyBhdmFpbGFibGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBpbml0aWFsaXplcnMKKwkJLy8gd2hpbGUgdGhlIEphdmFNb2RlbE1hbmFnZXIgbG9jayBpcyBhY3F1aXJlZCAoY2FuIGNhdXNlIGRlYWRsb2NrcyBpbiBjbGllbnRzKQorCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7CisJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuaXNPcGVuKCkpIHsKKwkJCS8vIFRPRE86IG5lZWQgdG8gcmV2aXNpdCwgc2luY2UgZGVhZGxvY2sgY291bGQgc3RpbGwgb2NjdXIgaWYgcGVyUHJvamVjdEluZm8gaXMgcmVtb3ZlZCBjb25jdXJyZW50IGJlZm9yZSBlbnRlcmluZyB0aGUgbG9jaworCQkJdHJ5IHsKKwkJCQlwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cmlnZ2VyIGFsbCBwb3NzaWJsZSBjb250YWluZXIvdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gb3V0c2lkZSB0aGUgbW9kZWwgbG9jaworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBwcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIG9yIGlzIG5vdCBhIGphdmEgcHJvamVjdAorCQkJfQorCQl9CisKKwkJLy8gZWxlbWVudCBpbmZvIGNyZWF0aW9uIGlzIGRvbmUgaW5zaWRlIGEgbG9jayBvbiB0aGUgSmF2YU1vZGVsTWFuYWdlcgorCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXI7CisJCXN5bmNocm9uaXplZChtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkpeworCQkJT2JqZWN0IGluZm8gPSBtYW5hZ2VyLmdldEluZm8odGhpcyk7CisJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJb3BlbkhpZXJhcmNoeSgpOworCQkJCWluZm89IG1hbmFnZXIuZ2V0SW5mbyh0aGlzKTsKKwkJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gaW5mbzsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElBZGFwdGFibGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gZk5hbWU7CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpIHsKKwkJcmV0dXJuIGZMRVR5cGU7CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIFN0cmluZyBnZXRIYW5kbGVJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gZ2V0SGFuZGxlTWVtZW50bygpOworCX0KKwkvKioKKwkgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlTWVtZW50bygpeworCQlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcigoKEphdmFFbGVtZW50KWdldFBhcmVudCgpKS5nZXRIYW5kbGVNZW1lbnRvKCkpOworCQlidWZmLmFwcGVuZChnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCkpOworCQlidWZmLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhpcyBoYW5kbGVzCisJICogY29udHJpYnV0aW9uIHRvIGEgbWVtZW50by4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCk7CisJLyoqCisJICogQHNlZSBJSmF2YUVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7CisJCUlKYXZhRWxlbWVudCBjdXJyZW50ID0gdGhpczsKKwkJZG8geworCQkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBJSmF2YU1vZGVsKSByZXR1cm4gKElKYXZhTW9kZWwpIGN1cnJlbnQ7CisJCX0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnQoKSkgIT0gbnVsbCk7CiAJCXJldHVybiBudWxsOwogCX0KIAotfQotLyoqCi0gKiBAc2VlIElKYXZhRWxlbWVudAotICovCi1wdWJsaWMgSUphdmFFbGVtZW50IGdldEFuY2VzdG9yKGludCBhbmNlc3RvclR5cGUpIHsKKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7CisJCUlKYXZhRWxlbWVudCBjdXJyZW50ID0gdGhpczsKKwkJZG8geworCQkJaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHJldHVybiAoSUphdmFQcm9qZWN0KSBjdXJyZW50OworCQl9IHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCkpICE9IG51bGwpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgb2NjdXJyZW5jZSBjb3VudCBvZiB0aGUgaGFuZGxlLgorCSAqLworCXByb3RlY3RlZCBpbnQgZ2V0T2NjdXJyZW5jZUNvdW50KCkgeworCQlyZXR1cm4gZk9jY3VycmVuY2VDb3VudDsKKwl9CisJLyoKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGUoKSB7CisJCXJldHVybiB0aGlzLmdldE9wZW5hYmxlUGFyZW50KCk7CQorCX0KKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIElPcGVuYWJsZSBpbiB0aGUgcGFyZW50CisJICogaGllcmFyY2h5IG9mIHRoaXMgZWxlbWVudC4KKwkgKgorCSAqIDxwPlN1YmNsYXNzZXMgdGhhdCBhcmUgbm90IElPcGVuYWJsZSdzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisJICovCisJcHVibGljIElPcGVuYWJsZSBnZXRPcGVuYWJsZVBhcmVudCgpIHsKKwkJCisJCXJldHVybiAoSU9wZW5hYmxlKWZQYXJlbnQ7CisJfQorCS8qKgorCSAqIEBzZWUgSUphdmFFbGVtZW50CisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBnZXRQYXJlbnQoKSB7CisJCXJldHVybiBmUGFyZW50OworCX0KIAkKLQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IHRoaXM7Ci0Jd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkgewotCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IGFuY2VzdG9yVHlwZSkgIHJldHVybiBlbGVtZW50OwotCQllbGVtZW50PSBlbGVtZW50LmdldFBhcmVudCgpOwotCX0KLQlyZXR1cm4gbnVsbDsJCQkJCi19Ci0vKioKLSAqIEBzZWUgSVBhcmVudCAKLSAqLwotcHVibGljIElKYXZhRWxlbWVudFtdIGdldENoaWxkcmVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGdldEVsZW1lbnRJbmZvKCkuZ2V0Q2hpbGRyZW4oKTsKLX0KLS8qKgotICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgKGltbWVkaWF0ZSkgY2hpbGRyZW4gb2YgdGhpcyBub2RlIG9mIHRoZQotICogc3BlY2lmaWVkIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgLSBvbmUgb2YgY29uc3RhbnRzIGRlZmluZWQgYnkgSUphdmFMYW5ndWFnZUVsZW1lbnRUeXBlcwotICovCi1wdWJsaWMgQXJyYXlMaXN0IGdldENoaWxkcmVuT2ZUeXBlKGludCB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCUphdmFFbGVtZW50IGVsdCA9IChKYXZhRWxlbWVudCljaGlsZHJlbltpXTsKLQkJaWYgKGVsdC5nZXRFbGVtZW50VHlwZSgpID09IHR5cGUpIHsKLQkJCWxpc3QuYWRkKGVsdCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7Ci19Ci0vKioKLSAqIEBzZWUgSU1lbWJlcgotICovCi1wdWJsaWMgSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIEBzZWUgSU1lbWJlcgotICovCi1wdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGluZm8gZm9yIHRoaXMgaGFuZGxlLiAgCi0gKiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IGFscmVhZHkgb3BlbiwgaXQgYW5kIGFsbCBvZiBpdHMgcGFyZW50cyBhcmUgb3BlbmVkLgotICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0gKgotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgb3Igbm90IGFjY2Vzc2libGUKLSAqLwotcHVibGljIEphdmFFbGVtZW50SW5mbyBnZXRFbGVtZW50SW5mbygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlcjsKLQlzeW5jaHJvbml6ZWQobWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKXsKLQkJT2JqZWN0IGluZm8gPSBtYW5hZ2VyLmdldEluZm8odGhpcyk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCW9wZW5IaWVyYXJjaHkoKTsKLQkJCWluZm89IG1hbmFnZXIuZ2V0SW5mbyh0aGlzKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChKYXZhRWxlbWVudEluZm8paW5mbzsKLQl9Ci19Ci0vKioKLSAqIEBzZWUgSUFkYXB0YWJsZQotICovCi1wdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCXJldHVybiBmTmFtZTsKLX0KLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpIHsKLQlyZXR1cm4gZkxFVHlwZTsKLX0KLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIFN0cmluZyBnZXRIYW5kbGVJZGVudGlmaWVyKCkgewotCXJldHVybiBnZXRIYW5kbGVNZW1lbnRvKCk7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YUVsZW1lbnQjZ2V0SGFuZGxlTWVtZW50bygpCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlTWVtZW50bygpewotCVN0cmluZ0J1ZmZlciBidWZmPSBuZXcgU3RyaW5nQnVmZmVyKCgoSmF2YUVsZW1lbnQpZ2V0UGFyZW50KCkpLmdldEhhbmRsZU1lbWVudG8oKSk7Ci0JYnVmZi5hcHBlbmQoZ2V0SGFuZGxlTWVtZW50b0RlbGltaXRlcigpKTsKLQlidWZmLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKLQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiB0aGlzIGhhbmRsZXMKLSAqIGNvbnRyaWJ1dGlvbiB0byBhIG1lbWVudG8uCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBjaGFyIGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKTsKLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCXJldHVybiBnZXRQYXJlbnQoKS5nZXRKYXZhTW9kZWwoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YU1vZGVsTWFuYWdlcgotICovCi1wdWJsaWMgSmF2YU1vZGVsTWFuYWdlciBnZXRKYXZhTW9kZWxNYW5hZ2VyKCkgewotCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLX0KLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0SmF2YVByb2plY3QoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgb2NjdXJyZW5jZSBjb3VudCBvZiB0aGUgaGFuZGxlLgotICovCi1wcm90ZWN0ZWQgaW50IGdldE9jY3VycmVuY2VDb3VudCgpIHsKLQlyZXR1cm4gZk9jY3VycmVuY2VDb3VudDsKLX0KLS8qCi0gKiBAc2VlIElKYXZhRWxlbWVudAotICovCi1wdWJsaWMgSU9wZW5hYmxlIGdldE9wZW5hYmxlKCkgewotCXJldHVybiB0aGlzLmdldE9wZW5hYmxlUGFyZW50KCk7CQotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIElPcGVuYWJsZSBpbiB0aGUgcGFyZW50Ci0gKiBoaWVyYXJjaHkgb2YgdGhpcyBlbGVtZW50LgotICoKLSAqIDxwPlN1YmNsYXNzZXMgdGhhdCBhcmUgbm90IElPcGVuYWJsZSdzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0gKi8KLXB1YmxpYyBJT3BlbmFibGUgZ2V0T3BlbmFibGVQYXJlbnQoKSB7Ci0JCi0JcmV0dXJuIChJT3BlbmFibGUpZlBhcmVudDsKLX0KLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIElKYXZhRWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JcmV0dXJuIGZQYXJlbnQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgaW5mbyBmb3IgdGhpcyBoYW5kbGUuICAKLSAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBvcGVuLCBpdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIGFyZSBvcGVuZWQuCi0gKiBEb2VzIG5vdCByZXR1cm4gbnVsbC4KLSAqCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBvciBub3QgYWNjZXNzaWJsZQotICovCi1wdWJsaWMgT2JqZWN0IGdldFJhd0luZm8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlzeW5jaHJvbml6ZWQoSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkpewotCQlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZm8odGhpcyk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCW9wZW5IaWVyYXJjaHkoKTsKLQkJCWluZm89IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZm8odGhpcyk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwotCQkJfQotCQl9IAotCQlyZXR1cm4gaW5mbzsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24KLSAqIGluIHRoaXMgZWxlbWVudC4gIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciA8Y29kZT5JQ29tcGlsYXRpb25Vbml0I2dldEVsZW1lbnRBdDwvY29kZT4sCi0gKiBhbmQgb25seSB3b3JrcyBvbiBjb21waWxhdGlvbiB1bml0cyBhbmQgdHlwZXMuIFRoZSBwb3NpdGlvbiBnaXZlbiBpcwotICoga25vd24gdG8gYmUgd2l0aGluIHRoaXMgZWxlbWVudCdzIHNvdXJjZSByYW5nZSBhbHJlYWR5LCBhbmQgaWYgbm8gZmluZXIKLSAqIGdyYWluZWQgZWxlbWVudCBpcyBmb3VuZCBhdCB0aGUgcG9zaXRpb24sIHRoaXMgZWxlbWVudCBpcyByZXR1cm5lZC4KLSAqLwotcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50QXQoaW50IHBvc2l0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAodGhpcyBpbnN0YW5jZW9mIElTb3VyY2VSZWZlcmVuY2UpIHsKLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgYUNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoYUNoaWxkIGluc3RhbmNlb2YgU291cmNlUmVmRWxlbWVudCkgewotCQkJCVNvdXJjZVJlZkVsZW1lbnQgY2hpbGQgPSAoU291cmNlUmVmRWxlbWVudCkgY2hpbGRyZW5baV07Ci0JCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gY2hpbGQuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQlpZiAocG9zaXRpb24gPCByYW5nZS5nZXRPZmZzZXQoKSArIHJhbmdlLmdldExlbmd0aCgpICYmIHBvc2l0aW9uID49IHJhbmdlLmdldE9mZnNldCgpKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElQYXJlbnQpIHsKLQkJCQkJCXJldHVybiBjaGlsZC5nZXRTb3VyY2VFbGVtZW50QXQocG9zaXRpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGNoaWxkOworCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSBnaXZlbiBzb3VyY2UgcG9zaXRpb24KKwkgKiBpbiB0aGlzIGVsZW1lbnQuICBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgPGNvZGU+SUNvbXBpbGF0aW9uVW5pdCNnZXRFbGVtZW50QXQ8L2NvZGU+LAorCSAqIGFuZCBvbmx5IHdvcmtzIG9uIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCB0eXBlcy4gVGhlIHBvc2l0aW9uIGdpdmVuIGlzCisJICoga25vd24gdG8gYmUgd2l0aGluIHRoaXMgZWxlbWVudCdzIHNvdXJjZSByYW5nZSBhbHJlYWR5LCBhbmQgaWYgbm8gZmluZXIKKwkgKiBncmFpbmVkIGVsZW1lbnQgaXMgZm91bmQgYXQgdGhlIHBvc2l0aW9uLCB0aGlzIGVsZW1lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50QXQoaW50IHBvc2l0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSB7CisJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQlpZiAoYUNoaWxkIGluc3RhbmNlb2YgU291cmNlUmVmRWxlbWVudCkgeworCQkJCQlTb3VyY2VSZWZFbGVtZW50IGNoaWxkID0gKFNvdXJjZVJlZkVsZW1lbnQpIGNoaWxkcmVuW2ldOworCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBjaGlsZC5nZXRTb3VyY2VSYW5nZSgpOworCQkJCQlpZiAocG9zaXRpb24gPCByYW5nZS5nZXRPZmZzZXQoKSArIHJhbmdlLmdldExlbmd0aCgpICYmIHBvc2l0aW9uID49IHJhbmdlLmdldE9mZnNldCgpKSB7CisJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJUGFyZW50KSB7CisJCQkJCQkJcmV0dXJuIGNoaWxkLmdldFNvdXJjZUVsZW1lbnRBdChwb3NpdGlvbik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBjaGlsZDsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHNob3VsZCBub3QgaGFwcGVuCisJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKIAkJfQotCX0gZWxzZSB7Ci0JCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCUFzc2VydC5pc1RydWUoZmFsc2UpOworCQlyZXR1cm4gdGhpczsKIAl9Ci0JcmV0dXJuIHRoaXM7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIFNvdXJjZU1hcHBlciBmYWNpbGl0eSBmb3IgdGhpcyBlbGVtZW50LCBvcgotICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGhhdmUgYQotICogU291cmNlTWFwcGVyLgotICovCi1wdWJsaWMgU291cmNlTWFwcGVyIGdldFNvdXJjZU1hcHBlcigpIHsKLQlyZXR1cm4gKChKYXZhRWxlbWVudClnZXRQYXJlbnQoKSkuZ2V0U291cmNlTWFwcGVyKCk7Ci19Ci1wdWJsaWMgYWJzdHJhY3QgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0vKioKLSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCi0gKi8KLXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQlyZXR1cm4gZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBKYXZhIGVsZW1lbnQuIEJ5IGRlZmF1bHQsCi0gKiB0aGUgaGFzaCBjb2RlIGZvciBhbiBlbGVtZW50IGlzIGEgY29tYmluYXRpb24gb2YgaXRzIG5hbWUKLSAqIGFuZCBwYXJlbnQncyBoYXNoIGNvZGUuIEVsZW1lbnRzIHdpdGggb3RoZXIgcmVxdWlyZW1lbnRzIG11c3QKLSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICovCi1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCWlmIChmUGFyZW50ID09IG51bGwpIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCXJldHVybiBVdGlsLmNvbWJpbmVIYXNoQ29kZXMoZk5hbWUuaGFzaENvZGUoKSwgZlBhcmVudC5oYXNoQ29kZSgpKTsKLX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwKLSAqIG90aGVyd2lzZSBmYWxzZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNBbmNlc3Rvck9mKElKYXZhRWxlbWVudCBlKSB7Ci0JSUphdmFFbGVtZW50IHBhcmVudD0gZS5nZXRQYXJlbnQoKTsKLQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5lcXVhbHModGhpcykpIHsKLQkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgU291cmNlTWFwcGVyIGZhY2lsaXR5IGZvciB0aGlzIGVsZW1lbnQsIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGhhdmUgYQorCSAqIFNvdXJjZU1hcHBlci4KKwkgKi8KKwlwdWJsaWMgU291cmNlTWFwcGVyIGdldFNvdXJjZU1hcHBlcigpIHsKKwkJcmV0dXJuICgoSmF2YUVsZW1lbnQpZ2V0UGFyZW50KCkpLmdldFNvdXJjZU1hcHBlcigpOwogCX0KLQlyZXR1cm4gcGFyZW50ICE9IG51bGw7Ci19CiAKLS8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIEBzZWUgSUphdmFFbGVtZW50Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlyZXR1cm4gZ2V0RWxlbWVudEluZm8oKS5pc1N0cnVjdHVyZUtub3duKCk7Ci19Ci0vKioKLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW5kIG5vdCBwcmVzZW50IGV4Y2VwdGlvbiBmb3IgdGhpcyBlbGVtZW50LgotICovCi1wcm90ZWN0ZWQgSmF2YU1vZGVsRXhjZXB0aW9uIG5ld05vdFByZXNlbnRFeGNlcHRpb24oKSB7Ci0JcmV0dXJuIG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKLX0KLS8qKgotICogRGVmYXVsdCBpcyB0byBub3QgZG8gYW55IHNvdXJjZSBpbmRpY2VzIHVwZGF0ZXMuCi0gKi8KLXB1YmxpYyB2b2lkIG9mZnNldFNvdXJjZUVuZEFuZENoaWxkcmVuKGludCBhbW91bnQsIElKYXZhRWxlbWVudCBjaGlsZCkgeworCS8qKgorCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBKYXZhIGVsZW1lbnQuIEJ5IGRlZmF1bHQsCisJICogdGhlIGhhc2ggY29kZSBmb3IgYW4gZWxlbWVudCBpcyBhIGNvbWJpbmF0aW9uIG9mIGl0cyBuYW1lCisJICogYW5kIHBhcmVudCdzIGhhc2ggY29kZS4gRWxlbWVudHMgd2l0aCBvdGhlciByZXF1aXJlbWVudHMgbXVzdAorCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWlmIChmUGFyZW50ID09IG51bGwpIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworCQlyZXR1cm4gVXRpbC5jb21iaW5lSGFzaENvZGVzKGZOYW1lLmhhc2hDb2RlKCksIGZQYXJlbnQuaGFzaENvZGUoKSk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQsCisJICogb3RoZXJ3aXNlIGZhbHNlLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzQW5jZXN0b3JPZihJSmF2YUVsZW1lbnQgZSkgeworCQlJSmF2YUVsZW1lbnQgcGFyZW50PSBlLmdldFBhcmVudCgpOworCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5lcXVhbHModGhpcykpIHsKKwkJCXBhcmVudD0gcGFyZW50LmdldFBhcmVudCgpOworCQl9CisJCXJldHVybiBwYXJlbnQgIT0gbnVsbDsKKwl9CiAJCi19Ci0vKioKLSAqIERlZmF1bHQgYmVoYXZpb3VyIGlzIG5vdCB0byBjaGFuZ2UgdGhlIHNvdXJjZSByYW5nZQotICogZm9yIHRoZSBKYXZhIGVsZW1lbnQKLSAqLwotcHVibGljIHZvaWQgb2Zmc2V0U291cmNlUmFuZ2UoaW50IGFtb3VudCkgewotfQotLyoqCi0gKiBPcGVucyB0aGlzIGVsZW1lbnQgYW5kIGFsbCBwYXJlbnRzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IG9wZW4uCi0gKgotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9yIGFjY2Vzc2libGUKLSAqLwotcHJvdGVjdGVkIHZvaWQgb3BlbkhpZXJhcmNoeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmICh0aGlzIGluc3RhbmNlb2YgSU9wZW5hYmxlKSB7Ci0JCSgoT3BlbmFibGUpIHRoaXMpLm9wZW5XaGVuQ2xvc2VkKG51bGwpOwotCX0gZWxzZSB7Ci0JCU9wZW5hYmxlIG9wZW5hYmxlUGFyZW50ID0gKE9wZW5hYmxlKWdldE9wZW5hYmxlUGFyZW50KCk7Ci0JCWlmIChvcGVuYWJsZVBhcmVudCAhPSBudWxsKSB7Ci0JCQlKYXZhRWxlbWVudEluZm8gb3BlbmFibGVQYXJlbnRJbmZvID0gKEphdmFFbGVtZW50SW5mbykgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5mbygoSUphdmFFbGVtZW50KSBvcGVuYWJsZVBhcmVudCk7Ci0JCQlpZiAob3BlbmFibGVQYXJlbnRJbmZvID09IG51bGwpIHsKLQkJCQlvcGVuYWJsZVBhcmVudC5vcGVuV2hlbkNsb3NlZChudWxsKTsKKwkvKioKKwkgKiBAc2VlIElKYXZhRWxlbWVudAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyoqCisJICogQHNlZSBJSmF2YUVsZW1lbnQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0cnVjdHVyZUtub3duKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiAoKEphdmFFbGVtZW50SW5mbylnZXRFbGVtZW50SW5mbygpKS5pc1N0cnVjdHVyZUtub3duKCk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW5kIG5vdCBwcmVzZW50IGV4Y2VwdGlvbiBmb3IgdGhpcyBlbGVtZW50LgorCSAqLworCXByb3RlY3RlZCBKYXZhTW9kZWxFeGNlcHRpb24gbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkVMRU1FTlRfRE9FU19OT1RfRVhJU1QsIHRoaXMpKTsKKwl9CisJLyoqCisJICogT3BlbnMgdGhpcyBlbGVtZW50IGFuZCBhbGwgcGFyZW50cyB0aGF0IGFyZSBub3QgYWxyZWFkeSBvcGVuLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9yIGFjY2Vzc2libGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBvcGVuSGllcmFyY2h5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmICh0aGlzIGluc3RhbmNlb2YgSU9wZW5hYmxlKSB7CisJCQkoKE9wZW5hYmxlKSB0aGlzKS5vcGVuV2hlbkNsb3NlZChudWxsKTsKKwkJfSBlbHNlIHsKKwkJCU9wZW5hYmxlIG9wZW5hYmxlUGFyZW50ID0gKE9wZW5hYmxlKWdldE9wZW5hYmxlUGFyZW50KCk7CisJCQlpZiAob3BlbmFibGVQYXJlbnQgIT0gbnVsbCkgeworCQkJCUphdmFFbGVtZW50SW5mbyBvcGVuYWJsZVBhcmVudEluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmZvKChJSmF2YUVsZW1lbnQpIG9wZW5hYmxlUGFyZW50KTsKKwkJCQlpZiAob3BlbmFibGVQYXJlbnRJbmZvID09IG51bGwpIHsKKwkJCQkJb3BlbmFibGVQYXJlbnQub3BlbldoZW5DbG9zZWQobnVsbCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKioKKwkgKiBUaGlzIGVsZW1lbnQgaGFzIGp1c3QgYmVlbiBvcGVuZWQuICBEbyBhbnkgbmVjZXNzYXJ5IHNldHVwLgorCSAqLworCXByb3RlY3RlZCB2b2lkIG9wZW5pbmcoT2JqZWN0IGluZm8pIHsKKwl9CisJLyoqCisJICovCisJcHVibGljIFN0cmluZyByZWFkYWJsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnROYW1lKCk7CisJfQorCS8qKgorCSAqIFJlbW92ZXMgYWxsIGNhY2hlZCBpbmZvIGZyb20gdGhlIEphdmEgTW9kZWwsIGluY2x1ZGluZyBhbGwgY2hpbGRyZW4sCisJICogYnV0IGRvZXMgbm90IGNsb3NlIHRoaXMgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbmZvKCkgeworCQlPYmplY3QgaW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnBlZWtBdEluZm8odGhpcyk7CisJCWlmIChpbmZvICE9IG51bGwpIHsKKwkJCWlmICh0aGlzIGluc3RhbmNlb2YgSVBhcmVudCkgeworCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChKYXZhRWxlbWVudEluZm8paW5mbykuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IHNpemU7ICsraSkgeworCQkJCQlKYXZhRWxlbWVudCBjaGlsZCA9IChKYXZhRWxlbWVudCkgY2hpbGRyZW5baV07CisJCQkJCWNoaWxkLnJlbW92ZUluZm8oKTsKKwkJCQl9CisJCQl9CisJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVJbmZvKHRoaXMpOworCQl9CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgZWxlbWVudCByb290ZWQgYXQgdGhlIGdpdmVuIHByb2plY3QuCisJICovCisJcHVibGljIGFic3RyYWN0IElKYXZhRWxlbWVudCByb290ZWRBdChJSmF2YVByb2plY3QgcHJvamVjdCk7CisJLyoqCisJICogUnVucyBhIEphdmEgTW9kZWwgT3BlcmF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9wZXJhdGlvbihKYXZhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKG9wZXJhdGlvbi5pc1JlYWRPbmx5KCkgfHwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7CisJCQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKIAkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCQkJCS8vIHVzZSBJV29ya3NwYWNlLnJ1biguLi4pIHRvIGVuc3VyZSB0aGF0IGEgYnVpbGQgd2lsbCBiZSBkb25lIGluIGF1dG9idWlsZCBtb2RlCisJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcGVyYXRpb24sIG1vbml0b3IpOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlpZiAoY2UgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5PUEVSQVRJT05fRkFJTEVEKSB7CisJCQkJCVRocm93YWJsZSBlPSBjZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKKwkJCQkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQkJCXRocm93IChKYXZhTW9kZWxFeGNlcHRpb24pIGU7CisJCQkJCX0KKwkJCQl9CisJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihjZSk7CiAJCQl9CiAJCX0KIAl9Ci19Ci0vKioKLSAqIFRoaXMgZWxlbWVudCBoYXMganVzdCBiZWVuIG9wZW5lZC4gIERvIGFueSBuZWNlc3Nhcnkgc2V0dXAuCi0gKi8KLXByb3RlY3RlZCB2b2lkIG9wZW5pbmcoT2JqZWN0IGluZm8pIHsKLX0KLQotCi0KLS8qKgotICovCi1wdWJsaWMgU3RyaW5nIHJlYWRhYmxlTmFtZSgpIHsKLQotCXJldHVybiB0aGlzLmdldEVsZW1lbnROYW1lKCk7Ci19Ci0KLS8qKgotICogUmVtb3ZlcyBhbGwgY2FjaGVkIGluZm8gZnJvbSB0aGUgSmF2YSBNb2RlbCwgaW5jbHVkaW5nIGFsbCBjaGlsZHJlbiwKLSAqIGJ1dCBkb2VzIG5vdCBjbG9zZSB0aGlzIGVsZW1lbnQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHJlbW92ZUluZm8oKSB7Ci0JT2JqZWN0IGluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wZWVrQXRJbmZvKHRoaXMpOwotCWlmIChpbmZvICE9IG51bGwpIHsKLQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBJUGFyZW50KSB7Ci0JCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSmF2YUVsZW1lbnRJbmZvKWluZm8pLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMCwgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IHNpemU7ICsraSkgewotCQkJCUphdmFFbGVtZW50IGNoaWxkID0gKEphdmFFbGVtZW50KSBjaGlsZHJlbltpXTsKLQkJCQljaGlsZC5yZW1vdmVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlSW5mbyh0aGlzKTsKKwkvKioKKwkgKiBTZXRzIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoZSBoYW5kbGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0T2NjdXJyZW5jZUNvdW50KGludCBjb3VudCkgeworCQlmT2NjdXJyZW5jZUNvdW50ID0gY291bnQ7CiAJfQotfQotLyoqCi0gKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGVsZW1lbnQgcm9vdGVkIGF0IHRoZSBnaXZlbiBwcm9qZWN0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgSUphdmFFbGVtZW50IHJvb3RlZEF0KElKYXZhUHJvamVjdCBwcm9qZWN0KTsKLS8qKgotICogUnVucyBhIEphdmEgTW9kZWwgT3BlcmF0aW9uCi0gKi8KLXByb3RlY3RlZCB2b2lkIHJ1bk9wZXJhdGlvbihKYXZhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBvY2N1cnJlbmNlIGNvdW50IG9mIHRoZSBoYW5kbGUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNldE9jY3VycmVuY2VDb3VudChpbnQgY291bnQpIHsKLQlmT2NjdXJyZW5jZUNvdW50ID0gY291bnQ7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIHRhYlN0cmluZyhpbnQgdGFiKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gdGFiOyBpID4gMDsgaS0tKQotCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiBEZWJ1Z2dpbmcgcHVycG9zZXMKLSAqLwotcHVibGljIFN0cmluZyB0b0RlYnVnU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JdGhpcy50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBOT19JTkZPKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci0vKioKLSAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXRvU3RyaW5nKDAsIGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiAgRGVidWdnaW5nIHB1cnBvc2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQlPYmplY3QgaW5mbyA9IHRoaXMudG9TdHJpbmdJbmZvKHRhYiwgYnVmZmVyKTsKLQlpZiAodGFiID09IDApIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHRhYlN0cmluZyhpbnQgdGFiKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSB0YWI7IGkgPiAwOyBpLS0pCisJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisJLyoqCisJICogRGVidWdnaW5nIHB1cnBvc2VzCisJICovCisJcHVibGljIFN0cmluZyB0b0RlYnVnU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0aGlzLnRvU3RyaW5nSW5mbygwLCBidWZmZXIsIE5PX0lORk8pOworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCS8qKgorCSAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0b1N0cmluZygwLCBidWZmZXIpOworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCS8qKgorCSAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCU9iamVjdCBpbmZvID0gdGhpcy50b1N0cmluZ0luZm8odGFiLCBidWZmZXIpOworCQlpZiAodGFiID09IDApIHsKKwkJCXRoaXMudG9TdHJpbmdBbmNlc3RvcnMoYnVmZmVyKTsKKwkJfQorCQl0aGlzLnRvU3RyaW5nQ2hpbGRyZW4odGFiLCBidWZmZXIsIGluZm8pOworCX0KKwkvKioKKwkgKiAgRGVidWdnaW5nIHB1cnBvc2VzCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXRoaXMudG9TdHJpbmdJbmZvKDAsIGJ1ZmZlciwgTk9fSU5GTyk7CiAJCXRoaXMudG9TdHJpbmdBbmNlc3RvcnMoYnVmZmVyKTsKKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogCX0KLQl0aGlzLnRvU3RyaW5nQ2hpbGRyZW4odGFiLCBidWZmZXIsIGluZm8pOwotfQotLyoqCi0gKiAgRGVidWdnaW5nIHB1cnBvc2VzCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JdGhpcy50b1N0cmluZ0luZm8oMCwgYnVmZmVyLCBOT19JTkZPKTsKLQl0aGlzLnRvU3RyaW5nQW5jZXN0b3JzKGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiAgRGVidWdnaW5nIHB1cnBvc2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nQW5jZXN0b3JzKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQlKYXZhRWxlbWVudCBwYXJlbnQgPSAoSmF2YUVsZW1lbnQpdGhpcy5nZXRQYXJlbnQoKTsKLQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJYnVmZmVyLmFwcGVuZCgiIFtpbiAiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJlbnQudG9TdHJpbmdJbmZvKDAsIGJ1ZmZlciwgTk9fSU5GTyk7Ci0JCXBhcmVudC50b1N0cmluZ0FuY2VzdG9ycyhidWZmZXIpOwotCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKKwkvKioKKwkgKiAgRGVidWdnaW5nIHB1cnBvc2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmdBbmNlc3RvcnMoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlKYXZhRWxlbWVudCBwYXJlbnQgPSAoSmF2YUVsZW1lbnQpdGhpcy5nZXRQYXJlbnQoKTsKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCIgW2luICIpOyAvLyROT04tTkxTLTEkCisJCQlwYXJlbnQudG9TdHJpbmdJbmZvKDAsIGJ1ZmZlciwgTk9fSU5GTyk7CisJCQlwYXJlbnQudG9TdHJpbmdBbmNlc3RvcnMoYnVmZmVyKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCQl9CiAJfQotfQotLyoqCi0gKiAgRGVidWdnaW5nIHB1cnBvc2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nQ2hpbGRyZW4oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKLQlpZiAoaW5mbyA9PSBudWxsIHx8ICEoaW5mbyBpbnN0YW5jZW9mIEphdmFFbGVtZW50SW5mbykpIHJldHVybjsKLQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSmF2YUVsZW1lbnRJbmZvKWluZm8pLmdldENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCSgoSmF2YUVsZW1lbnQpY2hpbGRyZW5baV0pLnRvU3RyaW5nKHRhYiArIDEsIGJ1ZmZlcik7CisJLyoqCisJICogIERlYnVnZ2luZyBwdXJwb3NlcworCSAqLworCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nQ2hpbGRyZW4oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwkJaWYgKGluZm8gPT0gbnVsbCB8fCAhKGluZm8gaW5zdGFuY2VvZiBKYXZhRWxlbWVudEluZm8pKSByZXR1cm47CisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChKYXZhRWxlbWVudEluZm8paW5mbykuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJKChKYXZhRWxlbWVudCljaGlsZHJlbltpXSkudG9TdHJpbmcodGFiICsgMSwgYnVmZmVyKTsKKwkJfQogCX0KLX0KLS8qKgotICogIERlYnVnZ2luZyBwdXJwb3NlcwotICovCi1wdWJsaWMgT2JqZWN0IHRvU3RyaW5nSW5mbyhpbnQgdGFiLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JT2JqZWN0IGluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wZWVrQXRJbmZvKHRoaXMpOwotCXRoaXMudG9TdHJpbmdJbmZvKHRhYiwgYnVmZmVyLCBpbmZvKTsKLQlyZXR1cm4gaW5mbzsKLX0KLS8qKgotICogIERlYnVnZ2luZyBwdXJwb3NlcwotICovCi1wcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKLQlidWZmZXIuYXBwZW5kKHRoaXMudGFiU3RyaW5nKHRhYikpOwotCWJ1ZmZlci5hcHBlbmQoZ2V0RWxlbWVudE5hbWUoKSk7Ci0JaWYgKGluZm8gPT0gbnVsbCkgewotCQlidWZmZXIuYXBwZW5kKCIgKG5vdCBvcGVuKSIpOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogIERlYnVnZ2luZyBwdXJwb3NlcworCSAqLworCXB1YmxpYyBPYmplY3QgdG9TdHJpbmdJbmZvKGludCB0YWIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJT2JqZWN0IGluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5wZWVrQXRJbmZvKHRoaXMpOworCQl0aGlzLnRvU3RyaW5nSW5mbyh0YWIsIGJ1ZmZlciwgaW5mbyk7CisJCXJldHVybiBpbmZvOwogCX0KLX0KLS8qKgotICogVXBkYXRlcyB0aGUgc291cmNlIGVuZCBwb3NpdGlvbiBmb3IgdGhpcyBlbGVtZW50LgotICogRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZy4KLSAqLwotcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZUVuZE9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgewotfQotLyoqCi0gKiBVcGRhdGVzIHRoZSBzb3VyY2UgcG9zaXRpb25zIGZvciB0aGlzIGVsZW1lbnQuCi0gKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nLgotICovCi1wdWJsaWMgdm9pZCB0cmlnZ2VyU291cmNlUmFuZ2VPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKLQotfQorCS8qKgorCSAqICBEZWJ1Z2dpbmcgcHVycG9zZXMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZ0luZm8oaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgT2JqZWN0IGluZm8pIHsKKwkJYnVmZmVyLmFwcGVuZCh0aGlzLnRhYlN0cmluZyh0YWIpKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwkJaWYgKGluZm8gPT0gbnVsbCkgeworCQkJYnVmZmVyLmFwcGVuZCgiIChub3Qgb3BlbikiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YS5qYXZhCmluZGV4IDc1MTg3NTQuLmM5MjUxNDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yMzUsNiArMjM1LDEyIEBACiAJaW5zZXJ0RGVsdGFUcmVlKGVsZW1lbnQsIGNoYW5nZWREZWx0YSk7CiB9CiAvKioKKyAqIE1hcmsgdGhpcyBkZWx0YSBhcyBhIGNvbnRlbnQgY2hhbmdlZCBkZWx0YS4KKyAqLworcHVibGljIHZvaWQgY29udGVudENoYW5nZWQoKSB7CisJZkNoYW5nZUZsYWdzIHw9IEZfQ09OVEVOVDsKK30KKy8qKgogICogQ2xvbmUgdGhpcyBkZWx0YSBzbyB0aGF0IGl0cyBlbGVtZW50cyBhcmUgcm9vdGVkIGF0IHRoZSBnaXZlbiBwcm9qZWN0LgogICovCiBwdWJsaWMgSUphdmFFbGVtZW50RGVsdGEgY2xvbmUoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKQEAgLTMyNCw2ICszMzAsOSBAQAogICogTWFyayB0aGlzIGRlbHRhIGFzIGEgZmluZS1ncmFpbmVkIGRlbHRhLgogICovCiBwdWJsaWMgdm9pZCBmaW5lR3JhaW5lZCgpIHsKKwlpZiAoZktpbmQgPT0gMCkgeyAvLyBpZiBub3Qgc2V0IHlldAorCQlmS2luZCA9IENIQU5HRUQ7CisJfQogCWZDaGFuZ2VGbGFncyB8PSBGX0ZJTkVfR1JBSU5FRDsKIH0KIC8qKgpAQCAtNjQ2LDEwICs2NTUsMTAgQEAKIAkJYnVmZmVyLmFwcGVuZCgiUkVNT1ZFRCBGUk9NIENMQVNTUEFUSCIpOyAvLyROT04tTkxTLTEkCiAJCXByZXYgPSB0cnVlOwogCX0KLQlpZiAoKGNoYW5nZUZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfUkVPUkRFUikgIT0gMCkgeworCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFT1JERVIpICE9IDApIHsKIAkJaWYgKHByZXYpCiAJCQlidWZmZXIuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJSRU9SREVSRUQgSU4gQ0xBU1NQQVRIIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgiUkVPUkRFUkVEIik7IC8vJE5PTi1OTFMtMSQKIAkJcHJldiA9IHRydWU7CiAJfQogCWlmICgoY2hhbmdlRmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEKSAhPSAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIuamF2YQppbmRleCA0NThjNDM0Li4wNGQ2ZGQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudERlbHRhQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50RGVsdGFCdWlsZGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xNywxMSArMTcsOSBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEEgamF2YSBlbGVtZW50IGRlbHRhIGJpdWxkZXIgY3JlYXRlcyBhIGphdmEgZWxlbWVudCBkZWx0YSBvbgpAQCAtMTM5LDYgKzEzNywxMCBAQAogCXRoaXMuZmluZERlbGV0aW9ucygpOwogCXRoaXMuZmluZENoYW5nZXNJblBvc2l0aW9uaW5nKHRoaXMuamF2YUVsZW1lbnQsIDApOwogCXRoaXMudHJpbURlbHRhKHRoaXMuZGVsdGEpOworCWlmICh0aGlzLmRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgeworCQkvLyB0aGlzIGlzIGEgZmluZSBncmFpbmVkIGJ1dCBub3QgY2hpbGRyZW4gYWZmZWN0ZWQgLT4gbWFyayBhcyBjb250ZW50IGNoYW5nZWQKKwkJdGhpcy5kZWx0YS5jb250ZW50Q2hhbmdlZCgpOworCX0KIH0KIC8qKgogICogRmluZHMgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIG9yIGNoYW5nZWQuCkBAIC0xNjAsNyArMTYyLDcgQEAKIAogCUphdmFFbGVtZW50SW5mbyBuZXdJbmZvID0gbnVsbDsKIAl0cnkgeyAKLQkJbmV3SW5mbyA9ICgoSmF2YUVsZW1lbnQpbmV3RWxlbWVudCkuZ2V0RWxlbWVudEluZm8oKTsKKwkJbmV3SW5mbyA9IChKYXZhRWxlbWVudEluZm8pKChKYXZhRWxlbWVudCluZXdFbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOwogCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKIAkJcmV0dXJuOwogCX0KQEAgLTE4NiwxNCArMTg4LDEzIEBACiAJCXJldHVybjsKIAkJCiAJaWYgKCFpc1Bvc2l0aW9uZWRDb3JyZWN0bHkoZWxlbWVudCkpIHsKLQkJdGhpcy5kZWx0YS5yZW1vdmVkKGVsZW1lbnQpOwotCQl0aGlzLmRlbHRhLmFkZGVkKGVsZW1lbnQpOworCQl0aGlzLmRlbHRhLmNoYW5nZWQoZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKTsKIAl9IAogCQogCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhcmVudCkgewogCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IG51bGw7CiAJCXRyeSB7IAotCQkJaW5mbyA9ICgoSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudEluZm8oKTsKKwkJCWluZm8gPSAoSmF2YUVsZW1lbnRJbmZvKSgoSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudEluZm8oKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewogCQkJcmV0dXJuOwogCQl9CkBAIC0yOTIsNzkgKzI5MywyMiBAQAogCX0KIH0KIC8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlbGVtZW50cyByZXByZXNlbnQgdGhlIGFuIGVxdWl2YWxlbnQgZGVjbGFyYXRpb24uCi0gKgotICogPHA+Tk9URTogU2luY2UgdGhpcyBjb21wYXJpc29uIGNhbiBiZSBkb25lIHdpdGggaGFuZGxlIGluZm8gb25seSwKLSAqIG5vbmUgb2YgdGhlIGludGVybmFsIGNhbGxzIG5lZWQgdG8gdXNlIHRoZSBsb2NhbGx5IGNhY2hlZCBjb250ZW50cwotICogb2YgdGhlIG9sZCBjb21waWxhdGlvbiB1bml0LgotICovCi1wcml2YXRlIGJvb2xlYW4gaXNJZGVudGljYWwoSmF2YUVsZW1lbnQgZTEsIEphdmFFbGVtZW50IGUyKSB7Ci0JaWYgKGUxID09IG51bGwgXiBlMiA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGUxID09IG51bGwpCi0JCXJldHVybiB0cnVlOwotCQkKLQlpZiAoZTEuZkxFVHlwZSA9PSBlMi5mTEVUeXBlKSB7Ci0JCWlmIChlMS5nZXRPY2N1cnJlbmNlQ291bnQoKSAhPSBlMi5nZXRPY2N1cnJlbmNlQ291bnQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJc3dpdGNoIChlMS5mTEVUeXBlKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTjoKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046Ci0JCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgotCQkJCXJldHVybiBlMS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlMi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0JCQkJSVR5cGUgdDE9IChJVHlwZSllMTsKLQkJCQlJVHlwZSB0Mj0gKElUeXBlKWUyOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiAoISh0MS5pc0NsYXNzKCkgXiB0Mi5pc0NsYXNzKCkpICYmIHQxLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHQyLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotCQkJCUlNZXRob2QgbTE9IChJTWV0aG9kKWUxOwotCQkJCUlNZXRob2QgbTI9IChJTWV0aG9kKWUyOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBtMS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhtMi5nZXRFbGVtZW50TmFtZSgpKSAmJiBtMS5nZXRTaWduYXR1cmUoKS5lcXVhbHMobTIuZ2V0U2lnbmF0dXJlKCkpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQljYXNlIElKYXZhRWxlbWVudC5JTklUSUFMSVpFUjoKLQkJCWNhc2UgSUphdmFFbGVtZW50LklNUE9SVF9DT05UQUlORVI6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0vKioKLSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgZWxlbWVudHMgcG9zaXRpb24gaGFzIG5vdCBjaGFuZ2VkLgotICogVGFrZXMgaW50byBhY2NvdW50IGFkZGl0aW9ucyBzbyB0aGF0IGVsZW1lbnRzIGZvbGxvd2luZwotICogbmV3IGVsZW1lbnRzIHdpbGwgbm90IGFwcGVhciBvdXQgb2YgcGxhY2UuCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZC4KICAqLwogcHJpdmF0ZSBib29sZWFuIGlzUG9zaXRpb25lZENvcnJlY3RseShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewogCUxpc3RJdGVtIG9sZExpc3RJdGVtID0gdGhpcy5nZXRPbGRQb3NpdGlvbihlbGVtZW50KTsKLQlpZiAob2xkTGlzdEl0ZW0gPT0gbnVsbCkKLQkJcmV0dXJuIGZhbHNlOwotCUlKYXZhRWxlbWVudCBvbGRQcmV2aW91cyA9IG9sZExpc3RJdGVtLnByZXZpb3VzOworCWlmIChvbGRMaXN0SXRlbSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCiAJTGlzdEl0ZW0gbmV3TGlzdEl0ZW0gPSB0aGlzLmdldE5ld1Bvc2l0aW9uKGVsZW1lbnQpOwotCWlmIChuZXdMaXN0SXRlbSA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JSUphdmFFbGVtZW50IG5ld1ByZXZpb3VzID0gbmV3TGlzdEl0ZW0ucHJldmlvdXM7IAotCWlmIChvbGRQcmV2aW91cyA9PSBuZXdQcmV2aW91cykKLQkJcmV0dXJuIHRydWU7Ci0JSUphdmFFbGVtZW50IGxhc3ROZXdQcmV2aW91cyA9IG51bGw7Ci0Jd2hpbGUobGFzdE5ld1ByZXZpb3VzICE9IG5ld1ByZXZpb3VzKSB7Ci0JCWlmIChpc0lkZW50aWNhbCgoSmF2YUVsZW1lbnQpb2xkUHJldmlvdXMsIChKYXZhRWxlbWVudCluZXdQcmV2aW91cykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJbGFzdE5ld1ByZXZpb3VzID0gbmV3UHJldmlvdXM7Ci0JCS8vIGlmIG5ld1ByZXZpb3VzIGlzIG51bGwgYXQgdGhpcyB0aW1lIHdlIHNob3VsZCBleGl0IHRoZSBsb29wLgotCQlpZiAobmV3UHJldmlvdXMgPT0gbnVsbCkgYnJlYWs7Ci0JCW5ld1ByZXZpb3VzID0gKHRoaXMuZ2V0TmV3UG9zaXRpb24obmV3UHJldmlvdXMpKS5wcmV2aW91czsKKwlpZiAobmV3TGlzdEl0ZW0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQorCUlKYXZhRWxlbWVudCBvbGRQcmV2aW91cyA9IG9sZExpc3RJdGVtLnByZXZpb3VzOworCUlKYXZhRWxlbWVudCBuZXdQcmV2aW91cyA9IG5ld0xpc3RJdGVtLnByZXZpb3VzOworCWlmIChvbGRQcmV2aW91cyA9PSBudWxsKSB7CisJCXJldHVybiBuZXdQcmV2aW91cyA9PSBudWxsOworCX0gZWxzZSB7CisJCXJldHVybiBvbGRQcmV2aW91cy5lcXVhbHMobmV3UHJldmlvdXMpOwogCX0KLQlyZXR1cm4gZmFsc2U7CiB9CiBwcml2YXRlIHZvaWQgcHV0RWxlbWVudEluZm8oSUphdmFFbGVtZW50IGVsZW1lbnQsIEphdmFFbGVtZW50SW5mbyBpbmZvKSB7CiAJdGhpcy5pbmZvcy5wdXQoZWxlbWVudCwgaW5mbyk7CkBAIC00MDQsNyArMzQ4LDcgQEAKIAlpZiAoZGVwdGggPCB0aGlzLm1heERlcHRoICYmIG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBJUGFyZW50KSB7CiAJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gbnVsbDsKIAkJdHJ5IHsgCi0JCQlpbmZvID0gKChKYXZhRWxlbWVudCluZXdFbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOworCQkJaW5mbyA9IChKYXZhRWxlbWVudEluZm8pKChKYXZhRWxlbWVudCluZXdFbGVtZW50KS5nZXRFbGVtZW50SW5mbygpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CiAJCQlyZXR1cm47CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEKaW5kZXggZGRlOWI5Yy4uZmExNzE3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhRWxlbWVudFJlcXVlc3Rvci5qYXZhCmluZGV4IDRlMmI5ODMuLmY5OTQxYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFFbGVtZW50UmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YUVsZW1lbnRSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKaW5kZXggYzc2YzhjYS4uMmM5MzMzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwpAQCAtMzUsNyArMzQsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAvKioKQEAgLTY2LDE0ICs2NCwzNSBAQAogcHJvdGVjdGVkIEphdmFNb2RlbCgpIHRocm93cyBFcnJvciB7CiAJc3VwZXIoSkFWQV9NT0RFTCwgbnVsbCwgIiIgLyp3b3Jrc3BhY2UgaGFzIGVtcHR5IG5hbWUqLyk7IC8vJE5PTi1OTFMtMSQKIH0KLQotCi0KKy8qCisgKiBAc2VlIElKYXZhTW9kZWwKKyAqLworcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVJlc291cmNlIHJlc291cmNlKSB7CisJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKKwkJY2FzZSBJUmVzb3VyY2UuUk9PVDoKKwkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKKwkJCXJldHVybiB0cnVlOworCX0KKwkvLyBmaWxlIG9yIGZvbGRlcgorCUlKYXZhUHJvamVjdFtdIHByb2plY3RzOworCXRyeSB7CisJCXByb2plY3RzID0gdGhpcy5nZXRKYXZhUHJvamVjdHMoKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KXByb2plY3RzW2ldOworCQlpZiAoIXByb2plY3QuY29udGFpbnMocmVzb3VyY2UpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CiAvKioKICAqIEBzZWUgSUphdmFNb2RlbAogICovCiBwdWJsaWMgdm9pZCBjb3B5KElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBjb250YWluZXJzLCBJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncywgU3RyaW5nW10gcmVuYW1pbmdzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzWzBdICE9IG51bGwgJiYgZWxlbWVudHNbMF0uZ2V0RWxlbWVudFR5cGUoKSA8IElKYXZhRWxlbWVudC5UWVBFKSB7CisJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBlbGVtZW50c1swXSAhPSBudWxsICYmIGVsZW1lbnRzWzBdLmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuVFlQRSkgewogCQlydW5PcGVyYXRpb24obmV3IENvcHlSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBjb250YWluZXJzLCBmb3JjZSksIGVsZW1lbnRzLCBzaWJsaW5ncywgcmVuYW1pbmdzLCBtb25pdG9yKTsKIAl9IGVsc2UgewogCQlydW5PcGVyYXRpb24obmV3IENvcHlFbGVtZW50c09wZXJhdGlvbihlbGVtZW50cywgY29udGFpbmVycywgZm9yY2UpLCBlbGVtZW50cywgc2libGluZ3MsIHJlbmFtaW5ncywgbW9uaXRvcik7CkBAIC05MCw3ICsxMDksNyBAQAogICogQHNlZSBJSmF2YU1vZGVsCiAgKi8KIHB1YmxpYyB2b2lkIGRlbGV0ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50c1swXSAhPSBudWxsICYmIGVsZW1lbnRzWzBdLmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuVFlQRSkgeworCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgZWxlbWVudHNbMF0gIT0gbnVsbCAmJiBlbGVtZW50c1swXS5nZXRFbGVtZW50VHlwZSgpIDwgSUphdmFFbGVtZW50LlRZUEUpIHsKIAkJcnVuT3BlcmF0aW9uKG5ldyBEZWxldGVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBmb3JjZSksIG1vbml0b3IpOwogCX0gZWxzZSB7CiAJCXJ1bk9wZXJhdGlvbihuZXcgRGVsZXRlRWxlbWVudHNPcGVyYXRpb24oZWxlbWVudHMsIGZvcmNlKSwgbW9uaXRvcik7CkBAIC0xMzEsMTYgKzE1MCwxMiBAQAogCiAJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucHV0SW5mbyh0aGlzLCBpbmZvKTsKIAkvLyBkZXRlcm1pbmUgbXkgY2hpbGRyZW4KLQl0cnkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gdGhpcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlpZiAocHJvamVjdC5pc09wZW4oKSAmJiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJaW5mby5hZGRDaGlsZChnZXRKYXZhUHJvamVjdChwcm9qZWN0KSk7Ci0JCQl9CisJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwlmb3IgKGludCBpID0gMCwgbWF4ID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOworCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgeworCQkJaW5mby5hZGRDaGlsZChnZXRKYXZhUHJvamVjdChwcm9qZWN0KSk7CiAJCX0KLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0yMDUsNiArMjIwLDIxIEBACiAJcmV0dXJuIGNmLmdldFR5cGUoKTsKIH0KIC8qKgorICogUmV0dXJucyB0aGUgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+IHJlcHJlc2VudGVkIGJ5IHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgKiBtZW1lbnRvLgorICogQHNlZSBnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEhhbmRsZUZyb21NZW1lbnRvRm9yUm9vdChTdHJpbmcgbWVtZW50bywgSmF2YVByb2plY3QgcHJvamVjdCwgaW50IHByb2plY3RFbmQsIGludCByb290RW5kKSB7CisJU3RyaW5nIHJvb3ROYW1lID0gbnVsbDsKKwlpZiAocm9vdEVuZCA9PSBwcm9qZWN0RW5kIC0gMSkgeworCQkvL2RlZmF1bHQgcm9vdAorCQlyb290TmFtZSA9IElQYWNrYWdlRnJhZ21lbnRSb290LkRFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSDsKKwl9IGVsc2UgeworCQlyb290TmFtZSA9IG1lbWVudG8uc3Vic3RyaW5nKHByb2plY3RFbmQgKyAxLCByb290RW5kKTsKKwl9CisJcmV0dXJuIHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChuZXcgUGF0aChyb290TmFtZSkpOworfQorLyoqCiAgKiBSZXR1cm5zIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IHJlcHJlc2VudGVkIGJ5IHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CiAgKiBtZW1lbnRvLgogICogQHNlZSBnZXRIYW5kbGVNZW1lbnRvKCkKQEAgLTMxNSwyNiArMzQ1LDE0IEBACiAgKiBjb250cmlidXRpb24gdG8gYSBtZW1lbnRvLgogICovCiBwcm90ZWN0ZWQgY2hhciBnZXRIYW5kbGVNZW1lbnRvRGVsaW1pdGVyKCl7Ci0JQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgVXRpbC5iaW5kKCJhc3NlcnQuc2hvdWxkTm90SW1wbGVtZW50IikpOyAvLyROT04tTkxTLTEkCisJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlNob3VsZCBub3QgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gMDsKIH0KIC8qKgotICogQHNlZSBJSmF2YUVsZW1lbnQKLSAqLwotcHVibGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCXJldHVybiB0aGlzOwotfQotLyoqCi0gKiBAc2VlIElKYXZhRWxlbWVudAotICovCi1wdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCXJldHVybiBudWxsOwotfQotLyoqCiAgKiBAc2VlIElKYXZhTW9kZWwKICAqLwogcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChTdHJpbmcgbmFtZSkgewotCXJldHVybiBuZXcgSmF2YVByb2plY3QodGhpcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKSwgdGhpcyk7CisJcmV0dXJuIG5ldyBKYXZhUHJvamVjdChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSksIHRoaXMpOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgSmF2YSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCkBAIC0zNDUsMTQgKzM2MywxNSBAQAogICogaXMgbm90IG9uZSBvZiBhbiBJUHJvamVjdCwgSUZvbGRlciwgb3IgSUZpbGUuCiAgKi8KIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCXJldHVybiBuZXcgSmF2YVByb2plY3QoKChJRm9sZGVyKXJlc291cmNlKS5nZXRQcm9qZWN0KCksIHRoaXMpOwotCX0gZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCXJldHVybiBuZXcgSmF2YVByb2plY3QoKChJRmlsZSlyZXNvdXJjZSkuZ2V0UHJvamVjdCgpLCB0aGlzKTsKLQl9IGVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQlyZXR1cm4gbmV3IEphdmFQcm9qZWN0KChJUHJvamVjdClyZXNvdXJjZSwgdGhpcyk7Ci0JfSBlbHNlIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihVdGlsLmJpbmQoImVsZW1lbnQuaW52YWxpZFJlc291cmNlRm9yUHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCXN3aXRjaChyZXNvdXJjZS5nZXRUeXBlKCkpeworCQljYXNlIElSZXNvdXJjZS5GT0xERVI6CisJCQlyZXR1cm4gbmV3IEphdmFQcm9qZWN0KCgoSUZvbGRlcilyZXNvdXJjZSkuZ2V0UHJvamVjdCgpLCB0aGlzKTsKKwkJY2FzZSBJUmVzb3VyY2UuRklMRToKKwkJCXJldHVybiBuZXcgSmF2YVByb2plY3QoKChJRmlsZSlyZXNvdXJjZSkuZ2V0UHJvamVjdCgpLCB0aGlzKTsKKwkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKKwkJCXJldHVybiBuZXcgSmF2YVByb2plY3QoKElQcm9qZWN0KXJlc291cmNlLCB0aGlzKTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJlbGVtZW50LmludmFsaWRSZXNvdXJjZUZvclByb2plY3QiKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CiAvKioKQEAgLTM2NiwxMiArMzg1LDE5IEBACiAKIH0KIC8qKgorICogQHNlZSBJSmF2YU1vZGVsCisgKi8KK3B1YmxpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiAoKEphdmFNb2RlbEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKK30KKworLyoqCiAgKiBXb3JrYXJvdW5kIGZvciBidWcgMTUxNjggY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZCAKICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgamF2YSBwcm9qZWN0cyBiZWZvcmUgcmVzb3VyY2UgZGVsdGEgcHJvY2Vzc2luZwogICogaGFzIHN0YXJ0ZWQuCiAgKi8KIHB1YmxpYyBJSmF2YVByb2plY3RbXSBnZXRPbGRKYXZhUHJvamVjdHNMaXN0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gdGhpcy5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CiAJcmV0dXJuIAogCQltYW5hZ2VyLmphdmFQcm9qZWN0c0NhY2hlID09IG51bGwgPyAKIAkJCXRoaXMuZ2V0SmF2YVByb2plY3RzKCkgOiAKQEAgLTQwNiw3ICs0MzIsNyBAQAogICogQHNlZSBJSmF2YU1vZGVsCiAgKi8KIHB1YmxpYyB2b2lkIG1vdmUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHNbMF0gIT0gbnVsbCAmJiBlbGVtZW50c1swXS5nZXRFbGVtZW50VHlwZSgpIDwgSUphdmFFbGVtZW50LlRZUEUpIHsKKwlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwICYmIGVsZW1lbnRzWzBdICE9IG51bGwgJiYgZWxlbWVudHNbMF0uZ2V0RWxlbWVudFR5cGUoKSA8IElKYXZhRWxlbWVudC5UWVBFKSB7CiAJCXJ1bk9wZXJhdGlvbihuZXcgTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24oZWxlbWVudHMsIGNvbnRhaW5lcnMsIGZvcmNlKSwgZWxlbWVudHMsIHNpYmxpbmdzLCByZW5hbWluZ3MsIG1vbml0b3IpOwogCX0gZWxzZSB7CiAJCXJ1bk9wZXJhdGlvbihuZXcgTW92ZUVsZW1lbnRzT3BlcmF0aW9uKGVsZW1lbnRzLCBjb250YWluZXJzLCBmb3JjZSksIGVsZW1lbnRzLCBzaWJsaW5ncywgcmVuYW1pbmdzLCBtb25pdG9yKTsKQEAgLTQyMCw3ICs0NDYsNyBAQAogCWlmIChlbGVtZW50c1Njb3BlID09IG51bGwpewogCQllbGVtZW50c1Njb3BlID0gbmV3IElKYXZhRWxlbWVudFtdIHsgdGhpcyB9OwogCX0KLQlnZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFQcm9jZXNzb3IuY2hlY2tFeHRlcm5hbEFyY2hpdmVDaGFuZ2VzKGVsZW1lbnRzU2NvcGUsIG1vbml0b3IpOworCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yLmNoZWNrRXh0ZXJuYWxBcmNoaXZlQ2hhbmdlcyhlbGVtZW50c1Njb3BlLCBtb25pdG9yKTsKIH0KIAogLyoqCkBAIC00MjgsNyArNDU0LDcgQEAKICAqLwogcHVibGljIHZvaWQgcmVuYW1lKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIFN0cmluZ1tdIHJlbmFtaW5ncywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlNdWx0aU9wZXJhdGlvbiBvcDsKLQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50c1swXSAhPSBudWxsICYmIGVsZW1lbnRzWzBdLmdldEVsZW1lbnRUeXBlKCkgPCBJSmF2YUVsZW1lbnQuVFlQRSkgeworCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgZWxlbWVudHNbMF0gIT0gbnVsbCAmJiBlbGVtZW50c1swXS5nZXRFbGVtZW50VHlwZSgpIDwgSUphdmFFbGVtZW50LlRZUEUpIHsKIAkJb3AgPSBuZXcgUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbihlbGVtZW50cywgZGVzdGluYXRpb25zLCByZW5hbWluZ3MsIGZvcmNlKTsKIAl9IGVsc2UgewogCQlvcCA9IG5ldyBSZW5hbWVFbGVtZW50c09wZXJhdGlvbihlbGVtZW50cywgZGVzdGluYXRpb25zLCByZW5hbWluZ3MsIGZvcmNlKTsKQEAgLTQ3NiwxMSArNTAyLDE5IEBACiAJaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCiAJLy8gbG9va3VwIC0gaW5zaWRlIHRoZSBjb250YWluZXIKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZmluZE1lbWJlcihwYXRoKTsKLQlpZiAocmVzb3VyY2UgIT0gbnVsbCl7Ci0JCWlmICghY2hlY2tSZXNvdXJjZUV4aXN0ZW5jZSB8fHJlc291cmNlLmV4aXN0cygpKSByZXR1cm4gcmVzb3VyY2U7Ci0JCXJldHVybiBudWxsOworCWlmIChwYXRoLmdldERldmljZSgpID09IG51bGwpIHsgLy8gY29udGFpbmVyIHJlbGF0aXZlIHBhdGhzIHNob3VsZCBub3QgY29udGFpbiBhIGRldmljZSAKKwkJCQkJCQkJCQkJCS8vIChzZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY4NCkKKwkJCQkJCQkJCQkJCS8vIChjYXNlIG9mIGEgd29ya3NwYWNlIHJvb3RlZCBhdCBkOlwgKQorCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZmluZE1lbWJlcihwYXRoKTsKKwkJaWYgKHJlc291cmNlICE9IG51bGwpeworCQkJaWYgKCFjaGVja1Jlc291cmNlRXhpc3RlbmNlIHx8cmVzb3VyY2UuZXhpc3RzKCkpIHJldHVybiByZXNvdXJjZTsKKwkJCXJldHVybiBudWxsOworCQl9CiAJfQorCQorCS8vIGlmIHBhdGggaXMgcmVsYXRpdmUsIGl0IGNhbm5vdCBiZSBhbiBleHRlcm5hbCBwYXRoCisJLy8gKHNlZSBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNTE3KQorCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOyAKIAogCS8vIGxvb2t1cCAtIG91dHNpZGUgdGhlIGNvbnRhaW5lcgogCUZpbGUgZXh0ZXJuYWxGaWxlID0gbmV3IEZpbGUocGF0aC50b09TU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbENhY2hlLmphdmEKaW5kZXggYjI2MzkxYy4uOTU3MjE3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbEluZm8uamF2YQppbmRleCAxMDBjYmI2Li44MDFmZGVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsSW5mby5qYXZhCkBAIC0xLDE1ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CisKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgSUphdmFNb2RlbC4gQSBKYXZhIE1vZGVsIGlzIHNwZWNpZmljIHRvIGEKICAqIHdvcmtzcGFjZS4KQEAgLTE4LDEyICsyMSw1MCBAQAogICovCiBwdWJsaWMgY2xhc3MgSmF2YU1vZGVsSW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8gewogCi0KKwkvKioKKwkgKiBBIGFycmF5IHdpdGggYWxsIHRoZSBub24tamF2YSBwcm9qZWN0cyBjb250YWluZWQgYnkgdGhpcyBtb2RlbAorCSAqLworCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXM7CiAKIC8qKgogICogQ29uc3RydWN0cyBhIG5ldyBKYXZhIE1vZGVsIEluZm8gCiAgKi8KIHByb3RlY3RlZCBKYXZhTW9kZWxJbmZvKCkgewogfQorLyoqCisgKiBDb21wdXRlIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoaXMgamF2YSBwcm9qZWN0LgorICovCitwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKCkgeworCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisJaW50IGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsKKwlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gbnVsbDsKKwlpbnQgaW5kZXggPSAwOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOworCQlpZiAoIUphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocHJvamVjdCkpIHsKKwkJCWlmIChub25KYXZhUmVzb3VyY2VzID09IG51bGwpIHsKKwkJCQlub25KYXZhUmVzb3VyY2VzID0gbmV3IE9iamVjdFtsZW5ndGhdOworCQkJfQorCQkJbm9uSmF2YVJlc291cmNlc1tpbmRleCsrXSA9IHByb2plY3Q7CisJCX0KKwl9CisJaWYgKGluZGV4ID09IDApIHJldHVybiBOT19OT05fSkFWQV9SRVNPVVJDRVM7CisJaWYgKGluZGV4IDwgbGVuZ3RoKSB7CisJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgbm9uSmF2YVJlc291cmNlcyA9IG5ldyBPYmplY3RbaW5kZXhdLCAwLCBpbmRleCk7CisJfQorCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworfQogCisvKioKKyAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCisgKi8KK09iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoKSB7CisKKwlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gdGhpcy5ub25KYXZhUmVzb3VyY2VzOworCWlmIChub25KYXZhUmVzb3VyY2VzID09IG51bGwpIHsKKwkJbm9uSmF2YVJlc291cmNlcyA9IGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKCk7CisJCXRoaXMubm9uSmF2YVJlc291cmNlcyA9IG5vbkphdmFSZXNvdXJjZXM7CisJfQorCXJldHVybiBub25KYXZhUmVzb3VyY2VzOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsTWFuYWdlci5qYXZhCmluZGV4IGUzMjM1YzUuLjZmODhhMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbE1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxNYW5hZ2VyLmphdmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YQppbmRleCBjZWI1NDg5Li4wNDdiYzEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxPcGVyYXRpb24uamF2YQpAQCAtMSw0NCArMSw2NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5QZXJUaHJlYWRPYmplY3Q7CiAKIC8qKgogICogRGVmaW5lcyBiZWhhdmlvciBjb21tb24gdG8gYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIHsKKwlwcm90ZWN0ZWQgaW50ZXJmYWNlIElQb3N0QWN0aW9uIHsKKwkJLyoKKwkJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBhY3Rpb24uCisJCSAqIEBzZWUgSmF2YU1vZGVsT3BlcmF0aW9uI3Bvc3RBY3Rpb24KKwkJICovCisJCVN0cmluZyBnZXRJRCgpOworCQkvKgorCQkgKiBSdW4gdGhpcyBhY3Rpb24uCisJCSAqLworCQl2b2lkIHJ1bigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJfQorCS8qCisJICogQ29uc3RhbnRzIGNvbnRyb2xsaW5nIHRoZSBpbnNlcnRpb24gbW9kZSBvZiBhbiBhY3Rpb24uCisJICogQHNlZSBKYXZhTW9kZWxPcGVyYXRpb24jcG9zdEFjdGlvbgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFQUEVORCA9IDE7IC8vIGluc2VydCBhdCB0aGUgZW5kCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFQUxMX0FQUEVORCA9IDI7IC8vIHJlbW92ZSBhbGwgZXhpc3Rpbmcgb25lcyB3aXRoIHNhbWUgSUQsIGFuZCBhZGQgbmV3IG9uZSBhdCB0aGUgZW5kCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgS0VFUF9FWElTVElORyA9IDM7IC8vIGRvIG5vdCBpbnNlcnQgaWYgYWxyZWFkeSBleGlzdGluZyB3aXRoIHNhbWUgSUQKKwkKKwkvKgorCSAqIFdoZXRoZXIgdHJhY2luZyBwb3N0IGFjdGlvbnMgaXMgZW5hYmxlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gUE9TVF9BQ1RJT05fVkVSQk9TRTsKKworCS8qCisJICogQSBsaXN0IG9mIElQb3N0QWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgSVBvc3RBY3Rpb25bXSBhY3Rpb25zOworCXByb3RlY3RlZCBpbnQgYWN0aW9uc1N0YXJ0ID0gMDsKKwlwcm90ZWN0ZWQgaW50IGFjdGlvbnNFbmQgPSAtMTsKKwkvKgorCSAqIEEgSGFzaE1hcCBvZiBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgb3BlcmF0aW9ucworCSAqLworCXByb3RlY3RlZCBIYXNoTWFwIGF0dHJpYnV0ZXM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiA9ICJoYXNNb2RpZmllZFJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKKwkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAorCQkKIAkvKioKIAkgKiBUaGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gb3BlcmF0ZXMgb24sCiAJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KQEAgLTU4LDE0ICs4MSw3IEBACiAJICovCiAJcHJvdGVjdGVkIHN0YXRpYyBJSmF2YUVsZW1lbnRbXSBmZ0VtcHR5UmVzdWx0PSBuZXcgSUphdmFFbGVtZW50W10ge307CiAKLQkvKioKLQkgKiBDb2xsZWN0aW9uIG9mIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPnMgY3JlYXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KLQkgKiBUaGlzIGNvbGxlY3Rpb24gc3RhcnRzIG91dCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgYmVjb21lcyBhbgotCSAqIGFycmF5IG9mIDxjb2RlPklKYXZhRWxlbWVudERlbHRhPC9jb2RlPnMgaWYgdGhlIG9wZXJhdGlvbiBjcmVhdGVzIGFueQotCSAqIGRlbHRhcy4gVGhpcyBjb2xsZWN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSmF2YSBNb2RlbCBub3RpZmljYXRpb24KLQkgKiBtYW5hZ2VyIGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFFbGVtZW50RGVsdGFbXSBmRGVsdGFzPSBudWxsOworCiAJLyoqCiAJICogVGhlIGVsZW1lbnRzIGNyZWF0ZWQgYnkgdGhpcyBvcGVyYXRpb24gLSBlbXB0eQogCSAqIHVudGlsIHRoZSBvcGVyYXRpb24gYWN0dWFsbHkgY3JlYXRlcyBlbGVtZW50cy4KQEAgLTg0LDUwNyArMTAwLDY4NiBAQAogCSAqIENvbmZsaWN0IHJlc29sdXRpb24gcG9saWN5IC0gYnkgZGVmYXVsdCBkbyBub3QgZm9yY2UgKGZhaWwgb24gYSBjb25mbGljdCkuCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gZkZvcmNlPSBmYWxzZTsKKwogCS8qCi0JICogV2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyBtb2RpZmllZCByZXNvdXJjZXMsIGFuZCB0aHVzIHdoZXRoZXIgcmVzb3VyY2UKLQkgKiBkZWx0YSBub3RpZmNhdGlvbiB3aWxsIGhhcHBlbi4KKwkgKiBBIHBlciB0aHJlYWQgc3RhY2sgb2YgamF2YSBtb2RlbCBvcGVyYXRpb25zIChQZXJUaHJlYWRPYmplY3Qgb2YgQXJyYXlMaXN0KS4KIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb2RpZmllZFJlc291cmNlID0gZmFsc2U7Ci0vKioKLSAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgotICovCi1wcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JZkVsZW1lbnRzVG9Qcm9jZXNzID0gZWxlbWVudHM7Ci19Ci0vKioKLSAqIENvbW1vbiBjb25zdHJ1Y3RvciBmb3IgYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4KLSAqLwotcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvUHJvY2VzcywgSUphdmFFbGVtZW50W10gcGFyZW50RWxlbWVudHMpIHsKLQlmRWxlbWVudHNUb1Byb2Nlc3MgPSBlbGVtZW50c1RvUHJvY2VzczsKLQlmUGFyZW50RWxlbWVudHM9IHBhcmVudEVsZW1lbnRzOwotfQotLyoqCi0gKiBBIGNvbW1vbiBjb25zdHJ1Y3RvciBmb3IgYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4KLSAqLwotcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50c1RvUHJvY2VzcywgSUphdmFFbGVtZW50W10gcGFyZW50RWxlbWVudHMsIGJvb2xlYW4gZm9yY2UpIHsKLQlmRWxlbWVudHNUb1Byb2Nlc3MgPSBlbGVtZW50c1RvUHJvY2VzczsKLQlmUGFyZW50RWxlbWVudHM9IHBhcmVudEVsZW1lbnRzOwotCWZGb3JjZT0gZm9yY2U7Ci19Ci0vKioKLSAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgotICovCi1wcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlKSB7Ci0JZkVsZW1lbnRzVG9Qcm9jZXNzID0gZWxlbWVudHM7Ci0JZkZvcmNlPSBmb3JjZTsKLX0KLS8qKgotICogQ29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgotICovCi1wcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JZkVsZW1lbnRzVG9Qcm9jZXNzID0gbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnR9OwotfQotLyoqCi0gKiBBIGNvbW1vbiBjb25zdHJ1Y3RvciBmb3IgYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4KLSAqLwotcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBmb3JjZSkgewotCWZFbGVtZW50c1RvUHJvY2VzcyA9IG5ldyBJSmF2YUVsZW1lbnRbXXtlbGVtZW50fTsKLQlmRm9yY2U9IGZvcmNlOwotfQotLyoqCi0gKiBBZGRzIHRoZSBnaXZlbiBkZWx0YSB0byB0aGUgY29sbGVjdGlvbiBvZiBkZWx0YXMKLSAqIHRoYXQgdGhpcyBvcGVyYXRpb24gaGFzIGNyZWF0ZWQuIFRoZXNlIGRlbHRhcyBhcmUKLSAqIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBKYXZhIE1vZGVsIE1hbmFnZXIKLSAqIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGFkZERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JaWYgKGZEZWx0YXMgPT0gbnVsbCkgewotCQlmRGVsdGFzPSBuZXcgSUphdmFFbGVtZW50RGVsdGFbXSB7ZGVsdGF9OwotCX0gZWxzZSB7Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gY29weT0gbmV3IElKYXZhRWxlbWVudERlbHRhW2ZEZWx0YXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZkRlbHRhcywgMCwgY29weSwgMCwgZkRlbHRhcy5sZW5ndGgpOwotCQljb3B5W2ZEZWx0YXMubGVuZ3RoXT0gZGVsdGE7Ci0JCWZEZWx0YXM9IGNvcHk7CisJcHJvdGVjdGVkIHN0YXRpYyBQZXJUaHJlYWRPYmplY3Qgb3BlcmF0aW9uU3RhY2tzID0gbmV3IFBlclRocmVhZE9iamVjdCgpOworCXByb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oKSB7CiAJfQotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IKLSAqLwotcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJZk1vbml0b3IuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7CisJLyoqCisJICogQSBjb21tb24gY29uc3RydWN0b3IgZm9yIGFsbCBKYXZhIE1vZGVsIG9wZXJhdGlvbnMuCisJICovCisJcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbihJSmF2YUVsZW1lbnRbXSBlbGVtZW50cykgeworCQlmRWxlbWVudHNUb1Byb2Nlc3MgPSBlbGVtZW50czsKIAl9Ci19Ci0vKioKLSAqIENoZWNrcyB3aXRoIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHNlZSB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uCi0gKiBzaG91bGQgYmUgY2FuY2VsZWQuIEFuIG9wZXJhdGlvbiBzaG91bGQgcmVndWxhcmx5IGNhbGwgdGhpcyBtZXRob2QKLSAqIGR1cmluZyBpdHMgb3BlcmF0aW9uIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNhbmNlbCBpdC4KLSAqCi0gKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQKLSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7Ci0JaWYgKGlzQ2FuY2VsZWQoKSkgewotCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oVXRpbC5iaW5kKCJvcGVyYXRpb24uY2FuY2VsbGVkIikpOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogQ29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorCSAqLworCXByb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIElKYXZhRWxlbWVudFtdIHBhcmVudEVsZW1lbnRzKSB7CisJCWZFbGVtZW50c1RvUHJvY2VzcyA9IGVsZW1lbnRzVG9Qcm9jZXNzOworCQlmUGFyZW50RWxlbWVudHM9IHBhcmVudEVsZW1lbnRzOwogCX0KLX0KLS8qKgotICogQ29tbW9uIGNvZGUgdXNlZCB0byB2ZXJpZnkgdGhlIGVsZW1lbnRzIHRoaXMgb3BlcmF0aW9uIGlzIHByb2Nlc3NpbmcuCi0gKiBAc2VlIEphdmFNb2RlbE9wZXJhdGlvbiN2ZXJpZnkoKQotICovCi1wcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyBjb21tb25WZXJpZnkoKSB7Ci0JaWYgKGZFbGVtZW50c1RvUHJvY2VzcyA9PSBudWxsIHx8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOworCS8qKgorCSAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorCSAqLworCXByb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIElKYXZhRWxlbWVudFtdIHBhcmVudEVsZW1lbnRzLCBib29sZWFuIGZvcmNlKSB7CisJCWZFbGVtZW50c1RvUHJvY2VzcyA9IGVsZW1lbnRzVG9Qcm9jZXNzOworCQlmUGFyZW50RWxlbWVudHM9IHBhcmVudEVsZW1lbnRzOworCQlmRm9yY2U9IGZvcmNlOwogCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgewotCQlpZiAoZkVsZW1lbnRzVG9Qcm9jZXNzW2ldID09IG51bGwpIHsKKwkvKioKKwkgKiBBIGNvbW1vbiBjb25zdHJ1Y3RvciBmb3IgYWxsIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlKSB7CisJCWZFbGVtZW50c1RvUHJvY2VzcyA9IGVsZW1lbnRzOworCQlmRm9yY2U9IGZvcmNlOworCX0KKwkKKwkvKioKKwkgKiBDb21tb24gY29uc3RydWN0b3IgZm9yIGFsbCBKYXZhIE1vZGVsIG9wZXJhdGlvbnMuCisJICovCisJcHJvdGVjdGVkIEphdmFNb2RlbE9wZXJhdGlvbihJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlmRWxlbWVudHNUb1Byb2Nlc3MgPSBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudH07CisJfQorCS8qKgorCSAqIEEgY29tbW9uIGNvbnN0cnVjdG9yIGZvciBhbGwgSmF2YSBNb2RlbCBvcGVyYXRpb25zLgorCSAqLworCXByb3RlY3RlZCBKYXZhTW9kZWxPcGVyYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gZm9yY2UpIHsKKwkJZkVsZW1lbnRzVG9Qcm9jZXNzID0gbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnR9OworCQlmRm9yY2U9IGZvcmNlOworCX0KKwkKKwkvKgorCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gYWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgYWN0aW9ucyB0byBydW4uCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uKElQb3N0QWN0aW9uIGFjdGlvbikgeworCQlpbnQgbGVuZ3RoID0gdGhpcy5hY3Rpb25zLmxlbmd0aDsKKwkJaWYgKGxlbmd0aCA9PSArK3RoaXMuYWN0aW9uc0VuZCkgeworCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmFjdGlvbnMsIDAsIHRoaXMuYWN0aW9ucyA9IG5ldyBJUG9zdEFjdGlvbltsZW5ndGgqMl0sIDAsIGxlbmd0aCk7CisJCX0KKwkJdGhpcy5hY3Rpb25zW3RoaXMuYWN0aW9uc0VuZF0gPSBhY3Rpb247CisJfQorCS8qCisJICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBkZWx0YSB3aXRoIHRoZSBKYXZhIE1vZGVsIE1hbmFnZXIuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVnaXN0ZXJKYXZhTW9kZWxEZWx0YShkZWx0YSk7CisJfQorCS8qCisJICogUmVnaXN0ZXJzIHRoZSBnaXZlbiByZWNvbmNpbGUgZGVsdGEgd2l0aCB0aGUgSmF2YSBNb2RlbCBNYW5hZ2VyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJlY29uY2lsZURlbHRhKElXb3JraW5nQ29weSB3b3JraW5nQ29weSwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJSGFzaE1hcCByZWNvbmNpbGVEZWx0YXMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZWNvbmNpbGVEZWx0YXM7CisJCUphdmFFbGVtZW50RGVsdGEgcHJldmlvdXNEZWx0YSA9IChKYXZhRWxlbWVudERlbHRhKXJlY29uY2lsZURlbHRhcy5nZXQod29ya2luZ0NvcHkpOworCQlpZiAocHJldmlvdXNEZWx0YSAhPSBudWxsKSB7CisJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA9IChKYXZhRWxlbWVudERlbHRhKWNoaWxkcmVuW2ldOworCQkJCXByZXZpb3VzRGVsdGEuaW5zZXJ0RGVsdGFUcmVlKGNoaWxkLmdldEVsZW1lbnQoKSwgY2hpbGQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmVjb25jaWxlRGVsdGFzLnB1dCh3b3JraW5nQ29weSwgZGVsdGEpOworCQl9CisJfQorCS8qCisJICogRGVyZWdpc3RlciB0aGUgcmVjb25jaWxlIGRlbHRhIGZvciB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5CisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVjb25jaWxlRGVsdGEoSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7CisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlY29uY2lsZURlbHRhcy5yZW1vdmUod29ya2luZ0NvcHkpOwkJCisJfQorCS8qKgorCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorCSAqLworCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgeworCQlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQkJZk1vbml0b3IuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7CisJCX0KKwl9CisJLyoqCisJICogQ2hlY2tzIHdpdGggdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gc2VlIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24KKwkgKiBzaG91bGQgYmUgY2FuY2VsZWQuIEFuIG9wZXJhdGlvbiBzaG91bGQgcmVndWxhcmx5IGNhbGwgdGhpcyBtZXRob2QKKwkgKiBkdXJpbmcgaXRzIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjYW5jZWwgaXQuCisJICoKKwkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQKKwkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7CisJCWlmIChpc0NhbmNlbGVkKCkpIHsKKwkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihVdGlsLmJpbmQoIm9wZXJhdGlvbi5jYW5jZWxsZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkvKioKKwkgKiBDb21tb24gY29kZSB1c2VkIHRvIHZlcmlmeSB0aGUgZWxlbWVudHMgdGhpcyBvcGVyYXRpb24gaXMgcHJvY2Vzc2luZy4KKwkgKiBAc2VlIEphdmFNb2RlbE9wZXJhdGlvbiN2ZXJpZnkoKQorCSAqLworCXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIGNvbW1vblZlcmlmeSgpIHsKKwkJaWYgKGZFbGVtZW50c1RvUHJvY2VzcyA9PSBudWxsIHx8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGggPT0gMCkgewogCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKIAkJfQotCX0KLQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwotfQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSByZXNvdXJjZXMKLSAqLwotcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBnZXRTdWJQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzLmxlbmd0aCk7Ci0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSByZXNvdXJjZXNbMF0uZ2V0V29ya3NwYWNlKCk7Ci0JdHJ5IHsKLQkJd29ya3NwYWNlLmNvcHkocmVzb3VyY2VzLCBkZXN0aW5hdGlvblBhdGgsIGZhbHNlLCBzdWJQcm9ncmVzc01vbml0b3IpOwotCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwotCX0KLX0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIGZpbGUKLSAqLwotcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJQ29udGFpbmVyIGZvbGRlciwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJRmlsZSBmaWxlPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChuYW1lKSk7Ci0JdHJ5IHsKLQkJZmlsZS5jcmVhdGUoCi0JCQljb250ZW50cywgCi0JCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKLQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7Ci0JfQotfQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgZm9sZGVyCi0gKi8KLXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvbGRlcihJQ29udGFpbmVyIHBhcmVudEZvbGRlciwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlGb2xkZXIgZm9sZGVyPSBwYXJlbnRGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKG5hbWUpKTsKLQl0cnkgewotCQkvLyB3ZSBzaG91bGQgdXNlIHRydWUgdG8gY3JlYXRlIHRoZSBmaWxlIGxvY2FsbHkuIE9ubHkgVkNNIHNob3VsZCB1c2UgdHJ1L2ZhbHNlCi0JCWZvbGRlci5jcmVhdGUoCi0JCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAotCQkJdHJ1ZSwgLy8gbG9jYWwKLQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7Ci0JfQotfQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGFuIGVtcHR5IHBhY2thZ2UgZnJhZ21lbnQKLSAqLwotcHJvdGVjdGVkIHZvaWQgZGVsZXRlRW1wdHlQYWNrYWdlRnJhZ21lbnQoCi0JSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCwKLQlib29sZWFuIGZvcmNlKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JSUNvbnRhaW5lciByZXNvdXJjZSA9IChJQ29udGFpbmVyKSBmcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gZnJhZ21lbnQuZ2V0UGFyZW50KCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0KLQl0cnkgewotCQlyZXNvdXJjZS5kZWxldGUoCi0JCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKLQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7Ci0JCXdoaWxlIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCS8vIGRlbGV0aW5nIGEgcGFja2FnZTogZGVsZXRlIHRoZSBwYXJlbnQgaWYgaXQgaXMgZW1wdHkgKGVnLiBkZWxldGluZyB4Lnkgd2hlcmUgZm9sZGVyIHggZG9lc24ndCBoYXZlIHJlc291cmNlcyBidXQgeSkKLQkJCS8vIHdpdGhvdXQgZGVsZXRpbmcgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCWlmICghcmVzb3VyY2UuZXF1YWxzKHJvb3RSZXNvdXJjZSkgJiYgcmVzb3VyY2UubWVtYmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzb3VyY2UuZGVsZXRlKAotCQkJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKLQkJCQkJZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKLQkJCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGZFbGVtZW50c1RvUHJvY2Vzc1tpXSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKIAkJCX0KIAkJfQotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCX0KLX0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGRlbGV0ZSBhIHJlc291cmNlCi0gKi8KLXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSxpbnQgZmxhZ3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRyeSB7Ci0JCXJlc291cmNlLmRlbGV0ZShmbGFncywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKLQkJdGhpcy5oYXNNb2RpZmllZFJlc291cmNlID0gdHJ1ZTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKLQl9Ci19Ci0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZWxldGUgcmVzb3VyY2VzCi0gKi8KLXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoID09IDApIHJldHVybjsKLQlJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IGdldFN1YlByb2dyZXNzTW9uaXRvcihyZXNvdXJjZXMubGVuZ3RoKTsKLQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJlc291cmNlc1swXS5nZXRXb3Jrc3BhY2UoKTsKLQl0cnkgewotCQl3b3Jrc3BhY2UuZGVsZXRlKAotCQkJcmVzb3VyY2VzLAotCQkJZm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCi0JCQlzdWJQcm9ncmVzc01vbml0b3IpOwotCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwotCX0KLX0KLS8qKgotICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCi0gKi8KLXB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJZk1vbml0b3IuZG9uZSgpOwotCX0KLX0KLS8qKgotICogVmVyaWZpZXMgdGhlIG9wZXJhdGlvbiBjYW4gcHJvY2VlZCBhbmQgZXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4KLSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIDxjb2RlPiN2ZXJpZnk8L2NvZGU+IGFuZAotICogPGNvZGU+ZXhlY3V0ZU9wZXJhdGlvbjwvY29kZT4gdG8gaW1wbGVtZW50IHRoZSBzcGVjaWZpYyBvcGVyYXRpb24gYmVoYXZpb3IuCi0gKgotICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICovCi1wcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFNb2RlbFN0YXR1cyBzdGF0dXM9IHZlcmlmeSgpOwotCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCWV4ZWN1dGVPcGVyYXRpb24oKTsKLQl9IGVsc2UgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotfQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcnVuIGFuIG9wZXJhdGlvbiB3aXRoaW4gdGhpcyBvcGVyYXRpb24KLSAqLwotcHVibGljIHZvaWQgZXhlY3V0ZU5lc3RlZE9wZXJhdGlvbihKYXZhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBpbnQgc3ViV29ya0Ftb3VudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBnZXRTdWJQcm9ncmVzc01vbml0b3Ioc3ViV29ya0Ftb3VudCk7Ci0JLy8gZml4IGZvciAxRlc3SUtDLCBwYXJ0ICgxKQotCXRyeSB7Ci0JCW9wZXJhdGlvbi5zZXROZXN0ZWQodHJ1ZSk7Ci0JCW9wZXJhdGlvbi5ydW4oc3ViUHJvZ3Jlc3NNb25pdG9yKTsKLQkJaWYgKG9wZXJhdGlvbi5oYXNNb2RpZmllZFJlc291cmNlKCkpIHsKLQkJCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHRydWU7CisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgcmVzb3VyY2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKHJlc291cmNlcy5sZW5ndGgpOworCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJlc291cmNlc1swXS5nZXRXb3Jrc3BhY2UoKTsKKwkJdHJ5IHsKKwkJCXdvcmtzcGFjZS5jb3B5KHJlc291cmNlcywgZGVzdGluYXRpb25QYXRoLCBmYWxzZSwgc3ViUHJvZ3Jlc3NNb25pdG9yKTsKKwkJCXRoaXMuc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQotCQkvL2FjY3VtdWxhdGUgdGhlIG5lc3RlZCBvcGVyYXRpb24gZGVsdGFzCi0JCWlmIChvcGVyYXRpb24uZkRlbHRhcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbi5mRGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkRGVsdGEob3BlcmF0aW9uLmZEZWx0YXNbaV0pOwotCQkJfQorCX0KKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgZmlsZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGUoSUNvbnRhaW5lciBmb2xkZXIsIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBjb250ZW50cywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlGaWxlIGZpbGU9IGZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKG5hbWUpKTsKKwkJdHJ5IHsKKwkJCWZpbGUuY3JlYXRlKAorCQkJCWNvbnRlbnRzLCAKKwkJCQlmb3JjZSA/IElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLCAKKwkJCQlnZXRTdWJQcm9ncmVzc01vbml0b3IoMSkpOworCQkJCXRoaXMuc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJaWYgKGNlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWNlOwotCQl9IGVsc2UgewotCQkJLy8gdHJhbnNsYXRlIHRoZSBjb3JlIGV4Y2VwdGlvbiB0byBhIGphdmEgbW9kZWwgZXhjZXB0aW9uCi0JCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5PUEVSQVRJT05fRkFJTEVEKSB7Ci0JCQkJVGhyb3dhYmxlIGUgPSBjZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgewotCQkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKSBlOworCX0KKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgZm9sZGVyCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9sZGVyKElDb250YWluZXIgcGFyZW50Rm9sZGVyLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlGb2xkZXIgZm9sZGVyPSBwYXJlbnRGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKG5hbWUpKTsKKwkJdHJ5IHsKKwkJCS8vIHdlIHNob3VsZCB1c2UgdHJ1ZSB0byBjcmVhdGUgdGhlIGZpbGUgbG9jYWxseS4gT25seSBWQ00gc2hvdWxkIHVzZSB0cnUvZmFsc2UKKwkJCWZvbGRlci5jcmVhdGUoCisJCQkJZm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwKKwkJCQl0cnVlLCAvLyBsb2NhbAorCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJfQorCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZWxldGUgYW4gZW1wdHkgcGFja2FnZSBmcmFnbWVudAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUVtcHR5UGFja2FnZUZyYWdtZW50KAorCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50LAorCQlib29sZWFuIGZvcmNlLAorCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkKKwkJSUNvbnRhaW5lciByZXNvdXJjZSA9IChJQ29udGFpbmVyKSBmcmFnbWVudC5nZXRSZXNvdXJjZSgpOworCQorCQl0cnkgeworCQkJcmVzb3VyY2UuZGVsZXRlKAorCQkJCWZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCWdldFN1YlByb2dyZXNzTW9uaXRvcigxKSk7CisJCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQkJd2hpbGUgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJCS8vIGRlbGV0aW5nIGEgcGFja2FnZTogZGVsZXRlIHRoZSBwYXJlbnQgaWYgaXQgaXMgZW1wdHkgKGVnLiBkZWxldGluZyB4Lnkgd2hlcmUgZm9sZGVyIHggZG9lc24ndCBoYXZlIHJlc291cmNlcyBidXQgeSkKKwkJCQkvLyB3aXRob3V0IGRlbGV0aW5nIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QKKwkJCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOworCQkJCWlmICghcmVzb3VyY2UuZXF1YWxzKHJvb3RSZXNvdXJjZSkgJiYgcmVzb3VyY2UubWVtYmVycygpLmxlbmd0aCA9PSAwKSB7CisJCQkJCXJlc291cmNlLmRlbGV0ZSgKKwkJCQkJCWZvcmNlID8gSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIAorCQkJCQkJZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCQkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKIAkJCQl9CiAJCQl9Ci0JCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGNlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwogCQl9CiAJfQotfQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIHNwZWNpZmljIGJlaGF2aW9yLiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IHRoZSBnaXZlbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiwKLSAqIG9yIHRoZSBlbGVtZW50IGl0c2VsZiAoaWYgaXQgaXMgYSBjb21waWxhdGlvbiB1bml0KSwKLSAqIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0Rm9yKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0KLQlyZXR1cm4gKChKYXZhRWxlbWVudCllbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gd2hpY2ggdGhpcyBvcGVyYXRpb24gYXBwbGllcywKLSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlLgotICovCi1wcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNUb1Byb2Nlc3MoKSB7Ci0JcmV0dXJuIGZFbGVtZW50c1RvUHJvY2VzczsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGlzIG9wZXJhdGlvbiBhcHBsaWVzLAotICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCi0gKi8KLXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudFRvUHJvY2VzcygpIHsKLQlpZiAoZkVsZW1lbnRzVG9Qcm9jZXNzID09IG51bGwgfHwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzWzBdOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBKYXZhIE1vZGVsIHRoaXMgb3BlcmF0aW9uIGlzIG9wZXJhdGluZyBpbi4KLSAqLwotcHVibGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCWlmIChmRWxlbWVudHNUb1Byb2Nlc3MgPT0gbnVsbCB8fCBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IDApIHsKLQkJcmV0dXJuIGdldFBhcmVudEVsZW1lbnQoKS5nZXRKYXZhTW9kZWwoKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzWzBdLmdldEphdmFNb2RlbCgpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgcGFyZW50IGVsZW1lbnQgdG8gd2hpY2ggdGhpcyBvcGVyYXRpb24gYXBwbGllcywKLSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlLgotICovCi1wcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoKSB7Ci0JaWYgKGZQYXJlbnRFbGVtZW50cyA9PSBudWxsIHx8IGZQYXJlbnRFbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGZQYXJlbnRFbGVtZW50c1swXTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgcGFyZW50IGVsZW1lbnRzIHRvIHdoaWNoIHRoaXMgb3BlcmF0aW9uIGFwcGxpZXMsCi0gKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXBwbGljYWJsZS4KLSAqLwotcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGdldFBhcmVudEVsZW1lbnRzKCkgewotCXJldHVybiBmUGFyZW50RWxlbWVudHM7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGNyZWF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCi0gKi8KLXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRSZXN1bHRFbGVtZW50cygpIHsKLQlyZXR1cm4gZlJlc3VsdEVsZW1lbnRzOwotfQotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VicHJvZ3Jlc3MgbW9uaXRvciBpZiBhcHByb3ByaWF0ZS4KLSAqLwotcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKGludCB3b3JrQW1vdW50KSB7Ci0JSVByb2dyZXNzTW9uaXRvciBzdWIgPSBudWxsOwotCWlmIChmTW9uaXRvciAhPSBudWxsKSB7Ci0JCXN1YiA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoZk1vbml0b3IsIHdvcmtBbW91bnQsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JfQotCXJldHVybiBzdWI7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIDxjb2RlPklXb3Jrc3BhY2U8L2NvZGU+IHRoaXMgb3BlcmF0aW9uIGlzIHdvcmtpbmcgaW4sIG9yCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbiBoYXMgbm8gZWxlbWVudHMgdG8gcHJvY2Vzcy4KLSAqLwotcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCWlmIChmRWxlbWVudHNUb1Byb2Nlc3MgIT0gbnVsbCAmJiBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID4gMCkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGZFbGVtZW50c1RvUHJvY2Vzc1swXS5nZXRKYXZhUHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5nZXRKYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKTsKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGEgcmVzb3VyY2UKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsaW50IGZsYWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJlc291cmNlLmRlbGV0ZShmbGFncywgZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKDEpKTsKKwkJCXRoaXMuc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQogCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGhhcyBwZXJmb3JtZWQgYW55IHJlc291cmNlIG1vZGlmaWNhdGlvbnMuCi0gKiBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZCB5ZXQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGhhc01vZGlmaWVkUmVzb3VyY2UoKSB7Ci0JcmV0dXJuICF0aGlzLmlzUmVhZE9ubHkoKSAmJiB0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2U7Ci19Ci1wdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotCWlmIChmTW9uaXRvciAhPSBudWxsKSB7Ci0JCWZNb25pdG9yLmludGVybmFsV29ya2VkKHdvcmspOwotCX0KLX0KLS8qKgotICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJcmV0dXJuIGZNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uIHBlcmZvcm1zIG5vIHJlc291cmNlIG1vZGlmaWNhdGlvbnMsCi0gKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0gKi8KLXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBUcmF2ZXJzZXMgdGhlIGRlbHRhcyBmb3IgYW4gd29ya2luZyBjb3BpZXMgYW5kIG1ha2VzIHRoZW0KLSAqIGNvbnNpc3RlbnQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIG1ha2VXb3JraW5nQ29waWVzQ29uc2lzdGVudChJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcykgewotCWZvciAoaW50IGk9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJd2Fsa0RlbHRhTWFraW5nV29ya2luZ0NvcGllc0NvbnNpc3RlbnQoZGVsdGFzW2ldKTsKLQl9Ci19Ci0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtb3ZlIHJlc291cmNlcwotICovCi1wcm90ZWN0ZWQgdm9pZCBtb3ZlUmVzb3VyY2VzKElSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUHJvZ3Jlc3NNb25pdG9yIHN1YlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJc3ViUHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihmTW9uaXRvciwgcmVzb3VyY2VzLmxlbmd0aCwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQl9Ci0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSByZXNvdXJjZXNbMF0uZ2V0V29ya3NwYWNlKCk7Ci0JdHJ5IHsKLQkJd29ya3NwYWNlLm1vdmUocmVzb3VyY2VzLCBkZXN0aW5hdGlvblBhdGgsIGZhbHNlLCBzdWJQcm9ncmVzc01vbml0b3IpOwotCQl0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UgPSB0cnVlOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwotCX0KLX0KLS8qKgotICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4KLSAqIG9uIHRoZSBKYXZhIE1vZGVsLgotICovCi1wdWJsaWMgSmF2YUVsZW1lbnREZWx0YSBuZXdKYXZhRWxlbWVudERlbHRhKCkgewotCXJldHVybiBuZXcgSmF2YUVsZW1lbnREZWx0YShnZXRKYXZhTW9kZWwoKSk7Ci19Ci0vKioKLSAqIFJlZ2lzdGVycyBhbnkgZGVsdGFzIHRoaXMgb3BlcmF0aW9uIGNyZWF0ZWQsIHdpdGggdGhlCi0gKiBKYXZhIE1vZGVsIG1hbmFnZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRGVsdGFzKCkgewotCWlmIChmRGVsdGFzICE9IG51bGwgJiYgIWZOZXN0ZWQpIHsKLQkJLy8gaG9vayB0byBlbnN1cmUgd29ya2luZyBjb3BpZXMgcmVtYWluIGNvbnNpc3RlbnQKLQkJbWFrZVdvcmtpbmdDb3BpZXNDb25zaXN0ZW50KGZEZWx0YXMpOwotCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXI9IChKYXZhTW9kZWxNYW5hZ2VyKUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZkRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJbWFuYWdlci5yZWdpc3RlckphdmFNb2RlbERlbHRhKGZEZWx0YXNbaV0pOworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZWxldGUgcmVzb3VyY2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2VzKElSZXNvdXJjZVtdIHJlc291cmNlcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoID09IDApIHJldHVybjsKKwkJSVByb2dyZXNzTW9uaXRvciBzdWJQcm9ncmVzc01vbml0b3IgPSBnZXRTdWJQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzLmxlbmd0aCk7CisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gcmVzb3VyY2VzWzBdLmdldFdvcmtzcGFjZSgpOworCQl0cnkgeworCQkJd29ya3NwYWNlLmRlbGV0ZSgKKwkJCQlyZXNvdXJjZXMsCisJCQkJZm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCisJCQkJc3ViUHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJCX0KIAl9Ci19Ci0vKioKLSAqIE1haW4gZW50cnkgcG9pbnQgZm9yIEphdmEgTW9kZWwgb3BlcmF0aW9ucy4gIEV4ZWN1dGVzIHRoaXMgb3BlcmF0aW9uCi0gKiBhbmQgcmVnaXN0ZXJzIGFueSBkZWx0YXMgY3JlYXRlZC4KLSAqCi0gKiBAc2VlIElXb3Jrc3BhY2VSdW5uYWJsZQotICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKLSAqLwotcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWZNb25pdG9yID0gbW9uaXRvcjsKLQkJZXhlY3V0ZSgpOwotCX0gZmluYWxseSB7Ci0JCXJlZ2lzdGVyRGVsdGFzKCk7CisJLyoqCisJICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHVibGljIHZvaWQgZG9uZSgpIHsKKwkJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJCWZNb25pdG9yLmRvbmUoKTsKKwkJfQogCX0KLX0KLS8qKgotICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCi0gKi8KLXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgewotCWlmIChmTW9uaXRvciAhPSBudWxsKSB7Ci0JCWZNb25pdG9yLnNldENhbmNlbGVkKGIpOwotCX0KLX0KLS8qKgotICogU2V0cyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIG5lc3RlZCBvciBub3QuCi0gKiBAc2VlIENyZWF0ZUVsZW1lbnRJbkNVT3BlcmF0aW9uI2NoZWNrQ2FuY2VsZWQKLSAqLwotcHJvdGVjdGVkIHZvaWQgc2V0TmVzdGVkKGJvb2xlYW4gbmVzdGVkKSB7Ci0JZk5lc3RlZCA9IG5lc3RlZDsKLX0KLS8qKgotICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCi0gKi8KLXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJZk1vbml0b3Iuc2V0VGFza05hbWUobmFtZSk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IKLSAqLwotcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCWlmIChmTW9uaXRvciAhPSBudWxsKSB7Ci0JCWZNb25pdG9yLnN1YlRhc2sobmFtZSk7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIGEgc3RhdHVzIGluZGljYXRpbmcgaWYgdGhlcmUgaXMgYW55IGtub3duIHJlYXNvbgotICogdGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsLiAgT3BlcmF0aW9ucyBhcmUgdmVyaWZpZWQgYmVmb3JlIHRoZXkKLSAqIGFyZSBydW4uCi0gKgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGlmIHRoZXkgaGF2ZSBhbnkgY29uZGl0aW9ucyB0byB2ZXJpZnkKLSAqIGJlZm9yZSB0aGlzIG9wZXJhdGlvbiBleGVjdXRlcy4KLSAqCi0gKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKLSAqLwotcHJvdGVjdGVkIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgewotCXJldHVybiBjb21tb25WZXJpZnkoKTsKLX0KLS8qKgotICogVHJhdmVyc2VzIHRoZSBkZWx0YSBtYWtpbmcgYW55IHdvcmtpbmcgY29waWVzIGNvbnNpc3RlbnQKLSAqLwotcHJvdGVjdGVkIHZvaWQgd2Fsa0RlbHRhTWFraW5nV29ya2luZ0NvcGllc0NvbnNpc3RlbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlpZiAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKElDb21waWxhdGlvblVuaXQpIGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJaWYgKHVuaXQuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQl0cnkgewotCQkJCXVuaXQubWFrZUNvbnNpc3RlbnQobnVsbCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGVxdWFscyB0byBvbmUgb2YgdGhlIGdpdmVuIG90aGVyIHBhdGhzLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVxdWFsc09uZU9mKElQYXRoIHBhdGgsIElQYXRoW10gb3RoZXJQYXRocykgeworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gb3RoZXJQYXRocy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJaWYgKHBhdGguZXF1YWxzKG90aGVyUGF0aHNbaV0pKSB7CisJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCX0KLQl9IGVsc2UgewotCQlJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXdhbGtEZWx0YU1ha2luZ1dvcmtpbmdDb3BpZXNDb25zaXN0ZW50KGRlbHRhc1tpXSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyoqCisJICogVmVyaWZpZXMgdGhlIG9wZXJhdGlvbiBjYW4gcHJvY2VlZCBhbmQgZXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4KKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSA8Y29kZT4jdmVyaWZ5PC9jb2RlPiBhbmQKKwkgKiA8Y29kZT5leGVjdXRlT3BlcmF0aW9uPC9jb2RlPiB0byBpbXBsZW1lbnQgdGhlIHNwZWNpZmljIG9wZXJhdGlvbiBiZWhhdmlvci4KKwkgKgorCSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzPSB2ZXJpZnkoKTsKKwkJaWYgKHN0YXR1cy5pc09LKCkpIHsKKwkJCS8vIGlmIGZpcnN0IHRpbWUgaGVyZSwgY29tcHV0ZXMgdGhlIHJvb3QgaW5mb3MgYmVmb3JlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCisJCQlEZWx0YVByb2Nlc3NvciBkZWx0YVByb2Nlc3NvciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yOworCQkJaWYgKGRlbHRhUHJvY2Vzc29yLnJvb3RzID09IG51bGwpIHsKKwkJCQlkZWx0YVByb2Nlc3Nvci5pbml0aWFsaXplUm9vdHMoKTsKKwkJCX0KKworCQkJZXhlY3V0ZU9wZXJhdGlvbigpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihzdGF0dXMpOwogCQl9CiAJfQotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IKLSAqLwotcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0JaWYgKGZNb25pdG9yICE9IG51bGwpIHsKLQkJZk1vbml0b3Iud29ya2VkKHdvcmspOwotCQljaGVja0NhbmNlbGVkKCk7CisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBhbiBvcGVyYXRpb24gd2l0aGluIHRoaXMgb3BlcmF0aW9uCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZU5lc3RlZE9wZXJhdGlvbihKYXZhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBpbnQgc3ViV29ya0Ftb3VudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gZ2V0U3ViUHJvZ3Jlc3NNb25pdG9yKHN1YldvcmtBbW91bnQpOworCQkvLyBmaXggZm9yIDFGVzdJS0MsIHBhcnQgKDEpCisJCXRyeSB7CisJCQlvcGVyYXRpb24uc2V0TmVzdGVkKHRydWUpOworCQkJb3BlcmF0aW9uLnJ1bihzdWJQcm9ncmVzc01vbml0b3IpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlpZiAoY2UgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24pIHsKKwkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKWNlOworCQkJfSBlbHNlIHsKKwkJCQkvLyB0cmFuc2xhdGUgdGhlIGNvcmUgZXhjZXB0aW9uIHRvIGEgamF2YSBtb2RlbCBleGNlcHRpb24KKwkJCQlpZiAoY2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5PUEVSQVRJT05fRkFJTEVEKSB7CisJCQkJCVRocm93YWJsZSBlID0gY2UuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7CisJCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CisJCQkJCQl0aHJvdyAoSmF2YU1vZGVsRXhjZXB0aW9uKSBlOworCQkJCQl9CisJCQkJfQorCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oY2UpOworCQkJfQorCQl9CiAJfQotfQorCS8qKgorCSAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gc3BlY2lmaWMgYmVoYXZpb3IuIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwkvKgorCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSByZWdpc3RlcmVkIGF0IHRoZSBnaXZlbiBrZXkgd2l0aCB0aGUgdG9wIGxldmVsIG9wZXJhdGlvbi4KKwkgKiBSZXR1cm5zIG51bGwgaWYgbm8gc3VjaCBhdHRyaWJ1dGUgaXMgZm91bmQuCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBnZXRBdHRyaWJ1dGUoT2JqZWN0IGtleSkgeworCQlBcnJheUxpc3Qgc3RhY2sgPSB0aGlzLmdldEN1cnJlbnRPcGVyYXRpb25TdGFjaygpOworCQlpZiAoc3RhY2suc2l6ZSgpID09IDApIHJldHVybiBudWxsOworCQlKYXZhTW9kZWxPcGVyYXRpb24gdG9wTGV2ZWxPcCA9IChKYXZhTW9kZWxPcGVyYXRpb24pc3RhY2suZ2V0KDApOworCQlpZiAodG9wTGV2ZWxPcC5hdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHRvcExldmVsT3AuYXR0cmlidXRlcy5nZXQoa2V5KTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21waWxhdGlvbiB1bml0IHRoZSBnaXZlbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiwKKwkgKiBvciB0aGUgZWxlbWVudCBpdHNlbGYgKGlmIGl0IGlzIGEgY29tcGlsYXRpb24gdW5pdCksCisJICogb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdEZvcihJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQorCQlyZXR1cm4gKChKYXZhRWxlbWVudCllbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKKwl9CisJLyoKKwkgKiBSZXR1cm5zIHRoZSBzdGFjayBvZiBvcGVyYXRpb25zIHJ1bm5pbmcgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorCSAqIFJldHVybnMgYW4gZW1wdHkgc3RhY2sgaWYgbm8gb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW4gdGhpcyB0aHJlYWQuIAorCSAqLworCXByb3RlY3RlZCBBcnJheUxpc3QgZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCkgeworCQlBcnJheUxpc3Qgc3RhY2sgPSAoQXJyYXlMaXN0KW9wZXJhdGlvblN0YWNrcy5nZXRDdXJyZW50KCk7CisJCWlmIChzdGFjayA9PSBudWxsKSB7CisJCQlzdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCW9wZXJhdGlvblN0YWNrcy5zZXRDdXJyZW50KHN0YWNrKTsKKwkJfQorCQlyZXR1cm4gc3RhY2s7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIHdoaWNoIHRoaXMgb3BlcmF0aW9uIGFwcGxpZXMsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudFtdIGdldEVsZW1lbnRzVG9Qcm9jZXNzKCkgeworCQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgb3BlcmF0aW9uIGFwcGxpZXMsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRFbGVtZW50VG9Qcm9jZXNzKCkgeworCQlpZiAoZkVsZW1lbnRzVG9Qcm9jZXNzID09IG51bGwgfHwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzWzBdOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKYXZhIE1vZGVsIHRoaXMgb3BlcmF0aW9uIGlzIG9wZXJhdGluZyBpbi4KKwkgKi8KKwlwdWJsaWMgSUphdmFNb2RlbCBnZXRKYXZhTW9kZWwoKSB7CisJCWlmIChmRWxlbWVudHNUb1Byb2Nlc3MgPT0gbnVsbCB8fCBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBnZXRQYXJlbnRFbGVtZW50KCkuZ2V0SmF2YU1vZGVsKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzWzBdLmdldEphdmFNb2RlbCgpOworCQl9CisJfQorCXByb3RlY3RlZCBJUGF0aFtdIGdldE5lc3RlZEZvbGRlcnMoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlQYXRoIHJvb3RQYXRoID0gcm9vdC5nZXRQYXRoKCk7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJaW50IGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7CisJCUlQYXRoW10gcmVzdWx0ID0gbmV3IElQYXRoW2xlbmd0aF07CisJCWludCBpbmRleCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlQYXRoIHBhdGggPSBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpOworCQkJaWYgKHJvb3RQYXRoLmlzUHJlZml4T2YocGF0aCkgJiYgIXJvb3RQYXRoLmVxdWFscyhwYXRoKSkgeworCQkJCXJlc3VsdFtpbmRleCsrXSA9IHBhdGg7CisJCQl9CisJCX0KKwkJaWYgKGluZGV4IDwgbGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgcmVzdWx0ID0gbmV3IElQYXRoW2luZGV4XSwgMCwgaW5kZXgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCBlbGVtZW50IHRvIHdoaWNoIHRoaXMgb3BlcmF0aW9uIGFwcGxpZXMsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGFwcGxpY2FibGUuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KCkgeworCQlpZiAoZlBhcmVudEVsZW1lbnRzID09IG51bGwgfHwgZlBhcmVudEVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZlBhcmVudEVsZW1lbnRzWzBdOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZWxlbWVudHMgdG8gd2hpY2ggdGhpcyBvcGVyYXRpb24gYXBwbGllcywKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXBwbGljYWJsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ2V0UGFyZW50RWxlbWVudHMoKSB7CisJCXJldHVybiBmUGFyZW50RWxlbWVudHM7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGNyZWF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCisJICovCisJcHVibGljIElKYXZhRWxlbWVudFtdIGdldFJlc3VsdEVsZW1lbnRzKCkgeworCQlyZXR1cm4gZlJlc3VsdEVsZW1lbnRzOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VicHJvZ3Jlc3MgbW9uaXRvciBpZiBhcHByb3ByaWF0ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJQcm9ncmVzc01vbml0b3IoaW50IHdvcmtBbW91bnQpIHsKKwkJSVByb2dyZXNzTW9uaXRvciBzdWIgPSBudWxsOworCQlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQkJc3ViID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihmTW9uaXRvciwgd29ya0Ftb3VudCwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKKwkJfQorCQlyZXR1cm4gc3ViOworCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiBoYXMgcGVyZm9ybWVkIGFueSByZXNvdXJjZSBtb2RpZmljYXRpb25zLgorCSAqIFJldHVybnMgZmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIHlldC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNNb2RpZmllZFJlc291cmNlKCkgeworCQlyZXR1cm4gIXRoaXMuaXNSZWFkT25seSgpICYmIHRoaXMuZ2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSKSA9PSBUUlVFOyAKKwl9CisJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKKwkJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJCWZNb25pdG9yLmludGVybmFsV29ya2VkKHdvcmspOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7CisJCWlmIChmTW9uaXRvciAhPSBudWxsKSB7CisJCQlyZXR1cm4gZk1vbml0b3IuaXNDYW5jZWxlZCgpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbiBwZXJmb3JtcyBubyByZXNvdXJjZSBtb2RpZmljYXRpb25zLAorCSAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdG8gcnVuIGluIHRoZSBjdXJyZW50IHRocmVhZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RvcExldmVsT3BlcmF0aW9uKCkgeworCQlBcnJheUxpc3Qgc3RhY2s7CisJCXJldHVybiAKKwkJCShzdGFjayA9IHRoaXMuZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCkpLnNpemUoKSA+IDAKKwkJCSYmIHN0YWNrLmdldCgwKSA9PSB0aGlzOworCX0KKwkvKgorCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCByZWdpc3RlcmVkIGFjdGlvbiB3aXRoIHRoZSBnaXZlbiBpZCwgc3RhcnRpbmcgZnJvbSBhIGdpdmVuIHBvc2l0aW9uLgorCSAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLgorCSAqLworCXByb3RlY3RlZCBpbnQgZmlyc3RBY3Rpb25XaXRoSUQoU3RyaW5nIGlkLCBpbnQgc3RhcnQpIHsKKwkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHRoaXMuYWN0aW9uc0VuZDsgaSsrKSB7CisJCQlpZiAodGhpcy5hY3Rpb25zW2ldLmdldElEKCkuZXF1YWxzKGlkKSkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9CisJCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1vdmUgcmVzb3VyY2VzCisJICovCisJcHJvdGVjdGVkIHZvaWQgbW92ZVJlc291cmNlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElQYXRoIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlQcm9ncmVzc01vbml0b3Igc3ViUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKKwkJaWYgKGZNb25pdG9yICE9IG51bGwpIHsKKwkJCXN1YlByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoZk1vbml0b3IsIHJlc291cmNlcy5sZW5ndGgsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7CisJCX0KKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSByZXNvdXJjZXNbMF0uZ2V0V29ya3NwYWNlKCk7CisJCXRyeSB7CisJCQl3b3Jrc3BhY2UubW92ZShyZXNvdXJjZXMsIGRlc3RpbmF0aW9uUGF0aCwgZmFsc2UsIHN1YlByb2dyZXNzTW9uaXRvcik7CisJCQl0aGlzLnNldEF0dHJpYnV0ZShIQVNfTU9ESUZJRURfUkVTT1VSQ0VfQVRUUiwgVFJVRSk7IAorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCX0KKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyA8Y29kZT5JSmF2YUVsZW1lbnREZWx0YTwvY29kZT4KKwkgKiBvbiB0aGUgSmF2YSBNb2RlbC4KKwkgKi8KKwlwdWJsaWMgSmF2YUVsZW1lbnREZWx0YSBuZXdKYXZhRWxlbWVudERlbHRhKCkgeworCQlyZXR1cm4gbmV3IEphdmFFbGVtZW50RGVsdGEoZ2V0SmF2YU1vZGVsKCkpOworCX0KKwkvKgorCSAqIFJlbW92ZXMgdGhlIGxhc3QgcHVzaGVkIG9wZXJhdGlvbiBmcm9tIHRoZSBzdGFjayBvZiBydW5uaW5nIG9wZXJhdGlvbnMuCisJICogUmV0dXJucyB0aGUgcG9wZWQgb3BlcmF0aW9uIG9yIG51bGwgaWYgdGhlIHN0YWNrIHdhcyBlbXB0eS4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YU1vZGVsT3BlcmF0aW9uIHBvcE9wZXJhdGlvbigpIHsKKwkJQXJyYXlMaXN0IHN0YWNrID0gZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCk7CisJCWludCBzaXplID0gc3RhY2suc2l6ZSgpOworCQlpZiAoc2l6ZSA+IDApIHsKKwkJCWlmIChzaXplID09IDEpIHsgLy8gdG9wIGxldmVsIG9wZXJhdGlvbiAKKwkJCQlvcGVyYXRpb25TdGFja3Muc2V0Q3VycmVudChudWxsKTsgLy8gcmVsZWFzZSByZWZlcmVuY2UgKHNlZSBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyNykKKwkJCX0KKwkJCXJldHVybiAoSmF2YU1vZGVsT3BlcmF0aW9uKXN0YWNrLnJlbW92ZShzaXplLTEpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJLyoKKwkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiB0byBiZSBydW4gd2hlbiB0aGUgb3V0ZXIgbW9zdCBqYXZhIG1vZGVsIG9wZXJhdGlvbiBoYXMgZmluaXNoZWQuCisJICogVGhlIGluc2VydGlvbiBtb2RlIGNvbnRyb2xzIHdoZXRoZXI6CisJICogLSB0aGUgYWN0aW9uIHNob3VsZCBkaXNjYXJkIGFsbCBleGlzdGluZyBhY3Rpb25zIHdpdGggdGhlIHNhbWUgaWQsIGFuZCBiZSBxdWV1ZWQgYXQgdGhlIGVuZCAoUkVNT1ZFQUxMX0FQUEVORCksCisJICogLSB0aGUgYWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uIHdpdGggdGhlIHNhbWUgaWQgKEtFRVBfRVhJU1RJTkcpLAorCSAqIC0gdGhlIGFjdGlvbiBzaG91bGQgYmUgcXVldWVkIGF0IHRoZSBlbmQgd2l0aG91dCBsb29raW5nIGF0IGV4aXN0aW5nIGFjdGlvbnMgKEFQUEVORCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwb3N0QWN0aW9uKElQb3N0QWN0aW9uIGFjdGlvbiwgaW50IGluc2VydGlvbk1vZGUpIHsKKwkJaWYgKFBPU1RfQUNUSU9OX1ZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnQoIigiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIpIFtKYXZhTW9kZWxPcGVyYXRpb24ucG9zdEFjdGlvbihJUG9zdEFjdGlvbiwgaW50KV0gUG9zdGluZyBhY3Rpb24gIiArIGFjdGlvbi5nZXRJRCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlzd2l0Y2goaW5zZXJ0aW9uTW9kZSkgeworCQkJCWNhc2UgUkVNT1ZFQUxMX0FQUEVORDoKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKFJFTU9WRUFMTF9BUFBFTkQpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRUVQX0VYSVNUSU5HOgorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAoS0VFUF9FWElTVElORykiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIEFQUEVORDoKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKEFQUEVORCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkKKwkJSmF2YU1vZGVsT3BlcmF0aW9uIHRvcExldmVsT3AgPSAoSmF2YU1vZGVsT3BlcmF0aW9uKWdldEN1cnJlbnRPcGVyYXRpb25TdGFjaygpLmdldCgwKTsKKwkJSVBvc3RBY3Rpb25bXSBwb3N0QWN0aW9ucyA9IHRvcExldmVsT3AuYWN0aW9uczsKKwkJaWYgKHBvc3RBY3Rpb25zID09IG51bGwpIHsKKwkJCXRvcExldmVsT3AuYWN0aW9ucyA9IHBvc3RBY3Rpb25zID0gbmV3IElQb3N0QWN0aW9uWzFdOworCQkJcG9zdEFjdGlvbnNbMF0gPSBhY3Rpb247CisJCQl0b3BMZXZlbE9wLmFjdGlvbnNFbmQgPSAwOworCQl9IGVsc2UgeworCQkJU3RyaW5nIGlkID0gYWN0aW9uLmdldElEKCk7CisJCQlzd2l0Y2ggKGluc2VydGlvbk1vZGUpIHsKKwkJCQljYXNlIFJFTU9WRUFMTF9BUFBFTkQgOgorCQkJCQlpbnQgaW5kZXggPSB0aGlzLmFjdGlvbnNTdGFydC0xOworCQkJCQl3aGlsZSAoKGluZGV4ID0gdG9wTGV2ZWxPcC5maXJzdEFjdGlvbldpdGhJRChpZCwgaW5kZXgrMSkpID49IDApIHsKKwkJCQkJCS8vIHJlbW92ZSBhY3Rpb25baW5kZXhdCisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBvc3RBY3Rpb25zLCBpbmRleCsxLCBwb3N0QWN0aW9ucywgaW5kZXgsIHRvcExldmVsT3AuYWN0aW9uc0VuZCAtIGluZGV4KTsKKwkJCQkJCXBvc3RBY3Rpb25zW3RvcExldmVsT3AuYWN0aW9uc0VuZC0tXSA9IG51bGw7CisJCQkJCX0KKwkJCQkJdG9wTGV2ZWxPcC5hZGRBY3Rpb24oYWN0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRUVQX0VYSVNUSU5HOgorCQkJCQlpZiAodG9wTGV2ZWxPcC5maXJzdEFjdGlvbldpdGhJRChpZCwgMCkgPCAwKSB7CisJCQkJCQl0b3BMZXZlbE9wLmFkZEFjdGlvbihhY3Rpb24pOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVBQRU5EOgorCQkJCQl0b3BMZXZlbE9wLmFkZEFjdGlvbihhY3Rpb24pOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyB0aGUgcHJlZml4IG9mIG9uZSBvZiB0aGUgZ2l2ZW4gb3RoZXIgcGF0aHMuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJlZml4ZXNPbmVPZihJUGF0aCBwYXRoLCBJUGF0aFtdIG90aGVyUGF0aHMpIHsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG90aGVyUGF0aHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWlmIChwYXRoLmlzUHJlZml4T2Yob3RoZXJQYXRoc1tpXSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQkKKwkvKgorCSAqIFB1c2hlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIG9uIHRoZSBzdGFjayBvZiBvcGVyYXRpb25zIGN1cnJlbnRseSBydW5uaW5nIGluIHRoaXMgdGhyZWFkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1c2hPcGVyYXRpb24oSmF2YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbikgeworCQlnZXRDdXJyZW50T3BlcmF0aW9uU3RhY2soKS5hZGQob3BlcmF0aW9uKTsKKwl9CisJCisJLyoqCisJICogTWFpbiBlbnRyeSBwb2ludCBmb3IgSmF2YSBNb2RlbCBvcGVyYXRpb25zLiAgRXhlY3V0ZXMgdGhpcyBvcGVyYXRpb24KKwkgKiBhbmQgcmVnaXN0ZXJzIGFueSBkZWx0YXMgY3JlYXRlZC4KKwkgKgorCSAqIEBzZWUgSVdvcmtzcGFjZVJ1bm5hYmxlCisJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlpbnQgcHJldmlvdXNEZWx0YUNvdW50ID0gbWFuYWdlci5qYXZhTW9kZWxEZWx0YXMuc2l6ZSgpOworCQl0cnkgeworCQkJZk1vbml0b3IgPSBtb25pdG9yOworCQkJcHVzaE9wZXJhdGlvbih0aGlzKTsKKwkJCXRyeSB7CisJCQkJdGhpcy5leGVjdXRlKCk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmICh0aGlzLmlzVG9wTGV2ZWxPcGVyYXRpb24oKSkgeworCQkJCQl0aGlzLnJ1blBvc3RBY3Rpb25zKCk7CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQkvLyB1cGRhdGUgSmF2YU1vZGVsIHVzaW5nIGRlbHRhcyB0aGF0IHdlcmUgcmVjb3JkZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uCisJCQkJZm9yIChpbnQgaSA9IHByZXZpb3VzRGVsdGFDb3VudCwgc2l6ZSA9IG1hbmFnZXIuamF2YU1vZGVsRGVsdGFzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgeworCQkJCQltYW5hZ2VyLnVwZGF0ZUphdmFNb2RlbCgoSUphdmFFbGVtZW50RGVsdGEpbWFuYWdlci5qYXZhTW9kZWxEZWx0YXMuZ2V0KGkpKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gZmlyZSBvbmx5IGlmZjoKKwkJCQkvLyAtIHRoZSBvcGVyYXRpb24gaXMgYSB0b3AgbGV2ZWwgb3BlcmF0aW9uCisJCQkJLy8gLSB0aGUgb3BlcmF0aW9uIGRpZCBwcm9kdWNlIHNvbWUgZGVsdGEocykKKwkJCQkvLyAtIGJ1dCB0aGUgb3BlcmF0aW9uIGhhcyBub3QgbW9kaWZpZWQgYW55IHJlc291cmNlCisJCQkJaWYgKHRoaXMuaXNUb3BMZXZlbE9wZXJhdGlvbigpKSB7CisJCQkJCWlmICgobWFuYWdlci5qYXZhTW9kZWxEZWx0YXMuc2l6ZSgpID4gcHJldmlvdXNEZWx0YUNvdW50IHx8ICFtYW5hZ2VyLnJlY29uY2lsZURlbHRhcy5pc0VtcHR5KCkpIAorCQkJCQkJCSYmICF0aGlzLmhhc01vZGlmaWVkUmVzb3VyY2UoKSkgeworCQkJCQkJbWFuYWdlci5maXJlKG51bGwsIEphdmFNb2RlbE1hbmFnZXIuREVGQVVMVF9DSEFOR0VfRVZFTlQpOworCQkJCQl9IC8vIGVsc2UgZGVsdGFzIGFyZSBmaXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXNvdXJjZSBkZWx0YQorCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJcG9wT3BlcmF0aW9uKCk7CisJCQl9CisJCX0KKwl9CisJcHJvdGVjdGVkIHZvaWQgcnVuUG9zdEFjdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJd2hpbGUgKHRoaXMuYWN0aW9uc1N0YXJ0IDw9IHRoaXMuYWN0aW9uc0VuZCkgeworCQkJSVBvc3RBY3Rpb24gcG9zdEFjdGlvbiA9IHRoaXMuYWN0aW9uc1t0aGlzLmFjdGlvbnNTdGFydCsrXTsKKwkJCWlmIChQT1NUX0FDVElPTl9WRVJCT1NFKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmF2YU1vZGVsT3BlcmF0aW9uLnJ1blBvc3RBY3Rpb25zKCldIFJ1bm5pbmcgYWN0aW9uICIgKyBwb3N0QWN0aW9uLmdldElEKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkJCXBvc3RBY3Rpb24ucnVuKCk7CisJCX0KKwl9CisJLyoKKwkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGF0dHJpYnV0ZSBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGggdGhlIHRvcCBsZXZlbCBvcGVyYXRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBrZXksIE9iamVjdCBhdHRyaWJ1dGUpIHsKKwkJSmF2YU1vZGVsT3BlcmF0aW9uIHRvcExldmVsT3AgPSAoSmF2YU1vZGVsT3BlcmF0aW9uKXRoaXMuZ2V0Q3VycmVudE9wZXJhdGlvblN0YWNrKCkuZ2V0KDApOworCQlpZiAodG9wTGV2ZWxPcC5hdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCXRvcExldmVsT3AuYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisJCX0KKwkJdG9wTGV2ZWxPcC5hdHRyaWJ1dGVzLnB1dChrZXksIGF0dHJpYnV0ZSk7CisJfQorCS8qKgorCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorCSAqLworCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gYikgeworCQlpZiAoZk1vbml0b3IgIT0gbnVsbCkgeworCQkJZk1vbml0b3Iuc2V0Q2FuY2VsZWQoYik7CisJCX0KKwl9CisJLyoqCisJICogU2V0cyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIG5lc3RlZCBvciBub3QuCisJICogQHNlZSBDcmVhdGVFbGVtZW50SW5DVU9wZXJhdGlvbiNjaGVja0NhbmNlbGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmVzdGVkKGJvb2xlYW4gbmVzdGVkKSB7CisJCWZOZXN0ZWQgPSBuZXN0ZWQ7CisJfQorCS8qKgorCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvcgorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmIChmTW9uaXRvciAhPSBudWxsKSB7CisJCQlmTW9uaXRvci5zZXRUYXNrTmFtZShuYW1lKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7CisJCWlmIChmTW9uaXRvciAhPSBudWxsKSB7CisJCQlmTW9uaXRvci5zdWJUYXNrKG5hbWUpOworCQl9CisJfQorCS8qKgorCSAqIFJldHVybnMgYSBzdGF0dXMgaW5kaWNhdGluZyBpZiB0aGVyZSBpcyBhbnkga25vd24gcmVhc29uCisJICogdGhpcyBvcGVyYXRpb24gd2lsbCBmYWlsLiAgT3BlcmF0aW9ucyBhcmUgdmVyaWZpZWQgYmVmb3JlIHRoZXkKKwkgKiBhcmUgcnVuLgorCSAqCisJICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGlmIHRoZXkgaGF2ZSBhbnkgY29uZGl0aW9ucyB0byB2ZXJpZnkKKwkgKiBiZWZvcmUgdGhpcyBvcGVyYXRpb24gZXhlY3V0ZXMuCisJICoKKwkgKiBAc2VlIElKYXZhTW9kZWxTdGF0dXMKKwkgKi8KKwlwcm90ZWN0ZWQgSUphdmFNb2RlbFN0YXR1cyB2ZXJpZnkoKSB7CisJCXJldHVybiBjb21tb25WZXJpZnkoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7CisJCWlmIChmTW9uaXRvciAhPSBudWxsKSB7CisJCQlmTW9uaXRvci53b3JrZWQod29yayk7CisJCQljaGVja0NhbmNlbGVkKCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhTW9kZWxTdGF0dXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhCmluZGV4IDg4ZmNiN2UuLmYxZWE1ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFNb2RlbFN0YXR1cy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CkBAIC0xNSwxMSArMTUsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogCiAvKioKICAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cwpAQCAtNTEsNyArNTUsNyBAQAogCS8qKgogCSAqIFNpbmdsZXRvbiBPSyBvYmplY3QKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhTW9kZWxTdGF0dXMgVkVSSUZJRURfT0sgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKE9LKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhTW9kZWxTdGF0dXMgVkVSSUZJRURfT0sgPSBuZXcgSmF2YU1vZGVsU3RhdHVzKE9LLCBPSywgVXRpbC5iaW5kKCJzdGF0dXMuT0siKSk7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgpAQCAtODAsMTEgKzg0LDE3IEBACiAJICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuCiAJICovCiAJcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgY29kZSwgU3RyaW5nIHN0cmluZykgewotCQlzdXBlcihFUlJPUiwgSmF2YUNvcmUuUExVR0lOX0lELCBjb2RlLCAiSmF2YU1vZGVsU3RhdHVzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcyhFUlJPUiwgY29kZSwgc3RyaW5nKTsKKwl9CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBKYXZhIG1vZGVsIHN0YXR1cyB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuCisJICovCisJcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBjb2RlLCBTdHJpbmcgc3RyaW5nKSB7CisJCXN1cGVyKHNldmVyaXR5LCBKYXZhQ29yZS5QTFVHSU5fSUQsIGNvZGUsICJKYXZhTW9kZWxTdGF0dXMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAogCQlmRWxlbWVudHM9IEphdmFFbGVtZW50SW5mby5mZ0VtcHR5Q2hpbGRyZW47CiAJCWZQYXRoPSBudWxsOwogCQlmU3RyaW5nID0gc3RyaW5nOwotCX0KKwl9CQogCS8qKgogCSAqIENvbnN0cnVjdHMgYW4gSmF2YSBtb2RlbCBzdGF0dXMgd2l0aCBubyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLgogCSAqLwpAQCAtMTEzLDggKzEyMywxNyBAQAogCSAqLwogCXB1YmxpYyBKYXZhTW9kZWxTdGF0dXMoaW50IGNvZGUsIElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgc3RyaW5nKSB7CiAJCXRoaXMoY29kZSwgbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnR9KTsKLQkJZlN0cmluZz0gc3RyaW5nOworCQlmU3RyaW5nID0gc3RyaW5nOwogCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggdGhlIGdpdmVuIGNvcnJlc3BvbmRpbmcKKwkgKiBlbGVtZW50IGFuZCBwYXRoCisJICovCisJcHVibGljIEphdmFNb2RlbFN0YXR1cyhpbnQgY29kZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIElQYXRoIHBhdGgpIHsKKwkJdGhpcyhjb2RlLCBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudH0pOworCQlmUGF0aCA9IHBhdGg7CisJfQkKIAkvKioKIAkgKiBDb25zdHJ1Y3RzIGFuIEphdmEgbW9kZWwgc3RhdHVzIHdpdGggbm8gY29ycmVzcG9uZGluZyBlbGVtZW50cy4KIAkgKi8KQEAgLTE0Myw1MyArMTYyLDgxIEBACiAJICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBjb2RlIG9mIHRoaXMgc3RhdHVzLgogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJaWYgKGdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKKwkJVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IGdldEV4Y2VwdGlvbigpOworCQlpZiAoZXhjZXB0aW9uID09IG51bGwpIHsKIAkJCXN3aXRjaCAoZ2V0Q29kZSgpKSB7CiAJCQkJY2FzZSBDT1JFX0VYQ0VQVElPTiA6CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jb3JlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgQlVJTERFUl9JTklUSUFMSVpBVElPTl9FUlJPUjoKIAkJCQkJcmV0dXJuIFV0aWwuYmluZCgiYnVpbGQuaW5pdGlhbGl6YXRpb25FcnJvciIpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIEJVSUxERVJfU0VSSUFMSVpBVElPTl9FUlJPUjoKIAkJCQkJcmV0dXJuIFV0aWwuYmluZCgiYnVpbGQuc2VyaWFsaXphdGlvbkVycm9yIik7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgREVWSUNFX1BBVEg6CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5jYW5ub3RVc2VEZXZpY2VPblBhdGgiLCBnZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgRE9NX0VYQ0VQVElPTjoKIAkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLkpET01FcnJvciIpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIEVMRU1FTlRfRE9FU19OT1RfRVhJU1Q6Ci0JCQkJCXJldHVybiBVdGlsLmJpbmQoImVsZW1lbnQuZG9lc05vdEV4aXN0IixmRWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgiZWxlbWVudC5kb2VzTm90RXhpc3QiLCgoSmF2YUVsZW1lbnQpZkVsZW1lbnRzWzBdKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgRVZBTFVBVElPTl9FUlJPUjoKLQkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmV2YWx1YXRpb25FcnJvciIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuZXZhbHVhdGlvbkVycm9yIiwgZlN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgSU5ERVhfT1VUX09GX0JPVU5EUzoKIAkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmluZGV4T3V0T2ZCb3VuZHMiKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBJTlZBTElEX0NPTlRFTlRTOgogCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZENvbnRlbnRzIik7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgSU5WQUxJRF9ERVNUSU5BVElPTjoKLQkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWREZXN0aW5hdGlvbiIsIGZFbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZERlc3RpbmF0aW9uIiwgKChKYXZhRWxlbWVudClmRWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBJTlZBTElEX0VMRU1FTlRfVFlQRVM6CiAJCQkJCVN0cmluZ0J1ZmZlciBidWZmPSBuZXcgU3RyaW5nQnVmZmVyKFV0aWwuYmluZCgib3BlcmF0aW9uLm5vdFN1cHBvcnRlZCIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgZkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCQlpZiAoaSA+IDApIHsKIAkJCQkJCQlidWZmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQotCQkJCQkJYnVmZi5hcHBlbmQoZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOworCQkJCQkJYnVmZi5hcHBlbmQoKChKYXZhRWxlbWVudClmRWxlbWVudHNbaV0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOworCiAJCQkJY2FzZSBJTlZBTElEX05BTUU6Ci0JCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkTmFtZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZE5hbWUiLCBmU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBJTlZBTElEX1BBQ0tBR0U6Ci0JCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUGFja2FnZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFBhY2thZ2UiLCBmU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBJTlZBTElEX1BBVEg6Ci0JCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkUGF0aCIsIGdldFBhdGgoKSA9PSBudWxsID8gIm51bGwiIDogZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJaWYgKGZTdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGZTdHJpbmc7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFBhdGgiLCBnZXRQYXRoKCkgPT0gbnVsbCA/ICJudWxsIiA6IGdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCX0KKwogCQkJCWNhc2UgSU5WQUxJRF9QUk9KRUNUOgotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFByb2plY3QiLCBnZXRTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRQcm9qZWN0IiwgZlN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgSU5WQUxJRF9SRVNPVVJDRToKLQkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRSZXNvdXJjZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFJlc291cmNlIiwgZlN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgSU5WQUxJRF9SRVNPVVJDRV9UWVBFOgotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFJlc291cmNlVHlwZSIsIGdldFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFJlc291cmNlVHlwZSIsIGZTdHJpbmcpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIElOVkFMSURfU0lCTElORzoKLQkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLmludmFsaWRTaWJsaW5nIiwgZkVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChmU3RyaW5nICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy5pbnZhbGlkU2libGluZyIsIGZTdHJpbmcpOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuaW52YWxpZFNpYmxpbmciLCAoKEphdmFFbGVtZW50KWZFbGVtZW50c1swXSkudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwogCQkJCWNhc2UgSU9fRVhDRVBUSU9OOgogCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuSU9FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBOQU1FX0NPTExJU0lPTjoKIAkJCQkJaWYgKGZFbGVtZW50cyAhPSBudWxsICYmIGZFbGVtZW50cy5sZW5ndGggPiAwKSB7CiAJCQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGZFbGVtZW50c1swXTsKQEAgLTE5OCwxNyArMjQ1LDI2IEBACiAJCQkJCQkJcmV0dXJuIFV0aWwuYmluZCgib3BlcmF0aW9uLmNhbm5vdFJlbmFtZURlZmF1bHRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCX0KIAkJCQkJfQotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMubmFtZUNvbGxpc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChmU3RyaW5nICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBmU3RyaW5nOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLm5hbWVDb2xsaXNpb24iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl9CiAJCQkJY2FzZSBOT19FTEVNRU5UU19UT19QUk9DRVNTOgogCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZEVsZW1lbnRzIik7IC8vJE5PTi1OTFMtMSQKKwogCQkJCWNhc2UgTlVMTF9OQU1FOgogCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZE5hbWUiKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBOVUxMX1BBVEg6CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkUGF0aCIpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIE5VTExfU1RSSU5HOgogCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ubmVlZFN0cmluZyIpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIFBBVEhfT1VUU0lERV9QUk9KRUNUOgotCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucGF0aE91dHNpZGVQcm9qZWN0IiwgZ2V0U3RyaW5nKCksIGZFbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJvcGVyYXRpb24ucGF0aE91dHNpZGVQcm9qZWN0IiwgZlN0cmluZywgKChKYXZhRWxlbWVudClmRWxlbWVudHNbMF0pLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBSRUFEX09OTFk6CiAJCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZkVsZW1lbnRzWzBdOwogCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKQEAgLTIxNiwxOCArMjcyLDc0IEBACiAJCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJzdGF0dXMuZGVmYXVsdFBhY2thZ2VSZWFkT25seSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQkJcmV0dXJuICBVdGlsLmJpbmQoInN0YXR1cy5yZWFkT25seSIsIG5hbWUpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIFJFTEFUSVZFX1BBVEg6CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoIm9wZXJhdGlvbi5uZWVkQWJzb2x1dGVQYXRoIiwgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIFRBUkdFVF9FWENFUFRJT046CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy50YXJnZXRFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCiAJCQkJY2FzZSBVUERBVEVfQ09ORkxJQ1Q6CiAJCQkJCXJldHVybiBVdGlsLmJpbmQoInN0YXR1cy51cGRhdGVDb25mbGljdCIpOyAvLyROT04tTkxTLTEkCisKIAkJCQljYXNlIE5PX0xPQ0FMX0NPTlRFTlRTIDoKIAkJCQkJcmV0dXJuIFV0aWwuYmluZCgic3RhdHVzLm5vTG9jYWxDb250ZW50cyIsIGdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJY2FzZSBDUF9DT05UQUlORVJfUEFUSF9VTkJPVU5EOgorCQkJCQlJUGF0aCBwYXRoID0gdGhpcy5mUGF0aDsKKwkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdClmRWxlbWVudHNbMF07CisJCQkJCUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIocGF0aC5zZWdtZW50KDApKTsKKwkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKwkJCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpIGRlc2NyaXB0aW9uID0gaW5pdGlhbGl6ZXIuZ2V0RGVzY3JpcHRpb24ocGF0aCwgamF2YVByb2plY3QpOworCQkJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgZGVzY3JpcHRpb24gPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7CisJCQkJCXJldHVybiBVdGlsLmJpbmQoImNsYXNzcGF0aC51bmJvdW5kQ29udGFpbmVyUGF0aCIsIGRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJY2FzZSBJTlZBTElEX0NQX0NPTlRBSU5FUl9FTlRSWToKKwkJCQkJcGF0aCA9IHRoaXMuZlBhdGg7CisJCQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdClmRWxlbWVudHNbMF07CisJCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKwkJCQkJZGVzY3JpcHRpb24gPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKHBhdGgsIGphdmFQcm9qZWN0KTsKKwkJCQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCQkJCX0KKwkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisJCQkJCQkgaW5pdGlhbGl6ZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcihwYXRoLnNlZ21lbnQoMCkpOworCQkJCQkJaWYgKGluaXRpYWxpemVyICE9IG51bGwpIGRlc2NyaXB0aW9uID0gaW5pdGlhbGl6ZXIuZ2V0RGVzY3JpcHRpb24ocGF0aCwgamF2YVByb2plY3QpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZGVzY3JpcHRpb24gPSBjb250YWluZXIuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCQkJfQorCQkJCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgZGVzY3JpcHRpb24gPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7CisJCQkJCXJldHVybiBVdGlsLmJpbmQoImNsYXNzcGF0aC5pbnZhbGlkQ29udGFpbmVyIiwgZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCisKKwkJCWNhc2UgQ1BfVkFSSUFCTEVfUEFUSF9VTkJPVU5EOgorCQkJCQlwYXRoID0gdGhpcy5mUGF0aDsKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgiY2xhc3NwYXRoLnVuYm91bmRWYXJpYWJsZVBhdGgiLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQorCQkJY2FzZSBDTEFTU1BBVEhfQ1lDTEU6IAorCQkJCQlqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpZkVsZW1lbnRzWzBdOworCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGguY3ljbGUiLCBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCQkJIAorCQkJY2FzZSBESVNBQkxFRF9DUF9FWENMVVNJT05fUEFUVEVSTlM6CisJCQkJCXBhdGggPSB0aGlzLmZQYXRoOworCQkJCQlyZXR1cm4gVXRpbC5iaW5kKCJjbGFzc3BhdGguZGlzYWJsZWRFeGNsdXNpb25QYXR0ZXJucyIsIHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKworCQkJY2FzZSBESVNBQkxFRF9DUF9NVUxUSVBMRV9PVVRQVVRfTE9DQVRJT05TOgorCQkJCQlwYXRoID0gdGhpcy5mUGF0aDsKKwkJCQkJcmV0dXJuIFV0aWwuYmluZCgiY2xhc3NwYXRoLmRpc2FibGVkTXVsdGlwbGVPdXRwdXRMb2NhdGlvbnMiLCBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCk7CisJCQlpZiAoZlN0cmluZyAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZTdHJpbmc7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAiIjsgLy8gLy8kTk9OLU5MUy0xJAorCQkJfQogCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKKwkJCVN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKwkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbWVzc2FnZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGV4Y2VwdGlvbi50b1N0cmluZygpOworCQkJfQogCQl9CiAJfQogCS8qKgpAQCAtMjUyLDYgKzM2NCw3IEBACiAJfQogCS8qKgogCSAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cyNnZXRTdHJpbmcoKQorCSAqIEBkZXByZWNhdGVkCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CiAJCXJldHVybiBmU3RyaW5nOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0LmphdmEKaW5kZXggMDgxOGYzMC4uMDU4NDdmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdC5qYXZhCkBAIC0xLDQwICsxLDQxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7IAogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5TZXJpYWxpemVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklFdmFsdWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5PYmplY3RWZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuZXZhbC5FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBIYW5kbGUgZm9yIGEgSmF2YSBQcm9qZWN0LgpAQCAtNzIsOCArNzMsMjUgQEAKIAkgKiBUaGUgcGxhdGZvcm0gcHJvamVjdCB0aGlzIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gaXMgYmFzZWQgb24KIAkgKi8KIAlwcm90ZWN0ZWQgSVByb2plY3QgZlByb2plY3Q7CisJCisJLyoqCisJICogTmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgcHJvamVjdCBjbGFzc3BhdGgKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfRklMRU5BTUUgPSAiLmNsYXNzcGF0aCI7ICAvLyROT04tTkxTLTEkCiAKIAkvKioKKwkgKiBOYW1lIG9mIGZpbGUgY29udGFpbmluZyBjdXN0b20gcHJvamVjdCBwcmVmZXJlbmNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRklMRU5BTUUgPSAiLmpwcmVmcyI7ICAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVmFsdWUgb2YgdGhlIHByb2plY3QncyByYXcgY2xhc3NwYXRoIGlmIHRoZSAuY2xhc3NwYXRoIGZpbGUgY29udGFpbnMgaW52YWxpZCBlbnRyaWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gSU5WQUxJRF9DTEFTU1BBVEggPSBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9ERUZBVUxUX09QVElPTl9WQUxVRSA9ICIjXHJcblxyI2N1c3RvbS1ub24tZW1wdHktZGVmYXVsdC12YWx1ZSNcclxuXHIjIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgogCSAqIFJldHVybnMgYSBjYW5vbmljYWxpemVkIHBhdGggZnJvbSB0aGUgZ2l2ZW4gZXh0ZXJuYWwgcGF0aC4KIAkgKiBOb3RlIHRoYXQgdGhlIHJldHVybiBwYXRoIGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBzZWdtZW50cwogCSAqIGFuZCBpdCBjb250YWlucyBhIGRldmljZSBvbmx5IGlmIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW5lZCBvbmUuCkBAIC05Niw3ICsxMTQsOSBAQAogCQl9CiAKIAkJLy8gaWYgbm90IGV4dGVybmFsIHBhdGgsIHJldHVybiBvcmlnaW5hbCBwYXRoCi0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZXh0ZXJuYWxQYXRoKSAhPSBudWxsKSB7CisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQlpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiBleHRlcm5hbFBhdGg7IC8vIHByb3RlY3Rpb24gZHVyaW5nIHNodXRkb3duICgzMDQ4NykKKwkJaWYgKHdvcmtzcGFjZS5nZXRSb290KCkuZmluZE1lbWJlcihleHRlcm5hbFBhdGgpICE9IG51bGwpIHsKIC8vCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSkgewogLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKQVZBIE1PREVMIC0gQ2Fub25pY2FsIHBhdGggaXMgb3JpZ2luYWwgcGF0aCAobWVtYmVyIG9mIHdvcmtzcGFjZSkiKTsgLy8kTk9OLU5MUy0xJAogLy8JCQl9CkBAIC0xNDgsODkgKzE2OCw2IEBACiAvLwkJfQogCQlyZXR1cm4gcmVzdWx0OwogCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBYTUwgU3RyaW5nIGVuY29kaW5nIG9mIHRoZSBjbGFzcyBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRWxlbWVudCBnZXRFbnRyeUFzWE1MRWxlbWVudCgKLQkJRG9jdW1lbnQgZG9jdW1lbnQsCi0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSwKLQkJSVBhdGggcHJlZml4UGF0aCkKLQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2xhc3NwYXRoZW50cnkiKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgia2luZCIsIGtpbmRUb1N0cmluZyhlbnRyeS5nZXRFbnRyeUtpbmQoKSkpOwkvLyROT04tTkxTLTEkCi0JCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKSB7Ci0JCQkvLyB0cmFuc2xhdGUgdG8gcHJvamVjdCByZWxhdGl2ZSBmcm9tIGFic29sdXRlICh1bmxlc3MgYSBkZXZpY2UgcGF0aCkKLQkJCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCWlmIChwcmVmaXhQYXRoICE9IG51bGwgJiYgcHJlZml4UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnQoMCkuZXF1YWxzKHByZWZpeFBhdGguc2VnbWVudCgwKSkpIHsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQlwYXRoID0gcGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGggPSBwYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJwYXRoIiwgcGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsKSB7Ci0JCQllbGVtZW50LnNldEF0dHJpYnV0ZSgic291cmNlcGF0aCIsIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoCi0JCQkJInJvb3RwYXRoIiwgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0V4cG9ydGVkKCkpIHsKLQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJleHBvcnRlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgYSA8Y29kZT5QYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiBmcm9tIGl0cyA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvcm0uCi0JICovCi0Jc3RhdGljIGludCBraW5kRnJvbVN0cmluZyhTdHJpbmcga2luZFN0cikgewotCi0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInByaiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ2YXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImNvbiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoInNyYyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U7Ci0JCWlmIChraW5kU3RyLmVxdWFsc0lnbm9yZUNhc2UoImxpYiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJvdXRwdXQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSBraW5kIG9mIGEgY2xhc3MgcGF0aCBlbnRyeS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGtpbmRUb1N0cmluZyhpbnQga2luZCkgewotCi0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCXJldHVybiAic3JjIjsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQlyZXR1cm4gInNyYyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJcmV0dXJuICJ2YXIiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKLQkJCQlyZXR1cm4gImNvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQgOgotCQkJCXJldHVybiAib3V0cHV0IjsgLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQogCiAJLyoqCiAJICogQ29uc3RydWN0b3IgbmVlZGVkIGZvciA8Y29kZT5JUHJvamVjdC5nZXROYXR1cmUoKTwvY29kZT4gYW5kIDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZSgpPC9jb2RlPi4KQEAgLTI3Miw5ICsyMDksMTIgQEAKIAkJCQkoKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHJvb3RzW2ldKS5zZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkobnVsbCk7IAogCQkJfQogCQl9CisJCQogCQlzdXBlci5jbG9zaW5nKGluZm8pOwogCX0KIAkKKworCiAJLyoqCiAJICogSW50ZXJuYWwgY29tcHV0YXRpb24gb2YgYW4gZXhwYW5kZWQgY2xhc3NwYXRoLiBJdCB3aWxsIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLCBhbmQgcHJvZHVjZSBjb3BpZXMKIAkgKiBvZiBleHBvcnRlZCBjbGFzc3BhdGggZW50cmllcyB0byBhdm9pZCBwb3NzaWJsZSBzaWRlLWVmZmVjdHMgZXZlciBhZnRlci4KQEAgLTI5Nyw3ICsyMzcsNyBAQAogCQlJQ2xhc3NwYXRoRW50cnlbXSBpbW1lZGlhdGVDbGFzc3BhdGggPSAKIAkJCWdldFJlc29sdmVkQ2xhc3NwYXRoKGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSwgZ2VuZXJhdGVNYXJrZXJPbkVycm9yKTsKIAkJCQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gdGhpcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gaW1tZWRpYXRlQ2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGltbWVkaWF0ZUNsYXNzcGF0aFtpXTsKIApAQCAtMzA4LDE1ICsyNDgsMTggQEAKIAkJCQkKIAkJCQkvLyByZWN1cnNlIGluIHByb2plY3QgdG8gZ2V0IGFsbCBpdHMgaW5kaXJlY3QgZXhwb3J0cyAob25seSBjb25zaWRlciBleHBvcnRlZCBlbnRyaWVzIGZyb20gdGhlcmUgb24pCQkJCQogCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCQlJUHJvamVjdCBwcm9qUnNjID0gKElQcm9qZWN0KSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJaWYgKHByb2pSc2MgIT0gbnVsbCAmJiBwcm9qUnNjLmlzT3BlbigpKSB7CQkJCQotCQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHByb2pSc2MpOwotCQkJCQkJcHJvamVjdC5jb21wdXRlRXhwYW5kZWRDbGFzc3BhdGgoCi0JCQkJCQkJaW5pdGlhbFByb2plY3QsIAotCQkJCQkJCWlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSwgCi0JCQkJCQkJZ2VuZXJhdGVNYXJrZXJPbkVycm9yLAotCQkJCQkJCXZpc2l0ZWRQcm9qZWN0cywgCi0JCQkJCQkJYWNjdW11bGF0ZWRFbnRyaWVzKTsKKwkJCQkJSVJlc291cmNlIG1lbWJlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRQYXRoKCkpOyAKKwkJCQkJaWYgKG1lbWJlciAhPSBudWxsICYmIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpeyAvLyBkb3VibGUgY2hlY2sgaWYgYm91bmQgdG8gcHJvamVjdCAoMjM5NzcpCisJCQkJCQlJUHJvamVjdCBwcm9qUnNjID0gKElQcm9qZWN0KSBtZW1iZXI7CisJCQkJCQlpZiAoSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qUnNjKSkgewkJCQkKKwkJCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUocHJvalJzYyk7CisJCQkJCQkJcHJvamVjdC5jb21wdXRlRXhwYW5kZWRDbGFzc3BhdGgoCisJCQkJCQkJCWluaXRpYWxQcm9qZWN0LCAKKwkJCQkJCQkJaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlLCAKKwkJCQkJCQkJZ2VuZXJhdGVNYXJrZXJPbkVycm9yLAorCQkJCQkJCQl2aXNpdGVkUHJvamVjdHMsIAorCQkJCQkJCQlhY2N1bXVsYXRlZEVudHJpZXMpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQkJCQpAQCAtMzI3LDQ4ICsyNzAsODAgQEAKIAkgKiBSZXR1cm5zIChsb2NhbC9hbGwpIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb2plY3QncyBjbGFzc3BhdGguCiAJICogTm90ZTogdGhpcyBmb2xsb3dzIHByb2plY3QgY2xhc3NwYXRoIHJlZmVyZW5jZXMgdG8gZmluZCByZXF1aXJlZCBwcm9qZWN0IGNvbnRyaWJ1dGlvbnMsCiAJICogZWxpbWluYXRpbmcgZHVwbGljYXRlcyBzaWxlbnRseS4KKwkgKiBPbmx5IHdvcmtzIHdpdGggcmVzb2x2ZWQgZW50cmllcwogCSAqLwotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIGJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWRDbGFzc3BhdGgsIGJvb2xlYW4gcmV0cmlldmVFeHBvcnRlZFJvb3RzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRSb290cyA9IG5ldyBPYmplY3RWZWN0b3IoKTsKLQkJY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aCwgYWNjdW11bGF0ZWRSb290cywgbmV3IEhhc2hTZXQoNSksIHRydWUsIHRydWUsIHJldHJpZXZlRXhwb3J0ZWRSb290cyk7CisJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKKwkJCXJlc29sdmVkQ2xhc3NwYXRoLCAKKwkJCWFjY3VtdWxhdGVkUm9vdHMsIAorCQkJbmV3IEhhc2hTZXQoNSksIC8vIHJvb3RJRHMKKwkJCXRydWUsIC8vIGluc2lkZSBvcmlnaW5hbCBwcm9qZWN0CisJCQl0cnVlLCAvLyBjaGVjayBleGlzdGVuY3kKKwkJCXJldHJpZXZlRXhwb3J0ZWRSb290cyk7CiAJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdEFycmF5ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W2FjY3VtdWxhdGVkUm9vdHMuc2l6ZSgpXTsKIAkJYWNjdW11bGF0ZWRSb290cy5jb3B5SW50byhyb290QXJyYXkpOwogCQlyZXR1cm4gcm9vdEFycmF5OwogCX0KIAogCS8qKgorCSAqIENvbXB1dGVzIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGVudHJ5LgorCSAqIE9ubHkgd29ya3Mgd2l0aCByZXNvbHZlZCBlbnRyeQorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSkgeworCQl0cnkgeworCQkJcmV0dXJuIAorCQkJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKKwkJCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdeyByZXNvbHZlZEVudHJ5IH0sIAorCQkJCQlmYWxzZSAvLyBkb24ndCByZXRyaWV2ZSBleHBvcnRlZCByb290cworCQkJCSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W10ge307CisJCX0KKwl9CisJCisJLyoqCiAJICogUmV0dXJucyB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBlbnRyeS4gSW4gY2FzZSBpdCByZWZlcnMgdG8KIAkgKiBhIHByb2plY3QsIGl0IHdpbGwgZm9sbG93IGl0cyBjbGFzc3BhdGggc28gYXMgdG8gZmluZCBleHBvcnRlZCByb290cyBhcyB3ZWxsLgorCSAqIE9ubHkgd29ya3Mgd2l0aCByZXNvbHZlZCBlbnRyeQogCSAqLwogCXB1YmxpYyB2b2lkIGNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5LAorCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSwKIAkJT2JqZWN0VmVjdG9yIGFjY3VtdWxhdGVkUm9vdHMsIAogCQlIYXNoU2V0IHJvb3RJRHMsIAogCQlib29sZWFuIGluc2lkZU9yaWdpbmFsUHJvamVjdCwKIAkJYm9vbGVhbiBjaGVja0V4aXN0ZW5jeSwKIAkJYm9vbGVhbiByZXRyaWV2ZUV4cG9ydGVkUm9vdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkJCi0JCVN0cmluZyByb290SUQgPSAoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5yb290SUQoKTsKKwkJU3RyaW5nIHJvb3RJRCA9ICgoQ2xhc3NwYXRoRW50cnkpcmVzb2x2ZWRFbnRyeSkucm9vdElEKCk7CiAJCWlmIChyb290SURzLmNvbnRhaW5zKHJvb3RJRCkpIHJldHVybjsKIAogCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCUlQYXRoIGVudHJ5UGF0aCA9IHJlc29sdmVkRW50cnkuZ2V0UGF0aCgpOworCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKIAkJCi0JCXN3aXRjaChlbnRyeS5nZXRFbnRyeUtpbmQoKSl7CisJCXN3aXRjaChyZXNvbHZlZEVudHJ5LmdldEVudHJ5S2luZCgpKXsKIAkJCQogCQkJLy8gc291cmNlIGZvbGRlcgogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CiAKIAkJCQlpZiAocHJvamVjdFBhdGguaXNQcmVmaXhPZihlbnRyeVBhdGgpKXsKLQkJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnlQYXRoLCBjaGVja0V4aXN0ZW5jeSk7Ci0JCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuOwotCi0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRm9sZGVyIHx8IHRhcmdldCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKLQkJCQkJCWFjY3VtdWxhdGVkUm9vdHMuYWRkKAotCQkJCQkJCW5ldyBQYWNrYWdlRnJhZ21lbnRSb290KChJUmVzb3VyY2UpdGFyZ2V0LCB0aGlzKSk7Ci0JCQkJCQlyb290SURzLmFkZChyb290SUQpOworCQkJCQlpZiAoY2hlY2tFeGlzdGVuY3kpIHsKKwkJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIGVudHJ5UGF0aCwgY2hlY2tFeGlzdGVuY3kpOworCQkJCQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47CisJCisJCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCl7CisJCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCisJCQkJCQkJCWdldFBhY2thZ2VGcmFnbWVudFJvb3QoKElSZXNvdXJjZSl0YXJnZXQpKTsKKwkJCQkJCQlyb290SURzLmFkZChyb290SUQpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldEZvbGRlclBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoKTsKKwkJCQkJCWlmIChyb290ICE9IG51bGwpIHsKKwkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLmFkZChyb290KTsKKwkJCQkJCQlyb290SURzLmFkZChyb290SUQpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMzc2LDM5ICszNTEsMzIgQEAKIAkJCS8vIGludGVybmFsL2V4dGVybmFsIEpBUiBvciBmb2xkZXIKIAkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKIAkJCQotCQkJCWlmICghaW5zaWRlT3JpZ2luYWxQcm9qZWN0ICYmICFlbnRyeS5pc0V4cG9ydGVkKCkpIHJldHVybjsKLQotCQkJCVN0cmluZyBleHRlbnNpb24gPSBlbnRyeVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnlQYXRoLCBjaGVja0V4aXN0ZW5jeSk7Ci0JCQkJaWYgKHRhcmdldCA9PSBudWxsKSByZXR1cm47Ci0KLQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKXsKLQkJCQkJCi0JCQkJCS8vIGludGVybmFsIHRhcmdldAotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7Ci0JCQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKXsKLQkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCi0JCQkJCQkJCW5ldyBQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKSk7CisJCQkJaWYgKCFpbnNpZGVPcmlnaW5hbFByb2plY3QgJiYgIXJlc29sdmVkRW50cnkuaXNFeHBvcnRlZCgpKSByZXR1cm47CisJCQkJCisJCQkJaWYgKGNoZWNrRXhpc3RlbmN5KSB7CisJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIGVudHJ5UGF0aCwgY2hlY2tFeGlzdGVuY3kpOworCQkJCQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjsKKwkKKwkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSl7CisJCQkJCQkvLyBpbnRlcm5hbCB0YXJnZXQKKwkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHRhcmdldDsKKwkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlKTsKKwkJCQkJCWlmIChyb290ICE9IG51bGwpIHsKKwkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLmFkZChyb290KTsKIAkJCQkJCQlyb290SURzLmFkZChyb290SUQpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWFjY3VtdWxhdGVkUm9vdHMuYWRkKAotCQkJCQkJCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlyb290SURzLmFkZChyb290SUQpOwotCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBleHRlcm5hbCB0YXJnZXQgLSBvbmx5IEpBUnMgYWxsb3dlZAorCQkJCQkJaWYgKCgoamF2YS5pby5GaWxlKXRhcmdldCkuaXNGaWxlKCkgJiYgKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZW50cnlQYXRoLmxhc3RTZWdtZW50KCkpKSkgeworCQkJCQkJCWFjY3VtdWxhdGVkUm9vdHMuYWRkKAorCQkJCQkJCQluZXcgSmFyUGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgsIHRoaXMpKTsKKwkJCQkJCQlyb290SURzLmFkZChyb290SUQpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJLy8gZXh0ZXJuYWwgdGFyZ2V0IC0gb25seSBKQVJzIGFsbG93ZWQKLQkJCQkJaWYgKCgoamF2YS5pby5GaWxlKXRhcmdldCkuaXNGaWxlKCkKLQkJCQkJCSYmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYWNjdW11bGF0ZWRSb290cy5hZGQoCi0JCQkJCQkJbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoZW50cnlQYXRoLnRvT1NTdHJpbmcoKSwgdGhpcykpOworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChlbnRyeVBhdGgpOworCQkJCQlpZiAocm9vdCAhPSBudWxsKSB7CisJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLmFkZChyb290KTsKIAkJCQkJCXJvb3RJRHMuYWRkKHJvb3RJRCk7CiAJCQkJCX0KIAkJCQl9CkBAIC00MTgsMzEgKzM4NiwzNSBAQAogCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgogCiAJCQkJaWYgKCFyZXRyaWV2ZUV4cG9ydGVkUm9vdHMpIHJldHVybjsKLQkJCQlpZiAoIWluc2lkZU9yaWdpbmFsUHJvamVjdCAmJiAhZW50cnkuaXNFeHBvcnRlZCgpKSByZXR1cm47CisJCQkJaWYgKCFpbnNpZGVPcmlnaW5hbFByb2plY3QgJiYgIXJlc29sdmVkRW50cnkuaXNFeHBvcnRlZCgpKSByZXR1cm47CiAKLQkJCQlKYXZhUHJvamVjdCByZXF1aXJlZFByb2plY3QgPSAoSmF2YVByb2plY3QpZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QoZW50cnlQYXRoLnNlZ21lbnQoMCkpOwotCQkJCUlQcm9qZWN0IHJlcXVpcmVkUHJvamVjdFJzYyA9IHJlcXVpcmVkUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHJlcXVpcmVkUHJvamVjdFJzYy5leGlzdHMoKSAmJiByZXF1aXJlZFByb2plY3RSc2MuaXNPcGVuKCkpeyAvLyBzcGVjaWFsIGJ1aWxkZXIgYmluYXJ5IG91dHB1dAotCQkJCQlyb290SURzLmFkZChyb290SUQpOwotCQkJCQlyZXF1aXJlZFByb2plY3QuY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAotCQkJCQkJcmVxdWlyZWRQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpLCAKLQkJCQkJCWFjY3VtdWxhdGVkUm9vdHMsIAotCQkJCQkJcm9vdElEcywgCi0JCQkJCQlmYWxzZSwgCi0JCQkJCQljaGVja0V4aXN0ZW5jeSwgCi0JCQkJCQlyZXRyaWV2ZUV4cG9ydGVkUm9vdHMpOwotCQkJCX0KKwkJCQlJUmVzb3VyY2UgbWVtYmVyID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKGVudHJ5UGF0aCk7CisJCQkJaWYgKG1lbWJlciAhPSBudWxsICYmIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1Qpey8vIGRvdWJsZSBjaGVjayBpZiBib3VuZCB0byBwcm9qZWN0ICgyMzk3NykKKwkJCQkJSVByb2plY3QgcmVxdWlyZWRQcm9qZWN0UnNjID0gKElQcm9qZWN0KSBtZW1iZXI7CisJCQkJCWlmIChKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHJlcXVpcmVkUHJvamVjdFJzYykpeyAvLyBzcGVjaWFsIGJ1aWxkZXIgYmluYXJ5IG91dHB1dAorCQkJCQkJcm9vdElEcy5hZGQocm9vdElEKTsKKwkJCQkJCUphdmFQcm9qZWN0IHJlcXVpcmVkUHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUocmVxdWlyZWRQcm9qZWN0UnNjKTsKKwkJCQkJCXJlcXVpcmVkUHJvamVjdC5jb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoCisJCQkJCQkJcmVxdWlyZWRQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpLCAKKwkJCQkJCQlhY2N1bXVsYXRlZFJvb3RzLCAKKwkJCQkJCQlyb290SURzLCAKKwkJCQkJCQlmYWxzZSwgCisJCQkJCQkJY2hlY2tFeGlzdGVuY3ksIAorCQkJCQkJCXJldHJpZXZlRXhwb3J0ZWRSb290cyk7CisJCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KKwkJfQogCX0KIAogCS8qKgogCSAqIFJldHVybnMgKGxvY2FsL2FsbCkgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvamVjdCdzIGNsYXNzcGF0aC4KIAkgKiBOb3RlOiB0aGlzIGZvbGxvd3MgcHJvamVjdCBjbGFzc3BhdGggcmVmZXJlbmNlcyB0byBmaW5kIHJlcXVpcmVkIHByb2plY3QgY29udHJpYnV0aW9ucywKIAkgKiBlbGltaW5hdGluZyBkdXBsaWNhdGVzIHNpbGVudGx5LgorCSAqIE9ubHkgd29ya3Mgd2l0aCByZXNvbHZlZCBlbnRyaWVzCiAJICovCiAJcHVibGljIHZvaWQgY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsCisJCUlDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoLAogCQlPYmplY3RWZWN0b3IgYWNjdW11bGF0ZWRSb290cywgCiAJCUhhc2hTZXQgcm9vdElEcywgCiAJCWJvb2xlYW4gaW5zaWRlT3JpZ2luYWxQcm9qZWN0LApAQCAtNDUyLDkgKzQyNCw5IEBACiAJCWlmIChpbnNpZGVPcmlnaW5hbFByb2plY3QpewogCQkJcm9vdElEcy5hZGQocm9vdElEKCkpOwogCQl9CQotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlc29sdmVkQ2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKXsKIAkJCWNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cygKLQkJCQljbGFzc3BhdGhbaV0sCisJCQkJcmVzb2x2ZWRDbGFzc3BhdGhbaV0sCiAJCQkJYWNjdW11bGF0ZWRSb290cywKIAkJCQlyb290SURzLAogCQkJCWluc2lkZU9yaWdpbmFsUHJvamVjdCwKQEAgLTQ3OSwzNCArNDUxLDEyNiBAQAogCQkvLyByZWdpc3RlciBKYXZhIGJ1aWxkZXIKIAkJYWRkVG9CdWlsZFNwZWMoSmF2YUNvcmUuQlVJTERFUl9JRCk7CiAJfQorCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGNoaWxkcmVuIG9yIHRoZSBub24tSmF2YSByZXNvdXJjZXMgb2YgdGhpcyBwcm9qZWN0LgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGluIHRoZSBwcm9qZWN0LgorCSAqIEFzc3VtZXMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYSBmb2xkZXIgb3IgYSBmaWxlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElSZXNvdXJjZSByZXNvdXJjZSkgeworCQkJCisJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKKwkJSVBhdGggb3V0cHV0OworCQl0cnkgeworCQkJY2xhc3NwYXRoID0gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQlvdXRwdXQgPSBnZXRPdXRwdXRMb2NhdGlvbigpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlJUGF0aCBmdWxsUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CisJCUlQYXRoIGlubmVyTW9zdE91dHB1dCA9IG91dHB1dC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSA/IG91dHB1dCA6IG51bGw7CisJCUlDbGFzc3BhdGhFbnRyeSBpbm5lck1vc3RFbnRyeSA9IG51bGw7CisJCWZvciAoaW50IGogPSAwLCBjcExlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGogPCBjcExlbmd0aDsgaisrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbal07CisJCQorCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJaWYgKChpbm5lck1vc3RFbnRyeSA9PSBudWxsIHx8IGlubmVyTW9zdEVudHJ5LmdldFBhdGgoKS5pc1ByZWZpeE9mKGVudHJ5UGF0aCkpCisJCQkJCSYmIGVudHJ5UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgeworCQkJCWlubmVyTW9zdEVudHJ5ID0gZW50cnk7CisJCQl9CisJCQlJUGF0aCBlbnRyeU91dHB1dCA9IGNsYXNzcGF0aFtqXS5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJaWYgKGVudHJ5T3V0cHV0ICE9IG51bGwgJiYgZW50cnlPdXRwdXQuaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKKwkJCQlpbm5lck1vc3RPdXRwdXQgPSBlbnRyeU91dHB1dDsKKwkJCX0KKwkJfQorCQlpZiAoaW5uZXJNb3N0RW50cnkgIT0gbnVsbCkgeworCQkJLy8gc3BlY2lhbCBjYXNlIHByaj09c3JjIGFuZCBuZXN0ZWQgb3V0cHV0IGxvY2F0aW9uCisJCQlpZiAoaW5uZXJNb3N0T3V0cHV0ICE9IG51bGwgJiYgaW5uZXJNb3N0T3V0cHV0LnNlZ21lbnRDb3VudCgpID4gMSAvLyBvdXRwdXQgaXNuJ3QgcHJvamVjdAorCQkJCQkmJiBpbm5lck1vc3RFbnRyeS5nZXRQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gMSkgeyAvLyAxIHNlZ21lbnQgbXVzdCBiZSBwcm9qZWN0IG5hbWUKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJCSAvLyBmb2xkZXJzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gc3JjL2xpYiBlbnRyaWVzCisJCQkJIHJldHVybiB0cnVlOworCQkJfQorCQkJc3dpdGNoIChpbm5lck1vc3RFbnRyeS5nZXRFbnRyeUtpbmQoKSkgeworCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6CisJCQkJCS8vIC5jbGFzcyBmaWxlcyBhcmUgbm90IHZpc2libGUgaW4gc291cmNlIGZvbGRlcnMgCisJCQkJCXJldHVybiAhVXRpbC5pc0NsYXNzRmlsZU5hbWUoZnVsbFBhdGgubGFzdFNlZ21lbnQoKSk7CisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CisJCQkJCS8vIC5qYXZhIGZpbGVzIGFyZSBub3QgdmlzaWJsZSBpbiBsaWJyYXJ5IGZvbGRlcnMKKwkJCQkJcmV0dXJuICFVdGlsLmlzSmF2YUZpbGVOYW1lKGZ1bGxQYXRoLmxhc3RTZWdtZW50KCkpOworCQkJfQorCQl9CisJCWlmIChpbm5lck1vc3RPdXRwdXQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KIAogCS8qKgotCSAqIFJlY29yZCBhIG5ldyBtYXJrZXIgZGVub3RpbmcgYSBjbGFzc3BhdGggcHJvYmxlbSAKKwkgKiBSZWNvcmQgYSBuZXcgbWFya2VyIGRlbm90aW5nIGEgY2xhc3NwYXRoIHByb2JsZW0KIAkgKi8KLQl2b2lkIGNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCi0JCVN0cmluZyBtZXNzYWdlLAotCQlpbnQgc2V2ZXJpdHksCi0JCWJvb2xlYW4gaXNDeWNsZVByb2JsZW0sCQkKLQkJYm9vbGVhbiBpc0NsYXNzcGF0aEZpbGVGb3JtYXRQcm9ibGVtKSB7CisJSU1hcmtlciBjcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKElKYXZhTW9kZWxTdGF0dXMgc3RhdHVzKSB7CisJCQkKKwkJSU1hcmtlciBtYXJrZXIgPSBudWxsOworCQlpbnQgc2V2ZXJpdHk7CisJCVN0cmluZ1tdIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbMF07CisJCWJvb2xlYW4gaXNDeWNsZVByb2JsZW0gPSBmYWxzZSwgaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA9IGZhbHNlOworCQlzd2l0Y2ggKHN0YXR1cy5nZXRDb2RlKCkpIHsKKworCQkJY2FzZSAgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5DTEFTU1BBVEhfQ1lDTEUgOgorCQkJCWlzQ3ljbGVQcm9ibGVtID0gdHJ1ZTsKKwkJCQlpZiAoSmF2YUNvcmUuRVJST1IuZXF1YWxzKGdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCwgdHJ1ZSkpKSB7CisJCQkJCXNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKKwkJCQl9IGVsc2UgeworCQkJCQlzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEhfRklMRV9GT1JNQVQgOgorCQkJCWlzQ2xhc3NwYXRoRmlsZUZvcm1hdFByb2JsZW0gPSB0cnVlOworCQkJCXNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlJUGF0aCBwYXRoID0gc3RhdHVzLmdldFBhdGgoKTsKKwkJCQlpZiAocGF0aCAhPSBudWxsKSBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW10geyBwYXRoLnRvU3RyaW5nKCkgfTsKKwkJCQlpZiAoSmF2YUNvcmUuRVJST1IuZXF1YWxzKGdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0lOQ09NUExFVEVfQ0xBU1NQQVRILCB0cnVlKSkpIHsKKwkJCQkJc2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOworCQkJCX0gZWxzZSB7CisJCQkJCXNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQkKIAkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUik7CisJCQltYXJrZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSKTsKIAkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKAogCQkJCW5ldyBTdHJpbmdbXSB7IAogCQkJCQlJTWFya2VyLk1FU1NBR0UsIAogCQkJCQlJTWFya2VyLlNFVkVSSVRZLCAKIAkJCQkJSU1hcmtlci5MT0NBVElPTiwgCiAJCQkJCUlKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUQsCi0JCQkJCUlKYXZhTW9kZWxNYXJrZXIuQ0xBU1NQQVRIX0ZJTEVfRk9STUFUIH0sCisJCQkJCUlKYXZhTW9kZWxNYXJrZXIuQ0xBU1NQQVRIX0ZJTEVfRk9STUFULAorCQkJCQlJSmF2YU1vZGVsTWFya2VyLklELAorCQkJCQlJSmF2YU1vZGVsTWFya2VyLkFSR1VNRU5UUyAsCisJCQkJfSwKIAkJCQluZXcgT2JqZWN0W10gewotCQkJCQltZXNzYWdlLAorCQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpLAogCQkJCQluZXcgSW50ZWdlcihzZXZlcml0eSksIAogCQkJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5idWlsZFBhdGgiKSwvLyROT04tTkxTLTEkCiAJCQkJCWlzQ3ljbGVQcm9ibGVtID8gInRydWUiIDogImZhbHNlIiwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA/ICJ0cnVlIiA6ICJmYWxzZSJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJaXNDbGFzc3BhdGhGaWxlRm9ybWF0UHJvYmxlbSA/ICJ0cnVlIiA6ICJmYWxzZSIsLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCW5ldyBJbnRlZ2VyKHN0YXR1cy5nZXRDb2RlKCkpLAorCQkJCQlVdGlsLmdldFByb2JsZW1Bcmd1bWVudHNGb3JNYXJrZXIoYXJndW1lbnRzKSAsCisJCQkJfQorCQkJKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCX0KKwkJcmV0dXJuIG1hcmtlcjsKIAl9Ci0KKwkKIAkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IGVsZW1lbnQgaW5mbyBmb3IgdGhpcyBlbGVtZW50LgogCSAqLwpAQCAtNTE2LDYgKzU4MCw4NyBAQAogCX0KIAogCS8qKgorCSAqIFJlYWRzIGFuZCBkZWNvZGUgYW4gWE1MIGNsYXNzcGF0aCBzdHJpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gZGVjb2RlQ2xhc3NwYXRoKFN0cmluZyB4bWxDbGFzc3BhdGgsIGJvb2xlYW4gY3JlYXRlTWFya2VyLCBib29sZWFuIGxvZ1Byb2JsZW1zKSB7CisKKwkJQXJyYXlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOworCQlJQ2xhc3NwYXRoRW50cnkgZGVmYXVsdE91dHB1dCA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoeG1sQ2xhc3NwYXRoID09IG51bGwpIHJldHVybiBudWxsOworCQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoeG1sQ2xhc3NwYXRoKTsKKwkJCUVsZW1lbnQgY3BFbGVtZW50OworCQorCQkJdHJ5IHsKKwkJCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0KKwkJCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJCWNwRWxlbWVudCA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCisJCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBmaW5hbGx5IHsKKwkJCQlyZWFkZXIuY2xvc2UoKTsKKwkJCX0KKwkKKwkJCWlmICghY3BFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NwYXRoIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlOb2RlTGlzdCBsaXN0ID0gY3BFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjbGFzc3BhdGhlbnRyeSIpOyAvLyROT04tTkxTLTEkCisJCQlpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKKwkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKwkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7CisJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBDbGFzc3BhdGhFbnRyeS5lbGVtZW50RGVjb2RlKChFbGVtZW50KW5vZGUsIHRoaXMpOworCQkJCQlpZiAoZW50cnkgIT0gbnVsbCl7CisJCQkJCQlpZiAoZW50cnkuZ2V0Q29udGVudEtpbmQoKSA9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVCkgeyAKKwkJCQkJCQlkZWZhdWx0T3V0cHV0ID0gZW50cnk7IC8vIHNlcGFyYXRlIG91dHB1dAorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwYXRocy5hZGQoZW50cnkpOworCQkJCX0KKwkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGJhZCBmb3JtYXQKKwkJCWlmIChjcmVhdGVNYXJrZXIgJiYgdGhpcy5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQkJdGhpcy5jcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKG5ldyBKYXZhTW9kZWxTdGF0dXMoCisJCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKKwkJCQkJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC54bWxGb3JtYXRFcnJvciIsIHRoaXMuZ2V0RWxlbWVudE5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChsb2dQcm9ibGVtcykgeworCQkJCVV0aWwubG9nKGUsIAorCQkJCQkiRXhjZXB0aW9uIHdoaWxlIHJldHJpZXZpbmcgIisgdGhpcy5nZXRQYXRoKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkrIi8uY2xhc3NwYXRoLCB3aWxsIG1hcmsgY2xhc3NwYXRoIGFzIGludmFsaWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcmV0dXJuIElOVkFMSURfQ0xBU1NQQVRIOworCQl9IGNhdGNoIChBc3NlcnQuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsgCisJCQkvLyBmYWlsZWQgY3JlYXRpbmcgQ1AgZW50cmllcyBmcm9tIGZpbGUKKwkJCWlmIChjcmVhdGVNYXJrZXIgJiYgdGhpcy5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCQl0aGlzLmNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIobmV3IEphdmFNb2RlbFN0YXR1cygKKwkJCQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9DTEFTU1BBVEhfRklMRV9GT1JNQVQsCisJCQkJCQlVdGlsLmJpbmQoImNsYXNzcGF0aC5pbGxlZ2FsRW50cnlJbkNsYXNzcGF0aEZpbGUiLCB0aGlzLmdldEVsZW1lbnROYW1lKCksIGUuZ2V0TWVzc2FnZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAobG9nUHJvYmxlbXMpIHsKKwkJCQlVdGlsLmxvZyhlLCAKKwkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyIvLmNsYXNzcGF0aCwgd2lsbCBtYXJrIGNsYXNzcGF0aCBhcyBpbnZhbGlkIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiBJTlZBTElEX0NMQVNTUEFUSDsKKwkJfQorCQlpbnQgcGF0aFNpemUgPSBwYXRocy5zaXplKCk7CisJCWlmIChwYXRoU2l6ZSA+IDAgfHwgZGVmYXVsdE91dHB1dCAhPSBudWxsKSB7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtwYXRoU2l6ZSArIChkZWZhdWx0T3V0cHV0ID09IG51bGwgPyAwIDogMSldOworCQkJcGF0aHMudG9BcnJheShlbnRyaWVzKTsKKwkJCWlmIChkZWZhdWx0T3V0cHV0ICE9IG51bGwpIGVudHJpZXNbcGF0aFNpemVdID0gZGVmYXVsdE91dHB1dDsgLy8gZW5zdXJlIG91dHB1dCBpcyBsYXN0IGl0ZW0KKwkJCXJldHVybiBlbnRyaWVzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKIAkvKioKIAkgKiBSZW1vdmVzIHRoZSBKYXZhIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0LgogCSAqLwpAQCAtNTQ0LDYgKzY4OSw0OSBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIFhNTCBTdHJpbmcgZW5jb2Rpbmcgb2YgdGhlIGNsYXNzIHBhdGguCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBlbmNvZGVDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJUGF0aCBvdXRwdXRMb2NhdGlvbiwgYm9vbGVhbiB1c2VMaW5lU2VwYXJhdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKworCQlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudEltcGwoKTsKKwkJRWxlbWVudCBjcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAorCQlkb2N1bWVudC5hcHBlbmRDaGlsZChjcEVsZW1lbnQpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgKytpKSB7CisJCQljcEVsZW1lbnQuYXBwZW5kQ2hpbGQoKChDbGFzc3BhdGhFbnRyeSljbGFzc3BhdGhbaV0pLmVsZW1lbnRFbmNvZGUoZG9jdW1lbnQsIGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKSk7CisJCX0KKworCQlpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgeworCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5tYWtlUmVsYXRpdmUoKTsKKwkJCUVsZW1lbnQgb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjbGFzc3BhdGhlbnRyeSIpOyAvLyROT04tTkxTLTEkCisJCQlvRWxlbWVudC5zZXRBdHRyaWJ1dGUoImtpbmQiLCBDbGFzc3BhdGhFbnRyeS5raW5kVG9TdHJpbmcoQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQpKTsJLy8kTk9OLU5MUy0xJAorCQkJb0VsZW1lbnQuc2V0QXR0cmlidXRlKCJwYXRoIiwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWNwRWxlbWVudC5hcHBlbmRDaGlsZChvRWxlbWVudCk7CisJCX0KKworCQkvLyBwcm9kdWNlIGEgU3RyaW5nIG91dHB1dAorCQl0cnkgeworCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQlPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOworCQkJaWYgKHVzZUxpbmVTZXBhcmF0b3IpIHsKKwkJCQlmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOworCQkJCWZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7ICAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCWZvcm1hdC5zZXRQcmVzZXJ2ZVNwYWNlKHRydWUpOworCQkJfQkJCQorCQkJU2VyaWFsaXplciBzZXJpYWxpemVyID0KKwkJCQlTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcigKKwkJCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzLCAiVVRGOCIpLCAvLyROT04tTkxTLTEkCisJCQkJCWZvcm1hdCk7CisJCQlzZXJpYWxpemVyLmFzRE9NU2VyaWFsaXplcigpLnNlcmlhbGl6ZShkb2N1bWVudCk7CisJCQlyZXR1cm4gcy50b1N0cmluZygiVVRGOCIpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JT19FWENFUFRJT04pOworCQl9CisJfQorCQorCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhbmRsZSByZXByZXNlbnRzIHRoZSBzYW1lIEphdmEgcHJvamVjdAogCSAqIGFzIHRoZSBnaXZlbiBoYW5kbGUuIFR3byBoYW5kbGVzIHJlcHJlc2VudCB0aGUgc2FtZQogCSAqIHByb2plY3QgaWYgdGhleSBhcmUgaWRlbnRpY2FsIG9yIGlmIHRoZXkgcmVwcmVzZW50IGEgcHJvamVjdCB3aXRoIApAQCAtNTY0LDYgKzc1MiwxMSBAQAogCQkJJiYgZk9jY3VycmVuY2VDb3VudCA9PSBvdGhlci5mT2NjdXJyZW5jZUNvdW50OwogCX0KIAorCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKwkJaWYgKCFoYXNKYXZhTmF0dXJlKGZQcm9qZWN0KSkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gc3VwZXIuZXhpc3RzKCk7CisJfQkKKwogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0CiAJICovCkBAIC02MzksNyArODMyLDcgQEAKIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBmaW5kUGFja2FnZUZyYWdtZW50KElQYXRoIHBhdGgpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCi0JCXJldHVybiBmaW5kUGFja2FnZUZyYWdtZW50MCh0aGlzLmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpKTsKKwkJcmV0dXJuIGZpbmRQYWNrYWdlRnJhZ21lbnQwKEphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpKTsKIAl9CiAKIAkvKioKQEAgLTY1Nyw3ICs4NTAsNyBAQAogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBmaW5kUGFja2FnZUZyYWdtZW50Um9vdChJUGF0aCBwYXRoKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAotCQlyZXR1cm4gZmluZFBhY2thZ2VGcmFnbWVudFJvb3QwKHRoaXMuY2Fub25pY2FsaXplZFBhdGgocGF0aCkpOworCQlyZXR1cm4gZmluZFBhY2thZ2VGcmFnbWVudFJvb3QwKEphdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoKHBhdGgpKTsKIAl9CiAKIAkvKioKQEAgLTY3OCw2ICs4NzEsMjQgQEAKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CisJLyoqCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CisJCXRyeSB7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSB0aGlzLmdldFJhd0NsYXNzcGF0aCgpOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCWlmIChjbGFzc3BhdGhbaV0uZXF1YWxzKGVudHJ5KSkgeyAvLyBlbnRyeSBtYXkgbmVlZCB0byBiZSByZXNvbHZlZAorCQkJCQlyZXR1cm4gCisJCQkJCQljb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoCisJCQkJCQkJZ2V0UmVzb2x2ZWRDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHtlbnRyeX0sIG51bGwsIHRydWUsIGZhbHNlLCBudWxsLypubyByZXZlcnNlIG1hcCovKSwgCisJCQkJCQkJZmFsc2UpOyAvLyBkb24ndCByZXRyaWV2ZSBleHBvcnRlZCByb290cworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W10ge307CisJfQogCQogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0I2ZpbmRUeXBlKFN0cmluZykKQEAgLTcyMiwxNCArOTMzLDE4IEBACiAJCXRyeSB7CiAJCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwogCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfT05FKTsKKwkJCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CiAJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgY3ljbGVBdHRyID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUQpOwotCQkJCQlTdHJpbmcgY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIgPSAgKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ0xBU1NQQVRIX0ZJTEVfRk9STUFUKTsKLQkJCQkJaWYgKChmbHVzaEN5Y2xlTWFya2VycyA9PSAoY3ljbGVBdHRyICE9IG51bGwgJiYgY3ljbGVBdHRyLmVxdWFscygidHJ1ZSIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJJiYgKGZsdXNoQ2xhc3NwYXRoRm9ybWF0TWFya2VycyA9PSAoY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIgIT0gbnVsbCAmJiBjbGFzc3BhdGhGaWxlRm9ybWF0QXR0ci5lcXVhbHMoInRydWUiKSkpKXsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoZmx1c2hDeWNsZU1hcmtlcnMgJiYgZmx1c2hDbGFzc3BhdGhGb3JtYXRNYXJrZXJzKSB7CiAJCQkJCQltYXJrZXIuZGVsZXRlKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlTdHJpbmcgY3ljbGVBdHRyID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUQpOworCQkJCQkJU3RyaW5nIGNsYXNzcGF0aEZpbGVGb3JtYXRBdHRyID0gIChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkNMQVNTUEFUSF9GSUxFX0ZPUk1BVCk7CisJCQkJCQlpZiAoKGZsdXNoQ3ljbGVNYXJrZXJzID09IChjeWNsZUF0dHIgIT0gbnVsbCAmJiBjeWNsZUF0dHIuZXF1YWxzKCJ0cnVlIikpKSAvLyROT04tTkxTLTEkCisJCQkJCQkJJiYgKGZsdXNoQ2xhc3NwYXRoRm9ybWF0TWFya2VycyA9PSAoY2xhc3NwYXRoRmlsZUZvcm1hdEF0dHIgIT0gbnVsbCAmJiBjbGFzc3BhdGhGaWxlRm9ybWF0QXR0ci5lcXVhbHMoInRydWUiKSkpKXsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTc0NCw2NCArOTU5LDM3IEBACiAJCU9wZW5hYmxlRWxlbWVudEluZm8gaW5mbywKIAkJSVByb2dyZXNzTW9uaXRvciBwbSwKIAkJTWFwIG5ld0VsZW1lbnRzLAotCQlJUmVzb3VyY2UgdW5kZXJseWluZ1Jlc291cmNlKQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKIAkJYm9vbGVhbiB2YWxpZEluZm8gPSBmYWxzZTsKIAkJdHJ5IHsKLQkJCWlmICgoKElQcm9qZWN0KSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkuaXNPcGVuKCkpIHsKLQkJCQkvLyBwdXQgdGhlIGluZm8gbm93LCBiZWNhdXNlIHNldHRpbmcgdGhlIGNsYXNzcGF0aCByZXF1aXJlcyBpdAorCQkJaWYgKGdldFByb2plY3QoKS5pc09wZW4oKSkgeworCQkJCS8vIHB1dCB0aGUgaW5mbyBub3csIGJlY2F1c2UgY29tcHV0aW5nIHRoZSByb290cyByZXF1aXJlcyBpdAogCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnB1dEluZm8odGhpcywgaW5mbyk7CiAKLQkJCQkvLyByZWFkIGNsYXNzcGF0aCBwcm9wZXJ0eSAoY29udGFpbnMgYWN0dWFsIGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIHNldHRpbmdzKQotCQkJCUlQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOwotCi0JCQkJLy8gcmVhZCBmcm9tIGZpbGUKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgc2hhcmVkQ2xhc3NwYXRoID0gbG9hZENsYXNzcGF0aCgpOwotCQkJCQlpZiAoc2hhcmVkQ2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQkJCWNsYXNzcGF0aCA9IHJlYWRQYXRocyhzaGFyZWRDbGFzc3BhdGgpOworCQkJCS8vIGNvbXB1dGUgdGhlIHBrZyBmcmFnbWVudCByb290cworCQkJCXVwZGF0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CQkJCQorCQorCQkJCS8vIHJlbWVtYmVyIHRoZSB0aW1lc3RhbXBzIG9mIGV4dGVybmFsIGxpYnJhcmllcyB0aGUgZmlyc3QgdGltZSB0aGV5IGFyZSBsb29rZWQgdXAKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUvKmlnbm9yZSB1bnJlc29sdmVkIHZhcmlhYmxlKi8pOworCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXNvbHZlZENsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSByZXNvbHZlZENsYXNzcGF0aFtpXTsKKwkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHBhdGgsIHRydWUpOworCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSkgeworCQkJCQkJCU1hcCBleHRlcm5hbFRpbWVTdGFtcHMgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVByb2Nlc3Nvci5leHRlcm5hbFRpbWVTdGFtcHM7CisJCQkJCQkJaWYgKGV4dGVybmFsVGltZVN0YW1wcy5nZXQocGF0aCkgPT0gbnVsbCkgeworCQkJCQkJCQlsb25nIHRpbWVzdGFtcCA9IERlbHRhUHJvY2Vzc29yLmdldFRpbWVTdGFtcCgoamF2YS5pby5GaWxlKXRhcmdldCk7CisJCQkJCQkJCWV4dGVybmFsVGltZVN0YW1wcy5wdXQocGF0aCwgbmV3IExvbmcodGltZXN0YW1wKSk7CQkJCQkJCQorCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJfQotCQkJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJCQkJVXRpbC5sb2coZSwgCi0JCQkJCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UgJiYgdGhpcy5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpewotCQkJCQkJVXRpbC5sb2coZSwgCi0JCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIi8uY2xhc3NwYXRoLCB3aWxsIHJldmVydCB0byBkZWZhdWx0IGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBleHRyYWN0IG91dCB0aGUgb3V0cHV0IGxvY2F0aW9uCi0JCQkJaWYgKGNsYXNzcGF0aCAhPSBudWxsICYmIGNsYXNzcGF0aC5sZW5ndGggPiAwKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtjbGFzc3BhdGgubGVuZ3RoIC0gMV07Ci0JCQkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7Ci0JCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvcHkgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7Ci0JCQkJCQljbGFzc3BhdGggPSBjb3B5OwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlc3RvcmUgb3V0cHV0IGxvY2F0aW9uCQkJCQotCQkJCWlmIChvdXRwdXRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCW91dHB1dExvY2F0aW9uID0gZGVmYXVsdE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJfQotCQkJCSgoSmF2YVByb2plY3RFbGVtZW50SW5mbylpbmZvKS5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbik7Ci0KLQkJCQkvLyByZXN0b3JlIGNsYXNzcGF0aAotCQkJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotCQkJCQljbGFzc3BhdGggPSBkZWZhdWx0Q2xhc3NwYXRoKCk7Ci0JCQkJfQotCQkJCXNldFJhd0NsYXNzcGF0aDAoY2xhc3NwYXRoKTsKKwkJCQl9CQkJCiAKIAkJCQkvLyBvbmx5IHZhbGlkIGlmIHJlYWNoZXMgaGVyZQkJCQkKIAkJCQl2YWxpZEluZm8gPSB0cnVlOwogCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQl9IGZpbmFsbHkgewogCQkJaWYgKCF2YWxpZEluZm8pCiAJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlSW5mbyh0aGlzKTsKQEAgLTgxOSw1MSArMTAwNyw2IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgWE1MIFN0cmluZyBlbmNvZGluZyBvZiB0aGUgY2xhc3MgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzcGF0aEFzWE1MKAotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsCi0JCUlQYXRoIG91dHB1dExvY2F0aW9uKQotCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0JCUVsZW1lbnQgY3BFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjcEVsZW1lbnQpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgKytpKSB7Ci0JCQlFbGVtZW50IGNwZUVsZW1lbnQgPQotCQkJCWdldEVudHJ5QXNYTUxFbGVtZW50KGRvYywgY2xhc3NwYXRoW2ldLCBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQljcEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3BlRWxlbWVudCk7Ci0JCX0KLQotCQlpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgewotCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJb3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbi5tYWtlUmVsYXRpdmUoKTsKLQkJCUVsZW1lbnQgb0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2xhc3NwYXRoZW50cnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJb0VsZW1lbnQuc2V0QXR0cmlidXRlKCJraW5kIiwga2luZFRvU3RyaW5nKENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSk7CS8vJE5PTi1OTFMtMSQKLQkJCW9FbGVtZW50LnNldEF0dHJpYnV0ZSgicGF0aCIsIG91dHB1dExvY2F0aW9uLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNwRWxlbWVudC5hcHBlbmRDaGlsZChvRWxlbWVudCk7Ci0JCX0KLQotCQkvLyBwcm9kdWNlIGEgU3RyaW5nIG91dHB1dAotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHM9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCU91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCk7Ci0JCQlmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOwotCQkJZm9ybWF0LnNldExpbmVTZXBhcmF0b3IoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJU2VyaWFsaXplciBzZXJpYWxpemVyID0KLQkJCQlTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcigKLQkJCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzLCAiVVRGOCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWZvcm1hdCk7Ci0JCQlzZXJpYWxpemVyLmFzRE9NU2VyaWFsaXplcigpLnNlcmlhbGl6ZShkb2MpOwotCQkJcmV0dXJuIHMudG9TdHJpbmcoIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKLQkJfQotCX0KLQotCS8qKgogCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyeSB0aGF0IHJlZmVycyB0byB0aGUgZ2l2ZW4gcGF0aAogCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHJlZmVyZW5jZSB0byB0aGUgcGF0aC4KIAkgKi8KQEAgLTg3OSwxMiArMTAyMiwyNSBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIGNsYXNzcGF0aCBzZXJ2ZXIgcHJvcGVydHkKLQkgKiBvZiB0aGlzIHByb2plY3QKKwkvKgorCSAqIFJldHVybnMgdGhlIGN5Y2xlIG1hcmtlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0IG9yIG51bGwgaWYgbm9uZS4KIAkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRDbGFzc3BhdGhQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBJTWFya2VyIGdldEN5Y2xlTWFya2VyKCl7CisJCXRyeSB7CisJCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKKwkJCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOworCQkJCQlTdHJpbmcgY3ljbGVBdHRyID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUQpOworCQkJCQlpZiAoY3ljbGVBdHRyICE9IG51bGwgJiYgY3ljbGVBdHRyLmVxdWFscygidHJ1ZSIpKXsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcmV0dXJuIG1hcmtlcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCkBAIC05NDAsMTQgKzEwOTYsNiBAQAogCX0KIAogCS8qKgotCSAqIEBzZWUgSUphdmFFbGVtZW50Ci0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKIAkgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzcGVjaWZpYyB0eXBlIG9mIGluZm8gZm9yIGEgSmF2YSBwcm9qZWN0LgogCSAqLwogCXByb3RlY3RlZCBKYXZhUHJvamVjdEVsZW1lbnRJbmZvIGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKQpAQCAtOTgxLDEwNyArMTEyOSwxMzMgQEAKIAl9CiAKIAkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCNnZXRPcHRpb24oU3RyaW5nLCBib29sZWFuKQorCSAqLwkKKwlwdWJsaWMgU3RyaW5nIGdldE9wdGlvbihTdHJpbmcgb3B0aW9uTmFtZSwgYm9vbGVhbiBpbmhlcml0SmF2YUNvcmVPcHRpb25zKSB7CisJCQorCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5PcHRpb25OYW1lcy5jb250YWlucyhvcHRpb25OYW1lKSl7CisJCQkKKwkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKKwkJCWlmIChwcmVmZXJlbmNlcyA9PSBudWxsIHx8IHByZWZlcmVuY2VzLmlzRGVmYXVsdChvcHRpb25OYW1lKSkgeworCQkJCXJldHVybiBpbmhlcml0SmF2YUNvcmVPcHRpb25zID8gSmF2YUNvcmUuZ2V0T3B0aW9uKG9wdGlvbk5hbWUpIDogbnVsbDsKKwkJCX0KKwkJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRTdHJpbmcob3B0aW9uTmFtZSkudHJpbSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCNnZXRPcHRpb25zKGJvb2xlYW4pCisJICovCisJcHVibGljIE1hcCBnZXRPcHRpb25zKGJvb2xlYW4gaW5oZXJpdEphdmFDb3JlT3B0aW9ucykgeworCQkKKwkJLy8gaW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdHMgZnJvbSBKYXZhQ29yZSBvcHRpb25zIHBvb2wKKwkJTWFwIG9wdGlvbnMgPSBpbmhlcml0SmF2YUNvcmVPcHRpb25zID8gSmF2YUNvcmUuZ2V0T3B0aW9ucygpIDogbmV3IEhhc2h0YWJsZSg1KTsKKworCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKCk7CisJCWlmIChwcmVmZXJlbmNlcyA9PSBudWxsKSByZXR1cm4gb3B0aW9uczsgLy8gY2Fubm90IGRvIGJldHRlciAobm9uLUphdmEgcHJvamVjdCkKKwkJSGFzaFNldCBvcHRpb25OYW1lcyA9IEphdmFNb2RlbE1hbmFnZXIuT3B0aW9uTmFtZXM7CisJCQorCQkvLyBnZXQgcHJlZmVyZW5jZXMgc2V0IHRvIHRoZWlyIGRlZmF1bHQKKwkJaWYgKGluaGVyaXRKYXZhQ29yZU9wdGlvbnMpeworCQkJU3RyaW5nW10gZGVmYXVsdFByb3BlcnR5TmFtZXMgPSBwcmVmZXJlbmNlcy5kZWZhdWx0UHJvcGVydHlOYW1lcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0UHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKyl7CisJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGRlZmF1bHRQcm9wZXJ0eU5hbWVzW2ldOworCQkJCWlmIChvcHRpb25OYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpKXsKKwkJCQkJb3B0aW9ucy5wdXQocHJvcGVydHlOYW1lLCBwcmVmZXJlbmNlcy5nZXREZWZhdWx0U3RyaW5nKHByb3BlcnR5TmFtZSkudHJpbSgpKTsKKwkJCQl9CisJCQl9CQkKKwkJfQorCQkvLyBnZXQgY3VzdG9tIHByZWZlcmVuY2VzIG5vdCBzZXQgdG8gdGhlaXIgZGVmYXVsdAorCQlTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzID0gcHJlZmVyZW5jZXMucHJvcGVydHlOYW1lcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspeworCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXNbaV07CisJCQlpZiAob3B0aW9uTmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKSl7CisJCQkJb3B0aW9ucy5wdXQocHJvcGVydHlOYW1lLCBwcmVmZXJlbmNlcy5nZXRTdHJpbmcocHJvcGVydHlOYW1lKS50cmltKCkpOworCQkJfQorCQl9CQkKKwkJcmV0dXJuIG9wdGlvbnM7CisJfQorCQorCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0CiAJICovCiAJcHVibGljIElQYXRoIGdldE91dHB1dExvY2F0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQlpZiAodGhpcy5pc09wZW4oKSkgewotCQkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBpbmZvID0gZ2V0SmF2YVByb2plY3RFbGVtZW50SW5mbygpOwotCQkJb3V0cHV0TG9jYXRpb24gPSBpbmZvLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKLQkJCX0KKwkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvQ2hlY2tFeGlzdGVuY2UoZlByb2plY3QpOworCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHBlclByb2plY3RJbmZvLm91dHB1dExvY2F0aW9uOworCQlpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgcmV0dXJuIG91dHB1dExvY2F0aW9uOworCisJCS8vIGZvcmNlIHRvIHJlYWQgY2xhc3NwYXRoIC0gd2lsbCBwb3NpdGlvbiBvdXRwdXQgbG9jYXRpb24gYXMgd2VsbAorCQl0aGlzLmdldFJhd0NsYXNzcGF0aCgpOworCQlvdXRwdXRMb2NhdGlvbiA9IHBlclByb2plY3RJbmZvLm91dHB1dExvY2F0aW9uOworCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewogCQkJcmV0dXJuIGRlZmF1bHRPdXRwdXRMb2NhdGlvbigpOwogCQl9Ci0JCS8vIGlmIG5vdCBhbHJlYWR5IG9wZW5lZCwgdGhlbiByZWFkIGZyb20gZmlsZSAoYXZvaWQgcG9wdWxhdGluZyB0aGUgbW9kZWwgZm9yIENQIHF1ZXN0aW9uKQotCQlpZiAoIXRoaXMuZ2V0UHJvamVjdCgpLmV4aXN0cygpKXsKLQkJCXRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKLQkJfQotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIHNoYXJlZENsYXNzcGF0aCA9IGxvYWRDbGFzc3BhdGgoKTsKLQkJCWlmIChzaGFyZWRDbGFzc3BhdGggIT0gbnVsbCkgewotCQkJCWNsYXNzcGF0aCA9IHJlYWRQYXRocyhzaGFyZWRDbGFzc3BhdGgpOwotCQkJfQotCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5WRVJCT1NFICYmIHRoaXMuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlVdGlsLmxvZyhlLCAKLQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyIvLmNsYXNzcGF0aCwgd2lsbCByZXZlcnQgdG8gZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJVXRpbC5sb2coZSwgCi0JCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvLyBleHRyYWN0IG91dCB0aGUgb3V0cHV0IGxvY2F0aW9uCi0JCWlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjbGFzc3BhdGgubGVuZ3RoID4gMCkgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKLQkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7Ci0JCQkJb3V0cHV0TG9jYXRpb24gPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdE91dHB1dExvY2F0aW9uKCk7CisJCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKIAl9CiAKIAkvKioKIAkgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aC4KIAkgKiBUaGlzIG1ldGhvZCBpcyBoYW5kbGUtb25seSBhbmQgdGhlIGVsZW1lbnQgbWF5IG9yIG1heSBub3QgZXhpc3QuIFJldHVybnMKIAkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gZ2VuZXJhdGUgYSBoYW5kbGUgZnJvbSB0aGUgcGF0aCAoZm9yIGV4YW1wbGUsCi0JICogYW4gYWJzb2x1dGUgcGF0aCB0aGF0IGhhcyBsZXNzIHRoYW4gMiBzZWdtZW50cy4gVGhlIHBhdGggbWF5IGJlIHJlbGF0aXZlIG9yCisJICogYW4gYWJzb2x1dGUgcGF0aCB0aGF0IGhhcyBsZXNzIHRoYW4gMSBzZWdtZW50LiBUaGUgcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IKIAkgKiBhYnNvbHV0ZS4KIAkgKi8KIAlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChJUGF0aCBwYXRoKSB7Ci0JCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KGdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHBhdGgsIGZhbHNlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQlTdHJpbmcgZXh0ID0gcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGV4dCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKS5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlc291cmNlIGphcgotCQkJCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKKwkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgeworCQkJcGF0aCA9IGdldFBhdGgoKS5hcHBlbmQocGF0aCk7CisJCX0KKwkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7CisJCXN3aXRjaCAoc2VnbWVudENvdW50KSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuIG51bGw7CisJCQljYXNlIDE6CiAJCQkJLy8gZGVmYXVsdCByb290CiAJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUmVzb3VyY2UpdGFyZ2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGV4dCA9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCWlmICgoKGphdmEuaW8uRmlsZSl0YXJnZXQpLmlzRmlsZSgpCi0JCQkJCSYmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGV4dCkgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8ICJ6aXAiLmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBleHRlcm5hbCBqYXIKLQkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKHBhdGgudG9PU1N0cmluZygpKTsKKwkJCWRlZmF1bHQ6CisJCQkJLy8gYSBwYXRoIGVuZGluZyB3aXRoIC5qYXIvLnppcCBpcyBzdGlsbCBhbWJpZ3VvdXMgYW5kIGNvdWxkIHN0aWxsIHJlc29sdmUgdG8gYSBzb3VyY2UvbGliIGZvbGRlciAKKwkJCQkvLyB0aHVzIHdpbGwgdHJ5IHRvIGd1ZXNzIGJhc2VkIG9uIGV4aXN0aW5nIHJlc291cmNlCisJCQkJaWYgKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKSkgeworCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7IAorCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUil7CisJCQkJCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKHBhdGgpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHVua25vd24gcGF0aAotCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIocGF0aCkpOwogCQkJCX0KLQkJCX0KIAkJfQogCX0KIAogCS8qKgorCSAqIFRoZSBwYXRoIGlzIGtub3duIHRvIG1hdGNoIGEgc291cmNlL2xpYnJhcnkgZm9sZGVyIGVudHJ5LgorCSAqLworCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRGb2xkZXJQYWNrYWdlRnJhZ21lbnRSb290KElQYXRoIHBhdGgpIHsKKwkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgeyAvLyBkZWZhdWx0IHByb2plY3Qgcm9vdAorCQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpKTsKKwkJfQorCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKSk7CisJfQorCQorCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0CiAJICovCiAJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlIHJlc291cmNlKSB7CiAKLQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUKLQkJCSYmIChVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLmphciIpIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBVdGlsLmVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKSkgeyAvLyROT04tTkxTLTEkIAotCQkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50Um9vdChyZXNvdXJjZSwgdGhpcyk7CisJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CisJCQljYXNlIElSZXNvdXJjZS5GSUxFOgorCQkJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHJlc291cmNlLmdldE5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIG5ldyBKYXJQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQljYXNlIElSZXNvdXJjZS5GT0xERVI6CisJCQkJcmV0dXJuIG5ldyBQYWNrYWdlRnJhZ21lbnRSb290KHJlc291cmNlLCB0aGlzLCByZXNvdXJjZS5nZXROYW1lKCkpOworCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVDoKKwkJCQlyZXR1cm4gbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UsIHRoaXMsICIiKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbnVsbDsKIAkJfQogCX0KIApAQCAtMTA5MCwxMyArMTI2NCwxMyBAQAogCSAqLwogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJQYXRoKSB7CiAKLQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKHRoaXMuY2Fub25pY2FsaXplZFBhdGgobmV3IFBhdGgoamFyUGF0aCkpLnRvU3RyaW5nKCkpOworCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdDAoSmF2YVByb2plY3QuY2Fub25pY2FsaXplZFBhdGgobmV3IFBhdGgoamFyUGF0aCkpKTsKIAl9CiAJCiAJLyoqCiAJICogbm8gcGF0aCBjYW5vbmljYWxpemF0aW9uCiAJICovCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKFN0cmluZyBqYXJQYXRoKSB7CisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QwKElQYXRoIGphclBhdGgpIHsKIAogCQlyZXR1cm4gbmV3IEphclBhY2thZ2VGcmFnbWVudFJvb3QoamFyUGF0aCwgdGhpcyk7CiAJfQpAQCAtMTEyMiwxOCArMTI5NiwxMSBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gZW50cnkuCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKiBAZGVwcmVjYXRlZAogCSAqLwogCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQkKLQkJdHJ5IHsKLQotCQkJSUNsYXNzcGF0aEVudHJ5W10gY29ycmVzcG9uZGluZ0VudHJpZXMgPSB0aGlzLmdldFJlc29sdmVkQ2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtlbnRyeX0sIHRydWUsIGZhbHNlKTsKLQkJCXJldHVybiBjb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMoY29ycmVzcG9uZGluZ0VudHJpZXMsIGZhbHNlKTsKLQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHt9OwotCQl9CisJCXJldHVybiBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMoZW50cnkpOwogCX0KIAogCS8qKgpAQCAtMTIwNCw1NCArMTM3MSw1NCBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHByb2plY3QgY3VzdG9tIHByZWZlcmVuY2UgcG9vbC4KKwkgKiBQcm9qZWN0IHByZWZlcmVuY2VzIG1heSBpbmNsdWRlIGN1c3RvbSBlbmNvZGluZy4KKwkgKi8JCisJcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCl7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCWlmICghSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgcmV0dXJuIG51bGw7CisJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mbyhwcm9qZWN0LCB0cnVlKTsKKwkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSAgcGVyUHJvamVjdEluZm8ucHJlZmVyZW5jZXM7CisJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSByZXR1cm4gcHJlZmVyZW5jZXM7CisJCXByZWZlcmVuY2VzID0gbG9hZFByZWZlcmVuY2VzKCk7CisJCWlmIChwcmVmZXJlbmNlcyA9PSBudWxsKSBwcmVmZXJlbmNlcyA9IG5ldyBQcmVmZXJlbmNlcygpOworCQlwZXJQcm9qZWN0SW5mby5wcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VzOworCQlyZXR1cm4gcHJlZmVyZW5jZXM7CisJfQorCisJLyoqCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KIAlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmF3Q2xhc3NwYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbnVsbDsKLQkJaWYgKHRoaXMuaXNPcGVuKCkpIHsKLQkJCUphdmFQcm9qZWN0RWxlbWVudEluZm8gaW5mbyA9IGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKTsKLQkJCWNsYXNzcGF0aCA9IGluZm8uZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2xhc3NwYXRoOwotCQkJfQotCQkJcmV0dXJuIGRlZmF1bHRDbGFzc3BhdGgoKTsKLQkJfQotCQkvLyBpZiBub3QgYWxyZWFkeSBvcGVuZWQsIHRoZW4gcmVhZCBmcm9tIGZpbGUgKGF2b2lkIHBvcHVsYXRpbmcgdGhlIG1vZGVsIGZvciBDUCBxdWVzdGlvbikKLQkJaWYgKCF0aGlzLmdldFByb2plY3QoKS5leGlzdHMoKSl7Ci0JCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzaGFyZWRDbGFzc3BhdGggPSBsb2FkQ2xhc3NwYXRoKCk7Ci0JCQlpZiAoc2hhcmVkQ2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCQljbGFzc3BhdGggPSByZWFkUGF0aHMoc2hhcmVkQ2xhc3NwYXRoKTsKLQkJCX0KLQkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuVkVSQk9TRSAmJiB0aGlzLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJVXRpbC5sb2coZSwgCi0JCQkJCSJFeGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyAiKyB0aGlzLmdldFBhdGgoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsiLy5jbGFzc3BhdGgsIHdpbGwgcmV2ZXJ0IHRvIGRlZmF1bHQgY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlZFUkJPU0UgJiYgdGhpcy5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpewotCQkJCVV0aWwubG9nKGUsIAotCQkJCQkiRXhjZXB0aW9uIHdoaWxlIHJldHJpZXZpbmcgIisgdGhpcy5nZXRQYXRoKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrIi8uY2xhc3NwYXRoLCB3aWxsIHJldmVydCB0byBkZWZhdWx0IGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KKwkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwZXJQcm9qZWN0SW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvQ2hlY2tFeGlzdGVuY2UoZlByb2plY3QpOworCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwZXJQcm9qZWN0SW5mby5jbGFzc3BhdGg7CisJCWlmIChjbGFzc3BhdGggIT0gbnVsbCkgcmV0dXJuIGNsYXNzcGF0aDsKKwkJY2xhc3NwYXRoID0gdGhpcy5yZWFkQ2xhc3NwYXRoRmlsZShmYWxzZS8qZG9uJ3QgY3JlYXRlIG1hcmtlcnMqLywgdHJ1ZS8qbG9nIHByb2JsZW1zKi8pOworCQkKIAkJLy8gZXh0cmFjdCBvdXQgdGhlIG91dHB1dCBsb2NhdGlvbgorCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7CiAJCWlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjbGFzc3BhdGgubGVuZ3RoID4gMCkgewogCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2NsYXNzcGF0aC5sZW5ndGggLSAxXTsKIAkJCWlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IENsYXNzcGF0aEVudHJ5LktfT1VUUFVUKSB7CisJCQkJb3V0cHV0TG9jYXRpb24gPSBlbnRyeS5nZXRQYXRoKCk7CiAJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29weSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoLmxlbmd0aCAtIDFdOwogCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBjb3B5LCAwLCBjb3B5Lmxlbmd0aCk7CiAJCQkJY2xhc3NwYXRoID0gY29weTsKIAkJCX0KIAkJfQotCQlpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBjbGFzc3BhdGg7CisJCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworCQkJcmV0dXJuIGRlZmF1bHRDbGFzc3BhdGgoKTsKIAkJfQotCQlyZXR1cm4gZGVmYXVsdENsYXNzcGF0aCgpOworCQkvKiBEaXNhYmxlIHZhbGlkYXRlOiBjbGFzc3BhdGggY2FuIGNvbnRhaW4gQ1AgdmFyaWFibGVzIGFuZCBjb250YWluZXIgdGhhdCBuZWVkIHRvIGJlIHJlc29sdmVkIAorCQlpZiAoY2xhc3NwYXRoICE9IElOVkFMSURfQ0xBU1NQQVRICisJCQkJJiYgIUphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aCh0aGlzLCBjbGFzc3BhdGgsIG91dHB1dExvY2F0aW9uKS5pc09LKCkpIHsKKwkJCWNsYXNzcGF0aCA9IElOVkFMSURfQ0xBU1NQQVRIOworCQl9CisJCSovCisJCXBlclByb2plY3RJbmZvLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKwkJcGVyUHJvamVjdEluZm8ub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsKKwkJcmV0dXJuIGNsYXNzcGF0aDsKIAl9CiAKIAkvKioKQEAgLTEyNjUsNDIgKzE0MzIsNTIgQEAKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSZXNvbHZlZENsYXNzcGF0aChib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRWYXJpYWJsZSkKKwlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoYm9vbGVhbiBpZ25vcmVVbnJlc29sdmVkRW50cnkpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCiAJCXJldHVybiAKIAkJCXRoaXMuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoCi0JCQkJaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlLCAKKwkJCQlpZ25vcmVVbnJlc29sdmVkRW50cnksIAogCQkJCWZhbHNlKTsgLy8gZ2VuZXJhdGVNYXJrZXJPbkVycm9yCiAJfQogCiAJLyoqCiAJICogSW50ZXJuYWwgdmFyaWFudCB3aGljaCBjYW4gY3JlYXRlIG1hcmtlciBvbiBwcm9qZWN0IGZvciBpbnZhbGlkIGVudHJpZXMKKwkgKiBhbmQgY2FjaGVzIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggb24gcGVyUHJvamVjdEluZm8KIAkgKi8KIAlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoCiAJCWJvb2xlYW4gaWdub3JlVW5yZXNvbHZlZEVudHJ5LAogCQlib29sZWFuIGdlbmVyYXRlTWFya2VyT25FcnJvcikKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKLQkJSmF2YVByb2plY3RFbGVtZW50SW5mbyBwcm9qZWN0SW5mbzsKLQkJaWYgKHRoaXMuaXNPcGVuKCkpewotCQkJcHJvamVjdEluZm8gPSBnZXRKYXZhUHJvamVjdEVsZW1lbnRJbmZvKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhdm9pZCBwb3B1bGF0aW5nIHRoZSBtb2RlbCBmb3Igb25seSByZXRyaWV2aW5nIHRoZSByZXNvbHZlZCBjbGFzc3BhdGggKDEzMzk1KQotCQkJcHJvamVjdEluZm8gPSBudWxsOwotCQl9CisJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQlKYXZhTW9kZWxNYW5hZ2VyLlBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvID0gbWFuYWdlci5nZXRQZXJQcm9qZWN0SW5mb0NoZWNrRXhpc3RlbmNlKGZQcm9qZWN0KTsKIAkJCiAJCS8vIHJldXNlIGNhY2hlIGlmIG5vdCBuZWVkaW5nIHRvIHJlZnJlc2ggbWFya2VycyBvciBjaGVja2luZyBib3VuZCB2YXJpYWJsZXMKLQkJaWYgKGlnbm9yZVVucmVzb2x2ZWRFbnRyeSAmJiAhZ2VuZXJhdGVNYXJrZXJPbkVycm9yICYmIHByb2plY3RJbmZvICE9IG51bGwpeworCQlpZiAoaWdub3JlVW5yZXNvbHZlZEVudHJ5ICYmICFnZW5lcmF0ZU1hcmtlck9uRXJyb3IgJiYgcGVyUHJvamVjdEluZm8gIT0gbnVsbCl7CiAJCQkvLyByZXNvbHZlZCBwYXRoIGlzIGNhY2hlZCBvbiBpdHMgaW5mbwotCQkJSUNsYXNzcGF0aEVudHJ5W10gaW5mb1BhdGggPSBwcm9qZWN0SW5mby5sYXN0UmVzb2x2ZWRDbGFzc3BhdGg7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBpbmZvUGF0aCA9IHBlclByb2plY3RJbmZvLmxhc3RSZXNvbHZlZENsYXNzcGF0aDsKIAkJCWlmIChpbmZvUGF0aCAhPSBudWxsKSByZXR1cm4gaW5mb1BhdGg7CiAJCX0KKwkJTWFwIHJldmVyc2VNYXAgPSBwZXJQcm9qZWN0SW5mbyA9PSBudWxsID8gbnVsbCA6IG5ldyBIYXNoTWFwKDUpOworCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZFBhdGggPSBnZXRSZXNvbHZlZENsYXNzcGF0aCgKKwkJCWdldFJhd0NsYXNzcGF0aCgpLCAKKwkJCWdlbmVyYXRlTWFya2VyT25FcnJvciA/IGdldE91dHB1dExvY2F0aW9uKCkgOiBudWxsLCAKKwkJCWlnbm9yZVVucmVzb2x2ZWRFbnRyeSwgCisJCQlnZW5lcmF0ZU1hcmtlck9uRXJyb3IsCisJCQlyZXZlcnNlTWFwKTsKIAotCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZFBhdGggPSBnZXRSZXNvbHZlZENsYXNzcGF0aChnZXRSYXdDbGFzc3BhdGgoKSwgaWdub3JlVW5yZXNvbHZlZEVudHJ5LCBnZW5lcmF0ZU1hcmtlck9uRXJyb3IpOworCQlpZiAocGVyUHJvamVjdEluZm8gIT0gbnVsbCl7CisJCQlpZiAocGVyUHJvamVjdEluZm8uY2xhc3NwYXRoID09IG51bGwgLy8gLmNsYXNzcGF0aCBmaWxlIGNvdWxkIG5vdCBiZSByZWFkCisJCQkJJiYgZ2VuZXJhdGVNYXJrZXJPbkVycm9yIAorCQkJCSYmIEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUoZlByb2plY3QpKSB7CisJCQkJCXRoaXMuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKKwkJCQkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdFJlYWRDbGFzc3BhdGhGaWxlIiwgdGhpcy5nZXRFbGVtZW50TmFtZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQkJfQogCi0JCWlmIChwcm9qZWN0SW5mbyAhPSBudWxsKXsKLQkJCXByb2plY3RJbmZvLmxhc3RSZXNvbHZlZENsYXNzcGF0aCA9IHJlc29sdmVkUGF0aDsKKwkJCXBlclByb2plY3RJbmZvLmxhc3RSZXNvbHZlZENsYXNzcGF0aCA9IHJlc29sdmVkUGF0aDsKKwkJCXBlclByb2plY3RJbmZvLnJlc29sdmVkUGF0aFRvUmF3RW50cmllcyA9IHJldmVyc2VNYXA7CiAJCX0KIAkJcmV0dXJuIHJlc29sdmVkUGF0aDsKIAl9CkBAIC0xMzEwLDMyICsxNDg3LDMwIEBACiAJICovCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFJlc29sdmVkQ2xhc3NwYXRoKAogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzLAotCQlib29sZWFuIGlnbm9yZVVucmVzb2x2ZWRFbnRyeSwKLQkJYm9vbGVhbiBnZW5lcmF0ZU1hcmtlck9uRXJyb3IpCisJCUlQYXRoIHByb2plY3RPdXRwdXRMb2NhdGlvbiwgLy8gb25seSBzZXQgaWYgbmVlZGluZyBmdWxsIGNsYXNzcGF0aCB2YWxpZGF0aW9uIChhbmQgbWFya2VycykKKwkJYm9vbGVhbiBpZ25vcmVVbnJlc29sdmVkRW50cnksIC8vIGlmIHVucmVzb2x2ZWQgZW50cmllcyBhcmUgbWV0LCBzaG91bGQgaXQgdHJpZ2dlciBpbml0aWFsaXphdGlvbnMKKwkJYm9vbGVhbiBnZW5lcmF0ZU1hcmtlck9uRXJyb3IsCisJCU1hcCByZXZlcnNlTWFwKSAvLyBjYW4gYmUgbnVsbCBpZiBub3QgaW50ZXJlc3RlZCBpbiByZXZlcnNlIG1hcHBpbmcKIAkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXM7CiAJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IpewogCQkJZmx1c2hDbGFzc3BhdGhQcm9ibGVtTWFya2VycyhmYWxzZSwgZmFsc2UpOwogCQl9CiAKIAkJaW50IGxlbmd0aCA9IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOwotCQlpbnQgaW5kZXggPSAwOwogCQlBcnJheUxpc3QgcmVzb2x2ZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwogCQkKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCiAJCQlJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSBjbGFzc3BhdGhFbnRyaWVzW2ldOwotCisJCQlJUGF0aCByZXNvbHZlZFBhdGg7CisJCQlzdGF0dXMgPSBudWxsOworCQkJCiAJCQkvKiB2YWxpZGF0aW9uIGlmIG5lZWRlZCAqLwotCQkJaWYgKGdlbmVyYXRlTWFya2VyT25FcnJvcikgewotCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0KLQkJCQkJSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkodGhpcywgcmF3RW50cnksIGZhbHNlKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCWNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCi0JCQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpLCAKLQkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IsCi0JCQkJCQlmYWxzZSwKLQkJCQkJCWZhbHNlKTsKKwkJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IgfHwgIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSkgeworCQkJCXN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHRoaXMsIHJhd0VudHJ5LCBmYWxzZSk7CisJCQkJaWYgKGdlbmVyYXRlTWFya2VyT25FcnJvciAmJiAhc3RhdHVzLmlzT0soKSkgY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihzdGF0dXMpOwogCQkJfQogCiAJCQlzd2l0Y2ggKHJhd0VudHJ5LmdldEVudHJ5S2luZCgpKXsKQEAgLTEzNDQsMTMgKzE1MTksOSBAQAogCQkJCQogCQkJCQlJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkocmF3RW50cnkpOwogCQkJCQlpZiAocmVzb2x2ZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSkgewotCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oCi0JCQkJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX1ZBUklBQkxFX1BBVEhfVU5CT1VORCwKLQkJCQkJCQkJCXJhd0VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCQkJCQl9CisJCQkJCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSkgdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihzdGF0dXMpOwogCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHJldmVyc2VNYXAgIT0gbnVsbCAmJiByZXZlcnNlTWFwLmdldChyZXNvbHZlZFBhdGggPSByZXNvbHZlZEVudHJ5LmdldFBhdGgoKSkgPT0gbnVsbCkgcmV2ZXJzZU1hcC5wdXQocmVzb2x2ZWRQYXRoICwgcmF3RW50cnkpOwogCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyZXNvbHZlZEVudHJ5KTsKIAkJCQkJfQogCQkJCQlicmVhazsgCkBAIC0xMzU5LDEzICsxNTMwLDcgQEAKIAkJCQkKIAkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIocmF3RW50cnkuZ2V0UGF0aCgpLCB0aGlzKTsKIAkJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKLQkJCQkJCS8vIHVuYm91bmQgY29udGFpbmVyCi0JCQkJCQlpZiAoIWlnbm9yZVVucmVzb2x2ZWRFbnRyeSkgewotCQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oCi0JCQkJCQkJCW5ldyBKYXZhTW9kZWxTdGF0dXMoCi0JCQkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNQX0NPTlRBSU5FUl9QQVRIX1VOQk9VTkQsCi0JCQkJCQkJCQlyYXdFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpOwotCQkJCQkJfQorCQkJCQkJaWYgKCFpZ25vcmVVbnJlc29sdmVkRW50cnkpIHRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oc3RhdHVzKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAKQEAgLTEzNzQsMjQgKzE1MzksMjggQEAKIAogCQkJCQkvLyBjb250YWluZXIgd2FzIGJvdW5kCiAJCQkJCWZvciAoaW50IGogPSAwLCBjb250YWluZXJMZW5ndGggPSBjb250YWluZXJFbnRyaWVzLmxlbmd0aDsgaiA8IGNvbnRhaW5lckxlbmd0aDsgaisrKXsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeSBjb250YWluZXJSYXdFbnRyeSA9IGNvbnRhaW5lckVudHJpZXNbal07CisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgY0VudHJ5ID0gY29udGFpbmVyRW50cmllc1tqXTsKIAkJCQkJCQogCQkJCQkJaWYgKGdlbmVyYXRlTWFya2VyT25FcnJvcikgewotCQkJCQkJCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0KLQkJCQkJCQkJSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoRW50cnkodGhpcywgY29udGFpbmVyUmF3RW50cnksIGZhbHNlKTsKLQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQkJCWNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoCi0JCQkJCQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpLCAKLQkJCQkJCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IsCi0JCQkJCQkJCQlmYWxzZSwKLQkJCQkJCQkJCWZhbHNlKTsKKwkJCQkJCQlJSmF2YU1vZGVsU3RhdHVzIGNvbnRhaW5lclN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHRoaXMsIGNFbnRyeSwgZmFsc2UpOworCQkJCQkJCWlmICghY29udGFpbmVyU3RhdHVzLmlzT0soKSkgY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihjb250YWluZXJTdGF0dXMpOwogCQkJCQkJfQotCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChjb250YWluZXJSYXdFbnRyeSk7CisJCQkJCQkvLyBpZiBjb250YWluZXIgaXMgZXhwb3J0ZWQsIHRoZW4gaXRzIG5lc3RlZCBlbnRyaWVzIG11c3QgaW4gdHVybiBiZSBleHBvcnRlZCAgKDIxNzQ5KQorCQkJCQkJaWYgKHJhd0VudHJ5LmlzRXhwb3J0ZWQoKSl7CisJCQkJCQkJY0VudHJ5ID0gbmV3IENsYXNzcGF0aEVudHJ5KGNFbnRyeS5nZXRDb250ZW50S2luZCgpLAorCQkJCQkJCQljRW50cnkuZ2V0RW50cnlLaW5kKCksIGNFbnRyeS5nZXRQYXRoKCksCisJCQkJCQkJCWNFbnRyeS5nZXRFeGNsdXNpb25QYXR0ZXJucygpLCBjRW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwKKwkJCQkJCQkJY0VudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLCBjRW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSwgCisJCQkJCQkJCXRydWUpOyAvLyBkdXBsaWNhdGUgY29udGFpbmVyIGVudHJ5IGZvciB0YWdnaW5nIGl0IGFzIGV4cG9ydGVkCisJCQkJCQl9CisJCQkJCQlpZiAocmV2ZXJzZU1hcCAhPSBudWxsICYmIHJldmVyc2VNYXAuZ2V0KHJlc29sdmVkUGF0aCA9IGNFbnRyeS5nZXRQYXRoKCkpID09IG51bGwpIHJldmVyc2VNYXAucHV0KHJlc29sdmVkUGF0aCwgcmF3RW50cnkpOworCQkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChjRW50cnkpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCQkJCQkJCQogCQkJCWRlZmF1bHQgOgogCisJCQkJCWlmIChyZXZlcnNlTWFwICE9IG51bGwgJiYgcmV2ZXJzZU1hcC5nZXQocmVzb2x2ZWRQYXRoID0gcmF3RW50cnkuZ2V0UGF0aCgpKSA9PSBudWxsKSByZXZlcnNlTWFwLnB1dChyZXNvbHZlZFBhdGgsIHJhd0VudHJ5KTsKIAkJCQkJcmVzb2x2ZWRFbnRyaWVzLmFkZChyYXdFbnRyeSk7CiAJCQkJCiAJCQl9CQkJCQkKQEAgLTE0MDAsNiArMTU2OSwxMCBAQAogCQlJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZFBhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jlc29sdmVkRW50cmllcy5zaXplKCldOwogCQlyZXNvbHZlZEVudHJpZXMudG9BcnJheShyZXNvbHZlZFBhdGgpOwogCisJCWlmIChnZW5lcmF0ZU1hcmtlck9uRXJyb3IgJiYgcHJvamVjdE91dHB1dExvY2F0aW9uICE9IG51bGwpIHsKKwkJCXN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aCh0aGlzLCByZXNvbHZlZFBhdGgsIHByb2plY3RPdXRwdXRMb2NhdGlvbik7CisJCQlpZiAoIXN0YXR1cy5pc09LKCkpIGNyZWF0ZUNsYXNzcGF0aFByb2JsZW1NYXJrZXIoc3RhdHVzKTsKKwkJfQogCQlyZXR1cm4gcmVzb2x2ZWRQYXRoOwogCX0KIApAQCAtMTQyOSwxMyArMTYwMiwxMiBAQAogCSAqIHdoaWNoIGZvcm0gb2Ygc3RvcmFnZSB0byB1c2UgYXBwcm9wcmlhdGVseS4gU2hhcmVkIHByb3BlcnRpZXMgcHJvZHVjZSByZWFsIHJlc291cmNlIGZpbGVzIHdoaWNoCiAJICogY2FuIGJlIHNoYXJlZCB0aHJvdWdoIGEgVkNNIG9udG8gYSBzZXJ2ZXIuIFBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgbm90IHNoYXJlYWJsZS4KIAkgKgotCSAqIEBzZWUgSmF2YVByb2plY3Qjc2V0U2hhcmVkUHJvcGVydHkoUXVhbGlmaWVkTmFtZSwgU3RyaW5nKQorCSAqIEBzZWUgSmF2YVByb2plY3Qjc2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nLCBTdHJpbmcpCiAJICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFyZWRQcm9wZXJ0eShRdWFsaWZpZWROYW1lIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCiAJCVN0cmluZyBwcm9wZXJ0eSA9IG51bGw7Ci0JCVN0cmluZyBwcm9wZXJ0eUZpbGVOYW1lID0gY29tcHV0ZVNoYXJlZFByb3BlcnR5RmlsZU5hbWUoa2V5KTsKLQkJSUZpbGUgcnNjRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHByb3BlcnR5RmlsZU5hbWUpOworCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoa2V5KTsKIAkJaWYgKHJzY0ZpbGUuZXhpc3RzKCkpIHsKIAkJCXByb3BlcnR5ID0gbmV3IFN0cmluZyhVdGlsLmdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShyc2NGaWxlKSk7CiAJCX0KQEAgLTE0NTQsNyArMTYyNiw3IEBACiAJICogQHNlZSBJSmF2YUVsZW1lbnQKIAkgKi8KIAlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCisJCWlmICghZXhpc3RzKCkpIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKIAkJcmV0dXJuIGdldFByb2plY3QoKTsKIAl9CiAKQEAgLTE0NjksMzcgKzE2NDEsNTcgQEAKIAkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NsYXNzcGF0aEN5Y2xlKElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJCi0JCUhhc2hTZXQgY3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgSGFzaFNldCgpOwotCQl1cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhlbnRyaWVzLCBuZXcgQXJyYXlMaXN0KCksIGN5Y2xlUGFydGljaXBhbnRzLCBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlyZXR1cm4gIWN5Y2xlUGFydGljaXBhbnRzLmlzRW1wdHkoKTsKKwlwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhDeWNsZShJQ2xhc3NwYXRoRW50cnlbXSBwcmVmZXJyZWRDbGFzc3BhdGgpIHsKKwkJSGFzaFNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKKwkJdmlzaXRlZC5hZGQoZ2V0RWxlbWVudE5hbWUoKSk7CisJCXJldHVybiBoYXNDbGFzc3BhdGhDeWNsZShwcmVmZXJyZWRDbGFzc3BhdGgsIHZpc2l0ZWQsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwogCX0KIAkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDeWNsZU1hcmtlcigpewotCQorCXByaXZhdGUgYm9vbGVhbiBoYXNDbGFzc3BhdGhDeWNsZShJQ2xhc3NwYXRoRW50cnlbXSBwcmVmZXJyZWRDbGFzc3BhdGgsIEhhc2hTZXQgdmlzaXRlZCwgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCkgewogCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcm9qZWN0LmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX09ORSk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJCQlTdHJpbmcgY3ljbGVBdHRyID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuQ1lDTEVfREVURUNURUQpOwotCQkJCQlpZiAoY3ljbGVBdHRyICE9IG51bGwgJiYgY3ljbGVBdHRyLmVxdWFscygidHJ1ZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIHRydWU7CisJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcmVmZXJyZWRDbGFzc3BhdGggPT0gbnVsbCA/IGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpIDogcHJlZmVycmVkQ2xhc3NwYXRoOworCQorCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeTsKKwkJCQlpZiAoKGVudHJ5ID0gY2xhc3NwYXRoW2ldKS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpeworCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJCUlSZXNvdXJjZSBtZW1iZXIgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZW50cnlQYXRoKTsKKwkJCQkJaWYgKG1lbWJlciAhPSBudWxsICYmIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpeworCQkJCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZW50cnlQYXRoLmxhc3RTZWdtZW50KCk7CisJCQkJCQlpZiAoIXZpc2l0ZWQuYWRkKHByb2plY3ROYW1lKSkgcmV0dXJuIHRydWU7CisJCQkJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KUphdmFDb3JlLmNyZWF0ZSgoSVByb2plY3QpbWVtYmVyKTsKKwkJCQkJCWlmIChwcm9qZWN0Lmhhc0NsYXNzcGF0aEN5Y2xlKG51bGwsIHZpc2l0ZWQsIHdvcmtzcGFjZVJvb3QpKSByZXR1cm4gdHJ1ZTsKKwkJCQkJCXZpc2l0ZWQucmVtb3ZlKHByb2plY3ROYW1lKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpewogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzQ3ljbGVNYXJrZXIoKXsKKwkJcmV0dXJuIHRoaXMuZ2V0Q3ljbGVNYXJrZXIoKSAhPSBudWxsOworCX0KIAogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiBmUHJvamVjdC5oYXNoQ29kZSgpOwogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyBhY2Nlc3NpYmxlIGFuZCBpdCBoYXMKKwkgKiBhIGphdmEgbmF0dXJlLCBvdGhlcndpc2UgZmFsc2UuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0phdmFOYXR1cmUoSVByb2plY3QgcHJvamVjdCkgeyAKKwkJdHJ5IHsKKwkJCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9wZW4KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgogCSAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgcHJvamVjdCBwb3RlbnRpYWxseSBjb250YWlucyBhbnkgc291cmNlLiBBIHByb2plY3Qgd2hpY2ggaGFzIG5vIHNvdXJjZSBpcyBpbW11dGFibGUuCiAJICovCiAJcHVibGljIGJvb2xlYW4gaGFzU291cmNlKCkgewpAQCAtMTUzOSw0NCArMTczMSwxMDAgQEAKIAkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9CiAJCQkJLy8gY29tcGFyZSBiaW5hcnkgb3V0cHV0cwotCQkJCWlmIChvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXRbbGVuZ3RoIC0gMV0uZ2V0Q29udGVudEtpbmQoKQotCQkJCQk9PSBDbGFzc3BhdGhFbnRyeS5LX09VVFBVVAotCQkJCQkmJiBvdGhlckNsYXNzcGF0aFdpdGhPdXRwdXRbbGVuZ3RoIC0gMV0uZ2V0UGF0aCgpLmVxdWFscyhuZXdPdXRwdXRMb2NhdGlvbikpCisJCQkJSUNsYXNzcGF0aEVudHJ5IG91dHB1dCA9IG90aGVyQ2xhc3NwYXRoV2l0aE91dHB1dFtsZW5ndGggLSAxXTsKKwkJCQlpZiAob3V0cHV0LmdldENvbnRlbnRLaW5kKCkgPT0gQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQKKwkJCQkJCSYmIG91dHB1dC5nZXRQYXRoKCkuZXF1YWxzKG5ld091dHB1dExvY2F0aW9uKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KIAkKKworCQogCS8qCiAJICogQHNlZSBJSmF2YVByb2plY3QKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcm9vdFBhdGg7Ci0JCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJcm9vdFBhdGggPSAoKElKYXZhUHJvamVjdCllbGVtZW50KS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJfSBlbHNlIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCXB1YmxpYyBib29sZWFuIGlzT25DbGFzc3BhdGgoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkJSVBhdGggcGF0aCA9IGVsZW1lbnQuZ2V0UGF0aCgpOworCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UOgorCQkJCWlmICghKChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50KS5pc0FyY2hpdmUoKSkgeworCQkJCQkvLyBlbnN1cmUgdGhhdCBmb2xkZXJzIGFyZSBvbmx5IGV4Y2x1ZGVkIGlmIGFsbCBvZiB0aGVpciBjaGlsZHJlbiBhcmUgZXhjbHVkZWQKKwkJCQkJcGF0aCA9IHBhdGguYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgorCQkJCWlmICghKChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50LmdldFBhcmVudCgpKS5pc0FyY2hpdmUoKSkgeworCQkJCQkvLyBlbnN1cmUgdGhhdCBmb2xkZXJzIGFyZSBvbmx5IGV4Y2x1ZGVkIGlmIGFsbCBvZiB0aGVpciBjaGlsZHJlbiBhcmUgZXhjbHVkZWQKKwkJCQkJcGF0aCA9IHBhdGguYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnJlYWs7CiAJCX0KLQkJcmV0dXJuIHRoaXMuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QwKHJvb3RQYXRoKSAhPSBudWxsOworCQlyZXR1cm4gdGhpcy5pc09uQ2xhc3NwYXRoKHBhdGgpOwogCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGNsYXNzcGF0aCBmcm9tIGEgc2hhcmVhYmxlIGZvcm1hdCAoVkNNLXdpc2UpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2FkQ2xhc3NwYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KKwlwcml2YXRlIGJvb2xlYW4gaXNPbkNsYXNzcGF0aChJUGF0aCBwYXRoKSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aDsKIAkJdHJ5IHsKLQkJCXJldHVybiBnZXRTaGFyZWRQcm9wZXJ0eShnZXRDbGFzc3BhdGhQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCWNsYXNzcGF0aCA9IHRoaXMuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZS8qaWdub3JlIHVucmVzb2x2ZWQgdmFyaWFibGUqLyk7CisJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCQkJcmV0dXJuIGZhbHNlOyAvLyBub3QgYSBKYXZhIHByb2plY3QKIAkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOworCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpIAorCQkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKHBhdGgsICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qCisJICogQHNlZSBJSmF2YVByb2plY3QKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09uQ2xhc3NwYXRoKElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJCisJCS8vIGVuc3VyZSB0aGF0IGZvbGRlcnMgYXJlIG9ubHkgZXhjbHVkZWQgaWYgYWxsIG9mIHRoZWlyIGNoaWxkcmVuIGFyZSBleGNsdWRlZAorCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKKwkJCXBhdGggPSBwYXRoLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJCisJCXJldHVybiB0aGlzLmlzT25DbGFzc3BhdGgocGF0aCk7CiAJfQogCisKKwkvKgorCSAqIGxvYWQgcHJlZmVyZW5jZXMgZnJvbSBhIHNoYXJlYWJsZSBmb3JtYXQgKFZDTS13aXNlKQorCSAqLworCSBwdWJsaWMgUHJlZmVyZW5jZXMgbG9hZFByZWZlcmVuY2VzKCkgeworCSAJCisJIAlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG5ldyBQcmVmZXJlbmNlcygpOworCSAJCisvLwkJRmlsZSBwcmVmRmlsZSA9IGdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChQUkVGX0ZJTEVOQU1FKS50b0ZpbGUoKTsKKwkJSVBhdGggcHJvamVjdE1ldGFMb2NhdGlvbiA9IGdldFByb2plY3QoKS5nZXRQbHVnaW5Xb3JraW5nTG9jYXRpb24oSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpKTsKKwkJaWYgKHByb2plY3RNZXRhTG9jYXRpb24gIT0gbnVsbCkgeworCQkJRmlsZSBwcmVmRmlsZSA9IHByb2plY3RNZXRhTG9jYXRpb24uYXBwZW5kKFBSRUZfRklMRU5BTUUpLnRvRmlsZSgpOworCQkJaWYgKHByZWZGaWxlLmV4aXN0cygpKSB7IC8vIGxvYWQgcHJlZmVyZW5jZXMgZnJvbSBmaWxlCisJCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQkJCXRyeSB7CisJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShwcmVmRmlsZSkpOworCQkJCQlwcmVmZXJlbmNlcy5sb2FkKGluKTsKKwkJCQkJcmV0dXJuIHByZWZlcmVuY2VzOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgLy8gcHJvYmxlbXMgbG9hZGluZyBwcmVmZXJlbmNlIHN0b3JlIC0gcXVpZXRseSBpZ25vcmUKKwkJCQl9IGZpbmFsbHkgeworCQkJCQlpZiAoaW4gIT0gbnVsbCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpbi5jbG9zZSgpOworCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyBpZ25vcmUgcHJvYmxlbXMgd2l0aCBjbG9zZQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCSB9CisJIAogCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0I25ld0V2YWx1YXRpb25Db250ZXh0CiAJICovCkBAIC0xNjQwLDcgKzE4ODgsNyBAQAogCQkJCiAJCUFycmF5TGlzdCBwcmVyZXF1aXNpdGVzID0gbmV3IEFycmF5TGlzdCgpOwogCQkvLyBuZWVkIHJlc29sdXRpb24KLQkJZW50cmllcyA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKGVudHJpZXMsIHRydWUsIGZhbHNlKTsKKwkJZW50cmllcyA9IGdldFJlc29sdmVkQ2xhc3NwYXRoKGVudHJpZXMsIG51bGwsIHRydWUsIGZhbHNlLCBudWxsLypubyByZXZlcnNlIG1hcCovKTsKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CiAJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7CkBAIC0xNjU3LDEzMSArMTkwNSwzMiBAQAogCQl9CiAJfQogCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPnMgZnJvbSB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGggc3RyaW5nIGluIFhNTCBmb3JtYXQuCi0JICoKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHJlYWQgCi0JICovCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeVtdIHJlYWRQYXRocyhTdHJpbmcgeG1sQ2xhc3NwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCi0JCUlQYXRoIHByb2plY3RQYXRoID0gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHhtbENsYXNzcGF0aCk7Ci0JCUVsZW1lbnQgY3BFbGVtZW50OworCS8qKgorCSAqIFJlYWRzIHRoZSAuY2xhc3NwYXRoIGZpbGUgZnJvbSBkaXNrIGFuZCByZXR1cm5zIHRoZSBsaXN0IG9mIGVudHJpZXMgaXQgY29udGFpbnMgKGluY2x1ZGluZyBvdXRwdXQgbG9jYXRpb24gZW50cnkpCisJICogUmV0dXJucyBudWxsIGlmIC5jbGFzc2ZpbGUgaXMgbm90IHByZXNlbnQuCisJICogUmV0dXJucyBJTlZBTElEX0NMQVNTUEFUSCBpZiBpdCBoYXMgYSBmb3JtYXQgcHJvYmxlbS4KKwkgKi8KKwlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gcmVhZENsYXNzcGF0aEZpbGUoYm9vbGVhbiBjcmVhdGVNYXJrZXIsIGJvb2xlYW4gbG9nUHJvYmxlbXMpIHsKIAogCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9Ci0JCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJY3BFbGVtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oVXRpbC5iaW5kKCJmaWxlLmJhZEZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCX0KLQotCQlpZiAoIWNwRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihVdGlsLmJpbmQoImZpbGUuYmFkRm9ybWF0IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTm9kZUxpc3QgbGlzdCA9IGNwRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCUFycmF5TGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmICh0eXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBjcGVFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0KLQkJCQlpZiAoY3BlRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzcGF0aGVudHJ5IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgY3BlRWxlbWVudEtpbmQgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgia2luZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBwYXRoU3RyID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBlbnN1cmUgcGF0aCBpcyBhYnNvbHV0ZQotCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7Ci0JCQkJCWludCBraW5kID0ga2luZEZyb21TdHJpbmcoY3BlRWxlbWVudEtpbmQpOwotCQkJCQlpZiAoa2luZCAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICYmIGtpbmQgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYgIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQlwYXRoID0gcHJvamVjdFBhdGguYXBwZW5kKHBhdGgpOwotCQkJCQl9Ci0JCQkJCS8vIHNvdXJjZSBhdHRhY2htZW50IGluZm8gKG9wdGlvbmFsKQotCQkJCQlTdHJpbmcgc291cmNlQXR0YWNobWVudFBhdGhTdHIgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgic291cmNlcGF0aCIpOwkvLyROT04tTkxTLTEkCi0JCQkJCUlQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoID0KLQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRQYXRoU3RyLmVxdWFscygiIikgPyBudWxsIDogbmV3IFBhdGgoc291cmNlQXR0YWNobWVudFBhdGhTdHIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGhTdHIgPSBjcGVFbGVtZW50LmdldEF0dHJpYnV0ZSgicm9vdHBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPQotCQkJCQkJc291cmNlQXR0YWNobWVudFJvb3RQYXRoU3RyLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCT8gbnVsbAotCQkJCQkJCTogbmV3IFBhdGgoc291cmNlQXR0YWNobWVudFJvb3RQYXRoU3RyKTsKLQkJCQkJCi0JCQkJCS8vIGV4cG9ydGVkIGZsYWcKLQkJCQkJYm9vbGVhbiBpc0V4cG9ydGVkID0gY3BlRWxlbWVudC5nZXRBdHRyaWJ1dGUoImV4cG9ydGVkIikuZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCS8vIHJlY3JlYXRlIHRoZSBDUCBlbnRyeQotCQkJCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQotCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOwotCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJCQotCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHJldHVybiBudWxsOwotCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoCi0JCQkJCQkJCQkJCQkJCQlwYXRoLAotCQkJCQkJCQkJCQkJCQkJc291cmNlQXR0YWNobWVudFBhdGgsCi0JCQkJCQkJCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsCi0JCQkJCQkJCQkJCQkJCQlpc0V4cG9ydGVkKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSByZXR1cm4gbnVsbDsKLQkJCQkJCQkvLyBtdXN0IGJlIGFuIGVudHJ5IGluIHRoaXMgcHJvamVjdCBvciBzcGVjaWZ5IGFub3RoZXIgcHJvamVjdAotCQkJCQkJCVN0cmluZyBwcm9qU2VnbWVudCA9IHBhdGguc2VnbWVudCgwKTsKLQkJCQkJCQlpZiAocHJvalNlZ21lbnQgIT0gbnVsbCAmJiBwcm9qU2VnbWVudC5lcXVhbHMoZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJLy8gdGhpcyBwcm9qZWN0Ci0JCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwYXRoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0Ci0JCQkJCQkJCXBhdGhzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCkpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQotCQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQkJCQlwYXRocy5hZGQoSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeSgKLQkJCQkJCQkJCXBhdGgsCi0JCQkJCQkJCQlzb3VyY2VBdHRhY2htZW50UGF0aCwKLQkJCQkJCQkJCXNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgCi0JCQkJCQkJCQlpc0V4cG9ydGVkKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCi0JCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKLQkJCQkJCQlwYXRocy5hZGQoSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoCi0JCQkJCQkJCQlwYXRoLAotCQkJCQkJCQkJaXNFeHBvcnRlZCkpOwotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIENsYXNzcGF0aEVudHJ5LktfT1VUUFVUIDoKLQkJCQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSByZXR1cm4gbnVsbDsKLQkJCQkJCQlwYXRocy5hZGQobmV3IENsYXNzcGF0aEVudHJ5KAotCQkJCQkJCQkJQ2xhc3NwYXRoRW50cnkuS19PVVRQVVQsCi0JCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlksCi0JCQkJCQkJCQlwYXRoLAotCQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQlmYWxzZSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQorCQkJU3RyaW5nIHhtbENsYXNzcGF0aCA9IGdldFNoYXJlZFByb3BlcnR5KENMQVNTUEFUSF9GSUxFTkFNRSk7CisJCQlpZiAoeG1sQ2xhc3NwYXRoID09IG51bGwpIHJldHVybiBudWxsOworCQkJcmV0dXJuIGRlY29kZUNsYXNzcGF0aCh4bWxDbGFzc3BhdGgsIGNyZWF0ZU1hcmtlciwgbG9nUHJvYmxlbXMpOworCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQkJLy8gZmlsZSBkb2VzIG5vdCBleGlzdCAob3Igbm90IGFjY2Vzc2libGUpCisJCQlpZiAoY3JlYXRlTWFya2VyICYmIHRoaXMuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7CisJCQkJCXRoaXMuY3JlYXRlQ2xhc3NwYXRoUHJvYmxlbU1hcmtlcihuZXcgSmF2YU1vZGVsU3RhdHVzKAorCQkJCQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0NMQVNTUEFUSF9GSUxFX0ZPUk1BVCwKKwkJCQkJCVV0aWwuYmluZCgiY2xhc3NwYXRoLmNhbm5vdFJlYWRDbGFzc3BhdGhGaWxlIiwgdGhpcy5nZXRFbGVtZW50TmFtZSgpKSkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAobG9nUHJvYmxlbXMpIHsKKwkJCQlVdGlsLmxvZyhlLCAKKwkJCQkJIkV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nICIrIHRoaXMuZ2V0UGF0aCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyIvLmNsYXNzcGF0aCwgd2lsbCByZXZlcnQgdG8gZGVmYXVsdCBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9Ci0JCWlmIChwYXRocy5zaXplKCkgPiAwKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBpcHMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3BhdGhzLnNpemUoKV07Ci0JCQlwYXRocy50b0FycmF5KGlwcyk7Ci0JCQlyZXR1cm4gaXBzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCkBAIC0xODAzLDYgKzE5NTIsNyBAQAogCQl9CiAJfQogCisKIAkvKioKIAkgKiBAc2VlIEphdmFFbGVtZW50I3Jvb3RlZEF0KElKYXZhUHJvamVjdCkKIAkgKi8KQEAgLTE4MzAsMjggKzE5ODAsMTUgQEAKIAogCQlpZiAoIWdldFByb2plY3QoKS5leGlzdHMoKSkgcmV0dXJuIGZhbHNlOwogCi0JCVF1YWxpZmllZE5hbWUgY2xhc3NwYXRoUHJvcCA9IGdldENsYXNzcGF0aFByb3BlcnR5TmFtZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBhdHRlbXB0IHRvIHByb3ZlIHRoZSBjbGFzc3BhdGggaGFzIG5vdCBjaGFuZ2UKLQkJCVN0cmluZyBmaWxlQ2xhc3NwYXRoU3RyaW5nID0gZ2V0U2hhcmVkUHJvcGVydHkoY2xhc3NwYXRoUHJvcCk7Ci0JCQlpZiAoZmlsZUNsYXNzcGF0aFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gZmlsZUVudHJpZXMgPSByZWFkUGF0aHMoZmlsZUNsYXNzcGF0aFN0cmluZyk7Ci0JCQkJaWYgKGlzQ2xhc3NwYXRoRXF1YWxzVG8obmV3Q2xhc3NwYXRoLCBuZXdPdXRwdXRMb2NhdGlvbiwgZmlsZUVudHJpZXMpKSB7Ci0JCQkJCS8vIG5vIG5lZWQgdG8gc2F2ZSBpdCwgaXQgaXMgdGhlIHNhbWUKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGZpbGVFbnRyaWVzID0gcmVhZENsYXNzcGF0aEZpbGUoZmFsc2UgLypkb24ndCBjcmVhdGUgbWFya2VycyovLCBmYWxzZS8qZG9uJ3QgbG9nIHByb2JsZW1zKi8pOworCQlpZiAoZmlsZUVudHJpZXMgIT0gbnVsbCAmJiBpc0NsYXNzcGF0aEVxdWFsc1RvKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24sIGZpbGVFbnRyaWVzKSkgeworCQkJLy8gbm8gbmVlZCB0byBzYXZlIGl0LCBpdCBpcyB0aGUgc2FtZQorCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKIAkJLy8gYWN0dWFsIGZpbGUgc2F2aW5nCiAJCXRyeSB7Ci0JCQlzZXRTaGFyZWRQcm9wZXJ0eSgKLQkJCQljbGFzc3BhdGhQcm9wLAotCQkJCWdldENsYXNzcGF0aEFzWE1MKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24pKTsKKwkJCXNldFNoYXJlZFByb3BlcnR5KENMQVNTUEFUSF9GSUxFTkFNRSwgZW5jb2RlQ2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbmV3T3V0cHV0TG9jYXRpb24sIHRydWUpKTsKIAkJCXJldHVybiB0cnVlOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CkBAIC0xODU5LDYgKzE5OTYsNTEgQEAKIAl9CiAKIAkvKioKKwkgKiBTYXZlIHByb2plY3QgY3VzdG9tIHByZWZlcmVuY2VzIHRvIHNoYXJlYWJsZSBmaWxlICguanByZWZzKQorCSAqLworCXByaXZhdGUgdm9pZCBzYXZlUHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKKwkJCisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCWlmICghSmF2YVByb2plY3QuaGFzSmF2YU5hdHVyZShwcm9qZWN0KSkgcmV0dXJuOyAvLyBpZ25vcmUKKwkJCisJCWlmIChwcmVmZXJlbmNlcyA9PSBudWxsIHx8ICghcHJlZmVyZW5jZXMubmVlZHNTYXZpbmcoKSAmJiBwcmVmZXJlbmNlcy5wcm9wZXJ0eU5hbWVzKCkubGVuZ3RoICE9IDApKSB7CisJCQkvLyBub3RoaW5nIHRvIHNhdmUKKwkJCXJldHVybjsKKwkJfQorCQorCQkvLyBwcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHNhdmVkCisJCS8vIHRoZSBwcmVmZXJlbmNlcyBmaWxlIGlzIGxvY2F0ZWQgaW4gdGhlIHBsdWctaW4ncyBzdGF0ZSBhcmVhCisJCS8vIGF0IGEgd2VsbC1rbm93biBuYW1lICguanByZWZzKQorLy8JCUZpbGUgcHJlZkZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoUFJFRl9GSUxFTkFNRSkudG9GaWxlKCk7CisJCUZpbGUgcHJlZkZpbGUgPSBwcm9qZWN0LmdldFBsdWdpbldvcmtpbmdMb2NhdGlvbihKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkpLmFwcGVuZChQUkVGX0ZJTEVOQU1FKS50b0ZpbGUoKTsKKwkJaWYgKHByZWZlcmVuY2VzLnByb3BlcnR5TmFtZXMoKS5sZW5ndGggPT0gMCkgeworCQkJLy8gdGhlcmUgYXJlIG5vIHByZWZlcmVuY2Ugc2V0dGluZ3MKKwkJCS8vIHJhdGhlciB0aGFuIHdyaXRlIGFuIGVtcHR5IGZpbGUsIGp1c3QgZGVsZXRlIGFueSBleGlzdGluZyBmaWxlCisJCQlpZiAocHJlZkZpbGUuZXhpc3RzKCkpIHsKKwkJCQlwcmVmRmlsZS5kZWxldGUoKTsgLy8gZG9uJ3Qgd29ycnkgaWYgZGVsZXRlIHVuc3VjY2Vzc2Z1bAorCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyB3cml0ZSBmaWxlLCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUKKwkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBkbyBpdCBhcyBjYXJlZnVsbHkgYXMgd2Uga25vdyBob3cgc28gdGhhdCB3ZSBkb24ndCBsb3NlL21hbmdsZQorCQkJLy8gdGhlIHNldHRpbmcgaW4gdGltZXMgb2Ygc3RyZXNzCisJCQlvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocHJlZkZpbGUpKTsKKwkJCXByZWZlcmVuY2VzLnN0b3JlKG91dCwgbnVsbCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgLy8gcHJvYmxlbXMgc2F2aW5nIHByZWZlcmVuY2Ugc3RvcmUgLSBxdWlldGx5IGlnbm9yZQorCQl9IGZpbmFsbHkgeworCQkJaWYgKG91dCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvLyBpZ25vcmUgcHJvYmxlbXMgd2l0aCBjbG9zZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgogCSAqIFVwZGF0ZSB0aGUgSmF2YSBjb21tYW5kIGluIHRoZSBidWlsZCBzcGVjIChyZXBsYWNlIGV4aXN0aW5nIG9uZSBpZiBwcmVzZW50LAogCSAqIGFkZCBvbmUgZmlyc3QgaWYgbm9uZSkuCiAJICovCkBAIC0xODkyLDE4ICsyMDc0LDUxIEBACiAJfQogCiAJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Qjc2V0T3B0aW9ucyhNYXApCisJICovCisJcHVibGljIHZvaWQgc2V0T3B0aW9ucyhNYXAgbmV3T3B0aW9ucykgeworCisJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzOworCQlzZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlcyA9IG5ldyBQcmVmZXJlbmNlcygpKTsgLy8gYWx3YXlzIHJlc2V0ICgyNjI1NSkKKwkJaWYgKG5ld09wdGlvbnMgIT0gbnVsbCl7CisJCQlJdGVyYXRvciBrZXlzID0gbmV3T3B0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKXsKKwkJCQlTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHQoKTsKKwkJCQlpZiAoIUphdmFNb2RlbE1hbmFnZXIuT3B0aW9uTmFtZXMuY29udGFpbnMoa2V5KSkgY29udGludWU7IC8vIHVucmVjb2duaXplZCBvcHRpb24KKwkJCQkvLyBubyBmaWx0ZXJpbmcgZm9yIGVuY29kaW5nIChjdXN0b20gZW5jb2RpbmcgZm9yIHByb2plY3QgaXMgYWxsb3dlZCkKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKW5ld09wdGlvbnMuZ2V0KGtleSk7CisJCQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChrZXksIENVU1RPTV9ERUZBVUxUX09QVElPTl9WQUxVRSk7IC8vIGVtcHR5IHN0cmluZyBpc24ndCB0aGUgZGVmYXVsdCAoMjYyNTEpCisJCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIHBlcnNpc3Qgb3B0aW9ucworCQlzYXZlUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpOwkKKwl9CisKKwkvKioKIAkgKiBAc2VlIElKYXZhUHJvamVjdAogCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dExvY2F0aW9uKElQYXRoIG91dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAotCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgeworCQlpZiAocGF0aCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFV0aWwuYmluZCgicGF0aC5udWxscGF0aCIpKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCWlmIChvdXRwdXRMb2NhdGlvbi5lcXVhbHMoZ2V0T3V0cHV0TG9jYXRpb24oKSkpIHsKKwkJaWYgKHBhdGguZXF1YWxzKGdldE91dHB1dExvY2F0aW9uKCkpKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJdGhpcy5zZXRSYXdDbGFzc3BhdGgoU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLlJldXNlQ2xhc3NwYXRoLCBvdXRwdXRMb2NhdGlvbiwgbW9uaXRvcik7CisJCXRoaXMuc2V0UmF3Q2xhc3NwYXRoKFNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZUNsYXNzcGF0aCwgcGF0aCwgbW9uaXRvcik7CisJfQorCisJLyoKKwkgKiBTZXQgY2FjaGVkIHByZWZlcmVuY2VzLCBubyBwcmVmZXJlbmNlIGZpbGUgaXMgc2F2ZWQsIG9ubHkgaW5mbyBpcyB1cGRhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKwkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSByZXR1cm47IC8vIGlnbm9yZQorCQlKYXZhTW9kZWxNYW5hZ2VyLlBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm8ocHJvamVjdCwgdHJ1ZSk7CisJCXBlclByb2plY3RJbmZvLnByZWZlcmVuY2VzID0gcHJlZmVyZW5jZXM7CiAJfQogCiAJLyoqCkBAIC0xOTMzLDExICsyMTQ4LDEwIEBACiAJCQllbnRyaWVzLCAKIAkJCW91dHB1dExvY2F0aW9uLCAKIAkJCW1vbml0b3IsIAotCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UKLQkJCXRydWUsIC8vIGZvcmNlU2F2ZQorCQkJdHJ1ZSwgLy8gY2FuQ2hhbmdlUmVzb3VyY2UgKGFzIHBlciBBUEkgY29udHJhY3QpCiAJCQlnZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgLy8gaWdub3JlVW5yZXNvbHZlZFZhcmlhYmxlCi0JCQl0cnVlLCAvLyBuZWVkQ3ljbGVDaGVjawotCQkJdHJ1ZSk7IC8vIG5lZWRWYWxpZGF0aW9uCisJCQl0cnVlLCAvLyBuZWVkVmFsaWRhdGlvbgorCQkJdHJ1ZSk7IC8vIG5lZWQgdG8gc2F2ZQogCX0KIAogCXB1YmxpYyB2b2lkIHNldFJhd0NsYXNzcGF0aCgKQEAgLTE5NDUsMTAgKzIxNTksOSBAQAogCQlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwKIAkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQlib29sZWFuIGNhbkNoYW5nZVJlc291cmNlLAotCQlib29sZWFuIGZvcmNlU2F2ZSwKIAkJSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRQYXRoLAotCQlib29sZWFuIG5lZWRDeWNsZUNoZWNrLAotCQlib29sZWFuIG5lZWRWYWxpZGF0aW9uKQorCQlib29sZWFuIG5lZWRWYWxpZGF0aW9uLAorCQlib29sZWFuIG5lZWRTYXZlKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAogCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPQpAQCAtMTk2NSw5ICsyMTc4LDggQEAKIAkJCQkJbmV3UmF3UGF0aCwgCiAJCQkJCW5ld091dHB1dExvY2F0aW9uLAogCQkJCQljYW5DaGFuZ2VSZXNvdXJjZSwgCi0JCQkJCWZvcmNlU2F2ZSwKLQkJCQkJbmVlZEN5Y2xlQ2hlY2ssCi0JCQkJCW5lZWRWYWxpZGF0aW9uKTsKKwkJCQkJbmVlZFZhbGlkYXRpb24sCisJCQkJCW5lZWRTYXZlKTsKIAkJCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CiAJCQkKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKQEAgLTE5ODgsMTEgKzIyMDAsMTAgQEAKIAkJCWVudHJpZXMsIAogCQkJU2V0Q2xhc3NwYXRoT3BlcmF0aW9uLlJldXNlT3V0cHV0TG9jYXRpb24sIAogCQkJbW9uaXRvciwgCi0JCQl0cnVlLCAvLyBjYW5DaGFuZ2VSZXNvdXJjZQotCQkJdHJ1ZSwgLy8gZm9yY2VTYXZlCisJCQl0cnVlLCAvLyBjYW5DaGFuZ2VSZXNvdXJjZSAoYXMgcGVyIEFQSSBjb250cmFjdCkKIAkJCWdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpLCAvLyBpZ25vcmVVbnJlc29sdmVkVmFyaWFibGUKLQkJCXRydWUsIC8vIG5lZWRDeWNsZUNoZWNrCi0JCQl0cnVlKTsgLy8gbmVlZFZhbGlkYXRpb24KKwkJCXRydWUsIC8vIG5lZWRWYWxpZGF0aW9uCisJCQl0cnVlKTsgLy8gbmVlZCB0byBzYXZlCiAJfQogCiAJLyoqCkBAIC0yMDA0LDIwICsyMjE1LDE2IEBACiAJcHJvdGVjdGVkIHZvaWQgc2V0UmF3Q2xhc3NwYXRoMChJQ2xhc3NwYXRoRW50cnlbXSByYXdFbnRyaWVzKQogCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAotCQkvLyBpZiBub3Qgb3Blbiwgd2lsbCBjYXVzZSBvcGVuaW5nIHdpdGggZGVmYXVsdCBwYXRoCi0JCUphdmFQcm9qZWN0RWxlbWVudEluZm8gaW5mbyA9IGdldEphdmFQcm9qZWN0RWxlbWVudEluZm8oKTsKKwkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBpbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm9DaGVja0V4aXN0ZW5jZShmUHJvamVjdCk7CiAJCiAJCXN5bmNocm9uaXplZCAoaW5mbykgewotCQkJaWYgKHJhd0VudHJpZXMgPT0gbnVsbCkgewotCQkJCXJhd0VudHJpZXMgPSBkZWZhdWx0Q2xhc3NwYXRoKCk7CisJCQlpZiAocmF3RW50cmllcyAhPSBudWxsKSB7CisJCQkJaW5mby5jbGFzc3BhdGggPSByYXdFbnRyaWVzOwogCQkJfQorCQkJCiAJCQkvLyBjbGVhciBjYWNoZSBvZiByZXNvbHZlZCBjbGFzc3BhdGgKIAkJCWluZm8ubGFzdFJlc29sdmVkQ2xhc3NwYXRoID0gbnVsbDsKLQkJCQotCQkJaW5mby5zZXRSYXdDbGFzc3BhdGgocmF3RW50cmllcyk7Ci0JCQkJCi0JCQkvLyBjb21wdXRlIHRoZSBuZXcgcm9vdHMKLQkJCXVwZGF0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CQkJCQorCQkJaW5mby5yZXNvbHZlZFBhdGhUb1Jhd0VudHJpZXMgPSBudWxsOwogCQl9CiAJfQogCkBAIC0yMDMwLDE2ICsyMjM3LDE4IEBACiAJICogc2hhcmVkIHByb3BlcnRpZXMgZW5kIHVwIGluIHJlc291cmNlIGZpbGVzLCBhbmQgdGh1cyBjYW5ub3QgYmUgbW9kaWZpZWQgZHVyaW5nCiAJICogZGVsdGEgbm90aWZpY2F0aW9ucyAoYSBDb3JlRXhjZXB0aW9uIHdvdWxkIHRoZW4gYmUgdGhyb3duKS4KIAkgKiAKLQkgKiBAc2VlIEphdmFQcm9qZWN0I2dldFNoYXJlZFByb3BlcnR5KFF1YWxpZmllZE5hbWUga2V5KQorCSAqIEBzZWUgSmF2YVByb2plY3QjZ2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nIGtleSkKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRQcm9wZXJ0eShRdWFsaWZpZWROYW1lIGtleSwgU3RyaW5nIHZhbHVlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgc2V0U2hhcmVkUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGNvbXB1dGVTaGFyZWRQcm9wZXJ0eUZpbGVOYW1lKGtleSk7Ci0JCUlGaWxlIHJzY0ZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9wZXJ0eU5hbWUpOworCQlJRmlsZSByc2NGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoa2V5KTsKIAkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUuZ2V0Qnl0ZXMoKSk7CiAJCS8vIHVwZGF0ZSB0aGUgcmVzb3VyY2UgY29udGVudAogCQlpZiAocnNjRmlsZS5leGlzdHMoKSkgeworCQkJaWYgKHJzY0ZpbGUuaXNSZWFkT25seSgpKSB7CisJCQkJLy8gcHJvdmlkZSBvcHBvcnR1bml0eSB0byBjaGVja291dCByZWFkLW9ubHkgLmNsYXNzcGF0aCBmaWxlICgyMzk4NCkKKwkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtde3JzY0ZpbGV9LCBudWxsKTsKKwkJCX0KIAkJCXJzY0ZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7CiAJCX0gZWxzZSB7CiAJCQlyc2NGaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKQEAgLTIwNTYsOCArMjI2NSwxNCBAQAogCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKIAogCQlIYXNoU2V0IGN5Y2xlUGFydGljaXBhbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IHZpc2l0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCWludCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7CisJCQorCQkvKiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGN5Y2xlIHBhcnRpY2lwYW50cyBjb21wdXRhdGlvbgorCQljb21wdXRlQ3ljbGVQYXJ0aWNpcGFudHMocHJvamVjdHMsIGN5Y2xlUGFydGljaXBhbnRzKTsKKwkJKi8KKworCQkvLyBjb21wdXRlIGN5Y2xlIHBhcnRpY2lwYW50cworCQlBcnJheUxpc3QgdmlzaXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CiAJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KXByb2plY3RzW2ldOwogCQkJaWYgKCFjeWNsZVBhcnRpY2lwYW50cy5jb250YWlucyhwcm9qZWN0KSl7CkBAIC0yMDY1LDYyICsyMjgwLDY4IEBACiAJCQkJcHJvamVjdC51cGRhdGVDeWNsZVBhcnRpY2lwYW50cyhudWxsLCB2aXNpdGVkLCBjeWNsZVBhcnRpY2lwYW50cywgd29ya3NwYWNlUm9vdCk7CiAJCQl9CiAJCX0KLQorCQkKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CiAJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KXByb2plY3RzW2ldOwogCQkJCiAJCQlpZiAoY3ljbGVQYXJ0aWNpcGFudHMuY29udGFpbnMocHJvamVjdCkpewotCQkJCWlmICghcHJvamVjdC5oYXNDeWNsZU1hcmtlcigpKXsKKwkJCQlJTWFya2VyIGN5Y2xlTWFya2VyID0gcHJvamVjdC5nZXRDeWNsZU1hcmtlcigpOworCQkJCVN0cmluZyBjaXJjdWxhckNQT3B0aW9uID0gcHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIHRydWUpOworCQkJCWludCBjaXJjdWxhckNQU2V2ZXJpdHkgPSBKYXZhQ29yZS5FUlJPUi5lcXVhbHMoY2lyY3VsYXJDUE9wdGlvbikgPyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SIDogSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOworCQkJCWlmIChjeWNsZU1hcmtlciAhPSBudWxsKSB7CisJCQkJCS8vIHVwZGF0ZSBleGlzdGluZyBjeWNsZSBtYXJrZXIgaWYgbmVlZGVkCisJCQkJCXRyeSB7CisJCQkJCQlpbnQgZXhpc3RpbmdTZXZlcml0eSA9ICgoSW50ZWdlciljeWNsZU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpLmludFZhbHVlKCk7CisJCQkJCQlpZiAoZXhpc3RpbmdTZXZlcml0eSAhPSBjaXJjdWxhckNQU2V2ZXJpdHkpIHsKKwkJCQkJCQljeWNsZU1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgY2lyY3VsYXJDUFNldmVyaXR5KTsKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gY3JlYXRlIG5ldyBtYXJrZXIKIAkJCQkJcHJvamVjdC5jcmVhdGVDbGFzc3BhdGhQcm9ibGVtTWFya2VyKAotCQkJCQkJVXRpbC5iaW5kKCJjbGFzc3BhdGguY3ljbGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJSU1hcmtlci5TRVZFUklUWV9FUlJPUiwKLQkJCQkJCXRydWUsCi0JCQkJCQlmYWxzZSk7IAorCQkJCQkJbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLkNMQVNTUEFUSF9DWUNMRSwgcHJvamVjdCkpOyAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXByb2plY3QuZmx1c2hDbGFzc3BhdGhQcm9ibGVtTWFya2Vycyh0cnVlLCBmYWxzZSk7CiAJCQl9CQkJCiAJCX0KIAl9Ci0JCisKIAkvKioKIAkgKiBJZiBhIGN5Y2xlIGlzIGRldGVjdGVkLCB0aGVuIGN5Y2xlUGFydGljaXBhbnRzIGNvbnRhaW5zIGFsbCB0aGUgcHJvamVjdCBpbnZvbHZlZCBpbiB0aGlzIGN5Y2xlIChkaXJlY3RseSksCiAJICogbm8gY3ljbGUgaWYgdGhlIHNldCBpcyBlbXB0eSAoYW5kIHN0YXJ0ZWQgZW1wdHkpCiAJICovCiAJcHVibGljIHZvaWQgdXBkYXRlQ3ljbGVQYXJ0aWNpcGFudHMoSUNsYXNzcGF0aEVudHJ5W10gcHJlZmVycmVkQ2xhc3NwYXRoLCBBcnJheUxpc3QgdmlzaXRlZCwgSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cywgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCl7Ci0KLQkJaW50IGluZGV4ID0gdmlzaXRlZC5pbmRleE9mKHRoaXMpOwotCQlpZiAoaW5kZXggPj0gMCl7Ci0JCQkvLyBvbmx5IGNvbnNpZGVyIGRpcmVjdCBwYXJ0aWNpcGFudHMgaW5zaWRlIHRoZSBjeWNsZQotCQkJZm9yIChpbnQgaSA9IGluZGV4LCBzaXplID0gdmlzaXRlZC5zaXplKCk7IGkgPCBzaXplOyBpKyspewotCQkJCWN5Y2xlUGFydGljaXBhbnRzLmFkZCh2aXNpdGVkLmdldChpKSk7IAotCQkJfQotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJdmlzaXRlZC5hZGQodGhpcyk7Ci0JCX0KLQkJCisJCXZpc2l0ZWQuYWRkKHRoaXMpOwogCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoOwotCQkJaWYgKHByZWZlcnJlZENsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQkJY2xhc3NwYXRoID0gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNsYXNzcGF0aCA9IHByZWZlcnJlZENsYXNzcGF0aDsKLQkJCX0KKwkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByZWZlcnJlZENsYXNzcGF0aCA9PSBudWxsID8gZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSkgOiBwcmVmZXJyZWRDbGFzc3BhdGg7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwogCQkJCQogCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpewotCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0JCQkJCXByb2plY3QudXBkYXRlQ3ljbGVQYXJ0aWNpcGFudHMobnVsbCwgdmlzaXRlZCwgY3ljbGVQYXJ0aWNpcGFudHMsIHdvcmtzcGFjZVJvb3QpOworCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJCUlSZXNvdXJjZSBtZW1iZXIgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZW50cnlQYXRoKTsKKwkJCQkJaWYgKG1lbWJlciAhPSBudWxsICYmIG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpeworCQkJCQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdClKYXZhQ29yZS5jcmVhdGUoKElQcm9qZWN0KW1lbWJlcik7CisJCQkJCQlpbnQgaW5kZXggPSB2aXNpdGVkLmluZGV4T2YocHJvamVjdCk7CisJCQkJCQlpZiAoaW5kZXggPT0gLTEgJiYgY3ljbGVQYXJ0aWNpcGFudHMuY29udGFpbnMocHJvamVjdCkpCisJCQkJCQkJaW5kZXggPSB2aXNpdGVkLmluZGV4T2YodGhpcyk7IC8vIGFub3RoZXIgbG9vcCBpbiB0aGUgY3ljbGUgZXhpc3RzCisJCQkJCQlpZiAoaW5kZXggPj0gMCkgeyAvLyBvbmx5IGNvbnNpZGVyIGRpcmVjdCBwYXJ0aWNpcGFudHMgaW5zaWRlIHRoZSBjeWNsZQorCQkJCQkJCWZvciAoaW50IHNpemUgPSB2aXNpdGVkLnNpemUoKTsgaW5kZXggPCBzaXplOyBpbmRleCsrKQorCQkJCQkJCQljeWNsZVBhcnRpY2lwYW50cy5hZGQodmlzaXRlZC5nZXQoaW5kZXgpKTsgCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByb2plY3QudXBkYXRlQ3ljbGVQYXJ0aWNpcGFudHMobnVsbCwgdmlzaXRlZCwgY3ljbGVQYXJ0aWNpcGFudHMsIHdvcmtzcGFjZVJvb3QpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKIAkJfQogCQl2aXNpdGVkLnJlbW92ZSh0aGlzKTsKIAl9Ci0JCisJCQogCS8qKgogCSAqIFJlc2V0IHRoZSBjb2xsZWN0aW9uIG9mIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgKGxvY2FsIG9uZXMpIC0gb25seSBpZiBvcGVuZWQuCiAJICogTmVlZCB0byBjaGVjayAqYWxsKiBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIGluIG9yZGVyIHRvIHJlc2V0IE5hbWVMb29rdXAKQEAgLTIxNjAsNCArMjM4MSw2IEBACiAJCQkJfQogCQkJfQogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3RFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvSmF2YVByb2plY3RFbGVtZW50SW5mby5qYXZhCmluZGV4IGI0NmU5NmYuLmJlODZjNTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0phdmFQcm9qZWN0RWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9KYXZhUHJvamVjdEVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CkBAIC0zMSwxMSArMzEsNiBAQAogY2xhc3MgSmF2YVByb2plY3RFbGVtZW50SW5mbyBleHRlbmRzIE9wZW5hYmxlRWxlbWVudEluZm8gewogCiAJLyoqCi0JICogVGhlIGNsYXNzcGF0aCBmb3IgdGhpcyBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeVtdIGZDbGFzc3BhdGg7Ci0KLQkvKioKIAkgKiBUaGUgbmFtZSBsb29rdXAgZmFjaWxpdHkgdG8gdXNlIHdpdGggdGhpcyBwcm9qZWN0LgogCSAqLwogCXByb3RlY3RlZCBOYW1lTG9va3VwIGZOYW1lTG9va3VwID0gbnVsbDsKQEAgLTQ3LDE3ICs0MiwxMCBAQAogCXByb3RlY3RlZCBTZWFyY2hhYmxlRW52aXJvbm1lbnQgZlNlYXJjaGFibGVFbnZpcm9ubWVudCA9IG51bGw7CiAKIAkvKioKLQkgKiBUaGUgb3V0cHV0IGxvY2F0aW9uIGZvciB0aGlzIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGZPdXRwdXRMb2NhdGlvbiA9IG51bGw7Ci0KLQkvKioKIAkgKiBBIGFycmF5IHdpdGggYWxsIHRoZSBub24tamF2YSByZXNvdXJjZXMgY29udGFpbmVkIGJ5IHRoaXMgUGFja2FnZUZyYWdtZW50CiAJICovCiAJcHJpdmF0ZSBPYmplY3RbXSBmTm9uSmF2YVJlc291cmNlczsKIAotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBsYXN0UmVzb2x2ZWRDbGFzc3BhdGggPSBudWxsOwotCiAJLyoqCiAJICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgogCSAqLwpAQCAtNzQsMTYgKzYyLDIxIEBACiAJCUlQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKIAkJYm9vbGVhbiBzcmNJc1Byb2plY3QgPSBmYWxzZTsKIAkJYm9vbGVhbiBiaW5Jc1Byb2plY3QgPSBmYWxzZTsKKwkJY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSBudWxsOworCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOworCQlJUGF0aCBwcm9qZWN0T3V0cHV0ID0gbnVsbDsKIAkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQljbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUvKmlnbm9yZSB1bnJlc29sdmVkIHZhcmlhYmxlKi8pOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CiAJCQkJaWYgKHByb2plY3RQYXRoLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7CiAJCQkJCXNyY0lzUHJvamVjdCA9IHRydWU7CisJCQkJCWV4Y2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSllbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQliaW5Jc1Byb2plY3QgPSBwcm9qZWN0UGF0aC5lcXVhbHMocHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJCXByb2plY3RPdXRwdXQgPSBwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7CisJCQliaW5Jc1Byb2plY3QgPSBwcm9qZWN0UGF0aC5lcXVhbHMocHJvamVjdE91dHB1dCk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkvLyBpZ25vcmUKIAkJfQpAQCAtOTEsNTIgKzg0LDU5IEBACiAJCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlWzVdOwogCQlpbnQgbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgPSAwOwogCQl0cnkgewotCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgcHJvamVjdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkubWVtYmVycygpOworCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgcHJvamVjdC5nZXRSZXNvdXJjZSgpKS5tZW1iZXJzKCk7CiAJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOwogCQkJCXN3aXRjaCAocmVzLmdldFR5cGUoKSkgewogCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJCS8vIGNoZWNrIGlmIHRoaXMgZmlsZSBtaWdodCBiZSBhIGphciBvciBhIHppcCBpbnNpZGUgdGhlIGJ1aWxkIHBhdGgKIAkJCQkJCUlQYXRoIHJlc0Z1bGxQYXRoID0gcmVzLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlpZiAocHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdDAocmVzRnVsbFBhdGgpID09IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgcmVzTmFtZSA9IHJlcy5nZXROYW1lKCk7Ci0JCQkJCQkJLy8gaWdub3JlIC5qYXZhIGZpbGUgaWYgc3JjID09IHByb2plY3QKLQkJCQkJCQlpZiAoc3JjSXNQcm9qZWN0ICYmIFV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUocmVzTmFtZSkpIHsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGlnbm9yZSAuY2xhc3MgZmlsZSBpZiBiaW4gPT0gcHJvamVjdAotCQkJCQkJCWlmIChiaW5Jc1Byb2plY3QgJiYgVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShyZXNOYW1lKSkgewotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gZWxzZSBhZGQgbm9uIGphdmEgcmVzb3VyY2UKLQkJCQkJCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggPT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKLQkJCQkJCQkJLy8gcmVzaXplCi0JCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCShub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzQ291bnRlcik7Ci0JCQkJCQkJfQotCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSByZXM7CisJCQkJCQlTdHJpbmcgcmVzTmFtZSA9IHJlcy5nZXROYW1lKCk7CisJCQkJCQkKKwkJCQkJCS8vIGlnbm9yZSBhIGphciBmaWxlIG9uIHRoZSBjbGFzc3BhdGgKKwkJCQkJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHJlc05hbWUpICYmIHRoaXMuaXNDbGFzc3BhdGhFbnRyeU9yT3V0cHV0TG9jYXRpb24ocmVzRnVsbFBhdGgsIGNsYXNzcGF0aCwgcHJvamVjdE91dHB1dCkpIHsKKwkJCQkJCQlicmVhazsKIAkJCQkJCX0KKwkJCQkJCS8vIGlnbm9yZSAuamF2YSBmaWxlIGlmIHNyYyA9PSBwcm9qZWN0CisJCQkJCQlpZiAoc3JjSXNQcm9qZWN0IAorCQkJCQkJCSYmIFV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUocmVzTmFtZSkKKwkJCQkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKHJlcywgZXhjbHVzaW9uUGF0dGVybnMpKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBpZ25vcmUgLmNsYXNzIGZpbGUgaWYgYmluID09IHByb2plY3QKKwkJCQkJCWlmIChiaW5Jc1Byb2plY3QgJiYgVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShyZXNOYW1lKSkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gZWxzZSBhZGQgbm9uIGphdmEgcmVzb3VyY2UKKwkJCQkJCWlmIChub25KYXZhUmVzb3VyY2VzLmxlbmd0aCA9PSBub25KYXZhUmVzb3VyY2VzQ291bnRlcikgeworCQkJCQkJCS8vIHJlc2l6ZQorCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCQkJCW5vbkphdmFSZXNvdXJjZXMsCisJCQkJCQkJCTAsCisJCQkJCQkJCShub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwKKwkJCQkJCQkJMCwKKwkJCQkJCQkJbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpOworCQkJCQkJfQorCQkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IHJlczsKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgogCQkJCQkJcmVzRnVsbFBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWlmICghcmVzRnVsbFBhdGguZXF1YWxzKHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSkKLQkJCQkJCQkmJiBwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChyZXNGdWxsUGF0aCkgPT0gbnVsbAotCQkJCQkJCSYmIHByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudDAocmVzRnVsbFBhdGgpID09IG51bGwpIHsKLQkJCQkJCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggPT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKLQkJCQkJCQkJLy8gcmVzaXplCi0JCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCShub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzQ291bnRlcik7Ci0JCQkJCQkJfQotCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSByZXM7CisJCQkJCQkKKwkJCQkJCS8vIGlnbm9yZSBub24tZXhjbHVkZWQgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoIG9yIHRoYXQgY29ycmVzcG9uZCB0byBhbiBvdXRwdXQgbG9jYXRpb24KKwkJCQkJCWlmICgoc3JjSXNQcm9qZWN0ICYmICFVdGlsLmlzRXhjbHVkZWQocmVzLCBleGNsdXNpb25QYXR0ZXJucykgJiYgVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UocmVzLmdldE5hbWUoKSkpCisJCQkJCQkJCXx8IHRoaXMuaXNDbGFzc3BhdGhFbnRyeU9yT3V0cHV0TG9jYXRpb24ocmVzRnVsbFBhdGgsIGNsYXNzcGF0aCwgcHJvamVjdE91dHB1dCkpIHsKKwkJCQkJCQlicmVhazsKIAkJCQkJCX0KKwkJCQkJCS8vIGVsc2UgYWRkIG5vbiBqYXZhIHJlc291cmNlCisJCQkJCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggPT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKKwkJCQkJCQkvLyByZXNpemUKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQlub25KYXZhUmVzb3VyY2VzLAorCQkJCQkJCQkwLAorCQkJCQkJCQkobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksCisJCQkJCQkJCTAsCisJCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCQkJCX0KKwkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSByZXM7CiAJCQkJfQogCQkJfQogCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoICE9IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CkBAIC0xNzYsMjggKzE3NiwyOSBAQAogCX0KIAkKIAkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRPdXRwdXRMb2NhdGlvbigpIHsKLQotCQlyZXR1cm4gZk91dHB1dExvY2F0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnlbXSBnZXRSYXdDbGFzc3BhdGgoKSB7Ci0KLQkJcmV0dXJuIGZDbGFzc3BhdGg7Ci0JfQotCQotCS8qKgogCSAqIEBzZWUgSUphdmFQcm9qZWN0IAogCSAqLwogCXByb3RlY3RlZCBTZWFyY2hhYmxlRW52aXJvbm1lbnQgZ2V0U2VhcmNoYWJsZUVudmlyb25tZW50KCkgewogCiAJCXJldHVybiBmU2VhcmNoYWJsZUVudmlyb25tZW50OwogCX0KKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIGNsYXNzcGF0aCBlbnRyeSBvciBhbiBvdXRwdXQgbG9jYXRpb24uCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3NwYXRoRW50cnlPck91dHB1dExvY2F0aW9uKElQYXRoIHBhdGgsIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkQ2xhc3NwYXRoLCBJUGF0aCBwcm9qZWN0T3V0cHV0KSB7CisJCWlmIChwcm9qZWN0T3V0cHV0LmVxdWFscyhwYXRoKSkgcmV0dXJuIHRydWU7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXNvbHZlZENsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcmVzb2x2ZWRDbGFzc3BhdGhbaV07CisJCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJSVBhdGggb3V0cHV0OworCQkJaWYgKChvdXRwdXQgPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKSAhPSBudWxsICYmIG91dHB1dC5lcXVhbHMocGF0aCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQogCQogCXByb3RlY3RlZCB2b2lkIHNldE5hbWVMb29rdXAoTmFtZUxvb2t1cCBuZXdOYW1lTG9va3VwKSB7CiAKQEAgLTIxNiwyMSArMjE3LDggQEAKIAkJZk5vbkphdmFSZXNvdXJjZXMgPSByZXNvdXJjZXM7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldE91dHB1dExvY2F0aW9uKElQYXRoIG5ld091dHB1dExvY2F0aW9uKSB7Ci0KLQkJZk91dHB1dExvY2F0aW9uID0gbmV3T3V0cHV0TG9jYXRpb247Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBmb3IgdGhpcyBwcm9qZWN0Ci0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXdDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoKSB7Ci0KLQkJdGhpcy5mQ2xhc3NwYXRoID0gbmV3Q2xhc3NwYXRoOwotCX0KLQkKIAlwcm90ZWN0ZWQgdm9pZCBzZXRTZWFyY2hhYmxlRW52aXJvbm1lbnQoU2VhcmNoYWJsZUVudmlyb25tZW50IG5ld1NlYXJjaGFibGVFbnZpcm9ubWVudCkgewogCiAJCWZTZWFyY2hhYmxlRW52aXJvbm1lbnQgPSBuZXdTZWFyY2hhYmxlRW52aXJvbm1lbnQ7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL0xSVUNhY2hlRW51bWVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKaW5kZXggNDFlMGRlNi4uNGEyMWUwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTFJVQ2FjaGVFbnVtZXJhdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKaW5kZXggZGI2MGQ0MS4uZTkzODVkYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC04MSw4ICs4MSw2IEBACiAJCQlyZXR1cm4gbmV3IEludGVnZXIoY29uc3RhbnQuaW50VmFsdWUoKSk7CiAJCWNhc2UgVHlwZUlkcy5UX2xvbmcgOgogCQkJcmV0dXJuIG5ldyBMb25nKGNvbnN0YW50LmxvbmdWYWx1ZSgpKTsKLQkJY2FzZSBUeXBlSWRzLlRfbnVsbCA6Ci0JCQlyZXR1cm4gbnVsbDsKIAkJY2FzZSBUeXBlSWRzLlRfc2hvcnQgOgogCQkJcmV0dXJuIG5ldyBTaG9ydChjb25zdGFudC5zaG9ydFZhbHVlKCkpOwogCQljYXNlIFR5cGVJZHMuVF9TdHJpbmcgOgpAQCAtMTYyLDcgKzE2MCw3IEBACiAgKiBAc2VlIElNZW1iZXIKICAqLwogcHVibGljIElTb3VyY2VSYW5nZSBnZXROYW1lUmFuZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlNZW1iZXJFbGVtZW50SW5mbyBpbmZvPSAoTWVtYmVyRWxlbWVudEluZm8pZ2V0UmF3SW5mbygpOworCU1lbWJlckVsZW1lbnRJbmZvIGluZm89IChNZW1iZXJFbGVtZW50SW5mbylnZXRFbGVtZW50SW5mbygpOwogCXJldHVybiBuZXcgU291cmNlUmFuZ2UoaW5mby5nZXROYW1lU291cmNlU3RhcnQoKSwgaW5mby5nZXROYW1lU291cmNlRW5kKCkgLSBpbmZvLmdldE5hbWVTb3VyY2VTdGFydCgpICsgMSk7CiB9CiAvKioKQEAgLTE5MSwxOSArMTg5LDYgQEAKIAlyZXR1cm4gZ2V0Q2xhc3NGaWxlKCkgIT0gbnVsbDsKIH0KIC8qKgotICogQ2hhbmdlcyB0aGUgc291cmNlIGluZGV4ZXMgb2YgdGhpcyBlbGVtZW50LiAgVXBkYXRlcyB0aGUgbmFtZSByYW5nZSBhcyB3ZWxsLgotICovCi1wdWJsaWMgdm9pZCBvZmZzZXRTb3VyY2VSYW5nZShpbnQgYW1vdW50KSB7Ci0Jc3VwZXIub2Zmc2V0U291cmNlUmFuZ2UoYW1vdW50KTsKLQl0cnkgewotCQlNZW1iZXJFbGVtZW50SW5mbyBpbmZvID0gKE1lbWJlckVsZW1lbnRJbmZvKSBnZXRSYXdJbmZvKCk7Ci0JCWluZm8uc2V0TmFtZVNvdXJjZVN0YXJ0KGluZm8uZ2V0TmFtZVNvdXJjZVN0YXJ0KCkgKyBhbW91bnQpOwotCQlpbmZvLnNldE5hbWVTb3VyY2VFbmQoaW5mby5nZXROYW1lU291cmNlRW5kKCkgKyBhbW91bnQpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJcmV0dXJuOwotCX0KLX0KLS8qKgogICovCiBwdWJsaWMgU3RyaW5nIHJlYWRhYmxlTmFtZSgpIHsKIApAQCAtMjE5LDI1ICsyMDQsMTEgQEAKIAl9CiB9CiAvKioKLSAqIFVwZGF0ZXMgdGhlIHNvdXJjZSBwb3NpdGlvbnMgZm9yIHRoaXMgZWxlbWVudC4KLSAqLwotcHVibGljIHZvaWQgdHJpZ2dlclNvdXJjZUVuZE9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgewotCXN1cGVyLnRyaWdnZXJTb3VyY2VFbmRPZmZzZXQoYW1vdW50LCBuYW1lU3RhcnQsIG5hbWVFbmQpOwotCXVwZGF0ZU5hbWVSYW5nZShuYW1lU3RhcnQsIG5hbWVFbmQpOwotfQotLyoqCi0gKiBVcGRhdGVzIHRoZSBzb3VyY2UgcG9zaXRpb25zIGZvciB0aGlzIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VSYW5nZU9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgewotCXN1cGVyLnRyaWdnZXJTb3VyY2VSYW5nZU9mZnNldChhbW91bnQsIG5hbWVTdGFydCwgbmFtZUVuZCk7Ci0JdXBkYXRlTmFtZVJhbmdlKG5hbWVTdGFydCwgbmFtZUVuZCk7Ci19Ci0vKioKICAqIFVwZGF0ZXMgdGhlIG5hbWUgcmFuZ2UgZm9yIHRoaXMgZWxlbWVudC4KICAqLwogcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZVJhbmdlKGludCBuYW1lU3RhcnQsIGludCBuYW1lRW5kKSB7CiAJdHJ5IHsKLQkJTWVtYmVyRWxlbWVudEluZm8gaW5mbyA9IChNZW1iZXJFbGVtZW50SW5mbykgZ2V0UmF3SW5mbygpOworCQlNZW1iZXJFbGVtZW50SW5mbyBpbmZvID0gKE1lbWJlckVsZW1lbnRJbmZvKSBnZXRFbGVtZW50SW5mbygpOwogCQlpbmZvLnNldE5hbWVTb3VyY2VTdGFydChuYW1lU3RhcnQpOwogCQlpbmZvLnNldE5hbWVTb3VyY2VFbmQobmFtZUVuZCk7CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyRWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01lbWJlckVsZW1lbnRJbmZvLmphdmEKaW5kZXggNmZlNzI2Yy4uNzVjYzdkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTWVtYmVyRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NZW1iZXJFbGVtZW50SW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIC8qKiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vZGVsVXBkYXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW9kZWxVcGRhdGVyLmphdmEKaW5kZXggNWRjYzhmZS4uM2RkNjk0NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW9kZWxVcGRhdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW9kZWxVcGRhdGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCkBAIC0zMiw3ICszMiw3IEBACiAJCU9wZW5hYmxlIHBhcmVudCA9IChPcGVuYWJsZSkgY2hpbGQuZ2V0UGFyZW50KCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNPcGVuKCkpIHsKIAkJCXRyeSB7Ci0JCQkJSmF2YUVsZW1lbnRJbmZvIGluZm8gPSBwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKKwkJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IChKYXZhRWxlbWVudEluZm8pcGFyZW50LmdldEVsZW1lbnRJbmZvKCk7CiAJCQkJaW5mby5hZGRDaGlsZChjaGlsZCk7CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCS8vIGRvIG5vdGhpbmcgLSB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgb3BlbgpAQCAtMTI4LDcgKzEyOCw3IEBACiAKIAkJc3dpdGNoIChlbGVtZW50VHlwZSkgewogCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6Ci0JCQkJZWxlbWVudC5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCkucmVzZXQoKTsKKwkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKS5yZXNldCgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKIAkJCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVQZXJQcm9qZWN0SW5mbygKQEAgLTE1NSw5ICsxNTUsOSBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHByb2Nlc3NKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKIAotCQlpZiAoRGVsdGFQcm9jZXNzb3IuVkVSQk9TRSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVQREFUSU5HIE1vZGVsIHdpdGggRGVsdGE6IFsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkrIjoiICsgZGVsdGEgKyAiXToiKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KKy8vCQlpZiAoRGVsdGFQcm9jZXNzb3IuVkVSQk9TRSl7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVVBEQVRJTkcgTW9kZWwgd2l0aCBEZWx0YTogWyIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSsiOiIgKyBkZWx0YSArICJdOiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKy8vCQl9CiAKIAkJdHJ5IHsKIAkJCXRoaXMudHJhdmVyc2VEZWx0YShkZWx0YSwgbnVsbCwgbnVsbCk7IC8vIHRyYXZlcnNlIGRlbHRhCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJT3BlbmFibGUgcGFyZW50ID0gKE9wZW5hYmxlKSBjaGlsZC5nZXRQYXJlbnQoKTsKIAkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5pc09wZW4oKSkgewogCQkJdHJ5IHsKLQkJCQlKYXZhRWxlbWVudEluZm8gaW5mbyA9IHBhcmVudC5nZXRFbGVtZW50SW5mbygpOworCQkJCUphdmFFbGVtZW50SW5mbyBpbmZvID0gKEphdmFFbGVtZW50SW5mbylwYXJlbnQuZ2V0RWxlbWVudEluZm8oKTsKIAkJCQlpbmZvLnJlbW92ZUNoaWxkKGNoaWxkKTsKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gZG8gbm90aGluZyAtIHdlIGFscmVhZHkgY2hlY2tlZCBpZiBvcGVuCkBAIC0yMTQsNiArMjE0LDEwIEBACiAJCQkJcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKIAkJCQlicmVhazsKIAkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJCS8vIGZpbHRlciBvdXQgd29ya2luZyBjb3BpZXMgKHdlIGRvbid0IHdhbnQgdG8gYWRkL3JlbW92ZSB0aGVtIHRvL2Zyb20gdGhlIHBhY2thZ2UgZnJhZ21lbnQKKwkJCQlpZiAoKChJV29ya2luZ0NvcHkpZWxlbWVudCkuaXNXb3JraW5nQ29weSgpKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CiAJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKIAkJCQlwcm9jZXNzQ2hpbGRyZW4gPSBmYWxzZTsKIAkJCQlicmVhazsKQEAgLTI0MCw0ICsyNDQsNCBAQAogCQkJfQogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVFbGVtZW50c09wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggYjllNGM3Zi4uZGMwMDhhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmZhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKKworcHVibGljIGNsYXNzIE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uIGV4dGVuZHMgQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24geworCS8qCisJICogUmVuYW1lcyB0aGUgY2xhc3NwYXRoIGVudHJpZXMgZXF1YWwgdG8gdGhlIGdpdmVuIHBhdGggaW4gdGhlIGdpdmVuIHByb2plY3QuCisJICogSWYgYW4gZW50cnkgd2l0aCB0aGUgZGVzdGluYXRpb24gcGF0aCBhbHJlYWR5IGV4aXN0ZWQsIHJlbW92ZSBpdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW5hbWVFbnRyeUluQ2xhc3NwYXRoKElQYXRoIHJvb3RQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkKKwkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbnVsbDsKKwkJaW50IGNwTGVuZ3RoID0gY2xhc3NwYXRoLmxlbmd0aDsKKwkJaW50IG5ld0NQSW5kZXggPSAtMTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNwTGVuZ3RoOyBpKyspIHsKKwkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKKwkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCWlmIChyb290UGF0aC5lcXVhbHMoZW50cnlQYXRoKSkgeworCQkJCS8vIHJlbmFtZSBlbnRyeQorCQkJCWlmIChuZXdDbGFzc3BhdGggPT0gbnVsbCkgeworCQkJCQluZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NwTGVuZ3RoXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgaSk7CisJCQkJCW5ld0NQSW5kZXggPSBpOworCQkJCX0KKwkJCQluZXdDbGFzc3BhdGhbbmV3Q1BJbmRleCsrXSA9IGNvcHkoZW50cnkpOworCQkJfSBlbHNlIGlmICh0aGlzLmRlc3RpbmF0aW9uLmVxdWFscyhlbnRyeVBhdGgpKSB7CisJCQkJLy8gcmVtb3ZlIGVudHJ5IGVxdWFscyB0byBkZXN0aW5hdGlvbgorCQkJCWlmIChuZXdDbGFzc3BhdGggPT0gbnVsbCkgeworCQkJCQluZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NwTGVuZ3RoXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGgsIDAsIG5ld0NsYXNzcGF0aCwgMCwgaSk7CisJCQkJCW5ld0NQSW5kZXggPSBpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobmV3Q2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCQluZXdDbGFzc3BhdGhbbmV3Q1BJbmRleCsrXSA9IGVudHJ5OworCQkJfQorCQl9CisJCQorCQlpZiAobmV3Q2xhc3NwYXRoICE9IG51bGwpIHsKKwkJCWlmIChuZXdDUEluZGV4IDwgbmV3Q2xhc3NwYXRoLmxlbmd0aCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkobmV3Q2xhc3NwYXRoLCAwLCBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0NQSW5kZXhdLCAwLCBuZXdDUEluZGV4KTsKKwkJCX0KKwkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgZk1vbml0b3IpOworCQl9CisJfQorCisJcHVibGljIE1vdmVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uKAorCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290LAorCQlJUGF0aCBkZXN0aW5hdGlvbiwKKwkJaW50IHVwZGF0ZVJlc291cmNlRmxhZ3MsCisJCWludCB1cGRhdGVNb2RlbEZsYWdzLAorCQlJQ2xhc3NwYXRoRW50cnkgc2libGluZykgeworCQkJCisJCXN1cGVyKAorCQkJcm9vdCwKKwkJCWRlc3RpbmF0aW9uLAorCQkJdXBkYXRlUmVzb3VyY2VGbGFncywKKwkJCXVwZGF0ZU1vZGVsRmxhZ3MsCisJCQlzaWJsaW5nKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCl0aGlzLmdldEVsZW1lbnRUb1Byb2Nlc3MoKTsKKwkJSUNsYXNzcGF0aEVudHJ5IHJvb3RFbnRyeSA9IHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCQorCQkvLyBtb3ZlIHJlc291cmNlCisJCWlmICghcm9vdC5pc0V4dGVybmFsKCkgJiYgKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk5PX1JFU09VUkNFX01PRElGSUNBVElPTikgPT0gMCkgeworCQkJbW92ZVJlc291cmNlKHJvb3QsIHJvb3RFbnRyeSwgd29ya3NwYWNlUm9vdCk7CisJCX0KKwkJCisJCS8vIHVwZGF0ZSByZWZlcmluZyBwcm9qZWN0cyBjbGFzc3BhdGggZXhjbHVkaW5nIG9yaWduYXRpbmcgcHJvamVjdAorCQlJSmF2YVByb2plY3Qgb3JpZ2luYXRpbmdQcm9qZWN0ID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpOworCQlpZiAoKHRoaXMudXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290Lk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEgpICE9IDApIHsKKwkJCXVwZGF0ZVJlZmVycmluZ1Byb2plY3RDbGFzc3BhdGhzKHJvb3RFbnRyeS5nZXRQYXRoKCksIG9yaWdpbmF0aW5nUHJvamVjdCk7CisJCX0KKworCQlib29sZWFuIGlzUmVuYW1lID0gdGhpcy5kZXN0aW5hdGlvbi5zZWdtZW50KDApLmVxdWFscyhvcmlnaW5hdGluZ1Byb2plY3QuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWJvb2xlYW4gdXBkYXRlT3JpZ2luYXRpbmcgPSAodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgpICE9IDA7CisJCWJvb2xlYW4gdXBkYXRlRGVzdGluYXRpb24gPSAodGhpcy51cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuREVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEgpICE9IDA7CisKKwkJLy8gdXBkYXRlIG9yaWdpbmF0aW5nIGNsYXNzcGF0aAorCQlpZiAodXBkYXRlT3JpZ2luYXRpbmcpIHsKKwkJCWlmIChpc1JlbmFtZSAmJiB1cGRhdGVEZXN0aW5hdGlvbikgeworCQkJCXJlbmFtZUVudHJ5SW5DbGFzc3BhdGgocm9vdEVudHJ5LmdldFBhdGgoKSwgb3JpZ2luYXRpbmdQcm9qZWN0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVtb3ZlRW50cnlGcm9tQ2xhc3NwYXRoKHJvb3RFbnRyeS5nZXRQYXRoKCksIG9yaWdpbmF0aW5nUHJvamVjdCk7CisJCQl9CisJCX0KKwkJCisJCS8vIHVwZGF0ZSBkZXN0aW5hdGlvbiBjbGFzc3BhdGgKKwkJaWYgKHVwZGF0ZURlc3RpbmF0aW9uKSB7CisJCQlpZiAoIWlzUmVuYW1lIHx8ICF1cGRhdGVPcmlnaW5hdGluZykgeworCQkJCWFkZEVudHJ5VG9DbGFzc3BhdGgocm9vdEVudHJ5LCB3b3Jrc3BhY2VSb290KTsKKwkJCX0gIC8vIGVsc2UgcmVmZXJlbmNlIGhhcyBiZWVuIHVwZGF0ZWQgd2hlbiB1cGRhdGluZyBvcmlnaW5hdGluZyBwcm9qZWN0IGNsYXNzcGF0aAorCQl9CisJfQorCXByb3RlY3RlZCB2b2lkIG1vdmVSZXNvdXJjZSgKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwKKwkJSUNsYXNzcGF0aEVudHJ5IHJvb3RFbnRyeSwKKwkJZmluYWwgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkKKwkJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSAoKENsYXNzcGF0aEVudHJ5KXJvb3RFbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOworCQlJUmVzb3VyY2Ugcm9vdFJlc291cmNlID0gcm9vdC5nZXRSZXNvdXJjZSgpOworCQlpZiAocm9vdEVudHJ5LmdldEVudHJ5S2luZCgpICE9IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIHx8IGV4Y2x1c2lvblBhdHRlcm5zID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJSVJlc291cmNlIGRlc3RSZXM7CisJCQkJaWYgKCh0aGlzLnVwZGF0ZU1vZGVsRmxhZ3MgJiBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFKSAhPSAwCisJCQkJCQkmJiAoZGVzdFJlcyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcih0aGlzLmRlc3RpbmF0aW9uKSkgIT0gbnVsbCkgeworCQkJCQlkZXN0UmVzLmRlbGV0ZSh0aGlzLnVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQl9CisJCQkJcm9vdFJlc291cmNlLm1vdmUodGhpcy5kZXN0aW5hdGlvbiwgdGhpcy51cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmluYWwgaW50IHNvdXJjZVNlZ21lbnRDb3VudCA9IHJvb3RFbnRyeS5nZXRQYXRoKCkuc2VnbWVudENvdW50KCk7CisJCQlmaW5hbCBJRm9sZGVyIGRlc3RGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcih0aGlzLmRlc3RpbmF0aW9uKTsKKwkJCWZpbmFsIElQYXRoW10gbmVzdGVkRm9sZGVycyA9IGdldE5lc3RlZEZvbGRlcnMocm9vdCk7CisJCQlJUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCQlJUGF0aCBwYXRoID0gcHJveHkucmVxdWVzdEZ1bGxQYXRoKCk7CisJCQkJCQlpZiAocHJlZml4ZXNPbmVPZihwYXRoLCBuZXN0ZWRGb2xkZXJzKSkgeworCQkJCQkJCWlmIChlcXVhbHNPbmVPZihwYXRoLCBuZXN0ZWRGb2xkZXJzKSkgeworCQkJCQkJCQkvLyBuZXN0ZWQgc291cmNlIGZvbGRlcgorCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gZm9sZGVyIGNvbnRhaW5pbmcgbmVzdGVkIHNvdXJjZSBmb2xkZXIKKwkJCQkJCQkJSUZvbGRlciBmb2xkZXIgPSBkZXN0Rm9sZGVyLmdldEZvbGRlcihwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlU2VnbWVudENvdW50KSk7CisJCQkJCQkJCWlmICgodXBkYXRlTW9kZWxGbGFncyAmIElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UpICE9IDAKKwkJCQkJCQkJCQkmJiBmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWZvbGRlci5jcmVhdGUodXBkYXRlUmVzb3VyY2VGbGFncywgdHJ1ZSwgZk1vbml0b3IpOworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIHN1YnRyZWUgZG9lc24ndCBjb250YWluIGFueSBuZXN0ZWQgc291cmNlIGZvbGRlcnMKKwkJCQkJCQlJUGF0aCBkZXN0UGF0aCA9IGRlc3RpbmF0aW9uLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlU2VnbWVudENvdW50KSk7CisJCQkJCQkJSVJlc291cmNlIGRlc3RSZXM7CisJCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJCQkJJiYgKGRlc3RSZXMgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZGVzdFBhdGgpKSAhPSBudWxsKSB7CisJCQkJCQkJCWRlc3RSZXMuZGVsZXRlKHVwZGF0ZVJlc291cmNlRmxhZ3MsIGZNb25pdG9yKTsKKwkJCQkJCQl9CisJCQkJCQkJcHJveHkucmVxdWVzdFJlc291cmNlKCkubW92ZShkZXN0UGF0aCwgdXBkYXRlUmVzb3VyY2VGbGFncywgZk1vbml0b3IpOworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUlQYXRoIHBhdGggPSBwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKTsKKwkJCQkJCUlQYXRoIGRlc3RQYXRoID0gZGVzdGluYXRpb24uYXBwZW5kKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VTZWdtZW50Q291bnQpKTsKKwkJCQkJCUlSZXNvdXJjZSBkZXN0UmVzOworCQkJCQkJaWYgKCh1cGRhdGVNb2RlbEZsYWdzICYgSVBhY2thZ2VGcmFnbWVudFJvb3QuUkVQTEFDRSkgIT0gMAorCQkJCQkJCQkmJiAoZGVzdFJlcyA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihkZXN0UGF0aCkpICE9IG51bGwpIHsKKwkJCQkJCQlkZXN0UmVzLmRlbGV0ZSh1cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQkJCQl9CisJCQkJCQlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5tb3ZlKGRlc3RQYXRoLCB1cGRhdGVSZXNvdXJjZUZsYWdzLCBmTW9uaXRvcik7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQkJdHJ5IHsKKwkJCQlyb290UmVzb3VyY2UuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5OT05FKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCQl9CisJCX0KKwkJdGhpcy5zZXRBdHRyaWJ1dGUoSEFTX01PRElGSUVEX1JFU09VUkNFX0FUVFIsIFRSVUUpOyAKKwl9CisJLyoKKwkgKiBSZW5hbWVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBlcXVhbCB0byB0aGUgZ2l2ZW4gcGF0aCBpbiBhbGwgSmF2YSBwcm9qZWN0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWZlcnJpbmdQcm9qZWN0Q2xhc3NwYXRocyhJUGF0aCByb290UGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3RPZlJvb3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJSmF2YU1vZGVsIG1vZGVsID0gdGhpcy5nZXRKYXZhTW9kZWwoKTsKKwkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOworCQkJaWYgKHByb2plY3QuZXF1YWxzKHByb2plY3RPZlJvb3QpKSBjb250aW51ZTsKKwkJCXJlbmFtZUVudHJ5SW5DbGFzc3BhdGgocm9vdFBhdGgsIHByb2plY3QpOworCQl9CisJfQorCS8qCisJICogUmVtb3ZlcyB0aGUgY2xhc3NwYXRoIGVudHJ5IGVxdWFsIHRvIHRoZSBnaXZlbiBwYXRoIGZyb20gdGhlIGdpdmVuIHByb2plY3QncyBjbGFzc3BhdGguCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRW50cnlGcm9tQ2xhc3NwYXRoKElQYXRoIHJvb3RQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQorCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOworCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBudWxsOworCQlpbnQgY3BMZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOworCQlpbnQgbmV3Q1BJbmRleCA9IC0xOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcExlbmd0aDsgaSsrKSB7CisJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07CisJCQlpZiAocm9vdFBhdGguZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKKwkJCQlpZiAobmV3Q2xhc3NwYXRoID09IG51bGwpIHsKKwkJCQkJbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjcExlbmd0aF07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBuZXdDbGFzc3BhdGgsIDAsIGkpOworCQkJCQluZXdDUEluZGV4ID0gaTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKG5ld0NsYXNzcGF0aCAhPSBudWxsKSB7CisJCQkJbmV3Q2xhc3NwYXRoW25ld0NQSW5kZXgrK10gPSBlbnRyeTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKG5ld0NsYXNzcGF0aCAhPSBudWxsKSB7CisJCQlpZiAobmV3Q1BJbmRleCA8IG5ld0NsYXNzcGF0aC5sZW5ndGgpIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld0NsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtuZXdDUEluZGV4XSwgMCwgbmV3Q1BJbmRleCk7CisJCQl9CisJCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIGZNb25pdG9yKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Nb3ZlUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCmluZGV4IGU3YmUyNzYuLjNiZGE1NGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL01vdmVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTW92ZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTXVsdGlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL011bHRpT3BlcmF0aW9uLmphdmEKaW5kZXggZDVhNjQwYi4uYjFlNjM4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTXVsdGlPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9NdWx0aU9wZXJhdGlvbi5qYXZhCkBAIC0xLDI3ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gbXVsdGlwbGUgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPi4KQEAgLTU2LDI3OSArNDksMjUyIEBACiAJICogY29udmVuaWVudCB3YXkuCiAJICovCiAJcHJvdGVjdGVkIE1hcCBmUmVuYW1pbmdzOwotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk11bHRpT3BlcmF0aW9uPC9jb2RlPi4KLSAqLwotcHJvdGVjdGVkIE11bHRpT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Qcm9jZXNzLCBJSmF2YUVsZW1lbnRbXSBwYXJlbnRFbGVtZW50cywgYm9vbGVhbiBmb3JjZSkgewotCXN1cGVyKGVsZW1lbnRzVG9Qcm9jZXNzLCBwYXJlbnRFbGVtZW50cywgZm9yY2UpOwotCWZQYXJlbnRFbGVtZW50cyA9IG5ldyBIYXNoTWFwKGVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCk7Ci0JaWYgKGVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCA9PSBwYXJlbnRFbGVtZW50cy5sZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgewotCQkJZlBhcmVudEVsZW1lbnRzLnB1dChlbGVtZW50c1RvUHJvY2Vzc1tpXSwgcGFyZW50RWxlbWVudHNbaV0pOwotCQl9Ci0JfSBlbHNlIHsgLy9zYW1lIGRlc3RpbmF0aW9uIGZvciBhbGwgZWxlbWVudHMgdG8gYmUgbW92ZWQvY29waWVkL3JlbmFtZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgewotCQkJZlBhcmVudEVsZW1lbnRzLnB1dChlbGVtZW50c1RvUHJvY2Vzc1tpXSwgcGFyZW50RWxlbWVudHNbMF0pOwotCQl9Ci0JfQotCi19Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TXVsdGlPcGVyYXRpb248L2NvZGU+IG9uIDxjb2RlPmVsZW1lbnRzVG9Qcm9jZXNzPC9jb2RlPi4KLSAqLwotcHJvdGVjdGVkIE11bHRpT3BlcmF0aW9uKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzVG9Qcm9jZXNzLCBib29sZWFuIGZvcmNlKSB7Ci0Jc3VwZXIoZWxlbWVudHNUb1Byb2Nlc3MsIGZvcmNlKTsKLX0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4KLSAqIGVtYmVuZGluZyBhIDxjb2RlPkphdmFNb2RlbFN0YXR1czwvY29kZT4uCi0gKi8KLXByb3RlY3RlZCB2b2lkIGVycm9yKGludCBjb2RlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKGNvZGUsIGVsZW1lbnQpKTsKLX0KLS8qKgotICogRXhlY3V0ZXMgdGhlIG9wZXJhdGlvbi4KLSAqCi0gKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBvbmUgb3Igc2V2ZXJhbCBlcnJvcnMgb2NjdXJlZCBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KLSAqIElmIG11bHRpcGxlIGVycm9ycyBvY2N1cmVkLCB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5KYXZhTW9kZWxTdGF0dXM8L2NvZGU+IGlzIGEKLSAqIG11bHRpLXN0YXR1cy4gT3RoZXJ3aXNlLCBpdCBpcyBhIHNpbXBsZSBvbmUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0cnkgewotCQlwcm9jZXNzRWxlbWVudHMoKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCXRocm93IGptZTsKLQl9IGZpbmFsbHkgewotCQltZXJnZURlbHRhcygpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGJlaW5nIGNvcGllZC9tb3ZlZC9yZW5hbWVkLgotICovCi1wcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldERlc3RpbmF0aW9uUGFyZW50KElKYXZhRWxlbWVudCBjaGlsZCkgewotCXJldHVybiAoSUphdmFFbGVtZW50KWZQYXJlbnRFbGVtZW50cy5nZXQoY2hpbGQpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIHRvIGJlIHVzZWQgYnkgdGhlIHByb2dyZXNzIG1vbml0b3IuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TWFpblRhc2tOYW1lKCk7Ci0vKioKLSAqIFJldHVybnMgdGhlIG5ldyBuYW1lIGZvciA8Y29kZT5lbGVtZW50PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGlmIHRoZXJlIGFyZSBubyByZW5hbWluZ3Mgc3BlY2lmaWVkLgotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWVGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQlpZiAoZlJlbmFtaW5ncyAhPSBudWxsKQotCQlyZXR1cm4gKFN0cmluZykgZlJlbmFtaW5ncy5nZXQoZWxlbWVudCk7Ci0JZWxzZQotCQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogU2V0cyB1cCB0aGUgcmVuYW1pbmdzIGhhc2h0YWJsZSAtIGtleXMgYXJlIHRoZSBlbGVtZW50cyBhbmQKLSAqIHZhbHVlcyBhcmUgdGhlIG5ldyBuYW1lLgotICovCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlbmFtaW5ncygpIHsKLQlpZiAoZlJlbmFtaW5nc0xpc3QgIT0gbnVsbCAmJiBmUmVuYW1pbmdzTGlzdC5sZW5ndGggPT0gZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCkgewotCQlmUmVuYW1pbmdzID0gbmV3IEhhc2hNYXAoZlJlbmFtaW5nc0xpc3QubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVuYW1pbmdzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZW5hbWluZ3NMaXN0W2ldICE9IG51bGwpIHsKLQkJCQlmUmVuYW1pbmdzLnB1dChmRWxlbWVudHNUb1Byb2Nlc3NbaV0sIGZSZW5hbWluZ3NMaXN0W2ldKTsKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk11bHRpT3BlcmF0aW9uPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgTXVsdGlPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIElKYXZhRWxlbWVudFtdIHBhcmVudEVsZW1lbnRzLCBib29sZWFuIGZvcmNlKSB7CisJCXN1cGVyKGVsZW1lbnRzVG9Qcm9jZXNzLCBwYXJlbnRFbGVtZW50cywgZm9yY2UpOworCQlmUGFyZW50RWxlbWVudHMgPSBuZXcgSGFzaE1hcChlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGgpOworCQlpZiAoZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoID09IHBhcmVudEVsZW1lbnRzLmxlbmd0aCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgeworCQkJCWZQYXJlbnRFbGVtZW50cy5wdXQoZWxlbWVudHNUb1Byb2Nlc3NbaV0sIHBhcmVudEVsZW1lbnRzW2ldKTsKKwkJCX0KKwkJfSBlbHNlIHsgLy9zYW1lIGRlc3RpbmF0aW9uIGZvciBhbGwgZWxlbWVudHMgdG8gYmUgbW92ZWQvY29waWVkL3JlbmFtZWQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoOyBpKyspIHsKKwkJCQlmUGFyZW50RWxlbWVudHMucHV0KGVsZW1lbnRzVG9Qcm9jZXNzW2ldLCBwYXJlbnRFbGVtZW50c1swXSk7CiAJCQl9CiAJCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyBhIG1vdmUgb3IgcmVuYW1lLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAqIGlmIHRoaXMgb3BlcmF0aW9uIHJlcHJlc2VudHMgYSBjb3B5Ljxicj4KLSAqIE5vdGU6IGEgcmVuYW1lIGlzIGp1c3QgYSBtb3ZlIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgd2l0aCBhIG5hbWUgY2hhbmdlLgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc01vdmUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3BlcmF0aW9uIHJlcHJlc2VudHMgYSByZW5hbWUsIDxjb2RlPmZhbHNlPC9jb2RlPgotICogaWYgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyBhIGNvcHkgb3IgbW92ZS4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNSZW5hbWUoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBQcm9jZXNzIGFsbCBvZiB0aGUgY2hhbmdlZCBkZWx0YXMgZ2VuZXJhdGVkIGJ5IHRoZXNlIG9wZXJhdGlvbnMuCi0gKi8KLXByb3RlY3RlZCB2b2lkIG1lcmdlRGVsdGFzKCkgewotCWlmIChmRGVsdGFzICE9IG51bGwpIHsKLQkJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEgPSBuZXdKYXZhRWxlbWVudERlbHRhKCk7Ci0JCWJvb2xlYW4gaW5zZXJ0ZWRUcmVlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBmRGVsdGFzW2ldOwotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQlKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSA9IChKYXZhRWxlbWVudERlbHRhKSBjaGlsZHJlbltqXTsKLQkJCQlyb290RGVsdGEuaW5zZXJ0RGVsdGFUcmVlKHByb2plY3REZWx0YS5nZXRFbGVtZW50KCksIHByb2plY3REZWx0YSk7Ci0JCQkJaW5zZXJ0ZWRUcmVlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoaW5zZXJ0ZWRUcmVlKQotCQkJZkRlbHRhcyA9IG5ldyBJSmF2YUVsZW1lbnREZWx0YVtdIHtyb290RGVsdGF9OwotCQllbHNlCi0JCQlmRGVsdGFzID0gbnVsbDsKLQl9Ci19Ci0vKioKLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcHJvY2VzcyBhIGdpdmVuIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4uCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCi0gKiBQcm9jZXNzZXMgYWxsIHRoZSA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+cyBpbiB0dXJuLCBjb2xsZWN0aW5nIGVycm9ycwotICogYW5kIHVwZGF0aW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICoKLSAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIG9uZSBvciBzZXZlcmFsIG9wZXJhdGlvbihzKSB3YXMgdW5hYmxlIHRvCi0gKiBiZSBjb21wbGV0ZWQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWJlZ2luVGFzayhnZXRNYWluVGFza05hbWUoKSwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCk7Ci0JSUphdmFNb2RlbFN0YXR1c1tdIGVycm9ycyA9IG5ldyBJSmF2YU1vZGVsU3RhdHVzWzNdOwotCWludCBlcnJvcnNDb3VudGVyID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdmVyaWZ5KGZFbGVtZW50c1RvUHJvY2Vzc1tpXSk7Ci0JCQlwcm9jZXNzRWxlbWVudChmRWxlbWVudHNUb1Byb2Nlc3NbaV0pOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlpZiAoZXJyb3JzQ291bnRlciA9PSBlcnJvcnMubGVuZ3RoKSB7Ci0JCQkJLy8gcmVzaXplCi0JCQkJU3lzdGVtLmFycmF5Y29weShlcnJvcnMsIDAsIChlcnJvcnMgPSBuZXcgSUphdmFNb2RlbFN0YXR1c1tlcnJvcnNDb3VudGVyKjJdKSwgMCwgZXJyb3JzQ291bnRlcik7Ci0JCQl9Ci0JCQllcnJvcnNbZXJyb3JzQ291bnRlcisrXSA9IGptZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdvcmtlZCgxKTsKLQkJfQotCX0KLQlkb25lKCk7Ci0JaWYgKGVycm9yc0NvdW50ZXIgPT0gMSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGVycm9yc1swXSk7Ci0JfSBlbHNlIGlmIChlcnJvcnNDb3VudGVyID4gMSkgewotCQlpZiAoZXJyb3JzQ291bnRlciAhPSBlcnJvcnMubGVuZ3RoKSB7Ci0JCQkvLyByZXNpemUKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXJyb3JzLCAwLCAoZXJyb3JzID0gbmV3IElKYXZhTW9kZWxTdGF0dXNbZXJyb3JzQ291bnRlcl0pLCAwLCBlcnJvcnNDb3VudGVyKTsKLQkJfQotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKEphdmFNb2RlbFN0YXR1cy5uZXdNdWx0aVN0YXR1cyhlcnJvcnMpKTsKLQl9Ci19Ci0vKioKLSAqIFNldHMgdGhlIGluc2VydGlvbiBwb3NpdGlvbiBpbiB0aGUgbmV3IGNvbnRhaW5lciBmb3IgdGhlIG1vZGlmaWVkIGVsZW1lbnQuIFRoZSBlbGVtZW50Ci0gKiBiZWluZyBtb2RpZmllZCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5ldyBzaWJsaW5nLiBUaGUgZ2l2ZW4gc2libGluZwotICogbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgc3BlY2lmaWVkIGZvciB0aGUgbW9kaWZpZWQgZWxlbWVudC4KLSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZWxlbWVudCBpcyB0byBiZQotICogaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLgotICovCi1wdWJsaWMgdm9pZCBzZXRJbnNlcnRCZWZvcmUoSUphdmFFbGVtZW50IG1vZGlmaWVkRWxlbWVudCwgSUphdmFFbGVtZW50IG5ld1NpYmxpbmcpIHsKLQlmSW5zZXJ0QmVmb3JlRWxlbWVudHMucHV0KG1vZGlmaWVkRWxlbWVudCwgbmV3U2libGluZyk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG5ldyBuYW1lcyB0byB1c2UgZm9yIGVhY2ggZWxlbWVudCBiZWluZyBjb3BpZWQuIFRoZSByZW5hbWluZ3MKLSAqIGNvcnJlc3BvbmQgdG8gdGhlIGVsZW1lbnRzIGJlaW5nIHByb2Nlc3NlZCwgYW5kIHRoZSBudW1iZXIgb2YKLSAqIHJlbmFtaW5ncyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYmVpbmcgcHJvY2Vzc2VkLgotICogQSA8Y29kZT5udWxsPC9jb2RlPiBlbnRyeSBpbiB0aGUgbGlzdCBpbmRpY2F0ZXMgdGhhdCBhbiBlbGVtZW50Ci0gKiBpcyBub3QgdG8gYmUgcmVuYW1lZC4KLSAqCi0gKiA8cD5Ob3RlIHRoYXQgc29tZSByZW5hbWluZ3MgbWF5IG5vdCBiZSB1c2VkLiAgSWYgYm90aCBhIHBhcmVudAotICogYW5kIGEgY2hpbGQgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBjb3B5L21vdmUsIG9ubHkgdGhlIHBhcmVudAotICogaXMgY2hhbmdlZC4gIFRoZXJlZm9yZSwgaWYgYSBuZXcgbmFtZSBpcyBzcGVjaWZpZWQgZm9yIHRoZSBjaGlsZCwKLSAqIHRoZSBjaGlsZCdzIG5hbWUgd2lsbCBub3QgYmUgY2hhbmdlZC4KLSAqLwotcHVibGljIHZvaWQgc2V0UmVuYW1pbmdzKFN0cmluZ1tdIHJlbmFtaW5ncykgewotCWZSZW5hbWluZ3NMaXN0ID0gcmVuYW1pbmdzOwotCWluaXRpYWxpemVSZW5hbWluZ3MoKTsKLX0KLS8qKgotICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4gYmVmb3JlCi0gKiA8Y29kZT5wcm9jZXNzRWxlbWVudDwvY29kZT4uIEl0IHNob3VsZCBjaGVjayB0aGF0IHRoaXMgPGNvZGU+ZWxlbWVudDwvY29kZT4KLSAqIGNhbiBiZSBwcm9jZXNzZWQuCi0gKi8KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZlcmlmeShJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLS8qKgotICogVmVyaWZpZXMgdGhhdCB0aGUgPGNvZGU+ZGVzdGluYXRpb248L2NvZGU+IHNwZWNpZmllZCBmb3IgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIHZhbGlkIGZvciB0aGUgdHlwZXMgb2YgdGhlCi0gKiA8Y29kZT5lbGVtZW50PC9jb2RlPiBhbmQgPGNvZGU+ZGVzdGluYXRpb248L2NvZGU+LgotICovCi1wcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZXN0aW5hdGlvbihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IGRlc3RpbmF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCB8fCAhZGVzdGluYXRpb24uZXhpc3RzKCkpCi0JCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgZGVzdGluYXRpb24pOwogCQotCWludCBkZXN0VHlwZSA9IGRlc3RpbmF0aW9uLmdldEVsZW1lbnRUeXBlKCk7Ci0Jc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTiA6Ci0JCWNhc2UgSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTiA6Ci0JCQlpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpCi0JCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OLCBlbGVtZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKLQkJCWlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCAmJiBkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuVFlQRSkKLQkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04sIGVsZW1lbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRCA6Ci0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEIDoKLQkJY2FzZSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgOgotCQkJaWYgKGRlc3RUeXBlICE9IElKYXZhRWxlbWVudC5UWVBFIHx8IGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQmluYXJ5VHlwZSkKLQkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04sIGVsZW1lbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJaWYgKGRlc3RUeXBlICE9IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKQotCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7Ci0JCQllbHNlIGlmIChpc01vdmUoKSAmJiAoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQpLmlzV29ya2luZ0NvcHkoKSkKLQkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0JCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZnJhZ21lbnQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50LmlzUmVhZE9ubHkoKSkKLQkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgZWxlbWVudCk7Ci0JCQllbHNlIGlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKQotCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdCA6Ci0JCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUywgZWxlbWVudCk7CiAJfQotfQotLyoqCi0gKiBWZXJpZnkgdGhhdCB0aGUgbmV3IG5hbWUgc3BlY2lmaWVkIGZvciA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcwotICogdmFsaWQgZm9yIHRoYXQgdHlwZSBvZiBKYXZhIGVsZW1lbnQuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHZlcmlmeVJlbmFtaW5nKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWVGb3IoZWxlbWVudCk7Ci0JYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQotCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSkpIHsKLQkJCQkvLyBkb24ndCBhbGxvdyByZW5hbWluZyBvZiBkZWZhdWx0IHBhY2thZ2UgKHNlZSBQUiAjMUc0N0dVTSkKLQkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTiwgZWxlbWVudCkpOworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TXVsdGlPcGVyYXRpb248L2NvZGU+IG9uIDxjb2RlPmVsZW1lbnRzVG9Qcm9jZXNzPC9jb2RlPi4KKwkgKi8KKwlwcm90ZWN0ZWQgTXVsdGlPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb1Byb2Nlc3MsIGJvb2xlYW4gZm9yY2UpIHsKKwkJc3VwZXIoZWxlbWVudHNUb1Byb2Nlc3MsIGZvcmNlKTsKKwl9CisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4KKwkgKiBlbWJlbmRpbmcgYSA8Y29kZT5KYXZhTW9kZWxTdGF0dXM8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGVycm9yKGludCBjb2RlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhjb2RlLCBlbGVtZW50KSk7CisJfQorCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24uCisJICoKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBvbmUgb3Igc2V2ZXJhbCBlcnJvcnMgb2NjdXJlZCBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKwkgKiBJZiBtdWx0aXBsZSBlcnJvcnMgb2NjdXJlZCwgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+SmF2YU1vZGVsU3RhdHVzPC9jb2RlPiBpcyBhCisJICogbXVsdGktc3RhdHVzLiBPdGhlcndpc2UsIGl0IGlzIGEgc2ltcGxlIG9uZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXByb2Nlc3NFbGVtZW50cygpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgYmVpbmcgY29waWVkL21vdmVkL3JlbmFtZWQuCisJICovCisJcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXREZXN0aW5hdGlvblBhcmVudChJSmF2YUVsZW1lbnQgY2hpbGQpIHsKKwkJcmV0dXJuIChJSmF2YUVsZW1lbnQpZlBhcmVudEVsZW1lbnRzLmdldChjaGlsZCk7CisJfQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgdG8gYmUgdXNlZCBieSB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1haW5UYXNrTmFtZSgpOworCS8qKgorCSAqIFJldHVybnMgdGhlIG5ldyBuYW1lIGZvciA8Y29kZT5lbGVtZW50PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiB0aGVyZSBhcmUgbm8gcmVuYW1pbmdzIHNwZWNpZmllZC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWVGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKGZSZW5hbWluZ3MgIT0gbnVsbCkKKwkJCXJldHVybiAoU3RyaW5nKSBmUmVuYW1pbmdzLmdldChlbGVtZW50KTsKKwkJZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCSAqIFNldHMgdXAgdGhlIHJlbmFtaW5ncyBoYXNodGFibGUgLSBrZXlzIGFyZSB0aGUgZWxlbWVudHMgYW5kCisJICogdmFsdWVzIGFyZSB0aGUgbmV3IG5hbWUuCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSZW5hbWluZ3MoKSB7CisJCWlmIChmUmVuYW1pbmdzTGlzdCAhPSBudWxsICYmIGZSZW5hbWluZ3NMaXN0Lmxlbmd0aCA9PSBmRWxlbWVudHNUb1Byb2Nlc3MubGVuZ3RoKSB7CisJCQlmUmVuYW1pbmdzID0gbmV3IEhhc2hNYXAoZlJlbmFtaW5nc0xpc3QubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlbmFtaW5nc0xpc3QubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoZlJlbmFtaW5nc0xpc3RbaV0gIT0gbnVsbCkgeworCQkJCQlmUmVuYW1pbmdzLnB1dChmRWxlbWVudHNUb1Byb2Nlc3NbaV0sIGZSZW5hbWluZ3NMaXN0W2ldKTsKKwkJCQl9CiAJCQl9Ci0JCQlpc1ZhbGlkID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUobmV3TmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJaXNWYWxpZCA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUobmV3TmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUphdmFFbGVtZW50LklOSVRJQUxJWkVSIDoKLQkJCWlzVmFsaWQgPSBmYWxzZTsgLy9jYW5ub3QgcmVuYW1lIGluaXRpYWxpemVycwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQgOgotCQkJaXNWYWxpZCA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIobmV3TmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFpc1ZhbGlkKSB7Ci0JCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSwgZWxlbWVudCwgbmV3TmFtZSkpOwotCX0KLX0KLS8qKgotICogVmVyaWZpZXMgdGhhdCB0aGUgcG9zaXRpb25pbmcgc2libGluZyBzcGVjaWZpZWQgZm9yIHRoZSA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyBleGlzdHMgYW5kCi0gKiBpdHMgcGFyZW50IGlzIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgb2YgdGhpcyA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2libGluZyhJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IGRlc3RpbmF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YUVsZW1lbnQgaW5zZXJ0QmVmb3JlRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIGZJbnNlcnRCZWZvcmVFbGVtZW50cy5nZXQoZWxlbWVudCk7Ci0JaWYgKGluc2VydEJlZm9yZUVsZW1lbnQgIT0gbnVsbCkgewotCQlpZiAoIWluc2VydEJlZm9yZUVsZW1lbnQuZXhpc3RzKCkgfHwgIWluc2VydEJlZm9yZUVsZW1lbnQuZ2V0UGFyZW50KCkuZXF1YWxzKGRlc3RpbmF0aW9uKSkgewotCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1NJQkxJTkcsIGluc2VydEJlZm9yZUVsZW1lbnQpOwogCQl9CiAJfQotfQorCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyBhIG1vdmUgb3IgcmVuYW1lLCA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKiBpZiB0aGlzIG9wZXJhdGlvbiByZXByZXNlbnRzIGEgY29weS48YnI+CisJICogTm90ZTogYSByZW5hbWUgaXMganVzdCBhIG1vdmUgd2l0aGluIHRoZSBzYW1lIHBhcmVudCB3aXRoIGEgbmFtZSBjaGFuZ2UuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNNb3ZlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyBhIHJlbmFtZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogaWYgdGhpcyBvcGVyYXRpb24gcmVwcmVzZW50cyBhIGNvcHkgb3IgbW92ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbmFtZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb2Nlc3MgYSBnaXZlbiA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFByb2Nlc3NlcyBhbGwgdGhlIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT5zIGluIHR1cm4sIGNvbGxlY3RpbmcgZXJyb3JzCisJICogYW5kIHVwZGF0aW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yLgorCSAqCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgb25lIG9yIHNldmVyYWwgb3BlcmF0aW9uKHMpIHdhcyB1bmFibGUgdG8KKwkgKiBiZSBjb21wbGV0ZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWJlZ2luVGFzayhnZXRNYWluVGFza05hbWUoKSwgZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCk7CisJCUlKYXZhTW9kZWxTdGF0dXNbXSBlcnJvcnMgPSBuZXcgSUphdmFNb2RlbFN0YXR1c1szXTsKKwkJaW50IGVycm9yc0NvdW50ZXIgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZFbGVtZW50c1RvUHJvY2Vzcy5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQl2ZXJpZnkoZkVsZW1lbnRzVG9Qcm9jZXNzW2ldKTsKKwkJCQlwcm9jZXNzRWxlbWVudChmRWxlbWVudHNUb1Byb2Nlc3NbaV0pOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgeworCQkJCWlmIChlcnJvcnNDb3VudGVyID09IGVycm9ycy5sZW5ndGgpIHsKKwkJCQkJLy8gcmVzaXplCisJCQkJCVN5c3RlbS5hcnJheWNvcHkoZXJyb3JzLCAwLCAoZXJyb3JzID0gbmV3IElKYXZhTW9kZWxTdGF0dXNbZXJyb3JzQ291bnRlcioyXSksIDAsIGVycm9yc0NvdW50ZXIpOworCQkJCX0KKwkJCQllcnJvcnNbZXJyb3JzQ291bnRlcisrXSA9IGptZS5nZXRKYXZhTW9kZWxTdGF0dXMoKTsKKwkJCX0gZmluYWxseSB7CisJCQkJd29ya2VkKDEpOworCQkJfQorCQl9CisJCWRvbmUoKTsKKwkJaWYgKGVycm9yc0NvdW50ZXIgPT0gMSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlcnJvcnNbMF0pOworCQl9IGVsc2UgaWYgKGVycm9yc0NvdW50ZXIgPiAxKSB7CisJCQlpZiAoZXJyb3JzQ291bnRlciAhPSBlcnJvcnMubGVuZ3RoKSB7CisJCQkJLy8gcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weShlcnJvcnMsIDAsIChlcnJvcnMgPSBuZXcgSUphdmFNb2RlbFN0YXR1c1tlcnJvcnNDb3VudGVyXSksIDAsIGVycm9yc0NvdW50ZXIpOworCQkJfQorCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihKYXZhTW9kZWxTdGF0dXMubmV3TXVsdGlTdGF0dXMoZXJyb3JzKSk7CisJCX0KKwl9CisJLyoqCisJICogU2V0cyB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGluIHRoZSBuZXcgY29udGFpbmVyIGZvciB0aGUgbW9kaWZpZWQgZWxlbWVudC4gVGhlIGVsZW1lbnQKKwkgKiBiZWluZyBtb2RpZmllZCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5ldyBzaWJsaW5nLiBUaGUgZ2l2ZW4gc2libGluZworCSAqIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIHNwZWNpZmllZCBmb3IgdGhlIG1vZGlmaWVkIGVsZW1lbnQuCisJICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50IGlzIHRvIGJlCisJICogaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc2VydEJlZm9yZShJSmF2YUVsZW1lbnQgbW9kaWZpZWRFbGVtZW50LCBJSmF2YUVsZW1lbnQgbmV3U2libGluZykgeworCQlmSW5zZXJ0QmVmb3JlRWxlbWVudHMucHV0KG1vZGlmaWVkRWxlbWVudCwgbmV3U2libGluZyk7CisJfQorCS8qKgorCSAqIFNldHMgdGhlIG5ldyBuYW1lcyB0byB1c2UgZm9yIGVhY2ggZWxlbWVudCBiZWluZyBjb3BpZWQuIFRoZSByZW5hbWluZ3MKKwkgKiBjb3JyZXNwb25kIHRvIHRoZSBlbGVtZW50cyBiZWluZyBwcm9jZXNzZWQsIGFuZCB0aGUgbnVtYmVyIG9mCisJICogcmVuYW1pbmdzIG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiBlbGVtZW50cyBiZWluZyBwcm9jZXNzZWQuCisJICogQSA8Y29kZT5udWxsPC9jb2RlPiBlbnRyeSBpbiB0aGUgbGlzdCBpbmRpY2F0ZXMgdGhhdCBhbiBlbGVtZW50CisJICogaXMgbm90IHRvIGJlIHJlbmFtZWQuCisJICoKKwkgKiA8cD5Ob3RlIHRoYXQgc29tZSByZW5hbWluZ3MgbWF5IG5vdCBiZSB1c2VkLiAgSWYgYm90aCBhIHBhcmVudAorCSAqIGFuZCBhIGNoaWxkIGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgY29weS9tb3ZlLCBvbmx5IHRoZSBwYXJlbnQKKwkgKiBpcyBjaGFuZ2VkLiAgVGhlcmVmb3JlLCBpZiBhIG5ldyBuYW1lIGlzIHNwZWNpZmllZCBmb3IgdGhlIGNoaWxkLAorCSAqIHRoZSBjaGlsZCdzIG5hbWUgd2lsbCBub3QgYmUgY2hhbmdlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZW5hbWluZ3MoU3RyaW5nW10gcmVuYW1pbmdzKSB7CisJCWZSZW5hbWluZ3NMaXN0ID0gcmVuYW1pbmdzOworCQlpbml0aWFsaXplUmVuYW1pbmdzKCk7CisJfQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCA8Y29kZT5JSmF2YUVsZW1lbnQ8L2NvZGU+IGJlZm9yZQorCSAqIDxjb2RlPnByb2Nlc3NFbGVtZW50PC9jb2RlPi4gSXQgc2hvdWxkIGNoZWNrIHRoYXQgdGhpcyA8Y29kZT5lbGVtZW50PC9jb2RlPgorCSAqIGNhbiBiZSBwcm9jZXNzZWQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmVyaWZ5KElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCS8qKgorCSAqIFZlcmlmaWVzIHRoYXQgdGhlIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBzcGVjaWZpZWQgZm9yIHRoZSA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyB2YWxpZCBmb3IgdGhlIHR5cGVzIG9mIHRoZQorCSAqIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGFuZCA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RGVzdGluYXRpb24oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsIHx8ICFkZXN0aW5hdGlvbi5leGlzdHMoKSkKKwkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgZGVzdGluYXRpb24pOworCQkKKwkJaW50IGRlc3RUeXBlID0gZGVzdGluYXRpb24uZ2V0RWxlbWVudFR5cGUoKTsKKwkJc3dpdGNoIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04gOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuSU1QT1JUX0RFQ0xBUkFUSU9OIDoKKwkJCQlpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKKwkJCQlpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgJiYgZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LlRZUEUpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0QgOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQgOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgOgorCQkJCWlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuVFlQRSB8fCBkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIEJpbmFyeVR5cGUpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKKwkJCQlpZiAoZGVzdFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTiwgZWxlbWVudCk7CisJCQkJZWxzZSBpZiAoaXNNb3ZlKCkgJiYgKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50KS5pc1dvcmtpbmdDb3B5KCkpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBlbGVtZW50KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKKwkJCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gZnJhZ21lbnQuZ2V0UGFyZW50KCk7CisJCQkJaWYgKHBhcmVudC5pc1JlYWRPbmx5KCkpCisJCQkJCWVycm9yKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZLCBlbGVtZW50KTsKKwkJCQllbHNlIGlmIChkZXN0VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKQorCQkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04sIGVsZW1lbnQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJZXJyb3IoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIGVsZW1lbnQpOworCQl9CisJfQorCS8qKgorCSAqIFZlcmlmeSB0aGF0IHRoZSBuZXcgbmFtZSBzcGVjaWZpZWQgZm9yIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzCisJICogdmFsaWQgZm9yIHRoYXQgdHlwZSBvZiBKYXZhIGVsZW1lbnQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UmVuYW1pbmcoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWVGb3IoZWxlbWVudCk7CisJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7CisJCisJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKKwkJCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKSkgeworCQkJCQkvLyBkb24ndCBhbGxvdyByZW5hbWluZyBvZiBkZWZhdWx0IHBhY2thZ2UgKHNlZSBQUiAjMUc0N0dVTSkKKwkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04sIGVsZW1lbnQpKTsKKwkJCQl9CisJCQkJaXNWYWxpZCA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKG5ld05hbWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJCWlzVmFsaWQgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKG5ld05hbWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LklOSVRJQUxJWkVSIDoKKwkJCQlpc1ZhbGlkID0gZmFsc2U7IC8vY2Fubm90IHJlbmFtZSBpbml0aWFsaXplcnMKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWlzVmFsaWQgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKG5ld05hbWUpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUjsKKwkJCQlicmVhazsKKwkJfQorCQorCQlpZiAoIWlzVmFsaWQpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSwgZWxlbWVudCwgbmV3TmFtZSkpOworCQl9CisJfQorCS8qKgorCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHBvc2l0aW9uaW5nIHNpYmxpbmcgc3BlY2lmaWVkIGZvciB0aGUgPGNvZGU+ZWxlbWVudDwvY29kZT4gaXMgZXhpc3RzIGFuZAorCSAqIGl0cyBwYXJlbnQgaXMgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBvZiB0aGlzIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNpYmxpbmcoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlKYXZhRWxlbWVudCBpbnNlcnRCZWZvcmVFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgZkluc2VydEJlZm9yZUVsZW1lbnRzLmdldChlbGVtZW50KTsKKwkJaWYgKGluc2VydEJlZm9yZUVsZW1lbnQgIT0gbnVsbCkgeworCQkJaWYgKCFpbnNlcnRCZWZvcmVFbGVtZW50LmV4aXN0cygpIHx8ICFpbnNlcnRCZWZvcmVFbGVtZW50LmdldFBhcmVudCgpLmVxdWFscyhkZXN0aW5hdGlvbikpIHsKKwkJCQllcnJvcihJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfU0lCTElORywgaW5zZXJ0QmVmb3JlRWxlbWVudCk7CisJCQl9CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9OYW1lTG9va3VwLmphdmEKaW5kZXggMDRiZGZiNi4uYTQyMDE2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTmFtZUxvb2t1cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05hbWVMb29rdXAuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTcsNiArMTcsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKQEAgLTEyMyw3ICsxMjQsNyBAQAogCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IGhhcyBubyBjbGFzc3BhdGguCiAJICovCiAJcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUZyb21Qcm9qZWN0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJd29ya3NwYWNlPSBwcm9qZWN0LmdldEphdmFNb2RlbCgpLmdldFdvcmtzcGFjZSgpOworCQl3b3Jrc3BhY2U9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKIAkJZlBhY2thZ2VGcmFnbWVudFJvb3RzPSAoKEphdmFQcm9qZWN0KSBwcm9qZWN0KS5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwogCQlmUGFja2FnZUZyYWdtZW50cz0gbmV3IEhhc2hNYXAoKTsKIAkJSVBhY2thZ2VGcmFnbWVudFtdIGZyYWdzID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRzSW5Sb290cyhmUGFja2FnZUZyYWdtZW50Um9vdHMsIHByb2plY3QpOwpAQCAtMjczLDcgKzI3NCw3IEBACiAJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBwcm9qZWN0LmdldENsYXNzcGF0aEVudHJ5Rm9yKHBhdGgpOwogCQkJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKIAkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0KLQkJCQkJCQkJcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOworCQkJCQkJCQlwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdC5nZXRSZXNvdXJjZSgpKTsKIAkJCQkJCQlJUGFja2FnZUZyYWdtZW50W10gcGtncyA9IChJUGFja2FnZUZyYWdtZW50W10pIGZQYWNrYWdlRnJhZ21lbnRzLmdldChJUGFja2FnZUZyYWdtZW50LkRFRkFVTFRfUEFDS0FHRV9OQU1FKTsKIAkJCQkJCQlpZiAocGtncyA9PSBudWxsKSB7CiAJCQkJCQkJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTm9uVm9pZE1ldGhvZFJlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvTm9uVm9pZE1ldGhvZFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWU3ZWEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL05vblZvaWRNZXRob2RSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICoJVGhpcyBjbGFzcyBtb2RpZmllcyB0aGUgPGNvZGU+U2VhcmNoYWJsZUVudmlyb25tZW50UmVxdWVzdG9yPC9jb2RlPidzIAotICoJZnVuY3Rpb25hbGl0eSBieSBvbmx5IGFjY2VwdGluZyBtZXRob2RzIHdpdGggcmV0dXJuIHR5cGVzIHRoYXQgYXJlIG5vdCB2b2lkLgotICovCi1wdWJsaWMgY2xhc3MgTm9uVm9pZE1ldGhvZFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3RvciB7Ci0vKioKLSAqIE5vblZvaWRNZXRob2RSZXF1ZXN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSByZXF1ZXN0b3Igb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuSVNlYXJjaFJlcXVlc3RvcgotICovCi1wdWJsaWMgTm9uVm9pZE1ldGhvZFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCXN1cGVyKHJlcXVlc3Rvcik7Ci19Ci1wdWJsaWMgdm9pZCBhY2NlcHRNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLQl0cnkgewotCQlpZiAoIVNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKG1ldGhvZC5nZXRTaWduYXR1cmUoKSkuZXF1YWxzKCJWIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIuYWNjZXB0TWV0aG9kKG1ldGhvZCk7Ci0JCX0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlLmphdmEKaW5kZXggNWUxNjMzNS4uYWIwYjcwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CkBAIC0xNSwyNSArMTUsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQnVmZmVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBsZXRpb25SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuQ29tcGxldGlvbkVuZ2luZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5JU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudDsKQEAgLTgwLDcgKzY5LDcgQEAKIAkvLyByZW1vdmUgZXhpc3RpbmcgKG9sZCkgaW5mb3MKIAlyZW1vdmVJbmZvKCk7CiAJSGFzaE1hcCBuZXdFbGVtZW50cyA9IG5ldyBIYXNoTWFwKDExKTsKLQlpbmZvLnNldElzU3RydWN0dXJlS25vd24oZ2VuZXJhdGVJbmZvcyhpbmZvLCBtb25pdG9yLCBuZXdFbGVtZW50cywgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpKTsKKwlpbmZvLnNldElzU3RydWN0dXJlS25vd24oZ2VuZXJhdGVJbmZvcyhpbmZvLCBtb25pdG9yLCBuZXdFbGVtZW50cywgZ2V0UmVzb3VyY2UoKSkpOwogCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEVsZW1lbnRzT3V0T2ZTeW5jaFdpdGhCdWZmZXJzKCkucmVtb3ZlKHRoaXMpOwogCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0VsZW1lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewogCQlJSmF2YUVsZW1lbnQga2V5ID0gKElKYXZhRWxlbWVudCkgaXRlci5uZXh0KCk7CkBAIC0xMjcsMTEgKzExNiwxMiBAQAogCWlmIChwb3NpdGlvbiA8IC0xIHx8IHBvc2l0aW9uID4gYnVmZmVyLmdldExlbmd0aCgpKSB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOREVYX09VVF9PRl9CT1VORFMpKTsKIAl9Ci0JU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOwotCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9ICgoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCkpLmdldE5hbWVMb29rdXAoKTsKKwlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBnZXRKYXZhUHJvamVjdCgpOworCVNlYXJjaGFibGVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IChTZWFyY2hhYmxlRW52aXJvbm1lbnQpIHByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpOwogCWVudmlyb25tZW50LnVuaXRUb1NraXAgPSB1bml0VG9Ta2lwOwogCi0JQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvcixuYW1lTG9va3VwKSwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCBuZXcgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIocmVxdWVzdG9yLG5hbWVMb29rdXApLCBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksIHByb2plY3QpOwogCWVuZ2luZS5jb21wbGV0ZShjdSwgcG9zaXRpb24sIDApOwogCWVudmlyb25tZW50LnVuaXRUb1NraXAgPSBudWxsOwogfQpAQCAtMTU3LDEwICsxNDcsMTEgQEAKIAl9CiAKIAkvLyBmaXggZm9yIDFGVkdHS0YKLQlJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9ICgoSmF2YVByb2plY3QpZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpZ2V0SmF2YVByb2plY3QoKTsKKwlJU2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IHByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOwogCQogCS8vIGZpeCBmb3IgMUZWWEdESwotCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIEphdmFDb3JlLmdldE9wdGlvbnMoKSk7CisJU2VsZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgcHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKIAllbmdpbmUuc2VsZWN0KGN1LCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCAtIDEpOwogfQogLyoqCkBAIC0zNTMsNiArMzQ0LDggQEAKICAqLwogcHVibGljIHZvaWQgb3BlbihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlpZiAoIWlzT3BlbigpKSB7CisJCS8vIFRPRE86IG5lZWQgdG8gc3luY2hyb25pemUgKElPcGVuYWJsZS5vcGVuKElQcm9ncmVzc01vbml0b3IpIGlzIEFQSQorCQkvLyBUT0RPOiBjb3VsZCB1c2UgZ2V0RWxlbWVudEluZm8gaW5zdGVhZAogCQl0aGlzLm9wZW5XaGVuQ2xvc2VkKHBtKTsKIAl9CiB9CkBAIC0zOTYsOCArMzg5LDcgQEAKIAogCQkvLyAyKSBjcmVhdGUgdGhlIG5ldyBlbGVtZW50IGluZm8gYW5kIG9wZW4gYSBidWZmZXIgaWYgbmVlZGVkCiAJCU9wZW5hYmxlRWxlbWVudEluZm8gaW5mbyA9IGNyZWF0ZUVsZW1lbnRJbmZvKCk7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBpc1NvdXJjZUVsZW1lbnQoKSkgeworCQlpZiAoaXNTb3VyY2VFbGVtZW50KCkpIHsKIAkJCXRoaXMub3BlbkJ1ZmZlcihwbSk7CiAJCX0gCiAKQEAgLTQzNiw4ICs0MjgsMTMgQEAKICAqIFJldHVybnMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBvciBhc3NvY2lhdGVkIGZpbGUgZXhpc3RzCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIHJlc291cmNlRXhpc3RzKCkgewotCQotCXJldHVybiBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHRoaXMuZ2V0UGF0aCgpLCB0cnVlKSAhPSBudWxsOworCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCWlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA2OQorCXJldHVybiAKKwkJSmF2YU1vZGVsLmdldFRhcmdldCgKKwkJCXdvcmtzcGFjZS5nZXRSb290KCksIAorCQkJdGhpcy5nZXRQYXRoKCkubWFrZVJlbGF0aXZlKCksIC8vIGVuc3VyZSBwYXRoIGlzIHJlbGF0aXZlIChzZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjUxNykKKwkJCXRydWUpICE9IG51bGw7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGVFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3BlbmFibGVFbGVtZW50SW5mby5qYXZhCmluZGV4IDk5YjViMmQuLmIwNDJhNTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL09wZW5hYmxlRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PcGVuYWJsZUVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogLyoqIEVsZW1lbnQgaW5mbyBmb3IgSU9wZW5hYmxlIGVsZW1lbnRzLiAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvT3ZlcmZsb3dpbmdMUlVDYWNoZS5qYXZhCmluZGV4IDQ2NTM1ZjYuLjgyYmRhYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL092ZXJmbG93aW5nTFJVQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9PdmVyZmxvd2luZ0xSVUNhY2hlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKaW5kZXggYjkyZDMzZC4uNTIxNGMwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZURlY2xhcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCmluZGV4IDk3YjA1NDcuLjgxNTE3NjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNjcsMTAgKzY3LDEyIEBACiAJCWV4dFR5cGUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCiAJfQogCXRyeSB7CisJCWNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gKChQYWNrYWdlRnJhZ21lbnRSb290KWdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOwogCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkubWVtYmVycygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJSVJlc291cmNlIGNoaWxkID0gbWVtYmVyc1tpXTsKLQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZPTERFUikgeworCQkJaWYgKGNoaWxkLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSCisJCQkJCSYmICFVdGlsLmlzRXhjbHVkZWQoY2hpbGQsIGV4Y2x1c2lvblBhdHRlcm5zKSkgewogCQkJCVN0cmluZyBleHRlbnNpb24gPSBjaGlsZC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOwogCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewogCQkJCQlpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoZXh0VHlwZSkpIHsKQEAgLTIxMCw3ICsyMTIsNyBAQAogCQkvLyBXZSBkb24ndCB3YW50IHRvIHNob3cgbm9uIGphdmEgcmVzb3VyY2VzIG9mIHRoZSBkZWZhdWx0IHBhY2thZ2UgKHNlZSBQUiAjMUc1OE5COCkKIAkJcmV0dXJuIEphdmFFbGVtZW50SW5mby5OT19OT05fSkFWQV9SRVNPVVJDRVM7CiAJfSBlbHNlIHsKLQkJcmV0dXJuICgoUGFja2FnZUZyYWdtZW50SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuZ2V0Tm9uSmF2YVJlc291cmNlcyhnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7CisJCXJldHVybiAoKFBhY2thZ2VGcmFnbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0UmVzb3VyY2UoKSwgKFBhY2thZ2VGcmFnbWVudFJvb3QpZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpKTsKIAl9CiB9CiAvKioKQEAgLTMwNyw2ICszMDksMTAgQEAKIAl9CiAJZ2V0SmF2YU1vZGVsKCkubW92ZShlbGVtZW50cywgY29udGFpbmVycywgc2libGluZ3MsIHJlbmFtaW5ncywgZm9yY2UsIG1vbml0b3IpOwogfQorcHJvdGVjdGVkIHZvaWQgb3BlbldoZW5DbG9zZWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCF0aGlzLnJlc291cmNlRXhpc3RzKCkpIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwlzdXBlci5vcGVuV2hlbkNsb3NlZChwbSk7Cit9CiAvKioKICAqIFJlY29tcHV0ZXMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUKICAqIG9mIHRoZSB3b3JrYmVuY2guCkBAIC0zMTQsNyArMzIwLDcgQEAKIHB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKIAl0cnkgewogCQlPcGVuYWJsZUVsZW1lbnRJbmZvIGluZm89IChPcGVuYWJsZUVsZW1lbnRJbmZvKWdldEVsZW1lbnRJbmZvKCk7Ci0JCWNvbXB1dGVDaGlsZHJlbihpbmZvLCBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7CisJCWNvbXB1dGVDaGlsZHJlbihpbmZvLCBnZXRSZXNvdXJjZSgpKTsKIAl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkvLyBkbyBub3RoaW5nLgogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudEluZm8uamF2YQppbmRleCA4NWQwZjdhLi4wYWRkMzkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50SW5mby5qYXZhCkBAIC0xLDE4ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiAKIC8qKgogICogRWxlbWVudCBpbmZvIGZvciBQYWNrYWdlRnJhZ21lbnRzLgpAQCAtMzEsNTggKzMxLDYgQEAKIAlmTm9uSmF2YVJlc291cmNlcyA9IG51bGw7CiB9CiAvKioKLSAqIENvbXB1dGUgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQuCi0gKgotICogPHA+UGFja2FnZSBmcmFnbWVudHMgd2hpY2ggYXJlIGZvbGRlcnMgcmVjb2duaXplIGZpbGVzIGJhc2VkIG9uIHRoZQotICogdHlwZSBvZiB0aGUgZnJhZ21lbnQKLSAqIDxwPlBhY2thZ2UgZnJhZ21lbnRzIHdoaWNoIGFyZSBpbiBhIGphciBvbmx5IHJlY29nbml6ZSAuY2xhc3MgZmlsZXMgKAotICogQHNlZSBKYXJQYWNrYWdlRnJhZ21lbnQpLgotICovCi1wcml2YXRlIE9iamVjdFtdIGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlWzVdOwotCWludCBub25KYXZhUmVzb3VyY2VzQ291bnRlciA9IDA7Ci0JdHJ5ewotCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJSVJlc291cmNlIGNoaWxkID0gbWVtYmVyc1tpXTsKLQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQkJaWYgKCFVdGlsLmlzVmFsaWRDb21waWxhdGlvblVuaXROYW1lKGZpbGVOYW1lKSAmJiAhVXRpbC5pc1ZhbGlkQ2xhc3NGaWxlTmFtZShmaWxlTmFtZSkpIHsKLQkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7Ci0JCQkJCQkvLyByZXNpemUKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoCi0JCQkJCQkJbm9uSmF2YVJlc291cmNlcywKLQkJCQkJCQkwLAotCQkJCQkJCShub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtub25KYXZhUmVzb3VyY2VzQ291bnRlciAqIDJdKSwKLQkJCQkJCQkwLAotCQkJCQkJCW5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKLQkJCQkJfQotCQkJCQlub25KYXZhUmVzb3VyY2VzW25vbkphdmFSZXNvdXJjZXNDb3VudGVyKytdID0gY2hpbGQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCWlmICghVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggPT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKLQkJCQkJCS8vIHJlc2l6ZQotCQkJCQkJU3lzdGVtLmFycmF5Y29weShub25KYXZhUmVzb3VyY2VzLCAwLCAobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKLQkJCQkJfQotCQkJCQlub25KYXZhUmVzb3VyY2VzW25vbkphdmFSZXNvdXJjZXNDb3VudGVyKytdID0gY2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChub25KYXZhUmVzb3VyY2VzQ291bnRlciA9PSAwKSB7Ci0JCQlub25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwotCQl9IGVsc2UgewotCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoICE9IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShub25KYXZhUmVzb3VyY2VzLCAwLCAobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXJdKSwgMCwgbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpOwotCQkJfQotCQl9CQotCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCW5vbkphdmFSZXNvdXJjZXMgPSBOT19OT05fSkFWQV9SRVNPVVJDRVM7Ci0JCW5vbkphdmFSZXNvdXJjZXNDb3VudGVyID0gMDsKLQl9Ci0JcmV0dXJuIG5vbkphdmFSZXNvdXJjZXM7Ci19Ci0vKioKICAqLwogYm9vbGVhbiBjb250YWluc0phdmFSZXNvdXJjZXMoKSB7CiAJcmV0dXJuIGZDaGlsZHJlbi5sZW5ndGggIT0gMDsKQEAgLTkwLDEwICszOCwxNyBAQAogLyoqCiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCi1PYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UpIHsKK09iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSwgUGFja2FnZUZyYWdtZW50Um9vdCByb290SGFuZGxlKSB7CiAJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IGZOb25KYXZhUmVzb3VyY2VzOwogCWlmIChub25KYXZhUmVzb3VyY2VzID09IG51bGwpIHsKLQkJbm9uSmF2YVJlc291cmNlcyA9IGNvbXB1dGVOb25KYXZhUmVzb3VyY2VzKHVuZGVybHlpbmdSZXNvdXJjZSk7CisJCXRyeSB7CisJCQlub25KYXZhUmVzb3VyY2VzID0gCisJCQkJUGFja2FnZUZyYWdtZW50Um9vdEluZm8uY29tcHV0ZUZvbGRlck5vbkphdmFSZXNvdXJjZXMoCisJCQkJCShKYXZhUHJvamVjdClyb290SGFuZGxlLmdldEphdmFQcm9qZWN0KCksIAorCQkJCQkoSUNvbnRhaW5lcil1bmRlcmx5aW5nUmVzb3VyY2UsIAorCQkJCQlyb290SGFuZGxlLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KIAkJZk5vbkphdmFSZXNvdXJjZXMgPSBub25KYXZhUmVzb3VyY2VzOwogCX0KIAlyZXR1cm4gbm9uSmF2YVJlc291cmNlczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3QuamF2YQppbmRleCAwYWZmMzM4Li40YTg0ODhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCkBAIC0xLDMzICsxLDI5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKQEAgLTM1LDMyICszMSwxNjYgQEAKIHB1YmxpYyBjbGFzcyBQYWNrYWdlRnJhZ21lbnRSb290IGV4dGVuZHMgT3BlbmFibGUgaW1wbGVtZW50cyBJUGFja2FnZUZyYWdtZW50Um9vdCB7CiAKIAkvKioKLQkgKiBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9vdC4KLQkgKiBAc2VlIElSZXNvdXJjZQorCSAqIFRoZSBkZWxpbWl0ZXIgYmV0d2VlbiB0aGUgc291cmNlIHBhdGggYW5kIHJvb3QgcGF0aCBpbiB0aGUKKwkgKiBhdHRhY2htZW50IHNlcnZlciBwcm9wZXJ0eS4KIAkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGZSZXNvdXJjZTsKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXIgQVRUQUNITUVOVF9QUk9QRVJUWV9ERUxJTUlURVI9ICcqJzsKKwkvKgorCSAqIE5vIHNvdXJjZSBhdHRhY2htZW50IHByb3BlcnR5CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTk9fU09VUkNFX0FUVEFDSE1FTlQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCS8qCisJICogTm8gc291cmNlIG1hcHBlciBzaW5nbGV0b24KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFNvdXJjZU1hcHBlciBOT19TT1VSQ0VfTUFQUEVSID0gbmV3IFNvdXJjZU1hcHBlcigpOworCisJLyoqCisJICogVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvb3QuCisJICogKGFuIElSZXNvdXJjZSBvciBhIGphdmEuaW8uRmlsZSAoZm9yIGV4dGVybmFsIGphciBvbmx5KSkKKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IHJlc291cmNlOworCQogLyoqCiAgKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCByb290IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBqYXZhIHBhY2thZ2UKICAqIGRpcmVjdG9yeSBoaWVyYXJjaHkuCiAgKi8KLXByb3RlY3RlZCBQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQl0aGlzKHJlc291cmNlLCBwcm9qZWN0LCByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JZlJlc291cmNlID0gcmVzb3VyY2U7Citwcm90ZWN0ZWQgUGFja2FnZUZyYWdtZW50Um9vdChJUmVzb3VyY2UgcmVzb3VyY2UsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKFBBQ0tBR0VfRlJBR01FTlRfUk9PVCwgcHJvamVjdCwgbmFtZSk7CisJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwogfQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgcGFja2FnZSBmcmFnbWVudCByb290IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBqYXZhIHBhY2thZ2UKLSAqIGRpcmVjdG9yeSBoaWVyYXJjaHkuCi0gKi8KLXByb3RlY3RlZCBQYWNrYWdlRnJhZ21lbnRSb290KElSZXNvdXJjZSByZXNvdXJjZSwgSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYXRoKSB7Ci0Jc3VwZXIoUEFDS0FHRV9GUkFHTUVOVF9ST09ULCBwcm9qZWN0LCBwYXRoKTsKLQlmUmVzb3VyY2UgPSByZXNvdXJjZTsKLX0KKwogLyoqCiAgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CiAgKi8KLXB1YmxpYyB2b2lkIGF0dGFjaFNvdXJjZShJUGF0aCB6aXBQYXRoLCBJUGF0aCByb290UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIHRoaXMpKTsKK3B1YmxpYyB2b2lkIGF0dGFjaFNvdXJjZShJUGF0aCBzb3VyY2VQYXRoLCBJUGF0aCByb290UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0cnkgeworCQl2ZXJpZnlBdHRhY2hTb3VyY2Uoc291cmNlUGF0aCk7CisJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKFV0aWwuYmluZCgiZWxlbWVudC5hdHRhY2hpbmdTb3VyY2UiKSwgMik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTb3VyY2VNYXBwZXIgb2xkTWFwcGVyPSBnZXRTb3VyY2VNYXBwZXIoKTsKKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCWJvb2xlYW4gcm9vdE5lZWRzVG9CZUNsb3NlZD0gZmFsc2U7CisKKwkJaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkgeworCQkJLy9zb3VyY2UgYmVpbmcgZGV0YWNoZWQKKwkJCXJvb3ROZWVkc1RvQmVDbG9zZWQ9IHRydWU7CisJCQlzZXRTb3VyY2VNYXBwZXIobnVsbCk7CisJCS8qIERpc2FibGUgZGVsdGFzIChzZWUgMUdEVFVTRCkKKwkJCS8vIGZpcmUgYSBkZWx0YSB0byBub3RpZnkgdGhlIFVJIGFib3V0IHRoZSBzb3VyY2UgZGV0YWNoZW1lbnQuCisJCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSAoSmF2YU1vZGVsTWFuYWdlcikgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQlKYXZhTW9kZWwgbW9kZWwgPSAoSmF2YU1vZGVsKSBnZXRKYXZhTW9kZWwoKTsKKwkJCUphdmFFbGVtZW50RGVsdGEgYXR0YWNoZWRTb3VyY2VEZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKG1vZGVsKTsKKwkJCWF0dGFjaGVkU291cmNlRGVsdGEgLnNvdXJjZURldGFjaGVkKHRoaXMpOyAvLyB0aGlzIHdvdWxkIGJlIGEgUGFja2FnZUZyYWdtZW50Um9vdAorCQkJbWFuYWdlci5yZWdpc3RlclJlc291cmNlRGVsdGEoYXR0YWNoZWRTb3VyY2VEZWx0YSApOworCQkJbWFuYWdlci5maXJlKCk7IC8vIG1heWJlIHlvdSB3YW50IHRvIGZpcmUgdGhlIGNoYW5nZSBsYXRlci4gTGV0IHVzIGtub3cgYWJvdXQgaXQuCisJCSovCisJCX0gZWxzZSB7CisJCS8qCisJCQkvLyBmaXJlIGEgZGVsdGEgdG8gbm90aWZ5IHRoZSBVSSBhYm91dCB0aGUgc291cmNlIGF0dGFjaGVtZW50LgorCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gKEphdmFNb2RlbE1hbmFnZXIpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJSmF2YU1vZGVsIG1vZGVsID0gKEphdmFNb2RlbCkgZ2V0SmF2YU1vZGVsKCk7CisJCQlKYXZhRWxlbWVudERlbHRhIGF0dGFjaGVkU291cmNlRGVsdGEgPSBuZXcgSmF2YUVsZW1lbnREZWx0YShtb2RlbCk7CisJCQlhdHRhY2hlZFNvdXJjZURlbHRhIC5zb3VyY2VBdHRhY2hlZCh0aGlzKTsgLy8gdGhpcyB3b3VsZCBiZSBhIFBhY2thZ2VGcmFnbWVudFJvb3QKKwkJCW1hbmFnZXIucmVnaXN0ZXJSZXNvdXJjZURlbHRhKGF0dGFjaGVkU291cmNlRGVsdGEgKTsKKwkJCW1hbmFnZXIuZmlyZSgpOyAvLyBtYXliZSB5b3Ugd2FudCB0byBmaXJlIHRoZSBjaGFuZ2UgbGF0ZXIuIExldCB1cyBrbm93IGFib3V0IGl0LgorCQkgKi8KKworCQkJLy9jaGVjayBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBhdHRhY2htZW50CisJCQlJUGF0aCBzdG9yZWRTb3VyY2VQYXRoPSBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworCQkJSVBhdGggc3RvcmVkUm9vdFBhdGg9IGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJfQorCQkJaWYgKHN0b3JlZFNvdXJjZVBhdGggIT0gbnVsbCkgeworCQkJCWlmICghKHN0b3JlZFNvdXJjZVBhdGguZXF1YWxzKHNvdXJjZVBhdGgpICYmIChyb290UGF0aCAhPSBudWxsICYmIHJvb3RQYXRoLmVxdWFscyhzdG9yZWRSb290UGF0aCkpIHx8IHN0b3JlZFJvb3RQYXRoID09IG51bGwpKSB7CisJCQkJCXJvb3ROZWVkc1RvQmVDbG9zZWQ9IHRydWU7CisJCQkJfQorCQkJfQorCQkJLy8gY2hlY2sgaWYgc291cmNlIHBhdGggaXMgdmFsaWQKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZS5nZXRSb290KCksIHNvdXJjZVBhdGgsIGZhbHNlKTsKKwkJCWlmICh0YXJnZXQgPT0gbnVsbCkgeworCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJfQorCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCwgc291cmNlUGF0aCkpOworCQkJfQorCQkJU291cmNlTWFwcGVyIG1hcHBlciA9IGNyZWF0ZVNvdXJjZU1hcHBlcihzb3VyY2VQYXRoLCByb290UGF0aCk7CisJCQlpZiAocm9vdFBhdGggPT0gbnVsbCAmJiBtYXBwZXIucm9vdFBhdGggIT0gbnVsbCkgeworCQkJCS8vIGFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGUgU291cmNlTWFwcGVyIGNvbnN0cnVjdG9yLCB0aGUgcm9vdCBwYXRoIHdhcyBjb21wdXRlZAorCQkJCXJvb3RQYXRoID0gbmV3IFBhdGgobWFwcGVyLnJvb3RQYXRoKTsKKwkJCX0KKwkJCXNldFNvdXJjZU1hcHBlcihtYXBwZXIpOworCQl9CisJCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKKwkJCXNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShudWxsKTsgLy9yZW1vdmUgdGhlIHByb3BlcnR5CisJCX0gZWxzZSB7CisJCQkvL3NldCB0aGUgcHJvcGVydHkgdG8gdGhlIHBhdGggb2YgdGhlIG1hcHBlZCBzb3VyY2UKKwkJCXNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eSgKKwkJCQlzb3VyY2VQYXRoLnRvU3RyaW5nKCkgCisJCQkJKyAocm9vdFBhdGggPT0gbnVsbCA/ICIiIDogKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSICsgcm9vdFBhdGgudG9TdHJpbmcoKSkpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChyb290TmVlZHNUb0JlQ2xvc2VkKSB7CisJCQlpZiAob2xkTWFwcGVyICE9IG51bGwpIHsKKwkJCQlvbGRNYXBwZXIuY2xvc2UoKTsKKwkJCX0KKwkJCUJ1ZmZlck1hbmFnZXIgbWFuYWdlcj0gQnVmZmVyTWFuYWdlci5nZXREZWZhdWx0QnVmZmVyTWFuYWdlcigpOworCQkJRW51bWVyYXRpb24gb3BlbkJ1ZmZlcnM9IG1hbmFnZXIuZ2V0T3BlbkJ1ZmZlcnMoKTsKKwkJCXdoaWxlIChvcGVuQnVmZmVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCUlCdWZmZXIgYnVmZmVyPSAoSUJ1ZmZlcikgb3BlbkJ1ZmZlcnMubmV4dEVsZW1lbnQoKTsKKwkJCQlJT3BlbmFibGUgcG9zc2libGVNZW1iZXI9IGJ1ZmZlci5nZXRPd25lcigpOworCQkJCWlmIChpc0FuY2VzdG9yT2YoKElKYXZhRWxlbWVudCkgcG9zc2libGVNZW1iZXIpKSB7CisJCQkJCWJ1ZmZlci5jbG9zZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCX0KKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCXNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShudWxsKTsgLy8gbG9vc2UgaW5mbyAtIHdpbGwgYmUgcmVjb21wdXRlZAorCQl0aHJvdyBlOworCX0gZmluYWxseSB7CisJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfQogfQorCitTb3VyY2VNYXBwZXIgY3JlYXRlU291cmNlTWFwcGVyKElQYXRoIHNvdXJjZVBhdGgsIElQYXRoIHJvb3RQYXRoKSB7CisJU291cmNlTWFwcGVyIG1hcHBlciA9IG5ldyBTb3VyY2VNYXBwZXIoCisJCXNvdXJjZVBhdGgsIAorCQlyb290UGF0aCA9PSBudWxsID8gbnVsbCA6IHJvb3RQYXRoLnRvT1NTdHJpbmcoKSwgCisJCXRoaXMuaXNFeHRlcm5hbCgpID8gSmF2YUNvcmUuZ2V0T3B0aW9ucygpIDogdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpOyAvLyBvbmx5IHByb2plY3Qgb3B0aW9ucyBpZiBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UKKwlyZXR1cm4gbWFwcGVyOworfQorLyoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QjZGVsZXRlCisgKi8KK3B1YmxpYyB2b2lkIGRlbGV0ZSgKKwlpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywKKwlpbnQgdXBkYXRlTW9kZWxGbGFncywKKwlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisKKwlEZWxldGVQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uIG9wID0gbmV3IERlbGV0ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24odGhpcywgdXBkYXRlUmVzb3VyY2VGbGFncywgdXBkYXRlTW9kZWxGbGFncyk7CisJcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKK30KKworLyoqCisgKiBUaGlzIHJvb3QgaXMgYmVpbmcgY2xvc2VkLiAgSWYgdGhpcyByb290IGhhcyBhbiBhc3NvY2lhdGVkIHNvdXJjZSBhdHRhY2htZW50LCAKKyAqIGNsb3NlIGl0IHRvby4KKyAqCisgKiBAc2VlIEphdmFFbGVtZW50CisgKi8KK3Byb3RlY3RlZCB2b2lkIGNsb3NpbmcoT2JqZWN0IGluZm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVNvdXJjZU1hcHBlciBtYXBwZXI9IGdldFNvdXJjZU1hcHBlcigpOworCWlmIChtYXBwZXIgIT0gbnVsbCkgeworCQltYXBwZXIuY2xvc2UoKTsKKwl9CisJc3VwZXIuY2xvc2luZyhpbmZvKTsKK30KKwogLyoqCiAgKiBDb21wdXRlIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNoaWxkcmVuIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290LgogICogCkBAIC03MCw5ICsyMDAsMTEgQEAKIAl0cnkgewogCQkvLyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBtYXkgYmUgYSBmb2xkZXIgb3IgYSBwcm9qZWN0IChpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9qZWN0IGZvbGRlcgogCQkvLyBpcyBhY3R1YWxseSB0aGUgcGFja2FnZSBmcmFnbWVudCByb290KQotCQlpZiAoZlJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSIHx8IGZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKKwkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKKwkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewogCQkJQXJyYXlMaXN0IHZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCQljb21wdXRlRm9sZGVyQ2hpbGRyZW4oKElDb250YWluZXIpIGZSZXNvdXJjZSwgIiIsIHZDaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKKwkJCWNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOworCQkJY29tcHV0ZUZvbGRlckNoaWxkcmVuKChJQ29udGFpbmVyKSByZXNvdXJjZSwgIiIsIHZDaGlsZHJlbiwgZXhjbHVzaW9uUGF0dGVybnMpOyAvLyROT04tTkxTLTEkCiAJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IG5ldyBJSmF2YUVsZW1lbnRbdkNoaWxkcmVuLnNpemUoKV07CiAJCQl2Q2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7CiAJCQlpbmZvLnNldENoaWxkcmVuKGNoaWxkcmVuKTsKQEAgLTg0LDMzICsyMTYsMzUgQEAKIAl9CiAJcmV0dXJuIHRydWU7CiB9CisKIC8qKgotICogU3RhcnRpbmcgYXQgdGhpcyBmb2xkZXIsIGNyZWF0ZSBwYWNrYWdlIGZyYWdtZW50cyBhbmQgYWRkIHRoZSBmcmFnbWVudHMgdG8gdGhlIGNvbGxlY3Rpb24KLSAqIG9mIGNoaWxkcmVuLgorICogU3RhcnRpbmcgYXQgdGhpcyBmb2xkZXIsIGNyZWF0ZSBwYWNrYWdlIGZyYWdtZW50cyBhbmQgYWRkIHRoZSBmcmFnbWVudHMgdGhhdCBhcmUgbm90IGV4Y2x1c2VkCisgKiB0byB0aGUgY29sbGVjdGlvbiBvZiBjaGlsZHJlbi4KICAqIAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IGRvZXMgbm90IGV4aXN0CiAgKi8KLXByb3RlY3RlZCB2b2lkIGNvbXB1dGVGb2xkZXJDaGlsZHJlbihJQ29udGFpbmVyIGZvbGRlciwgU3RyaW5nIHByZWZpeCwgQXJyYXlMaXN0IHZDaGlsZHJlbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRm9sZGVyQ2hpbGRyZW4oSUNvbnRhaW5lciBmb2xkZXIsIFN0cmluZyBwcmVmaXgsIEFycmF5TGlzdCB2Q2hpbGRyZW4sIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudChwcmVmaXgpOwogCXZDaGlsZHJlbi5hZGQocGtnKTsKIAl0cnkgewotCQlJUGF0aCBvdXRwdXRMb2NhdGlvblBhdGggPSBnZXRKYXZhUHJvamVjdCgpLmdldE91dHB1dExvY2F0aW9uKCk7CisJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KWdldEphdmFQcm9qZWN0KCk7CiAJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBmb2xkZXIubWVtYmVycygpOwogCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogCQkJSVJlc291cmNlIG1lbWJlciA9IG1lbWJlcnNbaV07CiAJCQlTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlci5nZXROYW1lKCk7CiAJCQlpZiAobWVtYmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSIAotCQkJCSYmIFV0aWwuaXNWYWxpZEZvbGRlck5hbWVGb3JQYWNrYWdlKG1lbWJlck5hbWUpKSB7CisJCQkJJiYgVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UobWVtYmVyTmFtZSkKKwkJCQkmJiAhVXRpbC5pc0V4Y2x1ZGVkKG1lbWJlciwgZXhjbHVzaW9uUGF0dGVybnMpKSB7CiAJCQkJCQotCQkJCVN0cmluZyBuZXdQcmVmaXg7Ci0JCQkJaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW5ld1ByZWZpeCA9IG1lbWJlck5hbWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmV3UHJlZml4ID0gcHJlZml4ICsgIi4iICsgbWVtYmVyTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KIAkJCQkvLyBlbGltaW5hdGUgYmluYXJ5IG91dHB1dCBvbmx5IGlmIG5lc3RlZCBpbnNpZGUgZGlyZWN0IHN1YmZvbGRlcnMKLQkJCQlpZiAoIW1lbWJlci5nZXRGdWxsUGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvblBhdGgpKSB7Ci0JCQkJCWNvbXB1dGVGb2xkZXJDaGlsZHJlbigoSUZvbGRlcikgbWVtYmVyLCBuZXdQcmVmaXgsIHZDaGlsZHJlbik7CisJCQkJaWYgKGphdmFQcm9qZWN0LmNvbnRhaW5zKG1lbWJlcikpIHsKKwkJCQkJU3RyaW5nIG5ld1ByZWZpeDsKKwkJCQkJaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQluZXdQcmVmaXggPSBtZW1iZXJOYW1lOworCQkJCQl9IGVsc2UgeworCQkJCQkJbmV3UHJlZml4ID0gcHJlZml4ICsgIi4iICsgbWVtYmVyTmFtZTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWNvbXB1dGVGb2xkZXJDaGlsZHJlbigoSUZvbGRlcikgbWVtYmVyLCBuZXdQcmVmaXgsIHZDaGlsZHJlbiwgZXhjbHVzaW9uUGF0dGVybnMpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTIwLDEyICsyNTQsNTEgQEAKIAkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAl9CiB9CisvKgorICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHNvdXJjZSBhdHRhY2htZW50IHJvb3QgcGF0aCBmb3IgdGhlIGdpdmVuIHNvdXJjZSBhdHRhY2htZW50IHBhdGguCisgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY291bGQgYmUgZm91bmQuCisgKiAKKyAqIEBwYXJhbSBzb3VyY2VBdHRhY2htZW50UGF0aCB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyCisgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGggb3IgPGNvZGU+bnVsbDwvY2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kCisgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgorICovCitwdWJsaWMgSVBhdGggY29tcHV0ZVNvdXJjZUF0dGFjaG1lbnRSb290UGF0aChJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVBhdGggc291cmNlUGF0aCA9IHRoaXMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKKwlpZiAoc291cmNlUGF0aCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwlTb3VyY2VNYXBwZXIgbWFwcGVyID0gCisJCW5ldyBTb3VyY2VNYXBwZXIoCisJCXNvdXJjZVBhdGgsIAorCQludWxsLCAvLyBkZXRlY3Qgcm9vdCBwYXRoCisJCXRoaXMuaXNFeHRlcm5hbCgpID8gSmF2YUNvcmUuZ2V0T3B0aW9ucygpIDogdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkgLy8gb25seSBwcm9qZWN0IG9wdGlvbnMgaWYgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlCisJKTsKKwlpZiAobWFwcGVyLnJvb3RQYXRoID09IG51bGwpIHJldHVybiBudWxsOworCXJldHVybiBuZXcgUGF0aChtYXBwZXIucm9vdFBhdGgpOworfQorLyoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QjY29weQorICovCitwdWJsaWMgdm9pZCBjb3B5KAorCUlQYXRoIGRlc3RpbmF0aW9uLAorCWludCB1cGRhdGVSZXNvdXJjZUZsYWdzLAorCWludCB1cGRhdGVNb2RlbEZsYWdzLAorCUlDbGFzc3BhdGhFbnRyeSBzaWJsaW5nLAorCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJQ29weVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24gb3AgPSAKKwkJbmV3IENvcHlQYWNrYWdlRnJhZ21lbnRSb290T3BlcmF0aW9uKHRoaXMsIGRlc3RpbmF0aW9uLCB1cGRhdGVSZXNvdXJjZUZsYWdzLCB1cGRhdGVNb2RlbEZsYWdzLCBzaWJsaW5nKTsKKwlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOworfQorCisKKwogLyoqCiAgKiBSZXR1cm5zIGEgbmV3IGVsZW1lbnQgaW5mbyBmb3IgdGhpcyBlbGVtZW50LgogICovCiBwcm90ZWN0ZWQgT3BlbmFibGVFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbygpIHsKIAlyZXR1cm4gbmV3IFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKCk7CiB9CisKIC8qKgogICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAogICovCkBAIC0xMzQsNiArMzA3LDcgQEAKIAlydW5PcGVyYXRpb24ob3AsIG1vbml0b3IpOwogCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQobmFtZSk7CiB9CisKIC8qKgogICogUmV0dXJucyB0aGUgcm9vdCdzIGtpbmQgLSBLX1NPVVJDRSBvciBLX0JJTkFSWSwgZGVmYXVsdHMKICAqIHRvIEtfU09VUkNFIGlmIGl0IGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLgpAQCAtMTUxLDYgKzMyNSw3IEBACiAJfQogCXJldHVybiBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKIH0KKwogLyoqCiAgKiBDb21wYXJlcyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHk7CiAgKiBmb3IgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT5zLCBlcXVhbGl0eSBpcyBoYXZpbmcgdGhlCkBAIC0xNjQsNyArMzM5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCVBhY2thZ2VGcmFnbWVudFJvb3Qgb3RoZXIgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgbzsKIAlyZXR1cm4gZ2V0SmF2YU1vZGVsKCkuZXF1YWxzKG90aGVyLmdldEphdmFNb2RlbCgpKSAmJiAKLQkJCWZSZXNvdXJjZS5lcXVhbHMob3RoZXIuZlJlc291cmNlKSAmJgorCQkJdGhpcy5yZXNvdXJjZS5lcXVhbHMob3RoZXIucmVzb3VyY2UpICYmCiAJCQlmT2NjdXJyZW5jZUNvdW50ID09IG90aGVyLmZPY2N1cnJlbmNlQ291bnQ7CiB9CiAKQEAgLTE3MiwxMSArMzQ3LDEwMSBAQAogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwogcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCiAJcmV0dXJuIHN1cGVyLmV4aXN0cygpIAogCQkJCSYmIGlzT25DbGFzc3BhdGgoKTsKIH0KKworcHVibGljIElDbGFzc3BhdGhFbnRyeSBmaW5kU291cmNlQXR0YWNobWVudFJlY29tbWVuZGF0aW9uKCkgeworCXRyeSB7CisJCUlQYXRoIHJvb3RQYXRoID0gdGhpcy5nZXRQYXRoKCk7CisJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeTsKKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAJCQorCQkvLyB0cnkgb24gZW5jbG9zaW5nIHByb2plY3QgZmlyc3QKKwkJSmF2YVByb2plY3QgcGFyZW50UHJvamVjdCA9IChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKTsKKwkJdHJ5IHsKKwkJCWVudHJ5ID0gcGFyZW50UHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihyb290UGF0aCk7CisJCQlpZiAoZW50cnkgIT0gbnVsbCl7CisJCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgdHJ1ZSk7CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKXsKKwkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgdGFyZ2V0OworCQkJCQlpZiAoVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShmaWxlLmdldE5hbWUoKSkpeworCQkJCQkJcmV0dXJuIGVudHJ5OworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQkJCXJldHVybiBlbnRyeTsKKwkJCQl9CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSl7CisJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0OworCQkJCQlpZiAoZmlsZS5pc0ZpbGUoKSkgeworCQkJCQkJaWYgKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZmlsZS5nZXROYW1lKCkpKXsKKwkJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBleHRlcm5hbCBkaXJlY3RvcnkKKwkJCQkJCXJldHVybiBlbnRyeTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSl7CisJCX0KKwkJCisJCS8vIGl0ZXJhdGUgb3ZlciBhbGwgcHJvamVjdHMKKwkJSUphdmFNb2RlbCBtb2RlbCA9IGdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3RbXSBqUHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGpQcm9qZWN0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7CisJCQlKYXZhUHJvamVjdCBqUHJvamVjdCA9IChKYXZhUHJvamVjdCkgalByb2plY3RzW2ldOworCQkJaWYgKGpQcm9qZWN0ID09IHBhcmVudFByb2plY3QpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IGRvbmUKKwkJCXRyeSB7CisJCQkJZW50cnkgPSBqUHJvamVjdC5nZXRDbGFzc3BhdGhFbnRyeUZvcihyb290UGF0aCk7CisJCQkJaWYgKGVudHJ5ICE9IG51bGwpeworCQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLCB0cnVlKTsKKwkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKXsKKwkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHRhcmdldDsKKwkJCQkJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKGZpbGUuZ2V0TmFtZSgpKSl7CisJCQkJCQkJcmV0dXJuIGVudHJ5OworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkJCXJldHVybiBlbnRyeTsKKwkJCQkJfQorCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKXsKKwkJCQkJCWphdmEuaW8uRmlsZSBmaWxlID0gKGphdmEuaW8uRmlsZSkgdGFyZ2V0OworCQkJCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKKwkJCQkJCQlpZiAoVXRpbC5pc0FyY2hpdmVGaWxlTmFtZShmaWxlLmdldE5hbWUoKSkpeworCQkJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBleHRlcm5hbCBkaXJlY3RvcnkKKwkJCQkJCQlyZXR1cm4gZW50cnk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJCX0KKwkJfQorCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeworCX0KKworCXJldHVybiBudWxsOworfQorCisvKgorICogUmV0dXJucyB0aGUgZXhjbHVzaW9uIHBhdHRlcm5zIGZyb20gdGhlIGNsYXNzcGF0aCBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290LgorICovCitjaGFyW11bXSBmdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCkgeworCXRyeSB7CisJCWlmICh0aGlzLmlzT3BlbigpICYmIHRoaXMuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSByZXR1cm4gbnVsbDsKKwkJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoQ2xhc3NwYXRoRW50cnkpZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKKwkJaWYgKGVudHJ5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGVudHJ5LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7IAorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CQkKKwogLyoqCiAgKiBAc2VlIE9wZW5hYmxlCiAgKi8KQEAgLTE4NSw2ICs0NTAsNyBAQAogCSgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGluZm8pLnNldFJvb3RLaW5kKGRldGVybWluZUtpbmQodW5kZXJseWluZ1Jlc291cmNlKSk7CiAJcmV0dXJuIGNvbXB1dGVDaGlsZHJlbihpbmZvKTsKIH0KKwogLyoqCiAgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQogICovCkBAIC0xOTIsMjMgKzQ1OCw1OSBAQAogCXJldHVybiBKYXZhRWxlbWVudC5KRU1fUEFDS0FHRUZSQUdNRU5UUk9PVDsKIH0KIC8qKgorICogQHNlZSBKYXZhRWxlbWVudCNnZXRIYW5kbGVNZW1lbnRvKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRIYW5kbGVNZW1lbnRvKCl7CisJSVBhdGggcGF0aDsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOworCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCS8vIGludGVybmFsIGphciBvciByZWd1bGFyIHJvb3QKKwkJaWYgKGdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmVxdWFscyhnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKKwkJCXBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJCX0gZWxzZSB7CisJCQlwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIGV4dGVybmFsIGphcgorCQlwYXRoID0gZ2V0UGF0aCgpOworCX0KKwlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcigoKEphdmFFbGVtZW50KWdldFBhcmVudCgpKS5nZXRIYW5kbGVNZW1lbnRvKCkpOworCWJ1ZmYuYXBwZW5kKGdldEhhbmRsZU1lbWVudG9EZWxpbWl0ZXIoKSk7CisJYnVmZi5hcHBlbmQocGF0aC50b1N0cmluZygpKTsgCisJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKK30KKy8qKgogICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAogICovCiBwdWJsaWMgaW50IGdldEtpbmQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlyZXR1cm4gKChQYWNrYWdlRnJhZ21lbnRSb290SW5mbylnZXRFbGVtZW50SW5mbygpKS5nZXRSb290S2luZCgpOwogfQorCiAvKioKICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLWphdmEgcmVzb3VyY2VzIGNvbnRhaW5lZCBpbiB0aGUgcmVjZWl2ZXIuCiAgKi8KIHB1YmxpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuICgoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGdldEVsZW1lbnRJbmZvKCkpLmdldE5vbkphdmFSZXNvdXJjZXMoZ2V0SmF2YVByb2plY3QoKSwgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOworCXJldHVybiAoKFBhY2thZ2VGcmFnbWVudFJvb3RJbmZvKSBnZXRFbGVtZW50SW5mbygpKS5nZXROb25KYXZhUmVzb3VyY2VzKGdldEphdmFQcm9qZWN0KCksIGdldFJlc291cmNlKCksIHRoaXMpOwogfQorCiAvKioKICAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKICAqLwogcHVibGljIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSkgeworCWlmIChwYWNrYWdlTmFtZS5pbmRleE9mKCcgJykgIT0gLTEpIHsgLy8gdG9sZXJhdGUgcGFja2FnZSBuYW1lcyB3aXRoIHNwYWNlcyAoZS5nLiAneCAuIHknKSAoaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5NTcpCisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IFV0aWwudG9Db21wb3VuZENoYXJzKHBhY2thZ2VOYW1lKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocGFja2FnZU5hbWUubGVuZ3RoKCkpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY29tcG91bmROYW1lLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlidWZmZXIuYXBwZW5kKENoYXJPcGVyYXRpb24udHJpbShjb21wb3VuZE5hbWVbaV0pKTsKKwkJCWlmIChpICE9IGxlbmd0aC0xKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgnLicpOworCQkJfQorCQl9CisJCXBhY2thZ2VOYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQogCXJldHVybiBuZXcgUGFja2FnZUZyYWdtZW50KHRoaXMsIHBhY2thZ2VOYW1lKTsKIH0KKwogLyoqCiAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBnaXZlbiBmb2xkZXIKICAqICh3aGljaCBpcyBhIGRlY2VuZGVudCBvZiB0aGlzIHJvb3QpLgpAQCAtMjI3LDkxICs1MjksMTk2IEBACiAJfQogCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7CiB9CisKIC8qKgogICogQHNlZSBJSmF2YUVsZW1lbnQKICAqLwogcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JcmV0dXJuIGZSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOworCXJldHVybiBnZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7CiB9CisKIC8qCiAgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290IAogICovCiBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFJhd0NsYXNzcGF0aEVudHJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVBhdGggcGF0aD0gdGhpcy5nZXRQYXRoKCk7Ci0JSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpOwotCWZvciAoaW50IGk9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCi0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCS8vIGEgcm9vdCdzIHByb2plY3QgYWx3YXlzIHJlZmVycyBkaXJlY3RseSB0byB0aGUgcm9vdAotCQkJCS8vIG5vIG5lZWQgdG8gZm9sbG93IHRoZSBwcm9qZWN0IHJlZmVyZW5jZQotCQkJCWNvbnRpbnVlOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUjoKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHRoaXMuZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKXsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKyl7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyRW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGNvbnRhaW5lckVudHJpZXNbal0pOwotCQkJCQkJaWYgKGNvbnRhaW5lckVudHJ5ICE9IG51bGwgJiYgcGF0aC5lcXVhbHMoY29udGFpbmVyRW50cnkuZ2V0UGF0aCgpKSkgewotCQkJCQkJCXJldHVybiBlbnRyeTsgLy8gYW5zd2VyIG9yaWdpbmFsIGVudHJ5Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0JCQkJZW50cnkgPSBKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KTsKLQkJCQkvLyBkb24ndCBicmVhayBzbyBhcyB0byBydW4gZGVmYXVsdAotCQkJZGVmYXVsdDoKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7Ci0JCQkJCXJldHVybiBlbnRyaWVzW2ldOwotCQkJCX0KLQkJfQorCisJSUNsYXNzcGF0aEVudHJ5IHJhd0VudHJ5ID0gbnVsbDsKKwlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKTsKKwlwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyBmb3JjZSB0aGUgcmV2ZXJzZSByYXdFbnRyeSBjYWNoZSB0byBiZSBwb3B1bGF0ZWQKKwlKYXZhTW9kZWxNYW5hZ2VyLlBlclByb2plY3RJbmZvIHBlclByb2plY3RJbmZvID0gCisJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvQ2hlY2tFeGlzdGVuY2UocHJvamVjdC5nZXRQcm9qZWN0KCkpOworCWlmIChwZXJQcm9qZWN0SW5mbyAhPSBudWxsICYmIHBlclByb2plY3RJbmZvLnJlc29sdmVkUGF0aFRvUmF3RW50cmllcyAhPSBudWxsKSB7CisJCXJhd0VudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgcGVyUHJvamVjdEluZm8ucmVzb2x2ZWRQYXRoVG9SYXdFbnRyaWVzLmdldCh0aGlzLmdldFBhdGgoKSk7CiAJfQotCXJldHVybiBudWxsOworCXJldHVybiByYXdFbnRyeTsKIH0KKwogLyoKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JcmV0dXJuIGZSZXNvdXJjZTsKKwlyZXR1cm4gKElSZXNvdXJjZSl0aGlzLnJlc291cmNlOwogfQorCiAvKioKLSAqIENhbm5vdCBhdHRhY2ggc291cmNlIHRvIGEgZm9sZGVyLgotICoKICAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKICAqLwogcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIG51bGw7CisJaWYgKGdldEtpbmQoKSAhPSBLX0JJTkFSWSkgcmV0dXJuIG51bGw7CisJCisJU3RyaW5nIHNlcnZlclBhdGhTdHJpbmc9IGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eSgpOworCWlmIChzZXJ2ZXJQYXRoU3RyaW5nID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCWludCBpbmRleD0gc2VydmVyUGF0aFN0cmluZy5sYXN0SW5kZXhPZihBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUik7CisJaWYgKGluZGV4IDwgMCkgeworCQkvLyBubyByb290IHBhdGggc3BlY2lmaWVkCisJCXJldHVybiBuZXcgUGF0aChzZXJ2ZXJQYXRoU3RyaW5nKTsKKwl9IGVsc2UgeworCQlTdHJpbmcgc2VydmVyU291cmNlUGF0aFN0cmluZz0gc2VydmVyUGF0aFN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQlyZXR1cm4gbmV3IFBhdGgoc2VydmVyU291cmNlUGF0aFN0cmluZyk7CisJfQogfQorCiAvKioKLSAqIENhbm5vdCBhdHRhY2ggc291cmNlIHRvIGEgZm9sZGVyLgotICoKKyAqIFJldHVybnMgdGhlIHNlcnZlciBwcm9wZXJ0eSBmb3IgdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QncworICogc291cmNlIGF0dGFjaGVtZW50LgorICovCitwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCVN0cmluZyBwcm9wZXJ0eVN0cmluZyA9IG51bGw7CisJUXVhbGlmaWVkTmFtZSBxTmFtZT0gZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZSgpOworCXRyeSB7CisJCXByb3BlcnR5U3RyaW5nID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW50UHJvcGVydHkocU5hbWUpOworCQkKKwkJLy8gaWYgbm8gZXhpc3Rpbmcgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24sIHRoZW4gbG9va3VwIGEgcmVjb21tZW5kYXRpb24gZnJvbSBjbGFzc3BhdGggZW50cmllcworCQlpZiAocHJvcGVydHlTdHJpbmcgPT0gbnVsbCkgeworCQkJSUNsYXNzcGF0aEVudHJ5IHJlY29tbWVuZGF0aW9uID0gZmluZFNvdXJjZUF0dGFjaG1lbnRSZWNvbW1lbmRhdGlvbigpOworCQkJaWYgKHJlY29tbWVuZGF0aW9uICE9IG51bGwpIHsKKwkJCQlJUGF0aCByb290UGF0aCA9IHJlY29tbWVuZGF0aW9uLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOworCQkJCXByb3BlcnR5U3RyaW5nID0gCisJCQkJCXJlY29tbWVuZGF0aW9uLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkudG9TdHJpbmcoKSAKKwkJCQkJCSsgKChyb290UGF0aCA9PSBudWxsKSAKKwkJCQkJCQk/ICIiIDogLy8kTk9OLU5MUy0xJAorCQkJCQkJCShBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUiArIHJvb3RQYXRoLnRvU3RyaW5nKCkpKTsgCisJCQkJc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KHByb3BlcnR5U3RyaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbWFyayBhcyBiZWluZyBhbHJlYWR5IGxvb2tlZCB1cAorCQkJCXNldFNvdXJjZUF0dGFjaG1lbnRQcm9wZXJ0eShOT19TT1VSQ0VfQVRUQUNITUVOVCk7CisJCQl9CisJCX0gZWxzZSBpZiAoTk9fU09VUkNFX0FUVEFDSE1FTlQuZXF1YWxzKHByb3BlcnR5U3RyaW5nKSkgeworCQkJLy8gYWxyZWFkeSBsb29rZWQgdXAgYW5kIG5vIHNvdXJjZSBhdHRhY2htZW50IGZvdW5kCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gcHJvcGVydHlTdHJpbmc7CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGNlKTsKKwl9Cit9CisJCisvKioKKyAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc291cmNlIGF0dGFjaG1lbnQgcHJvcGVydHkKKyAqIG9mIHRoaXMgcm9vdC4KKyAqLworcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgZ2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5TmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZShKYXZhQ29yZS5QTFVHSU5fSUQsICJzb3VyY2VhdHRhY2htZW50OiAiICsgdGhpcy5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorfQorCitwdWJsaWMgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisJdHJ5IHsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5zZXRQZXJzaXN0ZW50UHJvcGVydHkodGhpcy5nZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHlOYW1lKCksIHByb3BlcnR5KTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJfQorfQorCisvKioKKyAqIEZvciB1c2UgYnkgPGNvZGU+QXR0YWNoU291cmNlT3BlcmF0aW9uPC9jb2RlPiBvbmx5LgorICogU2V0cyB0aGUgc291cmNlIG1hcHBlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290LgorICovCitwdWJsaWMgdm9pZCBzZXRTb3VyY2VNYXBwZXIoU291cmNlTWFwcGVyIG1hcHBlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJKChQYWNrYWdlRnJhZ21lbnRSb290SW5mbykgZ2V0RWxlbWVudEluZm8oKSkuc2V0U291cmNlTWFwcGVyKG1hcHBlcik7Cit9CisKKworCisvKioKICAqIEBzZWUgSVBhY2thZ2VGcmFnbWVudFJvb3QKICAqLwogcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJldHVybiBudWxsOworCWlmIChnZXRLaW5kKCkgIT0gS19CSU5BUlkpIHJldHVybiBudWxsOworCQorCVN0cmluZyBzZXJ2ZXJQYXRoU3RyaW5nPSBnZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkoKTsKKwlpZiAoc2VydmVyUGF0aFN0cmluZyA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCX0KKwlpbnQgaW5kZXggPSBzZXJ2ZXJQYXRoU3RyaW5nLmxhc3RJbmRleE9mKEFUVEFDSE1FTlRfUFJPUEVSVFlfREVMSU1JVEVSKTsKKwlpZiAoaW5kZXggPT0gLTEpIHJldHVybiBudWxsOworCVN0cmluZyBzZXJ2ZXJSb290UGF0aFN0cmluZz0gSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIOworCWlmIChpbmRleCAhPSBzZXJ2ZXJQYXRoU3RyaW5nLmxlbmd0aCgpIC0gMSkgeworCQlzZXJ2ZXJSb290UGF0aFN0cmluZz0gc2VydmVyUGF0aFN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKwl9CisJcmV0dXJuIG5ldyBQYXRoKHNlcnZlclJvb3RQYXRoU3RyaW5nKTsKIH0KKworLyoqCisgKiBAc2VlIEphdmFFbGVtZW50CisgKi8KK3B1YmxpYyBTb3VyY2VNYXBwZXIgZ2V0U291cmNlTWFwcGVyKCkgeworCVNvdXJjZU1hcHBlciBtYXBwZXI7CisJdHJ5IHsKKwkJUGFja2FnZUZyYWdtZW50Um9vdEluZm8gcm9vdEluZm8gPSAoUGFja2FnZUZyYWdtZW50Um9vdEluZm8pIGdldEVsZW1lbnRJbmZvKCk7CisJCW1hcHBlciA9IHJvb3RJbmZvLmdldFNvdXJjZU1hcHBlcigpOworCQlpZiAobWFwcGVyID09IG51bGwpIHsKKwkJCS8vIGZpcnN0IGNhbGwgdG8gdGhpcyBtZXRob2QKKwkJCUlQYXRoIHNvdXJjZVBhdGg9IGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7CisJCQlpZiAoc291cmNlUGF0aCAhPSBudWxsKSB7CisJCQkJSVBhdGggcm9vdFBhdGg9IGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOworCQkJCW1hcHBlciA9IHRoaXMuY3JlYXRlU291cmNlTWFwcGVyKHNvdXJjZVBhdGgsIHJvb3RQYXRoKTsKKwkJCQlpZiAocm9vdFBhdGggPT0gbnVsbCAmJiBtYXBwZXIucm9vdFBhdGggIT0gbnVsbCkgeworCQkJCQkvLyBhcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhlIFNvdXJjZU1hcHBlciBjb25zdHJ1Y3RvciwgdGhlIHJvb3QgcGF0aCB3YXMgY29tcHV0ZWQKKwkJCQkJcm9vdFBhdGggPSBuZXcgUGF0aChtYXBwZXIucm9vdFBhdGgpOworCQkJCQkKKwkJCQkJLy9zZXQgdGhlIHByb3BlcnR5IHRvIHRoZSBwYXRoIG9mIHRoZSBtYXBwZWQgc291cmNlCisJCQkJCXRoaXMuc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KAorCQkJCQkJc291cmNlUGF0aC50b1N0cmluZygpIAorCQkJCQkJKyBBVFRBQ0hNRU5UX1BST1BFUlRZX0RFTElNSVRFUiAKKwkJCQkJCSsgcm9vdFBhdGgudG9TdHJpbmcoKSk7CisJCQkJfQorCQkJCXJvb3RJbmZvLnNldFNvdXJjZU1hcHBlcihtYXBwZXIpOworCQkJfSBlbHNlIHsKKwkJCQkvLyByZW1lbWJlciB0aGF0IG5vIHNvdXJjZSBpcyBhdHRhY2hlZAorCQkJCXJvb3RJbmZvLnNldFNvdXJjZU1hcHBlcihOT19TT1VSQ0VfTUFQUEVSKTsKKwkJCQltYXBwZXIgPSBudWxsOworCQkJfQorCQl9IGVsc2UgaWYgKG1hcHBlciA9PSBOT19TT1VSQ0VfTUFQUEVSKSB7CisJCQkvLyBhIHByZXZpb3VzIGNhbGwgdG8gdGhpcyBtZXRob2QgZm91bmQgb3V0IHRoYXQgbm8gc291cmNlIHdhcyBhdHRhY2hlZAorCQkJbWFwcGVyID0gbnVsbDsKKwkJfQorCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCS8vIG5vIHNvdXJjZSBjYW4gYmUgYXR0YWNoZWQKKwkJbWFwcGVyID0gbnVsbDsKKwl9CisJcmV0dXJuIG1hcHBlcjsKK30KKwogLyoqCiAgKiBAc2VlIElKYXZhRWxlbWVudAogICovCiBwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWlmIChmUmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJcmV0dXJuIGZSZXNvdXJjZTsKLQl9IGVsc2UgewotCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7Ci0JfQotCQorCWlmICghZXhpc3RzKCkpIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsKKwlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKIH0KKwogcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlyZXR1cm4gZlJlc291cmNlLmhhc2hDb2RlKCk7CisJcmV0dXJuIHRoaXMucmVzb3VyY2UuaGFzaENvZGUoKTsKIH0KKwogLyoqCiAgKiBAc2VlIElQYWNrYWdlRnJhZ21lbnRSb290CiAgKi8KIHB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKIAlyZXR1cm4gZmFsc2U7CiB9CisKIC8qKgogICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdAogICovCkBAIC0zMjMsMTcgKzczMCwxNCBAQAogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IGlzIG9uIHRoZSBjbGFzc3BhdGggb2YgaXRzIHByb2plY3QuCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIGlzT25DbGFzc3BhdGgoKSB7Ci0KLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKTsKLQogCWlmICh0aGlzLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCl7CiAJCXJldHVybiB0cnVlOwogCX0KIAkKIAlJUGF0aCBwYXRoID0gdGhpcy5nZXRQYXRoKCk7Ci0KIAl0cnkgewogCQkvLyBjaGVjayBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb24gY2xhc3NwYXRoIG9mIGl0cyBwcm9qZWN0CisJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpOwogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwkKIAkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwpAQCAtMzQ1LDExICs3NDksMjkgQEAKIAkJLy8gY291bGQgbm90IHJlYWQgY2xhc3NwYXRoLCB0aGVuIGFzc3VtZSBpdCBpcyBvdXRzaWRlCiAJfQogCXJldHVybiBmYWxzZTsKK30KKy8qCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290I21vdmUKKyAqLworcHVibGljIHZvaWQgbW92ZSgKKwlJUGF0aCBkZXN0aW5hdGlvbiwKKwlpbnQgdXBkYXRlUmVzb3VyY2VGbGFncywKKwlpbnQgdXBkYXRlTW9kZWxGbGFncywKKwlJQ2xhc3NwYXRoRW50cnkgc2libGluZywKKwlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwlNb3ZlUGFja2FnZUZyYWdtZW50Um9vdE9wZXJhdGlvbiBvcCA9IAorCQluZXcgTW92ZVBhY2thZ2VGcmFnbWVudFJvb3RPcGVyYXRpb24odGhpcywgZGVzdGluYXRpb24sIHVwZGF0ZVJlc291cmNlRmxhZ3MsIHVwZGF0ZU1vZGVsRmxhZ3MsIHNpYmxpbmcpOworCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CiB9CiAKKwogcHJvdGVjdGVkIHZvaWQgb3BlbldoZW5DbG9zZWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JaWYgKCF0aGlzLnJlc291cmNlRXhpc3RzKCkgfHwgIXRoaXMuaXNPbkNsYXNzcGF0aCgpKSB0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJaWYgKCF0aGlzLnJlc291cmNlRXhpc3RzKCkgCisJCQl8fCAhdGhpcy5pc09uQ2xhc3NwYXRoKCkpIHsKKwkJdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOworCX0KIAlzdXBlci5vcGVuV2hlbkNsb3NlZChwbSk7CiB9CiAKQEAgLTM2NSwxNiArNzg3LDE4IEBACiAJCS8vIGRvIG5vdGhpbmcuCiAJfQogfQorCiAvKgogICogQHNlZSBKYXZhRWxlbWVudCNyb290ZWRBdChJSmF2YVByb2plY3QpCiAgKi8KIHB1YmxpYyBJSmF2YUVsZW1lbnQgcm9vdGVkQXQoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKIAlyZXR1cm4KIAkJbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QoCi0JCQlmUmVzb3VyY2UsCisJCQlnZXRSZXNvdXJjZSgpLAogCQkJcHJvamVjdCwgCiAJCQlmTmFtZSk7CiB9CisKIC8qKgogICogQHByaXZhdGUgRGVidWdnaW5nIHB1cnBvc2VzCiAgKi8KQEAgLTM4MywxMCArODA3LDM1IEBACiAJaWYgKGdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewogCQlidWZmZXIuYXBwZW5kKCJbcHJvamVjdCByb290XSIpOyAvLyROT04tTkxTLTEkCiAJfSBlbHNlIHsKLQkJYnVmZmVyLmFwcGVuZChnZXRFbGVtZW50TmFtZSgpKTsKKwkJSVBhdGggcGF0aCA9IGdldFBhdGgoKTsKKwkJaWYgKGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGF0aC5zZWdtZW50KDApKSkgeworCQkJYnVmZmVyLmFwcGVuZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZVJlbGF0aXZlKCkpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChwYXRoKTsKKwkJfQogCX0KIAlpZiAoaW5mbyA9PSBudWxsKSB7CiAJCWJ1ZmZlci5hcHBlbmQoIiAobm90IG9wZW4pIik7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CisKKy8qKgorICogUG9zc2libGUgZmFpbHVyZXM6IDx1bD4KKyAqICA8bGk+RUxFTUVOVF9OT1RfUFJFU0VOVCAtIHRoZSByb290IHN1cHBsaWVkIHRvIHRoZSBvcGVyYXRpb24KKyAqICAgICAgZG9lcyBub3QgZXhpc3QKKyAqICA8bGk+SU5WQUxJRF9FTEVNRU5UX1RZUEVTIC0gdGhlIHJvb3QgaXMgbm90IG9mIGtpbmQgS19CSU5BUlkKKyAqICAgPGxpPlJFTEFUSVZFX1BBVEggLSB0aGUgcGF0aCBzdXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbiBtdXN0IGJlCisgKiAgICAgIGFuIGFic29sdXRlIHBhdGgKKyAqICA8L3VsPgorICovCitwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBdHRhY2hTb3VyY2UoSVBhdGggc291cmNlUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFleGlzdHMoKSkgeworCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CisJfSBlbHNlIGlmICh0aGlzLmdldEtpbmQoKSAhPSBLX0JJTkFSWSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMsIHRoaXMpKTsKKwl9IGVsc2UgaWYgKHNvdXJjZVBhdGggIT0gbnVsbCAmJiAhc291cmNlUGF0aC5pc0Fic29sdXRlKCkpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVMQVRJVkVfUEFUSCwgc291cmNlUGF0aCkpOworCX0KK30KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1BhY2thZ2VGcmFnbWVudFJvb3RJbmZvLmphdmEKaW5kZXggY2Q1MTU0YS4uMzVjZTI1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUGFja2FnZUZyYWdtZW50Um9vdEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9QYWNrYWdlRnJhZ21lbnRSb290SW5mby5qYXZhCkBAIC0xLDE5ICsxLDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CkBAIC0yNCw2ICsyNiwxMiBAQAogY2xhc3MgUGFja2FnZUZyYWdtZW50Um9vdEluZm8gZXh0ZW5kcyBPcGVuYWJsZUVsZW1lbnRJbmZvIHsKIAogCS8qKgorCSAqIFRoZSBTb3VyY2VNYXBwZXIgZm9yIHRoaXMgSkFSIChvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgSkFSIGRvZXMgbm90IGhhdmUgc291cmNlIGF0dGFjaGVkKS4KKwkgKi8KKwlwcm90ZWN0ZWQgU291cmNlTWFwcGVyIHNvdXJjZU1hcHBlciA9IG51bGw7CisKKwkvKioKIAkgKiBUaGUga2luZCBvZiB0aGUgcm9vdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmZvLgogCSAqIFZhbGlkIGtpbmRzIGFyZTogPHVsPgogCSAqIDxsaT48Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTwvY29kZT4KQEAgLTQ3LDM0ICs1NSw0MyBAQAogICogCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiAgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgZG9lcyBub3QgZXhpc3QKICAqLwotcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlRm9sZGVyTm9uSmF2YVJlc291cmNlcyhKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ29udGFpbmVyIGZvbGRlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CitzdGF0aWMgT2JqZWN0W10gY29tcHV0ZUZvbGRlck5vbkphdmFSZXNvdXJjZXMoSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBmb2xkZXIsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVs1XTsKIAlpbnQgbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgPSAwOwogCXRyeSB7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZS8qaWdub3JlIHVucmVzb2x2ZWQgdmFyaWFibGUqLyk7CiAJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBmb2xkZXIubWVtYmVycygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWVtYmVycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQluZXh0UmVzb3VyY2U6IGZvciAoaW50IGkgPSAwLCBtYXggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKLQkJCWlmIChtZW1iZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gbWVtYmVyLmdldE5hbWUoKTsKLQkJCQlpZiAoIVV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoZmlsZU5hbWUpICYmICFVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGZpbGVOYW1lKSkgewotCQkJCQkvLyBjaGVjayBjYXNlIG9mIGEgLnppcCBvciAuamFyIGZpbGUgb24gY2xhc3NwYXRoCi0JCQkJCWlmIChwcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnRSb290MChtZW1iZXIuZ2V0RnVsbFBhdGgoKSkgPT0gbnVsbCkgewotCQkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7Ci0JCQkJCQkJLy8gcmVzaXplCi0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShub25KYXZhUmVzb3VyY2VzLCAwLCAobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKLQkJCQkJCX0KLQkJCQkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSBtZW1iZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG1lbWJlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCWlmICghVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UobWVtYmVyLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7Ci0JCQkJCQkvLyByZXNpemUKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyICogMl0pLCAwLCBub25KYXZhUmVzb3VyY2VzQ291bnRlcik7Ci0JCQkJCX0KLQkJCQkJbm9uSmF2YVJlc291cmNlc1tub25KYXZhUmVzb3VyY2VzQ291bnRlcisrXSA9IG1lbWJlcjsKLQkJCQl9CisJCQlzd2l0Y2ggKG1lbWJlci5nZXRUeXBlKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbWVtYmVyLmdldE5hbWUoKTsKKwkJCQkJCisJCQkJCS8vIGlnbm9yZSAuamF2YSBmaWxlcyB0aGF0IGFyZSBub3QgZXhjbHVkZWQKKwkJCQkJaWYgKFV0aWwuaXNWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoZmlsZU5hbWUpICYmICFVdGlsLmlzRXhjbHVkZWQobWVtYmVyLCBleGNsdXNpb25QYXR0ZXJucykpIAorCQkJCQkJY29udGludWUgbmV4dFJlc291cmNlOworCQkJCQkvLyBpZ25vcmUgLmNsYXNzIGZpbGVzCisJCQkJCWlmIChVdGlsLmlzVmFsaWRDbGFzc0ZpbGVOYW1lKGZpbGVOYW1lKSkgCisJCQkJCQljb250aW51ZSBuZXh0UmVzb3VyY2U7CisJCQkJCS8vIGlnbm9yZSAuemlwIG9yIC5qYXIgZmlsZSBvbiBjbGFzc3BhdGgKKwkJCQkJaWYgKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUoZmlsZU5hbWUpICYmIGlzQ2xhc3NwYXRoRW50cnkobWVtYmVyLmdldEZ1bGxQYXRoKCksIGNsYXNzcGF0aCkpIAorCQkJCQkJY29udGludWUgbmV4dFJlc291cmNlOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CisJCQkJCS8vIGlnbm9yZSB2YWxpZCBwYWNrYWdlcyBvciBleGNsdWRlZCBmb2xkZXJzIHRoYXQgY29ycmVzcG9uZCB0byBhIG5lc3RlZCBwa2cgZnJhZ21lbnQgcm9vdAorCQkJCQlpZiAoVXRpbC5pc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2UobWVtYmVyLmdldE5hbWUoKSkKKwkJCQkJCQkmJiAoIVV0aWwuaXNFeGNsdWRlZChtZW1iZXIsIGV4Y2x1c2lvblBhdHRlcm5zKSAKKwkJCQkJCQkJfHwgaXNDbGFzc3BhdGhFbnRyeShtZW1iZXIuZ2V0RnVsbFBhdGgoKSwgY2xhc3NwYXRoKSkpCisJCQkJCQljb250aW51ZSBuZXh0UmVzb3VyY2U7CisJCQkJCWJyZWFrOwogCQkJfQorCQkJaWYgKG5vbkphdmFSZXNvdXJjZXMubGVuZ3RoID09IG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKSB7CisJCQkJLy8gcmVzaXplCisJCQkJU3lzdGVtLmFycmF5Y29weShub25KYXZhUmVzb3VyY2VzLCAwLCAobm9uSmF2YVJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIgKiAyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKKwkJCX0KKwkJCW5vbkphdmFSZXNvdXJjZXNbbm9uSmF2YVJlc291cmNlc0NvdW50ZXIrK10gPSBtZW1iZXI7CisKIAkJfQogCQlpZiAobm9uSmF2YVJlc291cmNlcy5sZW5ndGggIT0gbm9uSmF2YVJlc291cmNlc0NvdW50ZXIpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkobm9uSmF2YVJlc291cmNlcywgMCwgKG5vbkphdmFSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW25vbkphdmFSZXNvdXJjZXNDb3VudGVyXSksIDAsIG5vbkphdmFSZXNvdXJjZXNDb3VudGVyKTsKQEAgLTg5LDEzICsxMDYsMTcgQEAKICAqIAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZG9lcyBub3QgZXhpc3QKICAqLwotcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlTm9uSmF2YVJlc291cmNlcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworcHJpdmF0ZSBPYmplY3RbXSBjb21wdXRlTm9uSmF2YVJlc291cmNlcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSwgUGFja2FnZUZyYWdtZW50Um9vdCBoYW5kbGUpIHsKIAlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gTk9fTk9OX0pBVkFfUkVTT1VSQ0VTOwogCXRyeSB7CiAJCS8vIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG1heSBiZSBhIGZvbGRlciBvciBhIHByb2plY3QgKGluIHRoZSBjYXNlIHRoYXQgdGhlIHByb2plY3QgZm9sZGVyCiAJCS8vIGlzIGFjdHVhbGx5IHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QpCiAJCWlmICh1bmRlcmx5aW5nUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgdW5kZXJseWluZ1Jlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJbm9uSmF2YVJlc291cmNlcyA9IGNvbXB1dGVGb2xkZXJOb25KYXZhUmVzb3VyY2VzKChKYXZhUHJvamVjdClwcm9qZWN0LCAoSUNvbnRhaW5lcikgdW5kZXJseWluZ1Jlc291cmNlKTsKKwkJCW5vbkphdmFSZXNvdXJjZXMgPSAKKwkJCQljb21wdXRlRm9sZGVyTm9uSmF2YVJlc291cmNlcygKKwkJCQkJKEphdmFQcm9qZWN0KXByb2plY3QsIAorCQkJCQkoSUNvbnRhaW5lcikgdW5kZXJseWluZ1Jlc291cmNlLCAgCisJCQkJCWhhbmRsZS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCkpOwogCQl9CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAl9CkBAIC0xMDQsMTAgKzEyNSwxMCBAQAogLyoqCiAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1qYXZhIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyLgogICovCi1zeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0Tm9uSmF2YVJlc291cmNlcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlIHVuZGVybHlpbmdSZXNvdXJjZSkgeworc3luY2hyb25pemVkIE9iamVjdFtdIGdldE5vbkphdmFSZXNvdXJjZXMoSUphdmFQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2UsIFBhY2thZ2VGcmFnbWVudFJvb3QgaGFuZGxlKSB7CiAJT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IGZOb25KYXZhUmVzb3VyY2VzOwogCWlmIChub25KYXZhUmVzb3VyY2VzID09IG51bGwpIHsKLQkJbm9uSmF2YVJlc291cmNlcyA9IHRoaXMuY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMocHJvamVjdCwgdW5kZXJseWluZ1Jlc291cmNlKTsKKwkJbm9uSmF2YVJlc291cmNlcyA9IHRoaXMuY29tcHV0ZU5vbkphdmFSZXNvdXJjZXMocHJvamVjdCwgdW5kZXJseWluZ1Jlc291cmNlLCBoYW5kbGUpOwogCQlmTm9uSmF2YVJlc291cmNlcyA9IG5vbkphdmFSZXNvdXJjZXM7CiAJfQogCXJldHVybiBub25KYXZhUmVzb3VyY2VzOwpAQCAtMTE5LDYgKzE0MCwyMiBAQAogCXJldHVybiBmUm9vdEtpbmQ7CiB9CiAvKioKKyAqIFJldHVucyB0aGUgU291cmNlTWFwcGVyIGZvciB0aGlzIHJvb3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgKiBpZiB0aGlzIHJvb3QgZG9lcyBub3QgaGF2ZSBhdHRhY2hlZCBzb3VyY2UuCisgKi8KK3Byb3RlY3RlZCBTb3VyY2VNYXBwZXIgZ2V0U291cmNlTWFwcGVyKCkgeworCXJldHVybiB0aGlzLnNvdXJjZU1hcHBlcjsKK30KK3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc3BhdGhFbnRyeShJUGF0aCBwYXRoLCBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZENsYXNzcGF0aCkgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXNvbHZlZENsYXNzcGF0aC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSByZXNvbHZlZENsYXNzcGF0aFtpXTsKKwkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKy8qKgogICogU2V0IHRoZSBmTm9uSmF2YVJlc291cmNlcyB0byByZXMgdmFsdWUKICAqLwogc3luY2hyb25pemVkIHZvaWQgc2V0Tm9uSmF2YVJlc291cmNlcyhPYmplY3RbXSByZXNvdXJjZXMpIHsKQEAgLTEzMCw0ICsxNjcsMTAgQEAKIHByb3RlY3RlZCB2b2lkIHNldFJvb3RLaW5kKGludCBuZXdSb290S2luZCkgewogCWZSb290S2luZCA9IG5ld1Jvb3RLaW5kOwogfQorLyoqCisgKiBTZXRzIHRoZSBTb3VyY2VNYXBwZXIgZm9yIHRoaXMgcm9vdC4KKyAqLworcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlTWFwcGVyKFNvdXJjZU1hcHBlciBtYXBwZXIpIHsKKwl0aGlzLnNvdXJjZU1hcHBlcj0gbWFwcGVyOworfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmNjZjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlY29uY2lsZVdvcmtpbmdDb3B5T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisKKy8qKgorICogUmVjb25jaWxlIGEgd29ya2luZyBjb3B5IGFuZCBzaWduYWwgdGhlIGNoYW5nZXMgdGhyb3VnaCBhIGRlbHRhLgorICovCitwdWJsaWMgY2xhc3MgUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24geworCQkKKwlib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbjsKKwkKKwlwdWJsaWMgUmVjb25jaWxlV29ya2luZ0NvcHlPcGVyYXRpb24oSUphdmFFbGVtZW50IHdvcmtpbmdDb3B5LCBib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbikgeworCQlzdXBlcihuZXcgSUphdmFFbGVtZW50W10ge3dvcmtpbmdDb3B5fSk7CisJCXRoaXMuZm9yY2VQcm9ibGVtRGV0ZWN0aW9uID0gZm9yY2VQcm9ibGVtRGV0ZWN0aW9uOworCX0KKwkvKioKKwkgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBzZXR0aW5nIHRoZSBzb3VyY2UKKwkgKiAJb2YgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgZmFpbHMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlT3BlcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCWlmIChmTW9uaXRvciAhPSBudWxsKXsKKwkJCWlmIChmTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKKwkJCWZNb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVsZW1lbnQucmVjb25jaWxpbmciKSwgMTApOyAvLyROT04tTkxTLTEkCisJCX0KKwkKKwkJV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSBnZXRXb3JraW5nQ29weSgpOworCQlib29sZWFuIHdhc0NvbnNpc3RlbnQgPSB3b3JraW5nQ29weS5pc0NvbnNpc3RlbnQoKTsKKwkJSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIgZGVsdGFCdWlsZGVyID0gbnVsbDsKKwkKKwkJdHJ5IHsKKwkJCS8vIGNyZWF0ZSB0aGUgZGVsdGEgYnVpbGRlciAodGhpcyByZW1lbWJlcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY3UpCisJCQlpZiAoIXdhc0NvbnNpc3RlbnQpeworCQkJCWRlbHRhQnVpbGRlciA9IG5ldyBKYXZhRWxlbWVudERlbHRhQnVpbGRlcih3b3JraW5nQ29weSk7CisJCQkJCisJCQkJLy8gdXBkYXRlIHRoZSBlbGVtZW50IGluZm9zIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHdvcmtpbmcgY29weQorCQkJCXdvcmtpbmdDb3B5Lm1ha2VDb25zaXN0ZW50KGZNb25pdG9yKTsKKwkJCQlkZWx0YUJ1aWxkZXIuYnVpbGREZWx0YXMoKTsKKwkJCisJCQl9CisJCisJCQlpZiAoZk1vbml0b3IgIT0gbnVsbCkgZk1vbml0b3Iud29ya2VkKDIpOworCQkJCisJCQkvLyBmb3JjZSBwcm9ibGVtIGRldGVjdGlvbj8gLSBpZiBzdHJ1Y3R1cmUgd2FzIGNvbnNpc3RlbnQKKwkJCWlmIChmb3JjZVByb2JsZW1EZXRlY3Rpb24gJiYgd2FzQ29uc2lzdGVudCl7CisJCQkJaWYgKGZNb25pdG9yICE9IG51bGwgJiYgZk1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCQorCQkJCUlQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IgPSB3b3JraW5nQ29weS5wcm9ibGVtUmVxdWVzdG9yOworCQkJCWlmIChwcm9ibGVtUmVxdWVzdG9yICE9IG51bGwgJiYgcHJvYmxlbVJlcXVlc3Rvci5pc0FjdGl2ZSgpKXsKKwkJCQkJcHJvYmxlbVJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOworCQkJCQlDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3Mod29ya2luZ0NvcHksIHByb2JsZW1SZXF1ZXN0b3IsIGZNb25pdG9yKTsKKwkJCQkJcHJvYmxlbVJlcXVlc3Rvci5lbmRSZXBvcnRpbmcoKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIHJlZ2lzdGVyIHRoZSBkZWx0YXMKKwkJCWlmIChkZWx0YUJ1aWxkZXIgIT0gbnVsbCl7CisJCQkJaWYgKChkZWx0YUJ1aWxkZXIuZGVsdGEgIT0gbnVsbCkgJiYgKGRlbHRhQnVpbGRlci5kZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkpIHsKKwkJCQkJYWRkUmVjb25jaWxlRGVsdGEod29ya2luZ0NvcHksIGRlbHRhQnVpbGRlci5kZWx0YSk7CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGZNb25pdG9yICE9IG51bGwpIGZNb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgdGhpcyBvcGVyYXRpb24gaXMgd29ya2luZyBvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgV29ya2luZ0NvcHkgZ2V0V29ya2luZ0NvcHkoKSB7CisJCXJldHVybiAoV29ya2luZ0NvcHkpZ2V0RWxlbWVudFRvUHJvY2VzcygpOworCX0KKwkvKioKKwkgKiBAc2VlIEphdmFNb2RlbE9wZXJhdGlvbiNpc1JlYWRPbmx5CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCXByb3RlY3RlZCBJSmF2YU1vZGVsU3RhdHVzIHZlcmlmeSgpIHsKKwkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBzdXBlci52ZXJpZnkoKTsKKwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gZ2V0V29ya2luZ0NvcHkoKTsKKwkJaWYgKHdvcmtpbmdDb3B5LnVzZUNvdW50ID09IDApIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCwgd29ya2luZ0NvcHkpOyAvL3dhcyBkZXN0cm95ZWQKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZWdpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhCmluZGV4IGU3YmQ5OTYuLmM5ZmEwNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlZ2lvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggNTU4Y2EwZi4uMDM3ZWExNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lRWxlbWVudHNPcGVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVFbGVtZW50c09wZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9SZW5hbWVSZXNvdXJjZUVsZW1lbnRzT3BlcmF0aW9uLmphdmEKaW5kZXggNWMzNTExOS4uNjdjMTZjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvUmVuYW1lUmVzb3VyY2VFbGVtZW50c09wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1JlbmFtZVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKaW5kZXggMDI4NzJlZC4uZjhjODk3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2VhcmNoYWJsZUVudmlyb25tZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JVHlwZU5hbWVSZXF1ZXN0b3I7CkBAIC0yOCw3ICsyOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKglUaGlzIGNsYXNzIHByb3ZpZGVzIGEgPGNvZGU+U2VhcmNoYWJsZUJ1aWxkZXJFbnZpcm9ubWVudDwvY29kZT4gZm9yIGNvZGUgYXNzaXN0IHdoaWNoCkBAIC03MCwxNCArNzAsMTQgQEAKIAkJCWlmICh0eXBlIGluc3RhbmNlb2YgQmluYXJ5VHlwZSkgewogCQkJCXRyeSB7CiAJCQkJCXJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKAotCQkJCQkJKElCaW5hcnlUeXBlKSAoKEJpbmFyeVR5cGUpIHR5cGUpLmdldFJhd0luZm8oKSk7CisJCQkJCQkoSUJpbmFyeVR5cGUpICgoQmluYXJ5VHlwZSkgdHlwZSkuZ2V0RWxlbWVudEluZm8oKSk7CiAJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQl9IGVsc2UgeyAvL1NvdXJjZVR5cGUKIAkJCQl0cnkgewogCQkJCQkvLyByZXRyaWV2ZSB0aGUgcmVxdWVzdGVkIHR5cGUKLQkJCQkJU291cmNlVHlwZUVsZW1lbnRJbmZvIHNvdXJjZVR5cGUgPSAoU291cmNlVHlwZUVsZW1lbnRJbmZvKSgoU291cmNlVHlwZSl0eXBlKS5nZXRSYXdJbmZvKCk7CisJCQkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBzb3VyY2VUeXBlID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykoKFNvdXJjZVR5cGUpdHlwZSkuZ2V0RWxlbWVudEluZm8oKTsKIAkJCQkJSVNvdXJjZVR5cGUgdG9wTGV2ZWxUeXBlID0gc291cmNlVHlwZTsKIAkJCQkJd2hpbGUgKHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkgewogCQkJCQkJdG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKQEAgLTkwLDcgKzkwLDcgQEAKIAkJCQkJc291cmNlVHlwZXNbMF0gPSBzb3VyY2VUeXBlOwogCQkJCQlmb3IgKGludCBpID0gMCwgaW5kZXggPSAxOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKIAkJCQkJCUlTb3VyY2VUeXBlIG90aGVyVHlwZSA9Ci0JCQkJCQkJKElTb3VyY2VUeXBlKSAoKEphdmFFbGVtZW50KSB0eXBlc1tpXSkuZ2V0UmF3SW5mbygpOworCQkJCQkJCShJU291cmNlVHlwZSkgKChKYXZhRWxlbWVudCkgdHlwZXNbaV0pLmdldEVsZW1lbnRJbmZvKCk7CiAJCQkJCQlpZiAoIW90aGVyVHlwZS5lcXVhbHModG9wTGV2ZWxUeXBlKSkKIAkJCQkJCQlzb3VyY2VUeXBlc1tpbmRleCsrXSA9IG90aGVyVHlwZTsKIAkJCQkJfQpAQCAtMTY3LDExICsxNjcsNyBAQAogCQkJCQkJTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUyB8IE5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVMpOwogCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCWV4Y2x1ZGVQYXRoID0KLQkJCQkJKChJSmF2YUVsZW1lbnQpIHRoaXMudW5pdFRvU2tpcCkKLQkJCQkJCS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKQotCQkJCQkJLmdldEZ1bGxQYXRoKCkKLQkJCQkJCS50b1N0cmluZygpOworCQkJCWV4Y2x1ZGVQYXRoID0gKChJSmF2YUVsZW1lbnQpIHRoaXMudW5pdFRvU2tpcCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CiAJCQl9IGVsc2UgewogCQkJCWV4Y2x1ZGVQYXRoID0gbnVsbDsKIAkJCX0KQEAgLTIzNCw3ICsyMzAsNyBAQAogCQkJfTsKIAkJCXRyeSB7CiAJCQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaEFsbFR5cGVOYW1lcygKLQkJCQkJdGhpcy5wcm9qZWN0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFdvcmtzcGFjZSgpLAorCQkJCQl0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLAogCQkJCQlxdWFsaWZpY2F0aW9uLAogCQkJCQlzaW1wbGVOYW1lLAogCQkJCQlQUkVGSVhfTUFUQ0gsCkBAIC0zMjcsNCArMzIzLDQgQEAKIAkKIAlwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWFyY2hhYmxlRW52aXJvbm1lbnRSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCmluZGV4IGE5MzM2MzYuLjdiNTE4OTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlYXJjaGFibGVFbnZpcm9ubWVudFJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW5pdGlhbGl6ZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZWxlY3Rpb25SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCmluZGV4IGFmNjBkZTQuLjBhNmJhZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NlbGVjdGlvblJlcXVlc3Rvci5qYXZhCkBAIC0xLDE3ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwpAQCAtMTksMTAgKzIwLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVNlbGVjdGlvblJlcXVlc3RvcjwvY29kZT4gdG8gYXNzaXN0IHdpdGgKQEAgLTEzOSw3ICsxNDAsMTUgQEAKIAkJCQogCQkJLy8gbmVlZCB0byBhZGQgYSBwYXJhbWF0ZXIgZm9yIGNvbnN0cnVjdG9yIGluIGJpbmFyeSB0eXBlCiAJCQlJVHlwZSBkZWNsYXJpbmdEZWNsYXJpbmdUeXBlID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCQlpZihkZWNsYXJpbmdEZWNsYXJpbmdUeXBlICE9IG51bGwgJiYgaXNDb25zdHJ1Y3RvcikgeworCQkJCisJCQlib29sZWFuIGlzU3RhdGljID0gZmFsc2U7CisJCQl0cnkgeworCQkJCWlzU3RhdGljID0gRmxhZ3MuaXNTdGF0aWModHlwZS5nZXRGbGFncygpKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gaXNTdGF0aWMgPT0gZmFsc2UKKwkJCX0KKwkJCQorCQkJaWYoZGVjbGFyaW5nRGVjbGFyaW5nVHlwZSAhPSBudWxsICYmIGlzQ29uc3RydWN0b3IJJiYgIWlzU3RhdGljKSB7CiAJCQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlclBhY2thZ2VOYW1lcy5sZW5ndGg7CiAJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIDAsIHBhcmFtZXRlclBhY2thZ2VOYW1lcyA9IG5ldyBjaGFyW2xlbmd0aCsxXVtdLCAxLCBsZW5ndGgpOwogCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZU5hbWVzLCAwLCBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgY2hhcltsZW5ndGgrMV1bXSwgMSwgbGVuZ3RoKTsKQEAgLTIyMCw3ICsyMjksOCBAQAogCQlib29sZWFuIG1hdGNoPSB0cnVlOwogCQlmb3IgKGludCBwID0gMDsgcCA8IHNpZ25hdHVyZXMubGVuZ3RoOyBwKyspIHsKIAkJCVN0cmluZyBzaW1wbGVOYW1lPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlc1twXSkpOwotCQkJaWYgKCFzaW1wbGVOYW1lLmVxdWFscyhuZXcgU3RyaW5nKHBhcmFtZXRlclR5cGVOYW1lc1twXSkpKSB7CisJCQljaGFyW10gc2ltcGxlUGFyYW1ldGVyTmFtZSA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQocGFyYW1ldGVyVHlwZU5hbWVzW3BdLCAnLicpOworCQkJaWYgKCFzaW1wbGVOYW1lLmVxdWFscyhuZXcgU3RyaW5nKHNpbXBsZVBhcmFtZXRlck5hbWUpKSkgewogCQkJCW1hdGNoID0gZmFsc2U7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TZXRDbGFzc3BhdGhPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCmluZGV4IGViNDU4OWQuLmY1ZjQ0OGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NldENsYXNzcGF0aE9wZXJhdGlvbi5qYXZhCkBAIC0xLDE2ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0yMSw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKQEAgLTM0LDYgKzM2LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuT2JqZWN0VmVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7CiAKIC8qKgpAQCAtNDMsMTQgKzQ3LDE3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXRDbGFzc3BhdGhPcGVyYXRpb24gZXh0ZW5kcyBKYXZhTW9kZWxPcGVyYXRpb24gewogCi0JSUNsYXNzcGF0aEVudHJ5W10gb2xkUmVzb2x2ZWRQYXRoOworCUlDbGFzc3BhdGhFbnRyeVtdIG9sZFJlc29sdmVkUGF0aCwgbmV3UmVzb2x2ZWRQYXRoOwogCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd1BhdGg7CiAJYm9vbGVhbiBjYW5DaGFuZ2VSZXNvdXJjZTsKIAlib29sZWFuIG5lZWRDeWNsZUNoZWNrOwogCWJvb2xlYW4gbmVlZFZhbGlkYXRpb247Ci0JCisJYm9vbGVhbiBuZWVkU2F2ZTsKIAlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbjsKKwkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIFJldXNlQ2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIFVwZGF0ZUNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CisJLy8gaWYgcmV1c2luZyBvdXRwdXQgbG9jYXRpb24sIHRoZW4gYWxzbyByZXVzZSBjbGVhbiBmbGFnCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBSZXVzZU91dHB1dExvY2F0aW9uID0gbmV3IFBhdGgoIlJldXNlIEV4aXN0aW5nIE91dHB1dCBMb2NhdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAogCQogCS8qKgpAQCAtNjIsMTcgKzY5LDE2IEBACiAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jhd1BhdGgsCiAJCUlQYXRoIG5ld091dHB1dExvY2F0aW9uLAogCQlib29sZWFuIGNhbkNoYW5nZVJlc291cmNlLAotCQlib29sZWFuIGZvcmNlU2F2ZSwKLQkJYm9vbGVhbiBuZWVkQ3ljbGVDaGVjaywKLQkJYm9vbGVhbiBuZWVkVmFsaWRhdGlvbikgeworCQlib29sZWFuIG5lZWRWYWxpZGF0aW9uLAorCQlib29sZWFuIG5lZWRTYXZlKSB7CiAKIAkJc3VwZXIobmV3IElKYXZhRWxlbWVudFtdIHsgcHJvamVjdCB9KTsKIAkJdGhpcy5vbGRSZXNvbHZlZFBhdGggPSBvbGRSZXNvbHZlZFBhdGg7CiAJCXRoaXMubmV3UmF3UGF0aCA9IG5ld1Jhd1BhdGg7CiAJCXRoaXMubmV3T3V0cHV0TG9jYXRpb24gPSBuZXdPdXRwdXRMb2NhdGlvbjsKIAkJdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZSA9IGNhbkNoYW5nZVJlc291cmNlOwotCQl0aGlzLm5lZWRDeWNsZUNoZWNrID0gbmVlZEN5Y2xlQ2hlY2s7CiAJCXRoaXMubmVlZFZhbGlkYXRpb24gPSBuZWVkVmFsaWRhdGlvbjsKKwkJdGhpcy5uZWVkU2F2ZSA9IG5lZWRTYXZlOwogCX0KIAogCS8qKgpAQCAtOTUsOSArMTAxLDcgQEAKIAkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJCX0KIAkJCQkvLyBmb3JjZSBkZXRhY2ggc291cmNlIG9uIGphciBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIChzb3VyY2Ugd2lsbCBiZSBsYXppbHkgY29tcHV0ZWQgd2hlbiBuZWVkZWQpCi0JCQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCSgoSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdCkuc2V0U291cmNlQXR0YWNobWVudFByb3BlcnR5KG51bGwpOy8vIGxvb3NlIGluZm8gLSB3aWxsIGJlIHJlY29tcHV0ZWQKLQkJCQl9CisJCQkJKChQYWNrYWdlRnJhZ21lbnRSb290KSByb290KS5zZXRTb3VyY2VBdHRhY2htZW50UHJvcGVydHkobnVsbCk7Ly8gbG9vc2UgaW5mbyAtIHdpbGwgYmUgcmVjb21wdXRlZAogCQkJfQogCQl9CiAJfQpAQCAtMTEzLDEyICsxMTcsMzcgQEAKIAkJSUNsYXNzcGF0aEVudHJ5W10gbGlzdCwKIAkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CiAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisJCUlQYXRoW10gZXhjbHVzaW9uUGF0dGVybnMgPSBlbnRyeS5nZXRFeGNsdXNpb25QYXR0ZXJucygpOworCQluZXh0RW50cnk6IGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogCQkJSUNsYXNzcGF0aEVudHJ5IG90aGVyID0gbGlzdFtpXTsKIAkJCWlmIChvdGhlci5nZXRDb250ZW50S2luZCgpID09IGVudHJ5LmdldENvbnRlbnRLaW5kKCkKIAkJCQkmJiBvdGhlci5nZXRFbnRyeUtpbmQoKSA9PSBlbnRyeS5nZXRFbnRyeUtpbmQoKQogCQkJCSYmIG90aGVyLmlzRXhwb3J0ZWQoKSA9PSBlbnRyeS5pc0V4cG9ydGVkKCkKIAkJCQkmJiBvdGhlci5nZXRQYXRoKCkuZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKKwkJCQkJLy8gY2hlY2sgY3VzdG9tIG91dHB1dHMKKwkJCQkJSVBhdGggZW50cnlPdXRwdXQgPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJCQlJUGF0aCBvdGhlck91dHB1dCA9IG90aGVyLmdldE91dHB1dExvY2F0aW9uKCk7CisJCQkJCWlmIChlbnRyeU91dHB1dCA9PSBudWxsKSB7CisJCQkJCQlpZiAob3RoZXJPdXRwdXQgIT0gbnVsbCkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghZW50cnlPdXRwdXQuZXF1YWxzKG90aGVyT3V0cHV0KSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gY2hlY2sgZXhjbHVzaW9uIHBhdHRlcm5zCisJCQkJCUlQYXRoW10gb3RoZXJFeGNsdWRlcyA9IG90aGVyLmdldEV4Y2x1c2lvblBhdHRlcm5zKCk7CisJCQkJCWlmIChleGNsdXNpb25QYXR0ZXJucyAhPSBvdGhlckV4Y2x1ZGVzKSB7CisJCQkJCQlpbnQgZXhjbHVkZUxlbmd0aCA9IGV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsKKwkJCQkJCWlmIChvdGhlckV4Y2x1ZGVzLmxlbmd0aCAhPSBleGNsdWRlTGVuZ3RoKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleGNsdWRlTGVuZ3RoOyBqKyspIHsKKwkJCQkJCQkvLyBjb21wYXJlIHRvU3RyaW5ncyBpbnN0ZWFkIG9mIElQYXRocyAKKwkJCQkJCQkvLyBzaW5jZSBJUGF0aC5lcXVhbHMgaXMgc3BlY2lmaWVkIHRvIGlnbm9yZSB0cmFpbGluZyBzZXBhcmF0b3JzCisJCQkJCQkJaWYgKCFleGNsdXNpb25QYXR0ZXJuc1tqXS50b1N0cmluZygpLmVxdWFscyhvdGhlckV4Y2x1ZGVzW2pdLnRvU3RyaW5nKCkpKQorCQkJCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQkJCQl9CisJCQkJCX0KIAkJCQkJcmV0dXJuIGk7CiAJCQl9CiAJCX0KQEAgLTE1NCw3ICsxODMsNyBAQAogCQlKYXZhUHJvamVjdCBwcm9qZWN0ID1nZXRQcm9qZWN0KCk7CiAJCiAJCS8vIHNlZSBpZiB0aGlzIHdpbGwgY2F1c2UgYW55IHBhY2thZ2UgZnJhZ21lbnRzIHRvIGJlIGFmZmVjdGVkCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZ2V0V29ya3NwYWNlKCk7CisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwogCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwogCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewogCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNZW1iZXIobG9jYXRpb24pOwpAQCAtMTY3LDcgKzE5Niw3IEBACiAJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwogCQkJCUlQYXRoIHBhdGggPSBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpOwogCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgJiYgcGF0aC5pc1ByZWZpeE9mKGxvY2F0aW9uKSAmJiAhcGF0aC5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aFtpXSk7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmNvbXB1dGVQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGhbaV0pOwogCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbMF07CiAJCQkJCS8vIG5vdyB0aGUgb3V0cHV0IGxvY2F0aW9uIGJlY29tZXMgYSBwYWNrYWdlIGZyYWdtZW50IC0gYWxvbmcgd2l0aCBhbnkgc3ViZm9sZGVycwogCQkJCQlBcnJheUxpc3QgZm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTE5Niw3ICsyMjUsNiBAQAogCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBvZiB0aGUgcHJlLXNwZWNpZmllZCBwcm9qZWN0LgogCSAqLwogCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQogCQkvLyBwcm9qZWN0IHJlZmVyZW5jZSB1cGRhdGVkIC0gbWF5IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gd3JpdGUgLnByb2plY3QgZmlsZQogCQl1cGRhdGVQcm9qZWN0UmVmZXJlbmNlc0lmTmVjZXNzYXJ5KCk7CiAKQEAgLTIwOSw3ICsyMzcsMTMgQEAKIAkJSmF2YU1vZGVsRXhjZXB0aW9uIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsKIAogCQl0cnkgewotCQkJaWYgKHRoaXMubmV3UmF3UGF0aCAhPSBSZXVzZUNsYXNzcGF0aCkgdXBkYXRlQ2xhc3NwYXRoKCk7CisJCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQkJaWYgKHRoaXMubmV3UmF3UGF0aCA9PSBVcGRhdGVDbGFzc3BhdGgpIHRoaXMubmV3UmF3UGF0aCA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCQlpZiAodGhpcy5uZXdSYXdQYXRoICE9IFJldXNlQ2xhc3NwYXRoKXsKKwkJCQl1cGRhdGVDbGFzc3BhdGgoKTsKKwkJCQlwcm9qZWN0LnVwZGF0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFQcm9jZXNzb3IuYWRkRm9yUmVmcmVzaChwcm9qZWN0KTsKKwkJCX0KIAogCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKIAkJCW9yaWdpbmFsRXhjZXB0aW9uID0gZTsKQEAgLTIzNiw1MyArMjcwLDEyNiBAQAogCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ2xhc3NwYXRoQ2hhbmdlRGVsdGFzKAogCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRSZXNvbHZlZFBhdGgsCiAJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkUGF0aCwKLQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyLAotCQlKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0KKwkJZmluYWwgSmF2YVByb2plY3QgcHJvamVjdCkgeworCQorCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKIAkJYm9vbGVhbiBuZWVkVG9VcGRhdGVEZXBlbmRlbnRzID0gZmFsc2U7Ci0JCQogCQlKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gbmV3IEphdmFFbGVtZW50RGVsdGEoZ2V0SmF2YU1vZGVsKCkpOwogCQlib29sZWFuIGhhc0RlbHRhID0gZmFsc2U7CiAJCWludCBvbGRMZW5ndGggPSBvbGRSZXNvbHZlZFBhdGgubGVuZ3RoOwogCQlpbnQgbmV3TGVuZ3RoID0gbmV3UmVzb2x2ZWRQYXRoLmxlbmd0aDsKLQkJYm9vbGVhbiBvbGRSZXNvbHZlZFBhdGhMb25nZXN0ID0gb2xkTGVuZ3RoID49IG5ld0xlbmd0aDsKIAkJCQotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gbWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSZXNvbHZlZFBhdGgubGVuZ3RoOyBpKyspIHsKKwkJZmluYWwgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IG1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7CisJCU1hcCBvbGRSb290cyA9IG51bGw7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBudWxsOworCQlpZiAocHJvamVjdC5pc09wZW4oKSkgeworCQkJdHJ5IHsKKwkJCQlyb290cyA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0gZWxzZSB7CisJCQlNYXAgYWxsUmVtb3ZlZFJvb3RzIDsKKwkJCWlmICgoYWxsUmVtb3ZlZFJvb3RzID0gbWFuYWdlci5kZWx0YVByb2Nlc3Nvci5yZW1vdmVkUm9vdHMpICE9IG51bGwpIHsKKwkJIAkJcm9vdHMgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSkgYWxsUmVtb3ZlZFJvb3RzLmdldChwcm9qZWN0KTsKKwkJCX0KKwkJfQorCQlpZiAocm9vdHMgIT0gbnVsbCkgeworCQkJb2xkUm9vdHMgPSBuZXcgSGFzaE1hcCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgeworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJCQlvbGRSb290cy5wdXQocm9vdC5nZXRQYXRoKCksIHJvb3QpOworCQkJfQorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKIAkJCQogCQkJaW50IGluZGV4ID0gY2xhc3NwYXRoQ29udGFpbnMobmV3UmVzb2x2ZWRQYXRoLCBvbGRSZXNvbHZlZFBhdGhbaV0pOwogCQkJaWYgKGluZGV4ID09IC0xKSB7CiAJCQkJLy8gZG8gbm90IG5vdGlmeSByZW1vdGUgcHJvamVjdCBjaGFuZ2VzCiAJCQkJaWYgKG9sZFJlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpewogCQkJCQluZWVkVG9VcGRhdGVEZXBlbmRlbnRzID0gdHJ1ZTsKKwkJCQkJdGhpcy5uZWVkQ3ljbGVDaGVjayA9IHRydWU7CiAJCQkJCWNvbnRpbnVlOyAKIAkJCQl9Ci0KLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBrZ0ZyYWdtZW50Um9vdHMgPQotCQkJCQlwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKG9sZFJlc29sdmVkUGF0aFtpXSk7CisJCisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwa2dGcmFnbWVudFJvb3RzID0gbnVsbDsKKwkJCQlpZiAob2xkUm9vdHMgIT0gbnVsbCkgeworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBvbGRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSAgb2xkUm9vdHMuZ2V0KG9sZFJlc29sdmVkUGF0aFtpXS5nZXRQYXRoKCkpOworCQkJCQlpZiAob2xkUm9vdCAhPSBudWxsKSB7IC8vIHVzZSBvbGQgcm9vdCBpZiBhbnkgKGNvdWxkIGJlIG5vbmUgaWYgZW50cnkgd2Fzbid0IGJvdW5kKQorCQkJCQkJcGtnRnJhZ21lbnRSb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHsgb2xkUm9vdCB9OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwa2dGcmFnbWVudFJvb3RzID09IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCU9iamVjdFZlY3RvciBhY2N1bXVsYXRlZFJvb3RzID0gbmV3IE9iamVjdFZlY3RvcigpOworCQkJCQkJSGFzaFNldCByb290SURzID0gbmV3IEhhc2hTZXQoNSk7CisJCQkJCQlyb290SURzLmFkZChwcm9qZWN0LnJvb3RJRCgpKTsKKwkJCQkJCXByb2plY3QuY29tcHV0ZVBhY2thZ2VGcmFnbWVudFJvb3RzKAorCQkJCQkJCW9sZFJlc29sdmVkUGF0aFtpXSwgCisJCQkJCQkJYWNjdW11bGF0ZWRSb290cywgCisJCQkJCQkJcm9vdElEcywKKwkJCQkJCQl0cnVlLCAvLyBpbnNpZGUgb3JpZ2luYWwgcHJvamVjdAorCQkJCQkJCWZhbHNlLCAvLyBkb24ndCBjaGVjayBleGlzdGVuY3kKKwkJCQkJCQlmYWxzZSk7IC8vIGRvbid0IHJldHJpZXZlIGV4cG9ydGVkIHJvb3RzCisJCQkJCQlwa2dGcmFnbWVudFJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W2FjY3VtdWxhdGVkUm9vdHMuc2l6ZSgpXTsKKwkJCQkJCWFjY3VtdWxhdGVkUm9vdHMuY29weUludG8ocGtnRnJhZ21lbnRSb290cyk7CisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlwa2dGcmFnbWVudFJvb3RzID0gIG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHt9OworCQkJCQl9CisJCQkJfQogCQkJCWFkZENsYXNzcGF0aERlbHRhcyhwa2dGcmFnbWVudFJvb3RzLCBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgsIGRlbHRhKTsKLQorCQkJCQogCQkJCWludCBjaGFuZ2VLaW5kID0gb2xkUmVzb2x2ZWRQYXRoW2ldLmdldEVudHJ5S2luZCgpOwogCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgfD0gKGNoYW5nZUtpbmQgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHx8IG9sZFJlc29sdmVkUGF0aFtpXS5pc0V4cG9ydGVkKCk7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIC5qYXZhIGZpbGVzIGZyb20gdGhlIGluZGV4LgotCQkJCS8vIE5vdGUgdGhhdCAuY2xhc3MgZmlsZXMgYmVsb25nIHRvIGJpbmFyeSBmb2xkZXJzIHdoaWNoIGNhbiBiZSBzaGFyZWQsIAotCQkJCS8vIHNvIGxlYXZlIHRoZSBpbmRleCBmb3IgLmNsYXNzIGZpbGVzLgotCQkJCWlmIChpbmRleE1hbmFnZXIgIT0gbnVsbCAmJiBjaGFuZ2VLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCWluZGV4TWFuYWdlci5yZW1vdmVTb3VyY2VGb2xkZXJGcm9tSW5kZXgocHJvamVjdCwgb2xkUmVzb2x2ZWRQYXRoW2ldLmdldFBhdGgoKSk7CisJCisJCQkJLy8gUmVtb3ZlIHRoZSAuamF2YSBmaWxlcyBmcm9tIHRoZSBpbmRleCBmb3IgYSBzb3VyY2UgZm9sZGVyCisJCQkJLy8gRm9yIGEgbGliIGZvbGRlciBvciBhIC5qYXIgZmlsZSwgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGlmIG5vdCBzaGFyZWQuCisJCQkJaWYgKGluZGV4TWFuYWdlciAhPSBudWxsKSB7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBvbGRFbnRyeSA9IG9sZFJlc29sdmVkUGF0aFtpXTsKKwkJCQkJZmluYWwgSVBhdGggcGF0aCA9IG9sZEVudHJ5LmdldFBhdGgoKTsKKwkJCQkJc3dpdGNoIChjaGFuZ2VLaW5kKSB7CisJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOgorCQkJCQkJCWZpbmFsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gKChDbGFzc3BhdGhFbnRyeSlvbGRFbnRyeSkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpOworCQkJCQkJCXBvc3RBY3Rpb24obmV3IElQb3N0QWN0aW9uKCkgeworCQkJCQkJCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQkJCQkJCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQkJCQkJCWluZGV4TWFuYWdlci5yZW1vdmVTb3VyY2VGb2xkZXJGcm9tSW5kZXgocHJvamVjdCwgcGF0aCwgZXhjbHVzaW9uUGF0dGVybnMpOworCQkJCQkJCQl9CisJCQkJCQkJfSwgCisJCQkJCQkJUkVNT1ZFQUxMX0FQUEVORCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKKwkJCQkJCQlmaW5hbCBEZWx0YVByb2Nlc3NvciBkZWx0YVByb2Nlc3NvciA9IG1hbmFnZXIuZGVsdGFQcm9jZXNzb3I7CisJCQkJCQkJcG9zdEFjdGlvbihuZXcgSVBvc3RBY3Rpb24oKSB7CisJCQkJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCQkJCQkJCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOworCQkJCQkJCQl9CisJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJCQkJCQkJaWYgKGRlbHRhUHJvY2Vzc29yLm90aGVyUm9vdHMuZ2V0KHBhdGgpID09IG51bGwpIHsgLy8gaWYgcm9vdCB3YXMgbm90IHNoYXJlZAorCQkJCQkJCQkJCWluZGV4TWFuYWdlci5kaXNjYXJkSm9icyhwYXRoLnRvU3RyaW5nKCkpOworCQkJCQkJCQkJCWluZGV4TWFuYWdlci5yZW1vdmVJbmRleChwYXRoKTsKKwkJCQkJCQkJCQkvLyBUT0RPOiB3ZSBjb3VsZCBqdXN0IHJlbW92ZSB0aGUgaW4tbWVtb3J5IGluZGV4IGFuZCBoYXZlIHRoZSBpbmRleGluZyBjaGVjayBmb3IgdGltZXN0YW1wcworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfSwgCisJCQkJCQkJUkVNT1ZFQUxMX0FQUEVORCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0JCQogCQkJCX0KIAkJCQloYXNEZWx0YSA9IHRydWU7Ci0KKwkKIAkJCX0gZWxzZSB7CiAJCQkJLy8gZG8gbm90IG5vdGlmeSByZW1vdGUgcHJvamVjdCBjaGFuZ2VzCiAJCQkJaWYgKG9sZFJlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpeworCQkJCQl0aGlzLm5lZWRDeWNsZUNoZWNrIHw9IChvbGRSZXNvbHZlZFBhdGhbaV0uaXNFeHBvcnRlZCgpICE9IG5ld1Jlc29sdmVkUGF0aFtpbmRleF0uaXNFeHBvcnRlZCgpKTsKIAkJCQkJY29udGludWU7IAogCQkJCX0JCQkJCiAJCQkJbmVlZFRvVXBkYXRlRGVwZW5kZW50cyB8PSAob2xkUmVzb2x2ZWRQYXRoW2ldLmlzRXhwb3J0ZWQoKSAhPSBuZXdSZXNvbHZlZFBhdGhbaW5kZXhdLmlzRXhwb3J0ZWQoKSk7Ci0JCQkJaWYgKG9sZFJlc29sdmVkUGF0aExvbmdlc3QgJiYgaW5kZXggIT0gaSkgeyAvL3Jlb3JkZXJpbmcgb2YgdGhlIGNsYXNzcGF0aAorCQkJCWlmIChpbmRleCAhPSBpKSB7IC8vcmVvcmRlcmluZyBvZiB0aGUgY2xhc3NwYXRoCiAJCQkJCQlhZGRDbGFzc3BhdGhEZWx0YXMoCi0JCQkJCQkJcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhvbGRSZXNvbHZlZFBhdGhbaV0pLAotCQkJCQkJCUlKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX1JFT1JERVIsCisJCQkJCQkJcHJvamVjdC5jb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMob2xkUmVzb2x2ZWRQYXRoW2ldKSwKKwkJCQkJCQlJSmF2YUVsZW1lbnREZWx0YS5GX1JFT1JERVIsCiAJCQkJCQkJZGVsdGEpOwogCQkJCQkJaW50IGNoYW5nZUtpbmQgPSBvbGRSZXNvbHZlZFBhdGhbaV0uZ2V0RW50cnlLaW5kKCk7CiAJCQkJCQluZWVkVG9VcGRhdGVEZXBlbmRlbnRzIHw9IChjaGFuZ2VLaW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKTsKQEAgLTI5MSwzNiArMzk4LDQwIEBACiAJCQkJfQogCQkJCQogCQkJCS8vIGNoZWNrIHNvdXJjZSBhdHRhY2htZW50CisJCQkJSVBhdGggbmV3U291cmNlUGF0aCA9IG5ld1Jlc29sdmVkUGF0aFtpbmRleF0uZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKIAkJCQlpbnQgc291cmNlQXR0YWNobWVudEZsYWdzID0gCiAJCQkJCXRoaXMuZ2V0U291cmNlQXR0YWNobWVudERlbHRhRmxhZygKIAkJCQkJCW9sZFJlc29sdmVkUGF0aFtpXS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLAotCQkJCQkJbmV3UmVzb2x2ZWRQYXRoW2luZGV4XS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpKTsKKwkJCQkJCW5ld1NvdXJjZVBhdGgsCisJCQkJCQludWxsLypub3QgYSBzb3VyY2Ugcm9vdCBwYXRoKi8pOwogCQkJCWludCBzb3VyY2VBdHRhY2htZW50Um9vdEZsYWdzID0gCiAJCQkJCXRoaXMuZ2V0U291cmNlQXR0YWNobWVudERlbHRhRmxhZygKIAkJCQkJCW9sZFJlc29sdmVkUGF0aFtpXS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwKLQkJCQkJCW5ld1Jlc29sdmVkUGF0aFtpbmRleF0uZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpOworCQkJCQkJbmV3UmVzb2x2ZWRQYXRoW2luZGV4XS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSwKKwkJCQkJCW5ld1NvdXJjZVBhdGgvKmluIGNhc2UgYm90aCByb290IHBhdGhzIGFyZSBudWxsKi8pOwogCQkJCWludCBmbGFncyA9IHNvdXJjZUF0dGFjaG1lbnRGbGFncyB8IHNvdXJjZUF0dGFjaG1lbnRSb290RmxhZ3M7CiAJCQkJaWYgKGZsYWdzICE9IDApIHsKIAkJCQkJYWRkQ2xhc3NwYXRoRGVsdGFzKAotCQkJCQkJcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhvbGRSZXNvbHZlZFBhdGhbaV0pLAorCQkJCQkJcHJvamVjdC5jb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMob2xkUmVzb2x2ZWRQYXRoW2ldKSwKIAkJCQkJCWZsYWdzLAogCQkJCQkJZGVsdGEpOwogCQkJCQloYXNEZWx0YSA9IHRydWU7CiAJCQkJfQogCQkJfQogCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdSZXNvbHZlZFBhdGgubGVuZ3RoOyBpKyspIHsKLQorCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7CisJCiAJCQlpbnQgaW5kZXggPSBjbGFzc3BhdGhDb250YWlucyhvbGRSZXNvbHZlZFBhdGgsIG5ld1Jlc29sdmVkUGF0aFtpXSk7CiAJCQlpZiAoaW5kZXggPT0gLTEpIHsKIAkJCQkvLyBkbyBub3Qgbm90aWZ5IHJlbW90ZSBwcm9qZWN0IGNoYW5nZXMKIAkJCQlpZiAobmV3UmVzb2x2ZWRQYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCl7CiAJCQkJCW5lZWRUb1VwZGF0ZURlcGVuZGVudHMgPSB0cnVlOworCQkJCQl0aGlzLm5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKIAkJCQkJY29udGludWU7IAogCQkJCX0KIAkJCQlhZGRDbGFzc3BhdGhEZWx0YXMoCi0JCQkJCXByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMobmV3UmVzb2x2ZWRQYXRoW2ldKSwKKwkJCQkJcHJvamVjdC5jb21wdXRlUGFja2FnZUZyYWdtZW50Um9vdHMobmV3UmVzb2x2ZWRQYXRoW2ldKSwKIAkJCQkJSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgsCiAJCQkJCWRlbHRhKTsKIAkJCQlpbnQgY2hhbmdlS2luZCA9IG5ld1Jlc29sdmVkUGF0aFtpXS5nZXRFbnRyeUtpbmQoKTsKQEAgLTMzMCw4ICs0NDEsOCBAQAogCQkJCQlzd2l0Y2ggKGNoYW5nZUtpbmQpIHsKIAkJCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZOgogCQkJCQkJCWJvb2xlYW4gcGF0aEhhc0NoYW5nZWQgPSB0cnVlOwotCQkJCQkJCUlQYXRoIG5ld1BhdGggPSBuZXdSZXNvbHZlZFBhdGhbaV0uZ2V0UGF0aCgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkUmVzb2x2ZWRQYXRoLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJZmluYWwgSVBhdGggbmV3UGF0aCA9IG5ld1Jlc29sdmVkUGF0aFtpXS5nZXRQYXRoKCk7CisJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRMZW5ndGg7IGorKykgewogCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnkgb2xkRW50cnkgPSBvbGRSZXNvbHZlZFBhdGhbal07CiAJCQkJCQkJCWlmIChvbGRFbnRyeS5nZXRQYXRoKCkuZXF1YWxzKG5ld1BhdGgpKSB7CiAJCQkJCQkJCQlwYXRoSGFzQ2hhbmdlZCA9IGZhbHNlOwpAQCAtMzM5LDIxICs0NTAsNDAgQEAKIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCQlpZiAocGF0aEhhc0NoYW5nZWQpIHsKLQkJCQkJCQkJaW5kZXhNYW5hZ2VyLmluZGV4TGlicmFyeShuZXdQYXRoLCBwcm9qZWN0LmdldFByb2plY3QoKSk7CisJCQkJCQkJCXBvc3RBY3Rpb24obmV3IElQb3N0QWN0aW9uKCkgeworCQkJCQkJCQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJCQkJCQkJCQlyZXR1cm4gbmV3UGF0aC50b1N0cmluZygpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkJCQkJCQkJaW5kZXhNYW5hZ2VyLmluZGV4TGlicmFyeShuZXdQYXRoLCBwcm9qZWN0LmdldFByb2plY3QoKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0sIAorCQkJCQkJCQlSRU1PVkVBTExfQVBQRU5EKTsKIAkJCQkJCQl9CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOgotCQkJCQkJCWluZGV4TWFuYWdlci5pbmRleFNvdXJjZUZvbGRlcihwcm9qZWN0LCBuZXdSZXNvbHZlZFBhdGhbaV0uZ2V0UGF0aCgpKTsKKwkJCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBuZXdSZXNvbHZlZFBhdGhbaV07CisJCQkJCQkJZmluYWwgSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCQlmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKTsKKwkJCQkJCQlwb3N0QWN0aW9uKG5ldyBJUG9zdEFjdGlvbigpIHsKKwkJCQkJCQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJCQkJCQkJCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkJCQkJCQlpbmRleE1hbmFnZXIuaW5kZXhTb3VyY2VGb2xkZXIocHJvamVjdCwgcGF0aCwgZXhjbHVzaW9uUGF0dGVybnMpOworCQkJCQkJCQl9CisJCQkJCQkJfSwgCisJCQkJCQkJQVBQRU5EKTsgLy8gYXBwZW5kIHNvIHRoYXQgYSByZW1vdmVTb3VyY2VGb2xkZXIgYWN0aW9uIGlzIG5vdCByZW1vdmVkCiAJCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9CiAJCQkJCiAJCQkJbmVlZFRvVXBkYXRlRGVwZW5kZW50cyB8PSAoY2hhbmdlS2luZCA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgfHwgbmV3UmVzb2x2ZWRQYXRoW2ldLmlzRXhwb3J0ZWQoKTsKIAkJCQloYXNEZWx0YSA9IHRydWU7Ci0KKwkKIAkJCX0gLy8gY2xhc3NwYXRoIHJlb3JkZXJpbmcgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgaW4gcHJldmlvdXMgbG9vcAogCQl9Ci0JCQorCQogCQlpZiAoaGFzRGVsdGEpIHsKIAkJCXRoaXMuYWRkRGVsdGEoZGVsdGEpOwogCQl9CkBAIC0zNzEsMTIgKzUwMSwxNyBAQAogCSAqIFJldHVybnMgZWl0aGVyIEZfU09VUkNFQVRUQUNIRUQsIEZfU09VUkNFREVUQUNIRUQsIEZfU09VUkNFQVRUQUNIRUQgfCBGX1NPVVJDRURFVEFDSEVECiAJICogb3IgMCBpZiB0aGVyZSBpcyBubyBkaWZmZXJlbmNlLgogCSAqLwotCXByaXZhdGUgaW50IGdldFNvdXJjZUF0dGFjaG1lbnREZWx0YUZsYWcoSVBhdGggb2xkUGF0aCwgSVBhdGggbmV3UGF0aCkgeworCXByaXZhdGUgaW50IGdldFNvdXJjZUF0dGFjaG1lbnREZWx0YUZsYWcoSVBhdGggb2xkUGF0aCwgSVBhdGggbmV3UGF0aCwgSVBhdGggc291cmNlUGF0aCkgewogCQlpZiAob2xkUGF0aCA9PSBudWxsKSB7CiAJCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIElKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQ7CiAJCQl9IGVsc2UgewotCQkJCXJldHVybiAwOworCQkJCWlmIChzb3VyY2VQYXRoICE9IG51bGwpIHsKKwkJCQkJLy8gaWYgc291cmNlIHBhdGggaXMgc3BlY2lmaWVkIGFuZCBubyByb290IHBhdGgsIGl0IG5lZWRzIHRvIGJlIHJlY29tcHV0ZWQgZHluYW1pY2FsbHkKKwkJCQkJcmV0dXJuIElKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQgfCBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmIChuZXdQYXRoID09IG51bGwpIHsKIAkJCXJldHVybiBJSmF2YUVsZW1lbnREZWx0YS5GX1NPVVJDRURFVEFDSEVEOwpAQCAtMzk3LDExICs1MzIsMTEgQEAKIAogCXByb3RlY3RlZCB2b2lkIHNhdmVDbGFzc3BhdGhJZk5lY2Vzc2FyeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkKLQkJaWYgKCF0aGlzLmNhbkNoYW5nZVJlc291cmNlKSByZXR1cm47CisJCWlmICghdGhpcy5jYW5DaGFuZ2VSZXNvdXJjZSB8fCAhdGhpcy5uZWVkU2F2ZSkgcmV0dXJuOwogCQkJCQogCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhGb3JTYXZlOwogCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAodGhpcy5uZXdSYXdQYXRoID09IFJldXNlQ2xhc3NwYXRoKXsKKwkJaWYgKHRoaXMubmV3UmF3UGF0aCA9PSBSZXVzZUNsYXNzcGF0aCB8fCB0aGlzLm5ld1Jhd1BhdGggPT0gVXBkYXRlQ2xhc3NwYXRoKXsKIAkJCWNsYXNzcGF0aEZvclNhdmUgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwogCQl9IGVsc2UgewogCQkJY2xhc3NwYXRoRm9yU2F2ZSA9IHRoaXMubmV3UmF3UGF0aDsKQEAgLTQxMyw3ICs1NDgsOSBAQAogCQkJb3V0cHV0TG9jYXRpb25Gb3JTYXZlID0gdGhpcy5uZXdPdXRwdXRMb2NhdGlvbjsKIAkJfQogCQkvLyBpZiByZWFkLW9ubHkgLmNsYXNzcGF0aCwgdGhlbiB0aGUgY2xhc3NwYXRoIHNldHRpbmcgd2lsbCBuZXZlciBiZWVuIHBlcmZvcm1lZCBjb21wbGV0ZWx5Ci0JCXRoaXMuaGFzTW9kaWZpZWRSZXNvdXJjZSA9IHByb2plY3Quc2F2ZUNsYXNzcGF0aChjbGFzc3BhdGhGb3JTYXZlLCBvdXRwdXRMb2NhdGlvbkZvclNhdmUpOworCQlpZiAocHJvamVjdC5zYXZlQ2xhc3NwYXRoKGNsYXNzcGF0aEZvclNhdmUsIG91dHB1dExvY2F0aW9uRm9yU2F2ZSkpIHsKKwkJCXRoaXMuc2V0QXR0cmlidXRlKEhBU19NT0RJRklFRF9SRVNPVVJDRV9BVFRSLCBUUlVFKTsgCisJCX0KIAl9CiAJCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpewpAQCAtNDQ5LDI0ICs1ODYsMjEgQEAKIAkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgwKHRoaXMubmV3UmF3UGF0aCk7CiAKIAkJLy8gcmVzb2x2ZSBuZXcgcGF0aCAoYXNraW5nIGZvciBtYXJrZXIgY3JlYXRpb24gaWYgcHJvYmxlbXMpCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkUGF0aCA9IAotCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCgKLQkJCQl0cnVlLCAvLyBpZ25vcmVVbnJlc29sdmVkRW50cnkKLQkJCQl0aGlzLmNhbkNoYW5nZVJlc291cmNlKTsvLyBhbHNvIHVwZGF0ZSBjcCBtYXJrZXJzCi0KKwkJaWYgKHRoaXMubmV3UmVzb2x2ZWRQYXRoID09IG51bGwpIHsKKwkJCXRoaXMubmV3UmVzb2x2ZWRQYXRoID0gcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlLCB0aGlzLmNhbkNoYW5nZVJlc291cmNlKTsKKwkJfQorCQkKIAkJaWYgKHRoaXMub2xkUmVzb2x2ZWRQYXRoICE9IG51bGwpIHsKIAkJCWdlbmVyYXRlQ2xhc3NwYXRoQ2hhbmdlRGVsdGFzKAogCQkJCXRoaXMub2xkUmVzb2x2ZWRQYXRoLAotCQkJCW5ld1Jlc29sdmVkUGF0aCwKLQkJCQlwcm9qZWN0LmdldEphdmFNb2RlbE1hbmFnZXIoKSwKKwkJCQl0aGlzLm5ld1Jlc29sdmVkUGF0aCwKIAkJCQlwcm9qZWN0KTsKIAkJfSBlbHNlIHsKKwkJCXRoaXMubmVlZEN5Y2xlQ2hlY2sgPSB0cnVlOwogCQkJdXBkYXRlQWZmZWN0ZWRQcm9qZWN0cyhwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpKTsKIAkJfQogCQkKLQkJaWYgKHRoaXMubmVlZEN5Y2xlQ2hlY2spewotCQkJdXBkYXRlQ3ljbGVNYXJrZXJzKG5ld1Jlc29sdmVkUGF0aCk7Ci0JCX0KKwkJdXBkYXRlQ3ljbGVNYXJrZXJzSWZOZWNlc3NhcnkobmV3UmVzb2x2ZWRQYXRoKTsKIAl9CiAKIAkvKioKQEAgLTQ5MywxNCArNjI3LDEzIEBACiAJCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUCiAJCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhwcmVyZXF1aXNpdGVQcm9qZWN0UGF0aCkpIHsKIAkJCQkJCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aCgKLQkJCQkJCQkJcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgCisJCQkJCQkJCVVwZGF0ZUNsYXNzcGF0aCwgCiAJCQkJCQkJCVNldENsYXNzcGF0aE9wZXJhdGlvbi5SZXVzZU91dHB1dExvY2F0aW9uLCAKIAkJCQkJCQkJdGhpcy5mTW9uaXRvciwgCi0JCQkJCQkJCXRoaXMuY2FuQ2hhbmdlUmVzb3VyY2UsIAotCQkJCQkJCQlmYWxzZSwgCisJCQkJCQkJCXRoaXMuY2FuQ2hhbmdlUmVzb3VyY2UsICAKIAkJCQkJCQkJcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSwgCi0JCQkJCQkJCWZhbHNlLCAvLyBubyBmdXJ0aGVyIGN5Y2xlIGNoZWNrCi0JCQkJCQkJCWZhbHNlKTsgLy8gdXBkYXRpbmcgb25seSAtIG5vIHZhbGlkYXRpb24KKwkJCQkJCQkJZmFsc2UsIC8vIHVwZGF0aW5nIG9ubHkgLSBubyB2YWxpZGF0aW9uCisJCQkJCQkJCWZhbHNlKTsgLy8gdXBkYXRpbmcgb25seSAtIG5vIG5lZWQgdG8gc2F2ZQogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQl9CkBAIC01MTUsMTggKzY0OCwyNyBAQAogCS8qKgogCSAqIFVwZGF0ZSBjeWNsZSBtYXJrZXJzCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ3ljbGVNYXJrZXJzKElDbGFzc3BhdGhFbnRyeVtdIG5ld1Jlc29sdmVkUGF0aCkgewotCQkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDeWNsZU1hcmtlcnNJZk5lY2Vzc2FyeShJQ2xhc3NwYXRoRW50cnlbXSBuZXdSZXNvbHZlZFBhdGgpIHsKKworCQlpZiAoIXRoaXMubmVlZEN5Y2xlQ2hlY2spIHJldHVybjsKIAkJaWYgKCF0aGlzLmNhbkNoYW5nZVJlc291cmNlKSByZXR1cm47CiAJCSAKIAkJdHJ5IHsKIAkJCUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIXByb2plY3QuaGFzQ2xhc3NwYXRoQ3ljbGUocHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKSkKLQkJCQkJJiYgIXByb2plY3QuaGFzQ3ljbGVNYXJrZXIoKSl7CisJCQlpZiAoIXByb2plY3QuaGFzQ3ljbGVNYXJrZXIoKSAmJiAhcHJvamVjdC5oYXNDbGFzc3BhdGhDeWNsZShwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpKSl7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkKLQkJCUphdmFQcm9qZWN0LnVwZGF0ZUFsbEN5Y2xlTWFya2VycygpOworCQkJcG9zdEFjdGlvbigKKwkJCQluZXcgSVBvc3RBY3Rpb24oKSB7CisJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCQkJCQlyZXR1cm4gInVwZGF0ZUN5Y2xlTWFya2VycyI7ICAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkJCQlKYXZhUHJvamVjdC51cGRhdGVBbGxDeWNsZU1hcmtlcnMoKTsKKwkJCQkJfQorCQkJCX0sCisJCQkJUkVNT1ZFQUxMX0FQUEVORCk7CiAJCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpewogCQl9CiAJfQpAQCAtNTU0LDggKzY5NiwxMCBAQAogCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpewogCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnPSAoSVBhY2thZ2VGcmFnbWVudClpdGVyLm5leHQoKTsKIAkJCSgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZnJhZy5nZXRQYXJlbnQoKSkuY2xvc2UoKTsKLQkJCWRlbHRhLmFkZGVkKGZyYWcpOwotCQkJZGVsdGFUb0ZpcmUgPSB0cnVlOworCQkJaWYgKCFVdGlsLmlzRXhjbHVkZWQoZnJhZykpIHsKKwkJCQlkZWx0YS5hZGRlZChmcmFnKTsKKwkJCQlkZWx0YVRvRmlyZSA9IHRydWU7CisJCQl9CiAJCX0KIAkKIAkJLy8gc2VlIGlmIHRoaXMgd2lsbCBjYXVzZSBhbnkgcGFja2FnZSBmcmFnbWVudHMgdG8gYmUgcmVtb3ZlZApAQCAtNTYzLDEyICs3MDcsMTggQEAKIAkJaXRlciA9IHJlbW92ZWQuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKXsKIAkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZz0gKElQYWNrYWdlRnJhZ21lbnQpaXRlci5uZXh0KCk7Ci0JCQkoKElQYWNrYWdlRnJhZ21lbnRSb290KWZyYWcuZ2V0UGFyZW50KCkpLmNsb3NlKCk7Ci0JCQlkZWx0YS5yZW1vdmVkKGZyYWcpOwotCQkJZGVsdGFUb0ZpcmUgPSB0cnVlOworCQkJKChJUGFja2FnZUZyYWdtZW50Um9vdClmcmFnLmdldFBhcmVudCgpKS5jbG9zZSgpOyAKKwkJCWlmICghVXRpbC5pc0V4Y2x1ZGVkKGZyYWcpKSB7CisJCQkJZGVsdGEucmVtb3ZlZChmcmFnKTsKKwkJCQlkZWx0YVRvRmlyZSA9IHRydWU7CisJCQl9CiAJCX0KLQkJCi0JCXByb2plY3QuZ2V0SmF2YVByb2plY3RFbGVtZW50SW5mbygpLnNldE91dHB1dExvY2F0aW9uKHRoaXMubmV3T3V0cHV0TG9jYXRpb24pOworCisJCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mb0NoZWNrRXhpc3RlbmNlKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJc3luY2hyb25pemVkIChwZXJQcm9qZWN0SW5mbykgeworCQkJcGVyUHJvamVjdEluZm8ub3V0cHV0TG9jYXRpb24gPSB0aGlzLm5ld091dHB1dExvY2F0aW9uOworCQl9CisJCQkJCiAJCWlmIChkZWx0YVRvRmlyZSkgewogCQkJYWRkRGVsdGEoZGVsdGEpOwkKIAkJfQpAQCAtNTgxLDEyICs3MzEsMTYgQEAKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0UmVmZXJlbmNlc0lmTmVjZXNzYXJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCQogCQlpZiAoIXRoaXMuY2FuQ2hhbmdlUmVzb3VyY2UpIHJldHVybjsKLQkJaWYgKHRoaXMubmV3UmF3UGF0aCA9PSBSZXVzZUNsYXNzcGF0aCB8fCAhdGhpcy5uZWVkQ3ljbGVDaGVjaykgcmV0dXJuOwotCisJCWlmICh0aGlzLm5ld1Jhd1BhdGggPT0gUmV1c2VDbGFzc3BhdGggfHwgdGhpcy5uZXdSYXdQYXRoID09IFVwZGF0ZUNsYXNzcGF0aCkgcmV0dXJuOworCQogCQlKYXZhUHJvamVjdCBqcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJU3RyaW5nW10gb2xkUmVxdWlyZWQgPSBqcHJvamVjdC5nZXRSZXF1aXJlZFByb2plY3ROYW1lcygpOwotCQlTdHJpbmdbXSBuZXdSZXF1aXJlZCA9anByb2plY3QucHJvamVjdFByZXJlcXVpc2l0ZXMoanByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodGhpcy5uZXdSYXdQYXRoLCB0cnVlLCBmYWxzZSkpOworCQlTdHJpbmdbXSBvbGRSZXF1aXJlZCA9IGpwcm9qZWN0LnByb2plY3RQcmVyZXF1aXNpdGVzKHRoaXMub2xkUmVzb2x2ZWRQYXRoKTsKIAorCQlpZiAodGhpcy5uZXdSZXNvbHZlZFBhdGggPT0gbnVsbCkgeworCQkJdGhpcy5uZXdSZXNvbHZlZFBhdGggPSBqcHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0aGlzLm5ld1Jhd1BhdGgsIG51bGwsIHRydWUsIHRoaXMubmVlZFZhbGlkYXRpb24sIG51bGwgLypubyByZXZlcnNlIG1hcCovKTsKKwkJfQorCQlTdHJpbmdbXSBuZXdSZXF1aXJlZCA9IGpwcm9qZWN0LnByb2plY3RQcmVyZXF1aXNpdGVzKHRoaXMubmV3UmVzb2x2ZWRQYXRoKTsKKwkKIAkJdHJ5IHsJCQogCQkJSVByb2plY3QgcHJvamVjdCA9IGpwcm9qZWN0LmdldFByb2plY3QoKTsKIAkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CkBAIC01OTksNyArNzUzLDcgQEAKIAkJCQlvbGRSZWZlcmVuY2VzLmFkZChwcm9qZWN0TmFtZSk7CiAJCQl9CiAJCQlIYXNoU2V0IG5ld1JlZmVyZW5jZXMgPSAoSGFzaFNldClvbGRSZWZlcmVuY2VzLmNsb25lKCk7Ci0KKwkKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVxdWlyZWQubGVuZ3RoOyBpKyspewogCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG9sZFJlcXVpcmVkW2ldOwogCQkJCW5ld1JlZmVyZW5jZXMucmVtb3ZlKHByb2plY3ROYW1lKTsKQEAgLTYwOCw3ICs3NjIsNyBAQAogCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG5ld1JlcXVpcmVkW2ldOwogCQkJCW5ld1JlZmVyZW5jZXMuYWRkKHByb2plY3ROYW1lKTsKIAkJCX0KLQorCQogCQkJSXRlcmF0b3IgaXRlcjsKIAkJCWludCBuZXdTaXplID0gbmV3UmVmZXJlbmNlcy5zaXplKCk7CiAJCQkKQEAgLTYzNiwxMCArNzkwLDEwIEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpemU7IGkrKyl7CiAJCQkJcmVxdWlyZWRQcm9qZWN0QXJyYXlbaV0gPSB3a3NSb290LmdldFByb2plY3QocmVxdWlyZWRQcm9qZWN0TmFtZXNbaV0pOwogCQkJfQotCisJCiAJCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVxdWlyZWRQcm9qZWN0QXJyYXkpOwogCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgdGhpcy5mTW9uaXRvcik7Ci0KKwkKIAkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewogCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKIAkJfQpAQCAtNjgyLDQgKzgzNiw0IEBACiAJCQogCQlyZXR1cm4gSmF2YU1vZGVsU3RhdHVzLlZFUklGSUVEX09LOwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9TaW5nbGVUeXBlUmVxdWVzdG9yLmphdmEKaW5kZXggMjcwNGJkOS4uZGMzZmQ5ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU2luZ2xlVHlwZVJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NpbmdsZVR5cGVSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEVsZW1lbnRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3J0RWxlbWVudEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQ2NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEVsZW1lbnRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxMjM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5Db21waWxhdGlvblVuaXRTb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlNvdXJjZUVsZW1lbnRSZXF1ZXN0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsVG9rZW5zOworCisvKioKKyAqIAorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgU29ydEVsZW1lbnRCdWlsZGVyIGV4dGVuZHMgU291cmNlRWxlbWVudFJlcXVlc3RvckFkYXB0ZXIgeworCisJYWJzdHJhY3QgY2xhc3MgU29ydEVsZW1lbnQgZXh0ZW5kcyBTb3J0SmF2YUVsZW1lbnQgeworCQlTb3J0RWxlbWVudChpbnQgc291cmNlU3RhcnQsIGludCBtb2RpZmllcnMpIHsKKwkJCXN1cGVyKFNvcnRFbGVtZW50QnVpbGRlci50aGlzKTsKKwkJCXRoaXMuc291cmNlU3RhcnQgPSBub3JtYWxpemVTb3VyY2VTdGFydChzb3VyY2VTdGFydCk7CisJCQltb2RpZmllcnMgJj0gfm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsZXJNb2RpZmllcnMuQWNjSW50ZXJmYWNlOyAvLyByZW1vdmUgQWNjSW50ZXJmYWNlIGZsYWdzCisJCQltb2RpZmllcnMgJj0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVycy5BY2NKdXN0RmxhZzsKKwkJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCQkJdGhpcy5jaGlsZHJlbl9jb3VudCA9IDA7CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcywgU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgeworCQkJCVN0cmluZyB0eXBlID0gcGFyYW1ldGVyVHlwZXNbaV07CisJCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKKwkJCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUocGFyYW1ldGVyTmFtZXNbaV0pKTsKKwkJCQlpbnQgaW5kZXhPZkFycmF5QnJhY2U7CisJCQkJaWYgKHR5cGUuaW5kZXhPZignLicpICE9IC0xKSB7CisJCQkJCVN0cmluZ1tdIHR5cGVQYXJ0cyA9IHNwbGl0T24oJy4nLCB0eXBlKTsKKwkJCQkJaW50IGxlbmd0aCA9IHR5cGVQYXJ0cy5sZW5ndGg7CisJCQkJCWluZGV4T2ZBcnJheUJyYWNlID0gdHlwZVBhcnRzW2xlbmd0aCAtIDFdLmluZGV4T2YoJ1snKTsKKwkJCQkJaWYgKGluZGV4T2ZBcnJheUJyYWNlICE9IC0xKSB7CisJCQkJCQlpbnQgZGltZW5zaW9ucyA9IG9jY3VyZW5jZXNPZignWycsIHR5cGVQYXJ0c1tsZW5ndGggLSAxXSk7CisJCQkJCQl0eXBlUGFydHNbbGVuZ3RoIC0gMV0gPSB0eXBlUGFydHNbbGVuZ3RoIC0gMV0uc3Vic3RyaW5nKDAsIGluZGV4T2ZBcnJheUJyYWNlKTsKKwkJCQkJCVN0cmluZ1tdIHR5cGVTdWJzdHJpbmdzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJCXR5cGVTdWJzdHJpbmdzW2pdID0gbmV3IFN0cmluZyh0eXBlUGFydHNbal0pOworCQkJCQkJfQorCQkJCQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKGFzdC5uZXdBcnJheVR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUodHlwZVN1YnN0cmluZ3MpKSwgZGltZW5zaW9ucykpOworCQkJCQl9IGVsc2UgeworCQkJCQkJU3RyaW5nW10gdHlwZVN1YnN0cmluZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQkJdHlwZVN1YnN0cmluZ3Nbal0gPSBuZXcgU3RyaW5nKHR5cGVQYXJ0c1tqXSk7CisJCQkJCQl9CisJCQkJCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUodHlwZVN1YnN0cmluZ3MpKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKChpbmRleE9mQXJyYXlCcmFjZSA9IHR5cGUuaW5kZXhPZignWycpKSAhPSAtMSkgeworCQkJCQlpbnQgZGltZW5zaW9ucyA9IG9jY3VyZW5jZXNPZignWycsIHR5cGUpOworCQkJCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaW5kZXhPZkFycmF5QnJhY2UpOworCQkJCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldFR5cGUoYXN0Lm5ld0FycmF5VHlwZShuZXdUeXBlKHR5cGUpLCBkaW1lbnNpb25zKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKG5ld1R5cGUodHlwZSkpOworCQkJCX0KKwkJCQltZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkuYWRkKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pOworCQkJfQorCQl9CisJCQkKKwkJcHJvdGVjdGVkIFN0cmluZ1tdIHNwbGl0T24oY2hhciBkaXZpZGVyLCBTdHJpbmcgc3RyaW5nVG9TcGxpdCkgeworCQkJaW50IGxlbmd0aCA9IHN0cmluZ1RvU3BsaXQgPT0gbnVsbCA/IDAgOiBzdHJpbmdUb1NwbGl0Lmxlbmd0aCgpOworCQkJaWYgKGxlbmd0aCA9PSAwKQorCQkJCXJldHVybiBuZXcgU3RyaW5nW10geyBzdHJpbmdUb1NwbGl0IH07CisJCisJCQlpbnQgd29yZENvdW50ID0gMTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQkJaWYgKHN0cmluZ1RvU3BsaXQuY2hhckF0KGkpID09IGRpdmlkZXIpCisJCQkJCXdvcmRDb3VudCsrOworCQkJU3RyaW5nW10gc3BsaXQgPSBuZXcgU3RyaW5nW3dvcmRDb3VudF07CisJCQlpbnQgbGFzdCA9IDAsIGN1cnJlbnRXb3JkID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoc3RyaW5nVG9TcGxpdC5jaGFyQXQoaSkgPT0gZGl2aWRlcikgeworCQkJCQlzcGxpdFtjdXJyZW50V29yZCsrXSA9IHN0cmluZ1RvU3BsaXQuc3Vic3RyaW5nKGxhc3QsIGkpOworCQkJCQlsYXN0ID0gaSArIDE7CisJCQkJfQorCQkJfQorCQkJc3BsaXRbY3VycmVudFdvcmRdID0gc3RyaW5nVG9TcGxpdC5zdWJzdHJpbmcobGFzdCwgbGVuZ3RoKTsKKwkJCXJldHVybiBzcGxpdDsKKwkJfQorCQkKKwkJcHJvdGVjdGVkIGludCBvY2N1cmVuY2VzT2YoY2hhciB0b0JlRm91bmQsIFN0cmluZyBzKSB7CisJCQlpZiAocyA9PSBudWxsKSByZXR1cm4gMDsKKwkJCWludCBjb3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcy5sZW5ndGgoKTsgaSA8IG1heDsgaSsrKQorCQkJCWlmICh0b0JlRm91bmQgPT0gcy5jaGFyQXQoaSkpCisJCQkJCWNvdW50Kys7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJCisJCXByb3RlY3RlZCBUeXBlIG5ld1R5cGUoU3RyaW5nIHR5cGUpIHsKKwkJCS8vIGNoZWNrIGlmIHR5cGUgaXMgYSBwcmltaXRpdmUgdHlwZQorCQkJc2Nhbm5lci5zZXRTb3VyY2UodHlwZS50b0NoYXJBcnJheSgpKTsKKwkJCXNjYW5uZXIucmVzZXRUbygwLCB0eXBlLmxlbmd0aCgpKTsKKwkJCWludCB0b2tlbiA9IDA7CisJCQl0cnkgeworCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCX0gY2F0Y2goSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICh0b2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyKSB7CisJCQkJcmV0dXJuIGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodHlwZSkpKTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoKHRva2VuKSB7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1laW50IDoKKwkJCQkJCXJldHVybiBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCk7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lYnl0ZSA6CisJCQkJCQlyZXR1cm4gYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CWVRFKTsKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVib29sZWFuIDoKKwkJCQkJCXJldHVybiBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWNoYXIgOgorCQkJCQkJcmV0dXJuIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQ0hBUik7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZG91YmxlIDoKKwkJCQkJCXJldHVybiBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkRPVUJMRSk7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lZmxvYXQgOgorCQkJCQkJcmV0dXJuIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuRkxPQVQpOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZWxvbmcgOgorCQkJCQkJcmV0dXJuIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuTE9ORyk7CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lc2hvcnQgOgorCQkJCQkJcmV0dXJuIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuU0hPUlQpOworCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZXZvaWQgOgorCQkJCQkJcmV0dXJuIGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuVk9JRCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlhYnN0cmFjdCBBU1ROb2RlIGNvbnZlcnQoKTsKKwl9CisJCisJYWJzdHJhY3QgY2xhc3MgU29ydEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBTb3J0RWxlbWVudCB7CisKKwkJU29ydEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oaW50IHNvdXJjZVN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgY2hhcltdW10gcGFyYW1ldGVyc05hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJzVHlwZXMsIGNoYXJbXVtdIHRocm93bkV4Y2VwdGlvbnMpIHsJCQkKKwkJCXN1cGVyKHNvdXJjZVN0YXJ0LCBtb2RpZmllcnMpOworCQkJdGhpcy5uYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKKwkJCWlmIChwYXJhbWV0ZXJzTmFtZXMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBwYXJhbWV0ZXJzTmFtZXMubGVuZ3RoOworCQkJCXRoaXMucGFyYW1ldGVyc05hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJdGhpcy5wYXJhbWV0ZXJzTmFtZXNbaV0gPSBuZXcgU3RyaW5nKHBhcmFtZXRlcnNOYW1lc1tpXSk7CisJCQkJCXRoaXMucGFyYW1ldGVyc1R5cGVzW2ldID0gbmV3IFN0cmluZyhwYXJhbWV0ZXJzVHlwZXNbaV0pOworCQkJCX0KKwkJCX0KKwkJCWlmICh0aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKKwkJCQlpbnQgbGVuZ3RoID0gdGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7CisJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJdGhpcy50aHJvd25FeGNlcHRpb25zW2ldID0gbmV3IFN0cmluZyh0aHJvd25FeGNlcHRpb25zW2ldKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCQlwdWJsaWMgU3RyaW5nIGRlY29kZVNpZ25hdHVyZSgpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWZmZXIuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh0aGlzLnBhcmFtZXRlcnNOYW1lcyAhPSBudWxsKSB7CisJCQkJaW50IGxlbmd0aCA9IHBhcmFtZXRlcnNOYW1lcy5sZW5ndGg7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKKwkJCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXJzVHlwZXNbaV0gKyAiICIgKyBwYXJhbWV0ZXJzTmFtZXNbaV0gKyAiLCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJCWJ1ZmZlci5hcHBlbmQocGFyYW1ldGVyc1R5cGVzW2xlbmd0aCAtIDFdICsgIiAiICsgcGFyYW1ldGVyc05hbWVzW2xlbmd0aCAtIDFdKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJCX0KKworCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3J0RWxlbWVudEJ1aWxkZXIuU29ydEVsZW1lbnQjZ2VuZXJhdGVTb3VyY2UoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU291cmNlKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJCXN1cGVyLmdlbmVyYXRlU291cmNlKGJ1ZmZlcik7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jaGlsZHJlbl9jb3VudDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBzdGFydCA9IHRoaXMuc291cmNlU3RhcnQ7CisJCQkJaW50IGVuZCA9IHRoaXMuZmlyc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlU3RhcnQgLSAxOworCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCXRoaXMuY2hpbGRyZW5baV0uZ2VuZXJhdGVTb3VyY2UoYnVmZmVyKTsKKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQlzdGFydCA9IHRoaXMuY2hpbGRyZW5baV0uc291cmNlRW5kICsgMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5sYXN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZUVuZCArIDE7CisJCQkJCX0KKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQllbmQgPSB0aGlzLmNoaWxkcmVuW2kgKyAxXS5zb3VyY2VTdGFydCAtIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllbmQgPSB0aGlzLnNvdXJjZUVuZDsKKwkJCQkJfQorCQkJCX0KKwkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCB0aGlzLnNvdXJjZVN0YXJ0LCB0aGlzLnNvdXJjZUVuZCAtIHRoaXMuc291cmNlU3RhcnQgKyAxKTsKKwkJCX0JCisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBtYXBQb3NpdGlvbnMoKSB7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jaGlsZHJlbl9jb3VudDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBzdGFydCA9IHRoaXMuc291cmNlU3RhcnQ7CisJCQkJaW50IGVuZCA9IHRoaXMuZmlyc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlU3RhcnQgLSAxOworCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgc3RhcnQsIGVuZCk7CisJCQkJCXRoaXMuY2hpbGRyZW5baV0ubWFwUG9zaXRpb25zKCk7CisJCQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCQkJc3RhcnQgPSB0aGlzLmNoaWxkcmVuW2ldLnNvdXJjZUVuZCArIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzdGFydCA9IHRoaXMubGFzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VFbmQgKyAxOworCQkJCQl9CisJCQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCQkJZW5kID0gdGhpcy5jaGlsZHJlbltpICsgMV0uc291cmNlU3RhcnQgLSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZW5kID0gdGhpcy5zb3VyY2VFbmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJfSBlbHNlIHsKKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCQkJfQkKKwkJfQorCX0KKwkKKwljbGFzcyBTb3J0TWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBTb3J0QWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiB7CisJCVNvcnRNZXRob2REZWNsYXJhdGlvbihpbnQgc291cmNlU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJzTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlcnNUeXBlcywgY2hhcltdW10gdGhyb3duRXhjZXB0aW9ucywgY2hhcltdIHJldHVyblR5cGUpIHsJCQkKKwkJCXN1cGVyKHNvdXJjZVN0YXJ0LCBtb2RpZmllcnMsIG5hbWUsIHBhcmFtZXRlcnNOYW1lcywgcGFyYW1ldGVyc1R5cGVzLCB0aHJvd25FeGNlcHRpb25zKTsKKwkJCXRoaXMuaWQgPSBNRVRIT0Q7CisJCQl0aGlzLnJldHVyblR5cGUgPSBuZXcgU3RyaW5nKHJldHVyblR5cGUpOworCQl9CisJCQorCQl2b2lkIGRpc3BsYXkoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHRhYikgeworCQkJYnVmZmVyCisJCQkJLmFwcGVuZCh0YWIodGFiKSkKKwkJCQkuYXBwZW5kKCJtZXRob2QgIikgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQobmFtZSkKKwkJCQkuYXBwZW5kKGRlY29kZVNpZ25hdHVyZSgpKQorCQkJCS5hcHBlbmQoIiAiICsgcmV0dXJuVHlwZSArIExJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlBU1ROb2RlIGNvbnZlcnQoKSB7CisJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOworCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0Q29uc3RydWN0b3IoZmFsc2UpOworCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzKTsKKwkJCW1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0aGlzLm5hbWUpKSk7CisJCQltZXRob2REZWNsYXJhdGlvbi5zZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIsIG5ldyBJbnRlZ2VyKHRoaXMuc291cmNlU3RhcnQpKTsKKwkJCS8vIHNldCBwYXJhbWV0ZXIgbmFtZXMgYW5kIHR5cGVzCisJCQlpZiAodGhpcy5wYXJhbWV0ZXJzTmFtZXMgIT0gbnVsbCkgeworCQkJCXNldFBhcmFtZXRlcnMobWV0aG9kRGVjbGFyYXRpb24sIHRoaXMucGFyYW1ldGVyc05hbWVzLCB0aGlzLnBhcmFtZXRlcnNUeXBlcyk7CisJCQl9CisJCQkvLyBzZXQgdGhyb3duIGV4Y2VwdGlvbnMKKwkJCWlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gdGhpcy50aHJvd25FeGNlcHRpb25zLmxlbmd0aDsgaiA8IG1heDI7IGorKykgeworCQkJCQlTdHJpbmcgY3VycmVudEV4Y2VwdGlvbiA9IHRoaXMudGhyb3duRXhjZXB0aW9uc1tqXTsKKwkJCQkJTmFtZSBleGNlcHRpb25OYW1lOworCQkJCQlpZiAoY3VycmVudEV4Y2VwdGlvbi5pbmRleE9mKCcuJykgPT0gLTEpIHsKKwkJCQkJCWV4Y2VwdGlvbk5hbWUgPSBhc3QubmV3U2ltcGxlTmFtZShjdXJyZW50RXhjZXB0aW9uKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWV4Y2VwdGlvbk5hbWUgPSBhc3QubmV3TmFtZShzcGxpdE9uKCcuJywgY3VycmVudEV4Y2VwdGlvbikpOworCQkJCQl9CisJCQkJCW1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnMoKS5hZGQoZXhjZXB0aW9uTmFtZSk7CisJCQkJfQorCQkJfQorCQkJLy8gc2V0IHJldHVybiB0eXBlCisJCQlpbnQgaW5kZXhPZkFycmF5QnJhY2U7CisJCQlTdHJpbmcgY3VycmVudFJldHVyblR5cGUgPSB0aGlzLnJldHVyblR5cGU7CisJCQlpZiAoY3VycmVudFJldHVyblR5cGUuaW5kZXhPZignLicpICE9IC0xKSB7CisJCQkJU3RyaW5nW10gcmV0dXJuVHlwZVN1YnN0cmluZ3MgPSBzcGxpdE9uKCcuJywgY3VycmVudFJldHVyblR5cGUpOworCQkJCWludCBsZW5ndGggPSByZXR1cm5UeXBlU3Vic3RyaW5ncy5sZW5ndGg7CisJCQkJaW5kZXhPZkFycmF5QnJhY2UgPSByZXR1cm5UeXBlU3Vic3RyaW5nc1tsZW5ndGggLSAxXS5pbmRleE9mKCdbJyk7CisJCQkJaWYgKGluZGV4T2ZBcnJheUJyYWNlICE9IC0xKSB7CisJCQkJCWludCBkaW1lbnNpb25zID0gb2NjdXJlbmNlc09mKCdbJywgcmV0dXJuVHlwZVN1YnN0cmluZ3NbbGVuZ3RoIC0gMV0pOworCQkJCQlyZXR1cm5UeXBlU3Vic3RyaW5nc1tsZW5ndGggLSAxXSA9IHJldHVyblR5cGVTdWJzdHJpbmdzW2xlbmd0aCAtIDFdLnN1YnN0cmluZygwLCBpbmRleE9mQXJyYXlCcmFjZSk7CisJCQkJCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUoYXN0Lm5ld0FycmF5VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShyZXR1cm5UeXBlU3Vic3RyaW5ncykpLCBkaW1lbnNpb25zKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UmV0dXJuVHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShyZXR1cm5UeXBlU3Vic3RyaW5ncykpKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKChpbmRleE9mQXJyYXlCcmFjZSA9IGN1cnJlbnRSZXR1cm5UeXBlLmluZGV4T2YoJ1snKSkgIT0gLTEpIHsKKwkJCQlpbnQgZGltZW5zaW9ucyA9IG9jY3VyZW5jZXNPZignWycsIGN1cnJlbnRSZXR1cm5UeXBlKTsKKwkJCQljdXJyZW50UmV0dXJuVHlwZSA9IGN1cnJlbnRSZXR1cm5UeXBlLnN1YnN0cmluZygwLCBpbmRleE9mQXJyYXlCcmFjZSk7CisJCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UmV0dXJuVHlwZShhc3QubmV3QXJyYXlUeXBlKG5ld1R5cGUoY3VycmVudFJldHVyblR5cGUpLCBkaW1lbnNpb25zKSk7CisJCQl9IGVsc2UgeworCQkJCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUobmV3VHlwZShjdXJyZW50UmV0dXJuVHlwZSkpOworCQkJfQorCQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwkJCQkKKwkJfQorCX0KKworCWNsYXNzIFNvcnRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgU29ydEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24geworCQlTb3J0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihpbnQgc291cmNlU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJzTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlcnNUeXBlcywgY2hhcltdW10gdGhyb3duRXhjZXB0aW9ucykgewkJCQorCQkJc3VwZXIoc291cmNlU3RhcnQsIG1vZGlmaWVycywgbmFtZSwgcGFyYW1ldGVyc05hbWVzLCBwYXJhbWV0ZXJzVHlwZXMsIHRocm93bkV4Y2VwdGlvbnMpOworCQkJdGhpcy5pZCA9IENPTlNUUlVDVE9SOworCQl9CisKKwkJdm9pZCBkaXNwbGF5KFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCB0YWIpIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQodGFiKHRhYikpCisJCQkJLmFwcGVuZCgiY29uc3RydWN0b3IgIikgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoZGVjb2RlU2lnbmF0dXJlKCkgKyBMSU5FX1NFUEFSQVRPUik7CisJCX0KKwkJCisJCUFTVE5vZGUgY29udmVydCgpIHsKKwkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7CisJCQltZXRob2REZWNsYXJhdGlvbi5zZXRDb25zdHJ1Y3Rvcih0cnVlKTsKKwkJCW1ldGhvZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycyk7CisJCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKG5ldyBTdHJpbmcodGhpcy5uYW1lKSkpOworCQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0UHJvcGVydHkoQ29tcGlsYXRpb25Vbml0U29ydGVyLlJFTEFUSVZFX09SREVSLCBuZXcgSW50ZWdlcih0aGlzLnNvdXJjZVN0YXJ0KSk7CisJCQkvLyBzZXQgcGFyYW1ldGVyIG5hbWVzIGFuZCB0eXBlcworCQkJaWYgKHRoaXMucGFyYW1ldGVyc05hbWVzICE9IG51bGwpIHsKKwkJCQlzZXRQYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uLCB0aGlzLnBhcmFtZXRlcnNOYW1lcywgdGhpcy5wYXJhbWV0ZXJzVHlwZXMpOworCQkJfQorCQkJLy8gc2V0IHRocm93biBleGNlcHRpb25zCisJCQlpZiAodGhpcy50aHJvd25FeGNlcHRpb25zICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBqID0gMCwgbWF4MiA9IHRoaXMudGhyb3duRXhjZXB0aW9ucy5sZW5ndGg7IGogPCBtYXgyOyBqKyspIHsKKwkJCQkJU3RyaW5nIGN1cnJlbnRFeGNlcHRpb24gPSB0aGlzLnRocm93bkV4Y2VwdGlvbnNbal07CisJCQkJCU5hbWUgZXhjZXB0aW9uTmFtZTsKKwkJCQkJaWYgKGN1cnJlbnRFeGNlcHRpb24uaW5kZXhPZignLicpID09IC0xKSB7CisJCQkJCQlleGNlcHRpb25OYW1lID0gYXN0Lm5ld1NpbXBsZU5hbWUoY3VycmVudEV4Y2VwdGlvbik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlleGNlcHRpb25OYW1lID0gYXN0Lm5ld05hbWUoc3BsaXRPbignLicsIGN1cnJlbnRFeGNlcHRpb24pKTsKKwkJCQkJfQorCQkJCQltZXRob2REZWNsYXJhdGlvbi50aHJvd25FeGNlcHRpb25zKCkuYWRkKGV4Y2VwdGlvbk5hbWUpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKKwkJfQkJCQorCX0KKwkKKwlwdWJsaWMgY2xhc3MgU29ydEZpZWxkRGVjbGFyYXRpb24gZXh0ZW5kcyBTb3J0RWxlbWVudCB7CisJCWludCBwcmV2aW91c1NvdXJjZUVuZDsKKworCQlTb3J0RmllbGREZWNsYXJhdGlvbihpbnQgc291cmNlU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSB0eXBlLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTb3VyY2VTdGFydCkgeworCQkJc3VwZXIoc291cmNlU3RhcnQsIG1vZGlmaWVycyk7CisJCQl0aGlzLmRlY2xhcmF0aW9uU3RhcnQgPSBzb3VyY2VTdGFydDsKKwkJCXRoaXMuaWQgPSBGSUVMRDsKKwkJCXRoaXMudHlwZSA9IG5ldyBTdHJpbmcodHlwZSk7CisJCQl0aGlzLm5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOworCQkJdGhpcy5uYW1lU291cmNlU3RhcnQgPSBuYW1lU291cmNlU3RhcnQ7CisJCX0KKworCQl2b2lkIGRpc3BsYXkoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHRhYikgeworCQkJYnVmZmVyCisJCQkJLmFwcGVuZCh0YWIodGFiKSkKKwkJCQkuYXBwZW5kKCJmaWVsZCAiKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZCh0eXBlICsgIiAiICsgbmFtZSArIExJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlBU1ROb2RlIGNvbnZlcnQoKSB7CisJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOworCQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUobmV3IFN0cmluZyh0aGlzLm5hbWUpKSk7CisJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOworCisJCQlTdHJpbmcgY3VycmVudEZpZWxkVHlwZSA9IHRoaXMudHlwZTsKKwkJCQorCQkJaW50IGluZGV4T2ZBcnJheUJyYWNlOworCQkJaWYgKGN1cnJlbnRGaWVsZFR5cGUuaW5kZXhPZignLicpICE9IC0xKSB7CisJCQkJU3RyaW5nW10gdHlwZVBhcnRzID0gc3BsaXRPbignLicsIGN1cnJlbnRGaWVsZFR5cGUpOworCQkJCWludCBsZW5ndGggPSB0eXBlUGFydHMubGVuZ3RoOworCQkJCWluZGV4T2ZBcnJheUJyYWNlID0gdHlwZVBhcnRzW2xlbmd0aCAtIDFdLmluZGV4T2YoJ1snKTsKKwkJCQlpZiAoaW5kZXhPZkFycmF5QnJhY2UgIT0gLTEpIHsKKwkJCQkJaW50IGRpbWVuc2lvbnMgPSBvY2N1cmVuY2VzT2YoJ1snLCB0eXBlUGFydHNbbGVuZ3RoIC0gMV0pOworCQkJCQl0eXBlUGFydHNbbGVuZ3RoIC0gMV0gPSB0eXBlUGFydHNbbGVuZ3RoIC0gMV0uc3Vic3RyaW5nKDAsIGluZGV4T2ZBcnJheUJyYWNlKTsKKwkJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKGFzdC5uZXdBcnJheVR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUodHlwZVBhcnRzKSksIGRpbWVuc2lvbnMpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUodHlwZVBhcnRzKSkpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluZGV4T2ZBcnJheUJyYWNlID0gY3VycmVudEZpZWxkVHlwZS5pbmRleE9mKCdbJykpICE9IC0xKSB7CisJCQkJaW50IGRpbWVuc2lvbnMgPSBvY2N1cmVuY2VzT2YoJ1snLCBjdXJyZW50RmllbGRUeXBlKTsKKwkJCQljdXJyZW50RmllbGRUeXBlID0gY3VycmVudEZpZWxkVHlwZS5zdWJzdHJpbmcoMCwgaW5kZXhPZkFycmF5QnJhY2UpOworCQkJCWZpZWxkRGVjbGFyYXRpb24uc2V0VHlwZShhc3QubmV3QXJyYXlUeXBlKG5ld1R5cGUoY3VycmVudEZpZWxkVHlwZSksIGRpbWVuc2lvbnMpKTsKKwkJCX0gZWxzZSB7CisJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKG5ld1R5cGUoY3VycmVudEZpZWxkVHlwZSkpOworCQkJfQorCQkJZmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnModGhpcy5tb2RpZmllcnMpOworCQkJZmllbGREZWNsYXJhdGlvbi5zZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIsIG5ldyBJbnRlZ2VyKHRoaXMuc291cmNlU3RhcnQpKTsKKwkJCXJldHVybiBmaWVsZERlY2xhcmF0aW9uOworCQl9CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvcnRFbGVtZW50QnVpbGRlci5Tb3J0RWxlbWVudCNnZW5lcmF0ZVNvdXJjZShqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQorCQkgKi8KKwkJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVTb3VyY2UoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQkJc3VwZXIuZ2VuZXJhdGVTb3VyY2UoYnVmZmVyKTsKKwkJCWludCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuX2NvdW50OworCQkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQkJaW50IHN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydDsKKwkJCQlpbnQgZW5kID0gdGhpcy5maXJzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VTdGFydCAtIDE7CisKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJdGhpcy5jaGlsZHJlbltpXS5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5jaGlsZHJlbltpXS5zb3VyY2VFbmQgKyAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQkJfQorCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCWVuZCA9IHRoaXMuY2hpbGRyZW5baSArIDFdLnNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVuZCA9IHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJYnVmZmVyLmFwcGVuZChTb3J0RWxlbWVudEJ1aWxkZXIudGhpcy5zb3VyY2UsIHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCAtIHRoaXMuc291cmNlU3RhcnQgKyAxKTsKKwkJCX0JCisJCX0KKwkJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVSZWR1Y2VTb3VyY2UoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQkJaW50IGxlbmd0aCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7CisJCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCQlpbnQgc3RhcnQgPSB0aGlzLm5hbWVTb3VyY2VTdGFydDsKKwkJCQlpbnQgZW5kID0gdGhpcy5maXJzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VTdGFydCAtIDE7CisJCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQkJCXRoaXMuY2hpbGRyZW5baV0uZ2VuZXJhdGVTb3VyY2UoYnVmZmVyKTsKKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQlzdGFydCA9IHRoaXMuY2hpbGRyZW5baV0uc291cmNlRW5kICsgMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5sYXN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZUVuZCArIDE7CisJCQkJCX0KKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQllbmQgPSB0aGlzLmNoaWxkcmVuW2kgKyAxXS5zb3VyY2VTdGFydCAtIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllbmQgPSB0aGlzLnNvdXJjZUVuZDsKKwkJCQkJfQorCQkJCX0KKwkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCB0aGlzLm5hbWVTb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQgLSB0aGlzLm5hbWVTb3VyY2VTdGFydCArIDEpOworCQkJfQkKKwkJfQorCQlwcm90ZWN0ZWQgdm9pZCBtYXBSZWR1Y2VkUG9zaXRpb25zKCkgeworCQkJaW50IGxlbmd0aCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7CisJCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCQlpbnQgc3RhcnQgPSB0aGlzLm5hbWVTb3VyY2VTdGFydDsKKwkJCQlpbnQgZW5kID0gdGhpcy5maXJzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VTdGFydCAtIDE7CisJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJdGhpcy5jaGlsZHJlbltpXS5tYXBQb3NpdGlvbnMoKTsKKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQlzdGFydCA9IHRoaXMuY2hpbGRyZW5baV0uc291cmNlRW5kICsgMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5sYXN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZUVuZCArIDE7CisJCQkJCX0KKwkJCQkJaWYgKGkgPCBsZW5ndGggLSAxKSB7CisJCQkJCQllbmQgPSB0aGlzLmNoaWxkcmVuW2kgKyAxXS5zb3VyY2VTdGFydCAtIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllbmQgPSB0aGlzLnNvdXJjZUVuZDsKKwkJCQkJfQorCQkJCX0KKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgc3RhcnQsIGVuZCk7CisJCQl9IGVsc2UgeworCQkJCW1hcE5leHRQb3NpdGlvbih0aGlzLCB0aGlzLm5hbWVTb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCQkJfQkKKwkJfQorCQkKKwkJcHJvdGVjdGVkIHZvaWQgbWFwUG9zaXRpb25zKCkgeworCQkJaW50IGxlbmd0aCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7CisJCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCQlpbnQgc3RhcnQgPSB0aGlzLnNvdXJjZVN0YXJ0OworCQkJCWludCBlbmQgPSB0aGlzLmZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZVN0YXJ0IC0gMTsKKworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJCQl0aGlzLmNoaWxkcmVuW2ldLm1hcFBvc2l0aW9ucygpOworCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5jaGlsZHJlbltpXS5zb3VyY2VFbmQgKyAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQkJfQorCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCWVuZCA9IHRoaXMuY2hpbGRyZW5baSArIDFdLnNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVuZCA9IHRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQkJCX0KKwkJCQl9CisJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJfSBlbHNlIHsKKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCQl9CQorCQl9CisJfQorCQorCWNsYXNzIFNvcnRNdWx0aXBsZUZpZWxkRGVjbGFyYXRpb24gZXh0ZW5kcyBTb3J0RWxlbWVudCB7CisJCWludCBkZWNsYXJhdGlvblN0YXJ0OworCQkKKwkJU29ydE11bHRpcGxlRmllbGREZWNsYXJhdGlvbihTb3J0RmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uKSB7CisJCQlzdXBlcihmaWVsZERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU3RhcnQsIGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzKTsKKwkJCXRoaXMuZGVjbGFyYXRpb25TdGFydCA9IGZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25TdGFydDsKKwkJCXRoaXMuaWQgPSBNVUxUSVBMRV9GSUVMRDsKKwkJCXRoaXMuaW5uZXJGaWVsZHMgPSBuZXcgU29ydEZpZWxkRGVjbGFyYXRpb25bMV07CisJCQl0aGlzLmZpZWxkQ291bnRlciA9IDA7CisJCQl0aGlzLmlubmVyRmllbGRzW3RoaXMuZmllbGRDb3VudGVyKytdID0gZmllbGREZWNsYXJhdGlvbjsKKwkJCXRoaXMudHlwZSA9IGZpZWxkRGVjbGFyYXRpb24udHlwZTsKKwkJCXRoaXMuc291cmNlU3RhcnQgPSBmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0OworCQkJZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQgPSBmaWVsZERlY2xhcmF0aW9uLnByZXZpb3VzU291cmNlRW5kOworCQl9CisJCQorCQl2b2lkIGFkZEZpZWxkKFNvcnRGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24pIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5pbm5lckZpZWxkcywgMCwgdGhpcy5pbm5lckZpZWxkcyA9IG5ldyBTb3J0RmllbGREZWNsYXJhdGlvblt0aGlzLmZpZWxkQ291bnRlciArIDFdLCAwLCB0aGlzLmZpZWxkQ291bnRlcik7CisJCQl0aGlzLmlubmVyRmllbGRzW3RoaXMuZmllbGRDb3VudGVyKytdID0gZmllbGREZWNsYXJhdGlvbjsKKwkJCWZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbi5wcmV2aW91c1NvdXJjZUVuZDsKKwkJfQorCQkKKwkJdm9pZCBkaXNwbGF5KFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCB0YWIpIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQodGFiKHRhYikpCisJCQkJLmFwcGVuZCgibXVsdGlwbGUgZmllbGRzICIpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKwkJCWlmICh0aGlzLmlubmVyRmllbGRzICE9IG51bGwpIHsKKwkJCQlidWZmZXIKKwkJCQkJLmFwcGVuZCh0YWIodGFiICsgMSkpCisJCQkJCS5hcHBlbmQoIklOTkVSIEZJRUxEUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICsgTElORV9TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmZpZWxkQ291bnRlcjsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5pbm5lckZpZWxkc1tpXS50b1N0cmluZyh0YWIgKyAyKSk7CisJCQkJCWJ1ZmZlci5hcHBlbmQoTElORV9TRVBBUkFUT1IpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCUFTVE5vZGUgY29udmVydCgpIHsKKwkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7CisJCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHRoaXMuaW5uZXJGaWVsZHNbMF0ubmFtZSkpKTsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGFzdC5uZXdGaWVsZERlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7CisKKwkJCWZvciAoaW50IGogPSAxLCBtYXgyID0gdGhpcy5pbm5lckZpZWxkcy5sZW5ndGg7IGogPCBtYXgyOyBqKyspIHsKKwkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7CisJCQkJZnJhZ21lbnQuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuZXcgU3RyaW5nKHRoaXMuaW5uZXJGaWVsZHNbal0ubmFtZSkpKTsKKwkJCX0KKwkJCVN0cmluZyBjdXJyZW50RmllbGRUeXBlID0gdGhpcy50eXBlOworCQkJCisJCQlpbnQgaW5kZXhPZkFycmF5QnJhY2U7CisJCQlpZiAoY3VycmVudEZpZWxkVHlwZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKKwkJCQlTdHJpbmdbXSB0eXBlUGFydHMgPSBzcGxpdE9uKCcuJywgY3VycmVudEZpZWxkVHlwZSk7CisJCQkJaW50IGxlbmd0aCA9IHR5cGVQYXJ0cy5sZW5ndGg7CisJCQkJaW5kZXhPZkFycmF5QnJhY2UgPSB0eXBlUGFydHNbbGVuZ3RoIC0gMV0uaW5kZXhPZignWycpOworCQkJCWlmIChpbmRleE9mQXJyYXlCcmFjZSAhPSAtMSkgeworCQkJCQlpbnQgZGltZW5zaW9ucyA9IG9jY3VyZW5jZXNPZignWycsIHR5cGVQYXJ0c1tsZW5ndGggLSAxXSk7CisJCQkJCXR5cGVQYXJ0c1tsZW5ndGggLSAxXSA9IHR5cGVQYXJ0c1tsZW5ndGggLSAxXS5zdWJzdHJpbmcoMCwgaW5kZXhPZkFycmF5QnJhY2UpOworCQkJCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUoYXN0Lm5ld0FycmF5VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZSh0eXBlUGFydHMpKSwgZGltZW5zaW9ucykpOworCQkJCX0gZWxzZSB7CisJCQkJCWZpZWxkRGVjbGFyYXRpb24uc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZSh0eXBlUGFydHMpKSk7CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaW5kZXhPZkFycmF5QnJhY2UgPSBjdXJyZW50RmllbGRUeXBlLmluZGV4T2YoJ1snKSkgIT0gLTEpIHsKKwkJCQlpbnQgZGltZW5zaW9ucyA9IG9jY3VyZW5jZXNPZignWycsIGN1cnJlbnRGaWVsZFR5cGUpOworCQkJCWN1cnJlbnRGaWVsZFR5cGUgPSBjdXJyZW50RmllbGRUeXBlLnN1YnN0cmluZygwLCBpbmRleE9mQXJyYXlCcmFjZSk7CisJCQkJZmllbGREZWNsYXJhdGlvbi5zZXRUeXBlKGFzdC5uZXdBcnJheVR5cGUobmV3VHlwZShjdXJyZW50RmllbGRUeXBlKSwgZGltZW5zaW9ucykpOworCQkJfSBlbHNlIHsKKwkJCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUobmV3VHlwZShjdXJyZW50RmllbGRUeXBlKSk7CisJCQl9CisJCQlmaWVsZERlY2xhcmF0aW9uLnNldFByb3BlcnR5KENvbXBpbGF0aW9uVW5pdFNvcnRlci5SRUxBVElWRV9PUkRFUiwgbmV3IEludGVnZXIodGhpcy5zb3VyY2VTdGFydCkpOworCQkJZmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnModGhpcy5tb2RpZmllcnMpOworCQkJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CisJCX0KKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU29ydEVsZW1lbnRCdWlsZGVyLlNvcnRFbGVtZW50I2dlbmVyYXRlU291cmNlKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvdXJjZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCQlzdXBlci5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQkJaW50IGxlbmd0aCA9IHRoaXMuZmllbGRDb3VudGVyOworCQkJaW50IHN0YXJ0ID0gdGhpcy5pbm5lckZpZWxkc1swXS5zb3VyY2VTdGFydDsKKwkJCWludCBlbmQgPSB0aGlzLmlubmVyRmllbGRzWzBdLm5hbWVTb3VyY2VTdGFydCAtIDE7CisJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJdGhpcy5pbm5lckZpZWxkc1tpXS5uZXdTb3VyY2VTdGFydCA9IHRoaXMubmV3U291cmNlU3RhcnQ7CisJCQkJdGhpcy5pbm5lckZpZWxkc1tpXS5nZW5lcmF0ZVJlZHVjZVNvdXJjZShidWZmZXIpOworCQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCQlzdGFydCA9IHRoaXMuaW5uZXJGaWVsZHNbaV0uc291cmNlRW5kICsgMTsKKwkJCQkJZW5kID0gdGhpcy5pbm5lckZpZWxkc1tpICsgMV0ubmFtZVNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJYnVmZmVyLmFwcGVuZChTb3J0RWxlbWVudEJ1aWxkZXIudGhpcy5zb3VyY2UsIHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOworCQkJCX0KKwkJCX0KKwkJCXN0YXJ0ID0gdGhpcy5pbm5lckZpZWxkc1tsZW5ndGggLSAxXS5zb3VyY2VFbmQgKyAxOworCQkJZW5kID0gdGhpcy5pbm5lckZpZWxkc1tsZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIG1hcFBvc2l0aW9ucygpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmZpZWxkQ291bnRlcjsKKwkJCWludCBzdGFydCA9IHRoaXMuaW5uZXJGaWVsZHNbMF0uc291cmNlU3RhcnQ7CisJCQlpbnQgZW5kID0gdGhpcy5pbm5lckZpZWxkc1swXS5uYW1lU291cmNlU3RhcnQgLSAxOworCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCXRoaXMuaW5uZXJGaWVsZHNbaV0ubmV3U291cmNlU3RhcnQgPSB0aGlzLm5ld1NvdXJjZVN0YXJ0OworCQkJCXRoaXMuaW5uZXJGaWVsZHNbaV0ubWFwUmVkdWNlZFBvc2l0aW9ucygpOworCQkJCWlmIChpIDwgbGVuZ3RoIC0gMSkgeworCQkJCQlzdGFydCA9IHRoaXMuaW5uZXJGaWVsZHNbaV0uc291cmNlRW5kICsgMTsKKwkJCQkJZW5kID0gdGhpcy5pbm5lckZpZWxkc1tpICsgMV0ubmFtZVNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJCX0KKwkJCX0KKwkJCXN0YXJ0ID0gdGhpcy5pbm5lckZpZWxkc1tsZW5ndGggLSAxXS5zb3VyY2VFbmQgKyAxOworCQkJZW5kID0gdGhpcy5pbm5lckZpZWxkc1tsZW5ndGggLSAxXS5kZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCW1hcE5leHRQb3NpdGlvbih0aGlzLCBzdGFydCwgZW5kKTsKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIHNvcnQoKSB7CisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5maWVsZENvdW50ZXI7IGkgPCBtYXg7IGkrKykgeworCQkJCXRoaXMuaW5uZXJGaWVsZHNbaV0uc29ydCgpOworCQkJfQorCQl9CisJfQorCisJY2xhc3MgU29ydEluaXRpYWxpemVyIGV4dGVuZHMgU29ydEVsZW1lbnQgeworCQlTb3J0SW5pdGlhbGl6ZXIoaW50IHNvdXJjZVN0YXJ0LCBpbnQgbW9kaWZpZXJzKSB7CisJCQlzdXBlcihzb3VyY2VTdGFydCwgbW9kaWZpZXJzKTsKKwkJCXRoaXMuaWQgPSBJTklUSUFMSVpFUjsKKwkJfQorCisJCXZvaWQgZGlzcGxheShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgdGFiKSB7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKHRhYih0YWIpKQorCQkJCS5hcHBlbmQoImluaXRpYWxpemVyICIgKyBMSU5FX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJQVNUTm9kZSBjb252ZXJ0KCkgeworCQkJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIgPSBhc3QubmV3SW5pdGlhbGl6ZXIoKTsKKwkJCWluaXRpYWxpemVyLnNldE1vZGlmaWVycyh0aGlzLm1vZGlmaWVycyk7CisJCQlpbml0aWFsaXplci5zZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIsIG5ldyBJbnRlZ2VyKHRoaXMuc291cmNlU3RhcnQpKTsKKwkJCXJldHVybiBpbml0aWFsaXplcjsKKwkJfQorCQkvKioKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3J0RWxlbWVudEJ1aWxkZXIuU29ydEVsZW1lbnQjZ2VuZXJhdGVTb3VyY2UoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU291cmNlKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJCXN1cGVyLmdlbmVyYXRlU291cmNlKGJ1ZmZlcik7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jaGlsZHJlbl9jb3VudDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBzdGFydCA9IHRoaXMuc291cmNlU3RhcnQ7CisJCQkJaW50IGVuZCA9IHRoaXMuZmlyc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlU3RhcnQgLSAxOworCQkKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCQkJdGhpcy5jaGlsZHJlbltpXS5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5jaGlsZHJlbltpXS5zb3VyY2VFbmQgKyAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQkJfQorCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCWVuZCA9IHRoaXMuY2hpbGRyZW5baSArIDFdLnNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVuZCA9IHRoaXMuc291cmNlRW5kOworCQkJCQl9CisJCQkJfQorCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLmFwcGVuZChTb3J0RWxlbWVudEJ1aWxkZXIudGhpcy5zb3VyY2UsIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kIC0gdGhpcy5zb3VyY2VTdGFydCArIDEpOworCQkJfQkKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIG1hcFBvc2l0aW9ucygpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuX2NvdW50OworCQkJaWYgKGxlbmd0aCAhPSAwKSB7CisJCQkJaW50IHN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydDsKKwkJCQlpbnQgZW5kID0gdGhpcy5maXJzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VTdGFydCAtIDE7CisJCQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCBlbmQpOworCQkJCQl0aGlzLmNoaWxkcmVuW2ldLm1hcFBvc2l0aW9ucygpOworCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCXN0YXJ0ID0gdGhpcy5jaGlsZHJlbltpXS5zb3VyY2VFbmQgKyAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQkJfQorCQkJCQlpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKwkJCQkJCWVuZCA9IHRoaXMuY2hpbGRyZW5baSArIDFdLnNvdXJjZVN0YXJ0IC0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVuZCA9IHRoaXMuc291cmNlRW5kOworCQkJCQl9CisJCQkJfQorCQkJCW1hcE5leHRQb3NpdGlvbih0aGlzLCBzdGFydCwgZW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHRoaXMuc291cmNlU3RhcnQsIHRoaXMuc291cmNlRW5kKTsKKwkJCX0JCisJCX0KKwl9CisKKwljbGFzcyBTb3J0Q2xhc3NEZWNsYXJhdGlvbiBleHRlbmRzIFNvcnRUeXBlICB7CisJCVNvcnRDbGFzc0RlY2xhcmF0aW9uKGludCBzb3VyY2VTdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIG5hbWUsIGNoYXJbXSBzdXBlcmNsYXNzLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsKKwkJCXN1cGVyKHNvdXJjZVN0YXJ0LCBtb2RpZmllcnMsIG5hbWUsIHN1cGVyaW50ZXJmYWNlcyk7CisJCQl0aGlzLmlkID0gQ0xBU1MgfCBUWVBFOworCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJCXRoaXMuc3VwZXJjbGFzcyA9IG5ldyBTdHJpbmcoc3VwZXJjbGFzcyk7CisJCQl9CisJCX0KKworCQl2b2lkIGRpc3BsYXkoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHRhYikgeworCQkJYnVmZmVyCisJCQkJLmFwcGVuZCh0YWIodGFiKSkKKwkJCQkuYXBwZW5kKCJjbGFzcyAiKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZCh0aGlzLm5hbWUpOworCQkJaWYgKHRoaXMuc3VwZXJjbGFzcyAhPSBudWxsKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIiArIHRoaXMuc3VwZXJjbGFzcyk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmICh0aGlzLnN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQkJaW50IGxlbmd0aCA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsKKwkJCQlidWZmZXIuYXBwZW5kKCIgaW1wbGVtZW50cyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CisJCQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5zdXBlckludGVyZmFjZXNbaV0gKyAiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuc3VwZXJJbnRlcmZhY2VzW2xlbmd0aCAtIDFdKTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoTElORV9TRVBBUkFUT1IpOworCQl9CisJCQorCQlBU1ROb2RlIGNvbnZlcnQoKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOworCQkJdHlwZURlY2xhcmF0aW9uLnNldEludGVyZmFjZShmYWxzZSk7CisJCQl0eXBlRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKHRoaXMubW9kaWZpZXJzKTsKKwkJCXR5cGVEZWNsYXJhdGlvbi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKHRoaXMubmFtZSkpOworCQkJLy8gc2V0IHN1cGVyY2xhc3MKKwkJCWlmICh0aGlzLnN1cGVyY2xhc3MgIT0gbnVsbCkgeworCQkJCWlmICh0aGlzLnN1cGVyY2xhc3MuaW5kZXhPZignLicpID09IC0xKSB7CisJCQkJCS8vIHRoZSBzdXBlcmNsYXNzIGlzIGEgc2ltcGxlIG5hbWUKKwkJCQkJdHlwZURlY2xhcmF0aW9uLnNldFN1cGVyY2xhc3MoYXN0Lm5ld1NpbXBsZU5hbWUodGhpcy5zdXBlcmNsYXNzKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gdGhlIHN1cGVyY2xhc3MgaXMgYSBxdWFsaWZpZWQgbmFtZQorCQkJCQlTdHJpbmdbXSBzdXBlcmNsYXNzTmFtZXMgPSBzcGxpdE9uKCcuJywgdGhpcy5zdXBlcmNsYXNzKTsKKwkJCQkJdHlwZURlY2xhcmF0aW9uLnNldFN1cGVyY2xhc3MoYXN0Lm5ld05hbWUoc3VwZXJjbGFzc05hbWVzKSk7CisJCQkJfQorCQkJfQorCQkJLy8gc2V0IHN1cGVyaW50ZXJmYWNlcworCQkJaWYgKHRoaXMuc3VwZXJJbnRlcmZhY2VzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBqID0gMCwgbWF4MiA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzLmxlbmd0aDsgaiA8IG1heDI7IGorKykgeworCQkJCQlTdHJpbmcgY3VycmVudEludGVyZmFjZU5hbWUgPSB0aGlzLnN1cGVySW50ZXJmYWNlc1tqXTsKKwkJCQkJTmFtZSBpbnRlcmZhY2VOYW1lOworCQkJCQlpZiAoY3VycmVudEludGVyZmFjZU5hbWUuaW5kZXhPZignLicpID09IC0xKSB7CisJCQkJCQkvLyB0aGUgc3VwZXJjbGFzcyBpcyBhIHNpbXBsZSBuYW1lCisJCQkJCQlpbnRlcmZhY2VOYW1lID0gYXN0Lm5ld1NpbXBsZU5hbWUoY3VycmVudEludGVyZmFjZU5hbWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gdGhlIHN1cGVyY2xhc3MgaXMgYSBxdWFsaWZpZWQgbmFtZQorCQkJCQkJU3RyaW5nW10gaW50ZXJmYWNlTmFtZXMgPSBzcGxpdE9uKCcuJywgY3VycmVudEludGVyZmFjZU5hbWUpOworCQkJCQkJaW50ZXJmYWNlTmFtZSA9IGFzdC5uZXdOYW1lKGludGVyZmFjZU5hbWVzKTsKKwkJCQkJfQorCQkJCQl0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VzKCkuYWRkKGludGVyZmFjZU5hbWUpOworCQkJCX0KKwkJCX0KKwkJCXR5cGVEZWNsYXJhdGlvbi5zZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIsIG5ldyBJbnRlZ2VyKHRoaXMuc291cmNlU3RhcnQpKTsJCQkJCisJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOworCQl9CQkJCisJfQorCisJYWJzdHJhY3QgY2xhc3MgU29ydFR5cGUgZXh0ZW5kcyBTb3J0RWxlbWVudCB7CisJCVNvcnRUeXBlKGludCBzb3VyY2VTdGFydCwgaW50IG1vZGlmaWVyLCBjaGFyW10gbmFtZSwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisJCQlzdXBlcihzb3VyY2VTdGFydCwgbW9kaWZpZXIpOworCQkJdGhpcy5uYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKKwkJCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBzdXBlcmludGVyZmFjZXMubGVuZ3RoOworCQkJCXRoaXMuc3VwZXJJbnRlcmZhY2VzID0gbmV3IFN0cmluZ1tsZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJdGhpcy5zdXBlckludGVyZmFjZXNbaV0gPSBuZXcgU3RyaW5nKHN1cGVyaW50ZXJmYWNlc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvcnRFbGVtZW50QnVpbGRlci5Tb3J0RWxlbWVudCNnZW5lcmF0ZVNvdXJjZShqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKQorCQkgKi8KKwkJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVTb3VyY2UoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQkJc3VwZXIuZ2VuZXJhdGVTb3VyY2UoYnVmZmVyKTsKKwkJCWludCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuX2NvdW50OworCQkJaW50IHN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBlbmQgPSB0aGlzLmZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZVN0YXJ0OworCQkJCQorCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgZW5kIC0gc3RhcnQpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJKChTb3J0RWxlbWVudEJ1aWxkZXIuU29ydEVsZW1lbnQpdGhpcy5hc3ROb2Rlc1tpXS5nZXRQcm9wZXJ0eShDT1JSRVNQT05ESU5HX0VMRU1FTlQpKS5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQkJCX0KKwkJCQlzdGFydCA9IHRoaXMubGFzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VFbmQgKyAxOworCQkJCWJ1ZmZlci5hcHBlbmQoU29ydEVsZW1lbnRCdWlsZGVyLnRoaXMuc291cmNlLCBzdGFydCwgdGhpcy5zb3VyY2VFbmQgLSBzdGFydCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgc3RhcnQsIHRoaXMuc291cmNlRW5kIC0gc3RhcnQgKyAxKTsKKwkJCX0KKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIG1hcFBvc2l0aW9ucygpIHsKKwkJCWludCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuX2NvdW50OworCQkJaW50IHN0YXJ0ID0gdGhpcy5zb3VyY2VTdGFydDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBlbmQgPSB0aGlzLmZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZVN0YXJ0IC0gMTsKKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgc3RhcnQsIGVuZCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQljaGlsZHJlbltpXS5tYXBQb3NpdGlvbnMoKTsKKwkJCQl9CisJCQkJc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgc3RhcnQsIHRoaXMuc291cmNlRW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJbWFwTmV4dFBvc2l0aW9uKHRoaXMsIHN0YXJ0LCB0aGlzLnNvdXJjZUVuZCk7CisJCQl9CisJCX0KKwl9CisJCisJY2xhc3MgU29ydEludGVyZmFjZURlY2xhcmF0aW9uIGV4dGVuZHMgU29ydFR5cGUgeworCQlTb3J0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50IHNvdXJjZVN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisJCQlzdXBlcihzb3VyY2VTdGFydCwgbW9kaWZpZXJzLCBuYW1lLCBzdXBlcmludGVyZmFjZXMpOworCQkJdGhpcy5pZCA9IFRZUEUgfCBJTlRFUkZBQ0U7CisJCX0KKwkJdm9pZCBkaXNwbGF5KFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCB0YWIpIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQodGFiKHRhYikpCisJCQkJLmFwcGVuZCgiaW50ZXJmYWNlICIpIC8vJE5PTi1OTFMtMSQKKwkJCQkuYXBwZW5kKHRoaXMubmFtZSk7CisJCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSB0aGlzLnN1cGVySW50ZXJmYWNlcy5sZW5ndGg7CisJCQkJYnVmZmVyLmFwcGVuZCgiIGltcGxlbWVudHMgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykgeworCQkJCQlidWZmZXIuYXBwZW5kKHRoaXMuc3VwZXJJbnRlcmZhY2VzW2ldICsgIiwgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJYnVmZmVyLmFwcGVuZCh0aGlzLnN1cGVySW50ZXJmYWNlc1tsZW5ndGggLSAxXSk7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKwkJfQorCQlBU1ROb2RlIGNvbnZlcnQoKSB7CisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOworCQkJdHlwZURlY2xhcmF0aW9uLnNldEludGVyZmFjZSh0cnVlKTsKKwkJCXR5cGVEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnModGhpcy5tb2RpZmllcnMpOworCQkJdHlwZURlY2xhcmF0aW9uLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUodGhpcy5uYW1lKSk7CisJCQkvLyBzZXQgc3VwZXJpbnRlcmZhY2VzCisJCQlpZiAodGhpcy5zdXBlckludGVyZmFjZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gdGhpcy5zdXBlckludGVyZmFjZXMubGVuZ3RoOyBqIDwgbWF4MjsgaisrKSB7CisJCQkJCVN0cmluZyBjdXJyZW50SW50ZXJmYWNlTmFtZSA9IHRoaXMuc3VwZXJJbnRlcmZhY2VzW2pdOworCQkJCQlOYW1lIGludGVyZmFjZU5hbWU7CisJCQkJCWlmIChjdXJyZW50SW50ZXJmYWNlTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHsKKwkJCQkJCS8vIHRoZSBzdXBlcmNsYXNzIGlzIGEgc2ltcGxlIG5hbWUKKwkJCQkJCWludGVyZmFjZU5hbWUgPSBhc3QubmV3U2ltcGxlTmFtZShjdXJyZW50SW50ZXJmYWNlTmFtZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB0aGUgc3VwZXJjbGFzcyBpcyBhIHF1YWxpZmllZCBuYW1lCisJCQkJCQlTdHJpbmdbXSBpbnRlcmZhY2VOYW1lcyA9IHNwbGl0T24oJy4nLCBjdXJyZW50SW50ZXJmYWNlTmFtZSk7CisJCQkJCQlpbnRlcmZhY2VOYW1lID0gYXN0Lm5ld05hbWUoaW50ZXJmYWNlTmFtZXMpOworCQkJCQl9CisJCQkJCXR5cGVEZWNsYXJhdGlvbi5zdXBlckludGVyZmFjZXMoKS5hZGQoaW50ZXJmYWNlTmFtZSk7CisJCQkJfQorCQkJfQorCQkJdHlwZURlY2xhcmF0aW9uLnNldFByb3BlcnR5KENvbXBpbGF0aW9uVW5pdFNvcnRlci5SRUxBVElWRV9PUkRFUiwgbmV3IEludGVnZXIodGhpcy5zb3VyY2VTdGFydCkpOwkJCQkKKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb247CisJCX0JCQkKKwl9CisJCisJY2xhc3MgU29ydENvbXBpbGF0aW9uVW5pdCBleHRlbmRzIFNvcnRFbGVtZW50IHsKKwkJU29ydENvbXBpbGF0aW9uVW5pdChpbnQgc291cmNlU3RhcnQpIHsKKwkJCXN1cGVyKHNvdXJjZVN0YXJ0LCAwKTsKKwkJCXRoaXMuaWQgPSBDT01QSUxBVElPTl9VTklUOworCQl9CisJCXZvaWQgZGlzcGxheShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgdGFiKSB7CisJCX0KKwkJCisJCUFTVE5vZGUgY29udmVydCgpIHsKKwkJCXJldHVybiBhc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7CisJCX0KKwkJLyoqCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU29ydEVsZW1lbnRCdWlsZGVyLlNvcnRFbGVtZW50I2dlbmVyYXRlU291cmNlKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCisJCSAqLworCQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvdXJjZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCQlzdXBlci5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQkJaW50IGxlbmd0aCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7CisJCQlpZiAobGVuZ3RoICE9IDApIHsKKwkJCQlpbnQgZW5kID0gdGhpcy5maXJzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VTdGFydDsKKwkJCQlpbnQgc3RhcnQgPSB0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcuc291cmNlRW5kICsgMTsKKwkJCQlidWZmZXIuYXBwZW5kKFNvcnRFbGVtZW50QnVpbGRlci50aGlzLnNvdXJjZSwgMCwgZW5kKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCSgoU29ydEVsZW1lbnRCdWlsZGVyLlNvcnRFbGVtZW50KXRoaXMuYXN0Tm9kZXNbaV0uZ2V0UHJvcGVydHkoQ09SUkVTUE9ORElOR19FTEVNRU5UKSkuZ2VuZXJhdGVTb3VyY2UoYnVmZmVyKTsKKwkJCQl9CisJCQkJYnVmZmVyLmFwcGVuZChTb3J0RWxlbWVudEJ1aWxkZXIudGhpcy5zb3VyY2UsIHN0YXJ0LCB0aGlzLnNvdXJjZUVuZCAtIHN0YXJ0ICsgMSk7CisJCQl9CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBtYXBQb3NpdGlvbnMoKSB7CisJCQlpbnQgbGVuZ3RoID0gdGhpcy5jaGlsZHJlbl9jb3VudDsKKwkJCWlmIChsZW5ndGggIT0gMCkgeworCQkJCWludCBlbmQgPSB0aGlzLmZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nLnNvdXJjZVN0YXJ0OworCQkJCWludCBzdGFydCA9IHRoaXMubGFzdENoaWxkQmVmb3JlU29ydGluZy5zb3VyY2VFbmQgKyAxOworCQkJCW1hcE5leHRQb3NpdGlvbih0aGlzLCAwLCBlbmQpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJY2hpbGRyZW5baV0ubWFwUG9zaXRpb25zKCk7CisJCQkJfQorCQkJCW1hcE5leHRQb3NpdGlvbih0aGlzLCBzdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCQkJfSBlbHNlIHsKKwkJCQltYXBOZXh0UG9zaXRpb24odGhpcywgdGhpcy5zb3VyY2VTdGFydCwgdGhpcy5zb3VyY2VFbmQpOworCQkJfQorCQl9CisJfQorCisJU29ydEVsZW1lbnQgY3VycmVudEVsZW1lbnQ7CisJU3RhY2sgc3RhY2s7CisJU29ydENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7CisJU2Nhbm5lciBzY2FubmVyOworCUFTVCBhc3Q7CisKKwljaGFyW10gc291cmNlOworCWludFtdIGxpbmVFbmRzOworCUNvbXBhcmF0b3IgY29tcGFyYXRvcjsKKwlpbnRbXSBwb3NpdGlvbnNUb01hcDsKKwlpbnQgcG9zaXRpb25zVG9NYXBJbmRleDsKKwkKKwlwdWJsaWMgU29ydEVsZW1lbnRCdWlsZGVyKGNoYXJbXSBzb3VyY2UsIGludFtdIHBvc2l0aW9uc1RvTWFwLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKKwkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisJCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7CisJCXRoaXMucG9zaXRpb25zVG9NYXAgPSBwb3NpdGlvbnNUb01hcDsKKwkJdGhpcy5zY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwpOworCQl0aGlzLmFzdCA9IG5ldyBBU1QoKTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2FjY2VwdExpbmVTZXBhcmF0b3JQb3NpdGlvbnMoaW50W10pCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHsKKwkJdGhpcy5saW5lRW5kcyA9IHBvc2l0aW9uczsKKwl9CisJCQorCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl0aGlzLnBvc2l0aW9uc1RvTWFwSW5kZXggPSAwOworCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZW5lcmF0ZVNvdXJjZShidWZmZXIpOworCQlpZiAodGhpcy5wb3NpdGlvbnNUb01hcCAhPSBudWxsKSB7CisJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5tYXBQb3NpdGlvbnMoKTsKKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IHNlYXJjaExpbmVOdW1iZXIoCisJCWludFtdIHN0YXJ0TGluZUluZGV4ZXMsCisJCWludCBwb3NpdGlvbikgeworCQkvLyB0aGlzIGNvZGUgaXMgY29tcGxldGVseSB1c2VsZXNzLCBidXQgaXQgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gdGhhbgorCQkvLyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtSGFuZGxlci5zZWFyY2hMaW5lTnVtYmVyKGludFtdLCBpbnQpCisJCS8vIGlmIChzdGFydExpbmVJbmRleGVzID09IG51bGwpCisJCS8vCXJldHVybiAxOworCQlpbnQgbGVuZ3RoID0gc3RhcnRMaW5lSW5kZXhlcy5sZW5ndGg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCXJldHVybiAxOworCQlpbnQgZyA9IDAsIGQgPSBsZW5ndGggLSAxOworCQlpbnQgbSA9IDA7CisJCXdoaWxlIChnIDw9IGQpIHsKKwkJCW0gPSAoZyArIGQpIC8gMjsKKwkJCWlmIChwb3NpdGlvbiA8IHN0YXJ0TGluZUluZGV4ZXNbbV0pIHsKKwkJCQlkID0gbSAtIDE7CisJCQl9IGVsc2UKKwkJCQlpZiAocG9zaXRpb24gPiBzdGFydExpbmVJbmRleGVzW21dKSB7CisJCQkJCWcgPSBtICsgMTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbSArIDE7CisJCQkJfQorCQl9CisJCWlmIChwb3NpdGlvbiA8IHN0YXJ0TGluZUluZGV4ZXNbbV0pIHsKKwkJCXJldHVybiBtICsgMTsKKwkJfQorCQlyZXR1cm4gbSArIDI7CisJfQorCQorCXZvaWQgc29ydCgpIHsKKwkJY29tcGlsYXRpb25Vbml0LnNvcnQoKTsKKwl9CisKKwl2b2lkIG1hcE5leHRQb3NpdGlvbihTb3J0SmF2YUVsZW1lbnQgbm9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCWludCBpID0gdGhpcy5wb3NpdGlvbnNUb01hcEluZGV4OworCQlmb3IgKDsgaSA8IHRoaXMucG9zaXRpb25zVG9NYXAubGVuZ3RoOyBpKyspIHsKKwkJCWludCBuZXh0UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1RvTWFwW2ldOworCQkJaWYgKG5leHRQb3NpdGlvbiA+PSBzdGFydAorCQkJCSYmIG5leHRQb3NpdGlvbiA8PSBlbmQpIHsKKwkJCQkJdGhpcy5wb3NpdGlvbnNUb01hcFtpXSArPSAobm9kZS5uZXdTb3VyY2VTdGFydCAtIG5vZGUuc291cmNlU3RhcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQl0aGlzLnBvc2l0aW9uc1RvTWFwSW5kZXggPSBpOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckNsYXNzKGludCwgaW50LCBjaGFyLCBpbnQsIGludCwgY2hhciwgY2hhcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbnRlckNsYXNzKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kLAorCQljaGFyW10gc3VwZXJjbGFzcywKKwkJY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7CisJCQlTb3J0VHlwZSB0eXBlID0gbmV3IFNvcnRDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzKTsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQuYWRkQ2hpbGQodHlwZSk7CisJCQlwdXNoKHR5cGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVyQ29tcGlsYXRpb25Vbml0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJdGhpcy5zdGFjayA9IG5ldyBTdGFjaygpOworCQlwdXNoKGNvbXBpbGF0aW9uVW5pdCA9IG5ldyBTb3J0Q29tcGlsYXRpb25Vbml0KDApKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckNvbnN0cnVjdG9yKGludCwgaW50LCBjaGFyLCBpbnQsIGludCwgY2hhciwgY2hhciwgY2hhcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kLAorCQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlcywKKwkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCisJCWNoYXJbXVtdIGV4Y2VwdGlvblR5cGVzKSB7CisJCWlmICgodGhpcy5jdXJyZW50RWxlbWVudC5pZCAmIFNvcnRKYXZhRWxlbWVudC5UWVBFKSAhPSAwKSB7CisJCQlTb3J0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gbmV3IFNvcnRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgbmFtZSwgcGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlclR5cGVzLCBleGNlcHRpb25UeXBlcyk7CisJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZENoaWxkKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24pOworCQkJcHVzaChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2VudGVyRmllbGQoaW50LCBpbnQsIGNoYXIsIGNoYXIsIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyRmllbGQoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gdHlwZSwKKwkJY2hhcltdIG5hbWUsCisJCWludCBuYW1lU291cmNlU3RhcnQsCisJCWludCBuYW1lU291cmNlRW5kKSB7CisJCQlpZiAoKHRoaXMuY3VycmVudEVsZW1lbnQuaWQgJiBTb3J0SmF2YUVsZW1lbnQuVFlQRSkgIT0gMCkgeworCQkJCVNvcnRGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBuZXcgU29ydEZpZWxkRGVjbGFyYXRpb24oZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCB0eXBlLCBuYW1lLCBuYW1lU291cmNlU3RhcnQpOworCQkJCVNvcnRFbGVtZW50W10gY3VycmVudEVsZW1lbnRDaGlsZHJlbiA9IHRoaXMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW47CisJCQkJaWYgKGN1cnJlbnRFbGVtZW50Q2hpbGRyZW4gIT0gbnVsbCkgeworCQkJCQlTb3J0RWxlbWVudCBwcmV2aW91c0VsZW1lbnQgPSB0aGlzLmN1cnJlbnRFbGVtZW50LmNoaWxkcmVuW3RoaXMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW5fY291bnQgLSAxXTsKKwkJCQkJaWYgKHByZXZpb3VzRWxlbWVudC5pZCA9PSBTb3J0SmF2YUVsZW1lbnQuRklFTEQgJiYgKChTb3J0RmllbGREZWNsYXJhdGlvbikgcHJldmlvdXNFbGVtZW50KS5kZWNsYXJhdGlvblN0YXJ0ID09IGRlY2xhcmF0aW9uU3RhcnQpIHsKKwkJCQkJCVNvcnRNdWx0aXBsZUZpZWxkRGVjbGFyYXRpb24gbXVsdGlwbGVGaWVsRGVjbGFyYXRpb24gPSBuZXcgU29ydE11bHRpcGxlRmllbGREZWNsYXJhdGlvbigoU29ydEZpZWxkRGVjbGFyYXRpb24pIHByZXZpb3VzRWxlbWVudCk7CisJCQkJCQltdWx0aXBsZUZpZWxEZWNsYXJhdGlvbi5hZGRGaWVsZChmaWVsZERlY2xhcmF0aW9uKTsKKwkJCQkJCXRoaXMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW5bdGhpcy5jdXJyZW50RWxlbWVudC5jaGlsZHJlbl9jb3VudCAtIDFdID0gbXVsdGlwbGVGaWVsRGVjbGFyYXRpb247CisJCQkJCX0gZWxzZSBpZiAocHJldmlvdXNFbGVtZW50LmlkID09IFNvcnRKYXZhRWxlbWVudC5NVUxUSVBMRV9GSUVMRCAmJiAoKFNvcnRNdWx0aXBsZUZpZWxkRGVjbGFyYXRpb24pIHByZXZpb3VzRWxlbWVudCkuZGVjbGFyYXRpb25TdGFydCA9PSBkZWNsYXJhdGlvblN0YXJ0KSB7CisJCQkJCQkoKFNvcnRNdWx0aXBsZUZpZWxkRGVjbGFyYXRpb24pIHByZXZpb3VzRWxlbWVudCkuYWRkRmllbGQoZmllbGREZWNsYXJhdGlvbik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0aGlzLmN1cnJlbnRFbGVtZW50LmFkZENoaWxkKGZpZWxkRGVjbGFyYXRpb24pOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdGhpcy5jdXJyZW50RWxlbWVudC5hZGRDaGlsZChmaWVsZERlY2xhcmF0aW9uKTsKKwkJCQl9CisJCQkJcHVzaChmaWVsZERlY2xhcmF0aW9uKTsKKwkJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckluaXRpYWxpemVyKGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVySW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMpIHsKKwkJaWYgKCh0aGlzLmN1cnJlbnRFbGVtZW50LmlkICYgU29ydEphdmFFbGVtZW50LlRZUEUpICE9IDApIHsKKwkJCVNvcnRJbml0aWFsaXplciBpbml0aWFsaXplciA9IG5ldyBTb3J0SW5pdGlhbGl6ZXIoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzKTsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQuYWRkQ2hpbGQoaW5pdGlhbGl6ZXIpOworCQkJcHVzaChpbml0aWFsaXplcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvciNlbnRlckludGVyZmFjZShpbnQsIGludCwgY2hhciwgaW50LCBpbnQsIGNoYXIpCisJICovCisJcHVibGljIHZvaWQgZW50ZXJJbnRlcmZhY2UoCisJCWludCBkZWNsYXJhdGlvblN0YXJ0LAorCQlpbnQgbW9kaWZpZXJzLAorCQljaGFyW10gbmFtZSwKKwkJaW50IG5hbWVTb3VyY2VTdGFydCwKKwkJaW50IG5hbWVTb3VyY2VFbmQsCisJCWNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlcykgeworCQkJU29ydFR5cGUgdHlwZSA9IG5ldyBTb3J0SW50ZXJmYWNlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBuYW1lLCBzdXBlcmludGVyZmFjZXMpOworCQkJdGhpcy5jdXJyZW50RWxlbWVudC5hZGRDaGlsZCh0eXBlKTsKKwkJCXB1c2godHlwZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZW50ZXJNZXRob2QoaW50LCBpbnQsIGNoYXIsIGNoYXIsIGludCwgaW50LCBjaGFyLCBjaGFyLCBjaGFyKQorCSAqLworCXB1YmxpYyB2b2lkIGVudGVyTWV0aG9kKAorCQlpbnQgZGVjbGFyYXRpb25TdGFydCwKKwkJaW50IG1vZGlmaWVycywKKwkJY2hhcltdIHJldHVyblR5cGUsCisJCWNoYXJbXSBuYW1lLAorCQlpbnQgbmFtZVNvdXJjZVN0YXJ0LAorCQlpbnQgbmFtZVNvdXJjZUVuZCwKKwkJY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsCisJCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAorCQljaGFyW11bXSBleGNlcHRpb25UeXBlcykgeworCQkJaWYgKCh0aGlzLmN1cnJlbnRFbGVtZW50LmlkICYgU29ydEphdmFFbGVtZW50LlRZUEUpICE9IDApIHsKKwkJCQlTb3J0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBuZXcgU29ydE1ldGhvZERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uU3RhcnQsIG1vZGlmaWVycywgbmFtZSwgcGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlclR5cGVzLCBleGNlcHRpb25UeXBlcywgcmV0dXJuVHlwZSk7CisJCQkJdGhpcy5jdXJyZW50RWxlbWVudC5hZGRDaGlsZChtZXRob2REZWNsYXJhdGlvbik7CisJCQkJcHVzaChtZXRob2REZWNsYXJhdGlvbik7CisJCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdENsYXNzKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0Q2xhc3MoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJCXBvcChkZWNsYXJhdGlvbkVuZCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdENvbXBpbGF0aW9uVW5pdChpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwkJcG9wKGRlY2xhcmF0aW9uRW5kKTsKKwkJc29ydCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2V4aXRDb25zdHJ1Y3RvcihpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgeworCQlwb3AoZGVjbGFyYXRpb25FbmQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yI2V4aXRGaWVsZChpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0RmllbGQoaW50IGluaXRpYWxpemF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kKSB7CisJCWludCBub3JtYWxpemVkRGVjbGFyYXRpb25Tb3VyY2VFbmQgPSB0aGlzLm5vcm1hbGl6ZVNvdXJjZUVuZChkZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCWlmICh0aGlzLmN1cnJlbnRFbGVtZW50LmlkID09IFNvcnRKYXZhRWxlbWVudC5GSUVMRCkgeworCQkJU29ydEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChTb3J0RmllbGREZWNsYXJhdGlvbikgdGhpcy5jdXJyZW50RWxlbWVudDsKKwkJCWZpZWxkRGVjbGFyYXRpb24uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBub3JtYWxpemVkRGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCX0KKwkJcG9wKGRlY2xhcmF0aW9uRW5kKTsKKwkJaWYgKHRoaXMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW4gIT0gbnVsbCkgeworCQkJU29ydEVsZW1lbnQgZWxlbWVudCA9IHRoaXMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW5bdGhpcy5jdXJyZW50RWxlbWVudC5jaGlsZHJlbl9jb3VudCAtIDFdOworCQkJc3dpdGNoKGVsZW1lbnQuaWQpIHsKKwkJCQljYXNlIFNvcnRKYXZhRWxlbWVudC5NVUxUSVBMRV9GSUVMRCA6CisJCQkJCVNvcnRNdWx0aXBsZUZpZWxkRGVjbGFyYXRpb24gbXVsdGlwbGVGaWVsRGVjbGFyYXRpb24gPSAoU29ydE11bHRpcGxlRmllbGREZWNsYXJhdGlvbikgZWxlbWVudDsKKwkJCQkJbXVsdGlwbGVGaWVsRGVjbGFyYXRpb24uaW5uZXJGaWVsZHNbbXVsdGlwbGVGaWVsRGVjbGFyYXRpb24uZmllbGRDb3VudGVyIC0gMV0uZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBub3JtYWxpemVkRGVjbGFyYXRpb25Tb3VyY2VFbmQ7CisJCQkJCW11bHRpcGxlRmllbERlY2xhcmF0aW9uLnNvdXJjZUVuZCA9IG5vcm1hbGl6ZWREZWNsYXJhdGlvblNvdXJjZUVuZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTb3J0SmF2YUVsZW1lbnQuRklFTEQgOgorCQkJCQlTb3J0RmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKFNvcnRGaWVsZERlY2xhcmF0aW9uKSBlbGVtZW50OworCQkJCQkvKgorCQkJCQkgKiB3ZSB3aWxsIHJldmVydCB0byB0aGUgcHJldmlvdXMgc291cmNlIGVuZCBpbiBjYXNlIHRoaXMgZmllbGQgaXMKKwkJCQkJICogcGFydCBvZiBhIG11bHRpcGxlIGZpZWxkIGRlY2xhcmF0aW9uCisJCQkJCSAqLworCQkJCQlmaWVsZERlY2xhcmF0aW9uLnByZXZpb3VzU291cmNlRW5kID0gZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQ7CisJCQkJCWZpZWxkRGVjbGFyYXRpb24uc291cmNlRW5kID0gbm9ybWFsaXplZERlY2xhcmF0aW9uU291cmNlRW5kOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdEluaXRpYWxpemVyKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0SW5pdGlhbGl6ZXIoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJCXBvcChkZWNsYXJhdGlvbkVuZCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IjZXhpdEludGVyZmFjZShpbnQpCisJICovCisJcHVibGljIHZvaWQgZXhpdEludGVyZmFjZShpbnQgZGVjbGFyYXRpb25FbmQpIHsKKwkJcG9wKGRlY2xhcmF0aW9uRW5kKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvciNleGl0TWV0aG9kKGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGl0TWV0aG9kKGludCBkZWNsYXJhdGlvbkVuZCkgeworCQlwb3AoZGVjbGFyYXRpb25FbmQpOworCX0KKworCWZpbmFsIGludCBub3JtYWxpemVTb3VyY2VTdGFydChpbnQgcG9zaXRpb24pIHsKKwkJaWYgKHBvc2l0aW9uID09IDApIHsKKwkJCXJldHVybiAwOworCQl9CisJCWludCBpbmRleCA9IHBvc2l0aW9uIC0gMTsKKwkJd2hpbGUoaW5kZXggPj0gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlW2luZGV4XSkpIHsKKwkJCWluZGV4LS07CisJCX0KKwkJCisJCWludCBvcmlnaW5hbExpbmVOdW1iZXIgPSBzZWFyY2hMaW5lTnVtYmVyKHRoaXMubGluZUVuZHMsIHBvc2l0aW9uKTsKKwkJaW50IG5ld0xpbmVOdW1iZXIgPSBzZWFyY2hMaW5lTnVtYmVyKHRoaXMubGluZUVuZHMsIGluZGV4KTsKKwkJCisJCWlmIChvcmlnaW5hbExpbmVOdW1iZXIgPT0gbmV3TGluZU51bWJlcikgeworCQkJcmV0dXJuIGluZGV4ICsgMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLmxpbmVFbmRzW25ld0xpbmVOdW1iZXIgLSAxXSArIDE7CisJCX0KKwl9CisKKwlmaW5hbCBpbnQgbm9ybWFsaXplU291cmNlRW5kKGludCBwb3NpdGlvbikgeworCQlpbnQgbGluZU51bWJlciA9IHNlYXJjaExpbmVOdW1iZXIodGhpcy5saW5lRW5kcywgcG9zaXRpb24pOworCQlpZiAobGluZU51bWJlciA9PSAxKSB7CisJCQlyZXR1cm4gcG9zaXRpb247CisJCX0KKwkJaW50IG5vcm1hbGl6ZVNvdXJjZUVuZCA9IDA7CisJCWlmIChsaW5lTnVtYmVyIC0gMSA+PSB0aGlzLmxpbmVFbmRzLmxlbmd0aCkgeworCQkJbm9ybWFsaXplU291cmNlRW5kID0gdGhpcy5zb3VyY2UubGVuZ3RoIC0gMTsKKwkJfSBlbHNlIHsKKwkJCW5vcm1hbGl6ZVNvdXJjZUVuZCA9IHRoaXMubGluZUVuZHNbbGluZU51bWJlciAtIDFdOworCQl9CisJCWludCBpbmRleCA9IHBvc2l0aW9uICsgMTsKKwkJd2hpbGUgKGluZGV4IDwgbm9ybWFsaXplU291cmNlRW5kICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhpcy5zb3VyY2VbaW5kZXhdKSkgeworCQkJaW5kZXgrKzsKKwkJfQorCQlpZiAoaW5kZXggPT0gbm9ybWFsaXplU291cmNlRW5kKSB7CisJCQlyZXR1cm4gbm9ybWFsaXplU291cmNlRW5kOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHBvc2l0aW9uOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBwb3AoaW50IGRlY2xhcmF0aW9uRW5kKSB7CisJCXRoaXMuY3VycmVudEVsZW1lbnQuc291cmNlRW5kID0gbm9ybWFsaXplU291cmNlRW5kKGRlY2xhcmF0aW9uRW5kKTsKKwkJdGhpcy5jdXJyZW50RWxlbWVudC5jbG9zZUNvbGxlY3Rpb25zKCk7CisJCXRoaXMuc3RhY2sucG9wKCk7CisJCWlmICghdGhpcy5zdGFjay5pc0VtcHR5KCkpIHsKKwkJCXRoaXMuY3VycmVudEVsZW1lbnQgPSAoU29ydEVsZW1lbnQpIHRoaXMuc3RhY2sucGVlaygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBwdXNoKFNvcnRFbGVtZW50IHNvcnRFbGVtZW50KSB7CisJCXRoaXMuY3VycmVudEVsZW1lbnQgPSBzb3J0RWxlbWVudDsKKwkJdGhpcy5zdGFjay5wdXNoKHNvcnRFbGVtZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3J0RWxlbWVudHNPcGVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvcnRFbGVtZW50c09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjIyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3J0RWxlbWVudHNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuU291cmNlRWxlbWVudFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5Qcm9ibGVtRmFjdG9yeTsKKworLyoqCisgKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHRvIHNvcnQgZWxlbWVudHMgaW4gYSBjb21waWxhdGlvbiB1bml0IGFjY29yZGluZyB0bworICogY2VydGFpbiBjcml0ZXJpYS4KKyAqIAorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgU29ydEVsZW1lbnRzT3BlcmF0aW9uIGV4dGVuZHMgSmF2YU1vZGVsT3BlcmF0aW9uIHsKKwkKKwlDb21wYXJhdG9yIGNvbXBhcmF0b3I7CisJYm9vbGVhbiBoYXNDaGFuZ2VkOworCWludFtdIHBvc2l0aW9uczsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgU29ydEVsZW1lbnRzT3BlcmF0aW9uLgorCSAqIEBwYXJhbSBlbGVtZW50cworCSAqLworCXB1YmxpYyBTb3J0RWxlbWVudHNPcGVyYXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHMsIGludFtdIHBvc2l0aW9ucywgQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7CisJCXN1cGVyKGVsZW1lbnRzKTsKKwkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKKwkJdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHdvcmsgZm9yIHRoZSBtYWluIHRhc2sgb2YgdGhpcyBvcGVyYXRpb24gZm9yCisJICogcHJvZ3Jlc3MgcmVwb3J0aW5nLgorCSAqLworCXByb3RlY3RlZCBpbnQgZ2V0TWFpbkFtb3VudE9mV29yaygpeworCQlyZXR1cm4gZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aDsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxPcGVyYXRpb24jZXhlY3V0ZU9wZXJhdGlvbigpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0cnkgeworCQkJYmVnaW5UYXNrKFV0aWwuYmluZCgib3BlcmF0aW9uLnNvcnRlbGVtZW50cyIpLCBnZXRNYWluQW1vdW50T2ZXb3JrKCkpOyAvLyROT04tTkxTLTEkCisJCQlXb3JraW5nQ29weSBjb3B5ID0gKFdvcmtpbmdDb3B5KSBmRWxlbWVudHNUb1Byb2Nlc3NbMF07CisJCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgY29weS5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwkJCUlCdWZmZXIgYnVmZmVyID0gY29weS5nZXRCdWZmZXIoKTsKKwkJCWlmIChidWZmZXIgID09IG51bGwpIHsgCisJCQkJcmV0dXJuOworCQkJfQorCQkJY2hhcltdIGJ1ZmZlckNvbnRlbnRzID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJCVN0cmluZyByZXN1bHQgPSBwcm9jZXNzRWxlbWVudCh1bml0LCBwb3NpdGlvbnMsIGJ1ZmZlckNvbnRlbnRzKTsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMocmVzdWx0LnRvQ2hhckFycmF5KCksIGJ1ZmZlckNvbnRlbnRzKSkgeworCQkJCWNvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMocmVzdWx0KTsKKwkJCX0KKwkJCXdvcmtlZCgxKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWRvbmUoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE1ldGhvZCBwcm9jZXNzRWxlbWVudC4KKwkgKiBAcGFyYW0gdW5pdAorCSAqIEBwYXJhbSBidWZmZXJDb250ZW50cworCSAqLworCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NFbGVtZW50KElDb21waWxhdGlvblVuaXQgdW5pdCwgaW50W10gcG9zaXRpb25zVG9NYXAsIGNoYXJbXSBzb3VyY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQl0aGlzLmhhc0NoYW5nZWQgPSBmYWxzZTsKKwkJU29ydEVsZW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU29ydEVsZW1lbnRCdWlsZGVyKHNvdXJjZSwgcG9zaXRpb25zVG9NYXAsIGNvbXBhcmF0b3IpOworCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKGJ1aWxkZXIsCisJCQlQcm9ibGVtRmFjdG9yeS5nZXRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSwgbmV3IENvbXBpbGVyT3B0aW9ucyhKYXZhQ29yZS5nZXRPcHRpb25zKCkpLCB0cnVlKTsKKwkJCisJCWlmICh1bml0LmV4aXN0cygpKSB7CisJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KXVuaXQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpOworCQkJY2hhcltdW10gZXhwZWN0ZWRQYWNrYWdlTmFtZSA9IG51bGw7CisJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpeworCQkJCWV4cGVjdGVkUGFja2FnZU5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCX0KKwkJCXBhcnNlci5wYXJzZUNvbXBpbGF0aW9uVW5pdCgKKwkJCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCisJCQkJCXNvdXJjZSwKKwkJCQkJZXhwZWN0ZWRQYWNrYWdlTmFtZSwKKwkJCQkJdW5pdC5nZXRFbGVtZW50TmFtZSgpLAorCQkJCQludWxsKSwKKwkJCQlmYWxzZSk7CisJCX0gZWxzZSB7CisJCQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoCisJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KAorCQkJCQlzb3VyY2UsCisJCQkJCW51bGwsCisJCQkJCSIiLC8vJE5PTi1OTFMtMSQKKwkJCQkJbnVsbCksCisJCQkJZmFsc2UpOworCQl9CisJCXJldHVybiBidWlsZGVyLmdldFNvdXJjZSgpOworCX0KKworCS8qKgorCSAqIFBvc3NpYmxlIGZhaWx1cmVzOgorCSAqIDx1bD4KKwkgKiAgPGxpPk5PX0VMRU1FTlRTX1RPX1BST0NFU1MgLSB0aGUgY29tcGlsYXRpb24gdW5pdCBzdXBwbGllZCB0byB0aGUgb3BlcmF0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+PC9saT4uCisJICogIDxsaT5JTlZBTElEX0VMRU1FTlRfVFlQRVMgLSB0aGUgc3VwcGxpZWQgZWxlbWVudHMgYXJlIG5vdCBhbiBpbnN0YW5jZSBvZiBJV29ya2luZ0NvcHk8L2xpPi4KKwkgKiA8L3VsPgorCSAqIEBzZWUgSUphdmFNb2RlbFN0YXR1cworCSAqIEBzZWUgSmF2YUNvbnZlbnRpb25zCisJICovCisJcHVibGljIElKYXZhTW9kZWxTdGF0dXMgdmVyaWZ5KCkgeworCQlpZiAoZkVsZW1lbnRzVG9Qcm9jZXNzLmxlbmd0aCAhPSAxKSB7CisJCQlyZXR1cm4gbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5PX0VMRU1FTlRTX1RPX1BST0NFU1MpOworCQl9CisJCWlmIChmRWxlbWVudHNUb1Byb2Nlc3NbMF0gPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OT19FTEVNRU5UU19UT19QUk9DRVNTKTsKKwkJfQorCQlpZiAoIShmRWxlbWVudHNUb1Byb2Nlc3NbMF0gaW5zdGFuY2VvZiBJV29ya2luZ0NvcHkpIHx8ICEoKElXb3JraW5nQ29weSkgZkVsZW1lbnRzVG9Qcm9jZXNzWzBdKS5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJCXJldHVybiBuZXcgSmF2YU1vZGVsU3RhdHVzKElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTLCBmRWxlbWVudHNUb1Byb2Nlc3NbMF0pOworCQl9CisJCXJldHVybiBKYXZhTW9kZWxTdGF0dXMuVkVSSUZJRURfT0s7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEphdmFFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3J0SmF2YUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRmYWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU29ydEphdmFFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3J0RWxlbWVudEJ1aWxkZXIuU29ydEVsZW1lbnQ7CisKKy8qKgorICogCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0SmF2YUVsZW1lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBJTEFUSU9OX1VOSVQgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUkZBQ0UgPSA4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEID0gMTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaRVIgPSAzMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSA2NDsJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RSVUNUT1IgPSAxMjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElQTEVfRklFTEQgPSAyNTY7CisJCisJU29ydEVsZW1lbnRCdWlsZGVyIGJ1aWxkZXI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJFU1BPTkRJTkdfRUxFTUVOVCA9ICJjb3JyZXNwb25kaW5nX2VsZW1lbnQiOyAgLy8kTk9OLU5MUy0xJAorCisJSGFzaHRhYmxlIG9wdGlvbnM7CisJCisJcHJvdGVjdGVkIGludCBpZDsKKwlwcm90ZWN0ZWQgaW50IHNvdXJjZVN0YXJ0OworCXByb3RlY3RlZCBpbnQgbmV3U291cmNlU3RhcnQ7CisJcHJvdGVjdGVkIGludCBtb2RpZmllcnM7CisJcHJvdGVjdGVkIFN0cmluZyBzdXBlcmNsYXNzOworCXByb3RlY3RlZCBTdHJpbmdbXSBzdXBlckludGVyZmFjZXM7CisJCisJcHJvdGVjdGVkIFN0cmluZ1tdIHBhcmFtZXRlcnNOYW1lczsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcGFyYW1ldGVyc1R5cGVzOworCXByb3RlY3RlZCBTdHJpbmdbXSB0aHJvd25FeGNlcHRpb25zOworCXByb3RlY3RlZCBTdHJpbmcgcmV0dXJuVHlwZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyB0eXBlOworCXByb3RlY3RlZCBpbnQgZmllbGRDb3VudGVyOworCXByb3RlY3RlZCBTb3J0RWxlbWVudEJ1aWxkZXIuU29ydEZpZWxkRGVjbGFyYXRpb25bXSBpbm5lckZpZWxkczsKKwlwcm90ZWN0ZWQgQVNUTm9kZVtdIGFzdE5vZGVzOworCQorCXByb3RlY3RlZCBpbnQgc291cmNlRW5kOworCXByb3RlY3RlZCBpbnQgbmFtZVNvdXJjZVN0YXJ0OworCXByb3RlY3RlZCBTb3J0RWxlbWVudFtdIGNoaWxkcmVuOworCXByb3RlY3RlZCBpbnQgY2hpbGRyZW5fY291bnQ7CisJcHJvdGVjdGVkIFNvcnRFbGVtZW50IGZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nOworCXByb3RlY3RlZCBTb3J0RWxlbWVudCBsYXN0Q2hpbGRCZWZvcmVTb3J0aW5nOworCXByb3RlY3RlZCBpbnQgZGVjbGFyYXRpb25TdGFydDsKKwlwcm90ZWN0ZWQgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kOworCQorCVNvcnRKYXZhRWxlbWVudChTb3J0RWxlbWVudEJ1aWxkZXIgYnVpbGRlcikgeworCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworCQl0aGlzLm9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7CisJfSAKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkZXIuY29tcGFyYXRvci5jb21wYXJlKHRoaXMsIG8pOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZChTb3J0RWxlbWVudCBzb3J0RWxlbWVudCkgeworCQlpZiAodGhpcy5jaGlsZHJlbl9jb3VudCA9PSAwKSB7CisJCQl0aGlzLmNoaWxkcmVuID0gbmV3IFNvcnRFbGVtZW50WzNdOworCQl9IGVsc2UgaWYgKHRoaXMuY2hpbGRyZW5fY291bnQgPT0gdGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5jaGlsZHJlbiwgMCwgdGhpcy5jaGlsZHJlbiA9IG5ldyBTb3J0RWxlbWVudFt0aGlzLmNoaWxkcmVuX2NvdW50ICogMl0sIDAsIHRoaXMuY2hpbGRyZW5fY291bnQpOworCQl9CisJCXRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbl9jb3VudCsrXSA9IHNvcnRFbGVtZW50OworCX0KKworCXByb3RlY3RlZCB2b2lkIGNsb3NlQ29sbGVjdGlvbnMoKSB7CisJCWludCBsZW5ndGggPSB0aGlzLmNoaWxkcmVuX2NvdW50OworCQlpZiAobGVuZ3RoICE9IDAgJiYgbGVuZ3RoICE9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2hpbGRyZW4sIDAsIHRoaXMuY2hpbGRyZW49IG5ldyBTb3J0RWxlbWVudFtsZW5ndGhdLCAwLCBsZW5ndGgpOworCQl9CQkJCisJfQorCisJYWJzdHJhY3Qgdm9pZCBkaXNwbGF5KFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCB0YWIpOworCQkKKwlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvdXJjZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCXRoaXMubmV3U291cmNlU3RhcnQgPSBidWZmZXIubGVuZ3RoKCk7CisJfQorCisJYWJzdHJhY3Qgdm9pZCBtYXBQb3NpdGlvbnMoKTsKKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZGlzcGxheShidWZmZXIsIHRhYik7CisJCWlmICh0aGlzLmNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWJ1ZmZlcgorCQkJCS5hcHBlbmQodGFiKHRhYikpCisJCQkJLmFwcGVuZCgiQ0hJTERSRU4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiArIExJTkVfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuX2NvdW50OyBpKyspIHsKKwkJCQlidWZmZXIuYXBwZW5kKHRoaXMuY2hpbGRyZW5baV0udG9TdHJpbmcodGFiICsgMSkpOworCQkJCWJ1ZmZlci5hcHBlbmQoTElORV9TRVBBUkFUT1IpOworCQkJfQorCQl9CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgY2hhcltdIHRhYihpbnQgdGFiKSB7CisJCWNoYXJbXSB0YWJzID0gbmV3IGNoYXJbdGFiXTsKKwkJQXJyYXlzLmZpbGwodGFicywgJ1x0Jyk7CisJCXJldHVybiB0YWJzOyAKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdG9TdHJpbmcoMCk7CisJfQkJCisKKwlwcm90ZWN0ZWQgdm9pZCBzb3J0KCkgeworCQlpZiAodGhpcy5jaGlsZHJlbiAhPSBudWxsKSB7CisJCQl0aGlzLmZpcnN0Q2hpbGRCZWZvcmVTb3J0aW5nID0gY2hpbGRyZW5bMF07CisJCQl0aGlzLmxhc3RDaGlsZEJlZm9yZVNvcnRpbmcgPSBjaGlsZHJlblt0aGlzLmNoaWxkcmVuX2NvdW50IC0gMV07CisJCQlzd2l0Y2godGhpcy5pZCkgeworCQkJCWNhc2UgQ0xBU1MgfCBUWVBFIDoKKwkJCQljYXNlIElOVEVSRkFDRSB8IFRZUEUgOgorCQkJCWNhc2UgQ09NUElMQVRJT05fVU5JVCA6CQkKKwkJCQkJdGhpcy5hc3ROb2RlcyA9IGNvbnZlcnRDaGlsZHJlbigpOworCQkJCQlBcnJheXMuc29ydChhc3ROb2RlcywgdGhpcy5idWlsZGVyLmNvbXBhcmF0b3IpOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7IGkgPCBtYXg7IGkrKykgeworCQkJCWNoaWxkcmVuW2ldLnNvcnQoKTsKKwkJCX0gCisJCX0KKwl9CisJCisJcHJpdmF0ZSBBU1ROb2RlW10gY29udmVydENoaWxkcmVuKCkgeworCQlBU1ROb2RlW10gYXN0Tm9kZXMgPSBuZXcgQVNUTm9kZVt0aGlzLmNoaWxkcmVuX2NvdW50XTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHRoaXMuY2hpbGRyZW5fY291bnQ7IGkgPCBtYXg7IGkrKykgeworCQkJU29ydEVsZW1lbnRCdWlsZGVyLlNvcnRFbGVtZW50IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5jaGlsZHJlbltpXTsKKwkJCUFTVE5vZGUgbmV3Tm9kZSA9IGN1cnJlbnRFbGVtZW50LmNvbnZlcnQoKTsKKwkJCW5ld05vZGUuc2V0UHJvcGVydHkoQ09SUkVTUE9ORElOR19FTEVNRU5ULCBjdXJyZW50RWxlbWVudCk7CisJCQlhc3ROb2Rlc1tpXSA9IG5ld05vZGU7CisJCX0KKwkJcmV0dXJuIGFzdE5vZGVzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZC5qYXZhCmluZGV4IGNhYTY5NDMuLmUyODBmZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwpAQCAtMzksNyArMzksNyBAQAogICovCiBwdWJsaWMgT2JqZWN0IGdldENvbnN0YW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJU291cmNlRmllbGRFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZUZpZWxkRWxlbWVudEluZm8pIGdldEVsZW1lbnRJbmZvKCk7Ci0JcmV0dXJuIGNvbnZlcnRDb25zdGFudChpbmZvLmdldENvbnN0YW50KCkpOworCXJldHVybiBpbmZvLmluaXRpYWxpemF0aW9uU291cmNlOwogfQogLyoqCiAgKiBAc2VlIEphdmFFbGVtZW50I2dldEhhbmRsZU1lbWVudG8oKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGRFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlRmllbGRFbGVtZW50SW5mby5qYXZhCmluZGV4IDRjMDNkYTUuLjkwODIzMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZUZpZWxkRWxlbWVudEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VGaWVsZEVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTggKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db25zdGFudDsKIAogLyoqCiAgKiBFbGVtZW50IGluZm8gZm9yIElGaWVsZCBlbGVtZW50cy4KQEAgLTIzLDMwICsyMiwyNSBAQAogCS8qKgogCSAqIFRoZSB0eXBlIG5hbWUgb2YgdGhpcyBmaWVsZC4KIAkgKi8KLQlwcm90ZWN0ZWQgY2hhcltdIGZUeXBlTmFtZTsKKwlwcm90ZWN0ZWQgY2hhcltdIHR5cGVOYW1lOwogCQogCS8qKgotCSAqIFRoZSBmaWVsZCdzIGNvbnN0YW50IHZhbHVlCisJICogVGhlIGZpZWxkJ3MgaW5pdGlhbGl6ZXIgc3RyaW5nIChpZiB0aGUgZmllbGQgaXMgYSBjb25zdGFudCkuCiAJICovCi0JcHJvdGVjdGVkIENvbnN0YW50IGZDb25zdGFudDsKLS8qKgotICogQ29uc3RydWN0cyBhbiBpbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIGZpZWxkLgorCXByb3RlY3RlZCBjaGFyW10gaW5pdGlhbGl6YXRpb25Tb3VyY2U7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBpbml0aWFsaXphdGlvbiBzb3VyY2UgZm9yIHRoaXMgZmllbGQuCisgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGZpZWxkIGlzIG5vdCBhIGNvbnN0YW50IG9yIGlmIGl0IGhhcyBubyBpbml0aWFsaXphdGlvbi4KICAqLwotcHJvdGVjdGVkIFNvdXJjZUZpZWxkRWxlbWVudEluZm8oKSB7Ci0JZkNvbnN0YW50ID0gQ29uc3RhbnQuTm90QUNvbnN0YW50OwkgCi19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkIG9yCi0gKiBDb25zdGFudC5Ob3RBQ29uc3RhbnQgaWYgdGhlIGZpZWxkIGlzIG5vdCBjb25zdGFudC4KLSAqLwotcHVibGljIENvbnN0YW50IGdldENvbnN0YW50KCkgewotCXJldHVybiBmQ29uc3RhbnQ7CitwdWJsaWMgY2hhcltdIGdldEluaXRpYWxpemF0aW9uU291cmNlKCkgeworCXJldHVybiB0aGlzLmluaXRpYWxpemF0aW9uU291cmNlOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGZpZWxkLgogICovCiBwdWJsaWMgY2hhcltdIGdldFR5cGVOYW1lKCkgewotCXJldHVybiBmVHlwZU5hbWU7CisJcmV0dXJuIHRoaXMudHlwZU5hbWU7CiB9CiAvKioKICAqIFJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBmaWVsZC4KQEAgLTU0LDE5ICs0OCwxMyBAQAogICogQHNlZSBTaWduYXR1cmUKICAqLwogcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgewotCXJldHVybiBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShmVHlwZU5hbWUsIGZhbHNlKTsKKwlyZXR1cm4gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUodGhpcy50eXBlTmFtZSwgZmFsc2UpOwogfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZCBvcgotICogQ29uc3RhbnQuTm90QUNvbnN0YW50IGlmIHRoZSBmaWVsZCBpcyBub3QgY29uc3RhbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldENvbnN0YW50KENvbnN0YW50IGNvbnN0YW50KSB7Ci0JZkNvbnN0YW50ID0gY29uc3RhbnQ7IAotfQorCiAvKioKICAqIFNldHMgdGhlIHR5cGUgbmFtZSBvZiB0aGUgZmllbGQuCiAgKi8KIHByb3RlY3RlZCB2b2lkIHNldFR5cGVOYW1lKGNoYXJbXSB0eXBlTmFtZSkgewotCWZUeXBlTmFtZT0gdHlwZU5hbWU7CisJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNYXBwZXIuamF2YQppbmRleCBmZDZmNjlmLi5mODc0NTk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNYXBwZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNYXBwZXIuamF2YQpAQCAtMSwzNCArMSwzNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JU291cmNlRWxlbWVudFJlcXVlc3RvcjsKQEAgLTM2LDcgKzM3LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuUmVmZXJlbmNlSW5mb0FkYXB0ZXI7CiAKQEAgLTUyLDYgKzUyLDE1IEBACiBwdWJsaWMgY2xhc3MgU291cmNlTWFwcGVyCiAJZXh0ZW5kcyBSZWZlcmVuY2VJbmZvQWRhcHRlcgogCWltcGxlbWVudHMgSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgeworCQkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOworCisJLyoqCisJICogU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290cyB3aXRoaW4KKwkgKiB0aGUgemlwIChlbXB0eSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdCkuIDxjb2RlPm51bGw8L2NvZGU+IGlzCisJICogbm90IGEgdmFsaWQgcm9vdCBwYXRoLgorCSAqLworCXByb3RlY3RlZCBIYXNoU2V0IHJvb3RQYXRoczsKIAogCS8qKgogCSAqIFRoZSBiaW5hcnkgdHlwZSBzb3VyY2UgaXMgYmVpbmcgbWFwcGVkIGZvcgpAQCAtNjEsMTMgKzcwLDEzIEBACiAJLyoqCiAJICogVGhlIGxvY2F0aW9uIG9mIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIHNvdXJjZS4KIAkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZlppcFBhdGg7CisJcHJvdGVjdGVkIElQYXRoIHNvdXJjZVBhdGg7CiAJLyoqCiAJICogU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IHdpdGhpbgogCSAqIHRoZSB6aXAgKGVtcHR5IHNwZWNpZmllcyB0aGUgZGVmYXVsdCByb290KS4gPGNvZGU+bnVsbDwvY29kZT4gaXMKIAkgKiBub3QgYSB2YWxpZCByb290IHBhdGguCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBmUm9vdFBhdGg7CisJcHJvdGVjdGVkIFN0cmluZyByb290UGF0aDsKIAogCS8qKgogCSAqIFVzZWQgZm9yIGVmZmljaWVuY3kKQEAgLTE0NSwyOCArMTU0LDQ4IEBACiAJaW50IGFub255bW91c0NsYXNzTmFtZTsKIAkKIAkvKioKLQkgKiBGaWxlIGVuY29kaW5nIHRvIGJlIHVzZWQKKwkgKk9wdGlvbnMgdG8gYmUgdXNlZAogCSAqLwogCVN0cmluZyBlbmNvZGluZzsKKwlNYXAgb3B0aW9uczsKKwkKKwkvKioKKwkgKiBVc2UgdG8gaGFuZGxlIHJvb3QgcGF0aHMgaW5mZXJlbmNlCisJICovCisJcHJpdmF0ZSBib29sZWFuIGFyZVJvb3RQYXRoc0NvbXB1dGVkOworCXByaXZhdGUgRmlsZW5hbWVGaWx0ZXIgZmlsZW5hbWVGaWx0ZXI7CisJCQorCXB1YmxpYyBTb3VyY2VNYXBwZXIoKSB7CisJCXRoaXMuYXJlUm9vdFBhdGhzQ29tcHV0ZWQgPSBmYWxzZTsKKwkJdGhpcy5maWxlbmFtZUZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKwkJCQlyZXR1cm4gbmFtZS5lbmRzV2l0aCgiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KIAkKIAkvKioKIAkgKiBDcmVhdGVzIGEgPGNvZGU+U291cmNlTWFwcGVyPC9jb2RlPiB0aGF0IGxvY2F0ZXMgc291cmNlIGluIHRoZSB6aXAgZmlsZQogCSAqIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KIAkgKi8KLQlwdWJsaWMgU291cmNlTWFwcGVyKElQYXRoIHppcFBhdGgsIFN0cmluZyByb290UGF0aCkgewotCQl0aGlzLmZaaXBQYXRoID0gemlwUGF0aDsKLQkJdGhpcy5mUm9vdFBhdGggPSByb290UGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCWlmICh0aGlzLmZSb290UGF0aC5lbmRzV2l0aCgiLyIgKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmZSb290UGF0aCA9IHRoaXMuZlJvb3RQYXRoLnN1YnN0cmluZygwLCB0aGlzLmZSb290UGF0aC5sYXN0SW5kZXhPZignLycpKTsKKwlwdWJsaWMgU291cmNlTWFwcGVyKElQYXRoIHNvdXJjZVBhdGgsIFN0cmluZyByb290UGF0aCwgTWFwIG9wdGlvbnMpIHsKKwkJdGhpcy5hcmVSb290UGF0aHNDb21wdXRlZCA9IGZhbHNlOworCQl0aGlzLmZpbGVuYW1lRmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworCQkJCXJldHVybiBuYW1lLmVuZHNXaXRoKCIuamF2YSIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMuZW5jb2RpbmcgPSAoU3RyaW5nKW9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworCQlpZiAocm9vdFBhdGggIT0gbnVsbCkgeworCQkJdGhpcy5yb290UGF0aHMgPSBuZXcgSGFzaFNldCgpOworCQkJdGhpcy5yb290UGF0aHMuYWRkKHJvb3RQYXRoKTsKIAkJfQorCQl0aGlzLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoOwogCQl0aGlzLmZTb3VyY2VSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwogCQl0aGlzLmZQYXJhbWV0ZXJOYW1lcyA9IG5ldyBIYXNoTWFwKCk7CiAJCXRoaXMuaW1wb3J0c1RhYmxlID0gbmV3IEhhc2hNYXAoKTsKIAkJdGhpcy5pbXBvcnRzQ291bnRlclRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCUlSZXNvdXJjZSB6aXBSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih6aXBQYXRoKTsKLQotCQl0aGlzLmVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOwogCX0KIAkKIAkvKioKQEAgLTI1NiwxMiArMjg1LDE5NiBAQAogCQkJaWYgKGxhc3RJbmRleCA9PSAtMSkgewogCQkJCXR5cGVTaWdzW2ldID0gdHlwZVNpZzsKIAkJCX0gZWxzZSB7Ci0JCQkJdHlwZVNpZ3NbaV0gPSBTaWduYXR1cmUuQ19VTlJFU09MVkVEICsgdHlwZVNpZy5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwgdHlwZVNpZy5sZW5ndGgoKSk7CisJCQkJaW50IGFycmF5RW5kID0gMDsKKwkJCQl3aGlsZSh0eXBlU2lnLmNoYXJBdChhcnJheUVuZCkgPT0gU2lnbmF0dXJlLkNfQVJSQVkpIGFycmF5RW5kKys7CisJCQkJdHlwZVNpZ3NbaV0gPSB0eXBlU2lnLnN1YnN0cmluZygwLCBhcnJheUVuZCkgKyBTaWduYXR1cmUuQ19VTlJFU09MVkVEICsgdHlwZVNpZy5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwgdHlwZVNpZy5sZW5ndGgoKSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIHR5cGVTaWdzOwogCX0KIAkKKwlwcml2YXRlIHZvaWQgY29tcHV0ZUFsbFJvb3RQYXRocyhJVHlwZSB0eXBlKSB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7CisJCXRoaXMucm9vdFBhdGhzID0gbmV3IEhhc2hTZXQoKTsKKwkJbG9uZyB0aW1lID0gMDsKKwkJaWYgKFZFUkJPU0UpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcHV0ZSBhbGwgcm9vdCBwYXRocyBmb3IgIiArIHJvb3QuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJfQorCQlmaW5hbCBIYXNoU2V0IGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMgPSBuZXcgSGFzaFNldCgpOworCQlib29sZWFuIGNvbnRhaW5zQURlZmF1bHRQYWNrYWdlID0gZmFsc2U7CisKKwkJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyUGFja2FnZUZyYWdtZW50Um9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSByb290OworCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQlaaXBGaWxlIHppcCA9IG51bGw7CisJCQl0cnkgeworCQkJCXppcCA9IG1hbmFnZXIuZ2V0WmlwRmlsZShqYXJQYWNrYWdlRnJhZ21lbnRSb290LmdldFBhdGgoKSk7CisJCQkJZm9yIChFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwLmVudHJpZXMoKTsgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKTsgKSB7CisJCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisJCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisJCQkJCWlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgeworCQkJCQkJaW50IGluZGV4ID0gZW50cnlOYW1lLmluZGV4T2YoJy8nKTsKKwkJCQkJCWlmIChpbmRleCAhPSAtMSkgeworCQkJCQkJCVN0cmluZyBmaXJzdExldmVsUGFja2FnZU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCQkJCQlpZiAoSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUoZmlyc3RMZXZlbFBhY2thZ2VOYW1lKS5pc09LKCkpIHsKKwkJCQkJCQkJZmlyc3RMZXZlbFBhY2thZ2VOYW1lcy5hZGQoZmlyc3RMZXZlbFBhY2thZ2VOYW1lKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKFV0aWwuaXNDbGFzc0ZpbGVOYW1lKGVudHJ5TmFtZSkpIHsKKwkJCQkJCQljb250YWluc0FEZWZhdWx0UGFja2FnZSA9IHRydWU7CisJCQkJCQl9CQkJCQkJCisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCX0gZmluYWxseSB7CisJCQkJbWFuYWdlci5jbG9zZVppcEZpbGUoemlwKTsgLy8gaGFuZGxlIG51bGwgY2FzZQorCQkJfQorCQl9IGVsc2UgeworCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgcm9vdC5nZXRQYXRoKCksIHRydWUpOworCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290LmdldFJlc291cmNlKCk7CisJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCXRyeSB7CisJCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gKChJRm9sZGVyKSByZXNvdXJjZSkubWVtYmVycygpOworCQkJCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1lbWJlcnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCQlJUmVzb3VyY2UgbWVtYmVyID0gbWVtYmVyc1tpXTsKKwkJCQkJCQlpZiAobWVtYmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCQkJCWZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuYWRkKG1lbWJlci5nZXROYW1lKCkpOworCQkJCQkJCX0gZWxzZSBpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUobWVtYmVyLmdldE5hbWUoKSkpIHsKKwkJCQkJCQkJY29udGFpbnNBRGVmYXVsdFBhY2thZ2UgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKKwkJCQlGaWxlIGZpbGUgPSAoRmlsZSl0YXJnZXQ7CisJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOworCQkJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmlsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJCUZpbGUgY3VycmVudEZpbGUgPSBmaWxlc1tpXTsKKwkJCQkJCWlmIChjdXJyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQkJZmlyc3RMZXZlbFBhY2thZ2VOYW1lcy5hZGQoY3VycmVudEZpbGUuZ2V0TmFtZSgpKTsKKwkJCQkJCX0gZWxzZSBpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUoY3VycmVudEZpbGUuZ2V0TmFtZSgpKSkgeworCQkJCQkJCWNvbnRhaW5zQURlZmF1bHRQYWNrYWdlID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHRoaXMuc291cmNlUGF0aC5sYXN0U2VnbWVudCgpKSkgeworCQkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCQlaaXBGaWxlIHppcCA9IG51bGw7CisJCQl0cnkgeworCQkJCXppcCA9IG1hbmFnZXIuZ2V0WmlwRmlsZSh0aGlzLnNvdXJjZVBhdGgpOworCQkJCWZvciAoRW51bWVyYXRpb24gZW50cmllcyA9IHppcC5lbnRyaWVzKCk7IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCk7ICkgeworCQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOworCQkJCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChlbnRyeS5nZXROYW1lKCkpOworCQkJCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7CisJCQkJCQlpZiAoc2VnbWVudENvdW50ID4gMSkgeworCQkJCQkJCWxvb3A6IGZvciAoaW50IGkgPSAwLCBtYXggPSBwYXRoLnNlZ21lbnRDb3VudCgpIC0gMTsgaSA8IG1heDsgaSsrKSB7CisJCQkJCQkJCWlmIChmaXJzdExldmVsUGFja2FnZU5hbWVzLmNvbnRhaW5zKHBhdGguc2VnbWVudChpKSkpIHsKKwkJCQkJCQkJCXRoaXMucm9vdFBhdGhzLmFkZChwYXRoLnVwdG9TZWdtZW50KGkpLnRvU3RyaW5nKCkpOworCQkJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoaSA9PSBtYXggLSAxICYmIGNvbnRhaW5zQURlZmF1bHRQYWNrYWdlKSB7CisJCQkJCQkJCQl0aGlzLnJvb3RQYXRocy5hZGQocGF0aC51cHRvU2VnbWVudChtYXgpLnRvU3RyaW5nKCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChjb250YWluc0FEZWZhdWx0UGFja2FnZSkgeworCQkJCQkJCXRoaXMucm9vdFBhdGhzLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJfSBmaW5hbGx5IHsKKwkJCQltYW5hZ2VyLmNsb3NlWmlwRmlsZSh6aXApOyAvLyBoYW5kbGUgbnVsbCBjYXNlCisJCQl9CisJCX0gZWxzZSB7CisJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCB0aGlzLnNvdXJjZVBhdGgsIHRydWUpOworCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQljb21wdXRlUm9vdFBhdGgoKElGb2xkZXIpdGFyZ2V0LCBmaXJzdExldmVsUGFja2FnZU5hbWVzLCBjb250YWluc0FEZWZhdWx0UGFja2FnZSk7CisJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKKwkJCQlGaWxlIGZpbGUgPSAoRmlsZSl0YXJnZXQ7CisJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJCQljb21wdXRlUm9vdFBhdGgoZmlsZSwgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgY29udGFpbnNBRGVmYXVsdFBhY2thZ2UpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoVkVSQk9TRSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCAiICsgdGhpcy5yb290UGF0aHMuc2l6ZSgpICsgIiByb290IHBhdGhzIik7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJU3lzdGVtLm91dC5wcmludGxuKCJTcGVudCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJdGhpcy5hcmVSb290UGF0aHNDb21wdXRlZCA9IHRydWU7CisJfQorCQorCXByaXZhdGUgdm9pZCBjb21wdXRlUm9vdFBhdGgoRmlsZSBkaXJlY3RvcnksIEhhc2hTZXQgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgYm9vbGVhbiBoYXNEZWZhdWx0UGFja2FnZSkgeworCQlGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7CisJCWJvb2xlYW4gaGFzU3ViRGlyZWN0b3JpZXMgPSBmYWxzZTsKKwkJbG9vcDogZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKKwkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQloYXNTdWJEaXJlY3RvcmllcyA9IHRydWU7CisJCQkJaWYgKGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMuY29udGFpbnMoZmlsZS5nZXROYW1lKCkpKSB7CisJCQkJCUlQYXRoIGZ1bGxQYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGF0aCgpKTsKKwkJCQkJSVBhdGggcm9vdFBhdGhFbnRyeSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHModGhpcy5zb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpKS5zZXREZXZpY2UobnVsbCk7CisJCQkJCXRoaXMucm9vdFBhdGhzLmFkZChyb290UGF0aEVudHJ5LnRvU3RyaW5nKCkpOworCQkJCQlicmVhayBsb29wOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbXB1dGVSb290UGF0aChmaWxlLCBmaXJzdExldmVsUGFja2FnZU5hbWVzLCBoYXNEZWZhdWx0UGFja2FnZSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChpID09IG1heCAtIDEgJiYgIWhhc1N1YkRpcmVjdG9yaWVzICYmIGhhc0RlZmF1bHRQYWNrYWdlKSB7CisJCQkJRmlsZSBwYXJlbnREaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKwkJCQlpZiAocGFyZW50RGlyLmxpc3QodGhpcy5maWxlbmFtZUZpbHRlcikubGVuZ3RoICE9IDApIHsKKwkJCQkJSVBhdGggZnVsbFBhdGggPSBuZXcgUGF0aChwYXJlbnREaXIuZ2V0UGF0aCgpKTsKKwkJCQkJSVBhdGggcm9vdFBhdGhFbnRyeSA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHModGhpcy5zb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpKS5zZXREZXZpY2UobnVsbCk7CisJCQkJCXRoaXMucm9vdFBhdGhzLmFkZChyb290UGF0aEVudHJ5LnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0JCisKKwlwcml2YXRlIHZvaWQgY29tcHV0ZVJvb3RQYXRoKElGb2xkZXIgZGlyZWN0b3J5LCBIYXNoU2V0IGZpcnN0TGV2ZWxQYWNrYWdlTmFtZXMsIGJvb2xlYW4gaGFzRGVmYXVsdFBhY2thZ2UpIHsKKwkJdHJ5IHsKKwkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGRpcmVjdG9yeS5tZW1iZXJzKCk7CisJCQlib29sZWFuIGhhc1N1YkRpcmVjdG9yaWVzID0gZmFsc2U7CisJCQlsb29wOiBmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzb3VyY2VzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgeworCQkJCQloYXNTdWJEaXJlY3RvcmllcyA9IHRydWU7CisJCQkJCWlmIChmaXJzdExldmVsUGFja2FnZU5hbWVzLmNvbnRhaW5zKHJlc291cmNlLmdldE5hbWUoKSkpIHsKKwkJCQkJCUlQYXRoIGZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJCUlQYXRoIHJvb3RQYXRoRW50cnkgPSBmdWxsUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHRoaXMuc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSkuc2V0RGV2aWNlKG51bGwpOworCQkJCQkJdGhpcy5yb290UGF0aHMuYWRkKHJvb3RQYXRoRW50cnkudG9TdHJpbmcoKSk7CisJCQkJCQlicmVhayBsb29wOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29tcHV0ZVJvb3RQYXRoKChJRm9sZGVyKSByZXNvdXJjZSwgZmlyc3RMZXZlbFBhY2thZ2VOYW1lcywgaGFzRGVmYXVsdFBhY2thZ2UpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpID09IG1heCAtIDEgJiYgIWhhc1N1YkRpcmVjdG9yaWVzICYmIGhhc0RlZmF1bHRQYWNrYWdlKSB7CisJCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7CisJCQkJCS8vIGNoZWNrIGlmIG9uZSBtZW1iZXIgaXMgYSAuamF2YSBmaWxlCisJCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOworCQkJCQlib29sZWFuIGhhc0phdmFTb3VyY2VGaWxlID0gZmFsc2U7CisJCQkJCWZvciAoaW50IGogPSAwLCBtYXgyID0gbWVtYmVycy5sZW5ndGg7IGogPCBtYXgyOyBqKyspIHsKKwkJCQkJCWlmIChVdGlsLmlzSmF2YUZpbGVOYW1lKG1lbWJlcnNbaV0uZ2V0TmFtZSgpKSkgeworCQkJCQkJCWhhc0phdmFTb3VyY2VGaWxlID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoaGFzSmF2YVNvdXJjZUZpbGUpIHsKKwkJCQkJCUlQYXRoIGZ1bGxQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7CisJCQkJCQlJUGF0aCByb290UGF0aEVudHJ5ID0gZnVsbFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh0aGlzLnNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpLnNldERldmljZShudWxsKTsKKwkJCQkJCXRoaXMucm9vdFBhdGhzLmFkZChyb290UGF0aEVudHJ5LnRvU3RyaW5nKCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0JCisKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAJICovCkBAIC00NzQsNyArNjg3LDcgQEAKIAkvKioKIAkgKiBAc2VlIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yCiAJICovCi0JcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgeworCXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKIAkJaWYgKHR5cGVEZXB0aCA+PSAwKSB7CiAJCQlJVHlwZSBjdXJyZW50VHlwZSA9IHRoaXMudHlwZXNbdHlwZURlcHRoXTsKIAkJCXNldFNvdXJjZVJhbmdlKApAQCAtNTM5LDY1ICs3NTIsMTYzIEBACiAJCX0KIAkJSUJpbmFyeVR5cGUgaW5mbyA9IG51bGw7CiAJCXRyeSB7Ci0JCQlpbmZvID0gKElCaW5hcnlUeXBlKSBkZWNsVHlwZS5nZXRSYXdJbmZvKCk7CisJCQlpbmZvID0gKElCaW5hcnlUeXBlKSBkZWNsVHlwZS5nZXRFbGVtZW50SW5mbygpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuZmluZFNvdXJjZSh0eXBlLCBpbmZvKTsKKwkJU3RyaW5nIHNpbXBsZVNvdXJjZUZpbGVOYW1lID0gZmluZFNvdXJjZUZpbGVOYW1lKHR5cGUsIGluZm8pOworCQlpZiAoc2ltcGxlU291cmNlRmlsZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuZmluZFNvdXJjZSh0eXBlLCBzaW1wbGVTb3VyY2VGaWxlTmFtZSk7CiAJfQogCQogCS8qKgogCSAqIExvY2F0ZXMgYW5kIHJldHVybnMgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiAoYmluYXJ5KSB0eXBlLCBpbiB0aGlzCiAJICogU291cmNlTWFwcGVyJ3MgWklQIGZpbGUsIG9yIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgc291cmNlCiAJICogY29kZSBjYW5ub3QgYmUgZm91bmQuCisJICogVGhlIGdpdmVuIHNpbXBsZVNvdXJjZUZpbGVOYW1lIGlzIHRoZSAuamF2YSBmaWxlIG5hbWUgKHdpdGhvdXQgdGhlIGVuY2xvc2luZworCSAqIGZvbGRlcikgdXNlZCB0byBjcmVhdGUgdGhlIGdpdmVuIHR5cGUgKGUuZy4gIkEuamF2YSIgZm9yIHgveS9BJElubmVyLmNsYXNzKQogCSAqLwotCXB1YmxpYyBjaGFyW10gZmluZFNvdXJjZShJVHlwZSB0eXBlLCBJQmluYXJ5VHlwZSBpbmZvKSB7Ci0JCWNoYXJbXSBzb3VyY2VGaWxlTmFtZSA9IGluZm8uc291cmNlRmlsZU5hbWUoKTsKLQkJaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gc291cmNlIGZpbGUgYXR0cmlidXRlCi0JCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhzb3VyY2VGaWxlTmFtZSk7Ci0KKwlwdWJsaWMgY2hhcltdIGZpbmRTb3VyY2UoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZVNvdXJjZUZpbGVOYW1lKSB7CisJCWxvbmcgdGltZSA9IDA7CisJCWlmIChWRVJCT1NFKSB7CisJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCX0KKwkJU3RyaW5nIG5hbWUgPSBzaW1wbGVTb3VyY2VGaWxlTmFtZTsKIAkJSVBhY2thZ2VGcmFnbWVudCBwa2dGcmFnID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKIAkJaWYgKCFwa2dGcmFnLmlzRGVmYXVsdFBhY2thZ2UoKSkgewotCQkJU3RyaW5nIHBrZyA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKTsKKwkJCVN0cmluZyBwa2cgPSBwa2dGcmFnLmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJyk7CiAJCQluYW1lID0gcGtnICsgJy8nICsgbmFtZTsKIAkJfQotCQkvLyB0cnkgdG8gZ2V0IHRoZSBlbnRyeQotCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCVppcEZpbGUgemlwID0gbnVsbDsKKwkKIAkJY2hhcltdIHNvdXJjZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZnVsbE5hbWU7Ci0JCQkvL2FkZCB0aGUgcm9vdCBwYXRoIGlmIHNwZWNpZmllZAotCQkJaWYgKCFmUm9vdFBhdGguZXF1YWxzKElQYWNrYWdlRnJhZ21lbnRSb290LkRFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSCkpIHsKLQkJCQlmdWxsTmFtZSA9IGZSb290UGF0aCArICcvJyArIG5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCWZ1bGxOYW1lID0gbmFtZTsKLQkJCX0KLQkJCXppcCA9IGdldFppcCgpOwotCQkJZW50cnkgPSB6aXAuZ2V0RW50cnkoZnVsbE5hbWUpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkvLyBub3cgcmVhZCB0aGUgc291cmNlIGNvZGUKLQkJCQlieXRlW10gYnl0ZXMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWJ5dGVzID0gVXRpbC5nZXRaaXBFbnRyeUJ5dGVDb250ZW50KGVudHJ5LCB6aXApOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKGJ5dGVzICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNvdXJjZSA9IFV0aWwuYnl0ZXNUb0NoYXIoYnl0ZXMsIHRoaXMuZW5jb2RpbmcpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlzb3VyY2UgPSBudWxsOworCQkKKwkJaWYgKCFhcmVSb290UGF0aHNDb21wdXRlZCkgeworCQkJY29tcHV0ZUFsbFJvb3RQYXRocyh0eXBlKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMucm9vdFBhdGggIT0gbnVsbCkgeworCQkJc291cmNlID0gZ2V0U291cmNlRm9yUm9vdFBhdGgodGhpcy5yb290UGF0aCwgbmFtZSk7CisJCX0KKworCQlpZiAoc291cmNlID09IG51bGwpIHsKKwkJCS8qCisJCQkgKiBXZSBzaG91bGQgdHJ5IGFsbCBleGlzdGluZyByb290IHBhdGhzLiBJZiBub25lIHdvcmtzLCB0cnkgdG8gcmVjb21wdXRlIGl0LgorCQkJICogSWYgaXQgc3RpbGwgZG9lc24ndCB3b3JrLCB0aGVuIHJldHVybiBudWxsCisJCQkgKi8KKwkJCWlmICh0aGlzLnJvb3RQYXRocyAhPSBudWxsKSB7CisJCQkJbG9vcDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMucm9vdFBhdGhzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7CisJCQkJCVN0cmluZyBjdXJyZW50Um9vdFBhdGggPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisJCQkJCWlmICghY3VycmVudFJvb3RQYXRoLmVxdWFscyh0aGlzLnJvb3RQYXRoKSkgeworCQkJCQkJc291cmNlID0gZ2V0U291cmNlRm9yUm9vdFBhdGgoY3VycmVudFJvb3RQYXRoLCBuYW1lKTsKKwkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgeworCQkJCQkJCS8vIHJlbWVtYmVyIHJpZ2h0IHJvb3QgcGF0aAorCQkJCQkJCXRoaXMucm9vdFBhdGggPSBjdXJyZW50Um9vdFBhdGg7CisJCQkJCQkJYnJlYWsgbG9vcDsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNsb3NlWmlwRmlsZSh6aXApOworCQl9CisJCWlmIChWRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNwZW50ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICJtcyBmb3IgIiArIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJCXJldHVybiBzb3VyY2U7CiAJfQorCisJLyoKKwkgKiBGaW5kcyB0aGUgc291cmNlIGZpbGUgbmFtZSAoaS5lLiB0aGUgc2ltcGxlIC5qYXZhIGZpbGUgbmFtZSkgZm9yIHRoZSBnaXZlbiBJQmluYXJ5VHlwZS4KKwkgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZmluZFNvdXJjZUZpbGVOYW1lKElUeXBlIHR5cGUsIElCaW5hcnlUeXBlIGluZm8pIHsKKwkJY2hhcltdIHNvdXJjZUZpbGVOYW1lID0gaW5mby5zb3VyY2VGaWxlTmFtZSgpOworCQlpZiAoc291cmNlRmlsZU5hbWUgPT0gbnVsbCkgeworCQkJLyoKKwkJCSAqIFdlIGFzc3VtZSB0aGF0IHRoaXMgdHlwZSBoYXMgYmVlbiBjb21waWxlZCBmcm9tIGEgZmlsZSB3aXRoIGl0cyBuYW1lCisJCQkgKiBGb3IgZXhhbXBsZSwgQS5jbGFzcyBjb21lcyBmcm9tIEEuamF2YSBhbmQgcC5BLmNsYXNzIGNvbWVzIGZyb20gYSBmaWxlIEEuamF2YQorCQkJICogaW4gdGhlIGZvbGRlciBwLgorCQkJICovCisJCQl0cnkgeworCQkJCWlmICh0eXBlLmlzTWVtYmVyKCkpIHsKKwkJCQkJSVR5cGUgZW5jbG9zaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJCQl3aGlsZSAoZW5jbG9zaW5nVHlwZS5nZXREZWNsYXJpbmdUeXBlKCkgIT0gbnVsbCkgeworCQkJCQkJZW5jbG9zaW5nVHlwZSA9IGVuY2xvc2luZ1R5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCQkJCQl9CisJCQkJCXJldHVybiBlbmNsb3NpbmdUeXBlLmdldEVsZW1lbnROYW1lKCkgKyAiLmphdmEiOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIGlmICh0eXBlLmlzTG9jYWwoKSB8fCB0eXBlLmlzQW5vbnltb3VzKCkpeworCQkJCQlTdHJpbmcgdHlwZVF1YWxpZmllZE5hbWUgPSB0eXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7CisJCQkJCXJldHVybiB0eXBlUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgdHlwZVF1YWxpZmllZE5hbWUuaW5kZXhPZignJCcpKSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gdHlwZS5nZXRFbGVtZW50TmFtZSgpICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIG5ldyBTdHJpbmcoc291cmNlRmlsZU5hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgY2hhcltdIGdldFNvdXJjZUZvclJvb3RQYXRoKFN0cmluZyBjdXJyZW50Um9vdFBhdGgsIFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBuZXdGdWxsTmFtZTsKKwkJaWYgKCFjdXJyZW50Um9vdFBhdGguZXF1YWxzKElQYWNrYWdlRnJhZ21lbnRSb290LkRFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSCkpIHsKKwkJCWlmIChjdXJyZW50Um9vdFBhdGguZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbmV3RnVsbE5hbWUgPSBjdXJyZW50Um9vdFBhdGggKyBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQluZXdGdWxsTmFtZSA9IGN1cnJlbnRSb290UGF0aCArICcvJyArIG5hbWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQluZXdGdWxsTmFtZSA9IG5hbWU7CisJCX0KKwkJcmV0dXJuIHRoaXMuZmluZFNvdXJjZShuZXdGdWxsTmFtZSk7CisJfQorCQorCXB1YmxpYyBjaGFyW10gZmluZFNvdXJjZShTdHJpbmcgZnVsbE5hbWUpIHsKKwkJY2hhcltdIHNvdXJjZSA9IG51bGw7CisJCWlmIChVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHRoaXMuc291cmNlUGF0aC5sYXN0U2VnbWVudCgpKSkgeworCQkJLy8gdHJ5IHRvIGdldCB0aGUgZW50cnkKKwkJCVppcEVudHJ5IGVudHJ5ID0gbnVsbDsKKwkJCVppcEZpbGUgemlwID0gbnVsbDsKKwkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJdHJ5IHsKKwkJCQl6aXAgPSBtYW5hZ2VyLmdldFppcEZpbGUodGhpcy5zb3VyY2VQYXRoKTsKKwkJCQllbnRyeSA9IHppcC5nZXRFbnRyeShmdWxsTmFtZSk7CisJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKKwkJCQkJLy8gbm93IHJlYWQgdGhlIHNvdXJjZSBjb2RlCisJCQkJCXNvdXJjZSA9IHJlYWRTb3VyY2UoZW50cnksIHppcCk7CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGZpbmFsbHkgeworCQkJCW1hbmFnZXIuY2xvc2VaaXBGaWxlKHppcCk7IC8vIGhhbmRsZSBudWxsIGNhc2UKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHRoaXMuc291cmNlUGF0aCwgdHJ1ZSk7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpdGFyZ2V0OworCQkJCUlSZXNvdXJjZSByZXMgPSBmb2xkZXIuZmluZE1lbWJlcihmdWxsTmFtZSk7CisJCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCXRyeSB7CisJCQkJCQlzb3VyY2UgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLmdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheSgoSUZpbGUpcmVzLCB0aGlzLmVuY29kaW5nKTsKKwkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmlsZSkgeworCQkJCUZpbGUgZmlsZSA9IChGaWxlKXRhcmdldDsKKwkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKGZpbGUsIGZ1bGxOYW1lKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXNvdXJjZSA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KHNvdXJjZUZpbGUsIHRoaXMuZW5jb2RpbmcpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHNvdXJjZTsKKwl9CisKKwogCQogCS8qKgogCSAqIFJldHVybnMgdGhlIFNvdXJjZVJhbmdlIGZvciB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgb3IKQEAgLTcxNywxNCArMTAyOCw3IEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+WmlwRmlsZTwvY29kZT4gdGhhdCBzb3VyY2UgaXMgbG9jYXRlZCBpbi4KLQkgKi8KLQlwdWJsaWMgWmlwRmlsZSBnZXRaaXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRaaXBGaWxlKGZaaXBQYXRoKTsKLQl9Ci0JCisJCQogCS8qKgogCSAqIE1hcHMgdGhlIGdpdmVuIHNvdXJjZSBjb2RlIHRvIHRoZSBnaXZlbiBiaW5hcnkgdHlwZSBhbmQgaXRzIGNoaWxkcmVuLgogCSAqLwpAQCAtNzM3LDcgKzEwNDEsNyBAQAogCSAqIElmIGEgbm9uLW51bGwgamF2YSBlbGVtZW50IGlzIHBhc3NlZCwgZmluZHMgdGhlIG5hbWUgcmFuZ2UgZm9yIHRoZSAKIAkgKiBnaXZlbiBqYXZhIGVsZW1lbnQgd2l0aG91dCBzdG9yaW5nIGl0LgogCSAqLwotCXB1YmxpYyBJU291cmNlUmFuZ2UgbWFwU291cmNlKAorCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVNvdXJjZVJhbmdlIG1hcFNvdXJjZSgKIAkJSVR5cGUgdHlwZSwKIAkJY2hhcltdIGNvbnRlbnRzLAogCQlJSmF2YUVsZW1lbnQgc2VhcmNoZWRFbGVtZW50KSB7CkBAIC03NjksNyArMTA3Myw3IEBACiAJCQljaGFyW10gZnVsbE5hbWUgPSBudWxsOwogCQkJdGhpcy5hbm9ueW1vdXNDbGFzc05hbWUgPSAwOwogCQkJdHJ5IHsKLQkJCQlJQmluYXJ5VHlwZSBiaW5UeXBlID0gKElCaW5hcnlUeXBlKSBmVHlwZS5nZXRSYXdJbmZvKCk7CisJCQkJSUJpbmFyeVR5cGUgYmluVHlwZSA9IChJQmluYXJ5VHlwZSkgZlR5cGUuZ2V0RWxlbWVudEluZm8oKTsKIAkJCQlpc0Fub255bW91c0NsYXNzID0gYmluVHlwZS5pc0Fub255bW91cygpOwogCQkJCWZ1bGxOYW1lID0gYmluVHlwZS5nZXROYW1lKCk7CiAJCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CkBAIC03ODMsNyArMTA4Nyw3IEBACiAJCQkJfQogCQkJfQogCQkJYm9vbGVhbiBkb0Z1bGxQYXJzZSA9IGhhc1RvUmV0cmlldmVTb3VyY2VSYW5nZXNGb3JMb2NhbENsYXNzKGZ1bGxOYW1lKTsKLQkJCXBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHRoaXMsIGZhY3RvcnksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSwgZG9GdWxsUGFyc2UpOworCQkJcGFyc2VyID0gbmV3IFNvdXJjZUVsZW1lbnRQYXJzZXIodGhpcywgZmFjdG9yeSwgbmV3IENvbXBpbGVyT3B0aW9ucyh0aGlzLm9wdGlvbnMpLCBkb0Z1bGxQYXJzZSk7CiAJCQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoCiAJCQkJbmV3IEJhc2ljQ29tcGlsYXRpb25Vbml0KGNvbnRlbnRzLCBudWxsLCB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyAiLmphdmEiLCBlbmNvZGluZyksIC8vJE5PTi1OTFMtMSQKIAkJCQlkb0Z1bGxQYXJzZSk7CkBAIC04MDUsNiArMTEwOSwxNiBAQAogCQkJdGhpcy50eXBlRGVwdGggPSAtMTsKIAkJfQogCX0KKwlwcml2YXRlIGNoYXJbXSByZWFkU291cmNlKFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIHppcCkgeworCQl0cnkgeworCQkJYnl0ZVtdIGJ5dGVzID0gVXRpbC5nZXRaaXBFbnRyeUJ5dGVDb250ZW50KGVudHJ5LCB6aXApOworCQkJaWYgKGJ5dGVzICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gVXRpbC5ieXRlc1RvQ2hhcihieXRlcywgdGhpcy5lbmNvZGluZyk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CQogCQogCS8qKiAKIAkgKiBTZXRzIHRoZSBtYXBwaW5nIGZvciB0aGlzIG1ldGhvZCB0byBpdHMgcGFyYW1ldGVyIG5hbWVzLgpAQCAtODE1LDcgKzExMjksNyBAQAogCQlJTWV0aG9kIG1ldGhvZCwKIAkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMpIHsKIAkJaWYgKHBhcmFtZXRlck5hbWVzID09IG51bGwpIHsKLQkJCXBhcmFtZXRlck5hbWVzID0gbmV3IGNoYXJbMF1bXTsKKwkJCXBhcmFtZXRlck5hbWVzID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJCX0KIAkJZlBhcmFtZXRlck5hbWVzLnB1dChtZXRob2QsIHBhcmFtZXRlck5hbWVzKTsKIAl9CkBAIC04ODksNCArMTIwMyw0IEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQppbmRleCAzNzQ1YWZhLi44ZDYwYjQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2QuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlTWV0aG9kRWxlbWVudEluZm8uamF2YQppbmRleCA3YzYzZjk2Li5jMmY1NWIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VNZXRob2RFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZU1ldGhvZEVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSYW5nZS5qYXZhCmluZGV4IDNjMWIwN2IuLjRiOGJjYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJhbmdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmFuZ2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudC5qYXZhCmluZGV4IDQ0ZjE2MjUuLjY3YjhjZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKQEAgLTY4LDYgKzY4LDcgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KIHB1YmxpYyBJUmVzb3VyY2UgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFleGlzdHMoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwogCXJldHVybiBudWxsOwogfQogLyoqCkBAIC0xMjQsNiArMTI1LDcgQEAKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KIHB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFleGlzdHMoKSkgdGhyb3cgbmV3Tm90UHJlc2VudEV4Y2VwdGlvbigpOwogCXJldHVybiBnZXRQYXJlbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKIH0KIC8qKgpAQCAtMTQ2LDQ2ICsxNDgsNiBAQAogCWdldEphdmFNb2RlbCgpLm1vdmUoZWxlbWVudHMsIGNvbnRhaW5lcnMsIHNpYmxpbmdzLCByZW5hbWluZ3MsIGZvcmNlLCBtb25pdG9yKTsKIH0KIC8qKgotICogQ2hhbmdlcyB0aGUgc291cmNlIGVuZCBpbmRleCBvZiB0aGlzIGVsZW1lbnQsIGFsbCBjaGlsZHJlbiAoZm9sbG93aW5nCi0gKiA8Y29kZT5jaGlsZDwvY29kZT4pLCBhbmQgYWxsIGZvbGxvd2luZyBlbGVtZW50cy4KLSAqLwotcHVibGljIHZvaWQgb2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oaW50IGFtb3VudCwgSUphdmFFbGVtZW50IGNoaWxkKSB7Ci0JdHJ5IHsKLQkJU291cmNlUmVmRWxlbWVudEluZm8gaW5mbyA9IChTb3VyY2VSZWZFbGVtZW50SW5mbykgZ2V0UmF3SW5mbygpOwotCQlpbmZvLnNldFNvdXJjZVJhbmdlRW5kKGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSArIGFtb3VudCk7Ci0JCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJYm9vbGVhbiBhZnRlckNoaWxkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWlmIChhZnRlckNoaWxkKSB7Ci0JCQkJKChKYXZhRWxlbWVudCkgYUNoaWxkKS5vZmZzZXRTb3VyY2VSYW5nZShhbW91bnQpOwotCQkJfSBlbHNlIHsKLQkJCQlhZnRlckNoaWxkID0gYUNoaWxkLmVxdWFscyhjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJKChKYXZhRWxlbWVudCkgZ2V0UGFyZW50KCkpLm9mZnNldFNvdXJjZUVuZEFuZENoaWxkcmVuKGFtb3VudCwgdGhpcyk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQlyZXR1cm47Ci0JfQotfQotLyoqCi0gKiBDaGFuZ2VzIHRoZSBzb3VyY2UgaW5kZXhlcyBvZiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBjaGlsZHJlbiBlbGVtZW50cy4KLSAqLwotcHVibGljIHZvaWQgb2Zmc2V0U291cmNlUmFuZ2UoaW50IGFtb3VudCkgewotCXRyeSB7Ci0JCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlUmVmRWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKLQkJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpICsgYW1vdW50KTsKLQkJaW5mby5zZXRTb3VyY2VSYW5nZUVuZChpbmZvLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgKyBhbW91bnQpOwotCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBhQ2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCSgoSmF2YUVsZW1lbnQpIGFDaGlsZCkub2Zmc2V0U291cmNlUmFuZ2UoYW1vdW50KTsKLQkJfQotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJcmV0dXJuOwotCX0KLX0KLS8qKgogICogQHNlZSBJU291cmNlTWFuaXB1bGF0aW9uCiAgKi8KIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTIwNCwyOSArMTY2LDQgQEAKIAkvLyBub3QgbmVlZGVkCiAJcmV0dXJuIG51bGw7CiB9Ci0vKioKLSAqIFVwZGF0ZXMgdGhlIGVuZCBzb3VyY2UgaW5kZXggZm9yIHRoaXMgZWxlbWVudCwgYW5kIGFsbCBmb2xsb3dpbmcgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VFbmRPZmZzZXQoaW50IGFtb3VudCwgaW50IG5hbWVTdGFydCwgaW50IG5hbWVFbmQpIHsKLQl0cnkgewotCQlTb3VyY2VSZWZFbGVtZW50SW5mbyBpbmZvID0gKFNvdXJjZVJlZkVsZW1lbnRJbmZvKSBnZXRSYXdJbmZvKCk7Ci0JCWluZm8uc2V0U291cmNlUmFuZ2VFbmQoaW5mby5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpICsgYW1vdW50KTsKLQkJKChKYXZhRWxlbWVudCkgZ2V0UGFyZW50KCkpLm9mZnNldFNvdXJjZUVuZEFuZENoaWxkcmVuKGFtb3VudCwgdGhpcyk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQlyZXR1cm47Ci0JfQotfQotLyoqCi0gKiBVcGRhdGVzIHRoZSBzb3VyY2UgaW5kZXhlcyBvZiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBmb2xsb3dpbmcgZWxlbWVudHMuCi0gKi8KLXB1YmxpYyB2b2lkIHRyaWdnZXJTb3VyY2VSYW5nZU9mZnNldChpbnQgYW1vdW50LCBpbnQgbmFtZVN0YXJ0LCBpbnQgbmFtZUVuZCkgewotCXRyeSB7Ci0JCVNvdXJjZVJlZkVsZW1lbnRJbmZvIGluZm8gPSAoU291cmNlUmVmRWxlbWVudEluZm8pIGdldFJhd0luZm8oKTsKLQkJaW5mby5zZXRTb3VyY2VSYW5nZVN0YXJ0KGluZm8uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpICsgYW1vdW50KTsKLQkJaW5mby5zZXRTb3VyY2VSYW5nZUVuZChpbmZvLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgKyBhbW91bnQpOwotCQkoKEphdmFFbGVtZW50KSBnZXRQYXJlbnQoKSkub2Zmc2V0U291cmNlRW5kQW5kQ2hpbGRyZW4oYW1vdW50LCB0aGlzKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCXJldHVybjsKLQl9Ci19CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlUmVmRWxlbWVudEluZm8uamF2YQppbmRleCA4NDY4OWNjLi43OWYxZmM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VSZWZFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVJlZkVsZW1lbnRJbmZvLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGUuamF2YQppbmRleCA2N2JmMGViLi45MmRlYmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvU291cmNlVHlwZS5qYXZhCkBAIC0xLDMxICsxLDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGxldGlvblJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwpAQCAtMzQsNyArMjQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHkuVHlwZUhpZXJhcmNoeTsKIAogLyoqCiAgKiBIYW5kbGUgZm9yIGEgc291cmNlIHR5cGUuIEluZm8gb2JqZWN0IGlzIGEgU291cmNlVHlwZUVsZW1lbnRJbmZvLgpAQCAtNjEsMTMgKzUxLDE0IEBACiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oVXRpbC5iaW5kKCJjb2RlQXNzaXN0Lm51bGxSZXF1ZXN0b3IiKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCi0JU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgKChKYXZhUHJvamVjdCkgZ2V0SmF2YVByb2plY3QoKSkuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOwotCU5hbWVMb29rdXAgbmFtZUxvb2t1cCA9ICgoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCkpLmdldE5hbWVMb29rdXAoKTsKLQlDb21wbGV0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb21wbGV0aW9uRW5naW5lKGVudmlyb25tZW50LCBuZXcgQ29tcGxldGlvblJlcXVlc3RvcldyYXBwZXIocmVxdWVzdG9yLG5hbWVMb29rdXApLCBKYXZhQ29yZS5nZXRPcHRpb25zKCkpOworCUphdmFQcm9qZWN0IHByb2plY3QgPSAoSmF2YVByb2plY3QpIGdldEphdmFQcm9qZWN0KCk7CisJU2VhcmNoYWJsZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKFNlYXJjaGFibGVFbnZpcm9ubWVudCkgcHJvamVjdC5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJTmFtZUxvb2t1cCBuYW1lTG9va3VwID0gcHJvamVjdC5nZXROYW1lTG9va3VwKCk7CisJQ29tcGxldGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29tcGxldGlvbkVuZ2luZShlbnZpcm9ubWVudCwgbmV3IENvbXBsZXRpb25SZXF1ZXN0b3JXcmFwcGVyKHJlcXVlc3RvcixuYW1lTG9va3VwKSwgcHJvamVjdC5nZXRPcHRpb25zKHRydWUpLCBwcm9qZWN0KTsKIAkKIAlTdHJpbmcgc291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0U291cmNlKCk7CiAJaWYgKHNvdXJjZSAhPSBudWxsICYmIGluc2VydGlvbiA+IC0xICYmIGluc2VydGlvbiA8IHNvdXJjZS5sZW5ndGgoKSkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7CisJCVN0cmluZyBlbmNvZGluZyA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCQkKIAkJY2hhcltdIHByZWZpeCA9IENoYXJPcGVyYXRpb24uY29uY2F0KHNvdXJjZS5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uKS50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdeyd7J30pOwogCQljaGFyW10gc3VmZml4ID0gQ2hhck9wZXJhdGlvbi5jb25jYXQobmV3IGNoYXJbXXsnfSd9LCBzb3VyY2Uuc3Vic3RyaW5nKGluc2VydGlvbikudG9DaGFyQXJyYXkoKSk7CkBAIC0zMzQsOSArMzI1LDE0IEBACiAgKiBAc2VlIElUeXBlI2lzTWVtYmVyKCkKICAqLwogcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlyZXR1cm4gZ2V0RGVjbGFyaW5nVHlwZSgpID09IG51bGw7CisJcmV0dXJuIGdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsOwogfQotCisvKioKKyAqIEBzZWUgSVR5cGUKKyAqLworcHVibGljIElUeXBlSGllcmFyY2h5IGxvYWRUeXBlSGllcmFjaHkoSW5wdXRTdHJlYW0gaW5wdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcmV0dXJuIFR5cGVIaWVyYXJjaHkubG9hZCh0aGlzLCBpbnB1dCk7Cit9CiAvKioKICAqIEBzZWUgSVR5cGUKICAqLwpAQCAtMzg1LDggKzM4MSw4IEBACiAJCiAJQ3JlYXRlVHlwZUhpZXJhcmNoeU9wZXJhdGlvbiBvcD0gbmV3IENyZWF0ZVR5cGVIaWVyYXJjaHlPcGVyYXRpb24oCiAJCXRoaXMsIAotCQludWxsLCAvLyBubyB3b3JraW5nIGNvcGllcwotCQlTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cHJvamVjdH0pLCAKKwkJKElXb3JraW5nQ29weVtdKW51bGwsIC8vIG5vIHdvcmtpbmcgY29waWVzCisJCXByb2plY3QsCiAJCXRydWUpOwogCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CiAJcmV0dXJuIG9wLmdldFJlc3VsdCgpOwpAQCAtNDI3LDkgKzQyMywxNiBAQAogCX0KIAlUeXBlUmVzb2x2ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgVHlwZVJlc29sdmVSZXF1ZXN0b3IoKTsKIAlTZWxlY3Rpb25FbmdpbmUgZW5naW5lID0gCi0JCW5ldyBTZWxlY3Rpb25FbmdpbmUoZW52aXJvbm1lbnQsIHJlcXVlc3RvciwgSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKKwkJbmV3IFNlbGVjdGlvbkVuZ2luZShlbnZpcm9ubWVudCwgcmVxdWVzdG9yLCB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7CiAJCQotCWVuZ2luZS5zZWxlY3RUeXBlKGluZm8sIHR5cGVOYW1lLnRvQ2hhckFycmF5KCksIGZhbHNlKTsKKyAJSVR5cGVbXSB0b3BMZXZlbFR5cGVzID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlcygpOworIAlpbnQgbGVuZ3RoID0gdG9wTGV2ZWxUeXBlcy5sZW5ndGg7CisgCUlTb3VyY2VUeXBlW10gdG9wTGV2ZWxJbmZvcyA9IG5ldyBJU291cmNlVHlwZVtsZW5ndGhdOworIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXRvcExldmVsSW5mb3NbaV0gPSAoSVNvdXJjZVR5cGUpKChTb3VyY2VUeXBlKXRvcExldmVsVHlwZXNbaV0pLmdldEVsZW1lbnRJbmZvKCk7CisJfQorCQkKKwllbmdpbmUuc2VsZWN0VHlwZShpbmZvLCB0eXBlTmFtZS50b0NoYXJBcnJheSgpLCB0b3BMZXZlbEluZm9zLCBmYWxzZSk7CiAJcmV0dXJuIHJlcXVlc3Rvci5hbnN3ZXJzOwogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Tb3VyY2VUeXBlRWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGVFbGVtZW50SW5mby5qYXZhCmluZGV4IDNkNjMwNjIuLjVmNGUwY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGVFbGVtZW50SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1NvdXJjZVR5cGVFbGVtZW50SW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlQ29udmVydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlQ29udmVydGVyLmphdmEKaW5kZXggMzI1ZmYwZS4uZWQwMjNkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZUNvbnZlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJndW1lbnQ7CkBAIC0zMSw4ICszMiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQ29tcGlsZXJNb2RpZmllcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogQ29udmVydGVyIGZyb20gYSB0eXBlIHRvIGFuIEFTVCB0eXBlIGRlY2xhcmF0aW9uLgpAQCAtNDIsNyArNDEsNyBAQAogCS8qKgogCSAqIENvbnZlcnQgYSB0eXBlIGludG8gYW4gQVNUIHR5cGUgZGVjbGFyYXRpb24gYW5kIHB1dCBpdCBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiBidWlsZFR5cGVEZWNsYXJhdGlvbihJVHlwZSB0eXBlLCBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQsIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0LCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gYnVpbGRUeXBlRGVjbGFyYXRpb24oSVR5cGUgdHlwZSwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0LCBDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQljaGFyW10gcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJCiAJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCA+IDApIHsgCkBAIC0xOTksNyArMTk4LDYgQEAKIAlwcml2YXRlIHN0YXRpYyBUeXBlUmVmZXJlbmNlIGNyZWF0ZVR5cGVSZWZlcmVuY2UoY2hhcltdIHR5cGUsIElUeXBlIGNvbnRleHRUeXBlKSB7CiAJCXRyeSB7CiAJCQlTdHJpbmdbXVtdIHJlc29sdmVkTmFtZSA9IGNvbnRleHRUeXBlLnJlc29sdmVUeXBlKG5ldyBTdHJpbmcodHlwZSkpOwotCQkJY2hhcltdIHN1cGVyQ2xhc3NOYW1lID0gbnVsbDsKIAkJCWlmKHJlc29sdmVkTmFtZSAhPSBudWxsICYmIHJlc29sdmVkTmFtZS5sZW5ndGggPT0gMSkgewogCQkJCXR5cGU9IENoYXJPcGVyYXRpb24uY29uY2F0KHJlc29sdmVkTmFtZVswXVswXS50b0NoYXJBcnJheSgpLCByZXNvbHZlZE5hbWVbMF1bMV0udG9DaGFyQXJyYXkoKSwgJy4nKTsKIAkJCX0KQEAgLTIzNCw3ICsyMzIsNyBAQAogCQkJCXJldHVybiBuZXcgQXJyYXlUeXBlUmVmZXJlbmNlKGlkZW50aWZpZXIsIGRpbSwgMCk7CiAJCQl9CiAJCX0gZWxzZSB7IC8vIHF1YWxpZmllZCB0eXBlIHJlZmVyZW5jZQotCQkJY2hhcltdW10gaWRlbnRpZmllcnMgPQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlLCAwLCBkaW1TdGFydCAtIDEpOworCQkJY2hhcltdW10gaWRlbnRpZmllcnMgPQlDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCB0eXBlLCAwLCBkaW1TdGFydCk7CiAJCQlpZiAoZGltID09IDApIHsKIAkJCQlyZXR1cm4gbmV3IFF1YWxpZmllZFR5cGVSZWZlcmVuY2UoaWRlbnRpZmllcnMsIG5ldyBsb25nW117MH0pOwogCQkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVWZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1R5cGVWZWN0b3IuamF2YQppbmRleCAzNmMwZjI5Li5hMzJiYjhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9UeXBlVmVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVHlwZVZlY3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKQEAgLTE4LDYgKzE4LDkgQEAKIAlwdWJsaWMgaW50IHNpemU7CiAJaW50IG1heFNpemU7CiAJSVR5cGVbXSBlbGVtZW50czsKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIElUeXBlW10gTm9FbGVtZW50cyA9IG5ldyBJVHlwZVswXTsKKwkKIHB1YmxpYyBUeXBlVmVjdG9yKCkgewogCW1heFNpemUgPSBJTklUSUFMX1NJWkU7CiAJc2l6ZSA9IDA7CkBAIC02Niw2ICs2OSwxMCBAQAogCXJldHVybiBlbGVtZW50c1tpbmRleF07CiB9CiBwdWJsaWMgSVR5cGVbXSBlbGVtZW50cygpIHsKKwkKKwkvLyBkbyBub3QgcmVzaXplIHRvIDAgaWYgZW1wdHkgc2luY2UgbWF5IGFkZCBtb3JlIGVsZW1lbnRzIGxhdGVyCisJaWYgKHRoaXMuc2l6ZSA9PSAwKSByZXR1cm4gTm9FbGVtZW50czsKKwkKIAlpZiAodGhpcy5zaXplIDwgdGhpcy5tYXhTaXplKSB7CiAJCW1heFNpemUgPSBzaXplOwogCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsICh0aGlzLmVsZW1lbnRzID0gbmV3IElUeXBlW21heFNpemVdKSwgMCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9VdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9VdGlsLmphdmEKaW5kZXggNjgwM2JmMy4uMmZhNTliYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1V0aWwuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwpAQCAtMTksMTYgKzE5LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLkNoYXJBcnJheUJ1ZmZlcjsKIAogLyoqCkBAIC01Nyw2ICs1OSwxMCBAQAogCQlpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpOwogCX0KIAkKKwlwdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlIHsKKwkJU3RyaW5nIGRpc3BsYXlTdHJpbmcoT2JqZWN0IG8pOworCX0KKwkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZnRW1wdHlTdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbMF07CiAKIAkvKioKQEAgLTcyLDEyICs3OCw5MiBAQAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9DTEFTUyA9ICIuQ0xBU1MiLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXJbXSBTVUZGSVhfamF2YSA9ICIuamF2YSIudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhcltdIFNVRkZJWF9KQVZBID0gIi5KQVZBIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX2phciA9ICIuamFyIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX0pBUiA9ICIuSkFSIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX3ppcCA9ICIuemlwIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyW10gU1VGRklYX1pJUCA9ICIuWklQIi50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCiAKIAlzdGF0aWMgewogCQlTdHJpbmcgdmVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAogCQlKREsxXzEgPSAoKHZlciAhPSBudWxsKSAmJiB2ZXIuc3RhcnRzV2l0aCgiMS4xIikpOyAvLyROT04tTkxTLTEkCiAJCXJlbG9jYWxpemUoKTsKIAl9CQorCQorCS8qKgorCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIGJpbmQoaWQsIChTdHJpbmdbXSludWxsKTsKKwl9CisJCisJLyoqCisJICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKKwkgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZ1tdIGJpbmRpbmdzKSB7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuICJObyBtZXNzYWdlIGF2YWlsYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworCQl0cnkgeworCQkJbWVzc2FnZSA9IGJ1bmRsZS5nZXRTdHJpbmcoaWQpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJLy8gSWYgd2UgZ290IGFuIGV4Y2VwdGlvbiBsb29raW5nIGZvciB0aGUgbWVzc2FnZSwgZmFpbCBncmFjZWZ1bGx5IGJ5IGp1c3QgcmV0dXJuaW5nCisJCQkvLyB0aGUgaWQgd2Ugd2VyZSBsb29raW5nIGZvci4gIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBzZW1pLWluZm9ybWF0aXZlIHNvIGlzIG5vdCB0b28gYmFkLgorCQkJcmV0dXJuICJNaXNzaW5nIG1lc3NhZ2U6ICIgKyBpZCArICIgaW46ICIgKyBidW5kbGVOYW1lOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKKwkJfQorCQkvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1lc3NhZ2VGb3JtYXQgd2hpY2ggZWxpbWluYXRlcyBkb3VibGUgcXVvdGVzIGluIG9yaWdpbmFsIG1lc3NhZ2UKKwkJY2hhcltdIG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMgPQorCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWVzc2FnZS50b0NoYXJBcnJheSgpLCBET1VCTEVfUVVPVEVTLCBTSU5HTEVfUVVPVEUpOworCQltZXNzYWdlID0gbmV3IFN0cmluZyhtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzKTsKKwkKKwkJaWYgKGJpbmRpbmdzID09IG51bGwpCisJCQlyZXR1cm4gbWVzc2FnZTsKKwkKKwkJaW50IGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoKCk7CisJCWludCBzdGFydCA9IC0xOworCQlpbnQgZW5kID0gbGVuZ3RoOworCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7CisJCXdoaWxlICh0cnVlKSB7CisJCQlpZiAoKGVuZCA9IG1lc3NhZ2UuaW5kZXhPZigneycsIHN0YXJ0KSkgPiAtMSkgeworCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKKwkJCQlpZiAoKHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKCd9JywgZW5kKSkgPiAtMSkgeworCQkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChtZXNzYWdlLnN1YnN0cmluZyhlbmQgKyAxLCBzdGFydCkpOworCQkJCQkJb3V0cHV0LmFwcGVuZChiaW5kaW5nc1tpbmRleF0pOworCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisJCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0ICsgMSkpOworCQkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpICsgIn0iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJb3V0cHV0LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhzdGFydCArIDEsIGxlbmd0aCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cworCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmcgYmluZGluZykgeworCQlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHtiaW5kaW5nfSk7CisJfQorCQorCS8qKgorCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCisJICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmdzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmcgYmluZGluZzEsIFN0cmluZyBiaW5kaW5nMikgeworCQlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHtiaW5kaW5nMSwgYmluZGluZzJ9KTsKKwl9CisKIAkvKioKIAkgKiBDaGVja3MgdGhlIHR5cGUgc2lnbmF0dXJlIGluIFN0cmluZyBzaWcsIAogCSAqIHN0YXJ0aW5nIGF0IHN0YXJ0IGFuZCBlbmRpbmcgYmVmb3JlIGVuZCAoZW5kIGlzIG5vdCBpbmNsdWRlZCkuCkBAIC0xMjAsNjAgKzIwNiw2NCBAQAogCQl9CiAJCXJldHVybiBpOwogCX0KLS8qKgotICogQ29tYmluZXMgdHdvIGhhc2ggY29kZXMgdG8gbWFrZSBhIG5ldyBvbmUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGNvbWJpbmVIYXNoQ29kZXMoaW50IGhhc2hDb2RlMSwgaW50IGhhc2hDb2RlMikgewotCXJldHVybiBoYXNoQ29kZTEgKiAxNyArIGhhc2hDb2RlMjsKLX0KLS8qKgotICogQ29tcGFyZXMgdHdvIGJ5dGUgYXJyYXlzLiAgCi0gKiBSZXR1cm5zIDwwIGlmIGEgYnl0ZSBpbiBhIGlzIGxlc3MgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIGIsIG9yIGlmIGEgaXMgc2hvcnRlciwgb3IgaWYgYSBpcyBudWxsLgotICogUmV0dXJucyA+MCBpZiBhIGJ5dGUgaW4gYSBpcyBncmVhdGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiBiLCBvciBpZiBhIGlzIGxvbmdlciwgb3IgaWYgYiBpcyBudWxsLgotICogUmV0dXJucyAwIGlmIHRoZXkgYXJlIGVxdWFsIG9yIGJvdGggbnVsbC4KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShieXRlW10gYSwgYnl0ZVtdIGIpIHsKLQlpZiAoYSA9PSBiKQotCQlyZXR1cm4gMDsKLQlpZiAoYSA9PSBudWxsKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGIgPT0gbnVsbCkKLQkJcmV0dXJuIDE7Ci0JaW50IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQlpbnQgZGlmZiA9IGFbaV0gLSBiW2ldOwotCQlpZiAoZGlmZiAhPSAwKQotCQkJcmV0dXJuIGRpZmY7CisJCisJLyoqCisJICogQ29tYmluZXMgdHdvIGhhc2ggY29kZXMgdG8gbWFrZSBhIG5ldyBvbmUuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgY29tYmluZUhhc2hDb2RlcyhpbnQgaGFzaENvZGUxLCBpbnQgaGFzaENvZGUyKSB7CisJCXJldHVybiBoYXNoQ29kZTEgKiAxNyArIGhhc2hDb2RlMjsKIAl9Ci0JaWYgKGEubGVuZ3RoID4gbGVuKQotCQlyZXR1cm4gMTsKLQlpZiAoYi5sZW5ndGggPiBsZW4pCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKLX0KLS8qKgotICogQ29tcGFyZXMgdHdvIGNoYXIgYXJyYXlzIGxleGljb2dyYXBoaWNhbGx5LiAKLSAqIFRoZSBjb21wYXJpc29uIGlzIGJhc2VkIG9uIHRoZSBVbmljb2RlIHZhbHVlIG9mIGVhY2ggY2hhcmFjdGVyIGluCi0gKiB0aGUgY2hhciBhcnJheXMuIAotICogQHJldHVybiAgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIGEgaXMgZXF1YWwgdG8KLSAqICAgICAgICAgIGI7IGEgdmFsdWUgbGVzcyB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIGEKLSAqICAgICAgICAgIGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBiOyBhbmQgYQotICogICAgICAgICAgdmFsdWUgZ3JlYXRlciB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIGEgaXMKLSAqICAgICAgICAgIGxleGljb2dyYXBoaWNhbGx5IGdyZWF0ZXIgdGhhbiBiLgotICovCi1wdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGNoYXJbXSB2MSwgY2hhcltdIHYyKSB7Ci0JaW50IGxlbjEgPSB2MS5sZW5ndGg7Ci0JaW50IGxlbjIgPSB2Mi5sZW5ndGg7Ci0JaW50IG4gPSBNYXRoLm1pbihsZW4xLCBsZW4yKTsKLQlpbnQgaSA9IDA7Ci0Jd2hpbGUgKG4tLSAhPSAwKSB7Ci0JCWlmICh2MVtpXSAhPSB2MltpXSkgewotCQkJcmV0dXJuIHYxW2ldIC0gdjJbaV07CisJCisJLyoqCisJICogQ29tcGFyZXMgdHdvIGJ5dGUgYXJyYXlzLiAgCisJICogUmV0dXJucyA8MCBpZiBhIGJ5dGUgaW4gYSBpcyBsZXNzIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBpbiBiLCBvciBpZiBhIGlzIHNob3J0ZXIsIG9yIGlmIGEgaXMgbnVsbC4KKwkgKiBSZXR1cm5zID4wIGlmIGEgYnl0ZSBpbiBhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBieXRlIGluIGIsIG9yIGlmIGEgaXMgbG9uZ2VyLCBvciBpZiBiIGlzIG51bGwuCisJICogUmV0dXJucyAwIGlmIHRoZXkgYXJlIGVxdWFsIG9yIGJvdGggbnVsbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGJ5dGVbXSBhLCBieXRlW10gYikgeworCQlpZiAoYSA9PSBiKQorCQkJcmV0dXJuIDA7CisJCWlmIChhID09IG51bGwpCisJCQlyZXR1cm4gLTE7CisJCWlmIChiID09IG51bGwpCisJCQlyZXR1cm4gMTsKKwkJaW50IGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJCWludCBkaWZmID0gYVtpXSAtIGJbaV07CisJCQlpZiAoZGlmZiAhPSAwKQorCQkJCXJldHVybiBkaWZmOwogCQl9Ci0JCSsraTsKKwkJaWYgKGEubGVuZ3RoID4gbGVuKQorCQkJcmV0dXJuIDE7CisJCWlmIChiLmxlbmd0aCA+IGxlbikKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiBsZW4xIC0gbGVuMjsKLX0KKworCS8qKgorCSAqIENvbXBhcmVzIHR3byBjaGFyIGFycmF5cyBsZXhpY29ncmFwaGljYWxseS4gCisJICogVGhlIGNvbXBhcmlzb24gaXMgYmFzZWQgb24gdGhlIFVuaWNvZGUgdmFsdWUgb2YgZWFjaCBjaGFyYWN0ZXIgaW4KKwkgKiB0aGUgY2hhciBhcnJheXMuIAorCSAqIEByZXR1cm4gIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiBhIGlzIGVxdWFsIHRvCisJICogICAgICAgICAgYjsgYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgYQorCSAqICAgICAgICAgIGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBiOyBhbmQgYQorCSAqICAgICAgICAgIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiBhIGlzCisJICogICAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIGIuCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShjaGFyW10gdjEsIGNoYXJbXSB2MikgeworCQlpbnQgbGVuMSA9IHYxLmxlbmd0aDsKKwkJaW50IGxlbjIgPSB2Mi5sZW5ndGg7CisJCWludCBuID0gTWF0aC5taW4obGVuMSwgbGVuMik7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKG4tLSAhPSAwKSB7CisJCQlpZiAodjFbaV0gIT0gdjJbaV0pIHsKKwkJCQlyZXR1cm4gdjFbaV0gLSB2MltpXTsKKwkJCX0KKwkJCSsraTsKKwkJfQorCQlyZXR1cm4gbGVuMSAtIGxlbjI7CisJfQorCiAJLyoqCiAJICogQ29uY2F0ZW5hdGUgdHdvIHN0cmluZ3Mgd2l0aCBhIGNoYXIgaW4gYmV0d2Vlbi4KIAkgKiBAc2VlICNjb25jYXQoU3RyaW5nLCBTdHJpbmcpCkBAIC0xODksNiArMjc5LDcgQEAKIAkJczIuZ2V0Q2hhcnMoMCwgbDIsIGJ1ZiwgbDEgKyAxKTsKIAkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKIAl9CisJCiAJLyoqCiAJICogQ29uY2F0ZW5hdGUgdHdvIHN0cmluZ3MuCiAJICogTXVjaCBmYXN0ZXIgdGhhbiB1c2luZyArLCB3aGljaDoKQEAgLTIyNyw4MDUgKzMxOCwxMyBAQAogCQlzMy5nZXRDaGFycygwLCBsMywgYnVmLCBsMSArIGwyKTsKIAkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKIAl9Ci0vKioKLSAqIENvbnZlcnRzIGEgdHlwZSBzaWduYXR1cmUgZnJvbSB0aGUgSUJpbmFyeVR5cGUgcmVwcmVzZW50YXRpb24gdG8gdGhlIERDIHJlcHJlc2VudGF0aW9uLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZShjaGFyW10gc2lnKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcoc2lnKS5yZXBsYWNlKCcvJywgJy4nKTsKLX0KLS8qKgotICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCi0gKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCi0gKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbC4KLSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KLSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAotICogYWxsIGVsZW1lbnRzIGFyZSBlcXVhbC4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsQXJyYXlzT3JOdWxsKGludFtdIGEsIGludFtdIGIpIHsKLQlpZiAoYSA9PSBiKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKLQkJcmV0dXJuIGZhbHNlOwotCWludCBsZW4gPSBhLmxlbmd0aDsKLQlpZiAobGVuICE9IGIubGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQlpZiAoYVtpXSAhPSBiW2ldKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gYXJyYXlzIHVzaW5nIGVxdWFscygpIG9uIHRoZSBlbGVtZW50cy4KLQkgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIG51bGwuCi0JICogUmV0dXJucyBmYWxzZSBpZiBvbmx5IG9uZSBpcyBudWxsLgotCSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAotCSAqIGFsbCBlbGVtZW50cyBjb21wYXJlIHRydWUgd2l0aCBlcXVhbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsQXJyYXlzT3JOdWxsKE9iamVjdFtdIGEsIE9iamVjdFtdIGIpIHsKLQkJaWYgKGEgPT0gYikJcmV0dXJuIHRydWU7Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxlbiA9IGEubGVuZ3RoOwotCQlpZiAobGVuICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJCWlmIChhW2ldID09IG51bGwpIHsKLQkJCQlpZiAoYltpXSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghYVtpXS5lcXVhbHMoYltpXSkpIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQ29tcGFyZXMgdHdvIFN0cmluZyBhcnJheXMgdXNpbmcgZXF1YWxzKCkgb24gdGhlIGVsZW1lbnRzLgotCSAqIFRoZSBhcnJheXMgYXJlIGZpcnN0IHNvcnRlZC4KLQkgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIG51bGwuCi0JICogUmV0dXJucyBmYWxzZSBpZiBvbmx5IG9uZSBpcyBudWxsLgotCSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAotCSAqIGlmZiwgYWZ0ZXIgc29ydGluZyBib3RoIGFycmF5cywgYWxsIGVsZW1lbnRzIGNvbXBhcmUgdHJ1ZSB3aXRoIGVxdWFscy4KLQkgKiBUaGUgb3JpZ2luYWwgYXJyYXlzIGFyZSBsZWZ0IHVudG91Y2hlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxBcnJheXNPck51bGxTb3J0Rmlyc3QoU3RyaW5nW10gYSwgU3RyaW5nW10gYikgewotCQlpZiAoYSA9PSBiKQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJaW50IGxlbiA9IGEubGVuZ3RoOwotCQlpZiAobGVuICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChsZW4gPj0gMikgeyAgLy8gb25seSBuZWVkIHRvIHNvcnQgaWYgbW9yZSB0aGFuIHR3byBpdGVtcwotCQkJYSA9IHNvcnRDb3B5KGEpOwotCQkJYiA9IHNvcnRDb3B5KGIpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJCWlmICghYVtpXS5lcXVhbHMoYltpXSkpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCi0JICogVGhlIGFycmF5cyBhcmUgZmlyc3Qgc29ydGVkLgotCSAqIEVpdGhlciBvciBib3RoIGFycmF5cyBtYXkgYmUgbnVsbC4KLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbC4KLQkgKiBSZXR1cm5zIGZhbHNlIGlmIG9ubHkgb25lIGlzIG51bGwuCi0JICogSWYgYm90aCBhcmUgYXJyYXlzLCByZXR1cm5zIHRydWUgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYW5kCi0JICogaWZmLCBhZnRlciBzb3J0aW5nIGJvdGggYXJyYXlzLCBhbGwgZWxlbWVudHMgY29tcGFyZSB0cnVlIHdpdGggZXF1YWxzLgotCSAqIFRoZSBvcmlnaW5hbCBhcnJheXMgYXJlIGxlZnQgdW50b3VjaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbEFycmF5c09yTnVsbFNvcnRGaXJzdChDb21wYXJhYmxlW10gYSwgQ29tcGFyYWJsZVtdIGIpIHsKLQkJaWYgKGEgPT0gYikJcmV0dXJuIHRydWU7Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCWludCBsZW4gPSBhLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwotCQlpZiAobGVuID49IDIpIHsgIC8vIG9ubHkgbmVlZCB0byBzb3J0IGlmIG1vcmUgdGhhbiB0d28gaXRlbXMKLQkJCWEgPSBzb3J0Q29weShhKTsKLQkJCWIgPSBzb3J0Q29weShiKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCQlpZiAoIWFbaV0uZXF1YWxzKGJbaV0pKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENvbXBhcmVzIHR3byBvYmplY3RzIHVzaW5nIGVxdWFscygpLgotCSAqIEVpdGhlciBvciBib3RoIGFycmF5IG1heSBiZSBudWxsLgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGFyZSBudWxsLgotCSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KLQkgKiBPdGhlcndpc2UsIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB3aXRoIGVxdWFscygpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbE9yTnVsbChPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJaWYgKGEgPT0gYikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYS5lcXVhbHMoYik7Ci0JfQotCS8qKgotCSAqIEdpdmVuIGEgcXVhbGlmaWVkIG5hbWUsIGV4dHJhY3QgdGhlIGxhc3QgY29tcG9uZW50LgotCSAqIElmIHRoZSBpbnB1dCBpcyBub3QgcXVhbGlmaWVkLCB0aGUgc2FtZSBzdHJpbmcgaXMgYW5zd2VyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdExhc3ROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCWludCBpID0gcXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaSA9PSAtMSkgcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpKzEpOwotCX0KLS8qKgotICogRXh0cmFjdHMgdGhlIHBhcmFtZXRlciB0eXBlcyBmcm9tIGEgbWV0aG9kIHNpZ25hdHVyZS4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBleHRyYWN0UGFyYW1ldGVyVHlwZXMoY2hhcltdIHNpZykgewotCWludCBjb3VudCA9IGdldFBhcmFtZXRlckNvdW50KHNpZyk7Ci0JU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JaW50IGkgPSBDaGFyT3BlcmF0aW9uLmluZGV4T2YoJygnLCBzaWcpICsgMTsKLQljb3VudCA9IDA7Ci0JaW50IGxlbiA9IHNpZy5sZW5ndGg7Ci0JaW50IHN0YXJ0ID0gaTsKLQlmb3IgKDs7KSB7Ci0JCWlmIChpID09IGxlbikKLQkJCWJyZWFrOwotCQljaGFyIGMgPSBzaWdbaV07Ci0JCWlmIChjID09ICcpJykKLQkJCWJyZWFrOwotCQlpZiAoYyA9PSAnWycpIHsKLQkJCSsraTsKLQkJfSBlbHNlCi0JCQlpZiAoYyA9PSAnTCcpIHsKLQkJCQlpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnLCBpICsgMSkgKyAxOwotCQkJCUFzc2VydC5pc1RydWUoaSAhPSAwKTsKLQkJCQlyZXN1bHRbY291bnQrK10gPSBjb252ZXJ0VHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZywgc3RhcnQsIGkpKTsKLQkJCQlzdGFydCA9IGk7Ci0JCQl9IGVsc2UgewotCQkJCSsraTsKLQkJCQlyZXN1bHRbY291bnQrK10gPSBjb252ZXJ0VHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZywgc3RhcnQsIGkpKTsKLQkJCQlzdGFydCA9IGk7Ci0JCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHJldHVybiB0eXBlIGZyb20gYSBtZXRob2Qgc2lnbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RSZXR1cm5UeXBlKFN0cmluZyBzaWcpIHsKLQkJaW50IGkgPSBzaWcubGFzdEluZGV4T2YoJyknKTsKLQkJQXNzZXJ0LmlzVHJ1ZShpICE9IC0xKTsKLQkJcmV0dXJuIHNpZy5zdWJzdHJpbmcoaSsxKTsJCi0JfQotLyoqCi0gKiBGaW5kcyB0aGUgZmlyc3QgbGluZSBzZXBhcmF0b3IgdXNlZCBieSB0aGUgZ2l2ZW4gdGV4dC4KLSAqCi0gKiBAcmV0dXJuIDwvY29kZT4iXG4iPC9jb2RlPiBvciA8L2NvZGU+IlxyIjwvY29kZT4gb3IgIDwvY29kZT4iXHJcbiI8L2NvZGU+LAotICoJCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGZvdW5kCi0gKi8KLXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kTGluZVNlcGFyYXRvcihjaGFyW10gdGV4dCkgewotCS8vIGZpbmQgdGhlIGZpcnN0IGxpbmUgc2VwYXJhdG9yCi0JaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOwotCWlmIChsZW5ndGggPiAwKSB7Ci0JCWNoYXIgbmV4dENoYXIgPSB0ZXh0WzBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGN1cnJlbnRDaGFyID0gbmV4dENoYXI7Ci0JCQluZXh0Q2hhciA9IGkgPCBsZW5ndGgtMSA/IHRleHRbaSsxXSA6ICcgJzsKLQkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKLQkJCQljYXNlICdcbic6IHJldHVybiAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSAnXHInOiByZXR1cm4gbmV4dENoYXIgPT0gJ1xuJyA/ICJcclxuIiA6ICJcciI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCS8vIG5vdCBmb3VuZAotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsaW5lIHNlcGFyYXRvciB1c2VkIGJ5IHRoZSBnaXZlbiBidWZmZXIuCi0gKiBVc2VzIHRoZSBnaXZlbiB0ZXh0IGlmIG5vbmUgZm91bmQuCi0gKgotICogQHJldHVybiA8L2NvZGU+IlxuIjwvY29kZT4gb3IgPC9jb2RlPiJcciI8L2NvZGU+IG9yICA8L2NvZGU+IlxyXG4iPC9jb2RlPgotICovCi1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGluZVNlcGFyYXRvcihjaGFyW10gdGV4dCwgY2hhcltdIGJ1ZmZlcikgewotCS8vIHNlYXJjaCBpbiB0aGlzIGJ1ZmZlcidzIGNvbnRlbnRzIGZpcnN0Ci0JU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBmaW5kTGluZVNlcGFyYXRvcihidWZmZXIpOwotCWlmIChsaW5lU2VwYXJhdG9yID09IG51bGwpIHsKLQkJLy8gc2VhcmNoIGluIHRoZSBnaXZlbiB0ZXh0Ci0JCWxpbmVTZXBhcmF0b3IgPSBmaW5kTGluZVNlcGFyYXRvcih0ZXh0KTsKLQkJaWYgKGxpbmVTZXBhcmF0b3IgPT0gbnVsbCkgewotCQkJLy8gZGVmYXVsdCB0byBzeXN0ZW0gbGluZSBzZXBhcmF0b3IKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLkxJTkVfU0VQQVJBVE9SOwotCQl9Ci0JfQotCXJldHVybiBsaW5lU2VwYXJhdG9yOwotfQotCi0KIAkKLS8qKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciB0eXBlcyBpbiBhIG1ldGhvZCBzaWduYXR1cmUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGdldFBhcmFtZXRlckNvdW50KGNoYXJbXSBzaWcpIHsKLQlpbnQgaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignKCcsIHNpZykgKyAxOwotCUFzc2VydC5pc1RydWUoaSAhPSAwKTsKLQlpbnQgY291bnQgPSAwOwotCWludCBsZW4gPSBzaWcubGVuZ3RoOwotCWZvciAoOzspIHsKLQkJaWYgKGkgPT0gbGVuKQotCQkJYnJlYWs7Ci0JCWNoYXIgYyA9IHNpZ1tpXTsKLQkJaWYgKGMgPT0gJyknKQotCQkJYnJlYWs7Ci0JCWlmIChjID09ICdbJykgewotCQkJKytpOwotCQl9IGVsc2UKLQkJCWlmIChjID09ICdMJykgewotCQkJCSsrY291bnQ7Ci0JCQkJaSA9IENoYXJPcGVyYXRpb24uaW5kZXhPZignOycsIHNpZywgaSArIDEpICsgMTsKLQkJCQlBc3NlcnQuaXNUcnVlKGkgIT0gMCk7Ci0JCQl9IGVsc2UgewotCQkJCSsrY291bnQ7Ci0JCQkJKytpOwotCQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGdpdmVuIGZpbGUncyBjb250ZW50cyBhcyBhIGJ5dGUgYXJyYXkuCi0gKi8KLXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShJRmlsZSBmaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW09IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlsZS5nZXRDb250ZW50cyh0cnVlKSk7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7Ci0JfQotCXRyeSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtLCAtMSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgZ2l2ZW4gZmlsZSdzIGNvbnRlbnRzIGFzIGEgY2hhcmFjdGVyIGFycmF5LgotICovCi1wdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoSUZpbGUgZmlsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpbGUuZ2V0Q29udGVudHModHJ1ZSkpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOwotCX0KLQl0cnkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoc3RyZWFtLCAtMSwgZW5jb2RpbmcpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19CiAJLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIGlzIHZhbGlkLAotCSAqIGZhbHNlIGlmIGl0IGlzIG5vdC4KKwkgKiBDb252ZXJ0cyBhIHR5cGUgc2lnbmF0dXJlIGZyb20gdGhlIElCaW5hcnlUeXBlIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBEQyByZXByZXNlbnRhdGlvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE1ldGhvZFNpZ25hdHVyZShTdHJpbmcgc2lnKSB7Ci0JCWludCBsZW4gPSBzaWcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgcmV0dXJuIGZhbHNlOwotCQlpbnQgaSA9IDA7Ci0JCWNoYXIgYyA9IHNpZy5jaGFyQXQoaSsrKTsKLQkJaWYgKGMgIT0gJygnKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChpID49IGxlbikgcmV0dXJuIGZhbHNlOwotCQl3aGlsZSAoc2lnLmNoYXJBdChpKSAhPSAnKScpIHsKLQkJCS8vIFZvaWQgaXMgbm90IGFsbG93ZWQgYXMgYSBwYXJhbWV0ZXIgdHlwZS4KLQkJCWkgPSBjaGVja1R5cGVTaWduYXR1cmUoc2lnLCBpLCBsZW4sIGZhbHNlKTsKLQkJCWlmIChpID09IC0xKSByZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaSA+PSBsZW4pIHJldHVybiBmYWxzZTsKLQkJfQotCQkrK2k7Ci0JCWkgPSBjaGVja1R5cGVTaWduYXR1cmUoc2lnLCBpLCBsZW4sIHRydWUpOwotCQlyZXR1cm4gaSA9PSBsZW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFR5cGVTaWduYXR1cmUoY2hhcltdIHNpZykgeworCQlyZXR1cm4gbmV3IFN0cmluZyhzaWcpLnJlcGxhY2UoJy8nLCAnLicpOwogCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIGlzIHZhbGlkLAotCSAqIGZhbHNlIGlmIGl0IGlzIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFR5cGVTaWduYXR1cmUoU3RyaW5nIHNpZywgYm9vbGVhbiBhbGxvd1ZvaWQpIHsKLQkJaW50IGxlbiA9IHNpZy5sZW5ndGgoKTsKLQkJcmV0dXJuIGNoZWNrVHlwZVNpZ25hdHVyZShzaWcsIDAsIGxlbiwgYWxsb3dWb2lkKSA9PSBsZW47Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZm9sZGVyIG5hbWUgaXMgdmFsaWQgZm9yIGEgcGFja2FnZSwKLQkgKiBmYWxzZSBpZiBpdCBpcyBub3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShTdHJpbmcgZm9sZGVyTmFtZSkgewotCQlyZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihmb2xkZXJOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQkKLQotCS8qCi0JICogQWRkIGEgbG9nIGVudHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLkVSUk9SLCAKLQkJCUphdmFDb3JlLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIAotCQkJSVN0YXR1cy5FUlJPUiwgCi0JCQltZXNzYWdlLCAKLQkJCWUpOyAKLQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQkKLQkKLS8qKgotICogTm9ybWFsaXplcyB0aGUgY2FyaWFnZSByZXR1cm5zIGluIHRoZSBnaXZlbiB0ZXh0LgotICogVGhleSBhcmUgYWxsIGNoYW5nZWQgIHRvIHVzZSB0aGUgZ2l2ZW4gYnVmZmVyJ3MgbGluZSBzZXBhdGF0b3IuCi0gKi8KLXB1YmxpYyBzdGF0aWMgY2hhcltdIG5vcm1hbGl6ZUNScyhjaGFyW10gdGV4dCwgY2hhcltdIGJ1ZmZlcikgewotCUNoYXJBcnJheUJ1ZmZlciByZXN1bHQgPSBuZXcgQ2hhckFycmF5QnVmZmVyKCk7Ci0JaW50IGxpbmVTdGFydCA9IDA7Ci0JaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOwotCWlmIChsZW5ndGggPT0gMCkgcmV0dXJuIHRleHQ7Ci0JU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBnZXRMaW5lU2VwYXJhdG9yKHRleHQsIGJ1ZmZlcik7Ci0JY2hhciBuZXh0Q2hhciA9IHRleHRbMF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQljaGFyIGN1cnJlbnRDaGFyID0gbmV4dENoYXI7Ci0JCW5leHRDaGFyID0gaSA8IGxlbmd0aC0xID8gdGV4dFtpKzFdIDogJyAnOwotCQlzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7Ci0JCQljYXNlICdcbic6Ci0JCQkJaW50IGxpbmVMZW5ndGggPSBpLWxpbmVTdGFydDsKLQkJCQljaGFyW10gbGluZSA9IG5ldyBjaGFyW2xpbmVMZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGV4dCwgbGluZVN0YXJ0LCBsaW5lLCAwLCBsaW5lTGVuZ3RoKTsKLQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJCXJlc3VsdC5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQkJbGluZVN0YXJ0ID0gaSsxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCWxpbmVMZW5ndGggPSBpLWxpbmVTdGFydDsKLQkJCQlpZiAobGluZUxlbmd0aCA+PSAwKSB7Ci0JCQkJCWxpbmUgPSBuZXcgY2hhcltsaW5lTGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCBsaW5lU3RhcnQsIGxpbmUsIDAsIGxpbmVMZW5ndGgpOwotCQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpOwotCQkJCQlyZXN1bHQuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJCQlpZiAobmV4dENoYXIgPT0gJ1xuJykgewotCQkJCQkJbmV4dENoYXIgPSAnICc7Ci0JCQkJCQlsaW5lU3RhcnQgPSBpKzI7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB3aGVuIGxpbmUgc2VwYXJhdG9yIGFyZSBtaXhlZCBpbiB0aGUgc2FtZSBmaWxlCi0JCQkJCQkvLyBcciBtaWdodCBub3QgYmUgZm9sbG93ZWQgYnkgYSBcbi4gSWYgbm90LCB3ZSBzaG91bGQgaW5jcmVtZW50Ci0JCQkJCQkvLyBsaW5lU3RhcnQgYnkgb25lIGFuZCBub3QgYnkgdHdvLgotCQkJCQkJbGluZVN0YXJ0ID0gaSsxOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gd2hlbiBsaW5lIHNlcGFyYXRvciBhcmUgbWl4ZWQgaW4gdGhlIHNhbWUgZmlsZQotCQkJCQkvLyB3ZSBuZWVkIHRvIHByZXZlbnQgTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24KLQkJCQkJbGluZVN0YXJ0ID0gaSsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCX0KLQljaGFyW10gbGFzdExpbmU7Ci0JaWYgKGxpbmVTdGFydCA+IDApIHsKLQkJaW50IGxhc3RMaW5lTGVuZ3RoID0gbGVuZ3RoLWxpbmVTdGFydDsKLQkJaWYgKGxhc3RMaW5lTGVuZ3RoID4gMCkgewotCQkJbGFzdExpbmUgPSBuZXcgY2hhcltsYXN0TGluZUxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRleHQsIGxpbmVTdGFydCwgbGFzdExpbmUsIDAsIGxhc3RMaW5lTGVuZ3RoKTsKLQkJCXJlc3VsdC5hcHBlbmQobGFzdExpbmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQuZ2V0Q29udGVudHMoKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci19Ci0KLS8qKgotICogTm9ybWFsaXplcyB0aGUgY2FyaWFnZSByZXR1cm5zIGluIHRoZSBnaXZlbiB0ZXh0LgotICogVGhleSBhcmUgYWxsIGNoYW5nZWQgIHRvIHVzZSBnaXZlbiBidWZmZXIncyBsaW5lIHNlcGF0YXRvci4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplQ1JzKFN0cmluZyB0ZXh0LCBTdHJpbmcgYnVmZmVyKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcobm9ybWFsaXplQ1JzKHRleHQudG9DaGFyQXJyYXkoKSwgYnVmZmVyLnRvQ2hhckFycmF5KCkpKTsKLX0KLQotCQotCi0vKioKLSAqIFNvcnQgdGhlIG9iamVjdHMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gdXNpbmcgdGhlIGdpdmVuIHNvcnQgb3JkZXIuCi0gKi8KLXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KE9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludFtdIHNvcnRPcmRlcikgewotCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKLQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKLQlpbnQgbWlkID0gc29ydE9yZGVyWyAobGVmdCArIHJpZ2h0KSAvIDJdOwotCWRvIHsKLQkJd2hpbGUgKHNvcnRPcmRlcltsZWZ0XSA8IG1pZCkgewotCQkJbGVmdCsrOwotCQl9Ci0JCXdoaWxlIChtaWQgPCBzb3J0T3JkZXJbcmlnaHRdKSB7Ci0JCQlyaWdodC0tOwotCQl9Ci0JCWlmIChsZWZ0IDw9IHJpZ2h0KSB7Ci0JCQlPYmplY3QgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOwotCQkJaW50IHRtcDIgPSBzb3J0T3JkZXJbbGVmdF07Ci0JCQlzb3J0T3JkZXJbbGVmdF0gPSBzb3J0T3JkZXJbcmlnaHRdOwotCQkJc29ydE9yZGVyW3JpZ2h0XSA9IHRtcDI7Ci0JCQlsZWZ0Kys7Ci0JCQlyaWdodC0tOwotCQl9Ci0JfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0JaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQsIHNvcnRPcmRlcik7Ci0JfQotCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKLQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0LCBzb3J0T3JkZXIpOwotCX0KLX0KLS8qKgotICogU29ydCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyZXIuCi0gKi8KLXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KE9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQsIENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0JaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OwotCWludCBvcmlnaW5hbF9yaWdodCA9IHJpZ2h0OwotCU9iamVjdCBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyAobGVmdCArIHJpZ2h0KSAvIDJdOwotCWRvIHsKLQkJd2hpbGUgKGNvbXBhcmVyLmNvbXBhcmUoc29ydGVkQ29sbGVjdGlvbltsZWZ0XSwgbWlkKSA8IDApIHsKLQkJCWxlZnQrKzsKLQkJfQotCQl3aGlsZSAoY29tcGFyZXIuY29tcGFyZShtaWQsIHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSA8IDApIHsKLQkJCXJpZ2h0LS07Ci0JCX0KLQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCU9iamVjdCB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7Ci0JCQlsZWZ0Kys7Ci0JCQlyaWdodC0tOwotCQl9Ci0JfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0JaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQsIGNvbXBhcmVyKTsKLQl9Ci0JaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQsIGNvbXBhcmVyKTsKLQl9Ci19Ci0vKioKLSAqIFNvcnQgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCi0gKi8KLXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KFN0cmluZ1tdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQlpbnQgb3JpZ2luYWxfbGVmdCA9IGxlZnQ7Ci0JaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7Ci0JU3RyaW5nIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07Ci0JZG8gewotCQl3aGlsZSAoc29ydGVkQ29sbGVjdGlvbltsZWZ0XS5jb21wYXJlVG8obWlkKSA8IDApIHsKLQkJCWxlZnQrKzsKLQkJfQotCQl3aGlsZSAobWlkLmNvbXBhcmVUbyhzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkgPCAwKSB7Ci0JCQlyaWdodC0tOwotCQl9Ci0JCWlmIChsZWZ0IDw9IHJpZ2h0KSB7Ci0JCQlTdHJpbmcgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOwotCQkJbGVmdCsrOwotCQkJcmlnaHQtLTsKLQkJfQotCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKLQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKLQl9Ci0JaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOwotCX0KLX0KLS8qKgotICogQ29udmVydHMgdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGggaW50byBhIHBhY2thZ2UgbmFtZS4KLSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcGF0aCBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lKElQYXRoIHBrZ1BhdGgpIHsKLQlTdHJpbmdCdWZmZXIgcGtnTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7Ci0JZm9yIChpbnQgaiA9IDAsIG1heCA9IHBrZ1BhdGguc2VnbWVudENvdW50KCk7IGogPCBtYXg7IGorKykgewotCQlTdHJpbmcgc2VnbWVudCA9IHBrZ1BhdGguc2VnbWVudChqKTsKLQkJaWYgKCFpc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2Uoc2VnbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXBrZ05hbWUuYXBwZW5kKHNlZ21lbnQpOwotCQlpZiAoaiA8IHBrZ1BhdGguc2VnbWVudENvdW50KCkgLSAxKSB7Ci0JCQlwa2dOYW1lLmFwcGVuZCgiLiIgKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXJldHVybiBwa2dOYW1lLnRvU3RyaW5nKCk7Ci19Ci0vKioKLSAqIFNvcnQgdGhlIGNvbXBhcmFibGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4KLSAqLwotcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoQ29tcGFyYWJsZVtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQlpbnQgb3JpZ2luYWxfbGVmdCA9IGxlZnQ7Ci0JaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7Ci0JQ29tcGFyYWJsZSBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyAobGVmdCArIHJpZ2h0KSAvIDJdOwotCWRvIHsKLQkJd2hpbGUgKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0uY29tcGFyZVRvKG1pZCkgPCAwKSB7Ci0JCQlsZWZ0Kys7Ci0JCX0KLQkJd2hpbGUgKG1pZC5jb21wYXJlVG8oc29ydGVkQ29sbGVjdGlvbltyaWdodF0pIDwgMCkgewotCQkJcmlnaHQtLTsKLQkJfQotCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJQ29tcGFyYWJsZSB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7Ci0JCQlsZWZ0Kys7Ci0JCQlyaWdodC0tOwotCQl9Ci0JfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0JaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgewotCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOwotCX0KLQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7Ci0JCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7Ci0JfQotfQotLyoqCi0gKiBTb3J0IHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGluIHJldmVyc2UgYWxwaGFiZXRpY2FsIG9yZGVyLgotICovCi1wcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydFJldmVyc2UoU3RyaW5nW10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgewotCWludCBvcmlnaW5hbF9sZWZ0ID0gbGVmdDsKLQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKLQlTdHJpbmcgbWlkID0gc29ydGVkQ29sbGVjdGlvblsgKGxlZnQgKyByaWdodCkgLyAyXTsKLQlkbyB7Ci0JCXdoaWxlIChzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLmNvbXBhcmVUbyhtaWQpID4gMCkgewotCQkJbGVmdCsrOwotCQl9Ci0JCXdoaWxlIChtaWQuY29tcGFyZVRvKHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSA+IDApIHsKLQkJCXJpZ2h0LS07Ci0JCX0KLQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCVN0cmluZyB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOwotCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7Ci0JCQlsZWZ0Kys7Ci0JCQlyaWdodC0tOwotCQl9Ci0JfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0JaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgewotCQlxdWlja1NvcnRSZXZlcnNlKHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKLQl9Ci0JaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgewotCQlxdWlja1NvcnRSZXZlcnNlKHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKLQl9Ci19Ci0vKioKLSAqIFNvcnRzIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gcGxhY2UsIHVzaW5nIHRoZSBzb3J0IG9yZGVyIGdpdmVuIGZvciBlYWNoIGl0ZW0uCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KE9iamVjdFtdIG9iamVjdHMsIGludFtdIHNvcnRPcmRlcikgewotCWlmIChvYmplY3RzLmxlbmd0aCA+IDEpCi0JCXF1aWNrU29ydChvYmplY3RzLCAwLCBvYmplY3RzLmxlbmd0aCAtIDEsIHNvcnRPcmRlcik7Ci19Ci0vKioKLSAqIFNvcnRzIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gcGxhY2UuCi0gKiBUaGUgZ2l2ZW4gY29tcGFyZXIgY29tcGFyZXMgcGFpcnMgb2YgaXRlbXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KE9iamVjdFtdIG9iamVjdHMsIENvbXBhcmVyIGNvbXBhcmVyKSB7Ci0JaWYgKG9iamVjdHMubGVuZ3RoID4gMSkKLQkJcXVpY2tTb3J0KG9iamVjdHMsIDAsIG9iamVjdHMubGVuZ3RoIC0gMSwgY29tcGFyZXIpOwotfQotLyoqCi0gKiBTb3J0cyBhbiBhcnJheSBvZiBzdHJpbmdzIGluIHBsYWNlIHVzaW5nIHF1aWNrc29ydC4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoU3RyaW5nW10gc3RyaW5ncykgewotCWlmIChzdHJpbmdzLmxlbmd0aCA+IDEpCi0JCXF1aWNrU29ydChzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCAtIDEpOwotfQotLyoqCi0gKiBTb3J0cyBhbiBhcnJheSBvZiBDb21wYXJhYmxlIG9iamVjdHMgaW4gcGxhY2UuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KENvbXBhcmFibGVbXSBvYmplY3RzKSB7Ci0JaWYgKG9iamVjdHMubGVuZ3RoID4gMSkKLQkJcXVpY2tTb3J0KG9iamVjdHMsIDAsIG9iamVjdHMubGVuZ3RoIC0gMSk7Ci19Ci0JLyoqCi0JICogU29ydHMgYW4gYXJyYXkgb2YgU3RyaW5ncywgcmV0dXJuaW5nIGEgbmV3IGFycmF5Ci0JICogd2l0aCB0aGUgc29ydGVkIGl0ZW1zLiAgVGhlIG9yaWdpbmFsIGFycmF5IGlzIGxlZnQgdW50b3VjaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gc29ydENvcHkoT2JqZWN0W10gb2JqZWN0cywgQ29tcGFyZXIgY29tcGFyZXIpIHsKLQkJaW50IGxlbiA9IG9iamVjdHMubGVuZ3RoOwotCQlPYmplY3RbXSBjb3B5ID0gbmV3IE9iamVjdFtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdHMsIDAsIGNvcHksIDAsIGxlbik7Ci0JCXNvcnQoY29weSwgY29tcGFyZXIpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0JLyoqCi0JICogU29ydHMgYW4gYXJyYXkgb2YgU3RyaW5ncywgcmV0dXJuaW5nIGEgbmV3IGFycmF5Ci0JICogd2l0aCB0aGUgc29ydGVkIGl0ZW1zLiAgVGhlIG9yaWdpbmFsIGFycmF5IGlzIGxlZnQgdW50b3VjaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc29ydENvcHkoU3RyaW5nW10gb2JqZWN0cykgewotCQlpbnQgbGVuID0gb2JqZWN0cy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGNvcHkgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2JqZWN0cywgMCwgY29weSwgMCwgbGVuKTsKLQkJc29ydChjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCS8qKgotCSAqIFNvcnRzIGFuIGFycmF5IG9mIENvbXBhcmFibGUgb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IGFycmF5Ci0JICogd2l0aCB0aGUgc29ydGVkIGl0ZW1zLiAgVGhlIG9yaWdpbmFsIGFycmF5IGlzIGxlZnQgdW50b3VjaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYWJsZVtdIHNvcnRDb3B5KENvbXBhcmFibGVbXSBvYmplY3RzKSB7Ci0JCWludCBsZW4gPSBvYmplY3RzLmxlbmd0aDsKLQkJQ29tcGFyYWJsZVtdIGNvcHkgPSBuZXcgQ29tcGFyYWJsZVtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdHMsIDAsIGNvcHksIDAsIGxlbik7Ci0JCXNvcnQoY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLS8qKgotICogU29ydHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpbiBwbGFjZSB1c2luZyBxdWlja3NvcnQKLSAqIGluIHJldmVyc2UgYWxwaGFiZXRpY2FsIG9yZGVyLgotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgc29ydFJldmVyc2VPcmRlcihTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JaWYgKHN0cmluZ3MubGVuZ3RoID4gMSkKLQkJcXVpY2tTb3J0UmV2ZXJzZShzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCAtIDEpOwotfQotCS8qKgotCSAqIENvbnZlcnRzIGEgU3RyaW5nW10gdG8gY2hhcltdW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW11bXSB0b0NoYXJBcnJheXMoU3RyaW5nW10gYSkgewotCQlpbnQgbGVuID0gYS5sZW5ndGg7Ci0JCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl1bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQkJcmVzdWx0W2ldID0gdG9DaGFycyhhW2ldKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBjaGFyW10uCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdG9DaGFycyhTdHJpbmcgcykgewotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbbGVuXTsKLQkJcy5nZXRDaGFycygwLCBsZW4sIGNoYXJzLCAwKTsKLQkJcmV0dXJuIGNoYXJzOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBjaGFyW11bXSwgd2hlcmUgc2VnbWVudHMgYXJlIHNlcGFyYXRlIGJ5ICcuJy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXVtdIHRvQ29tcG91bmRDaGFycyhTdHJpbmcgcykgewotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IGNoYXJbMF1bXTsKLQkJfQotCQlpbnQgc2VnQ291bnQgPSAxOwotCQlmb3IgKGludCBvZmYgPSBzLmluZGV4T2YoJy4nKTsgb2ZmICE9IC0xOyBvZmYgPSBzLmluZGV4T2YoJy4nLCBvZmYgKyAxKSkgewotCQkJKytzZWdDb3VudDsKLQkJfQotCQljaGFyW11bXSBzZWdzID0gbmV3IGNoYXJbc2VnQ291bnRdW107Ci0JCWludCBzdGFydCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnQ291bnQ7ICsraSkgewotCQkJaW50IGRvdCA9IHMuaW5kZXhPZignLicsIHN0YXJ0KTsKLQkJCWludCBlbmQgPSAoZG90ID09IC0xID8gcy5sZW5ndGgoKSA6IGRvdCk7Ci0JCQlzZWdzW2ldID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwotCQkJcy5nZXRDaGFycyhzdGFydCwgZW5kLCBzZWdzW2ldLCAwKTsKLQkJCXN0YXJ0ID0gZW5kICsgMTsKLQkJfQotCQlyZXR1cm4gc2VnczsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSBjaGFyW11bXSB0byBTdHJpbmcsIHdoZXJlIHNlZ21lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgJy4nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXVtdIGMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYy5sZW5ndGg7IGkgPCBtYXg7ICsraSkgewotCQkJaWYgKGkgIT0gMCkgc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQoY1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgY2hhcltdW10gYW5kIGEgY2hhcltdIHRvIFN0cmluZywgd2hlcmUgc2VnbWVudHMgYXJlIHNlcGFyYXRlZCBieSAnLicuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoY2hhcltdW10gYywgY2hhcltdIGQpIHsKLQkJaWYgKGMgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmcoZCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGMubGVuZ3RoOyBpIDwgbWF4OyArK2kpIHsKLQkJCXNiLmFwcGVuZChjW2ldKTsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQl9Ci0JCXNiLmFwcGVuZChkKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgY2hhcltdIHRvIFN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhjaGFyW10gYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhjKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBtZXRob2Qgc2lnbmF0dXJlIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgc2lnKSB7Ci0JCUFzc2VydC5pc1RydWUoaXNWYWxpZE1ldGhvZFNpZ25hdHVyZShzaWcpKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZSBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVUeXBlU2lnbmF0dXJlKFN0cmluZyBzaWcsIGJvb2xlYW4gYWxsb3dWb2lkKSB7Ci0JCUFzc2VydC5pc1RydWUoaXNWYWxpZFR5cGVTaWduYXR1cmUoc2lnLCBhbGxvd1ZvaWQpKTsKLQl9Ci0KLS8qKgotICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyAKLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQpIHsKLQlyZXR1cm4gYmluZChpZCwgKFN0cmluZ1tdKW51bGwpOwotfQotCi0vKioKLSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCi0gKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmdbXSBiaW5kaW5ncykgewotCWlmIChpZCA9PSBudWxsKQotCQlyZXR1cm4gIk5vIG1lc3NhZ2UgYXZhaWxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQl0cnkgewotCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhpZCk7Ci0JfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJLy8gSWYgd2UgZ290IGFuIGV4Y2VwdGlvbiBsb29raW5nIGZvciB0aGUgbWVzc2FnZSwgZmFpbCBncmFjZWZ1bGx5IGJ5IGp1c3QgcmV0dXJuaW5nCi0JCS8vIHRoZSBpZCB3ZSB3ZXJlIGxvb2tpbmcgZm9yLiAgSW4gbW9zdCBjYXNlcyB0aGlzIGlzIHNlbWktaW5mb3JtYXRpdmUgc28gaXMgbm90IHRvbyBiYWQuCi0JCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgaWQgKyAiIGluOiAiICsgYnVuZGxlTmFtZTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JfQotCS8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWVzc2FnZUZvcm1hdCB3aGljaCBlbGltaW5hdGVzIGRvdWJsZSBxdW90ZXMgaW4gb3JpZ2luYWwgbWVzc2FnZQotCWNoYXJbXSBtZXNzYWdlV2l0aE5vRG91YmxlUXVvdGVzID0KLQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWVzc2FnZS50b0NoYXJBcnJheSgpLCBET1VCTEVfUVVPVEVTLCBTSU5HTEVfUVVPVEUpOwotCW1lc3NhZ2UgPSBuZXcgU3RyaW5nKG1lc3NhZ2VXaXRoTm9Eb3VibGVRdW90ZXMpOwotCi0JaWYgKGJpbmRpbmdzID09IG51bGwpCi0JCXJldHVybiBtZXNzYWdlOwotCi0JaW50IGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoKCk7Ci0JaW50IHN0YXJ0ID0gLTE7Ci0JaW50IGVuZCA9IGxlbmd0aDsKLQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0Jd2hpbGUgKHRydWUpIHsKLQkJaWYgKChlbmQgPSBtZXNzYWdlLmluZGV4T2YoJ3snLCBzdGFydCkpID4gLTEpIHsKLQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKTsKLQkJCWlmICgoc3RhcnQgPSBtZXNzYWdlLmluZGV4T2YoJ30nLCBlbmQpKSA+IC0xKSB7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCArIDEsIHN0YXJ0KSk7Ci0JCQkJCW91dHB1dC5hcHBlbmQoYmluZGluZ3NbaW5kZXhdKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCW91dHB1dC5hcHBlbmQobWVzc2FnZS5zdWJzdHJpbmcoZW5kICsgMSwgc3RhcnQgKyAxKSk7Ci0JCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkJb3V0cHV0LmFwcGVuZCgie21pc3NpbmcgIiArIEludGVnZXIudG9TdHJpbmcoaW5kZXgpICsgIn0iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvdXRwdXQuYXBwZW5kKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0ICsgMSwgbGVuZ3RoKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7Ci19Ci0KLS8qKgotICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKLSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgotICovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcpIHsKLQlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHtiaW5kaW5nfSk7Ci19Ci0KLS8qKgotICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKLSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5ncy4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nMSwgU3RyaW5nIGJpbmRpbmcyKSB7Ci0JcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7YmluZGluZzEsIGJpbmRpbmcyfSk7Ci19CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRydWUgaWZmIHN0ci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGVuZC50b0xvd2VyQ2FzZSgpKQpAQCAtMTA1MSw2ICszNTAsMzA4IEBACiAJfQogCiAJLyoqCisJICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCisJICogRWl0aGVyIG9yIGJvdGggYXJyYXlzIG1heSBiZSBudWxsLgorCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGFyZSBudWxsLgorCSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KKwkgKiBJZiBib3RoIGFyZSBhcnJheXMsIHJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQKKwkgKiBhbGwgZWxlbWVudHMgYXJlIGVxdWFsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbEFycmF5c09yTnVsbChpbnRbXSBhLCBpbnRbXSBiKSB7CisJCWlmIChhID09IGIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWludCBsZW4gPSBhLmxlbmd0aDsKKwkJaWYgKGxlbiAhPSBiLmxlbmd0aCkKKwkJCXJldHVybiBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJaWYgKGFbaV0gIT0gYltpXSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogQ29tcGFyZXMgdHdvIGFycmF5cyB1c2luZyBlcXVhbHMoKSBvbiB0aGUgZWxlbWVudHMuCisJICogRWl0aGVyIG9yIGJvdGggYXJyYXlzIG1heSBiZSBudWxsLgorCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGFyZSBudWxsLgorCSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KKwkgKiBJZiBib3RoIGFyZSBhcnJheXMsIHJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQKKwkgKiBhbGwgZWxlbWVudHMgY29tcGFyZSB0cnVlIHdpdGggZXF1YWxzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbEFycmF5c09yTnVsbChPYmplY3RbXSBhLCBPYmplY3RbXSBiKSB7CisJCWlmIChhID09IGIpCXJldHVybiB0cnVlOworCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisJCWludCBsZW4gPSBhLmxlbmd0aDsKKwkJaWYgKGxlbiAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQlpZiAoYVtpXSA9PSBudWxsKSB7CisJCQkJaWYgKGJbaV0gIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWFbaV0uZXF1YWxzKGJbaV0pKSByZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIENvbXBhcmVzIHR3byBTdHJpbmcgYXJyYXlzIHVzaW5nIGVxdWFscygpIG9uIHRoZSBlbGVtZW50cy4KKwkgKiBUaGUgYXJyYXlzIGFyZSBmaXJzdCBzb3J0ZWQuCisJICogRWl0aGVyIG9yIGJvdGggYXJyYXlzIG1heSBiZSBudWxsLgorCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGFyZSBudWxsLgorCSAqIFJldHVybnMgZmFsc2UgaWYgb25seSBvbmUgaXMgbnVsbC4KKwkgKiBJZiBib3RoIGFyZSBhcnJheXMsIHJldHVybnMgdHJ1ZSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQKKwkgKiBpZmYsIGFmdGVyIHNvcnRpbmcgYm90aCBhcnJheXMsIGFsbCBlbGVtZW50cyBjb21wYXJlIHRydWUgd2l0aCBlcXVhbHMuCisJICogVGhlIG9yaWdpbmFsIGFycmF5cyBhcmUgbGVmdCB1bnRvdWNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsQXJyYXlzT3JOdWxsU29ydEZpcnN0KFN0cmluZ1tdIGEsIFN0cmluZ1tdIGIpIHsKKwkJaWYgKGEgPT0gYikJcmV0dXJuIHRydWU7CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWludCBsZW4gPSBhLmxlbmd0aDsKKwkJaWYgKGxlbiAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworCQlpZiAobGVuID49IDIpIHsgIC8vIG9ubHkgbmVlZCB0byBzb3J0IGlmIG1vcmUgdGhhbiB0d28gaXRlbXMKKwkJCWEgPSBzb3J0Q29weShhKTsKKwkJCWIgPSBzb3J0Q29weShiKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQlpZiAoIWFbaV0uZXF1YWxzKGJbaV0pKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIENvbXBhcmVzIHR3byBhcnJheXMgdXNpbmcgZXF1YWxzKCkgb24gdGhlIGVsZW1lbnRzLgorCSAqIFRoZSBhcnJheXMgYXJlIGZpcnN0IHNvcnRlZC4KKwkgKiBFaXRoZXIgb3IgYm90aCBhcnJheXMgbWF5IGJlIG51bGwuCisJICogUmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIG51bGwuCisJICogUmV0dXJucyBmYWxzZSBpZiBvbmx5IG9uZSBpcyBudWxsLgorCSAqIElmIGJvdGggYXJlIGFycmF5cywgcmV0dXJucyB0cnVlIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZAorCSAqIGlmZiwgYWZ0ZXIgc29ydGluZyBib3RoIGFycmF5cywgYWxsIGVsZW1lbnRzIGNvbXBhcmUgdHJ1ZSB3aXRoIGVxdWFscy4KKwkgKiBUaGUgb3JpZ2luYWwgYXJyYXlzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxBcnJheXNPck51bGxTb3J0Rmlyc3QoQ29tcGFyYWJsZVtdIGEsIENvbXBhcmFibGVbXSBiKSB7CisJCWlmIChhID09IGIpCXJldHVybiB0cnVlOworCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlpbnQgbGVuID0gYS5sZW5ndGg7CisJCWlmIChsZW4gIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKKwkJaWYgKGxlbiA+PSAyKSB7ICAvLyBvbmx5IG5lZWQgdG8gc29ydCBpZiBtb3JlIHRoYW4gdHdvIGl0ZW1zCisJCQlhID0gc29ydENvcHkoYSk7CisJCQliID0gc29ydENvcHkoYik7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJaWYgKCFhW2ldLmVxdWFscyhiW2ldKSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBDb21wYXJlcyB0d28gb2JqZWN0cyB1c2luZyBlcXVhbHMoKS4KKwkgKiBFaXRoZXIgb3IgYm90aCBhcnJheSBtYXkgYmUgbnVsbC4KKwkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbC4KKwkgKiBSZXR1cm5zIGZhbHNlIGlmIG9ubHkgb25lIGlzIG51bGwuCisJICogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgd2l0aCBlcXVhbHMoKS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxPck51bGwoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisJCWlmIChhID09IGIpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGEuZXF1YWxzKGIpOworCX0KKwkKKwkvKioKKwkgKiBHaXZlbiBhIHF1YWxpZmllZCBuYW1lLCBleHRyYWN0IHRoZSBsYXN0IGNvbXBvbmVudC4KKwkgKiBJZiB0aGUgaW5wdXQgaXMgbm90IHF1YWxpZmllZCwgdGhlIHNhbWUgc3RyaW5nIGlzIGFuc3dlcmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RMYXN0TmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworCQlpbnQgaSA9IHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJaWYgKGkgPT0gLTEpIHJldHVybiBxdWFsaWZpZWROYW1lOworCQlyZXR1cm4gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaSsxKTsKKwl9CisJCisJLyoqCisJICogRXh0cmFjdHMgdGhlIHBhcmFtZXRlciB0eXBlcyBmcm9tIGEgbWV0aG9kIHNpZ25hdHVyZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGV4dHJhY3RQYXJhbWV0ZXJUeXBlcyhjaGFyW10gc2lnKSB7CisJCWludCBjb3VudCA9IGdldFBhcmFtZXRlckNvdW50KHNpZyk7CisJCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY291bnRdOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWludCBpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcoJywgc2lnKSArIDE7CisJCWNvdW50ID0gMDsKKwkJaW50IGxlbiA9IHNpZy5sZW5ndGg7CisJCWludCBzdGFydCA9IGk7CisJCWZvciAoOzspIHsKKwkJCWlmIChpID09IGxlbikKKwkJCQlicmVhazsKKwkJCWNoYXIgYyA9IHNpZ1tpXTsKKwkJCWlmIChjID09ICcpJykKKwkJCQlicmVhazsKKwkJCWlmIChjID09ICdbJykgeworCQkJCSsraTsKKwkJCX0gZWxzZQorCQkJCWlmIChjID09ICdMJykgeworCQkJCQlpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnLCBpICsgMSkgKyAxOworCQkJCQlBc3NlcnQuaXNUcnVlKGkgIT0gMCk7CisJCQkJCXJlc3VsdFtjb3VudCsrXSA9IGNvbnZlcnRUeXBlU2lnbmF0dXJlKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoc2lnLCBzdGFydCwgaSkpOworCQkJCQlzdGFydCA9IGk7CisJCQkJfSBlbHNlIHsKKwkJCQkJKytpOworCQkJCQlyZXN1bHRbY291bnQrK10gPSBjb252ZXJ0VHlwZVNpZ25hdHVyZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHNpZywgc3RhcnQsIGkpKTsKKwkJCQkJc3RhcnQgPSBpOworCQkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEV4dHJhY3RzIHRoZSByZXR1cm4gdHlwZSBmcm9tIGEgbWV0aG9kIHNpZ25hdHVyZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0UmV0dXJuVHlwZShTdHJpbmcgc2lnKSB7CisJCWludCBpID0gc2lnLmxhc3RJbmRleE9mKCcpJyk7CisJCUFzc2VydC5pc1RydWUoaSAhPSAtMSk7CisJCXJldHVybiBzaWcuc3Vic3RyaW5nKGkrMSk7CQorCX0KKwkKKwkvKioKKwkgKiBGaW5kcyB0aGUgZmlyc3QgbGluZSBzZXBhcmF0b3IgdXNlZCBieSB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEByZXR1cm4gPC9jb2RlPiJcbiI8L2NvZGU+IG9yIDwvY29kZT4iXHIiPC9jb2RlPiBvciAgPC9jb2RlPiJcclxuIjwvY29kZT4sCisJICoJCQlvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZExpbmVTZXBhcmF0b3IoY2hhcltdIHRleHQpIHsKKwkJLy8gZmluZCB0aGUgZmlyc3QgbGluZSBzZXBhcmF0b3IKKwkJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOworCQlpZiAobGVuZ3RoID4gMCkgeworCQkJY2hhciBuZXh0Q2hhciA9IHRleHRbMF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJY2hhciBjdXJyZW50Q2hhciA9IG5leHRDaGFyOworCQkJCW5leHRDaGFyID0gaSA8IGxlbmd0aC0xID8gdGV4dFtpKzFdIDogJyAnOworCQkJCXN3aXRjaCAoY3VycmVudENoYXIpIHsKKwkJCQkJY2FzZSAnXG4nOiByZXR1cm4gIlxuIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljYXNlICdccic6IHJldHVybiBuZXh0Q2hhciA9PSAnXG4nID8gIlxyXG4iIDogIlxyIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCQl9CisJCS8vIG5vdCBmb3VuZAorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbGluZSBzZXBhcmF0b3IgdXNlZCBieSB0aGUgZ2l2ZW4gYnVmZmVyLgorCSAqIFVzZXMgdGhlIGdpdmVuIHRleHQgaWYgbm9uZSBmb3VuZC4KKwkgKgorCSAqIEByZXR1cm4gPC9jb2RlPiJcbiI8L2NvZGU+IG9yIDwvY29kZT4iXHIiPC9jb2RlPiBvciAgPC9jb2RlPiJcclxuIjwvY29kZT4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGluZVNlcGFyYXRvcihjaGFyW10gdGV4dCwgY2hhcltdIGJ1ZmZlcikgeworCQkvLyBzZWFyY2ggaW4gdGhpcyBidWZmZXIncyBjb250ZW50cyBmaXJzdAorCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IGZpbmRMaW5lU2VwYXJhdG9yKGJ1ZmZlcik7CisJCWlmIChsaW5lU2VwYXJhdG9yID09IG51bGwpIHsKKwkJCS8vIHNlYXJjaCBpbiB0aGUgZ2l2ZW4gdGV4dAorCQkJbGluZVNlcGFyYXRvciA9IGZpbmRMaW5lU2VwYXJhdG9yKHRleHQpOworCQkJaWYgKGxpbmVTZXBhcmF0b3IgPT0gbnVsbCkgeworCQkJCS8vIGRlZmF1bHQgdG8gc3lzdGVtIGxpbmUgc2VwYXJhdG9yCisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuTElORV9TRVBBUkFUT1I7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxpbmVTZXBhcmF0b3I7CisJfQorCQkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIHR5cGVzIGluIGEgbWV0aG9kIHNpZ25hdHVyZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbWV0ZXJDb3VudChjaGFyW10gc2lnKSB7CisJCWludCBpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCcoJywgc2lnKSArIDE7CisJCUFzc2VydC5pc1RydWUoaSAhPSAwKTsKKwkJaW50IGNvdW50ID0gMDsKKwkJaW50IGxlbiA9IHNpZy5sZW5ndGg7CisJCWZvciAoOzspIHsKKwkJCWlmIChpID09IGxlbikKKwkJCQlicmVhazsKKwkJCWNoYXIgYyA9IHNpZ1tpXTsKKwkJCWlmIChjID09ICcpJykKKwkJCQlicmVhazsKKwkJCWlmIChjID09ICdbJykgeworCQkJCSsraTsKKwkJCX0gZWxzZQorCQkJCWlmIChjID09ICdMJykgeworCQkJCQkrK2NvdW50OworCQkJCQlpID0gQ2hhck9wZXJhdGlvbi5pbmRleE9mKCc7Jywgc2lnLCBpICsgMSkgKyAxOworCQkJCQlBc3NlcnQuaXNUcnVlKGkgIT0gMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJKytjb3VudDsKKwkJCQkJKytpOworCQkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGdpdmVuIGZpbGUncyBjb250ZW50cyBhcyBhIGJ5dGUgYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBieXRlW10gZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KElGaWxlIGZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBzdHJlYW09IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUpOworCQl9CisJCXRyeSB7CisJCQlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHN0cmVhbSwgLTEpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZ2l2ZW4gZmlsZSdzIGNvbnRlbnRzIGFzIGEgY2hhcmFjdGVyIGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheShJRmlsZSBmaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSk7CisJCXJldHVybiBnZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoZmlsZSwgZW5jb2RpbmcpOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFJlc291cmNlQ29udGVudHNBc0NoYXJBcnJheShJRmlsZSBmaWxlLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBzdHJlYW09IG51bGw7CisJCXRyeSB7CisJCQlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCk7CisJCX0KKwkJdHJ5IHsKKwkJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldElucHV0U3RyZWFtQXNDaGFyQXJyYXkoc3RyZWFtLCAtMSwgZW5jb2RpbmcpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJc3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIHRyaW1tZWQgdmVyc2lvbiB0aGUgc2ltcGxlcyBuYW1lcyByZXR1cm5lZCBieSBTaWduYXR1cmUuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUcmltbWVkU2ltcGxlTmFtZXMoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nW10gcmVzdWx0ID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWVzKG5hbWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiBudWxsOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSByZXN1bHRbaV0udHJpbSgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCS8qKgogCSAqIFJldHVybnMgdHJ1ZSBpZmYgc3RyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpCiAJICogaW1wbGVtZW50YXRpb24gaXMgbm90IGNyZWF0aW5nIGV4dHJhIHN0cmluZ3MuCiAJICovCkBAIC0xMDY1LDggKzY2Niw3OSBAQAogCQl9CiAJCXJldHVybiB0cnVlOwkJCiAJfQorCQorCS8qCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgaXMgZXhsdWRlZCBmcm9tIGl0cyByb290J3MgY2xhc3NwYXRoLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0V4Y2x1ZGVkKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJCWludCBlbGVtZW50VHlwZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKKwkJc3dpdGNoIChlbGVtZW50VHlwZSkgeworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKKwkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOworCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKKwkJCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiBVdGlsLmlzRXhjbHVkZWQocmVzb3VyY2UsIHJvb3QuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpKTsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6CisJCQkJcm9vdCA9IChQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7CisJCQkJcmVzb3VyY2UgPSBlbGVtZW50LmdldFJlc291cmNlKCk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgVXRpbC5pc0V4Y2x1ZGVkKHJlc291cmNlLCByb290LmZ1bGxFeGNsdXNpb25QYXR0ZXJuQ2hhcnMoKSkpCisJCQkJCXJldHVybiB0cnVlOworCQkJCXJldHVybiBpc0V4Y2x1ZGVkKGVsZW1lbnQuZ2V0UGFyZW50KCkpOworCQkJZGVmYXVsdDoKKwkJCQlJSmF2YUVsZW1lbnQgY3UgPSBlbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKTsKKwkJCQlyZXR1cm4gY3UgIT0gbnVsbCAmJiBpc0V4Y2x1ZGVkKGN1KTsKKwkJfQorCX0KKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgcGF0aCBtYXRjaGVzIG9uZSBvZiB0aGUgZXhjbHVzaW9uCisJICogcGF0dGVybnMuCisJICogCisJICogQHNlZSBJQ2xhc3NwYXRoRW50cnkjZ2V0RXhjbHVzaW9uUGF0dGVybnMKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChJUGF0aCByZXNvdXJjZVBhdGgsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zKSB7CisJCWlmIChleGNsdXNpb25QYXR0ZXJucyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWNoYXJbXSBwYXRoID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJaWYgKENoYXJPcGVyYXRpb24ucGF0aE1hdGNoKGV4Y2x1c2lvblBhdHRlcm5zW2ldLCBwYXRoLCB0cnVlLCAnLycpKQorCQkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQkKKwkKKwkvKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWF0Y2hlcyBvbmUgb2YgdGhlIGV4Y2x1c2lvbiBwYXR0ZXJucy4KKwkgKiAKKwkgKiBAc2VlIElDbGFzc3BhdGhFbnRyeSNnZXRFeGNsdXNpb25QYXR0ZXJucworCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKElSZXNvdXJjZSByZXNvdXJjZSwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMpIHsKKwkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CisJCS8vIGVuc3VyZSB0aGF0IGZvbGRlcnMgYXJlIG9ubHkgZXhjbHVkZWQgaWYgYWxsIG9mIHRoZWlyIGNoaWxkcmVuIGFyZSBleGNsdWRlZAorCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCisJCQlwYXRoID0gcGF0aC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gaXNFeGNsdWRlZChwYXRoLCBleGNsdXNpb25QYXR0ZXJucyk7CisJfQogCiAJLyoqCisJICogUmV0dXJucyB0cnVlIGlmZiBzdHIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIgb3IgIi56aXAiKQorCSAqIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjcmVhdGluZyBleHRyYSBzdHJpbmdzLgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0FyY2hpdmVGaWxlTmFtZShTdHJpbmcgbmFtZSkgeworCQlpbnQgbmFtZUxlbmd0aCA9IG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmxlbmd0aCgpOworCQlpbnQgc3VmZml4TGVuZ3RoID0gU1VGRklYX0pBUi5sZW5ndGg7CisJCWlmIChuYW1lTGVuZ3RoIDwgc3VmZml4TGVuZ3RoKSByZXR1cm4gZmFsc2U7CisKKwkJaW50IGksIG9mZnNldDsKKwkJZm9yICggaSA9IDAsIG9mZnNldCA9IG5hbWVMZW5ndGggLSBzdWZmaXhMZW5ndGg7IGkgPCBzdWZmaXhMZW5ndGg7IGkrKykgeworCQkJY2hhciBjID0gbmFtZS5jaGFyQXQob2Zmc2V0ICsgaSk7CisJCQlpZiAoYyAhPSBTVUZGSVhfamFyW2ldICYmIGMgIT0gU1VGRklYX0pBUltpXSkgYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gc3VmZml4TGVuZ3RoKSByZXR1cm4gdHJ1ZTsJCQorCQlmb3IgKCBpID0gMCwgb2Zmc2V0ID0gbmFtZUxlbmd0aCAtIHN1ZmZpeExlbmd0aDsgaSA8IHN1ZmZpeExlbmd0aDsgaSsrKSB7CisJCQljaGFyIGMgPSBuYW1lLmNoYXJBdChvZmZzZXQgKyBpKTsKKwkJCWlmIChjICE9IFNVRkZJWF96aXBbaV0gJiYgYyAhPSBTVUZGSVhfWklQW2ldKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgogCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBjb21waWxhdGlvbiB1bml0IG5hbWUuCiAJICogQSBjb21waWxhdGlvbiB1bml0IG5hbWUgbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgcnVsZXM6CiAJICogPHVsPgpAQCAtMTExOSwxMCArNzkxLDUxMCBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSBpcyB2YWxpZCwKKwkgKiBmYWxzZSBpZiBpdCBpcyBub3QuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRNZXRob2RTaWduYXR1cmUoU3RyaW5nIHNpZykgeworCQlpbnQgbGVuID0gc2lnLmxlbmd0aCgpOworCQlpZiAobGVuID09IDApIHJldHVybiBmYWxzZTsKKwkJaW50IGkgPSAwOworCQljaGFyIGMgPSBzaWcuY2hhckF0KGkrKyk7CisJCWlmIChjICE9ICcoJykgcmV0dXJuIGZhbHNlOworCQlpZiAoaSA+PSBsZW4pIHJldHVybiBmYWxzZTsKKwkJd2hpbGUgKHNpZy5jaGFyQXQoaSkgIT0gJyknKSB7CisJCQkvLyBWb2lkIGlzIG5vdCBhbGxvd2VkIGFzIGEgcGFyYW1ldGVyIHR5cGUuCisJCQlpID0gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZywgaSwgbGVuLCBmYWxzZSk7CisJCQlpZiAoaSA9PSAtMSkgcmV0dXJuIGZhbHNlOworCQkJaWYgKGkgPj0gbGVuKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJKytpOworCQlpID0gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZywgaSwgbGVuLCB0cnVlKTsKKwkJcmV0dXJuIGkgPT0gbGVuOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgc2lnbmF0dXJlIGlzIHZhbGlkLAorCSAqIGZhbHNlIGlmIGl0IGlzIG5vdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFR5cGVTaWduYXR1cmUoU3RyaW5nIHNpZywgYm9vbGVhbiBhbGxvd1ZvaWQpIHsKKwkJaW50IGxlbiA9IHNpZy5sZW5ndGgoKTsKKwkJcmV0dXJuIGNoZWNrVHlwZVNpZ25hdHVyZShzaWcsIDAsIGxlbiwgYWxsb3dWb2lkKSA9PSBsZW47CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZm9sZGVyIG5hbWUgaXMgdmFsaWQgZm9yIGEgcGFja2FnZSwKKwkgKiBmYWxzZSBpZiBpdCBpcyBub3QuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGb2xkZXJOYW1lRm9yUGFja2FnZShTdHJpbmcgZm9sZGVyTmFtZSkgeworCQlyZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihmb2xkZXJOYW1lKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CisJfQkKKworCS8qCisJICogQWRkIGEgbG9nIGVudHJ5CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJVGhyb3dhYmxlIG5lc3RlZEV4Y2VwdGlvbjsKKwkJaWYgKGUgaW5zdGFuY2VvZiBKYXZhTW9kZWxFeGNlcHRpb24gCisJCQkJJiYgKG5lc3RlZEV4Y2VwdGlvbiA9ICgoSmF2YU1vZGVsRXhjZXB0aW9uKWUpLmdldEV4Y2VwdGlvbigpKSAhPSBudWxsKSB7CisJCQllID0gbmVzdGVkRXhjZXB0aW9uOworCQl9CisJCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKAorCQkJSVN0YXR1cy5FUlJPUiwgCisJCQlKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCAKKwkJCUlTdGF0dXMuRVJST1IsIAorCQkJbWVzc2FnZSwgCisJCQllKTsgCisJCUphdmFDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOworCX0JCisJCisJLyoqCisJICogTm9ybWFsaXplcyB0aGUgY2FyaWFnZSByZXR1cm5zIGluIHRoZSBnaXZlbiB0ZXh0LgorCSAqIFRoZXkgYXJlIGFsbCBjaGFuZ2VkICB0byB1c2UgdGhlIGdpdmVuIGJ1ZmZlcidzIGxpbmUgc2VwYXJhdG9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgY2hhcltdIG5vcm1hbGl6ZUNScyhjaGFyW10gdGV4dCwgY2hhcltdIGJ1ZmZlcikgeworCQlDaGFyQXJyYXlCdWZmZXIgcmVzdWx0ID0gbmV3IENoYXJBcnJheUJ1ZmZlcigpOworCQlpbnQgbGluZVN0YXJ0ID0gMDsKKwkJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoOworCQlpZiAobGVuZ3RoID09IDApIHJldHVybiB0ZXh0OworCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IGdldExpbmVTZXBhcmF0b3IodGV4dCwgYnVmZmVyKTsKKwkJY2hhciBuZXh0Q2hhciA9IHRleHRbMF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWNoYXIgY3VycmVudENoYXIgPSBuZXh0Q2hhcjsKKwkJCW5leHRDaGFyID0gaSA8IGxlbmd0aC0xID8gdGV4dFtpKzFdIDogJyAnOworCQkJc3dpdGNoIChjdXJyZW50Q2hhcikgeworCQkJCWNhc2UgJ1xuJzoKKwkJCQkJaW50IGxpbmVMZW5ndGggPSBpLWxpbmVTdGFydDsKKwkJCQkJY2hhcltdIGxpbmUgPSBuZXcgY2hhcltsaW5lTGVuZ3RoXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZXh0LCBsaW5lU3RhcnQsIGxpbmUsIDAsIGxpbmVMZW5ndGgpOworCQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpOworCQkJCQlyZXN1bHQuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOworCQkJCQlsaW5lU3RhcnQgPSBpKzE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xyJzoKKwkJCQkJbGluZUxlbmd0aCA9IGktbGluZVN0YXJ0OworCQkJCQlpZiAobGluZUxlbmd0aCA+PSAwKSB7CisJCQkJCQlsaW5lID0gbmV3IGNoYXJbbGluZUxlbmd0aF07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRleHQsIGxpbmVTdGFydCwgbGluZSwgMCwgbGluZUxlbmd0aCk7CisJCQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpOworCQkJCQkJcmVzdWx0LmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKwkJCQkJCWlmIChuZXh0Q2hhciA9PSAnXG4nKSB7CisJCQkJCQkJbmV4dENoYXIgPSAnICc7CisJCQkJCQkJbGluZVN0YXJ0ID0gaSsyOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyB3aGVuIGxpbmUgc2VwYXJhdG9yIGFyZSBtaXhlZCBpbiB0aGUgc2FtZSBmaWxlCisJCQkJCQkJLy8gXHIgbWlnaHQgbm90IGJlIGZvbGxvd2VkIGJ5IGEgXG4uIElmIG5vdCwgd2Ugc2hvdWxkIGluY3JlbWVudAorCQkJCQkJCS8vIGxpbmVTdGFydCBieSBvbmUgYW5kIG5vdCBieSB0d28uCisJCQkJCQkJbGluZVN0YXJ0ID0gaSsxOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gd2hlbiBsaW5lIHNlcGFyYXRvciBhcmUgbWl4ZWQgaW4gdGhlIHNhbWUgZmlsZQorCQkJCQkJLy8gd2UgbmVlZCB0byBwcmV2ZW50IE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCisJCQkJCQlsaW5lU3RhcnQgPSBpKzE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2hhcltdIGxhc3RMaW5lOworCQlpZiAobGluZVN0YXJ0ID4gMCkgeworCQkJaW50IGxhc3RMaW5lTGVuZ3RoID0gbGVuZ3RoLWxpbmVTdGFydDsKKwkJCWlmIChsYXN0TGluZUxlbmd0aCA+IDApIHsKKwkJCQlsYXN0TGluZSA9IG5ldyBjaGFyW2xhc3RMaW5lTGVuZ3RoXTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRleHQsIGxpbmVTdGFydCwgbGFzdExpbmUsIDAsIGxhc3RMaW5lTGVuZ3RoKTsKKwkJCQlyZXN1bHQuYXBwZW5kKGxhc3RMaW5lKTsKKwkJCX0KKwkJCXJldHVybiByZXN1bHQuZ2V0Q29udGVudHMoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0ZXh0OworCQl9CisJfQorCisJLyoqCisJICogTm9ybWFsaXplcyB0aGUgY2FyaWFnZSByZXR1cm5zIGluIHRoZSBnaXZlbiB0ZXh0LgorCSAqIFRoZXkgYXJlIGFsbCBjaGFuZ2VkICB0byB1c2UgZ2l2ZW4gYnVmZmVyJ3MgbGluZSBzZXBhdGF0b3IuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplQ1JzKFN0cmluZyB0ZXh0LCBTdHJpbmcgYnVmZmVyKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKG5vcm1hbGl6ZUNScyh0ZXh0LnRvQ2hhckFycmF5KCksIGJ1ZmZlci50b0NoYXJBcnJheSgpKSk7CisJfQorCisJLyoqCisJICogU29ydCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gc29ydCBvcmRlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWNrU29ydChPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnRbXSBzb3J0T3JkZXIpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJaW50IG1pZCA9IHNvcnRPcmRlclsgKGxlZnQgKyByaWdodCkgLyAyXTsKKwkJZG8geworCQkJd2hpbGUgKHNvcnRPcmRlcltsZWZ0XSA8IG1pZCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChtaWQgPCBzb3J0T3JkZXJbcmlnaHRdKSB7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJT2JqZWN0IHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOworCQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOworCQkJCWludCB0bXAyID0gc29ydE9yZGVyW2xlZnRdOworCQkJCXNvcnRPcmRlcltsZWZ0XSA9IHNvcnRPcmRlcltyaWdodF07CisJCQkJc29ydE9yZGVyW3JpZ2h0XSA9IHRtcDI7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQsIHNvcnRPcmRlcik7CisJCX0KKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0LCBzb3J0T3JkZXIpOworCQl9CisJfQorCisJLyoqCisJICogU29ydCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyZXIuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCwgQ29tcGFyZXIgY29tcGFyZXIpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJT2JqZWN0IG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJCWRvIHsKKwkJCXdoaWxlIChjb21wYXJlci5jb21wYXJlKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0sIG1pZCkgPCAwKSB7CisJCQkJbGVmdCsrOworCQkJfQorCQkJd2hpbGUgKGNvbXBhcmVyLmNvbXBhcmUobWlkLCBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkgPCAwKSB7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJT2JqZWN0IHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07CisJCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOworCQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOworCQkJCWxlZnQrKzsKKwkJCQlyaWdodC0tOworCQkJfQorCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKKwkJaWYgKG9yaWdpbmFsX2xlZnQgPCByaWdodCkgeworCQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0LCBjb21wYXJlcik7CisJCX0KKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0LCBjb21wYXJlcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTb3J0IHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgcXVpY2tTb3J0KFN0cmluZ1tdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJU3RyaW5nIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJCWRvIHsKKwkJCXdoaWxlIChzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLmNvbXBhcmVUbyhtaWQpIDwgMCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChtaWQuY29tcGFyZVRvKHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSA8IDApIHsKKwkJCQlyaWdodC0tOworCQkJfQorCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCQlTdHJpbmcgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKKwkJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOworCQl9CisJCWlmIChsZWZ0IDwgb3JpZ2luYWxfcmlnaHQpIHsKKwkJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbF9yaWdodCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aCBpbnRvIGEgcGFja2FnZSBuYW1lLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcGF0aCBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWUoSVBhdGggcGtnUGF0aCkgeworCQlTdHJpbmdCdWZmZXIgcGtnTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoSVBhY2thZ2VGcmFnbWVudC5ERUZBVUxUX1BBQ0tBR0VfTkFNRSk7CisJCWZvciAoaW50IGogPSAwLCBtYXggPSBwa2dQYXRoLnNlZ21lbnRDb3VudCgpOyBqIDwgbWF4OyBqKyspIHsKKwkJCVN0cmluZyBzZWdtZW50ID0gcGtnUGF0aC5zZWdtZW50KGopOworCQkJaWYgKCFpc1ZhbGlkRm9sZGVyTmFtZUZvclBhY2thZ2Uoc2VnbWVudCkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXBrZ05hbWUuYXBwZW5kKHNlZ21lbnQpOworCQkJaWYgKGogPCBwa2dQYXRoLnNlZ21lbnRDb3VudCgpIC0gMSkgeworCQkJCXBrZ05hbWUuYXBwZW5kKCIuIiApOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIHBrZ05hbWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBTb3J0IHRoZSBjb21wYXJhYmxlIG9iamVjdHMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnQoQ29tcGFyYWJsZVtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJQ29tcGFyYWJsZSBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyAobGVmdCArIHJpZ2h0KSAvIDJdOworCQlkbyB7CisJCQl3aGlsZSAoc29ydGVkQ29sbGVjdGlvbltsZWZ0XS5jb21wYXJlVG8obWlkKSA8IDApIHsKKwkJCQlsZWZ0Kys7CisJCQl9CisJCQl3aGlsZSAobWlkLmNvbXBhcmVUbyhzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkgPCAwKSB7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7CisJCQkJQ29tcGFyYWJsZSB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOworCQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKKwkJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKKwkJCQlsZWZ0Kys7CisJCQkJcmlnaHQtLTsKKwkJCX0KKwkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7CisJCWlmIChvcmlnaW5hbF9sZWZ0IDwgcmlnaHQpIHsKKwkJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbF9sZWZ0LCByaWdodCk7CisJCX0KKwkJaWYgKGxlZnQgPCBvcmlnaW5hbF9yaWdodCkgeworCQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNvcnQgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlja1NvcnRSZXZlcnNlKFN0cmluZ1tdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKKwkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJU3RyaW5nIG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07CisJCWRvIHsKKwkJCXdoaWxlIChzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLmNvbXBhcmVUbyhtaWQpID4gMCkgeworCQkJCWxlZnQrKzsKKwkJCX0KKwkJCXdoaWxlIChtaWQuY29tcGFyZVRvKHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdKSA+IDApIHsKKwkJCQlyaWdodC0tOworCQkJfQorCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKKwkJCQlTdHJpbmcgdG1wID0gc29ydGVkQ29sbGVjdGlvbltsZWZ0XTsKKwkJCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07CisJCQkJc29ydGVkQ29sbGVjdGlvbltyaWdodF0gPSB0bXA7CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CisJCQl9CisJCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KSB7CisJCQlxdWlja1NvcnRSZXZlcnNlKHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKKwkJfQorCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KSB7CisJCQlxdWlja1NvcnRSZXZlcnNlKHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNvcnRzIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gcGxhY2UsIHVzaW5nIHRoZSBzb3J0IG9yZGVyIGdpdmVuIGZvciBlYWNoIGl0ZW0uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoT2JqZWN0W10gb2JqZWN0cywgaW50W10gc29ydE9yZGVyKSB7CisJCWlmIChvYmplY3RzLmxlbmd0aCA+IDEpCisJCQlxdWlja1NvcnQob2JqZWN0cywgMCwgb2JqZWN0cy5sZW5ndGggLSAxLCBzb3J0T3JkZXIpOworCX0KKworCS8qKgorCSAqIFNvcnRzIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gcGxhY2UuCisJICogVGhlIGdpdmVuIGNvbXBhcmVyIGNvbXBhcmVzIHBhaXJzIG9mIGl0ZW1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KE9iamVjdFtdIG9iamVjdHMsIENvbXBhcmVyIGNvbXBhcmVyKSB7CisJCWlmIChvYmplY3RzLmxlbmd0aCA+IDEpCisJCQlxdWlja1NvcnQob2JqZWN0cywgMCwgb2JqZWN0cy5sZW5ndGggLSAxLCBjb21wYXJlcik7CisJfQorCisJLyoqCisJICogU29ydHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpbiBwbGFjZSB1c2luZyBxdWlja3NvcnQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnQoU3RyaW5nW10gc3RyaW5ncykgeworCQlpZiAoc3RyaW5ncy5sZW5ndGggPiAxKQorCQkJcXVpY2tTb3J0KHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoIC0gMSk7CisJfQorCisJLyoqCisJICogU29ydHMgYW4gYXJyYXkgb2YgQ29tcGFyYWJsZSBvYmplY3RzIGluIHBsYWNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KENvbXBhcmFibGVbXSBvYmplY3RzKSB7CisJCWlmIChvYmplY3RzLmxlbmd0aCA+IDEpCisJCQlxdWlja1NvcnQob2JqZWN0cywgMCwgb2JqZWN0cy5sZW5ndGggLSAxKTsKKwl9CisKKwkvKioKKwkgKiBTb3J0cyBhbiBhcnJheSBvZiBTdHJpbmdzLCByZXR1cm5pbmcgYSBuZXcgYXJyYXkKKwkgKiB3aXRoIHRoZSBzb3J0ZWQgaXRlbXMuICBUaGUgb3JpZ2luYWwgYXJyYXkgaXMgbGVmdCB1bnRvdWNoZWQuCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3RbXSBzb3J0Q29weShPYmplY3RbXSBvYmplY3RzLCBDb21wYXJlciBjb21wYXJlcikgeworCQlpbnQgbGVuID0gb2JqZWN0cy5sZW5ndGg7CisJCU9iamVjdFtdIGNvcHkgPSBuZXcgT2JqZWN0W2xlbl07CisJCVN5c3RlbS5hcnJheWNvcHkob2JqZWN0cywgMCwgY29weSwgMCwgbGVuKTsKKwkJc29ydChjb3B5LCBjb21wYXJlcik7CisJCXJldHVybiBjb3B5OworCX0KKworCS8qKgorCSAqIFNvcnRzIGFuIGFycmF5IG9mIFN0cmluZ3MsIHJldHVybmluZyBhIG5ldyBhcnJheQorCSAqIHdpdGggdGhlIHNvcnRlZCBpdGVtcy4gIFRoZSBvcmlnaW5hbCBhcnJheSBpcyBsZWZ0IHVudG91Y2hlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNvcnRDb3B5KFN0cmluZ1tdIG9iamVjdHMpIHsKKwkJaW50IGxlbiA9IG9iamVjdHMubGVuZ3RoOworCQlTdHJpbmdbXSBjb3B5ID0gbmV3IFN0cmluZ1tsZW5dOworCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdHMsIDAsIGNvcHksIDAsIGxlbik7CisJCXNvcnQoY29weSk7CisJCXJldHVybiBjb3B5OworCX0KKworCS8qKgorCSAqIFNvcnRzIGFuIGFycmF5IG9mIENvbXBhcmFibGUgb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IGFycmF5CisJICogd2l0aCB0aGUgc29ydGVkIGl0ZW1zLiAgVGhlIG9yaWdpbmFsIGFycmF5IGlzIGxlZnQgdW50b3VjaGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGFyYWJsZVtdIHNvcnRDb3B5KENvbXBhcmFibGVbXSBvYmplY3RzKSB7CisJCWludCBsZW4gPSBvYmplY3RzLmxlbmd0aDsKKwkJQ29tcGFyYWJsZVtdIGNvcHkgPSBuZXcgQ29tcGFyYWJsZVtsZW5dOworCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdHMsIDAsIGNvcHksIDAsIGxlbik7CisJCXNvcnQoY29weSk7CisJCXJldHVybiBjb3B5OworCX0KKworCS8qKgorCSAqIFNvcnRzIGFuIGFycmF5IG9mIHN0cmluZ3MgaW4gcGxhY2UgdXNpbmcgcXVpY2tzb3J0CisJICogaW4gcmV2ZXJzZSBhbHBoYWJldGljYWwgb3JkZXIuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNvcnRSZXZlcnNlT3JkZXIoU3RyaW5nW10gc3RyaW5ncykgeworCQlpZiAoc3RyaW5ncy5sZW5ndGggPiAxKQorCQkJcXVpY2tTb3J0UmV2ZXJzZShzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCAtIDEpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgU3RyaW5nW10gdG8gY2hhcltdW10uCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW11bXSB0b0NoYXJBcnJheXMoU3RyaW5nW10gYSkgeworCQlpbnQgbGVuID0gYS5sZW5ndGg7CisJCWNoYXJbXVtdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl1bXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJcmVzdWx0W2ldID0gdG9DaGFycyhhW2ldKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgU3RyaW5nIHRvIGNoYXJbXS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJzKFN0cmluZyBzKSB7CisJCWludCBsZW4gPSBzLmxlbmd0aCgpOworCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5dOworCQlzLmdldENoYXJzKDAsIGxlbiwgY2hhcnMsIDApOworCQlyZXR1cm4gY2hhcnM7CisJfQorCisJLyoqCisJICogQ29udmVydHMgYSBTdHJpbmcgdG8gY2hhcltdW10sIHdoZXJlIHNlZ21lbnRzIGFyZSBzZXBhcmF0ZSBieSAnLicuCisJICovCisJcHVibGljIHN0YXRpYyBjaGFyW11bXSB0b0NvbXBvdW5kQ2hhcnMoU3RyaW5nIHMpIHsKKwkJaW50IGxlbiA9IHMubGVuZ3RoKCk7CisJCWlmIChsZW4gPT0gMCkgeworCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOworCQl9CisJCWludCBzZWdDb3VudCA9IDE7CisJCWZvciAoaW50IG9mZiA9IHMuaW5kZXhPZignLicpOyBvZmYgIT0gLTE7IG9mZiA9IHMuaW5kZXhPZignLicsIG9mZiArIDEpKSB7CisJCQkrK3NlZ0NvdW50OworCQl9CisJCWNoYXJbXVtdIHNlZ3MgPSBuZXcgY2hhcltzZWdDb3VudF1bXTsKKwkJaW50IHN0YXJ0ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdDb3VudDsgKytpKSB7CisJCQlpbnQgZG90ID0gcy5pbmRleE9mKCcuJywgc3RhcnQpOworCQkJaW50IGVuZCA9IChkb3QgPT0gLTEgPyBzLmxlbmd0aCgpIDogZG90KTsKKwkJCXNlZ3NbaV0gPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CisJCQlzLmdldENoYXJzKHN0YXJ0LCBlbmQsIHNlZ3NbaV0sIDApOworCQkJc3RhcnQgPSBlbmQgKyAxOworCQl9CisJCXJldHVybiBzZWdzOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgY2hhcltdW10gdG8gU3RyaW5nLCB3aGVyZSBzZWdtZW50cyBhcmUgc2VwYXJhdGVkIGJ5ICcuJy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhjaGFyW11bXSBjKSB7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGMubGVuZ3RoOyBpIDwgbWF4OyArK2kpIHsKKwkJCWlmIChpICE9IDApIHNiLmFwcGVuZCgnLicpOworCQkJc2IuYXBwZW5kKGNbaV0pOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgY2hhcltdW10gYW5kIGEgY2hhcltdIHRvIFN0cmluZywgd2hlcmUgc2VnbWVudHMgYXJlIHNlcGFyYXRlZCBieSAnLicuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoY2hhcltdW10gYywgY2hhcltdIGQpIHsKKwkJaWYgKGMgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmcoZCk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGMubGVuZ3RoOyBpIDwgbWF4OyArK2kpIHsKKwkJCXNiLmFwcGVuZChjW2ldKTsKKwkJCXNiLmFwcGVuZCgnLicpOworCQl9CisJCXNiLmFwcGVuZChkKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgYSBjaGFyW10gdG8gU3RyaW5nLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXJbXSBjKSB7CisJCXJldHVybiBuZXcgU3RyaW5nKGMpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIE9iamVjdHMgaW50byBTdHJpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gb2JqZWN0cykgeworCQlyZXR1cm4gdG9TdHJpbmcob2JqZWN0cywgCisJCQluZXcgRGlzcGxheWFibGUoKXsgCisJCQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKE9iamVjdCBvKSB7IAorCQkJCQlpZiAobyA9PSBudWxsKSByZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBvLnRvU3RyaW5nKCk7IAorCQkJCX0KKwkJCX0pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIE9iamVjdHMgaW50byBTdHJpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gb2JqZWN0cywgRGlzcGxheWFibGUgcmVuZGVyZXIpIHsKKwkJaWYgKG9iamVjdHMgPT0gbnVsbCkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKXsKKwkJCWlmIChpID4gMCkgYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChyZW5kZXJlci5kaXNwbGF5U3RyaW5nKG9iamVjdHNbaV0pKTsKKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gbWV0aG9kIHNpZ25hdHVyZSBpcyB2YWxpZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIHNpZykgeworCQlBc3NlcnQuaXNUcnVlKGlzVmFsaWRNZXRob2RTaWduYXR1cmUoc2lnKSk7CisJfQorCisJLyoqCisJICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB0eXBlIHNpZ25hdHVyZSBpcyB2YWxpZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVUeXBlU2lnbmF0dXJlKFN0cmluZyBzaWcsIGJvb2xlYW4gYWxsb3dWb2lkKSB7CisJCUFzc2VydC5pc1RydWUoaXNWYWxpZFR5cGVTaWduYXR1cmUoc2lnLCBhbGxvd1ZvaWQpKTsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgTkxTIGNhdGFsb2cgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCiAJICovCiAJcHVibGljIHN0YXRpYyB2b2lkIHJlbG9jYWxpemUoKSB7Ci0JCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKwkJdHJ5IHsKKwkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKwkJfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIHJlc291cmNlIDogIiArIGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnByb3BlcnRpZXMgZm9yIGxvY2FsZSAiICsgTG9jYWxlLmdldERlZmF1bHQoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQl0aHJvdyBlOworCQl9CiAJfQogCQogCS8qKgpAQCAtMTE1Myw2ICsxMzI1LDcgQEAKIAkgKiBTZXBhcmF0ZSBhbGwgdGhlIGFyZ3VtZW50cyBvZiBhIFN0cmluZyBtYWRlIGJ5IGdldFByb2JsZW1Bcmd1bWVudHNGb3JNYXJrZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2JsZW1Bcmd1bWVudHNGcm9tTWFya2VyKFN0cmluZyBhcmd1bWVudHNTdHJpbmcpeworCQlpZiAoYXJndW1lbnRzU3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOwogCQlpbnQgaW5kZXggPSBhcmd1bWVudHNTdHJpbmcuaW5kZXhPZignOicpOwogCQlpZihpbmRleCA9PSAtMSkKIAkJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5LmphdmEKaW5kZXggNjJlOWZmYy4uZDg1Y2E1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Xb3JraW5nQ29weS5qYXZhCkBAIC0xLDM0ICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgYSB3b3JraW5nIGNvcHkgY29tcGlsYXRpb24gdW5pdC4gQSB3b3JraW5nCkBAIC03OSw4ICs3MCwzNyBAQAogICogQHNlZSBJV29ya2luZ0NvcHkKICAqLwogcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24gb3A9IG5ldyBDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbih0aGlzLCBmb3JjZSk7Ci0JcnVuT3BlcmF0aW9uKG9wLCBtb25pdG9yKTsKKwlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwlpZiAob3JpZ2luYWwuZXhpc3RzKCkpIHsKKwkJQ29tbWl0V29ya2luZ0NvcHlPcGVyYXRpb24gb3A9IG5ldyBDb21taXRXb3JraW5nQ29weU9wZXJhdGlvbih0aGlzLCBmb3JjZSk7CisJCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CisJfSBlbHNlIHsKKwkJU3RyaW5nIGVuY29kaW5nID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLCB0cnVlKTsKKwkJU3RyaW5nIGNvbnRlbnRzID0gdGhpcy5nZXRTb3VyY2UoKTsKKwkJaWYgKGNvbnRlbnRzID09IG51bGwpIHJldHVybjsKKwkJdHJ5IHsKKwkJCWJ5dGVbXSBieXRlcyA9IGVuY29kaW5nID09IG51bGwgCisJCQkJPyBjb250ZW50cy5nZXRCeXRlcygpIAorCQkJCTogY29udGVudHMuZ2V0Qnl0ZXMoZW5jb2RpbmcpOworCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKwkJCUlGaWxlIG9yaWdpbmFsUmVzID0gKElGaWxlKW9yaWdpbmFsLmdldFJlc291cmNlKCk7CisJCQlpZiAob3JpZ2luYWxSZXMuZXhpc3RzKCkpIHsKKwkJCQlvcmlnaW5hbFJlcy5zZXRDb250ZW50cygKKwkJCQkJc3RyZWFtLCAKKwkJCQkJZm9yY2UgPyBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLktFRVBfSElTVE9SWSwgCisJCQkJCW51bGwpOworCQkJfSBlbHNlIHsKKwkJCQlvcmlnaW5hbFJlcy5jcmVhdGUoCisJCQkJCXN0cmVhbSwKKwkJCQkJZm9yY2UsCisJCQkJCW1vbml0b3IpOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJCX0KKwl9CiB9CiAvKioKICAqIFJldHVybnMgYSBuZXcgZWxlbWVudCBpbmZvIGZvciB0aGlzIGVsZW1lbnQuCkBAIC05OSw0MyArMTE5LDE2IEBACiAJCXJldHVybjsKIAl9CiAJdHJ5IHsKLQkJY2xvc2UoKTsKLQkJCi0JCS8vIGlmIG9yaWdpbmFsIGVsZW1lbnQgaXMgbm90IG9uIGNsYXNzcGF0aCBmbHVzaCBpdCBmcm9tIHRoZSBjYWNoZSAKLQkJSUphdmFFbGVtZW50IG9yaWdpbmFsRWxlbWVudCA9IHRoaXMuZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JCWlmICghdGhpcy5nZXRQYXJlbnQoKS5leGlzdHMoKSkgewotCQkJKChDb21waWxhdGlvblVuaXQpb3JpZ2luYWxFbGVtZW50KS5jbG9zZSgpOwotCQl9Ci0JCQotCQkvLyByZW1vdmUgd29ya2luZyBjb3B5IGZyb20gdGhlIGNhY2hlCi0JCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOwotCQkKLQkJLy8gSW4gb3JkZXIgdG8gYmUgc2hhcmVkLCB3b3JraW5nIGNvcGllcyBoYXZlIHRvIGRlbm90ZSB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0IAotCQkvLyBBTkQgdXNlIHRoZSBzYW1lIGJ1ZmZlciBmYWN0b3J5LgotCQkvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGxpdHRsZSBzZXQgb2YgYnVmZmVyIGZhY3RvcmllcywgdGhlbiB1c2UgYSAyIGxldmVsIE1hcCBjYWNoZS4KLQkJTWFwIHNoYXJlZFdvcmtpbmdDb3BpZXMgPSBtYW5hZ2VyLnNoYXJlZFdvcmtpbmdDb3BpZXM7Ci0JCQotCQlNYXAgcGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMgPSAoTWFwKSBzaGFyZWRXb3JraW5nQ29waWVzLmdldCh0aGlzLmJ1ZmZlckZhY3RvcnkpOwotCQlpZiAocGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMgIT0gbnVsbCl7Ci0JCQlpZiAocGVyRmFjdG9yeVdvcmtpbmdDb3BpZXMucmVtb3ZlKG9yaWdpbmFsRWxlbWVudCkgIT0gbnVsbCkgewotCQkJCWlmIChTSEFSRURfV0NfVkVSQk9TRSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc3Ryb3lpbmcgc2hhcmVkIHdvcmtpbmcgY29weSAiICsgdGhpcy50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkKLQkJCQkvLyByZXBvcnQgcmVtb3ZlZCBqYXZhIGRlbHRhCi0JCQkJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IG5ldyBKYXZhRWxlbWVudERlbHRhKHRoaXMuZ2V0SmF2YU1vZGVsKCkpOwotCQkJCWRlbHRhLnJlbW92ZWQodGhpcyk7Ci0JCQkJbWFuYWdlci5maXJlKGRlbHRhLCBKYXZhTW9kZWxNYW5hZ2VyLkRFRkFVTFRfQ0hBTkdFX0VWRU5UKTsKLQkJCX0KLQkJfQkJCisJCURlc3Ryb3lXb3JraW5nQ29weU9wZXJhdGlvbiBvcCA9IG5ldyBEZXN0cm95V29ya2luZ0NvcHlPcGVyYXRpb24odGhpcyk7CisJCXJ1bk9wZXJhdGlvbihvcCwgbnVsbCk7CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJLy8gZG8gbm90aGluZwogCX0KIH0KIAogcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCWlmICh0aGlzLnVzZUNvdW50ID09IDApIHJldHVybiBmYWxzZTsgLy8gbm8gbG9uZ2VyIGV4aXN0cyBvbmNlIGRlc3Ryb3llZAotCXJldHVybiBzdXBlci5leGlzdHMoKTsKKwkvLyB3b3JraW5nIGNvcHkgYWx3YXlzIGV4aXN0cyBpbiB0aGUgbW9kZWwgdW50aWwgaXQgaXMgZGV0cm95ZWQKKwlyZXR1cm4gdGhpcy51c2VDb3VudCAhPSAwOwogfQogCiAKQEAgLTE1Niw3ICsxNDksMzMgQEAKIAlyZXR1cm4gdGhpcyA9PSBvOyAKIH0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIGluZm8gZm9yIHRoaXMgaGFuZGxlLiAgCisJICogSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBhbHJlYWR5IG9wZW4sIGl0IGFuZCBhbGwgb2YgaXRzIHBhcmVudHMgYXJlIG9wZW5lZC4KKwkgKiBEb2VzIG5vdCByZXR1cm4gbnVsbC4KKwkgKiBOT1RFOiBCaW5hcnlUeXBlIGluZm9zIGFyZSBOSk9UIHJvb3RlZCB1bmRlciBKYXZhRWxlbWVudEluZm8uCisJICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgb3Igbm90IGFjY2Vzc2libGUKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRJbmZvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAKKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCWJvb2xlYW4gc2hvdWxkUGVyZm9ybVByb2JsZW1EZXRlY3Rpb24gPSBmYWxzZTsKKwkJc3luY2hyb25pemVkKG1hbmFnZXIpeworCQkJT2JqZWN0IGluZm8gPSBtYW5hZ2VyLmdldEluZm8odGhpcyk7CisJCQlpZiAoaW5mbyA9PSBudWxsKSB7CisJCQkJc2hvdWxkUGVyZm9ybVByb2JsZW1EZXRlY3Rpb24gPSB0cnVlOworCQkJfQorCQl9CisJCU9iamVjdCBpbmZvID0gc3VwZXIuZ2V0RWxlbWVudEluZm8oKTsgLy8gd2lsbCBwb3B1bGF0ZSBpZiBuZWNlc3NhcnkKKworCQkvLyBwZXJmb3JtIHByb2JsZW0gZGV0ZWN0aW9uIG91dHNpZGUgdGhlIEphdmFNb2RlbE1hbmFnZXIgbG9jaworCQlpZiAodGhpcy5wcm9ibGVtUmVxdWVzdG9yICE9IG51bGwgJiYgc2hvdWxkUGVyZm9ybVByb2JsZW1EZXRlY3Rpb24gJiYgdGhpcy5wcm9ibGVtUmVxdWVzdG9yLmlzQWN0aXZlKCkpeworCQkJdGhpcy5wcm9ibGVtUmVxdWVzdG9yLmJlZ2luUmVwb3J0aW5nKCk7CisJCQlDb21waWxhdGlvblVuaXRQcm9ibGVtRmluZGVyLnByb2Nlc3ModGhpcywgdGhpcy5wcm9ibGVtUmVxdWVzdG9yLCBudWxsKTsgCisJCQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuZW5kUmVwb3J0aW5nKCk7CisJCX0JCQorCQlyZXR1cm4gaW5mbzsKKwl9CiAvKioKICAqIEBzZWUgSVdvcmtpbmdDb3B5CiAgKi8KQEAgLTI1NiwxMiArMjc1LDYgQEAKIH0KIAogLyoKLSAqIEFuc3dlciByZXF1ZXN0b3IgdG8gbm90aWZ5IHdpdGggcHJvYmxlbXMKLSAqLwotcHVibGljIElQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKXsKLQlyZXR1cm4gdGhpcy5wcm9ibGVtUmVxdWVzdG9yOwotfQotLyoKICAqIEBzZWUgSUphdmFFbGVtZW50CiAgKi8KIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CkBAIC0zMTgsNiArMzMxLDIzIEBACiBwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewogCXJldHVybiB0cnVlOwogfQorCisvKioKKyAqIEBzZWUgSU9wZW5hYmxlI21ha2VDb25zaXN0ZW50KElQcm9ncmVzc01vbml0b3IpCisgKi8KK3B1YmxpYyB2b2lkIG1ha2VDb25zaXN0ZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaWYgKCFpc0NvbnNpc3RlbnQoKSkgeyAvLyBUT0RPOiB0aGlzIGNvZGUgaXNuJ3Qgc3luY2hyb25pemVkIHdpdGggcmVndWxhciBvcGVuaW5nIG9mIGEgd29ya2luZyBjb3B5IChzaG91bGQgdXNlIGdldEVsZW1lbnRJbmZvKQorCQlzdXBlci5tYWtlQ29uc2lzdGVudChtb25pdG9yKTsKKworCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCWlmICh0aGlzLnByb2JsZW1SZXF1ZXN0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2JsZW1SZXF1ZXN0b3IuaXNBY3RpdmUoKSl7CisJCQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuYmVnaW5SZXBvcnRpbmcoKTsKKwkJCUNvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIucHJvY2Vzcyh0aGlzLCB0aGlzLnByb2JsZW1SZXF1ZXN0b3IsIG1vbml0b3IpOyAKKwkJCXRoaXMucHJvYmxlbVJlcXVlc3Rvci5lbmRSZXBvcnRpbmcoKTsKKwkJfQkJCisJfQorfQorCiAvKioKICAqIEBzZWUgSU9wZW5hYmxlCiAgKiBAc2VlIElXb3JraW5nQ29weQpAQCAtMzI1LDExICszNTUsMTggQEAKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGF0dGVtcHRpbmcgdG8gb3BlbiBhIHJlYWQgb25seSBlbGVtZW50IGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiBuYXZpZ2F0aW9uCiAgKiAJb3IgaWYgdGhpcyBpcyBhIHdvcmtpbmcgY29weSBiZWluZyBvcGVuZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVzdHJveWVkLgogICovCi1wdWJsaWMgdm9pZCBvcGVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworcHVibGljIHZvaWQgb3BlbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWlmICh0aGlzLnVzZUNvdW50ID09IDApIHsgLy8gd2FzIGRlc3Ryb3llZAogCQl0aHJvdyBuZXdOb3RQcmVzZW50RXhjZXB0aW9uKCk7CiAJfSBlbHNlIHsKLQkJc3VwZXIub3BlbihwbSk7CisJCXN1cGVyLm9wZW4obW9uaXRvcik7CisJCQorCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47CisJCWlmICh0aGlzLnByb2JsZW1SZXF1ZXN0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2JsZW1SZXF1ZXN0b3IuaXNBY3RpdmUoKSl7CisJCQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuYmVnaW5SZXBvcnRpbmcoKTsKKwkJCUNvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIucHJvY2Vzcyh0aGlzLCB0aGlzLnByb2JsZW1SZXF1ZXN0b3IsIG1vbml0b3IpOyAKKwkJCXRoaXMucHJvYmxlbVJlcXVlc3Rvci5lbmRSZXBvcnRpbmcoKTsKKwkJfQkJCiAJfQogfQogLyoqCkBAIC0zNDQsMTMgKzM4MSwxNyBAQAogCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKIAkvLyBzZXQgdGhlIGJ1ZmZlciBzb3VyY2UgaWYgbmVlZGVkCi0JaWYgKGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgPT0gbnVsbCl7Ci0JCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWw9IChJQ29tcGlsYXRpb25Vbml0KXRoaXMuZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JCUlCdWZmZXIgb3JpZ2luYWxCdWZmZXIgPSBvcmlnaW5hbC5nZXRCdWZmZXIoKTsKLQkJaWYgKG9yaWdpbmFsQnVmZmVyICE9IG51bGwpIHsKLQkJCWNoYXJbXSBvcmlnaW5hbENvbnRlbnRzID0gb3JpZ2luYWxCdWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCQkJaWYgKG9yaWdpbmFsQ29udGVudHMgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5zZXRDb250ZW50cygoY2hhcltdKW9yaWdpbmFsQ29udGVudHMuY2xvbmUoKSk7CisJaWYgKGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgPT0gbnVsbCkgeworCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKKwkJaWYgKG9yaWdpbmFsLmlzT3BlbigpKSB7CisJCQlidWZmZXIuc2V0Q29udGVudHMob3JpZ2luYWwuZ2V0U291cmNlKCkpOworCQl9IGVsc2UgeworCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlvcmlnaW5hbC5nZXRSZXNvdXJjZSgpOworCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgeworCQkJCS8vIGluaXRpYWxpemUgYnVmZmVyIHdpdGggZW1wdHkgY29udGVudHMKKwkJCQlidWZmZXIuc2V0Q29udGVudHMoQ2hhck9wZXJhdGlvbi5OT19DSEFSKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmVyLnNldENvbnRlbnRzKFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KGZpbGUpKTsKIAkJCX0KIAkJfQogCX0KQEAgLTM2Myw2ICs0MDQsMjMgQEAKIAogCXJldHVybiBidWZmZXI7CQogfQorLyoKKyAqIEBzZWUgT3BlbmFibGUjb3BlblBhcmVudChJUHJvZ3Jlc3NNb25pdG9yKQorICovCitwcm90ZWN0ZWQgdm9pZCBvcGVuUGFyZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCWlmIChGSVhfQlVHMjUxODQpIHsKKwkJdHJ5IHsKKwkJCXN1cGVyLm9wZW5QYXJlbnQocG0pOworCQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKKwkJCS8vIGFsbG93IHBhcmVudCB0byBub3QgZXhpc3QgZm9yIHdvcmtpbmcgY29waWVzIGRlZmluZWQgb3V0c2lkZSBjbGFzc3BhdGgKKwkJCWlmICghZS5pc0RvZXNOb3RFeGlzdCgpKXsgCisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN1cGVyLm9wZW5QYXJlbnQocG0pOworCX0KK30KIAogLyoqCiAgKiBAc2VlIElXb3JraW5nQ29weQpAQCAtMzc2LDUyICs0MzQsOCBAQAogICogQHNlZSBJV29ya2luZ0NvcHkKICAqLyAKIHB1YmxpYyB2b2lkIHJlY29uY2lsZShib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCWlmICh0aGlzLnVzZUNvdW50ID09IDApIHRocm93IG5ld05vdFByZXNlbnRFeGNlcHRpb24oKTsgLy93YXMgZGVzdHJveWVkCi0JCi0JaWYgKG1vbml0b3IgIT0gbnVsbCl7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOwotCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImVsZW1lbnQucmVjb25jaWxpbmciKSwgMTApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JYm9vbGVhbiB3YXNDb25zaXN0ZW50ID0gaXNDb25zaXN0ZW50KCk7Ci0JSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIgZGVsdGFCdWlsZGVyID0gbnVsbDsKLQotCXRyeSB7Ci0JCS8vIGNyZWF0ZSB0aGUgZGVsdGEgYnVpbGRlciAodGhpcyByZW1lbWJlcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgY3UpCi0JCWlmICghd2FzQ29uc2lzdGVudCl7Ci0JCQlkZWx0YUJ1aWxkZXIgPSBuZXcgSmF2YUVsZW1lbnREZWx0YUJ1aWxkZXIodGhpcyk7Ci0JCQkKLQkJCS8vIHVwZGF0ZSB0aGUgZWxlbWVudCBpbmZvcyB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSB3b3JraW5nIGNvcHkKLQkJCXRoaXMubWFrZUNvbnNpc3RlbnQobW9uaXRvcik7Ci0JCQlkZWx0YUJ1aWxkZXIuYnVpbGREZWx0YXMoKTsKLQkKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3Iud29ya2VkKDIpOwotCQkKLQkJLy8gZm9yY2UgcHJvYmxlbSBkZXRlY3Rpb24/IC0gaWYgc3RydWN0dXJlIHdhcyBjb25zaXN0ZW50Ci0JCWlmIChmb3JjZVByb2JsZW1EZXRlY3Rpb24gJiYgd2FzQ29uc2lzdGVudCl7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm47Ci0JCi0JCQlJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yID0gdGhpcy5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JCQlpZiAocHJvYmxlbVJlcXVlc3RvciAhPSBudWxsICYmIHByb2JsZW1SZXF1ZXN0b3IuaXNBY3RpdmUoKSl7Ci0JCQkJcHJvYmxlbVJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOwotCQkJCUNvbXBpbGF0aW9uVW5pdFByb2JsZW1GaW5kZXIucmVzb2x2ZSh0aGlzLCBwcm9ibGVtUmVxdWVzdG9yLCBtb25pdG9yKTsKLQkJCQlwcm9ibGVtUmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBmaXJlIHRoZSBkZWx0YXMKLQkJaWYgKGRlbHRhQnVpbGRlciAhPSBudWxsKXsKLQkJCWlmICgoZGVsdGFCdWlsZGVyLmRlbHRhICE9IG51bGwpICYmIChkZWx0YUJ1aWxkZXIuZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA+IDApKSB7Ci0JCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuCi0JCQkJCWZpcmUoZGVsdGFCdWlsZGVyLmRlbHRhLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFKTsKLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuZG9uZSgpOwotCX0KKwlSZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbiBvcCA9IG5ldyBSZWNvbmNpbGVXb3JraW5nQ29weU9wZXJhdGlvbih0aGlzLCBmb3JjZVByb2JsZW1EZXRlY3Rpb24pOworCXJ1bk9wZXJhdGlvbihvcCwgbW9uaXRvcik7CiB9CiAKIC8qKgpAQCAtNDU2LDEzICs0NzAsMTQgQEAKIAlpZiAoaXNSZWFkT25seSgpKSB7CiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSwgdGhpcykpOwogCX0KLQlJQnVmZmVyIGJ1ZiA9IGdldEJ1ZmZlcigpOwotCWlmIChidWYgIT0gbnVsbCkgeyAvLyBzb21lIE9wZW5hYmxlcyAobGlrZSBhIEphdmFQcm9qZWN0KSBkb24ndCBoYXZlIGEgYnVmZmVyCi0JCWJ1Zi5zYXZlKHBtLCBmb3JjZSk7CisJLy8gbm8gbmVlZCB0byBzYXZlIHRoZSBidWZmZXIgZm9yIGEgd29ya2luZyBjb3B5ICh0aGlzIGlzIGEgbm9vcCkKKwkvL0lCdWZmZXIgYnVmID0gZ2V0QnVmZmVyKCk7CisJLy9pZiAoYnVmICE9IG51bGwpIHsgLy8gc29tZSBPcGVuYWJsZXMgKGxpa2UgYSBKYXZhUHJvamVjdCkgZG9uJ3QgaGF2ZSBhIGJ1ZmZlcgorCS8vCWJ1Zi5zYXZlKHBtLCBmb3JjZSk7CiAJCXRoaXMucmVjb25jaWxlKCk7ICAgLy8gbm90IHNpbXBseSBtYWtlQ29uc2lzdGVudCwgYWxzbyBjb21wdXRlcyBmaW5lLWdyYWluIGRlbHRhcwogCQkJCQkJCS8vIGluIGNhc2UgdGhlIHdvcmtpbmcgY29weSBpcyBiZWluZyByZWNvbmNpbGVkIGFscmVhZHkgKGlmIG5vdCBpdCB3b3VsZCBtaXNzCiAJCQkJCQkJLy8gb25lIGl0ZXJhdGlvbiBvZiBkZWx0YXMpLgotCX0KKwkvL30KIH0KIAogLyoqCkBAIC00NzUsNyArNDkwLDcgQEAKIH0KIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVRpbWVTdGFtcChDb21waWxhdGlvblVuaXQgb3JpZ2luYWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWxvbmcgdGltZVN0YW1wID0KLQkJKChJRmlsZSkgb3JpZ2luYWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CisJCSgoSUZpbGUpIG9yaWdpbmFsLmdldFJlc291cmNlKCkpLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CiAJaWYgKHRpbWVTdGFtcCA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgewogCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKAogCQkJbmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUkVTT1VSQ0UpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5RWxlbWVudEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL1dvcmtpbmdDb3B5RWxlbWVudEluZm8uamF2YQppbmRleCAzZTIyYjA3Li5hYjFjY2FjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9Xb3JraW5nQ29weUVsZW1lbnRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvV29ya2luZ0NvcHlFbGVtZW50SW5mby5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJvcnRJbmNyZW1lbnRhbEJ1aWxkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0Fib3J0SW5jcmVtZW50YWxCdWlsZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGZmMWFiYTEuLjM3N2YyMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJvcnRJbmNyZW1lbnRhbEJ1aWxkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIC8qKgpAQCAtMjIsNCArMjIsNCBAQAogcHVibGljIEFib3J0SW5jcmVtZW50YWxCdWlsZEV4Y2VwdGlvbihTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpIHsKIAl0aGlzLnF1YWxpZmllZFR5cGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWU7CiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYnN0cmFjdEltYWdlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BYnN0cmFjdEltYWdlQnVpbGRlci5qYXZhCmluZGV4IGIyZGYzNjcuLmNmNTZkNTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWJzdHJhY3RJbWFnZUJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0Fic3RyYWN0SW1hZ2VCdWlsZGVyLmphdmEKQEAgLTEsMzMgKzEsMzIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgotICogVGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgaW1hZ2UgYnVpbGRlcnMuCisgKiBUaGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBKYXZhIGJ1aWxkZXJzLgogICogUHJvdmlkZXMgdGhlIGJ1aWxkaW5nIGFuZCBjb21waWxhdGlvbiBtZWNoYW5pc20KICAqIGluIGNvbW1vbiB3aXRoIHRoZSBiYXRjaCBhbmQgaW5jcmVtZW50YWwgYnVpbGRlcnMuCiAgKi8KQEAgLTM3LDE1ICszNiwxNCBAQAogcHJvdGVjdGVkIFN0YXRlIG5ld1N0YXRlOwogCiAvLyBsb2NhbCBjb3BpZXMKLXByb3RlY3RlZCBJQ29udGFpbmVyIG91dHB1dEZvbGRlcjsKLXByb3RlY3RlZCBJQ29udGFpbmVyW10gc291cmNlRm9sZGVyczsKK3Byb3RlY3RlZCBOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50OworcHJvdGVjdGVkIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5W10gc291cmNlTG9jYXRpb25zOwogcHJvdGVjdGVkIEJ1aWxkTm90aWZpZXIgbm90aWZpZXI7CiAKLXByb3RlY3RlZCBib29sZWFuIGhhc1NlcGFyYXRlT3V0cHV0Rm9sZGVyOwotcHJvdGVjdGVkIE5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQ7Citwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nOwogcHJvdGVjdGVkIENvbXBpbGVyIGNvbXBpbGVyOwogcHJvdGVjdGVkIFdvcmtRdWV1ZSB3b3JrUXVldWU7Ci1wcm90ZWN0ZWQgQXJyYXlMaXN0IHByb2JsZW1UeXBlTG9jYXRpb25zOworcHJvdGVjdGVkIEFycmF5TGlzdCBwcm9ibGVtU291cmNlRmlsZXM7CiBwcm90ZWN0ZWQgYm9vbGVhbiBjb21waWxlZEFsbEF0T25jZTsKIAogcHJpdmF0ZSBib29sZWFuIGluQ29tcGlsZXI7CkBAIC01NywyOCArNTUsMTQgQEAKIAl0aGlzLm5ld1N0YXRlID0gbmV3IFN0YXRlKGphdmFCdWlsZGVyKTsKIAogCS8vIGxvY2FsIGNvcGllcwotCXRoaXMub3V0cHV0Rm9sZGVyID0gamF2YUJ1aWxkZXIub3V0cHV0Rm9sZGVyOwotCXRoaXMuc291cmNlRm9sZGVycyA9IGphdmFCdWlsZGVyLnNvdXJjZUZvbGRlcnM7CisJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBqYXZhQnVpbGRlci5uYW1lRW52aXJvbm1lbnQ7CisJdGhpcy5zb3VyY2VMb2NhdGlvbnMgPSB0aGlzLm5hbWVFbnZpcm9ubWVudC5zb3VyY2VMb2NhdGlvbnM7CiAJdGhpcy5ub3RpZmllciA9IGphdmFCdWlsZGVyLm5vdGlmaWVyOwogCi0JLy8gb25seSBwZXJmb3JtIHJlc291cmNlIGNvcHlpbmcgaWYgdGhlIG91dHB1dCBsb2NhdGlvbiBkb2VzIG5vdCBtYXRjaCBhIHNvdXJjZSBmb2xkZXIKLQkvLyBjb3JyZXNwb25kcyB0bzogcHJvamVjdCA9PSBzcmMgPT0gYmluLCBvciBzZXZlcmFsIHNvdXJjZSBmb2xkZXJzIGFyZSBjb250cmlidXRpbmcgcmVzb3VyY2VzLAotCS8vIGJ1dCBvbmUgaXMgdGhlIG91dHB1dCBsb2NhdGlvbiB0b28gKGFuZCB3b3VsZCBnZXQgcG9wdWxhdGVkIHdpdGggb3RoZXIgc291cmNlIGZvbGRlciByZXNvdXJjZXMpLgotCUlQYXRoIG91dHB1dFBhdGggPSBvdXRwdXRGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQlpbnQgaW5kZXggPSBzb3VyY2VGb2xkZXJzLmxlbmd0aDsKLQlpZiAoaW5kZXggPT0gMCkgewotCQkvLyBoYW5kbGUgY2FzZSBvZiB0aGUgbGFzdCBzb3VyY2UgZm9sZGVyIGlzIHJlbW92ZWQuLi4gc28gbm8gc291cmNlIGZvbGRlcnMgZXhpc3QgYnV0IHRoZSBvdXRwdXQgZm9sZGVyIG11c3Qgc3RpbGwgYmUgc2NydWJiZWQKLQkJdGhpcy5oYXNTZXBhcmF0ZU91dHB1dEZvbGRlciA9ICFvdXRwdXRQYXRoLmVxdWFscyhqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQl9IGVsc2UgewotCQl0aGlzLmhhc1NlcGFyYXRlT3V0cHV0Rm9sZGVyID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMuaGFzU2VwYXJhdGVPdXRwdXRGb2xkZXIgJiYgLS1pbmRleCA+PSAwKQotCQkJdGhpcy5oYXNTZXBhcmF0ZU91dHB1dEZvbGRlciA9ICFvdXRwdXRQYXRoLmVxdWFscyhzb3VyY2VGb2xkZXJzW2luZGV4XS5nZXRGdWxsUGF0aCgpKTsKLQl9Ci0KLQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IG5ldyBOYW1lRW52aXJvbm1lbnQoamF2YUJ1aWxkZXIuY2xhc3NwYXRoKTsKKwl0aGlzLmVuY29kaW5nID0gamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCXRoaXMuY29tcGlsZXIgPSBuZXdDb21waWxlcigpOwogCXRoaXMud29ya1F1ZXVlID0gbmV3IFdvcmtRdWV1ZSgpOwotCXRoaXMucHJvYmxlbVR5cGVMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDMpOworCXRoaXMucHJvYmxlbVNvdXJjZUZpbGVzID0gbmV3IEFycmF5TGlzdCgzKTsKIH0KIAogcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgewpAQCAtOTAsMTQgKzc0LDE0IEBACiAJLy8gQmVmb3JlIHJlcG9ydGluZyB0aGUgbmV3IHByb2JsZW1zLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBjb3VudCAmCiAJLy8gcmVtb3ZlIHRoZSBvbGQgcHJvYmxlbXMuIFBsdXMgZGVsZXRlIGFkZGl0aW9uYWwgY2xhc3MgZmlsZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCiAKLQkvLyBvbmx5IG5lZWQgdG8gZmluZCByZXNvdXJjZSBmb3IgdGhlIHNvdXJjZUxvY2F0aW9uIHdoZW4gcHJvYmxlbXMgbmVlZCB0byBiZSByZXBvcnRlZCBhZ2FpbnN0IGl0Ci0JU3RyaW5nIHNvdXJjZUxvY2F0aW9uID0gbmV3IFN0cmluZyhyZXN1bHQuZ2V0RmlsZU5hbWUoKSk7IC8vIHRoZSBmdWxsIGZpbGVzeXN0ZW0gcGF0aCAiZDoveHl6L2VjbGlwc2Uvc3JjMS9UZXN0L3AxL3AyL0EuamF2YSIKLQlpZiAoIXdvcmtRdWV1ZS5pc0NvbXBpbGVkKHNvdXJjZUxvY2F0aW9uKSkgeworCVNvdXJjZUZpbGUgY29tcGlsYXRpb25Vbml0ID0gKFNvdXJjZUZpbGUpIHJlc3VsdC5nZXRDb21waWxhdGlvblVuaXQoKTsgLy8gZ28gZGlyZWN0bHkgYmFjayB0byB0aGUgc291cmNlRmlsZQorCWlmICghd29ya1F1ZXVlLmlzQ29tcGlsZWQoY29tcGlsYXRpb25Vbml0KSkgewogCQl0cnkgewotCQkJd29ya1F1ZXVlLmZpbmlzaGVkKHNvdXJjZUxvY2F0aW9uKTsKLQkJCXVwZGF0ZVByb2JsZW1zRm9yKHNvdXJjZUxvY2F0aW9uLCByZXN1bHQpOyAvLyByZWNvcmQgY29tcGlsYXRpb24gcHJvYmxlbXMgYmVmb3JlIHBvdGVudGlhbGx5IGFkZGluZyBkdXBsaWNhdGUgZXJyb3JzCisJCQl3b3JrUXVldWUuZmluaXNoZWQoY29tcGlsYXRpb25Vbml0KTsKKwkJCXVwZGF0ZVByb2JsZW1zRm9yKGNvbXBpbGF0aW9uVW5pdCwgcmVzdWx0KTsgLy8gcmVjb3JkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGJlZm9yZSBwb3RlbnRpYWxseSBhZGRpbmcgZHVwbGljYXRlIGVycm9ycworCQkJdXBkYXRlVGFza3NGb3IoY29tcGlsYXRpb25Vbml0LCByZXN1bHQpOyAvLyByZWNvcmQgdGFza3MKIAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSByZXN1bHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCQlTdHJpbmcgdHlwZUxvY2F0b3IgPSBjb21waWxhdGlvblVuaXQudHlwZUxvY2F0b3IoKTsKIAkJCUNsYXNzRmlsZVtdIGNsYXNzRmlsZXMgPSByZXN1bHQuZ2V0Q2xhc3NGaWxlcygpOwogCQkJaW50IGxlbmd0aCA9IGNsYXNzRmlsZXMubGVuZ3RoOwogCQkJQXJyYXlMaXN0IGR1cGxpY2F0ZVR5cGVOYW1lcyA9IG51bGw7CkBAIC0xMTEsMjcgKzk1LDI3IEBACiAJCQkJLy8gTG9vayBmb3IgYSBwb3NzaWJsZSBjb2xsaXNpb24sIGlmIG9uZSBleGlzdHMsIHJlcG9ydCBhbiBlcnJvciBidXQgZG8gbm90IHdyaXRlIHRoZSBjbGFzcyBmaWxlCiAJCQkJaWYgKGlzTmVzdGVkVHlwZSkgewogCQkJCQlTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUgPSBuZXcgU3RyaW5nKGNsYXNzRmlsZS5vdXRlck1vc3RFbmNsb3NpbmdDbGFzc0ZpbGUoKS5maWxlTmFtZSgpKTsKLQkJCQkJaWYgKG5ld1N0YXRlLmlzRHVwbGljYXRlTG9jYXRpb24ocXVhbGlmaWVkVHlwZU5hbWUsIHNvdXJjZUxvY2F0aW9uKSkKKwkJCQkJaWYgKG5ld1N0YXRlLmlzRHVwbGljYXRlTG9jYXRvcihxdWFsaWZpZWRUeXBlTmFtZSwgdHlwZUxvY2F0b3IpKQogCQkJCQkJY29udGludWU7CiAJCQkJfSBlbHNlIHsKIAkJCQkJU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lID0gbmV3IFN0cmluZyhjbGFzc0ZpbGUuZmlsZU5hbWUoKSk7IC8vIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lICJwMS9wMi9BIgotCQkJCQlpZiAobmV3U3RhdGUuaXNEdXBsaWNhdGVMb2NhdGlvbihxdWFsaWZpZWRUeXBlTmFtZSwgc291cmNlTG9jYXRpb24pKSB7CisJCQkJCWlmIChuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0b3IocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKSkgewogCQkJCQkJaWYgKGR1cGxpY2F0ZVR5cGVOYW1lcyA9PSBudWxsKQogCQkJCQkJCWR1cGxpY2F0ZVR5cGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCQkJCWR1cGxpY2F0ZVR5cGVOYW1lcy5hZGQoY29tcG91bmROYW1lKTsKLQkJCQkJCWNyZWF0ZUVycm9yRm9yKHJlc291cmNlRm9yTG9jYXRpb24oc291cmNlTG9jYXRpb24pLCBVdGlsLmJpbmQoImJ1aWxkLmR1cGxpY2F0ZUNsYXNzRmlsZSIsIG5ldyBTdHJpbmcodHlwZU5hbWUpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWNyZWF0ZUVycm9yRm9yKGNvbXBpbGF0aW9uVW5pdC5yZXNvdXJjZSwgVXRpbC5iaW5kKCJidWlsZC5kdXBsaWNhdGVDbGFzc0ZpbGUiLCBuZXcgU3RyaW5nKHR5cGVOYW1lKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQotCQkJCQluZXdTdGF0ZS5yZWNvcmRMb2NhdGlvbkZvclR5cGUocXVhbGlmaWVkVHlwZU5hbWUsIHNvdXJjZUxvY2F0aW9uKTsKKwkJCQkJbmV3U3RhdGUucmVjb3JkTG9jYXRvckZvclR5cGUocXVhbGlmaWVkVHlwZU5hbWUsIHR5cGVMb2NhdG9yKTsKIAkJCQl9Ci0JCQkJZGVmaW5lZFR5cGVOYW1lcy5hZGQod3JpdGVDbGFzc0ZpbGUoY2xhc3NGaWxlLCAhaXNOZXN0ZWRUeXBlKSk7CisJCQkJZGVmaW5lZFR5cGVOYW1lcy5hZGQod3JpdGVDbGFzc0ZpbGUoY2xhc3NGaWxlLCBjb21waWxhdGlvblVuaXQuc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyLCAhaXNOZXN0ZWRUeXBlKSk7CiAJCQl9CiAKLQkJCWZpbmlzaGVkV2l0aChzb3VyY2VMb2NhdGlvbiwgcmVzdWx0LCBjb21waWxhdGlvblVuaXQuZ2V0TWFpblR5cGVOYW1lKCksIGRlZmluZWRUeXBlTmFtZXMsIGR1cGxpY2F0ZVR5cGVOYW1lcyk7CisJCQlmaW5pc2hlZFdpdGgodHlwZUxvY2F0b3IsIHJlc3VsdCwgY29tcGlsYXRpb25Vbml0LmdldE1haW5UeXBlTmFtZSgpLCBkZWZpbmVkVHlwZU5hbWVzLCBkdXBsaWNhdGVUeXBlTmFtZXMpOwogCQkJbm90aWZpZXIuY29tcGlsZWQoY29tcGlsYXRpb25Vbml0KTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQlVdGlsLmxvZyhlLCAiSmF2YUJ1aWxkZXIgaGFuZGxpbmcgQ29yZUV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFcnJvckZvcihyZXNvdXJjZUZvckxvY2F0aW9uKHNvdXJjZUxvY2F0aW9uKSwgVXRpbC5iaW5kKCJidWlsZC5pbmNvbnNpc3RlbnRDbGFzc0ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWNyZWF0ZUVycm9yRm9yKGNvbXBpbGF0aW9uVW5pdC5yZXNvdXJjZSwgVXRpbC5iaW5kKCJidWlsZC5pbmNvbnNpc3RlbnRDbGFzc0ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIH0KQEAgLTE0MCwzMCArMTI0LDI1IEBACiAJdGhpcy5uYW1lRW52aXJvbm1lbnQuY2xlYW51cCgpOwogCiAJdGhpcy5qYXZhQnVpbGRlciA9IG51bGw7Ci0JdGhpcy5vdXRwdXRGb2xkZXIgPSBudWxsOwotCXRoaXMuc291cmNlRm9sZGVycyA9IG51bGw7CisJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBudWxsOworCXRoaXMuc291cmNlTG9jYXRpb25zID0gbnVsbDsKIAl0aGlzLm5vdGlmaWVyID0gbnVsbDsKIAl0aGlzLmNvbXBpbGVyID0gbnVsbDsKLQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IG51bGw7CiAJdGhpcy53b3JrUXVldWUgPSBudWxsOwotCXRoaXMucHJvYmxlbVR5cGVMb2NhdGlvbnMgPSBudWxsOworCXRoaXMucHJvYmxlbVNvdXJjZUZpbGVzID0gbnVsbDsKIH0KIAogLyogQ29tcGlsZSB0aGUgZ2l2ZW4gZWxlbWVudHMsIGFkZGluZyBtb3JlIGVsZW1lbnRzIHRvIHRoZSB3b3JrIHF1ZXVlIAogKiBpZiB0aGV5IGFyZSBhZmZlY3RlZCBieSB0aGUgY2hhbmdlcy4KICovCi1wcm90ZWN0ZWQgdm9pZCBjb21waWxlKFN0cmluZ1tdIGZpbGVuYW1lcywgU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lcykgewotCWludCB0b0RvID0gZmlsZW5hbWVzLmxlbmd0aDsKK3Byb3RlY3RlZCB2b2lkIGNvbXBpbGUoU291cmNlRmlsZVtdIHVuaXRzKSB7CisJaW50IHRvRG8gPSB1bml0cy5sZW5ndGg7CiAJaWYgKHRoaXMuY29tcGlsZWRBbGxBdE9uY2UgPSB0b0RvIDw9IE1BWF9BVF9PTkNFKSB7CiAJCS8vIGRvIHRoZW0gYWxsIG5vdwotCQlTb3VyY2VGaWxlW10gdG9Db21waWxlID0gbmV3IFNvdXJjZUZpbGVbdG9Eb107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9EbzsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlbmFtZXNbaV07Ci0JCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm91dCB0byBjb21waWxlICIgKyBmaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRvQ29tcGlsZVtpXSA9IG5ldyBTb3VyY2VGaWxlKGZpbGVuYW1lLCBpbml0aWFsVHlwZU5hbWVzW2ldKTsKLQkJfQotCQljb21waWxlKHRvQ29tcGlsZSwgaW5pdGlhbFR5cGVOYW1lcywgbnVsbCk7CisJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9EbzsgaSsrKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWJvdXQgdG8gY29tcGlsZSAiICsgdW5pdHNbaV0udHlwZUxvY2F0b3IoKSk7IC8vJE5PTi1OTFMtMSQKKwkJY29tcGlsZSh1bml0cywgbnVsbCk7CiAJfSBlbHNlIHsKIAkJaW50IGkgPSAwOwogCQlib29sZWFuIGNvbXBpbGluZ0ZpcnN0R3JvdXAgPSB0cnVlOwpAQCAtMTcxLDUyICsxNTAsNTIgQEAKIAkJCWludCBkb05vdyA9IHRvRG8gPCBNQVhfQVRfT05DRSA/IHRvRG8gOiBNQVhfQVRfT05DRTsKIAkJCWludCBpbmRleCA9IDA7CiAJCQlTb3VyY2VGaWxlW10gdG9Db21waWxlID0gbmV3IFNvdXJjZUZpbGVbZG9Ob3ddOwotCQkJU3RyaW5nW10gaW5pdGlhbE5hbWVzSW5Mb29wID0gbmV3IFN0cmluZ1tkb05vd107CiAJCQl3aGlsZSAoaSA8IHRvRG8gJiYgaW5kZXggPCBkb05vdykgewotCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVuYW1lc1tpXTsKIAkJCQkvLyBBbHRob3VnaCBpdCBuZWVkZWQgY29tcGlsaW5nIHdoZW4gdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCwgaXQgbWF5IGhhdmUKIAkJCQkvLyBhbHJlYWR5IGJlZW4gY29tcGlsZWQgd2hlbiBpdCB3YXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIHVuaXQuCi0JCQkJaWYgKGNvbXBpbGluZ0ZpcnN0R3JvdXAgfHwgd29ya1F1ZXVlLmlzV2FpdGluZyhmaWxlbmFtZSkpIHsKKwkJCQlTb3VyY2VGaWxlIHVuaXQgPSB1bml0c1tpKytdOworCQkJCWlmIChjb21waWxpbmdGaXJzdEdyb3VwIHx8IHdvcmtRdWV1ZS5pc1dhaXRpbmcodW5pdCkpIHsKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm91dCB0byBjb21waWxlICIgKyBmaWxlbmFtZSk7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgaW5pdGlhbFR5cGVOYW1lID0gaW5pdGlhbFR5cGVOYW1lc1tpXTsKLQkJCQkJaW5pdGlhbE5hbWVzSW5Mb29wW2luZGV4XSA9IGluaXRpYWxUeXBlTmFtZTsKLQkJCQkJdG9Db21waWxlW2luZGV4KytdID0gbmV3IFNvdXJjZUZpbGUoZmlsZW5hbWUsIGluaXRpYWxUeXBlTmFtZSk7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3V0IHRvIGNvbXBpbGUgIiArIHVuaXQudHlwZUxvY2F0b3IoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJdG9Db21waWxlW2luZGV4KytdID0gdW5pdDsKIAkJCQl9Ci0JCQkJaSsrOwogCQkJfQotCQkJaWYgKGluZGV4IDwgZG9Ob3cpIHsKKwkJCWlmIChpbmRleCA8IGRvTm93KQogCQkJCVN5c3RlbS5hcnJheWNvcHkodG9Db21waWxlLCAwLCB0b0NvbXBpbGUgPSBuZXcgU291cmNlRmlsZVtpbmRleF0sIDAsIGluZGV4KTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGluaXRpYWxOYW1lc0luTG9vcCwgMCwgaW5pdGlhbE5hbWVzSW5Mb29wID0gbmV3IFN0cmluZ1tpbmRleF0sIDAsIGluZGV4KTsKLQkJCX0KLQkJCVN0cmluZ1tdIGFkZGl0aW9uYWxGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW3RvRG8gLSBpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZmlsZW5hbWVzLCBpLCBhZGRpdGlvbmFsRmlsZW5hbWVzLCAwLCBhZGRpdGlvbmFsRmlsZW5hbWVzLmxlbmd0aCk7CisJCQlTb3VyY2VGaWxlW10gYWRkaXRpb25hbFVuaXRzID0gbmV3IFNvdXJjZUZpbGVbdG9EbyAtIGldOworCQkJU3lzdGVtLmFycmF5Y29weSh1bml0cywgaSwgYWRkaXRpb25hbFVuaXRzLCAwLCBhZGRpdGlvbmFsVW5pdHMubGVuZ3RoKTsKIAkJCWNvbXBpbGluZ0ZpcnN0R3JvdXAgPSBmYWxzZTsKLQkJCWNvbXBpbGUodG9Db21waWxlLCBpbml0aWFsTmFtZXNJbkxvb3AsIGFkZGl0aW9uYWxGaWxlbmFtZXMpOworCQkJY29tcGlsZSh0b0NvbXBpbGUsIGFkZGl0aW9uYWxVbml0cyk7CiAJCX0KIAl9CiB9CiAKLXZvaWQgY29tcGlsZShTb3VyY2VGaWxlW10gdW5pdHMsIFN0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXMsIFN0cmluZ1tdIGFkZGl0aW9uYWxGaWxlbmFtZXMpIHsKK3ZvaWQgY29tcGlsZShTb3VyY2VGaWxlW10gdW5pdHMsIFNvdXJjZUZpbGVbXSBhZGRpdGlvbmFsVW5pdHMpIHsKIAlpZiAodW5pdHMubGVuZ3RoID09IDApIHJldHVybjsKIAlub3RpZmllci5hYm91dFRvQ29tcGlsZSh1bml0c1swXSk7IC8vIGp1c3QgdG8gY2hhbmdlIHRoZSBtZXNzYWdlCiAKIAkvLyBleHRlbmQgYWRkaXRpb25hbEZpbGVuYW1lcyB3aXRoIGFsbCBoaWVyYXJjaGljYWwgcHJvYmxlbSB0eXBlcyBmb3VuZCBkdXJpbmcgdGhpcyBlbnRpcmUgYnVpbGQKLQlpZiAoIXByb2JsZW1UeXBlTG9jYXRpb25zLmlzRW1wdHkoKSkgewotCQlpbnQgdG9BZGQgPSBwcm9ibGVtVHlwZUxvY2F0aW9ucy5zaXplKCk7Ci0JCWludCBsZW5ndGggPSBhZGRpdGlvbmFsRmlsZW5hbWVzID09IG51bGwgPyAwIDogYWRkaXRpb25hbEZpbGVuYW1lcy5sZW5ndGg7CisJaWYgKCFwcm9ibGVtU291cmNlRmlsZXMuaXNFbXB0eSgpKSB7CisJCWludCB0b0FkZCA9IHByb2JsZW1Tb3VyY2VGaWxlcy5zaXplKCk7CisJCWludCBsZW5ndGggPSBhZGRpdGlvbmFsVW5pdHMgPT0gbnVsbCA/IDAgOiBhZGRpdGlvbmFsVW5pdHMubGVuZ3RoOwogCQlpZiAobGVuZ3RoID09IDApCi0JCQlhZGRpdGlvbmFsRmlsZW5hbWVzID0gbmV3IFN0cmluZ1t0b0FkZF07CisJCQlhZGRpdGlvbmFsVW5pdHMgPSBuZXcgU291cmNlRmlsZVt0b0FkZF07CiAJCWVsc2UKLQkJCVN5c3RlbS5hcnJheWNvcHkoYWRkaXRpb25hbEZpbGVuYW1lcywgMCwgYWRkaXRpb25hbEZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbbGVuZ3RoICsgdG9BZGRdLCAwLCBsZW5ndGgpOworCQkJU3lzdGVtLmFycmF5Y29weShhZGRpdGlvbmFsVW5pdHMsIDAsIGFkZGl0aW9uYWxVbml0cyA9IG5ldyBTb3VyY2VGaWxlW2xlbmd0aCArIHRvQWRkXSwgMCwgbGVuZ3RoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0FkZDsgaSsrKQotCQkJYWRkaXRpb25hbEZpbGVuYW1lc1tsZW5ndGggKyBpXSA9IChTdHJpbmcpIHByb2JsZW1UeXBlTG9jYXRpb25zLmdldChpKTsKKwkJCWFkZGl0aW9uYWxVbml0c1tsZW5ndGggKyBpXSA9IChTb3VyY2VGaWxlKSBwcm9ibGVtU291cmNlRmlsZXMuZ2V0KGkpOwogCX0KLQluYW1lRW52aXJvbm1lbnQuc2V0TmFtZXMoaW5pdGlhbFR5cGVOYW1lcywgYWRkaXRpb25hbEZpbGVuYW1lcyk7CisJU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbdW5pdHMubGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMCwgbCA9IHVuaXRzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJaW5pdGlhbFR5cGVOYW1lc1tpXSA9IHVuaXRzW2ldLmluaXRpYWxUeXBlTmFtZTsKKwluYW1lRW52aXJvbm1lbnQuc2V0TmFtZXMoaW5pdGlhbFR5cGVOYW1lcywgYWRkaXRpb25hbFVuaXRzKTsKIAlub3RpZmllci5jaGVja0NhbmNlbCgpOwogCXRyeSB7CiAJCWluQ29tcGlsZXIgPSB0cnVlOwogCQljb21waWxlci5jb21waWxlKHVuaXRzKTsKKwl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGlnbm9yZWQpIHsKKwkJLy8gaWdub3JlIHRoZSBBYm9ydENvbXBpbGNhdGlvbiBjb21pbmcgZnJvbSBCdWlsZE5vdGlmaWVyLmNoZWNrQ2FuY2VsV2l0aGluQ29tcGlsZXIoKQorCQkvLyB0aGUgQ29tcGlsZXIgZmFpbGVkIGFmdGVyIHRoZSB1c2VyIGhhcyBjaG9zZSB0byBjYW5jZWwuLi4gbGlrZWx5IGR1ZSB0byBhbiBPdXRPZk1lbW9yeSBlcnJvcgogCX0gZmluYWxseSB7CiAJCWluQ29tcGlsZXIgPSBmYWxzZTsKIAl9CkBAIC0yMjcsMzQgKzIwNiwyOSBAQAogCiBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFcnJvckZvcihJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlKSB7CiAJdHJ5IHsKLQkJSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSmF2YUJ1aWxkZXIuUHJvYmxlbU1hcmtlclRhZyk7CisJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CisJCWludCBzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1I7CisJCWlmIChtZXNzYWdlLmVxdWFscyhVdGlsLmJpbmQoImJ1aWxkLmR1cGxpY2F0ZVJlc291cmNlIikpKSAvLyROT04tTkxTLTEkCisJCQlpZiAoSmF2YUNvcmUuV0FSTklORy5lcXVhbHMoamF2YUJ1aWxkZXIuamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9EVVBMSUNBVEVfUkVTT1VSQ0UsIHRydWUpKSkKKwkJCQlzZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKIAkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCiAJCQluZXcgU3RyaW5nW10ge0lNYXJrZXIuTUVTU0FHRSwgSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5DSEFSX1NUQVJULCBJTWFya2VyLkNIQVJfRU5EfSwKLQkJCW5ldyBPYmplY3RbXSB7bWVzc2FnZSwgbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9FUlJPUiksIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKX0pOworCQkJbmV3IE9iamVjdFtdIHttZXNzYWdlLCBuZXcgSW50ZWdlcihzZXZlcml0eSksIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKX0pOwogCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQl0aHJvdyBpbnRlcm5hbEV4Y2VwdGlvbihlKTsKIAl9CiB9CiAKLXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFR5cGVOYW1lRnJvbShTdHJpbmcgc291cmNlTG9jYXRpb24pIHsKLQlmb3IgKGludCBqID0gMCwgayA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBqIDwgazsgaisrKSB7Ci0JCVN0cmluZyBmb2xkZXJMb2NhdGlvbiA9IHNvdXJjZUZvbGRlcnNbal0uZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCk7Ci0JCWlmIChzb3VyY2VMb2NhdGlvbi5zdGFydHNXaXRoKGZvbGRlckxvY2F0aW9uKSkKLQkJCXJldHVybiBzb3VyY2VMb2NhdGlvbi5zdWJzdHJpbmcoZm9sZGVyTG9jYXRpb24ubGVuZ3RoKCksIHNvdXJjZUxvY2F0aW9uLmxlbmd0aCgpIC0gNSk7IC8vIGxlbmd0aCBvZiAiLmphdmEiCi0JfQotCXJldHVybiBzb3VyY2VMb2NhdGlvbjsgLy8gc2hvdWxkIG5vdCByZWFjaCBoZXJlCi19Ci0KLXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkV2l0aChTdHJpbmcgc291cmNlTG9jYXRpb24sIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIG1haW5UeXBlTmFtZSwgQXJyYXlMaXN0IGRlZmluZWRUeXBlTmFtZXMsIEFycmF5TGlzdCBkdXBsaWNhdGVUeXBlTmFtZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKK3Byb3RlY3RlZCB2b2lkIGZpbmlzaGVkV2l0aChTdHJpbmcgc291cmNlTG9jYXRvciwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0LCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgZGVmaW5lZFR5cGVOYW1lcywgQXJyYXlMaXN0IGR1cGxpY2F0ZVR5cGVOYW1lcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCWlmIChkdXBsaWNhdGVUeXBlTmFtZXMgPT0gbnVsbCkgewotCQluZXdTdGF0ZS5yZWNvcmQoc291cmNlTG9jYXRpb24sIHJlc3VsdC5xdWFsaWZpZWRSZWZlcmVuY2VzLCByZXN1bHQuc2ltcGxlTmFtZVJlZmVyZW5jZXMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7CisJCW5ld1N0YXRlLnJlY29yZChzb3VyY2VMb2NhdG9yLCByZXN1bHQucXVhbGlmaWVkUmVmZXJlbmNlcywgcmVzdWx0LnNpbXBsZU5hbWVSZWZlcmVuY2VzLCBtYWluVHlwZU5hbWUsIGRlZmluZWRUeXBlTmFtZXMpOwogCQlyZXR1cm47CiAJfQogCiAJY2hhcltdW11bXSBxdWFsaWZpZWRSZWZzID0gcmVzdWx0LnF1YWxpZmllZFJlZmVyZW5jZXM7CiAJY2hhcltdW10gc2ltcGxlUmVmcyA9IHJlc3VsdC5zaW1wbGVOYW1lUmVmZXJlbmNlczsKIAkvLyBmb3IgZWFjaCBkdXBsaWNhdGUgdHlwZSBwMS5wMi5BLCBhZGQgdGhlIHR5cGUgbmFtZSBBIChwYWNrYWdlIHdhcyBhbHJlYWR5IGFkZGVkKQotCW5leHQgOiBmb3IgKGludCBpID0gMCwgZExlbmd0aCA9IGR1cGxpY2F0ZVR5cGVOYW1lcy5zaXplKCk7IGkgPCBkTGVuZ3RoOyBpKyspIHsKKwluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBkdXBsaWNhdGVUeXBlTmFtZXMuc2l6ZSgpOyBpIDwgbDsgaSsrKSB7CiAJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IChjaGFyW11bXSkgZHVwbGljYXRlVHlwZU5hbWVzLmdldChpKTsKIAkJY2hhcltdIHR5cGVOYW1lID0gY29tcG91bmROYW1lW2NvbXBvdW5kTmFtZS5sZW5ndGggLSAxXTsKIAkJaW50IHNMZW5ndGggPSBzaW1wbGVSZWZzLmxlbmd0aDsKQEAgLTI2NCwxMyArMjM4LDE0IEBACiAJCVN5c3RlbS5hcnJheWNvcHkoc2ltcGxlUmVmcywgMCwgc2ltcGxlUmVmcyA9IG5ldyBjaGFyW3NMZW5ndGggKyAxXVtdLCAwLCBzTGVuZ3RoKTsKIAkJc2ltcGxlUmVmc1tzTGVuZ3RoXSA9IHR5cGVOYW1lOwogCX0KLQluZXdTdGF0ZS5yZWNvcmQoc291cmNlTG9jYXRpb24sIHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7CisJbmV3U3RhdGUucmVjb3JkKHNvdXJjZUxvY2F0b3IsIHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcyk7CiB9CiAKLXByb3RlY3RlZCBJQ29udGFpbmVyIGdldE91dHB1dEZvbGRlcihJUGF0aCBwYWNrYWdlUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworcHJvdGVjdGVkIElDb250YWluZXIgY3JlYXRlRm9sZGVyKElQYXRoIHBhY2thZ2VQYXRoLCBJQ29udGFpbmVyIG91dHB1dEZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmIChwYWNrYWdlUGF0aC5pc0VtcHR5KCkpIHJldHVybiBvdXRwdXRGb2xkZXI7CiAJSUZvbGRlciBmb2xkZXIgPSBvdXRwdXRGb2xkZXIuZ2V0Rm9sZGVyKHBhY2thZ2VQYXRoKTsKIAlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQlnZXRPdXRwdXRGb2xkZXIocGFja2FnZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKKwkJY3JlYXRlRm9sZGVyKHBhY2thZ2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgb3V0cHV0Rm9sZGVyKTsKIAkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKIAkJZm9sZGVyLnNldERlcml2ZWQodHJ1ZSk7CiAJfQpAQCAtMjg5LDEzICsyNjQsMjEgQEAKIAlyZXR1cm4gbmV3IENvbXBpbGVyKAogCQluYW1lRW52aXJvbm1lbnQsCiAJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAotCQlKYXZhQ29yZS5nZXRPcHRpb25zKCksCisJCWphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCiAJCXRoaXMsCiAJCVByb2JsZW1GYWN0b3J5LmdldFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKTsKIH0KIAotcHJvdGVjdGVkIElSZXNvdXJjZSByZXNvdXJjZUZvckxvY2F0aW9uKFN0cmluZyBzb3VyY2VMb2NhdGlvbikgewotCXJldHVybiBqYXZhQnVpbGRlci53b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChzb3VyY2VMb2NhdGlvbikpOworcHJvdGVjdGVkIGJvb2xlYW4gaXNFeGNsdWRlZEZyb21Qcm9qZWN0KElQYXRoIGNoaWxkUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJLy8gYW5zd2VyIHdoZXRoZXIgdGhlIGZvbGRlciBzaG91bGQgYmUgaWdub3JlZCB3aGVuIHdhbGtpbmcgdGhlIHByb2plY3QgYXMgYSBzb3VyY2UgZm9sZGVyCisJaWYgKGNoaWxkUGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHJldHVybiBmYWxzZTsgLy8gaXMgYSBzdWJmb2xkZXIgb2YgYSBwYWNrYWdlCisKKwlmb3IgKGludCBqID0gMCwgayA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGogPCBrOyBqKyspIHsKKwkJaWYgKGNoaWxkUGF0aC5lcXVhbHMoc291cmNlTG9jYXRpb25zW2pdLmJpbmFyeUZvbGRlci5nZXRGdWxsUGF0aCgpKSkgcmV0dXJuIHRydWU7CisJCWlmIChjaGlsZFBhdGguZXF1YWxzKHNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpIHJldHVybiB0cnVlOworCX0KKwkvLyBza2lwIGRlZmF1bHQgb3V0cHV0IGZvbGRlciB3aGljaCBtYXkgbm90IGJlIHVzZWQgYnkgYW55IHNvdXJjZSBmb2xkZXIKKwlyZXR1cm4gY2hpbGRQYXRoLmVxdWFscyhqYXZhQnVpbGRlci5qYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKIH0KIAogLyoqCkBAIC0zMDgsMTYgKzI5MSwxNyBAQAogICoJIC0gaXRzIHJhbmdlIGlzIHRoZSBwcm9ibGVtJ3MgcmFuZ2UKICAqCSAtIGl0IGhhcyBhbiBleHRyYSBhdHRyaWJ1dGUgIklEIiB3aGljaCBob2xkcyB0aGUgcHJvYmxlbSdzIGlkCiAgKi8KLXByb3RlY3RlZCB2b2lkIHN0b3JlUHJvYmxlbXNGb3IoSVJlc291cmNlIHJlc291cmNlLCBJUHJvYmxlbVtdIHByb2JsZW1zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKHJlc291cmNlID09IG51bGwgfHwgcHJvYmxlbXMgPT0gbnVsbCB8fCBwcm9ibGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOworcHJvdGVjdGVkIHZvaWQgc3RvcmVQcm9ibGVtc0ZvcihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIElQcm9ibGVtW10gcHJvYmxlbXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAoc291cmNlRmlsZSA9PSBudWxsIHx8IHByb2JsZW1zID09IG51bGwgfHwgcHJvYmxlbXMubGVuZ3RoID09IDApIHJldHVybjsKIAogCVN0cmluZyBtaXNzaW5nQ2xhc3NGaWxlID0gbnVsbDsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvYmxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSBzb3VyY2VGaWxlLnJlc291cmNlOworCWZvciAoaW50IGkgPSAwLCBsID0gcHJvYmxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCUlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKIAkJaW50IGlkID0gcHJvYmxlbS5nZXRJRCgpOwogCQlzd2l0Y2ggKGlkKSB7CiAJCQljYXNlIElQcm9ibGVtLklzQ2xhc3NQYXRoQ29ycmVjdCA6Ci0JCQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNGb3IoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOyAvLyBtYWtlIHRoaXMgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0CisJCQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0ZvcihqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKIAkJCQlTdHJpbmdbXSBhcmdzID0gcHJvYmxlbS5nZXRBcmd1bWVudHMoKTsKIAkJCQltaXNzaW5nQ2xhc3NGaWxlID0gYXJnc1swXTsKIAkJCQlicmVhazsKQEAgLTMzNywyMyArMzIxLDM2IEBACiAJCQljYXNlIElQcm9ibGVtLkludGVyZmFjZUludGVybmFsTmFtZVByb3ZpZGVkIDoKIAkJCWNhc2UgSVByb2JsZW0uSW50ZXJmYWNlSW5oZXJpdGVkTmFtZUhpZGVzRW5jbG9zaW5nTmFtZSA6CiAJCQkJLy8gZW5zdXJlIHRoYXQgdGhpcyBmaWxlIGlzIGFsd2F5cyByZXRyaWV2ZWQgZnJvbSBzb3VyY2UgZm9yIHRoZSByZXN0IG9mIHRoZSBidWlsZAotCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCFwcm9ibGVtVHlwZUxvY2F0aW9ucy5jb250YWlucyhmaWxlTG9jYXRpb24pKQotCQkJCQlwcm9ibGVtVHlwZUxvY2F0aW9ucy5hZGQoZmlsZUxvY2F0aW9uKTsKKwkJCQlpZiAoIXByb2JsZW1Tb3VyY2VGaWxlcy5jb250YWlucyhzb3VyY2VGaWxlKSkKKwkJCQkJcHJvYmxlbVNvdXJjZUZpbGVzLmFkZChzb3VyY2VGaWxlKTsKKwkJCQlicmVhazsKIAkJfQogCi0JCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKEphdmFCdWlsZGVyLlByb2JsZW1NYXJrZXJUYWcpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlcygKLQkJCW5ldyBTdHJpbmdbXSB7SU1hcmtlci5NRVNTQUdFLCBJTWFya2VyLlNFVkVSSVRZLCBJSmF2YU1vZGVsTWFya2VyLklELCBJTWFya2VyLkNIQVJfU1RBUlQsIElNYXJrZXIuQ0hBUl9FTkQsIElNYXJrZXIuTElORV9OVU1CRVIsIElKYXZhTW9kZWxNYXJrZXIuQVJHVU1FTlRTfSwKLQkJCW5ldyBPYmplY3RbXSB7IAotCQkJCXByb2JsZW0uZ2V0TWVzc2FnZSgpLAotCQkJCW5ldyBJbnRlZ2VyKHByb2JsZW0uaXNFcnJvcigpID8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiA6IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyksIAotCQkJCW5ldyBJbnRlZ2VyKGlkKSwKLQkJCQluZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpLAotCQkJCW5ldyBJbnRlZ2VyKHByb2JsZW0uZ2V0U291cmNlRW5kKCkgKyAxKSwKLQkJCQluZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSksCi0JCQkJVXRpbC5nZXRQcm9ibGVtQXJndW1lbnRzRm9yTWFya2VyKHByb2JsZW0uZ2V0QXJndW1lbnRzKCkpCi0JCQl9KTsKKwkJaWYgKGlkICE9IElQcm9ibGVtLlRhc2spIHsKKwkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CisJCQltYXJrZXIuc2V0QXR0cmlidXRlcygKKwkJCQluZXcgU3RyaW5nW10geworCQkJCQlJTWFya2VyLk1FU1NBR0UsIAorCQkJCQlJTWFya2VyLlNFVkVSSVRZLCAKKwkJCQkJSUphdmFNb2RlbE1hcmtlci5JRCwgCisJCQkJCUlNYXJrZXIuQ0hBUl9TVEFSVCwgCisJCQkJCUlNYXJrZXIuQ0hBUl9FTkQsIAorCQkJCQlJTWFya2VyLkxJTkVfTlVNQkVSLCAKKwkJCQkJSUphdmFNb2RlbE1hcmtlci5BUkdVTUVOVFN9LAorCQkJCW5ldyBPYmplY3RbXSB7IAorCQkJCQlwcm9ibGVtLmdldE1lc3NhZ2UoKSwKKwkJCQkJbmV3IEludGVnZXIocHJvYmxlbS5pc0Vycm9yKCkgPyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SIDogSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKSwgCisJCQkJCW5ldyBJbnRlZ2VyKGlkKSwKKwkJCQkJbmV3IEludGVnZXIocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKSwKKwkJCQkJbmV3IEludGVnZXIocHJvYmxlbS5nZXRTb3VyY2VFbmQoKSArIDEpLAorCQkJCQluZXcgSW50ZWdlcihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSksCisJCQkJCVV0aWwuZ2V0UHJvYmxlbUFyZ3VtZW50c0Zvck1hcmtlcihwcm9ibGVtLmdldEFyZ3VtZW50cygpKQorCQkJCX0pOworCQl9CisKKy8qIERvIE5PVCB3YW50IHRvIHBvcHVsYXRlIHRoZSBKYXZhIE1vZGVsIGp1c3QgdG8gZmluZCB0aGUgbWF0Y2hpbmcgSmF2YSBlbGVtZW50LgorICogQWxzbyBjYW5ub3QgcXVlcnkgY29tcGlsYXRpb24gdW5pdHMgbG9jYXRlZCBpbiBmb2xkZXJzIHdpdGggaW52YWxpZCBwYWNrYWdlCisgKiBuYW1lcyBzdWNoIGFzICdhL2IuYy5kL2UnLgogCiAJCS8vIGNvbXB1dGUgYSB1c2VyLWZyaWVuZGx5IGxvY2F0aW9uCiAJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKTsKQEAgLTM2Nyw0NiArMzY0LDk0IEBACiAJCQlsb2NhdGlvbiA9ICgoSmF2YUVsZW1lbnQpIGVsZW1lbnQpLnJlYWRhYmxlTmFtZSgpOwogCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKIAkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgbG9jYXRpb24pOworKi8KKwogCQlpZiAobWlzc2luZ0NsYXNzRmlsZSAhPSBudWxsKQogCQkJdGhyb3cgbmV3IE1pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24obWlzc2luZ0NsYXNzRmlsZSk7CiAJfQogfQogCi1wcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtc0ZvcihTdHJpbmcgc291cmNlTG9jYXRpb24sIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworcHJvdGVjdGVkIHZvaWQgc3RvcmVUYXNrc0ZvcihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIElQcm9ibGVtW10gdGFza3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAoc291cmNlRmlsZSA9PSBudWxsIHx8IHRhc2tzID09IG51bGwgfHwgdGFza3MubGVuZ3RoID09IDApIHJldHVybjsKKworCUlSZXNvdXJjZSByZXNvdXJjZSA9IHNvdXJjZUZpbGUucmVzb3VyY2U7CisJZm9yIChpbnQgaSA9IDAsIGwgPSB0YXNrcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJSVByb2JsZW0gdGFzayA9IHRhc2tzW2ldOworCQlpZiAodGFzay5nZXRJRCgpID09IElQcm9ibGVtLlRhc2spIHsKKwkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuVEFTS19NQVJLRVIpOworCQkJaW50IHByaW9yaXR5ID0gSU1hcmtlci5QUklPUklUWV9OT1JNQUw7CisJCQlTdHJpbmcgY29tcGlsZXJQcmlvcml0eSA9IHRhc2suZ2V0QXJndW1lbnRzKClbMl07CisJCQlpZiAoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19QUklPUklUWV9ISUdILmVxdWFscyhjb21waWxlclByaW9yaXR5KSkKKwkJCQlwcmlvcml0eSA9IElNYXJrZXIuUFJJT1JJVFlfSElHSDsKKwkJCWVsc2UgaWYgKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfUFJJT1JJVFlfTE9XLmVxdWFscyhjb21waWxlclByaW9yaXR5KSkKKwkJCQlwcmlvcml0eSA9IElNYXJrZXIuUFJJT1JJVFlfTE9XOworCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoCisJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJSU1hcmtlci5NRVNTQUdFLCAKKwkJCQkJSU1hcmtlci5QUklPUklUWSwgCisJCQkJCUlNYXJrZXIuRE9ORSwgCisJCQkJCUlNYXJrZXIuQ0hBUl9TVEFSVCwgCisJCQkJCUlNYXJrZXIuQ0hBUl9FTkQsIAorCQkJCQlJTWFya2VyLkxJTkVfTlVNQkVSLAorCQkJCQlJTWFya2VyLlVTRVJfRURJVEFCTEUsIAorCQkJCX0sIAorCQkJCW5ldyBPYmplY3RbXSB7IAorCQkJCQl0YXNrLmdldE1lc3NhZ2UoKSwKKwkJCQkJbmV3IEludGVnZXIocHJpb3JpdHkpLAorCQkJCQluZXcgQm9vbGVhbihmYWxzZSksCisJCQkJCW5ldyBJbnRlZ2VyKHRhc2suZ2V0U291cmNlU3RhcnQoKSksCisJCQkJCW5ldyBJbnRlZ2VyKHRhc2suZ2V0U291cmNlRW5kKCkgKyAxKSwKKwkJCQkJbmV3IEludGVnZXIodGFzay5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpLAorCQkJCQluZXcgQm9vbGVhbihmYWxzZSksCisJCQkJfSk7CisJCX0KKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1zRm9yKFNvdXJjZUZpbGUgc291cmNlRmlsZSwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwogCWlmIChwcm9ibGVtcyA9PSBudWxsIHx8IHByb2JsZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47CiAKIAlub3RpZmllci51cGRhdGVQcm9ibGVtQ291bnRzKHByb2JsZW1zKTsKLQlzdG9yZVByb2JsZW1zRm9yKHJlc291cmNlRm9yTG9jYXRpb24oc291cmNlTG9jYXRpb24pLCBwcm9ibGVtcyk7CisJc3RvcmVQcm9ibGVtc0Zvcihzb3VyY2VGaWxlLCBwcm9ibGVtcyk7CiB9CiAKLXByb3RlY3RlZCBjaGFyW10gd3JpdGVDbGFzc0ZpbGUoQ2xhc3NGaWxlIGNsYXNzRmlsZSwgYm9vbGVhbiBpc1NlY29uZGFyeVR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkvLyBCZWZvcmUgd3JpdGluZyBvdXQgdGhlIGNsYXNzIGZpbGUsIGNvbXBhcmUgaXQgdG8gdGhlIHByZXZpb3VzIGZpbGUKLQkvLyBJZiBzdHJ1Y3R1cmFsIGNoYW5nZXMgb2NjdXJlZCB0aGVuIGFkZCBkZXBlbmRlbnQgc291cmNlIGZpbGVzCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrc0ZvcihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlQcm9ibGVtW10gdGFza3MgPSByZXN1bHQuZ2V0VGFza3MoKTsKKwlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5sZW5ndGggPT0gMCkgcmV0dXJuOworCisJc3RvcmVUYXNrc0Zvcihzb3VyY2VGaWxlLCB0YXNrcyk7Cit9CisKK3Byb3RlY3RlZCBjaGFyW10gd3JpdGVDbGFzc0ZpbGUoQ2xhc3NGaWxlIGNsYXNzRmlsZSwgSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIsIGJvb2xlYW4gaXNTZWNvbmRhcnlUeXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJU3RyaW5nIGZpbGVOYW1lID0gbmV3IFN0cmluZyhjbGFzc0ZpbGUuZmlsZU5hbWUoKSk7IC8vIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lICJwMS9wMi9BIgotCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwkJCQorCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwogCUlDb250YWluZXIgY29udGFpbmVyID0gb3V0cHV0Rm9sZGVyOwogCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJY29udGFpbmVyID0gZ2V0T3V0cHV0Rm9sZGVyKGZpbGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7CisJCWNvbnRhaW5lciA9IGNyZWF0ZUZvbGRlcihmaWxlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIG91dHB1dEZvbGRlcik7CiAJCWZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgubGFzdFNlZ21lbnQoKSk7CiAJfQogCiAJSUZpbGUgZmlsZSA9IGNvbnRhaW5lci5nZXRGaWxlKGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oSmF2YUJ1aWxkZXIuQ0xBU1NfRVhURU5TSU9OKSk7Ci0JYnl0ZVtdIGJ5dGVzID0gY2xhc3NGaWxlLmdldEJ5dGVzKCk7Ci0JaWYgKHdyaXRlQ2xhc3NGaWxlQ2hlY2soZmlsZSwgZmlsZU5hbWUsIGJ5dGVzLCBpc1NlY29uZGFyeVR5cGUpKSB7Ci0JCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBjbGFzcyBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCBJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQlmaWxlLnNldERlcml2ZWQodHJ1ZSk7Ci0JfSBlbHNlIGlmIChKYXZhQnVpbGRlci5ERUJVRykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwZWQgb3ZlciB1bmNoYW5nZWQgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKLQl9CisJd3JpdGVDbGFzc0ZpbGVCeXRlcyhjbGFzc0ZpbGUuZ2V0Qnl0ZXMoKSwgZmlsZSwgZmlsZU5hbWUsIGlzU2Vjb25kYXJ5VHlwZSk7CiAJLy8gYW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBmaWxlIGFzIGluIFkgb3IgWSRNCiAJcmV0dXJuIGZpbGVQYXRoLmxhc3RTZWdtZW50KCkudG9DaGFyQXJyYXkoKTsKIH0KIAotcHJvdGVjdGVkIGJvb2xlYW4gd3JpdGVDbGFzc0ZpbGVDaGVjayhJRmlsZSBmaWxlLCBTdHJpbmcgZmlsZU5hbWUsIGJ5dGVbXSBieXRlcywgYm9vbGVhbiBpc1NlY29uZGFyeVR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkvLyBJbiBJbmNyZW1lbnRhbCBtb2RlLCBjb21wYXJlIHRoZSBieXRlcyBhZ2FpbnN0IHRoZSBwcmV2aW91cyBmaWxlIGZvciBzdHJ1Y3R1cmFsIGNoYW5nZXMKLQlyZXR1cm4gdHJ1ZTsKK3Byb3RlY3RlZCB2b2lkIHdyaXRlQ2xhc3NGaWxlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBJRmlsZSBmaWxlLCBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUsIGJvb2xlYW4gaXNTZWNvbmRhcnlUeXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKGZpbGUuZXhpc3RzKCkpIHsKKwkJLy8gRGVhbCB3aXRoIHNoYXJlZCBvdXRwdXQgZm9sZGVycy4uLiBsYXN0IG9uZSB3aW5zLi4uIG5vIGNvbGxpc2lvbiBjYXNlcyBkZXRlY3RlZAorCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgY2hhbmdlZCBjbGFzcyBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAorCQlmaWxlLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyksIHRydWUsIGZhbHNlLCBudWxsKTsKKwkJaWYgKCFmaWxlLmlzRGVyaXZlZCgpKQorCQkJZmlsZS5zZXREZXJpdmVkKHRydWUpOworCX0gZWxzZSB7CisJCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCB3cml0ZXMgb3V0IHRoZSBieXRlcyBmb3IgdGhlIG5ldyBjbGFzcyBmaWxlLi4uCisJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBuZXcgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKKwkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJZmlsZS5zZXREZXJpdmVkKHRydWUpOworCX0KIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0FkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9BZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24uamF2YQppbmRleCBlOWRhMmQyLi40YjYzYzc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0FkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCiBwdWJsaWMgY2xhc3MgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uIGV4dGVuZHMgUmVmZXJlbmNlQ29sbGVjdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0JhdGNoSW1hZ2VCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0JhdGNoSW1hZ2VCdWlsZGVyLmphdmEKaW5kZXggZWRhM2ViNi4uOGJlZDBhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9CYXRjaEltYWdlQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQmF0Y2hJbWFnZUJ1aWxkZXIuamF2YQpAQCAtMSwxOCArMSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogCiBpbXBvcnQgamF2YS51dGlsLio7CkBAIC0yMSw2ICsyMyw3IEBACiAKIHByb3RlY3RlZCBCYXRjaEltYWdlQnVpbGRlcihKYXZhQnVpbGRlciBqYXZhQnVpbGRlcikgewogCXN1cGVyKGphdmFCdWlsZGVyKTsKKwl0aGlzLm5hbWVFbnZpcm9ubWVudC5pc0luY3JlbWVudGFsQnVpbGQgPSBmYWxzZTsKIH0KIAogcHVibGljIHZvaWQgYnVpbGQoKSB7CkBAIC0yOCwyNyArMzEsMjggQEAKIAkJU3lzdGVtLm91dC5wcmludGxuKCJGVUxMIGJ1aWxkIik7IC8vJE5PTi1OTFMtMSQKIAogCXRyeSB7Ci0JCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5zY3J1YmJpbmdPdXRwdXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNGb3IoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOwotCQlzY3J1Yk91dHB1dEZvbGRlcigpOworCQlub3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuY2xlYW5pbmdPdXRwdXQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZGVsdGFQcm9jZXNzb3IuYWRkRm9yUmVmcmVzaChqYXZhQnVpbGRlci5qYXZhUHJvamVjdCk7CisJCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOworCQljbGVhbk91dHB1dEZvbGRlcnMoKTsKIAkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjFmKTsKIAogCQlub3RpZmllci5zdWJUYXNrKFV0aWwuYmluZCgiYnVpbGQuYW5hbHl6aW5nU291cmNlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3QgbG9jYXRpb25zID0gbmV3IEFycmF5TGlzdCgzMyk7Ci0JCUFycmF5TGlzdCB0eXBlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KDMzKTsKLQkJYWRkQWxsU291cmNlRmlsZXMobG9jYXRpb25zLCB0eXBlTmFtZXMpOworCQlBcnJheUxpc3Qgc291cmNlRmlsZXMgPSBuZXcgQXJyYXlMaXN0KDMzKTsKKwkJYWRkQWxsU291cmNlRmlsZXMoc291cmNlRmlsZXMpOwogCQlub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMTVmKTsKIAotCQlpZiAobG9jYXRpb25zLnNpemUoKSA+IDApIHsKLQkJCVN0cmluZ1tdIGFsbFNvdXJjZUZpbGVzID0gbmV3IFN0cmluZ1tsb2NhdGlvbnMuc2l6ZSgpXTsKLQkJCWxvY2F0aW9ucy50b0FycmF5KGFsbFNvdXJjZUZpbGVzKTsKLQkJCVN0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW3R5cGVOYW1lcy5zaXplKCldOwotCQkJdHlwZU5hbWVzLnRvQXJyYXkoaW5pdGlhbFR5cGVOYW1lcyk7CisJCWlmIChzb3VyY2VGaWxlcy5zaXplKCkgPiAwKSB7CisJCQlTb3VyY2VGaWxlW10gYWxsU291cmNlRmlsZXMgPSBuZXcgU291cmNlRmlsZVtzb3VyY2VGaWxlcy5zaXplKCldOworCQkJc291cmNlRmlsZXMudG9BcnJheShhbGxTb3VyY2VGaWxlcyk7CiAKIAkJCW5vdGlmaWVyLnNldFByb2dyZXNzUGVyQ29tcGlsYXRpb25Vbml0KDAuNzVmIC8gYWxsU291cmNlRmlsZXMubGVuZ3RoKTsKIAkJCXdvcmtRdWV1ZS5hZGRBbGwoYWxsU291cmNlRmlsZXMpOwotCQkJY29tcGlsZShhbGxTb3VyY2VGaWxlcywgaW5pdGlhbFR5cGVOYW1lcyk7CisJCQljb21waWxlKGFsbFNvdXJjZUZpbGVzKTsKIAkJfQorCisJCWlmIChqYXZhQnVpbGRlci5qYXZhUHJvamVjdC5oYXNDeWNsZU1hcmtlcigpKQorCQkJamF2YUJ1aWxkZXIubXVzdFByb3BhZ2F0ZVN0cnVjdHVyYWxDaGFuZ2VzKCk7CiAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCXRocm93IGludGVybmFsRXhjZXB0aW9uKGUpOwogCX0gZmluYWxseSB7CkBAIC01Niw5NyArNjAsMTg0IEBACiAJfQogfQogCi1wcm90ZWN0ZWQgdm9pZCBhZGRBbGxTb3VyY2VGaWxlcyhmaW5hbCBBcnJheUxpc3QgbG9jYXRpb25zLCBmaW5hbCBBcnJheUxpc3QgdHlwZU5hbWVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJZmluYWwgaW50IHNyY0ZvbGRlckxlbmd0aCA9IHNvdXJjZUZvbGRlcnNbaV0uZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0JCXNvdXJjZUZvbGRlcnNbaV0uYWNjZXB0KAotCQkJbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCWlmIChKYXZhQnVpbGRlci5KQVZBX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCQkJCQlTdHJpbmcgc291cmNlTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJbG9jYXRpb25zLmFkZChzb3VyY2VMb2NhdGlvbik7Ci0JCQkJCQkJdHlwZU5hbWVzLmFkZChzb3VyY2VMb2NhdGlvbi5zdWJzdHJpbmcoc3JjRm9sZGVyTGVuZ3RoLCBzb3VyY2VMb2NhdGlvbi5sZW5ndGgoKSAtIDUpKTsgLy8gbGVuZ3RoIG9mIC5qYXZhCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Citwcm90ZWN0ZWQgdm9pZCBhZGRBbGxTb3VyY2VGaWxlcyhmaW5hbCBBcnJheUxpc3Qgc291cmNlRmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJZmluYWwgQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJCWZpbmFsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gc291cmNlTG9jYXRpb24uZXhjbHVzaW9uUGF0dGVybnM7CisJCWZpbmFsIGJvb2xlYW4gaXNBbHNvUHJvamVjdCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5lcXVhbHMoamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QpOworCQlzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuYWNjZXB0KAorCQkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQkJCQlpZiAoZXhjbHVzaW9uUGF0dGVybnMgIT0gbnVsbCkgeworCQkJCQkJcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKKwkJCQkJCWlmIChVdGlsLmlzRXhjbHVkZWQocmVzb3VyY2UsIGV4Y2x1c2lvblBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlOwogCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKLQl9Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNjcnViT3V0cHV0Rm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWlmIChoYXNTZXBhcmF0ZU91dHB1dEZvbGRlcikgewotCQkvLyBvdXRwdXRQYXRoIGlzIG5vdCBvbiB0aGUgY2xhc3MgcGF0aCBzbyB3aXBlIGl0IGNsZWFuIHRoZW4gY29weSBleHRyYSByZXNvdXJjZXMgYmFjawotCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gb3V0cHV0Rm9sZGVyLm1lbWJlcnMoKTsgCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJbWVtYmVyc1tpXS5kZWxldGUoSVJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKLQkJY29weUV4dHJhUmVzb3VyY2VzQmFjaygpOwotCX0gZWxzZSB7Ci0JCS8vIG91dHB1dFBhdGggPT0gYSBzb3VyY2UgZm9sZGVyIHNvIGp1c3QgcmVtb3ZlIGNsYXNzIGZpbGVzCi0JCW91dHB1dEZvbGRlci5hY2NlcHQoCi0JCQluZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkJaWYgKEphdmFCdWlsZGVyLkNMQVNTX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JCQkJCQkJcmVzb3VyY2UuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQlub3RpZmllci5jaGVja0NhbmNlbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb3B5RXh0cmFSZXNvdXJjZXNCYWNrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCS8vIFdoZW4sIGlmIGV2ZXIsIGRvZXMgYSBidWlsZGVyIG5lZWQgdG8gY29weSByZXNvdXJjZXMgZmlsZXMgKG5vdCAuamF2YSBvciAuY2xhc3MpIGludG8gdGhlIG91dHB1dCBmb2xkZXI/Ci0JLy8gSWYgd2Ugd2lwZSB0aGUgb3V0cHV0IGZvbGRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWlsZCB0aGVuIGFsbCAnZXh0cmEnIHJlc291cmNlcyBtdXN0IGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlci4KLQotCWZpbmFsIElQYXRoIG91dHB1dFBhdGggPSBvdXRwdXRGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc291cmNlRm9sZGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQlJQ29udGFpbmVyIHNvdXJjZUZvbGRlciA9IHNvdXJjZUZvbGRlcnNbaV07Ci0JCWZpbmFsIElQYXRoIHNvdXJjZVBhdGggPSBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJZmluYWwgaW50IHNlZ21lbnRDb3VudCA9IHNvdXJjZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCXNvdXJjZUZvbGRlci5hY2NlcHQoCi0JCQluZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJc3dpdGNoKHJlc291cmNlLmdldFR5cGUoKSkgeworCQkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CiAJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJCWlmIChKYXZhQnVpbGRlci5KQVZBX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuQ0xBU1NfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmIChqYXZhQnVpbGRlci5maWx0ZXJSZXNvdXJjZShyZXNvdXJjZSkpIHJldHVybiBmYWxzZTsKLQotCQkJCQkJCUlQYXRoIHBhcnRpYWxQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCk7Ci0JCQkJCQkJSVJlc291cmNlIGNvcGllZFJlc291cmNlID0gb3V0cHV0Rm9sZGVyLmdldEZpbGUocGFydGlhbFBhdGgpOwotCQkJCQkJCWlmIChjb3BpZWRSZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQkJCQljcmVhdGVFcnJvckZvcihyZXNvdXJjZSwgVXRpbC5iaW5kKCJidWlsZC5kdXBsaWNhdGVSZXNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlc291cmNlLmNvcHkoY29waWVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCQkJCQkJY29waWVkUmVzb3VyY2Uuc2V0RGVyaXZlZCh0cnVlKTsKKwkJCQkJCQlpZiAoVXRpbC5pc0phdmFGaWxlTmFtZShwcm94eS5nZXROYW1lKCkpKSB7CisJCQkJCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKQorCQkJCQkJCQkJcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKKwkJCQkJCQkJc291cmNlRmlsZXMuYWRkKG5ldyBTb3VyY2VGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHNvdXJjZUxvY2F0aW9uLCBlbmNvZGluZykpOwogCQkJCQkJCX0KIAkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhvdXRwdXRQYXRoKSkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhzb3VyY2VQYXRoKSkgcmV0dXJuIHRydWU7Ci0JCQkJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlclJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuIGZhbHNlOwotCi0JCQkJCQkJZ2V0T3V0cHV0Rm9sZGVyKHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpKTsKKwkJCQkJCQlpZiAoaXNBbHNvUHJvamVjdCAmJiBpc0V4Y2x1ZGVkRnJvbVByb2plY3QocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkpKSByZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQotCQkJfQorCQkJfSwKKwkJCUlSZXNvdXJjZS5OT05FCiAJCSk7CisJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJfQogfQogCitwcm90ZWN0ZWQgdm9pZCBjbGVhbk91dHB1dEZvbGRlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJYm9vbGVhbiBkZWxldGVBbGwgPSBKYXZhQ29yZS5DTEVBTi5lcXVhbHMoCisJCWphdmFCdWlsZGVyLmphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfQ0xFQU5fT1VUUFVUX0ZPTERFUiwgdHJ1ZSkpOworCWlmIChkZWxldGVBbGwpIHsKKwkJQXJyYXlMaXN0IHZpc2l0ZWQgPSBuZXcgQXJyYXlMaXN0KHNvdXJjZUxvY2F0aW9ucy5sZW5ndGgpOworCQlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5jbGVhbmluZ091dHB1dCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJCQlpZiAoc291cmNlTG9jYXRpb24uaGFzSW5kZXBlbmRlbnRPdXRwdXRGb2xkZXIpIHsKKwkJCQlJQ29udGFpbmVyIG91dHB1dEZvbGRlciA9IHNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcjsKKwkJCQlpZiAoIXZpc2l0ZWQuY29udGFpbnMob3V0cHV0Rm9sZGVyKSkgeworCQkJCQl2aXNpdGVkLmFkZChvdXRwdXRGb2xkZXIpOworCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gb3V0cHV0Rm9sZGVyLm1lbWJlcnMoKTsgCisJCQkJCWZvciAoaW50IGogPSAwLCBtID0gbWVtYmVycy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJCQltZW1iZXJzW2pdLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCX0KKwkJCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQkJCWNvcHlFeHRyYVJlc291cmNlc0JhY2soc291cmNlTG9jYXRpb24sIGRlbGV0ZUFsbCk7CisJCQl9IGVsc2UgeworCQkJCWJvb2xlYW4gaXNPdXRwdXRGb2xkZXIgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZXF1YWxzKHNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcik7CisJCQkJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPQorCQkJCQlpc091dHB1dEZvbGRlcgorCQkJCQkJPyBzb3VyY2VMb2NhdGlvbi5leGNsdXNpb25QYXR0ZXJucworCQkJCQkJOiBudWxsOyAvLyBpZ25vcmUgZXhjbHVzaW9uUGF0dGVybnMgaWYgb3V0cHV0IGZvbGRlciA9PSBhbm90aGVyIHNvdXJjZSBmb2xkZXIuLi4gbm90IHRoaXMgb25lCisJCQkJc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyLmFjY2VwdCgKKwkJCQkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJCQkJCQlpZiAoZXhjbHVzaW9uUGF0dGVybnMgIT0gbnVsbCkgeworCQkJCQkJCQlyZXNvdXJjZSA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOworCQkJCQkJCQlpZiAoVXRpbC5pc0V4Y2x1ZGVkKHJlc291cmNlLCBleGNsdXNpb25QYXR0ZXJucykpIHJldHVybiBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgeworCQkJCQkJCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQkJaWYgKHJlc291cmNlID09IG51bGwpCisJCQkJCQkJCQkJcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKKwkJCQkJCQkJCXJlc291cmNlLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOworCQkJCQkJCQl9CisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfSwKKwkJCQkJSVJlc291cmNlLk5PTkUKKwkJCQkpOworCQkJCWlmICghaXNPdXRwdXRGb2xkZXIpIHsKKwkJCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKKwkJCQkJY29weVBhY2thZ2VzKHNvdXJjZUxvY2F0aW9uKTsKKwkJCQl9CisJCQl9CisJCQlub3RpZmllci5jaGVja0NhbmNlbCgpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBzb3VyY2VMb2NhdGlvbiA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwkJCWlmIChzb3VyY2VMb2NhdGlvbi5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlcikKKwkJCQljb3B5RXh0cmFSZXNvdXJjZXNCYWNrKHNvdXJjZUxvY2F0aW9uLCBkZWxldGVBbGwpOworCQkJZWxzZSBpZiAoIXNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5lcXVhbHMoc291cmNlTG9jYXRpb24uYmluYXJ5Rm9sZGVyKSkKKwkJCQljb3B5UGFja2FnZXMoc291cmNlTG9jYXRpb24pOyAvLyBvdXRwdXQgZm9sZGVyIGlzIGRpZmZlcmVudCBmcm9tIHNvdXJjZSBmb2xkZXIKKwkJCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CisJCX0KKwl9Cit9CisKK3Byb3RlY3RlZCB2b2lkIGNvcHlFeHRyYVJlc291cmNlc0JhY2soQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24sIGZpbmFsIGJvb2xlYW4gZGVsZXRlZEFsbCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIFdoZW4sIGlmIGV2ZXIsIGRvZXMgYSBidWlsZGVyIG5lZWQgdG8gY29weSByZXNvdXJjZXMgZmlsZXMgKG5vdCAuamF2YSBvciAuY2xhc3MpIGludG8gdGhlIG91dHB1dCBmb2xkZXI/CisJLy8gSWYgd2Ugd2lwZSB0aGUgb3V0cHV0IGZvbGRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWlsZCB0aGVuIGFsbCAnZXh0cmEnIHJlc291cmNlcyBtdXN0IGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlci4KKworCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5jb3B5aW5nUmVzb3VyY2VzIikpOyAvLyROT04tTkxTLTEkCisJZmluYWwgaW50IHNlZ21lbnRDb3VudCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOworCWZpbmFsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zID0gc291cmNlTG9jYXRpb24uZXhjbHVzaW9uUGF0dGVybnM7CisJZmluYWwgSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSBzb3VyY2VMb2NhdGlvbi5iaW5hcnlGb2xkZXI7CisJZmluYWwgYm9vbGVhbiBpc0Fsc29Qcm9qZWN0ID0gc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmVxdWFscyhqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdCk7CisJc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmFjY2VwdCgKKwkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CisJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSB8fCBVdGlsLmlzQ2xhc3NGaWxlTmFtZShwcm94eS5nZXROYW1lKCkpKSByZXR1cm4gZmFsc2U7CisKKwkJCQkJCXJlc291cmNlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7CisJCQkJCQlpZiAoamF2YUJ1aWxkZXIuZmlsdGVyRXh0cmFSZXNvdXJjZShyZXNvdXJjZSkpIHJldHVybiBmYWxzZTsKKwkJCQkJCWlmIChleGNsdXNpb25QYXR0ZXJucyAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgZXhjbHVzaW9uUGF0dGVybnMpKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCQkJSVBhdGggcGFydGlhbFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KTsKKwkJCQkJCUlSZXNvdXJjZSBjb3BpZWRSZXNvdXJjZSA9IG91dHB1dEZvbGRlci5nZXRGaWxlKHBhcnRpYWxQYXRoKTsKKwkJCQkJCWlmIChjb3BpZWRSZXNvdXJjZS5leGlzdHMoKSkgeworCQkJCQkJCWlmIChkZWxldGVkQWxsKSB7CisJCQkJCQkJCWNyZWF0ZUVycm9yRm9yKHJlc291cmNlLCBVdGlsLmJpbmQoImJ1aWxkLmR1cGxpY2F0ZVJlc291cmNlIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQkJY29waWVkUmVzb3VyY2UuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7IC8vIGxhc3Qgb25lIHdpbnMKKwkJCQkJCX0KKwkJCQkJCXJlc291cmNlLmNvcHkoY29waWVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJCQkJCWNvcGllZFJlc291cmNlLnNldERlcml2ZWQodHJ1ZSk7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CisJCQkJCQlyZXNvdXJjZSA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOworCQkJCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlckV4dHJhUmVzb3VyY2UocmVzb3VyY2UpKSByZXR1cm4gZmFsc2U7CisJCQkJCQlpZiAoZXhjbHVzaW9uUGF0dGVybnMgIT0gbnVsbCAmJiBVdGlsLmlzRXhjbHVkZWQocmVzb3VyY2UsIGV4Y2x1c2lvblBhdHRlcm5zKSkKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQkJCUlQYXRoIGZvbGRlclBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOworCQkJCQkJaWYgKGlzQWxzb1Byb2plY3QgJiYgaXNFeGNsdWRlZEZyb21Qcm9qZWN0KGZvbGRlclBhdGgpKSByZXR1cm4gZmFsc2U7IC8vIHRoZSBzb3VyY2VGb2xkZXIgPT0gcHJvamVjdAorCQkJCQkJY3JlYXRlRm9sZGVyKGZvbGRlclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLCBvdXRwdXRGb2xkZXIpOworCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSwKKwkJSVJlc291cmNlLk5PTkUKKwkpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjb3B5UGFja2FnZXMoQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnkgc291cmNlTG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlmaW5hbCBpbnQgc2VnbWVudENvdW50ID0gc291cmNlTG9jYXRpb24uc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7CisJZmluYWwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMgPSBzb3VyY2VMb2NhdGlvbi5leGNsdXNpb25QYXR0ZXJuczsKKwlmaW5hbCBJQ29udGFpbmVyIG91dHB1dEZvbGRlciA9IHNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcjsKKwlmaW5hbCBib29sZWFuIGlzQWxzb1Byb2plY3QgPSBzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZXF1YWxzKGphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0KTsKKwlzb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuYWNjZXB0KAorCQluZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CisJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7CisJCQkJCQlpZiAoamF2YUJ1aWxkZXIuZmlsdGVyRXh0cmFSZXNvdXJjZShyZXNvdXJjZSkpIHJldHVybiBmYWxzZTsKKwkJCQkJCWlmIChleGNsdXNpb25QYXR0ZXJucyAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgZXhjbHVzaW9uUGF0dGVybnMpKQorCQkJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCQkJSVBhdGggZm9sZGVyUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CisJCQkJCQlpZiAoaXNBbHNvUHJvamVjdCAmJiBpc0V4Y2x1ZGVkRnJvbVByb2plY3QoZm9sZGVyUGF0aCkpIHJldHVybiBmYWxzZTsgLy8gdGhlIHNvdXJjZUZvbGRlciA9PSBwcm9qZWN0CisJCQkJCQljcmVhdGVGb2xkZXIoZm9sZGVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCksIG91dHB1dEZvbGRlcik7CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9LAorCQlJUmVzb3VyY2UuTk9ORQorCSk7Cit9CisKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuICJiYXRjaCBpbWFnZSBidWlsZGVyIGZvcjpcblx0bmV3IHN0YXRlOiAiICsgbmV3U3RhdGU7IC8vJE5PTi1OTFMtMSQKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0J1aWxkTm90aWZpZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQnVpbGROb3RpZmllci5qYXZhCmluZGV4IDM5NDBkN2EuLjE0Zjk2NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQnVpbGROb3RpZmllci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQnVpbGROb3RpZmllci5qYXZhCkBAIC0xLDI3ICsxLDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogCiBwdWJsaWMgY2xhc3MgQnVpbGROb3RpZmllciB7CiAKIHByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci1wcm90ZWN0ZWQgaW50IHJvb3RQYXRoTGVuZ3RoOwogcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsbGluZzsKIHByb3RlY3RlZCBmbG9hdCBwZXJjZW50Q29tcGxldGU7CiBwcm90ZWN0ZWQgZmxvYXQgcHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQ7CkBAIC0zMywyMyArMzEsMjUgQEAKIHByb3RlY3RlZCBpbnQgdG90YWxXb3JrOwogcHJvdGVjdGVkIFN0cmluZyBwcmV2aW91c1N1YnRhc2s7CiAKK3B1YmxpYyBzdGF0aWMgaW50IE5ld0Vycm9yQ291bnQgPSAwOworcHVibGljIHN0YXRpYyBpbnQgRml4ZWRFcnJvckNvdW50ID0gMDsKK3B1YmxpYyBzdGF0aWMgaW50IE5ld1dhcm5pbmdDb3VudCA9IDA7CitwdWJsaWMgc3RhdGljIGludCBGaXhlZFdhcm5pbmdDb3VudCA9IDA7CisKK3B1YmxpYyBzdGF0aWMgdm9pZCByZXNldFByb2JsZW1Db3VudGVycygpIHsKKwlOZXdFcnJvckNvdW50ID0gMDsKKwlGaXhlZEVycm9yQ291bnQgPSAwOworCU5ld1dhcm5pbmdDb3VudCA9IDA7CisJRml4ZWRXYXJuaW5nQ291bnQgPSAwOworfQorCiBwdWJsaWMgQnVpbGROb3RpZmllcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKIAl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCXRyeSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJbG9jYXRpb24gPSBwcm9qZWN0LmdldFBhcmVudCgpLmdldExvY2F0aW9uKCk7IC8vIGRlZmF1bHQgd29ya3NwYWNlIGxvY2F0aW9uCi0JCWVsc2UgaWYgKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb24ubGFzdFNlZ21lbnQoKSkpCi0JCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlbW92ZUxhc3RTZWdtZW50cygxKTsgLy8gd2FudCB0byBzaG93IHByb2plY3QgbmFtZSBpZiBwb3NzaWJsZQotCQl0aGlzLnJvb3RQYXRoTGVuZ3RoID0gbG9jYXRpb24uYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpLmxlbmd0aCgpOwotCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXRoaXMucm9vdFBhdGhMZW5ndGggPSAwOwotCX0KIAl0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTsKLQl0aGlzLm5ld0Vycm9yQ291bnQgPSAwOwotCXRoaXMuZml4ZWRFcnJvckNvdW50ID0gMDsKLQl0aGlzLm5ld1dhcm5pbmdDb3VudCA9IDA7Ci0JdGhpcy5maXhlZFdhcm5pbmdDb3VudCA9IDA7CisJdGhpcy5uZXdFcnJvckNvdW50ID0gTmV3RXJyb3JDb3VudDsKKwl0aGlzLmZpeGVkRXJyb3JDb3VudCA9IEZpeGVkRXJyb3JDb3VudDsKKwl0aGlzLm5ld1dhcm5pbmdDb3VudCA9IE5ld1dhcm5pbmdDb3VudDsKKwl0aGlzLmZpeGVkV2FybmluZ0NvdW50ID0gRml4ZWRXYXJuaW5nQ291bnQ7CiAJdGhpcy53b3JrRG9uZSA9IDA7CiAJdGhpcy50b3RhbFdvcmsgPSAxMDAwMDAwOwogfQpAQCAtNTcsMTIgKzU3LDggQEAKIC8qKgogICogTm90aWZpY2F0aW9uIGJlZm9yZSBhIGNvbXBpbGUgdGhhdCBhIHVuaXQgaXMgYWJvdXQgdG8gYmUgY29tcGlsZWQuCiAgKi8KLXB1YmxpYyB2b2lkIGFib3V0VG9Db21waWxlKElDb21waWxhdGlvblVuaXQgdW5pdCkgewotCVN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZyh1bml0LmdldEZpbGVOYW1lKCkpOwotCW1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQlpbnQgZW5kID0gbWVzc2FnZS5sYXN0SW5kZXhPZignLycpOwotCW1lc3NhZ2UgPSBVdGlsLmJpbmQoImJ1aWxkLmNvbXBpbGluZyIsIC8vJE5PTi1OTFMtMSQKLQkJbWVzc2FnZS5zdWJzdHJpbmcocm9vdFBhdGhMZW5ndGgsIGVuZCA8PSByb290UGF0aExlbmd0aCA/IG1lc3NhZ2UubGVuZ3RoKCkgOiBlbmQpKTsKK3B1YmxpYyB2b2lkIGFib3V0VG9Db21waWxlKFNvdXJjZUZpbGUgdW5pdCkgeworCVN0cmluZyBtZXNzYWdlID0gVXRpbC5iaW5kKCJidWlsZC5jb21waWxpbmciLCB1bml0LnJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJc3ViVGFzayhtZXNzYWdlKTsKIH0KIApAQCAtOTcsMTggKzkzLDE5IEBACiAvKioKICAqIE5vdGlmaWNhdGlvbiB3aGlsZSB3aXRoaW4gYSBjb21waWxlIHRoYXQgYSB1bml0IGhhcyBmaW5pc2hlZCBiZWluZyBjb21waWxlZC4KICAqLwotcHVibGljIHZvaWQgY29tcGlsZWQoSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB7Ci0JU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKHVuaXQuZ2V0RmlsZU5hbWUoKSk7Ci0JbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXFwnLCAnLycpOwotCWludCBlbmQgPSBtZXNzYWdlLmxhc3RJbmRleE9mKCcvJyk7Ci0JbWVzc2FnZSA9IFV0aWwuYmluZCgiYnVpbGQuY29tcGlsaW5nIiwgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlLnN1YnN0cmluZyhyb290UGF0aExlbmd0aCwgZW5kIDw9IHJvb3RQYXRoTGVuZ3RoID8gbWVzc2FnZS5sZW5ndGgoKSA6IGVuZCkpOworcHVibGljIHZvaWQgY29tcGlsZWQoU291cmNlRmlsZSB1bml0KSB7CisJU3RyaW5nIG1lc3NhZ2UgPSBVdGlsLmJpbmQoImJ1aWxkLmNvbXBpbGluZyIsIHVuaXQucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAlzdWJUYXNrKG1lc3NhZ2UpOwogCXVwZGF0ZVByb2dyZXNzRGVsdGEocHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQpOwogCWNoZWNrQ2FuY2VsV2l0aGluQ29tcGlsZXIoKTsKIH0KIAogcHVibGljIHZvaWQgZG9uZSgpIHsKKwlOZXdFcnJvckNvdW50ID0gdGhpcy5uZXdFcnJvckNvdW50OworCUZpeGVkRXJyb3JDb3VudCA9IHRoaXMuZml4ZWRFcnJvckNvdW50OworCU5ld1dhcm5pbmdDb3VudCA9IHRoaXMubmV3V2FybmluZ0NvdW50OworCUZpeGVkV2FybmluZ0NvdW50ID0gdGhpcy5maXhlZFdhcm5pbmdDb3VudDsKKwogCXVwZGF0ZVByb2dyZXNzKDEuMGYpOwogCXN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5kb25lIikpOyAvLyROT04tTkxTLTEkCiAJaWYgKG1vbml0b3IgIT0gbnVsbCkKQEAgLTEyMywyMiArMTIwLDU4IEBACiAJaW50IG51bU5ldyA9IG5ld0Vycm9yQ291bnQgKyBuZXdXYXJuaW5nQ291bnQ7CiAJaW50IG51bUZpeGVkID0gZml4ZWRFcnJvckNvdW50ICsgZml4ZWRXYXJuaW5nQ291bnQ7CiAJaWYgKG51bU5ldyA9PSAwICYmIG51bUZpeGVkID09IDApIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCWlmIChudW1GaXhlZCA9PSAwKQotCQlyZXR1cm4gJygnICsgKG51bU5ldyA9PSAxCi0JCQk/IFV0aWwuYmluZCgiYnVpbGQub25lUHJvYmxlbUZvdW5kIiwgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkgLy8kTk9OLU5MUy0xJAotCQkJOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRm91bmQiLCBTdHJpbmcudmFsdWVPZihudW1OZXcpKSkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQlpZiAobnVtTmV3ID09IDApCi0JCXJldHVybiAnKCcgKyAobnVtRml4ZWQgPT0gMQotCQkJPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1GaXhlZCIsIFN0cmluZy52YWx1ZU9mKG51bUZpeGVkKSkgLy8kTk9OLU5MUy0xJAotCQkJOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRml4ZWQiLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCXJldHVybgotCQknKCcgKyAobnVtRml4ZWQgPT0gMQotCQkJPyBVdGlsLmJpbmQoImJ1aWxkLm9uZVByb2JsZW1GaXhlZCIsIFN0cmluZy52YWx1ZU9mKG51bUZpeGVkKSkgLy8kTk9OLU5MUy0xJAotCQkJOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRml4ZWQiLCBTdHJpbmcudmFsdWVPZihudW1GaXhlZCkpKSAvLyROT04tTkxTLTEkCi0JCSsgIiwgIiAvLyROT04tTkxTLTEkCi0JCSsgKG51bU5ldyA9PSAxCi0JCQk/IFV0aWwuYmluZCgiYnVpbGQub25lUHJvYmxlbUZvdW5kIiwgU3RyaW5nLnZhbHVlT2YobnVtTmV3KSkgLy8kTk9OLU5MUy0xJAotCQkJOiBVdGlsLmJpbmQoImJ1aWxkLnByb2JsZW1zRm91bmQiLCBTdHJpbmcudmFsdWVPZihudW1OZXcpKSkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKKworCWJvb2xlYW4gZGlzcGxheUJvdGggPSBudW1OZXcgPiAwICYmIG51bUZpeGVkID4gMDsKKwlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJ1ZmZlci5hcHBlbmQoJygnKTsKKwlpZiAobnVtTmV3ID4gMCkgeworCQkvLyAoRm91bmQgeCBlcnJvcnMgKyB5IHdhcm5pbmdzKQorCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiYnVpbGQuZm91bmRIZWFkZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgnICcpOworCQlpZiAoZGlzcGxheUJvdGggfHwgbmV3RXJyb3JDb3VudCA+IDApIHsKKwkJCWlmIChuZXdFcnJvckNvdW50ID09IDEpCisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImJ1aWxkLm9uZUVycm9yIikpOyAvLyROT04tTkxTLTEkCisJCQllbHNlCisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImJ1aWxkLm11bHRpcGxlRXJyb3JzIiwgU3RyaW5nLnZhbHVlT2YobmV3RXJyb3JDb3VudCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGRpc3BsYXlCb3RoIHx8IG5ld1dhcm5pbmdDb3VudCA+IDApCisJCQkJYnVmZmVyLmFwcGVuZCgiICsgIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoZGlzcGxheUJvdGggfHwgbmV3V2FybmluZ0NvdW50ID4gMCkgeworCQkJaWYgKG5ld1dhcm5pbmdDb3VudCA9PSAxKQorCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJidWlsZC5vbmVXYXJuaW5nIikpOyAvLyROT04tTkxTLTEkCisJCQllbHNlCisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImJ1aWxkLm11bHRpcGxlV2FybmluZ3MiLCBTdHJpbmcudmFsdWVPZihuZXdXYXJuaW5nQ291bnQpKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAobnVtRml4ZWQgPiAwKQorCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlpZiAobnVtRml4ZWQgPiAwKSB7CisJCS8vIChGaXhlZCB4IGVycm9ycyArIHkgd2FybmluZ3MpIG9yIChGb3VuZCB4IGVycm9ycyArIHkgd2FybmluZ3MsIEZpeGVkIHggKyB5KQorCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiYnVpbGQuZml4ZWRIZWFkZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZCgnICcpOworCQlpZiAoZGlzcGxheUJvdGgpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZml4ZWRFcnJvckNvdW50KSk7CisJCQlidWZmZXIuYXBwZW5kKCIgKyAiKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihmaXhlZFdhcm5pbmdDb3VudCkpOworCQl9IGVsc2UgeworCQkJaWYgKGZpeGVkRXJyb3JDb3VudCA+IDApIHsKKwkJCQlpZiAoZml4ZWRFcnJvckNvdW50ID09IDEpCisJCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJidWlsZC5vbmVFcnJvciIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWVsc2UKKwkJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImJ1aWxkLm11bHRpcGxlRXJyb3JzIiwgU3RyaW5nLnZhbHVlT2YoZml4ZWRFcnJvckNvdW50KSkpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGZpeGVkV2FybmluZ0NvdW50ID4gMCkKKwkJCQkJYnVmZmVyLmFwcGVuZCgiICsgIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXhlZFdhcm5pbmdDb3VudCA+IDApIHsKKwkJCQlpZiAoZml4ZWRXYXJuaW5nQ291bnQgPT0gMSkKKwkJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImJ1aWxkLm9uZVdhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQllbHNlCisJCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJidWlsZC5tdWx0aXBsZVdhcm5pbmdzIiwgU3RyaW5nLnZhbHVlT2YoZml4ZWRXYXJuaW5nQ291bnQpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKwlidWZmZXIuYXBwZW5kKCcpJyk7CisJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogfQogCiAvKioKQEAgLTE3MSw3ICsyMDQsNyBAQAogfQogCiBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtQ291bnRzKElQcm9ibGVtW10gbmV3UHJvYmxlbXMpIHsKLQlmb3IgKGludCBpID0gMCwgbmV3U2l6ZSA9IG5ld1Byb2JsZW1zLmxlbmd0aDsgaSA8IG5ld1NpemU7ICsraSkKKwlmb3IgKGludCBpID0gMCwgbCA9IG5ld1Byb2JsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJaWYgKG5ld1Byb2JsZW1zW2ldLmlzRXJyb3IoKSkgbmV3RXJyb3JDb3VudCsrOyBlbHNlIG5ld1dhcm5pbmdDb3VudCsrOwogfQogCkBAIC0xODEsMTMgKzIxNCwxNCBAQAogICovCiBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtQ291bnRzKElNYXJrZXJbXSBvbGRQcm9ibGVtcywgSVByb2JsZW1bXSBuZXdQcm9ibGVtcykgewogCWlmIChuZXdQcm9ibGVtcyAhPSBudWxsKSB7Ci0JCW5leHQgOiBmb3IgKGludCBpID0gMCwgbmV3U2l6ZSA9IG5ld1Byb2JsZW1zLmxlbmd0aDsgaSA8IG5ld1NpemU7ICsraSkgeworCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBuZXdQcm9ibGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCUlQcm9ibGVtIG5ld1Byb2JsZW0gPSBuZXdQcm9ibGVtc1tpXTsKKwkJCWlmIChuZXdQcm9ibGVtLmdldElEKCkgPT0gSVByb2JsZW0uVGFzaykgY29udGludWU7IC8vIHNraXAgdGFzawogCQkJYm9vbGVhbiBpc0Vycm9yID0gbmV3UHJvYmxlbS5pc0Vycm9yKCk7CiAJCQlTdHJpbmcgbWVzc2FnZSA9IG5ld1Byb2JsZW0uZ2V0TWVzc2FnZSgpOwogCiAJCQlpZiAob2xkUHJvYmxlbXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwLCBvbGRTaXplID0gb2xkUHJvYmxlbXMubGVuZ3RoOyBqIDwgb2xkU2l6ZTsgKytqKSB7CisJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBvbGRQcm9ibGVtcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCQkJSU1hcmtlciBwYiA9IG9sZFByb2JsZW1zW2pdOwogCQkJCQlpZiAocGIgPT0gbnVsbCkgY29udGludWU7IC8vIGFscmVhZHkgbWF0Y2hlZCB1cCB3aXRoIGEgbmV3IHByb2JsZW0KIAkJCQkJYm9vbGVhbiB3YXNFcnJvciA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1IKQEAgLTIwMiw3ICsyMzYsNyBAQAogCQl9CiAJfQogCWlmIChvbGRQcm9ibGVtcyAhPSBudWxsKSB7Ci0JCW5leHQgOiBmb3IgKGludCBpID0gMCwgb2xkU2l6ZSA9IG9sZFByb2JsZW1zLmxlbmd0aDsgaSA8IG9sZFNpemU7ICsraSkgeworCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBvbGRQcm9ibGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCUlNYXJrZXIgb2xkUHJvYmxlbSA9IG9sZFByb2JsZW1zW2ldOwogCQkJaWYgKG9sZFByb2JsZW0gPT0gbnVsbCkgY29udGludWUgbmV4dDsgLy8gYWxyZWFkeSBtYXRjaGVkIHVwIHdpdGggYSBuZXcgcHJvYmxlbQogCQkJYm9vbGVhbiB3YXNFcnJvciA9IElNYXJrZXIuU0VWRVJJVFlfRVJST1IKQEAgLTIxMCw4ICsyNDQsOSBAQAogCQkJU3RyaW5nIG1lc3NhZ2UgPSBvbGRQcm9ibGVtLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKTsgLy8kTk9OLU5MUy0xJAogCiAJCQlpZiAobmV3UHJvYmxlbXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwLCBuZXdTaXplID0gbmV3UHJvYmxlbXMubGVuZ3RoOyBqIDwgbmV3U2l6ZTsgKytqKSB7CisJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBuZXdQcm9ibGVtcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCQkJSVByb2JsZW0gcGIgPSBuZXdQcm9ibGVtc1tqXTsKKwkJCQkJaWYgKHBiLmdldElEKCkgPT0gSVByb2JsZW0uVGFzaykgY29udGludWU7IC8vIHNraXAgdGFzawogCQkJCQlpZiAod2FzRXJyb3IgPT0gcGIuaXNFcnJvcigpICYmIG1lc3NhZ2UuZXF1YWxzKHBiLmdldE1lc3NhZ2UoKSkpCiAJCQkJCQljb250aW51ZSBuZXh0OwogCQkJCX0KQEAgLTIzOCw0ICsyNzMsNCBAQAogcHVibGljIHZvaWQgdXBkYXRlUHJvZ3Jlc3NEZWx0YShmbG9hdCBwZXJjZW50V29ya2VkKSB7CiAJdXBkYXRlUHJvZ3Jlc3MocGVyY2VudENvbXBsZXRlICsgcGVyY2VudFdvcmtlZCk7CiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoRGlyZWN0b3J5LmphdmEKaW5kZXggYTU0ZmNiYS4uNGIyMjQyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aERpcmVjdG9yeS5qYXZhCkBAIC0xLDM1ICsxLDQxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOwotCi1pbXBvcnQgamF2YS5pby4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIAogY2xhc3MgQ2xhc3NwYXRoRGlyZWN0b3J5IGV4dGVuZHMgQ2xhc3NwYXRoTG9jYXRpb24gewogCi1TdHJpbmcgYmluYXJ5UGF0aDsgLy8gaW5jbHVkZXMgLmNsYXNzIGZpbGVzIGZvciBhIHNpbmdsZSBkaXJlY3RvcnkKK0lDb250YWluZXIgYmluYXJ5Rm9sZGVyOyAvLyBpbmNsdWRlcyAuY2xhc3MgZmlsZXMgZm9yIGEgc2luZ2xlIGRpcmVjdG9yeQorYm9vbGVhbiBpc091dHB1dEZvbGRlcjsKK1N0cmluZyBiaW5hcnlMb2NhdGlvbjsKIFNpbXBsZUxvb2t1cFRhYmxlIGRpcmVjdG9yeUNhY2hlOwogU3RyaW5nW10gbWlzc2luZ1BhY2thZ2VIb2xkZXIgPSBuZXcgU3RyaW5nWzFdOwogCi1DbGFzc3BhdGhEaXJlY3RvcnkoU3RyaW5nIGJpbmFyeVBhdGgpIHsKLQl0aGlzLmJpbmFyeVBhdGggPSBiaW5hcnlQYXRoOwotCWlmICghYmluYXJ5UGF0aC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCXRoaXMuYmluYXJ5UGF0aCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKK0NsYXNzcGF0aERpcmVjdG9yeShJQ29udGFpbmVyIGJpbmFyeUZvbGRlciwgYm9vbGVhbiBpc091dHB1dEZvbGRlcikgeworCXRoaXMuYmluYXJ5Rm9sZGVyID0gYmluYXJ5Rm9sZGVyOworCXRoaXMuaXNPdXRwdXRGb2xkZXIgPSBpc091dHB1dEZvbGRlcjsKKwlJUGF0aCBsb2NhdGlvbiA9IGJpbmFyeUZvbGRlci5nZXRMb2NhdGlvbigpOworCXRoaXMuYmluYXJ5TG9jYXRpb24gPSBsb2NhdGlvbiAhPSBudWxsID8gbG9jYXRpb24uYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKIAogCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7CiB9CiAKLXZvaWQgY2xlYW51cCgpIHsKK3B1YmxpYyB2b2lkIGNsZWFudXAoKSB7CiAJdGhpcy5kaXJlY3RvcnlDYWNoZSA9IG51bGw7CiB9CiAKQEAgLTM4LDM0ICs0NCwzMCBAQAogCWlmIChkaXJMaXN0ID09IG1pc3NpbmdQYWNrYWdlSG9sZGVyKSByZXR1cm4gbnVsbDsgLy8gcGFja2FnZSBleGlzdHMgaW4gYW5vdGhlciBjbGFzc3BhdGggZGlyZWN0b3J5IG9yIGphcgogCWlmIChkaXJMaXN0ICE9IG51bGwpIHJldHVybiBkaXJMaXN0OwogCi0JRmlsZSBkaXIgPSBuZXcgRmlsZShiaW5hcnlQYXRoICsgcXVhbGlmaWVkUGFja2FnZU5hbWUpOwotCW5vdEZvdW5kIDogaWYgKGRpciAhPSBudWxsICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCS8vIG11c3QgcHJvdGVjdCBhZ2FpbnN0IGEgY2FzZSBpbnNlbnNpdGl2ZSBGaWxlIGNhbGwKLQkJLy8gd2FsayB0aGUgcXVhbGlmaWVkUGFja2FnZU5hbWUgYmFja3dhcmRzIGxvb2tpbmcgZm9yIGFuIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSAnLycKLQkJaW50IGluZGV4ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGVuZ3RoKCk7Ci0JCWludCBsYXN0ID0gcXVhbGlmaWVkUGFja2FnZU5hbWUubGFzdEluZGV4T2YoJy8nKTsKLQkJd2hpbGUgKC0taW5kZXggPiBsYXN0ICYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UocXVhbGlmaWVkUGFja2FnZU5hbWUuY2hhckF0KGluZGV4KSkpIHt9Ci0JCWlmIChpbmRleCA+IGxhc3QpIHsKLQkJCWlmIChsYXN0ID09IC0xKSB7Ci0JCQkJaWYgKCFkb2VzRmlsZUV4aXN0KHF1YWxpZmllZFBhY2thZ2VOYW1lLCAiIikpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCWJyZWFrIG5vdEZvdW5kOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWRQYWNrYWdlTmFtZS5zdWJzdHJpbmcobGFzdCArIDEpOwotCQkJCVN0cmluZyBwYXJlbnRQYWNrYWdlID0gcXVhbGlmaWVkUGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3QpOwotCQkJCWlmICghZG9lc0ZpbGVFeGlzdChwYWNrYWdlTmFtZSwgcGFyZW50UGFja2FnZSkpCi0JCQkJCWJyZWFrIG5vdEZvdW5kOworCXRyeSB7CisJCUlSZXNvdXJjZSBjb250YWluZXIgPSBiaW5hcnlGb2xkZXIuZmluZE1lbWJlcihxdWFsaWZpZWRQYWNrYWdlTmFtZSk7IC8vIHRoaXMgaXMgYSBjYXNlLXNlbnNpdGl2ZSBjaGVjaworCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgY29udGFpbmVyKS5tZW1iZXJzKCk7CisJCQlkaXJMaXN0ID0gbmV3IFN0cmluZ1ttZW1iZXJzLmxlbmd0aF07CisJCQlpbnQgaW5kZXggPSAwOworCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBtZW1iZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCUlSZXNvdXJjZSBtID0gbWVtYmVyc1tpXTsKKwkJCQlpZiAobS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgVXRpbC5pc0NsYXNzRmlsZU5hbWUobS5nZXROYW1lKCkpKQorCQkJCQkvLyBhZGQgZXhjbHVzaW9uIHBhdHRlcm4gY2hlY2sgaGVyZSBpZiB3ZSB3YW50IHRvIGhpZGUgLmNsYXNzIGZpbGVzCisJCQkJCWRpckxpc3RbaW5kZXgrK10gPSBtLmdldE5hbWUoKTsKIAkJCX0KKwkJCWlmIChpbmRleCA8IGRpckxpc3QubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoZGlyTGlzdCwgMCwgZGlyTGlzdCA9IG5ldyBTdHJpbmdbaW5kZXhdLCAwLCBpbmRleCk7CisJCQlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIGRpckxpc3QpOworCQkJcmV0dXJuIGRpckxpc3Q7CiAJCX0KLQkJaWYgKChkaXJMaXN0ID0gZGlyLmxpc3QoKSkgPT0gbnVsbCkKLQkJCWRpckxpc3QgPSBuZXcgU3RyaW5nWzBdOwotCQlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIGRpckxpc3QpOwotCQlyZXR1cm4gZGlyTGlzdDsKKwl9IGNhdGNoKENvcmVFeGNlcHRpb24gaWdub3JlZCkgewogCX0KIAlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIG1pc3NpbmdQYWNrYWdlSG9sZGVyKTsKIAlyZXR1cm4gbnVsbDsKIH0KIAotYm9vbGVhbiBkb2VzRmlsZUV4aXN0KFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7Citib29sZWFuIGRvZXNGaWxlRXhpc3QoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRGdWxsTmFtZSkgewogCVN0cmluZ1tdIGRpckxpc3QgPSBkaXJlY3RvcnlMaXN0KHF1YWxpZmllZFBhY2thZ2VOYW1lKTsKIAlpZiAoZGlyTGlzdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIG1vc3QgY29tbW9uIGNhc2UKIApAQCAtNzksMjggKzgxLDM2IEBACiAJaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAJaWYgKCEobyBpbnN0YW5jZW9mIENsYXNzcGF0aERpcmVjdG9yeSkpIHJldHVybiBmYWxzZTsKIAotCXJldHVybiBiaW5hcnlQYXRoLmVxdWFscygoKENsYXNzcGF0aERpcmVjdG9yeSkgbykuYmluYXJ5UGF0aCk7CisJcmV0dXJuIGJpbmFyeUZvbGRlci5lcXVhbHMoKChDbGFzc3BhdGhEaXJlY3RvcnkpIG8pLmJpbmFyeUZvbGRlcik7CiB9IAogCi1OYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKLQlpZiAoIWRvZXNGaWxlRXhpc3QoYmluYXJ5RmlsZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lKSkgcmV0dXJuIG51bGw7IC8vIG1vc3QgY29tbW9uIGNhc2UKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKKwlpZiAoIWRvZXNGaWxlRXhpc3QoYmluYXJ5RmlsZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSkpIHJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCiAKIAl0cnkgewotCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoYmluYXJ5UGF0aCArIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKTsKKwkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IENsYXNzRmlsZVJlYWRlci5yZWFkKGJpbmFyeUxvY2F0aW9uICsgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpOwogCQlpZiAocmVhZGVyICE9IG51bGwpIHJldHVybiBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKHJlYWRlcik7CiAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IC8vIHRyZWF0IGFzIGlmIGNsYXNzIGZpbGUgaXMgbWlzc2luZwogCXJldHVybiBudWxsOwogfQogCi1ib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKK3B1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgeworCXJldHVybiBiaW5hcnlGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworfQorCitwdWJsaWMgYm9vbGVhbiBpc091dHB1dEZvbGRlcigpIHsKKwlyZXR1cm4gaXNPdXRwdXRGb2xkZXI7Cit9CisKK3B1YmxpYyBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKIAlyZXR1cm4gZGlyZWN0b3J5TGlzdChxdWFsaWZpZWRQYWNrYWdlTmFtZSkgIT0gbnVsbDsKIH0KIAotdm9pZCByZXNldCgpIHsKK3B1YmxpYyB2b2lkIHJlc2V0KCkgewogCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7CiB9CiAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuICJCaW5hcnkgY2xhc3NwYXRoIGRpcmVjdG9yeSAiICsgYmluYXJ5UGF0aDsgLy8kTk9OLU5MUy0xJAorCXJldHVybiAiQmluYXJ5IGNsYXNzcGF0aCBkaXJlY3RvcnkgIiArIGJpbmFyeUZvbGRlci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aEphci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhKYXIuamF2YQppbmRleCBhYzA0ZWM3Li45NjcwMTcxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aEphci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoSmFyLmphdmEKQEAgLTEsMjcgKzEsMzMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuU2ltcGxlTG9va3VwVGFibGU7CiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLnppcC4qOwogCi1jbGFzcyBDbGFzc3BhdGhKYXIgZXh0ZW5kcyBDbGFzc3BhdGhMb2NhdGlvbiB7CitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoSmFyIGV4dGVuZHMgQ2xhc3NwYXRoTG9jYXRpb24gewogCiBTdHJpbmcgemlwRmlsZW5hbWU7IC8vIGtlZXAgZm9yIGVxdWFscworSUZpbGUgcmVzb3VyY2U7CiBaaXBGaWxlIHppcEZpbGU7Ci1TaW1wbGVMb29rdXBUYWJsZSBwYWNrYWdlQ2FjaGU7CQorYm9vbGVhbiBjbG9zZVppcEZpbGVBdEVuZDsKK1NpbXBsZUxvb2t1cFRhYmxlIHBhY2thZ2VDYWNoZTsKIAogQ2xhc3NwYXRoSmFyKFN0cmluZyB6aXBGaWxlbmFtZSkgewogCXRoaXMuemlwRmlsZW5hbWUgPSB6aXBGaWxlbmFtZTsKQEAgLTI5LDggKzM1LDIzIEBACiAJdGhpcy5wYWNrYWdlQ2FjaGUgPSBudWxsOwogfQogCi12b2lkIGNsZWFudXAoKSB7Ci0JaWYgKHppcEZpbGUgIT0gbnVsbCkgeworQ2xhc3NwYXRoSmFyKElGaWxlIHJlc291cmNlKSB7CisJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKKwl0aGlzLnppcEZpbGVuYW1lID0gbG9jYXRpb24gIT0gbnVsbCA/IGxvY2F0aW9uLnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAorCXRoaXMuemlwRmlsZSA9IG51bGw7CisJdGhpcy5wYWNrYWdlQ2FjaGUgPSBudWxsOworfQorCitwdWJsaWMgQ2xhc3NwYXRoSmFyKFppcEZpbGUgemlwRmlsZSkgeworCXRoaXMuemlwRmlsZW5hbWUgPSB6aXBGaWxlLmdldE5hbWUoKTsKKwl0aGlzLnppcEZpbGUgPSB6aXBGaWxlOworCXRoaXMuY2xvc2VaaXBGaWxlQXRFbmQgPSBmYWxzZTsKKwl0aGlzLnBhY2thZ2VDYWNoZSA9IG51bGw7Cit9CisKK3B1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisJaWYgKHppcEZpbGUgIT0gbnVsbCAmJiB0aGlzLmNsb3NlWmlwRmlsZUF0RW5kKSB7CiAJCXRyeSB7IHppcEZpbGUuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQogCQl0aGlzLnppcEZpbGUgPSBudWxsOwogCX0KQEAgLTQ0LDcgKzY1LDcgQEAKIAlyZXR1cm4gemlwRmlsZW5hbWUuZXF1YWxzKCgoQ2xhc3NwYXRoSmFyKSBvKS56aXBGaWxlbmFtZSk7CiB9IAogCi1OYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBiaW5hcnlGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkQmluYXJ5RmlsZU5hbWUpIHsKIAlpZiAoIWlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpIHJldHVybiBudWxsOyAvLyBtb3N0IGNvbW1vbiBjYXNlCiAKIAl0cnkgewpAQCAtNTQsMTQgKzc1LDIyIEBACiAJcmV0dXJuIG51bGw7CiB9CiAKLWJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7CisJaWYgKHJlc291cmNlID09IG51bGwpIHJldHVybiBudWxsOworCXJldHVybglyZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Cit9CisKK3B1YmxpYyBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKIAlpZiAocGFja2FnZUNhY2hlICE9IG51bGwpCiAJCXJldHVybiBwYWNrYWdlQ2FjaGUuY29udGFpbnNLZXkocXVhbGlmaWVkUGFja2FnZU5hbWUpOwogCiAJdGhpcy5wYWNrYWdlQ2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNDEpOwogCXBhY2thZ2VDYWNoZS5wdXQoIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJdHJ5IHsKLQkJdGhpcy56aXBGaWxlID0gbmV3IFppcEZpbGUoemlwRmlsZW5hbWUpOworCQlpZiAodGhpcy56aXBGaWxlID09IG51bGwpIHsKKwkJCXRoaXMuemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGVuYW1lKTsKKwkJCXRoaXMuY2xvc2VaaXBGaWxlQXRFbmQgPSB0cnVlOworCQl9CiAKIAkJbmV4dEVudHJ5IDogZm9yIChFbnVtZXJhdGlvbiBlID0gemlwRmlsZS5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewogCQkJU3RyaW5nIGZpbGVOYW1lID0gKChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCk7CkBAIC04NSw0ICsxMTQsNCBAQAogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlyZXR1cm4gIkNsYXNzcGF0aCBqYXIgZmlsZSAiICsgemlwRmlsZW5hbWU7IC8vJE5PTi1OTFMtMSQKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aExvY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aExvY2F0aW9uLmphdmEKaW5kZXggNGFiMTE1Ny4uNzI4MmJiYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhMb2NhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTG9jYXRpb24uamF2YQpAQCAtMSwzOCArMSw1MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7CiAKLWFic3RyYWN0IGNsYXNzIENsYXNzcGF0aExvY2F0aW9uIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc3BhdGhMb2NhdGlvbiB7CiAKLXN0YXRpYyBDbGFzc3BhdGhMb2NhdGlvbiBmb3JTb3VyY2VGb2xkZXIoU3RyaW5nIHNvdXJjZUZvbGRlclBhdGhuYW1lLCBTdHJpbmcgb3V0cHV0Rm9sZGVyUGF0aG5hbWUpIHsKLQlyZXR1cm4gbmV3IENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KHNvdXJjZUZvbGRlclBhdGhuYW1lLCBvdXRwdXRGb2xkZXJQYXRobmFtZSk7CitzdGF0aWMgQ2xhc3NwYXRoTG9jYXRpb24gZm9yU291cmNlRm9sZGVyKElDb250YWluZXIgc291cmNlRm9sZGVyLCBJQ29udGFpbmVyIG91dHB1dEZvbGRlciwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnMpIHsKKwlyZXR1cm4gbmV3IENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KHNvdXJjZUZvbGRlciwgb3V0cHV0Rm9sZGVyLCBleGNsdXNpb25QYXR0ZXJucyk7CiB9CiAKLXN0YXRpYyBDbGFzc3BhdGhMb2NhdGlvbiBmb3JCaW5hcnlGb2xkZXIoU3RyaW5nIGJpbmFyeUZvbGRlclBhdGhuYW1lKSB7Ci0JcmV0dXJuIG5ldyBDbGFzc3BhdGhEaXJlY3RvcnkoYmluYXJ5Rm9sZGVyUGF0aG5hbWUpOworcHVibGljIHN0YXRpYyBDbGFzc3BhdGhMb2NhdGlvbiBmb3JCaW5hcnlGb2xkZXIoSUNvbnRhaW5lciBiaW5hcnlGb2xkZXIsIGJvb2xlYW4gaXNPdXRwdXRGb2xkZXIpIHsKKwlyZXR1cm4gbmV3IENsYXNzcGF0aERpcmVjdG9yeShiaW5hcnlGb2xkZXIsIGlzT3V0cHV0Rm9sZGVyKTsKIH0KIAogc3RhdGljIENsYXNzcGF0aExvY2F0aW9uIGZvckxpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRobmFtZSkgewogCXJldHVybiBuZXcgQ2xhc3NwYXRoSmFyKGxpYnJhcnlQYXRobmFtZSk7CiB9CiAKLWFic3RyYWN0IE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIGJpbmFyeUZpbGVOYW1lLCBTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRCaW5hcnlGaWxlTmFtZSk7Ci1hYnN0cmFjdCBib29sZWFuIGlzUGFja2FnZShTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUpOworc3RhdGljIENsYXNzcGF0aExvY2F0aW9uIGZvckxpYnJhcnkoSUZpbGUgbGlicmFyeSkgeworCXJldHVybiBuZXcgQ2xhc3NwYXRoSmFyKGxpYnJhcnkpOworfQorCitwdWJsaWMgYWJzdHJhY3QgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhTdHJpbmcgYmluYXJ5RmlsZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSwgU3RyaW5nIHF1YWxpZmllZEJpbmFyeUZpbGVOYW1lKTsKKworcHVibGljIGFic3RyYWN0IElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKworcHVibGljIGJvb2xlYW4gaXNPdXRwdXRGb2xkZXIoKSB7CisJcmV0dXJuIGZhbHNlOworfQorCitwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKTsKIAogLy8gZnJlZSBhbnl0aGluZyB3aGljaCBpcyBub3QgcmVxdWlyZWQgd2hlbiB0aGUgc3RhdGUgaXMgc2F2ZWQKLXZvaWQgY2xlYW51cCgpIHsKK3B1YmxpYyB2b2lkIGNsZWFudXAoKSB7CiB9CiAvLyByZXNldCBhbnkgaW50ZXJuYWwgY2FjaGVzIGJlZm9yZSBhbm90aGVyIGNvbXBpbGUgbG9vcCBzdGFydHMKLXZvaWQgcmVzZXQoKSB7CitwdWJsaWMgdm9pZCByZXNldCgpIHsKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aE11bHRpRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0NsYXNzcGF0aE11bHRpRGlyZWN0b3J5LmphdmEKaW5kZXggYzBkMjlhMC4uZmU2NjYzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9DbGFzc3BhdGhNdWx0aURpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkuamF2YQpAQCAtMSwyOCArMSwzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogY2xhc3MgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgZXh0ZW5kcyBDbGFzc3BhdGhEaXJlY3RvcnkgewogCi1TdHJpbmcgc291cmNlUGF0aDsKK0lDb250YWluZXIgc291cmNlRm9sZGVyOworY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybnM7IC8vIHVzZWQgYnkgYnVpbGRlcnMgd2hlbiB3YWxraW5nIHNvdXJjZSBmb2xkZXJzCitib29sZWFuIGhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyOyAvLyBpZiBvdXRwdXQgZm9sZGVyIGlzIG5vdCBlcXVhbCB0byBhbnkgb2YgdGhlIHNvdXJjZSBmb2xkZXJzCiAKLUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5KFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgYmluYXJ5UGF0aCkgewotCXN1cGVyKGJpbmFyeVBhdGgpOworQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIsIElDb250YWluZXIgYmluYXJ5Rm9sZGVyLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucykgeworCXN1cGVyKGJpbmFyeUZvbGRlciwgdHJ1ZSk7CiAKLQl0aGlzLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoOwotCWlmICghc291cmNlUGF0aC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCXRoaXMuc291cmNlUGF0aCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLnNvdXJjZUZvbGRlciA9IHNvdXJjZUZvbGRlcjsKKwl0aGlzLmV4Y2x1c2lvblBhdHRlcm5zID0gZXhjbHVzaW9uUGF0dGVybnM7CisJdGhpcy5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlciA9IGZhbHNlOworCisJLy8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gYSBzdGF0ZSByZWJ1aWxkcyBhIHNvdXJjZSBmb2xkZXIKKwlpZiAodGhpcy5leGNsdXNpb25QYXR0ZXJucyAhPSBudWxsICYmIHRoaXMuZXhjbHVzaW9uUGF0dGVybnMubGVuZ3RoID09IDApCisJCXRoaXMuZXhjbHVzaW9uUGF0dGVybnMgPSBudWxsOwogfQogCiBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTMwLDMwICszNiwxMiBAQAogCWlmICghKG8gaW5zdGFuY2VvZiBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkpIHJldHVybiBmYWxzZTsKIAogCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG1kID0gKENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSBvOwotCXJldHVybiBiaW5hcnlQYXRoLmVxdWFscyhtZC5iaW5hcnlQYXRoKSAmJiBzb3VyY2VQYXRoLmVxdWFscyhtZC5zb3VyY2VQYXRoKTsKKwlyZXR1cm4gc291cmNlRm9sZGVyLmVxdWFscyhtZC5zb3VyY2VGb2xkZXIpICYmIGJpbmFyeUZvbGRlci5lcXVhbHMobWQuYmluYXJ5Rm9sZGVyKQorCQkmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhleGNsdXNpb25QYXR0ZXJucywgbWQuZXhjbHVzaW9uUGF0dGVybnMpOwogfSAKIAotTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRTb3VyY2VGaWxlKAotCVN0cmluZyBxdWFsaWZpZWRTb3VyY2VGaWxlTmFtZSwKLQlTdHJpbmcgcXVhbGlmaWVkUGFja2FnZU5hbWUsCi0JY2hhcltdIHR5cGVOYW1lLAotCVN0cmluZ1tdIGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXMpIHsKLQotCS8vIGlmIGFuIGFkZGl0aW9uYWwgc291cmNlIGZpbGUgaXMgd2FpdGluZyB0byBiZSBjb21waWxlZCwgYW5zd2VyIGl0Ci0JLy8gQlVUIG5vdCBpZiB0aGlzIGlzIGEgc2Vjb25kYXJ5IHR5cGUgc2VhcmNoLAotCS8vIGlmIHdlIGFuc3dlciB0aGUgc291cmNlIGZpbGUgWC5qYXZhIHdoaWNoIG1heSBubyBsb25nZXIgZGVmaW5lIFkKLQkvLyB0aGVuIHRoZSBiaW5hcnkgdHlwZSBsb29raW5nIGZvciBZIHdpbGwgZmFpbCAmIHRoaW5rIHRoZSBjbGFzcyBwYXRoIGlzIHdyb25nCi0JLy8gbGV0IHRoZSByZWNvbXBpbGUgbG9vcCBmaXggdXAgZGVwZW5kZW50cyB3aGVuIFkgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIFguamF2YQotCVN0cmluZyBmdWxsU291cmNlTmFtZSA9IHNvdXJjZVBhdGggKyBxdWFsaWZpZWRTb3VyY2VGaWxlTmFtZTsKLQlmb3IgKGludCBpID0gMCwgbCA9IGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQlpZiAoZnVsbFNvdXJjZU5hbWUuZXF1YWxzKGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXNbaV0pKQotCQkJcmV0dXJuIG5ldyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIoCi0JCQkJbmV3IFNvdXJjZUZpbGUoZnVsbFNvdXJjZU5hbWUsIHR5cGVOYW1lLCBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBxdWFsaWZpZWRQYWNrYWdlTmFtZS50b0NoYXJBcnJheSgpKSkpOwotCXJldHVybiBudWxsOwotfQotCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiAiU291cmNlIGNsYXNzcGF0aCBkaXJlY3RvcnkgIiArIHNvdXJjZVBhdGggKyAvLyROT04tTkxTLTEkCi0JCSIgd2l0aCBiaW5hcnkgZGlyZWN0b3J5ICIgKyBiaW5hcnlQYXRoOyAvLyROT04tTkxTLTEkCisJcmV0dXJuICJTb3VyY2UgY2xhc3NwYXRoIGRpcmVjdG9yeSAiICsgc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSArIC8vJE5PTi1OTFMtMSQKKwkJIiB3aXRoIGJpbmFyeSBkaXJlY3RvcnkgIiArIGJpbmFyeUZvbGRlci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0ltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uLmphdmEKaW5kZXggNmIyODg1OS4uZmEyYTQwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbWFnZUJ1aWxkZXJJbnRlcm5hbEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW1hZ2VCdWlsZGVySW50ZXJuYWxFeGNlcHRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKQEAgLTM3LDQgKzM3LDQgQEAKIAkJc3VwZXIucHJpbnRTdGFja1RyYWNlKCk7CiAJfQogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuamF2YQppbmRleCBkNzc1MjUxLi5kOTQwMmVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0luY3JlbWVudGFsSW1hZ2VCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9JbmNyZW1lbnRhbEltYWdlQnVpbGRlci5qYXZhCkBAIC0xLDI0ICsxLDI2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogCitpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKQEAgLTI2LDI1ICsyOCwyNyBAQAogICovCiBwdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdEltYWdlQnVpbGRlciB7CiAKLXByb3RlY3RlZCBBcnJheUxpc3QgbG9jYXRpb25zOwotcHJvdGVjdGVkIEFycmF5TGlzdCBwcmV2aW91c0xvY2F0aW9uczsKLXByb3RlY3RlZCBBcnJheUxpc3QgdHlwZU5hbWVzOworcHJvdGVjdGVkIEFycmF5TGlzdCBzb3VyY2VGaWxlczsKK3Byb3RlY3RlZCBBcnJheUxpc3QgcHJldmlvdXNTb3VyY2VGaWxlczsKIHByb3RlY3RlZCBBcnJheUxpc3QgcXVhbGlmaWVkU3RyaW5nczsKIHByb3RlY3RlZCBBcnJheUxpc3Qgc2ltcGxlU3RyaW5nczsKLXByb3RlY3RlZCBBcnJheUxpc3Qgc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZTsKK3Byb3RlY3RlZCBTaW1wbGVMb29rdXBUYWJsZSBzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlOworcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3RydWN0dXJhbENoYW5nZXM7Citwcm90ZWN0ZWQgaW50IGNvbXBpbGVMb29wOwogCiBwdWJsaWMgc3RhdGljIGludCBNYXhDb21waWxlTG9vcCA9IDU7IC8vIHBlcmZvcm0gYSBmdWxsIGJ1aWxkIGlmIGl0IHRha2VzIG1vcmUgdGhhbiA/IGluY3JlbWVudGFsIGNvbXBpbGUgbG9vcHMKIAogcHJvdGVjdGVkIEluY3JlbWVudGFsSW1hZ2VCdWlsZGVyKEphdmFCdWlsZGVyIGphdmFCdWlsZGVyKSB7CiAJc3VwZXIoamF2YUJ1aWxkZXIpOwotCXRoaXMubmFtZUVudmlyb25tZW50LnRhZ0FzSW5jcmVtZW50YWxCdWlsZCgpOworCXRoaXMubmFtZUVudmlyb25tZW50LmlzSW5jcmVtZW50YWxCdWlsZCA9IHRydWU7CiAJdGhpcy5uZXdTdGF0ZS5jb3B5RnJvbShqYXZhQnVpbGRlci5sYXN0U3RhdGUpOwogCi0JdGhpcy5sb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDMzKTsKLQl0aGlzLnByZXZpb3VzTG9jYXRpb25zID0gbnVsbDsKLQl0aGlzLnR5cGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoMzMpOworCXRoaXMuc291cmNlRmlsZXMgPSBuZXcgQXJyYXlMaXN0KDMzKTsKKwl0aGlzLnByZXZpb3VzU291cmNlRmlsZXMgPSBudWxsOwogCXRoaXMucXVhbGlmaWVkU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoMzMpOwogCXRoaXMuc2ltcGxlU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoMzMpOworCXRoaXMuaGFzU3RydWN0dXJhbENoYW5nZXMgPSBmYWxzZTsKKwl0aGlzLmNvbXBpbGVMb29wID0gMDsKIH0KIAogcHVibGljIGJvb2xlYW4gYnVpbGQoU2ltcGxlTG9va3VwVGFibGUgZGVsdGFzKSB7CkBAIC03MiwxMiArNzYsMTIgQEAKIAogCQlPYmplY3RbXSBrZXlUYWJsZSA9IGRlbHRhcy5rZXlUYWJsZTsKIAkJT2JqZWN0W10gdmFsdWVUYWJsZSA9IGRlbHRhcy52YWx1ZVRhYmxlOwotCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQlmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IChJUmVzb3VyY2VEZWx0YSkgdmFsdWVUYWJsZVtpXTsKIAkJCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlW10gYmluYXJ5UmVzb3VyY2VzID0gKElSZXNvdXJjZVtdKSBqYXZhQnVpbGRlci5iaW5hcnlSZXNvdXJjZXMuZ2V0KGtleVRhYmxlW2ldKTsKLQkJCQlpZiAoYmluYXJ5UmVzb3VyY2VzICE9IG51bGwpCi0JCQkJCWlmICghZmluZEFmZmVjdGVkU291cmNlRmlsZXMoZGVsdGEsIGJpbmFyeVJlc291cmNlcykpIHJldHVybiBmYWxzZTsKKwkJCQlDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoQ2xhc3NwYXRoTG9jYXRpb25bXSkgamF2YUJ1aWxkZXIuYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5nZXQoa2V5VGFibGVbaV0pOworCQkJCWlmIChjbGFzc0ZvbGRlcnNBbmRKYXJzICE9IG51bGwpCisJCQkJCWlmICghZmluZEFmZmVjdGVkU291cmNlRmlsZXMoZGVsdGEsIGNsYXNzRm9sZGVyc0FuZEphcnMpKSByZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0KIAkJbm90aWZpZXIudXBkYXRlUHJvZ3Jlc3NEZWx0YSgwLjEwZik7CkBAIC04NiwyOSArOTAsMjkgQEAKIAkJYWRkQWZmZWN0ZWRTb3VyY2VGaWxlcygpOwogCQlub3RpZmllci51cGRhdGVQcm9ncmVzc0RlbHRhKDAuMDVmKTsKIAotCQlpbnQgY29tcGlsZUxvb3AgPSAwOworCQl0aGlzLmNvbXBpbGVMb29wID0gMDsKIAkJZmxvYXQgaW5jcmVtZW50ID0gMC40MGY7Ci0JCXdoaWxlIChsb2NhdGlvbnMuc2l6ZSgpID4gMCkgeyAvLyBhZGRlZCB0byBpbiBhY2NlcHRSZXN1bHQKLQkJCWlmICgrK2NvbXBpbGVMb29wID4gTWF4Q29tcGlsZUxvb3ApIHsKKwkJd2hpbGUgKHNvdXJjZUZpbGVzLnNpemUoKSA+IDApIHsgLy8gYWRkZWQgdG8gaW4gYWNjZXB0UmVzdWx0CisJCQlpZiAoKyt0aGlzLmNvbXBpbGVMb29wID4gTWF4Q29tcGlsZUxvb3ApIHsKIAkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQUJPUlRJTkcgaW5jcmVtZW50YWwgYnVpbGQuLi4gZXhjZWVkZWQgbG9vcCBjb3VudCIpOyAvLyROT04tTkxTLTEkCiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAotCQkJU3RyaW5nW10gYWxsU291cmNlRmlsZXMgPSBuZXcgU3RyaW5nW2xvY2F0aW9ucy5zaXplKCldOwotCQkJbG9jYXRpb25zLnRvQXJyYXkoYWxsU291cmNlRmlsZXMpOwotCQkJU3RyaW5nW10gaW5pdGlhbFR5cGVTdHJpbmdzID0gbmV3IFN0cmluZ1t0eXBlTmFtZXMuc2l6ZSgpXTsKLQkJCXR5cGVOYW1lcy50b0FycmF5KGluaXRpYWxUeXBlU3RyaW5ncyk7CisJCQlTb3VyY2VGaWxlW10gYWxsU291cmNlRmlsZXMgPSBuZXcgU291cmNlRmlsZVtzb3VyY2VGaWxlcy5zaXplKCldOworCQkJc291cmNlRmlsZXMudG9BcnJheShhbGxTb3VyY2VGaWxlcyk7CiAJCQlyZXNldENvbGxlY3Rpb25zKCk7CiAKIAkJCXdvcmtRdWV1ZS5hZGRBbGwoYWxsU291cmNlRmlsZXMpOwogCQkJbm90aWZpZXIuc2V0UHJvZ3Jlc3NQZXJDb21waWxhdGlvblVuaXQoaW5jcmVtZW50IC8gYWxsU291cmNlRmlsZXMubGVuZ3RoKTsKIAkJCWluY3JlbWVudCA9IGluY3JlbWVudCAvIDI7Ci0JCQljb21waWxlKGFsbFNvdXJjZUZpbGVzLCBpbml0aWFsVHlwZVN0cmluZ3MpOworCQkJY29tcGlsZShhbGxTb3VyY2VGaWxlcyk7CiAJCQlyZW1vdmVTZWNvbmRhcnlUeXBlcygpOwogCQkJYWRkQWZmZWN0ZWRTb3VyY2VGaWxlcygpOwogCQl9CisJCWlmICh0aGlzLmhhc1N0cnVjdHVyYWxDaGFuZ2VzICYmIGphdmFCdWlsZGVyLmphdmFQcm9qZWN0Lmhhc0N5Y2xlTWFya2VyKCkpCisJCQlqYXZhQnVpbGRlci5tdXN0UHJvcGFnYXRlU3RydWN0dXJhbENoYW5nZXMoKTsKIAl9IGNhdGNoIChBYm9ydEluY3JlbWVudGFsQnVpbGRFeGNlcHRpb24gZSkgewogCQkvLyBhYm9ydCB0aGUgaW5jcmVtZW50YWwgYnVpbGQgYW5kIGxldCB0aGUgYmF0Y2ggYnVpbGRlciBoYW5kbGUgdGhlIHByb2JsZW0KIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQpAQCAtMTM4LDMzICsxNDIsNDQgQEAKIAogCU9iamVjdFtdIGtleVRhYmxlID0gbmV3U3RhdGUucmVmZXJlbmNlcy5rZXlUYWJsZTsKIAlPYmplY3RbXSB2YWx1ZVRhYmxlID0gbmV3U3RhdGUucmVmZXJlbmNlcy52YWx1ZVRhYmxlOwotCW5leHQgOiBmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewotCQlTdHJpbmcgc291cmNlTG9jYXRpb24gPSAoU3RyaW5nKSBrZXlUYWJsZVtpXTsKLQkJaWYgKHNvdXJjZUxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9ucy5jb250YWlucyhzb3VyY2VMb2NhdGlvbikpIHsKLQkJCWlmIChjb21waWxlZEFsbEF0T25jZSAmJiBwcmV2aW91c0xvY2F0aW9ucyAhPSBudWxsICYmIHByZXZpb3VzTG9jYXRpb25zLmNvbnRhaW5zKHNvdXJjZUxvY2F0aW9uKSkKLQkJCQljb250aW51ZSBuZXh0OyAvLyBjYW4gc2tpcCBwcmV2aW91c2x5IGNvbXBpbGVkIGxvY2F0aW9ucyBzaW5jZSBhbHJlYWR5IHNhdyBoaWVyYXJjaHkgcmVsYXRlZCBwcm9ibGVtcwotCi0JCQlSZWZlcmVuY2VDb2xsZWN0aW9uIHJlZnMgPSAoUmVmZXJlbmNlQ29sbGVjdGlvbikgdmFsdWVUYWJsZVtpXTsKLQkJCWlmIChyZWZzLmluY2x1ZGVzKHF1YWxpZmllZE5hbWVzLCBzaW1wbGVOYW1lcykpIHsKLQkJCQkvLyBjaGVjayB0aGF0IHRoZSBmaWxlIHN0aWxsIGV4aXN0cy4uLiB0aGUgZmlsZSBvciBpdHMgcGFja2FnZSBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQKLQkJCQlJUmVzb3VyY2UgYWZmZWN0ZWRGaWxlID0gcmVzb3VyY2VGb3JMb2NhdGlvbihzb3VyY2VMb2NhdGlvbik7Ci0JCQkJaWYgKGFmZmVjdGVkRmlsZSAhPSBudWxsICYmIGFmZmVjdGVkRmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgYWRkaW5nIGFmZmVjdGVkIHNvdXJjZSBmaWxlICIgKyBzb3VyY2VMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9jYXRpb25zLmFkZChzb3VyY2VMb2NhdGlvbik7Ci0JCQkJCXR5cGVOYW1lcy5hZGQoZXh0cmFjdFR5cGVOYW1lRnJvbShzb3VyY2VMb2NhdGlvbikpOworCW5leHQgOiBmb3IgKGludCBpID0gMCwgbCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCVJlZmVyZW5jZUNvbGxlY3Rpb24gcmVmcyA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOworCQlpZiAocmVmcyAhPSBudWxsICYmIHJlZnMuaW5jbHVkZXMocXVhbGlmaWVkTmFtZXMsIHNpbXBsZU5hbWVzKSkgeworCQkJU3RyaW5nIHR5cGVMb2NhdG9yID0gKFN0cmluZykga2V5VGFibGVbaV07CisJCQlJRmlsZSBmaWxlID0gamF2YUJ1aWxkZXIuY3VycmVudFByb2plY3QuZ2V0RmlsZSh0eXBlTG9jYXRvcik7CisJCQlpZiAoZmlsZS5leGlzdHMoKSkgeworCQkJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG1kID0gc291cmNlTG9jYXRpb25zWzBdOworCQkJCWlmIChzb3VyY2VMb2NhdGlvbnMubGVuZ3RoID4gMSkgeworCQkJCQlJUGF0aCBzb3VyY2VGaWxlRnVsbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7CisJCQkJCWZvciAoaW50IGogPSAwLCBtID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaiA8IG07IGorKykgeworCQkJCQkJaWYgKHNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKHNvdXJjZUZpbGVGdWxsUGF0aCkpIHsKKwkJCQkJCQltZCA9IHNvdXJjZUxvY2F0aW9uc1tqXTsKKwkJCQkJCQlpZiAobWQuZXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCB8fCAhVXRpbC5pc0V4Y2x1ZGVkKGZpbGUsIG1kLmV4Y2x1c2lvblBhdHRlcm5zKSkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9CisJCQkJU291cmNlRmlsZSBzb3VyY2VGaWxlID0gbmV3IFNvdXJjZUZpbGUoZmlsZSwgbWQsIGVuY29kaW5nKTsKKwkJCQlpZiAoc291cmNlRmlsZXMuY29udGFpbnMoc291cmNlRmlsZSkpIGNvbnRpbnVlIG5leHQ7CisJCQkJaWYgKGNvbXBpbGVkQWxsQXRPbmNlICYmIHByZXZpb3VzU291cmNlRmlsZXMgIT0gbnVsbCAmJiBwcmV2aW91c1NvdXJjZUZpbGVzLmNvbnRhaW5zKHNvdXJjZUZpbGUpKQorCQkJCQljb250aW51ZSBuZXh0OyAvLyBjYW4gc2tpcCBwcmV2aW91c2x5IGNvbXBpbGVkIGZpbGVzIHNpbmNlIGFscmVhZHkgc2F3IGhpZXJhcmNoeSByZWxhdGVkIHByb2JsZW1zCisKKwkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBhZGRpbmcgYWZmZWN0ZWQgc291cmNlIGZpbGUgIiArIHR5cGVMb2NhdG9yKTsgLy8kTk9OLU5MUy0xJAorCQkJCXNvdXJjZUZpbGVzLmFkZChzb3VyY2VGaWxlKTsKIAkJCX0KIAkJfQogCX0KIH0KIAogcHJvdGVjdGVkIHZvaWQgYWRkRGVwZW5kZW50c09mKElQYXRoIHBhdGgsIGJvb2xlYW4gaGFzU3RydWN0dXJhbENoYW5nZXMpIHsKLQlpZiAoaGFzU3RydWN0dXJhbENoYW5nZXMpCisJaWYgKGhhc1N0cnVjdHVyYWxDaGFuZ2VzKSB7CiAJCW5ld1N0YXRlLnRhZ0FzU3RydWN0dXJhbGx5Q2hhbmdlZCgpOwotCS8vIHRoZSBxdWFsaWZpZWRTdHJpbmdzIGFyZSBvZiB0aGUgZm9ybSAncDEvcDEnICYgdGhlIHNpbXBsZVN0cmluZ3MgYXJlIGp1c3QgJ1gnCisJCXRoaXMuaGFzU3RydWN0dXJhbENoYW5nZXMgPSB0cnVlOworCX0KKwkvLyB0aGUgcXVhbGlmaWVkU3RyaW5ncyBhcmUgb2YgdGhlIGZvcm0gJ3AxL3AyJyAmIHRoZSBzaW1wbGVTdHJpbmdzIGFyZSBqdXN0ICdYJwogCXBhdGggPSBwYXRoLnNldERldmljZShudWxsKTsKLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYXRoLnVwdG9TZWdtZW50KHBhdGguc2VnbWVudENvdW50KCkgLSAxKS50b1N0cmluZygpOworCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7CiAJaWYgKCFxdWFsaWZpZWRTdHJpbmdzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkKIAkJcXVhbGlmaWVkU3RyaW5ncy5hZGQocGFja2FnZU5hbWUpOwogCVN0cmluZyB0eXBlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKQEAgLTE3Myw3ICsxODgsNyBAQAogCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBtZW1iZXJJbmRleCk7CiAJaWYgKCFzaW1wbGVTdHJpbmdzLmNvbnRhaW5zKHR5cGVOYW1lKSkgewogCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgYWRkaW5nIGRlcGVuZGVudHMgb2YgIiAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgd2lsbCBsb29rIGZvciBkZXBlbmRlbnRzIG9mICIgLy8kTk9OLU5MUy0xJAogCQkJCSsgdHlwZU5hbWUgKyAiIGluICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKIAkJc2ltcGxlU3RyaW5ncy5hZGQodHlwZU5hbWUpOwogCX0KQEAgLTE4MiwzNSArMTk3LDQwIEBACiBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewogCXN1cGVyLmNsZWFuVXAoKTsKIAotCXRoaXMubG9jYXRpb25zID0gbnVsbDsKLQl0aGlzLnByZXZpb3VzTG9jYXRpb25zID0gbnVsbDsKLQl0aGlzLnR5cGVOYW1lcyA9IG51bGw7CisJdGhpcy5zb3VyY2VGaWxlcyA9IG51bGw7CisJdGhpcy5wcmV2aW91c1NvdXJjZUZpbGVzID0gbnVsbDsKIAl0aGlzLnF1YWxpZmllZFN0cmluZ3MgPSBudWxsOwogCXRoaXMuc2ltcGxlU3RyaW5ncyA9IG51bGw7CisJdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlID0gbnVsbDsKKwl0aGlzLmhhc1N0cnVjdHVyYWxDaGFuZ2VzID0gZmFsc2U7CisJdGhpcy5jb21waWxlTG9vcCA9IDA7CiB9CiAKLXByb3RlY3RlZCBib29sZWFuIGZpbmRBZmZlY3RlZFNvdXJjZUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhLCBJUmVzb3VyY2VbXSBiaW5hcnlSZXNvdXJjZXMpIHsKLQlmb3IgKGludCBqID0gMCwgayA9IGJpbmFyeVJlc291cmNlcy5sZW5ndGg7IGogPCBrOyBqKyspIHsKLQkJSVJlc291cmNlIGJpbmFyeVJlc291cmNlID0gYmluYXJ5UmVzb3VyY2VzW2pdOworcHJvdGVjdGVkIGJvb2xlYW4gZmluZEFmZmVjdGVkU291cmNlRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEsIENsYXNzcGF0aExvY2F0aW9uW10gY2xhc3NGb2xkZXJzQW5kSmFycykgeworCWZvciAoaW50IGkgPSAwLCBsID0gY2xhc3NGb2xkZXJzQW5kSmFycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJQ2xhc3NwYXRoTG9jYXRpb24gYkxvY2F0aW9uID0gY2xhc3NGb2xkZXJzQW5kSmFyc1tpXTsKIAkJLy8gZWl0aGVyIGEgLmNsYXNzIGZpbGUgZm9sZGVyIG9yIGEgemlwL2phciBmaWxlCi0JCWlmIChiaW5hcnlSZXNvdXJjZSAhPSBudWxsKSB7IC8vIHNraXAgdW5jaGFuZ2VkIG91dHB1dCBmb2xkZXIKLQkJCUlSZXNvdXJjZURlbHRhIGJpbmFyeURlbHRhID0gZGVsdGEuZmluZE1lbWJlcihiaW5hcnlSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJaWYgKGJpbmFyeURlbHRhICE9IG51bGwpIHsKLQkJCQlpZiAoYmluYXJ5UmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIGRlbHRhIHRvIGphci96aXAgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gZG8gZnVsbCBidWlsZCBzaW5jZSBqYXIgZmlsZSB3YXMgYWRkZWQvcmVtb3ZlZC9jaGFuZ2VkCisJCWlmIChiTG9jYXRpb24gIT0gbnVsbCkgeyAvLyBza2lwIHVuY2hhbmdlZCBvdXRwdXQgZm9sZGVyCisJCQlJUGF0aCBwID0gYkxvY2F0aW9uLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCWlmIChwICE9IG51bGwpIHsKKwkJCQlJUmVzb3VyY2VEZWx0YSBiaW5hcnlEZWx0YSA9IGRlbHRhLmZpbmRNZW1iZXIocCk7CisJCQkJaWYgKGJpbmFyeURlbHRhICE9IG51bGwpIHsKKwkJCQkJaWYgKGJMb2NhdGlvbiBpbnN0YW5jZW9mIENsYXNzcGF0aEphcikgeworCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQUJPUlRJTkcgaW5jcmVtZW50YWwgYnVpbGQuLi4gZm91bmQgZGVsdGEgdG8gamFyL3ppcCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiBmYWxzZTsgLy8gZG8gZnVsbCBidWlsZCBzaW5jZSBqYXIgZmlsZSB3YXMgY2hhbmdlZCAoYWRkZWQvcmVtb3ZlZCB3ZXJlIGNhdWdodCBhcyBjbGFzc3BhdGggY2hhbmdlKQorCQkJCQl9CisJCQkJCWlmIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwgYmluYXJ5RGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKwkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIGFkZGVkL3JlbW92ZWQgYmluYXJ5IGZvbGRlciIpOyAvLyROT04tTkxTLTEkCisJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGFkZGVkL3JlbW92ZWQgYmluYXJ5IGZvbGRlciBzaG91bGQgbm90IG1ha2UgaXQgaGVyZSAoY2xhc3NwYXRoIGNoYW5nZSksIGJ1dCBoYW5kbGUgYW55d2F5cworCQkJCQl9CisJCQkJCWludCBzZWdtZW50Q291bnQgPSBiaW5hcnlEZWx0YS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOworCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gYmluYXJ5RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOyAvLyAuY2xhc3MgZmlsZXMgZnJvbSBjbGFzcyBmb2xkZXIKKwkJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBjaGlsZHJlbi5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJCQlmaW5kQWZmZWN0ZWRTb3VyY2VGaWxlcyhjaGlsZHJlbltqXSwgc2VnbWVudENvdW50KTsKKwkJCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAkJCQl9Ci0JCQkJaWYgKGJpbmFyeURlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCBiaW5hcnlEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIGFkZGVkL3JlbW92ZWQgYmluYXJ5IGZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsgLy8gYWRkZWQvcmVtb3ZlZCBiaW5hcnkgZm9sZGVyIHNob3VsZCBub3QgbWFrZSBpdCBoZXJlLCBidXQgaGFuZGxlIGFueXdheXMKLQkJCQl9Ci0JCQkJaW50IHNlZ21lbnRDb3VudCA9IGJpbmFyeVJlc291cmNlLmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCk7Ci0JCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGJpbmFyeURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsgLy8gLmNsYXNzIGZpbGVzIGZyb20gY2xhc3MgZm9sZGVyCi0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKQotCQkJCQlmaW5kQWZmZWN0ZWRTb3VyY2VGaWxlcyhjaGlsZHJlbltpXSwgc2VnbWVudENvdW50KTsKLQkJCQlub3RpZmllci5jaGVja0NhbmNlbCgpOwogCQkJfQogCQl9CiAJfQpAQCAtMjIxLDIwICsyNDEsMTggQEAKIAkvLyBXaGVuIGEgcGFja2FnZSBiZWNvbWVzIGEgdHlwZSBvciB2aWNlIHZlcnNhLCBleHBlY3QgMiBkZWx0YXMsCiAJLy8gb25lIG9uIHRoZSBmb2xkZXIgJiBvbmUgb24gdGhlIGNsYXNzIGZpbGUKIAlJUmVzb3VyY2UgcmVzb3VyY2UgPSBiaW5hcnlEZWx0YS5nZXRSZXNvdXJjZSgpOwotCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKIAlzd2l0Y2gocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgogCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgogCQkJc3dpdGNoIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkpIHsKIAkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKIAkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQlJUGF0aCBwYWNrYWdlUGF0aCA9IGxvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5tYWtlUmVsYXRpdmUoKS5zZXREZXZpY2UobnVsbCk7CisJCQkJCUlQYXRoIHBhY2thZ2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCk7CiAJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VQYXRoLnRvU3RyaW5nKCk7CiAJCQkJCWlmIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKIAkJCQkJCS8vIHNlZSBpZiBhbnkga25vd24gc291cmNlIGZpbGUgaXMgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLi4uIGNsYXNzcGF0aCBhbHJlYWR5IGluY2x1ZGVzIG5ldyBwYWNrYWdlCiAJCQkJCQlpZiAoIW5ld1N0YXRlLmlzS25vd25QYWNrYWdlKHBhY2thZ2VOYW1lKSkgewogCQkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiBhZGRlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBhZGRlZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlhZGREZXBlbmRlbnRzT2YocGFja2FnZVBhdGgsIGZhbHNlKTsKIAkJCQkJCQlyZXR1cm47CiAJCQkJCQl9CkBAIC0yNDQsNyArMjYyLDcgQEAKIAkJCQkJCS8vIHNlZSBpZiB0aGUgcGFja2FnZSBzdGlsbCBleGlzdHMgb24gdGhlIGNsYXNzcGF0aAogCQkJCQkJaWYgKCFuYW1lRW52aXJvbm1lbnQuaXNQYWNrYWdlKHBhY2thZ2VOYW1lKSkgewogCQkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiByZW1vdmVkIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHJlbW92ZWQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJYWRkRGVwZW5kZW50c09mKHBhY2thZ2VQYXRoLCBmYWxzZSk7CiAJCQkJCQkJcmV0dXJuOwogCQkJCQkJfQpAQCAtMjU0LDI1ICsyNzIsMjUgQEAKIAkJCQkJLy8gZmFsbCB0aHJ1ICYgdHJhdmVyc2UgdGhlIHN1Yi1wYWNrYWdlcyBhbmQgLmNsYXNzIGZpbGVzCiAJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKIAkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGJpbmFyeURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCQkJCQlmb3IgKGludCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJCQkJCWZpbmRBZmZlY3RlZFNvdXJjZUZpbGVzKGNoaWxkcmVuW2ldLCBzZWdtZW50Q291bnQpOwogCQkJfQogCQkJcmV0dXJuOwogCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCWlmIChKYXZhQnVpbGRlci5DTEFTU19FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShsb2NhdGlvbi5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJSVBhdGggdHlwZVBhdGggPSBsb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLm1ha2VSZWxhdGl2ZSgpLnNldERldmljZShudWxsKTsKKwkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShyZXNvdXJjZS5nZXROYW1lKCkpKSB7CisJCQkJSVBhdGggdHlwZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7CiAJCQkJc3dpdGNoIChiaW5hcnlEZWx0YS5nZXRLaW5kKCkpIHsKIAkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CiAJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiBhZGRlZC9yZW1vdmVkIGNsYXNzIGZpbGUgIiArIHR5cGVQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgYWRkZWQvcmVtb3ZlZCBjbGFzcyBmaWxlICIgKyB0eXBlUGF0aCk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWFkZERlcGVuZGVudHNPZih0eXBlUGF0aCwgZmFsc2UpOwogCQkJCQkJcmV0dXJuOwogCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgogCQkJCQkJaWYgKChiaW5hcnlEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCkKIAkJCQkJCQlyZXR1cm47IC8vIHNraXAgaXQgc2luY2UgaXQgcmVhbGx5IGlzbid0IGNoYW5nZWQKIAkJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBkZXBlbmRlbnRzIG9mIGNoYW5nZWQgY2xhc3MgZmlsZSAiICsgdHlwZVBhdGgpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBjaGFuZ2VkIGNsYXNzIGZpbGUgIiArIHR5cGVQYXRoKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJYWRkRGVwZW5kZW50c09mKHR5cGVQYXRoLCBmYWxzZSk7CiAJCQkJfQogCQkJCXJldHVybjsKQEAgLTI4MSwxMTkgKzI5OSwxMzcgQEAKIH0KIAogcHJvdGVjdGVkIGJvb2xlYW4gZmluZFNvdXJjZUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEgPSBkZWx0YS5maW5kTWVtYmVyKHNvdXJjZUZvbGRlcnNbaV0uZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJaWYgKHNvdXJjZURlbHRhICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2VEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBQk9SVElORyBpbmNyZW1lbnRhbCBidWlsZC4uLiBmb3VuZCByZW1vdmVkIHNvdXJjZSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsgLy8gcmVtb3ZlZCBzb3VyY2UgZm9sZGVyIHNob3VsZCBub3QgbWFrZSBpdCBoZXJlLCBidXQgaGFuZGxlIGFueXdheXMgKEFEREVEIGlzIHN1cHBvcnRlZCkKKwlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkgbWQgPSBzb3VyY2VMb2NhdGlvbnNbaV07CisJCWlmIChtZC5zb3VyY2VGb2xkZXIuZXF1YWxzKGphdmFCdWlsZGVyLmN1cnJlbnRQcm9qZWN0KSkgeworCQkJLy8gc2tpcCBuZXN0ZWQgc291cmNlICYgb3V0cHV0IGZvbGRlcnMgd2hlbiB0aGUgcHJvamVjdCBpcyBhIHNvdXJjZSBmb2xkZXIKKwkJCWludCBzZWdtZW50Q291bnQgPSBkZWx0YS5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOworCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCWZvciAoaW50IGogPSAwLCBtID0gY2hpbGRyZW4ubGVuZ3RoOyBqIDwgbTsgaisrKQorCQkJCWlmICghaXNFeGNsdWRlZEZyb21Qcm9qZWN0KGNoaWxkcmVuW2ldLmdldEZ1bGxQYXRoKCkpKQorCQkJCQlmaW5kU291cmNlRmlsZXMoY2hpbGRyZW5bal0sIG1kLCBzZWdtZW50Q291bnQpOworCQl9IGVsc2UgeworCQkJSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEgPSBkZWx0YS5maW5kTWVtYmVyKG1kLnNvdXJjZUZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworCisJCQlpZiAoc291cmNlRGVsdGEgIT0gbnVsbCkgeworCQkJCWlmIChzb3VyY2VEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFCT1JUSU5HIGluY3JlbWVudGFsIGJ1aWxkLi4uIGZvdW5kIHJlbW92ZWQgc291cmNlIGZvbGRlciIpOyAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBmYWxzZTsgLy8gcmVtb3ZlZCBzb3VyY2UgZm9sZGVyIHNob3VsZCBub3QgbWFrZSBpdCBoZXJlLCBidXQgaGFuZGxlIGFueXdheXMgKEFEREVEIGlzIHN1cHBvcnRlZCkKKwkJCQl9CisJCQkJaW50IHNlZ21lbnRDb3VudCA9IHNvdXJjZURlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7CisJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IHNvdXJjZURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IGNoaWxkcmVuLmxlbmd0aDsgaiA8IG07IGorKykKKwkJCQkJZmluZFNvdXJjZUZpbGVzKGNoaWxkcmVuW2pdLCBtZCwgc2VnbWVudENvdW50KTsKIAkJCX0KLQkJCWludCBzZWdtZW50Q291bnQgPSBzb3VyY2VGb2xkZXJzW2ldLmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCk7Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuID0gc291cmNlRGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgYyA9IDAsIGNsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGMgPCBjbGVuZ3RoOyBjKyspCi0JCQkJZmluZFNvdXJjZUZpbGVzKGNoaWxkcmVuW2NdLCBzZWdtZW50Q291bnQpOwotCQkJbm90aWZpZXIuY2hlY2tDYW5jZWwoKTsKIAkJfQorCQlub3RpZmllci5jaGVja0NhbmNlbCgpOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAotcHJvdGVjdGVkIHZvaWQgZmluZFNvdXJjZUZpbGVzKElSZXNvdXJjZURlbHRhIHNvdXJjZURlbHRhLCBpbnQgc2VnbWVudENvdW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCBmaW5kU291cmNlRmlsZXMoSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEsIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG1kLCBpbnQgc2VnbWVudENvdW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJLy8gV2hlbiBhIHBhY2thZ2UgYmVjb21lcyBhIHR5cGUgb3IgdmljZSB2ZXJzYSwgZXhwZWN0IDIgZGVsdGFzLAogCS8vIG9uZSBvbiB0aGUgZm9sZGVyICYgb25lIG9uIHRoZSBzb3VyY2UgZmlsZQogCUlSZXNvdXJjZSByZXNvdXJjZSA9IHNvdXJjZURlbHRhLmdldFJlc291cmNlKCk7Ci0JSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCWlmIChtZC5leGNsdXNpb25QYXR0ZXJucyAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgbWQuZXhjbHVzaW9uUGF0dGVybnMpKSByZXR1cm47CiAJc3dpdGNoKHJlc291cmNlLmdldFR5cGUoKSkgewotCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKIAkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKIAkJCXN3aXRjaCAoc291cmNlRGVsdGEuZ2V0S2luZCgpKSB7CiAJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCUlQYXRoIGFkZGVkUGFja2FnZVBhdGggPSBsb2NhdGlvbi5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCkubWFrZVJlbGF0aXZlKCkuc2V0RGV2aWNlKG51bGwpOwotCQkJCQlnZXRPdXRwdXRGb2xkZXIoYWRkZWRQYWNrYWdlUGF0aCk7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgorCQkJCQlJUGF0aCBhZGRlZFBhY2thZ2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRDb3VudCk7CisJCQkJCWNyZWF0ZUZvbGRlcihhZGRlZFBhY2thZ2VQYXRoLCBtZC5iaW5hcnlGb2xkZXIpOyAvLyBlbnN1cmUgcGFja2FnZSBleGlzdHMgaW4gdGhlIG91dHB1dCBmb2xkZXIKIAkJCQkJLy8gYWRkIGRlcGVuZGVudHMgZXZlbiB3aGVuIHRoZSBwYWNrYWdlIHRoaW5rcyBpdCBleGlzdHMgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQogCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBkZXBlbmRlbnRzIG9mIGFkZGVkIHBhY2thZ2UgIiArIGFkZGVkUGFja2FnZVBhdGgpOyAvLyROT04tTkxTLTEkCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIGFkZGVkIHBhY2thZ2UgIiArIGFkZGVkUGFja2FnZVBhdGgpOyAvLyROT04tTkxTLTEkCiAJCQkJCWFkZERlcGVuZGVudHNPZihhZGRlZFBhY2thZ2VQYXRoLCB0cnVlKTsKIAkJCQkJLy8gZmFsbCB0aHJ1ICYgY29sbGVjdCBhbGwgdGhlIHNvdXJjZSBmaWxlcwogCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CiAJCQkJCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBzb3VyY2VEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCQkJCWZpbmRTb3VyY2VGaWxlcyhjaGlsZHJlbltpXSwgc2VnbWVudENvdW50KTsKKwkJCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQkJCQlmaW5kU291cmNlRmlsZXMoY2hpbGRyZW5baV0sIG1kLCBzZWdtZW50Q291bnQpOwogCQkJCQlyZXR1cm47CiAJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJSVBhdGggcmVtb3ZlZFBhY2thZ2VQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLm1ha2VSZWxhdGl2ZSgpLnNldERldmljZShudWxsKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNvdXJjZUZvbGRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChzb3VyY2VGb2xkZXJzW2ldLmZpbmRNZW1iZXIocmVtb3ZlZFBhY2thZ2VQYXRoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gb25seSBhIHBhY2thZ2UgZnJhZ21lbnQgd2FzIHJlbW92ZWQsIHNhbWUgYXMgcmVtb3ZpbmcgbXVsdGlwbGUgc291cmNlIGZpbGVzCi0JCQkJCQkJZ2V0T3V0cHV0Rm9sZGVyKHJlbW92ZWRQYWNrYWdlUGF0aCk7IC8vIGVuc3VyZSBwYWNrYWdlIGV4aXN0cyBpbiB0aGUgb3V0cHV0IGZvbGRlcgotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gcmVtb3ZlZENoaWxkcmVuID0gc291cmNlRGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCWZvciAoaW50IGogPSAwLCBybGVuZ3RoID0gcmVtb3ZlZENoaWxkcmVuLmxlbmd0aDsgaiA8IHJsZW5ndGg7IGorKykKLQkJCQkJCQkJZmluZFNvdXJjZUZpbGVzKHJlbW92ZWRDaGlsZHJlbltqXSwgc2VnbWVudENvdW50KTsKLQkJCQkJCQlyZXR1cm47CisJCQkJCUlQYXRoIHJlbW92ZWRQYWNrYWdlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpOworCQkJCQlpZiAoc291cmNlTG9jYXRpb25zLmxlbmd0aCA+IDEpIHsKKwkJCQkJCWZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCQkJCWlmIChzb3VyY2VMb2NhdGlvbnNbaV0uc291cmNlRm9sZGVyLmdldEZvbGRlcihyZW1vdmVkUGFja2FnZVBhdGgpLmV4aXN0cygpKSB7CisJCQkJCQkJCS8vIG9ubHkgYSBwYWNrYWdlIGZyYWdtZW50IHdhcyByZW1vdmVkLCBzYW1lIGFzIHJlbW92aW5nIG11bHRpcGxlIHNvdXJjZSBmaWxlcworCQkJCQkJCQljcmVhdGVGb2xkZXIocmVtb3ZlZFBhY2thZ2VQYXRoLCBtZC5iaW5hcnlGb2xkZXIpOyAvLyBlbnN1cmUgcGFja2FnZSBleGlzdHMgaW4gdGhlIG91dHB1dCBmb2xkZXIKKwkJCQkJCQkJSVJlc291cmNlRGVsdGFbXSByZW1vdmVkQ2hpbGRyZW4gPSBzb3VyY2VEZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7CisJCQkJCQkJCWZvciAoaW50IGogPSAwLCBtID0gcmVtb3ZlZENoaWxkcmVuLmxlbmd0aDsgaiA8IG07IGorKykKKwkJCQkJCQkJCWZpbmRTb3VyY2VGaWxlcyhyZW1vdmVkQ2hpbGRyZW5bal0sIG1kLCBzZWdtZW50Q291bnQpOworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCUlGb2xkZXIgcmVtb3ZlZFBhY2thZ2VGb2xkZXIgPSBvdXRwdXRGb2xkZXIuZ2V0Rm9sZGVyKHJlbW92ZWRQYWNrYWdlUGF0aCk7CisJCQkJCUlGb2xkZXIgcmVtb3ZlZFBhY2thZ2VGb2xkZXIgPSBtZC5iaW5hcnlGb2xkZXIuZ2V0Rm9sZGVyKHJlbW92ZWRQYWNrYWdlUGF0aCk7CiAJCQkJCWlmIChyZW1vdmVkUGFja2FnZUZvbGRlci5leGlzdHMoKSkKIAkJCQkJCXJlbW92ZWRQYWNrYWdlRm9sZGVyLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwogCQkJCQkvLyBhZGQgZGVwZW5kZW50cyBldmVuIHdoZW4gdGhlIHBhY2thZ2UgdGhpbmtzIGl0IGRvZXMgbm90IGV4aXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGQgZGVwZW5kZW50cyBvZiByZW1vdmVkIHBhY2thZ2UgIiArIHJlbW92ZWRQYWNrYWdlUGF0aCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgcmVtb3ZlZCBwYWNrYWdlICIgKyByZW1vdmVkUGFja2FnZVBhdGgpOyAvLyROT04tTkxTLTEkCiAJCQkJCWFkZERlcGVuZGVudHNPZihyZW1vdmVkUGFja2FnZVBhdGgsIHRydWUpOwogCQkJCQluZXdTdGF0ZS5yZW1vdmVQYWNrYWdlKHNvdXJjZURlbHRhKTsKIAkJCX0KIAkJCXJldHVybjsKIAkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gbG9jYXRpb24uZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKEphdmFCdWlsZGVyLkpBVkFfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgewotCQkJCUlQYXRoIHR5cGVQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5tYWtlUmVsYXRpdmUoKS5zZXREZXZpY2UobnVsbCk7Ci0JCQkJU3RyaW5nIHNvdXJjZUxvY2F0aW9uID0gbG9jYXRpb24udG9TdHJpbmcoKTsKKwkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisJCQlpZiAoVXRpbC5pc0phdmFGaWxlTmFtZShyZXNvdXJjZU5hbWUpKSB7CisJCQkJSVBhdGggdHlwZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7CisJCQkJU3RyaW5nIHR5cGVMb2NhdG9yID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7CiAJCQkJc3dpdGNoIChzb3VyY2VEZWx0YS5nZXRLaW5kKCkpIHsKIAkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgYWRkZWQgc291cmNlIGZpbGUgIiArIHNvdXJjZUxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9jYXRpb25zLmFkZChzb3VyY2VMb2NhdGlvbik7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgYWRkZWQgc291cmNlIGZpbGUgIiArIHR5cGVMb2NhdG9yKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJc291cmNlRmlsZXMuYWRkKG5ldyBTb3VyY2VGaWxlKChJRmlsZSkgcmVzb3VyY2UsIG1kLCBlbmNvZGluZykpOwogCQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gdHlwZVBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCXR5cGVOYW1lcy5hZGQodHlwZU5hbWUpOwotCQkJCQkJaWYgKCFuZXdTdGF0ZS5pc0R1cGxpY2F0ZUxvY2F0aW9uKHR5cGVOYW1lLCBzb3VyY2VMb2NhdGlvbikpIHsgLy8gYWRkaW5nIGRlcGVuZGVudHMgcmVzdWx0cyBpbiAyIGR1cGxpY2F0ZSBlcnJvcnMKKwkJCQkJCWlmICghbmV3U3RhdGUuaXNEdXBsaWNhdGVMb2NhdG9yKHR5cGVOYW1lLCB0eXBlTG9jYXRvcikpIHsgLy8gYWRkaW5nIGRlcGVuZGVudHMgcmVzdWx0cyBpbiAyIGR1cGxpY2F0ZSBlcnJvcnMKIAkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgYWRkZWQgc291cmNlIGZpbGUgIiArIHR5cGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIGFkZGVkIHNvdXJjZSBmaWxlICIgKyB0eXBlTmFtZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlhZGREZXBlbmRlbnRzT2YodHlwZVBhdGgsIHRydWUpOwogCQkJCQkJfQogCQkJCQkJcmV0dXJuOwogCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcyA9IG5ld1N0YXRlLmdldERlZmluZWRUeXBlTmFtZXNGb3Ioc291cmNlTG9jYXRpb24pOworCQkJCQkJY2hhcltdW10gZGVmaW5lZFR5cGVOYW1lcyA9IG5ld1N0YXRlLmdldERlZmluZWRUeXBlTmFtZXNGb3IodHlwZUxvY2F0b3IpOwogCQkJCQkJaWYgKGRlZmluZWRUeXBlTmFtZXMgPT0gbnVsbCkgeyAvLyBkZWZpbmVkIGEgc2luZ2xlIHR5cGUgbWF0Y2hpbmcgdHlwZVBhdGgKLQkJCQkJCQlyZW1vdmVDbGFzc0ZpbGUodHlwZVBhdGgpOworCQkJCQkJCXJlbW92ZUNsYXNzRmlsZSh0eXBlUGF0aCwgbWQuYmluYXJ5Rm9sZGVyKTsKKwkJCQkJCQlpZiAoKHNvdXJjZURlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgeworCQkJCQkJCQkvLyByZW1vdmUgcHJvYmxlbXMgYW5kIHRhc2tzIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBiZWluZyBtb3ZlZCAodG8gYW5vdGhlciBwYWNrYWdlIG9yIHJlbmFtZWQpCisJCQkJCQkJCS8vIGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBhIGNvbXBpbGF0aW9uIHVuaXQsIHRoZSBuZXcgY3Ugd2lsbCBiZSByZWNvbXBpbGVkCisJCQkJCQkJCS8vIGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBhIG5vbi1qYXZhIHJlc291cmNlLCB0aGVuIG1hcmtlcnMgYXJlIHJlbW92ZWQKKwkJCQkJCQkJLy8gc2VlIGJ1ZyAyODU3CisJCQkJCQkJCUlSZXNvdXJjZSBtb3ZlZEZpbGUgPSBqYXZhQnVpbGRlci53b3Jrc3BhY2VSb290LmdldEZpbGUoc291cmNlRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSk7CisJCQkJCQkJCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IobW92ZWRGaWxlKTsgCisJCQkJCQkJfQogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkIGRlcGVuZGVudHMgb2YgcmVtb3ZlZCBzb3VyY2UgZmlsZSAiICsgdHlwZVBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCByZW1vdmVkIHNvdXJjZSBmaWxlICIgKyB0eXBlUGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCWFkZERlcGVuZGVudHNPZih0eXBlUGF0aCwgdHJ1ZSk7IC8vIGFkZCBkZXBlbmRlbnRzIG9mIHRoZSBzb3VyY2UgZmlsZSBzaW5jZSBpdCBtYXkgYmUgaW52b2x2ZWQgaW4gYSBuYW1lIGNvbGxpc2lvbgogCQkJCQkJCWlmIChkZWZpbmVkVHlwZU5hbWVzLmxlbmd0aCA+IDApIHsgLy8gc2tpcCBpdCBpZiBpdCBmYWlsZWQgdG8gc3VjY2Vzc2Z1bGx5IGRlZmluZSBhIHR5cGUKIAkJCQkJCQkJSVBhdGggcGFja2FnZVBhdGggPSB0eXBlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBkZWZpbmVkVHlwZU5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJCQkJCQkJcmVtb3ZlQ2xhc3NGaWxlKHBhY2thZ2VQYXRoLmFwcGVuZChuZXcgU3RyaW5nKGRlZmluZWRUeXBlTmFtZXNbaV0pKSk7CisJCQkJCQkJCWZvciAoaW50IGkgPSAwLCBsID0gZGVmaW5lZFR5cGVOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQkJCQkJCQlyZW1vdmVDbGFzc0ZpbGUocGFja2FnZVBhdGguYXBwZW5kKG5ldyBTdHJpbmcoZGVmaW5lZFR5cGVOYW1lc1tpXSkpLCBtZC5iaW5hcnlGb2xkZXIpOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJCW5ld1N0YXRlLnJlbW92ZShzb3VyY2VMb2NhdGlvbik7CisJCQkJCQluZXdTdGF0ZS5yZW1vdmVMb2NhdG9yKHR5cGVMb2NhdG9yKTsKIAkJCQkJCXJldHVybjsKIAkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKIAkJCQkJCWlmICgoc291cmNlRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApCiAJCQkJCQkJcmV0dXJuOyAvLyBza2lwIGl0IHNpbmNlIGl0IHJlYWxseSBpc24ndCBjaGFuZ2VkCiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgY2hhbmdlZCBzb3VyY2UgZmlsZSAiICsgc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2NhdGlvbnMuYWRkKHNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJCXR5cGVOYW1lcy5hZGQodHlwZVBhdGgudG9TdHJpbmcoKSk7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlIHRoaXMgY2hhbmdlZCBzb3VyY2UgZmlsZSAiICsgdHlwZUxvY2F0b3IpOyAvLyROT04tTkxTLTEkCisJCQkJCQlzb3VyY2VGaWxlcy5hZGQobmV3IFNvdXJjZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgbWQsIGVuY29kaW5nKSk7CiAJCQkJfQogCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoSmF2YUJ1aWxkZXIuQ0xBU1NfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeworCQkJfSBlbHNlIGlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShyZXNvdXJjZU5hbWUpKSB7CiAJCQkJcmV0dXJuOyAvLyBza2lwIGNsYXNzIGZpbGVzCi0JCQl9IGVsc2UgaWYgKGhhc1NlcGFyYXRlT3V0cHV0Rm9sZGVyKSB7Ci0JCQkJaWYgKGphdmFCdWlsZGVyLmZpbHRlclJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuOworCQkJfSBlbHNlIGlmIChtZC5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlcikgeworCQkJCWlmIChqYXZhQnVpbGRlci5maWx0ZXJFeHRyYVJlc291cmNlKHJlc291cmNlKSkgcmV0dXJuOwogCiAJCQkJLy8gY29weSBhbGwgb3RoZXIgcmVzb3VyY2UgZGVsdGFzIHRvIHRoZSBvdXRwdXQgZm9sZGVyCi0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gbG9jYXRpb24ucmVtb3ZlRmlyc3RTZWdtZW50cyhzZWdtZW50Q291bnQpLm1ha2VSZWxhdGl2ZSgpOwotCQkJCUlSZXNvdXJjZSBvdXRwdXRGaWxlID0gb3V0cHV0Rm9sZGVyLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKKwkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudENvdW50KTsKKwkJCQlJUmVzb3VyY2Ugb3V0cHV0RmlsZSA9IG1kLmJpbmFyeUZvbGRlci5nZXRGaWxlKHJlc291cmNlUGF0aCk7CiAJCQkJc3dpdGNoIChzb3VyY2VEZWx0YS5nZXRLaW5kKCkpIHsKIAkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CiAJCQkJCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgewpAQCAtNDAzLDcgKzQzOSw3IEBACiAJCQkJCQl9CiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGFkZGVkIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldE91dHB1dEZvbGRlcihyZXNvdXJjZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsgLy8gZW5zdXJlIHBhY2thZ2UgZXhpc3RzIGluIHRoZSBvdXRwdXQgZm9sZGVyCisJCQkJCQljcmVhdGVGb2xkZXIocmVzb3VyY2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgbWQuYmluYXJ5Rm9sZGVyKTsgLy8gZW5zdXJlIHBhY2thZ2UgZXhpc3RzIGluIHRoZSBvdXRwdXQgZm9sZGVyCiAJCQkJCQlyZXNvdXJjZS5jb3B5KG91dHB1dEZpbGUuZ2V0RnVsbFBhdGgoKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKIAkJCQkJCW91dHB1dEZpbGUuc2V0RGVyaXZlZCh0cnVlKTsKIAkJCQkJCXJldHVybjsKQEAgLTQyNCw3ICs0NjAsNyBAQAogCQkJCQkJfQogCQkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29weWluZyBjaGFuZ2VkIGZpbGUgIiArIHJlc291cmNlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldE91dHB1dEZvbGRlcihyZXNvdXJjZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsgLy8gZW5zdXJlIHBhY2thZ2UgZXhpc3RzIGluIHRoZSBvdXRwdXQgZm9sZGVyCisJCQkJCQljcmVhdGVGb2xkZXIocmVzb3VyY2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgbWQuYmluYXJ5Rm9sZGVyKTsgLy8gZW5zdXJlIHBhY2thZ2UgZXhpc3RzIGluIHRoZSBvdXRwdXQgZm9sZGVyCiAJCQkJCQlyZXNvdXJjZS5jb3B5KG91dHB1dEZpbGUuZ2V0RnVsbFBhdGgoKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKIAkJCQkJCW91dHB1dEZpbGUuc2V0RGVyaXZlZCh0cnVlKTsKIAkJCQl9CkBAIC00MzMsMzIgKzQ2OSwzOSBAQAogCX0KIH0KIAotcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRXaXRoKFN0cmluZyBzb3VyY2VMb2NhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0LCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgZGVmaW5lZFR5cGVOYW1lcywgQXJyYXlMaXN0IGR1cGxpY2F0ZVR5cGVOYW1lcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHByZXZpb3VzVHlwZU5hbWVzID0gbmV3U3RhdGUuZ2V0RGVmaW5lZFR5cGVOYW1lc0Zvcihzb3VyY2VMb2NhdGlvbik7Citwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFdpdGgoU3RyaW5nIHNvdXJjZUxvY2F0b3IsIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCwgY2hhcltdIG1haW5UeXBlTmFtZSwgQXJyYXlMaXN0IGRlZmluZWRUeXBlTmFtZXMsIEFycmF5TGlzdCBkdXBsaWNhdGVUeXBlTmFtZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwljaGFyW11bXSBwcmV2aW91c1R5cGVOYW1lcyA9IG5ld1N0YXRlLmdldERlZmluZWRUeXBlTmFtZXNGb3Ioc291cmNlTG9jYXRvcik7CiAJaWYgKHByZXZpb3VzVHlwZU5hbWVzID09IG51bGwpCiAJCXByZXZpb3VzVHlwZU5hbWVzID0gbmV3IGNoYXJbXVtdIHttYWluVHlwZU5hbWV9OwogCUlQYXRoIHBhY2thZ2VQYXRoID0gbnVsbDsKLQluZXh0IDogZm9yIChpbnQgaSA9IDAsIHggPSBwcmV2aW91c1R5cGVOYW1lcy5sZW5ndGg7IGkgPCB4OyBpKyspIHsKKwluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBwcmV2aW91c1R5cGVOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJY2hhcltdIHByZXZpb3VzID0gcHJldmlvdXNUeXBlTmFtZXNbaV07Ci0JCWZvciAoaW50IGogPSAwLCB5ID0gZGVmaW5lZFR5cGVOYW1lcy5zaXplKCk7IGogPCB5OyBqKyspCisJCWZvciAoaW50IGogPSAwLCBtID0gZGVmaW5lZFR5cGVOYW1lcy5zaXplKCk7IGogPCBtOyBqKyspCiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocHJldmlvdXMsIChjaGFyW10pIGRlZmluZWRUeXBlTmFtZXMuZ2V0KGopKSkKIAkJCQljb250aW51ZSBuZXh0OwogCi0JCWlmIChwYWNrYWdlUGF0aCA9PSBudWxsKQotCQkJcGFja2FnZVBhdGggPSBuZXcgUGF0aChleHRyYWN0VHlwZU5hbWVGcm9tKHNvdXJjZUxvY2F0aW9uKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQlTb3VyY2VGaWxlIHNvdXJjZUZpbGUgPSAoU291cmNlRmlsZSkgcmVzdWx0LmdldENvbXBpbGF0aW9uVW5pdCgpOworCQlpZiAocGFja2FnZVBhdGggPT0gbnVsbCkgeworCQkJaW50IGNvdW50ID0gc291cmNlRmlsZS5zb3VyY2VMb2NhdGlvbi5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS5zZWdtZW50Q291bnQoKTsKKwkJCXBhY2thZ2VQYXRoID0gc291cmNlRmlsZS5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJfQogCQlpZiAoc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9PSBudWxsKQotCQkJdGhpcy5zZWNvbmRhcnlUeXBlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmFkZChwYWNrYWdlUGF0aC5hcHBlbmQobmV3IFN0cmluZyhwcmV2aW91cykpKTsKKwkJCXRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgpOworCQlBcnJheUxpc3QgdHlwZXMgPSAoQXJyYXlMaXN0KSBzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmdldChzb3VyY2VGaWxlLnNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlcik7CisJCWlmICh0eXBlcyA9PSBudWxsKQorCQkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0KGRlZmluZWRUeXBlTmFtZXMuc2l6ZSgpKTsKKwkJdHlwZXMuYWRkKHBhY2thZ2VQYXRoLmFwcGVuZChuZXcgU3RyaW5nKHByZXZpb3VzKSkpOworCQlzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLnB1dChzb3VyY2VGaWxlLnNvdXJjZUxvY2F0aW9uLmJpbmFyeUZvbGRlciwgdHlwZXMpOwogCX0KLQlzdXBlci5maW5pc2hlZFdpdGgoc291cmNlTG9jYXRpb24sIHJlc3VsdCwgbWFpblR5cGVOYW1lLCBkZWZpbmVkVHlwZU5hbWVzLCBkdXBsaWNhdGVUeXBlTmFtZXMpOworCXN1cGVyLmZpbmlzaGVkV2l0aChzb3VyY2VMb2NhdG9yLCByZXN1bHQsIG1haW5UeXBlTmFtZSwgZGVmaW5lZFR5cGVOYW1lcywgZHVwbGljYXRlVHlwZU5hbWVzKTsKIH0KIAotcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2xhc3NGaWxlKElQYXRoIHR5cGVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCByZW1vdmVDbGFzc0ZpbGUoSVBhdGggdHlwZVBhdGgsIElDb250YWluZXIgb3V0cHV0Rm9sZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJaWYgKHR5cGVQYXRoLmxhc3RTZWdtZW50KCkuaW5kZXhPZignJCcpID09IC0xKSB7IC8vIGlzIG5vdCBhIG5lc3RlZCB0eXBlCi0JCW5ld1N0YXRlLnJlbW92ZVR5cGVMb2NhdGlvbih0eXBlUGF0aC50b1N0cmluZygpKTsKKwkJbmV3U3RhdGUucmVtb3ZlUXVhbGlmaWVkVHlwZU5hbWUodHlwZVBhdGgudG9TdHJpbmcoKSk7CiAJCS8vIGFkZCBkZXBlbmRlbnRzIGV2ZW4gd2hlbiB0aGUgdHlwZSB0aGlua3MgaXQgZG9lcyBub3QgZXhpc3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZQogCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBkZXBlbmRlbnRzIG9mIHJlbW92ZWQgdHlwZSAiICsgdHlwZVBhdGgpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHJlbW92ZWQgdHlwZSAiICsgdHlwZVBhdGgpOyAvLyROT04tTkxTLTEkCiAJCWFkZERlcGVuZGVudHNPZih0eXBlUGF0aCwgdHJ1ZSk7IC8vIHdoZW4gbWVtYmVyIHR5cGVzIGFyZSByZW1vdmVkLCB0aGVpciBlbmNsb3NpbmcgdHlwZSBpcyBzdHJ1Y3R1cmFsbHkgY2hhbmdlZAogCX0KIAlJRmlsZSBjbGFzc0ZpbGUgPSBvdXRwdXRGb2xkZXIuZ2V0RmlsZSh0eXBlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKEphdmFCdWlsZGVyLkNMQVNTX0VYVEVOU0lPTikpOwpAQCAtNDcxLDYxICs1MTQsOTQgQEAKIAogcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vjb25kYXJ5VHlwZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJaWYgKHNlY29uZGFyeVR5cGVzVG9SZW1vdmUgIT0gbnVsbCkgeyAvLyBkZWxheWVkIGRlbGV0aW5nIHNlY29uZGFyeSB0eXBlcyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjb21waWxlIGxvb3AKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHNlY29uZGFyeVR5cGVzVG9SZW1vdmUuc2l6ZSgpOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlyZW1vdmVDbGFzc0ZpbGUoKElQYXRoKSBzZWNvbmRhcnlUeXBlc1RvUmVtb3ZlLmdldChpKSk7CisJCU9iamVjdFtdIGtleVRhYmxlID0gc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZS5rZXlUYWJsZTsKKwkJT2JqZWN0W10gdmFsdWVUYWJsZSA9IHNlY29uZGFyeVR5cGVzVG9SZW1vdmUudmFsdWVUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCUlDb250YWluZXIgb3V0cHV0Rm9sZGVyID0gKElDb250YWluZXIpIGtleVRhYmxlW2ldOworCQkJaWYgKG91dHB1dEZvbGRlciAhPSBudWxsKSB7CisJCQkJQXJyYXlMaXN0IHBhdGhzID0gKEFycmF5TGlzdCkgdmFsdWVUYWJsZVtpXTsKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IHBhdGhzLnNpemUoKTsgaiA8IG07IGorKykKKwkJCQkJcmVtb3ZlQ2xhc3NGaWxlKChJUGF0aCkgcGF0aHMuZ2V0KGopLCBvdXRwdXRGb2xkZXIpOworCQkJfQorCQl9CiAJCXRoaXMuc2Vjb25kYXJ5VHlwZXNUb1JlbW92ZSA9IG51bGw7Ci0JCWlmIChwcmV2aW91c0xvY2F0aW9ucyAhPSBudWxsICYmIHByZXZpb3VzTG9jYXRpb25zLnNpemUoKSA+IDEpCi0JCQl0aGlzLnByZXZpb3VzTG9jYXRpb25zID0gbnVsbDsgLy8gY2Fubm90IG9wdGltaXplIHJlY29tcGlsZSBjYXNlIHdoZW4gYSBzZWNvbmRhcnkgdHlwZSBpcyBkZWxldGVkCisJCWlmIChwcmV2aW91c1NvdXJjZUZpbGVzICE9IG51bGwgJiYgcHJldmlvdXNTb3VyY2VGaWxlcy5zaXplKCkgPiAxKQorCQkJdGhpcy5wcmV2aW91c1NvdXJjZUZpbGVzID0gbnVsbDsgLy8gY2Fubm90IG9wdGltaXplIHJlY29tcGlsZSBjYXNlIHdoZW4gYSBzZWNvbmRhcnkgdHlwZSBpcyBkZWxldGVkCiAJfQogfQogCiBwcm90ZWN0ZWQgdm9pZCByZXNldENvbGxlY3Rpb25zKCkgewotCXByZXZpb3VzTG9jYXRpb25zID0gbG9jYXRpb25zLmlzRW1wdHkoKSA/IG51bGwgOiAoQXJyYXlMaXN0KSBsb2NhdGlvbnMuY2xvbmUoKTsKKwlwcmV2aW91c1NvdXJjZUZpbGVzID0gc291cmNlRmlsZXMuaXNFbXB0eSgpID8gbnVsbCA6IChBcnJheUxpc3QpIHNvdXJjZUZpbGVzLmNsb25lKCk7CiAKLQlsb2NhdGlvbnMuY2xlYXIoKTsKLQl0eXBlTmFtZXMuY2xlYXIoKTsKKwlzb3VyY2VGaWxlcy5jbGVhcigpOwogCXF1YWxpZmllZFN0cmluZ3MuY2xlYXIoKTsKIAlzaW1wbGVTdHJpbmdzLmNsZWFyKCk7CiAJd29ya1F1ZXVlLmNsZWFyKCk7CiB9CiAKLXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2JsZW1zRm9yKFN0cmluZyBzb3VyY2VMb2NhdGlvbiwgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGb3JMb2NhdGlvbihzb3VyY2VMb2NhdGlvbik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBKYXZhQnVpbGRlci5nZXRQcm9ibGVtc0ZvcihyZXNvdXJjZSk7Citwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtc0ZvcihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlNYXJrZXJbXSBtYXJrZXJzID0gSmF2YUJ1aWxkZXIuZ2V0UHJvYmxlbXNGb3Ioc291cmNlRmlsZS5yZXNvdXJjZSk7CiAJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCWlmIChwcm9ibGVtcyA9PSBudWxsIHx8IHByb2JsZW1zLmxlbmd0aCA9PSAwKQotCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMCkgcmV0dXJuOworCWlmIChwcm9ibGVtcyA9PSBudWxsICYmIG1hcmtlcnMubGVuZ3RoID09IDApIHJldHVybjsKIAogCW5vdGlmaWVyLnVwZGF0ZVByb2JsZW1Db3VudHMobWFya2VycywgcHJvYmxlbXMpOwotCUphdmFCdWlsZGVyLnJlbW92ZVByb2JsZW1zRm9yKHJlc291cmNlKTsKLQlzdG9yZVByb2JsZW1zRm9yKHJlc291cmNlLCBwcm9ibGVtcyk7CisJSmF2YUJ1aWxkZXIucmVtb3ZlUHJvYmxlbXNGb3Ioc291cmNlRmlsZS5yZXNvdXJjZSk7CisJc3RvcmVQcm9ibGVtc0Zvcihzb3VyY2VGaWxlLCBwcm9ibGVtcyk7CiB9CiAKLXByb3RlY3RlZCBib29sZWFuIHdyaXRlQ2xhc3NGaWxlQ2hlY2soSUZpbGUgZmlsZSwgU3RyaW5nIGZpbGVOYW1lLCBieXRlW10gbmV3Qnl0ZXMsIGJvb2xlYW4gaXNTZWNvbmRhcnlUeXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Citwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrc0ZvcihTb3VyY2VGaWxlIHNvdXJjZUZpbGUsIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCUlNYXJrZXJbXSBtYXJrZXJzID0gSmF2YUJ1aWxkZXIuZ2V0VGFza3NGb3Ioc291cmNlRmlsZS5yZXNvdXJjZSk7CisJSVByb2JsZW1bXSB0YXNrcyA9IHJlc3VsdC5nZXRUYXNrcygpOworCWlmICh0YXNrcyA9PSBudWxsICYmIG1hcmtlcnMubGVuZ3RoID09IDApIHJldHVybjsKKworCUphdmFCdWlsZGVyLnJlbW92ZVRhc2tzRm9yKHNvdXJjZUZpbGUucmVzb3VyY2UpOworCXN0b3JlVGFza3NGb3Ioc291cmNlRmlsZSwgdGFza3MpOworfQorCitwcm90ZWN0ZWQgdm9pZCB3cml0ZUNsYXNzRmlsZUJ5dGVzKGJ5dGVbXSBieXRlcywgSUZpbGUgZmlsZSwgU3RyaW5nIHF1YWxpZmllZEZpbGVOYW1lLCBib29sZWFuIGlzU2Vjb25kYXJ5VHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCS8vIEJlZm9yZSB3cml0aW5nIG91dCB0aGUgY2xhc3MgZmlsZSwgY29tcGFyZSBpdCB0byB0aGUgcHJldmlvdXMgZmlsZQogCS8vIElmIHN0cnVjdHVyYWwgY2hhbmdlcyBvY2N1cmVkIHRoZW4gYWRkIGRlcGVuZGVudCBzb3VyY2UgZmlsZXMKIAlpZiAoZmlsZS5leGlzdHMoKSkgewotCQl0cnkgewotCQkJYnl0ZVtdIG9sZEJ5dGVzID0gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNCeXRlQXJyYXkoZmlsZSk7CisJCWlmICh3cml0ZUNsYXNzRmlsZUNoZWNrKGZpbGUsIHF1YWxpZmllZEZpbGVOYW1lLCBieXRlcykpIHsKKwkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgY2hhbmdlZCBjbGFzcyBmaWxlICIgKyBmaWxlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAorCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpLCB0cnVlLCBmYWxzZSwgbnVsbCk7CisJCQlpZiAoIWZpbGUuaXNEZXJpdmVkKCkpCisJCQkJZmlsZS5zZXREZXJpdmVkKHRydWUpOworCQl9IGVsc2UgaWYgKEphdmFCdWlsZGVyLkRFQlVHKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwZWQgb3ZlciB1bmNoYW5nZWQgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpc1NlY29uZGFyeVR5cGUpCisJCQlhZGREZXBlbmRlbnRzT2YobmV3IFBhdGgocXVhbGlmaWVkRmlsZU5hbWUpLCB0cnVlKTsgLy8gbmV3IHNlY29uZGFyeSB0eXBlCisJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBuZXcgY2xhc3MgZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKKwkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSwgSVJlc291cmNlLkZPUkNFLCBudWxsKTsKKwkJZmlsZS5zZXREZXJpdmVkKHRydWUpOworCX0KK30KKworcHJvdGVjdGVkIGJvb2xlYW4gd3JpdGVDbGFzc0ZpbGVDaGVjayhJRmlsZSBmaWxlLCBTdHJpbmcgZmlsZU5hbWUsIGJ5dGVbXSBuZXdCeXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXRyeSB7CisJCWJ5dGVbXSBvbGRCeXRlcyA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQnl0ZUFycmF5KGZpbGUpOworCQlpZiAodGhpcy5jb21waWxlTG9vcCA+IDEpIHsgLy8gb25seSBvcHRpbWl6ZSBmaWxlcyB3aGljaCB3ZXJlIHJlY29tcGlsZWQgZHVyaW5nIHRoZSBkZXBlbmRlbnQgcGFzcywgc2VlIDMzOTkwCiAJCQlub3RFcXVhbCA6IGlmIChuZXdCeXRlcy5sZW5ndGggPT0gb2xkQnl0ZXMubGVuZ3RoKSB7CiAJCQkJZm9yIChpbnQgaSA9IG5ld0J5dGVzLmxlbmd0aDsgLS1pID49IDA7KQogCQkJCQlpZiAobmV3Qnl0ZXNbaV0gIT0gb2xkQnl0ZXNbaV0pIGJyZWFrIG5vdEVxdWFsOwogCQkJCXJldHVybiBmYWxzZTsgLy8gYnl0ZXMgYXJlIGlkZW50aWNhbCBzbyBza2lwIHRoZW0KIAkJCX0KLQkJCUNsYXNzRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgQ2xhc3NGaWxlUmVhZGVyKG9sZEJ5dGVzLCBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpKTsKLQkJCS8vIGlnbm9yZSBsb2NhbCB0eXBlcyBzaW5jZSB0aGV5J3JlIG9ubHkgdmlzaWJsZSBpbnNpZGUgYSBzaW5nbGUgbWV0aG9kCi0JCQlpZiAoIShyZWFkZXIuaXNMb2NhbCgpIHx8IHJlYWRlci5pc0Fub255bW91cygpKSAmJiByZWFkZXIuaGFzU3RydWN0dXJhbENoYW5nZXMobmV3Qnl0ZXMpKSB7Ci0JCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUgaGFzIHN0cnVjdHVyYWwgY2hhbmdlcyAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkRGVwZW5kZW50c09mKG5ldyBQYXRoKGZpbGVOYW1lKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKKwkJaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBmYWxzZTsgLy8gdW5hYmxlIHRvIGRldGVybWluZSBsb2NhdGlvbiBvZiB0aGlzIGNsYXNzIGZpbGUKKwkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBDbGFzc0ZpbGVSZWFkZXIob2xkQnl0ZXMsIGxvY2F0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKSk7CisJCS8vIGlnbm9yZSBsb2NhbCB0eXBlcyBzaW5jZSB0aGV5J3JlIG9ubHkgdmlzaWJsZSBpbnNpZGUgYSBzaW5nbGUgbWV0aG9kCisJCWlmICghKHJlYWRlci5pc0xvY2FsKCkgfHwgcmVhZGVyLmlzQW5vbnltb3VzKCkpICYmIHJlYWRlci5oYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhuZXdCeXRlcykpIHsKKwkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUgaGFzIHN0cnVjdHVyYWwgY2hhbmdlcyAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCiAJCQlhZGREZXBlbmRlbnRzT2YobmV3IFBhdGgoZmlsZU5hbWUpLCB0cnVlKTsKIAkJfQotCi0JCWZpbGUuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JfSBlbHNlIGlmIChpc1NlY29uZGFyeVR5cGUpIHsKLQkJYWRkRGVwZW5kZW50c09mKG5ldyBQYXRoKGZpbGVOYW1lKSwgdHJ1ZSk7IC8vIG5ldyBzZWNvbmRhcnkgdHlwZQorCX0gY2F0Y2ggKENsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJYWRkRGVwZW5kZW50c09mKG5ldyBQYXRoKGZpbGVOYW1lKSwgdHJ1ZSk7CiAJfQogCXJldHVybiB0cnVlOwogfQpAQCAtNTYyLDggKzYzOCw4IEBACiAJYnVmZmVyLmFwcGVuZChwYXRoKTsKIAlTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwogCUlSZXNvdXJjZURlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKQorCWZvciAoaW50IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQlkdW1wKGNoaWxkcmVuW2ldKTsKIH0KICovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9KYXZhQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9KYXZhQnVpbGRlci5qYXZhCmluZGV4IDI1MzlmMjkuLjhlY2ZkMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvSmF2YUJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL0phdmFCdWlsZGVyLmphdmEKQEAgLTEsMjEgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKQEAgLTIzLDI1ICsyNCwxOSBAQAogcHVibGljIGNsYXNzIEphdmFCdWlsZGVyIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciB7CiAKIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OwotSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworSmF2YVByb2plY3QgamF2YVByb2plY3Q7CiBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290OwotQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc3BhdGg7Ci1JQ29udGFpbmVyIG91dHB1dEZvbGRlcjsKLUlDb250YWluZXJbXSBzb3VyY2VGb2xkZXJzOwotU2ltcGxlTG9va3VwVGFibGUgYmluYXJ5UmVzb3VyY2VzOyAvLyBtYXBzIGEgcHJvamVjdCB0byBpdHMgYmluYXJ5IHJlc291cmNlcyAob3V0cHV0IGZvbGRlciwgY2xhc3MgZm9sZGVycywgemlwL2phciBmaWxlcykKK05hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQ7CitTaW1wbGVMb29rdXBUYWJsZSBiaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0OyAvLyBtYXBzIGEgcHJvamVjdCB0byBpdHMgYmluYXJ5IHJlc291cmNlcyAob3V0cHV0IGZvbGRlcnMsIGNsYXNzIGZvbGRlcnMsIHppcC9qYXIgZmlsZXMpCiBTdGF0ZSBsYXN0U3RhdGU7CiBCdWlsZE5vdGlmaWVyIG5vdGlmaWVyOwotY2hhcltdW10gZmlsZUZpbHRlcnM7Ci1TdHJpbmdbXSBmb2xkZXJGaWx0ZXJzOworY2hhcltdW10gZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzOworU3RyaW5nW10gZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnM7CiAKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gImphdmEiOyAvLyROT04tTkxTLTEkCiBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRVhURU5TSU9OID0gImphciI7IC8vJE5PTi1OTFMtMSQKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpJUF9FWFRFTlNJT04gPSAiemlwIjsgLy8kTk9OLU5MUy0xJAogCiBwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAotc3RhdGljIGZpbmFsIFN0cmluZyBQcm9ibGVtTWFya2VyVGFnID0gSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSOwogLyoqCiAgKiBBIGxpc3Qgb2YgcHJvamVjdCBuYW1lcyB0aGF0IGhhdmUgYmVlbiBidWlsdC4KICAqIFRoaXMgbGlzdCBpcyB1c2VkIHRvIHJlc2V0IHRoZSBKYXZhTW9kZWwuZXhpc3RpbmdFeHRlcm5hbEZpbGVzIGNhY2hlIHdoZW4gYSBidWlsZCBjeWNsZSBiZWdpbnMKQEAgLTUyLDIwICs0Nyw0OCBAQAogcHVibGljIHN0YXRpYyBJTWFya2VyW10gZ2V0UHJvYmxlbXNGb3IoSVJlc291cmNlIHJlc291cmNlKSB7CiAJdHJ5IHsKIAkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQlyZXR1cm4gcmVzb3VyY2UuZmluZE1hcmtlcnMoUHJvYmxlbU1hcmtlclRhZywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisJCQlyZXR1cm4gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9IC8vIGFzc3VtZSB0aGVyZSBhcmUgbm8gcHJvYmxlbXMKIAlyZXR1cm4gbmV3IElNYXJrZXJbMF07CiB9CiAKK3B1YmxpYyBzdGF0aWMgSU1hcmtlcltdIGdldFRhc2tzRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRyeSB7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQorCQkJcmV0dXJuIHJlc291cmNlLmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuVEFTS19NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOworCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30gLy8gYXNzdW1lIHRoZXJlIGFyZSBubyB0YXNrcworCXJldHVybiBuZXcgSU1hcmtlclswXTsKK30KKworcHVibGljIHN0YXRpYyB2b2lkIGZpbmlzaGVkQnVpbGRpbmcoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlCdWlsZE5vdGlmaWVyLnJlc2V0UHJvYmxlbUNvdW50ZXJzKCk7Cit9CisKIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQcm9ibGVtc0ZvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAl0cnkgewogCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCXJlc291cmNlLmRlbGV0ZU1hcmtlcnMoUHJvYmxlbU1hcmtlclRhZywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisJCQlyZXNvdXJjZS5kZWxldGVNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CiAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fSAvLyBhc3N1bWUgdGhlcmUgd2VyZSBubyBwcm9ibGVtcwogfQogCi1wdWJsaWMgc3RhdGljIFN0YXRlIHJlYWRTdGF0ZShEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIFN0YXRlLnJlYWQoaW4pOworcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRhc2tzRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRyeSB7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQorCQkJcmVzb3VyY2UuZGVsZXRlTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLlRBU0tfTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9IC8vIGFzc3VtZSB0aGVyZSB3ZXJlIG5vIHByb2JsZW1zCit9CisKK3B1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQcm9ibGVtc0FuZFRhc2tzRm9yKElSZXNvdXJjZSByZXNvdXJjZSkgeworCXRyeSB7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7CisJCQlyZXNvdXJjZS5kZWxldGVNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisJCQlyZXNvdXJjZS5kZWxldGVNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuVEFTS19NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOworCQl9CisJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fSAvLyBhc3N1bWUgdGhlcmUgd2VyZSBubyBwcm9ibGVtcworfQorCitwdWJsaWMgc3RhdGljIFN0YXRlIHJlYWRTdGF0ZShJUHJvamVjdCBwcm9qZWN0LCBEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIFN0YXRlLnJlYWQocHJvamVjdCwgaW4pOwogfQogCiBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTdGF0ZShPYmplY3Qgc3RhdGUsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtOTcsMTEgKzEyMCwxMiBAQAogCQkJCQlpZiAoREVCVUcpCiAJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgZnVsbCBidWlsZCBzaW5jZSBsYXN0IHNhdmVkIHN0YXRlIHdhcyBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlidWlsZEFsbCgpOwotCQkJCX0gZWxzZSBpZiAoaGFzQ2xhc3NwYXRoQ2hhbmdlZCgpIHx8IGhhc091dHB1dExvY2F0aW9uQ2hhbmdlZCgpKSB7CisJCQkJfSBlbHNlIGlmIChoYXNDbGFzc3BhdGhDaGFuZ2VkKCkpIHsKIAkJCQkJLy8gaWYgdGhlIG91dHB1dCBsb2NhdGlvbiBjaGFuZ2VzLCBkbyBub3QgZGVsZXRlIHRoZSBiaW5hcnkgZmlsZXMgZnJvbSBvbGQgbG9jYXRpb24KIAkJCQkJLy8gdGhlIHVzZXIgbWF5IGJlIHRyeWluZyBzb21ldGhpbmcKIAkJCQkJYnVpbGRBbGwoKTsKLQkJCQl9IGVsc2UgaWYgKHNvdXJjZUZvbGRlcnMubGVuZ3RoID4gMCkgeyAvLyBpZiB0aGVyZSBpcyBubyBzb3VyY2UgdG8gY29tcGlsZSAmIG5vIGNsYXNzcGF0aCBjaGFuZ2VzIHRoZW4gd2UgYXJlIGRvbmUKKwkJCQl9IGVsc2UgaWYgKG5hbWVFbnZpcm9ubWVudC5zb3VyY2VMb2NhdGlvbnMubGVuZ3RoID4gMCkgeworCQkJCQkvLyBpZiB0aGVyZSBpcyBubyBzb3VyY2UgdG8gY29tcGlsZSAmIG5vIGNsYXNzcGF0aCBjaGFuZ2VzIHRoZW4gd2UgYXJlIGRvbmUKIAkJCQkJU2ltcGxlTG9va3VwVGFibGUgZGVsdGFzID0gZmluZERlbHRhcygpOwogCQkJCQlpZiAoZGVsdGFzID09IG51bGwpCiAJCQkJCQlidWlsZEFsbCgpOwpAQCAtMTEwLDEyICsxMzQsMTIgQEAKIAkJCQkJZWxzZSBpZiAoREVCVUcpCiAJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGhpbmcgdG8gYnVpbGQgc2luY2UgZGVsdGFzIHdlcmUgZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChoYXNCaW5hcnlEZWx0YSgpKSB7IC8vIGRvdWJsZSBjaGVjayB0aGF0IGEgamFyIGZpbGUgZGlkbid0IGdldCByZXBsYWNlZAorCQkJCQlpZiAoaGFzU3RydWN0dXJhbERlbHRhKCkpIHsgLy8gZG91YmxlIGNoZWNrIHRoYXQgYSBqYXIgZmlsZSBkaWRuJ3QgZ2V0IHJlcGxhY2VkIGluIGEgYmluYXJ5IHByb2plY3QKIAkJCQkJCWJ1aWxkQWxsKCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoREVCVUcpCiAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RoaW5nIHRvIGJ1aWxkIHNpbmNlIHRoZXJlIGFyZSBubyBzb3VyY2UgZm9sZGVycyBhbmQgbm8gZGVsdGFzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRoaXMubGFzdFN0YXRlLnRhZ0FzTm9vcEJ1aWxkKCk7CisJCQkJCQlsYXN0U3RhdGUudGFnQXNOb29wQnVpbGQoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTEyMywyNyArMTQ3LDI3IEBACiAJCX0KIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJVXRpbC5sb2coZSwgIkphdmFCdWlsZGVyIGhhbmRsaW5nIENvcmVFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQuaW5jb25zaXN0ZW50UHJvamVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIpOworCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgVXRpbC5iaW5kKCJidWlsZC5pbmNvbnNpc3RlbnRQcm9qZWN0IiwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpKTsgLy8kTk9OLU5MUy0xJAogCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwogCX0gY2F0Y2ggKEltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uIGUpIHsKIAkJVXRpbC5sb2coZS5nZXRUaHJvd2FibGUoKSwgIkphdmFCdWlsZGVyIGhhbmRsaW5nIEltYWdlQnVpbGRlckludGVybmFsRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoUHJvYmxlbU1hcmtlclRhZyk7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBVdGlsLmJpbmQoImJ1aWxkLmluY29uc2lzdGVudFByb2plY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKKwkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQuaW5jb25zaXN0ZW50UHJvamVjdCIsIGUuY29yZUV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpKTsgLy8kTk9OLU5MUy0xJAogCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwogCX0gY2F0Y2ggKE1pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24gZSkgewogCQkvLyBkbyBub3QgbG9nIHRoaXMgZXhjZXB0aW9uIHNpbmNlIGl0cyB0aHJvd24gdG8gaGFuZGxlIGFib3J0ZWQgY29tcGlsZXMgYmVjYXVzZSBvZiBtaXNzaW5nIGNsYXNzIGZpbGVzCiAJCWlmIChERUJVRykKIAkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImJ1aWxkLmluY29tcGxldGVDbGFzc1BhdGgiLCBlLm1pc3NpbmdDbGFzc0ZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKKwkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKIAkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQuaW5jb21wbGV0ZUNsYXNzUGF0aCIsIGUubWlzc2luZ0NsYXNzRmlsZSkpOyAvLyROT04tTkxTLTEkCiAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CiAJfSBjYXRjaCAoTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24gZSkgewogCQkvLyBkbyBub3QgbG9nIHRoaXMgZXhjZXB0aW9uIHNpbmNlIGl0cyB0aHJvd24gdG8gaGFuZGxlIGFib3J0ZWQgY29tcGlsZXMgYmVjYXVzZSBvZiBtaXNzaW5nIHNvdXJjZSBmaWxlcwogCQlpZiAoREVCVUcpCiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5iaW5kKCJidWlsZC5taXNzaW5nU291cmNlRmlsZSIsIGUubWlzc2luZ1NvdXJjZUZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQlyZW1vdmVQcm9ibGVtc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIG1ha2UgdGhpcyB0aGUgb25seSBwcm9ibGVtIGZvciB0aGlzIHByb2plY3QKLQkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoUHJvYmxlbU1hcmtlclRhZyk7CisJCXJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IoY3VycmVudFByb2plY3QpOyAvLyBtYWtlIHRoaXMgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0CisJCUlNYXJrZXIgbWFya2VyID0gY3VycmVudFByb2plY3QuY3JlYXRlTWFya2VyKElKYXZhTW9kZWxNYXJrZXIuSkFWQV9NT0RFTF9QUk9CTEVNX01BUktFUik7CiAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBVdGlsLmJpbmQoImJ1aWxkLm1pc3NpbmdTb3VyY2VGaWxlIiwgZS5taXNzaW5nU291cmNlRmlsZSkpOyAvLyROT04tTkxTLTEkCiAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CiAJfSBmaW5hbGx5IHsKQEAgLTE2Myw4ICsxODcsOCBAQAogcHJpdmF0ZSB2b2lkIGJ1aWxkQWxsKCkgewogCW5vdGlmaWVyLmNoZWNrQ2FuY2VsKCk7CiAJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnByZXBhcmluZ0J1aWxkIikpOyAvLyROT04tTkxTLTEkCi0JaWYgKERFQlVHICYmIHRoaXMubGFzdFN0YXRlICE9IG51bGwpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSA6ICIgKyB0aGlzLmxhc3RTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKKwlpZiAoREVCVUcgJiYgbGFzdFN0YXRlICE9IG51bGwpCisJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xlYXJpbmcgbGFzdCBzdGF0ZSA6ICIgKyBsYXN0U3RhdGUpOyAvLyROT04tTkxTLTEkCiAJY2xlYXJMYXN0U3RhdGUoKTsKIAlCYXRjaEltYWdlQnVpbGRlciBpbWFnZUJ1aWxkZXIgPSBuZXcgQmF0Y2hJbWFnZUJ1aWxkZXIodGhpcyk7CiAJaW1hZ2VCdWlsZGVyLmJ1aWxkKCk7CkBAIC0xNzQsOCArMTk4LDggQEAKIHByaXZhdGUgdm9pZCBidWlsZERlbHRhcyhTaW1wbGVMb29rdXBUYWJsZSBkZWx0YXMpIHsKIAlub3RpZmllci5jaGVja0NhbmNlbCgpOwogCW5vdGlmaWVyLnN1YlRhc2soVXRpbC5iaW5kKCJidWlsZC5wcmVwYXJpbmdCdWlsZCIpKTsgLy8kTk9OLU5MUy0xJAotCWlmIChERUJVRyAmJiB0aGlzLmxhc3RTdGF0ZSAhPSBudWxsKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsZWFyaW5nIGxhc3Qgc3RhdGUgOiAiICsgdGhpcy5sYXN0U3RhdGUpOyAvLyROT04tTkxTLTEkCisJaWYgKERFQlVHICYmIGxhc3RTdGF0ZSAhPSBudWxsKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNsZWFyaW5nIGxhc3Qgc3RhdGUgOiAiICsgbGFzdFN0YXRlKTsgLy8kTk9OLU5MUy0xJAogCWNsZWFyTGFzdFN0YXRlKCk7IC8vIGNsZWFyIHRoZSBwcmV2aW91c2x5IGJ1aWx0IHN0YXRlIHNvIGlmIHRoZSBidWlsZCBmYWlscywgYSBmdWxsIGJ1aWxkIHdpbGwgb2NjdXIgbmV4dCB0aW1lCiAJSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIgaW1hZ2VCdWlsZGVyID0gbmV3IEluY3JlbWVudGFsSW1hZ2VCdWlsZGVyKHRoaXMpOwogCWlmIChpbWFnZUJ1aWxkZXIuYnVpbGQoZGVsdGFzKSkKQEAgLTE4NSw0MiArMjA5LDM0IEBACiB9CiAKIHByaXZhdGUgdm9pZCBjbGVhbnVwKCkgewotCXRoaXMuY2xhc3NwYXRoID0gbnVsbDsKLQl0aGlzLm91dHB1dEZvbGRlciA9IG51bGw7Ci0JdGhpcy5zb3VyY2VGb2xkZXJzID0gbnVsbDsKKwl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IG51bGw7CisJdGhpcy5iaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0ID0gbnVsbDsKIAl0aGlzLmxhc3RTdGF0ZSA9IG51bGw7CiAJdGhpcy5ub3RpZmllciA9IG51bGw7CisJdGhpcy5leHRyYVJlc291cmNlRmlsZUZpbHRlcnMgPSBudWxsOworCXRoaXMuZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnMgPSBudWxsOwogfQogCiBwcml2YXRlIHZvaWQgY2xlYXJMYXN0U3RhdGUoKSB7CiAJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuc2V0TGFzdEJ1aWx0U3RhdGUoY3VycmVudFByb2plY3QsIG51bGwpOwogfQogCi1wcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVyKElDb250YWluZXIgZm9sZGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWlmIChjdXJyZW50UHJvamVjdC5nZXRGdWxsUGF0aCgpICE9IHBhcmVudC5nZXRGdWxsUGF0aCgpKQotCQkJY3JlYXRlRm9sZGVyKHBhcmVudCk7Ci0JCSgoSUZvbGRlcikgZm9sZGVyKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotfQotCi1ib29sZWFuIGZpbHRlclJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCWlmIChmaWxlRmlsdGVycyAhPSBudWxsKSB7Citib29sZWFuIGZpbHRlckV4dHJhUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7CisJaWYgKGV4dHJhUmVzb3VyY2VGaWxlRmlsdGVycyAhPSBudWxsKSB7CiAJCWNoYXJbXSBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWxlRmlsdGVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWlmIChDaGFyT3BlcmF0aW9uLm1hdGNoKGZpbGVGaWx0ZXJzW2ldLCBuYW1lLCB0cnVlKSkKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBleHRyYVJlc291cmNlRmlsZUZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQkJaWYgKENoYXJPcGVyYXRpb24ubWF0Y2goZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzW2ldLCBuYW1lLCB0cnVlKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JaWYgKGZvbGRlckZpbHRlcnMgIT0gbnVsbCkgeworCWlmIChleHRyYVJlc291cmNlRm9sZGVyRmlsdGVycyAhPSBudWxsKSB7CiAJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CiAJCVN0cmluZyBwYXRoTmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKIAkJaW50IGNvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKIAkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgY291bnQtLTsKLQkJZm9yIChpbnQgaSA9IDAsIGwgPSBmb2xkZXJGaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKLQkJCWlmIChwYXRoTmFtZS5pbmRleE9mKGZvbGRlckZpbHRlcnNbaV0pICE9IC0xKQorCQlmb3IgKGludCBpID0gMCwgbCA9IGV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJCWlmIChwYXRoTmFtZS5pbmRleE9mKGV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzW2ldKSAhPSAtMSkKIAkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspCi0JCQkJCWlmIChmb2xkZXJGaWx0ZXJzW2ldLmVxdWFscyhwYXRoLnNlZ21lbnQoaikpKQorCQkJCQlpZiAoZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbaV0uZXF1YWxzKHBhdGguc2VnbWVudChqKSkpCiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJcmV0dXJuIGZhbHNlOwpAQCAtMjQzLDggKzI1OSw4IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5UmVzb3VyY2VzLmtleVRhYmxlOwotCU9iamVjdFtdIHZhbHVlVGFibGUgPSBiaW5hcnlSZXNvdXJjZXMudmFsdWVUYWJsZTsKKwlPYmplY3RbXSBrZXlUYWJsZSA9IGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3Qua2V5VGFibGU7CisJT2JqZWN0W10gdmFsdWVUYWJsZSA9IGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QudmFsdWVUYWJsZTsKIAluZXh0UHJvamVjdCA6IGZvciAoaW50IGkgPSAwLCBsID0ga2V5VGFibGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIGtleVRhYmxlW2ldOwogCQlpZiAocCAhPSBudWxsICYmIHAgIT0gY3VycmVudFByb2plY3QpIHsKQEAgLTI1MiwxMCArMjY4LDE1IEBACiAJCQlpZiAoIWxhc3RTdGF0ZS53YXNTdHJ1Y3R1cmFsbHlDaGFuZ2VkKHAsIHMpKSB7IC8vIHNlZSBpZiB3ZSBjYW4gc2tpcCBpdHMgZGVsdGEKIAkJCQlpZiAocy53YXNOb29wQnVpbGQoKSkKIAkJCQkJY29udGludWUgbmV4dFByb2plY3Q7IC8vIHByb2plY3QgaGFzIG5vIHNvdXJjZSBmb2xkZXJzIGFuZCBjYW4gYmUgc2tpcHBlZAotCQkJCUlSZXNvdXJjZVtdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoSVJlc291cmNlW10pIHZhbHVlVGFibGVbaV07Ci0JCQkJaWYgKGNsYXNzRm9sZGVyc0FuZEphcnMubGVuZ3RoIDw9IDEpCi0JCQkJCWNvbnRpbnVlIG5leHRQcm9qZWN0OyAvLyBwcm9qZWN0IGhhcyBubyBzdHJ1Y3R1cmFsIGNoYW5nZXMgaW4gaXRzIG91dHB1dCBmb2xkZXIKLQkJCQljbGFzc0ZvbGRlcnNBbmRKYXJzWzBdID0gbnVsbDsgLy8gc2tpcCB0aGUgb3V0cHV0IGZvbGRlcgorCQkJCUNsYXNzcGF0aExvY2F0aW9uW10gY2xhc3NGb2xkZXJzQW5kSmFycyA9IChDbGFzc3BhdGhMb2NhdGlvbltdKSB2YWx1ZVRhYmxlW2ldOworCQkJCWJvb2xlYW4gY2FuU2tpcCA9IHRydWU7CisJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBjbGFzc0ZvbGRlcnNBbmRKYXJzLmxlbmd0aDsgaiA8IG07IGorKykgeworCQkJCQlpZiAoY2xhc3NGb2xkZXJzQW5kSmFyc1tqXS5pc091dHB1dEZvbGRlcigpKQorCQkJCQkJY2xhc3NGb2xkZXJzQW5kSmFyc1tqXSA9IG51bGw7IC8vIGNhbiBpZ25vcmUgb3V0cHV0IGZvbGRlciBzaW5jZSBwcm9qZWN0IHdhcyBub3Qgc3RydWN0dXJhbGx5IGNoYW5nZWQKKwkJCQkJZWxzZQorCQkJCQkJY2FuU2tpcCA9IGZhbHNlOworCQkJCX0KKwkJCQlpZiAoY2FuU2tpcCkgY29udGludWUgbmV4dFByb2plY3Q7IC8vIHByb2plY3QgaGFzIG5vIHN0cnVjdHVyYWwgY2hhbmdlcyBpbiBpdHMgb3V0cHV0IGZvbGRlcnMKIAkJCX0KIAogCQkJbm90aWZpZXIuc3ViVGFzayhVdGlsLmJpbmQoImJ1aWxkLnJlYWRpbmdEZWx0YSIsIHAuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTI5MywyNyArMzE0LDI1IEBACiAKIAlBcnJheUxpc3QgcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJdHJ5IHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICgoSmF2YVByb2plY3QpIGphdmFQcm9qZWN0KS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoZW50cmllc1tpXSk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJSVByb2plY3QgcCA9IG51bGw7Ci0JCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJCQlwID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgotCQkJCQkJaWYgKGluY2x1ZGVCaW5hcnlQcmVyZXF1aXNpdGVzICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQkJLy8gc29tZSBiaW5hcnkgcmVzb3VyY2VzIG9uIHRoZSBjbGFzcyBwYXRoIGNhbiBjb21lIGZyb20gcHJvamVjdHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBwcm9qZWN0IHJlZmVyZW5jZXMKLQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJCQkJcCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwICE9IG51bGwgJiYgIXByb2plY3RzLmNvbnRhaW5zKHApKQotCQkJCQlwcm9qZWN0cy5hZGQocCk7CisJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQlJUHJvamVjdCBwID0gbnVsbDsKKwkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKKwkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6CisJCQkJCXAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocGF0aC5sYXN0U2VnbWVudCgpKTsgLy8gbWlzc2luZyBwcm9qZWN0cyBhcmUgY29uc2lkZXJlZCB0b28KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgorCQkJCQlpZiAoaW5jbHVkZUJpbmFyeVByZXJlcXVpc2l0ZXMgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKKwkJCQkJCS8vIHNvbWUgYmluYXJ5IHJlc291cmNlcyBvbiB0aGUgY2xhc3MgcGF0aCBjYW4gY29tZSBmcm9tIHByb2plY3RzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHJvamVjdCByZWZlcmVuY2VzCisJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIocGF0aC5zZWdtZW50KDApKTsKKwkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KQorCQkJCQkJCXAgPSAoSVByb2plY3QpIHJlc291cmNlOworCQkJCQl9CiAJCQl9CisJCQlpZiAocCAhPSBudWxsICYmICFwcm9qZWN0cy5jb250YWlucyhwKSkKKwkJCQlwcm9qZWN0cy5hZGQocCk7CiAJCX0KIAl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBuZXcgSVByb2plY3RbMF07CkBAIC0zMjQsNzAgKzM0Myw3MyBAQAogfQogCiBwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NwYXRoQ2hhbmdlZCgpIHsKLQlDbGFzc3BhdGhMb2NhdGlvbltdIG9sZENsYXNzcGF0aExvY2F0aW9ucyA9IGxhc3RTdGF0ZS5jbGFzc3BhdGhMb2NhdGlvbnM7Ci0JaW50IG5ld0xlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7Ci0JaW50IG9sZExlbmd0aCA9IG9sZENsYXNzcGF0aExvY2F0aW9ucy5sZW5ndGg7Ci0JaW50IGRpZmYgPSBuZXdMZW5ndGggLSBvbGRMZW5ndGg7Ci0JaWYgKGRpZmYgPT0gMCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2xhc3NwYXRoW2ldLmVxdWFscyhvbGRDbGFzc3BhdGhMb2NhdGlvbnNbaV0pKSBjb250aW51ZTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NwYXRoW2ldICsgIiAhPSAiICsgb2xkQ2xhc3NwYXRoTG9jYXRpb25zW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAoZGlmZiA9PSAxKSB7Ci0JCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG5ld1NvdXJjZURpcmVjdG9yeSA9IG51bGw7Ci0JCWludCBuID0gMCwgbyA9IDA7Ci0JCWZvciAoOyBuIDwgbmV3TGVuZ3RoICYmIG8gPCBvbGRMZW5ndGg7IG4rKywgbysrKSB7Ci0JCQlpZiAoY2xhc3NwYXRoW25dLmVxdWFscyhvbGRDbGFzc3BhdGhMb2NhdGlvbnNbb10pKSBjb250aW51ZTsKLQkJCWlmIChkaWZmID09IDEgJiYgY2xhc3NwYXRoW25dIGluc3RhbmNlb2YgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIHsgLy8gYWRkZWQgYSBuZXcgc291cmNlIGZvbGRlcgotCQkJCW5ld1NvdXJjZURpcmVjdG9yeSA9IChDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgY2xhc3NwYXRoW25dOworCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5W10gbmV3U291cmNlTG9jYXRpb25zID0gbmFtZUVudmlyb25tZW50LnNvdXJjZUxvY2F0aW9uczsKKwlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVtdIG9sZFNvdXJjZUxvY2F0aW9ucyA9IGxhc3RTdGF0ZS5zb3VyY2VMb2NhdGlvbnM7CisJaW50IG5ld0xlbmd0aCA9IG5ld1NvdXJjZUxvY2F0aW9ucy5sZW5ndGg7CisJaW50IG9sZExlbmd0aCA9IG9sZFNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7CisJaW50IG4sIG87CisJZm9yIChuID0gbyA9IDA7IG4gPCBuZXdMZW5ndGggJiYgbyA8IG9sZExlbmd0aDsgbisrLCBvKyspIHsKKwkJaWYgKG5ld1NvdXJjZUxvY2F0aW9uc1tuXS5lcXVhbHMob2xkU291cmNlTG9jYXRpb25zW29dKSkgY29udGludWU7IC8vIGNoZWNrcyBzb3VyY2UgJiBvdXRwdXQgZm9sZGVycworCQl0cnkgeworCQkJaWYgKG5ld1NvdXJjZUxvY2F0aW9uc1tuXS5zb3VyY2VGb2xkZXIubWVtYmVycygpLmxlbmd0aCA9PSAwKSB7IC8vIGFkZGVkIG5ldyBlbXB0eSBzb3VyY2UgZm9sZGVyCiAJCQkJby0tOwotCQkJCWRpZmYgPSAwOyAvLyBmb3VuZCBuZXcgZWxlbWVudAogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjbGFzc3BhdGhbbl0gKyAiICE9ICIgKyBvbGRDbGFzc3BhdGhMb2NhdGlvbnNbb10pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChkaWZmID09IDEgJiYgY2xhc3NwYXRoW25dIGluc3RhbmNlb2YgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIC8vIGFkZGVkIGEgbmV3IHNvdXJjZSBmb2xkZXIgYXQgdGhlIGVuZAotCQkJbmV3U291cmNlRGlyZWN0b3J5ID0gKENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSBjbGFzc3BhdGhbbl07Ci0JCWlmIChuZXdTb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKG5ldyBQYXRoKG5ld1NvdXJjZURpcmVjdG9yeS5zb3VyY2VQYXRoKSk7Ci0JCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwgJiYgc291cmNlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNvdXJjZUZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsgLy8gYWRkZWQgYSBuZXcgZW1wdHkgc291cmNlIGZvbGRlcgotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gaWdub3JlKSB7fQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZSkge30KKwkJaWYgKERFQlVHKQorCQkJU3lzdGVtLm91dC5wcmludGxuKG5ld1NvdXJjZUxvY2F0aW9uc1tuXSArICIgIT0gIiArIG9sZFNvdXJjZUxvY2F0aW9uc1tvXSk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRydWU7CisJfQorCXdoaWxlIChuIDwgbmV3TGVuZ3RoKSB7CisJCXRyeSB7CisJCQlpZiAobmV3U291cmNlTG9jYXRpb25zW25dLnNvdXJjZUZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID09IDApIHsgLy8gYWRkZWQgbmV3IGVtcHR5IHNvdXJjZSBmb2xkZXIKKwkJCQluKys7CisJCQkJY29udGludWU7CiAJCQl9Ci0JCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmUpIHt9CisJCWlmIChERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkZWQgbm9uLWVtcHR5IHNvdXJjZSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKG8gPCBvbGRMZW5ndGgpIHsKKwkJaWYgKERFQlVHKQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmVkIHNvdXJjZSBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3MgcGF0aCBzaXplIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiB0cnVlOworCUNsYXNzcGF0aExvY2F0aW9uW10gbmV3QmluYXJ5TG9jYXRpb25zID0gbmFtZUVudmlyb25tZW50LmJpbmFyeUxvY2F0aW9uczsKKwlDbGFzc3BhdGhMb2NhdGlvbltdIG9sZEJpbmFyeUxvY2F0aW9ucyA9IGxhc3RTdGF0ZS5iaW5hcnlMb2NhdGlvbnM7CisJbmV3TGVuZ3RoID0gbmV3QmluYXJ5TG9jYXRpb25zLmxlbmd0aDsKKwlvbGRMZW5ndGggPSBvbGRCaW5hcnlMb2NhdGlvbnMubGVuZ3RoOworCWZvciAobiA9IG8gPSAwOyBuIDwgbmV3TGVuZ3RoICYmIG8gPCBvbGRMZW5ndGg7IG4rKywgbysrKSB7CisJCWlmIChuZXdCaW5hcnlMb2NhdGlvbnNbbl0uZXF1YWxzKG9sZEJpbmFyeUxvY2F0aW9uc1tvXSkpIGNvbnRpbnVlOworCQlpZiAoREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3QmluYXJ5TG9jYXRpb25zW25dICsgIiAhPSAiICsgb2xkQmluYXJ5TG9jYXRpb25zW29dKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKG4gPCBuZXdMZW5ndGggfHwgbyA8IG9sZExlbmd0aCkgeworCQlpZiAoREVCVUcpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBiaW5hcnkgZm9sZGVycy9qYXIgZmlsZXMgaGFzIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCi1wcml2YXRlIGJvb2xlYW4gaGFzT3V0cHV0TG9jYXRpb25DaGFuZ2VkKCkgewotCWlmIChvdXRwdXRGb2xkZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLmVxdWFscyhsYXN0U3RhdGUub3V0cHV0TG9jYXRpb25TdHJpbmcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoREVCVUcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbihvdXRwdXRGb2xkZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAhPSAiICsgbGFzdFN0YXRlLm91dHB1dExvY2F0aW9uU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiB0cnVlOwotfSAKLQotcHJpdmF0ZSBib29sZWFuIGhhc0JpbmFyeURlbHRhKCkgeworcHJpdmF0ZSBib29sZWFuIGhhc1N0cnVjdHVyYWxEZWx0YSgpIHsKKwkvLyBoYW5kbGUgY2FzZSB3aGVuIGN1cnJlbnRQcm9qZWN0IGhhcyBvbmx5IC5jbGFzcyBmaWxlIGZvbGRlcnMgYW5kL29yIGphciBmaWxlcy4uLiBubyBzb3VyY2Uvb3V0cHV0IGZvbGRlcnMKIAlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKGN1cnJlbnRQcm9qZWN0KTsKIAlpZiAoZGVsdGEgIT0gbnVsbCAmJiBkZWx0YS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKSB7Ci0JCUlSZXNvdXJjZVtdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoSVJlc291cmNlW10pIGJpbmFyeVJlc291cmNlcy5nZXQoY3VycmVudFByb2plY3QpOworCQlDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzRm9sZGVyc0FuZEphcnMgPSAoQ2xhc3NwYXRoTG9jYXRpb25bXSkgYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5nZXQoY3VycmVudFByb2plY3QpOwogCQlpZiAoY2xhc3NGb2xkZXJzQW5kSmFycyAhPSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbCA9IGNsYXNzRm9sZGVyc0FuZEphcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIGJpbmFyeVJlc291cmNlID0gY2xhc3NGb2xkZXJzQW5kSmFyc1tpXTsgLy8gZWl0aGVyIGEgLmNsYXNzIGZpbGUgZm9sZGVyIG9yIGEgemlwL2phciBmaWxlCi0JCQkJaWYgKGJpbmFyeVJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJSVJlc291cmNlRGVsdGEgYmluYXJ5RGVsdGEgPSBkZWx0YS5maW5kTWVtYmVyKGJpbmFyeVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQkJCWlmIChiaW5hcnlEZWx0YSAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJCQlDbGFzc3BhdGhMb2NhdGlvbiBjbGFzc0ZvbGRlck9ySmFyID0gY2xhc3NGb2xkZXJzQW5kSmFyc1tpXTsgLy8gZWl0aGVyIGEgLmNsYXNzIGZpbGUgZm9sZGVyIG9yIGEgemlwL2phciBmaWxlCisJCQkJaWYgKGNsYXNzRm9sZGVyT3JKYXIgIT0gbnVsbCkgeworCQkJCQlJUGF0aCBwID0gY2xhc3NGb2xkZXJPckphci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJCQkJCWlmIChwICE9IG51bGwpIHsKKwkJCQkJCUlSZXNvdXJjZURlbHRhIGJpbmFyeURlbHRhID0gZGVsdGEuZmluZE1lbWJlcihwKTsKKwkJCQkJCWlmIChiaW5hcnlEZWx0YSAhPSBudWxsICYmIGJpbmFyeURlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM5Niw5NiArNDE4LDk4IEBACiB9CiAKIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQnVpbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGN1cnJlbnRQcm9qZWN0KTsKKwl0aGlzLmphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUoY3VycmVudFByb2plY3QpOwogCXRoaXMud29ya3NwYWNlUm9vdCA9IGN1cnJlbnRQcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl0aGlzLm91dHB1dEZvbGRlciA9IChJQ29udGFpbmVyKSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JaWYgKHRoaXMub3V0cHV0Rm9sZGVyID09IG51bGwpIHsKLQkJdGhpcy5vdXRwdXRGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJY3JlYXRlRm9sZGVyKHRoaXMub3V0cHV0Rm9sZGVyKTsKLQl9CiAKIAkvLyBGbHVzaCB0aGUgZXhpc3RpbmcgZXh0ZXJuYWwgZmlsZXMgY2FjaGUgaWYgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgYnVpbGQgY3ljbGUKLQlTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKTsKKwlTdHJpbmcgcHJvamVjdE5hbWUgPSBjdXJyZW50UHJvamVjdC5nZXROYW1lKCk7CiAJaWYgKGJ1aWx0UHJvamVjdHMgPT0gbnVsbCB8fCBidWlsdFByb2plY3RzLmNvbnRhaW5zKHByb2plY3ROYW1lKSkgewogCQlKYXZhTW9kZWwuZmx1c2hFeHRlcm5hbEZpbGVDYWNoZSgpOwogCQlidWlsdFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwogCX0KIAlidWlsdFByb2plY3RzLmFkZChwcm9qZWN0TmFtZSk7CiAKLQlBcnJheUxpc3Qgc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQl0aGlzLmJpbmFyeVJlc291cmNlcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgzKTsKLQl0aGlzLmNsYXNzcGF0aCA9IE5hbWVFbnZpcm9ubWVudC5jb21wdXRlTG9jYXRpb25zKAotCQl3b3Jrc3BhY2VSb290LAotCQlqYXZhUHJvamVjdCwKLQkJb3V0cHV0Rm9sZGVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwKLQkJc291cmNlTGlzdCwKLQkJYmluYXJ5UmVzb3VyY2VzKTsKLQl0aGlzLnNvdXJjZUZvbGRlcnMgPSBuZXcgSUNvbnRhaW5lcltzb3VyY2VMaXN0LnNpemUoKV07Ci0Jc291cmNlTGlzdC50b0FycmF5KHRoaXMuc291cmNlRm9sZGVycyk7CisJdGhpcy5iaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0ID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDMpOworCXRoaXMubmFtZUVudmlyb25tZW50ID0gbmV3IE5hbWVFbnZpcm9ubWVudCh3b3Jrc3BhY2VSb290LCBqYXZhUHJvamVjdCwgYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdCk7CiAKLQlTdHJpbmcgZmlsdGVyU2VxdWVuY2UgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSKTsKKwlTdHJpbmcgZmlsdGVyU2VxdWVuY2UgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX1JFU09VUkNFX0NPUFlfRklMVEVSLCB0cnVlKTsKIAljaGFyW11bXSBmaWx0ZXJzID0gZmlsdGVyU2VxdWVuY2UgIT0gbnVsbCAmJiBmaWx0ZXJTZXF1ZW5jZS5sZW5ndGgoKSA+IDAKIAkJPyBDaGFyT3BlcmF0aW9uLnNwbGl0QW5kVHJpbU9uKCcsJywgZmlsdGVyU2VxdWVuY2UudG9DaGFyQXJyYXkoKSkKIAkJOiBudWxsOwogCWlmIChmaWx0ZXJzID09IG51bGwpIHsKLQkJdGhpcy5maWxlRmlsdGVycyA9IG51bGw7Ci0JCXRoaXMuZm9sZGVyRmlsdGVycyA9IG51bGw7CisJCXRoaXMuZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzID0gbnVsbDsKKwkJdGhpcy5leHRyYVJlc291cmNlRm9sZGVyRmlsdGVycyA9IG51bGw7CiAJfSBlbHNlIHsKIAkJaW50IGZpbGVDb3VudCA9IDAsIGZvbGRlckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJY2hhcltdIGYgPSBmaWx0ZXJzW2ldOwogCQkJaWYgKGYubGVuZ3RoID09IDApIGNvbnRpbnVlOwogCQkJaWYgKGZbZi5sZW5ndGggLSAxXSA9PSAnLycpIGZvbGRlckNvdW50Kys7IGVsc2UgZmlsZUNvdW50Kys7CiAJCX0KLQkJdGhpcy5maWxlRmlsdGVycyA9IG5ldyBjaGFyW2ZpbGVDb3VudF1bXTsKLQkJdGhpcy5mb2xkZXJGaWx0ZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJDb3VudF07Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXRoaXMuZXh0cmFSZXNvdXJjZUZpbGVGaWx0ZXJzID0gbmV3IGNoYXJbZmlsZUNvdW50XVtdOworCQl0aGlzLmV4dHJhUmVzb3VyY2VGb2xkZXJGaWx0ZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJDb3VudF07CisJCWZvciAoaW50IGkgPSAwLCBsID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCWNoYXJbXSBmID0gZmlsdGVyc1tpXTsKIAkJCWlmIChmLmxlbmd0aCA9PSAwKSBjb250aW51ZTsKIAkJCWlmIChmW2YubGVuZ3RoIC0gMV0gPT0gJy8nKQotCQkJCWZvbGRlckZpbHRlcnNbLS1mb2xkZXJDb3VudF0gPSBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZiwgMCwgZi5sZW5ndGggLSAxKSk7CisJCQkJZXh0cmFSZXNvdXJjZUZvbGRlckZpbHRlcnNbLS1mb2xkZXJDb3VudF0gPSBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24uc3ViYXJyYXkoZiwgMCwgZi5sZW5ndGggLSAxKSk7CiAJCQllbHNlCi0JCQkJZmlsZUZpbHRlcnNbLS1maWxlQ291bnRdID0gZjsKKwkJCQlleHRyYVJlc291cmNlRmlsZUZpbHRlcnNbLS1maWxlQ291bnRdID0gZjsKIAkJfQogCX0KIH0KIAorcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3NwYXRoQnJva2VuKElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSVByb2plY3QgcCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmIChjbGFzc3BhdGggPT0gSmF2YVByb2plY3QuSU5WQUxJRF9DTEFTU1BBVEgpIC8vIHRoZSAuY2xhc3NwYXRoIGZpbGUgY291bGQgbm90IGJlIHJlYWQKKwkJcmV0dXJuIHRydWU7CisKKwlJTWFya2VyW10gbWFya2VycyA9IHAuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBtYXJrZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJaWYgKCgoSW50ZWdlcikgbWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpLmludFZhbHVlKCkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKwogcHJpdmF0ZSBib29sZWFuIGlzV29ydGhCdWlsZGluZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlib29sZWFuIGFib3J0QnVpbGRzID0gSmF2YUNvcmUuQUJPUlQuZXF1YWxzKEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgpKTsKKwlib29sZWFuIGFib3J0QnVpbGRzID0KKwkJSmF2YUNvcmUuQUJPUlQuZXF1YWxzKGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgsIHRydWUpKTsKIAlpZiAoIWFib3J0QnVpbGRzKSByZXR1cm4gdHJ1ZTsKIAotCUlNYXJrZXJbXSBtYXJrZXJzID0KLQkJY3VycmVudFByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfT05FKTsKLQlpZiAobWFya2Vycy5sZW5ndGggPiAwKSB7CisJLy8gQWJvcnQgYnVpbGQgb25seSBpZiB0aGVyZSBhcmUgY2xhc3NwYXRoIGVycm9ycworCWlmIChpc0NsYXNzcGF0aEJyb2tlbihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgY3VycmVudFByb2plY3QpKSB7CiAJCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWJvcnRlZCBidWlsZCBiZWNhdXNlIHByb2plY3QgaXMgaW52b2x2ZWQgaW4gYSBjeWNsZSBvciBoYXMgY2xhc3NwYXRoIHByb2JsZW1zIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWJvcnRlZCBidWlsZCBiZWNhdXNlIHByb2plY3QgaGFzIGNsYXNzcGF0aCBlcnJvcnMgKGluY29tcGxldGUgb3IgaW52b2x2ZWQgaW4gY3ljbGUpIik7IC8vJE5PTi1OTFMtMSQKIAotCQkvLyByZW1vdmUgYWxsIGV4aXN0aW5nIGNsYXNzIGZpbGVzLi4uIGNhdXNlcyBhbGwgZGVwZW5kZW50IHByb2plY3RzIHRvIGRvIHRoZSBzYW1lCi0JCW5ldyBCYXRjaEltYWdlQnVpbGRlcih0aGlzKS5zY3J1Yk91dHB1dEZvbGRlcigpOworCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5kZWx0YVByb2Nlc3Nvci5hZGRGb3JSZWZyZXNoKGphdmFQcm9qZWN0KTsKIAotCQlyZW1vdmVQcm9ibGVtc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIHJlbW92ZSBhbGwgY29tcGlsYXRpb24gcHJvYmxlbXMKKwkJcmVtb3ZlUHJvYmxlbXNBbmRUYXNrc0ZvcihjdXJyZW50UHJvamVjdCk7IC8vIHJlbW92ZSBhbGwgY29tcGlsYXRpb24gcHJvYmxlbXMKIAotCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKKwkJSU1hcmtlciBtYXJrZXIgPSBjdXJyZW50UHJvamVjdC5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKIAkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIFV0aWwuYmluZCgiYnVpbGQuYWJvcnREdWVUb0NsYXNzcGF0aFByb2JsZW1zIikpOyAvLyROT04tTkxTLTEkCiAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvLyBtYWtlIHN1cmUgYWxsIHByZXJlcSBwcm9qZWN0cyBoYXZlIHZhbGlkIGJ1aWxkIHN0YXRlcy4uLiBvbmx5IHdoZW4gYWJvcnRpbmcgYnVpbGRzIHNpbmNlIHByb2plY3RzIGluIGN5Y2xlcyBkbyBub3QgaGF2ZSBidWlsZCBzdGF0ZXMKKwkvLyBleGNlcHQgZm9yIHByb2plY3RzIGludm9sdmVkIGluIGEgJ3dhcm5pbmcnIGN5Y2xlIChzZWUgYmVsb3cpCiAJSVByb2plY3RbXSByZXF1aXJlZFByb2plY3RzID0gZ2V0UmVxdWlyZWRQcm9qZWN0cyhmYWxzZSk7Ci0JbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsID0gcmVxdWlyZWRQcm9qZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJSVByb2plY3QgcCA9IHJlcXVpcmVkUHJvamVjdHNbaV07CiAJCWlmIChnZXRMYXN0U3RhdGUocCkgPT0gbnVsbCkgIHsKKwkJCS8vIFRoZSBwcmVyZXEgcHJvamVjdCBoYXMgbm8gYnVpbGQgc3RhdGU6IGlmIHRoaXMgcHJlcmVxIHByb2plY3QgaGFzIGEgJ3dhcm5pbmcnIGN5Y2xlIG1hcmtlciB0aGVuIGFsbG93IGJ1aWxkIChzZWUgYnVnIGlkIDIzMzU3KQorCQkJSmF2YVByb2plY3QgcHJlcmVxID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUocCk7CisJCQlpZiAocHJlcmVxLmhhc0N5Y2xlTWFya2VyKCkgJiYgSmF2YUNvcmUuV0FSTklORy5lcXVhbHMoamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCB0cnVlKSkpCisJCQkJY29udGludWU7CiAJCQlpZiAoREVCVUcpCiAJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBYm9ydGVkIGJ1aWxkIGJlY2F1c2UgcHJlcmVxIHByb2plY3QgIiArIHAuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCQkJKyAiIHdhcyBub3QgYnVpbHQiKTsgLy8kTk9OLU5MUy0xJAogCi0JCQkvLyByZW1vdmUgYWxsIGV4aXN0aW5nIGNsYXNzIGZpbGVzLi4uIGNhdXNlcyBhbGwgZGVwZW5kZW50IHByb2plY3RzIHRvIGRvIHRoZSBzYW1lCi0JCQluZXcgQmF0Y2hJbWFnZUJ1aWxkZXIodGhpcykuc2NydWJPdXRwdXRGb2xkZXIoKTsKLQotCQkJcmVtb3ZlUHJvYmxlbXNGb3IoY3VycmVudFByb2plY3QpOyAvLyBtYWtlIHRoaXMgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0Ci0JCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihQcm9ibGVtTWFya2VyVGFnKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBVdGlsLmJpbmQoImJ1aWxkLnByZXJlcVByb2plY3RXYXNOb3RCdWlsdCIsIHAuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJlbW92ZVByb2JsZW1zQW5kVGFza3NGb3IoY3VycmVudFByb2plY3QpOyAvLyBtYWtlIHRoaXMgdGhlIG9ubHkgcHJvYmxlbSBmb3IgdGhpcyBwcm9qZWN0CisJCQlJTWFya2VyIG1hcmtlciA9IGN1cnJlbnRQcm9qZWN0LmNyZWF0ZU1hcmtlcihJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIpOworCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsCisJCQkJaXNDbGFzc3BhdGhCcm9rZW4ocHJlcmVxLmdldFJhd0NsYXNzcGF0aCgpLCBwKQorCQkJCQk/IFV0aWwuYmluZCgiYnVpbGQucHJlcmVxUHJvamVjdEhhc0NsYXNzcGF0aFByb2JsZW1zIiwgcC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKKwkJCQkJOiBVdGlsLmJpbmQoImJ1aWxkLnByZXJlcVByb2plY3RNdXN0QmVSZWJ1aWx0IiwgcC5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAogCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNDkzLDggKzUxNywyOSBAQAogCXJldHVybiB0cnVlOwogfQogCisvKgorICogSW5zdHJ1Y3QgdGhlIGJ1aWxkIG1hbmFnZXIgdGhhdCB0aGlzIHByb2plY3QgaXMgaW52b2x2ZWQgaW4gYSBjeWNsZSBhbmQKKyAqIG5lZWRzIHRvIHByb3BhZ2F0ZSBzdHJ1Y3R1cmFsIGNoYW5nZXMgdG8gdGhlIG90aGVyIHByb2plY3RzIGluIHRoZSBjeWNsZS4KKyAqLwordm9pZCBtdXN0UHJvcGFnYXRlU3RydWN0dXJhbENoYW5nZXMoKSB7CisJSGFzaFNldCBjeWNsZVBhcnRpY2lwYW50cyA9IG5ldyBIYXNoU2V0KDMpOworCWphdmFQcm9qZWN0LnVwZGF0ZUN5Y2xlUGFydGljaXBhbnRzKG51bGwsIG5ldyBBcnJheUxpc3QoKSwgY3ljbGVQYXJ0aWNpcGFudHMsIHdvcmtzcGFjZVJvb3QpOworCisJSXRlcmF0b3IgaT0gY3ljbGVQYXJ0aWNpcGFudHMuaXRlcmF0b3IoKTsKKwl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKwkJSUphdmFQcm9qZWN0IHAgPSAoSUphdmFQcm9qZWN0KSBpLm5leHQoKTsKKwkJaWYgKHAgIT0gamF2YVByb2plY3QgJiYgaGFzQmVlbkJ1aWx0KHAuZ2V0UHJvamVjdCgpKSkgeworCQkJaWYgKERFQlVHKSAKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3RpbmcgYW5vdGhlciBidWlsZCBpdGVyYXRpb24gc2luY2UgY3ljbGUgcGFydGljaXBhbnQgIiArIHAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCisJCQkJCSsgIiBoYXMgbm90IHlldCBzZWVuIHNvbWUgc3RydWN0dXJhbCBjaGFuZ2VzIik7IC8vJE5PTi1OTFMtMSQKKwkJCW5lZWRSZWJ1aWxkKCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKIHByaXZhdGUgdm9pZCByZWNvcmROZXdTdGF0ZShTdGF0ZSBzdGF0ZSkgewotCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5UmVzb3VyY2VzLmtleVRhYmxlOworCU9iamVjdFtdIGtleVRhYmxlID0gYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5rZXlUYWJsZTsKIAlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQlJUHJvamVjdCBwcmVyZXFQcm9qZWN0ID0gKElQcm9qZWN0KSBrZXlUYWJsZVtpXTsKIAkJaWYgKHByZXJlcVByb2plY3QgIT0gbnVsbCAmJiBwcmVyZXFQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQpAQCAtNTExLDYgKzU1Niw4IEBACiAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcwogICovCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiAiSmF2YUJ1aWxkZXIgZm9yICIgKyBjdXJyZW50UHJvamVjdC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gY3VycmVudFByb2plY3QgPT0gbnVsbAorCQk/ICJKYXZhQnVpbGRlciBmb3IgdW5rbm93biBwcm9qZWN0IiAvLyROT04tTkxTLTEkCisJCTogIkphdmFCdWlsZGVyIGZvciAiICsgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nQ2xhc3NGaWxlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24uamF2YQppbmRleCBkNTVmMjI2Li42OWVjNDZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIC8qKgpAQCAtMjEsNCArMjEsNCBAQAogcHVibGljIE1pc3NpbmdDbGFzc0ZpbGVFeGNlcHRpb24oU3RyaW5nIG1pc3NpbmdDbGFzc0ZpbGUpIHsKIAl0aGlzLm1pc3NpbmdDbGFzc0ZpbGUgPSBtaXNzaW5nQ2xhc3NGaWxlOwogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24uamF2YQppbmRleCBjN2ZjNmFiLi4zYWViMmVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL01pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9NaXNzaW5nU291cmNlRmlsZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAogLyoqCkBAIC0yMCw0ICsyMCw0IEBACiBwdWJsaWMgTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24oU3RyaW5nIG1pc3NpbmdTb3VyY2VGaWxlKSB7CiAJdGhpcy5taXNzaW5nU291cmNlRmlsZSA9IG1pc3NpbmdTb3VyY2VGaWxlOwogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL05hbWVFbnZpcm9ubWVudC5qYXZhCmluZGV4IGE1NmJiMmYuLmQ5YjcyMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvTmFtZUVudmlyb25tZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9OYW1lRW52aXJvbm1lbnQuamF2YQpAQCAtMSw1OSArMSw1MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgTmFtZUVudmlyb25tZW50IGltcGxlbWVudHMgSU5hbWVFbnZpcm9ubWVudCB7CiAKLUNsYXNzcGF0aExvY2F0aW9uW10gY2xhc3NwYXRoTG9jYXRpb25zOwotU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lczsgLy8gYXNzdW1lZCB0aGF0IGVhY2ggbmFtZSBpcyBvZiB0aGUgZm9ybSAiYS9iL0NsYXNzTmFtZSIKLVN0cmluZ1tdIGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXM7IC8vIGFzc3VtZWQgdGhhdCBlYWNoIG5hbWUgaXMgb2YgdGhlIGZvcm0gImQ6L2VjbGlwc2UvVGVzdC9hL2IvQ2xhc3NOYW1lLmphdmEiCi0KIGJvb2xlYW4gaXNJbmNyZW1lbnRhbEJ1aWxkOwotCi1DbGFzc3BhdGhMb2NhdGlvbltdIGJpbmFyeUxvY2F0aW9uczsKIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5W10gc291cmNlTG9jYXRpb25zOworQ2xhc3NwYXRoTG9jYXRpb25bXSBiaW5hcnlMb2NhdGlvbnM7CiAKLXB1YmxpYyBOYW1lRW52aXJvbm1lbnQoQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc3BhdGhMb2NhdGlvbnMpIHsKLQl0aGlzLmNsYXNzcGF0aExvY2F0aW9ucyA9IGNsYXNzcGF0aExvY2F0aW9uczsKK1N0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXM7IC8vIGFzc3VtZWQgdGhhdCBlYWNoIG5hbWUgaXMgb2YgdGhlIGZvcm0gImEvYi9DbGFzc05hbWUiCitTb3VyY2VGaWxlW10gYWRkaXRpb25hbFVuaXRzOworCitOYW1lRW52aXJvbm1lbnQoSVdvcmtzcGFjZVJvb3Qgcm9vdCwgSmF2YVByb2plY3QgamF2YVByb2plY3QsIFNpbXBsZUxvb2t1cFRhYmxlIGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAl0aGlzLmlzSW5jcmVtZW50YWxCdWlsZCA9IGZhbHNlOwotCXNwbGl0TG9jYXRpb25zKCk7Ci0Jc2V0TmFtZXMobmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1swXSk7CisJY29tcHV0ZUNsYXNzcGF0aExvY2F0aW9ucyhyb290LCBqYXZhUHJvamVjdCwgYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdCk7CisJc2V0TmFtZXMobnVsbCwgbnVsbCk7CiB9CiAKIHB1YmxpYyBOYW1lRW52aXJvbm1lbnQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisJdGhpcy5pc0luY3JlbWVudGFsQnVpbGQgPSBmYWxzZTsKIAl0cnkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVJlc291cmNlIG91dHB1dEZvbGRlciA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJU3RyaW5nIG91dHB1dEZvbGRlckxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG91dHB1dEZvbGRlciAhPSBudWxsICYmIG91dHB1dEZvbGRlci5leGlzdHMoKSkKLQkJCW91dHB1dEZvbGRlckxvY2F0aW9uID0gb3V0cHV0Rm9sZGVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdGhpcy5jbGFzc3BhdGhMb2NhdGlvbnMgPSBjb21wdXRlTG9jYXRpb25zKHdvcmtzcGFjZVJvb3QsIGphdmFQcm9qZWN0LCBvdXRwdXRGb2xkZXJMb2NhdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuaXNJbmNyZW1lbnRhbEJ1aWxkID0gZmFsc2U7Ci0JfSBjYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl0aGlzLmNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvblswXTsKKwkJY29tcHV0ZUNsYXNzcGF0aExvY2F0aW9ucyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAoSmF2YVByb2plY3QpIGphdmFQcm9qZWN0LCBudWxsKTsKKwl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkgeworCQl0aGlzLnNvdXJjZUxvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVswXTsKKwkJdGhpcy5iaW5hcnlMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bMF07CiAJfQotCXNwbGl0TG9jYXRpb25zKCk7Ci0Jc2V0TmFtZXMobmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1swXSk7CisJc2V0TmFtZXMobnVsbCwgbnVsbCk7CiB9CiAKIC8qIFNvbWUgZXhhbXBsZXMgb2YgcmVzb2x2ZWQgY2xhc3MgcGF0aCBlbnRyaWVzLgpAQCAtNzgsMTEwICs3MSwxNzYgQEAKICogICAvVGVzdFtDUEVfUFJPSkVDVF1bS19TT1VSQ0VdIC0+IEQ6L2VjbGlwc2UudGVzdC9UZXN0CiAqICBBTFdBWVMgd2FudCB0byBhcHBlbmQgdGhlIG91dHB1dCBmb2xkZXIgJiBPTkxZIHNlYXJjaCBmb3IgLmNsYXNzIGZpbGVzCiAqLwotcHVibGljIHN0YXRpYyBDbGFzc3BhdGhMb2NhdGlvbltdIGNvbXB1dGVMb2NhdGlvbnMoCi0JSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCwKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsCi0JU3RyaW5nIG91dHB1dEZvbGRlckxvY2F0aW9uLAotCUFycmF5TGlzdCBzb3VyY2VGb2xkZXJzLAotCVNpbXBsZUxvb2t1cFRhYmxlIGJpbmFyeVJlc291cmNlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Citwcml2YXRlIHZvaWQgY29tcHV0ZUNsYXNzcGF0aExvY2F0aW9ucygKKwlJV29ya3NwYWNlUm9vdCByb290LAorCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAorCVNpbXBsZUxvb2t1cFRhYmxlIGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAotCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSAoKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSwgdHJ1ZSk7Ci0JaW50IGNwQ291bnQgPSAwOwotCWludCBtYXggPSBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsKLQlDbGFzc3BhdGhMb2NhdGlvbltdIGNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvblttYXhdOworCS8qIFVwZGF0ZSBpbmNvbXBsZXRlIGNsYXNzcGF0aCBtYXJrZXIgKi8KKwlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSwgdHJ1ZSk7CiAKLQlib29sZWFuIGZpcnN0U291cmNlRm9sZGVyID0gdHJ1ZTsKLQluZXh0RW50cnkgOiBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aEVudHJpZXNbaV07CisJLyogVXBkYXRlIGN5Y2xlIG1hcmtlciAqLworCUlNYXJrZXIgY3ljbGVNYXJrZXIgPSBqYXZhUHJvamVjdC5nZXRDeWNsZU1hcmtlcigpOworCWlmIChjeWNsZU1hcmtlciAhPSBudWxsKSB7CisJCWludCBzZXZlcml0eSA9IEphdmFDb3JlLkVSUk9SLmVxdWFscyhqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIHRydWUpKQorCQkJPyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SCisJCQk6IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKKwkJaWYgKHNldmVyaXR5ICE9ICgoSW50ZWdlcikgY3ljbGVNYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKS5pbnRWYWx1ZSgpKQorCQkJY3ljbGVNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5KTsKKwl9CisKKwlBcnJheUxpc3Qgc0xvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOworCUFycmF5TGlzdCBiTG9jYXRpb25zID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCk7CisJbmV4dEVudHJ5IDogZm9yIChpbnQgaSA9IDAsIGwgPSBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgY2xhc3NwYXRoRW50cmllc1tpXTsKIAkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQod29ya3NwYWNlUm9vdCwgcGF0aCwgdHJ1ZSk7CisJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHJvb3QsIHBhdGgsIHRydWUpOwogCQlpZiAodGFyZ2V0ID09IG51bGwpIGNvbnRpbnVlIG5leHRFbnRyeTsKIAotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7Ci0JCQlzd2l0Y2goZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJaWYgKG91dHB1dEZvbGRlckxvY2F0aW9uID09IG51bGwgfHwgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpKSBjb250aW51ZSBuZXh0RW50cnk7Ci0JCQkJCWlmIChzb3VyY2VGb2xkZXJzICE9IG51bGwpIHsgLy8gbm9ybWFsIGJ1aWxkZXIgbW9kZQotCQkJCQkJc291cmNlRm9sZGVycy5hZGQocmVzb3VyY2UpOwotCQkJCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPQotCQkJCQkJCUNsYXNzcGF0aExvY2F0aW9uLmZvclNvdXJjZUZvbGRlcihyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIG91dHB1dEZvbGRlckxvY2F0aW9uKTsKLQkJCQkJfSBlbHNlIGlmIChmaXJzdFNvdXJjZUZvbGRlcikgeyAvLyBhZGQgdGhlIG91dHB1dCBmb2xkZXIgb25seSBvbmNlCi0JCQkJCQlmaXJzdFNvdXJjZUZvbGRlciA9IGZhbHNlOwotCQkJCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIob3V0cHV0Rm9sZGVyTG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKLQotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkpIGNvbnRpbnVlIG5leHRFbnRyeTsKLQkJCQkJSVByb2plY3QgcHJlcmVxUHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCWlmICghcHJlcmVxUHJvamVjdC5pc0FjY2Vzc2libGUoKSkgY29udGludWUgbmV4dEVudHJ5OwotCQkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IEphdmFDb3JlLmNyZWF0ZShwcmVyZXFQcm9qZWN0KS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCQlJUmVzb3VyY2UgcHJlcmVxT3V0cHV0Rm9sZGVyOwotCQkJCQlpZiAocHJlcmVxUHJvamVjdC5nZXRGdWxsUGF0aCgpLmVxdWFscyhvdXRwdXRMb2NhdGlvbikpIHsKLQkJCQkJCXByZXJlcU91dHB1dEZvbGRlciA9IHByZXJlcVByb2plY3Q7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmVyZXFPdXRwdXRGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIob3V0cHV0TG9jYXRpb24pOwotCQkJCQkJaWYgKHByZXJlcU91dHB1dEZvbGRlciA9PSBudWxsIHx8ICFwcmVyZXFPdXRwdXRGb2xkZXIuZXhpc3RzKCkgfHwgIShwcmVyZXFPdXRwdXRGb2xkZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSkKLQkJCQkJCQljb250aW51ZSBuZXh0RW50cnk7Ci0JCQkJCX0KLQkJCQkJaWYgKHByZXJlcU91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpID09IG51bGwpIC8vIHNhbml0eSBjaGVjawotCQkJCQkJY29udGludWUgbmV4dEVudHJ5OwotCQkJCQlpZiAoYmluYXJ5UmVzb3VyY2VzICE9IG51bGwpIHsgLy8gbm9ybWFsIGJ1aWxkZXIgbW9kZQotCQkJCQkJSVJlc291cmNlW10gZXhpc3RpbmdSZXNvdXJjZXMgPSAoSVJlc291cmNlW10pIGJpbmFyeVJlc291cmNlcy5nZXQocHJlcmVxUHJvamVjdCk7Ci0JCQkJCQlpZiAoZXhpc3RpbmdSZXNvdXJjZXMgPT0gbnVsbCkKLQkJCQkJCQliaW5hcnlSZXNvdXJjZXMucHV0KHByZXJlcVByb2plY3QsIG5ldyBJUmVzb3VyY2VbXSB7cHJlcmVxT3V0cHV0Rm9sZGVyfSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZXhpc3RpbmdSZXNvdXJjZXNbMF0gPSBwcmVyZXFPdXRwdXRGb2xkZXI7IC8vIHByb2plY3QncyBvdXRwdXQgZm9sZGVyIGlzIGFsd2F5cyBmaXJzdAotCQkJCQl9Ci0JCQkJCWNsYXNzcGF0aExvY2F0aW9uc1tjcENvdW50KytdID0gQ2xhc3NwYXRoTG9jYXRpb24uZm9yQmluYXJ5Rm9sZGVyKHByZXJlcU91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQljb250aW51ZSBuZXh0RW50cnk7Ci0KLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCWlmIChyZXNvdXJjZS5nZXRMb2NhdGlvbigpID09IG51bGwpIC8vIHNhbml0eSBjaGVjawotCQkJCQkJY29udGludWUgbmV4dEVudHJ5OwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJaWYgKCEoSmF2YUJ1aWxkZXIuSkFSX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikgfHwgSmF2YUJ1aWxkZXIuWklQX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGV4dGVuc2lvbikpKQotCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKLQkJCQkJCWNsYXNzcGF0aExvY2F0aW9uc1tjcENvdW50KytdID0gQ2xhc3NwYXRoTG9jYXRpb24uZm9yTGlicmFyeShyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQlpZiAoYmluYXJ5UmVzb3VyY2VzICE9IG51bGwpIHsgLy8gbm9ybWFsIGJ1aWxkZXIgbW9kZQotCQkJCQkJSVByb2plY3QgcCA9IHJlc291cmNlLmdldFByb2plY3QoKTsgLy8gY2FuIGJlIHRoZSBwcm9qZWN0IGJlaW5nIGJ1aWx0Ci0JCQkJCQlJUmVzb3VyY2VbXSBleGlzdGluZ1Jlc291cmNlcyA9IChJUmVzb3VyY2VbXSkgYmluYXJ5UmVzb3VyY2VzLmdldChwKTsKLQkJCQkJCWlmIChleGlzdGluZ1Jlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZXhpc3RpbmdSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW10ge251bGwsIHJlc291cmNlfTsgLy8gcHJvamVjdCdzIG91dHB1dCBmb2xkZXIgaXMgYWx3YXlzIGZpcnN0LCBudWxsIGlmIG5vdCBpbmNsdWRlZAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgc2l6ZSA9IGV4aXN0aW5nUmVzb3VyY2VzLmxlbmd0aDsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4aXN0aW5nUmVzb3VyY2VzLCAwLCBleGlzdGluZ1Jlc291cmNlcyA9IG5ldyBJUmVzb3VyY2Vbc2l6ZSArIDFdLCAwLCBzaXplKTsKLQkJCQkJCQlleGlzdGluZ1Jlc291cmNlc1tzaXplXSA9IHJlc291cmNlOwotCQkJCQkJfQotCQkJCQkJYmluYXJ5UmVzb3VyY2VzLnB1dChwLCBleGlzdGluZ1Jlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJY29udGludWUgbmV4dEVudHJ5OwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZpbGUpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmICghKEphdmFCdWlsZGVyLkpBUl9FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pIHx8IEphdmFCdWlsZGVyLlpJUF9FWFRFTlNJT04uZXF1YWxzSWdub3JlQ2FzZShleHRlbnNpb24pKSkKKwkJc3dpdGNoKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7CisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKKwkJCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkgY29udGludWUgbmV4dEVudHJ5OworCQkJCUlQYXRoIG91dHB1dFBhdGggPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwgCisJCQkJCT8gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSAKKwkJCQkJOiBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJCUlDb250YWluZXIgb3V0cHV0Rm9sZGVyOworCQkJCWlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKKwkJCQkJb3V0cHV0Rm9sZGVyID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworCQkJCX0gZWxzZSB7CisJCQkJCW91dHB1dEZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKG91dHB1dFBhdGgpOworCQkJCQlpZiAoIW91dHB1dEZvbGRlci5leGlzdHMoKSkKKwkJCQkJCWNyZWF0ZUZvbGRlcihvdXRwdXRGb2xkZXIpOworCQkJCX0KKwkJCQlzTG9jYXRpb25zLmFkZCgKKwkJCQkJQ2xhc3NwYXRoTG9jYXRpb24uZm9yU291cmNlRm9sZGVyKChJQ29udGFpbmVyKSB0YXJnZXQsIG91dHB1dEZvbGRlciwgZW50cnkuZnVsbEV4Y2x1c2lvblBhdHRlcm5DaGFycygpKSk7CiAJCQkJY29udGludWUgbmV4dEVudHJ5OwotCQkJY2xhc3NwYXRoTG9jYXRpb25zW2NwQ291bnQrK10gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JMaWJyYXJ5KHBhdGgudG9TdHJpbmcoKSk7CisKKwkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKKwkJCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCkpIGNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCQlJUHJvamVjdCBwcmVyZXFQcm9qZWN0ID0gKElQcm9qZWN0KSB0YXJnZXQ7CisJCQkJaWYgKCFKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByZXJlcVByb2plY3QpKSBjb250aW51ZSBuZXh0RW50cnk7IC8vIGlmIHByb2plY3QgZG9lc24ndCBoYXZlIGphdmEgbmF0dXJlIG9yIGlzIG5vdCBhY2Nlc3NpYmxlCisKKwkJCQlKYXZhUHJvamVjdCBwcmVyZXFKYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHByZXJlcVByb2plY3QpOworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHByZXJlcUNsYXNzcGF0aEVudHJpZXMgPSBwcmVyZXFKYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJCQlBcnJheUxpc3Qgc2VlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQluZXh0UHJlcmVxRW50cnk6IGZvciAoaW50IGogPSAwLCBtID0gcHJlcmVxQ2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IHByZXJlcUVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgcHJlcmVxQ2xhc3NwYXRoRW50cmllc1tqXTsKKwkJCQkJaWYgKHByZXJlcUVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJCQlPYmplY3QgcHJlcmVxVGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldChyb290LCBwcmVyZXFFbnRyeS5nZXRQYXRoKCksIHRydWUpOworCQkJCQkJaWYgKCEocHJlcmVxVGFyZ2V0IGluc3RhbmNlb2YgSUNvbnRhaW5lcikpIGNvbnRpbnVlIG5leHRQcmVyZXFFbnRyeTsKKwkJCQkJCUlQYXRoIHByZXJlcU91dHB1dFBhdGggPSBwcmVyZXFFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwgCisJCQkJCQkJPyBwcmVyZXFFbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpIAorCQkJCQkJCTogcHJlcmVxSmF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJCQkJCUlDb250YWluZXIgYmluYXJ5Rm9sZGVyID0gcHJlcmVxT3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKSA9PSAxCisJCQkJCQkJPyAoSUNvbnRhaW5lcikgcHJlcmVxUHJvamVjdAorCQkJCQkJCTogKElDb250YWluZXIpIHJvb3QuZ2V0Rm9sZGVyKHByZXJlcU91dHB1dFBhdGgpOworCQkJCQkJaWYgKGJpbmFyeUZvbGRlci5leGlzdHMoKSAmJiAhc2Vlbi5jb250YWlucyhiaW5hcnlGb2xkZXIpKSB7CisJCQkJCQkJc2Vlbi5hZGQoYmluYXJ5Rm9sZGVyKTsKKwkJCQkJCQlDbGFzc3BhdGhMb2NhdGlvbiBiTG9jYXRpb24gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIoYmluYXJ5Rm9sZGVyLCB0cnVlKTsKKwkJCQkJCQliTG9jYXRpb25zLmFkZChiTG9jYXRpb24pOworCQkJCQkJCWlmIChiaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0ICE9IG51bGwpIHsgLy8gbm9ybWFsIGJ1aWxkZXIgbW9kZQorCQkJCQkJCQlDbGFzc3BhdGhMb2NhdGlvbltdIGV4aXN0aW5nTG9jYXRpb25zID0gKENsYXNzcGF0aExvY2F0aW9uW10pIGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QuZ2V0KHByZXJlcVByb2plY3QpOworCQkJCQkJCQlpZiAoZXhpc3RpbmdMb2NhdGlvbnMgPT0gbnVsbCkgeworCQkJCQkJCQkJZXhpc3RpbmdMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bXSB7YkxvY2F0aW9ufTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWludCBzaXplID0gZXhpc3RpbmdMb2NhdGlvbnMubGVuZ3RoOworCQkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ0xvY2F0aW9ucywgMCwgZXhpc3RpbmdMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bc2l6ZSArIDFdLCAwLCBzaXplKTsKKwkJCQkJCQkJCWV4aXN0aW5nTG9jYXRpb25zW3NpemVdID0gYkxvY2F0aW9uOworCQkJCQkJCQl9CisJCQkJCQkJCWJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QucHV0KHByZXJlcVByb2plY3QsIGV4aXN0aW5nTG9jYXRpb25zKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY29udGludWUgbmV4dEVudHJ5OworCisJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6CisJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSB0YXJnZXQ7CisJCQkJCUNsYXNzcGF0aExvY2F0aW9uIGJMb2NhdGlvbiA9IG51bGw7CisJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCQlpZiAoIShVdGlsLmlzQXJjaGl2ZUZpbGVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSkpKQorCQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKKwkJCQkJCWJMb2NhdGlvbiA9IENsYXNzcGF0aExvY2F0aW9uLmZvckxpYnJhcnkoKElGaWxlKSByZXNvdXJjZSk7CisJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CisJCQkJCQliTG9jYXRpb24gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIoKElDb250YWluZXIpIHRhcmdldCwgZmFsc2UpOyAvLyBpcyBsaWJyYXJ5IGZvbGRlciBub3Qgb3V0cHV0IGZvbGRlcgorCQkJCQl9CisJCQkJCWJMb2NhdGlvbnMuYWRkKGJMb2NhdGlvbik7CisJCQkJCWlmIChiaW5hcnlMb2NhdGlvbnNQZXJQcm9qZWN0ICE9IG51bGwpIHsgLy8gbm9ybWFsIGJ1aWxkZXIgbW9kZQorCQkJCQkJSVByb2plY3QgcCA9IHJlc291cmNlLmdldFByb2plY3QoKTsgLy8gY2FuIGJlIHRoZSBwcm9qZWN0IGJlaW5nIGJ1aWx0CisJCQkJCQlDbGFzc3BhdGhMb2NhdGlvbltdIGV4aXN0aW5nTG9jYXRpb25zID0gKENsYXNzcGF0aExvY2F0aW9uW10pIGJpbmFyeUxvY2F0aW9uc1BlclByb2plY3QuZ2V0KHApOworCQkJCQkJaWYgKGV4aXN0aW5nTG9jYXRpb25zID09IG51bGwpIHsKKwkJCQkJCQlleGlzdGluZ0xvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltdIHtiTG9jYXRpb259OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpbnQgc2l6ZSA9IGV4aXN0aW5nTG9jYXRpb25zLmxlbmd0aDsKKwkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGV4aXN0aW5nTG9jYXRpb25zLCAwLCBleGlzdGluZ0xvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltzaXplICsgMV0sIDAsIHNpemUpOworCQkJCQkJCWV4aXN0aW5nTG9jYXRpb25zW3NpemVdID0gYkxvY2F0aW9uOworCQkJCQkJfQorCQkJCQkJYmluYXJ5TG9jYXRpb25zUGVyUHJvamVjdC5wdXQocCwgZXhpc3RpbmdMb2NhdGlvbnMpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGaWxlKSB7CisJCQkJCWlmICghKFV0aWwuaXNBcmNoaXZlRmlsZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKSkpCisJCQkJCQljb250aW51ZSBuZXh0RW50cnk7CisJCQkJCWJMb2NhdGlvbnMuYWRkKENsYXNzcGF0aExvY2F0aW9uLmZvckxpYnJhcnkocGF0aC50b1N0cmluZygpKSk7CisJCQkJfQorCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKIAkJfQogCX0KLQlpZiAoY3BDb3VudCA8IG1heCkKLQkJU3lzdGVtLmFycmF5Y29weShjbGFzc3BhdGhMb2NhdGlvbnMsIDAsIChjbGFzc3BhdGhMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bY3BDb3VudF0pLCAwLCBjcENvdW50KTsKLQlyZXR1cm4gY2xhc3NwYXRoTG9jYXRpb25zOworCisJLy8gbm93IHNwbGl0IHRoZSBjbGFzc3BhdGggbG9jYXRpb25zLi4uIHBsYWNlIHRoZSBvdXRwdXQgZm9sZGVycyBhaGVhZCBvZiB0aGUgb3RoZXIgLmNsYXNzIGZpbGUgZm9sZGVycyAmIGphcnMKKwlBcnJheUxpc3Qgb3V0cHV0Rm9sZGVycyA9IG5ldyBBcnJheUxpc3QoMSk7CisJdGhpcy5zb3VyY2VMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTXVsdGlEaXJlY3Rvcnlbc0xvY2F0aW9ucy5zaXplKCldOworCWlmICghc0xvY2F0aW9ucy5pc0VtcHR5KCkpIHsKKwkJc0xvY2F0aW9ucy50b0FycmF5KHRoaXMuc291cmNlTG9jYXRpb25zKTsKKworCQkvLyBjb2xsZWN0IHRoZSBvdXRwdXQgZm9sZGVycywgc2tpcHBpbmcgZHVwbGljYXRlcworCQluZXh0IDogZm9yIChpbnQgaSA9IDAsIGwgPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisJCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwkJCUlQYXRoIG91dHB1dFBhdGggPSBtZC5iaW5hcnlGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7IC8vIGNvbXBhcmUgYWdhaW5zdCBwcmV2aW91c2x5IHdhbGtlZCBzb3VyY2UgZm9sZGVycworCQkJCWlmIChvdXRwdXRQYXRoLmVxdWFscyhzb3VyY2VMb2NhdGlvbnNbal0uYmluYXJ5Rm9sZGVyLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCW1kLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyID0gc291cmNlTG9jYXRpb25zW2pdLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyOworCQkJCQljb250aW51ZSBuZXh0OworCQkJCX0KKwkJCX0KKwkJCW91dHB1dEZvbGRlcnMuYWRkKG1kKTsKKworCQkJLy8gYWxzbyB0YWcgZWFjaCBzb3VyY2UgZm9sZGVyIHdob3NlIG91dHB1dCBmb2xkZXIgaXMgYW4gaW5kZXBlbmRlbnQgZm9sZGVyICYgaXMgbm90IGFsc28gYSBzb3VyY2UgZm9sZGVyCisJCQlmb3IgKGludCBqID0gMCwgbSA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJaWYgKG91dHB1dFBhdGguZXF1YWxzKHNvdXJjZUxvY2F0aW9uc1tqXS5zb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKSkpCisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQltZC5oYXNJbmRlcGVuZGVudE91dHB1dEZvbGRlciA9IHRydWU7CisJCX0KKwl9CisKKwkvLyBjb21iaW5lIHRoZSBvdXRwdXQgZm9sZGVycyB3aXRoIHRoZSBiaW5hcnkgZm9sZGVycyAmIGphcnMuLi4gcGxhY2UgdGhlIG91dHB1dCBmb2xkZXJzIGJlZm9yZSBvdGhlciAuY2xhc3MgZmlsZSBmb2xkZXJzICYgamFycworCXRoaXMuYmluYXJ5TG9jYXRpb25zID0gbmV3IENsYXNzcGF0aExvY2F0aW9uW291dHB1dEZvbGRlcnMuc2l6ZSgpICsgYkxvY2F0aW9ucy5zaXplKCldOworCWludCBpbmRleCA9IDA7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBvdXRwdXRGb2xkZXJzLnNpemUoKTsgaSA8IGw7IGkrKykKKwkJdGhpcy5iaW5hcnlMb2NhdGlvbnNbaW5kZXgrK10gPSAoQ2xhc3NwYXRoTG9jYXRpb24pIG91dHB1dEZvbGRlcnMuZ2V0KGkpOworCWZvciAoaW50IGkgPSAwLCBsID0gYkxvY2F0aW9ucy5zaXplKCk7IGkgPCBsOyBpKyspCisJCXRoaXMuYmluYXJ5TG9jYXRpb25zW2luZGV4KytdID0gKENsYXNzcGF0aExvY2F0aW9uKSBiTG9jYXRpb25zLmdldChpKTsKIH0KIAogcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQljbGFzc3BhdGhMb2NhdGlvbnNbaV0uY2xlYW51cCgpOworCXRoaXMuaW5pdGlhbFR5cGVOYW1lcyA9IG51bGw7CisJdGhpcy5hZGRpdGlvbmFsVW5pdHMgPSBudWxsOworCWZvciAoaW50IGkgPSAwLCBsID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJc291cmNlTG9jYXRpb25zW2ldLmNsZWFudXAoKTsKKwlmb3IgKGludCBpID0gMCwgbCA9IGJpbmFyeUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCWJpbmFyeUxvY2F0aW9uc1tpXS5jbGVhbnVwKCk7Cit9CisKK3ByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXIoSUNvbnRhaW5lciBmb2xkZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAoIWZvbGRlci5leGlzdHMoKSkgeworCQljcmVhdGVGb2xkZXIoZm9sZGVyLmdldFBhcmVudCgpKTsKKwkJKChJRm9sZGVyKSBmb2xkZXIpLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwl9CiB9CiAKIHByaXZhdGUgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRDbGFzcyhTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSkgewogCWlmIChpbml0aWFsVHlwZU5hbWVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGluaXRpYWxUeXBlTmFtZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBpbml0aWFsVHlwZU5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyhpbml0aWFsVHlwZU5hbWVzW2ldKSkgewogCQkJCWlmIChpc0luY3JlbWVudGFsQnVpbGQpCiAJCQkJCS8vIGNhdGNoIHRoZSBjYXNlIHRoYXQgYSB0eXBlIGluc2lkZSBhIHNvdXJjZSBmaWxlIGhhcyBiZWVuIHJlbmFtZWQgYnV0IG90aGVyIGNsYXNzIGZpbGVzIGFyZSBsb29raW5nIGZvciBpdApAQCAtMTkxLDYgKzI1MCwyNSBAQAogCQl9CiAJfQogCisJaWYgKGFkZGl0aW9uYWxVbml0cyAhPSBudWxsICYmIHNvdXJjZUxvY2F0aW9ucy5sZW5ndGggPiAwKSB7CisJCS8vIGlmIGFuIGFkZGl0aW9uYWwgc291cmNlIGZpbGUgaXMgd2FpdGluZyB0byBiZSBjb21waWxlZCwgYW5zd2VyIGl0IEJVVCBub3QgaWYgdGhpcyBpcyBhIHNlY29uZGFyeSB0eXBlIHNlYXJjaAorCQkvLyBpZiB3ZSBhbnN3ZXIgWC5qYXZhICYgaXQgbm8gbG9uZ2VyIGRlZmluZXMgWSB0aGVuIHRoZSBiaW5hcnkgdHlwZSBsb29raW5nIGZvciBZIHdpbGwgdGhpbmsgdGhlIGNsYXNzIHBhdGggaXMgd3JvbmcKKwkJLy8gbGV0IHRoZSByZWNvbXBpbGUgbG9vcCBmaXggdXAgZGVwZW5kZW50cyB3aGVuIHRoZSBzZWNvbmRhcnkgdHlwZSBZIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSBYLmphdmEKKwkJSVBhdGggcVNvdXJjZUZpbGVQYXRoID0gbmV3IFBhdGgocXVhbGlmaWVkVHlwZU5hbWUgKyAiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAorCQlpbnQgcVNlZ21lbnRDb3VudCA9IHFTb3VyY2VGaWxlUGF0aC5zZWdtZW50Q291bnQoKTsKKwkJbmV4dCA6IGZvciAoaW50IGkgPSAwLCBsID0gYWRkaXRpb25hbFVuaXRzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJU291cmNlRmlsZSBhZGRpdGlvbmFsVW5pdCA9IGFkZGl0aW9uYWxVbml0c1tpXTsKKwkJCUlQYXRoIGZ1bGxQYXRoID0gYWRkaXRpb25hbFVuaXQucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKKwkJCWludCBwcmVmaXhDb3VudCA9IGFkZGl0aW9uYWxVbml0LnNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOworCQkJaWYgKHFTZWdtZW50Q291bnQgPT0gZnVsbFBhdGguc2VnbWVudENvdW50KCkgLSBwcmVmaXhDb3VudCkgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcVNlZ21lbnRDb3VudDsgaisrKQorCQkJCQlpZiAoIXFTb3VyY2VGaWxlUGF0aC5zZWdtZW50KGopLmVxdWFscyhmdWxsUGF0aC5zZWdtZW50KGogKyBwcmVmaXhDb3VudCkpKQorCQkJCQkJY29udGludWUgbmV4dDsKKwkJCQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihhZGRpdGlvbmFsVW5pdCk7CisJCQl9CisJCX0KKwl9CisKIAlTdHJpbmcgcUJpbmFyeUZpbGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAogCVN0cmluZyBiaW5hcnlGaWxlTmFtZSA9IHFCaW5hcnlGaWxlTmFtZTsKIAlTdHJpbmcgcVBhY2thZ2VOYW1lID0gICIiOyAvLyROT04tTkxTLTEkCkBAIC0yMDAsMTkgKzI3OCw4IEBACiAJCWJpbmFyeUZpbGVOYW1lID0gcUJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZVN0YXJ0KTsKIAl9CiAKLQlpZiAoc291cmNlTG9jYXRpb25zICE9IG51bGwgJiYgc291cmNlTG9jYXRpb25zWzBdLmlzUGFja2FnZShxUGFja2FnZU5hbWUpKSB7IC8vIGxvb2tzIGluIGNvbW1vbiBvdXRwdXQgZm9sZGVyCi0JCWlmIChhZGRpdGlvbmFsU291cmNlRmlsZW5hbWVzICE9IG51bGwpIHsKLQkJCVN0cmluZyBxU291cmNlRmlsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzb3VyY2VMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0KLQkJCQkJc291cmNlTG9jYXRpb25zW2ldLmZpbmRTb3VyY2VGaWxlKHFTb3VyY2VGaWxlTmFtZSwgcVBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lcyk7Ci0JCQkJaWYgKGFuc3dlciAhPSBudWxsKSByZXR1cm4gYW5zd2VyOwotCQkJfQotCQl9Ci0JCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXIgPSBzb3VyY2VMb2NhdGlvbnNbMF0uZmluZENsYXNzKGJpbmFyeUZpbGVOYW1lLCBxUGFja2FnZU5hbWUsIHFCaW5hcnlGaWxlTmFtZSk7Ci0JCWlmIChhbnN3ZXIgIT0gbnVsbCkgcmV0dXJuIGFuc3dlcjsKLQl9Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGJpbmFyeUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCS8vIE5PVEU6IHRoZSBvdXRwdXQgZm9sZGVycyBhcmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmluYXJ5TG9jYXRpb25zCisJZm9yIChpbnQgaSA9IDAsIGwgPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAJCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXIgPSBiaW5hcnlMb2NhdGlvbnNbaV0uZmluZENsYXNzKGJpbmFyeUZpbGVOYW1lLCBxUGFja2FnZU5hbWUsIHFCaW5hcnlGaWxlTmFtZSk7CiAJCWlmIChhbnN3ZXIgIT0gbnVsbCkgcmV0dXJuIGFuc3dlcjsKIAl9CkBAIC0yNDAsNDQgKzMwNywxOSBAQAogfQogCiBwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7Ci0JaWYgKHNvdXJjZUxvY2F0aW9ucyAhPSBudWxsICYmIHNvdXJjZUxvY2F0aW9uc1swXS5pc1BhY2thZ2UocXVhbGlmaWVkUGFja2FnZU5hbWUpKSAvLyBsb29rcyBpbiBjb21tb24gb3V0cHV0IGZvbGRlcgotCQlyZXR1cm4gdHJ1ZTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYmluYXJ5TG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCS8vIE5PVEU6IHRoZSBvdXRwdXQgZm9sZGVycyBhcmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmluYXJ5TG9jYXRpb25zCisJZm9yIChpbnQgaSA9IDAsIGwgPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQlpZiAoYmluYXJ5TG9jYXRpb25zW2ldLmlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXB1YmxpYyB2b2lkIHNldE5hbWVzKFN0cmluZ1tdIGluaXRpYWxUeXBlTmFtZXMsIFN0cmluZ1tdIGFkZGl0aW9uYWxTb3VyY2VGaWxlbmFtZXMpIHsKK3ZvaWQgc2V0TmFtZXMoU3RyaW5nW10gaW5pdGlhbFR5cGVOYW1lcywgU291cmNlRmlsZVtdIGFkZGl0aW9uYWxVbml0cykgewogCXRoaXMuaW5pdGlhbFR5cGVOYW1lcyA9IGluaXRpYWxUeXBlTmFtZXM7Ci0JdGhpcy5hZGRpdGlvbmFsU291cmNlRmlsZW5hbWVzID0gYWRkaXRpb25hbFNvdXJjZUZpbGVuYW1lczsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQljbGFzc3BhdGhMb2NhdGlvbnNbaV0ucmVzZXQoKTsKKwl0aGlzLmFkZGl0aW9uYWxVbml0cyA9IGFkZGl0aW9uYWxVbml0czsKKwlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCXNvdXJjZUxvY2F0aW9uc1tpXS5yZXNldCgpOworCWZvciAoaW50IGkgPSAwLCBsID0gYmluYXJ5TG9jYXRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykKKwkJYmluYXJ5TG9jYXRpb25zW2ldLnJlc2V0KCk7CiB9Ci0KLXByaXZhdGUgdm9pZCBzcGxpdExvY2F0aW9ucygpIHsKLQlpbnQgbGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aDsKLQlBcnJheUxpc3Qgc0xvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QobGVuZ3RoKTsKLQlBcnJheUxpc3QgYkxvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QobGVuZ3RoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzcGF0aExvY2F0aW9uIGNsYXNzcGF0aCA9IGNsYXNzcGF0aExvY2F0aW9uc1tpXTsKLQkJaWYgKGNsYXNzcGF0aCBpbnN0YW5jZW9mIENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KQotCQkJc0xvY2F0aW9ucy5hZGQoY2xhc3NwYXRoKTsKLQkJZWxzZQotCQkJYkxvY2F0aW9ucy5hZGQoY2xhc3NwYXRoKTsKLQl9Ci0KLQlpZiAoc0xvY2F0aW9ucy5pc0VtcHR5KCkpIHsKLQkJdGhpcy5zb3VyY2VMb2NhdGlvbnMgPSBudWxsOwotCX0gZWxzZSB7Ci0JCXRoaXMuc291cmNlTG9jYXRpb25zID0gbmV3IENsYXNzcGF0aE11bHRpRGlyZWN0b3J5W3NMb2NhdGlvbnMuc2l6ZSgpXTsKLQkJc0xvY2F0aW9ucy50b0FycmF5KHRoaXMuc291cmNlTG9jYXRpb25zKTsKLQl9Ci0JdGhpcy5iaW5hcnlMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bYkxvY2F0aW9ucy5zaXplKCldOwotCWJMb2NhdGlvbnMudG9BcnJheSh0aGlzLmJpbmFyeUxvY2F0aW9ucyk7CiB9Ci0KLXZvaWQgdGFnQXNJbmNyZW1lbnRhbEJ1aWxkKCkgewotCXRoaXMuaXNJbmNyZW1lbnRhbEJ1aWxkID0gdHJ1ZTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1Byb2JsZW1GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1Byb2JsZW1GYWN0b3J5LmphdmEKaW5kZXggMzI1MWIyNC4uNmUyZDJkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Qcm9ibGVtRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUHJvYmxlbUZhY3RvcnkuamF2YQpAQCAtMSwxNiArMSwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKIAogaW1wb3J0IGphdmEudXRpbC4qOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1JlZmVyZW5jZUNvbGxlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUmVmZXJlbmNlQ29sbGVjdGlvbi5qYXZhCmluZGV4IDc3YWIzMjUuLjk2MTMwZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUmVmZXJlbmNlQ29sbGVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvUmVmZXJlbmNlQ29sbGVjdGlvbi5qYXZhCkBAIC0xLDE3ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIApAQCAtNDIsMTMgKzQyLDEzIEBACiAJaWYgKHNpbXBsZU5hbWVzID09IG51bGwgfHwgcXVhbGlmaWVkTmFtZXMgPT0gbnVsbCkgewogCQlpZiAoc2ltcGxlTmFtZXMgPT0gbnVsbCAmJiBxdWFsaWZpZWROYW1lcyA9PSBudWxsKSB7CiAJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIHdlbGwga25vd24gbWF0Y2giKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgd2VsbCBrbm93biBtYXRjaCIpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfSBlbHNlIGlmIChxdWFsaWZpZWROYW1lcyA9PSBudWxsKSB7CiAJCQlmb3IgKGludCBpID0gMCwgbCA9IHNpbXBsZU5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJCWlmIChpbmNsdWRlcyhzaW1wbGVOYW1lc1tpXSkpIHsKIAkJCQkJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIG1hdGNoIGluIHdlbGwga25vd24gcGFja2FnZSB0byAiICsgbmV3IFN0cmluZyhzaW1wbGVOYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIG1hdGNoIGluIHdlbGwga25vd24gcGFja2FnZSB0byAiICsgbmV3IFN0cmluZyhzaW1wbGVOYW1lc1tpXSkpOyAvLyROT04tTkxTLTEkCiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCX0KQEAgLTU3LDcgKzU3LDcgQEAKIAkJCQljaGFyW11bXSBxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZXNbaV07CiAJCQkJaWYgKHF1YWxpZmllZE5hbWUubGVuZ3RoID09IDEgPyBpbmNsdWRlcyhxdWFsaWZpZWROYW1lWzBdKSA6IGluY2x1ZGVzKHF1YWxpZmllZE5hbWUpKSB7CiAJCQkJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBmb3VuZCB3ZWxsIGtub3duIG1hdGNoIGluICIgKyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHF1YWxpZmllZE5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCB3ZWxsIGtub3duIG1hdGNoIGluICIgKyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHF1YWxpZmllZE5hbWUpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9CiAJCQl9CkBAIC02OSw3ICs2OSw3IEBACiAJCQkJCWNoYXJbXVtdIHF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lc1tqXTsKIAkJCQkJaWYgKHF1YWxpZmllZE5hbWUubGVuZ3RoID09IDEgPyBpbmNsdWRlcyhxdWFsaWZpZWROYW1lWzBdKSA6IGluY2x1ZGVzKHF1YWxpZmllZE5hbWUpKSB7CiAJCQkJCQlpZiAoSmF2YUJ1aWxkZXIuREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZvdW5kIG1hdGNoIGluICIgKyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHF1YWxpZmllZE5hbWUpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIG1hdGNoIGluICIgKyBDaGFyT3BlcmF0aW9uLnRvU3RyaW5nKHF1YWxpZmllZE5hbWUpIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJKyAiIHRvICIgKyBuZXcgU3RyaW5nKHNpbXBsZU5hbWVzW2ldKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCXJldHVybiB0cnVlOwogCQkJCQl9CkBAIC05NCw3ICs5NCw3IEBACiAJbmV3IGNoYXJbXVtdIHtUeXBlQ29uc3RhbnRzLkpBVkF9LAogCW5ldyBjaGFyW11bXSB7bmV3IGNoYXJbXSB7J28nLCAncicsICdnJ319LAogCW5ldyBjaGFyW11bXSB7bmV3IGNoYXJbXSB7J2MnLCAnbycsICdtJ319LAotCVR5cGVDb25zdGFudHMuTm9DaGFyQ2hhcn07IC8vIGRlZmF1bHQgcGFja2FnZQorCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSfTsgLy8gZGVmYXVsdCBwYWNrYWdlCiBzdGF0aWMgZmluYWwgY2hhcltdW10gV2VsbEtub3duU2ltcGxlTmFtZXMgPSBuZXcgY2hhcltdW10gewogCVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX1JVTlRJTUVFWENFUFRJT05bMl0sCiAJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfVEhST1dBQkxFWzJdLApAQCAtMTA1LDcgKzEwNSw3IEBACiAJbmV3IGNoYXJbXSB7J2MnLCAnbycsICdtJ319OwogCiBzdGF0aWMgZmluYWwgY2hhcltdW11bXSBFbXB0eVF1YWxpZmllZE5hbWVzID0gbmV3IGNoYXJbMF1bXVtdOwotc3RhdGljIGZpbmFsIGNoYXJbXVtdIEVtcHR5U2ltcGxlTmFtZXMgPSBuZXcgY2hhclswXVtdOworc3RhdGljIGZpbmFsIGNoYXJbXVtdIEVtcHR5U2ltcGxlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAogLy8gZWFjaCBhcnJheSBjb250YWlucyBxdWFsaWZpZWQgY2hhcltdW10sIG9uZSBmb3Igc2l6ZSAyLCAzLCA0LCA1LCA2LCA3ICYgdGhlIHJlc3QKIHN0YXRpYyBmaW5hbCBpbnQgTWF4UXVhbGlmaWVkTmFtZXMgPSA3OwpAQCAtMTE4LDcgKzExOCw3IEBACiAJCUludGVybmVkUXVhbGlmaWVkTmFtZXNbaV0gPSBuZXcgQXJyYXlMaXN0KDM3KTsKIAlmb3IgKGludCBpID0gMDsgaSA8IE1heFNpbXBsZU5hbWVzOyBpKyspCiAJCUludGVybmVkU2ltcGxlTmFtZXNbaV0gPSBuZXcgQXJyYXlMaXN0KDExKTsKLX07Cit9CiAKIHN0YXRpYyBjaGFyW11bXVtdIGludGVyblF1YWxpZmllZE5hbWVzKEFycmF5TGlzdCBxdWFsaWZpZWRTdHJpbmdzKSB7CiAJaWYgKHF1YWxpZmllZFN0cmluZ3MgPT0gbnVsbCkgcmV0dXJuIEVtcHR5UXVhbGlmaWVkTmFtZXM7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAluZXh0IDogZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQljaGFyW11bXSBxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZXNbaV07CiAJCWludCBxTGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGg7Ci0JCWZvciAoaW50IGogPSAwLCBrID0gV2VsbEtub3duUXVhbGlmaWVkTmFtZXMubGVuZ3RoOyBqIDwgazsgaisrKSB7CisJCWZvciAoaW50IGogPSAwLCBtID0gV2VsbEtub3duUXVhbGlmaWVkTmFtZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAJCQljaGFyW11bXSB3ZWxsS25vd25OYW1lID0gV2VsbEtub3duUXVhbGlmaWVkTmFtZXNbal07CiAJCQlpZiAocUxlbmd0aCA+IHdlbGxLbm93bk5hbWUubGVuZ3RoKQogCQkJCWJyZWFrOyAvLyBhbGwgcmVtYWluaW5nIHdlbGwga25vd24gbmFtZXMgYXJlIHNob3J0ZXIKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQkvLyBJbnRlcm5lZFF1YWxpZmllZE5hbWVzWzFdIGlzIGZvciBzaXplIDIuLi4KIAkJLy8gSW50ZXJuZWRRdWFsaWZpZWROYW1lc1s2XSBpcyBmb3Igc2l6ZSA3CiAJCUFycmF5TGlzdCBpbnRlcm5lZE5hbWVzID0gSW50ZXJuZWRRdWFsaWZpZWROYW1lc1txTGVuZ3RoIDw9IE1heFF1YWxpZmllZE5hbWVzID8gcUxlbmd0aCAtIDEgOiAwXTsKLQkJZm9yIChpbnQgaiA9IDAsIGsgPSBpbnRlcm5lZE5hbWVzLnNpemUoKTsgaiA8IGs7IGorKykgeworCQlmb3IgKGludCBqID0gMCwgbSA9IGludGVybmVkTmFtZXMuc2l6ZSgpOyBqIDwgbTsgaisrKSB7CiAJCQljaGFyW11bXSBpbnRlcm5lZE5hbWUgPSAoY2hhcltdW10pIGludGVybmVkTmFtZXMuZ2V0KGopOwogCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHF1YWxpZmllZE5hbWUsIGludGVybmVkTmFtZSkpIHsKIAkJCQlrZWVwZXJzW2luZGV4KytdID0gaW50ZXJuZWROYW1lOwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJY2hhcltdIG5hbWUgPSBzaW1wbGVOYW1lc1tpXTsKIAkJaW50IHNMZW5ndGggPSBuYW1lLmxlbmd0aDsKLQkJZm9yIChpbnQgaiA9IDAsIGsgPSBXZWxsS25vd25TaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBrOyBqKyspIHsKKwkJZm9yIChpbnQgaiA9IDAsIG0gPSBXZWxsS25vd25TaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCWNoYXJbXSB3ZWxsS25vd25OYW1lID0gV2VsbEtub3duU2ltcGxlTmFtZXNbal07CiAJCQlpZiAoc0xlbmd0aCA+IHdlbGxLbm93bk5hbWUubGVuZ3RoKQogCQkJCWJyZWFrOyAvLyBhbGwgcmVtYWluaW5nIHdlbGwga25vd24gbmFtZXMgYXJlIHNob3J0ZXIKQEAgLTIwNyw3ICsyMDcsNyBAQAogCQkvLyBJbnRlcm5lZFNpbXBsZU5hbWVzWzFdIGlzIGZvciBzaXplIDEuLi4KIAkJLy8gSW50ZXJuZWRTaW1wbGVOYW1lc1syOV0gaXMgZm9yIHNpemUgMjkKIAkJQXJyYXlMaXN0IGludGVybmVkTmFtZXMgPSBJbnRlcm5lZFNpbXBsZU5hbWVzW3NMZW5ndGggPCBNYXhTaW1wbGVOYW1lcyA/IHNMZW5ndGggOiAwXTsKLQkJZm9yIChpbnQgaiA9IDAsIGsgPSBpbnRlcm5lZE5hbWVzLnNpemUoKTsgaiA8IGs7IGorKykgeworCQlmb3IgKGludCBqID0gMCwgbSA9IGludGVybmVkTmFtZXMuc2l6ZSgpOyBqIDwgbTsgaisrKSB7CiAJCQljaGFyW10gaW50ZXJuZWROYW1lID0gKGNoYXJbXSkgaW50ZXJuZWROYW1lcy5nZXQoaik7CiAJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMobmFtZSwgaW50ZXJuZWROYW1lKSkgewogCQkJCWtlZXBlcnNbaW5kZXgrK10gPSBpbnRlcm5lZE5hbWU7CkBAIC0yMjMsNCArMjIzLDQgQEAKIAl9CiAJcmV0dXJuIGtlZXBlcnM7CiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Tb3VyY2VGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YQppbmRleCBlYTEzYjI3Li5lNDc0NmNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NvdXJjZUZpbGUuamF2YQpAQCAtMSwxMDUgKzEsMTAyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogCiBwdWJsaWMgY2xhc3MgU291cmNlRmlsZSBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXQgewogCi1wdWJsaWMgY2hhcltdIGZpbGVOYW1lOwotcHVibGljIGNoYXJbXSBtYWluVHlwZU5hbWU7Ci1wdWJsaWMgY2hhcltdW10gcGFja2FnZU5hbWU7CitJRmlsZSByZXNvdXJjZTsKK0NsYXNzcGF0aE11bHRpRGlyZWN0b3J5IHNvdXJjZUxvY2F0aW9uOworU3RyaW5nIGluaXRpYWxUeXBlTmFtZTsKIFN0cmluZyBlbmNvZGluZzsKIAotcHVibGljIFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgaW5pdGlhbFR5cGVOYW1lKSB7Ci0JdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lLnRvQ2hhckFycmF5KCk7Ci0JQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHRoaXMuZmlsZU5hbWUsICdcXCcsICcvJyk7Ci0KLQljaGFyW10gdHlwZU5hbWUgPSBpbml0aWFsVHlwZU5hbWUudG9DaGFyQXJyYXkoKTsKLQlpbnQgbGFzdEluZGV4ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHR5cGVOYW1lKTsKLQl0aGlzLm1haW5UeXBlTmFtZSA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZU5hbWUsIGxhc3RJbmRleCArIDEsIC0xKTsKLQl0aGlzLnBhY2thZ2VOYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgdHlwZU5hbWUsIDAsIGxhc3RJbmRleCAtIDEpOwotCi0JdGhpcy5lbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKK3B1YmxpYyBTb3VyY2VGaWxlKElGaWxlIHJlc291cmNlLCBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIGVuY29kaW5nKSB7CisJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCXRoaXMuc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbjsKKwl0aGlzLmluaXRpYWxUeXBlTmFtZSA9IGV4dHJhY3RUeXBlTmFtZSgpOworCXRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKIH0KIAotcHVibGljIFNvdXJjZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBjaGFyW10gbWFpblR5cGVOYW1lLCBjaGFyW11bXSBwYWNrYWdlTmFtZSkgewotCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZS50b0NoYXJBcnJheSgpOwotCUNoYXJPcGVyYXRpb24ucmVwbGFjZSh0aGlzLmZpbGVOYW1lLCAnXFwnLCAnLycpOworcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisJaWYgKCEobyBpbnN0YW5jZW9mIFNvdXJjZUZpbGUpKSByZXR1cm4gZmFsc2U7CiAKLQl0aGlzLm1haW5UeXBlTmFtZSA9IG1haW5UeXBlTmFtZTsKLQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJU291cmNlRmlsZSBmID0gKFNvdXJjZUZpbGUpIG87CisJcmV0dXJuIHNvdXJjZUxvY2F0aW9uID09IGYuc291cmNlTG9jYXRpb24gJiYgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoZi5yZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKK30gCiAKLQl0aGlzLmVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOworU3RyaW5nIGV4dHJhY3RUeXBlTmFtZSgpIHsKKwkvLyBhbnN3ZXIgYSBTdHJpbmcgd2l0aCB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZSBmb3IgdGhlIHNvdXJjZSBmaWxlIGluIHRoZSBmb3JtOiAncDEvcDIvQScKKwlJUGF0aCBmdWxsUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7CisJaW50IHJlc291cmNlU2VnbWVudENvdW50ID0gZnVsbFBhdGguc2VnbWVudENvdW50KCk7CisJaW50IHNvdXJjZUZvbGRlclNlZ21lbnRDb3VudCA9IHNvdXJjZUxvY2F0aW9uLnNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnNlZ21lbnRDb3VudCgpOworCWludCBjaGFyQ291bnQgPSAocmVzb3VyY2VTZWdtZW50Q291bnQgLSBzb3VyY2VGb2xkZXJTZWdtZW50Q291bnQgLSAxKSAtIDU7IC8vIGxlbmd0aCBvZiAiLmphdmEiCisJZm9yIChpbnQgaSA9IHNvdXJjZUZvbGRlclNlZ21lbnRDb3VudDsgaSA8IHJlc291cmNlU2VnbWVudENvdW50OyBpKyspCisJCWNoYXJDb3VudCArPSBmdWxsUGF0aC5zZWdtZW50KGkpLmxlbmd0aCgpOworCisJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2NoYXJDb3VudF07CisJaW50IG9mZnNldCA9IDA7CisJcmVzb3VyY2VTZWdtZW50Q291bnQtLTsgLy8gZGVhbCB3aXRoIHRoZSBsYXN0IHNlZ21lbnQgc2VwYXJhdGVseQorCWZvciAoaW50IGkgPSBzb3VyY2VGb2xkZXJTZWdtZW50Q291bnQ7IGkgPCByZXNvdXJjZVNlZ21lbnRDb3VudDsgaSsrKSB7CisJCVN0cmluZyBzZWdtZW50ID0gZnVsbFBhdGguc2VnbWVudChpKTsKKwkJaW50IHNpemUgPSBzZWdtZW50Lmxlbmd0aCgpOworCQlzZWdtZW50LmdldENoYXJzKDAsIHNpemUsIHJlc3VsdCwgb2Zmc2V0KTsKKwkJb2Zmc2V0ICs9IHNpemU7CisJCXJlc3VsdFtvZmZzZXQrK10gPSAnLyc7CisJfQorCVN0cmluZyBzZWdtZW50ID0gZnVsbFBhdGguc2VnbWVudChyZXNvdXJjZVNlZ21lbnRDb3VudCk7CisJaW50IHNpemUgPSBzZWdtZW50Lmxlbmd0aCgpIC0gNTsgLy8gbGVuZ3RoIG9mICIuamF2YSIKKwlzZWdtZW50LmdldENoYXJzKDAsIHNpemUsIHJlc3VsdCwgb2Zmc2V0KTsKKwlyZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOwogfQogCiBwdWJsaWMgY2hhcltdIGdldENvbnRlbnRzKCkgewotCS8vIG90aGVyd2lzZSByZXRyaWV2ZSBpdAotCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JdHJ5IHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmV3IFN0cmluZyhmaWxlTmFtZSkpOwotCQlJbnB1dFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXIgPQotCQkJdGhpcy5lbmNvZGluZyA9PSBudWxsCi0JCQkJPyBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkKLQkJCQk6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCB0aGlzLmVuY29kaW5nKTsKLQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHN0cmVhbVJlYWRlcik7Ci0JCWludCBsZW5ndGggPSAoaW50KSBmaWxlLmxlbmd0aCgpOwotCQljaGFyW10gY29udGVudHMgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgbGVuID0gMDsKLQkJaW50IHJlYWRTaXplID0gMDsKLQkJd2hpbGUgKChyZWFkU2l6ZSAhPSAtMSkgJiYgKGxlbiAhPSBsZW5ndGgpKSB7Ci0JCQkvLyBTZWUgUFIgMUZNUzg5VQotCQkJLy8gV2UgcmVjb3JkIGZpcnN0IHRoZSByZWFkIHNpemUuIEluIHRoaXMgY2FzZSBsZW4gaXMgdGhlIGFjdHVhbCByZWFkIHNpemUuCi0JCQlsZW4gKz0gcmVhZFNpemU7Ci0JCQlyZWFkU2l6ZSA9IHJlYWRlci5yZWFkKGNvbnRlbnRzLCBsZW4sIGxlbmd0aCAtIGxlbik7Ci0JCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCS8vIFNlZSBQUiAxRk1TODlVCi0JCS8vIE5vdyB3ZSBuZWVkIHRvIHJlc2l6ZSBpbiBjYXNlIHRoZSBkZWZhdWx0IGVuY29kaW5nIHVzZWQgbW9yZSB0aGFuIG9uZSBieXRlIGZvciBlYWNoCi0JCS8vIGNoYXJhY3RlcgotCQlpZiAobGVuICE9IGxlbmd0aCkKLQkJCVN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIDAsIChjb250ZW50cyA9IG5ldyBjaGFyW2xlbl0pLCAwLCBsZW4pOwkJCi0JCXJldHVybiBjb250ZW50czsKLQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgQWJvcnRDb21waWxhdGlvbih0cnVlLCBuZXcgTWlzc2luZ1NvdXJjZUZpbGVFeGNlcHRpb24obmV3IFN0cmluZyhmaWxlTmFtZSkpKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbmV3IE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKG5ldyBTdHJpbmcoZmlsZU5hbWUpKSk7CisKKwl0cnkgewkKKwkJcmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KHJlc291cmNlLCB0aGlzLmVuY29kaW5nKTsKKwl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEFib3J0Q29tcGlsYXRpb24odHJ1ZSwgbmV3IE1pc3NpbmdTb3VyY2VGaWxlRXhjZXB0aW9uKHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpOwogCX0KIH0KIAogcHVibGljIGNoYXJbXSBnZXRGaWxlTmFtZSgpIHsKLQlyZXR1cm4gZmlsZU5hbWU7CisJcmV0dXJuIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOyAvLyBkbyBub3Qga25vdyB3aGF0IHlvdSB3YW50IHRvIHJldHVybiBoZXJlCiB9CiAKIHB1YmxpYyBjaGFyW10gZ2V0TWFpblR5cGVOYW1lKCkgewotCXJldHVybiBtYWluVHlwZU5hbWU7CisJY2hhcltdIHR5cGVOYW1lID0gaW5pdGlhbFR5cGVOYW1lLnRvQ2hhckFycmF5KCk7CisJaW50IGxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ubGFzdEluZGV4T2YoJy8nLCB0eXBlTmFtZSk7CisJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkodHlwZU5hbWUsIGxhc3RJbmRleCArIDEsIC0xKTsKIH0KIAogcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgewotCXJldHVybiBwYWNrYWdlTmFtZTsKKwljaGFyW10gdHlwZU5hbWUgPSBpbml0aWFsVHlwZU5hbWUudG9DaGFyQXJyYXkoKTsKKwlpbnQgbGFzdEluZGV4ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLycsIHR5cGVOYW1lKTsKKwlyZXR1cm4gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcvJywgdHlwZU5hbWUsIDAsIGxhc3RJbmRleCk7Cit9CisKK1N0cmluZyB0eXBlTG9jYXRvcigpIHsKKwlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7CiB9CiAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuICJTb3VyY2VGaWxlWyIgLy8kTk9OLU5MUy0xJAotCQkrIG5ldyBTdHJpbmcoZmlsZU5hbWUpICsgIl0iOyAgLy8kTk9OLU5MUy0xJAorCQkrIHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKyAiXSI7ICAvLyROT04tTkxTLTEkCiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9TdGF0ZS5qYXZhCmluZGV4IDY5N2MxODEuLjAwYWIwZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU3RhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1N0YXRlLmphdmEKQEAgLTEsMzIgKzEsMzUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuU2ltcGxlTG9va3VwVGFibGU7CiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CiAKIHB1YmxpYyBjbGFzcyBTdGF0ZSB7CisvLyBOT1RFOiB0aGlzIHN0YXRlIGNhbm5vdCBjb250YWluIHR5cGVzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIHRoaXMgcHJvamVjdAogCiBTdHJpbmcgamF2YVByb2plY3ROYW1lOwotQ2xhc3NwYXRoTG9jYXRpb25bXSBjbGFzc3BhdGhMb2NhdGlvbnM7Ci1TdHJpbmcgb3V0cHV0TG9jYXRpb25TdHJpbmc7Ci0vLyBrZXllZCBieSBsb2NhdGlvbiAodGhlIGZ1bGwgZmlsZXN5c3RlbSBwYXRoICJkOi94eXovZWNsaXBzZS9UZXN0L3AxL3AyL0EuamF2YSIpLCB2YWx1ZSBpcyBhIFJlZmVyZW5jZUNvbGxlY3Rpb24gb3IgYW4gQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uCitDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVtdIHNvdXJjZUxvY2F0aW9uczsKK0NsYXNzcGF0aExvY2F0aW9uW10gYmluYXJ5TG9jYXRpb25zOworLy8ga2V5ZWQgYnkgdGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdHlwZSAoaWUuICJzcmMxL3AxL3AyL0EuamF2YSIpLCB2YWx1ZSBpcyBhIFJlZmVyZW5jZUNvbGxlY3Rpb24gb3IgYW4gQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uCiBTaW1wbGVMb29rdXBUYWJsZSByZWZlcmVuY2VzOwotLy8ga2V5ZWQgYnkgcXVhbGlmaWVkIHR5cGUgbmFtZSAicDEvcDIvQSIsIHZhbHVlIGlzIHRoZSBmdWxsIGZpbGVzeXN0ZW0gcGF0aCB3aGljaCBkZWZpbmVzIHRoaXMgdHlwZSAiZDoveHl6L2VjbGlwc2UvVGVzdC9wMS9wMi9BLmphdmEiCi1TaW1wbGVMb29rdXBUYWJsZSB0eXBlTG9jYXRpb25zOworLy8ga2V5ZWQgYnkgcXVhbGlmaWVkIHR5cGUgbmFtZSAicDEvcDIvQSIsIHZhbHVlIGlzIHRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggd2hpY2ggZGVmaW5lcyB0aGlzIHR5cGUgInNyYzEvcDEvcDIvQS5qYXZhIgorU2ltcGxlTG9va3VwVGFibGUgdHlwZUxvY2F0b3JzOwogCiBpbnQgYnVpbGROdW1iZXI7CiBsb25nIGxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lOwpAQCAtMzQsNyArMzcsMTIgQEAKIAogcHJpdmF0ZSBTdHJpbmdbXSBrbm93blBhY2thZ2VOYW1lczsgLy8gb2YgdGhlIGZvcm0gInAxL3AyIgogCi1zdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OID0gMHgwMDA0Oworc3RhdGljIGZpbmFsIGJ5dGUgVkVSU0lPTiA9IDB4MDAwNzsKKworc3RhdGljIGZpbmFsIGJ5dGUgU09VUkNFX0ZPTERFUiA9IDE7CitzdGF0aWMgZmluYWwgYnl0ZSBCSU5BUllfRk9MREVSID0gMjsKK3N0YXRpYyBmaW5hbCBieXRlIEVYVEVSTkFMX0pBUiA9IDM7CitzdGF0aWMgZmluYWwgYnl0ZSBJTlRFUk5BTF9KQVIgPSA0OwogCiBTdGF0ZSgpIHsKIH0KQEAgLTQyLDEwICs1MCwxMCBAQAogcHJvdGVjdGVkIFN0YXRlKEphdmFCdWlsZGVyIGphdmFCdWlsZGVyKSB7CiAJdGhpcy5rbm93blBhY2thZ2VOYW1lcyA9IG51bGw7CiAJdGhpcy5qYXZhUHJvamVjdE5hbWUgPSBqYXZhQnVpbGRlci5jdXJyZW50UHJvamVjdC5nZXROYW1lKCk7Ci0JdGhpcy5jbGFzc3BhdGhMb2NhdGlvbnMgPSBqYXZhQnVpbGRlci5jbGFzc3BhdGg7Ci0JdGhpcy5vdXRwdXRMb2NhdGlvblN0cmluZyA9IGphdmFCdWlsZGVyLm91dHB1dEZvbGRlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CisJdGhpcy5zb3VyY2VMb2NhdGlvbnMgPSBqYXZhQnVpbGRlci5uYW1lRW52aXJvbm1lbnQuc291cmNlTG9jYXRpb25zOworCXRoaXMuYmluYXJ5TG9jYXRpb25zID0gamF2YUJ1aWxkZXIubmFtZUVudmlyb25tZW50LmJpbmFyeUxvY2F0aW9uczsKIAl0aGlzLnJlZmVyZW5jZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNyk7Ci0JdGhpcy50eXBlTG9jYXRpb25zID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDcpOworCXRoaXMudHlwZUxvY2F0b3JzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKDcpOwogCiAJdGhpcy5idWlsZE51bWJlciA9IDA7IC8vIGluZGljYXRlcyBhIGZ1bGwgYnVpbGQKIAl0aGlzLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CkBAIC01OCw3ICs2Niw3IEBACiAJCXRoaXMuYnVpbGROdW1iZXIgPSBsYXN0U3RhdGUuYnVpbGROdW1iZXIgKyAxOwogCQl0aGlzLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lID0gbGFzdFN0YXRlLmxhc3RTdHJ1Y3R1cmFsQnVpbGRUaW1lOwogCQl0aGlzLnJlZmVyZW5jZXMgPSAoU2ltcGxlTG9va3VwVGFibGUpIGxhc3RTdGF0ZS5yZWZlcmVuY2VzLmNsb25lKCk7Ci0JCXRoaXMudHlwZUxvY2F0aW9ucyA9IChTaW1wbGVMb29rdXBUYWJsZSkgbGFzdFN0YXRlLnR5cGVMb2NhdGlvbnMuY2xvbmUoKTsKKwkJdGhpcy50eXBlTG9jYXRvcnMgPSAoU2ltcGxlTG9va3VwVGFibGUpIGxhc3RTdGF0ZS50eXBlTG9jYXRvcnMuY2xvbmUoKTsKIAl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CiAJCXRoaXMucmVmZXJlbmNlcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsYXN0U3RhdGUucmVmZXJlbmNlcy5lbGVtZW50U2l6ZSk7CiAJCU9iamVjdFtdIGtleVRhYmxlID0gbGFzdFN0YXRlLnJlZmVyZW5jZXMua2V5VGFibGU7CkBAIC02NywzMSArNzUsMzEgQEAKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQogCQkJCXRoaXMucmVmZXJlbmNlcy5wdXQoa2V5VGFibGVbaV0sIHZhbHVlVGFibGVbaV0pOwogCi0JCXRoaXMudHlwZUxvY2F0aW9ucyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsYXN0U3RhdGUudHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSk7Ci0JCWtleVRhYmxlID0gbGFzdFN0YXRlLnR5cGVMb2NhdGlvbnMua2V5VGFibGU7Ci0JCXZhbHVlVGFibGUgPSBsYXN0U3RhdGUudHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQl0aGlzLnR5cGVMb2NhdG9ycyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsYXN0U3RhdGUudHlwZUxvY2F0b3JzLmVsZW1lbnRTaXplKTsKKwkJa2V5VGFibGUgPSBsYXN0U3RhdGUudHlwZUxvY2F0b3JzLmtleVRhYmxlOworCQl2YWx1ZVRhYmxlID0gbGFzdFN0YXRlLnR5cGVMb2NhdG9ycy52YWx1ZVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQotCQkJCXRoaXMudHlwZUxvY2F0aW9ucy5wdXQoa2V5VGFibGVbaV0sIHZhbHVlVGFibGVbaV0pOworCQkJCXRoaXMudHlwZUxvY2F0b3JzLnB1dChrZXlUYWJsZVtpXSwgdmFsdWVUYWJsZVtpXSk7CiAJfQogfQogCi1jaGFyW11bXSBnZXREZWZpbmVkVHlwZU5hbWVzRm9yKFN0cmluZyBsb2NhdGlvbikgewotCU9iamVjdCBjID0gcmVmZXJlbmNlcy5nZXQobG9jYXRpb24pOworY2hhcltdW10gZ2V0RGVmaW5lZFR5cGVOYW1lc0ZvcihTdHJpbmcgdHlwZUxvY2F0b3IpIHsKKwlPYmplY3QgYyA9IHJlZmVyZW5jZXMuZ2V0KHR5cGVMb2NhdG9yKTsKIAlpZiAoYyBpbnN0YW5jZW9mIEFkZGl0aW9uYWxUeXBlQ29sbGVjdGlvbikKIAkJcmV0dXJuICgoQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSBjKS5kZWZpbmVkVHlwZU5hbWVzOwogCXJldHVybiBudWxsOyAvLyBtZWFucyBvbmx5IG9uZSB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmaWxlLi4uIHNhdmVzIHNwYWNlCiB9CiAKLWJvb2xlYW4gaXNEdXBsaWNhdGVMb2NhdGlvbihTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0JU3RyaW5nIGV4aXN0aW5nTG9jYXRpb24gPSAoU3RyaW5nKSB0eXBlTG9jYXRpb25zLmdldChxdWFsaWZpZWROYW1lKTsKLQlyZXR1cm4gZXhpc3RpbmdMb2NhdGlvbiAhPSBudWxsICYmICFleGlzdGluZ0xvY2F0aW9uLmVxdWFscyhsb2NhdGlvbik7Citib29sZWFuIGlzRHVwbGljYXRlTG9jYXRvcihTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIFN0cmluZyB0eXBlTG9jYXRvcikgeworCVN0cmluZyBleGlzdGluZyA9IChTdHJpbmcpIHR5cGVMb2NhdG9ycy5nZXQocXVhbGlmaWVkVHlwZU5hbWUpOworCXJldHVybiBleGlzdGluZyAhPSBudWxsICYmICFleGlzdGluZy5lcXVhbHModHlwZUxvY2F0b3IpOwogfQogCiBib29sZWFuIGlzS25vd25QYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgewogCWlmIChrbm93blBhY2thZ2VOYW1lcyA9PSBudWxsKSB7Ci0JCUFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QodHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSk7Ci0JCU9iamVjdFtdIGtleVRhYmxlID0gdHlwZUxvY2F0aW9ucy5rZXlUYWJsZTsKKwkJQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCh0eXBlTG9jYXRvcnMuZWxlbWVudFNpemUpOworCQlPYmplY3RbXSBrZXlUYWJsZSA9IHR5cGVMb2NhdG9ycy5rZXlUYWJsZTsKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CiAJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZykga2V5VGFibGVbaV07IC8vIGlzIGEgdHlwZSBuYW1lIG9mIHRoZSBmb3JtIHAxL3AyL0EKQEAgLTEwNywyNSArMTE1LDI1IEBACiAJCWtub3duUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tuYW1lcy5zaXplKCldOwogCQluYW1lcy50b0FycmF5KGtub3duUGFja2FnZU5hbWVzKTsKIAl9Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtub3duUGFja2FnZU5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorCWZvciAoaW50IGkgPSAwLCBsID0ga25vd25QYWNrYWdlTmFtZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQlpZiAoa25vd25QYWNrYWdlTmFtZXNbaV0uZXF1YWxzKHF1YWxpZmllZFBhY2thZ2VOYW1lKSkKIAkJCXJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCByZWNvcmQoU3RyaW5nIGxvY2F0aW9uLCBjaGFyW11bXVtdIHF1YWxpZmllZFJlZnMsIGNoYXJbXVtdIHNpbXBsZVJlZnMsIGNoYXJbXSBtYWluVHlwZU5hbWUsIEFycmF5TGlzdCB0eXBlTmFtZXMpIHsKK3ZvaWQgcmVjb3JkKFN0cmluZyB0eXBlTG9jYXRvciwgY2hhcltdW11bXSBxdWFsaWZpZWRSZWZzLCBjaGFyW11bXSBzaW1wbGVSZWZzLCBjaGFyW10gbWFpblR5cGVOYW1lLCBBcnJheUxpc3QgdHlwZU5hbWVzKSB7CiAJaWYgKHR5cGVOYW1lcy5zaXplKCkgPT0gMSAmJiBDaGFyT3BlcmF0aW9uLmVxdWFscyhtYWluVHlwZU5hbWUsIChjaGFyW10pIHR5cGVOYW1lcy5nZXQoMCkpKSB7Ci0JCQlyZWZlcmVuY2VzLnB1dChsb2NhdGlvbiwgbmV3IFJlZmVyZW5jZUNvbGxlY3Rpb24ocXVhbGlmaWVkUmVmcywgc2ltcGxlUmVmcykpOworCQkJcmVmZXJlbmNlcy5wdXQodHlwZUxvY2F0b3IsIG5ldyBSZWZlcmVuY2VDb2xsZWN0aW9uKHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMpKTsKIAl9IGVsc2UgewogCQljaGFyW11bXSBkZWZpbmVkVHlwZU5hbWVzID0gbmV3IGNoYXJbdHlwZU5hbWVzLnNpemUoKV1bXTsgLy8gY2FuIGJlIGVtcHR5IHdoZW4gbm8gdHlwZXMgYXJlIGRlZmluZWQKIAkJdHlwZU5hbWVzLnRvQXJyYXkoZGVmaW5lZFR5cGVOYW1lcyk7Ci0JCXJlZmVyZW5jZXMucHV0KGxvY2F0aW9uLCBuZXcgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKGRlZmluZWRUeXBlTmFtZXMsIHF1YWxpZmllZFJlZnMsIHNpbXBsZVJlZnMpKTsKKwkJcmVmZXJlbmNlcy5wdXQodHlwZUxvY2F0b3IsIG5ldyBBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24oZGVmaW5lZFR5cGVOYW1lcywgcXVhbGlmaWVkUmVmcywgc2ltcGxlUmVmcykpOwogCX0KIH0KIAotdm9pZCByZWNvcmRMb2NhdGlvbkZvclR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyBsb2NhdGlvbikgewordm9pZCByZWNvcmRMb2NhdG9yRm9yVHlwZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIFN0cmluZyB0eXBlTG9jYXRvcikgewogCXRoaXMua25vd25QYWNrYWdlTmFtZXMgPSBudWxsOwotCXR5cGVMb2NhdGlvbnMucHV0KHF1YWxpZmllZE5hbWUsIGxvY2F0aW9uKTsKKwl0eXBlTG9jYXRvcnMucHV0KHF1YWxpZmllZFR5cGVOYW1lLCB0eXBlTG9jYXRvcik7CiB9CiAKIHZvaWQgcmVjb3JkU3RydWN0dXJhbERlcGVuZGVuY3koSVByb2plY3QgcHJlcmVxUHJvamVjdCwgU3RhdGUgcHJlcmVxU3RhdGUpIHsKQEAgLTEzMywxMCArMTQxLDEwIEBACiAJCXN0cnVjdHVyYWxCdWlsZFRpbWVzLnB1dChwcmVyZXFQcm9qZWN0LmdldE5hbWUoKSwgbmV3IExvbmcocHJlcmVxU3RhdGUubGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpKTsKIH0KIAotdm9pZCByZW1vdmUoU3RyaW5nIGxvY2F0aW9uVG9SZW1vdmUpIHsKK3ZvaWQgcmVtb3ZlTG9jYXRvcihTdHJpbmcgdHlwZUxvY2F0b3JUb1JlbW92ZSkgewogCXRoaXMua25vd25QYWNrYWdlTmFtZXMgPSBudWxsOwotCXJlZmVyZW5jZXMucmVtb3ZlS2V5KGxvY2F0aW9uVG9SZW1vdmUpOwotCXR5cGVMb2NhdGlvbnMucmVtb3ZlVmFsdWUobG9jYXRpb25Ub1JlbW92ZSk7CisJcmVmZXJlbmNlcy5yZW1vdmVLZXkodHlwZUxvY2F0b3JUb1JlbW92ZSk7CisJdHlwZUxvY2F0b3JzLnJlbW92ZVZhbHVlKHR5cGVMb2NhdG9yVG9SZW1vdmUpOwogfQogCiB2b2lkIHJlbW92ZVBhY2thZ2UoSVJlc291cmNlRGVsdGEgc291cmNlRGVsdGEpIHsKQEAgLTE0NCwyMiArMTUyLDIyIEBACiAJc3dpdGNoKHJlc291cmNlLmdldFR5cGUoKSkgewogCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgogCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IHNvdXJjZURlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkKKwkJCWZvciAoaW50IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQkJCXJlbW92ZVBhY2thZ2UoY2hpbGRyZW5baV0pOwogCQkJcmV0dXJuOwogCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChKYXZhQnVpbGRlci5KQVZBX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGxvY2F0aW9uLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JCQkJcmVtb3ZlKGxvY2F0aW9uLnRvU3RyaW5nKCkpOworCQkJSVBhdGggdHlwZUxvY2F0b3JQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUodHlwZUxvY2F0b3JQYXRoLmxhc3RTZWdtZW50KCkpKQorCQkJCXJlbW92ZUxvY2F0b3IodHlwZUxvY2F0b3JQYXRoLnRvU3RyaW5nKCkpOwogCX0KIH0KIAotdm9pZCByZW1vdmVUeXBlTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uVG9SZW1vdmUpIHsKK3ZvaWQgcmVtb3ZlUXVhbGlmaWVkVHlwZU5hbWUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lVG9SZW1vdmUpIHsKIAl0aGlzLmtub3duUGFja2FnZU5hbWVzID0gbnVsbDsKLQl0eXBlTG9jYXRpb25zLnJlbW92ZUtleShsb2NhdGlvblRvUmVtb3ZlKTsKKwl0eXBlTG9jYXRvcnMucmVtb3ZlS2V5KHF1YWxpZmllZFR5cGVOYW1lVG9SZW1vdmUpOwogfQogCi1zdGF0aWMgU3RhdGUgcmVhZChEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CitzdGF0aWMgU3RhdGUgcmVhZChJUHJvamVjdCBwcm9qZWN0LCBEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFib3V0IHRvIHJlYWQgc3RhdGUuLi4iKTsgLy8kTk9OLU5MUy0xJAogCWlmIChWRVJTSU9OICE9IGluLnJlYWRCeXRlKCkpIHsKQEAgLTE3MCwyMiArMTc4LDQ4IEBACiAKIAlTdGF0ZSBuZXdTdGF0ZSA9IG5ldyBTdGF0ZSgpOwogCW5ld1N0YXRlLmphdmFQcm9qZWN0TmFtZSA9IGluLnJlYWRVVEYoKTsKKwlpZiAoIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhuZXdTdGF0ZS5qYXZhUHJvamVjdE5hbWUpKSB7CisJCWlmIChKYXZhQnVpbGRlci5ERUJVRykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdCdzIG5hbWUgZG9lcyBub3QgbWF0Y2guLi4gYW5zd2VyZWQgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBudWxsOworCX0KIAluZXdTdGF0ZS5idWlsZE51bWJlciA9IGluLnJlYWRJbnQoKTsKIAluZXdTdGF0ZS5sYXN0U3RydWN0dXJhbEJ1aWxkVGltZSA9IGluLnJlYWRMb25nKCk7Ci0JbmV3U3RhdGUub3V0cHV0TG9jYXRpb25TdHJpbmcgPSBpbi5yZWFkVVRGKCk7CiAKIAlpbnQgbGVuZ3RoID0gaW4ucmVhZEludCgpOwotCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9ucyA9IG5ldyBDbGFzc3BhdGhMb2NhdGlvbltsZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKwluZXdTdGF0ZS5zb3VyY2VMb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnlbbGVuZ3RoXTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlDb250YWluZXIgc291cmNlRm9sZGVyID0gcHJvamVjdCwgb3V0cHV0Rm9sZGVyID0gcHJvamVjdDsKKwkJU3RyaW5nIGZvbGRlck5hbWU7CisJCWlmICgoZm9sZGVyTmFtZSA9IGluLnJlYWRVVEYoKSkubGVuZ3RoKCkgPiAwKSBzb3VyY2VGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihmb2xkZXJOYW1lKTsKKwkJaWYgKChmb2xkZXJOYW1lID0gaW4ucmVhZFVURigpKS5sZW5ndGgoKSA+IDApIG91dHB1dEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGZvbGRlck5hbWUpOworCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9CisJCQkoQ2xhc3NwYXRoTXVsdGlEaXJlY3RvcnkpIENsYXNzcGF0aExvY2F0aW9uLmZvclNvdXJjZUZvbGRlcihzb3VyY2VGb2xkZXIsIG91dHB1dEZvbGRlciwgcmVhZE5hbWVzKGluKSk7CisJCWlmIChpbi5yZWFkQm9vbGVhbigpKQorCQkJbWQuaGFzSW5kZXBlbmRlbnRPdXRwdXRGb2xkZXIgPSB0cnVlOworCQluZXdTdGF0ZS5zb3VyY2VMb2NhdGlvbnNbaV0gPSBtZDsKKwl9CisKKwlsZW5ndGggPSBpbi5yZWFkSW50KCk7CisJbmV3U3RhdGUuYmluYXJ5TG9jYXRpb25zID0gbmV3IENsYXNzcGF0aExvY2F0aW9uW2xlbmd0aF07CisJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJc3dpdGNoIChpbi5yZWFkQnl0ZSgpKSB7Ci0JCQljYXNlIDEgOgotCQkJCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9uc1tpXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvclNvdXJjZUZvbGRlcihpbi5yZWFkVVRGKCksIGluLnJlYWRVVEYoKSk7CisJCQljYXNlIFNPVVJDRV9GT0xERVIgOgorCQkJCW5ld1N0YXRlLmJpbmFyeUxvY2F0aW9uc1tpXSA9IG5ld1N0YXRlLnNvdXJjZUxvY2F0aW9uc1tpbi5yZWFkSW50KCldOwogCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQluZXdTdGF0ZS5jbGFzc3BhdGhMb2NhdGlvbnNbaV0gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIoaW4ucmVhZFVURigpKTsKKwkJCWNhc2UgQklOQVJZX0ZPTERFUiA6CisJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGluLnJlYWRVVEYoKSk7CisJCQkJSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSBwYXRoLnNlZ21lbnRDb3VudCgpID09IDEKKwkJCQkJPyAoSUNvbnRhaW5lcikgcm9vdC5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSkKKwkJCQkJOiAoSUNvbnRhaW5lcikgcm9vdC5nZXRGb2xkZXIocGF0aCk7CisJCQkJbmV3U3RhdGUuYmluYXJ5TG9jYXRpb25zW2ldID0gQ2xhc3NwYXRoTG9jYXRpb24uZm9yQmluYXJ5Rm9sZGVyKG91dHB1dEZvbGRlciwgaW4ucmVhZEJvb2xlYW4oKSk7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIDMgOgotCQkJCW5ld1N0YXRlLmNsYXNzcGF0aExvY2F0aW9uc1tpXSA9IENsYXNzcGF0aExvY2F0aW9uLmZvckxpYnJhcnkoaW4ucmVhZFVURigpKTsKKwkJCWNhc2UgRVhURVJOQUxfSkFSIDoKKwkJCQluZXdTdGF0ZS5iaW5hcnlMb2NhdGlvbnNbaV0gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JMaWJyYXJ5KGluLnJlYWRVVEYoKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVSTkFMX0pBUiA6CisJCQkJbmV3U3RhdGUuYmluYXJ5TG9jYXRpb25zW2ldID0gQ2xhc3NwYXRoTG9jYXRpb24uZm9yTGlicmFyeShyb290LmdldEZpbGUobmV3IFBhdGgoaW4ucmVhZFVURigpKSkpOwogCQl9CiAJfQogCkBAIC0xOTMsMTMgKzIyNywxMyBAQAogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAJCW5ld1N0YXRlLnN0cnVjdHVyYWxCdWlsZFRpbWVzLnB1dChpbi5yZWFkVVRGKCksIG5ldyBMb25nKGluLnJlYWRMb25nKCkpKTsKIAotCVN0cmluZ1tdIGludGVybmVkTG9jYXRpb25zID0gbmV3IFN0cmluZ1tsZW5ndGggPSBpbi5yZWFkSW50KCldOworCVN0cmluZ1tdIGludGVybmVkVHlwZUxvY2F0b3JzID0gbmV3IFN0cmluZ1tsZW5ndGggPSBpbi5yZWFkSW50KCldOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JCWludGVybmVkTG9jYXRpb25zW2ldID0gaW4ucmVhZFVURigpOworCQlpbnRlcm5lZFR5cGVMb2NhdG9yc1tpXSA9IGluLnJlYWRVVEYoKTsKIAotCW5ld1N0YXRlLnR5cGVMb2NhdGlvbnMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUobGVuZ3RoID0gaW4ucmVhZEludCgpKTsKKwluZXdTdGF0ZS50eXBlTG9jYXRvcnMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUobGVuZ3RoID0gaW4ucmVhZEludCgpKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQluZXdTdGF0ZS50eXBlTG9jYXRpb25zLnB1dChpbi5yZWFkVVRGKCksIGludGVybmVkTG9jYXRpb25zW2luLnJlYWRJbnQoKV0pOworCQluZXdTdGF0ZS50eXBlTG9jYXRvcnMucHV0KGluLnJlYWRVVEYoKSwgaW50ZXJuZWRUeXBlTG9jYXRvcnNbaW4ucmVhZEludCgpXSk7CiAKIAljaGFyW11bXSBpbnRlcm5lZFNpbXBsZU5hbWVzID0gUmVmZXJlbmNlQ29sbGVjdGlvbi5pbnRlcm5TaW1wbGVOYW1lcyhyZWFkTmFtZXMoaW4pLCBmYWxzZSk7CiAJY2hhcltdW11bXSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzID0gbmV3IGNoYXJbbGVuZ3RoID0gaW4ucmVhZEludCgpXVtdW107CkBAIC0yMTQsMjkgKzI0OCwyOSBAQAogCiAJbmV3U3RhdGUucmVmZXJlbmNlcyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZShsZW5ndGggPSBpbi5yZWFkSW50KCkpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gaW50ZXJuZWRMb2NhdGlvbnNbaW4ucmVhZEludCgpXTsKKwkJU3RyaW5nIHR5cGVMb2NhdG9yID0gaW50ZXJuZWRUeXBlTG9jYXRvcnNbaW4ucmVhZEludCgpXTsKIAkJUmVmZXJlbmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbnVsbDsKIAkJc3dpdGNoIChpbi5yZWFkQnl0ZSgpKSB7CiAJCQljYXNlIDEgOgogCQkJCWNoYXJbXVtdIGFkZGl0aW9uYWxUeXBlTmFtZXMgPSByZWFkTmFtZXMoaW4pOwogCQkJCWNoYXJbXVtdW10gcXVhbGlmaWVkTmFtZXMgPSBuZXcgY2hhcltpbi5yZWFkSW50KCldW11bXTsKLQkJCQlmb3IgKGludCBqID0gMCwgcUxlbmd0aCA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsgaiA8IHFMZW5ndGg7IGorKykKKwkJCQlmb3IgKGludCBqID0gMCwgbSA9IHF1YWxpZmllZE5hbWVzLmxlbmd0aDsgaiA8IG07IGorKykKIAkJCQkJcXVhbGlmaWVkTmFtZXNbal0gPSBpbnRlcm5lZFF1YWxpZmllZE5hbWVzW2luLnJlYWRJbnQoKV07CiAJCQkJY2hhcltdW10gc2ltcGxlTmFtZXMgPSBuZXcgY2hhcltpbi5yZWFkSW50KCldW107Ci0JCQkJZm9yIChpbnQgaiA9IDAsIHNMZW5ndGggPSBzaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBzTGVuZ3RoOyBqKyspCisJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBzaW1wbGVOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspCiAJCQkJCXNpbXBsZU5hbWVzW2pdID0gaW50ZXJuZWRTaW1wbGVOYW1lc1tpbi5yZWFkSW50KCldOwogCQkJCWNvbGxlY3Rpb24gPSBuZXcgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKGFkZGl0aW9uYWxUeXBlTmFtZXMsIHF1YWxpZmllZE5hbWVzLCBzaW1wbGVOYW1lcyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDIgOgogCQkJCWNoYXJbXVtdW10gcU5hbWVzID0gbmV3IGNoYXJbaW4ucmVhZEludCgpXVtdW107Ci0JCQkJZm9yIChpbnQgaiA9IDAsIHFMZW5ndGggPSBxTmFtZXMubGVuZ3RoOyBqIDwgcUxlbmd0aDsgaisrKQorCQkJCWZvciAoaW50IGogPSAwLCBtID0gcU5hbWVzLmxlbmd0aDsgaiA8IG07IGorKykKIAkJCQkJcU5hbWVzW2pdID0gaW50ZXJuZWRRdWFsaWZpZWROYW1lc1tpbi5yZWFkSW50KCldOwogCQkJCWNoYXJbXVtdIHNOYW1lcyA9IG5ldyBjaGFyW2luLnJlYWRJbnQoKV1bXTsKLQkJCQlmb3IgKGludCBqID0gMCwgc0xlbmd0aCA9IHNOYW1lcy5sZW5ndGg7IGogPCBzTGVuZ3RoOyBqKyspCisJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBzTmFtZXMubGVuZ3RoOyBqIDwgbTsgaisrKQogCQkJCQlzTmFtZXNbal0gPSBpbnRlcm5lZFNpbXBsZU5hbWVzW2luLnJlYWRJbnQoKV07CiAJCQkJY29sbGVjdGlvbiA9IG5ldyBSZWZlcmVuY2VDb2xsZWN0aW9uKHFOYW1lcywgc05hbWVzKTsKIAkJfQotCQluZXdTdGF0ZS5yZWZlcmVuY2VzLnB1dChsb2NhdGlvbiwgY29sbGVjdGlvbik7CisJCW5ld1N0YXRlLnJlZmVyZW5jZXMucHV0KHR5cGVMb2NhdG9yLCBjb2xsZWN0aW9uKTsKIAl9CiAJaWYgKEphdmFCdWlsZGVyLkRFQlVHKQogCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3NmdWxseSByZWFkIHN0YXRlIGZvciAiICsgbmV3U3RhdGUuamF2YVByb2plY3ROYW1lKTsgLy8kTk9OLU5MUy0xJApAQCAtMjg3LDM1ICszMjEsNTYgQEAKICAqIFN0cmluZwkJcHJvamVjdCBuYW1lCiAgKiBpbnQJCQkJYnVpbGQgbnVtYmVyCiAgKiBpbnQJCQkJbGFzdCBzdHJ1Y3R1cmFsIGJ1aWxkIG51bWJlcgotICogU3RyaW5nCQlvdXRwdXQgbG9jYXRpb24KICovCiAJb3V0LndyaXRlQnl0ZShWRVJTSU9OKTsKIAlvdXQud3JpdGVVVEYoamF2YVByb2plY3ROYW1lKTsKIAlvdXQud3JpdGVJbnQoYnVpbGROdW1iZXIpOwogCW91dC53cml0ZUxvbmcobGFzdFN0cnVjdHVyYWxCdWlsZFRpbWUpOwotCW91dC53cml0ZVVURihvdXRwdXRMb2NhdGlvblN0cmluZyk7CiAKIC8qCi0gKiBDbGFzcyBwYXRoIGxvY2F0aW9uc1tdCisgKiBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeVtdCiAgKiBpbnQJCQkJaWQKICAqIFN0cmluZwkJcGF0aChzKQotICogCi0gKiBOT1RFOiBDYW5ub3QgaGF2ZSBwb3J0YWJsZSBidWlsZCBzdGF0ZXMgd2hpbGUgY2xhc3NwYXRoIGRpcmVjdG9yaWVzIGFyZSBmdWxsIGZpbGVzeXN0ZW0gcGF0aHMKICovCi0Jb3V0LndyaXRlSW50KGxlbmd0aCA9IGNsYXNzcGF0aExvY2F0aW9ucy5sZW5ndGgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJQ2xhc3NwYXRoTG9jYXRpb24gYyA9IGNsYXNzcGF0aExvY2F0aW9uc1tpXTsKKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gc291cmNlTG9jYXRpb25zLmxlbmd0aCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSBtZCA9IHNvdXJjZUxvY2F0aW9uc1tpXTsKKwkJb3V0LndyaXRlVVRGKG1kLnNvdXJjZUZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJCW91dC53cml0ZVVURihtZC5iaW5hcnlGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCQl3cml0ZU5hbWVzKG1kLmV4Y2x1c2lvblBhdHRlcm5zLCBvdXQpOworCQlvdXQud3JpdGVCb29sZWFuKG1kLmhhc0luZGVwZW5kZW50T3V0cHV0Rm9sZGVyKTsKKwl9CisKKy8qCisgKiBDbGFzc3BhdGhMb2NhdGlvbltdCisgKiBpbnQJCQkJaWQKKyAqIFN0cmluZwkJcGF0aChzKQorKi8KKwlvdXQud3JpdGVJbnQobGVuZ3RoID0gYmluYXJ5TG9jYXRpb25zLmxlbmd0aCk7CisJbmV4dCA6IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJQ2xhc3NwYXRoTG9jYXRpb24gYyA9IGJpbmFyeUxvY2F0aW9uc1tpXTsKIAkJaWYgKGMgaW5zdGFuY2VvZiBDbGFzc3BhdGhNdWx0aURpcmVjdG9yeSkgewotCQkJb3V0LndyaXRlQnl0ZSgxKTsKLQkJCUNsYXNzcGF0aE11bHRpRGlyZWN0b3J5IG1kID0gKENsYXNzcGF0aE11bHRpRGlyZWN0b3J5KSBjOwotCQkJb3V0LndyaXRlVVRGKG1kLnNvdXJjZVBhdGgpOwotCQkJb3V0LndyaXRlVVRGKG1kLmJpbmFyeVBhdGgpOworCQkJb3V0LndyaXRlQnl0ZShTT1VSQ0VfRk9MREVSKTsKKwkJCWZvciAoaW50IGogPSAwLCBtID0gc291cmNlTG9jYXRpb25zLmxlbmd0aDsgaiA8IG07IGorKykgeworCQkJCWlmIChzb3VyY2VMb2NhdGlvbnNbal0gPT0gYykgeworCQkJCQlvdXQud3JpdGVJbnQoaik7CisJCQkJCWNvbnRpbnVlIG5leHQ7CisJCQkJfQorCQkJfQogCQl9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBDbGFzc3BhdGhEaXJlY3RvcnkpIHsKLQkJCW91dC53cml0ZUJ5dGUoMik7Ci0JCQlvdXQud3JpdGVVVEYoKChDbGFzc3BhdGhEaXJlY3RvcnkpIGMpLmJpbmFyeVBhdGgpOwotCQl9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBDbGFzc3BhdGhKYXIpIHsKLQkJCW91dC53cml0ZUJ5dGUoMyk7Ci0JCQlvdXQud3JpdGVVVEYoKChDbGFzc3BhdGhKYXIpIGMpLnppcEZpbGVuYW1lKTsKKwkJCW91dC53cml0ZUJ5dGUoQklOQVJZX0ZPTERFUik7CisJCQlDbGFzc3BhdGhEaXJlY3RvcnkgY2QgPSAoQ2xhc3NwYXRoRGlyZWN0b3J5KSBjOworCQkJb3V0LndyaXRlVVRGKGNkLmJpbmFyeUZvbGRlci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCQkJb3V0LndyaXRlQm9vbGVhbihjZC5pc091dHB1dEZvbGRlcik7CisJCX0gZWxzZSB7CisJCQlDbGFzc3BhdGhKYXIgamFyID0gKENsYXNzcGF0aEphcikgYzsKKwkJCWlmIChqYXIucmVzb3VyY2UgPT0gbnVsbCkgeworCQkJCW91dC53cml0ZUJ5dGUoRVhURVJOQUxfSkFSKTsKKwkJCQlvdXQud3JpdGVVVEYoamFyLnppcEZpbGVuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJb3V0LndyaXRlQnl0ZShJTlRFUk5BTF9KQVIpOworCQkJCW91dC53cml0ZVVURihqYXIucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzQwLDEwICszOTUsMTAgQEAKIAl9CiAKIC8qCi0gKiBTdHJpbmdbXQkJSW50ZXJuZWQgbG9jYXRpb25zCisgKiBTdHJpbmdbXQkJSW50ZXJuZWQgdHlwZSBsb2NhdG9ycwogICovCiAJb3V0LndyaXRlSW50KGxlbmd0aCA9IHJlZmVyZW5jZXMuZWxlbWVudFNpemUpOwotCUFycmF5TGlzdCBpbnRlcm5lZExvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QobGVuZ3RoKTsKKwlBcnJheUxpc3QgaW50ZXJuZWRUeXBlTG9jYXRvcnMgPSBuZXcgQXJyYXlMaXN0KGxlbmd0aCk7CiAJaWYgKGxlbmd0aCA+IDApIHsKIAkJa2V5VGFibGUgPSByZWZlcmVuY2VzLmtleVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewpAQCAtMzUxLDcgKzQwNiw3IEBACiAJCQkJbGVuZ3RoLS07CiAJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleVRhYmxlW2ldOwogCQkJCW91dC53cml0ZVVURihrZXkpOwotCQkJCWludGVybmVkTG9jYXRpb25zLmFkZChrZXkpOworCQkJCWludGVybmVkVHlwZUxvY2F0b3JzLmFkZChrZXkpOwogCQkJfQogCQl9CiAJCWlmIChKYXZhQnVpbGRlci5ERUJVRyAmJiBsZW5ndGggIT0gMCkKQEAgLTM1OSwyMyArNDE0LDIzIEBACiAJfQogCiAvKgotICogVHlwZSBsb2NhdGlvbnMgdGFibGUKKyAqIFR5cGUgbG9jYXRvcnMgdGFibGUKICAqIFN0cmluZwkJdHlwZSBuYW1lCi0gKiBpbnQJCQkJaW50ZXJuZWQgbG9jYXRpb24gaWQKKyAqIGludAkJCQlpbnRlcm5lZCBsb2NhdG9yIGlkCiAgKi8KLQlvdXQud3JpdGVJbnQobGVuZ3RoID0gdHlwZUxvY2F0aW9ucy5lbGVtZW50U2l6ZSk7CisJb3V0LndyaXRlSW50KGxlbmd0aCA9IHR5cGVMb2NhdG9ycy5lbGVtZW50U2l6ZSk7CiAJaWYgKGxlbmd0aCA+IDApIHsKLQkJa2V5VGFibGUgPSB0eXBlTG9jYXRpb25zLmtleVRhYmxlOwotCQl2YWx1ZVRhYmxlID0gdHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQlrZXlUYWJsZSA9IHR5cGVMb2NhdG9ycy5rZXlUYWJsZTsKKwkJdmFsdWVUYWJsZSA9IHR5cGVMb2NhdG9ycy52YWx1ZVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogCQkJaWYgKGtleVRhYmxlW2ldICE9IG51bGwpIHsKIAkJCQlsZW5ndGgtLTsKIAkJCQlvdXQud3JpdGVVVEYoKFN0cmluZykga2V5VGFibGVbaV0pOwotCQkJCW91dC53cml0ZUludChpbnRlcm5lZExvY2F0aW9ucy5pbmRleE9mKChTdHJpbmcpIHZhbHVlVGFibGVbaV0pKTsKKwkJCQlvdXQud3JpdGVJbnQoaW50ZXJuZWRUeXBlTG9jYXRvcnMuaW5kZXhPZigoU3RyaW5nKSB2YWx1ZVRhYmxlW2ldKSk7CiAJCQl9CiAJCX0KIAkJaWYgKEphdmFCdWlsZGVyLkRFQlVHICYmIGxlbmd0aCAhPSAwKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXBlTG9jYXRpb25zIHRhYmxlIGlzIGluY29uc2lzdGVudCIpOyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInR5cGVMb2NhdG9ycyB0YWJsZSBpcyBpbmNvbnNpc3RlbnQiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogLyoKQEAgLTM4OSwxMSArNDQ0LDExIEBACiAJCWlmICh2YWx1ZVRhYmxlW2ldICE9IG51bGwpIHsKIAkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOwogCQkJY2hhcltdW11bXSBxTmFtZXMgPSBjb2xsZWN0aW9uLnF1YWxpZmllZE5hbWVSZWZlcmVuY2VzOwotCQkJZm9yIChpbnQgaiA9IDAsIHFMZW5ndGggPSBxTmFtZXMubGVuZ3RoOyBqIDwgcUxlbmd0aDsgaisrKSB7CisJCQlmb3IgKGludCBqID0gMCwgbSA9IHFOYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKIAkJCQljaGFyW11bXSBxTmFtZSA9IHFOYW1lc1tqXTsKIAkJCQlpZiAoIWludGVybmVkUXVhbGlmaWVkTmFtZXMuY29udGFpbnMocU5hbWUpKSB7IC8vIHJlbWVtYmVyIHRoZSBuYW1lcyBoYXZlIGJlZW4gaW50ZXJuZWQKIAkJCQkJaW50ZXJuZWRRdWFsaWZpZWROYW1lcy5hZGQocU5hbWUpOwotCQkJCQlmb3IgKGludCBrID0gMCwgc0xlbmd0aCA9IHFOYW1lLmxlbmd0aDsgayA8IHNMZW5ndGg7IGsrKykgeworCQkJCQlmb3IgKGludCBrID0gMCwgbiA9IHFOYW1lLmxlbmd0aDsgayA8IG47IGsrKykgewogCQkJCQkJY2hhcltdIHNOYW1lID0gcU5hbWVba107CiAJCQkJCQlpZiAoIWludGVybmVkU2ltcGxlTmFtZXMuY29udGFpbnMoc05hbWUpKSAvLyByZW1lbWJlciB0aGUgbmFtZXMgaGF2ZSBiZWVuIGludGVybmVkCiAJCQkJCQkJaW50ZXJuZWRTaW1wbGVOYW1lcy5hZGQoc05hbWUpOwpAQCAtNDAxLDcgKzQ1Niw3IEBACiAJCQkJfQogCQkJfQogCQkJY2hhcltdW10gc05hbWVzID0gY29sbGVjdGlvbi5zaW1wbGVOYW1lUmVmZXJlbmNlczsKLQkJCWZvciAoaW50IGogPSAwLCBzTGVuZ3RoID0gc05hbWVzLmxlbmd0aDsgaiA8IHNMZW5ndGg7IGorKykgeworCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBzTmFtZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7CiAJCQkJY2hhcltdIHNOYW1lID0gc05hbWVzW2pdOwogCQkJCWlmICghaW50ZXJuZWRTaW1wbGVOYW1lcy5jb250YWlucyhzTmFtZSkpIC8vIHJlbWVtYmVyIHRoZSBuYW1lcyBoYXZlIGJlZW4gaW50ZXJuZWQKIAkJCQkJaW50ZXJuZWRTaW1wbGVOYW1lcy5hZGQoc05hbWUpOwpAQCAtNDIzLDcgKzQ3OCw3IEBACiAKIC8qCiAgKiBSZWZlcmVuY2VzIHRhYmxlCi0gKiBpbnQJCQlpbnRlcm5lZCBsb2NhdGlvbiBpZAorICogaW50CQkJaW50ZXJuZWQgbG9jYXRvciBpZAogICogUmVmZXJlbmNlQ29sbGVjdGlvbgogKi8KIAlvdXQud3JpdGVJbnQobGVuZ3RoID0gcmVmZXJlbmNlcy5lbGVtZW50U2l6ZSk7CkBAIC00MzIsNyArNDg3LDcgQEAKIAkJZm9yIChpbnQgaSA9IDAsIGwgPSBrZXlUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKSB7CiAJCQkJbGVuZ3RoLS07Ci0JCQkJb3V0LndyaXRlSW50KGludGVybmVkTG9jYXRpb25zLmluZGV4T2YoKFN0cmluZykga2V5VGFibGVbaV0pKTsKKwkJCQlvdXQud3JpdGVJbnQoaW50ZXJuZWRUeXBlTG9jYXRvcnMuaW5kZXhPZigoU3RyaW5nKSBrZXlUYWJsZVtpXSkpOwogCQkJCVJlZmVyZW5jZUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChSZWZlcmVuY2VDb2xsZWN0aW9uKSB2YWx1ZVRhYmxlW2ldOwogCQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSB7CiAJCQkJCW91dC53cml0ZUJ5dGUoMSk7CkBAIC00NTksNyArNTE0LDcgQEAKIH0KIAogcHJpdmF0ZSB2b2lkIHdyaXRlTmFtZXMoY2hhcltdW10gbmFtZXMsIERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7CisJaW50IGxlbmd0aCA9IG5hbWVzID09IG51bGwgPyAwIDogbmFtZXMubGVuZ3RoOwogCW91dC53cml0ZUludChsZW5ndGgpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJY2hhcltdIG5hbWUgPSBuYW1lc1tpXTsKQEAgLTQ4MywxMSArNTM4LDEyIEBACiAvKiBEZWJ1ZyBoZWxwZXIKIHZvaWQgZHVtcCgpIHsKIAlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlIGZvciAiICsgamF2YVByb2plY3ROYW1lICsgIiAoIiArIGJ1aWxkTnVtYmVyICsgIiBAICIgKyBuZXcgRGF0ZShsYXN0U3RydWN0dXJhbEJ1aWxkVGltZSkgKyAiKSIpOwotCVN5c3RlbS5vdXQucHJpbnRsbigiXHRDbGFzcyBwYXRoIGxvY2F0aW9uczoiKTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY2xhc3NwYXRoTG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgY2xhc3NwYXRoTG9jYXRpb25zW2ldKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0T3V0cHV0IGxvY2F0aW9uOiIpOwotCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCIgKyBvdXRwdXRMb2NhdGlvblN0cmluZyk7CisJU3lzdGVtLm91dC5wcmludGxuKCJcdENsYXNzIHBhdGggc291cmNlIGxvY2F0aW9uczoiKTsKKwlmb3IgKGludCBpID0gMCwgbCA9IHNvdXJjZUxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspCisJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdCIgKyBzb3VyY2VMb2NhdGlvbnNbaV0pOworCVN5c3RlbS5vdXQucHJpbnRsbigiXHRDbGFzcyBwYXRoIGJpbmFyeSBsb2NhdGlvbnM6Iik7CisJZm9yIChpbnQgaSA9IDAsIGwgPSBiaW5hcnlMb2NhdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgYmluYXJ5TG9jYXRpb25zW2ldKTsKIAogCVN5c3RlbS5vdXQucHJpbnQoIlx0U3RydWN0dXJhbCBidWlsZCBudW1iZXJzIHRhYmxlOiIpOwogCWlmIChzdHJ1Y3R1cmFsQnVpbGRUaW1lcy5lbGVtZW50U2l6ZSA9PSAwKSB7CkBAIC01MDAsMTIgKzU1NiwxMiBAQAogCQkJCVN5c3RlbS5vdXQucHJpbnQoIlxuXHRcdCIgKyBrZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgdmFsdWVUYWJsZVtpXS50b1N0cmluZygpKTsKIAl9CiAKLQlTeXN0ZW0ub3V0LnByaW50KCJcdFR5cGUgbG9jYXRpb25zIHRhYmxlOiIpOwotCWlmICh0eXBlTG9jYXRpb25zLmVsZW1lbnRTaXplID09IDApIHsKKwlTeXN0ZW0ub3V0LnByaW50KCJcdFR5cGUgbG9jYXRvcnMgdGFibGU6Iik7CisJaWYgKHR5cGVMb2NhdG9ycy5lbGVtZW50U2l6ZSA9PSAwKSB7CiAJCVN5c3RlbS5vdXQucHJpbnQoIiA8ZW1wdHk+Iik7CiAJfSBlbHNlIHsKLQkJT2JqZWN0W10ga2V5VGFibGUgPSB0eXBlTG9jYXRpb25zLmtleVRhYmxlOwotCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gdHlwZUxvY2F0aW9ucy52YWx1ZVRhYmxlOworCQlPYmplY3RbXSBrZXlUYWJsZSA9IHR5cGVMb2NhdG9ycy5rZXlUYWJsZTsKKwkJT2JqZWN0W10gdmFsdWVUYWJsZSA9IHR5cGVMb2NhdG9ycy52YWx1ZVRhYmxlOwogCQlmb3IgKGludCBpID0gMCwgbCA9IGtleVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJCWlmIChrZXlUYWJsZVtpXSAhPSBudWxsKQogCQkJCVN5c3RlbS5vdXQucHJpbnQoIlxuXHRcdCIgKyBrZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgdmFsdWVUYWJsZVtpXS50b1N0cmluZygpKTsKQEAgLTUyNSwxOCArNTgxLDE4IEBACiAJCQkJU3lzdGVtLm91dC5wcmludCgiXG5cdFx0XHRxdWFsaWZpZWQ6Iik7CiAJCQkJaWYgKHFSZWZzLmxlbmd0aCA9PSAwKQogCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgPGVtcHR5PiIpOwotCQkJCWVsc2UgZm9yIChpbnQgaiA9IDAsIGsgPSBxUmVmcy5sZW5ndGg7IGogPCBrOyBqKyspCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICciICsgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbi50b1N0cmluZyhxUmVmc1tqXSkgKyAiJyIpOworCQkJCWVsc2UgZm9yIChpbnQgaiA9IDAsIG0gPSBxUmVmcy5sZW5ndGg7IGogPCBtOyBqKyspCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICciICsgQ2hhck9wZXJhdGlvbi50b1N0cmluZyhxUmVmc1tqXSkgKyAiJyIpOwogCQkJCWNoYXJbXVtdIHNSZWZzID0gYy5zaW1wbGVOYW1lUmVmZXJlbmNlczsKIAkJCQlTeXN0ZW0ub3V0LnByaW50KCJcblx0XHRcdHNpbXBsZToiKTsKIAkJCQlpZiAoc1JlZnMubGVuZ3RoID09IDApCiAJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiA8ZW1wdHk+Iik7Ci0JCQkJZWxzZSBmb3IgKGludCBqID0gMCwgayA9IHNSZWZzLmxlbmd0aDsgaiA8IGs7IGorKykKKwkJCQllbHNlIGZvciAoaW50IGogPSAwLCBtID0gc1JlZnMubGVuZ3RoOyBqIDwgbTsgaisrKQogCQkJCQkJU3lzdGVtLm91dC5wcmludCgiICAiICsgbmV3IFN0cmluZyhzUmVmc1tqXSkpOwogCQkJCWlmIChjIGluc3RhbmNlb2YgQWRkaXRpb25hbFR5cGVDb2xsZWN0aW9uKSB7CiAJCQkJCWNoYXJbXVtdIG5hbWVzID0gKChBZGRpdGlvbmFsVHlwZUNvbGxlY3Rpb24pIGMpLmRlZmluZWRUeXBlTmFtZXM7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnQoIlxuXHRcdFx0YWRkaXRpb25hbCB0eXBlIG5hbWVzOiIpOwotCQkJCQlmb3IgKGludCBqID0gMCwgayA9IG5hbWVzLmxlbmd0aDsgaiA8IGs7IGorKykKKwkJCQkJZm9yIChpbnQgaiA9IDAsIG0gPSBuYW1lcy5sZW5ndGg7IGogPCBtOyBqKyspCiAJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIgKyBuZXcgU3RyaW5nKG5hbWVzW2pdKSk7CiAJCQkJfQogCQkJfQpAQCAtNTQ1LDQgKzYwMSw0IEBACiAJU3lzdGVtLm91dC5wcmludCgiXG5cbiIpOwogfQogKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1dvcmtRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvYnVpbGRlci9Xb3JrUXVldWUuamF2YQppbmRleCBhZDg1MGM0Li4xMjY1ZWFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1dvcmtRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvV29ya1F1ZXVlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyOwogCiBpbXBvcnQgamF2YS51dGlsLio7CkBAIC0yMiwxMiArMjIsMTIgQEAKIAl0aGlzLmNvbXBpbGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoMTEpOwogfQogCi1wdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGVsZW1lbnQpIHsKK3B1YmxpYyB2b2lkIGFkZChTb3VyY2VGaWxlIGVsZW1lbnQpIHsKIAluZWVkc0NvbXBpbGVMaXN0LmFkZChlbGVtZW50KTsKIH0KIAotcHVibGljIHZvaWQgYWRkQWxsKFN0cmluZ1tdIGVsZW1lbnRzKSB7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorcHVibGljIHZvaWQgYWRkQWxsKFNvdXJjZUZpbGVbXSBlbGVtZW50cykgeworCWZvciAoaW50IGkgPSAwLCBsID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQogCQlhZGQoZWxlbWVudHNbaV0pOwogfQogCkBAIC0zNiwyMCArMzYsMjAgQEAKIAl0aGlzLmNvbXBpbGVkTGlzdC5jbGVhcigpOwogfQkKIAotcHVibGljIHZvaWQgZmluaXNoZWQoU3RyaW5nIGVsZW1lbnQpIHsKK3B1YmxpYyB2b2lkIGZpbmlzaGVkKFNvdXJjZUZpbGUgZWxlbWVudCkgewogCW5lZWRzQ29tcGlsZUxpc3QucmVtb3ZlKGVsZW1lbnQpOwogCWNvbXBpbGVkTGlzdC5hZGQoZWxlbWVudCk7CiB9CiAKLXB1YmxpYyBib29sZWFuIGlzQ29tcGlsZWQoU3RyaW5nIGVsZW1lbnQpIHsKK3B1YmxpYyBib29sZWFuIGlzQ29tcGlsZWQoU291cmNlRmlsZSBlbGVtZW50KSB7CiAJcmV0dXJuIGNvbXBpbGVkTGlzdC5jb250YWlucyhlbGVtZW50KTsKIH0KIAotcHVibGljIGJvb2xlYW4gaXNXYWl0aW5nKFN0cmluZyBlbGVtZW50KSB7CitwdWJsaWMgYm9vbGVhbiBpc1dhaXRpbmcoU291cmNlRmlsZSBlbGVtZW50KSB7CiAJcmV0dXJuIG5lZWRzQ29tcGlsZUxpc3QuY29udGFpbnMoZWxlbWVudCk7CiB9CiAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuICJXb3JrUXVldWU6ICIgKyBuZWVkc0NvbXBpbGVMaXN0OyAvLyROT04tTkxTLTEkCiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvRXZhbHVhdGlvbkNvbnRleHRXcmFwcGVyLmphdmEKaW5kZXggMmQ4ZWNhMy4uZmI2MWNmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9FdmFsdWF0aW9uQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0V2YWx1YXRpb25Db250ZXh0V3JhcHBlci5qYXZhCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvR2xvYmFsVmFyaWFibGVXcmFwcGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9ldmFsL0dsb2JhbFZhcmlhYmxlV3JhcHBlci5qYXZhCmluZGV4IDhiMGYwYTQuLmNhNDhjMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvR2xvYmFsVmFyaWFibGVXcmFwcGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9HbG9iYWxWYXJpYWJsZVdyYXBwZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmV2YWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5ldmFsLklHbG9iYWxWYXJpYWJsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2V2YWwvUmVxdWVzdG9yV3JhcHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9SZXF1ZXN0b3JXcmFwcGVyLmphdmEKaW5kZXggYTgyOGExNi4uMzVmZmRmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9SZXF1ZXN0b3JXcmFwcGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvZXZhbC9SZXF1ZXN0b3JXcmFwcGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5ldmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QmluYXJ5VHlwZS5qYXZhCmluZGV4IDhlMjViOTQuLmYyZTRjYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCaW5hcnlUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJpbmFyeVR5cGUuamF2YQpAQCAtMSwyMSArMSwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU5lc3RlZFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOwogCiBwdWJsaWMgY2xhc3MgSGllcmFyY2h5QmluYXJ5VHlwZSBpbXBsZW1lbnRzIElCaW5hcnlUeXBlIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5QnVpbGRlci5qYXZhCmluZGV4IDU1YzIwZDkuLmI2ODk1YTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeUJ1aWxkZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC04Miw3ICs4Miw3IEBACiAJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIgPQogCQkJbmV3IEhpZXJhcmNoeVJlc29sdmVyKAogCQkJCXRoaXMuc2VhcmNoYWJsZUVudmlyb25tZW50LAotCQkJCUphdmFDb3JlLmdldE9wdGlvbnMoKSwKKwkJCQlwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksCiAJCQkJdGhpcywKIAkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCkpOwogCQl0aGlzLmluZm9Ub0hhbmRsZSA9IG5ldyBIYXNoTWFwKDUpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCS8vIGdldCBnZW5lcmljIHR5cGUgZnJvbSBmb2N1cyB0eXBlCiAJCUlHZW5lcmljVHlwZSB0eXBlOwogCQl0cnkgewotCQkJdHlwZSA9IChJR2VuZXJpY1R5cGUpICgoSmF2YUVsZW1lbnQpIGZvY3VzVHlwZSkuZ2V0UmF3SW5mbygpOworCQkJdHlwZSA9IChJR2VuZXJpY1R5cGUpICgoSmF2YUVsZW1lbnQpIGZvY3VzVHlwZSkuZ2V0RWxlbWVudEluZm8oKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCS8vIGlmIHRoZSBmb2N1cyB0eXBlIGlzIG5vdCBwcmVzZW50LCBvciBpZiBjYW5ub3QgZ2V0IHdvcmtiZW5jaCBwYXRoCiAJCQkvLyB3ZSBjYW5ub3QgY3JlYXRlIHRoZSBoaWVyYXJjaHkKQEAgLTE1MCw3ICsxNTAsNyBAQAogCQlJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLAogCQlJR2VuZXJpY1R5cGUgc3VwZXJjbGFzcywKIAkJSUdlbmVyaWNUeXBlW10gc3VwZXJpbnRlcmZhY2VzKSB7Ci0JCXRoaXMud29ya2VkKDEpOworCiAJCS8vIGNvbnZlcnQgYWxsIGluZm9zIHRvIGhhbmRsZXMKIAkJSVR5cGUgdHlwZUhhbmRsZSA9IGdldEhhbmRsZShzdXBwbGllZFR5cGUpOwogCQkvKgpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCQl0aGlzLmhpZXJhcmNoeS5hZGRJbnRlcmZhY2UodHlwZUhhbmRsZSk7CiAJCX0KIAkJaWYgKGludGVyZmFjZUhhbmRsZXMgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlSGFuZGxlcyA9IHRoaXMuaGllcmFyY2h5Lk5PX1RZUEU7CisJCQlpbnRlcmZhY2VIYW5kbGVzID0gVHlwZUhpZXJhcmNoeS5OT19UWVBFOwogCQl9CiAJCXRoaXMuaGllcmFyY2h5LmNhY2hlU3VwZXJJbnRlcmZhY2VzKHR5cGVIYW5kbGUsIGludGVyZmFjZUhhbmRsZXMpOwogCQkgCkBAIC0yNzUsMjEgKzI3NSwyMCBAQAogCQlpbnQgZmxhZzsKIAkJU3RyaW5nIHF1YWxpZmllZE5hbWU7CiAJCWlmICh0eXBlSW5mby5pc0NsYXNzKCkpIHsKLQkJCWZsYWcgPSB0aGlzLm5hbWVMb29rdXAuQUNDRVBUX0NMQVNTRVM7CisJCQlmbGFnID0gTmFtZUxvb2t1cC5BQ0NFUFRfQ0xBU1NFUzsKIAkJfSBlbHNlIHsKLQkJCWZsYWcgPSB0aGlzLm5hbWVMb29rdXAuQUNDRVBUX0lOVEVSRkFDRVM7CisJCQlmbGFnID0gTmFtZUxvb2t1cC5BQ0NFUFRfSU5URVJGQUNFUzsKIAkJfQogCQljaGFyW10gYk5hbWUgPSB0eXBlSW5mby5nZXROYW1lKCk7CiAJCXF1YWxpZmllZE5hbWUgPSBuZXcgU3RyaW5nKENsYXNzRmlsZS50cmFuc2xhdGVkTmFtZShiTmFtZSkpOwogCQlyZXR1cm4gdGhpcy5uYW1lTG9va3VwLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUsIGZhbHNlLCBmbGFnKTsKIAl9Ci0JcHJvdGVjdGVkIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0JCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gdGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yOwotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJcHJvdGVjdGVkIHZvaWQgd29ya2VkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHdvcmspIHsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CiAJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAJCQl9IGVsc2UgewotCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQod29yayk7CisJCQkJbW9uaXRvci53b3JrZWQod29yayk7CiAJCQl9CiAJCX0KIAl9CkBAIC0yOTcsNyArMjk2LDcgQEAKICAqIENyZWF0ZSBhbiBJQ29tcGlsYXRpb25Vbml0IGluZm8gZnJvbSB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gdW5pdCBvbiBkaXNrLgogICovCiBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tUGF0aChPcGVuYWJsZSBoYW5kbGUsIFN0cmluZyBvc1BhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZyBlbmNvZGluZyA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HKTsKKwlTdHJpbmcgZW5jb2RpbmcgPSBoYW5kbGUuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSk7CiAJcmV0dXJuIAogCQluZXcgQmFzaWNDb21waWxhdGlvblVuaXQoCiAJCQludWxsLApAQCAtNDA0LDcgKzQwMyw3IEBACiAgKiBBZGQgdGhlIHR5cGUgaW5mbyBmcm9tIHRoZSBnaXZlbiBDVSB0byB0aGUgZ2l2ZW4gbGlzdCBvZiBpbmZvcy4KICAqLwogcHJvdGVjdGVkIHZvaWQgYWRkSW5mb0Zyb21PcGVuU291cmNlVHlwZShTb3VyY2VUeXBlIHR5cGUsIEFycmF5TGlzdCBpbmZvcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUdlbmVyaWNUeXBlIGluZm8gPSAoSUdlbmVyaWNUeXBlKXR5cGUuZ2V0UmF3SW5mbygpOworCUlHZW5lcmljVHlwZSBpbmZvID0gKElHZW5lcmljVHlwZSl0eXBlLmdldEVsZW1lbnRJbmZvKCk7CiAJaW5mb3MuYWRkKGluZm8pOwogCXRoaXMuaW5mb1RvSGFuZGxlLnB1dChpbmZvLCB0eXBlKTsKIAlJVHlwZVtdIG1lbWJlcnMgPSB0eXBlLmdldFR5cGVzKCk7CkBAIC00MTgsNyArNDE3LDcgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgYWRkSW5mb0Zyb21PcGVuQ2xhc3NGaWxlKENsYXNzRmlsZSBjbGFzc0ZpbGUsIEFycmF5TGlzdCBpbmZvcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJSVR5cGUgdHlwZSA9IGNsYXNzRmlsZS5nZXRUeXBlKCk7Ci0JSUdlbmVyaWNUeXBlIGluZm8gPSAoSUdlbmVyaWNUeXBlKSAoKEJpbmFyeVR5cGUpIHR5cGUpLmdldFJhd0luZm8oKTsKKwlJR2VuZXJpY1R5cGUgaW5mbyA9IChJR2VuZXJpY1R5cGUpICgoQmluYXJ5VHlwZSkgdHlwZSkuZ2V0RWxlbWVudEluZm8oKTsKIAlpbmZvcy5hZGQoaW5mbyk7CiAJdGhpcy5pbmZvVG9IYW5kbGUucHV0KGluZm8sIGNsYXNzRmlsZSk7CiB9CkBAIC00MzksNCArNDM4LDQgQEAKIAogCiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5UmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhCmluZGV4IDllZmU2OGMuLjg1ZjRiM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlSZXNvbHZlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCiAvKioKQEAgLTI1LDYgKzI1LDkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklFcnJvckhhbmRsaW5nUG9saWN5OwpAQCAtNDAsNiArNDMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLklUeXBlUmVxdWVzdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmFyeVR5cGVCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTG9va3VwRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5QYWNrYWdlQmluZGluZzsKQEAgLTQ5LDcgKzUzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNvdXJjZVR5cGVDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsOwogCiBwdWJsaWMgY2xhc3MgSGllcmFyY2h5UmVzb2x2ZXIgaW1wbGVtZW50cyBJVHlwZVJlcXVlc3RvciB7CkBAIC02MSw2ICs2NCw3IEBACiAJcHJpdmF0ZSBSZWZlcmVuY2VCaW5kaW5nW10gdHlwZUJpbmRpbmdzOwogCXByaXZhdGUgUmVmZXJlbmNlQmluZGluZyBmb2N1c1R5cGU7CiAJcHJpdmF0ZSBDb21waWxlck9wdGlvbnMgb3B0aW9uczsKKwlwcml2YXRlIGJvb2xlYW4gaGFzTWlzc2luZ1N1cGVyQ2xhc3M7CiAJCiAvKioKICAqIEEgd3JhcHBlciBhcm91bmQgdGhlIHNpbXBsZSBuYW1lIG9mIGEgdHlwZSB0aGF0IGlzIG1pc3NpbmcuCkBAIC0xMTMsMzAgKzExNywxOCBAQAogCiB9CiAJCi1wdWJsaWMgSGllcmFyY2h5UmVzb2x2ZXIoCi0JSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQsCi0JSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5LAotCU1hcCBzZXR0aW5ncywKLQlJSGllcmFyY2h5UmVxdWVzdG9yIHJlcXVlc3RvciwKLQlJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKLQotCS8vIGNyZWF0ZSBhIHByb2JsZW0gaGFuZGxlciBnaXZlbiBhIGhhbmRsaW5nIHBvbGljeQotCW9wdGlvbnMgPSBzZXR0aW5ncyA9PSBudWxsID8gbmV3IENvbXBpbGVyT3B0aW9ucygpIDogbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncyk7Ci0JUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9IG5ldyBQcm9ibGVtUmVwb3J0ZXIocG9saWN5LCBvcHRpb25zLCBwcm9ibGVtRmFjdG9yeSk7Ci0JdGhpcy5sb29rdXBFbnZpcm9ubWVudCA9IG5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCBvcHRpb25zLCBwcm9ibGVtUmVwb3J0ZXIsIG5hbWVFbnZpcm9ubWVudCk7Ci0JdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0KLQl0aGlzLnR5cGVJbmRleCA9IC0xOwotCXRoaXMudHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbNV07Ci0JdGhpcy50eXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XTsKLX0KIHB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcihJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudCwgTWFwIHNldHRpbmdzLCBJSGllcmFyY2h5UmVxdWVzdG9yIHJlcXVlc3RvciwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5KSB7Ci0JdGhpcygKLQkJbmFtZUVudmlyb25tZW50LAotCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLmV4aXRBZnRlckFsbFByb2JsZW1zKCksCi0JCXNldHRpbmdzLAotCQlyZXF1ZXN0b3IsCi0JCXByb2JsZW1GYWN0b3J5KTsKKwkvLyBjcmVhdGUgYSBwcm9ibGVtIGhhbmRsZXIgd2l0aCB0aGUgJ2V4aXQgYWZ0ZXIgYWxsIHByb2JsZW1zJyBoYW5kbGluZyBwb2xpY3kKKwlvcHRpb25zID0gc2V0dGluZ3MgPT0gbnVsbCA/IG5ldyBDb21waWxlck9wdGlvbnMoKSA6IG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpOworCUlFcnJvckhhbmRsaW5nUG9saWN5IHBvbGljeSA9IERlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMuZXhpdEFmdGVyQWxsUHJvYmxlbXMoKTsKKwlQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyID0gbmV3IFByb2JsZW1SZXBvcnRlcihwb2xpY3ksIG9wdGlvbnMsIHByb2JsZW1GYWN0b3J5KTsKKworCXRoaXMuaW5pdGlhbGl6ZSgKKwkJbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIG9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgbmFtZUVudmlyb25tZW50KSwKKwkJcmVxdWVzdG9yKTsKK30KK3B1YmxpYyBIaWVyYXJjaHlSZXNvbHZlcihMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudCwgSUhpZXJhcmNoeVJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwl0aGlzLmluaXRpYWxpemUobG9va3VwRW52aXJvbm1lbnQsIHJlcXVlc3Rvcik7CiB9CiAvKioKICAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlCkBAIC0xNzMsNyArMTY1LDEzIEBACiAJLy8gYnVpbGQgY29ycmVzcG9uZGluZyBjb21waWxhdGlvbiB1bml0CiAJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGUuZ2V0RmlsZU5hbWUoKSwgMSwgMSwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CiAJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9Ci0JCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQobmV3IElTb3VyY2VUeXBlW10ge3NvdXJjZVR5cGV9LCBmYWxzZSwgdHJ1ZSwgbG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCByZXN1bHQpOworCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAorCQkJbmV3IElTb3VyY2VUeXBlW10ge3NvdXJjZVR5cGV9LCAvLyBpZ25vcmUgc2Vjb25kYXJ5IHR5cGVzLCB0byBpbXByb3ZlIGxhemluZXNzCisJCQlmYWxzZSwgLy8gbm8gbmVlZCBmb3IgZmllbGQgYW5kIG1ldGhvZHMKKwkJCXRydWUsIC8vIG5lZWQgbWVtYmVyIHR5cGVzCisJCQlmYWxzZSwgLy8gbm8gbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6YXRpb24KKwkJCWxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgCisJCQlyZXN1bHQpOwogCQkKIAkvLyBidWlsZCBiaW5kaW5ncwogCWlmICh1bml0ICE9IG51bGwpIHsKQEAgLTIwOSwxNyArMjA3LDIxIEBACiAJCQl9IGVsc2UgewogCQkJCXJldHVybiBudWxsOwogCQkJfQotCQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHJldHVybiBudWxsOwotCQkJaW50IGxhc3RTZXBhcmF0b3IgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKHNlcGFyYXRvciwgc3VwZXJjbGFzc05hbWUpOwotCQkJY2hhcltdIHNpbXBsZU5hbWUgPSBsYXN0U2VwYXJhdG9yID09IC0xID8gc3VwZXJjbGFzc05hbWUgOiBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHN1cGVyY2xhc3NOYW1lLCBsYXN0U2VwYXJhdG9yKzEsIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCk7Ci0JCQlyZXR1cm4gbmV3IE1pc3NpbmdUeXBlKG5ldyBTdHJpbmcoc2ltcGxlTmFtZSkpOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgdCA9IHR5cGVJbmRleDsgdCA+PSAwOyB0LS0pIHsKLQkJCQlpZiAodHlwZUJpbmRpbmdzW3RdID09IHN1cGVyQmluZGluZykgewotCQkJCQlyZXR1cm4gdHlwZU1vZGVsc1t0XTsKKwkJCQorCQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwpIHsgLy8gY2hlY2sgd2hldGhlciBzdWJjbGFzcyBvZiBPYmplY3QgZHVlIHRvIGJyb2tlbiBoaWVyYXJjaHkgKGFzIG9wcG9zZWQgdG8gZXhwbGljaXRseSBleHRlbmRpbmcgaXQpCisJCQkJaW50IGxhc3RTZXBhcmF0b3IgPSBDaGFyT3BlcmF0aW9uLmxhc3RJbmRleE9mKHNlcGFyYXRvciwgc3VwZXJjbGFzc05hbWUpOworCQkJCWNoYXJbXSBzaW1wbGVOYW1lID0gbGFzdFNlcGFyYXRvciA9PSAtMSA/IHN1cGVyY2xhc3NOYW1lIDogQ2hhck9wZXJhdGlvbi5zdWJhcnJheShzdXBlcmNsYXNzTmFtZSwgbGFzdFNlcGFyYXRvcisxLCBzdXBlcmNsYXNzTmFtZS5sZW5ndGgpOworCQkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoc2ltcGxlTmFtZSwgVHlwZUNvbnN0YW50cy5PQkpFQ1QpKSB7CisJCQkJCXRoaXMuaGFzTWlzc2luZ1N1cGVyQ2xhc3MgPSB0cnVlOworCQkJCQlyZXR1cm4gbmV3IE1pc3NpbmdUeXBlKG5ldyBTdHJpbmcoc2ltcGxlTmFtZSkpOwogCQkJCX0KIAkJCX0KIAkJfQorCQlmb3IgKGludCB0ID0gdHlwZUluZGV4OyB0ID49IDA7IHQtLSkgeworCQkJaWYgKHR5cGVCaW5kaW5nc1t0XSA9PSBzdXBlckJpbmRpbmcpIHsKKwkJCQlyZXR1cm4gdHlwZU1vZGVsc1t0XTsKKwkJCX0KKwkJfQogCX0gCiAJcmV0dXJuIG51bGw7CiB9CkBAIC0yNzAsNiArMjcyLDE0IEBACiAJfQogCXJldHVybiBzdXBlcmludGVyZmFjZXM7CiB9Citwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShMb29rdXBFbnZpcm9ubWVudCBsb29rdXBFbnZpcm9ubWVudCwgSUhpZXJhcmNoeVJlcXVlc3RvciByZXF1ZXN0b3IpIHsKKwl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0gbG9va3VwRW52aXJvbm1lbnQ7CisJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CisKKwl0aGlzLnR5cGVJbmRleCA9IC0xOworCXRoaXMudHlwZU1vZGVscyA9IG5ldyBJR2VuZXJpY1R5cGVbNV07CisJdGhpcy50eXBlQmluZGluZ3MgPSBuZXcgUmVmZXJlbmNlQmluZGluZ1s1XTsKK30KIHByaXZhdGUgdm9pZCByZW1lbWJlcihJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlLCBSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CiAJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHJldHVybjsKIAkKQEAgLTM0MiwxMCArMzUyLDE4IEBACiAJfQogfQogcHJpdmF0ZSB2b2lkIHJlcG9ydEhpZXJhcmNoeSgpIHsKKwlpbnQgb2JqZWN0SW5kZXggPSAtMTsKIAlmb3IgKGludCBjdXJyZW50ID0gdHlwZUluZGV4OyBjdXJyZW50ID49IDA7IGN1cnJlbnQtLSkgewotCQlJR2VuZXJpY1R5cGUgc3VwcGxpZWRUeXBlID0gdHlwZU1vZGVsc1tjdXJyZW50XTsKIAkJUmVmZXJlbmNlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nc1tjdXJyZW50XTsKIAorCQkvLyBqYXZhLmxhbmcuT2JqZWN0IHRyZWF0ZWQgYXQgdGhlIGVuZAorCQlpZiAodHlwZUJpbmRpbmcuaWQgPT0gVHlwZUlkcy5UX0phdmFMYW5nT2JqZWN0KSB7CisJCQlvYmplY3RJbmRleCA9IGN1cnJlbnQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCUlHZW5lcmljVHlwZSBzdXBwbGllZFR5cGUgPSB0eXBlTW9kZWxzW2N1cnJlbnRdOworCiAJCWlmICghc3ViT3JTdXBlck9mRm9jdXModHlwZUJpbmRpbmcpKSB7CiAJCQljb250aW51ZTsgLy8gaWdub3JlIHR5cGVzIG91dHNpZGUgb2YgaGllcmFyY2h5CiAJCX0KQEAgLTM2MCw2ICszNzgsMTAgQEAKIAkJCiAJCXJlcXVlc3Rvci5jb25uZWN0KHN1cHBsaWVkVHlwZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzKTsKIAl9CisJLy8gYWRkIGphdmEubGFuZy5PYmplY3Qgb25seSBpZiB0aGUgc3VwZXIgY2xhc3MgaXMgbm90IG1pc3NpbmcKKwlpZiAoIXRoaXMuaGFzTWlzc2luZ1N1cGVyQ2xhc3MgJiYgb2JqZWN0SW5kZXggPiAtMSkgeworCQlyZXF1ZXN0b3IuY29ubmVjdCh0eXBlTW9kZWxzW29iamVjdEluZGV4XSwgbnVsbCwgbnVsbCk7CisJfQogfQogcHJpdmF0ZSB2b2lkIHJlc2V0KCl7CiAJbG9va3VwRW52aXJvbm1lbnQucmVzZXQoKTsKQEAgLTM3OSw4ICs0MDEsOCBAQAogICogaW5zdGVhZCBvZiBhIGJpbmFyeSB0eXBlLgogICovCiAKLXB1YmxpYyB2b2lkIHJlc29sdmUoSUdlbmVyaWNUeXBlW10gc3VwcGxpZWRUeXBlcykgewotCXJlc29sdmUoc3VwcGxpZWRUeXBlcywgbnVsbCk7CitwdWJsaWMgdm9pZCByZXNvbHZlKElHZW5lcmljVHlwZVtdIHN1cHBsaWVkVHlwZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCXJlc29sdmUoc3VwcGxpZWRUeXBlcywgbnVsbCwgbW9uaXRvcik7CiB9CiAvKioKICAqIFJlc29sdmUgdGhlIHN1cGVydHlwZXMgZm9yIHRoZSBzdXBwbGllZCBzb3VyY2UgdHlwZXMuCkBAIC0zOTMsNyArNDE1LDcgQEAKICAqIGluc3RlYWQgb2YgYSBiaW5hcnkgdHlwZS4KICAqLwogCi1wdWJsaWMgdm9pZCByZXNvbHZlKElHZW5lcmljVHlwZVtdIHN1cHBsaWVkVHlwZXMsIElDb21waWxhdGlvblVuaXRbXSBzb3VyY2VVbml0cykgeworcHVibGljIHZvaWQgcmVzb2x2ZShJR2VuZXJpY1R5cGVbXSBzdXBwbGllZFR5cGVzLCBJQ29tcGlsYXRpb25Vbml0W10gc291cmNlVW5pdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCXRyeSB7CiAJCWludCBzdXBwbGllZExlbmd0aCA9IHN1cHBsaWVkVHlwZXMgPT0gbnVsbCA/IDAgOiBzdXBwbGllZFR5cGVzLmxlbmd0aDsKIAkJaW50IHNvdXJjZUxlbmd0aCA9IHNvdXJjZVVuaXRzID09IG51bGwgPyAwIDogc291cmNlVW5pdHMubGVuZ3RoOwpAQCAtNDI4LDcgKzQ1MCwxNCBAQAogCQkJCXdoaWxlICh0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpICE9IG51bGwpCiAJCQkJCXRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCk7CiAJCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHRvcExldmVsVHlwZS5nZXRGaWxlTmFtZSgpLCBpLCBzdXBwbGllZExlbmd0aCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7Ci0JCQkJdW5pdHNbaV0gPSBTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KG5ldyBJU291cmNlVHlwZVtde3RvcExldmVsVHlwZX0sIGZhbHNlLCB0cnVlLCBsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7CisJCQkJdW5pdHNbaV0gPSAKKwkJCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKKwkJCQkJCW5ldyBJU291cmNlVHlwZVtde3RvcExldmVsVHlwZX0sIAorCQkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCQl0cnVlLCAvLyBuZWVkIG1lbWJlciB0eXBlcworCQkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCisJCQkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIAorCQkJCQkJcmVzdWx0KTsKIAkJCQlpZiAodW5pdHNbaV0gIT0gbnVsbCkgewogCQkJCQl0cnkgewogCQkJCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdHNbaV0pOwpAQCAtNDM3LDE2ICs0NjYsMTggQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJCXdvcmtlZChtb25pdG9yLCAxKTsKIAkJfQorCQlQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHRydWUsIG9wdGlvbnMuc291cmNlTGV2ZWwgPj0gQ29tcGlsZXJPcHRpb25zLkpESzFfNCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyBpKyspewogCQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gc291cmNlVW5pdHNbaV07CiAJCQlDb21waWxhdGlvblJlc3VsdCB1bml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIHN1cHBsaWVkTGVuZ3RoK2ksIHN1cHBsaWVkTGVuZ3RoK3NvdXJjZUxlbmd0aCwgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7IAotCQkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIobG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCB0cnVlLCBvcHRpb25zLmFzc2VydE1vZGUpOwogCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgdW5pdFJlc3VsdCk7CiAJCQlpZiAocGFyc2VkVW5pdCAhPSBudWxsKSB7CiAJCQkJdW5pdHNbc3VwcGxpZWRMZW5ndGgraV0gPSBwYXJzZWRVbml0OwogCQkJCWxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHBhcnNlZFVuaXQpOwogCQkJfQorCQkJd29ya2VkKG1vbml0b3IsIDEpOwogCQl9CiAJCQogCQkvLyBjb21wbGV0ZSB0eXBlIGJpbmRpbmdzIChpZS4gY29ubmVjdCBzdXBlciB0eXBlcykgYW5kIHJlbWVtYmVyIHRoZW0KQEAgLTQ2Nyw2ICs0OTgsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQorCQkJd29ya2VkKG1vbml0b3IsIDEpOwogCQl9CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyBpKyspIHsKIAkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHBhcnNlZFVuaXQgPSB1bml0c1tzdXBwbGllZExlbmd0aCtpXTsKQEAgLTQ3OSw2ICs1MTEsNyBAQAogCQkJCQlyZW1lbWJlcldpdGhNZW1iZXJUeXBlcyhwYXJzZWRVbml0LnR5cGVzW2pdLCBudWxsLCBzb3VyY2VVbml0KTsKIAkJCQl9CiAJCQl9CisJCQl3b3JrZWQobW9uaXRvciwgMSk7CiAJCX0KIAogCQlyZXBvcnRIaWVyYXJjaHkoKTsKQEAgLTUwNiw3ICs1MzksMTMgQEAKIAkJCQl0b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGUuZ2V0RW5jbG9zaW5nVHlwZSgpOwogCQkJQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHRvcExldmVsVHlwZS5nZXRGaWxlTmFtZSgpLCAxLCAxLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKIAkJCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPQotCQkJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQobmV3IElTb3VyY2VUeXBlW117dG9wTGV2ZWxUeXBlfSwgZmFsc2UsIHRydWUsIGxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwgcmVzdWx0KTsKKwkJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAorCQkJCQluZXcgSVNvdXJjZVR5cGVbXXt0b3BMZXZlbFR5cGV9LCAKKwkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCXRydWUsIC8vIG5lZWQgbWVtYmVyIHR5cGVzCisJCQkJCWZhbHNlLCAvLyBubyBuZWVkIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbgorCQkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIAorCQkJCQlyZXN1bHQpOwogCiAJCQlpZiAodW5pdCAhPSBudWxsKSB7CiAJCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CkBAIC01MjcsMTAgKzU2NiwxMyBAQAogICovCiBwdWJsaWMgUmVmZXJlbmNlQmluZGluZyBzZXRGb2N1c1R5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CiAJaWYgKGNvbXBvdW5kTmFtZSA9PSBudWxsIHx8IHRoaXMubG9va3VwRW52aXJvbm1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JdGhpcy5mb2N1c1R5cGUgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmFza0ZvclR5cGUoY29tcG91bmROYW1lKTsKKwl0aGlzLmZvY3VzVHlwZSA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuZ2V0Q2FjaGVkVHlwZShjb21wb3VuZE5hbWUpOworCWlmICh0aGlzLmZvY3VzVHlwZSA9PSBudWxsKSB7CisJCXRoaXMuZm9jdXNUeXBlID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC5hc2tGb3JUeXBlKGNvbXBvdW5kTmFtZSk7CisJfQogCXJldHVybiB0aGlzLmZvY3VzVHlwZTsKIH0KLXByaXZhdGUgYm9vbGVhbiBzdWJPclN1cGVyT2ZGb2N1cyhSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CitwdWJsaWMgYm9vbGVhbiBzdWJPclN1cGVyT2ZGb2N1cyhSZWZlcmVuY2VCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CiAJaWYgKHRoaXMuZm9jdXNUeXBlID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBhY2NlcHQgYWxsIHR5cGVzIChjYXNlIG9mIGhpZXJhcmNoeSBpbiBhIHJlZ2lvbikKIAlpZiAodGhpcy5zdWJUeXBlT2ZUeXBlKHRoaXMuZm9jdXNUeXBlLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOwogCWlmICh0aGlzLnN1YlR5cGVPZlR5cGUodHlwZUJpbmRpbmcsIHRoaXMuZm9jdXNUeXBlKSkgcmV0dXJuIHRydWU7CkBAIC01NDAsNyArNTgyLDcgQEAKIAlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCB8fCBzdWJUeXBlID09IG51bGwpIHJldHVybiBmYWxzZTsKIAlpZiAoc3ViVHlwZSA9PSB0eXBlQmluZGluZykgcmV0dXJuIHRydWU7CiAJUmVmZXJlbmNlQmluZGluZyBzdXBlcmNsYXNzID0gc3ViVHlwZS5zdXBlcmNsYXNzKCk7Ci0JaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCAmJiBzdXBlcmNsYXNzLmlkID09IFR5cGVJZHMuVF9KYXZhTGFuZ09iamVjdCAmJiBzdWJUeXBlLmlzSGllcmFyY2h5SW5jb25zaXN0ZW50KCkpIHJldHVybiBmYWxzZTsKKy8vCWlmIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcy5pZCA9PSBUeXBlSWRzLlRfSmF2YUxhbmdPYmplY3QgJiYgc3ViVHlwZS5pc0hpZXJhcmNoeUluY29uc2lzdGVudCgpKSByZXR1cm4gZmFsc2U7CiAJaWYgKHRoaXMuc3ViVHlwZU9mVHlwZShzdXBlcmNsYXNzLCB0eXBlQmluZGluZykpIHJldHVybiB0cnVlOwogCVJlZmVyZW5jZUJpbmRpbmdbXSBzdXBlckludGVyZmFjZXMgPSBzdWJUeXBlLnN1cGVySW50ZXJmYWNlcygpOwogCWlmIChzdXBlckludGVyZmFjZXMgIT0gbnVsbCkgewpAQCAtNTUwLDQgKzU5MiwxMyBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9Citwcm90ZWN0ZWQgdm9pZCB3b3JrZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgd29yaykgeworCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJfSBlbHNlIHsKKwkJCW1vbml0b3Iud29ya2VkKHdvcmspOworCQl9CisJfQorfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9IaWVyYXJjaHlUeXBlLmphdmEKaW5kZXggODFlYjBkOC4uZmIyMTk4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0hpZXJhcmNoeVR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSGllcmFyY2h5VHlwZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0lIaWVyYXJjaHlSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JSGllcmFyY2h5UmVxdWVzdG9yLmphdmEKaW5kZXggOWY0YzNhMC4uMjM1MjgyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L0lIaWVyYXJjaHlSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSUhpZXJhcmNoeVJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JR2VuZXJpY1R5cGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvSW5kZXhCYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCmluZGV4IGI1ZmE5MDkuLjU0ZWMzMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9JbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTE3LDcgKzE3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwpAQCAtMjYsOCArMjUsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKQEAgLTM1LDE4ICszNCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVGFnQml0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkhhbmRsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSVBhdGhSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5PcGVuYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5TZWFyY2hhYmxlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Xb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JSW5kZXhTZWFyY2hSZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmZvQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5JbmRleFNlYXJjaEFkYXB0ZXI7CkBAIC01Nyw2ICs0Niw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nLlN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm47CiAKIHB1YmxpYyBjbGFzcyBJbmRleEJhc2VkSGllcmFyY2h5QnVpbGRlciBleHRlbmRzIEhpZXJhcmNoeUJ1aWxkZXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWFRJQ0tTID0gODAwOyAvLyBoZXVyaXN0aWMgc28gdGhhdCB0aGVyZSBzdGlsbCBwcm9ncmVzcyBmb3IgZGVlcCBoaWVyYWNoaWVzCiAJLyoqCiAJICogQSB0ZW1wb3JhcnkgY2FjaGUgb2YgY29tcGlsYXRpb24gdW5pdHMgdG8gaGFuZGxlcyB0byBzcGVlZCBpbmZvCiAJICogdG8gaGFuZGxlIHRyYW5zbGF0aW9uIC0gaXQgb25seSBjb250YWlucyB0aGUgZW50cmllcwpAQCAtMTU4LDEwICsxNDgsMjEgQEAKIAkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7CiAJCQkJCiAJCWlmIChjb21wdXRlU3VidHlwZXMpIHsKLQkJCVN0cmluZ1tdIGFsbFBvc3NpYmxlU3VidHlwZXMgPSB0aGlzLmRldGVybWluZVBvc3NpYmxlU3ViVHlwZXMoKTsKKwkJCS8vIE5vdGUgYnkgY29uc3RydWN0aW9uIHRoZXJlIGFsd2F5cyBpcyBhIGZvY3VzIHR5cGUgaGVyZQorCQkJYm9vbGVhbiBmb2N1c0lzT2JqZWN0ID0gZ2V0VHlwZSgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG5ldyBTdHJpbmcoSUluZGV4Q29uc3RhbnRzLk9CSkVDVCkpOworCQkJaW50IGFtb3VudE9mV29ya0ZvclN1YnR5cGVzID0gZm9jdXNJc09iamVjdCA/IDUgOiA4MDsgLy8gcGVyY2VudGFnZSBvZiB3b3JrIG5lZWRlZCB0byBnZXQgcG9zc2libGUgc3VidHlwZXMKKwkJCUlQcm9ncmVzc01vbml0b3IgcG9zc2libGVTdWJ0eXBlc01vbml0b3IgPSAKKwkJCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IAorCQkJCQludWxsIDogCisJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IodGhpcy5oaWVyYXJjaHkucHJvZ3Jlc3NNb25pdG9yLCBhbW91bnRPZldvcmtGb3JTdWJ0eXBlcyk7CisJCQlTdHJpbmdbXSBhbGxQb3NzaWJsZVN1YnR5cGVzID0gdGhpcy5kZXRlcm1pbmVQb3NzaWJsZVN1YlR5cGVzKHBvc3NpYmxlU3VidHlwZXNNb25pdG9yKTsKIAkJCWlmIChhbGxQb3NzaWJsZVN1YnR5cGVzICE9IG51bGwpIHsKKwkJCQlJUHJvZ3Jlc3NNb25pdG9yIGJ1aWxkTW9uaXRvciA9IAorCQkJCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IgPT0gbnVsbCA/IAorCQkJCQkJbnVsbCA6IAorCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IsIDEwMCAtIGFtb3VudE9mV29ya0ZvclN1YnR5cGVzKTsKIAkJCQl0aGlzLmhpZXJhcmNoeS5pbml0aWFsaXplKGFsbFBvc3NpYmxlU3VidHlwZXMubGVuZ3RoKTsKLQkJCQlidWlsZEZyb21Qb3RlbnRpYWxTdWJ0eXBlcyhhbGxQb3NzaWJsZVN1YnR5cGVzKTsKKwkJCQlidWlsZEZyb21Qb3RlbnRpYWxTdWJ0eXBlcyhhbGxQb3NzaWJsZVN1YnR5cGVzLCBidWlsZE1vbml0b3IpOwogCQkJfQogCQl9IGVsc2UgewogCQkJdGhpcy5oaWVyYXJjaHkuaW5pdGlhbGl6ZSgxKTsKQEAgLTE3MSw3ICsxNzIsNyBAQAogCQltYW5hZ2VyLmZsdXNoWmlwRmlsZXMoKTsKIAl9CiB9Ci1wcml2YXRlIHZvaWQgYnVpbGRGb3JQcm9qZWN0KEphdmFQcm9qZWN0IHByb2plY3QsIEFycmF5TGlzdCBpbmZvcywgQXJyYXlMaXN0IHVuaXRzLCBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKK3ByaXZhdGUgdm9pZCBidWlsZEZvclByb2plY3QoSmF2YVByb2plY3QgcHJvamVjdCwgQXJyYXlMaXN0IGluZm9zLCBBcnJheUxpc3QgdW5pdHMsIElXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJLy8gY29weSB2ZWN0b3JzIGludG8gYXJyYXlzCiAJSUdlbmVyaWNUeXBlW10gZ2VuZXJpY1R5cGVzOwogCWludCBpbmZvc1NpemUgPSBpbmZvcy5zaXplKCk7CkBAIC0yMTYsNyArMjE3LDcgQEAKIAkJCX0KIAkJCXRyeSB7CiAJCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IAotCQkJCQluZXcgSGllcmFyY2h5UmVzb2x2ZXIodGhpcy5zZWFyY2hhYmxlRW52aXJvbm1lbnQsIEphdmFDb3JlLmdldE9wdGlvbnMoKSwgdGhpcywgbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeSgpKTsKKwkJCQkJbmV3IEhpZXJhcmNoeVJlc29sdmVyKHRoaXMuc2VhcmNoYWJsZUVudmlyb25tZW50LCBwcm9qZWN0LmdldE9wdGlvbnModHJ1ZSksIHRoaXMsIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSk7CiAJCQkJaWYgKGZvY3VzVHlwZSAhPSBudWxsKSB7CiAJCQkJCWNoYXJbXSBmdWxseVF1YWxpZmllZE5hbWUgPSBmb2N1c1R5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJCQkJUmVmZXJlbmNlQmluZGluZyBmb2N1c1R5cGVCaW5kaW5nID0gdGhpcy5oaWVyYXJjaHlSZXNvbHZlci5zZXRGb2N1c1R5cGUoQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgZnVsbHlRdWFsaWZpZWROYW1lKSk7CkBAIC0yMjYsNyArMjI3LDcgQEAKIAkJCQkJCXJldHVybjsKIAkJCQkJfQogCQkJCX0KLQkJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnJlc29sdmUoZ2VuZXJpY1R5cGVzLCBjb21waWxhdGlvblVuaXRzKTsKKwkJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnJlc29sdmUoZ2VuZXJpY1R5cGVzLCBjb21waWxhdGlvblVuaXRzLCBtb25pdG9yKTsKIAkJCX0gZmluYWxseSB7CiAJCQkJaWYgKGluUHJvamVjdE9mRm9jdXNUeXBlKSB7CiAJCQkJCXRoaXMubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZShudWxsKTsKQEAgLTIzOCw3ICsyMzksNyBAQAogLyoqCiAgKiBDb25maWd1cmUgdGhpcyB0eXBlIGhpZXJhcmNoeSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcG90ZW50aWFsIHN1YnR5cGVzLgogICovCi1wcml2YXRlIHZvaWQgYnVpbGRGcm9tUG90ZW50aWFsU3VidHlwZXMoU3RyaW5nW10gYWxsUG90ZW50aWFsU3ViVHlwZXMpIHsKK3ByaXZhdGUgdm9pZCBidWlsZEZyb21Qb3RlbnRpYWxTdWJ0eXBlcyhTdHJpbmdbXSBhbGxQb3RlbnRpYWxTdWJUeXBlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJSVR5cGUgZm9jdXNUeXBlID0gdGhpcy5nZXRUeXBlKCk7CiAJCQogCS8vIHN1YnN0aXR1dGUgY29tcGlsYXRpb24gdW5pdHMgd2l0aCB3b3JraW5nIGNvcGllcwpAQCAtMjY2LDE4ICsyNjcsNyBAQAogCU9wZW5hYmxlIGZvY3VzQ1UgPSAoT3BlbmFibGUpZm9jdXNUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwogCVN0cmluZyBmb2N1c1BhdGggPSBudWxsOwogCWlmIChmb2N1c0NVICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSB1bmRlcmx5aW5nUmVzb3VyY2U7Ci0JCQlpZiAoZm9jdXNDVSBpbnN0YW5jZW9mIFdvcmtpbmdDb3B5KSB7Ci0JCQkJdW5kZXJseWluZ1Jlc291cmNlID0gKChXb3JraW5nQ29weSlmb2N1c0NVKS5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5kZXJseWluZ1Jlc291cmNlID0gZm9jdXNDVS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCX0KLQkJCWZvY3VzUGF0aCA9IHVuZGVybHlpbmdSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0eXBlIGRvZXMgbm90IGV4aXN0Ci0JCQlyZXR1cm47Ci0JCX0KKwkJZm9jdXNQYXRoID0gZm9jdXNDVS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKIAkJaWYgKGxlbmd0aCA+IDApIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYWxsUG90ZW50aWFsU3ViVHlwZXMsIDAsIGFsbFBvdGVudGlhbFN1YlR5cGVzID0gbmV3IFN0cmluZ1tsZW5ndGgrMV0sIDAsIGxlbmd0aCk7CiAJCQlhbGxQb3RlbnRpYWxTdWJUeXBlc1tsZW5ndGhdID0gZm9jdXNQYXRoOwkKQEAgLTI5OSw3NSArMjg5LDc4IEBACiAJQXJyYXlMaXN0IGluZm9zID0gbmV3IEFycmF5TGlzdCgpOwogCUFycmF5TGlzdCB1bml0cyA9IG5ldyBBcnJheUxpc3QoKTsKIAotCS8vIGNyZWF0ZSBlbGVtZW50IGluZm9zIGZvciBzdWJ0eXBlcwotCUhhbmRsZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBIYW5kbGVGYWN0b3J5KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JSUphdmFQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gbnVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0gYWxsUG90ZW50aWFsU3ViVHlwZXNbaV07Ci0JCQkKLQkJCS8vIHNraXAgZHVwbGljYXRlIHBhdGhzIChlLmcuIGlmIGZvY3VzIHBhdGggd2FzIGluamVjdGVkIHdoZW4gaXQgd2FzIGFscmVhZHkgYSBwb3RlbnRpYWwgc3VidHlwZSkKLQkJCWlmIChpID4gMCAmJiByZXNvdXJjZVBhdGguZXF1YWxzKGFsbFBvdGVudGlhbFN1YlR5cGVzW2ktMV0pKSBjb250aW51ZTsKLQkJCQotCQkJT3BlbmFibGUgaGFuZGxlOwotCQkJSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElXb3JraW5nQ29weSl3Y1BhdGhzLmdldChyZXNvdXJjZVBhdGgpOwotCQkJaWYgKHdvcmtpbmdDb3B5ICE9IG51bGwpIHsKLQkJCQloYW5kbGUgPSAoT3BlbmFibGUpd29ya2luZ0NvcHk7Ci0JCQl9IGVsc2UgewotCQkJCWhhbmRsZSA9IAotCQkJCQlyZXNvdXJjZVBhdGguZXF1YWxzKGZvY3VzUGF0aCkgPyAKLQkJCQkJCWZvY3VzQ1UgOgotCQkJCQkJZmFjdG9yeS5jcmVhdGVPcGVuYWJsZShyZXNvdXJjZVBhdGgpOwotCQkJCWlmIChoYW5kbGUgPT0gbnVsbCkgY29udGludWU7IC8vIG1hdGNoIGlzIG91dHNpZGUgY2xhc3NwYXRoCi0JCQl9Ci0JCQkKLQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gaGFuZGxlLmdldEphdmFQcm9qZWN0KCk7Ci0JCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCkgewotCQkJCWN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKLQkJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCQkJdW5pdHMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQkJfSBlbHNlIGlmICghY3VycmVudFByb2plY3QuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJLy8gYnVpbGQgY3VycmVudCBwcm9qZWN0Ci0JCQkJdGhpcy5idWlsZEZvclByb2plY3QoKEphdmFQcm9qZWN0KWN1cnJlbnRQcm9qZWN0LCBpbmZvcywgdW5pdHMsIHdvcmtpbmdDb3BpZXMpOwotCQkJCWN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKLQkJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCQkJdW5pdHMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQkJfQotCQkJCi0JCQl0aGlzLmFkZEluZm9Gcm9tRWxlbWVudChoYW5kbGUsIGluZm9zLCB1bml0cywgcmVzb3VyY2VQYXRoKTsKLQkJCQotCQkJd29ya2VkKDEpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJY29udGludWU7Ci0JCX0KLQl9Ci0JCi0JLy8gYnVpbGQgbGFzdCBwcm9qZWN0CiAJdHJ5IHsKLQkJaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwpIHsKLQkJCS8vIGNhc2Ugb2Ygbm8gcG90ZW50aWFsIHN1YnR5cGVzCi0JCQljdXJyZW50UHJvamVjdCA9IGZvY3VzVHlwZS5nZXRKYXZhUHJvamVjdCgpOwotCQkJdGhpcy5hZGRJbmZvc0Zyb21UeXBlKGZvY3VzVHlwZSwgaW5mb3MpOworCQkvLyBjcmVhdGUgZWxlbWVudCBpbmZvcyBmb3Igc3VidHlwZXMKKwkJSGFuZGxlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEhhbmRsZUZhY3RvcnkoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKKwkJSUphdmFQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gbnVsbDsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5iZWdpblRhc2soIiIsIGxlbmd0aCoyIC8qIDEgZm9yIGJ1aWxkIGJpbmRpbmcsIDEgZm9yIGNvbm5lY3QgaGllcmFyY2h5Ki8pOyAvLyROT04tTkxTLTEkCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIHJlc291cmNlUGF0aCA9IGFsbFBvdGVudGlhbFN1YlR5cGVzW2ldOworCQkJCQorCQkJCS8vIHNraXAgZHVwbGljYXRlIHBhdGhzIChlLmcuIGlmIGZvY3VzIHBhdGggd2FzIGluamVjdGVkIHdoZW4gaXQgd2FzIGFscmVhZHkgYSBwb3RlbnRpYWwgc3VidHlwZSkKKwkJCQlpZiAoaSA+IDAgJiYgcmVzb3VyY2VQYXRoLmVxdWFscyhhbGxQb3RlbnRpYWxTdWJUeXBlc1tpLTFdKSkgY29udGludWU7CisJCQkJCisJCQkJT3BlbmFibGUgaGFuZGxlOworCQkJCUlXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJV29ya2luZ0NvcHkpd2NQYXRocy5nZXQocmVzb3VyY2VQYXRoKTsKKwkJCQlpZiAod29ya2luZ0NvcHkgIT0gbnVsbCkgeworCQkJCQloYW5kbGUgPSAoT3BlbmFibGUpd29ya2luZ0NvcHk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGFuZGxlID0gCisJCQkJCQlyZXNvdXJjZVBhdGguZXF1YWxzKGZvY3VzUGF0aCkgPyAKKwkJCQkJCQlmb2N1c0NVIDoKKwkJCQkJCQlmYWN0b3J5LmNyZWF0ZU9wZW5hYmxlKHJlc291cmNlUGF0aCwgdGhpcy5zY29wZSk7CisJCQkJCWlmIChoYW5kbGUgPT0gbnVsbCkgY29udGludWU7IC8vIG1hdGNoIGlzIG91dHNpZGUgY2xhc3NwYXRoCisJCQkJfQorCQkJCQorCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gaGFuZGxlLmdldEphdmFQcm9qZWN0KCk7CisJCQkJaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwpIHsKKwkJCQkJY3VycmVudFByb2plY3QgPSBwcm9qZWN0OworCQkJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoNSk7CisJCQkJCXVuaXRzID0gbmV3IEFycmF5TGlzdCg1KTsKKwkJCQl9IGVsc2UgaWYgKCFjdXJyZW50UHJvamVjdC5lcXVhbHMocHJvamVjdCkpIHsKKwkJCQkJLy8gYnVpbGQgY3VycmVudCBwcm9qZWN0CisJCQkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgaW5mb3MsIHVuaXRzLCB3b3JraW5nQ29waWVzLCBtb25pdG9yKTsKKwkJCQkJY3VycmVudFByb2plY3QgPSBwcm9qZWN0OworCQkJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoNSk7CisJCQkJCXVuaXRzID0gbmV3IEFycmF5TGlzdCg1KTsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5hZGRJbmZvRnJvbUVsZW1lbnQoaGFuZGxlLCBpbmZvcywgdW5pdHMsIHJlc291cmNlUGF0aCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCWNvbnRpbnVlOworCQkJfQogCQl9Ci0JCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgaW5mb3MsIHVuaXRzLCB3b3JraW5nQ29waWVzKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyBDb21wdXRlIGhpZXJhcmNoeSBvZiBmb2N1cyB0eXBlIGlmIG5vdCBhbHJlYWR5IGRvbmUgKGNhc2Ugb2YgYSB0eXBlIHdpdGggcG90ZW50aWFsIHN1YnR5cGVzIHRoYXQgYXJlIG5vdCByZWFsIHN1YnR5cGVzKQotCWlmICghdGhpcy5oaWVyYXJjaHkuY29udGFpbnMoZm9jdXNUeXBlKSkgeworCQkKKwkJLy8gYnVpbGQgbGFzdCBwcm9qZWN0CiAJCXRyeSB7Ci0JCQljdXJyZW50UHJvamVjdCA9IGZvY3VzVHlwZS5nZXRKYXZhUHJvamVjdCgpOwotCQkJaW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl1bml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXRoaXMuYWRkSW5mb3NGcm9tVHlwZShmb2N1c1R5cGUsIGluZm9zKTsKLQkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgaW5mb3MsIHVuaXRzLCB3b3JraW5nQ29waWVzKTsKKwkJCWlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsKSB7CisJCQkJLy8gY2FzZSBvZiBubyBwb3RlbnRpYWwgc3VidHlwZXMKKwkJCQljdXJyZW50UHJvamVjdCA9IGZvY3VzVHlwZS5nZXRKYXZhUHJvamVjdCgpOworCQkJCXRoaXMuYWRkSW5mb3NGcm9tVHlwZShmb2N1c1R5cGUsIGluZm9zKTsKKwkJCX0KKwkJCXRoaXMuYnVpbGRGb3JQcm9qZWN0KChKYXZhUHJvamVjdCljdXJyZW50UHJvamVjdCwgaW5mb3MsIHVuaXRzLCB3b3JraW5nQ29waWVzLCBtb25pdG9yKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJfQotCX0KLQkKLQkvLyBBZGQgZm9jdXMgaWYgbm90IGFscmVhZHkgaW4gKGNhc2Ugb2YgYSB0eXBlIHdpdGggbm8gZXhwbGljaXQgc3VwZXIgdHlwZSkKLQlpZiAoIXRoaXMuaGllcmFyY2h5LmNvbnRhaW5zKGZvY3VzVHlwZSkpIHsKLQkJdGhpcy5oaWVyYXJjaHkuYWRkUm9vdENsYXNzKGZvY3VzVHlwZSk7CisJCQorCQkvLyBDb21wdXRlIGhpZXJhcmNoeSBvZiBmb2N1cyB0eXBlIGlmIG5vdCBhbHJlYWR5IGRvbmUgKGNhc2Ugb2YgYSB0eXBlIHdpdGggcG90ZW50aWFsIHN1YnR5cGVzIHRoYXQgYXJlIG5vdCByZWFsIHN1YnR5cGVzKQorCQlpZiAoIXRoaXMuaGllcmFyY2h5LmNvbnRhaW5zKGZvY3VzVHlwZSkpIHsKKwkJCXRyeSB7CisJCQkJY3VycmVudFByb2plY3QgPSBmb2N1c1R5cGUuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQlpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQl1bml0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQl0aGlzLmFkZEluZm9zRnJvbVR5cGUoZm9jdXNUeXBlLCBpbmZvcyk7CisJCQkJdGhpcy5idWlsZEZvclByb2plY3QoKEphdmFQcm9qZWN0KWN1cnJlbnRQcm9qZWN0LCBpbmZvcywgdW5pdHMsIHdvcmtpbmdDb3BpZXMsIG1vbml0b3IpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQWRkIGZvY3VzIGlmIG5vdCBhbHJlYWR5IGluIChjYXNlIG9mIGEgdHlwZSB3aXRoIG5vIGV4cGxpY2l0IHN1cGVyIHR5cGUpCisJCWlmICghdGhpcy5oaWVyYXJjaHkuY29udGFpbnMoZm9jdXNUeXBlKSkgeworCQkJdGhpcy5oaWVyYXJjaHkuYWRkUm9vdENsYXNzKGZvY3VzVHlwZSk7CisJCX0KKwl9IGZpbmFsbHkgeworCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmRvbmUoKTsKIAl9CiB9CiBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tUGF0aChPcGVuYWJsZSBoYW5kbGUsU3RyaW5nIG9zUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CkBAIC0zNzksNyArMzcyLDcgQEAKICAqIFJldHVybnMgYWxsIG9mIHRoZSBwb3NzaWJsZSBzdWJ0eXBlcyBvZiB0aGlzIHR5cGUgaGllcmFyY2h5LgogICogUmV0dXJucyBudWxsIGlmIHRoZXkgY291bGQgbm90IGJlIGRldGVybWluZS4KICAqLwotcHJpdmF0ZSBTdHJpbmdbXSBkZXRlcm1pbmVQb3NzaWJsZVN1YlR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Citwcml2YXRlIFN0cmluZ1tdIGRldGVybWluZVBvc3NpYmxlU3ViVHlwZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKIAogCWNsYXNzIFBhdGhDb2xsZWN0b3IgaW1wbGVtZW50cyBJUGF0aFJlcXVlc3RvciB7CiAJCUhhc2hTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCgxMCk7CkBAIC0zOTAsMTQgKzM4MywxOSBAQAogCVBhdGhDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFBhdGhDb2xsZWN0b3IoKTsKIAlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5oaWVyYXJjaHkuamF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CiAJCi0Jc2VhcmNoQWxsUG9zc2libGVTdWJUeXBlcygKLQkJcHJvamVjdC5nZXRXb3Jrc3BhY2UoKSwKLQkJdGhpcy5nZXRUeXBlKCksCi0JCXRoaXMuc2NvcGUsCi0JCXRoaXMuYmluYXJpZXNGcm9tSW5kZXhNYXRjaGVzLAotCQljb2xsZWN0b3IsCi0JCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILAotCQl0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IpOworCXRyeSB7CisJCWlmIChtb25pdG9yICE9IG51bGwpIG1vbml0b3IuYmVnaW5UYXNrKCIiLCBNQVhUSUNLUyk7IC8vJE5PTi1OTFMtMSQKKwkJc2VhcmNoQWxsUG9zc2libGVTdWJUeXBlcygKKwkJCXByb2plY3QuZ2V0V29ya3NwYWNlKCksCisJCQl0aGlzLmdldFR5cGUoKSwKKwkJCXRoaXMuc2NvcGUsCisJCQl0aGlzLmJpbmFyaWVzRnJvbUluZGV4TWF0Y2hlcywKKwkJCWNvbGxlY3RvciwKKwkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILAorCQkJbW9uaXRvcik7CisJfSBmaW5hbGx5IHsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5kb25lKCk7CisJfQogCiAJSGFzaFNldCBwYXRocyA9IGNvbGxlY3Rvci5wYXRoczsKIAlpbnQgbGVuZ3RoID0gcGF0aHMuc2l6ZSgpOwpAQCAtNTA2LDcgKzUwNCw3IEBACiAJLyogaW5pdGlhbGl6ZSBlbnRyeSByZXN1bHQgY2FjaGUgKi8KIAlwYXR0ZXJuLmVudHJ5UmVzdWx0cyA9IG5ldyBIYXNoTWFwKCk7CiAJLyogaXRlcmF0ZSBhbGwgcXVldWVkIG5hbWVzICovCi0JaW50IHRpY2tzID0gNTA7CisJaW50IHRpY2tzID0gMDsKIAlhd2FpdGluZ3MuYWRkKHR5cGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKTsKIAl3aGlsZSAoYXdhaXRpbmdzLnN0YXJ0IDw9IGF3YWl0aW5ncy5lbmQpewogCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOwpAQCAtNTIyLDEwICs1MjAsMTIgQEAKIAkJaW5kZXhNYW5hZ2VyLnBlcmZvcm1Db25jdXJyZW50Sm9iKAogCQkJam9iLCAKIAkJCXdhaXRpbmdQb2xpY3ksIAotCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIHRpY2tzKSk7CisJCQludWxsKTsgLy8gZG9uJ3QgcGFzcyBhIHN1YiBwcm9ncmVzcyBtb25pdG9yIGFzIHRoaXMgaXMgdG9vIGNvc3RseSBmb3IgZGVlcCBoaWVyYXJjaGllcworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgKyt0aWNrcyA8PSBNQVhUSUNLUykgeworCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKKwkJfQogCQkvKiBpbiBjYXNlLCB3ZSBzZWFyY2ggYWxsIHN1YnR5cGVzLCBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAJCWlmIChjdXJyZW50VHlwZU5hbWUgPT0gbnVsbCkgYnJlYWs7Ci0JCXRpY2tzID0gdGlja3MgLyAyOwogCX0KIAkvKiBjbG9zZSBhbGwgY2FjaGVkIGluZGV4IGlucHV0cyAqLwogCWpvYi5jbG9zZUFsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkSGllcmFyY2h5QnVpbGRlci5qYXZhCmluZGV4IDM3Yjk5NmMuLjBjNzQzZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9SZWdpb25CYXNlZEhpZXJhcmNoeUJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRIaWVyYXJjaHlCdWlsZGVyLmphdmEKQEAgLTEsMTggKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHk7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwpAQCAtNDUsOSArNDcsMTcgQEAKIAkJbWFuYWdlci5jYWNoZVppcEZpbGVzKCk7CiAJCQkJCiAJCWlmICh0aGlzLmhpZXJhcmNoeS50eXBlID09IG51bGwgfHwgY29tcHV0ZVN1YnR5cGVzKSB7Ci0JCQlBcnJheUxpc3QgYWxsVHlwZXNJblJlZ2lvbiA9IGRldGVybWluZVR5cGVzSW5SZWdpb24oKTsKKwkJCUlQcm9ncmVzc01vbml0b3IgdHlwZUluUmVnaW9uTW9uaXRvciA9IAorCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gCisJCQkJCW51bGwgOiAKKwkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IsIDMwKTsKKwkJCUFycmF5TGlzdCBhbGxUeXBlc0luUmVnaW9uID0gZGV0ZXJtaW5lVHlwZXNJblJlZ2lvbih0eXBlSW5SZWdpb25Nb25pdG9yKTsKIAkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoYWxsVHlwZXNJblJlZ2lvbi5zaXplKCkpOwotCQkJY3JlYXRlVHlwZUhpZXJhcmNoeUJhc2VkT25SZWdpb24oYWxsVHlwZXNJblJlZ2lvbik7CisJCQlJUHJvZ3Jlc3NNb25pdG9yIGJ1aWxkTW9uaXRvciA9IAorCQkJCXRoaXMuaGllcmFyY2h5LnByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gCisJCQkJCW51bGwgOiAKKwkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLmhpZXJhcmNoeS5wcm9ncmVzc01vbml0b3IsIDcwKTsKKwkJCWNyZWF0ZVR5cGVIaWVyYXJjaHlCYXNlZE9uUmVnaW9uKGFsbFR5cGVzSW5SZWdpb24sIGJ1aWxkTW9uaXRvcik7CiAJCQkoKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSl0aGlzLmhpZXJhcmNoeSkucHJ1bmVEZWFkQnJhbmNoZXMoKTsKIAkJfSBlbHNlIHsKIAkJCXRoaXMuaGllcmFyY2h5LmluaXRpYWxpemUoMSk7CkBAIC02MCw3ICs3MCw3IEBACiAvKioKICAqIENvbmZpZ3VyZSB0aGlzIHR5cGUgaGllcmFyY2h5IHRoYXQgaXMgYmFzZWQgb24gYSByZWdpb24uCiAgKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVUeXBlSGllcmFyY2h5QmFzZWRPblJlZ2lvbihBcnJheUxpc3QgYWxsVHlwZXNJblJlZ2lvbikgeworcHJpdmF0ZSB2b2lkIGNyZWF0ZVR5cGVIaWVyYXJjaHlCYXNlZE9uUmVnaW9uKEFycmF5TGlzdCBhbGxUeXBlc0luUmVnaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkKIAlpbnQgc2l6ZSA9IGFsbFR5cGVzSW5SZWdpb24uc2l6ZSgpOwogCWlmIChzaXplICE9IDApIHsKQEAgLTk0LDcgKzEwNCw2IEBACiAJCXRyeSB7CiAJCQlJVHlwZSB0eXBlID0gdHlwZXNbaV07CiAJCQl0aGlzLmFkZEluZm9Gcm9tRWxlbWVudCgoT3BlbmFibGUpdHlwZS5nZXRPcGVuYWJsZSgpLCBpbmZvcywgdW5pdHMsIHR5cGUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJd29ya2VkKDEpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7CiAJCQljb250aW51ZSB0eXBlczsKIAkJfQpAQCAtMTE4LDY5ICsxMjcsODEgQEAKIAkJY29tcGlsYXRpb25Vbml0cyA9IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXRbMF07CiAJfQogCi0JLy8gcmVzb2x2ZQotCWlmIChpbmZvc1NpemUgPiAwIHx8IHVuaXRzU2l6ZSA+IDApIHsKLQkJSVR5cGUgZm9jdXNUeXBlID0gdGhpcy5nZXRUeXBlKCk7Ci0JCUNvbXBpbGF0aW9uVW5pdCB1bml0VG9Mb29rSW5zaWRlID0gbnVsbDsKLQkJaWYgKGZvY3VzVHlwZSAhPSBudWxsKSB7Ci0JCQl1bml0VG9Mb29rSW5zaWRlID0gKENvbXBpbGF0aW9uVW5pdClmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCX0KLQkJaWYgKHRoaXMubmFtZUxvb2t1cCAhPSBudWxsICYmIHVuaXRUb0xvb2tJbnNpZGUgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkKHRoaXMubmFtZUxvb2t1cCkgeyAvLyBwcmV2ZW50IDIgY29uY3VycmVudCBhY2Nlc3NlcyB0byBuYW1lIGxvb2t1cCB3aGlsZSB0aGUgd29ya2luZyBjb3BpZXMgYXJlIHNldAotCQkJCXRyeSB7Ci0JCQkJCW5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobmV3IElXb3JraW5nQ29weVtdIHt1bml0VG9Mb29rSW5zaWRlfSk7Ci0JCQkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZShnZW5lcmljVHlwZXMsIGNvbXBpbGF0aW9uVW5pdHMpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobnVsbCk7Ci0JCQkJfQorCXRyeSB7CisJCS8vIHJlc29sdmUKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5iZWdpblRhc2soIiIsIChpbmZvc1NpemUrdW5pdHNTaXplKSAqIDIvKiAxIGZvciBidWlsZCBiaW5kaW5nLCAxIGZvciBjb25uZWN0IGhpZXJhcmNoeSovKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaW5mb3NTaXplID4gMCB8fCB1bml0c1NpemUgPiAwKSB7CisJCQlJVHlwZSBmb2N1c1R5cGUgPSB0aGlzLmdldFR5cGUoKTsKKwkJCUNvbXBpbGF0aW9uVW5pdCB1bml0VG9Mb29rSW5zaWRlID0gbnVsbDsKKwkJCWlmIChmb2N1c1R5cGUgIT0gbnVsbCkgeworCQkJCXVuaXRUb0xvb2tJbnNpZGUgPSAoQ29tcGlsYXRpb25Vbml0KWZvY3VzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZShnZW5lcmljVHlwZXMsIGNvbXBpbGF0aW9uVW5pdHMpOworCQkJaWYgKHRoaXMubmFtZUxvb2t1cCAhPSBudWxsICYmIHVuaXRUb0xvb2tJbnNpZGUgIT0gbnVsbCkgeworCQkJCXN5bmNocm9uaXplZCh0aGlzLm5hbWVMb29rdXApIHsgLy8gcHJldmVudCAyIGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gbmFtZSBsb29rdXAgd2hpbGUgdGhlIHdvcmtpbmcgY29waWVzIGFyZSBzZXQKKwkJCQkJdHJ5IHsKKwkJCQkJCW5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobmV3IElXb3JraW5nQ29weVtdIHt1bml0VG9Mb29rSW5zaWRlfSk7CisJCQkJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnJlc29sdmUoZ2VuZXJpY1R5cGVzLCBjb21waWxhdGlvblVuaXRzLCBtb25pdG9yKTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCW5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobnVsbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIucmVzb2x2ZShnZW5lcmljVHlwZXMsIGNvbXBpbGF0aW9uVW5pdHMsIG1vbml0b3IpOworCQkJfQogCQl9CisJfSBmaW5hbGx5IHsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5kb25lKCk7CiAJfQogfQogCQogCS8qKgogCSAqIFJldHVybnMgYWxsIG9mIHRoZSB0eXBlcyBkZWZpbmVkIGluIHRoZSByZWdpb24gb2YgdGhpcyB0eXBlIGhpZXJhcmNoeS4KIAkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBkZXRlcm1pbmVUeXBlc0luUmVnaW9uKCkgeworCXByaXZhdGUgQXJyYXlMaXN0IGRldGVybWluZVR5cGVzSW5SZWdpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAKLQkJQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUVsZW1lbnRbXSByb290cyA9Ci0JCQkoKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSkgdGhpcy5oaWVyYXJjaHkpLmZSZWdpb24uZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJSmF2YUVsZW1lbnQgcm9vdCA9IHJvb3RzW2ldOwotCQkJCXN3aXRjaCAocm9vdC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJCQlpbmplY3RBbGxUeXBlc0ZvckphdmFQcm9qZWN0KChJSmF2YVByb2plY3QpIHJvb3QsIHR5cGVzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJCQkJaW5qZWN0QWxsVHlwZXNGb3JQYWNrYWdlRnJhZ21lbnRSb290KChJUGFja2FnZUZyYWdtZW50Um9vdCkgcm9vdCwgdHlwZXMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCQkJaW5qZWN0QWxsVHlwZXNGb3JQYWNrYWdlRnJhZ21lbnQoKElQYWNrYWdlRnJhZ21lbnQpIHJvb3QsIHR5cGVzKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKLQkJCQkJCXR5cGVzLmFkZCgoKElDbGFzc0ZpbGUpIHJvb3QpLmdldFR5cGUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQkJCQlJVHlwZVtdIGN1VHlwZXMgPSAoKElDb21waWxhdGlvblVuaXQpIHJvb3QpLmdldEFsbFR5cGVzKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1VHlwZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQl0eXBlcy5hZGQoY3VUeXBlc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQkJCQl0eXBlcy5hZGQocm9vdCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlicmVhazsKKwkJdHJ5IHsKKwkJCUFycmF5TGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCUlKYXZhRWxlbWVudFtdIHJvb3RzID0KKwkJCQkoKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSkgdGhpcy5oaWVyYXJjaHkpLmZSZWdpb24uZ2V0RWxlbWVudHMoKTsKKwkJCWludCBsZW5ndGggPSByb290cy5sZW5ndGg7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSBtb25pdG9yLmJlZ2luVGFzaygiIiwgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPGxlbmd0aDsgaSsrKSB7CisJCQkJdHJ5IHsKKwkJCQkJSUphdmFFbGVtZW50IHJvb3QgPSByb290c1tpXTsKKwkJCQkJc3dpdGNoIChyb290LmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6CisJCQkJCQkJaW5qZWN0QWxsVHlwZXNGb3JKYXZhUHJvamVjdCgoSUphdmFQcm9qZWN0KSByb290LCB0eXBlcyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgorCQkJCQkJCWluamVjdEFsbFR5cGVzRm9yUGFja2FnZUZyYWdtZW50Um9vdCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHJvb3QsIHR5cGVzKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgorCQkJCQkJCWluamVjdEFsbFR5cGVzRm9yUGFja2FnZUZyYWdtZW50KChJUGFja2FnZUZyYWdtZW50KSByb290LCB0eXBlcyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKKwkJCQkJCQl0eXBlcy5hZGQoKChJQ2xhc3NGaWxlKSByb290KS5nZXRUeXBlKCkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6CisJCQkJCQkJSVR5cGVbXSBjdVR5cGVzID0gKChJQ29tcGlsYXRpb25Vbml0KSByb290KS5nZXRBbGxUeXBlcygpOworCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VUeXBlcy5sZW5ndGg7IGorKykgeworCQkJCQkJCQl0eXBlcy5hZGQoY3VUeXBlc1tqXSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6CisJCQkJCQkJdHlwZXMuYWRkKHJvb3QpOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkvLyBqdXN0IGNvbnRpbnVlCiAJCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBqdXN0IGNvbnRpbnVlCisJCQkJd29ya2VkKG1vbml0b3IsIDEpOwogCQkJfQorCQkJcmV0dXJuIHR5cGVzOworCQl9IGZpbmFsbHkgeworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgbW9uaXRvci5kb25lKCk7CiAJCX0KLQkJcmV0dXJuIHR5cGVzOwogCX0KIAkKIAkvKioKQEAgLTI1OCw3ICsyNzksNiBAQAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSsrKSB7CiAJCQkJSUNsYXNzRmlsZSBjZiA9IGNvbnRhaW5lcnNbaV07CiAJCQkJdHlwZXMuYWRkKGNmLmdldFR5cGUoKSk7Ci0JCQkJdGhpcy53b3JrZWQoMSk7CiAJCQl9CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCX0KQEAgLTI3OCw5ICsyOTgsOCBAQAogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VUeXBlcy5sZW5ndGg7IGorKykgewogCQkJCQl0eXBlcy5hZGQoY3VUeXBlc1tqXSk7CiAJCQkJfQotCQkJCXRoaXMud29ya2VkKDEpOwogCQkJfQogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9SZWdpb25CYXNlZFR5cGVIaWVyYXJjaHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9SZWdpb25CYXNlZFR5cGVIaWVyYXJjaHkuamF2YQppbmRleCA5Y2Q2ZGFmLi45ODg0MTVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1JlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVJlZ2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOwpAQCAtNDIsNyArNDMsNyBAQAogICogY29udGFpbiB0aGUgYnJhbmNoIGluY2x1ZGluZyB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgKi8KIHB1YmxpYyBSZWdpb25CYXNlZFR5cGVIaWVyYXJjaHkoSVJlZ2lvbiByZWdpb24sIElKYXZhUHJvamVjdCBwcm9qZWN0LCBJVHlwZSB0eXBlLCBib29sZWFuIGNvbXB1dGVTdWJ0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0Jc3VwZXIodHlwZSwgbnVsbCwgY29tcHV0ZVN1YnR5cGVzKTsKKwlzdXBlcih0eXBlLCAoSUphdmFTZWFyY2hTY29wZSludWxsLCBjb21wdXRlU3VidHlwZXMpOwogCWZSZWdpb24gPSByZWdpb247CiAJZlByb2plY3QgPSBwcm9qZWN0OwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2hpZXJhcmNoeS9UeXBlSGllcmFyY2h5LmphdmEKaW5kZXggZmQzMmViYy4uYzQzZmMxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaGllcmFyY2h5L1R5cGVIaWVyYXJjaHkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9oaWVyYXJjaHkvVHlwZUhpZXJhcmNoeS5qYXZhCkBAIC0xLDE3ICsxLDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMjEsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKQEAgLTM1LDEwICs0MCwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5JbXBvcnRDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuT3BlbmFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUmVnaW9uOwpAQCAtNTAsNiArNTcsMzIgQEAKICAqLwogcHVibGljIGNsYXNzIFR5cGVIaWVyYXJjaHkgaW1wbGVtZW50cyBJVHlwZUhpZXJhcmNoeSwgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCQorCXN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAweDAwMDA7CisJLy8gU0VQQVJBVE9SCisJc3RhdGljIGZpbmFsIGJ5dGUgU0VQQVJBVE9SMSA9ICdcbic7CisJc3RhdGljIGZpbmFsIGJ5dGUgU0VQQVJBVE9SMiA9ICcsJzsKKwlzdGF0aWMgZmluYWwgYnl0ZSBTRVBBUkFUT1IzID0gJz4nOworCXN0YXRpYyBmaW5hbCBieXRlIFNFUEFSQVRPUjQgPSAnXHInOworCS8vIGdlbmVyYWwgaW5mbworCXN0YXRpYyBmaW5hbCBieXRlIENPTVBVVEVfU1VCVFlQRVMgPSAweDAwMDE7CisJCisJLy8gdHlwZSBpbmZvCisJc3RhdGljIGZpbmFsIGJ5dGUgQ0xBU1MgPSAweDAwMDA7CisJc3RhdGljIGZpbmFsIGJ5dGUgSU5URVJGQUNFID0gMHgwMDAxOworCXN0YXRpYyBmaW5hbCBieXRlIENPTVBVVEVEX0ZPUiA9IDB4MDAwMjsKKwlzdGF0aWMgZmluYWwgYnl0ZSBST09UID0gMHgwMDA0OworCisJLy8gY3N0CisJc3RhdGljIGZpbmFsIGJ5dGVbXSBOT19GTEFHUyA9IG5ldyBieXRlW117fTsKKwlzdGF0aWMgZmluYWwgaW50IFNJWkUgPSAxMDsKKwkKKwkvKioKKwkgKiBUaGUgSmF2YSBQcm9qZWN0IGluIHdoaWNoIHRoZSBoaWVyYXJjaHkgaXMgYmVpbmcgYnVpbHQgLSB0aGlzCisJICogcHJvdmlkZXMgdGhlIGNvbnRleHQgKGkuZS4gY2xhc3NwYXRoIGFuZCBuYW1lbG9va3VwIHJ1bGVzKQorCSAqIFBvc3NpYmx5IG51bGwuCisJICovCisJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBwcm9qZWN0OwogCS8qKgogCSAqIFRoZSB0eXBlIHRoZSBoaWVyYXJjaHkgd2FzIHNwZWNpZmljYWxseSBjb21wdXRlZCBmb3IsCiAJICogcG9zc2libHkgbnVsbC4KQEAgLTEyNSw2ICsxNTgsMTggQEAKIAlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOwogCiAvKioKKyAqIENyZWF0ZXMgYW4gZW1wdHkgVHlwZUhpZXJhcmNoeQorICovCitwdWJsaWMgVHlwZUhpZXJhcmNoeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworfQorLyoqCisgKiBDcmVhdGVzIGEgVHlwZUhpZXJhcmNoeSBvbiB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworcHVibGljIFR5cGVIaWVyYXJjaHkoSVR5cGUgdHlwZSwgSUphdmFQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwl0aGlzKHR5cGUsIFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtwcm9qZWN0fSksIGNvbXB1dGVTdWJ0eXBlcyk7CisJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKK30KKy8qKgogICogQ3JlYXRlcyBhIFR5cGVIaWVyYXJjaHkgb24gdGhlIGdpdmVuIHR5cGUuCiAgKi8KIHB1YmxpYyBUeXBlSGllcmFyY2h5KElUeXBlIHR5cGUsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGJvb2xlYW4gY29tcHV0ZVN1YnR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTIxNiw2ICsyNjEsMTMgQEAKIAkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKIAl9CiB9Citwcml2YXRlIHN0YXRpYyBJbnRlZ2VyIGJ5dGVzVG9GbGFncyhieXRlW10gYnl0ZXMpeworCWlmKGJ5dGVzICE9IG51bGwgJiYgYnl0ZXMubGVuZ3RoID4gMCkgeworCQlyZXR1cm4gbmV3IEludGVnZXIobmV3IFN0cmluZyhieXRlcykpOworCX0gZWxzZSB7CisJCXJldHVybiBudWxsOworCX0KK30KIC8qKgogICogY2FjaGVGbGFncy4KICAqLwpAQCAtMzgyLDYgKzQzNCwxMyBAQAogCQl9CiAJfQogfQorcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGZsYWdzVG9CeXRlcyhJbnRlZ2VyIGZsYWdzKXsKKwlpZihmbGFncyAhPSBudWxsKSB7CisJCXJldHVybiBmbGFncy50b1N0cmluZygpLmdldEJ5dGVzKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5PX0ZMQUdTOworCX0KK30KIC8qKgogICogQHNlZSBJVHlwZUhpZXJhcmNoeQogICovCkBAIC01MjQsNyArNTgzLDcgQEAKICAqLwogcHVibGljIElUeXBlW10gZ2V0RXh0ZW5kaW5nSW50ZXJmYWNlcyhJVHlwZSB0eXBlKSB7CiAJdHJ5IHsKLQkJaWYgKHR5cGUuaXNDbGFzcygpKSB7CisJCWlmICghdGhpcy5pc0ludGVyZmFjZSh0eXBlKSkgewogCQkJcmV0dXJuIG5ldyBJVHlwZVtdIHt9OwogCQl9CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpAQCAtNTQyLDcgKzYwMSw3IEBACiAJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CiAJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGl0ZXIubmV4dCgpOwogCQl0cnkgewotCQkJaWYgKHR5cGUuaXNDbGFzcygpKSB7CisJCQlpZiAoIXRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpAQCAtNTY3LDcgKzYyNiw3IEBACiAgKi8KIHB1YmxpYyBJVHlwZVtdIGdldEltcGxlbWVudGluZ0NsYXNzZXMoSVR5cGUgdHlwZSkgewogCXRyeSB7Ci0JCWlmICh0eXBlLmlzQ2xhc3MoKSkgeworCQlpZiAoIXRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKIAkJCXJldHVybiBOT19UWVBFOwogCQl9CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpAQCAtNTg2LDcgKzY0NSw3IEBACiAJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CiAJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGl0ZXIubmV4dCgpOwogCQl0cnkgewotCQkJaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgeworCQkJaWYgKHRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpAQCAtNjM0LDcgKzY5Myw3IEBACiAgKi8KIHB1YmxpYyBJVHlwZVtdIGdldFN1YmNsYXNzZXMoSVR5cGUgdHlwZSkgewogCXRyeSB7Ci0JCWlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKKwkJaWYgKHRoaXMuaXNJbnRlcmZhY2UodHlwZSkpIHsKIAkJCXJldHVybiBOT19UWVBFOwogCQl9CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewpAQCAtNjY3LDcgKzcyNiw3IEBACiAgKi8KIHB1YmxpYyBJVHlwZSBnZXRTdXBlcmNsYXNzKElUeXBlIHR5cGUpIHsKIAl0cnkgewotCQlpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7CisJCWlmICh0aGlzLmlzSW50ZXJmYWNlKHR5cGUpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlyZXR1cm4gKElUeXBlKSB0aGlzLmNsYXNzVG9TdXBlcmNsYXNzLmdldCh0eXBlKTsKQEAgLTg3Nyw3ICs5MzYsNyBAQAogCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9ICgoSmF2YVByb2plY3QpdGhpcy5qYXZhUHJvamVjdCgpKS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewogCQkJCQlpZiAoY2xhc3NwYXRoW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCAKLQkJCQkJCQkmJiBjbGFzc3BhdGhbaV0uZ2V0UGF0aCgpLmVxdWFscyhlbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCQkJJiYgY2xhc3NwYXRoW2ldLmdldFBhdGgoKS5lcXVhbHMoZWxlbWVudC5nZXRQYXRoKCkpKSB7CiAJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJfQogCQkJCX0KQEAgLTEwOTEsMTIgKzExNTAsMTc3IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0gCitwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmZhY2UoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJaW50IGZsYWdzID0gdGhpcy5nZXRDYWNoZWRGbGFncyh0eXBlKTsKKwlpZiAoZmxhZ3MgPT0gLTEpIHsKKwkJcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gRmxhZ3MuaXNJbnRlcmZhY2UoZmxhZ3MpOworCX0KK30KIC8qKgogICogUmV0dXJucyB0aGUgamF2YSBwcm9qZWN0IHRoaXMgaGllcmFyY2h5IHdhcyBjcmVhdGVkIGluLgogICovCiBwdWJsaWMgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KCkgewogCXJldHVybiB0aGlzLnR5cGUuZ2V0SmF2YVByb2plY3QoKTsKIH0KK3Byb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHJlYWRVbnRpbChJbnB1dFN0cmVhbSBpbnB1dCwgYnl0ZSBzZXBhcmF0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIElPRXhjZXB0aW9ueworCXJldHVybiByZWFkVW50aWwoaW5wdXQsIHNlcGFyYXRvciwgMCk7Cit9Citwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSByZWFkVW50aWwoSW5wdXRTdHJlYW0gaW5wdXQsIGJ5dGUgc2VwYXJhdG9yLCBpbnQgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbnsKKwlpbnQgbGVuZ3RoID0gMDsKKwlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtTSVpFXTsKKwlieXRlIGI7CisJd2hpbGUoKGIgPSAoYnl0ZSlpbnB1dC5yZWFkKCkpICE9IHNlcGFyYXRvciAmJiBiICE9IC0xKSB7CisJCWlmKGJ5dGVzLmxlbmd0aCA9PSBsZW5ndGgpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoKjJdLCAwLCBsZW5ndGgpOzsKKwkJfQorCQlieXRlc1tsZW5ndGgrK109KGJ5dGUpYjsKKwl9CisJaWYoYiA9PSAtMSkgeworCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBKYXZhTW9kZWxTdGF0dXMoSUphdmFNb2RlbFN0YXR1cy5FUlJPUikpOworCX0KKwlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBieXRlcyA9IG5ldyBieXRlW2xlbmd0aCArIG9mZnNldF0sIG9mZnNldCwgbGVuZ3RoKTsKKwlyZXR1cm4gYnl0ZXM7Cit9CitwdWJsaWMgc3RhdGljIElUeXBlSGllcmFyY2h5IGxvYWQoSVR5cGUgdHlwZSwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXRyeSB7CisJCVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IG5ldyBUeXBlSGllcmFyY2h5KCk7CisJCXR5cGVIaWVyYXJjaHkuaW5pdGlhbGl6ZSgxKTsKKwkJCisJCUlUeXBlW10gdHlwZXMgPSBuZXcgSVR5cGVbU0laRV07CisJCWludCB0eXBlQ291bnQgPSAwOworCQkKKwkJYnl0ZSB2ZXJzaW9uID0gKGJ5dGUpaW5wdXQucmVhZCgpOworCQorCQlpZih2ZXJzaW9uICE9IFZFUlNJT04pIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzLkVSUk9SKSk7CisJCX0KKwkJYnl0ZSBnZW5lcmFsSW5mbyA9IChieXRlKWlucHV0LnJlYWQoKTsKKwkJaWYoKGdlbmVyYWxJbmZvICYgQ09NUFVURV9TVUJUWVBFUykgIT0gMCkgeworCQkJdHlwZUhpZXJhcmNoeS5jb21wdXRlU3VidHlwZXMgPSB0cnVlOworCQl9CisJCQorCQlieXRlIGI7CisJCWJ5dGVbXSBieXRlczsKKwkJCisJCS8vIHJlYWQgcHJvamVjdAorCQlieXRlcyA9IHJlYWRVbnRpbChpbnB1dCwgU0VQQVJBVE9SMSk7CisJCWlmKGJ5dGVzLmxlbmd0aCA+IDApIHsKKwkJCXR5cGVIaWVyYXJjaHkucHJvamVjdCA9IChJSmF2YVByb2plY3QpSmF2YUNvcmUuY3JlYXRlKG5ldyBTdHJpbmcoYnl0ZXMpKTsKKwkJCXR5cGVIaWVyYXJjaHkuc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZUhpZXJhcmNoeS5wcm9qZWN0fSk7CisJCX0gZWxzZSB7CisJCQl0eXBlSGllcmFyY2h5LnByb2plY3QgPSBudWxsOworCQkJdHlwZUhpZXJhcmNoeS5zY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpOworCQl9CisJCQorCQkvLyByZWFkIG1pc3NpbmcgdHlwZQorCQl7CisJCQlieXRlcyA9IHJlYWRVbnRpbChpbnB1dCwgU0VQQVJBVE9SMSk7CisJCQlieXRlW10gbWlzc2luZzsKKwkJCWludCBqID0gMDsKKwkJCWludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJYiA9IGJ5dGVzW2ldOworCQkJCWlmKGIgPT0gU0VQQVJBVE9SMikgeworCQkJCQltaXNzaW5nID0gbmV3IGJ5dGVbaSAtIGpdOworCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBqLCBtaXNzaW5nLCAwLCBpIC0gaik7CisJCQkJCXR5cGVIaWVyYXJjaHkubWlzc2luZ1R5cGVzLmFkZChuZXcgU3RyaW5nKG1pc3NpbmcpKTsKKwkJCQkJaiA9IGkgKyAxOworCQkJCX0KKwkJCX0KKwkJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIGosIG1pc3NpbmcgPSBuZXcgYnl0ZVtsZW5ndGggLSBqXSwgMCwgbGVuZ3RoIC0gaik7CisJCQl0eXBlSGllcmFyY2h5Lm1pc3NpbmdUeXBlcy5hZGQobmV3IFN0cmluZyhtaXNzaW5nKSk7CisJCX0KKworCQkvLyByZWFkIHR5cGVzCisJCXdoaWxlKChiID0gKGJ5dGUpaW5wdXQucmVhZCgpKSAhPSBTRVBBUkFUT1IxICYmIGIgIT0gLTEpIHsKKwkJCWJ5dGVzID0gcmVhZFVudGlsKGlucHV0LCBTRVBBUkFUT1I0LCAxKTsKKwkJCWJ5dGVzWzBdID0gYjsKKwkJCUlUeXBlIGVsZW1lbnQgPSAoSVR5cGUpSmF2YUNvcmUuY3JlYXRlKG5ldyBTdHJpbmcoYnl0ZXMpKTsKKwkJCQorCQkJaWYodHlwZXMubGVuZ3RoID09IHR5cGVDb3VudCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIHR5cGVzID0gbmV3IElUeXBlW3R5cGVDb3VudCAqIDJdLCAwLCB0eXBlQ291bnQpOworCQkJfQorCQkJdHlwZXNbdHlwZUNvdW50KytdID0gZWxlbWVudDsKKwkJCQorCQkJLy8gcmVhZCBmbGFncworCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjQpOworCQkJSW50ZWdlciBmbGFncyA9IGJ5dGVzVG9GbGFncyhieXRlcyk7CisJCQlpZihmbGFncyAhPSBudWxsKSB7CisJCQkJdHlwZUhpZXJhcmNoeS5jYWNoZUZsYWdzKGVsZW1lbnQsIGZsYWdzLmludFZhbHVlKCkpOworCQkJfQorCQkJCisJCQkvLyByZWFkIGluZm8KKwkJCWJ5dGUgaW5mbyA9IChieXRlKWlucHV0LnJlYWQoKTsKKwkJCQorCQkJaWYoKGluZm8gJiBJTlRFUkZBQ0UpICE9IDApIHsKKwkJCQl0eXBlSGllcmFyY2h5LmFkZEludGVyZmFjZShlbGVtZW50KTsKKwkJCX0KKwkJCWlmKChpbmZvICYgQ09NUFVURURfRk9SKSAhPSAwKSB7CisJCQkJaWYoIWVsZW1lbnQuZXF1YWxzKHR5cGUpKSB7CisJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzLkVSUk9SKSk7IAorCQkJCX0KKwkJCQl0eXBlSGllcmFyY2h5LnR5cGUgPSBlbGVtZW50OworCQkJfQorCQkJaWYoKGluZm8gJiBST09UKSAhPSAwKSB7CisJCQkJdHlwZUhpZXJhcmNoeS5hZGRSb290Q2xhc3MoZWxlbWVudCk7CisJCQl9CisJCX0KKwkJCisJCS8vIHJlYWQgc3VwZXIgY2xhc3MKKwkJd2hpbGUoKGIgPSAoYnl0ZSlpbnB1dC5yZWFkKCkpICE9IFNFUEFSQVRPUjEgJiYgYiAhPSAtMSkgeworCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjMsIDEpOworCQkJYnl0ZXNbMF0gPSBiOworCQkJaW50IHN1YkNsYXNzID0gbmV3IEludGVnZXIobmV3IFN0cmluZyhieXRlcykpLmludFZhbHVlKCk7CisJCQkKKwkJCS8vIHJlYWQgc3VwZXIgdHlwZQorCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjEpOworCQkJaW50IHN1cGVyQ2xhc3MgPSBuZXcgSW50ZWdlcihuZXcgU3RyaW5nKGJ5dGVzKSkuaW50VmFsdWUoKTsKKwkJCQorCQkJdHlwZUhpZXJhcmNoeS5jYWNoZVN1cGVyY2xhc3MoCisJCQkJdHlwZXNbc3ViQ2xhc3NdLAorCQkJCXR5cGVzW3N1cGVyQ2xhc3NdKTsKKwkJfQorCQkKKwkJLy8gcmVhZCBzdXBlciBpbnRlcmZhY2UKKwkJd2hpbGUoKGIgPSAoYnl0ZSlpbnB1dC5yZWFkKCkpICE9IFNFUEFSQVRPUjEgJiYgYiAhPSAtMSkgeworCQkJYnl0ZXMgPSByZWFkVW50aWwoaW5wdXQsIFNFUEFSQVRPUjMsIDEpOworCQkJYnl0ZXNbMF0gPSBiOworCQkJaW50IHN1YkNsYXNzID0gbmV3IEludGVnZXIobmV3IFN0cmluZyhieXRlcykpLmludFZhbHVlKCk7CisJCQkKKwkJCS8vIHJlYWQgc3VwZXIgaW50ZXJmYWNlCisJCQlieXRlcyA9IHJlYWRVbnRpbChpbnB1dCwgU0VQQVJBVE9SMSk7CisJCQlJVHlwZVtdIHN1cGVySW50ZXJmYWNlcyA9IG5ldyBJVHlwZVsoYnl0ZXMubGVuZ3RoIC8gMikgKyAxXTsKKwkJCWludCBpbnRlcmZhY2VDb3VudCA9IDA7CisJCQkKKwkJCWludCBqID0gMDsKKwkJCWJ5dGVbXSBiMjsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZihieXRlc1tpXSA9PSBTRVBBUkFUT1IyKXsKKwkJCQkJYjIgPSBuZXcgYnl0ZVtpIC0gal07CisJCQkJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIGosIGIyLCAwLCBpIC0gaik7CisJCQkJCWogPSBpICsgMTsKKwkJCQkJc3VwZXJJbnRlcmZhY2VzW2ludGVyZmFjZUNvdW50KytdID0gdHlwZXNbbmV3IEludGVnZXIobmV3IFN0cmluZyhiMikpLmludFZhbHVlKCldOworCQkJCX0KKwkJCX0KKwkJCWIyID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoIC0gal07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBqLCBiMiwgMCwgYnl0ZXMubGVuZ3RoIC0gaik7CisJCQlzdXBlckludGVyZmFjZXNbaW50ZXJmYWNlQ291bnQrK10gPSB0eXBlc1tuZXcgSW50ZWdlcihuZXcgU3RyaW5nKGIyKSkuaW50VmFsdWUoKV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVySW50ZXJmYWNlcywgMCwgc3VwZXJJbnRlcmZhY2VzID0gbmV3IElUeXBlW2ludGVyZmFjZUNvdW50XSwgMCwgaW50ZXJmYWNlQ291bnQpOworCQkJCisJCQl0eXBlSGllcmFyY2h5LmNhY2hlU3VwZXJJbnRlcmZhY2VzKAorCQkJCXR5cGVzW3N1YkNsYXNzXSwKKwkJCQlzdXBlckludGVyZmFjZXMpOworCQl9CisJCWlmKGIgPT0gLTEpIHsKKwkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cyhJSmF2YU1vZGVsU3RhdHVzLkVSUk9SKSk7CisJCX0KKwkJcmV0dXJuIHR5cGVIaWVyYXJjaHk7CisJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJfQorfQogLyoqCiAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuIGVxdWl2YWxlbnQgcGFja2FnZSBmcmFnbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZQogICogcmVnaW9uLiBQYWNrYWdlIGZyYWdtZW50cyBhcmUgZXF1aXZhbGVudCBpZiB0aGV5IGJvdGggaGF2ZSB0aGUgc2FtZSBuYW1lLgpAQCAtMTEyMyw3ICsxMzQ3LDExIEBACiAJCX0KIAkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImhpZXJhcmNoeS5jcmVhdGluZyIpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCisJCQlpZiAodGhpcy50eXBlICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmJlZ2luVGFzayhVdGlsLmJpbmQoImhpZXJhcmNoeS5jcmVhdGluZ09uVHlwZSIsIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpLCAxMDApOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCW1vbml0b3IuYmVnaW5UYXNrKFV0aWwuYmluZCgiaGllcmFyY2h5LmNyZWF0aW5nIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KIAkJfQogCQlsb25nIHN0YXJ0ID0gLTE7CiAJCWlmIChERUJVRykgewpAQCAtMTE0MiwxMCArMTM3MCw2IEBACiAJCQlhY3RpdmF0ZSgpOwogCQkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CiAJCX0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBudWxsOwogCQlpZiAoREVCVUcpIHsKIAkJCWlmICh0aGlzLmNvbXB1dGVTdWJ0eXBlcykgewogCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ1JFQVRFRCBUWVBFIEhJRVJBUkNIWSBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTE2Miw2ICsxMzg2LDExIEBACiAJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oZSk7CiAJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7CiAJCXJlZnJlc2hDYW5jZWxsZWQob2NlKTsKKwl9IGZpbmFsbHkgeworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQltb25pdG9yLmRvbmUoKTsKKwkJfQorCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG51bGw7CiAJfQogfQogLyoqCkBAIC0xMTg3LDYgKzE0MTYsMTQwIEBACiAJfQogfQogLyoqCisgKiBAc2VlIElUeXBlSGllcmFyY2h5CisgKi8KK3B1YmxpYyB2b2lkIHN0b3JlKE91dHB1dFN0cmVhbSBvdXRwdXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJdHJ5IHsKKwkJLy8gY29tcHV0ZSB0eXBlcyBpbiBoaWVyYXJjaHkKKwkJSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKwkJSGFzaHRhYmxlIGhhc2h0YWJsZTIgPSBuZXcgSGFzaHRhYmxlKCk7CisJCWludCBjb3VudCA9IDA7CisJCQorCQlpZih0eXBlICE9IG51bGwpIHsKKwkJCUludGVnZXIgaW5kZXggPSBuZXcgSW50ZWdlcihjb3VudCsrKTsKKwkJCWhhc2h0YWJsZS5wdXQodHlwZSwgaW5kZXgpOworCQkJaGFzaHRhYmxlMi5wdXQoaW5kZXgsIHR5cGUpOworCQl9CisJCU9iamVjdFtdIHR5cGVzID0gY2xhc3NUb1N1cGVyY2xhc3Mua2V5U2V0KCkudG9BcnJheSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlPYmplY3QgdCA9IHR5cGVzW2ldOworCQkJaWYoaGFzaHRhYmxlLmdldCh0KSA9PSBudWxsKSB7CisJCQkJSW50ZWdlciBpbmRleCA9IG5ldyBJbnRlZ2VyKGNvdW50KyspOworCQkJCWhhc2h0YWJsZS5wdXQodCwgaW5kZXgpOworCQkJCWhhc2h0YWJsZTIucHV0KGluZGV4LCB0KTsKKwkJCX0KKwkJCU9iamVjdCBzdXBlckNsYXNzID0gY2xhc3NUb1N1cGVyY2xhc3MuZ2V0KHQpOworCQkJaWYoc3VwZXJDbGFzcyAhPSBudWxsICYmIGhhc2h0YWJsZS5nZXQoc3VwZXJDbGFzcykgPT0gbnVsbCkgeworCQkJCUludGVnZXIgaW5kZXggPSBuZXcgSW50ZWdlcihjb3VudCsrKTsKKwkJCQloYXNodGFibGUucHV0KHN1cGVyQ2xhc3MsIGluZGV4KTsKKwkJCQloYXNodGFibGUyLnB1dChpbmRleCwgc3VwZXJDbGFzcyk7CisJCQl9CisJCX0KKwkJdHlwZXMgPSB0eXBlVG9TdXBlckludGVyZmFjZXMua2V5U2V0KCkudG9BcnJheSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlPYmplY3QgdCA9IHR5cGVzW2ldOworCQkJaWYoaGFzaHRhYmxlLmdldCh0KSA9PSBudWxsKSB7CisJCQkJSW50ZWdlciBpbmRleCA9IG5ldyBJbnRlZ2VyKGNvdW50KyspOworCQkJCWhhc2h0YWJsZS5wdXQodCwgaW5kZXgpOworCQkJCWhhc2h0YWJsZTIucHV0KGluZGV4LCB0KTsKKwkJCX0KKwkJCU9iamVjdFtdIHNwID0gKE9iamVjdFtdKXR5cGVUb1N1cGVySW50ZXJmYWNlcy5nZXQodCk7CisJCQlpZihzcCAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzcC5sZW5ndGg7IGorKykgeworCQkJCQlPYmplY3Qgc3VwZXJJbnRlcmZhY2UgPSBzcFtqXTsKKwkJCQkJaWYoc3Bbal0gIT0gbnVsbCAmJiBoYXNodGFibGUuZ2V0KHN1cGVySW50ZXJmYWNlKSA9PSBudWxsKSB7CisJCQkJCQlJbnRlZ2VyIGluZGV4ID0gbmV3IEludGVnZXIoY291bnQrKyk7CisJCQkJCQloYXNodGFibGUucHV0KHN1cGVySW50ZXJmYWNlLCBpbmRleCk7CisJCQkJCQloYXNodGFibGUyLnB1dChpbmRleCwgc3VwZXJJbnRlcmZhY2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIHNhdmUgdmVyc2lvbiBvZiB0aGUgaGllcmFyY2h5IGZvcm1hdAorCQlvdXRwdXQud3JpdGUoVkVSU0lPTik7CisJCQorCQkvLyBzYXZlIGdlbmVyYWwgaW5mbworCQlieXRlIGdlbmVyYWxJbmZvID0gMDsKKwkJaWYoY29tcHV0ZVN1YnR5cGVzKSB7CisJCQlnZW5lcmFsSW5mbyB8PSBDT01QVVRFX1NVQlRZUEVTOworCQl9CisJCW91dHB1dC53cml0ZShnZW5lcmFsSW5mbyk7CisJCQorCQkvLyBzYXZlIHByb2plY3QKKwkJaWYocHJvamVjdCAhPSBudWxsKSB7CisJCQlvdXRwdXQud3JpdGUocHJvamVjdC5nZXRIYW5kbGVJZGVudGlmaWVyKCkuZ2V0Qnl0ZXMoKSk7CisJCX0KKwkJb3V0cHV0LndyaXRlKFNFUEFSQVRPUjEpOworCQkKKwkJLy8gc2F2ZSBtaXNzaW5nIHR5cGVzCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ1R5cGVzLnNpemUoKTsgaSsrKSB7CisJCQlpZihpICE9IDApIHsKKwkJCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMik7CisJCQl9CisJCQlvdXRwdXQud3JpdGUoKChTdHJpbmcpbWlzc2luZ1R5cGVzLmdldChpKSkuZ2V0Qnl0ZXMoKSk7CisJCQkKKwkJfQorCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMSk7CisJCQorCQkvLyBzYXZlIHR5cGVzCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQgOyBpKyspIHsKKwkJCUlUeXBlIHQgPSAoSVR5cGUpaGFzaHRhYmxlMi5nZXQobmV3IEludGVnZXIoaSkpOworCQkJCisJCQkvLyBuIGJ5dGVzCisJCQlvdXRwdXQud3JpdGUodC5nZXRIYW5kbGVJZGVudGlmaWVyKCkuZ2V0Qnl0ZXMoKSk7CisJCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SNCk7CisJCQlvdXRwdXQud3JpdGUoZmxhZ3NUb0J5dGVzKChJbnRlZ2VyKXR5cGVGbGFncy5nZXQodCkpKTsKKwkJCW91dHB1dC53cml0ZShTRVBBUkFUT1I0KTsKKwkJCWJ5dGUgaW5mbyA9IENMQVNTOworCQkJaWYodHlwZSAhPSBudWxsICYmIHR5cGUuZXF1YWxzKHQpKSB7CisJCQkJaW5mbyB8PSBDT01QVVRFRF9GT1I7CisJCQl9CisJCQlpZihpbnRlcmZhY2VzLmNvbnRhaW5zKHQpKSB7CisJCQkJaW5mbyB8PSBJTlRFUkZBQ0U7CisJCQl9CisJCQlpZihyb290Q2xhc3Nlcy5jb250YWlucyh0KSkgeworCQkJCWluZm8gfD0gUk9PVDsKKwkJCX0KKwkJCW91dHB1dC53cml0ZShpbmZvKTsKKwkJfQorCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMSk7CisJCQorCQkvLyBzYXZlIHN1cGVyY2xhc3NlcworCQl0eXBlcyA9IGNsYXNzVG9TdXBlcmNsYXNzLmtleVNldCgpLnRvQXJyYXkoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworCQkJSUphdmFFbGVtZW50IGtleSA9IChJSmF2YUVsZW1lbnQpdHlwZXNbaV07CisJCQlJSmF2YUVsZW1lbnQgdmFsdWUgPSAoSUphdmFFbGVtZW50KWNsYXNzVG9TdXBlcmNsYXNzLmdldChrZXkpOworCQkJCisJCQlvdXRwdXQud3JpdGUoKChJbnRlZ2VyKWhhc2h0YWJsZS5nZXQoa2V5KSkudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKwkJCW91dHB1dC53cml0ZSgnPicpOworCQkJb3V0cHV0LndyaXRlKCgoSW50ZWdlciloYXNodGFibGUuZ2V0KHZhbHVlKSkudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKwkJCW91dHB1dC53cml0ZShTRVBBUkFUT1IxKTsKKwkJfQorCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMSk7CisJCQorCQkvLyBzYXZlIHN1cGVyaW50ZXJmYWNlcworCQl0eXBlcyA9IHR5cGVUb1N1cGVySW50ZXJmYWNlcy5rZXlTZXQoKS50b0FycmF5KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlKYXZhRWxlbWVudCBrZXkgPSAoSUphdmFFbGVtZW50KXR5cGVzW2ldOworCQkJSUphdmFFbGVtZW50W10gdmFsdWVzID0gKElKYXZhRWxlbWVudFtdKXR5cGVUb1N1cGVySW50ZXJmYWNlcy5nZXQoa2V5KTsKKwkJCQorCQkJaWYodmFsdWVzLmxlbmd0aCA+IDApIHsKKwkJCQlvdXRwdXQud3JpdGUoKChJbnRlZ2VyKWhhc2h0YWJsZS5nZXQoa2V5KSkudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKwkJCQlvdXRwdXQud3JpdGUoU0VQQVJBVE9SMyk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJSUphdmFFbGVtZW50IHZhbHVlID0gdmFsdWVzW2pdOworCQkJCQlpZihqICE9IDApIG91dHB1dC53cml0ZShTRVBBUkFUT1IyKTsKKwkJCQkJb3V0cHV0LndyaXRlKCgoSW50ZWdlciloYXNodGFibGUuZ2V0KHZhbHVlKSkudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKwkJCQl9CisJCQkJb3V0cHV0LndyaXRlKFNFUEFSQVRPUjEpOworCQkJfQorCQl9CisJCW91dHB1dC53cml0ZShTRVBBUkFUT1IxKTsKKwl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklPX0VYQ0VQVElPTik7CisJfQorfQorLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNpbXBsZSBuYW1lIG9mIGEgc3VwZXJ0eXBlIG9mIHRoZSBnaXZlbiB0eXBlIGlzIAogICogdGhlIHNpbXBsZSBuYW1lIG9mIG9uZSBvZiB0aGUgc3VidHlwZXMgaW4gdGhpcyBoaWVyYXJjaHkgb3IgdGhlCiAgKiBzaW1wbGUgbmFtZSBvZiB0aGlzIHR5cGUuCkBAIC0xMjYwLDYgKzE2MjMsOSBAQAogCQkJCUlUeXBlIHR5cGUgPSByb290c1tpXTsKIAkJCQl0b1N0cmluZyhidWZmZXIsIHR5cGUsIDEsIGZhbHNlKTsKIAkJCX0KKwkJfSBlbHNlIGlmICh0aGlzLnJvb3RDbGFzc2VzLnNpemUgPT0gMCkgeworCQkJLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjkxCisJCQlidWZmZXIuYXBwZW5kKCJObyByb290IGNsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfSBlbHNlIHsKIAkJYnVmZmVyLmFwcGVuZCgiKEhpZXJhcmNoeSBiZWNhbWUgc3RhbGUpIik7IC8vJE5PTi1OTFMtMSQKQEAgLTEzMDgsNSArMTY3NCw0IEBACiAJCWNoZWNrQ2FuY2VsZWQoKTsKIAl9CiB9Ci0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQWJzdHJhY3RET01CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0Fic3RyYWN0RE9NQnVpbGRlci5qYXZhCmluZGV4IDU2ZTZiOTkuLmIzZmJiYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQWJzdHJhY3RET01CdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9BYnN0cmFjdERPTUJ1aWxkZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CiAKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CkBAIC0xMTYsNyArMTE2LDcgQEAKIC8qKgogICogRG9lcyBub3RoaW5nLgogICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHt9CitwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHt9IC8vVE9ETzogKG9saXZpZXIpIHVudXNlZD8KIC8qKgogICogQWRkcyB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgY3VycmVudCBlbmNsb3Npbmcgc2NvcGUsIGJ1aWxkaW5nIHRoZSBKRE9NCiAgKiB0cmVlLiBOb2RlcyBhcmUgb25seSBhZGRlZCB0byBhbiBlbmNsb3Npbmcgc2NvcGUgd2hlbiBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgdHlwZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vQ29tcGlsYXRpb25Vbml0LmphdmEKaW5kZXggNzA1ODc1ZS4uMjI1ODc0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9Db21waWxhdGlvblVuaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01CdWlsZGVyLmphdmEKaW5kZXggNjdhY2Q2MS4uZDUzMDU0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01CdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01CdWlsZGVyLmphdmEKQEAgLTEsMjcgKzEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5qZG9tLklET01QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Eb2N1bWVudEVsZW1lbnRQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklEb2N1bWVudEVsZW1lbnRSZXF1ZXN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwpAQCAtNTYsNiArNTAsNyBAQAogCSAqLwogCXByb3RlY3RlZCBBcnJheUxpc3QgZkZpZWxkczsKIAorCU1hcCBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwogCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgRE9NQnVpbGRlcgpAQCAtMTU0LDcgKzE0OSw3IEBACiAgKi8KIHB1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewogCWluaXRpYWxpemVCdWlsZChjb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCWdldFBhcnNlcigpLnBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCk7CisJZ2V0UGFyc2VyKG9wdGlvbnMpLnBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdCk7CiAJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXQpOwogfQogLyoqCkBAIC0xNjIsNyArMTU3LDcgQEAKICAqLwogcHVibGljIElET01GaWVsZCBjcmVhdGVGaWVsZChjaGFyW10gc291cmNlQ29kZSkgewogCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWdldFBhcnNlcigpLnBhcnNlRmllbGQoc291cmNlQ29kZSk7CisJZ2V0UGFyc2VyKG9wdGlvbnMpLnBhcnNlRmllbGQoc291cmNlQ29kZSk7CiAJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTE4MSw3ICsxNzYsNyBAQAogcHVibGljIElET01GaWVsZFtdIGNyZWF0ZUZpZWxkcyhjaGFyW10gc291cmNlQ29kZSkgewogCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKIAlmRmllbGRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JZ2V0UGFyc2VyKCkucGFyc2VGaWVsZChzb3VyY2VDb2RlKTsKKwlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VGaWVsZChzb3VyY2VDb2RlKTsKIAlpZiAoZkFib3J0KSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTIwOSw3ICsyMDQsNyBAQAogICovCiBwdWJsaWMgSURPTUltcG9ydCBjcmVhdGVJbXBvcnQoY2hhcltdIHNvdXJjZUNvZGUpIHsKIAlpbml0aWFsaXplQnVpbGQoc291cmNlQ29kZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlnZXRQYXJzZXIoKS5wYXJzZUltcG9ydChzb3VyY2VDb2RlKTsKKwlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VJbXBvcnQoc291cmNlQ29kZSk7CiAJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTIyMyw3ICsyMTgsNyBAQAogICovCiBwdWJsaWMgSURPTUluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKGNoYXJbXSBzb3VyY2VDb2RlKSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JZ2V0UGFyc2VyKCkucGFyc2VJbml0aWFsaXplcihzb3VyY2VDb2RlKTsKKwlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VJbml0aWFsaXplcihzb3VyY2VDb2RlKTsKIAlpZiAoZkFib3J0IHx8IGZOb2RlID09IG51bGwgfHwgIShmTm9kZSBpbnN0YW5jZW9mIElET01Jbml0aWFsaXplcikpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMjM1LDcgKzIzMCw3IEBACiAgKi8KIHB1YmxpYyBJRE9NTWV0aG9kIGNyZWF0ZU1ldGhvZChjaGFyW10gc291cmNlQ29kZSkgewogCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWdldFBhcnNlcigpLnBhcnNlTWV0aG9kKHNvdXJjZUNvZGUpOworCWdldFBhcnNlcihvcHRpb25zKS5wYXJzZU1ldGhvZChzb3VyY2VDb2RlKTsKIAlpZiAoZkFib3J0IHx8IGZOb2RlID09IG51bGwpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMjUzLDcgKzI0OCw3IEBACiAgKi8KIHB1YmxpYyBJRE9NUGFja2FnZSBjcmVhdGVQYWNrYWdlKGNoYXJbXSBzb3VyY2VDb2RlKSB7CiAJaW5pdGlhbGl6ZUJ1aWxkKHNvdXJjZUNvZGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JZ2V0UGFyc2VyKCkucGFyc2VQYWNrYWdlKHNvdXJjZUNvZGUpOworCWdldFBhcnNlcihvcHRpb25zKS5wYXJzZVBhY2thZ2Uoc291cmNlQ29kZSk7CiAJaWYgKGZBYm9ydCB8fCBmTm9kZSA9PSBudWxsKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTI2NSw3ICsyNjAsNyBAQAogICovCiBwdWJsaWMgSURPTVR5cGUgY3JlYXRlVHlwZShjaGFyW10gc291cmNlQ29kZSkgewogCWluaXRpYWxpemVCdWlsZChzb3VyY2VDb2RlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCWdldFBhcnNlcigpLnBhcnNlVHlwZShzb3VyY2VDb2RlKTsKKwlnZXRQYXJzZXIob3B0aW9ucykucGFyc2VUeXBlKHNvdXJjZUNvZGUpOwogCWlmIChmQWJvcnQpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNjkwLDggKzY4NSw4IEBACiAvKioKICAqIENyZWF0ZXMgYSBuZXcgcGFyc2VyLgogICovCi1wcm90ZWN0ZWQgRG9jdW1lbnRFbGVtZW50UGFyc2VyIGdldFBhcnNlcigpIHsKLQlyZXR1cm4gbmV3IERvY3VtZW50RWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSk7Citwcm90ZWN0ZWQgRG9jdW1lbnRFbGVtZW50UGFyc2VyIGdldFBhcnNlcihNYXAgc2V0dGluZ3MpIHsKKwlyZXR1cm4gbmV3IERvY3VtZW50RWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCksIG5ldyBDb21waWxlck9wdGlvbnMoc2V0dGluZ3MpKTsKIH0KIC8qKgogICogSW5pdGlhbGl6ZXMgdGhlIGJ1aWxkZXIgdG8gY3JlYXRlIGEgZG9jdW1lbnQgZnJhZ21lbnQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Db21waWxhdGlvblVuaXQuamF2YQppbmRleCA0ODUyMmFkLi5jZTg3ZjM4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUZpZWxkLmphdmEKaW5kZXggZmI5ODUzZS4uODFmMDYzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01GaWVsZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NRmllbGQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01JbXBvcnQuamF2YQppbmRleCAyMDc5ZjI5Li42Mjc4ZDk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUltcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW1wb3J0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NSW5pdGlhbGl6ZXIuamF2YQppbmRleCBkNzBkNDNmLi4wNDIyYjI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01Jbml0aWFsaXplci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1lbWJlci5qYXZhCmluZGV4IDZkNjQ1ZWIuLmY5ODNiN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWVtYmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZW1iZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU1ldGhvZC5qYXZhCmluZGV4IGNkZDQ0MDUuLmMzODk3ZmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01NZXRob2QuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0RPTU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTm9kZS5qYXZhCmluZGV4IDI1Njk1OTguLjMxZWIwZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTm9kZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NTm9kZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01QYWNrYWdlLmphdmEKaW5kZXggNGExNjMzYS4uODcwY2JjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01QYWNrYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01QYWNrYWdlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vRE9NVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01UeXBlLmphdmEKaW5kZXggZTkxZTRjZi4uZDVjYjUwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01UeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9ET01UeXBlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwpAQCAtMTUsMTIgKzE1LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS5JRE9NVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuQ2hhckFycmF5T3BzOwpAQCAtNDc1LDExICs0NzUsMTEgQEAKIAkKIAl0cnkgewogCQlpbnQgY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJd2hpbGUoY3VycmVudFRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNFICYmCi0JCQkJY3VycmVudFRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSB7CisJCXdoaWxlKGN1cnJlbnRUb2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UgJiYKKwkJCQljdXJyZW50VG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQljdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQl9Ci0JCWlmKGN1cnJlbnRUb2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDRSkgewkJCisJCWlmKGN1cnJlbnRUb2tlbiA9PSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVMQlJBQ0UpIHsJCQogCQkJb3BlbkJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQlvcGVuQm9keVN0YXJ0ID0gc2Nhbm5lci5zdGFydFBvc2l0aW9uOwogCQl9IGVsc2UgewpAQCAtNTA5LDExICs1MDksMTEgQEAKIAkJc2Nhbm5lci5yZXNldFRvKGxhc3ROb2RlLmdldEVuZFBvc2l0aW9uKCkgKyAxLCBmRG9jdW1lbnQubGVuZ3RoKTsKIAkJdHJ5IHsKIAkJCWludCBjdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJd2hpbGUoY3VycmVudFRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNFICYmCi0JCQkJCWN1cnJlbnRUb2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUoY3VycmVudFRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSAmJgorCQkJCQljdXJyZW50VG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCX0KLQkJCWlmKGN1cnJlbnRUb2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDRSkgewkJCisJCQlpZihjdXJyZW50VG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFKSB7CQkKIAkJCQljbG9zZUJvZHlTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKIAkJCQljbG9zZUJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQl9IGVsc2UgewpAQCAtNTI4LDExICs1MjgsMTEgQEAKIAkJc2Nhbm5lci5yZXNldFRvKG9wZW5Cb2R5RW5kLCBmRG9jdW1lbnQubGVuZ3RoKTsKIAkJdHJ5IHsKIAkJCWludCBjdXJyZW50VG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJd2hpbGUoY3VycmVudFRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNFICYmCi0JCQkJCWN1cnJlbnRUb2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJd2hpbGUoY3VycmVudFRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZVJCUkFDRSAmJgorCQkJCQljdXJyZW50VG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJY3VycmVudFRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCX0KLQkJCWlmKGN1cnJlbnRUb2tlbiA9PSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDRSkgewkJCisJCQlpZihjdXJyZW50VG9rZW4gPT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUkJSQUNFKSB7CQkKIAkJCQljbG9zZUJvZHlTdGFydCA9IHNjYW5uZXIuc3RhcnRQb3NpdGlvbjsKIAkJCQljbG9zZUJvZHlFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CiAJCQl9IGVsc2UgewpAQCAtNTUzLDcgKzU1Myw3IEBACiAJaWYgKGxhc3ROb2RlICE9IG51bGwgJiYgZkluc2VydGlvblBvc2l0aW9uIDwgbGFzdE5vZGUuZ2V0RW5kUG9zaXRpb24oKSkgewogCQlmSW5zZXJ0aW9uUG9zaXRpb24gPSBnZXRDbG9zZUJvZHlQb3NpdGlvbigpOwogCX0KLQlpZiAoZkluc2VydGlvblBvc2l0aW9uIDwgb3BlbkJvZHlFbmQpIHsKKwlpZiAoZkluc2VydGlvblBvc2l0aW9uIDw9IG9wZW5Cb2R5RW5kKSB7CiAJCWZJbnNlcnRpb25Qb3NpdGlvbiA9IGdldENsb3NlQm9keVBvc2l0aW9uKCk7CiAJfQogCXN1cGVyLm5vcm1hbGl6ZShmaW5kZXIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9JTGluZVN0YXJ0RmluZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0lMaW5lU3RhcnRGaW5kZXIuamF2YQppbmRleCA2N2IxZmFmLi40ZTlkYTUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0lMaW5lU3RhcnRGaW5kZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL0lMaW5lU3RhcnRGaW5kZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmpkb207CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2libGluZ0VudW1lcmF0aW9uLmphdmEKaW5kZXggNGU4ZjllYy4uNjJlZDNiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaWJsaW5nRW51bWVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9qZG9tL1NpYmxpbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuamRvbTsKIAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2pkb20vU2ltcGxlRE9NQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKaW5kZXggYjA1ODAyMi4uOGZlMDYyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvamRvbS9TaW1wbGVET01CdWlsZGVyLmphdmEKQEAgLTEsMTUgKzEsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5qZG9tOwogCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7CkBAIC01MCw3ICs1Miw3IEBACiAgKi8KIHB1YmxpYyBJRE9NQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewogCWluaXRpYWxpemVCdWlsZChjb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JZ2V0UGFyc2VyKCkucGFyc2VDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0LCBmYWxzZSk7CisJZ2V0UGFyc2VyKEphdmFDb3JlLmdldE9wdGlvbnMoKSkucGFyc2VDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0LCBmYWxzZSk7CiAJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXQpOwogfQogLyoqCkBAIC0xNzAsNyArMTcyLDcgQEAKIH0KIC8qKgogICovCi1wdWJsaWMgdm9pZCBleGl0RmllbGQoaW50IGRlY2xhcmF0aW9uRW5kKSB7CitwdWJsaWMgdm9pZCBleGl0RmllbGQoaW50IGluaXRpYWxpemF0aW9uU3RhcnQsIGludCBkZWNsYXJhdGlvbkVuZCwgaW50IGRlY2xhcmF0aW9uU291cmNlRW5kKSB7CiAJZXhpdE1lbWJlcihkZWNsYXJhdGlvbkVuZCk7CiB9CiAvKioKQEAgLTIxMSw3ICsyMTMsNyBAQAogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IHBhcnNlci4KICAqLwotcHJvdGVjdGVkIFNvdXJjZUVsZW1lbnRQYXJzZXIgZ2V0UGFyc2VyKCkgewotCXJldHVybiBuZXcgU291cmNlRWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSk7Citwcm90ZWN0ZWQgU291cmNlRWxlbWVudFBhcnNlciBnZXRQYXJzZXIoTWFwIHNldHRpbmdzKSB7CisJcmV0dXJuIG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHRoaXMsIG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSwgbmV3IENvbXBpbGVyT3B0aW9ucyhzZXR0aW5ncykpOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNjZiNTRjNi4uMzQ3YTAwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDE1ICsxLDIxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIEphdmFNb2RlbCBtZXNzYWdlcy4KIAotIyMjIGFzc2VydGlvbgotYXNzZXJ0Lm51bGxBcmd1bWVudCA9IG51bGwgYXJndW1lbnQ7IHswfQotYXNzZXJ0LmZhaWxlZCA9IEFzc2VydGlvbiBmYWlsZWQ7IHswfS4KLWFzc2VydC5zaG91bGROb3RJbXBsZW1lbnQgPSBTaG91bGQgbm90IGJlIGNhbGxlZAotCiAjIyMgaGllcmFyY2h5CiBoaWVyYXJjaHkubnVsbFByb2plY3QgPSBQcm9qZWN0IGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsLgogaGllcmFyY2h5Lm51bGxSZWdpb24gPSBSZWdpb24gY2Fubm90IGJlIG51bGwuCiBoaWVyYXJjaHkubnVsbEZvY3VzVHlwZSA9IFR5cGUgZm9jdXMgY2Fubm90IGJlIG51bGwuCiBoaWVyYXJjaHkuY3JlYXRpbmcgPSBDcmVhdGluZyB0eXBlIGhpZXJhcmNoeS4uLgoraGllcmFyY2h5LmNyZWF0aW5nT25UeXBlID0gQ3JlYXRpbmcgdHlwZSBoaWVyYXJjaHkgb24gezB9Li4uCiAKICMjIyBqYXZhIGVsZW1lbnQKIGVsZW1lbnQuZG9lc05vdEV4aXN0ID0gezB9IGRvZXMgbm90IGV4aXN0LgpAQCAtMjEsNyArMjcsNiBAQAogZWxlbWVudC5jbGFzc3BhdGhDeWNsZSA9IEEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBwcm9qZWN0JydzIGNsYXNzcGF0aC4KIGVsZW1lbnQub25seU9uZUphdmFNb2RlbCA9IENhbm5vdCBpbnN0YW50aWF0ZSBtb3JlIHRoYW4gb25lIEphdmEgTW9kZWwuCiBlbGVtZW50LnByb2plY3REb2VzTm90RXhpc3QgPSBQcm9qZWN0IHswfSBub3QgcHJlc2VudAotZWxlbWVudC5jYW5ub3RMb2NhdGUgPSBGYWlsZWQgdG8gbG9jYXRlIHswfSBpbiB7MX0KIGVsZW1lbnQuaW52YWxpZFJlc291cmNlRm9yUHJvamVjdCA9IElsbGVnYWwgYXJndW1lbnQgLSBtdXN0IGJlIG9uZSBvZiBJUHJvamVjdCwgSUZvbGRlciwgb3IgSUZpbGUKIGVsZW1lbnQubnVsbE5hbWUgPSBOYW1lIGNhbm5vdCBiZSBudWxsLgogZWxlbWVudC5udWxsVHlwZSA9IFR5cGUgY2Fubm90IGJlIG51bGwuCkBAIC0zMiw3ICszNyw3IEBACiBvcGVyYXRpb24ubmVlZEVsZW1lbnRzID0gT3BlcmF0aW9uIHJlcXVpcmVzIG9uZSBvciBtb3JlIGVsZW1lbnRzLgogb3BlcmF0aW9uLm5lZWROYW1lID0gT3BlcmF0aW9uIHJlcXVpcmVzIGEgbmFtZS4KIG9wZXJhdGlvbi5uZWVkUGF0aCA9IE9wZXJhdGlvbiByZXF1aXJlcyBhIHBhdGguCi1vcGVyYXRpb24ubmVlZEFic29sdXRlUGF0aCA9IE9wZXJhdGlvbiByZXF1aXJlcyBhbiBhYnNvbHV0ZSBwYXRoLiBSZWxhdGl2ZSBwYXRoIHNwZWNpZmllZCB3YXM6IHswfQorb3BlcmF0aW9uLm5lZWRBYnNvbHV0ZVBhdGggPSBPcGVyYXRpb24gcmVxdWlyZXMgYW4gYWJzb2x1dGUgcGF0aC4gUmVsYXRpdmUgcGF0aCBzcGVjaWZpZWQgd2FzOiAnJ3swfScnCiBvcGVyYXRpb24ubmVlZFN0cmluZyA9IE9wZXJhdGlvbiByZXF1aXJlcyBhIFN0cmluZy4KIG9wZXJhdGlvbi5ub3RTdXBwb3J0ZWQgPSBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBmb3Igc3BlY2lmaWVkIGVsZW1lbnQgdHlwZShzKToKIG9wZXJhdGlvbi5jYW5jZWxsZWQgPSBPcGVyYXRpb24gY2FuY2VsbGVkLgpAQCAtNTUsMTE3ICs2MCwxMTIgQEAKIG9wZXJhdGlvbi5kZWxldGVFbGVtZW50UHJvZ3Jlc3MgPSBEZWxldGluZyBlbGVtZW50cy4uLgogb3BlcmF0aW9uLmRlbGV0ZVJlc291cmNlUHJvZ3Jlc3MgPSBEZWxldGluZyByZXNvdXJjZXMuLi4KIG9wZXJhdGlvbi5jYW5ub3RSZW5hbWVEZWZhdWx0UGFja2FnZSA9IERlZmF1bHQgcGFja2FnZSBjYW5ub3QgYmUgcmVuYW1lZC4KLW9wZXJhdGlvbi5wYXRoT3V0c2lkZVByb2plY3QgPSBQYXRoIHswfSBtdXN0IGRlbm90ZSBsb2NhdGlvbiBpbnNpZGUgcHJvamVjdCB7MX0KK29wZXJhdGlvbi5wYXRoT3V0c2lkZVByb2plY3QgPSBQYXRoICcnezB9JycgbXVzdCBkZW5vdGUgbG9jYXRpb24gaW5zaWRlIHByb2plY3QgezF9CitvcGVyYXRpb24uc29ydGVsZW1lbnRzID0gU29ydGluZyBlbGVtZW50cy4uLgogCiAjIyMgd29ya2luZyBjb3B5CiB3b3JraW5nQ29weS5jb21taXQgPSBDb21taXR0aW5nIHdvcmtpbmcgY29weS4uLgogCi0jIyMgYnVpbGQKLWJ1aWxkLnJlYWRTdGF0ZVByb2dyZXNzID0gUmVhZGluZyBzYXZlZCBidWlsdCBzdGF0ZSBmb3IgcHJvamVjdCB7MH0uCi1idWlsZC5zYXZlU3RhdGVQcm9ncmVzcyA9IFNhdmluZyBidWlsdCBzdGF0ZSBmb3IgcHJvamVjdCB7MH0uCisjIyMgYnVpbGQgc3RhdHVzIG1lc3NhZ2VzCitidWlsZC5wcmVwYXJpbmdCdWlsZCA9IFByZXBhcmluZyBmb3IgYnVpbGQKK2J1aWxkLnJlYWRTdGF0ZVByb2dyZXNzID0gUmVhZGluZyBzYXZlZCBidWlsdCBzdGF0ZSBmb3IgcHJvamVjdCB7MH0KK2J1aWxkLnNhdmVTdGF0ZVByb2dyZXNzID0gU2F2aW5nIGJ1aWx0IHN0YXRlIGZvciBwcm9qZWN0IHswfQogYnVpbGQuc2F2ZVN0YXRlQ29tcGxldGUgPSBTYXZlZCBpbiB7MH0gbXMKK2J1aWxkLnJlYWRpbmdEZWx0YSA9IFJlYWRpbmcgcmVzb3VyY2UgY2hhbmdlIGluZm9ybWF0aW9uIGZvciB7MH0KK2J1aWxkLmFuYWx5emluZ0RlbHRhcyA9IEFuYWx5emluZyBkZWx0YXMKK2J1aWxkLmFuYWx5emluZ1NvdXJjZXMgPSBBbmFseXppbmcgc291cmNlcworYnVpbGQuY2xlYW5pbmdPdXRwdXQgPSBDbGVhbmluZyBvdXRwdXQgZm9sZGVyCitidWlsZC5jb3B5aW5nUmVzb3VyY2VzID0gQ29weWluZyByZXNvdXJjZXMgdG8gdGhlIG91dHB1dCBmb2xkZXIKK2J1aWxkLmNvbXBpbGluZyA9IENvbXBpbGluZyB7MH0KK2J1aWxkLmZvdW5kSGVhZGVyID0gRm91bmQKK2J1aWxkLmZpeGVkSGVhZGVyID0gRml4ZWQKK2J1aWxkLm9uZUVycm9yID0gMSBlcnJvcgorYnVpbGQub25lV2FybmluZyA9IDEgd2FybmluZworYnVpbGQubXVsdGlwbGVFcnJvcnMgPSB7MH0gZXJyb3JzCitidWlsZC5tdWx0aXBsZVdhcm5pbmdzID0gezB9IHdhcm5pbmdzCitidWlsZC5kb25lID0gQnVpbGQgZG9uZQorCisjIyMgYnVpbGQgZXJyb3JzCiBidWlsZC53cm9uZ0ZpbGVGb3JtYXQgPSBXcm9uZyBmaWxlIGZvcm1hdC4KLWJ1aWxkLnVuaGFuZGxlZFZlcnNpb25Gb3JtYXQgPSBVbmhhbmRsZWQgdmVyc2lvbiBvZiBmaWxlIGZvcm1hdC4KLWJ1aWxkLmNhbm5vdFJlc3RvcmVTdGF0ZSA9IEZhaWxlZCB0byByZXN0b3JlIHN0YXRlCiBidWlsZC5jYW5ub3RTYXZlU3RhdGUgPSBFcnJvciBzYXZpbmcgbGFzdCBidWlsZCBzdGF0ZSBmb3IgcHJvamVjdCB7MH0uCi1idWlsZC5jYW5ub3RTYXZlU3RhdGVzID0gRXJyb3Igc2F2aW5nIGJ1aWxkZXIgc3RhdGVzCitidWlsZC5jYW5ub3RTYXZlU3RhdGVzID0gRXJyb3Igc2F2aW5nIGJ1aWxkIHN0YXRlcy4KIGJ1aWxkLmluaXRpYWxpemF0aW9uRXJyb3IgPSBCdWlsZGVyIGluaXRpYWxpemF0aW9uIGVycm9yLgogYnVpbGQuc2VyaWFsaXphdGlvbkVycm9yID0gQnVpbGRlciBzZXJpYWxpemF0aW9uIGVycm9yLgotYnVpbGQuYW5hbHl6aW5nUGFja2FnZXMgPSBBbmFseXppbmcgcGFja2FnZXMKLWJ1aWxkLmFuYWx5emluZ1NvdXJjZXMgPSBBbmFseXppbmcgc291cmNlcwotYnVpbGQuYW5hbHl6aW5nRGVsdGFzID0gQW5hbHl6aW5nIGRlbHRhcwotYnVpbGQuYW5hbHl6aW5nID0gQW5hbHl6aW5nIHswfQotYnVpbGQucHJlcGFyaW5nQnVpbGQgPSBQcmVwYXJpbmcgZm9yIGJ1aWxkCi1idWlsZC5jb21waWxpbmcgPSBDb21waWxpbmcgezB9Ci1idWlsZC5yZWFkaW5nRGVsdGEgPSBSZWFkaW5nIHJlc291cmNlIGNoYW5nZSBpbmZvcm1hdGlvbiBmb3IgezB9Ci1idWlsZC5jb21wbGV0ZWQgPSBKYXZhIGJ1aWxkIGNvbXBsZXRlZAotYnVpbGQuYnVpbGRlck5hbWUgPSBKYXZhIEJ1aWxkZXIKLWJ1aWxkLmNvbXBpbGluZ0NvbnRlbnQgPSBDb21waWxpbmcgY29udGVudCBvZiB7MH0KLWJ1aWxkLnNjcnViYmluZ091dHB1dCA9IFNjcnViYmluZyBvdXRwdXQgZm9sZGVyCi1idWlsZC5kdXBsaWNhdGVUeXBlID0gVHlwZSB7MH0gYWxyZWFkeSBwcm92aWRlZCBieSB7MX0KLWJ1aWxkLmVycm9yUGFyc2luZ0JpbmFyeSA9IEVycm9yIHBhcnNpbmcgY2xhc3MgZmlsZSBmb3IgezB9Ci1idWlsZC5wYWNrYWdlTWlzbWF0Y2ggPSBQYWNrYWdlIGRlY2xhcmF0aW9uIGRvZXMgbm90IG1hdGNoIGZvbGRlci4gRXhwZWN0ZWQgZm9sZGVyIGlzIHswfS4KLWJ1aWxkLmVycm9yQnVpbGRpbmdUeXBlID0gVW5hYmxlIHRvIGJ1aWxkIHR5cGUgezB9LgotYnVpbGQubWlzc2luZ0ZpbGUgPSBNaXNzaW5nIGZpbGUgZm9yIHswfQotYnVpbGQuYmVnaW5CYXRjaCA9IEJlZ2luIGJhdGNoIGJ1aWxkCi1idWlsZC5iZWdpbkluY3JlbWVudGFsID0gQmVnaW4gaW5jcmVtZW50YWwgYnVpbGQKLWJ1aWxkLmRvbmUgPSBCdWlsZCBkb25lLgotYnVpbGQuZW5kQmF0Y2ggPSBFbmQgYmF0Y2ggYnVpbGQKLWJ1aWxkLmVuZEluY3JlbWVudGFsID0gRW5kIGluY3JlbWVudGFsIGJ1aWxkCi1idWlsZC5vbmVQcm9ibGVtRm91bmQgPSB7MH0gcHJvYmxlbSBmb3VuZAotYnVpbGQucHJvYmxlbXNGb3VuZCA9IHswfSBwcm9ibGVtcyBmb3VuZAotYnVpbGQub25lUHJvYmxlbUZpeGVkID0gezB9IHByb2JsZW0gZml4ZWQKLWJ1aWxkLnByb2JsZW1zRml4ZWQgPSB7MH0gcHJvYmxlbXMgZml4ZWQKLWJ1aWxkLnBhY2thZ2VOYW1lID0gcGFja2FnZSB7MH0KLWJ1aWxkLmRlZmF1bHRQYWNrYWdlTmFtZSA9IGRlZmF1bHQgcGFja2FnZSBmb3IgezB9Ci1idWlsZC5ub1BhY2thZ2VQYXRoID0gQXR0ZW1wdCB0byBhY2Nlc3MgcGFja2FnZXMgZm9yIG5vbi1leGlzdGVudCBwYXRoOiB7MH0KLWJ1aWxkLmFtYmlndW91c1BhY2thZ2UgPSBEaWRuJyd0IGdldCBleGFjdGx5IG9uZSBwYWNrYWdlIGZvciAgezB9Ci1idWlsZC5jb3B5aW5nUmVzb3VyY2VzID0gQ29weWluZyBhbGwgcmVzb3VyY2VzIG9uIHRoZSBjbGFzc3BhdGgKLWJ1aWxkLnVwZGF0aW5nUmVzb3VyY2VzID0gVXBkYXRpbmcgcmVzb3VyY2VzIG9uIHRoZSBjbGFzc3BhdGgKIAogIyMjIGJ1aWxkIGluY29uc2lzdGVuY2llcwotYnVpbGQuZHVwbGljYXRlQ2xhc3NGaWxlID0gVGhlIHR5cGUgezB9IGlzIGFscmVhZHkgZGVmaW5lZAotYnVpbGQuZHVwbGljYXRlUmVzb3VyY2UgPSBUaGlzIHJlc291cmNlIGlzIGEgZHVwbGljYXRlIGFuZCB3YXMgbm90IGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlcgotYnVpbGQuaW5jb25zaXN0ZW50Q2xhc3NGaWxlID0gQSBjbGFzcyBmaWxlIHdhcyBub3Qgd3JpdHRlbi4gVGhlIHByb2plY3QgbWF5IGJlIGluY29uc2lzdGVudCwgaWYgc28gdHJ5IHJlZnJlc2hpbmcgdGhpcyBwcm9qZWN0IGFuZCByZWJ1aWxkaW5nIGl0Ci1idWlsZC5pbmNvbnNpc3RlbnRQcm9qZWN0ID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdC4gSXQgbWF5IGJlIGluY29uc2lzdGVudCwgaWYgc28gZW5zdXJlIG5vIG90aGVyIHRvb2wgaXMgYnJvd3NpbmcgdGhlIG91dHB1dCBkaXJlY3RvcnksIHRoZW4gdHJ5IHJlZnJlc2hpbmcgdGhpcyBwcm9qZWN0IGFuZCByZWJ1aWxkaW5nIGl0Ci1idWlsZC5pbmNvbXBsZXRlQ2xhc3NQYXRoID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBzaW5jZSBpdHMgY2xhc3NwYXRoIGlzIGluY29tcGxldGUuIENhbiBub3QgZmluZCB0aGUgY2xhc3MgZmlsZSBmb3IgezB9LiBGaXggdGhlIGNsYXNzcGF0aCB0aGVuIHRyeSByZWJ1aWxkaW5nIHRoaXMgcHJvamVjdAorYnVpbGQuZHVwbGljYXRlQ2xhc3NGaWxlID0gVGhlIHR5cGUgezB9IGlzIGFscmVhZHkgZGVmaW5lZC4KK2J1aWxkLmR1cGxpY2F0ZVJlc291cmNlID0gVGhlIHJlc291cmNlIGlzIGEgZHVwbGljYXRlIGFuZCB3YXMgbm90IGNvcGllZCB0byB0aGUgb3V0cHV0IGZvbGRlci4KK2J1aWxkLmluY29uc2lzdGVudENsYXNzRmlsZSA9IEEgY2xhc3MgZmlsZSB3YXMgbm90IHdyaXR0ZW4uIFRoZSBwcm9qZWN0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGlmIHNvIHRyeSByZWZyZXNoaW5nIHRoaXMgcHJvamVjdCBhbmQgcmVidWlsZGluZyBpdC4KK2J1aWxkLmluY29uc2lzdGVudFByb2plY3QgPSBUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IGR1ZSB0byAiezB9Ii4gRml4IHRoZSBwcm9ibGVtLCB0aGVuIHRyeSByZWZyZXNoaW5nIHRoaXMgcHJvamVjdCBhbmQgcmVidWlsZGluZyBpdCBzaW5jZSBpdCBtYXkgYmUgaW5jb25zaXN0ZW50LgorYnVpbGQuaW5jb21wbGV0ZUNsYXNzUGF0aCA9IFRoZSBwcm9qZWN0IHdhcyBub3QgYnVpbHQgc2luY2UgaXRzIGNsYXNzcGF0aCBpcyBpbmNvbXBsZXRlLiBDYW5ub3QgZmluZCB0aGUgY2xhc3MgZmlsZSBmb3IgezB9LiBGaXggdGhlIGNsYXNzcGF0aCB0aGVuIHRyeSByZWJ1aWxkaW5nIHRoaXMgcHJvamVjdC4KIGJ1aWxkLm1pc3NpbmdTb3VyY2VGaWxlID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBzaW5jZSB0aGUgc291cmNlIGZpbGUgezB9IGNvdWxkIG5vdCBiZSByZWFkLgotYnVpbGQucHJlcmVxUHJvamVjdFdhc05vdEJ1aWx0ID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBzaW5jZSBpdCBkZXBlbmRzIG9uIHswfSwgd2hpY2ggZmFpbGVkIHRvIGJ1aWxkLgotYnVpbGQuYWJvcnREdWVUb0NsYXNzcGF0aFByb2JsZW1zID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBzaW5jZSBpdCBpcyBpbnZvbHZlZCBpbiBhIGN5Y2xlIG9yIGhhcyBjbGFzc3BhdGggcHJvYmxlbXMuCitidWlsZC5wcmVyZXFQcm9qZWN0SGFzQ2xhc3NwYXRoUHJvYmxlbXMgPSBUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IHNpbmNlIGl0IGRlcGVuZHMgb24gezB9LCB3aGljaCBoYXMgY2xhc3NwYXRoIHByb2JsZW1zLgorYnVpbGQucHJlcmVxUHJvamVjdE11c3RCZVJlYnVpbHQgPSBUaGUgcHJvamVjdCBjYW5ub3QgYmUgYnVpbHQgdW50aWwgezB9IGlzIHJlYnVpbHQuIFJlYnVpbGRpbmcgYWxsIHByb2plY3RzIGlzIHJlY29tbWVuZGVkLgorYnVpbGQuYWJvcnREdWVUb0NsYXNzcGF0aFByb2JsZW1zID0gVGhlIHByb2plY3Qgd2FzIG5vdCBidWlsdCBkdWUgdG8gY2xhc3NwYXRoIGVycm9ycyAoaW5jb21wbGV0ZSBvciBpbnZvbHZlZCBpbiBjeWNsZSkuCiAKICMjIyBzdGF0dXMKLXN0YXR1cy5jb3JlRXhjZXB0aW9uID0gQ29yZSBleGNlcHRpb24uCi1zdGF0dXMuSU9FeGNlcHRpb24gPSBJL08gZXhjZXB0aW9uLgotc3RhdHVzLnRhcmdldEV4Y2VwdGlvbiA9IFRhcmdldCBleGNlcHRpb24uCiBzdGF0dXMuY2Fubm90VXNlRGV2aWNlT25QYXRoID0gT3BlcmF0aW9uIHJlcXVpcmVzIGEgcGF0aCB3aXRoIG5vIGRldmljZS4gUGF0aCBzcGVjaWZpZWQgd2FzOiB7MH0KLXN0YXR1cy5KRE9NRXJyb3IgPSBKRE9NIGVycm9yLgotc3RhdHVzLmluZGV4T3V0T2ZCb3VuZHMgPSBJbmRleCBvdXQgb2YgYm91bmRzLgorc3RhdHVzLmNvcmVFeGNlcHRpb24gPSBDb3JlIGV4Y2VwdGlvbi4KK3N0YXR1cy5kZWZhdWx0UGFja2VSZWFkT25seSA9IERlZmF1bHQgcGFja2FnZSBpcyByZWFkLW9ubHkuCiBzdGF0dXMuZXZhbHVhdGlvbkVycm9yID0gRXZhbHVhdGlvbiBlcnJvcjogezB9Lgorc3RhdHVzLkpET01FcnJvciA9IEpET00gZXJyb3IuCitzdGF0dXMuSU9FeGNlcHRpb24gPSBJL08gZXhjZXB0aW9uLgorc3RhdHVzLmluZGV4T3V0T2ZCb3VuZHMgPSBJbmRleCBvdXQgb2YgYm91bmRzLgogc3RhdHVzLmludmFsaWRDb250ZW50cyA9IEludmFsaWQgY29udGVudHMgc3BlY2lmaWVkLgotc3RhdHVzLmludmFsaWREZXN0aW5hdGlvbiA9IEludmFsaWQgZGVzdGluYXRpb246IHswfS4KK3N0YXR1cy5pbnZhbGlkRGVzdGluYXRpb24gPSBJbnZhbGlkIGRlc3RpbmF0aW9uOiAnJ3swfScnLgogc3RhdHVzLmludmFsaWROYW1lID0gSW52YWxpZCBuYW1lIHNwZWNpZmllZDogezB9Lgogc3RhdHVzLmludmFsaWRQYWNrYWdlID0gSW52YWxpZCBwYWNrYWdlOiB7MH0uCi1zdGF0dXMuaW52YWxpZFBhdGggPSBJbnZhbGlkIHBhdGg6IHswfS4KK3N0YXR1cy5pbnZhbGlkUGF0aCA9IEludmFsaWQgcGF0aDogJyd7MH0nJy4KIHN0YXR1cy5pbnZhbGlkUHJvamVjdCA9IEludmFsaWQgcHJvamVjdDogezB9Lgogc3RhdHVzLmludmFsaWRSZXNvdXJjZSA9IEludmFsaWQgcmVzb3VyY2U6IHswfS4KIHN0YXR1cy5pbnZhbGlkUmVzb3VyY2VUeXBlID0gSW52YWxpZCByZXNvdXJjZSB0eXBlIGZvciB7MH0uCiBzdGF0dXMuaW52YWxpZFNpYmxpbmcgPSBJbnZhbGlkIHNpYmxpbmc6IHswfS4KLXN0YXR1cy5uYW1lQ29sbGlzaW9uID0gTmFtZSBjb2xsaXNpb24uCi1zdGF0dXMuZGVmYXVsdFBhY2tlUmVhZE9ubHkgPSBEZWZhdWx0IHBhY2thZ2UgaXMgcmVhZC1vbmx5Lgotc3RhdHVzLnJlYWRPbmx5ID0gezB9IGlzIHJlYWQtb25seS4KLXN0YXR1cy51cGRhdGVDb25mbGljdCA9IFVwZGF0ZSBjb25mbGljdC4KK3N0YXR1cy5uYW1lQ29sbGlzaW9uID0gezB9IGFscmVhZHkgZXhpc3RzIGluIHRhcmdldC4KIHN0YXR1cy5ub0xvY2FsQ29udGVudHMgPSBDYW5ub3QgZmluZCBsb2NhbCBjb250ZW50cyBmb3IgcmVzb3VyY2U6IHswfQorc3RhdHVzLk9LID0gT0sKK3N0YXR1cy5yZWFkT25seSA9IHswfSBpcyByZWFkLW9ubHkuCitzdGF0dXMudGFyZ2V0RXhjZXB0aW9uID0gVGFyZ2V0IGV4Y2VwdGlvbi4KK3N0YXR1cy51cGRhdGVDb25mbGljdCA9IFVwZGF0ZSBjb25mbGljdC4KIAogIyMjIGNsYXNzcGF0aAotY2xhc3NwYXRoLmN5Y2xlID0gQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2plY3QnJ3MgY2xhc3NwYXRoLgogY2xhc3NwYXRoLmJ1aWxkUGF0aCA9IEJ1aWxkIHBhdGgKLWNsYXNzcGF0aC5jYW5ub3ROZXN0RW50cnlJbkVudHJ5ID0gQ2Fubm90IG5lc3QgZW50cnkgezB9IGluc2lkZSBlbnRyeSB7MX0uCi1jbGFzc3BhdGguY2Fubm90TmVzdEVudHJ5SW5PdXRwdXQgPSBDYW5ub3QgbmVzdCBlbnRyeSB7MH0gaW5zaWRlIG91dHB1dCBsb2NhdGlvbiB7MX0uCi1jbGFzc3BhdGguY2Fubm90TmVzdE91dHB1dEluRW50cnkgPSBDYW5ub3QgbmVzdCBvdXRwdXQgbG9jYXRpb24gezB9IGluc2lkZSBlbnRyeSB7MX0uCi1jbGFzc3BhdGguZHVwbGljYXRlRW50cnlQYXRoID0gQ2xhc3NwYXRoIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyeTogezB9CitjbGFzc3BhdGguY2Fubm90TmVzdEVudHJ5SW5FbnRyeSA9IENhbm5vdCBuZXN0ICcnezB9JycgaW5zaWRlICcnezF9JycuIFRvIGVuYWJsZSB0aGUgbmVzdGluZyBleGNsdWRlICcnezJ9JycgZnJvbSAnJ3sxfScnLgorY2xhc3NwYXRoLmNhbm5vdE5lc3RFbnRyeUluTGlicmFyeSA9IENhbm5vdCBuZXN0ICcnezB9JycgaW5zaWRlIGxpYnJhcnkgJyd7MX0nJy4KK2NsYXNzcGF0aC5jYW5ub3ROZXN0RW50cnlJbk91dHB1dCA9IENhbm5vdCBuZXN0ICcnezB9JycgaW5zaWRlIG91dHB1dCBmb2xkZXIgJyd7MX0nJy4KK2NsYXNzcGF0aC5jYW5ub3ROZXN0T3V0cHV0SW5FbnRyeSA9IENhbm5vdCBuZXN0IG91dHB1dCBmb2xkZXIgJyd7MH0nJyBpbnNpZGUgJyd7MX0nJy4KK2NsYXNzcGF0aC5jYW5ub3ROZXN0T3V0cHV0SW5PdXRwdXQgPSBDYW5ub3QgbmVzdCBvdXRwdXQgZm9sZGVyICcnezB9JycgaW5zaWRlIG91dHB1dCBmb2xkZXIgJyd7MX0nJy4KK2NsYXNzcGF0aC5jYW5ub3RSZWFkQ2xhc3NwYXRoRmlsZSA9IFVuYWJsZSB0byByZWFkICcnezB9Ly5jbGFzc3BhdGgnJyBmaWxlLgogY2xhc3NwYXRoLmNhbm5vdFJlZmVyVG9JdHNlbGYgPSBQcm9qZWN0IGNhbm5vdCByZWZlcmVuY2UgaXRzZWxmOiB7MH0KLWNsYXNzcGF0aC51bmJvdW5kQ29udGFpbmVyUGF0aCA9IFVuYm91bmQgY2xhc3NwYXRoIGNvbnRhaW5lciBwYXRoOiB7MH0uCi1jbGFzc3BhdGguaWxsZWdhbENvbnRhaW5lclBhdGggPSBJbGxlZ2FsIGNsYXNzcGF0aCBjb250YWluZXIgcGF0aDogezB9LCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHNlZ21lbnQgKGNvbnRhaW5lcklEK2hpbnRzKS4KLWNsYXNzcGF0aC51bmJvdW5kVmFyaWFibGVQYXRoID0gVW5ib3VuZCBjbGFzc3BhdGggdmFyaWFibGUgcGF0aDogezB9LgotY2xhc3NwYXRoLmlsbGVnYWxWYXJpYWJsZVBhdGggPSBJbGxlZ2FsIGNsYXNzcGF0aCB2YXJpYWJsZSBwYXRoOiB7MH0sIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc2VnbWVudC4KLWNsYXNzcGF0aC5udWxsVmFyaWFibGVQYXRoID0gVmFyaWFibGUgcGF0aCBjYW5ub3QgYmUgbnVsbC4KLWNsYXNzcGF0aC5taXNtYXRjaE5hbWVQYXRoID0gVmFyaWFibGUgbmFtZXMgYW5kIHBhdGhzIGNvbGxlY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpemUuCi1jbGFzc3BhdGgubWlzbWF0Y2hQcm9qZWN0c0NvbnRhaW5lcnMgPSBQcm9qZWN0cyBhbmQgY29udGFpbmVycyBjb2xsZWN0aW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzaXplLgotY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50ID0gSW52YWxpZCBzb3VyY2UgYXR0YWNobWVudDogezB9IGZvciByZXF1aXJlZCBsaWJyYXJ5IHsxfS4KLWNsYXNzcGF0aC51bmJvdW5kTGlicmFyeSA9IE1pc3NpbmcgcmVxdWlyZWQgbGlicmFyeTogezB9LgotY2xhc3NwYXRoLmlsbGVnYWxMaWJyYXJ5UGF0aCA9IElsbGVnYWwgcGF0aCBmb3IgcmVxdWlyZWQgbGlicmFyeTogezB9LgotY2xhc3NwYXRoLnVuYm91bmRQcm9qZWN0ID0gTWlzc2luZyByZXF1aXJlZCBKYXZhIHByb2plY3Q6IHswfS4KK2NsYXNzcGF0aC5jYW5ub3RVc2VEaXN0aW5jdFNvdXJjZUZvbGRlckFzT3V0cHV0ID0gU291cmNlIGZvbGRlciAnJ3swfScnIGNhbm5vdCBvdXRwdXQgdG8gZGlzdGluY3Qgc291cmNlIGZvbGRlciAnJ3sxfScnLgorY2xhc3NwYXRoLmNhbm5vdFVzZUxpYnJhcnlBc091dHB1dCA9IFNvdXJjZSBmb2xkZXIgJyd7MH0nJyBjYW5ub3Qgb3V0cHV0IHRvIGxpYnJhcnkgJyd7MX0nJy4KIGNsYXNzcGF0aC5jbG9zZWRQcm9qZWN0ID0gUmVxdWlyZWQgcHJvamVjdDogezB9IG5lZWRzIHRvIGJlIG9wZW4uCi1jbGFzc3BhdGguaWxsZWdhbFByb2plY3RQYXRoID0gSWxsZWdhbCBwYXRoIGZvciByZXF1aXJlZCBwcm9qZWN0OiB7MH0uCi1jbGFzc3BhdGgudW5ib3VuZFNvdXJjZUZvbGRlciA9IE1pc3NpbmcgcmVxdWlyZWQgc291cmNlIGZvbGRlcjogezB9LgotY2xhc3NwYXRoLmlsbGVnYWxTb3VyY2VGb2xkZXJQYXRoID0gSWxsZWdhbCBwYXRoIGZvciByZXF1aXJlZCBzb3VyY2UgZm9sZGVyOiB7MH0uCitjbGFzc3BhdGguY291bGROb3RXcml0ZUNsYXNzcGF0aEZpbGUgPSBDb3VsZCBub3Qgd3JpdGUgJyd7MH0vLmNsYXNzcGF0aCcnOiB7MX0KK2NsYXNzcGF0aC5jeWNsZSA9IEEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBjbGFzc3BhdGggb2YgcHJvamVjdDogezB9CitjbGFzc3BhdGguZHVwbGljYXRlRW50cnlQYXRoID0gQ2xhc3NwYXRoIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyeTogezB9CitjbGFzc3BhdGguaWxsZWdhbENvbnRhaW5lclBhdGggPSBJbGxlZ2FsIGNsYXNzcGF0aCBjb250YWluZXIgcGF0aDogJyd7MH0nJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50IChjb250YWluZXJJRCtoaW50cykuCitjbGFzc3BhdGguaWxsZWdhbEVudHJ5SW5DbGFzc3BhdGhGaWxlID0gSWxsZWdhbCBlbnRyeSBpbiAnJ3swfS8uY2xhc3NwYXRoJycgZmlsZTogezF9CitjbGFzc3BhdGguaWxsZWdhbExpYnJhcnlQYXRoID0gSWxsZWdhbCBwYXRoIGZvciByZXF1aXJlZCBsaWJyYXJ5OiAnJ3swfScnLgorY2xhc3NwYXRoLmlsbGVnYWxQcm9qZWN0UGF0aCA9IElsbGVnYWwgcGF0aCBmb3IgcmVxdWlyZWQgcHJvamVjdDogJyd7MH0nJy4KK2NsYXNzcGF0aC5pbGxlZ2FsU291cmNlRm9sZGVyUGF0aCA9IElsbGVnYWwgcGF0aCBmb3IgcmVxdWlyZWQgc291cmNlIGZvbGRlcjogJyd7MH0nJy4KK2NsYXNzcGF0aC5pbGxlZ2FsVmFyaWFibGVQYXRoID0gSWxsZWdhbCBjbGFzc3BhdGggdmFyaWFibGUgcGF0aDogJyd7MH0nJywgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWdtZW50LgorY2xhc3NwYXRoLmludmFsaWRDbGFzc3BhdGhJbkNsYXNzcGF0aEZpbGUgPSBJbnZhbGlkIGNsYXNzcGF0aCBpbiAnJ3swfS8uY2xhc3NwYXRoJycgZmlsZTogezF9CitjbGFzc3BhdGguaW52YWxpZENvbnRhaW5lciA9IEludmFsaWQgY2xhc3NwYXRoIGNvbnRhaW5lcjogezB9CitjbGFzc3BhdGgubXVzdEVuZFdpdGhTbGFzaCA9IEVuZCBleGNsdXNpb24gZmlsdGVyICcnezB9Jycgd2l0aCAvIHRvIGZ1bGx5IGV4Y2x1ZGUgJyd7MX0nJy4KK2NsYXNzcGF0aC51bmJvdW5kQ29udGFpbmVyUGF0aCA9IFVuYm91bmQgY2xhc3NwYXRoIGNvbnRhaW5lcjogJyd7MH0nJy4KK2NsYXNzcGF0aC51bmJvdW5kTGlicmFyeSA9IE1pc3NpbmcgcmVxdWlyZWQgbGlicmFyeTogJyd7MH0nJy4KK2NsYXNzcGF0aC51bmJvdW5kUHJvamVjdCA9IE1pc3NpbmcgcmVxdWlyZWQgSmF2YSBwcm9qZWN0OiB7MH0uCitjbGFzc3BhdGguc2V0dGluZ091dHB1dExvY2F0aW9uUHJvZ3Jlc3MgPSBTZXR0aW5nIG91dHB1dCBsb2NhdGlvbiBmb3I6ICcnezB9JycKIGNsYXNzcGF0aC5zZXR0aW5nUHJvZ3Jlc3MgPSBTZXR0aW5nIGNsYXNzcGF0aCBmb3I6IHswfQotY2xhc3NwYXRoLnNldHRpbmdPdXRwdXRMb2NhdGlvblByb2dyZXNzID0gU2V0dGluZyBvdXRwdXQgbG9jYXRpb24gZm9yOiB7MH0KLWNsYXNzcGF0aC5uZWVkQWJzb2x1dGVQYXRoID0gUGF0aCBmb3IgSUNsYXNzcGF0aEVudHJ5IG11c3QgYmUgYWJzb2x1dGUuCi1jbGFzc3BhdGguY2Fubm90UmVhZENsYXNzcGF0aEZpbGUgPSBVbmFibGUgdG8gcmVhZCB7MH0vLmNsYXNzcGF0aCBmaWxlLgorY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VBdHRhY2htZW50ID0gSW52YWxpZCBzb3VyY2UgYXR0YWNobWVudDogJyd7MH0nJyBmb3IgcmVxdWlyZWQgbGlicmFyeSAnJ3sxfScnLgorY2xhc3NwYXRoLnVuYm91bmRTb3VyY2VGb2xkZXIgPSBNaXNzaW5nIHJlcXVpcmVkIHNvdXJjZSBmb2xkZXI6ICcnezB9JycuCitjbGFzc3BhdGgudW5ib3VuZFZhcmlhYmxlUGF0aCA9IFVuYm91bmQgY2xhc3NwYXRoIHZhcmlhYmxlOiAnJ3swfScnLgorY2xhc3NwYXRoLnVua25vd25LaW5kID0gVW5rbm93biBraW5kOiB7MH0KK2NsYXNzcGF0aC54bWxGb3JtYXRFcnJvciA9IFhNTCBmb3JtYXQgZXJyb3IgaW4gJyd7MH0vLmNsYXNzcGF0aCcnIGZpbGU6IHsxfQorY2xhc3NwYXRoLmRpc2FibGVkRXhjbHVzaW9uUGF0dGVybnMgPSBFeGNsdXNpb24gcGF0dGVybnMgYXJlIGRpc2FibGVkLCBjYW5ub3QgZXhjbHVkZSBmcm9tIGVudHJ5OiAnJ3swfScnLgorY2xhc3NwYXRoLmRpc2FibGVkTXVsdGlwbGVPdXRwdXRMb2NhdGlvbnMgPSBNdWx0aXBsZSBvdXRwdXQgbG9jYXRpb25zIGFyZSBkaXNhYmxlZCwgY2Fubm90IGFzc29jaWF0ZSBlbnRyeTogJyd7MH0nJyB3aXRoIGEgc3BlY2lmaWMgb3V0cHV0LgogCiAjIyMgbWlzY2VsbGFuZW91cwotZmlsZS5ub3RGb3VuZCA9IEZpbGUgbm90IGZvdW5kLgorZmlsZS5ub3RGb3VuZCA9IEZpbGUgbm90IGZvdW5kOiAnJ3swfScnLgogZmlsZS5iYWRGb3JtYXQgPSBCYWQgZm9ybWF0LgogdmFyaWFibGUuYmFkRm9ybWF0ID0gQmFkIGZvcm1hdCBmb3IgdmFyaWFibGVzLgogb3B0aW9uLmJhZEZvcm1hdCA9IEJhZCBmb3JtYXQgZm9yIG9wdGlvbnMuCkBAIC0xODEsMTQgKzE4MSwxNCBAQAogY29udmVudGlvbi51bml0Lm5vdEphdmFOYW1lID0gQ29tcGlsYXRpb24gdW5pdCBuYW1lIG11c3QgZW5kIHdpdGggLmphdmEuCiBjb252ZW50aW9uLmNsYXNzRmlsZS5udWxsTmFtZSA9IC5jbGFzcyBmaWxlIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4KIGNvbnZlbnRpb24uY2xhc3NGaWxlLm5vdEphdmFOYW1lID0gLmNsYXNzIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC5jbGFzcy4KLWNvbnZlbnRpb24uaWxsZWdhbElkZW50aWZpZXIgPSB7MH0gaXMgbm90IGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgorY29udmVudGlvbi5pbGxlZ2FsSWRlbnRpZmllciA9ICcnezB9JycgaXMgbm90IGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgogY29udmVudGlvbi5pbXBvcnQubnVsbEltcG9ydCA9IEFuIGltcG9ydCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBiZSBudWxsLgogY29udmVudGlvbi5pbXBvcnQudW5xdWFsaWZpZWRJbXBvcnQgPSBBbiBpbXBvcnQgZGVjbGFyYXRpb24gbXVzdCBub3QgZW5kIHdpdGggYW4gdW5xdWFsaWZpZWQgKi4KIGNvbnZlbnRpb24udHlwZS5udWxsTmFtZSA9IEEgSmF2YSB0eXBlIG5hbWUgbXVzdCBub3QgYmUgbnVsbC4KIGNvbnZlbnRpb24udHlwZS5uYW1lV2l0aEJsYW5rcyA9IEEgSmF2YSB0eXBlIG5hbWUgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBibGFuay4KIGNvbnZlbnRpb24udHlwZS5kb2xsYXJOYW1lID0gQnkgY29udmVudGlvbiwgSmF2YSB0eXBlIG5hbWVzIHVzdWFsbHkgZG9uJyd0IGNvbnRhaW4gdGhlICQgY2hhcmFjdGVyLgogY29udmVudGlvbi50eXBlLmxvd2VyY2FzZU5hbWUgPSBCeSBjb252ZW50aW9uLCBKYXZhIHR5cGUgbmFtZXMgdXN1YWxseSBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuCi1jb252ZW50aW9uLnR5cGUuaW52YWxpZE5hbWUgPSBUaGUgdHlwZSBuYW1lIHswfSBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLgorY29udmVudGlvbi50eXBlLmludmFsaWROYW1lID0gVGhlIHR5cGUgbmFtZSAnJ3swfScnIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuCiBjb252ZW50aW9uLnBhY2thZ2UubnVsbE5hbWUgPSBBIHBhY2thZ2UgbmFtZSBtdXN0IG5vdCBiZSBudWxsLgogY29udmVudGlvbi5wYWNrYWdlLmVtcHR5TmFtZSA9IEEgcGFja2FnZSBuYW1lIG11c3Qgbm90IGJlIGVtcHR5LgogY29udmVudGlvbi5wYWNrYWdlLmRvdE5hbWUgPSBBIHBhY2thZ2UgbmFtZSBjYW5ub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBkb3QuCkBAIC0yMjYsNCArMjI2LDcgQEAKICMjIyBKRFQgQWRhcHRlcgogYW50LmpkdGFkYXB0ZXIuaW5mby51c2luZ0pkdENvbXBpbGVyID0gVXNpbmcgSkRUIGNvbXBpbGVyCiBhbnQuamR0YWRhcHRlci5lcnJvci5taXNzaW5nSkRUQ29tcGlsZXIgPSBDYW5ub3QgZmluZCB0aGUgSkRUIGNvbXBpbGVyCi1hbnQuamR0YWRhcHRlci5lcnJvci5taXNzaW5nSlJFTElCID0gQ2Fubm90IGJpbmQgdGhlIEpSRV9MSUIgdmFyaWFibGUuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgeW91IGNhbiBlaXRoZXIgc2V0IHRoZSBKUkVfTElCIHZhcmlhYmxlIG9yIHVzZSB0aGUgYm9vdGNsYXNzcGF0aCBwYXJhbWV0ZXIgaW4geW91ciBhbnQgamF2YWMgdGFzawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2FudC5qZHRhZGFwdGVyLmVycm9yLm1pc3NpbmdKUkVMSUIgPSBDYW5ub3QgYmluZCB0aGUgSlJFX0xJQiB2YXJpYWJsZS4gVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB5b3UgY2FuIGVpdGhlciBzZXQgdGhlIEpSRV9MSUIgdmFyaWFibGUgb3IgdXNlIHRoZSBib290Y2xhc3NwYXRoIHBhcmFtZXRlciBpbiB5b3VyIGFudCBqYXZhYyB0YXNrCithbnQuamR0YWRhcHRlci5lcnJvci5pZ25vcmluZ01lbW9yeUluaXRpYWxTaXplPSBTaW5jZSBmb3JrIGlzIGZhbHNlLCBpZ25vcmluZyBtZW1vcnlJbml0aWFsU2l6ZSBzZXR0aW5nCithbnQuamR0YWRhcHRlci5lcnJvci5pZ25vcmluZ01lbW9yeU1heGltdW1TaXplPSBTaW5jZSBmb3JrIGlzIGZhbHNlLCBpZ25vcmluZyBtZW1vcnlNYXhpbXVtU2l6ZSBzZXR0aW5nCithbnQuamR0YWRhcHRlci5lcnJvci5jb21waWxhdGlvbkZhaWxlZCA9IENvbXBpbGF0aW9uIGZhaWxlZC4gQ29tcGlsZXIgZXJyb3JzIGFyZSBhdmFpbGFibGUgaW4gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Bbm9ueW1vdXNGaWxlU291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fub255bW91c0ZpbGVTb3VyY2UuamF2YQppbmRleCBlOGFiYTAyLi5mNjVmZGY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fub255bW91c0ZpbGVTb3VyY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Fub255bW91c0ZpbGVTb3VyY2UuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheUJ1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlCdWZmZXIuamF2YQppbmRleCBjODQzYjI0Li5lZDhiYjQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheUJ1ZmZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5QnVmZmVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiAvKioKQEAgLTExMiwxNiArMTEyLDEyIEBACiAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIGlmIGFyZ3VtZW50cyBzcGVjaWZ5IGFuIGFycmF5IGluZGV4IG91dCBvZiBib3VuZHMuCiAgKi8KIHB1YmxpYyBDaGFyQXJyYXlCdWZmZXIgYXBwZW5kKGNoYXJbXSBzcmMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCWlmIChzdGFydCA8IDApCi0JCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCWlmIChzdGFydCA8IDApIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwlpZiAobGVuZ3RoIDwgMCkgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogCWlmIChzcmMgIT0gbnVsbCkgewogCQlpbnQgc3JjTGVuZ3RoID0gc3JjLmxlbmd0aDsKLQkJaWYgKHN0YXJ0ID4gc3JjTGVuZ3RoKQotCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQlpZiAobGVuZ3RoICsgc3RhcnQgPiBzcmNMZW5ndGgpCi0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJCWlmIChzdGFydCA+IHNyY0xlbmd0aCkgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCQlpZiAobGVuZ3RoICsgc3RhcnQgPiBzcmNMZW5ndGgpIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKIAkJLyoqIGRvIGxlbmd0aCBjaGVjayBoZXJlIHRvIGFsbG93IGV4Y2VwdGlvbnMgdG8gYmUgdGhyb3duICovCiAJCWlmIChsZW5ndGggPiAwKSB7CiAJCQlpZiAoZkVuZCA9PSBmU2l6ZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlPcHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2hhckFycmF5T3BzLmphdmEKaW5kZXggMWZjYmU5ZC4uMmFiMzRjNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DaGFyQXJyYXlPcHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NoYXJBcnJheU9wcy5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVBdHRyaWJ1dGUuamF2YQppbmRleCA1OTU1ODQ4Li5mMDAzZTk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCmluZGV4IDFlNzJhNWEuLmNhODAwZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVSZWFkZXIuamF2YQpAQCAtMSwxOCArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIC8qKgogICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJQ2xhc3NGaWxlUmVhZGVyLgogICovCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZUF0dHJpYnV0ZTsKQEAgLTI5LDcgKzMwLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmllbGRJbmZvW10gTk9fRklFTERfSU5GT1MgPSBuZXcgSUZpZWxkSW5mb1swXTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWV0aG9kSW5mb1tdIE5PX01FVEhPRF9JTkZPUyA9IG5ldyBJTWV0aG9kSW5mb1swXTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOT19JTlRFUkZBQ0VfSU5ERVhFUyA9IG5ldyBpbnRbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdW10gTk9fSU5URVJGQUNFU19OQU1FUyA9IG5ldyBjaGFyWzBdWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXVtdIE5PX0lOVEVSRkFDRVNfTkFNRVMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAogCXByaXZhdGUgSUNvbnN0YW50UG9vbCBjb25zdGFudFBvb2w7CiAJcHJpdmF0ZSBpbnQgbWFnaWNOdW1iZXI7CkBAIC01MSw3ICs1Miw2IEBACiAJcHJpdmF0ZSBpbnQgbWFqb3JWZXJzaW9uOwogCXByaXZhdGUgaW50IG1pbm9yVmVyc2lvbjsKIAlwcml2YXRlIGludCBzdXBlcmNsYXNzTmFtZUluZGV4OwotCXByaXZhdGUgaW50IGNsYXNzSW5kZXg7CiAJcHJpdmF0ZSBpbnQgYXR0cmlidXRlc0NvdW50OwogCXByaXZhdGUgSUNsYXNzRmlsZUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7CiAJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc0ZpbGVTdHJ1Y3QuamF2YQppbmRleCBjMmQ1YTZiLi4yY2U2NmI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzRmlsZVN0cnVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NGaWxlU3RydWN0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiAvKioKQEAgLTEwNiw0ICsxMDYsNCBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHRydWU7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29kZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db2RlQXR0cmlidXRlLmphdmEKaW5kZXggNzdkNDJhOC4uNmJkZDliNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db2RlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db2RlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbC5qYXZhCmluZGV4IGE4MzBmNDEuLjA0NmI1ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2wuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2w7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbEVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKaW5kZXggOTRjZjdlZC4uZWI1YTAxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRQb29sRW50cnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xFbnRyeTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFZhbHVlQXR0cmlidXRlLmphdmEKaW5kZXggOWZiYjdlNC4uYjU2ZTlmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFZhbHVlQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Db25zdGFudFZhbHVlQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGVmYXVsdEJ5dGVjb2RlVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKaW5kZXggYTZhNmJjNi4uYzI5ZmRhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yLmphdmEKQEAgLTEsMjkgKzEsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQnl0ZWNvZGVWaXNpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbENvbnN0YW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU9wY29kZU1uZW1vbmljczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLk9wY29kZVN0cmluZ1ZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnl0ZUNvZGVWaXNpdG9yCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWZhdWx0Qnl0ZWNvZGVWaXNpdG9yIGltcGxlbWVudHMgSUJ5dGVjb2RlVmlzaXRvciB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIElOSVQJPSAiPGluaXQ+Ii50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX05BTUUgPSBuZXcgY2hhclswXTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfTkFNRSA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9CT09MRUFOID0gNDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9DSEFSID0gNTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9GTE9BVCA9IDY7CkBAIC0xMDg0LDYgKzEwODQsNyBAQAogCQkJLmFwcGVuZChyZXR1cm5EZWNsYXJpbmdDbGFzc05hbWUoY29uc3RhbnRGaWVsZHJlZikpCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsYXNzbWVtYmVyc2VwYXJhdG9yIikpIC8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQoY29uc3RhbnRGaWVsZHJlZi5nZXRGaWVsZE5hbWUoKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChyZXR1cm5GaWVsZHJlZkRlc2NyaXB0b3IoY29uc3RhbnRGaWVsZHJlZikpCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQuZ2V0c3RhdGljY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKIAkJd3JpdGVOZXdMaW5lKCk7CkBAIC0xNjg2LDcgKzE2ODcsOSBAQAogCiAJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOwogCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOwotCisJCWNoYXJbXSByZXR1cm5UeXBlID0gU2lnbmF0dXJlLmdldFJldHVyblR5cGUobWV0aG9kRGVzY3JpcHRvcik7CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShyZXR1cm5UeXBlLCAnLycsICcuJyk7CisJCQogCQl3cml0ZVRhYnMoKTsKIAkJYnVmZmVyCiAJCQkuYXBwZW5kKHBjKQpAQCAtMTcwNSw3ICsxNzA4LDkgQEAKIAkJCQkJY29uc3RhbnRJbnRlcmZhY2VNZXRob2RyZWYuZ2V0TWV0aG9kTmFtZSgpLAogCQkJCQlnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yKSwKIAkJCQkJdHJ1ZSwKLQkJCQkJdHJ1ZSkpCisJCQkJCWZhbHNlKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkocmV0dXJuVHlwZSkpCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQuaW52b2tlaW50ZXJmYWNlbWV0aG9kY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTcxNCwxMCArMTcxOSwxMyBAQAogCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW52b2tlc3BlY2lhbChpbnQsIGludCwgSUNvbnN0YW50UG9vbEVudHJ5KQogCSAqLwogCXB1YmxpYyB2b2lkIF9pbnZva2VzcGVjaWFsKGludCBwYywgaW50IGluZGV4LCBJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRNZXRob2RyZWYpIHsKKwogCQljaGFyW10gbWV0aG9kRGVzY3JpcHRvciA9IGNvbnN0YW50TWV0aG9kcmVmLmdldE1ldGhvZERlc2NyaXB0b3IoKTsKIAkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKG1ldGhvZERlc2NyaXB0b3IsICcvJywgJy4nKTsKIAkJY2hhcltdIG1ldGhvZE5hbWUgPSBjb25zdGFudE1ldGhvZHJlZi5nZXRNZXRob2ROYW1lKCk7Ci0KKwkJY2hhcltdIHJldHVyblR5cGUgPSBTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZShtZXRob2REZXNjcmlwdG9yKTsKKwkJQ2hhck9wZXJhdGlvbi5yZXBsYWNlKHJldHVyblR5cGUsICcvJywgJy4nKTsKKwkJCiAJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhJTklULCBtZXRob2ROYW1lKSkgewogCQkJbWV0aG9kTmFtZSA9IEVNUFRZX05BTUU7CiAJCQl3cml0ZVRhYnMoKTsKQEAgLTE3MzksMTIgKzE3NDcsMTEgQEAKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQuaW52b2tlc3BlY2lhbGNvbnN0cnVjdG9yY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCXdyaXRlTmV3TGluZSgpOwogCQl9IGVsc2UgewotCQkJbWV0aG9kTmFtZSA9IEVNUFRZX05BTUU7CiAJCQl3cml0ZVRhYnMoKTsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQocGMpCiAJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoT3Bjb2RlU3RyaW5nVmFsdWVzLkJZVEVDT0RFX05BTUVTW0lPcGNvZGVNbmVtb25pY3MuQUxPQURfMF0pCisJCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5JTlZPS0VTUEVDSUFMXSkKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKGluZGV4KQogCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsbWV0aG9kIikpIC8vJE5PTi1OTFMtMSQKQEAgLTE3NTMsMTAgKzE3NjAsMTIgQEAKIAkJCQkuYXBwZW5kKAogCQkJCQlTaWduYXR1cmUudG9DaGFyQXJyYXkoCiAJCQkJCQltZXRob2REZXNjcmlwdG9yLAotCQkJCQkJbWV0aG9kTmFtZSwKKwkJCQkJCWNvbnN0YW50TWV0aG9kcmVmLmdldE1ldGhvZE5hbWUoKSwKIAkJCQkJCWdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IpLAogCQkJCQkJdHJ1ZSwKLQkJCQkJCXRydWUpKQorCQkJCQkJZmFsc2UpKQorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkocmV0dXJuVHlwZSkpCiAJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZXNwZWNpYWxtZXRob2RjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAogCQkJd3JpdGVOZXdMaW5lKCk7CiAJCX0KQEAgLTE3NjYsOCArMTc3NSwxMiBAQAogCSAqIEBzZWUgSUJ5dGVjb2RlVmlzaXRvciNfaW52b2tlc3RhdGljKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCiAJICovCiAJcHVibGljIHZvaWQgX2ludm9rZXN0YXRpYyhpbnQgcGMsIGludCBpbmRleCwgSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50TWV0aG9kcmVmKSB7CisKIAkJY2hhcltdIG1ldGhvZERlc2NyaXB0b3IgPSBjb25zdGFudE1ldGhvZHJlZi5nZXRNZXRob2REZXNjcmlwdG9yKCk7CiAJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXRob2REZXNjcmlwdG9yLCAnLycsICcuJyk7CisJCWNoYXJbXSByZXR1cm5UeXBlID0gU2lnbmF0dXJlLmdldFJldHVyblR5cGUobWV0aG9kRGVzY3JpcHRvcik7CisJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShyZXR1cm5UeXBlLCAnLycsICcuJyk7CisJCQogCQl3cml0ZVRhYnMoKTsKIAkJYnVmZmVyCiAJCQkuYXBwZW5kKHBjKQpAQCAtMTc4NCw3ICsxNzk3LDkgQEAKIAkJCQkJY29uc3RhbnRNZXRob2RyZWYuZ2V0TWV0aG9kTmFtZSgpLAogCQkJCQlnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2REZXNjcmlwdG9yKSwKIAkJCQkJdHJ1ZSwKLQkJCQkJdHJ1ZSkpCisJCQkJCWZhbHNlKSkKKwkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkocmV0dXJuVHlwZSkpCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3Nmb3JtYXQuaW52b2tlc3RhdGljbWV0aG9kY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKIAkJd3JpdGVOZXdMaW5lKCk7CiAJfQpAQCAtMTc5Myw4ICsxODA4LDEyIEBACiAJICogQHNlZSBJQnl0ZWNvZGVWaXNpdG9yI19pbnZva2V2aXJ0dWFsKGludCwgaW50LCBJQ29uc3RhbnRQb29sRW50cnkpCiAJICovCiAJcHVibGljIHZvaWQgX2ludm9rZXZpcnR1YWwoaW50IHBjLCBpbnQgaW5kZXgsIElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudE1ldGhvZHJlZikgeworCiAJCWNoYXJbXSBtZXRob2REZXNjcmlwdG9yID0gY29uc3RhbnRNZXRob2RyZWYuZ2V0TWV0aG9kRGVzY3JpcHRvcigpOwogCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UobWV0aG9kRGVzY3JpcHRvciwgJy8nLCAnLicpOworCQljaGFyW10gcmV0dXJuVHlwZSA9IFNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKG1ldGhvZERlc2NyaXB0b3IpOworCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UocmV0dXJuVHlwZSwgJy8nLCAnLicpOworCQkKIAkJd3JpdGVUYWJzKCk7CiAJCWJ1ZmZlcgogCQkJLmFwcGVuZChwYykKQEAgLTE4MTEsNyArMTgzMCw5IEBACiAJCQkJCWNvbnN0YW50TWV0aG9kcmVmLmdldE1ldGhvZE5hbWUoKSwKIAkJCQkJZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciksCiAJCQkJCXRydWUsCi0JCQkJCXRydWUpKQorCQkJCQlmYWxzZSkpCisJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KHJldHVyblR5cGUpKQogCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZm9ybWF0Lmludm9rZXZpcnR1YWxtZXRob2RjbG9zZSIpKTsgLy8kTk9OLU5MUy0xJAogCQl3cml0ZU5ld0xpbmUoKTsKIAl9CkBAIC0yMzAxLDE1ICsyMzIyLDE1IEBACiAJCQkuYXBwZW5kKHBjKQogCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5MT09LVVBTV0lUQ0hdKQotCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5kZWZhdWx0IikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoImRlZmF1bHQ6IikgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChkZWZhdWx0b2Zmc2V0ICsgcGMpOwogCQl3cml0ZU5ld0xpbmUoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBucGFpcnM7IGkrKykgewogCQkJd3JpdGVFeHRyYVRhYnMoMSk7CiAJCQlidWZmZXIKLQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmNhc2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoImNhc2UiKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChvZmZzZXRfcGFpcnNbaV1bMF0pCi0JCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb2xvbiIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZCgiOiIpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKG9mZnNldF9wYWlyc1tpXVsxXSArIHBjKTsKIAkJCXdyaXRlTmV3TGluZSgpOwogCQl9CkBAIC0yNzI1LDE1ICsyNzQ2LDE1IEBACiAJCQkuYXBwZW5kKHBjKQogCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSkgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChPcGNvZGVTdHJpbmdWYWx1ZXMuQllURUNPREVfTkFNRVNbSU9wY29kZU1uZW1vbmljcy5UQUJMRVNXSVRDSF0pCi0JCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmRlZmF1bHQiKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCgiZGVmYXVsdDoiKSAvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKGRlZmF1bHRvZmZzZXQgKyBwYyk7CiAJCXdyaXRlTmV3TGluZSgpOwogCQlmb3IgKGludCBpID0gbG93OyBpIDwgaGlnaCArIDE7IGkrKykgewogCQkJd3JpdGVFeHRyYVRhYnMoMSk7CiAJCQlidWZmZXIKLQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmNhc2UiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoImNhc2UiKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChpKQotCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29sb24iKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoIjoiKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChqdW1wX29mZnNldHNbaSAtIGxvd10gKyBwYyk7CiAJCQl3cml0ZU5ld0xpbmUoKTsKIAkJfQpAQCAtMjg0MywyOCArMjg2NCwyOCBAQAogCXByaXZhdGUgdm9pZCBhcHBlbmRHZXRBcnJheVR5cGUoaW50IGF0eXBlKSB7CiAJCXN3aXRjaChhdHlwZSkgewogCQkJY2FzZSBUX0JPT0xFQU4gOgotCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWJvb2xlYW4iKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoImJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0NIQVIgOgotCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWNoYXIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoImNoYXIiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0ZMT0FUIDoKLQkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlmbG9hdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgiZmxvYXQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0RPVUJMRSA6Ci0JCQkJdGhpcy5idWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZG91YmxlIikpOyAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKCJkb3VibGUiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0JZVEUgOgotCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWJ5dGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoImJ5dGUiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX1NIT1JUIDoKLQkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlzaG9ydCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRoaXMuYnVmZmVyLmFwcGVuZCgic2hvcnQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0lOVCA6Ci0JCQkJdGhpcy5idWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5aW50IikpOyAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5idWZmZXIuYXBwZW5kKCJpbnQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCWJyZWFrOwogCQkJY2FzZSBUX0xPTkcgOgotCQkJCXRoaXMuYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWxvbmciKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aGlzLmJ1ZmZlci5hcHBlbmQoImxvbmciKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCkBAIC0yODg3LDM3ICsyOTA4LDM3IEBACiAKIAlwcml2YXRlIHZvaWQgYXBwZW5kT3V0cHV0Rm9yQ29uc3RhbnREb3VibGUoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CiAJCXRoaXMuYnVmZmVyCi0JCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50ZG91YmxlIikpIC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoIjxEb3VibGUgIikgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXREb3VibGVWYWx1ZSgpKQotCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50IikpOyAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwcml2YXRlIHZvaWQgYXBwZW5kT3V0cHV0Rm9yQ29uc3RhbnRMb25nKElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSkgewogCQl0aGlzLmJ1ZmZlcgotCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudGxvbmciKSkgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCgiPExvbmcgIikgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXRMb25nVmFsdWUoKSkKLQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY2xvc2Vjb25zdGFudCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHJpdmF0ZSB2b2lkIGFwcGVuZE91dHB1dEZvckNvbnN0YW50U3RyaW5nKElDb25zdGFudFBvb2xFbnRyeSBjb25zdGFudFBvb2xFbnRyeSkgewogCQl0aGlzLmJ1ZmZlcgotCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHN0cmluZyIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCI8U3RyaW5nIFwiIikgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXRTdHJpbmdWYWx1ZSgpKQotCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50IikpOyAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXByaXZhdGUgdm9pZCBhcHBlbmRPdXRwdXRmb3JDb25zdGFudEludGVnZXIoSUNvbnN0YW50UG9vbEVudHJ5IGNvbnN0YW50UG9vbEVudHJ5KSB7CiAJCXRoaXMuYnVmZmVyCi0JCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50aW50ZWdlciIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCI8SW50ZWdlciAiKSAvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKGNvbnN0YW50UG9vbEVudHJ5LmdldEludGVnZXJWYWx1ZSgpKQotCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jbG9zZWNvbnN0YW50IikpOyAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwcml2YXRlIHZvaWQgYXBwZW5kT3V0cHV0Zm9yQ29uc3RhbnRGbG9hdChJQ29uc3RhbnRQb29sRW50cnkgY29uc3RhbnRQb29sRW50cnkpIHsKIAkJdGhpcy5idWZmZXIKLQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29uc3RhbnRmbG9hdCIpKSAvLyROT04tTkxTLTEkCisJCQkuYXBwZW5kKCI8RmxvYXQgIikgLy8kTk9OLU5MUy0xJAogCQkJLmFwcGVuZChjb25zdGFudFBvb2xFbnRyeS5nZXRGbG9hdFZhbHVlKCkpCi0JCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsb3NlY29uc3RhbnQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCS5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXByaXZhdGUgdm9pZCB3cml0ZU5ld0xpbmUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2Fzc2VtYmxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EaXNhc3NlbWJsZXIuamF2YQppbmRleCAxNjU0YmVjLi5hZjdlMGMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0Rpc2Fzc2VtYmxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRGlzYXNzZW1ibGVyLmphdmEKQEAgLTEsMTkgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29kZUF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDb25zdGFudFBvb2xDb25zdGFudDsKQEAgLTMwLDQ5ICszMSwzNzAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNZXRob2RJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1vZGlmaWVyQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSVNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIERpc2Fzc2VtYmxlciBvZiAuY2xhc3MgZmlsZXMuIEl0IGdlbmVyYXRlcyBhbiBvdXRwdXQgaW4gdGhlIFdyaXRlciB0aGF0IGxvb2tzIGNsb3NlIHRvCiAgKiB0aGUgamF2YXAgb3V0cHV0LgogICovCi1wdWJsaWMgY2xhc3MgRGlzYXNzZW1ibGVyIGltcGxlbWVudHMgSUNsYXNzRmlsZURpc2Fzc2VtYmxlciB7CitwdWJsaWMgY2xhc3MgRGlzYXNzZW1ibGVyIGV4dGVuZHMgQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEFOWV9FWENFUFRJT04gPSBVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hbnlleGNlcHRpb25oYW5kbGVyIikudG9DaGFyQXJyYXkoKTsJIC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfT1VUUFVUID0gIiI7IC8vJE5PTi1OTFMtMSQKIAkKLQkvKioKLQkgKiBBbnN3ZXJzIGJhY2sgdGhlIGRpc2Fzc2VtYmxlZCBzdHJpbmcgb2YgdGhlIGNsYXNzZmlsZSBieXRlcyBhY2NvcmRpbmcgdG8gdGhlCi0JICogbW9kZS4KLQkgKiBUaGlzIGlzIGFuIG91dHB1dCBxdWl0ZSBzaW1pbGFyIHRvIHRoZSBqYXZhcCB0b29sLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0ZpbGVCeXRlcyBUaGUgYnl0ZXMgb2YgdGhlIGNsYXNzZmlsZSB0byBkaXNhc3NlbWJsZQotCSAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yIHRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuCi0JICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgdXNlZCB0byBkaXNhc3NlbWJsZSB0aGUgY2xhc3NmaWxlCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzYXNzZW1ibGVkIHN0cmluZyBvZiB0aGUgY2xhc3NmaWxlIGFjY29yZGluZyB0byB0aGUgbW9kZQotCSAqIEBleGNlcHRpb24gQ2xhc3NGb3JtYXRFeGNlcHRpb24gaWYgdGhlIGNsYXNzZmlsZSBieXRlcyBhcmUgaWxsLWZvcm1lZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGlzYXNzZW1ibGUoYnl0ZVtdIGNsYXNzZmlsZUJ5dGVzLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IG1vZGUpIHRocm93cyBDbGFzc0Zvcm1hdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkaXNhc3NlbWJsZShuZXcgQ2xhc3NGaWxlUmVhZGVyKGNsYXNzZmlsZUJ5dGVzLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCksIGxpbmVTZXBhcmF0b3IsIG1vZGUpOworCXByaXZhdGUgdm9pZCBjaGVja1N1cGVyRmxhZ3MoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciApIHsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1VQRVIpID09IDApIHsKKwkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCQlidWZmZXIKKwkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCisJCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5zdXBlcmZsYWdub3RzZXQiKSkgLy8kTk9OLU5MUy0xJAorCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlY29kZU1vZGlmaWVyc0ZvckZpZWxkKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBhY2Nlc3NGbGFncykgeworCQlib29sZWFuIGZpcnN0TW9kaWZpZXIgPSB0cnVlOworCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19GSU5BTCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJmaW5hbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJJVkFURSkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJwcml2YXRlIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUk9URUNURUQpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgicHJvdGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgicHVibGljIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TVEFUSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19UUkFOU0lFTlQpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgidHJhbnNpZW50Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19WT0xBVElMRSkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJ2b2xhdGlsZSIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CQorCisJcHJpdmF0ZSBmaW5hbCB2b2lkIGRlY29kZU1vZGlmaWVyc0ZvcklubmVyQ2xhc3NlcyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MpIHsKKwkJYm9vbGVhbiBmaXJzdE1vZGlmaWVyID0gdHJ1ZTsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFVCTElDKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoInB1YmxpYyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJJVkFURSkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJwcml2YXRlIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUk9URUNURUQpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgicHJvdGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TVEFUSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgic3RhdGljIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19GSU5BTCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJmaW5hbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfQUJTVFJBQ1QpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiYWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCB2b2lkIGRlY29kZU1vZGlmaWVyc0Zvck1ldGhvZChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MpIHsKKwkJYm9vbGVhbiBmaXJzdE1vZGlmaWVyID0gdHJ1ZTsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfQUJTVFJBQ1QpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiYWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoImZpbmFsIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19OQVRJVkUpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgibmF0aXZlIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUklWQVRFKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoInByaXZhdGUiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BST1RFQ1RFRCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJwcm90ZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BVQkxJQykgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJwdWJsaWMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NUQVRJQykgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJzdGF0aWMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NUUklDVCkgIT0gMCkgeworCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKKwkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7CisJCQl9CisJCQlidWZmZXIuYXBwZW5kKCJzdHJpY3RmcCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoInN5bmNocm9uaXplZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7CisJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9yVHlwZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MpIHsKKwkJYm9vbGVhbiBmaXJzdE1vZGlmaWVyID0gdHJ1ZTsKKwkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfQUJTVFJBQ1QpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgiYWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMKSAhPSAwKSB7CisJCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZmlyc3RNb2RpZmllcikgeworCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKKwkJCX0KKwkJCWJ1ZmZlci5hcHBlbmQoImZpbmFsIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QVUJMSUMpICE9IDApIHsKKwkJCWlmICghZmlyc3RNb2RpZmllcikgeworCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWlmIChmaXJzdE1vZGlmaWVyKSB7CisJCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOworCQkJfQorCQkJYnVmZmVyLmFwcGVuZCgicHVibGljIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGRlY29kZVN0cmluZ1ZhbHVlKFN0cmluZyBzKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWNoYXJbXSBjaGFycyA9IHMudG9DaGFyQXJyYXkoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGNoYXJzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQljaGFyIGMgPSBjaGFyc1tpXTsKKwkJCXN3aXRjaChjKSB7CisJCQkJY2FzZSAnXGInIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHQnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXG4nIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXGYnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFxmIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHInIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXCInOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXCcnOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXFwnIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXFwnOgorCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDAnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFwwIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDEnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFwxIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDInIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFwyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDMnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFwzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDQnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFw0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDUnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFw1Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDYnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFw2Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDcnIDoKKwkJCQkJYnVmZmVyLmFwcGVuZCgiXFw3Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CQkJCisJCQkJZGVmYXVsdDoKKwkJCQkJYnVmZmVyLmFwcGVuZChjKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJfQogCiAJLyoqCi0JICogRGlzYXNzZW1ibGUgdGhlIGNsYXNzIGZpbGUgcmVhZGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciNkaXNhc3NlbWJsZShieXRlW10sIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyBkaXNhc3NlbWJsZShieXRlW10gY2xhc3NGaWxlQnl0ZXMsIFN0cmluZyBsaW5lU2VwYXJhdG9yKSB0aHJvd3MgQ2xhc3NGb3JtYXRFeGNlcHRpb24geworCQlyZXR1cm4gZGlzYXNzZW1ibGUobmV3IENsYXNzRmlsZVJlYWRlcihjbGFzc0ZpbGVCeXRlcywgSUNsYXNzRmlsZVJlYWRlci5BTEwpLCBsaW5lU2VwYXJhdG9yLCBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERUZBVUxUKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIjZGlzYXNzZW1ibGUoYnl0ZVtdLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIFN0cmluZyBkaXNhc3NlbWJsZShieXRlW10gY2xhc3NGaWxlQnl0ZXMsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgbW9kZSkgdGhyb3dzIENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRpc2Fzc2VtYmxlKG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlQnl0ZXMsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKSwgbGluZVNlcGFyYXRvciwgbW9kZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVEaXNhc3NlbWJsZXIjZGlzYXNzZW1ibGUob3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlUmVhZGVyLCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZGlzYXNzZW1ibGUoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yKSB7Ci0JCXJldHVybiBkaXNhc3NlbWJsZShjbGFzc0ZpbGVSZWFkZXIsIGxpbmVTZXBhcmF0b3IsIElDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuREVGQVVMVCk7CisJCXJldHVybiBkaXNhc3NlbWJsZShjbGFzc0ZpbGVSZWFkZXIsIGxpbmVTZXBhcmF0b3IsIENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFRkFVTFQpOwogCX0KIAogCS8qKgotCSAqIERpc2Fzc2VtYmxlIHRoZSBjbGFzcyBmaWxlIHJlYWRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZURpc2Fzc2VtYmxlciNkaXNhc3NlbWJsZShvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklDbGFzc0ZpbGVSZWFkZXIsIGphdmEubGFuZy5TdHJpbmcsIGludCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IG1vZGUpIHsKIAkJaWYgKGNsYXNzRmlsZVJlYWRlciA9PSBudWxsKSByZXR1cm4gRU1QVFlfT1VUUFVUOwogCQkKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAotCQlpZiAobW9kZSA9PSBJQ2xhc3NGaWxlRGlzYXNzZW1ibGVyLkRFVEFJTEVEKSB7CisJCWlmIChtb2RlID09IENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKSB7CiAJCQlpbnQgbWlub3JWZXJzaW9uID0gY2xhc3NGaWxlUmVhZGVyLmdldE1pbm9yVmVyc2lvbigpOwogCQkJaW50IG1ham9yVmVyc2lvbiA9IGNsYXNzRmlsZVJlYWRlci5nZXRNYWpvclZlcnNpb24oKTsKIAkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudHN0YXJ0IikpOyAvLyROT04tTkxTLTEkCkBAIC0xMTQsMjUgKzQzNiw0MiBAQAogCQkJLy8gaW5jb21wbGV0ZSBpbml0aWFsaXphdGlvbi4gV2UgY2Fubm90IGdvIGZ1cnRoZXIuCiAJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAJCX0KLQkJZGVjb2RlTW9kaWZpZXJzRm9yVHlwZShidWZmZXIsIGNsYXNzRmlsZVJlYWRlci5nZXRBY2Nlc3NGbGFncygpKTsKLQkJaWYgKGNsYXNzRmlsZVJlYWRlci5pc0NsYXNzKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCUlJbm5lckNsYXNzZXNBdHRyaWJ1dGUgaW5uZXJDbGFzc2VzQXR0cmlidXRlID0gY2xhc3NGaWxlUmVhZGVyLmdldElubmVyQ2xhc3Nlc0F0dHJpYnV0ZSgpOworCQkKKwkJaWYgKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkvLyBzZWFyY2ggdGhlIHJpZ2h0IGVudHJ5CisJCQlJSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnlbXSBlbnRyaWVzID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlLmdldElubmVyQ2xhc3NBdHRyaWJ1dGVzRW50cmllcygpOworCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4IDsgaSsrKSB7CisJCQkJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQljaGFyW10gaW5uZXJDbGFzc05hbWUgPSBlbnRyeS5nZXRJbm5lckNsYXNzTmFtZSgpOworCQkJCWlmIChpbm5lckNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQkJCWlmIChDaGFyT3BlcmF0aW9uLmVxdWFscyhjbGFzc0ZpbGVSZWFkZXIuZ2V0Q2xhc3NOYW1lKCksIGlubmVyQ2xhc3NOYW1lKSkgeworCQkJCQkJZGVjb2RlTW9kaWZpZXJzRm9ySW5uZXJDbGFzc2VzKGJ1ZmZlciwgZW50cnkuZ2V0QWNjZXNzRmxhZ3MoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmludGVyZmFjZSIpKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVjb2RlTW9kaWZpZXJzRm9yVHlwZShidWZmZXIsIGNsYXNzRmlsZVJlYWRlci5nZXRBY2Nlc3NGbGFncygpKTsKKwkJfQorCQlpZiAoY2xhc3NGaWxlUmVhZGVyLmlzQ2xhc3MoKSkgeworCQkJYnVmZmVyLmFwcGVuZCgiY2xhc3MgIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWJ1ZmZlci5hcHBlbmQoImludGVyZmFjZSAiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShjbGFzc05hbWUsICcvJywgJy4nKTsKIAkJYnVmZmVyLmFwcGVuZChjbGFzc05hbWUpOwogCQkKIAkJY2hhcltdIHN1cGVyY2xhc3NOYW1lID0gY2xhc3NGaWxlUmVhZGVyLmdldFN1cGVyY2xhc3NOYW1lKCk7CiAJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmV4dGVuZHMiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoIiBleHRlbmRzICIpOyAvLyROT04tTkxTLTEkCiAJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uoc3VwZXJjbGFzc05hbWUsICcvJywgJy4nKTsKIAkJCWJ1ZmZlci5hcHBlbmQoc3VwZXJjbGFzc05hbWUpOwogCQl9CiAJCWNoYXJbXVtdIHN1cGVyY2xhc3NJbnRlcmZhY2VzID0gY2xhc3NGaWxlUmVhZGVyLmdldEludGVyZmFjZU5hbWVzKCk7CiAJCWludCBsZW5ndGggPSBzdXBlcmNsYXNzSW50ZXJmYWNlcy5sZW5ndGg7CiAJCWlmIChsZW5ndGggIT0gMCkgewotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5pbXBsZW1lbnRzIikpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKCIgaW1wbGVtZW50cyAiKTsgLy8kTk9OLU5MUy0xJAogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHsKIAkJCQljaGFyW10gc3VwZXJpbnRlcmZhY2UgPSBzdXBlcmNsYXNzSW50ZXJmYWNlc1tpXTsKIAkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2Uoc3VwZXJpbnRlcmZhY2UsICcvJywgJy4nKTsKQEAgLTE0Nyw4ICs0ODYsNyBAQAogCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLm9wZW50eXBlZGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKIAkJY2hlY2tTdXBlckZsYWdzKGJ1ZmZlciwgY2xhc3NGaWxlUmVhZGVyLmdldEFjY2Vzc0ZsYWdzKCksIGxpbmVTZXBhcmF0b3IsIDEpOwogCQlkaXNhc3NlbWJsZVR5cGVNZW1iZXJzKGNsYXNzRmlsZVJlYWRlciwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCAxLCBtb2RlKTsKLQkJaWYgKG1vZGUgPT0gSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERVRBSUxFRCkgewotCQkJSUlubmVyQ2xhc3Nlc0F0dHJpYnV0ZSBpbm5lckNsYXNzZXNBdHRyaWJ1dGUgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0SW5uZXJDbGFzc2VzQXR0cmlidXRlKCk7CisJCWlmIChtb2RlID09IENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKSB7CiAJCQlpZiAoaW5uZXJDbGFzc2VzQXR0cmlidXRlICE9IG51bGwpIHsKIAkJCQlkaXNhc3NlbWJsZShpbm5lckNsYXNzZXNBdHRyaWJ1dGUsIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgMSk7CiAJCQl9CkBAIC0xODMsOCArNTIxLDEwIEBACiAJCQlvdXRlckNsYXNzTmFtZUluZGV4ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0T3V0ZXJDbGFzc05hbWVJbmRleCgpOwogCQkJaW5uZXJOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lck5hbWVJbmRleCgpOwogCQkJYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRBY2Nlc3NGbGFncygpOworCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5vcGVuaW5uZXJjbGFzc2VudHJ5IikpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOworCQkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOwogCQkJYnVmZmVyCi0JCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5vcGVuaW5uZXJjbGFzc2VudHJ5IikpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmlubmVyX2NsYXNzX2luZm9fbmFtZSIpKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCIpKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChpbm5lckNsYXNzTmFtZUluZGV4KTsKQEAgLTE5Myw3ICs1MzMsNyBAQAogCQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKIAkJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRJbm5lckNsYXNzTmFtZSgpKTsKIAkJCX0KLQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIub3V0ZXJfY2xhc3NfaW5mb19uYW1lIikpIC8vJE5PTi1OTFMtMSQKQEAgLTIwNCw3ICs1NDQsNyBAQAogCQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKIAkJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRPdXRlckNsYXNzTmFtZSgpKTsKIAkJCX0KLQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCWR1bXBUYWIodGFiTnVtYmVyICsgMSwgYnVmZmVyKTsKIAkJCWJ1ZmZlcgogCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfbmFtZSIpKSAvLyROT04tTkxTLTEkCkBAIC0yMTUsNyArNTU1LDcgQEAKIAkJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCiAJCQkJCS5hcHBlbmQoaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJOYW1lKCkpOwogCQkJfQotCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOwogCQkJYnVmZmVyCiAJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5pbm5lcl9hY2Nlc3NmbGFncyIpKSAvLyROT04tTkxTLTEkCkBAIC0yMzMsOCArNTczLDEwIEBACiAJCW91dGVyQ2xhc3NOYW1lSW5kZXggPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRPdXRlckNsYXNzTmFtZUluZGV4KCk7CiAJCWlubmVyTmFtZUluZGV4ID0gaW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuZ2V0SW5uZXJOYW1lSW5kZXgoKTsKIAkJYWNjZXNzRmxhZ3MgPSBpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRBY2Nlc3NGbGFncygpOworCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLm9wZW5pbm5lcmNsYXNzZW50cnkiKSk7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKKwkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOwogCQlidWZmZXIKLQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIub3BlbmlubmVyY2xhc3NlbnRyeSIpKSAvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmlubmVyX2NsYXNzX2luZm9fbmFtZSIpKSAvLyROT04tTkxTLTEkCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbnN0YW50cG9vbGluZGV4IikpIC8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQoaW5uZXJDbGFzc05hbWVJbmRleCk7CkBAIC0yNDMsNyArNTg1LDcgQEAKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmdldElubmVyQ2xhc3NOYW1lKCkpOwogCQl9Ci0JCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlciArIDEpOworCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQlkdW1wVGFiKHRhYk51bWJlciArIDEsIGJ1ZmZlcik7CiAJCWJ1ZmZlcgogCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5vdXRlcl9jbGFzc19pbmZvX25hbWUiKSkgLy8kTk9OLU5MUy0xJApAQCAtMjU0LDcgKzU5Niw3IEBACiAJCQkJLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKSAvLyROT04tTkxTLTEkCiAJCQkJLmFwcGVuZChpbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5nZXRPdXRlckNsYXNzTmFtZSgpKTsKIAkJfQotCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOwogCQlidWZmZXIKIAkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfbmFtZSIpKSAvLyROT04tTkxTLTEkCkBAIC0yNjUsNyArNjA3LDcgQEAKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpIC8vJE5PTi1OTFMtMSQKIAkJCQkuYXBwZW5kKGlubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmdldElubmVyTmFtZSgpKTsKIAkJfQotCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAxKTsKKwkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJZHVtcFRhYih0YWJOdW1iZXIgKyAxLCBidWZmZXIpOwogCQlidWZmZXIKIAkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuaW5uZXJfYWNjZXNzZmxhZ3MiKSkgLy8kTk9OLU5MUy0xJApAQCAtMjc1LDQwICs2MTcsNiBAQAogCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNsb3NlaW5uZXJjbGFzc2VudHJ5IikpOyAvLyROT04tTkxTLTEkCiAJfQogCQotCXByaXZhdGUgdm9pZCBjaGVja1N1cGVyRmxhZ3MoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlciApIHsKLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1VQRVIpID09IDApIHsKLQkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7Ci0JCQlidWZmZXIKLQkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5zdXBlcmZsYWdub3RzZXQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuY29tbWVudGVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXBUYWIoaW50IHRhYk51bWJlciwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYk51bWJlcjsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnRhYiIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfSAKLQkKLQlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGVUeXBlTWVtYmVycyhJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7Ci0JCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7Ci0JCUlGaWVsZEluZm9bXSBmaWVsZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0RmllbGRJbmZvcygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlkaXNhc3NlbWJsZShmaWVsZHNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKLQkJfQotCQlJTWV0aG9kSW5mb1tdIG1ldGhvZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWRpc2Fzc2VtYmxlKGNsYXNzRmlsZVJlYWRlciwgbWV0aG9kc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTmV3TGluZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlcikgewotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQlkdW1wVGFiKHRhYk51bWJlciwgYnVmZmVyKTsKLQl9Ci0gCiAJLyoqCiAJICogRGlzYXNzZW1ibGUgYSBmaWVsZCBpbmZvCiAJICovCkBAIC0zNjcsNyArNjc1LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJaWYgKG1vZGUgPT0gSUNsYXNzRmlsZURpc2Fzc2VtYmxlci5ERVRBSUxFRCkgeworCQlpZiAobW9kZSA9PSBDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCkgewogCQkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyKTsKIAkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShmaWVsZERlc2NyaXB0b3IsICcuJywgJy8nKTsKIAkJCWJ1ZmZlcgpAQCAtMzg2LDYgKzY5NCw4IEBACiAJICogRGlzYXNzZW1ibGUgYSBtZXRob2QgaW5mbyBoZWFkZXIKIAkgKi8KIAlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGUoSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIsIElNZXRob2RJbmZvIG1ldGhvZEluZm8sIFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBpbnQgdGFiTnVtYmVyLCBpbnQgbW9kZSkgeworCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7CisJCQogCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIpOwogCQlpbnQgYWNjZXNzRmxhZ3MgPSBtZXRob2RJbmZvLmdldEFjY2Vzc0ZsYWdzKCk7CiAJCWRlY29kZU1vZGlmaWVyc0Zvck1ldGhvZChidWZmZXIsIGFjY2Vzc0ZsYWdzKTsKQEAgLTM5NCwxNyArNzA0LDE3IEBACiAJCWNoYXJbXSBtZXRob2ROYW1lID0gbnVsbDsKIAkJaWYgKG1ldGhvZEluZm8uaXNDb25zdHJ1Y3RvcigpKSB7CiAJCQltZXRob2ROYW1lID0gY2xhc3NGaWxlUmVhZGVyLmdldENsYXNzTmFtZSgpOwotCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkobWV0aG9kRGVzY3JpcHRvciwgbWV0aG9kTmFtZSwgZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvcikgLCB0cnVlLCBmYWxzZSkpOworCQkJYnVmZmVyLmFwcGVuZChTaWduYXR1cmUudG9DaGFyQXJyYXkobWV0aG9kRGVzY3JpcHRvciwgbWV0aG9kTmFtZSwgZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kRGVzY3JpcHRvciwgY29kZUF0dHJpYnV0ZSwgYWNjZXNzRmxhZ3MpICwgdHJ1ZSwgZmFsc2UpKTsKIAkJfSBlbHNlIGlmIChtZXRob2RJbmZvLmlzQ2xpbml0KCkpIHsKIAkJCW1ldGhvZE5hbWUgPSBVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5jbGluaXRuYW1lIikudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAogCQkJYnVmZmVyLmFwcGVuZChtZXRob2ROYW1lKTsKIAkJfSBlbHNlIHsKIAkJCW1ldGhvZE5hbWUgPSBtZXRob2RJbmZvLmdldE5hbWUoKTsKLQkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KG1ldGhvZERlc2NyaXB0b3IsIG1ldGhvZE5hbWUsIGdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IpICwgZmFsc2UsIHRydWUpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KG1ldGhvZERlc2NyaXB0b3IsIG1ldGhvZE5hbWUsIGdldFBhcmFtZXRlck5hbWVzKG1ldGhvZERlc2NyaXB0b3IsIGNvZGVBdHRyaWJ1dGUsIGFjY2Vzc0ZsYWdzKSAsIGZhbHNlLCB0cnVlKSk7CiAJCX0KIAkJSUV4Y2VwdGlvbkF0dHJpYnV0ZSBleGNlcHRpb25BdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldEV4Y2VwdGlvbkF0dHJpYnV0ZSgpOwogCQlpZiAoZXhjZXB0aW9uQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQudGhyb3dzIikpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKCIgdGhyb3dzICIpOyAvLyROT04tTkxTLTEkCiAJCQljaGFyW11bXSBleGNlcHRpb25OYW1lcyA9IGV4Y2VwdGlvbkF0dHJpYnV0ZS5nZXRFeGNlcHRpb25OYW1lcygpOwogCQkJaW50IGxlbmd0aCA9IGV4Y2VwdGlvbk5hbWVzLmxlbmd0aDsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7CkBAIC00MjEsNyArNzMxLDcgQEAKIAkJfQogCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmVuZG9mbWV0aG9kaGVhZGVyIikpOyAvLyROT04tTkxTLTEkCiAJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7Ci0JCWlmIChtb2RlID09IElDbGFzc0ZpbGVEaXNhc3NlbWJsZXIuREVUQUlMRUQpIHsKKwkJaWYgKG1vZGUgPT0gQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIuREVUQUlMRUQpIHsKIAkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShtZXRob2REZXNjcmlwdG9yLCAnLicsICcvJyk7CiAJCQlidWZmZXIKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRzdGFydCIpKSAvLyROT04tTkxTLTEkCkBAIC00MzMsNyArNzQzLDYgQEAKIAkJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmNvbW1lbnRlbmQiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CiAJCX0KLQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwogCQlJQ2xhc3NGaWxlQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IG1ldGhvZEluZm8uZ2V0QXR0cmlidXRlcygpOwogCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGg7CiAJCWlmIChsZW5ndGggIT0gMCkgewpAQCAtNDUyLDggKzc2MSw5IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGRpc2Fzc2VtYmxlKElDbGFzc0ZpbGVBdHRyaWJ1dGUgY2xhc3NGaWxlQXR0cmlidXRlLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgaW50IHRhYk51bWJlcikgewotCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmdlbmVyaWNhdHRyaWJ1dGVoZWFkZXIiKSk7IC8vJE5PTi1OTFMtMSQKIAkJd3JpdGVOZXdMaW5lKGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyICsgMSk7CisJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuZ2VuZXJpY2F0dHJpYnV0ZWhlYWRlciIpKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZU5ld0xpbmUoYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIgKyAyKTsKIAkJYnVmZmVyCiAJCQkuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLmdlbmVyaWNhdHRyaWJ1dGVuYW1lIikpIC8vJE5PTi1OTFMtMSQKIAkJCS5hcHBlbmQoY2xhc3NGaWxlQXR0cmlidXRlLmdldEF0dHJpYnV0ZU5hbWUoKSkKQEAgLTU2NywzMjcgKzg3Nyw4MyBAQAogCQkJCS5hcHBlbmQoU2lnbmF0dXJlLnRvQ2hhckFycmF5KGxvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmdldERlc2NyaXB0b3IoKSkpOwogCQl9IAogCX0KKwkKKwlwcml2YXRlIHZvaWQgZGlzYXNzZW1ibGVUeXBlTWVtYmVycyhJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIsIGludCBtb2RlKSB7CisJCXdyaXRlTmV3TGluZShidWZmZXIsIGxpbmVTZXBhcmF0b3IsIHRhYk51bWJlcik7CisJCUlGaWVsZEluZm9bXSBmaWVsZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0RmllbGRJbmZvcygpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmllbGRzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CisJCQlkaXNhc3NlbWJsZShmaWVsZHNbaV0sIGJ1ZmZlciwgbGluZVNlcGFyYXRvciwgdGFiTnVtYmVyLCBtb2RlKTsKKwkJfQorCQlJTWV0aG9kSW5mb1tdIG1ldGhvZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCWRpc2Fzc2VtYmxlKGNsYXNzRmlsZVJlYWRlciwgbWV0aG9kc1tpXSwgYnVmZmVyLCBsaW5lU2VwYXJhdG9yLCB0YWJOdW1iZXIsIG1vZGUpOworCQl9CisJfQorCQorCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wVGFiKGludCB0YWJOdW1iZXIsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJOdW1iZXI7IGkrKykgeworCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci50YWIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0gCisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyI2dldERlc2NyaXB0aW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCX0KIAotCXByaXZhdGUgY2hhcltdW10gZ2V0UGFyYW1ldGVyTmFtZXMoY2hhcltdIG1ldGhvZERlc2NyaXB0b3IpIHsKKworCXByaXZhdGUgY2hhcltdW10gZ2V0UGFyYW1ldGVyTmFtZXMoY2hhcltdIG1ldGhvZERlc2NyaXB0b3IsIElDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUsIGludCBhY2Nlc3NGbGFncykgewogCQlpbnQgcGFyYW1Db3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChtZXRob2REZXNjcmlwdG9yKTsKIAkJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMgPSBuZXcgY2hhcltwYXJhbUNvdW50XVtdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgewotCQkJcGFyYW1ldGVyTmFtZXNbaV0gPSBVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5wYXJhbWV0ZXJuYW1lIikudG9DaGFyQXJyYXkoKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBjaGVjayBpZiB0aGUgY29kZSBhdHRyaWJ1dGUgaGFzIGRlYnVnIGluZm8gZm9yIHRoaXMgbWV0aG9kCisJCWlmIChjb2RlQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCUlMb2NhbFZhcmlhYmxlQXR0cmlidXRlIGxvY2FsVmFyaWFibGVBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExvY2FsVmFyaWFibGVBdHRyaWJ1dGUoKTsKKwkJCWlmIChsb2NhbFZhcmlhYmxlQXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQlJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnlbXSBlbnRyaWVzID0gbG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5nZXRMb2NhbFZhcmlhYmxlVGFibGUoKTsKKwkJCQlpbnQgc3RhcnRpbmdJbmRleCA9IChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1RBVElDKSAhPSAwID8gMCA6IDE7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbUNvdW50OyBpKyspIHsKKwkJCQkJSUxvY2FsVmFyaWFibGVUYWJsZUVudHJ5IHNlYXJjaGVkRW50cnkgPSBnZXRFbnRyeUZvcihzdGFydGluZ0luZGV4ICsgaSwgZW50cmllcyk7CisJCQkJCWlmIChzZWFyY2hlZEVudHJ5ICE9IG51bGwpIHsKKwkJCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gc2VhcmNoZWRFbnRyeS5nZXROYW1lKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9IFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnBhcmFtZXRlcm5hbWUiKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7CisJCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIucGFyYW1ldGVybmFtZSIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQ291bnQ7IGkrKykgeworCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIucGFyYW1ldGVybmFtZSIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KIAkJfQogCQlyZXR1cm4gcGFyYW1ldGVyTmFtZXM7CiAJfQorCS8qKgorCSAqIE1ldGhvZCBnZXRFbnRyeUZvci4KKwkgKiBAcGFyYW0gbG9jYWxJbmRleAorCSAqIEBwYXJhbSBlbnRyaWVzCisJICogQHJldHVybiBJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkKKwkgKi8KKwlwcml2YXRlIElMb2NhbFZhcmlhYmxlVGFibGVFbnRyeSBnZXRFbnRyeUZvcigKKwkJaW50IGxvY2FsSW5kZXgsCisJCUlMb2NhbFZhcmlhYmxlVGFibGVFbnRyeVtdIGVudHJpZXMpIHsKKwkJCQorCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlJTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOworCQkJCWlmIChsb2NhbEluZGV4ID09IGVudHJ5LmdldEluZGV4KCkpIHsKKwkJCQkJcmV0dXJuIGVudHJ5OworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCX0KIAkKLQlwcml2YXRlIGZpbmFsIHZvaWQgZGVjb2RlTW9kaWZpZXJzRm9yVHlwZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MpIHsKLQkJYm9vbGVhbiBmaXJzdE1vZGlmaWVyID0gdHJ1ZTsKLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfQUJTVFJBQ1QpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfYWJzdHJhY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19GSU5BTCkgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19maW5hbCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BVQkxJQykgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wdWJsaWMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBkZWNvZGVNb2RpZmllcnNGb3JJbm5lckNsYXNzZXMoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzKSB7Ci0JCWJvb2xlYW4gZmlyc3RNb2RpZmllciA9IHRydWU7Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BVQkxJQykgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wdWJsaWMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUklWQVRFKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3ByaXZhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUk9URUNURUQpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHJvdGVjdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1RBVElDKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3N0YXRpYyIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2ZpbmFsIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfQUJTVFJBQ1QpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfYWJzdHJhY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBkZWNvZGVNb2RpZmllcnNGb3JNZXRob2QoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGFjY2Vzc0ZsYWdzKSB7Ci0JCWJvb2xlYW4gZmlyc3RNb2RpZmllciA9IHRydWU7Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX2Fic3RyYWN0IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfRklOQUwpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfZmluYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19OQVRJVkUpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfbmF0aXZlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJJVkFURSkgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wcml2YXRlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFJPVEVDVEVEKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3Byb3RlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1BVQkxJQykgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19wdWJsaWMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19TVEFUSUMpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2Nfc3RhdGljIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfU1RSSUNUKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3N0cmljdCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NZTkNIUk9OSVpFRCkgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19zeW5jaHJvbml6ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVNb2RpZmllcnNGb3JGaWVsZChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgYWNjZXNzRmxhZ3MpIHsKLQkJYm9vbGVhbiBmaXJzdE1vZGlmaWVyID0gdHJ1ZTsKLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfRklOQUwpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfZmluYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUklWQVRFKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3ByaXZhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19QUk9URUNURUQpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfcHJvdGVjdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfUFVCTElDKSAhPSAwKSB7Ci0JCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiZGlzYXNzZW1ibGVyLnNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZmlyc3RNb2RpZmllcikgewotCQkJCWZpcnN0TW9kaWZpZXIgPSBmYWxzZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJjbGFzc2ZpbGVmb3JtYXQuYWNjX3B1YmxpYyIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgoYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX1NUQVRJQykgIT0gMCkgewotCQkJaWYgKCFmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImRpc2Fzc2VtYmxlci5zcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZpcnN0TW9kaWZpZXIpIHsKLQkJCQlmaXJzdE1vZGlmaWVyID0gZmFsc2U7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKFV0aWwuYmluZCgiY2xhc3NmaWxlZm9ybWF0LmFjY19zdGF0aWMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFjY2Vzc0ZsYWdzICYgSU1vZGlmaWVyQ29uc3RhbnRzLkFDQ19UUkFOU0lFTlQpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2NfdHJhbnNpZW50IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfVk9MQVRJTEUpICE9IDApIHsKLQkJCWlmICghZmlyc3RNb2RpZmllcikgewotCQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmaXJzdE1vZGlmaWVyKSB7Ci0JCQkJZmlyc3RNb2RpZmllciA9IGZhbHNlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChVdGlsLmJpbmQoImNsYXNzZmlsZWZvcm1hdC5hY2Nfdm9sYXRpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWZpcnN0TW9kaWZpZXIpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoVXRpbC5iaW5kKCJkaXNhc3NlbWJsZXIuc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCi0KLQlwcml2YXRlIFN0cmluZyBkZWNvZGVTdHJpbmdWYWx1ZShTdHJpbmcgcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyW10gY2hhcnMgPSBzLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBjaGFycy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJY2hhciBjID0gY2hhcnNbaV07Ci0JCQlzd2l0Y2goYykgewotCQkJCWNhc2UgJ1xiJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcZiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wiJzoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wnJzoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wwJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wxJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wyJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wzJyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcMyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1w0JyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1w1JyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1w2JyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1w3JyA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcNyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwkJCQotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCXByaXZhdGUgdm9pZCB3cml0ZU5ld0xpbmUoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmVTZXBhcmF0b3IsIGludCB0YWJOdW1iZXIpIHsKKwkJYnVmZmVyLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKwkJZHVtcFRhYih0YWJOdW1iZXIsIGJ1ZmZlcik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRHVtcGVyLmphdmEKaW5kZXggZDJiMDQ3Ni4uNzRjNDBlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9EdW1wZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0R1bXBlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0V4Y2VwdGlvbkF0dHJpYnV0ZS5qYXZhCmluZGV4IGUxMTUyMWYuLjkyYmRlMzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uQXR0cmlidXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25BdHRyaWJ1dGUuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQXR0cmlidXRlTmFtZXNDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ29uc3RhbnRQb29sOwpAQCAtMjIsNyArMjMsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgRXhjZXB0aW9uQXR0cmlidXRlIGV4dGVuZHMgQ2xhc3NGaWxlQXR0cmlidXRlIGltcGxlbWVudHMgSUV4Y2VwdGlvbkF0dHJpYnV0ZSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTk9fRVhDRVBUSU9OX0lOREVYRVMgPSBuZXcgaW50WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXVtdIE5PX0VYQ0VQVElPTl9OQU1FUyA9IG5ldyBjaGFyWzBdWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXVtdIE5PX0VYQ0VQVElPTl9OQU1FUyA9IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSOwogCQogCXByaXZhdGUgaW50IGV4Y2VwdGlvbnNOdW1iZXI7CiAJcHJpdmF0ZSBjaGFyW11bXSBleGNlcHRpb25OYW1lczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRXhjZXB0aW9uVGFibGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKaW5kZXggNDYxM2YwMC4uMTI4YWNhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9FeGNlcHRpb25UYWJsZUVudHJ5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRmllbGRJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0ZpZWxkSW5mby5qYXZhCmluZGV4IDEzZGZjZWYuLjhmZDdkZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvRmllbGRJbmZvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9GaWVsZEluZm8uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOwpAQCAtMTY4LDQgKzE2OCw0IEBACiAJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXM7CiAJfQogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhCmluZGV4IDI5YjYwNGQuLjQyYTY5ZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUNhY2hlRW51bWVyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lDYWNoZUVudW1lcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JRHVtcGFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUR1bXBhYmxlLmphdmEKaW5kZXggNjkwOGMyNi4uOWVmNzM3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9JRHVtcGFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lEdW1wYWJsZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lMUlVDYWNoZWFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUxSVUNhY2hlYWJsZS5qYXZhCmluZGV4IDMwODg4YmMuLjkxMjBkNWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUxSVUNhY2hlYWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSUxSVUNhY2hlYWJsZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGUuamF2YQppbmRleCBkYmU2OTZkLi4wYzI0MjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lubmVyQ2xhc3Nlc0F0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKQEAgLTYzLDQgKzYzLDQgQEAKIAkJcmV0dXJuIHRoaXMubnVtYmVyT2ZDbGFzc2VzOwogCX0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvSW5uZXJDbGFzc2VzQXR0cmlidXRlRW50cnkuamF2YQppbmRleCBkNmFjNjZhLi4wZjM3ZmEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0lubmVyQ2xhc3Nlc0F0dHJpYnV0ZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Jbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xSVUNhY2hlLmphdmEKaW5kZXggYWQ0NGM4OS4uOWYyZTgzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9MUlVDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTFJVQ2FjaGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xpbmVOdW1iZXJBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCmluZGV4IDkwNWVlMjkuLmRjNzZmNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTGluZU51bWJlckF0dHJpYnV0ZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDk5ODE4YzQuLjhiODNmYjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0xvY2FsVmFyaWFibGVUYWJsZUVudHJ5LmphdmEKaW5kZXggNmJkYmU3YS4uMGYyZWE1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Mb2NhbFZhcmlhYmxlVGFibGVFbnRyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTG9jYWxWYXJpYWJsZVRhYmxlRW50cnkuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NZXRob2RJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01ldGhvZEluZm8uamF2YQppbmRleCBlNDg2ODc2Li5hYzc3YmNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01ldGhvZEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01ldGhvZEluZm8uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOwpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvbnN0YW50UG9vbEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUV4Y2VwdGlvbkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklNZXRob2RJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1vZGlmaWVyQ29uc3RhbnRzOwogCiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSU1ldGhvZEluZm8uCkBAIC02Nyw3ICs2OCw3IEBACiAJCXRoaXMuYXR0cmlidXRlc0NvdW50ID0gdTJBdChjbGFzc0ZpbGVCeXRlcywgNiwgb2Zmc2V0KTsKIAkJdGhpcy5hdHRyaWJ1dGVzID0gQ2xhc3NGaWxlQXR0cmlidXRlLk5PX0FUVFJJQlVURVM7CiAJCWlmICh0aGlzLmF0dHJpYnV0ZXNDb3VudCAhPSAwKSB7Ci0JCQlpZiAobm9fY29kZV9hdHRyaWJ1dGUpIHsKKwkJCWlmIChub19jb2RlX2F0dHJpYnV0ZSAmJiAhaXNBYnN0cmFjdCgpICYmICFpc05hdGl2ZSgpKSB7CiAJCQkJaWYgKHRoaXMuYXR0cmlidXRlc0NvdW50ICE9IDEpIHsKIAkJCQkJdGhpcy5hdHRyaWJ1dGVzID0gbmV3IElDbGFzc0ZpbGVBdHRyaWJ1dGVbdGhpcy5hdHRyaWJ1dGVzQ291bnQgLSAxXTsKIAkJCQl9CkBAIC0xOTgsNCArMTk5LDExIEBACiAJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXM7CiAJfQogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCXByaXZhdGUgYm9vbGVhbiBpc0Fic3RyYWN0KCkgeworCQlyZXR1cm4gKHRoaXMuYWNjZXNzRmxhZ3MgJiBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0FCU1RSQUNUKSAhPSAwOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNOYXRpdmUoKSB7CisJCXJldHVybiAodGhpcy5hY2Nlc3NGbGFncyAmIElNb2RpZmllckNvbnN0YW50cy5BQ0NfTkFUSVZFKSAhPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGVyVGhyZWFkT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1BlclRocmVhZE9iamVjdC5qYXZhCmluZGV4IDA4ZjUwZWIuLjUxMWRiMjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUGVyVGhyZWFkT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9QZXJUaHJlYWRPYmplY3QuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9QdWJsaWNTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1B1YmxpY1NjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE0OTQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9QdWJsaWNTY2FubmVyLmphdmEKQEAgLTAsMCArMSwzMjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuU3RyaW5nTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLk5MU0xpbmU7CisKK3B1YmxpYyBjbGFzcyBQdWJsaWNTY2FubmVyIGltcGxlbWVudHMgSVNjYW5uZXIsIElUZXJtaW5hbFN5bWJvbHMgeworCisJLyogQVBJcyBhcmVzCisJIC0gZ2V0TmV4dFRva2VuKCkgd2hpY2ggcmV0dXJuIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhlIHRva2VuCisJICAgKHRoaXMgdmFsdWUgaXMgbm90IG1lbW9yaXplZCBieSB0aGUgc2Nhbm5lcikKKwkgLSBnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSB3aGljaCBwcm92aWRlcyB3aXRoIHRoZSB0b2tlbiAiUkVBTCIgc291cmNlCisJICAgKGFrYSBhbGwgdW5pY29kZSBoYXZlIGJlZW4gdHJhbnNmb3JtZWQgaW50byBhIGNvcnJlY3QgY2hhcikKKwkgLSBzb3VyY2VTdGFydCBnaXZlcyB0aGUgcG9zaXRpb24gaW50byB0aGUgc3RyZWFtCisJIC0gY3VycmVudFBvc2l0aW9uLTEgZ2l2ZXMgdGhlIHNvdXJjZUVuZCBwb3NpdGlvbiBpbnRvIHRoZSBzdHJlYW0gCisJKi8KKworCS8vIDEuNCBmZWF0dXJlIAorCXByaXZhdGUgYm9vbGVhbiBhc3NlcnRNb2RlID0gZmFsc2U7CisJcHVibGljIGJvb2xlYW4gdXNlQXNzZXJ0QXNBbkluZGVudGlmaWVyID0gZmFsc2U7CisJLy9mbGFnIGluZGljYXRpbmcgaWYgcHJvY2Vzc2VkIHNvdXJjZSBjb250YWlucyBvY2N1cnJlbmNlcyBvZiBrZXl3b3JkIGFzc2VydCAKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Fzc2VydEtleXdvcmQgPSBmYWxzZTsgCisJCisJcHVibGljIGJvb2xlYW4gcmVjb3JkTGluZVNlcGFyYXRvciA9IGZhbHNlOworCXB1YmxpYyBjaGFyIGN1cnJlbnRDaGFyYWN0ZXI7CisJcHVibGljIGludCBzdGFydFBvc2l0aW9uOworCXB1YmxpYyBpbnQgY3VycmVudFBvc2l0aW9uOworCXB1YmxpYyBpbnQgaW5pdGlhbFBvc2l0aW9uLCBlb2ZQb3NpdGlvbjsKKwkvLyBhZnRlciB0aGlzIHBvc2l0aW9uIGVvZiBhcmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVhbCB0b2tlbiBmcm9tIHRoZSBzb3VyY2UKKworCXB1YmxpYyBib29sZWFuIHRva2VuaXplQ29tbWVudHMgPSBmYWxzZTsKKwlwdWJsaWMgYm9vbGVhbiB0b2tlbml6ZVdoaXRlU3BhY2UgPSBmYWxzZTsKKworCS8vc291cmNlIHNob3VsZCBiZSB2aWV3ZWQgYXMgYSB3aW5kb3cgKGFrYSBhIHBhcnQpCisJLy9vZiBhIGVudGlyZSB2ZXJ5IGxhcmdlIHN0cmVhbQorCXB1YmxpYyBjaGFyIHNvdXJjZVtdOworCisJLy91bmljb2RlIHN1cHBvcnQKKwlwdWJsaWMgY2hhcltdIHdpdGhvdXRVbmljb2RlQnVmZmVyOworCXB1YmxpYyBpbnQgd2l0aG91dFVuaWNvZGVQdHI7IC8vd2hlbiA9PSAwID09PiBubyB1bmljb2RlIGluIHRoZSBjdXJyZW50IHRva2VuCisJcHVibGljIGJvb2xlYW4gdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisKKwlwdWJsaWMgYm9vbGVhbiBzY2FubmluZ0Zsb2F0TGl0ZXJhbCA9IGZhbHNlOworCisJLy9zdXBwb3J0IGZvciAvKiogY29tbWVudHMKKwlwdWJsaWMgaW50W10gY29tbWVudFN0b3BzID0gbmV3IGludFsxMF07CisJcHVibGljIGludFtdIGNvbW1lbnRTdGFydHMgPSBuZXcgaW50WzEwXTsKKwlwdWJsaWMgaW50IGNvbW1lbnRQdHIgPSAtMTsgLy8gbm8gY29tbWVudCB0ZXN0IHdpdGggY29tbWVudFB0ciB2YWx1ZSAtMQorCQorCS8vIHRhc2sgdGFnIHN1cHBvcnQKKwlwdWJsaWMgY2hhcltdW10gZm91bmRUYXNrVGFncyA9IG51bGw7CisJcHVibGljIGNoYXJbXVtdIGZvdW5kVGFza01lc3NhZ2VzOworCXB1YmxpYyBjaGFyW11bXSBmb3VuZFRhc2tQcmlvcml0aWVzID0gbnVsbDsKKwlwdWJsaWMgaW50W11bXSBmb3VuZFRhc2tQb3NpdGlvbnM7CisJcHVibGljIGludCBmb3VuZFRhc2tDb3VudCA9IDA7CisJcHVibGljIGNoYXJbXVtdIHRhc2tUYWdzID0gbnVsbDsKKwlwdWJsaWMgY2hhcltdW10gdGFza1ByaW9yaXRpZXMgPSBudWxsOworCQorCS8vZGlldCBwYXJzaW5nIHN1cHBvcnQgLSBqdW1wIG92ZXIgc29tZSBtZXRob2QgYm9keSB3aGVuIHJlcXVlc3RlZAorCXB1YmxpYyBib29sZWFuIGRpZXQgPSBmYWxzZTsKKworCS8vc3VwcG9ydCBmb3IgdGhlICBwb29yLWxpbmUtZGVidWdnZXJzIC4uLi4KKwkvL3JlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3IvbGYKKwlwdWJsaWMgaW50W10gbGluZUVuZHMgPSBuZXcgaW50WzI1MF07CisJcHVibGljIGludCBsaW5lUHRyID0gLTE7CisJcHVibGljIGJvb2xlYW4gd2FzQWNyID0gZmFsc2U7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfT0ZfU09VUkNFID0gIkVuZF9PZl9Tb3VyY2UiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0hFWEEgPSAiSW52YWxpZF9IZXhhX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9PQ1RBTCA9ICJJbnZhbGlkX09jdGFsX0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQgPSAiSW52YWxpZF9DaGFyYWN0ZXJfQ29uc3RhbnQiOyAgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfRVNDQVBFID0gIkludmFsaWRfRXNjYXBlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfSU5QVVQgPSAiSW52YWxpZF9JbnB1dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1VOSUNPREVfRVNDQVBFID0gIkludmFsaWRfVW5pY29kZV9Fc2NhcGUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9GTE9BVCA9ICJJbnZhbGlkX0Zsb2F0X0xpdGVyYWwiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1NPVVJDRV9TVFJJTkcgPSAiTnVsbF9Tb3VyY2VfU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOVEVSTUlOQVRFRF9TVFJJTkcgPSAiVW50ZXJtaW5hdGVkX1N0cmluZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlRFUk1JTkFURURfQ09NTUVOVCA9ICJVbnRlcm1pbmF0ZWRfQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0NIQVJfSU5fU1RSSU5HID0gIkludmFsaWRfQ2hhcl9Jbl9TdHJpbmciOyAvLyROT04tTkxTLTEkCisKKwkvLy0tLS0tLS0tLS0tLS0tLS1vcHRpbWl6ZWQgaWRlbnRpZmllciBtYW5hZ21lbnQtLS0tLS0tLS0tLS0tLS0tLS0KKwlzdGF0aWMgZmluYWwgY2hhcltdIGNoYXJBcnJheV9hID0gbmV3IGNoYXJbXSB7J2EnfSwgCisJCWNoYXJBcnJheV9iID0gbmV3IGNoYXJbXSB7J2InfSwgCisJCWNoYXJBcnJheV9jID0gbmV3IGNoYXJbXSB7J2MnfSwgCisJCWNoYXJBcnJheV9kID0gbmV3IGNoYXJbXSB7J2QnfSwgCisJCWNoYXJBcnJheV9lID0gbmV3IGNoYXJbXSB7J2UnfSwgCisJCWNoYXJBcnJheV9mID0gbmV3IGNoYXJbXSB7J2YnfSwgCisJCWNoYXJBcnJheV9nID0gbmV3IGNoYXJbXSB7J2cnfSwgCisJCWNoYXJBcnJheV9oID0gbmV3IGNoYXJbXSB7J2gnfSwgCisJCWNoYXJBcnJheV9pID0gbmV3IGNoYXJbXSB7J2knfSwgCisJCWNoYXJBcnJheV9qID0gbmV3IGNoYXJbXSB7J2onfSwgCisJCWNoYXJBcnJheV9rID0gbmV3IGNoYXJbXSB7J2snfSwgCisJCWNoYXJBcnJheV9sID0gbmV3IGNoYXJbXSB7J2wnfSwgCisJCWNoYXJBcnJheV9tID0gbmV3IGNoYXJbXSB7J20nfSwgCisJCWNoYXJBcnJheV9uID0gbmV3IGNoYXJbXSB7J24nfSwgCisJCWNoYXJBcnJheV9vID0gbmV3IGNoYXJbXSB7J28nfSwgCisJCWNoYXJBcnJheV9wID0gbmV3IGNoYXJbXSB7J3AnfSwgCisJCWNoYXJBcnJheV9xID0gbmV3IGNoYXJbXSB7J3EnfSwgCisJCWNoYXJBcnJheV9yID0gbmV3IGNoYXJbXSB7J3InfSwgCisJCWNoYXJBcnJheV9zID0gbmV3IGNoYXJbXSB7J3MnfSwgCisJCWNoYXJBcnJheV90ID0gbmV3IGNoYXJbXSB7J3QnfSwgCisJCWNoYXJBcnJheV91ID0gbmV3IGNoYXJbXSB7J3UnfSwgCisJCWNoYXJBcnJheV92ID0gbmV3IGNoYXJbXSB7J3YnfSwgCisJCWNoYXJBcnJheV93ID0gbmV3IGNoYXJbXSB7J3cnfSwgCisJCWNoYXJBcnJheV94ID0gbmV3IGNoYXJbXSB7J3gnfSwgCisJCWNoYXJBcnJheV95ID0gbmV3IGNoYXJbXSB7J3knfSwgCisJCWNoYXJBcnJheV96ID0gbmV3IGNoYXJbXSB7J3onfTsgCisKKwlzdGF0aWMgZmluYWwgY2hhcltdIGluaXRDaGFyQXJyYXkgPSAKKwkJbmV3IGNoYXJbXSB7J1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJywgJ1x1MDAwMCcsICdcdTAwMDAnLCAnXHUwMDAwJ307IAorCXN0YXRpYyBmaW5hbCBpbnQgVGFibGVTaXplID0gMzAsIEludGVybmFsVGFibGVTaXplID0gNjsgLy8zMCo2ID0gMTgwIGVudHJpZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPcHRpbWl6ZWRMZW5ndGggPSA2OworCXB1YmxpYyAvKnN0YXRpYyovIGZpbmFsIGNoYXJbXVtdW11bXSBjaGFyQXJyYXlfbGVuZ3RoID0gCisJCW5ldyBjaGFyW09wdGltaXplZExlbmd0aF1bVGFibGVTaXplXVtJbnRlcm5hbFRhYmxlU2l6ZV1bXTsgCisJLy8gc3VwcG9ydCBmb3IgZGV0ZWN0aW5nIG5vbi1leHRlcm5hbGl6ZWQgc3RyaW5nIGxpdGVyYWxzCisJaW50IGN1cnJlbnRMaW5lTnI9IC0xOworCWludCBwcmV2aW91c0xpbmVOcj0gLTE7CisJTkxTTGluZSBjdXJyZW50TGluZT0gbnVsbDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJFRklYPSAiLy8kTk9OLU5MUy0iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1BSRUZJWF9MRU5HVEg9IFRBR19QUkVGSVgubGVuZ3RoKCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPU1RGSVg9ICIkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19QT1NURklYX0xFTkdUSD0gVEFHX1BPU1RGSVgubGVuZ3RoKCk7CisJcHVibGljIFN0cmluZ0xpdGVyYWxbXSBub25OTFNTdHJpbmdzID0gbnVsbDsKKwlwdWJsaWMgYm9vbGVhbiBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzID0gZmFsc2U7CisJcHVibGljIGJvb2xlYW4gd2FzTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbCA9IGZhbHNlOworCQorCS8qc3RhdGljKi8geworCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBUYWJsZVNpemU7IGorKykgeworCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgSW50ZXJuYWxUYWJsZVNpemU7IGsrKykgeworCQkJCQljaGFyQXJyYXlfbGVuZ3RoW2ldW2pdW2tdID0gaW5pdENoYXJBcnJheTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJc3RhdGljIGludCBuZXdFbnRyeTIgPSAwLCAKKwkJbmV3RW50cnkzID0gMCwgCisJCW5ld0VudHJ5NCA9IDAsIAorCQluZXdFbnRyeTUgPSAwLCAKKwkJbmV3RW50cnk2ID0gMDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJvdW5kQnJhY2tldCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3F1YXJlQnJhY2tldCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ3VybHlCcmFja2V0ID0gMjsJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQnJhY2tldEtpbmRzID0gMzsKKworcHVibGljIFB1YmxpY1NjYW5uZXIoKSB7CisJdGhpcyhmYWxzZSAvKmNvbW1lbnQqLywgZmFsc2UgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIGZhbHNlIC8qYXNzZXJ0Ki8sIG51bGwvKnRhc2tUYWcqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7Cit9CitwdWJsaWMgUHVibGljU2Nhbm5lcigKKwlib29sZWFuIHRva2VuaXplQ29tbWVudHMsIAorCWJvb2xlYW4gdG9rZW5pemVXaGl0ZVNwYWNlLCAKKwlib29sZWFuIGNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMsIAorCWJvb2xlYW4gYXNzZXJ0TW9kZSwKKwljaGFyW11bXSB0YXNrVGFncywKKwljaGFyW11bXSB0YXNrUHJpb3JpdGllcykgeworCQkKKwl0aGlzLmVvZlBvc2l0aW9uID0gSW50ZWdlci5NQVhfVkFMVUU7CisJdGhpcy50b2tlbml6ZUNvbW1lbnRzID0gdG9rZW5pemVDb21tZW50czsKKwl0aGlzLnRva2VuaXplV2hpdGVTcGFjZSA9IHRva2VuaXplV2hpdGVTcGFjZTsKKwl0aGlzLmNoZWNrTm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbHMgPSBjaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzOworCXRoaXMuYXNzZXJ0TW9kZSA9IGFzc2VydE1vZGU7CisJdGhpcy50YXNrVGFncyA9IHRhc2tUYWdzOworCXRoaXMudGFza1ByaW9yaXRpZXMgPSB0YXNrUHJpb3JpdGllczsKK30KKworCitwdWJsaWMgIGZpbmFsIGJvb2xlYW4gYXRFbmQoKSB7CisJLy8gVGhpcyBjb2RlIGlzIG5vdCByZWxldmFudCBpZiBzb3VyY2UgaXMgCisJLy8gT25seSBhIHBhcnQgb2YgdGhlIHJlYWwgc3RyZWFtIGlucHV0CisKKwlyZXR1cm4gc291cmNlLmxlbmd0aCA9PSBjdXJyZW50UG9zaXRpb247Cit9CisKK3ByaXZhdGUgdm9pZCBjaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCkgIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCWlmIChjdXJyZW50TGluZSA9PSBudWxsKQorCQlyZXR1cm47CisJcGFyc2VUYWdzKGN1cnJlbnRMaW5lKTsKK30KKworLy8gY2hlY2ggcHJlc2VuY2Ugb2YgdGFzazogdGFncworcHVibGljIHZvaWQgY2hlY2tUYXNrVGFnKGludCBjb21tZW50U3RhcnQsIGludCBjb21tZW50RW5kKSB7CisKKwkvLyBvbmx5IGxvb2sgZm9yIG5ld2VyIHRhc2s6IHRhZ3MKKwlpZiAodGhpcy5mb3VuZFRhc2tDb3VudCA+IDAgJiYgdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnNbdGhpcy5mb3VuZFRhc2tDb3VudC0xXVswXSA+PSBjb21tZW50U3RhcnQpIHsKKwkJcmV0dXJuOworCX0KKwlpbnQgZm91bmRUYXNrSW5kZXggPSB0aGlzLmZvdW5kVGFza0NvdW50OworCW5leHRDaGFyOiBmb3IgKGludCBpID0gY29tbWVudFN0YXJ0OyBpIDwgY29tbWVudEVuZCAmJiBpIDwgdGhpcy5lb2ZQb3NpdGlvbjsgaSsrKSB7CisKKwkJaW50IG5leHRQb3MgPSAtMTsKKwkJY2hhcltdIHRhZyA9IG51bGw7CisJCWNoYXJbXSBwcmlvcml0eSA9IG51bGw7CisJCQorCQkvLyBjaGVjayBmb3IgdGFnIG9jY3VycmVuY2UKKwkJbmV4dFRhZzogZm9yIChpbnQgaXRhZyA9IDA7IGl0YWcgPCB0aGlzLnRhc2tUYWdzLmxlbmd0aDsgaXRhZysrKXsKKwkJCXRhZyA9IHRoaXMudGFza1RhZ3NbaXRhZ107CisJCQlwcmlvcml0eSA9IAorCQkJCXRoaXMudGFza1ByaW9yaXRpZXMgIT0gbnVsbCAmJiBpdGFnIDwgdGhpcy50YXNrUHJpb3JpdGllcy5sZW5ndGggPworCQkJCXRoaXMudGFza1ByaW9yaXRpZXNbaXRhZ10gOgorCQkJCW51bGw7CisJCQlpbnQgdGFnTGVuZ3RoID0gdGFnLmxlbmd0aDsKKwkJCWZvciAoaW50IHQgPSAwOyB0IDwgdGFnTGVuZ3RoOyB0KyspeworCQkJCWlmICh0aGlzLnNvdXJjZVtpK3RdICE9IHRhZ1t0XSkgY29udGludWUgbmV4dFRhZzsKKwkJCX0KKwkJCW5leHRQb3MgPSBpICsgdGFnTGVuZ3RoOworCisJCQlpZiAodGhpcy5mb3VuZFRhc2tUYWdzID09IG51bGwpeworCQkJCXRoaXMuZm91bmRUYXNrVGFncyA9IG5ldyBjaGFyWzVdW107CisJCQkJdGhpcy5mb3VuZFRhc2tNZXNzYWdlcyA9IG5ldyBjaGFyWzVdW107CisJCQkJdGhpcy5mb3VuZFRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbNV1bXTsKKwkJCQl0aGlzLmZvdW5kVGFza1Bvc2l0aW9ucyA9IG5ldyBpbnRbNV1bXTsKKwkJCX0gZWxzZSBpZiAodGhpcy5mb3VuZFRhc2tDb3VudCA9PSB0aGlzLmZvdW5kVGFza1RhZ3MubGVuZ3RoKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZvdW5kVGFza1RhZ3MsIDAsIHRoaXMuZm91bmRUYXNrVGFncyA9IG5ldyBjaGFyW3RoaXMuZm91bmRUYXNrQ291bnQqMl1bXSwgMCwgdGhpcy5mb3VuZFRhc2tDb3VudCk7CisJCQkJU3lzdGVtLmFycmF5Y29weSh0aGlzLmZvdW5kVGFza01lc3NhZ2VzLCAwLCB0aGlzLmZvdW5kVGFza01lc3NhZ2VzID0gbmV3IGNoYXJbdGhpcy5mb3VuZFRhc2tDb3VudCoyXVtdLCAwLCB0aGlzLmZvdW5kVGFza0NvdW50KTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUHJpb3JpdGllcywgMCwgdGhpcy5mb3VuZFRhc2tQcmlvcml0aWVzID0gbmV3IGNoYXJbdGhpcy5mb3VuZFRhc2tDb3VudCoyXVtdLCAwLCB0aGlzLmZvdW5kVGFza0NvdW50KTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZm91bmRUYXNrUG9zaXRpb25zLCAwLCB0aGlzLmZvdW5kVGFza1Bvc2l0aW9ucyA9IG5ldyBpbnRbdGhpcy5mb3VuZFRhc2tDb3VudCoyXVtdLCAwLCB0aGlzLmZvdW5kVGFza0NvdW50KTsKKwkJCX0KKwkJCXRoaXMuZm91bmRUYXNrVGFnc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IHRhZzsKKwkJCXRoaXMuZm91bmRUYXNrUHJpb3JpdGllc1t0aGlzLmZvdW5kVGFza0NvdW50XSA9IHByaW9yaXR5OworCQkJdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnNbdGhpcy5mb3VuZFRhc2tDb3VudF0gPSBuZXcgaW50W117IGksIC0xIH07CisJCQl0aGlzLmZvdW5kVGFza0NvdW50Kys7CisJCQkKKwkJCWkgPSBuZXh0UG9zOworCQl9CisJfQorCQorCWZvciAoaW50IGkgPSBmb3VuZFRhc2tJbmRleDsgaSA8IHRoaXMuZm91bmRUYXNrQ291bnQ7IGkrKykgeworCQkvLyByZXRyaWV2ZSBtZXNzYWdlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zCisJCWludCBtc2dTdGFydCA9IHRoaXMuZm91bmRUYXNrUG9zaXRpb25zW2ldWzBdICsgdGhpcy5mb3VuZFRhc2tUYWdzW2ldLmxlbmd0aDsKKwkJaW50IGVuZDsKKwkJY2hhciBjOworCQlpbnQgbWF4X3ZhbHVlID0gaSArIDEgPCB0aGlzLmZvdW5kVGFza0NvdW50ID8gdGhpcy5mb3VuZFRhc2tQb3NpdGlvbnNbaSArIDFdWzBdIC0gMSA6IEludGVnZXIuTUFYX1ZBTFVFOworCQkKKwkJZW5kID0gLTE7CisJCWZvciAoaW50IGogPSBtc2dTdGFydDsgaiA8IGNvbW1lbnRFbmQ7IGorKyl7CisJCQlpZiAoKGMgPSB0aGlzLnNvdXJjZVtqXSkgPT0gJ1xuJyB8fCBjID09ICdccicpeworCQkJCWVuZCA9IGogLSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVuZCA9IGVuZCA8IG1heF92YWx1ZSA/IGVuZCA6IG1heF92YWx1ZTsKKwkJCisJCWlmIChlbmQgPCAwKXsKKwkJCWZvciAoaW50IGogPSBjb21tZW50RW5kLTE7IGogPj0gbXNnU3RhcnQ7IGotLSl7CisJCQkJaWYgKChjID0gdGhpcy5zb3VyY2Vbal0pID09ICcqJykgeworCQkJCQllbmQgPSBqLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChlbmQgPCAwKSBlbmQgPSBjb21tZW50RW5kLTE7CisJCX0KKwkJCisJCS8vIHRyaW0gdGhlIG1lc3NhZ2UKKwkJd2hpbGUgKENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKHNvdXJjZVtlbmRdKSAmJiBtc2dTdGFydCA8PSBlbmQpIGVuZC0tOworCQl3aGlsZSAoQ2hhck9wZXJhdGlvbi5pc1doaXRlc3BhY2Uoc291cmNlW21zZ1N0YXJ0XSkgJiYgbXNnU3RhcnQgPD0gZW5kKSBtc2dTdGFydCsrOworCisJCS8vIHVwZGF0ZSB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSB0YXNrCisJCXRoaXMuZm91bmRUYXNrUG9zaXRpb25zW2ldWzFdID0gZW5kOworCQkKKwkJLy8gZ2V0IHRoZSBtZXNzYWdlIHNvdXJjZQorCQlmaW5hbCBpbnQgbWVzc2FnZUxlbmd0aCA9IGVuZC1tc2dTdGFydCsxOworCQljaGFyW10gbWVzc2FnZSA9IG5ldyBjaGFyW21lc3NhZ2VMZW5ndGhdOworCisJCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBtc2dTdGFydCwgbWVzc2FnZSwgMCwgbWVzc2FnZUxlbmd0aCk7CisJCXRoaXMuZm91bmRUYXNrTWVzc2FnZXNbaV0gPSBtZXNzYWdlOworCX0KK30KKworcHVibGljIGNoYXJbXSBnZXRDdXJyZW50SWRlbnRpZmllclNvdXJjZSgpIHsKKwkvL3JldHVybiB0aGUgdG9rZW4gUkVBTCBzb3VyY2UgKGFrYSB1bmljb2RlcyBhcmUgcHJlY29tcHV0ZWQpCisKKwljaGFyW10gcmVzdWx0OworCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkvLzAgaXMgdXNlZCBhcyBhIGZhc3QgdGVzdCBmbGFnIHNvIHRoZSByZWFsIGZpcnN0IGNoYXIgaXMgaW4gcG9zaXRpb24gMQorCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJMSwgCisJCQlyZXN1bHQgPSBuZXcgY2hhclt3aXRob3V0VW5pY29kZVB0cl0sIAorCQkJMCwgCisJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCWVsc2UgeworCQlpbnQgbGVuZ3RoID0gY3VycmVudFBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbjsKKwkJc3dpdGNoIChsZW5ndGgpIHsgLy8gc2VlIE9wdGltaXplZExlbmd0aAorCQkJY2FzZSAxIDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMSgpOworCQkJY2FzZSAyIDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMigpOworCQkJY2FzZSAzIDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMygpOworCQkJY2FzZSA0IDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNCgpOworCQkJY2FzZSA1IDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNSgpOworCQkJY2FzZSA2IDoKKwkJCQlyZXR1cm4gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNigpOworCQl9CisJCS8vbm8gb3B0aW1pemF0aW9uCisJCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzdGFydFBvc2l0aW9uLCByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdLCAwLCBsZW5ndGgpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIGludCBnZXRDdXJyZW50VG9rZW5FbmRQb3NpdGlvbigpeworCXJldHVybiB0aGlzLmN1cnJlbnRQb3NpdGlvbiAtIDE7Cit9CitwdWJsaWMgZmluYWwgY2hhcltdIGdldEN1cnJlbnRUb2tlblNvdXJjZSgpIHsKKwkvLyBSZXR1cm4gdGhlIHRva2VuIFJFQUwgc291cmNlIChha2EgdW5pY29kZXMgYXJlIHByZWNvbXB1dGVkKQorCisJY2hhcltdIHJlc3VsdDsKKwlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKKwkJLy8gMCBpcyB1c2VkIGFzIGEgZmFzdCB0ZXN0IGZsYWcgc28gdGhlIHJlYWwgZmlyc3QgY2hhciBpcyBpbiBwb3NpdGlvbiAxCisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkxLCAKKwkJCXJlc3VsdCA9IG5ldyBjaGFyW3dpdGhvdXRVbmljb2RlUHRyXSwgCisJCQkwLCAKKwkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJZWxzZSB7CisJCWludCBsZW5ndGg7CisJCVN5c3RlbS5hcnJheWNvcHkoCisJCQlzb3VyY2UsIAorCQkJc3RhcnRQb3NpdGlvbiwgCisJCQlyZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggPSBjdXJyZW50UG9zaXRpb24gLSBzdGFydFBvc2l0aW9uXSwgCisJCQkwLCAKKwkJCWxlbmd0aCk7IAorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorcHVibGljIGZpbmFsIGNoYXJbXSBnZXRDdXJyZW50VG9rZW5Tb3VyY2VTdHJpbmcoKSB7CisJLy9yZXR1cm4gdGhlIHRva2VuIFJFQUwgc291cmNlIChha2EgdW5pY29kZXMgYXJlIHByZWNvbXB1dGVkKS4KKwkvL1JFTU9WRSB0aGUgdHdvICIgdGhhdCBhcmUgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZC4KKworCWNoYXJbXSByZXN1bHQ7CisJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCS8vMCBpcyB1c2VkIGFzIGEgZmFzdCB0ZXN0IGZsYWcgc28gdGhlIHJlYWwgZmlyc3QgY2hhciBpcyBpbiBwb3NpdGlvbiAxCisJCVN5c3RlbS5hcnJheWNvcHkod2l0aG91dFVuaWNvZGVCdWZmZXIsIDIsCisJCS8vMiBpcyAxIChyZWFsIHN0YXJ0KSArIDEgKHRvIGp1bXAgb3ZlciB0aGUgIikKKwkJcmVzdWx0ID0gbmV3IGNoYXJbd2l0aG91dFVuaWNvZGVQdHIgLSAyXSwgMCwgd2l0aG91dFVuaWNvZGVQdHIgLSAyKTsKKwllbHNlIHsKKwkJaW50IGxlbmd0aDsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXNvdXJjZSwgCisJCQlzdGFydFBvc2l0aW9uICsgMSwgCisJCQlyZXN1bHQgPSBuZXcgY2hhcltsZW5ndGggPSBjdXJyZW50UG9zaXRpb24gLSBzdGFydFBvc2l0aW9uIC0gMl0sIAorCQkJMCwgCisJCQlsZW5ndGgpOyAKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworcHVibGljIGZpbmFsIGNoYXJbXSBnZXRSYXdUb2tlblNvdXJjZSgpIHsKKwlpbnQgbGVuZ3RoID0gdGhpcy5jdXJyZW50UG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb247CisJY2hhcltdIHRva2VuU291cmNlID0gbmV3IGNoYXJbbGVuZ3RoXTsKKwlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgdGhpcy5zdGFydFBvc2l0aW9uLCB0b2tlblNvdXJjZSwgMCwgbGVuZ3RoKTsKKwlyZXR1cm4gdG9rZW5Tb3VyY2U7CQorfQorCQorcHVibGljIGludCBnZXRDdXJyZW50VG9rZW5TdGFydFBvc2l0aW9uKCl7CisJcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbjsKK30KKy8qCisgKiBTZWFyY2ggdGhlIHNvdXJjZSBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQgb2YgYSBnaXZlbiBsaW5lIG51bWJlcgorICoKKyAqIExpbmUgbnVtYmVycyBhcmUgMS1iYXNlZCwgYW5kIHJlbGF0aXZlIHRvIHRoZSBzY2FubmVyIGluaXRpYWxQb3NpdGlvbi4gCisgKiBDaGFyYWN0ZXIgcG9zaXRpb25zIGFyZSAwLWJhc2VkLgorICoKKyAqIEluIGNhc2UgdGhlIGdpdmVuIGxpbmUgbnVtYmVyIGlzIGluY29uc2lzdGVudCwgYW5zd2VycyAtMS4KKyAqLworcHVibGljIGZpbmFsIGludCBnZXRMaW5lRW5kKGludCBsaW5lTnVtYmVyKSB7CisKKwlpZiAobGluZUVuZHMgPT0gbnVsbCkgcmV0dXJuIC0xOworCWlmIChsaW5lTnVtYmVyID49IGxpbmVFbmRzLmxlbmd0aCkgcmV0dXJuIC0xOworCWlmIChsaW5lTnVtYmVyIDw9IDApIHJldHVybiAtMTsKKwkKKwlpZiAobGluZU51bWJlciA9PSBsaW5lRW5kcy5sZW5ndGggLSAxKSByZXR1cm4gZW9mUG9zaXRpb247CisJcmV0dXJuIGxpbmVFbmRzW2xpbmVOdW1iZXItMV07IC8vIG5leHQgbGluZSBzdGFydCBvbmUgY2hhcmFjdGVyIGJlaGluZCB0aGUgbGluZUVuZCBvZiB0aGUgcHJldmlvdXMgbGluZQorfQorCitwdWJsaWMgZmluYWwgaW50W10gZ2V0TGluZUVuZHMoKSB7CisJLy9yZXR1cm4gYSBib3VuZGVkIGNvcHkgb2YgdGhpcy5saW5lRW5kcyAKKworCWludFtdIGNvcHk7CisJU3lzdGVtLmFycmF5Y29weShsaW5lRW5kcywgMCwgY29weSA9IG5ldyBpbnRbbGluZVB0ciArIDFdLCAwLCBsaW5lUHRyICsgMSk7CisJcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogU2VhcmNoIHRoZSBzb3VyY2UgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZ2l2ZW4gbGluZSBudW1iZXIKKyAqCisgKiBMaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQsIGFuZCByZWxhdGl2ZSB0byB0aGUgc2Nhbm5lciBpbml0aWFsUG9zaXRpb24uIAorICogQ2hhcmFjdGVyIHBvc2l0aW9ucyBhcmUgMC1iYXNlZC4KKyAqCisgKiBlLmcuCWdldExpbmVTdGFydCgxKSAtLT4gMAlpLmUuIGZpcnN0IGxpbmUgc3RhcnRzIGF0IGNoYXJhY3RlciAwLgorICoKKyAqIEluIGNhc2UgdGhlIGdpdmVuIGxpbmUgbnVtYmVyIGlzIGluY29uc2lzdGVudCwgYW5zd2VycyAtMS4KKyAqLworcHVibGljIGZpbmFsIGludCBnZXRMaW5lU3RhcnQoaW50IGxpbmVOdW1iZXIpIHsKKworCWlmIChsaW5lRW5kcyA9PSBudWxsKSByZXR1cm4gLTE7CisJaWYgKGxpbmVOdW1iZXIgPj0gbGluZUVuZHMubGVuZ3RoKSByZXR1cm4gLTE7CisJaWYgKGxpbmVOdW1iZXIgPD0gMCkgcmV0dXJuIC0xOworCQorCWlmIChsaW5lTnVtYmVyID09IDEpIHJldHVybiBpbml0aWFsUG9zaXRpb247CisJcmV0dXJuIGxpbmVFbmRzW2xpbmVOdW1iZXItMl0rMTsgLy8gbmV4dCBsaW5lIHN0YXJ0IG9uZSBjaGFyYWN0ZXIgYmVoaW5kIHRoZSBsaW5lRW5kIG9mIHRoZSBwcmV2aW91cyBsaW5lCit9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXROZXh0Q2hhcihjaGFyIHRlc3RlZENoYXIpIHsKKwkvL0JPT0xFQU4KKwkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgorCS8vd2hlbiBhIHVuaWNvZGUgYXBwZWFycyB0aGVuIHdlIG11c3QgdXNlIGEgYnVmZmVyIHRoYXQgaG9sZHMgY2hhciBpbnRlcm5hbCB2YWx1ZXMKKwkvL0F0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QgY3VycmVudENoYXJhY3RlciBob2xkcyB0aGUgbmV3IHZpc2l0ZWQgY2hhcgorCS8vYW5kIGN1cnJlbnRQb3NpdGlvbiBwb2ludHMgcmlnaHQgbmV4dCBhZnRlciBpdAorCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyA9PSB0byB0aGUgdGVzdGVkQ2hhcgorCS8vT24gZmFsc2UsIG5vIHNpZGUgZWZmZWN0IGhhcyBvY2N1cmVkLgorCisJLy9BTEwgZ2V0TmV4dENoYXIuLi4uIEFSRSBPUFRJTUlaRUQgQ09QSUVTIAorCisJaW50IHRlbXAgPSBjdXJyZW50UG9zaXRpb247CisJdHJ5IHsKKwkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJaW50IGMxLCBjMiwgYzMsIGM0OworCQkJaW50IHVuaWNvZGVTaXplID0gNjsKKwkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCXVuaWNvZGVTaXplKys7CisJCQl9CisKKwkJCWlmICgoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCXx8IGMxIDwgMCkKKwkJCQl8fCAoKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDApCisJCQkJfHwgKChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzMgPCAwKQorCQkJCXx8ICgoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGM0IDwgMCkpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCWlmIChjdXJyZW50Q2hhcmFjdGVyICE9IHRlc3RlZENoYXIpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJzsKKworCQkJLy9uZWVkIHRoZSB1bmljb2RlIGJ1ZmZlcgorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkvL2J1ZmZlciBhbGwgdGhlIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBhc2lkZS4uLi4KKwkJCQl3aXRob3V0VW5pY29kZVB0ciA9IGN1cnJlbnRQb3NpdGlvbiAtIHVuaWNvZGVTaXplIC0gc3RhcnRQb3NpdGlvbjsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlzb3VyY2UsIAorCQkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkxLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwkJCX0KKwkJCS8vZmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGNoYXIKKwkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiB0cnVlOworCisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gdGVzdGVkQ2hhcikgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkKKwkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KK3B1YmxpYyBmaW5hbCBpbnQgZ2V0TmV4dENoYXIoY2hhciB0ZXN0ZWRDaGFyMSwgY2hhciB0ZXN0ZWRDaGFyMikgeworCS8vSU5UIDAgOiB0ZXN0Q2hhcjEgXFxcXC8vL1xcXFwgMSA6IHRlc3RlZENoYXIyIFxcXFwvLy9cXFxcIC0xIDogb3RoZXJzCisJLy90ZXN0IGNhbiBiZSBkb25lIHdpdGggKHg9PTApIGZvciB0aGUgZmlyc3QgYW5kICh4PjApIGZvciB0aGUgc2Vjb25kCisJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KKwkvL3doZW4gYSB1bmljb2RlIGFwcGVhcnMgdGhlbiB3ZSBtdXN0IHVzZSBhIGJ1ZmZlciB0aGF0IGhvbGRzIGNoYXIgaW50ZXJuYWwgdmFsdWVzCisJLy9BdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kIGN1cnJlbnRDaGFyYWN0ZXIgaG9sZHMgdGhlIG5ldyB2aXNpdGVkIGNoYXIKKwkvL2FuZCBjdXJyZW50UG9zaXRpb24gcG9pbnRzIHJpZ2h0IG5leHQgYWZ0ZXIgaXQKKwkvL0JvdGggcHJldmlvdXMgbGluZXMgYXJlIHRydWUgaWYgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgPT0gdG8gdGhlIHRlc3RlZENoYXIxLzIKKwkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KKworCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKworCWludCB0ZW1wID0gY3VycmVudFBvc2l0aW9uOworCXRyeSB7CisJCWludCByZXN1bHQ7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWludCB1bmljb2RlU2l6ZSA9IDY7CisJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQl1bmljb2RlU2l6ZSsrOworCQkJfQorCisJCQlpZiAoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQl8fCBjMSA8IDApCisJCQkJfHwgKChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCXx8ICgoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKworCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09IHRlc3RlZENoYXIxKQorCQkJCXJlc3VsdCA9IDA7CisJCQllbHNlCisJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gdGVzdGVkQ2hhcjIpCisJCQkJCXJlc3VsdCA9IDE7CisJCQkJZWxzZSB7CisJCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCS8vbmVlZCB0aGUgdW5pY29kZSBidWZmZXIKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciA9PSAwKSB7CisJCQkJLy9idWZmZXIgYWxsIHRoZSBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIGxlZnQgYXNpZGUuLi4uCisJCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSB1bmljb2RlU2l6ZSAtIHN0YXJ0UG9zaXRpb247CisJCQkJU3lzdGVtLmFycmF5Y29weSgKKwkJCQkJc291cmNlLCAKKwkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyLCAKKwkJCQkJMSwgCisJCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCQl9CisJCQkvL2ZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjaGFyCisJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IC8vLS0tLS0tLS0tLS0tLWVuZCB1bmljb2RlIHRyYWl0ZW1lbnQtLS0tLS0tLS0tLS0tLQorCQllbHNlIHsKKwkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09IHRlc3RlZENoYXIxKQorCQkJCXJlc3VsdCA9IDA7CisJCQllbHNlCisJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gdGVzdGVkQ2hhcjIpCisJCQkJCXJlc3VsdCA9IDE7CisJCQkJZWxzZSB7CisJCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJcmV0dXJuIC0xOworCX0KK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGdldE5leHRDaGFyQXNEaWdpdCgpIHsKKwkvL0JPT0xFQU4KKwkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgorCS8vd2hlbiBhIHVuaWNvZGUgYXBwZWFycyB0aGVuIHdlIG11c3QgdXNlIGEgYnVmZmVyIHRoYXQgaG9sZHMgY2hhciBpbnRlcm5hbCB2YWx1ZXMKKwkvL0F0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QgY3VycmVudENoYXJhY3RlciBob2xkcyB0aGUgbmV3IHZpc2l0ZWQgY2hhcgorCS8vYW5kIGN1cnJlbnRQb3NpdGlvbiBwb2ludHMgcmlnaHQgbmV4dCBhZnRlciBpdAorCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyBhIGRpZ2l0CisJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCisKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisKKwlpbnQgdGVtcCA9IGN1cnJlbnRQb3NpdGlvbjsKKwl0cnkgeworCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQlpbnQgYzEsIGMyLCBjMywgYzQ7CisJCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJdW5pY29kZVNpemUrKzsKKwkJCX0KKworCQkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJfHwgYzEgPCAwKQorCQkJCXx8ICgoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMyIDwgMCkKKwkJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQkJfHwgKChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzQgPCAwKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvL25lZWQgdGhlIHVuaWNvZGUgYnVmZmVyCisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkgeworCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCXdpdGhvdXRVbmljb2RlUHRyID0gY3VycmVudFBvc2l0aW9uIC0gdW5pY29kZVNpemUgLSBzdGFydFBvc2l0aW9uOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXNvdXJjZSwgCisJCQkJCXN0YXJ0UG9zaXRpb24sIAorCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkJCTEsIAorCQkJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCQkJfQorCQkJLy9maWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgY2hhcgorCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApCisJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KK3B1YmxpYyBmaW5hbCBib29sZWFuIGdldE5leHRDaGFyQXNEaWdpdChpbnQgcmFkaXgpIHsKKwkvL0JPT0xFQU4KKwkvL2hhbmRsZSB0aGUgY2FzZSBvZiB1bmljb2RlLgorCS8vd2hlbiBhIHVuaWNvZGUgYXBwZWFycyB0aGVuIHdlIG11c3QgdXNlIGEgYnVmZmVyIHRoYXQgaG9sZHMgY2hhciBpbnRlcm5hbCB2YWx1ZXMKKwkvL0F0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QgY3VycmVudENoYXJhY3RlciBob2xkcyB0aGUgbmV3IHZpc2l0ZWQgY2hhcgorCS8vYW5kIGN1cnJlbnRQb3NpdGlvbiBwb2ludHMgcmlnaHQgbmV4dCBhZnRlciBpdAorCS8vQm90aCBwcmV2aW91cyBsaW5lcyBhcmUgdHJ1ZSBpZiB0aGUgY3VycmVudENoYXJhY3RlciBpcyBhIGRpZ2l0IGJhc2Ugb24gcmFkaXgKKwkvL09uIGZhbHNlLCBubyBzaWRlIGVmZmVjdCBoYXMgb2NjdXJlZC4KKworCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKworCWludCB0ZW1wID0gY3VycmVudFBvc2l0aW9uOworCXRyeSB7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCWludCBjMSwgYzIsIGMzLCBjNDsKKwkJCWludCB1bmljb2RlU2l6ZSA9IDY7CisJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQl1bmljb2RlU2l6ZSsrOworCQkJfQorCisJCQlpZiAoKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQl8fCBjMSA8IDApCisJCQkJfHwgKChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzIgPCAwKQorCQkJCXx8ICgoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMzIDwgMCkKKwkJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQlpZiAoQ2hhcmFjdGVyLmRpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIsIHJhZGl4KSA9PSAtMSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvL25lZWQgdGhlIHVuaWNvZGUgYnVmZmVyCisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkgeworCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCXdpdGhvdXRVbmljb2RlUHRyID0gY3VycmVudFBvc2l0aW9uIC0gdW5pY29kZVNpemUgLSBzdGFydFBvc2l0aW9uOworCQkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJCXNvdXJjZSwgCisJCQkJCXN0YXJ0UG9zaXRpb24sIAorCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkJCTEsIAorCQkJCQl3aXRob3V0VW5pY29kZVB0cik7IAorCQkJfQorCQkJLy9maWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgY2hhcgorCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJcmV0dXJuIHRydWU7CisJCX0gLy8tLS0tLS0tLS0tLS0tZW5kIHVuaWNvZGUgdHJhaXRlbWVudC0tLS0tLS0tLS0tLS0tCisJCWVsc2UgeworCQkJaWYgKENoYXJhY3Rlci5kaWdpdChjdXJyZW50Q2hhcmFjdGVyLCByYWRpeCkgPT0gLTEpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitwdWJsaWMgYm9vbGVhbiBnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkgeworCS8vQk9PTEVBTgorCS8vaGFuZGxlIHRoZSBjYXNlIG9mIHVuaWNvZGUuCisJLy93aGVuIGEgdW5pY29kZSBhcHBlYXJzIHRoZW4gd2UgbXVzdCB1c2UgYSBidWZmZXIgdGhhdCBob2xkcyBjaGFyIGludGVybmFsIHZhbHVlcworCS8vQXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZCBjdXJyZW50Q2hhcmFjdGVyIGhvbGRzIHRoZSBuZXcgdmlzaXRlZCBjaGFyCisJLy9hbmQgY3VycmVudFBvc2l0aW9uIHBvaW50cyByaWdodCBuZXh0IGFmdGVyIGl0CisJLy9Cb3RoIHByZXZpb3VzIGxpbmVzIGFyZSB0cnVlIGlmIHRoZSBjdXJyZW50Q2hhcmFjdGVyIGlzIGEgSmF2YUlkZW50aWZpZXJQYXJ0CisJLy9PbiBmYWxzZSwgbm8gc2lkZSBlZmZlY3QgaGFzIG9jY3VyZWQuCisKKwkvL0FMTCBnZXROZXh0Q2hhci4uLi4gQVJFIE9QVElNSVpFRCBDT1BJRVMgCisKKwlpbnQgdGVtcCA9IGN1cnJlbnRQb3NpdGlvbjsKKwl0cnkgeworCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQlpbnQgYzEsIGMyLCBjMywgYzQ7CisJCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJdW5pY29kZVNpemUrKzsKKwkJCX0KKworCQkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJfHwgYzEgPCAwKQorCQkJCXx8ICgoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1IHx8IGMyIDwgMCkKKwkJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQkJfHwgKChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUgfHwgYzQgPCAwKSkgeworCQkJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQljdXJyZW50UG9zaXRpb24gPSB0ZW1wOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy9uZWVkIHRoZSB1bmljb2RlIGJ1ZmZlcgorCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkvL2J1ZmZlciBhbGwgdGhlIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBhc2lkZS4uLi4KKwkJCQl3aXRob3V0VW5pY29kZVB0ciA9IGN1cnJlbnRQb3NpdGlvbiAtIHVuaWNvZGVTaXplIC0gc3RhcnRQb3NpdGlvbjsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQlzb3VyY2UsIAorCQkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkxLCAKKwkJCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwkJCX0KKwkJCS8vZmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGNoYXIKKwkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiB0cnVlOworCQl9IC8vLS0tLS0tLS0tLS0tLWVuZCB1bmljb2RlIHRyYWl0ZW1lbnQtLS0tLS0tLS0tLS0tLQorCQllbHNlIHsKKwkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGN1cnJlbnRDaGFyYWN0ZXIpKSB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gdGVtcDsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKQorCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCWN1cnJlbnRQb3NpdGlvbiA9IHRlbXA7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitwdWJsaWMgaW50IGdldE5leHRUb2tlbigpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCisJdGhpcy53YXNBY3IgPSBmYWxzZTsKKwlpZiAoZGlldCkgeworCQlqdW1wT3Zlck1ldGhvZEJvZHkoKTsKKwkJZGlldCA9IGZhbHNlOworCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uID4gc291cmNlLmxlbmd0aCA/IFRva2VuTmFtZUVPRiA6IFRva2VuTmFtZVJCUkFDRTsKKwl9CisJaW50IHdoaXRlU3RhcnQgPSAwOworCXRyeSB7CisJCXdoaWxlICh0cnVlKSB7IC8vbG9vcCBmb3IganVtcGluZyBvdmVyIGNvbW1lbnRzCisJCQl3aXRob3V0VW5pY29kZVB0ciA9IDA7CisJCQkvL3N0YXJ0IHdpdGggYSBuZXcgdG9rZW4gKGV2ZW4gY29tbWVudCB3cml0dGVuIHdpdGggdW5pY29kZSApCisKKwkJCS8vIC0tLS0tLS0tLUNvbnN1bWUgd2hpdGUgc3BhY2UgYW5kIGhhbmRsZXMgc3RhcnRQb3NpdGlvbi0tLS0tLS0tLQorCQkJd2hpdGVTdGFydCA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCWJvb2xlYW4gaXNXaGl0ZVNwYWNlLCBoYXNXaGl0ZVNwYWNlcyA9IGZhbHNlOworCQkJaW50IG9mZnNldCA9IDA7CisJCQlkbyB7CisJCQkJc3RhcnRQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCQlib29sZWFuIGNoZWNrSWZVbmljb2RlID0gZmFsc2U7CisJCQkJdHJ5IHsKKwkJCQkJY2hlY2tJZlVuaWNvZGUgPSAoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKTsKKwkJCQl9IGNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQlpZiAodG9rZW5pemVXaGl0ZVNwYWNlICYmICh3aGl0ZVN0YXJ0ICE9IGN1cnJlbnRQb3NpdGlvbiAtIDEpKSB7CisJCQkJCQkvLyByZXBvc2l0aW9uIHNjYW5uZXIgaW4gY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBieSBzcGFjZXMgYXMgdG9rZW5zCisJCQkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJCXN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJCQkJcmV0dXJuIFRva2VuTmFtZVdISVRFU1BBQ0U7CisJCQkJCX0KKwkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IGVvZlBvc2l0aW9uKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUVPRjsKKwkJCQl9CisJCQkJaWYgKGNoZWNrSWZVbmljb2RlKSB7CisJCQkJCWlzV2hpdGVTcGFjZSA9IGp1bXBPdmVyVW5pY29kZVdoaXRlU3BhY2UoKTsKKwkJCQkJb2Zmc2V0ID0gNjsKKwkJCQl9IGVsc2UgeworCQkJCQlvZmZzZXQgPSAxOworCQkJCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKKwkJCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVTdHJpbmcoKTsKKwkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY3VycmVudExpbmUgPSBudWxsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlzV2hpdGVTcGFjZSA9IAorCQkJCQkJKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyAnKSB8fCBDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsgCisJCQkJfQorCQkJCWlmIChpc1doaXRlU3BhY2UpIHsKKwkJCQkJaGFzV2hpdGVTcGFjZXMgPSB0cnVlOworCQkJCX0KKwkJCX0gd2hpbGUgKGlzV2hpdGVTcGFjZSk7CisJCQlpZiAodG9rZW5pemVXaGl0ZVNwYWNlICYmIGhhc1doaXRlU3BhY2VzKSB7CisJCQkJLy8gcmVwb3NpdGlvbiBzY2FubmVyIGluIGNhc2Ugd2UgYXJlIGludGVyZXN0ZWQgYnkgc3BhY2VzIGFzIHRva2VucworCQkJCWN1cnJlbnRQb3NpdGlvbi09b2Zmc2V0OworCQkJCXN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJCXJldHVybiBUb2tlbk5hbWVXSElURVNQQUNFOworCQkJfQorCQkJLy9saXR0bGUgdHJpY2sgdG8gZ2V0IG91dCBpbiB0aGUgbWlkZGxlIG9mIGEgc291cmNlIGNvbXB1YXRpb24KKwkJCWlmIChjdXJyZW50UG9zaXRpb24gPiBlb2ZQb3NpdGlvbikKKwkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOworCisJCQkvLyAtLS0tLS0tLS1JZGVudGlmeSB0aGUgbmV4dCB0b2tlbi0tLS0tLS0tLS0tLS0KKworCQkJc3dpdGNoIChjdXJyZW50Q2hhcmFjdGVyKSB7CisJCQkJY2FzZSAnKCcgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lTFBBUkVOOworCQkJCWNhc2UgJyknIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVJQQVJFTjsKKwkJCQljYXNlICd7JyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVMQlJBQ0U7CisJCQkJY2FzZSAnfScgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUkJSQUNFOworCQkJCWNhc2UgJ1snIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUxCUkFDS0VUOworCQkJCWNhc2UgJ10nIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVJCUkFDS0VUOworCQkJCWNhc2UgJzsnIDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZVNFTUlDT0xPTjsKKwkJCQljYXNlICcsJyA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NQTsKKwkJCQljYXNlICcuJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhckFzRGlnaXQoKSkKKwkJCQkJCXJldHVybiBzY2FuTnVtYmVyKHRydWUpOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRE9UOworCQkJCWNhc2UgJysnIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignKycsICc9JykpID09IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVBMVVNfUExVUzsKKwkJCQkJCWlmICh0ZXN0ID4gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUExVU19FUVVBTDsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVQTFVTOworCQkJCQl9CisJCQkJY2FzZSAnLScgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCctJywgJz0nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTUlOVVNfTUlOVVM7CisJCQkJCQlpZiAodGVzdCA+IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1JTlVTX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1JTlVTOworCQkJCQl9CisJCQkJY2FzZSAnficgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lVFdJRERMRTsKKwkJCQljYXNlICchJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZU5PVF9FUVVBTDsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZU5PVDsKKwkJCQljYXNlICcqJyA6CisJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lTVVMVElQTFk7CisJCQkJY2FzZSAnJScgOgorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVSRU1BSU5ERVI7CisJCQkJY2FzZSAnPCcgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJzwnKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVTU19FUVVBTDsKKwkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCWlmIChnZXROZXh0Q2hhcignPScpKQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVGVF9TSElGVF9FUVVBTDsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lTEVGVF9TSElGVDsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBUb2tlbk5hbWVMRVNTOworCQkJCQl9CisJCQkJY2FzZSAnPicgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJz4nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lR1JFQVRFUl9FUVVBTDsKKwkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCc9JywgJz4nKSkgPT0gMCkKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMOworCQkJCQkJCWlmICh0ZXN0ID4gMCkgeworCQkJCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVVTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTDsKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lUklHSFRfU0hJRlQ7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lR1JFQVRFUjsKKwkJCQkJfQorCQkJCWNhc2UgJz0nIDoKKwkJCQkJaWYgKGdldE5leHRDaGFyKCc9JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRVFVQUxfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVFUVVBTDsKKwkJCQljYXNlICcmJyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJyYnLCAnPScpKSA9PSAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVBTkRfQU5EOworCQkJCQkJaWYgKHRlc3QgPiAwKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVBTkRfRVFVQUw7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQU5EOworCQkJCQl9CisJCQkJY2FzZSAnfCcgOgorCQkJCQl7CisJCQkJCQlpbnQgdGVzdDsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCd8JywgJz0nKSkgPT0gMCkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lT1JfT1I7CisJCQkJCQlpZiAodGVzdCA+IDApCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZU9SX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZU9SOworCQkJCQl9CisJCQkJY2FzZSAnXicgOgorCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVYT1JfRVFVQUw7CisJCQkJCXJldHVybiBUb2tlbk5hbWVYT1I7CisJCQkJY2FzZSAnPycgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lUVVFU1RJT047CisJCQkJY2FzZSAnOicgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09MT047CisJCQkJY2FzZSAnXCcnIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlpZiAoKHRlc3QgPSBnZXROZXh0Q2hhcignXG4nLCAnXHInKSkgPT0gMCkgeworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCQkJfQorCQkJCQkJaWYgKHRlc3QgPiAwKSB7CisJCQkJCQkJLy8gcmVsb2NhdGUgaWYgZmluZGluZyBhbm90aGVyIHF1b3RlIGZhaXJseSBjbG9zZTogdGh1cyB1bmljb2RlICcvdTAwMEQnIHdpbGwgYmUgZnVsbHkgY29uc3VtZWQKKwkJCQkJCQlmb3IgKGludCBsb29rQWhlYWQgPSAwOyBsb29rQWhlYWQgPCAzOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcJycpIHsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcJycpKSB7CisJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJZm9yIChpbnQgbG9va0FoZWFkID0gMDsgbG9va0FoZWFkIDwgMzsgbG9va0FoZWFkKyspIHsKKwkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkXSA9PSAnXG4nKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wnJykgeworCQkJCQkJCQljdXJyZW50UG9zaXRpb24gKz0gbG9va0FoZWFkICsgMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0NIQVJBQ1RFUl9DT05TVEFOVCk7CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcXCcpKQorCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQllbHNlIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQlib29sZWFuIGNoZWNrSWZVbmljb2RlID0gZmFsc2U7CisJCQkJCQl0cnkgeworCQkJCQkJCWNoZWNrSWZVbmljb2RlID0gKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKTsKKwkJCQkJCX0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiA+IGVvZlBvc2l0aW9uKQorCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRU9GOworCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCQkJfQorCQkJCQkJaWYgKGNoZWNrSWZVbmljb2RlKSB7CisJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGdldE5leHRDaGFyKCdcJycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNoYXJhY3RlckxpdGVyYWw7CisJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCisJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDIwOyBsb29rQWhlYWQrKykgeworCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZCA9PSBzb3VyY2UubGVuZ3RoKQorCQkJCQkJCWJyZWFrOworCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wnJykgeworCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSQUNURVJfQ09OU1RBTlQpOworCQkJCWNhc2UgJyInIDoKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJd2hpbGUgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJyInKSB7CisJCQkJCQkJLyoqKiogXHIgYW5kIFxuIGFyZSBub3QgdmFsaWQgaW4gc3RyaW5nIGxpdGVyYWxzICoqKiovCisJCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpKSB7CisJCQkJCQkJCS8vIHJlbG9jYXRlIGlmIGZpbmRpbmcgYW5vdGhlciBxdW90ZSBmYWlybHkgY2xvc2U6IHRodXMgdW5pY29kZSAnL3UwMDBEJyB3aWxsIGJlIGZ1bGx5IGNvbnN1bWVkCisJCQkJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDUwOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQkJaWYgKGN1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZCA9PSBzb3VyY2UubGVuZ3RoKQorCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbiArIGxvb2tBaGVhZF0gPT0gJ1wiJykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9DSEFSX0lOX1NUUklORyk7CisJCQkJCQkJfQorCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdcXCcpIHsKKwkJCQkJCQkJaW50IGVzY2FwZVNpemUgPSBjdXJyZW50UG9zaXRpb247CisJCQkJCQkJCWJvb2xlYW4gYmFja1NsYXNoQXNVbmljb2RlSW5TdHJpbmcgPSB1bmljb2RlQXNCYWNrU2xhc2g7CisJCQkJCQkJCS8vc2NhbkVzY2FwZUNoYXJhY3RlciBtYWtlIGEgc2lkZSBlZmZlY3Qgb24gdGhpcyB2YWx1ZSBhbmQgd2UgbmVlZCB0aGUgcHJldmlvdXMgdmFsdWUgZmV3IGxpbmVzIGRvd24gdGhpcyBvbmUKKwkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCQllc2NhcGVTaXplID0gY3VycmVudFBvc2l0aW9uIC0gZXNjYXBlU2l6ZTsKKwkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyID09IDApIHsKKwkJCQkJCQkJCS8vYnVmZmVyIGFsbCB0aGUgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBsZWZ0IGFzaWRlLi4uLgorCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVQdHIgPSBjdXJyZW50UG9zaXRpb24gLSBlc2NhcGVTaXplIC0gMSAtIHN0YXJ0UG9zaXRpb247CisJCQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCQkJCQkJCXNvdXJjZSwgCisJCQkJCQkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXIsIAorCQkJCQkJCQkJCTEsIAorCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlUHRyKTsgCisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0gZWxzZSB7IC8vb3ZlcndyaXRlIHRoZSAvIGluIHRoZSBidWZmZXIKKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyW3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCQlpZiAoYmFja1NsYXNoQXNVbmljb2RlSW5TdHJpbmcpIHsgLy90aGVyZSBhcmUgVFdPIFwgaW4gdGhlIHN0cmVhbSB3aGVyZSBvbmx5IG9uZSBpcyBjb3JyZWN0CisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVQdHItLTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9TVFJJTkcpOworCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscyhJTlZBTElEX0VTQ0FQRSkpIHsKKwkJCQkJCQkvLyByZWxvY2F0ZSBpZiBmaW5kaW5nIGFub3RoZXIgcXVvdGUgZmFpcmx5IGNsb3NlOiB0aHVzIHVuaWNvZGUgJy91MDAwRCcgd2lsbCBiZSBmdWxseSBjb25zdW1lZAorCQkJCQkJCWZvciAoaW50IGxvb2tBaGVhZCA9IDA7IGxvb2tBaGVhZCA8IDUwOyBsb29rQWhlYWQrKykgeworCQkJCQkJCQlpZiAoY3VycmVudFBvc2l0aW9uICsgbG9va0FoZWFkID09IHNvdXJjZS5sZW5ndGgpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcbicpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyBsb29rQWhlYWRdID09ICdcIicpIHsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiArPSBsb29rQWhlYWQgKyAxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJCXRocm93IGU7IC8vIHJldGhyb3cKKwkJCQkJfQorCQkJCQlpZiAoY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscyl7IC8vIGNoZWNrIGZvciBwcmVzZW5jZSBvZglOTFMgdGFncyAvLyROT04tTkxTLT8kIHdoZXJlID8gaXMgYW4gaW50LgorCQkJCQkJaWYgKGN1cnJlbnRMaW5lID09IG51bGwpIHsKKwkJCQkJCQljdXJyZW50TGluZSA9IG5ldyBOTFNMaW5lKCk7CisJCQkJCQl9CisJCQkJCQljdXJyZW50TGluZS5hZGQoCisJCQkJCQkJbmV3IFN0cmluZ0xpdGVyYWwoCisJCQkJCQkJCWdldEN1cnJlbnRUb2tlblNvdXJjZVN0cmluZygpLCAKKwkJCQkJCQkJc3RhcnRQb3NpdGlvbiwgCisJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiAtIDEpKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gVG9rZW5OYW1lU3RyaW5nTGl0ZXJhbDsKKwkJCQljYXNlICcvJyA6CisJCQkJCXsKKwkJCQkJCWludCB0ZXN0OworCQkJCQkJaWYgKCh0ZXN0ID0gZ2V0TmV4dENoYXIoJy8nLCAnKicpKSA9PSAwKSB7IC8vbGluZSBjb21tZW50IAorCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzQgPCAwKSB7CisJCQkJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vaGFuZGxlIHRoZSBcXHUgY2FzZSBtYW51YWxseSBpbnRvIGNvbW1lbnQKKwkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCWJvb2xlYW4gaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICdccicgJiYgY3VycmVudENoYXJhY3RlciAhPSAnXG4nKSB7CisJCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyCisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsJCQkJCQkJCQkKKwkJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsJCQkJCQkJCQkJCQorCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCXdoaWxlIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpIHsKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGM0IDwgMCkgeworCQkJCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJLyoKKwkJCQkJCQkJICogV2UgbmVlZCB0byBjb21wbGV0ZWx5IGNvbnN1bWUgdGhlIGxpbmUgYnJlYWsKKwkJCQkJCQkJICovCisJCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdccicKKwkJCQkJCQkJICAgJiYgc291cmNlLmxlbmd0aCA+IGN1cnJlbnRQb3NpdGlvbikgeworCQkJCQkJCQkgICAJaWYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcbicpIHsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gJ1xuJzsKKwkJCQkJCQkJICAgCX0gZWxzZSBpZiAoKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICdcXCcpCisJCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb24gKyAxXSA9PSAndScpKSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gdHJ1ZTsKKwkJCQkJCQkJCQljaGFyIHVuaWNvZGVDaGFyOworCQkJCQkJCQkJCWludCBpbmRleCA9IGN1cnJlbnRQb3NpdGlvbiArIDE7CisJCQkJCQkJCQkJaW5kZXgrKzsKKwkJCQkJCQkJCQl3aGlsZSAoc291cmNlW2luZGV4XSA9PSAndScpIHsKKwkJCQkJCQkJCQkJaW5kZXgrKzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7CisJCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2luZGV4KytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbaW5kZXgrK10pKSA+IDE1CisJCQkJCQkJCQkJCXx8IGMyIDwgMAorCQkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtpbmRleCsrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzMgPCAwCisJCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2luZGV4KytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjNCA8IDApIHsKKwkJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uID0gaW5kZXg7CisJCQkJCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSk7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJdW5pY29kZUNoYXIgPSAoY2hhcikgKCgoYzEgKiAxNiArIGMyKSAqIDE2ICsgYzMpICogMTYgKyBjNCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmICh1bmljb2RlQ2hhciA9PSAnXG4nKSB7CisJCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbiA9IGluZGV4OworCQkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gJ1xuJzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJICAgCX0KKwkJCQkJCQkJcmVjb3JkQ29tbWVudChmYWxzZSk7CisJCQkJCQkJCWlmICh0aGlzLnRhc2tUYWdzICE9IG51bGwpIGNoZWNrVGFza1RhZyh0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuY3VycmVudFBvc2l0aW9uKTsKKwkJCQkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpIHx8IChjdXJyZW50Q2hhcmFjdGVyID09ICdcbicpKSB7CisJCQkJCQkJCQljaGVja05vbkV4dGVybmFsaXplU3RyaW5nKCk7CisJCQkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcikgeworCQkJCQkJCQkJCWlmIChpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQkJcHVzaFVuaWNvZGVMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAodG9rZW5pemVDb21tZW50cykgeworCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJCQlyZWNvcmRDb21tZW50KGZhbHNlKTsKKwkJCQkJCQkJaWYgKHRoaXMudGFza1RhZ3MgIT0gbnVsbCkgY2hlY2tUYXNrVGFnKHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5jdXJyZW50UG9zaXRpb24tMSk7CisJCQkJCQkJCWlmICh0b2tlbml6ZUNvbW1lbnRzKSB7CisJCQkJCQkJCQl0aGlzLmN1cnJlbnRQb3NpdGlvbi0tOyAvLyByZXNldCBvbmUgY2hhcmFjdGVyIGJlaGluZAorCQkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUNPTU1FTlRfTElORTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICh0ZXN0ID4gMCkgeyAvL3RyYWRpdGlvbmFsIGFuZCBhbm5vdGF0aW9uIGNvbW1lbnQKKwkJCQkJCQl0cnkgeyAvL2dldCB0aGUgbmV4dCBjaGFyCisJCQkJCQkJCWJvb2xlYW4gaXNKYXZhZG9jID0gZmFsc2UsIHN0YXIgPSBmYWxzZTsKKwkJCQkJCQkJYm9vbGVhbiBpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQkJLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQorCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnKicpIHsKKwkJCQkJCQkJCWlzSmF2YWRvYyA9IHRydWU7CisJCQkJCQkJCQlzdGFyID0gdHJ1ZTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpIHsKKwkJCQkJCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVTdHJpbmcoKTsKKwkJCQkJCQkJCWlmIChyZWNvcmRMaW5lU2VwYXJhdG9yKSB7CisJCQkJCQkJCQkJaWYgKCFpc1VuaWNvZGUpIHsKKwkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXFwnKSB7CisJCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xcJykKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsgLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJLy9sb29wIHVudGlsIGVuZCBvZiBjb21tZW50ICovCisJCQkJCQkJCXdoaWxlICgoY3VycmVudENoYXJhY3RlciAhPSAnLycpIHx8ICghc3RhcikpIHsKKwkJCQkJCQkJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkgeworCQkJCQkJCQkJCWNoZWNrTm9uRXh0ZXJuYWxpemVTdHJpbmcoKTsKKwkJCQkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcikgeworCQkJCQkJCQkJCQlpZiAoIWlzVW5pY29kZSkgeworCQkJCQkJCQkJCQkJcHVzaExpbmVTZXBhcmF0b3IoKTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQlzdGFyID0gY3VycmVudENoYXJhY3RlciA9PSAnKic7CisJCQkJCQkJCQkvL2dldCBuZXh0IGNoYXIKKwkJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWlzVW5pY29kZSA9IGZhbHNlOworCQkJCQkJCQkJfQorCQkJCQkJCQkJLy9oYW5kbGUgdGhlIFxcdSBjYXNlIG1hbnVhbGx5IGludG8gY29tbWVudAorCQkJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXFwnKQorCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCX0gLy9qdW1wIG92ZXIgdGhlIFxcCisJCQkJCQkJCX0KKwkJCQkJCQkJcmVjb3JkQ29tbWVudChpc0phdmFkb2MpOworCQkJCQkJCQlpZiAodGhpcy50YXNrVGFncyAhPSBudWxsKSBjaGVja1Rhc2tUYWcodGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmN1cnJlbnRQb3NpdGlvbik7CisJCQkJCQkJCWlmICh0b2tlbml6ZUNvbW1lbnRzKSB7CisJCQkJCQkJCQlpZiAoaXNKYXZhZG9jKQorCQkJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVDT01NRU5UX0pBVkFET0M7CisJCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lQ09NTUVOVF9CTE9DSzsKKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKFVOVEVSTUlOQVRFRF9DT01NRU5UKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoZ2V0TmV4dENoYXIoJz0nKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lRElWSURFX0VRVUFMOworCQkJCQkJcmV0dXJuIFRva2VuTmFtZURJVklERTsKKwkJCQkJfQorCQkJCWNhc2UgJ1x1MDAxYScgOgorCQkJCQlpZiAoYXRFbmQoKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVFT0Y7CisJCQkJCS8vdGhlIGF0RW5kIG1heSBub3QgYmUgPGN1cnJlbnRQb3NpdGlvbiA9PSBzb3VyY2UubGVuZ3RoPiBpZiBzb3VyY2UgaXMgb25seSBzb21lIHBhcnQgb2YgYSByZWFsIChleHRlcm5hbCkgc3RyZWFtCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oIkN0cmwtWiIpOyAvLyROT04tTkxTLTEkCisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3VycmVudENoYXJhY3RlcikpCisJCQkJCQlyZXR1cm4gc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKQorCQkJCQkJcmV0dXJuIHNjYW5OdW1iZXIoZmFsc2UpOworCQkJCQlyZXR1cm4gVG9rZW5OYW1lRVJST1I7CisJCQl9CisJCX0KKwl9IC8vLS0tLS0tLS0tLS0tLS0tLS1lbmQgc3dpdGNoIHdoaWxlIHRyeS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQlpZiAodG9rZW5pemVXaGl0ZVNwYWNlICYmICh3aGl0ZVN0YXJ0ICE9IGN1cnJlbnRQb3NpdGlvbiAtIDEpKSB7CisJCQkvLyByZXBvc2l0aW9uIHNjYW5uZXIgaW4gY2FzZSB3ZSBhcmUgaW50ZXJlc3RlZCBieSBzcGFjZXMgYXMgdG9rZW5zCisJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCXN0YXJ0UG9zaXRpb24gPSB3aGl0ZVN0YXJ0OworCQkJcmV0dXJuIFRva2VuTmFtZVdISVRFU1BBQ0U7CisJCX0KKwl9CisJcmV0dXJuIFRva2VuTmFtZUVPRjsKK30KK3B1YmxpYyBmaW5hbCB2b2lkIGdldE5leHRVbmljb2RlQ2hhcigpCisJdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJLy9WT0lECisJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KKwkvL3doZW4gYSB1bmljb2RlIGFwcGVhcnMgdGhlbiB3ZSBtdXN0IHVzZSBhIGJ1ZmZlciB0aGF0IGhvbGRzIGNoYXIgaW50ZXJuYWwgdmFsdWVzCisJLy9BdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kIGN1cnJlbnRDaGFyYWN0ZXIgaG9sZHMgdGhlIG5ldyB2aXNpdGVkIGNoYXIKKwkvL2FuZCBjdXJyZW50UG9zaXRpb24gcG9pbnRzIHJpZ2h0IG5leHQgYWZ0ZXIgaXQKKworCS8vQUxMIGdldE5leHRDaGFyLi4uLiBBUkUgT1BUSU1JWkVEIENPUElFUyAKKworCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDAsIHVuaWNvZGVTaXplID0gNjsKKwljdXJyZW50UG9zaXRpb24rKzsKKwl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCWN1cnJlbnRQb3NpdGlvbisrOworCQl1bmljb2RlU2l6ZSsrOworCX0KKworCWlmICgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCXx8IGMxIDwgMAorCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCXx8IGMyIDwgMAorCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCXx8IGMzIDwgMAorCQl8fCAoYzQgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCXx8IGM0IDwgMCl7CisJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSk7CisJfSBlbHNlIHsKKwkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJLy9uZWVkIHRoZSB1bmljb2RlIGJ1ZmZlcgorCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkgeworCQkJLy9idWZmZXIgYWxsIHRoZSBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIGxlZnQgYXNpZGUuLi4uCisJCQl3aXRob3V0VW5pY29kZVB0ciA9IGN1cnJlbnRQb3NpdGlvbiAtIHVuaWNvZGVTaXplIC0gc3RhcnRQb3NpdGlvbjsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJc291cmNlLCAKKwkJCQlzdGFydFBvc2l0aW9uLCAKKwkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlciwgCisJCQkJMSwgCisJCQkJd2l0aG91dFVuaWNvZGVQdHIpOyAKKwkJfQorCQkvL2ZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjaGFyCisJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwl9CisJdW5pY29kZUFzQmFja1NsYXNoID0gY3VycmVudENoYXJhY3RlciA9PSAnXFwnOworfQorCitwdWJsaWMgY2hhcltdIGdldFNvdXJjZSgpeworCXJldHVybiB0aGlzLnNvdXJjZTsKK30KKworLyogVG9rZW5pemUgYSBtZXRob2QgYm9keSwgYXNzdW1pbmcgdGhhdCBjdXJseSBicmFja2V0cyBhcmUgcHJvcGVybHkgYmFsYW5jZWQuCisgKi8KK3B1YmxpYyBmaW5hbCB2b2lkIGp1bXBPdmVyTWV0aG9kQm9keSgpIHsKKworCXRoaXMud2FzQWNyID0gZmFsc2U7CisJaW50IGZvdW5kID0gMTsKKwl0cnkgeworCQl3aGlsZSAodHJ1ZSkgeyAvL2xvb3AgZm9yIGp1bXBpbmcgb3ZlciBjb21tZW50cworCQkJLy8gLS0tLS0tLS0tQ29uc3VtZSB3aGl0ZSBzcGFjZSBhbmQgaGFuZGxlcyBzdGFydFBvc2l0aW9uLS0tLS0tLS0tCisJCQlib29sZWFuIGlzV2hpdGVTcGFjZTsKKwkJCWRvIHsKKwkJCQlzdGFydFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uOworCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQlpc1doaXRlU3BhY2UgPSBqdW1wT3ZlclVuaWNvZGVXaGl0ZVNwYWNlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpCisJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQlpc1doaXRlU3BhY2UgPSBDaGFyT3BlcmF0aW9uLmlzV2hpdGVzcGFjZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQl9CisJCQl9IHdoaWxlIChpc1doaXRlU3BhY2UpOworCisJCQkvLyAtLS0tLS0tY29uc3VtZSB0b2tlbiB1bnRpbCB9IGlzIGZvdW5kLS0tLS0tLS0tCisJCQlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJCQljYXNlICd7JyA6CisJCQkJCWZvdW5kKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ30nIDoKKwkJCQkJZm91bmQtLTsKKwkJCQkJaWYgKGZvdW5kID09IDApCisJCQkJCQlyZXR1cm47CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wnJyA6CisJCQkJCXsKKwkJCQkJCWJvb2xlYW4gdGVzdDsKKwkJCQkJCXRlc3QgPSBnZXROZXh0Q2hhcignXFwnKTsKKwkJCQkJCWlmICh0ZXN0KSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRyeSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKKwkJCQkJCQl9OworCQkJCQkJfQorCQkJCQkJZ2V0TmV4dENoYXIoJ1wnJyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWNhc2UgJyInIDoKKwkJCQkJdHJ5IHsKKwkJCQkJCXRyeSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCXdoaWxlIChjdXJyZW50Q2hhcmFjdGVyICE9ICciJykgeworCQkJCQkJCWlmIChjdXJyZW50Q2hhcmFjdGVyID09ICdccicpeworCQkJCQkJCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJyl7CisJCQkJCQkJCWJyZWFrOyAvLyB0aGUgc3RyaW5nIGNhbm5vdCBnbyBmdXJ0aGVyIHRoYXQgdGhlIGxpbmUKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xcJykgeworCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJc2NhbkVzY2FwZUNoYXJhY3RlcigpOworCQkJCQkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXgpIHsKKwkJCQkJCQkJfTsKKwkJCQkJCQl9CisJCQkJCQkJdHJ5IHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCQkJCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJy8nIDoKKwkJCQkJeworCQkJCQkJaW50IHRlc3Q7CisJCQkJCQlib29sZWFuIGlzVW5pY29kZTsKKwkJCQkJCWlmICgodGVzdCA9IGdldE5leHRDaGFyKCcvJywgJyonKSkgPT0gMCkgeyAvL2xpbmUgY29tbWVudCAKKwkJCQkJCQl0cnkgeworCQkJCQkJCQkvL2dldCB0aGUgbmV4dCBjaGFyIAorCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkvLy0tLS0tLS0tLS0tLS11bmljb2RlIHRyYWl0ZW1lbnQgLS0tLS0tLS0tLS0tCisJCQkJCQkJCQlpc1VuaWNvZGUgPSB0cnVlOworCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMzIDwgMAorCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjNCA8IDApIHsgLy9lcnJvciBkb24ndCBjYXJlIG9mIHRoZSB2YWx1ZQorCQkJCQkJCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAnQSc7CisJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIFxuIGFuZCBccgorCQkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlzVW5pY29kZSA9IGZhbHNlOworCQkJCQkJCQl9CisKKwkJCQkJCQkJd2hpbGUgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gJ1xyJyAmJiBjdXJyZW50Q2hhcmFjdGVyICE9ICdcbicpIHsKKwkJCQkJCQkJCS8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCQkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJaWYgKChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzEgPCAwCisJCQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzIgPCAwCisJCQkJCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzMgPCAwCisJCQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQkJfHwgYzQgPCAwKSB7IC8vZXJyb3IgZG9uJ3QgY2FyZSBvZiB0aGUgdmFsdWUKKwkJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdBJzsKKwkJCQkJCQkJCQl9IC8vc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIFxuIGFuZCBccgorCQkJCQkJCQkJCWVsc2UgeworCQkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCQkJCQkJCSYmICgoY3VycmVudENoYXJhY3RlciA9PSAnXHInKSB8fCAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSkpIHsKKwkJCQkJCQkJCQlpZiAoIWlzVW5pY29kZSkgeworCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl9IC8vYW4gZW9mIHdpbGwgdGhlbSBiZSBnZW5lcmF0ZWQKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICh0ZXN0ID4gMCkgeyAvL3RyYWRpdGlvbmFsIGFuZCBhbm5vdGF0aW9uIGNvbW1lbnQKKwkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQlib29sZWFuIHN0YXIgPSBmYWxzZTsKKwkJCQkJCQl0cnkgeyAvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQkJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsKKwkJCQkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJCQkJfQorCQkJCQkJCQl9OworCQkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCX07CisJCQkJCQkJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJyonKSB7CisJCQkJCQkJCXN0YXIgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAocmVjb3JkTGluZVNlcGFyYXRvcgorCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKSB7CisJCQkJCQkJCQlpZiAoIWlzVW5pY29kZSkgeworCQkJCQkJCQkJCXB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRyeSB7IC8vZ2V0IHRoZSBuZXh0IGNoYXIgCisJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQkJCQkJCS8vLS0tLS0tLS0tLS0tLXVuaWNvZGUgdHJhaXRlbWVudCAtLS0tLS0tLS0tLS0KKwkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCQlpbnQgYzEgPSAwLCBjMiA9IDAsIGMzID0gMCwgYzQgPSAwOworCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJCQkJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGMxIDwgMAorCQkJCQkJCQkJCXx8IChjMiA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpID4gMTUKKwkJCQkJCQkJCQl8fCBjMiA8IDAKKwkJCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQkJCQkJCQkJfHwgYzMgPCAwCisJCQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCXx8IGM0IDwgMCkgeyAvL2Vycm9yIGRvbid0IGNhcmUgb2YgdGhlIHZhbHVlCisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9ICdBJzsKKwkJCQkJCQkJCX0gLy9zb21ldGhpbmcgZGlmZmVyZW50IGZyb20gKiBhbmQgLworCQkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWlzVW5pY29kZSA9IGZhbHNlOworCQkJCQkJCQl9CisJCQkJCQkJCS8vbG9vcCB1bnRpbCBlbmQgb2YgY29tbWVudCAqLyAKKwkJCQkJCQkJd2hpbGUgKChjdXJyZW50Q2hhcmFjdGVyICE9ICcvJykgfHwgKCFzdGFyKSkgeworCQkJCQkJCQkJaWYgKHJlY29yZExpbmVTZXBhcmF0b3IKKwkJCQkJCQkJCQkmJiAoKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgfHwgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xuJykpKSB7CisJCQkJCQkJCQkJCWlmICghaXNVbmljb2RlKSB7CisJCQkJCQkJCQkJCQlwdXNoTGluZVNlcGFyYXRvcigpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQlzdGFyID0gY3VycmVudENoYXJhY3RlciA9PSAnKic7CisJCQkJCQkJCQkvL2dldCBuZXh0IGNoYXIKKwkJCQkJCQkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCQkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQkJCQkJLy8tLS0tLS0tLS0tLS0tdW5pY29kZSB0cmFpdGVtZW50IC0tLS0tLS0tLS0tLQorCQkJCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7CisJCQkJCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCQkJCQkJCQljdXJyZW50UG9zaXRpb24rKzsKKwkJCQkJCQkJCQl3aGlsZSAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSB7CisJCQkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMSA8IDAKKwkJCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMiA8IDAKKwkJCQkJCQkJCQkJfHwgKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjMyA8IDAKKwkJCQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNQorCQkJCQkJCQkJCQl8fCBjNCA8IDApIHsgLy9lcnJvciBkb24ndCBjYXJlIG9mIHRoZSB2YWx1ZQorCQkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gJ0EnOworCQkJCQkJCQkJCX0gLy9zb21ldGhpbmcgZGlmZmVyZW50IGZyb20gKiBhbmQgLworCQkJCQkJCQkJCWVsc2UgeworCQkJCQkJCQkJCQljdXJyZW50Q2hhcmFjdGVyID0gKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3VycmVudENoYXJhY3RlcikpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJc2NhbklkZW50aWZpZXJPcktleXdvcmQoKTsKKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyKSkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlzY2FuTnVtYmVyKGZhbHNlKTsKKwkJCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBleCkgeworCQkJCQkJfTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCX0KKwkJLy8tLS0tLS0tLS0tLS0tLS0tLWVuZCBzd2l0Y2ggd2hpbGUgdHJ5LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCX0KKwlyZXR1cm47Cit9CitwdWJsaWMgZmluYWwgYm9vbGVhbiBqdW1wT3ZlclVuaWNvZGVXaGl0ZVNwYWNlKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJLy9CT09MRUFOCisJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4gSnVtcCBvdmVyIHRoZSBuZXh0IHdoaXRlU3BhY2UKKwkvL21ha2luZyBzdGFydFBvc2l0aW9uIHBvaW50aW5nIG9uIHRoZSBuZXh0IGF2YWlsYWJsZSBjaGFyCisJLy9PbiBmYWxzZSwgdGhlIGN1cnJlbnRDaGFyYWN0ZXIgaXMgZmlsbGVkIHVwIHdpdGggYSBwb3RlbnRpYWwKKwkvL2NvcnJlY3QgY2hhcgorCisJdHJ5IHsKKwkJdGhpcy53YXNBY3IgPSBmYWxzZTsKKwkJaW50IGMxLCBjMiwgYzMsIGM0OworCQlpbnQgdW5pY29kZVNpemUgPSA2OworCQljdXJyZW50UG9zaXRpb24rKzsKKwkJd2hpbGUgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykgeworCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQl1bmljb2RlU2l6ZSsrOworCQl9CisKKwkJaWYgKCgoYzEgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSA+IDE1CisJCQl8fCBjMSA8IDApCisJCQl8fCAoKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMiA8IDApCisJCQl8fCAoKGMzID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjMyA8IDApCisJCQl8fCAoKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSkgPiAxNSB8fCBjNCA8IDApKSB7CisJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfVU5JQ09ERV9FU0NBUEUpOworCQl9CisKKwkJY3VycmVudENoYXJhY3RlciA9IChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KTsKKwkJaWYgKENoYXJPcGVyYXRpb24uaXNXaGl0ZXNwYWNlKGN1cnJlbnRDaGFyYWN0ZXIpKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLy9idWZmZXIgdGhlIG5ldyBjaGFyIHdoaWNoIGlzIG5vdCBhIHdoaXRlIHNwYWNlCisJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJLy93aXRob3V0VW5pY29kZVB0ciA9PSAxIGlzIHRydWUgaGVyZQorCQlyZXR1cm4gZmFsc2U7CisJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXsKKwkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX1VOSUNPREVfRVNDQVBFKTsKKwl9Cit9CisKK2ZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UxKCkgeworCS8vcmV0dXJuIGFsd2F5cyB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCisKKwkvL29wdGltaXphdGlvbiBhdCBubyBzcGVlZCBjb3N0IG9mIDk5LjUgJSBvZiB0aGUgc2luZ2xlQ2hhcklkZW50aWZpZXIKKwljaGFyIGNoYXJPbmUgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl07CisJc3dpdGNoIChjaGFyT25lKSB7CisJCWNhc2UgJ2EnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfYTsKKwkJY2FzZSAnYicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9iOworCQljYXNlICdjJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2M7CisJCWNhc2UgJ2QnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfZDsKKwkJY2FzZSAnZScgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9lOworCQljYXNlICdmJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2Y7CisJCWNhc2UgJ2cnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfZzsKKwkJY2FzZSAnaCcgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9oOworCQljYXNlICdpJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2k7CisJCWNhc2UgJ2onIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfajsKKwkJY2FzZSAnaycgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9rOworCQljYXNlICdsJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X2w7CisJCWNhc2UgJ20nIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfbTsKKwkJY2FzZSAnbicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9uOworCQljYXNlICdvJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X287CisJCWNhc2UgJ3AnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfcDsKKwkJY2FzZSAncScgOgorCQkJcmV0dXJuIGNoYXJBcnJheV9xOworCQljYXNlICdyJyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3I7CisJCWNhc2UgJ3MnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfczsKKwkJY2FzZSAndCcgOgorCQkJcmV0dXJuIGNoYXJBcnJheV90OworCQljYXNlICd1JyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3U7CisJCWNhc2UgJ3YnIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfdjsKKwkJY2FzZSAndycgOgorCQkJcmV0dXJuIGNoYXJBcnJheV93OworCQljYXNlICd4JyA6CisJCQlyZXR1cm4gY2hhckFycmF5X3g7CisJCWNhc2UgJ3knIDoKKwkJCXJldHVybiBjaGFyQXJyYXlfeTsKKwkJY2FzZSAneicgOgorCQkJcmV0dXJuIGNoYXJBcnJheV96OworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBuZXcgY2hhcltdIHtjaGFyT25lfTsKKwl9Cit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlMigpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzE7CisJaW50IGhhc2ggPSAKKwkJKCgoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pIDw8IDYpICsgKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzBdW2hhc2hdOworCWludCBpID0gbmV3RW50cnkyOworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKSAmJiAoYzEgPT0gY2hhckFycmF5WzFdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnkyOworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pICYmIChjMSA9PSBjaGFyQXJyYXlbMV0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLWFkZCB0aGUgZW50cnktLS0tLS0tCisJaWYgKCsrbWF4ID49IEludGVybmFsVGFibGVTaXplKSBtYXggPSAwOworCWNoYXJbXSByOworCXRhYmxlW21heF0gPSAociA9IG5ldyBjaGFyW10ge2MwLCBjMX0pOworCW5ld0VudHJ5MiA9IG1heDsKKwlyZXR1cm4gcjsKK30KK2ZpbmFsIGNoYXJbXSBvcHRpbWl6ZWRDdXJyZW50VG9rZW5Tb3VyY2UzKCkgeworCS8vdHJ5IHRvIHJldHVybiB0aGUgc2FtZSBjaGFyW10gYnVpbGQgb25seSBvbmNlCisKKwljaGFyIGMwLCBjMSwgYzI7CisJaW50IGhhc2ggPSAKKwkJKCgoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pIDw8IDEyKQorCQkJKyAoKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkgPDwgNikKKwkJCSsgKGMyID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAyXSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzFdW2hhc2hdOworCWludCBpID0gbmV3RW50cnkzOworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKSAmJiAoYzEgPT0gY2hhckFycmF5WzFdKSAmJiAoYzIgPT0gY2hhckFycmF5WzJdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnkzOworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pICYmIChjMSA9PSBjaGFyQXJyYXlbMV0pICYmIChjMiA9PSBjaGFyQXJyYXlbMl0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLWFkZCB0aGUgZW50cnktLS0tLS0tCisJaWYgKCsrbWF4ID49IEludGVybmFsVGFibGVTaXplKSBtYXggPSAwOworCWNoYXJbXSByOworCXRhYmxlW21heF0gPSAociA9IG5ldyBjaGFyW10ge2MwLCBjMSwgYzJ9KTsKKwluZXdFbnRyeTMgPSBtYXg7CisJcmV0dXJuIHI7Cit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNCgpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzEsIGMyLCBjMzsKKwlsb25nIGhhc2ggPSAKKwkJKCgoKGxvbmcpIChjMCA9IHNvdXJjZVtzdGFydFBvc2l0aW9uXSkpIDw8IDE4KQorCQkJKyAoKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkgPDwgMTIpCisJCQkrICgoYzIgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDJdKSA8PCA2KQorCQkJKyAoYzMgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDNdKSkKKwkJCSUgVGFibGVTaXplOyAKKwljaGFyW11bXSB0YWJsZSA9IGNoYXJBcnJheV9sZW5ndGhbMl1bKGludCkgaGFzaF07CisJaW50IGkgPSBuZXdFbnRyeTQ7CisJd2hpbGUgKCsraSA8IEludGVybmFsVGFibGVTaXplKSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLS1vdGhlciBzaWRlLS0tLS0tLS0tCisJaSA9IC0xOworCWludCBtYXggPSBuZXdFbnRyeTQ7CisJd2hpbGUgKCsraSA8PSBtYXgpIHsKKwkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOworCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKKwkJCSYmIChjMSA9PSBjaGFyQXJyYXlbMV0pCisJCQkmJiAoYzIgPT0gY2hhckFycmF5WzJdKQorCQkJJiYgKGMzID09IGNoYXJBcnJheVszXSkpCisJCQlyZXR1cm4gY2hhckFycmF5OworCX0KKwkvLy0tLS0tLS0tYWRkIHRoZSBlbnRyeS0tLS0tLS0KKwlpZiAoKyttYXggPj0gSW50ZXJuYWxUYWJsZVNpemUpIG1heCA9IDA7CisJY2hhcltdIHI7CisJdGFibGVbbWF4XSA9IChyID0gbmV3IGNoYXJbXSB7YzAsIGMxLCBjMiwgYzN9KTsKKwluZXdFbnRyeTQgPSBtYXg7CisJcmV0dXJuIHI7CisJCit9CitmaW5hbCBjaGFyW10gb3B0aW1pemVkQ3VycmVudFRva2VuU291cmNlNSgpIHsKKwkvL3RyeSB0byByZXR1cm4gdGhlIHNhbWUgY2hhcltdIGJ1aWxkIG9ubHkgb25jZQorCisJY2hhciBjMCwgYzEsIGMyLCBjMywgYzQ7CisJbG9uZyBoYXNoID0gCisJCSgoKChsb25nKSAoYzAgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbl0pKSA8PCAyNCkKKwkJCSsgKCgobG9uZykgKGMxID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAxXSkpIDw8IDE4KQorCQkJKyAoKGMyID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyAyXSkgPDwgMTIpCisJCQkrICgoYzMgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDNdKSA8PCA2KQorCQkJKyAoYzQgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDRdKSkKKwkJCSUgVGFibGVTaXplOyAKKwljaGFyW11bXSB0YWJsZSA9IGNoYXJBcnJheV9sZW5ndGhbM11bKGludCkgaGFzaF07CisJaW50IGkgPSBuZXdFbnRyeTU7CisJd2hpbGUgKCsraSA8IEludGVybmFsVGFibGVTaXplKSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pCisJCQkmJiAoYzQgPT0gY2hhckFycmF5WzRdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS0tb3RoZXIgc2lkZS0tLS0tLS0tLQorCWkgPSAtMTsKKwlpbnQgbWF4ID0gbmV3RW50cnk1OworCXdoaWxlICgrK2kgPD0gbWF4KSB7CisJCWNoYXJbXSBjaGFyQXJyYXkgPSB0YWJsZVtpXTsKKwkJaWYgKChjMCA9PSBjaGFyQXJyYXlbMF0pCisJCQkmJiAoYzEgPT0gY2hhckFycmF5WzFdKQorCQkJJiYgKGMyID09IGNoYXJBcnJheVsyXSkKKwkJCSYmIChjMyA9PSBjaGFyQXJyYXlbM10pCisJCQkmJiAoYzQgPT0gY2hhckFycmF5WzRdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS1hZGQgdGhlIGVudHJ5LS0tLS0tLQorCWlmICgrK21heCA+PSBJbnRlcm5hbFRhYmxlU2l6ZSkgbWF4ID0gMDsKKwljaGFyW10gcjsKKwl0YWJsZVttYXhdID0gKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzR9KTsKKwluZXdFbnRyeTUgPSBtYXg7CisJcmV0dXJuIHI7CisJCQorfQorZmluYWwgY2hhcltdIG9wdGltaXplZEN1cnJlbnRUb2tlblNvdXJjZTYoKSB7CisJLy90cnkgdG8gcmV0dXJuIHRoZSBzYW1lIGNoYXJbXSBidWlsZCBvbmx5IG9uY2UKKworCWNoYXIgYzAsIGMxLCBjMiwgYzMsIGM0LCBjNTsKKwlsb25nIGhhc2ggPSAKKwkJKCgoKGxvbmcpIChjMCA9IHNvdXJjZVtzdGFydFBvc2l0aW9uXSkpIDw8IDMyKQorCQkJKyAoKChsb25nKSAoYzEgPSBzb3VyY2Vbc3RhcnRQb3NpdGlvbiArIDFdKSkgPDwgMjQpCisJCQkrICgoKGxvbmcpIChjMiA9IHNvdXJjZVtzdGFydFBvc2l0aW9uICsgMl0pKSA8PCAxOCkKKwkJCSsgKChjMyA9IHNvdXJjZVtzdGFydFBvc2l0aW9uICsgM10pIDw8IDEyKQorCQkJKyAoKGM0ID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyA0XSkgPDwgNikKKwkJCSsgKGM1ID0gc291cmNlW3N0YXJ0UG9zaXRpb24gKyA1XSkpCisJCQklIFRhYmxlU2l6ZTsgCisJY2hhcltdW10gdGFibGUgPSBjaGFyQXJyYXlfbGVuZ3RoWzRdWyhpbnQpIGhhc2hdOworCWludCBpID0gbmV3RW50cnk2OworCXdoaWxlICgrK2kgPCBJbnRlcm5hbFRhYmxlU2l6ZSkgeworCQljaGFyW10gY2hhckFycmF5ID0gdGFibGVbaV07CisJCWlmICgoYzAgPT0gY2hhckFycmF5WzBdKQorCQkJJiYgKGMxID09IGNoYXJBcnJheVsxXSkKKwkJCSYmIChjMiA9PSBjaGFyQXJyYXlbMl0pCisJCQkmJiAoYzMgPT0gY2hhckFycmF5WzNdKQorCQkJJiYgKGM0ID09IGNoYXJBcnJheVs0XSkKKwkJCSYmIChjNSA9PSBjaGFyQXJyYXlbNV0pKQorCQkJcmV0dXJuIGNoYXJBcnJheTsKKwl9CisJLy8tLS0tLS0tLS1vdGhlciBzaWRlLS0tLS0tLS0tCisJaSA9IC0xOworCWludCBtYXggPSBuZXdFbnRyeTY7CisJd2hpbGUgKCsraSA8PSBtYXgpIHsKKwkJY2hhcltdIGNoYXJBcnJheSA9IHRhYmxlW2ldOworCQlpZiAoKGMwID09IGNoYXJBcnJheVswXSkKKwkJCSYmIChjMSA9PSBjaGFyQXJyYXlbMV0pCisJCQkmJiAoYzIgPT0gY2hhckFycmF5WzJdKQorCQkJJiYgKGMzID09IGNoYXJBcnJheVszXSkKKwkJCSYmIChjNCA9PSBjaGFyQXJyYXlbNF0pCisJCQkmJiAoYzUgPT0gY2hhckFycmF5WzVdKSkKKwkJCXJldHVybiBjaGFyQXJyYXk7CisJfQorCS8vLS0tLS0tLS1hZGQgdGhlIGVudHJ5LS0tLS0tLQorCWlmICgrK21heCA+PSBJbnRlcm5hbFRhYmxlU2l6ZSkgbWF4ID0gMDsKKwljaGFyW10gcjsKKwl0YWJsZVttYXhdID0gKHIgPSBuZXcgY2hhcltdIHtjMCwgYzEsIGMyLCBjMywgYzQsIGM1fSk7CisJbmV3RW50cnk2ID0gbWF4OworCXJldHVybiByOwkKK30KK3ByaXZhdGUgdm9pZCBwYXJzZVRhZ3MoTkxTTGluZSBsaW5lKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOworCWludCBwb3MgPSBzLmluZGV4T2YoVEFHX1BSRUZJWCk7CisJaW50IGxpbmVMZW5ndGggPSBsaW5lLnNpemUoKTsKKwl3aGlsZSAocG9zICE9IC0xKSB7CisJCWludCBzdGFydCA9IHBvcyArIFRBR19QUkVGSVhfTEVOR1RIOworCQlpbnQgZW5kID0gcy5pbmRleE9mKFRBR19QT1NURklYLCBzdGFydCk7CisJCWlmIChlbmQgIT0gLTEpIHsKKwkJCVN0cmluZyBpbmRleCA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworCQkJaW50IGkgPSAwOworCQkJdHJ5IHsKKwkJCQlpID0gSW50ZWdlci5wYXJzZUludChpbmRleCkgLSAxOyAvLyBUYWdzIGFyZSBvbmUgYmFzZWQgbm90IHplcm8gYmFzZWQuCisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCWkgPSAtMTsgLy8gd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGlzIGFzIGEgdmFsaWQgTkxTIHRhZworCQkJfQorCQkJaWYgKGxpbmUuZXhpc3RzKGkpKSB7CisJCQkJbGluZS5zZXQoaSwgbnVsbCk7CisJCQl9CisJCX0KKwkJcG9zID0gcy5pbmRleE9mKFRBR19QUkVGSVgsIHN0YXJ0KTsKKwl9CisKKwl0aGlzLm5vbk5MU1N0cmluZ3MgPSBuZXcgU3RyaW5nTGl0ZXJhbFtsaW5lTGVuZ3RoXTsKKwlpbnQgbm9uTkxTQ291bnRlciA9IDA7CisJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKwkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gKFN0cmluZ0xpdGVyYWwpIGl0ZXJhdG9yLm5leHQoKTsKKwkJaWYgKGxpdGVyYWwgIT0gbnVsbCkgeworCQkJdGhpcy5ub25OTFNTdHJpbmdzW25vbk5MU0NvdW50ZXIrK10gPSBsaXRlcmFsOworCQl9CisJfQorCWlmIChub25OTFNDb3VudGVyID09IDApIHsKKwkJdGhpcy5ub25OTFNTdHJpbmdzID0gbnVsbDsKKwkJY3VycmVudExpbmUgPSBudWxsOworCQlyZXR1cm47CisJfSAKKwl0aGlzLndhc05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWwgPSB0cnVlOworCWlmIChub25OTFNDb3VudGVyICE9IGxpbmVMZW5ndGgpIHsKKwkJU3lzdGVtLmFycmF5Y29weSh0aGlzLm5vbk5MU1N0cmluZ3MsIDAsICh0aGlzLm5vbk5MU1N0cmluZ3MgPSBuZXcgU3RyaW5nTGl0ZXJhbFtub25OTFNDb3VudGVyXSksIDAsIG5vbk5MU0NvdW50ZXIpOworCX0KKwljdXJyZW50TGluZSA9IG51bGw7Cit9CisKK3B1YmxpYyBmaW5hbCB2b2lkIHB1c2hMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CisJLy9zZWUgY29tbWVudCBvbiBpc0xpbmVEZWxpbWl0ZXIoY2hhcikgZm9yIHRoZSB1c2Ugb2YgJ1xuJyBhbmQgJ1xyJworCWZpbmFsIGludCBJTkNSRU1FTlQgPSAyNTA7CisJCisJaWYgKHRoaXMuY2hlY2tOb25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFscykgeworCS8vIHJlaW5pdGlhbGl6ZSB0aGUgY3VycmVudCBsaW5lIGZvciBub24gZXh0ZXJuYWxpemUgc3RyaW5ncyBwdXJwb3NlCisJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwl9CisJLy9jdXJyZW50Q2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uIGN1cnJlbnRQb3NpdGlvbi0xCisKKwkvLyBjciAwMDBECisJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgeworCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJaWYgKChsaW5lUHRyID4gMCkgJiYgKGxpbmVFbmRzW2xpbmVQdHJdID49IHNlcGFyYXRvclBvcykpIHJldHVybjsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNSLSIgKyBzZXBhcmF0b3JQb3MpOworCQl0cnkgeworCQkJbGluZUVuZHNbKytsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkvL2xpbmVQdHIgdmFsdWUgaXMgY29ycmVjdAorCQkJaW50IG9sZExlbmd0aCA9IGxpbmVFbmRzLmxlbmd0aDsKKwkJCWludFtdIG9sZCA9IGxpbmVFbmRzOworCQkJbGluZUVuZHMgPSBuZXcgaW50W29sZExlbmd0aCArIElOQ1JFTUVOVF07CisJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZCwgMCwgbGluZUVuZHMsIDAsIG9sZExlbmd0aCk7CisJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJfQorCQkvLyBsb29rLWFoZWFkIGZvciBtZXJnZWQgY3IrbGYKKwkJdHJ5IHsKKwkJCWlmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2stYWhlYWQgTEYtIiArIGN1cnJlbnRQb3NpdGlvbik7CQkJCisJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb247CisJCQkJY3VycmVudFBvc2l0aW9uKys7CisJCQkJd2FzQWNyID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXdhc0FjciA9IHRydWU7CisJCQl9CisJCX0gY2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQl3YXNBY3IgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbGYgMDAwQQorCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB7IC8vbXVzdCBtZXJnZSBldmVudHVhbCBjciBmb2xsb3dlZCBieSBsZgorCQkJaWYgKHdhc0FjciAmJiAobGluZUVuZHNbbGluZVB0cl0gPT0gKGN1cnJlbnRQb3NpdGlvbiAtIDIpKSkgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtZXJnZSBMRi0iICsgKGN1cnJlbnRQb3NpdGlvbiAtIDEpKTsJCQkJCQkJCisJCQkJbGluZUVuZHNbbGluZVB0cl0gPSBjdXJyZW50UG9zaXRpb24gLSAxOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgc2VwYXJhdG9yUG9zID0gY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQlpZiAoKGxpbmVQdHIgPiAwKSAmJiAobGluZUVuZHNbbGluZVB0cl0gPj0gc2VwYXJhdG9yUG9zKSkgcmV0dXJuOworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTEYtIiArIHNlcGFyYXRvclBvcyk7CQkJCQkJCQorCQkJCXRyeSB7CisJCQkJCWxpbmVFbmRzWysrbGluZVB0cl0gPSBzZXBhcmF0b3JQb3M7CisJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vbGluZVB0ciB2YWx1ZSBpcyBjb3JyZWN0CisJCQkJCWludCBvbGRMZW5ndGggPSBsaW5lRW5kcy5sZW5ndGg7CisJCQkJCWludFtdIG9sZCA9IGxpbmVFbmRzOworCQkJCQlsaW5lRW5kcyA9IG5ldyBpbnRbb2xkTGVuZ3RoICsgSU5DUkVNRU5UXTsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIGxpbmVFbmRzLCAwLCBvbGRMZW5ndGgpOworCQkJCQlsaW5lRW5kc1tsaW5lUHRyXSA9IHNlcGFyYXRvclBvczsKKwkJCQl9CisJCQl9CisJCQl3YXNBY3IgPSBmYWxzZTsKKwkJfQorCX0KK30KK3B1YmxpYyBmaW5hbCB2b2lkIHB1c2hVbmljb2RlTGluZVNlcGFyYXRvcigpIHsKKwlpZiAodGhpcy5jaGVja05vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWxzKSB7CisJLy8gcmVpbml0aWFsaXplIHRoZSBjdXJyZW50IGxpbmUgZm9yIG5vbiBleHRlcm5hbGl6ZSBzdHJpbmdzIHB1cnBvc2UKKwkJY3VycmVudExpbmUgPSBudWxsOworCX0KKwkKKwkvLyBjciAwMDBECisJaWYgKGN1cnJlbnRDaGFyYWN0ZXIgPT0gJ1xyJykgeworCQlpZiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ1xuJykgeworCQkJd2FzQWNyID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl3YXNBY3IgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbGYgMDAwQQorCQlpZiAoY3VycmVudENoYXJhY3RlciA9PSAnXG4nKSB7IC8vbXVzdCBtZXJnZSBldmVudHVhbCBjciBmb2xsb3dlZCBieSBsZgorCQkJd2FzQWNyID0gZmFsc2U7CisJCX0KKwl9Cit9CitwdWJsaWMgZmluYWwgdm9pZCByZWNvcmRDb21tZW50KGJvb2xlYW4gaXNKYXZhZG9jKSB7CisKKwkvLyBhIG5ldyBhbm5vdGF0aW9uIGNvbW1lbnQgaXMgcmVjb3JkZWQKKwl0cnkgeworCQl0aGlzLmNvbW1lbnRTdG9wc1srK3RoaXMuY29tbWVudFB0cl0gPSBpc0phdmFkb2MgPyB0aGlzLmN1cnJlbnRQb3NpdGlvbiA6IC10aGlzLmN1cnJlbnRQb3NpdGlvbjsKKwl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkJaW50IG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5jb21tZW50U3RvcHMubGVuZ3RoOworCQlpbnRbXSBvbGRTdGFjayA9IHRoaXMuY29tbWVudFN0b3BzOworCQl0aGlzLmNvbW1lbnRTdG9wcyA9IG5ldyBpbnRbb2xkU3RhY2tMZW5ndGggKyAzMF07CisJCVN5c3RlbS5hcnJheWNvcHkob2xkU3RhY2ssIDAsIHRoaXMuY29tbWVudFN0b3BzLCAwLCBvbGRTdGFja0xlbmd0aCk7CisJCXRoaXMuY29tbWVudFN0b3BzW3RoaXMuY29tbWVudFB0cl0gPSBpc0phdmFkb2MgPyB0aGlzLmN1cnJlbnRQb3NpdGlvbiA6IC10aGlzLmN1cnJlbnRQb3NpdGlvbjsKKwkJLy9ncm93cyB0aGUgcG9zaXRpb25zIGJ1ZmZlcnMgdG9vCisJCWludFtdIG9sZCA9IHRoaXMuY29tbWVudFN0YXJ0czsKKwkJdGhpcy5jb21tZW50U3RhcnRzID0gbmV3IGludFtvbGRTdGFja0xlbmd0aCArIDMwXTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGQsIDAsIHRoaXMuY29tbWVudFN0YXJ0cywgMCwgb2xkU3RhY2tMZW5ndGgpOworCX0KKworCS8vdGhlIGJ1ZmZlciBpcyBvZiBhIGNvcnJlY3Qgc2l6ZSBoZXJlCisJdGhpcy5jb21tZW50U3RhcnRzW3RoaXMuY29tbWVudFB0cl0gPSB0aGlzLnN0YXJ0UG9zaXRpb247Cit9CisKK3B1YmxpYyB2b2lkIHJlc2V0VG8oaW50IGJlZ2luLCBpbnQgZW5kKSB7CisJLy9yZXNldCB0aGUgc2Nhbm5lciB0byBhIGdpdmVuIHBvc2l0aW9uIHdoZXJlIGl0IG1heSByZXNjYW4gYWdhaW4KKworCWRpZXQgPSBmYWxzZTsKKwlpbml0aWFsUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uID0gYmVnaW47CisJZW9mUG9zaXRpb24gPSBlbmQgPCBJbnRlZ2VyLk1BWF9WQUxVRSA/IGVuZCArIDEgOiBlbmQ7CisJY29tbWVudFB0ciA9IC0xOyAvLyByZXNldCBjb21tZW50IHN0YWNrCisJZm91bmRUYXNrQ291bnQgPSAwOworCit9CisKK3B1YmxpYyBmaW5hbCB2b2lkIHNjYW5Fc2NhcGVDaGFyYWN0ZXIoKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKwkvLyB0aGUgc3RyaW5nIHdpdGggIlxcdSIgaXMgYSBsZWdhbCBzdHJpbmcgb2YgdHdvIGNoYXJzIFwgYW5kIHUKKwkvL3RodXMgd2UgdXNlIGEgZGlyZWN0IGFjY2VzcyB0byB0aGUgc291cmNlIChmb3IgcmVndWxhciBjYXNlcykuCisKKwlpZiAodW5pY29kZUFzQmFja1NsYXNoKSB7CisJCS8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKSAmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCX0gZWxzZSB7CisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQljdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXTsKKwlzd2l0Y2ggKGN1cnJlbnRDaGFyYWN0ZXIpIHsKKwkJY2FzZSAnYicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcYic7CisJCQlicmVhazsKKwkJY2FzZSAndCcgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcdCc7CisJCQlicmVhazsKKwkJY2FzZSAnbicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcbic7CisJCQlicmVhazsKKwkJY2FzZSAnZicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcZic7CisJCQlicmVhazsKKwkJY2FzZSAncicgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdccic7CisJCQlicmVhazsKKwkJY2FzZSAnXCInIDoKKwkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAnXCInOworCQkJYnJlYWs7CisJCWNhc2UgJ1wnJyA6CisJCQljdXJyZW50Q2hhcmFjdGVyID0gJ1wnJzsKKwkJCWJyZWFrOworCQljYXNlICdcXCcgOgorCQkJY3VycmVudENoYXJhY3RlciA9ICdcXCc7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQkvLyAtLS0tLS0tLS0tLW9jdGFsIGVzY2FwZS0tLS0tLS0tLS0tLS0tCisJCQkvLyBPY3RhbERpZ2l0CisJCQkvLyBPY3RhbERpZ2l0IE9jdGFsRGlnaXQKKwkJCS8vIFplcm9Ub1RocmVlIE9jdGFsRGlnaXQgT2N0YWxEaWdpdAorCisJCQlpbnQgbnVtYmVyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCWlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPD0gNykgeworCQkJCWJvb2xlYW4gemVyb1RvVGhyZWVOb3QgPSBudW1iZXIgPiAzOworCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkpIHsKKwkJCQkJaW50IGRpZ2l0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShjdXJyZW50Q2hhcmFjdGVyKTsKKwkJCQkJaWYgKGRpZ2l0ID49IDAgJiYgZGlnaXQgPD0gNykgeworCQkJCQkJbnVtYmVyID0gKG51bWJlciAqIDgpICsgZGlnaXQ7CisJCQkJCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pKSB7CisJCQkJCQkJaWYgKHplcm9Ub1RocmVlTm90KSB7Ly8gaGFzIHJlYWQgXE5vdFplcm9Ub1RocmVlIE9jdGFsRGlnaXQgRGlnaXQgLS0+IGlnbm9yZSBsYXN0IGNoYXJhY3RlcgorCQkJCQkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkaWdpdCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUoY3VycmVudENoYXJhY3Rlcik7CisJCQkJCQkJCWlmIChkaWdpdCA+PSAwICYmIGRpZ2l0IDw9IDcpeyAvLyBoYXMgcmVhZCBcWmVyb1RvVGhyZWUgT2N0YWxEaWdpdCBPY3RhbERpZ2l0CisJCQkJCQkJCQludW1iZXIgPSAobnVtYmVyICogOCkgKyBkaWdpdDsKKwkJCQkJCQkJfSBlbHNlIHsvLyBoYXMgcmVhZCBcWmVyb1RvVGhyZWUgT2N0YWxEaWdpdCBOb25PY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKKwkJCQkJCQkJCWN1cnJlbnRQb3NpdGlvbi0tOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsgLy8gaGFzIHJlYWQgXE9jdGFsRGlnaXQgTm9uRGlnaXQtLT4gaWdub3JlIGxhc3QgY2hhcmFjdGVyCisJCQkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IE5vbk9jdGFsRGlnaXQtLT4gaWdub3JlIGxhc3QgY2hhcmFjdGVyCQkJCQkJCisJCQkJCQljdXJyZW50UG9zaXRpb24tLTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7IC8vIGhhcyByZWFkIFxPY3RhbERpZ2l0IC0tPiBpZ25vcmUgbGFzdCBjaGFyYWN0ZXIKKwkJCQkJY3VycmVudFBvc2l0aW9uLS07CisJCQkJfQorCQkJCWlmIChudW1iZXIgPiAyNTUpCisJCQkJCXRocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oSU5WQUxJRF9FU0NBUEUpOworCQkJCWN1cnJlbnRDaGFyYWN0ZXIgPSAoY2hhcikgbnVtYmVyOworCQkJfSBlbHNlCisJCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0VTQ0FQRSk7CisJfQorfQorcHVibGljIGludCBzY2FuSWRlbnRpZmllck9yS2V5d29yZCgpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24geworCS8vdGVzdCBrZXl3b3JkcworCisJLy9maXJzdCBkaXNwYXRjaCBvbiB0aGUgZmlyc3QgY2hhci4KKwkvL3RoZW4gdGhlIGxlbmd0aC4gSWYgdGhlcmUgYXJlIHNldmVyYWwKKwkvL2tleXdvcnMgd2l0aCB0aGUgc2FtZSBsZW5ndGggQU5EIHRoZSBzYW1lIGZpcnN0IGNoYXIsIHRoZW4gZG8gYW5vdGhlcgorCS8vZGlzcGF0Y2ggb24gdGhlIHNlY29uZCBjaGFyIAorCXVzZUFzc2VydEFzQW5JbmRlbnRpZmllciA9IGZhbHNlOworCXdoaWxlIChnZXROZXh0Q2hhckFzSmF2YUlkZW50aWZpZXJQYXJ0KCkpIHt9OworCisJaW50IGluZGV4LCBsZW5ndGg7CisJY2hhcltdIGRhdGE7CisJY2hhciBmaXJzdExldHRlcjsKKwlpZiAod2l0aG91dFVuaWNvZGVQdHIgPT0gMCkKKworCQkvL3F1aWNrIHRlc3Qgb24gbGVuZ3RoID09IDEgYnV0IG5vdCBvbiBsZW5ndGggPiAxMiB3aGlsZSBtb3N0IGlkZW50aWZpZXIKKwkJLy9oYXZlIGEgbGVuZ3RoIHdoaWNoIGlzIDw9IDEyLi4uYnV0IHRoZXJlIGFyZSBsb3RzIG9mIGlkZW50aWZpZXIgd2l0aAorCQkvL29ubHkgb25lIGNoYXIuLi4uCisKKwkJeworCQlpZiAoKGxlbmd0aCA9IGN1cnJlbnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pID09IDEpCisJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJZGF0YSA9IHNvdXJjZTsKKwkJaW5kZXggPSBzdGFydFBvc2l0aW9uOworCX0gZWxzZSB7CisJCWlmICgobGVuZ3RoID0gd2l0aG91dFVuaWNvZGVQdHIpID09IDEpCisJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJZGF0YSA9IHdpdGhvdXRVbmljb2RlQnVmZmVyOworCQlpbmRleCA9IDE7CisJfQorCisJZmlyc3RMZXR0ZXIgPSBkYXRhW2luZGV4XTsKKwlzd2l0Y2ggKGZpcnN0TGV0dGVyKSB7CisKKwkJY2FzZSAnYScgOiAKKwkJCXN3aXRjaChsZW5ndGgpIHsKKwkJCQljYXNlIDg6IC8vYWJzdHJhY3QKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lYWJzdHJhY3Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQkJfQorCQkJCWNhc2UgNjogLy8gYXNzZXJ0CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKSB7CisJCQkJCQkJaWYgKGFzc2VydE1vZGUpIHsKKwkJCQkJCQkJY29udGFpbnNBc3NlcnRLZXl3b3JkID0gdHJ1ZTsKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWFzc2VydDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQl1c2VBc3NlcnRBc0FuSW5kZW50aWZpZXIgPSB0cnVlOworCQkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsJCQkJCQkJCQorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCQl9CisJCQkJZGVmYXVsdDogCisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCQljYXNlICdiJyA6IC8vYm9vbGVhbiBicmVhayBieXRlCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgNCA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneScpICYmIChkYXRhWysraW5kZXhdID09ICd0JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVieXRlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2snKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVicmVhazsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA3IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICduJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lYm9vbGVhbjsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2MnIDogLy9jYXNlIGNoYXIgY2F0Y2ggY29uc3QgY2xhc3MgY29udGludWUKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdzJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lY2FzZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAnaCcpICYmIChkYXRhWysraW5kZXhdID09ICdhJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lY2hhcjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3QnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpICYmIChkYXRhWysraW5kZXhdID09ICdoJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWNhdGNoOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdsJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWNsYXNzOworCQkJCQkJZWxzZQorCQkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ28nKQorCQkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkKKwkJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUVSUk9SOyAvL2NvbnN0IGlzIG5vdCB1c2VkIGluIGphdmEgPz8/Pz8/PworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDggOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVjb250aW51ZTsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2QnIDogLy9kZWZhdWx0IGRvIGRvdWJsZQorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDIgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVkbzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd1JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZG91YmxlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDcgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVkZWZhdWx0OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQl9CisJCWNhc2UgJ2UnIDogLy9lbHNlIGV4dGVuZHMKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdsJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWVsc2U7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWV4dGVuZHM7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICdmJyA6IC8vZmluYWwgZmluYWxseSBmbG9hdCBmb3IgZmFsc2UKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSAzIDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVmb3I7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNSA6CisJCQkJCWlmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lZmluYWw7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAnbCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVmbG9hdDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdhJykKKwkJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKQorCQkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncycpCisJCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVmYWxzZTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAneScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWZpbmFsbHk7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCQljYXNlICdnJyA6IC8vZ290bworCQkJaWYgKGxlbmd0aCA9PSA0KSB7CisJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbycpKSB7CisJCQkJCXJldHVybiBUb2tlbk5hbWVFUlJPUjsKKwkJCQl9CisJCQl9IC8vbm8gZ290byBpbiBqYXZhIGFyZSBhbGxvd2VkLCBzbyB3aHkgamF2YSByZW1vdmVzIHRoaXMga2V5d29yZCA/Pz8KKwkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCWNhc2UgJ2knIDogLy9pZiBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIGludCBpbnRlcmZhY2UKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSAyIDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWlmOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDMgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ24nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZWludDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdtJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdwJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1laW1wb3J0OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDkgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVpbnRlcmZhY2U7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgMTAgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnbScpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3AnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ20nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZWltcGxlbWVudHM7CisJCQkJCQllbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCWVsc2UKKwkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ24nKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICduJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZicpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVpbnN0YW5jZW9mOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWNhc2UgJ2wnIDogLy9sb25nCisJCQlpZiAobGVuZ3RoID09IDQpIHsKKwkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdnJykpIHsKKwkJCQkJcmV0dXJuIFRva2VuTmFtZWxvbmc7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisKKwkJY2FzZSAnbicgOiAvL25hdGl2ZSBuZXcgbnVsbAorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDMgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2UnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAndycpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZW5ldzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA0IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICd1JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2wnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZW51bGw7CisJCQkJCWVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWNhc2UgNiA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnYScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKSB7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lbmF0aXZlOworCQkJCQl9IGVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICdwJyA6IC8vcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMKKwkJCXN3aXRjaCAobGVuZ3RoKSB7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICd1JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdiJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVwdWJsaWM7CisJCQkJCX0gZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA3IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaycpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdnJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVwYWNrYWdlOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICdyJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3YnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkgeworCQkJCQkJCXJldHVybiBUb2tlbk5hbWVwcml2YXRlOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA5IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdkJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVwcm90ZWN0ZWQ7CisJCQkJCX0gZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQl9CisKKwkJY2FzZSAncicgOiAvL3JldHVybgorCQkJaWYgKGxlbmd0aCA9PSA2KSB7CisJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdlJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndScpCisJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKSkgeworCQkJCQlyZXR1cm4gVG9rZW5OYW1lcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCWNhc2UgJ3MnIDogLy9zaG9ydCBzdGF0aWMgc3VwZXIgc3dpdGNoIHN5bmNocm9uaXplZCBzdHJpY3RmcAorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd0JykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXNob3J0OworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCQllbHNlCisJCQkJCQlpZiAoKGRhdGFbaW5kZXhdID09ICd1JykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXN1cGVyOworCQkJCQkJZWxzZQorCQkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdjJykpIHsKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lc3RhdGljOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJCWVsc2UKKwkJCQkJCWlmICgoZGF0YVtpbmRleF0gPT0gJ3cnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAndCcpCisJCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdoJykpCisJCQkJCQkJcmV0dXJuIFRva2VuTmFtZXN3aXRjaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDggOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2YnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3AnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVzdHJpY3RmcDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSAxMiA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAneScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnYycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAncicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbycpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAneicpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZCcpKSB7CisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lc3luY2hyb25pemVkOworCQkJCQl9IGVsc2UKKwkJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd0JyA6IC8vdHJ5IHRocm93IHRocm93cyB0cmFuc2llbnQgdGhpcyB0cnVlCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgMyA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd5JykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldHJ5OworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDQgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2gnKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpICYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldGhpczsKKwkJCQkJZWxzZQorCQkJCQkJaWYgKChkYXRhW2luZGV4XSA9PSAncicpICYmIChkYXRhWysraW5kZXhdID09ICd1JykgJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKSkKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldHJ1ZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDUgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ2gnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ28nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3cnKSkKKwkJCQkJCXJldHVybiBUb2tlbk5hbWV0aHJvdzsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA2IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdoJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdyJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd3JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdzJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldGhyb3dzOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQljYXNlIDkgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ3InKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2EnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3MnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2knKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ2UnKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ24nKQorCQkJCQkJJiYgKGRhdGFbKytpbmRleF0gPT0gJ3QnKSkgeworCQkJCQkJcmV0dXJuIFRva2VuTmFtZXRyYW5zaWVudDsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd2JyA6IC8vdm9pZCB2b2xhdGlsZQorCQkJc3dpdGNoIChsZW5ndGgpIHsKKwkJCQljYXNlIDQgOgorCQkJCQlpZiAoKGRhdGFbKytpbmRleF0gPT0gJ28nKSAmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpICYmIChkYXRhWysraW5kZXhdID09ICdkJykpCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1ldm9pZDsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJY2FzZSA4IDoKKwkJCQkJaWYgKChkYXRhWysraW5kZXhdID09ICdvJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdhJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICd0JykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdpJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdsJykKKwkJCQkJCSYmIChkYXRhWysraW5kZXhdID09ICdlJykpIHsKKwkJCQkJCXJldHVybiBUb2tlbk5hbWV2b2xhdGlsZTsKKwkJCQkJfSBlbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCX0KKworCQljYXNlICd3JyA6IC8vd2hpbGUgd2lkZWZwCisJCQlzd2l0Y2ggKGxlbmd0aCkgeworCQkJCWNhc2UgNSA6CisJCQkJCWlmICgoZGF0YVsrK2luZGV4XSA9PSAnaCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnaScpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnbCcpCisJCQkJCQkmJiAoZGF0YVsrK2luZGV4XSA9PSAnZScpKQorCQkJCQkJcmV0dXJuIFRva2VuTmFtZXdoaWxlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gVG9rZW5OYW1lSWRlbnRpZmllcjsKKwkJCQkJLy9jYXNlIDY6aWYgKCAoZGF0YVsrK2luZGV4XSA9PSdpJykgJiYgKGRhdGFbKytpbmRleF09PSdkJykgJiYgKGRhdGFbKytpbmRleF09PSdlJykgJiYgKGRhdGFbKytpbmRleF09PSdmJykmJiAoZGF0YVsrK2luZGV4XT09J3AnKSkKKwkJCQkJLy9yZXR1cm4gVG9rZW5OYW1ld2lkZWZwIDsKKwkJCQkJLy9lbHNlCisJCQkJCS8vcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBUb2tlbk5hbWVJZGVudGlmaWVyOworCQkJfQorCisJCWRlZmF1bHQgOgorCQkJcmV0dXJuIFRva2VuTmFtZUlkZW50aWZpZXI7CisJfQorfQorcHVibGljIGludCBzY2FuTnVtYmVyKGJvb2xlYW4gZG90UHJlZml4KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKKworCS8vd2hlbiBlbnRlcmluZyB0aGlzIG1ldGhvZCB0aGUgY3VycmVudENoYXJhY3RlciBpcyB0aGUgZmlydAorCS8vZGlnaXQgb2YgdGhlIG51bWJlciAsIGkuZS4gaXQgbWF5IGJlIHByZWNlZWRlZCBieSBhIC4gd2hlbgorCS8vZG90UHJlZml4IGlzIHRydWUKKworCWJvb2xlYW4gZmxvYXRpbmcgPSBkb3RQcmVmaXg7CisJaWYgKCghZG90UHJlZml4KSAmJiAoY3VycmVudENoYXJhY3RlciA9PSAnMCcpKSB7CisJCWlmIChnZXROZXh0Q2hhcigneCcsICdYJykgPj0gMCkgeyAvLy0tLS0tLS0tLS1oZXhhLS0tLS0tLS0tLS0tLS0tLS0KKwkJCS8vZm9yY2UgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGhleGEgbnVtYmVyIGRvIGV4aXN0Li4uCisJCQkvLyBjb25zdW1lIG5leHQgY2hhcmFjdGVyCisJCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJCWlmICgoKGN1cnJlbnRDaGFyYWN0ZXIgPSBzb3VyY2VbY3VycmVudFBvc2l0aW9uKytdKSA9PSAnXFwnKQorCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCQl9IGVsc2UgeworCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCQl9CisJCQl9CisJCQlpZiAoQ2hhcmFjdGVyLmRpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIsIDE2KSA9PSAtMSkKKwkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfSEVYQSk7CisJCQkvLy0tLWVuZCBmb3JjaW5nLS0KKwkJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoMTYpKSB7fTsKKwkJCWlmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkKKwkJCQlyZXR1cm4gVG9rZW5OYW1lTG9uZ0xpdGVyYWw7CisJCQllbHNlCisJCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOworCQl9CisKKwkJLy90aGVyZSBpcyB4IG9yIFggaW4gdGhlIG51bWJlcgorCQkvL3BvdGVudGlhbCBvY3RhbCAhIC4uLiBzb21lIG9uZSBtYXkgd3JpdGUgMDAwMDk5LjAgISB0aHVzIDAwMTAwIDwgMDAwNzguMCBpcyB0cnVlICEhISEhIGNyYXp5IGxhbmd1YWdlCisJCWlmIChnZXROZXh0Q2hhckFzRGlnaXQoKSkgeyAvLy0tLS0tLS0tLS0tLS1wb3RlbnRpYWwgb2N0YWwtLS0tLS0tLS0tLS0tLS0tLQorCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKKworCQkJaWYgKGdldE5leHRDaGFyKCdsJywgJ0wnKSA+PSAwKSB7CisJCQkJcmV0dXJuIFRva2VuTmFtZUxvbmdMaXRlcmFsOworCQkJfQorCisJCQlpZiAoZ2V0TmV4dENoYXIoJ2YnLCAnRicpID49IDApIHsKKwkJCQlyZXR1cm4gVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWw7CisJCQl9CisKKwkJCWlmIChnZXROZXh0Q2hhcignZCcsICdEJykgPj0gMCkgeworCQkJCXJldHVybiBUb2tlbk5hbWVEb3VibGVMaXRlcmFsOworCQkJfSBlbHNlIHsgLy9tYWtlIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG9jdGFsIGFuZCBmbG9hdCAuLi4uCisJCQkJYm9vbGVhbiBpc0ludGVnZXIgPSB0cnVlOworCQkJCWlmIChnZXROZXh0Q2hhcignLicpKSB7IAorCQkJCQlpc0ludGVnZXIgPSBmYWxzZTsKKwkJCQkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKKwkJCQl9CisJCQkJaWYgKGdldE5leHRDaGFyKCdlJywgJ0UnKSA+PSAwKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCQkJaXNJbnRlZ2VyID0gZmFsc2U7CisJCQkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCSYmIChzb3VyY2VbY3VycmVudFBvc2l0aW9uXSA9PSAndScpKSB7CisJCQkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICh3aXRob3V0VW5pY29kZVB0ciAhPSAwKSB7CisJCQkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKChjdXJyZW50Q2hhcmFjdGVyID09ICctJykKKwkJCQkJCXx8IChjdXJyZW50Q2hhcmFjdGVyID09ICcrJykpIHsgLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQkJCQkJdW5pY29kZUFzQmFja1NsYXNoID0gZmFsc2U7CisJCQkJCQlpZiAoKChjdXJyZW50Q2hhcmFjdGVyID0gc291cmNlW2N1cnJlbnRQb3NpdGlvbisrXSkgPT0gJ1xcJykKKwkJCQkJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJCQkJCWdldE5leHRVbmljb2RlQ2hhcigpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCQkJCQl3aXRob3V0VW5pY29kZUJ1ZmZlclsrK3dpdGhvdXRVbmljb2RlUHRyXSA9IGN1cnJlbnRDaGFyYWN0ZXI7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY3VycmVudENoYXJhY3RlcikpCisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKElOVkFMSURfRkxPQVQpOworCQkJCQl3aGlsZSAoZ2V0TmV4dENoYXJBc0RpZ2l0KCkpIHt9OworCQkJCX0KKwkJCQlpZiAoZ2V0TmV4dENoYXIoJ2YnLCAnRicpID49IDApCisJCQkJCXJldHVybiBUb2tlbk5hbWVGbG9hdGluZ1BvaW50TGl0ZXJhbDsKKwkJCQlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDAgfHwgIWlzSW50ZWdlcikKKwkJCQkJcmV0dXJuIFRva2VuTmFtZURvdWJsZUxpdGVyYWw7CisJCQkJcmV0dXJuIFRva2VuTmFtZUludGVnZXJMaXRlcmFsOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogY2Fycnkgb24gKi8KKwkJfQorCX0KKworCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307CisKKwlpZiAoKCFkb3RQcmVmaXgpICYmIChnZXROZXh0Q2hhcignbCcsICdMJykgPj0gMCkpCisJCXJldHVybiBUb2tlbk5hbWVMb25nTGl0ZXJhbDsKKworCWlmICgoIWRvdFByZWZpeCkgJiYgKGdldE5leHRDaGFyKCcuJykpKSB7IC8vZGVjaW1hbCBwYXJ0IHRoYXQgY2FuIGJlIGVtcHR5CisJCXdoaWxlIChnZXROZXh0Q2hhckFzRGlnaXQoKSkge307CisJCWZsb2F0aW5nID0gdHJ1ZTsKKwl9CisKKwkvL2lmIGZsb2F0aW5nIGlzIHRydWUgYm90aCBleHBvbmFudCBhbmQgc3VmZml4IG1heSBiZSBvcHRpb25hbAorCisJaWYgKGdldE5leHRDaGFyKCdlJywgJ0UnKSA+PSAwKSB7CisJCWZsb2F0aW5nID0gdHJ1ZTsKKwkJLy8gY29uc3VtZSBuZXh0IGNoYXJhY3RlcgorCQl1bmljb2RlQXNCYWNrU2xhc2ggPSBmYWxzZTsKKwkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkmJiAoc291cmNlW2N1cnJlbnRQb3NpdGlvbl0gPT0gJ3UnKSkgeworCQkJZ2V0TmV4dFVuaWNvZGVDaGFyKCk7CisJCX0gZWxzZSB7CisJCQlpZiAod2l0aG91dFVuaWNvZGVQdHIgIT0gMCkgeworCQkJCXdpdGhvdXRVbmljb2RlQnVmZmVyWysrd2l0aG91dFVuaWNvZGVQdHJdID0gY3VycmVudENoYXJhY3RlcjsKKwkJCX0KKwkJfQorCisJCWlmICgoY3VycmVudENoYXJhY3RlciA9PSAnLScpCisJCQl8fCAoY3VycmVudENoYXJhY3RlciA9PSAnKycpKSB7IC8vIGNvbnN1bWUgbmV4dCBjaGFyYWN0ZXIKKwkJCXVuaWNvZGVBc0JhY2tTbGFzaCA9IGZhbHNlOworCQkJaWYgKCgoY3VycmVudENoYXJhY3RlciA9IHNvdXJjZVtjdXJyZW50UG9zaXRpb24rK10pID09ICdcXCcpCisJCQkJJiYgKHNvdXJjZVtjdXJyZW50UG9zaXRpb25dID09ICd1JykpIHsKKwkJCQlnZXROZXh0VW5pY29kZUNoYXIoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHdpdGhvdXRVbmljb2RlUHRyICE9IDApIHsKKwkJCQkJd2l0aG91dFVuaWNvZGVCdWZmZXJbKyt3aXRob3V0VW5pY29kZVB0cl0gPSBjdXJyZW50Q2hhcmFjdGVyOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGN1cnJlbnRDaGFyYWN0ZXIpKQorCQkJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbihJTlZBTElEX0ZMT0FUKTsKKwkJd2hpbGUgKGdldE5leHRDaGFyQXNEaWdpdCgpKSB7fTsKKwl9CisKKwlpZiAoZ2V0TmV4dENoYXIoJ2QnLCAnRCcpID49IDApCisJCXJldHVybiBUb2tlbk5hbWVEb3VibGVMaXRlcmFsOworCWlmIChnZXROZXh0Q2hhcignZicsICdGJykgPj0gMCkKKwkJcmV0dXJuIFRva2VuTmFtZUZsb2F0aW5nUG9pbnRMaXRlcmFsOworCisJLy90aGUgbG9uZyBmbGFnIGhhcyBiZWVuIHRlc3RlZCBiZWZvcmUKKworCXJldHVybiBmbG9hdGluZyA/IFRva2VuTmFtZURvdWJsZUxpdGVyYWwgOiBUb2tlbk5hbWVJbnRlZ2VyTGl0ZXJhbDsKK30KKy8qKgorICogU2VhcmNoIHRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBpbnQgZ2V0TGluZU51bWJlcihpbnQgcG9zaXRpb24pIHsKKworCWlmIChsaW5lRW5kcyA9PSBudWxsKQorCQlyZXR1cm4gMTsKKwlpbnQgbGVuZ3RoID0gbGluZVB0cisxOworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIDE7CisJaW50IGcgPSAwLCBkID0gbGVuZ3RoIC0gMTsKKwlpbnQgbSA9IDA7CisJd2hpbGUgKGcgPD0gZCkgeworCQltID0gKGcgKyBkKSAvMjsKKwkJaWYgKHBvc2l0aW9uIDwgbGluZUVuZHNbbV0pIHsKKwkJCWQgPSBtLTE7CisJCX0gZWxzZSBpZiAocG9zaXRpb24gPiBsaW5lRW5kc1ttXSkgeworCQkJZyA9IG0rMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBtICsgMTsKKwkJfQorCX0KKwlpZiAocG9zaXRpb24gPCBsaW5lRW5kc1ttXSkgeworCQlyZXR1cm4gbSsxOworCX0KKwlyZXR1cm4gbSsyOworfQorcHVibGljIGZpbmFsIHZvaWQgc2V0U291cmNlKGNoYXJbXSBzb3VyY2UpeworCS8vdGhlIHNvdXJjZS1idWZmZXIgaXMgc2V0IHRvIHNvdXJjZVN0cmluZworCisJaWYgKHNvdXJjZSA9PSBudWxsKSB7CisJCXRoaXMuc291cmNlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCX0gZWxzZSB7CisJCXRoaXMuc291cmNlID0gc291cmNlOworCX0KKwlzdGFydFBvc2l0aW9uID0gLTE7CisJZW9mUG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoOworCWluaXRpYWxQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbiA9IDA7CisJY29udGFpbnNBc3NlcnRLZXl3b3JkID0gZmFsc2U7CisJd2l0aG91dFVuaWNvZGVCdWZmZXIgPSBuZXcgY2hhclt0aGlzLnNvdXJjZS5sZW5ndGhdOworCit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJaWYgKHN0YXJ0UG9zaXRpb24gPT0gc291cmNlLmxlbmd0aCkKKwkJcmV0dXJuICJFT0ZcblxuIiArIG5ldyBTdHJpbmcoc291cmNlKTsgLy8kTk9OLU5MUy0xJAorCWlmIChjdXJyZW50UG9zaXRpb24gPiBzb3VyY2UubGVuZ3RoKQorCQlyZXR1cm4gImJlaGluZCB0aGUgRU9GIDotKCAuLi4uXG5cbiIgKyBuZXcgU3RyaW5nKHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKKworCWNoYXIgZnJvbnRbXSA9IG5ldyBjaGFyW3N0YXJ0UG9zaXRpb25dOworCVN5c3RlbS5hcnJheWNvcHkoc291cmNlLCAwLCBmcm9udCwgMCwgc3RhcnRQb3NpdGlvbik7CisKKwlpbnQgbWlkZGxlTGVuZ3RoID0gKGN1cnJlbnRQb3NpdGlvbiAtIDEpIC0gc3RhcnRQb3NpdGlvbiArIDE7CisJY2hhciBtaWRkbGVbXTsKKwlpZiAobWlkZGxlTGVuZ3RoID4gLTEpIHsKKwkJbWlkZGxlID0gbmV3IGNoYXJbbWlkZGxlTGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weSgKKwkJCXNvdXJjZSwgCisJCQlzdGFydFBvc2l0aW9uLCAKKwkJCW1pZGRsZSwgCisJCQkwLCAKKwkJCW1pZGRsZUxlbmd0aCk7CisJfSBlbHNlIHsKKwkJbWlkZGxlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOworCX0KKwkKKwljaGFyIGVuZFtdID0gbmV3IGNoYXJbc291cmNlLmxlbmd0aCAtIChjdXJyZW50UG9zaXRpb24gLSAxKV07CisJU3lzdGVtLmFycmF5Y29weSgKKwkJc291cmNlLCAKKwkJKGN1cnJlbnRQb3NpdGlvbiAtIDEpICsgMSwgCisJCWVuZCwgCisJCTAsIAorCQlzb3VyY2UubGVuZ3RoIC0gKGN1cnJlbnRQb3NpdGlvbiAtIDEpIC0gMSk7CisJCisJcmV0dXJuIG5ldyBTdHJpbmcoZnJvbnQpCisJCSsgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuU3RhcnRzIGhlcmUgLS0+IiAvLyROT04tTkxTLTEkCisJCSsgbmV3IFN0cmluZyhtaWRkbGUpCisJCSsgIjwtLSBFbmRzIGhlcmVcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIgLy8kTk9OLU5MUy0xJAorCQkrIG5ldyBTdHJpbmcoZW5kKTsgCit9CitwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nQWN0aW9uKGludCBhY3QpIHsKKwlzd2l0Y2ggKGFjdCkgeworCQljYXNlIFRva2VuTmFtZUlkZW50aWZpZXIgOgorCQkJcmV0dXJuICJJZGVudGlmaWVyKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNhc2UgVG9rZW5OYW1lYWJzdHJhY3QgOgorCQkJcmV0dXJuICJhYnN0cmFjdCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVib29sZWFuIDoKKwkJCXJldHVybiAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVicmVhayA6CisJCQlyZXR1cm4gImJyZWFrIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWJ5dGUgOgorCQkJcmV0dXJuICJieXRlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWNhc2UgOgorCQkJcmV0dXJuICJjYXNlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWNhdGNoIDoKKwkJCXJldHVybiAiY2F0Y2giOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lY2hhciA6CisJCQlyZXR1cm4gImNoYXIiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lY2xhc3MgOgorCQkJcmV0dXJuICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVjb250aW51ZSA6CisJCQlyZXR1cm4gImNvbnRpbnVlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWRlZmF1bHQgOgorCQkJcmV0dXJuICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWRvIDoKKwkJCXJldHVybiAiZG8iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lZG91YmxlIDoKKwkJCXJldHVybiAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWVsc2UgOgorCQkJcmV0dXJuICJlbHNlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWV4dGVuZHMgOgorCQkJcmV0dXJuICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWZhbHNlIDoKKwkJCXJldHVybiAiZmFsc2UiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lZmluYWwgOgorCQkJcmV0dXJuICJmaW5hbCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVmaW5hbGx5IDoKKwkJCXJldHVybiAiZmluYWxseSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVmbG9hdCA6CisJCQlyZXR1cm4gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWZvciA6CisJCQlyZXR1cm4gImZvciI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVpZiA6CisJCQlyZXR1cm4gImlmIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWltcGxlbWVudHMgOgorCQkJcmV0dXJuICJpbXBsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWltcG9ydCA6CisJCQlyZXR1cm4gImltcG9ydCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVpbnN0YW5jZW9mIDoKKwkJCXJldHVybiAiaW5zdGFuY2VvZiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVpbnQgOgorCQkJcmV0dXJuICJpbnQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1laW50ZXJmYWNlIDoKKwkJCXJldHVybiAiaW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZWxvbmcgOgorCQkJcmV0dXJuICJsb25nIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZW5hdGl2ZSA6CisJCQlyZXR1cm4gIm5hdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVuZXcgOgorCQkJcmV0dXJuICJuZXciOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lbnVsbCA6CisJCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lcGFja2FnZSA6CisJCQlyZXR1cm4gInBhY2thZ2UiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lcHJpdmF0ZSA6CisJCQlyZXR1cm4gInByaXZhdGUiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lcHJvdGVjdGVkIDoKKwkJCXJldHVybiAicHJvdGVjdGVkIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXB1YmxpYyA6CisJCQlyZXR1cm4gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVyZXR1cm4gOgorCQkJcmV0dXJuICJyZXR1cm4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lc2hvcnQgOgorCQkJcmV0dXJuICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVzdGF0aWMgOgorCQkJcmV0dXJuICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lc3VwZXIgOgorCQkJcmV0dXJuICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVzd2l0Y2ggOgorCQkJcmV0dXJuICJzd2l0Y2giOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lc3luY2hyb25pemVkIDoKKwkJCXJldHVybiAic3luY2hyb25pemVkIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXRoaXMgOgorCQkJcmV0dXJuICJ0aGlzIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXRocm93IDoKKwkJCXJldHVybiAidGhyb3ciOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ldGhyb3dzIDoKKwkJCXJldHVybiAidGhyb3dzIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZXRyYW5zaWVudCA6CisJCQlyZXR1cm4gInRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV0cnVlIDoKKwkJCXJldHVybiAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV0cnkgOgorCQkJcmV0dXJuICJ0cnkiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ldm9pZCA6CisJCQlyZXR1cm4gInZvaWQiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1ldm9sYXRpbGUgOgorCQkJcmV0dXJuICJ2b2xhdGlsZSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWV3aGlsZSA6CisJCQlyZXR1cm4gIndoaWxlIjsgLy8kTk9OLU5MUy0xJAorCisJCWNhc2UgVG9rZW5OYW1lSW50ZWdlckxpdGVyYWwgOgorCQkJcmV0dXJuICJJbnRlZ2VyKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNhc2UgVG9rZW5OYW1lTG9uZ0xpdGVyYWwgOgorCQkJcmV0dXJuICJMb25nKCIgKyBuZXcgU3RyaW5nKGdldEN1cnJlbnRUb2tlblNvdXJjZSgpKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNhc2UgVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWwgOgorCQkJcmV0dXJuICJGbG9hdCgiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljYXNlIFRva2VuTmFtZURvdWJsZUxpdGVyYWwgOgorCQkJcmV0dXJuICJEb3VibGUoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJY2FzZSBUb2tlbk5hbWVDaGFyYWN0ZXJMaXRlcmFsIDoKKwkJCXJldHVybiAiQ2hhcigiICsgbmV3IFN0cmluZyhnZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljYXNlIFRva2VuTmFtZVN0cmluZ0xpdGVyYWwgOgorCQkJcmV0dXJuICJTdHJpbmcoIiArIG5ldyBTdHJpbmcoZ2V0Q3VycmVudFRva2VuU291cmNlKCkpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCQljYXNlIFRva2VuTmFtZVBMVVNfUExVUyA6CisJCQlyZXR1cm4gIisrIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU1JTlVTX01JTlVTIDoKKwkJCXJldHVybiAiLS0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lRVFVQUxfRVFVQUwgOgorCQkJcmV0dXJuICI9PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVMRVNTX0VRVUFMIDoKKwkJCXJldHVybiAiPD0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUl9FUVVBTCA6CisJCQlyZXR1cm4gIj49IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU5PVF9FUVVBTCA6CisJCQlyZXR1cm4gIiE9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUxFRlRfU0hJRlQgOgorCQkJcmV0dXJuICI8PCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVSSUdIVF9TSElGVCA6CisJCQlyZXR1cm4gIj4+IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUIDoKKwkJCXJldHVybiAiPj4+IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVBMVVNfRVFVQUwgOgorCQkJcmV0dXJuICIrPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVNSU5VU19FUVVBTCA6CisJCQlyZXR1cm4gIi09IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZU1VTFRJUExZX0VRVUFMIDoKKwkJCXJldHVybiAiKj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lRElWSURFX0VRVUFMIDoKKwkJCXJldHVybiAiLz0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lQU5EX0VRVUFMIDoKKwkJCXJldHVybiAiJj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lT1JfRVFVQUwgOgorCQkJcmV0dXJuICJ8PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVYT1JfRVFVQUwgOgorCQkJcmV0dXJuICJePSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVJfRVFVQUwgOgorCQkJcmV0dXJuICIlPSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVMRUZUX1NISUZUX0VRVUFMIDoKKwkJCXJldHVybiAiPDw9IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVJJR0hUX1NISUZUX0VRVUFMIDoKKwkJCXJldHVybiAiPj49IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVVOU0lHTkVEX1JJR0hUX1NISUZUX0VRVUFMIDoKKwkJCXJldHVybiAiPj4+PSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVPUl9PUiA6CisJCQlyZXR1cm4gInx8IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUFORF9BTkQgOgorCQkJcmV0dXJuICImJiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVQTFVTIDoKKwkJCXJldHVybiAiKyI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVNSU5VUyA6CisJCQlyZXR1cm4gIi0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTk9UIDoKKwkJCXJldHVybiAiISI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVSRU1BSU5ERVIgOgorCQkJcmV0dXJuICIlIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVhPUiA6CisJCQlyZXR1cm4gIl4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lQU5EIDoKKwkJCXJldHVybiAiJiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVNVUxUSVBMWSA6CisJCQlyZXR1cm4gIioiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lT1IgOgorCQkJcmV0dXJuICJ8IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVRXSURETEUgOgorCQkJcmV0dXJuICJ+IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZURJVklERSA6CisJCQlyZXR1cm4gIi8iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lR1JFQVRFUiA6CisJCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTEVTUyA6CisJCQlyZXR1cm4gIjwiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lTFBBUkVOIDoKKwkJCXJldHVybiAiKCI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVSUEFSRU4gOgorCQkJcmV0dXJuICIpIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUxCUkFDRSA6CisJCQlyZXR1cm4gInsiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUkJSQUNFIDoKKwkJCXJldHVybiAifSI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVMQlJBQ0tFVCA6CisJCQlyZXR1cm4gIlsiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUkJSQUNLRVQgOgorCQkJcmV0dXJuICJdIjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZVNFTUlDT0xPTiA6CisJCQlyZXR1cm4gIjsiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lUVVFU1RJT04gOgorCQkJcmV0dXJuICI/IjsgLy8kTk9OLU5MUy0xJAorCQljYXNlIFRva2VuTmFtZUNPTE9OIDoKKwkJCXJldHVybiAiOiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVDT01NQSA6CisJCQlyZXR1cm4gIiwiOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lRE9UIDoKKwkJCXJldHVybiAiLiI7IC8vJE5PTi1OTFMtMSQKKwkJY2FzZSBUb2tlbk5hbWVFUVVBTCA6CisJCQlyZXR1cm4gIj0iOyAvLyROT04tTkxTLTEkCisJCWNhc2UgVG9rZW5OYW1lRU9GIDoKKwkJCXJldHVybiAiRU9GIjsgLy8kTk9OLU5MUy0xJAorCQlkZWZhdWx0IDoKKwkJCXJldHVybiAibm90LWEtdG9rZW4iOyAvLyROT04tTkxTLTEkCisJfQorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZWZlcmVuY2VJbmZvQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9SZWZlcmVuY2VJbmZvQWRhcHRlci5qYXZhCmluZGV4IDI4YzgwNzUuLjg4OGQyMzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvUmVmZXJlbmNlSW5mb0FkYXB0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1JlZmVyZW5jZUluZm9BZGFwdGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2J1aWxkZXIvU2ltcGxlTG9va3VwVGFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlTG9va3VwVGFibGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NpbXBsZUxvb2t1cFRhYmxlLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU2ltcGxlTG9va3VwVGFibGUuamF2YQppbmRleCA4OWU2YzIwLi45YWM0NWQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9idWlsZGVyL1NpbXBsZUxvb2t1cFRhYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TaW1wbGVMb29rdXBUYWJsZS5qYXZhCkBAIC0xLDE0ICsxLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXI7CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogLyoqCiAgKiBBIHNpbXBsZSBsb29rdXAgdGFibGUgaXMgYSBub24tc3luY2hyb25pemVkIEhhc2h0YWJsZSwgd2hvc2Uga2V5cwpAQCAtMTgsOCArMTgsOCBAQAogcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUxvb2t1cFRhYmxlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIAogLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwotcHVibGljIE9iamVjdCBrZXlUYWJsZVtdOwotcHVibGljIE9iamVjdCB2YWx1ZVRhYmxlW107CitwdWJsaWMgT2JqZWN0W10ga2V5VGFibGU7CitwdWJsaWMgT2JqZWN0W10gdmFsdWVUYWJsZTsKIHB1YmxpYyBpbnQgZWxlbWVudFNpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUKIHB1YmxpYyBpbnQgdGhyZXNob2xkOwogCkBAIC03Myw2ICs3MywxNCBAQAogCXJldHVybiBudWxsOwogfQogCitwdWJsaWMgT2JqZWN0IGtleUZvclZhbHVlKE9iamVjdCB2YWx1ZVRvTWF0Y2gpIHsKKwlpZiAodmFsdWVUb01hdGNoICE9IG51bGwpCisJCWZvciAoaW50IGkgPSAwLCBsID0gdmFsdWVUYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspCisJCQlpZiAodmFsdWVUb01hdGNoLmVxdWFscyh2YWx1ZVRhYmxlW2ldKSkKKwkJCQlyZXR1cm4ga2V5VGFibGVbaV07CisJcmV0dXJuIG51bGw7Cit9CisKIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewogCWludCBsZW5ndGggPSBrZXlUYWJsZS5sZW5ndGg7CiAJaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSBsZW5ndGg7CkBAIC0xMzcsOSArMTQ1LDkgQEAKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJU3RyaW5nIHMgPSAiIjsgLy8kTk9OLU5MUy0xJAogCU9iamVjdCBvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJZm9yIChpbnQgaSA9IDAsIGwgPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykKIAkJaWYgKChvYmplY3QgPSB2YWx1ZVRhYmxlW2ldKSAhPSBudWxsKQogCQkJcyArPSBrZXlUYWJsZVtpXS50b1N0cmluZygpICsgIiAtPiAiICsgb2JqZWN0LnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Tb3VyY2VGaWxlQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NvdXJjZUZpbGVBdHRyaWJ1dGUuamF2YQppbmRleCAxMjJlZmNjLi5hMmYzYjQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NvdXJjZUZpbGVBdHRyaWJ1dGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1NvdXJjZUZpbGVBdHRyaWJ1dGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLkNsYXNzRm9ybWF0RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdIYXNodGFibGVPZkludC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdIYXNodGFibGVPZkludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmUzNGEzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nSGFzaHRhYmxlT2ZJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwotCi0vKioKLSAqIEEgaGFzaCB0YWJsZSBrZXllZCBieSBzdHJpbmdzIGFuZCB3aXRoIGludCB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdIYXNodGFibGVPZkludCB7Ci0JLy8gdG8gYXZvaWQgdXNpbmcgRW51bWVyYXRpb25zLCB3YWxrIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyBza2lwcGluZyBudWxscwotCXB1YmxpYyBTdHJpbmdbXSBrZXlUYWJsZTsKLQlwdWJsaWMgaW50W10gdmFsdWVUYWJsZTsKLQotCWludCBlbGVtZW50U2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZQotCWludCB0aHJlc2hvbGQ7Ci1wdWJsaWMgU3RyaW5nSGFzaHRhYmxlT2ZJbnQoKSB7Ci0JdGhpcygxMyk7Ci19Ci1wdWJsaWMgU3RyaW5nSGFzaHRhYmxlT2ZJbnQoaW50IHNpemUpIHsKLQl0aGlzLmVsZW1lbnRTaXplID0gMDsKLQl0aGlzLnRocmVzaG9sZCA9IHNpemU7IC8vIHNpemUgcmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi0JaW50IGV4dHJhUm9vbSA9IChpbnQpIChzaXplICogMS43NWYpOwotCWlmICh0aGlzLnRocmVzaG9sZCA9PSBleHRyYVJvb20pCi0JCWV4dHJhUm9vbSsrOwotCXRoaXMua2V5VGFibGUgPSBuZXcgU3RyaW5nW2V4dHJhUm9vbV07Ci0JdGhpcy52YWx1ZVRhYmxlID0gbmV3IGludFtleHRyYVJvb21dOwotfQotcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoU3RyaW5nIGtleSkgewotCWludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgdmFsdWVUYWJsZS5sZW5ndGg7Ci0JU3RyaW5nIGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7Ci0JCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGtleS4KLSAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLgotICovCi1wdWJsaWMgaW50IGdldChTdHJpbmcga2V5KSB7Ci0JaW50IGluZGV4ID0gKGtleS5oYXNoQ29kZSgpICYgMHg3RkZGRkZGRikgJSB2YWx1ZVRhYmxlLmxlbmd0aDsKLQlTdHJpbmcgY3VycmVudEtleTsKLQl3aGlsZSAoKGN1cnJlbnRLZXkgPSBrZXlUYWJsZVtpbmRleF0pICE9IG51bGwpIHsKLQkJaWYgKGN1cnJlbnRLZXkuZXF1YWxzKGtleSkpCi0JCQlyZXR1cm4gdmFsdWVUYWJsZVtpbmRleF07Ci0JCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7Ci0JfQotCXJldHVybiAtMTsKLX0KLXB1YmxpYyBpbnQgcHV0KFN0cmluZyBrZXksIGludCB2YWx1ZSkgewotCWludCBpbmRleCA9IChrZXkuaGFzaENvZGUoKSAmIDB4N0ZGRkZGRkYpICUgdmFsdWVUYWJsZS5sZW5ndGg7Ci0JU3RyaW5nIGN1cnJlbnRLZXk7Ci0Jd2hpbGUgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaW5kZXhdKSAhPSBudWxsKSB7Ci0JCWlmIChjdXJyZW50S2V5LmVxdWFscyhrZXkpKQotCQkJcmV0dXJuIHZhbHVlVGFibGVbaW5kZXhdID0gdmFsdWU7Ci0JCWluZGV4ID0gKGluZGV4ICsgMSkgJSBrZXlUYWJsZS5sZW5ndGg7Ci0JfQotCWtleVRhYmxlW2luZGV4XSA9IGtleTsKLQl2YWx1ZVRhYmxlW2luZGV4XSA9IHZhbHVlOwotCi0JLy8gYXNzdW1lcyB0aGUgdGhyZXNob2xkIGlzIG5ldmVyIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB0YWJsZQotCWlmICgrK2VsZW1lbnRTaXplID4gdGhyZXNob2xkKQotCQlyZWhhc2goKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1wcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCVN0cmluZ0hhc2h0YWJsZU9mSW50IG5ld0hhc2h0YWJsZSA9IG5ldyBTdHJpbmdIYXNodGFibGVPZkludChlbGVtZW50U2l6ZSAqIDIpOyAvLyBkb3VibGUgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cwotCVN0cmluZyBjdXJyZW50S2V5OwotCWZvciAoaW50IGkgPSBrZXlUYWJsZS5sZW5ndGg7IC0taSA+PSAwOykKLQkJaWYgKChjdXJyZW50S2V5ID0ga2V5VGFibGVbaV0pICE9IG51bGwpCi0JCQluZXdIYXNodGFibGUucHV0KGN1cnJlbnRLZXksIHZhbHVlVGFibGVbaV0pOwotCi0JdGhpcy5rZXlUYWJsZSA9IG5ld0hhc2h0YWJsZS5rZXlUYWJsZTsKLQl0aGlzLnZhbHVlVGFibGUgPSBuZXdIYXNodGFibGUudmFsdWVUYWJsZTsKLQl0aGlzLnRocmVzaG9sZCA9IG5ld0hhc2h0YWJsZS50aHJlc2hvbGQ7Ci19Ci1wdWJsaWMgaW50IHNpemUoKSB7Ci0JcmV0dXJuIGVsZW1lbnRTaXplOwotfQotLyoqCi0gKiBSZXR1cm4gdGhlIGtleXMgc29ydGVkIGJ5IHRoZWlyIHZhbHVlcy4KLSAqLwotcHVibGljIFN0cmluZ1tdIHNvcnRlZEtleXMoaW50IG1heFZhbHVlKSB7Ci0JU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0aGlzLmVsZW1lbnRTaXplXTsKLQkKLQkvLyBjb21wdXRlIGEgbGlzdCBvZiB0aGUgZW5kIHBvc2l0aW9ucyBvZiBlYWNoIGxheWVyIGluIHJlc3VsdAotCWludFtdIGVuZFBvcyA9IG5ldyBpbnRbbWF4VmFsdWUrMV07Ci0JaW50IGxlbmd0aCA9IHRoaXMua2V5VGFibGUubGVuZ3RoOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGtleSA9IHRoaXMua2V5VGFibGVbaV07Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaiA9IHRoaXMudmFsdWVUYWJsZVtpXTsgaiA8PSBtYXhWYWx1ZTsgaisrKSB7Ci0JCQkJZW5kUG9zW2pdKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBzdG9yZSB0aGUga2V5cyBpbiBvcmRlciBvZiB0aGVpciB2YWx1ZXMKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBrZXkgPSB0aGlzLmtleVRhYmxlW2ldOwotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCWludCB2YWx1ZSA9IHRoaXMudmFsdWVUYWJsZVtpXTsKLQkJCWludCBpbmRleCA9IC0tZW5kUG9zW3ZhbHVlXTsKLQkJCXJlc3VsdFtpbmRleF0gPSBrZXk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLnZhbHVlVGFibGUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGtleSA9IHRoaXMua2V5VGFibGVbaV07Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChrZXkpOwotCQkJYnVmZmVyLmFwcGVuZCgiIC0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHRoaXMudmFsdWVUYWJsZVtpXSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Ub1N0cmluZ1NvcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9Ub1N0cmluZ1NvcnRlci5qYXZhCmluZGV4IDU5OWU5NTYuLmE2OWUzNDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVG9TdHJpbmdTb3J0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL1RvU3RyaW5nU29ydGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKaW5kZXggY2QwYzczYS4uNjUzYWU4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9VdGlsLmphdmEKQEAgLTEsMjAgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKiBQcm92aWRlcyBjb252ZW5pZW50IHV0aWxpdHkgbWV0aG9kcyB0byBvdGhlciB0eXBlcyBpbiB0aGlzIHBhY2thZ2UuCkBAIC0yOSwxMCArMjksMTUgQEAKIAkJIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwubWVzc2FnZXMiOwkvLyROT04tTkxTLTEkCiAKIAlzdGF0aWMgewotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgTkxTIGNhdGFsb2cgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCi0JCQkgKi8KKwkJLyoqCisJCSAqIENyZWF0ZXMgYSBOTFMgY2F0YWxvZyBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KKwkJICovCisJCXRyeSAgewkJCiAJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyByZXNvdXJjZSA6ICIgKyBidW5kbGVOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5wcm9wZXJ0aWVzIGZvciBsb2NhbGUgIiArIExvY2FsZS5nZXREZWZhdWx0KCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJdGhyb3cgZTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMTE0LDQgKzExOSw0IEBACiAJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKIAl9CiAJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbW9kZWwvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IGZhZGFlNmEuLjY5ODM2NjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL21vZGVsL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9tb2RlbC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsNyArMSwxOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBEaXNhc3NlbWJsZXIgbWVzc2FnZXMKIAogIyMjIGRpc2Fzc2VtYmxlcgogY2xhc3NmaWxlZm9ybWF0LnRhcmdldG9wdGlvbiA9IFZlcnNpb24gKHRhcmdldCB7MH0pIAorZGlzYXNzZW1ibGVyLmRlc2NyaXB0aW9uID0gRGVmYXVsdCBjbGFzc2ZpbGUgZGlzYXNzZW1ibGVyCiBkaXNhc3NlbWJsZXIub3BlbnR5cGVkZWNsYXJhdGlvbiA9XCB7CiBkaXNhc3NlbWJsZXIuY2xvc2V0eXBlZGVjbGFyYXRpb24gPSB9CiBkaXNhc3NlbWJsZXIucGFyYW1ldGVybmFtZSA9IGFyZwpAQCAtMTgsMTIgKzI5LDYgQEAKIGRpc2Fzc2VtYmxlci5hcnJheWRpbWVuc2lvbnMgPSBbXQogZGlzYXNzZW1ibGVyLmNvbnN0cnVjdG9yX21ldGhvZF9uYW1lID0KIGRpc2Fzc2VtYmxlci5wYXJhbWV0ZXJuYW1laW5tZXRob2RpbnZvY2F0aW9uID0KLWRpc2Fzc2VtYmxlci5jb25zdGFudHN0cmluZyA9IDxTdHJpbmcgCi1kaXNhc3NlbWJsZXIuY29uc3RhbnRpbnRlZ2VyID0gPEludGVnZXIgCi1kaXNhc3NlbWJsZXIuY29uc3RhbnRmbG9hdCA9IDxGbG9hdCAKLWRpc2Fzc2VtYmxlci5jb25zdGFudGRvdWJsZSA9IDxEb3VibGUgCi1kaXNhc3NlbWJsZXIuY29uc3RhbnRsb25nID0gPExvbmcgCi1kaXNhc3NlbWJsZXIuY2xvc2Vjb25zdGFudCA9ID4KIGRpc2Fzc2VtYmxlci5pbm5lcmF0dHJpYnV0ZXNoZWFkZXIgPSBJbm5lciBjbGFzc2VzIGF0dHJpYnV0ZXM6CiBkaXNhc3NlbWJsZXIuaW5uZXJfY2xhc3NfaW5mb19uYW1lID0gaW5uZXIgY2xhc3MgaW5mbyBuYW1lOgogZGlzYXNzZW1ibGVyLm91dGVyX2NsYXNzX2luZm9fbmFtZSA9IG91dGVyIGNsYXNzIGluZm8gbmFtZToKQEAgLTM1LDcgKzQwLDcgQEAKIGRpc2Fzc2VtYmxlci5jb2RlYXR0cmlidXRlaGVhZGVyID0gQ29kZSBhdHRyaWJ1dGU6CiBkaXNhc3NlbWJsZXIudGFiID0gXHQKIGRpc2Fzc2VtYmxlci5jb25zdGFudHBvb2xpbmRleCA9XCAjCi1kaXNhc3NlbWJsZXIuY2xhc3NtZW1iZXJzZXBhcmF0b3IgPSA+CitkaXNhc3NlbWJsZXIuY2xhc3NtZW1iZXJzZXBhcmF0b3IgPSAjCiBkaXNhc3NlbWJsZXIuc3BhY2UgPSBcIAogZGlzYXNzZW1ibGVyLmNvbW1hID0gLCAKIGRpc2Fzc2VtYmxlci5vcGVuaW5uZXJjbGFzc2VudHJ5ID0gWwpAQCAtNDYsMjIgKzUxLDYgQEAKIGNsYXNzZmlsZWZvcm1hdC5tYWdpY251bWJlciA9IC0gbWFnaWM6XCAKIGNsYXNzZmlsZWZvcm1hdC5taW5vcnZlcnNpb24gPSAtIG1pbm9yOlwgCiBjbGFzc2ZpbGVmb3JtYXQubWFqb3J2ZXJzaW9uID0gIC0gbWFqb3I6XCAKLWNsYXNzZmlsZWZvcm1hdC5hY2NfYWJzdHJhY3QgPSBhYnN0cmFjdAotY2xhc3NmaWxlZm9ybWF0LmFjY19maW5hbCA9IGZpbmFsCi1jbGFzc2ZpbGVmb3JtYXQuYWNjX25hdGl2ZSA9IG5hdGl2ZQotY2xhc3NmaWxlZm9ybWF0LmFjY19wcml2YXRlID0gcHJpdmF0ZQotY2xhc3NmaWxlZm9ybWF0LmFjY19wcm90ZWN0ZWQgPSBwcm90ZWN0ZWQKLWNsYXNzZmlsZWZvcm1hdC5hY2NfcHVibGljID0gcHVibGljCi1jbGFzc2ZpbGVmb3JtYXQuYWNjX3N0YXRpYyA9IHN0YXRpYwotY2xhc3NmaWxlZm9ybWF0LmFjY19zdHJpY3QgPSBzdHJpY3QKLWNsYXNzZmlsZWZvcm1hdC5hY2Nfc3luY2hyb25pemVkID0gc3luY2hyb25pemVkCi1jbGFzc2ZpbGVmb3JtYXQuYWNjX3RyYW5zaWVudCA9IHRyYW5zaWVudAotY2xhc3NmaWxlZm9ybWF0LmFjY192b2xhdGlsZSA9IHZvbGF0aWxlCi1jbGFzc2ZpbGVmb3JtYXQuY2xhc3MgPSBjbGFzcyAKLWNsYXNzZmlsZWZvcm1hdC5pbnRlcmZhY2UgPSBpbnRlcmZhY2UgCi1jbGFzc2ZpbGVmb3JtYXQuZXh0ZW5kcyA9XCBleHRlbmRzIAotY2xhc3NmaWxlZm9ybWF0LmltcGxlbWVudHMgPVwgaW1wbGVtZW50cyAKLWNsYXNzZmlsZWZvcm1hdC50aHJvd3MgPVwgdGhyb3dzIAogY2xhc3NmaWxlZm9ybWF0Lm1ldGhvZGRlc2NyaXB0b3IgPVwgTWV0aG9kIGRlc2NyaXB0b3IgCiBjbGFzc2ZpbGVmb3JtYXQuZmllbGRkZGVzY3JpcHRvciA9XCBGaWVsZCBkZXNjcmlwdG9yIAogY2xhc3NmaWxlZm9ybWF0Lm1heFN0YWNrID0gU3RhY2s6IApAQCAtNjksMTcgKzU4LDYgQEAKIGNsYXNzZmlsZWZvcm1hdC5zdXBlcmZsYWdub3RzZXQgPSBUaGUgQUNDX1NVUEVSIGJpdCBpcyBub3Qgc2V0CiBjbGFzc2ZpbGVmb3JtYXQuY2xpbml0bmFtZSA9IHt9CiAjIyMgc3RyaW5nIGRpc3BsYXllZCBmb3IgZWFjaCBvcGNvZGUKLWNsYXNzZmlsZWZvcm1hdC5jYXNlID0gY2FzZSAKLWRpc2Fzc2VtYmxlci5jb2xvbiA9IDogCi1jbGFzc2ZpbGVmb3JtYXQuZGVmYXVsdCA9XCBkZWZhdWx0OiAKLWNsYXNzZmlsZWZvcm1hdC5uZXdhcnJheWJvb2xlYW4gPSBib29sZWFuCi1jbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXljaGFyID0gY2hhcgotY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZmxvYXQgPSBmbG9hdAotY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5ZG91YmxlID0gZG91YmxlCi1jbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlieXRlID0gYnl0ZQotY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5c2hvcnQgPSBzaG9ydAotY2xhc3NmaWxlZm9ybWF0Lm5ld2FycmF5aW50ID0gaW50Ci1jbGFzc2ZpbGVmb3JtYXQubmV3YXJyYXlsb25nID0gbG9uZwogY2xhc3Nmb3JtYXQuaW52b2tlaW50ZXJmYWNlbWV0aG9kID1cIDxJbnRlcmZhY2UgbWV0aG9kIAogY2xhc3Nmb3JtYXQuaW52b2tlaW50ZXJmYWNlbWV0aG9kY2xvc2UgPSA+CiBjbGFzc2Zvcm1hdC5pbnZva2VzcGVjaWFsY29uc3RydWN0b3IgPVwgPENvbnN0cnVjdG9yIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIwX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IyMF9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4NDgwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL1IyMF9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKQEAgLTAsMCArMSw0MzY2IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzUgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgorICAgPHRpdGxlPkpEVC9Db3JlIFJlbGVhc2UgTm90ZXM8L3RpdGxlPgorCis8L2hlYWQ+Cis8Ym9keT4KKworPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+CismbmJzcDsKKworPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgorICA8dHI+IAorICAgIDx0ZCBhbGlnbj1sZWZ0IHdpZHRoPSI3MiUiPgorICAgICAgPGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSIgc2l6ZT0iKzMiPjxiPmpkdCBjb3JlIC0gYnVpbGQgbm90ZXMgUjIuMDwvZm9udD4KKyAgICAgIDxicj48Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMiIgY29sb3I9IiM4MDgwZmYiPmphdmEgZGV2ZWxvcG1lbnQgdG9vbGluZyBjb3JlPC9mb250PjwvdGQ+CisgIDwvdHI+CisJPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgIDx0cj4KKyAgCTx0ZD4KKwkgIDxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKwkgIEhlcmUgYXJlIHRoZSBidWlsZCBub3RlcyBmb3IgdGhlIEVjbGlwc2UgSkRUL0NvcmUgcGx1Zy1pbiBwcm9qZWN0IAorCSAgPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9qZHQtY29yZS1ob21lL21haW4uaHRtbCI+PGI+b3JnLmVjbGlwc2UuamR0LmNvcmU8L2I+PC9hPiwgCisJICBkZXNjcmliaW5nIGJ1ZyByZXNvbHV0aW9uIGFuZCBzdWJzdGFudGlhbCBjaGFuZ2VzIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmpkdC5jb3JlIj48Yj5IRUFEPC9iPjwvYT4gYnJhbmNoLiAKKwkgIE1vc3QgcmVjZW50IGluZm9ybWF0aW9uIGlzIGxpc3RlZCBmaXJzdC4KKwkgIDxicj4KKwkgIFRoaXMgcHJlc2VudCBkb2N1bWVudCBjb3ZlcnMgYWxsIGNoYW5nZXMgdXAgdG8gUmVsZWFzZSAyLjAsIGNoYW5nZXMgd2hpY2ggb2NjdXJyZWQgc2luY2UgdGhlbiBpbiAyLjEKKwkgIHN0cmVhbSBhcmUgZGVzY3JpYmVkIGluIDxhIGhyZWY9Ii4uL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCI+YnVpbGQgbm90ZXMgMi4xIHN0cmVhbTwvYT4uCisJICAKKwkgIDwvZm9udD4KKwk8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCBHTTUgLSAyN3RoIEp1bmUgMjAwMiAtIFJFTEVBU0UgMi4wIChSMl8wKQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5DaGFuZ2VkIEFTQ0lJL2JpbmFyeSBwcm9wZXJ0eSBmb3IgJ2Fib3V0Lmh0bWwnIGZpbGUgdG8gQVNDSUkuPC9saT4KKzwvdWw+IAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIEdNNCAtIDI2dGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTMiPjIwNTUzPC9hPiAgCitEb2MgLSBKYXZhZG9jcyBvZiAyLjAgY2xhc3NlcyBtdXN0IHNwZWNpZnkgaWYgdGhlIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudC4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNDQyIj4yMDQ0MjwvYT4gIAorRG9jIC0gSmF2YWRvYyBtaXNzaW5nIGluIElDb2RlU25pcHBldFJlcXVlc3RvciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1NTAiPjIwNTUwPC9hPiAKK0RvYyAtIGZpZWxkcyBvZiBDb3JyZWN0aW9uRW5naW5lIHNob3VsZCBub3QgYmUgQVBJCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NzIiPjIwODcyPC9hPiAgCitEb2MgLSB0aGUgamF2YWRvYyBpcyBub3QgY29ycmVjdCBmb3IgSUNvZGVBc3Npc3QjY29kZVNlbGVjdAorPGJyPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkzNiI+MjA5MzY8L2E+ICAKK251bGxwb2ludGVyIGV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkphdmFCdWlsZGVyCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MjQgLSAyNHRoIEp1bmUgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNjIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5VcGRhdGVkIGFib3V0Lmh0bWwgZmlsZS4KKzwvbGk+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyMSAtIDIxc3QgSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2OTMiPjIwNjkzPC9hPiAgCitGaW5kaW5nIHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzIGRvZXMgbm90IGZpbmQgYWxsIG9jY3VyYW5jZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDAxMSI+MjAwMTE8L2E+ICAKK1NlYXJjaGluZyBmb3IgSW5uZXIgQ2xhc3NlcyBnaXZlcyBiYWQgc2VhcmNoIHJlc3VsdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDUyMCI+MjA1MjA8L2E+ICAKK1JlZmFjdG9yIC0gZXhwcmVzc2lvbiBkZXRlY3Rpb24gaW5jb3JyZWN0CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjQzIj4yMDY0MzwvYT4gIAorSmF2YSBQcm9qZWN0cyBkaXNhcHBlYXIKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYyMCAtIDIwdGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI2MAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA1MzIiPjIwNTMyPC9hPiAgCitEZWNsYXJhdGlvbiBvZiBtZW1iZXIgYmluYXJ5IHR5cGUgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTc5OSI+MTk3OTk8L2E+ICAKK01vcmUgcHJvYmxlbXMgd2l0aCBpbXBvcnRpbmcuICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE0MCI+MTYxNDA8L2E+CitOb24tamF2YSBwcm9qZWN0IGdldHMgLmNsYXNzcGF0aAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDY1OSI+MjA2NTk8L2E+ICAKK0NvbXBpbGUvcmVidWlsZCBhbmFseXNpczogd2hpdGUgc3BhY2UgY2F1c2VzIGxhcmdlIHJlYnVpbGQKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxOCAtIDE4dGggSnVuZSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1OQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlVwZGF0ZWQgYWJvdXQuaHRtbCBmaWxlIHdpdGggcmVmZXJlbmNlIHRvIENQTCAxLjAuCis8L2xpPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA2MTcgLSAxN3RoIEp1bmUgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTgKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5SZW1vdmVkIGRlcHJlY2F0ZWQgMi4wIHRlbXBvcmFyeSBBUEk6IDxjb2RlPklXb3JraW5nQ29weSNmaW5kU2hhcmVkV29ya2luZ0NvcHkoKTwvY29kZT4gd2hpY2ggd2FzIG5vIGxvbmdlciB1c2VkIGFueXdheS4gUHJvcGVyIEFQSSBpcyB0YWtpbmcgCithIDxjb2RlPklCdWZmZXJGYWN0b3J5PC9jb2RlPiBpbiBhcmd1bWVudC48L2xpPgorPC91bD4gCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA0MjciPjIwNDI3PC9hPgorSjljIG5lZWRzIGludGVybmFsIGJhdGNoIGNvbXBpbGVyIG1ldGhvZHMgdG8gYmUgcHVibGljCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMDkiPjIwMzA5PC9hPgorY2Fubm90IGNvZGUgcmVzb2x2ZSBvbiBiaW5hcnkgbWV0aG9kIHdpdGggbWVtYmVyIHR5cGUgYXJndW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAxNTgiPjIwMTU4PC9hPgorQ2xvc2UgYW5kIHJlb3BlbiBhIHByb2plY3QgZG9lcyBub3QgcmVtb3ZlIGVycm9ycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzI1Ij4yMDMyNTwvYT4KK0NQIFZhcmlhYmxlIC0gc2hvdWxkIG5vdCBwZXJzaXN0ICJpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcyIgdmFsdWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE3MyI+MjAxNzM8L2E+CitPcGVuIHR5cGUgZnJvbSBhIGphciBsb2NhdGVkIGluc2lkZSBhIGNsb3NlZCBwcm9qZWN0LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMTM1Ij4yMDEzNTwvYT4KKzIuMCBkZXByZWNhdGVkIG1ldGhvZAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDM1OSI+MjAzNTk8L2E+CitjbGFzc3BhdGggdmFyaWFibGUgRUNMSVBTRV9IT01FIG5vdCBpbml0aWFsaXplZCBvbiBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAyNjEiPjIwMjYxPC9hPgorY3ljbGUgaW4gY2xhc3NwYXRoIGRldGVjdGlvbiBzZWVtcyBvdmVyemVhbG91cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODI2Ij4xOTgyNjwvYT4KK2xpdmVsb2NrIGR1cmluZyBpbmRleGluZz8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDA0OCI+MjAwNDg8L2E+CitNaW5pbWl6ZSByZWNvbXBpbGF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAwNTMiPjIwMDUzPC9hPgoraW50ZXJmYWNlIHdpdGggc2FtZS1uYW1lZCBtZXRob2QgZ2VuZXJhdGVzIGNvbXBpbGUgZXJyb3IKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxMiAtIDEydGggSnVuZSAyMDAyIC0gRlJFRVpFIDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU3Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTUzNyI+MTk1Mzc8L2E+CitJbnRlcm5hbCBlcnJvciBzYXZpbmcgZmlsZSAoanplbnRyeSA9PSAwKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTE3Ij4xOTkxNzwvYT4KK0NvZGUgQXNzaXN0IGluY29ycmVjdCBmb3IgaGlkZGVuIGludGVyZmFjZSBmaWVsZHMKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MTYiPjE5OTE2PC9hPgorRXJyb3IgYWNjZXNzaW5nIHZhbHVlIGZyb20gdW5pbml0aWFsaXplZCBsb2NhbHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NjYiPjE5NTY2PC9hPgorSW52YWxpZCBDbGFzc0Nhc3RFeGNlcHRpb24gdGhyb3duIGF0IHJ1bnRpbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA2Ij4zMzA2PC9hPgorQ2FuJ3QgY29tcGlsZSBKREsgc3JjCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NTEiPjE5ODUxPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIHJlZmFjdG9yLWV4dHJhY3QgbWV0aG9kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyNzIiPjcyNzI8L2E+CitPcGVuIG9uIHNlbGVjdGlvbiBub3Qgd29ya2luZyBpbiBleHRlcm5hbCBKQVJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMTkiPjE0MjE5PC9hPgorRU9GIGV4Y2VwdGlvbiBhZnRlciBidWlsZGluZyBpbiBpbXBvcnRlZCBwbHVnaW4gd2l0aCBleHRyYWN0ZWQgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyOTAiPjE4MjkwPC9hPgorSW5jb3JyZWN0IGVycm9ycyByZXBvcnRlZCBkdXJpbmcgcmVjb25jaWxpbmcKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDYxMSAtIDExdGggSnVuZSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNTYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gQWRkZWQgcHJvdGVjdGlvbiBhcm91bmQgbGlzdGVuZXIgY2FsbGJhY2sgaW52b2NhdGlvbnMgKHVzaW5nIDxjb2RlPklTYWZlUnVubmFibGU8L2NvZGU+KS4gPC9saT4KKzxsaT4gUmVtb3ZlZCAyIHVudXNlZCBkZXByZWNhdGVkIGNvbnN0YW50cyBvbiA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50czwvY29kZT46IFJFQURfUkVGRVJFTkNFUyBhbmQgV1JJVEVfUkVGRVJFTkNFUy4KK1RoZXkgd2VyZSBhbm5vdGVkIHdpdGggaW50ZW50aW9uIHRvIGRpc2NhcmQgYmVmb3JlIDIuMCBzaW5jZSB3ZXJlIHRlbXBvcmFyaWx5IGludHJvZHVjZWQgYW5kIGRlcHJlY2F0ZWQgKGR1ZSB0byBiYWQgbmFtaW5nKS4KKzxwcmU+CisJLyoqIAorCSAqIEBkZXByZWNhdGVkIC0gdXNlIFdSSVRFX0FDQ0VTU0VTIGluc3RlYWQgKHdpbGwgYmUgZGlzY2FyZGVkIGJlZm9yZSAyLjApCisJICogQHNpbmNlIDIuMAorCSAqLworCWludCBXUklURV9SRUZFUkVOQ0VTID0gV1JJVEVfQUNDRVNTRVM7CisJPC9wcmU+PC9saT4KKzwvdWw+IAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NzE0Ij4xOTcxNDwvYT4KK0VjbGlwc2UgY3Jhc2hlczogRHJhZyAmIERyb3AKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTc5NCI+MTk3OTQ8L2E+CitNZXRob2QgYm9keSBjaGFuZ2UgbWF5IHJlc3VsdCBpbiBtYXNzaXZlIHJlY29tcGlsYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODk4MyI+MTg5ODM8L2E+CitSZXBsYWNpbmcgYmluYXJ5IHByb2plY3QgZG9lc24ndCB0cmlnZ2VyIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5NTMiPjE4OTUzPC9hPgorUGFja2FnZSBkaXNhcGVhcnMgd2hlbiBkaXNjb25uZWN0ZWQgZnJvbSBDVlMgcmVwb3BzaXRvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTYzOCI+MTk2Mzg8L2E+CitPcGVuIFR5cGUgSGllcmFyY2h5IGNhbiBzdGFydCBpbmZpbml0ZSBwcm9ncmVzcyBtb25pdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2ODciPjE5Njg3PC9hPgorUHJlZmVyZW5jZXMgbm90IHdvcmtpbmcgd2l0aCBpbXBvcnQvZXhwb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MTIiPjE5NTEyPC9hPgorQXJyYXlJbmRleE91dE9mQm91bmQgZHVyaW5nIGluY3JlbWVudGFsIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5MjIiPjE4OTIyPC9hPgorU2NyYXBib29rIGRvZXMgbm90IGNvbWUgYmFjayB3aGVuIGVycm9ycyBpbiBzbmlwcGV0ICAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MDgiPjE5ODA4PC9hPgorY29yZSBDbGFzc0Nhc3RFeGNlcHRpb24gZXhjZXB0aW9uIGluIGxvZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODgyIj4xOTg4MjwvYT4KK21heWJlIGEgY3UncyBzaW5nbGUgdHlwZSBjYW4gYmUgaXRzIHByb2ltYXJ5IHR5cGUgdG9vCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1ODYiPjE5NTg2PC9hPgorSmF2YSBwcm9qZWN0IHJlbW92ZWQgZnJvbSBQcm9qZWN0cyB2aWV3Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5NzIiPjE1OTcyPC9hPgorSkFSIGZpbGUgZnJvbSBjbGFzc3BhdGggbm90IGluZGV4ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODY4MCI+MTg2ODA8L2E+CitDbGFzc3BhdGggTG9vcAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjA2IC0gNnRoIEp1bmUgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjU1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmVtb3ZlZCBkZXByZWNhdGVkIEFQSSBvbiA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+LiBUaGVzZSB3ZXJlIG5vdCBpbiAxLjAsIGFuZCBzaG91bGRuJ3QgaGF2ZSBiZWVuCitpbnRyb2R1Y2VkIChpbmNvcnJlY3RseSByZXN1cnJlY3RlZCBmcm9tIDAuOSkuCisgIDx1bD4KKwk8bGk+PGNvZGU+SUphdmFQcm9qZWN0I2dldENsYXNzcGF0aCguLi4pIC0tJmd0OyBJSmF2YVByb2plY3QjZ2V0UmF3Q2xhc3NwYXRoKC4uLikgPC9jb2RlPjwvbGk+CisJPGxpPjxjb2RlPklKYXZhUHJvamVjdCNzZXRDbGFzc3BhdGgoLi4uKSAtLSZndDsgSUphdmFQcm9qZWN0I3NldFJhd0NsYXNzcGF0aCguLi4pIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5JSmF2YVByb2plY3QjbmV3UHJvamVjdEVudHJ5KC4uLikgLS0mZ3Q7IEphdmFDb3JlI25ld1Byb2plY3RFbnRyeSguLi4pIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5JSmF2YVByb2plY3QjbmV3TGlicmFyeUVudHJ5KC4uLikgLS0mZ3Q7IEphdmFDb3JlI25ld0xpYnJhcnlFbnRyeSguLi4pIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5JSmF2YVByb2plY3QjbmV3U291cmNlRW50cnkoLi4uKSAtLSZndDsgSmF2YUNvcmUjbmV3U291cmNlRW50cnkoLi4uKSA8L2NvZGU+PC9saT4KKyAgPC91bD4KKzwvbGk+Cis8L3VsPiAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTMwMyI+MTkzMDM8L2E+ICAKK09wZW4gdHlwZSBkb2VzIG5vdCBzaG93IGFsbCB0eXBlLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTA5Ij4xNDEwOTwvYT4gIAorRGVhZGxvY2sgYmV0d2VlbiBQcm9ibGVtVHJlZVZpZXdlciByZWZyZXNoIGFuZCByZWNvbmNpbGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyNTQiPjE5MjU0PC9hPiAgCitTb21lIGxvY2FsIHZhcmlhYmxlIGNvbXBsZXRpb24gcHJvcG9zYWxzIGFyZSBtaXNzZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTEzMSI+MTkxMzE8L2E+ICAKK05QRSB3aGVuIHJlbW92aW5nIGEgcHJvamVjdCBjb250YWluaW5nIG1pc3NpbmcgY2xhc3NmaWxlIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MDU4Ij4xOTA1ODwvYT4gIAorQ2xvc2luZyBub24tamF2YSBwcm9qZWN0IGRvZXNuJ3QgcmVtb3ZlIHJvb3QgZnJvbSBqYXZhIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTg0Ij4xODU4NDwvYT4gIAorTmV3IDIuMCBBUElzIG1hcmtlZCBhcyBkZXByZWNhdGVkIHNob3VsZCBiZSByZW1vdmVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg2OTgiPjE4Njk4PC9hPiAgCitTZWVpbmcgbm9uLWphdmEgcHJvamVjdHMgaW4gcGFja2FnZSB2aWV3Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg5MjAiPjE4OTIwPC9hPiAgCitOUEUgc2VhcmNoaW5nIGZvciByZWZlcmVuY2VzIHRvIGEgbWVzc2FnZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg3NDkiPjE4NzQ5PC9hPgorTWlzc2luZyBqYXZhIGRvYyBmb3IgSUNvbnN0YW50UG9vbEVudHJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1ODMiPjE4NTgzPC9hPiAgCitOZXcgY29uc3RhbnRzIG5vdCB0YWdnZWQgd2l0aCBAc2luY2UgMi4wICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODcwOCI+MTg3MDg8L2E+CitET00gQVNUIC0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9yZ2FuaXppbmcgaW1wb3J0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDM5Ij4xODAzOTwvYT4KK09wZW5pbmcgLmNsYXNzIGZpbGUgZmFpbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODYyMSI+MTg2MjE8L2E+CitRdWVyeSBhbGwgdHlwZXMgd2hlbiBwcm9qZWN0IGlzIGNsb3NlZCBwcmV2ZW50cyByZWluZGV4aW5nIHdoZW4gcHJvamVjdCBpcyBvcGVuICAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyNzEiPjE5MjcxPC9hPiAgICAKK0lPRXhjZXB0aW9uIHdoZW4gc2VhcmNoaW5nIGZvciBwYWNrYWdlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkxNiI+NzkxNjwvYT4gIAorQ29kZSBhc3Npc3QgZG9lcyBub3QgZmluZCBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDI0Ij4xOTQyNDwvYT4gIAorSkRUIHByb2Nlc3NpbmcgZGVsdGFzIGZvciBub24tamF2YSBmaWxlcyBpbiBub24tamF2YSBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NjMzIj4xODYzMzwvYT4gIAorQnVpbGQgZmFpbGVkOiBDYW4gbm90IGZpbmQgdGhlIGNsYXNzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uSURPTUluaXRpYWxpemVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNzUiPjE4MTc1PC9hPiAgCitRdWlja2ZpeCBmYWxzZSBwb3NpdGl2ZXMgZm9yIG5vbi1wdWJsaWMgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5MjkzIj4xOTI5MzwvYT4gIAorY2FuY2VsbGluZyBjb21waWxpbmcgZG9lcyBub3QgYWx3YXlzIGNhbmNlbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTM5Ij4xODUzOTwvYT4gIAordW5hYmxlIHRvIHJ1biBKREJDIHByb2dyYW0sIGNsYXNzIG5vdCBmb3VuZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTIiPjMyOTI8L2E+ICAKK0FkZGluZyBuZXcgY2xhc3MgdGFrZXMgdmVyeSBsb25nICg+MjBzKSAoMUdFVUdGUSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzMzIj4zMzMzPC9hPiAgCitKYXZhQ29yZSBkb2VzIG5vdCByZWNvZ25pemUgZG90IG5vdGF0aW9uIGZvciBpbm5lciBjbGFzc2VzICgxR0k3R1pHKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1MDciPjE4NTA3PC9hPgorb3ZlcndyaXR0aW5nIGV4aXRpbmcgZmlsZSBkb2VzIG5vdCB3b3JrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MTQiPjE4NDE0PC9hPgorTkxTIFRvb2xzOiBGaW5kIHN0cmluZ3MgYW5kIGNvbXBpbGVyIHdhcm5pbmcgb3V0IG9mIHN5bmNoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2MDUiPjU2MDU8L2E+ICAgIAorTlBFIHJlc3RhcnRpbmcgd29ya3NwYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MiI+MzI1MjwvYT4gICAgCitDb2RlIGFzc2lzdCBsaXN0IGNvdWxkIGJlIG5hcnJvd2VyIGluIHRocm93cyBjb21wbGV0aW9uICgxR0QwNzRDKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NzI0Ij4xODcyNDwvYT4gICAgCitDb2RlIGZvciB0aGUgc3RhdGljIGluaXRpYWxpemVyIGlzIGV4Y2VlZGluZyB0aGUgNjU1MzUgYnl0ZXMgbGltaXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcyIj4zMjcyPC9hPiAgICAKK0NvZGVDb21wbGV0aW9uIC0gc2hvdWxkIG9ubHkgcmVzb2x2ZSBpbnRlcmZhY2VzICgxR0U1QjhYKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNTkiPjYyNTk8L2E+ICAgIAorRENSOiBJQ2xhc3NwYXRoRW50cnkgd2l0aCBKYXZhRG9jIGxvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMDciPjEwMDA3PC9hPiAgICAKK05QRSBhbmQgQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gcmVuYW1pbmcgY2xhc3MgbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjIiPjMyMjI8L2E+ICAgIAorSk0gLSBSZW1pbmRlciAtIHJlLWVuYWJsZSB0cmFuc2llbnQgcmVjb25jaWxpbmcgbWFya2VyICAoMUdBSjlGUSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY3Ij4zMjY3PC9hPiAgICAKK0RlYWRsb2NrIHdoaWxlIHJlZnJlc2hpbmcgZm9ybSBsb2NhbCAoMUdEVFVTRCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTgzIj41NTgzPC9hPiAgICAKK2dldE5vbkphdmFSZXNvdXJjZXMgZG9lcyBub3QgcmV0dXJuIC5jbGFzcyBmaWxlcyBmb3Igc291cmNlIGZvbGRlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM3MSI+MTYzNzE8L2E+ICAgIAorSmF2YSBNb2RlbCBFeGNlcHRpb24gdXNpbmcgY29kZSBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYyNiI+MTc2MjY8L2E+ICAgIAorQXV0by1mb3JtYXQgc291cmNlIHJlbW92ZWQgbmV3bGluZSBhdCBlbmQgb2YgcmFuZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODYzIj44ODYzPC9hPiAgICAKKy5jbGFzc3BhdGggZ2V0cyBvdmVyd3JpdHRlbiBpZiB0aGVyZSdzIGFuIFhNTCBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzUiPjMzMzU8L2E+ICAgIAorSmF2YSBFbGVtZW50IERlbHRhczogUGVyZm9ybWFuY2UgaXNzdWVzIHdpdGggZGVsdGFzIGZyb20gV29ya2luZyBDb3B5ICgxR0lFMzZKKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTMiPjMyNTM8L2E+ICAgIAorU0VWRVJFOiBOb3QgYWxsIGV4dGVybmFsIEpBUnMgc2hvdyB1cCBpbiBwYWNrYWdlcyB2aWV3ICgxR0QwSlpPKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MzQiPjE4MzQ8L2E+ICAgIAorQ2FuY2VsIGJ1aWxkIHdpdGggMTAwMDArIHByb2JsZW1zIHRha2VzIGZvcmV2ZXIgdG8gdXBkYXRlICgxRzJROVlaKQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjAxIC0gMXN0IEp1bmUgMjAwMiAtIEZSRUVaRSAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1NAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPlRoZSByZXNvdXJjZSBjb3B5IGV4Y2x1c2lvbiBmaWx0ZXIgbm93IHRvbGVyYXRlcyB3aGl0ZXNwYWNlcyBpbnNpZGUgdGhlIGZpbHRlciBwYXR0ZXJuLCB0aGV5IHdpbGwgYmUgdHJpbW1lZAord2hlbiB1c2VkLiBlLmcuICIgIC4qICAgLCAgZm9vLyAiIGlzIG5vdyBhY2NlcHRlZC48L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQ0NiI+MTg0NDY8L2E+ICAKK0phdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciBvbiBub3QgeWVzdCBjcmVhdGVkIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODQxMSI+MTg0MTE8L2E+ICAKK0V4dGVybmFsIEpBUiByZWZyZXNoIC0gY2FjaGluZyBwcm9ibGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0NTMiPjE4NDUzPC9hPiAgCitEZWxldGluZyBwcm9qZWN0IGRvZXNuJ3QgcmVtb3ZlIHBrZyBmcmFnbWVudCByb290IGluIGFub3RoZXIgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMzEiPjE4MzMxPC9hPiAgICAKK0phdmEgTW9kZWwgbm90IGZsdXNoZWQgd2hlbiB1cGdyYWRpbmcgYmluYXJ5IHByb2plY3RzICAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMxIC0gMzFzdCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUzCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Q2hhbmdpbmcgMi4wIEFQSSBmb3IgcmVmcmVzaGluZyBleHRlcm5hbCBKQVJzIHNvIGFzIHRvIHBhc3MgaW4gYSBjb2xsZWN0aW9uIG9mICplbGVtZW50cyogdG8gcmVzdHJhaW4gdGhlIHNjb3BlCitvZiB0aGUgdXBkYXRlIChzZWUgPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhJSmF2YUVsZW1lbnRbXSxJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4uIEVsZW1lbnRzIAorY2FuIGVpdGhlciBiZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLCBwcm9qZWN0cyBvciBKYXZhIG1vZGVsLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDE4Ij4xODQxODwvYT4gIAorIHNlYXJjaDogc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMgcmVwb3J0cyBpbXBvcnQgZGVjbGFyYXRpb25zICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODI4NyI+MTgyODc8L2E+ICAKKyZsdDtDbGluaXQmZ3Q7IGNoYW5nZSBpcyB0cmVhdGVkIGFzIGEgc3RydWN0dXJhbCBjaGFuZ2UgYnkgaW5jcmVtZW50YWwgYnVpbGRlcgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc2NiI+MTc3NjY8L2E+CitTdHJhbmdlIGVycm9yIHdoZW4gbGF1bmNoaW5nIEVjbGlwc2UgZnJvbSBpbnNpZGUgRWNsaXBzZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODM5NiI+MTgzOTY8L2E+CithbnQgamF2YWMgdGFyZ2V0IGlnbm9yZXMgc291cmNlPSIxLjQiIHNldHRpbmcgaW5zaWRlIGVjbGlwc2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxODciPjE0MTg3PC9hPiAgCitlcnJvciByZWJ1aWxkaW5nIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYwNyI+MTQ2MDc8L2E+ICAKK1JlZmFjdG9yOiByZW5hbWUgaXNuJ3QgdXBkYXRpbmcgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTcyIj4xNjE3MjwvYT4gIAorTmFtZWxvb2t1cCBzbG93IHRvIHJldHJpZXZlIHBhY2thZ2UgZnJhZ21lbnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTU3Ij4xODE1NzwvYT4gICAgCitJbnRlcm5hbCBFcnJvciB3aGVuIGRlbGV0aW5nIHByb2plY3QgIAorIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODI1OSI+MTgyNTk8L2E+ICAKK2NoYW5naW5nIGNsYXNzcGF0aCBjYXVzZXMgc2lnbmlmaWNhbnQgcmVjb21waWxhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzk0Ij4xMDM5NDwvYT4gIAorc3ltYm9saWMgbGlua3MgdXBzZXQgSlJFIHBhdGggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMDIiPjkzMDI8L2E+CitBbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgYmVlbiBkZXRlY3RlZCBpbiBuYXRpdmUgY29kZSBvdXRzaWRlIHRoZSBWTQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMwIC0gMzB0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUyCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+Q29tcGlsZXIgY2FuIG5vdyBvcHRpb25hbGx5IHJlcG9ydCB1bnVzZWQgaW1wb3J0cy4gU2VlIG9wdGlvbiBuYW1lZCAiIiBvbiA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9uczwvY29kZT4gY29tbWVudAorPHByZT4KKwkgKiBDT01QSUxFUiAvIFJlcG9ydGluZyBVbnVzZWQgSW1wb3J0CisJICogICAgV2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBpbXBvcnQgCisJICogICAgcmVmZXJlbmNlIAorCSAqICAgICAtIG9wdGlvbiBpZDoJCSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6CXsgImVycm9yIiwgIndhcm5pbmciLCAiaWdub3JlIiB9CisJICogICAgIC0gZGVmYXVsdDoJCSJpZ25vcmUiCis8L3ByZT4KK05vdGUgdGhhdCBpZiBpbXBvcnQgcHJvYmxlbXMgKHNlcGFyYXRlIHNldHRpbmdzKSBhcmUgZGlzYWJsZWQsIHVudXNlZCBpbXBvcnRzIHdpbGwgbm90IGJlIHJlcG9ydGVkIGVpdGhlci4KK1RoaXMgb3B0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHRvIHRoZSBiYXRjaCBjb21waWxlciAoIi13YXJuOnVudXNlZEltcG9ydHMiKS4gSW1wbGVtZW50YXRpb25zIG9mIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPgorY2FuIGlkZW50aWZ5IHRoaXMgbmV3IHByb2JsZW0gdGhyb3VnaCBpdHMgSUQgPGNvZGU+SVByb2JsZW0jVW51c2VkSW1wb3J0PC9jb2RlPi4KKzwvbGk+Cis8bGk+QWRkZWQgQVBJIG9uIElUeXBlIHNvIGFzIHRvIHRlbGwgd2hldGhlciBhIHR5cGUgaXMgYW5vbnltb3VzLCBsb2NhbCBvciBtZW1iZXIuPC9saT4KKzxsaT5DaGFuZ2luZyAyLjAgQVBJIGZvciByZWZyZXNoaW5nIGV4dGVybmFsIEpBUnMgc28gYXMgdG8gcGFzcyBpbiBhIGNvbGxlY3Rpb24gb2YgcHJvamVjdHMgdG8gcmVzdHJhaW4gdGhlIHNjb3BlCitvZiB0aGUgdXBkYXRlIChzZWUgPGNvZGU+SUphdmFNb2RlbCNyZWZyZXNoRXh0ZXJuYWxKQVJzKElKYXZhUHJvamVjdFtdLElQcm9ncmVzc01vbml0b3IpPC9jb2RlPi4gPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MDYiPjE3OTA2PC9hPgorUmVuYW1lIHBhY2thZ2UgZmFpbHMgd2hlbiBpbm5lciBjbGFzc2VzIGFyZSBpbXBvcnRlZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgyNTUiPjE4MjU1PC9hPgorTlBFIGR1cmluZyBPcmdhbml6ZSBpbXBvcnRzLi4uLiBTZWUgdGVzdDUgaW4gVUkgdGVzdHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNjkiPjE4MTY5PC9hPgorYXN0OiBpbmNvcnJlY3QgbGVuZ3RoIG9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZm9yIHNvbWUgYXJyYXkgZGVjbGFyYXRpb25zIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTM4Ij4xODEzODwvYT4KK1Jlc29sdmluZyBmYWlsdXJlIGluIHZhcmlhYmxlIGRlY2xhcmF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTM1Ij4xODEzNTwvYT4KK2ltcG9ydGluZyBwbHVnaW5zIHJlc3VsdGVkIGluIDlNQiBvZiBlcnJvcnMgYWRkZWQgdG8gbG9nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxOTAiPjE4MTkwPC9hPgorYWRkIGEgbmV3IFBhY2thZ2VGcmFnbWVudFJvb3QgZG9lcyBub3QgdXBkYXRlIHRoZSBuYW1lIGxvb2t1cCBvZiBkZXBlbmRlbnQgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0MSI+MTU0NDE8L2E+CitJbXBvcnRhbnQ6IFByb2JsZW0gaGlnaGxpZ2h0IGlzIG91dCBvZiBzeW5jIHdpdGggY29tcGlsZXIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY0OSI+MTI2NDk8L2E+CitNaXNzaW5nIGltcG9ydCBhZnRlciBtb3ZlICAKKyAgIAorPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNDIiPjE4MDQyPC9hPgorQVNUOiBSZXNvbHZpbmcgZmFpbGVzIHdpdGggc2VtaWNvbG9uIHdoaWxlIGxvb3AgYm9keSAKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyOSAtIDI5dGggTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI1MQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA3OCI+MTgwNzg8L2E+CittZW1vcnkgbGVhayAtIGRlc3Ryb3kgYSBXb3JraW5nQ29weSByZW1vdmUgYW5kIHJlLWFkZCBoaXMgYnVmZmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxODciPjE2MTg3PC9hPgorUHJvYmxlbXMgb2NjdXJlZCBidWlsZGluZyBzZWxldGVkIHJlc291cmNlcy4gTWVtYmVyVHlwZUJpbmRpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODAyOSI+MTgwMjk8L2E+CitkaXNhc3NlbWJsZWQgY29kZSB2aWV3ZXIgaGFuZGxlcyBcbiBpbmNvcnJlY3RseSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkyMiI+MTc5MjI8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gb24gcmVuYW1lIHRlbXAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgwNTQiPjE4MDU0PC9hPgorSkRUL0NvcmUgaXMgdXNpbmcgdGhlIHBsYXRmb3JtIGVuY29kaW5nIGluc3RlYWQgb2YgdGhlIGVuY29kaW5nIHNldCBpbiB0aGUgVUkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkyMyI+MTc5MjM8L2E+CitDYW4ndCBmaW5kIHJlZnMgdG8gYmluYXJ5IGZpZWxkcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MjMiPjExODIzPC9hPgorbnBlIHdoZW4gdHJ5aW5nIHRvIHNldCBzb3VyY2UgdG8gcnQuamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MDkiPjE3NjA5PC9hPgorZGVsZXRpbmcgYSByZXNvdXJjZSByZXN1bHRzIGRvZXMgbm90IGNoYW5nZSBsb2NhbCBoaXN0b3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMjAiPjE2MTIwPC9hPgorU2VsZWN0aW9uUGFyc2VyIGJ1aWxkIHdyb25nIEFTVCBmb3IgaW5zdGFuY2VvZiBzdGF0ZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDQ2OCI+MTQ0Njg8L2E+CitGMyBkb2Vzbid0IHdvcmsgb24gRGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNzMiPjE0MzczPC9hPgorTnVtYmVyIG9mIHNwYWNlcyByZXByZXNlbnRpbmcgYSB0YWIgaXMgYWx3YXkgNCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTY5Ij42MTY5PC9hPgorQ3JlYXRpbmcgdGhlIHRhc2tzIHZpZXcgaGFuZ3MgdGhlIFVJIHRocmVhZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MDcwIj4xODA3MDwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZyBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzMiPjkxNzM8L2E+CitFeGNlcHRpb24gYWJvdXQgbWlzc2luZyBvcmcuZWNsaXBzZS5jb3JlLmJvb3RcLmNsYXNzcGF0aCBmaWxlPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjAyIj4xNTYwMjwvYT4KK091dE9mTWVtb3J5RXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMxMSI+MTUzMTE8L2E+CitJbXBvcnRpbmcgZXh0ZXJuYWwgcGx1Zy1pbnMgZnJvbSBmaWxlIHN5c3RlbSBmYWlscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODUyIj4xMzg1MjwvYT4KK0Nhbm5vdCBnZW5lcmF0ZSBFSkIgaW5oZXJpdGFuY2UgZGVwbG95ZWQgY29kZSB3aXRob3V0IGRlYnVnIGluZm8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA0NiI+MTcwNDY8L2E+CitJbm5lciBjbGFzcyByZWZlcmVuY2UgdG8gT3V0ZXIgY2xhc3MgbWV0aG9kIG5vdCByZWNvZ25pemVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5NTMiPjE3OTUzPC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBjb21waWxpbmcgY29jb29uMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3OTMwIj4xNzkzMDwvYT4KK01vdmluZyBzZWNvbmRhcnkgdHlwZXMgaXMgZm9vbGluZyB0aGUgamF2YSBpbmNyZW1lbnRhbCBidWlsZGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4NzMiPjE3ODczPC9hPgorU3luY2hyb25pemUgQ29tcGFyaXNvbiBkb2VzIHBvb3Igam9iIG9uIC5jbGFzc3BhdGggZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjczNiI+MTY3MzY8L2E+CitDb21tZW50IGJlZm9yZSBwYWNrYWdlIHN0YXRlbWVudCBub3QgYXNzb2NpYXRlZCB3aXRoIGl0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTUxIj4xMjU1MTwvYT4KK1NlYXJjaCBmaW5kcyBzb21lIGJ1dCBub3QgYWxsIG1ldGhvZCByZWZzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzI1NCI+MTcyNTQ8L2E+CitDb3VsZCBub3QgZmluZCAuY2xhc3NwYXRoLgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTI3IC0gMjd0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjUwCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgQVBJIHRvIHJldHJpZXZlIGNhY2hlZCBmbGFncyBvbiB0eXBlIGhpZXJhcmNoaWVzIChzZWUgPGNvZGU+SVR5cGVIaWVyYXJjaHkjZ2V0Q2FjaGVkRmxhZ3MoSVR5cGUpPC9jb2RlPikuIE5vdGUgdGhhdCB0aGVzZQorZmxhZ3MgY2FuIGhlbHAgYW5zd2VyaW5nIGJvdGggaXNDbGFzcy9pc0ludGVyZmFjZSBxdWVyaWVzIGFzIHdlbGwgKHNlZSA8Y29kZT5GbGFncy5pc0ludGVyZmFjZShpbnQpPC9jb2RlPjwvbGk+Cis8bGk+QWRkZWQgQVBJIHRvIHRyaWdnZXIgYSBKYXZhIG1vZGVsIHJlZnJlc2ggd2l0aCByZXNwZWN0IHRvIGV4dGVybmFsIEpBUnM6IDxjb2RlPklKYXZhTW9kZWwjcmVmcmVzaEV4dGVybmFsSkFSczwvY29kZT4uIDwvbGk+Cis8cHJlPgorLyoqCisgKiBUcmlnZ2VycyBhbiB1cGRhdGUgb2YgdGhlIEphdmFNb2RlbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlZmVyZW5jZWQgZXh0ZXJuYWwgSkFScy4KKyAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgaXNzdWUgYSBKYXZhTW9kZWwgZGVsdGEgZGVzY3JpYmluZyB0aGUgZGlzY292ZXJlZCBjaGFuZ2VzLCBpbiB0ZXJtCisgKiBvZiBKYXZhIGVsZW1lbnQgcGFja2FnZSBmcmFnbWVudCByb290cyBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLgorICogCisgKiBAcGFyYW0gbW9uaXRvciAtIGEgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcworICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaW4gb25lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNpdHVhdGlvbjoKKyAqICAgIC0gYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgcHJvamVjdCByZXNvdXJjZXMgCisgKiAKKyAqIEBzZWUgSUphdmFFbGVtZW50RGVsdGEKKyAqIEBzaW5jZSAyLjAKKyAqLwordm9pZCByZWZyZXNoRXh0ZXJuYWxKQVJzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKzwvcHJlPgorPGxpPkFkZGVkIGZsYWcgZm9yIG5vdGlmeWluZyBhIEpBUiBjb250ZW50IGNoYW5nZSBkdXJpbmcgSmF2YSBkZWx0YSBub3RpZmljYXRpb246IDxjb2RlPklKYXZhRWxlbWVudERlbHRhI0ZfQVJDSElWRV9DT05URU5UX0NIQU5HRUQ8L2NvZGU+PC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwOTciPjE3MDk3PC9hPgorU2VhcmNoaW5nIGZvciAiKiIgaW4gamF2YSBnaXZlcyBhIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBkaWFsb2cuICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE2MiI+MTUxNjI8L2E+CitBc3NlcnRpb24gZmFpbHVyZSBkdXJpbmcgc2h1dGRvd24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTQ1Ij4xNzE0NTwvYT4KK05QRSAgd2hpbGUgY29tcGlsaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDciPjE3ODA3PC9hPgorSW5jcmVtZW50YWwgYnVpbGQgcHJvYmxlbXMgZGVsZXRpbmcgc2Vjb25kYXJ5IHR5cGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NjQiPjE3NTY0PC9hPgorUmVnaXN0ZXIgamF2YSBmaWxlIHR5cGVzIHdpdGggdGhlIHRlYW0gcGx1Z2luCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MjIiPjE3NDIyPC9hPgorSkRUIENvbXBpbGVyIEFkYXB0ZXIgYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBBbnQgMS41IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MTAxIj4xNzEwMTwvYT4KK0Fzc2VydGlvbiBmYWlsdXJlIGR1cmluZyBzaHV0ZG93biAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc1NjIiPjE3NTYyPC9hPgorUmFjZSBjb25kaXRpb24gb24gc3RhcnR1cCBsZWFkcyB0byAyIEphdmFNb2RlbCBpbnN0YW5jZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTM5NSI+MTUzOTU8L2E+CitBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gd2hlbiBjcmVhdGluZyBuZXcgSmF2YSBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc5NyI+MTc3OTc8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGlsZSBidWlsZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3ODI3Ij4xNzgyNzwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGF0ICBDb21waWxhdGlvblJlc3VsdC5jb21wdXRlUHJpb3JpdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjc2MSI+MTY3NjE8L2E+CitOUEUgd2hlbiBkb2luZyBQcm9qZWN0IC0+IFJlYnVpbGQgQWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyOSI+MzMyOTwvYT4KK1NwZWNpZmljYXRpb24gZm9yIElKYXZhRWxlbWVudERlbHRhIG5lZWRlZCAoMUdIVlc1TSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzUzIj4xNjc1MzwvYT4KK0V4Y2VwdGlvbiB3aGlsZSBidWlsZGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMTU5Ij4xMjE1OTwvYT4KK0NvZGUgRm9ybWF0IGlzIGdlbmVyYXRpbmcgYm9ndXMgb3V0cHV0IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzUxIj4xNjc1MTwvYT4KK1JlbmFtaW5nIGEgY2xhc3MgZG9lc24ndCB1cGRhdGUgYWxsIHJlZmVyZW5jZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Nzg5Ij4xNjc4OTwvYT4KK0luY29tcGxldGUgcHJvamVjdCBlbGVtZW50IGlmIC5jbGFzc3BhdGggZmlsZSBpc24ndCByZWFkYWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjc5Ij4xNjI3OTwvYT4KK2NvbXBpbGVyIGNyZWF0ZXMgY29kZSB0aGF0IGNhdXNlcyB2ZXJpZmllciBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEzIj4xNDExMzwvYT4KK1Nob3VsZCBsaXN0ZW4gdG8gRl9TT1VSQ0VBVFRBQ0hFRCBhbmQgRl9TT1VSQ0VERVRBQ0hFRCBqYXZhIGRlbHRhcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNTAiPjE1MjUwPC9hPgorTmVlZCBhIGJldHRlciBtYXBwaW5nIGZvciB0aGUgbWV0aG9kIGZyZWUgcmV0dXJuIG9wY29kZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjA5MSI+MTYwOTE8L2E+CitOZWVkIHdheSB0byByZWZyZXNoIEpBUiBmaWxlcworCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjM1NCI+MTYzNTQ8L2E+CitDb2RlIEFzc2lzdCBoYXMgdG9vIG1hbnkgaXRlbXMgYWZ0ZXIgdGhyb3dzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjMiPjE2ODYzPC9hPgordHlwZSBoaWVyYXJjaHkgbWlzc2VzIHR5cGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg5MiI+MTQ4OTI8L2E+CitGYWlsZWQgcGFja2FnZSBpbXBvcnQgbGVhZHMgdG8gT3V0T2ZNZW1vcnkgZXJyb3JzIGF0IGNvbXBpbGUgdGltZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxOTciPjE3MTk3PC9hPgorRjEgLSAiQWRkIEphcnMiIHRvIGJ1aWxkIHBhdGggbG9ja3MgdXAgZWNsaXBzZSAtIHdpbjJrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyMTEiPjE1MjExPC9hPgorTlBFIHdoaWxlIHNlYXJjaGluZyBmb3IgYSBmaWVsZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY0OTQiPjE2NDk0PC9hPgorbmV3U3VwZXJUeXBlSGllcmFyY2h5IG9uIGJpbmFyeSB0eXBlIHJldHVybnMgZW1wdHkgaGllcmFyY2h5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzEyNyI+MTcxMjc8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gU2ltcGxlTmFtZS5zZXRJZGVudGlmaWVyKFNpbXBsZU5hbWUuamF2YToxMzYpIGluIE01IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODU3Ij4xNjg1NzwvYT4KK0VtcHR5IGZvbGRlciBjcmVhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjA5Ij4xNjIwOTwvYT4KK1N1cHBvcnQgZGVjbGFyZWQgcGFja2FnZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGlyZWN0b3J5IGxvY2F0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjA2OCI+NjA2ODwvYT4KK1dhbGtiYWNrIGR1cmluZyBwbHVnaW4gaW1wb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5ODUiPjEyOTg1PC9hPgorVW5leHBlY3RlZCBmdWxsIGJ1aWxkIGluIGluY3JlbWVudGFsIG1vZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTAyMiI+MTEwMjI8L2E+CitVbmV4cGVjdGVkIGZ1bGwgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjQzNiI+MTY0MzY8L2E+CitDb3JlRXhjZXB0aW9uIGltcG9ydGluZyBvcmcuZWNsaXBzZS51aS53aW4zMgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTIwIj4xMjUyMDwvYT4KK0pEVENvbXBpbGVyQWRhcHRlciBkb2VzIG5vdCB1bmRlcnN0YW5kIC1leHRkaXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwNDciPjEwMDQ3PC9hPgorSkRUQ29tcGlsZXJBZGFwdGVyICBpZ25vcmVzIC1ub3dhcm4gYW5kIGRlcHJlY2F0aW9uIG9mZi4KKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyMSAtIDIxc3QgTWF5IDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzI0OSAtIE1JTEVTVE9ORSA2IC8gRlJFRVpFIDEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4nLmNsYXNzcGF0aCcgZmlsZSBpcyBub3cgd3JpdHRlbiB1c2luZyBwbGF0Zm9ybSBsaW5lIGRlbGltaXRlcnMgKHVzZWQgdG8gYmUgb25seSB1c2luZyBMRnMpLiBJdCBpcyByZWNvbW1hbmRlZCB0byBjb252ZXJ0IGl0IHRvICd0ZXh0JyBmb3JtYXQKK3NvIGFzIHRvIGF2b2lkIHN1cmZhY2luZyBkZWxpbWl0ZXIgZGlmZmVyZW5jZXMgaW4gYmV0d2VlbiBpbmNvbXBhdGlibGUgcGxhdGZvcm1zLiA8L2xpPgorPGxpPlRoZSBzZXR0aW5nIGFsbG93aW5nIGZvciBmaWx0ZXJpbmcgcmVzb3VyY2UgY29weSBub3cgYWxzbyBzdXBwb3J0cyBmb2xkZXIgZmlsdGVyaW5nLiBGb2xkZXIgbmFtZXMgYXJlCityZWNvZ25pemVkIGJ5IHRoZWlyICcvJyBzdWZmaXgsIGUuZy4gIk1FVEEtSU5GLyIgc3BlY2lmaWVzIGZpbHRlcmluZyBvdXQgYWxsIGZvbGRlciBuYW1lZCAnTUVUQS1JTkYnIChhbmQgdGhlaXIgY29udGVudHMpPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0NCI+MzI0NDwvYT4KK0NsYXNzcGF0aCBpcyBub3Qgc2F2ZWQgdXNpbmcgVVRGOCAoMUdDVjQ2NykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzg3OCI+MTM4Nzg8L2E+CitSZXF1ZXN0IHRvIHN1cHBvcnQgZm9sZGVycyBmb3IgcmVzb3VyY2UgY29weSBmaWx0ZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzUiPjE2MTM1PC9hPgorVW5leHBlY3RlZCBlcnJvcnMgd2hpbGUgcmVjb25jaWxpbmcKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE4IC0gMTh0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ4Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+PGxpPkFkZGVkIDxjb2RlPlRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoSUNsYXNzRmlsZSBjbGFzc2ZpbGUsIGludCBkZWNvZGluZ0ZsYWcpPC9jb2RlPiBhcyBhbiBoZWxwZXIgbWV0aG9kIHRvCisJY3JlYXRlIGEgY2xhc3NmaWxlIHJlYWRlciBmb3IgY2xhc3NmaWxlIGVsZW1lbnRzLjwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTMwIj4xNjEzMDwvYT4KK2J1aWxkIHhlcmNlcy9wbHVnaW4ucHJvcGVydGllcyBzbG93Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxNzUiPjE2MTc1PC9hPgorTlBFIGluIEluZGV4TWFuYWdlciNjaGVja0luZGV4Q29uc2lzdGVuY3kgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTYzIj4xNTU2MzwvYT4KK0NvbXBsZXRpb25FbmdpbmUgZG9lcyBub3QgcmVwb3J0IHR5cGUgcGFja2FnZXMgb2YgbG9jYWwgdmFyaWFibGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNzQiPjEyMzc0PC9hPgorTlBFIGluIFJlc3VsdENvbGxlY3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1OTc3Ij4xNTk3NzwvYT4KK05QRSBpbiBDb2RlIEFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDM3Ij4xNDAzNzwvYT4KK0ludGVybmFsIEVycm9yIGRvaW5nIGphdmEgc2VhcmNoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTI2Ij4xNjEyNjwvYT4KK0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcgY29tcGlsYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzIiPjE2MTMyPC9hPgorRXJyb3Igb24gRXh0cmFjdCBNZXRob2QgUmVmYWN0b3JpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwNTIiPjE2MDUyPC9hPgorTlBFIHdoZW4gc2VhcmNoIHJlZmVyZW5jZSBvZiBhIGNvbnN0cnVjdG9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTk0NSI+MTU5NDU8L2E+CitDcmVhdGluZyBuZXcgY2xhc3MgY2F1c2VzIG1vc3QgcHJvamVjdHMgdG8gYmUgcmVjb21waWxlZAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MjQ0Ij45MjQ0PC9hPgorU2VhcmNoIEdlbmVyYXRlcyBPdXRPZk1lbW9yeUVycm9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQyMyI+MTU0MjM8L2E+CitKUkVfTElCIHNvdXJjZSBhdHRhY2htZW50IHZpYSBwcm9wZXJ0aWVzIGRvZXMgbm90IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkzMSI+MTU5MzE8L2E+CitQcm9wb3NlZCByZXN1bHRzIHRvIGxpbWl0ZWQvaW52YWxpZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTMxIj4xNjEzMTwvYT4KK0phdmEgc2VhcmNoIGZhaWxzIHRvIGZpbmQgYWxsIHJlZmVyZW5jZXMgdG8gc3RhdGljIGZpbmFsIE1CX0FERElUSU9OUworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTkyIj4xNTE5MjwvYT4KK1BhY2thZ2VGcmFnbWVudDo6Y29weSBuZXZlciBvdmVyd3JpdGVzCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MTUgLSAxNXRoIE1heSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDcKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKyAgICA8bGk+IE5ldyBjb21waWxlciBvcHRpb24gYWRkZWQgdG8gY29udHJvbCBtYXggbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGEgdW5pdC4gRGVmYXVsdCBpcyAxMDAuIFNlZSA8Y29kZT5KYXZhQ29yZSNnZXREZWZhdWx0T3B0aW9ucygpPC9jb2RlPiA8L2xpPgorICAgIDxwcmU+CisJICogQ09NUElMRVIgLyBNYXhpbXVtIG51bWJlciBvZiBwcm9ibGVtcyByZXBvcnRlZCBwZXIgY29tcGlsYXRpb24gdW5pdAorCSAqICAgIFNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2JsZW1zIHJlcG9ydGVkIG9uIGVhY2ggY29tcGlsYXRpb24gdW5pdC4KKwkgKiAgICAgLSBvcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0IgorCSAqICAgICAtIHBvc3NpYmxlIHZhbHVlczoJIjxuPiIgd2hlcmUgPG4+IGlzIHplcm8gb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIChpZiB6ZXJvIHRoZW4gYWxsIHByb2JsZW1zIGFyZSByZXBvcnRlZCkuCisJICogICAgIC0gZGVmYXVsdDoJCQkiMTAwIgorICAgIDwvcHJlPgorICAgIDxsaT5CeSBkZWZhdWx0LCB0aGUgSmF2YSBidWlsZGVyIGlzIG5vdyBhYm9ydGluZyBidWlsZCBwcm9jZXNzIG9uIHByb2plY3RzIHdpdGggY2xhc3NwYXRoIHByb2JsZW1zLiBUaGlzIG9wdGlvbiBjYW4gYmUgZGlzYWJsZWQgdGhyb3VnaCB0aGUgSmF2YSBwcmVmZXJlbmNlczoKKyAgICBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtCdWlsZGVyJmd0OzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDUxIj4xNjA1MTwvYT4KK0RPTS9BU1Q6IHdyb25nIHBvc2l0aW9uIGluIGlmIHN0YXRlbWVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc4OCI+MTU3ODg8L2E+CitXYWxrYmFja3MgYXQgc3RhcnR1cCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMjEiPjE2MDIxPC9hPgorSW5maW5pdGUgbG9vcCBpbiBKYXZhQ29yZS5pc1JlZmVyZW5jZWRCeSguLi4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjciPjE0NDY3PC9hPgorT3V0bGluZXIgZG9lc24ndCBoaWdobGlnaHQgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYwMTciPjE2MDE3PC9hPgorSmF2YUJ1aWxkZXIgcmVwb3J0cyAgYnVpbGQgZmFpbHVyZXMgb24gZGVwZW5kZW5jaWVzIG9udG8gaW50ZXJuYWwgSkFScworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTY4Ij4xNTU2ODwvYT4KK1dhdGNocG9pbnRzLCBtZXRob2QgYnJlYWtwb2ludHMgaW4gaW50ZXJlc3RpbmcgbG9jYXRpb25zIG5vdCBzaG93aW5nIGluIGVkaXRvciBydWxlcgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjgwMSI+MTY4MDE8L2E+CitDb21waWxlciBwcm9ibGVtIHdoZW4gKi8gYXBwZWFycyBpbiBjb21tZW50ZWQgU3RyaW5nLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTU1Ij4xMjk1NTwvYT4KK1Byb2JsZW0gd2l0aCBUeXBlIERpYWxvZyBhbmQgSGllcmFyY2h5U2NvcGVzIC0gYnVpbGQgMjAwMjAyMTQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDE2Ij4xNjAxNjwvYT4KK09wZW5pbmcgYSBwcm9qZWN0IGFmdGVyIHN0YXJ0aW5nIEVjbGlwc2UgbWlzc2VzIHByb2plY3QgaW5kZXhlcyAob3Igb3RoZXIgaW50ZXJuYWwgc3R1ZmYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxOTAiPjE1MTkwPC9hPgorSmF2YSBCdWlsZCBlcnJvcnMgYWZ0ZXIgc2F2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDA4Ij4xNjAwODwvYT4KK0hhbmcgZHVyaW5nIHNodXRkb3duCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzOTIiPjEyMzkyPC9hPgorUHJvYmxlbXMgdG8gYWRkIFByb2plY3QgZnJvbSByZXBvc2l0b3J5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMDMiPjE1MTAzPC9hPgorU2VhcmNoIHJlc3VsdHMgYXJlIG1pc3NpbmcgcXVhbGlmaWNhdGlvbgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE0IC0gMTR0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ2Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisgICAgPGxpPkphdmEgY29tcGlsZXIgbmV2ZXIgcmVjb3JkIG1vcmUgdGhhbiAxMDAgbWFya2VycyBmb3IgY29tcGlsYXRpb24gcHJvYmxlbXMuIEFsbCBBUElzIHVzaW5nIElQcm9ibGVtUmVxdWVzdG9yIHN0aWxsCisgICAgCXNlZSB0aGVtIGFsbC4gVGhpcyBjaGFuZ2UgaXMgaW50ZW5kZWQgdG8gcHJldmVudCB0aGUgdGFzayBsaXN0IGZyb20gYmVpbmcgb3ZlcmhlbG1lZCB3aXRoIHRvbnMgb2Ygc2Vjb25kYXJ5IHByb2JsZW1zLiA8L2xpPgorCTxsaT5BZGRlZCBBUElzIHRoYXQgYWxsb3cgdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgd2l0aCBhIHNldCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHRha2UgcHJlY2VuZGVuY2UKKwkgICAgICBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQ6CisJICAgICAgPHVsPgorCSAgICAgIAk8bGk+PGNvZGU+SVR5cGUubmV3U3VwZXJUeXBlSGllcmFyY2h5KElXb3JraW5nQ29weVtdLCBJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT48L2xpPgorCSAgICAgIAk8bGk+PGNvZGU+SVR5cGUubmV3VHlwZUhpZXJhcmNoeShJV29ya2luZ0NvcHlbXSwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+PC9saT4KKwkgICAgICA8L3VsPgorCSAgICAgIE5vdGUgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCByZWZyZXNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlc2UgaGllcmFyY2hpZXMuCisJPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNTEiPjE0MDUxPC9hPgorVGhlIGltcGxlbWVudGF0aW9uIGZvciBJVHlwZS5yZXNvbHZlVHlwZShTdHJpbmcpIGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBub3RlZCBpbiB0aGUgSmF2YURvYyBzcGVjcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzIyIj4xNTMyMjwvYT4KK25lZWQgYSB3YXkgdG8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgdGhhdCBjb25zaWRlcnMgd29ya2luZyBjb3BpZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTQyIj4xNTE0MjwvYT4KK0NDRSBpbiBTb3VyY2VDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzQ5Ij4xNTM0OTwvYT4KK0phdmFNb2RlbEV4Y2VwdGlvbiBvdXQgb2YgQ29udGVudCBhc3Npc3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njc3Ij4xNTY3NzwvYT4KK0V4Y2VwdGlvbiBjYWxsaW5nIHNvdXJjZVR5cGUuZ2V0RmllbGRzIG9uIHdvcmtpbmcgY29weSBvZiBuZXcgY2xhc3MgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjU3Ij4xNTY1NzwvYT4KK0lET01NZXRob2QuZ2V0UmV0dXJuVHlwZSByZXR1cm5zIG51bGwgZm9yIGFsbCBtZXRob2RzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODA0Ij4xNTgwNDwvYT4KK0RPTS9BU1Q6IHdyb25nIExlbmd0aCBpbiBjYXNjYWRpbmcgaWYvdGhlbi9lbHNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDAwIj4xNTQwMDwvYT4KK0NvbXBpbGVyIGdlbmVyYXRlcyB3YXkgdG9vIG1hbnkgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU4NTciPjE1ODU3PC9hPgorRGVhZGxvY2sgaW4gdGhlIGluZGV4ZXIuc2h1dGRvd24oKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzU2Ij4xNTc1NjwvYT4KK09yZ2FuaXppbmcgaW1wb3J0cyBkb2Vzbid0IHBpY2sgdXAgdGhlIHJpZ2h0IHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MzAiPjE1NDMwPC9hPgoraGFuZyB1cCBlY2xpcHNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5NjUiPjE0OTY1PC9hPgorU2VhcmNoIHJlc3VsdHMgaW4gLmNsYXNzIGZpbGVzIGRvbid0IHNlbGVjdCByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY5MCI+MTU2OTA8L2E+CitDbGFzc3BhdGggYmVpbmcgc2V0IGluIHdyb25nIG5vdGlmaWNhdGlvbiBsaWZlY3ljbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTgxMCI+MTU4MTA8L2E+CitDbGFzc3BhdGhDb250YWluZXIgcXVlc3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcxNyI+MTU3MTc8L2E+CitJIGNhbnQgaG9sZCBKREsgQ29tcGlsZXIgQ29tcGxpYW5jZSBsZXZlbCBzZXR0aW5nLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ4Ij4xNTQ0ODwvYT4KK2kga2VlcCBsb29zaW5nIHByZWZlcmVuY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMTMiPjE1MTEzPC9hPgorZXh0cmFjdCBtZXRob2Q6IGFzc2VydGlvbiBmYWlsdXJlIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTM3Ij44MTM3PC9hPgorQ29kZSBhc3Npc3QgZm9yIGFub255bW91cyBpbm5lciB0eXBlIHRvbyBsYXRlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NjEiPjE1NzYxPC9hPgorTG9nIG1lc3NhZ2UgYWZ0ZXIgaW1wb3J0aW5nIHBsdWdpbnMgZmFpbHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTg1MiI+MTU4NTI8L2E+CituZWVkIHNldCBhcGkgb24gSUNsYXNzcGF0aEVudHJ5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NzkiPjE1NTc5PC9hPgorSW5jb21wbGV0ZSBKYXZhIEVycm9yIE1lc3NhZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzc1NiI+MTM3NTY8L2E+CitDb2RlIENvbXBsZXRpb24gKyBUeXBlIEludHJvc3BlY3Rpb24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTgiPjMxOTg8L2E+CitDYWxsZXIgb2YgU2lnbmF0dXJlLnRvU3RyaW5nKFN0cmluZykgc2hvdWxkIGJlIGF3YXJlIHRoYXQgaXQgd29uJ3Qgd29yayBmb3IgJyQnIHNlcGFyYXRlZCB0b3AtbGV2ZWwgdHlwZXMgKDFHNFFCMlMpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzMyIj4xNTMzMjwvYT4KK1Byb2JsZW0gd2l0aCAiXFwiIGluIGVkaXRvci9jb21waWxlciAKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUwNyAtIDd0aCBNYXkgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQ1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkFkZGVkIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXNzYWdlI01lc3NhZ2UoU3RyaW5nLCBpbnQsIGludCkuIFRoaXMgbmV3IGNvbnN0cnVjdG9yIGFsbG93cyB0byBzZXQgdGhlIGxlbmd0aCBmaWVsZC4gVGhlIGNvbnN0cnVjdG9yCisJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lc3NhZ2UjTWVzc2FnZShTdHJpbmcsIGludCkgc3RpbGwgZXhpc3RzIGFuZCBzZXQgdGhlIGxlbmd0aCB0byAwLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgbmV3IGNvbnN0cnVjdG9yIGlmIHRoZSBsZW5ndGgKKwlpcyBuZXZlciB1c2VkLjwvbGk+CisJPGxpPlJlbmFtZWQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lc3NhZ2UjZ2V0U291cmNlUG9zaXRpb24oKSB0byBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNnZXRTdGFydFBvc2l0aW9uKCkuIFRoaXMKKwlpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgRE9NL0FTVCBBUEkuIFRoZSBvbGQgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGNsb3NlIGZ1dHVyZS48L2xpPgorCTxsaT5BZGRlZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVzc2FnZSNnZXRMZW5ndGgoKSBhbGxvd2luZyB0byByZXRyaWV2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBub2RlIG9uIHdoaWNoCisJdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcmVwb3J0ZWQuPC9saT4KKwk8bGk+IEFkZGVkIDxjb2RlPkphdmFDb3JlI2dldFNoYXJlZFdvcmtpbmdDb3BpZXMoSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPiBhbGxvd2luZyB0byByZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCB3b3JraW5nCisJCWNvcGllcyBmb3IgYSBnaXZlbiBidWZmZXIgZmFjdG9yeS4gPC9saT4KKwk8bGk+IEphdmFCdWlsZGVyIG5vIGxvbmdlciBidWlsZCBwcm9qZWN0cyBmb3Igd2hpY2ggcHJlcmVxdWlzaXRlIHByb2plY3RzIGFib3J0ZWQgdGhlIGJ1aWxkIHByb2Nlc3MuIFRoaXMgY29uc2lkZXJhYmx5CisJCXJlZHVjZXMgdGhlIG51bWJlciBvZiBzZWNvbmRhcnkgZXJyb3JzIHdoZW4gZGVhbGluZyB3aXRoIHdvcmtzcGFjZSBzZXR1cCBwcm9ibGVtcy48L2xpPgorCTxsaT4gQWRkZWQgPGNvZGU+SVdvcmtpbmdDb3B5I3JlY29uY2lsZShib29sZWFuIGZvcmNlUHJvYmxlbURldGVjdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTwvY29kZT4gYWxsb3dpbmcgdG8gZm9yY2UKKwkJcHJvYmxlbSByZWZyZXNoIGV2ZW4gaWYgd29ya2luZyBjb3B5IHdhcyBhbHJlYWR5IGNvbnNpc3RlbnQuCisgICAgPGxpPiBBZGRlZCA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyPC9jb2RlPiBuZXcga2luZCBjb25zdGFudCA8Y29kZT5LX0RFRkFVTFRfU1lTVEVNPC9jb2RlPiB0byBkZW5vdGUgc3lzdGVtIGxpYnJhcmllcyBpbXBsaWNpdGVseSBjb250cmlidXRlZAorICAgIAlieSBhIHJ1bnRpbWUuIDwvbGk+CisgICAgPGxpPiBDbGFzc3BhdGggY29udGFpbmVyIHBhdGggY2FuIGhhdmUgbW9yZSB0aGFuIDIgc2VnbWVudHMuIEZpcnN0IG9uZSBpcyBzdGlsbCB0aGUgY29udGFpbmVyIElELCB0aGUgcmVtYWluaW5nIG9uZXMgYXJlIGZvcm1pbmcgdGhlIGhpbnRzCisgICAgCXBhc3NlZCB0byB0aGUgcmVzb2x1dGlvbiBwaGFzZSAoPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IDwvbGk+CisgICAgPGxpPiBDbGFzc3BhdGggY29udGFpbmVycyBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gdmFyaWFibGUgZW50cmllcyA8L2xpPgorCTxsaT5KYXZhQ29yZSBub3cgcGVyc2lzdHMgaXRzIG9wdGlvbnMgKDxjb2RlPkphdmFDb3JlI2dldE9wdGlvbnM8L2NvZGU+KSB1c2luZyBpdHMgcGx1Z2luIHByb3BlcnR5IHN0b3JlLiBDbGllbnRzIG5vIGxvbmdlciBuZWVkIHRvIHNhdmUgdGhlbS4gPC9saT4KKwk8bGk+SmF2YUNvcmUgbm93IHByb3ZpZGVzIGNvbnN0YW50cyBmb3IgYWxsIHN1cHBvcnRlZCBvcHRpb24gSURzIGFuZCB2YWx1ZXMuPC9saT4KKwk8bGk+SmF2YUNvcmUgb3B0aW9uIGFkZGVkLCB0byBhbGxvdyBidWlsZCB0byBhYm9ydCBpbiBwcmVzZW5jZSBvZiBpbnZhbGlkIGNsYXNzcGF0aC4gCisJPGxpPkxldmVyYWdlZCBuZXcgZW5jb2Rpbmcgc3VwcG9ydCBmcm9tIFBsYXRmb3JtL0NvcmUuIFRoZSBKYXZhQ29yZSBvcHRpb24gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIiBpcyBub3cgZXF1aXZhbGVudCB0byA8Y29kZT5SZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKTwvY29kZT4uCisJPHByZT4KKwkgKiBCVUlMREVSIC8gQWJvcnQgaWYgSW52YWxpZCBDbGFzc3BhdGgKKwkgKiAgICBBbGxvdyB0byB0b2dnbGUgdGhlIGJ1aWxkZXIgdG8gYWJvcnQgaWYgdGhlIGNsYXNzcGF0aCBpcyBpbnZhbGlkCisJICogICAgIC0gb3B0aW9uIGlkOiAgICAgICAgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aCIKKwkgKiAgICAgLSBwb3NzaWJsZSB2YWx1ZXM6ICB7ICJhYm9ydCIsICJpZ25vcmUiIH0KKwkgKiAgICAgLSBkZWZhdWx0OiAgICAgICAgICAiaWdub3JlIgorCTwvcHJlPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQxNiI+MTU0MTY8L2E+CitDbGFzc3BhdGggY29udGFpbmVyIC0gbmVlZCB0byBzZXQgdmFsdWUgZXZlbiBpZiBub3QgcmVmZXJlbmNlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDE4Ij4xNTQxODwvYT4KK0NsYXNzcGF0aCBjb250YWluZXIgLSBtYXkgZ2V0IHRoZSBpbml0LWluLXByb2dyZXNzIHZhbHVlIGJhY2sKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMzNCI+MTUzMzQ8L2E+Cithc3Q6IE1lc3NhZ2Ugc2hvdWxkIGhhdmUgbGVuZ3RoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzY0Ij4xNTM2NDwvYT4KK3NlYXJjaCBmb3IgcmVmZXJlbmNlcyBvZiBEZWJ1Z1VJUGx1Z2luLnNldEF0dHJpYnV0ZXMoLi4uKSBmYWlscyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNzUiPjE1MTc1PC9hPgorTmVlZCBBUEkgdG8gcmV0cmlldmUgYWxsIHNoYXJlZCB3b3JraW5nIGNvcGllcyBmb3IgYSBidWZmZXIgZmFjdG9yeQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MjU0Ij4xNTI1NDwvYT4KK0phdmFNb2RlbE1hbmFnZXIgdGhpbmtzIEphdmFQcm9qZWN0IGlzIGNsb3NlZCB3aGVuIGl0IGlzIG9wZW4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTYiPjMzNTY8L2E+CitBUEkgLSBzaG91bGQgcHJvdmlkZSBBUEkgZm9yIHJ1bm5pbmcgYmF0Y2ggY29tcGlsZXIgKDFHSklXRFApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDQiPjE1MjQ0PC9hPgorTlBFIGluIEpEVENvbXBpbGVyQWRhcHRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTI4OSI+MTUyODk8L2E+CitXaHkgaXMgYW4gaW5jb3JyZWN0IHBhY2thZ2UgZGVjbGFyYXRpb24gbm90IHJlcG9ydGVkIGR1cmluZyByZWNvbmNpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjI1Ij4xMzIyNTwvYT4KK3F1aWNrIGZpeDogc2hvd3MgdXAgb25seSBhZnRlciBJIHNhdmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA4MSI+MTUwODE8L2E+CitKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGggYWxsb3dzIG5lc3Rpbmcgc291cmNlIGZvbGRlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA0NCI+MTUwNDQ8L2E+CitVbmFibGUgdG8gdmlldyBzb21lIG5vbi1qYXZhIGZpbGVzIGluIGV4dGVybmFsIGphcnMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTc3Ij4xNTE3NzwvYT4KK0NsYXNzcGF0aCBtYXJrZXJzIG5vdCBjb3JyZWN0bHkgdXBkYXRlZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxNjgiPjE1MTY4PC9hPgorY2lyY3VsYXIgZXJyb3JzIG5vdCByZXBvcnRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU3Ij4xMzk1NzwvYT4KK0xhdW5jaGluZ1BsdWdpbiBzcGVjaWZpY2F0aW9uIG9mIHJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTc3Ij4xMjk3NzwvYT4KK0FkZGluZyBKYXZhIG5hdHVyZSB0byBhIHByb2plY3QgZG9lcyBub3QgYnJpbmcgaXQgdG8gbGlrZSBpbiBwYWNrYWdlIHZpZXcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTA3Ij4xNTEwNzwvYT4KK0ludGVybmFsIEVycm9yIG9yZ2FuaXppbmcgaW1wb3J0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTAzMCI+MTUwMzA8L2E+CitOUEUgdHJ5aW5nIHRvIG9wZW4gb3IgZWRpdCBzb3VyY2UgZmlsZXMgdGhhdCByZWZlcmVuY2UgamJ1aWxkZXIuamFyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODM4Ij4xNDgzODwvYT4KK1NjcmFwYm9vayBlZGl0b3I6IGJhZCBoYW5kbGluZyBvZiAvLyBjb21tZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTQzIj4xMjU0MzwvYT4KK0NvZGUgYXNzaXN0IHRvIGluc2VydCBtZXRob2QgZG9lcyBub3Qgd29yayB3aGVuIHRoZXJlIGFyZSBleHRyYSB0b3AtbGV2ZWwgc3RhdGVtZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDYxIj4xNTA2MTwvYT4KK0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBBU1ROb2RlLnNldFNvdXJjZVJhbmdlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDM2Ij4xNTAzNjwvYT4KK0FTVFZpc2l0b3IucHJlVmlzaXQgYW5kIEFTVFZpc2l0b3IucG9zdFZpc2l0IG5vdCBjYWxsZWQgY29ycmVjdGx5IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTMiPjMxOTM8L2E+CitKTSAtIElTb3VyY2VNYW5pcHVsYXRpb24uZGVsZXRlIHNlbmQgcmVwbGFjZS1CdWZmZXJDaGFuZ2VkRXZlbnQgKDFGWUU4WEkpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA5MSI+MTUwOTE8L2E+CitUb28gbWFueSBjeWNsZSBtYXJrZXJzIGdlbmVyYXRlZCB3aGVuIGN5Y2xlIGlzIGRldGVjdGVkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDc1NCI+MTQ3NTQ8L2E+CitDb2RlQXNzaXN0IC0gRHVwbGljYXRlIG1ldGhvZCBkZWNsYXJhdGlvbiBwcm9wb3NhbCBpbnNpZGUgYW5vbnltb3VzIHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTA1MSI+MTUwNTE8L2E+CitTeW50aGV0aWMgYWNjZXNzIG1ldGhvZHMgYXJlIG5vdCByZXBvcnRlZCB0byBiZSBzeW50aGV0aWMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU5Ij4zMDU5PC9hPgorSlJFX0xJQiBub3QgYXBwZW5kZWQgdG8gYnVpbGRQYXRoICgxR0Y3VEFaKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDUwIj4xNTA1MDwvYT4KK0NsZWFudXAgSmF2YWRvYyBAZXhjZXB0aW9uIHRhZ3MgaW4gRE9NL0FTVAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTUxIj4xNDE1MTwvYT4KK1RoZSBjb2RlIGZvcm1hdHRlciBkb2VzIG5vdCByZXNwZWN0IHRoZSAibWF4aW11bSBsaW5lIGxlbmd0aCIgcHJvcGVydHkgd2hlbiB0aGUgaW5kZW50YXRpb24gaXMgc2V0IHRvIHRhYnVsYXRpb24uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTc0Ij4xNDk3NDwvYT4KK0JhZCBnZW5lcmF0ZWQgY29kZSBmb3IgJys9JyBhbmQgJy09JyBvcGVyYXRvcnMKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MTkiPjE1NzE5PC9hPgorRXJyb3JzIGR1cmluZyBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDg3Ij4xNTA4NzwvYT4KK05QRSB3aGVuIG1ldGhvZHMgZnJvbSB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBjbGFzcyBpcyBpbnZva2VkIGluIGEgYW5vbnltb3VzIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNTciPjEzMDU3PC9hPgorTlBFIGluIEphdmFFbGVtZW50UmVxdWVzdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTUiPjExMTU1PC9hPgorQXJyYXlJbmRleE91dE9mQm91bmRzIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB3b3JrYmVuY2ggdG8gZnJlZXplCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MjEiPjEyOTIxPC9hPgorQnVpbGQgc29tZXRpbWVzIGJ1aWxkcyBmaWxlcyB0aGF0IGhhdmUgbm90IGNoYW5nZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDk2MiI+MTQ5NjI8L2E+CitKRFQgU2VhcmNoIHJldHVybmluZyBpbXByb3BlciB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MjkiPjE0OTI5PC9hPgorRXh0ZXJuYWwgTG9jYXRpb25zIGZvciBPdXRwdXQgRmlsZXMKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQzMCAtIDMwdGggQXByaWwgMjAwMiAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQzCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPlByaW9yaXR5IG9mIHRoZSBiYWNrZ3JvdW5kIGluZGV4ZXIgaGFzIGJlZW4gbG93ZXJlZCBzbyB0aGF0CisJICAgIGl0IGRvZXNuJ3QgaW50ZXJmZXIgd2l0aCBvdGhlciB0aHJlYWRzIChlLmcuIHdoZW4gc3dpdGNoaW5nIEpSRQorCSAgICB0aGUgaW5kZXhpbmcgd2lsbCBub3Qgc3RhcnQgYmVmb3JlIHRoZSBzd2l0Y2ggaGFzIGNvbXBsZXRlZCkKKwk8L2xpPgorCTxsaT5SZXZpc2VkIENsYXNzcGF0aCBDb250YWluZXIgcHJvcG9zYWwgKGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvfmNoZWNrb3V0fi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2NsYXNzcGF0aCUyMGNvbnRhaW5lci9jbGFzc3BhdGhDb250YWluZXIuaHRtbCI+bm90ZXM8L2E+KToKKwk8dWw+CisJPGxpPjxjb2RlPmNsYXNzcGF0aENvbnRhaW5lckNoYW5nZWQoKTwvY29kZT4gZ290IHJlcGxhY2VkIHdpdGggc2V0dGVyIG1ldGhvZCA8Y29kZT5KYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0W10gYWZmZWN0ZWRQcm9qZWN0cywgSUNsYXNzcGF0aENvbnRhaW5lciByZXNwZWN0aXZlQ29udGFpbmVycykgPC9jb2RlPjwvbGk+CisJPGxpPjxjb2RlPkNsYXNzcGF0aENvbnRhaW5lclJlc29sdmVyPC9jb2RlPiBnb3QgcmVuYW1lZCBpbnRvIDxjb2RlPkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC9jb2RlPjwvbGk+CisJPGxpPiBDb250YWluZXIgY2FuIG5vIGxvbmdlciBjb250YWluIGFueSA8Y29kZT5DUEVfU09VUkNFPC9jb2RlPiBlbnRyeS4KKwk8bGk+IGFkZGVkIGNvbnRhaW5lciBpbnRlcmZhY2UgPGNvZGU+IElDbGFzc3BhdGhDb250YWluZXIgPC9jb2RlPiBpbiBvcmRlciB0byBhbGxvdyBjb250YWluZXJzIHRvIGJlIHByZXNlbnRlZCBpbiBhIFVJLgorCQkgIDx1bD4KKwkJICA8bGk+SUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIDwvbGk+CisJCSAgPGxpPlN0cmluZyBnZXREZXNjcmlwdGlvbigpIDwvbGk+CisJCSAgPGxpPmludCBnZXRLaW5kKCkgPC9saT4KKwkJICA8bGk+UGF0aCBnZXRQYXRoKCkgPC9saT4KKwkJIDwvdWw+CisJPC91bD4KKwk8L2xpPgorCTxsaT5JZiB0aGUgY29tcGxldGlvbiBpcyBpbnNpZGUgYSBzdXBlciB0eXBlIGluIHR5cGUgZGVjbGFyYXRpb24gaGVhZGVyIHRoZW4gdGhlIHJlbGV2YW5jZSBncm93CisJCXdoZW4gdGhlIHR5cGUgaGF2ZSB0aGUgY29ycmVjdCBuYXR1cmUgOgorCQk8dWw+CisJCQk8bGk+IEFmdGVyIDxjb2RlPmV4dGVuZHM8L2NvZGU+IGtleXdvcmQgb2YgYSBjbGFzcyBoZWFkZXIgdGhlIHJlbGV2YW5jZSBncm93IGlmIHRoZSB0eXBlIGlzIGEgY2xhc3MuCisJCQk8L2xpPgorCQkJPGxpPiBBZnRlciA8Y29kZT5pbXBsZW1lbnRzPC9jb2RlPiBrZXl3b3JkIG9mIGEgY2xhc3MgaGVhZGVyIHRoZSByZWxldmFuY2UgZ3JvdyBpZiB0aGUgdHlwZSBpcyBhbiBpbnRlcmZhY2UuCisJCQk8L2xpPgorCQkJPGxpPiBBZnRlciA8Y29kZT5leHRlbmRzPC9jb2RlPiBrZXl3b3JkIG9mIGFuIGludGVyZmFjZSBoZWFkZXIgdGhlIHJlbGV2YW5jZSBncm93IGlmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZS4KKwkJCTwvbGk+CisJCTwvdWw+CisJPC9saT4KKwk8bGk+IElmIHRoZSBjb21wbGV0aW9uIGlzIGluc2lkZSBhIHR5cGUgaW4gYSBjYXRjaCBvciB0aHJvd3MgY2xhdXNlIHRoZSByZWxldmFuY2UgZ3JvdyB3aGVuIHRoZSB0eXBlIGlzIGFuIGV4Y2VwdGlvbgorCQkoaWYgdGhlIG5hbWUgb2YgdGhlIHR5cGUgY29udGFpbiA8Y29kZT5leGNlcHRpb248L2NvZGU+IG9yIDxjb2RlPmVycm9yPC9jb2RlPikuCisJPC9saT4KKwk8bGk+IElmIHRoZSBjb21wbGV0aW9uIGlzIGluc2lkZSBhIHRocm93IHN0YXRlbWVudCB0aGUgcmVsZXZhbmNlIGdyb3cgd2hlbiB0aGUgcHJvcG9zYWwgaXMgYW4gZXhjZXB0aW9uLgorCTwvbGk+CisJPGxpPlRoZSBiYWNrZ3JvdW5kIGluZGV4ZXIgbm93IHJlY292ZXJzIGZyb20gaW50ZXJuYWwgY3Jhc2guIElmIHRoaXMgaGFwcGVucywgCisJICAgIGEgbmV3IHRocmVhZCBpcyBjcmVhdGVkIGFuZCBhIGNvbnNpc3RlbmN5IGNoZWNrIGlzIGRvbmUgb24gYWxsIGluZGV4ZXMuCisJPC9saT4KKwk8bGk+QW4gaW50ZXJuYWwgYnVmZmVyIGZhY3RvcnkgaXMgbm93IHVzZWQgdG8gY3JlYXRlIGJ1ZmZlcnMgd2hlbgorCSAgICBjbGllbnRzIGRvbid0IHByb3ZpZGUgb25lLgorCTwvbGk+CisJPGxpPlNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIGZvcm1hdHRlciBmb3IgLy8kTk9OLU5MUy0gY29tbWVudHMgaW4gdGhlIHNvdXJjZS4gV2hlbiBhIGxpbmUgY29udGFpbnMgc3VjaCBjb21tZW50cworCWl0IGlzIG5vdCBmb3JtYXR0ZWQgYW55bW9yZS4gVGhlIHVzZXIgd2lsbCBuZWVkIHRvIG1hbnVhbGx5IGZvcm1hdCBpdC4gU2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzg3Ij4xNDM4NzwvYT4gYW5kCisJPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjU0MCI+MTI1NDA8L2E+LgorCTwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTMzIj4xNDkzMzwvYT4KK0FTVDogTm8gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgZm9yIHVucmVhY2hhYmxlIGNvZGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ5MjEiPjE0OTIxPC9hPgorTm8gZXJyb3IgbWVzc2FnZSBmcm9tIGlubmVyIHR5cGUgaW5zdGFudGlhdGlvbiBpbiBzdGF0aWMgY29udGV4dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTE5Ij4xMzkxOTwvYT4KK0RlY2xhcmF0aW9uIGZvciBwYWNrYWdlIG5vdCBmb3VuZCBpZiBzY29wZSBpcyBub3QgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NTIiPjE0ODUyPC9hPgorT3JnYW5pemUgSW1wb3J0OiBtaXNzaW5nIGltcG9ydCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzUzMSI+MTM1MzE8L2E+CitKYXZhIGluZGV4aW5nIHRocmVhZCBmaW5kcyAiQm9uam91ciwgbGUgbW9uZGUhIiB0b28gaW50ZXJlc3RpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg3OCI+MTQ4Nzg8L2E+CitzdGF0aWMgZmluYWwgY2hhciBOZWdUaHJlZT0gKGNoYXIpLTMsIC0zID09IE5lZ1RocmVlIHJldHVybnMgdHJ1ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzMxIj4xNDMzMTwvYT4KK0lDb21waWxhdGlvblVuaXQuZ2V0RWxlbWVudEF0IGRvcyBub3QgZmluZCBpbXBvcnQgZGVjbCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMzgiPjE0MDM4PC9hPgorQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBKYXZhUmVjb25jaWxpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxMSI+MTQwMTE8L2E+CitBU1ROb2RlLmNoZWNrTmV3Q2hpbGQoQVNUTm9kZSwgQVNUTm9kZSwgYm9vbGVhbiwgQ2xhc3MpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTc3Ij4xMzU3NzwvYT4KK1Byb2JsZW0gaGlnaGxpZ2h0ZXIgaXMgdW5hYmxlIHRvIGltcG9ydCBmcm9tIEphdmEzRCBsaWJyYXJ5LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODMxIj4xNDgzMTwvYT4KK05QRSB3aXRoIGhpZXJhcmNoeSBzZWFyY2ggb2YgYSBsb2NhbCB2YXJpYWJsZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNDMiPjE0MjQzPC9hPgorQXBwbGV0IFZpZXdlciBJbnRlZ3JhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTQwIj4xNDE0MDwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBvcGVuIEphdmEgZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzQiPjE0ODM0PC9hPgorc21hbGx0YWxrLWlzaCBlcnJvciBtZXNzYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTEiPjExNjUxPC9hPgorQXV0by1jb21wbGV0ZSBzaG93cyBhbGwgT2JqZWN0IHN1YmNsYXNzZXMgYWZ0ZXIgInRocm93cyIga2V5d29yZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzAiPjQ5NzA8L2E+CitBdXRvbWF0aWMgQ29kZSBBc3Npc3QgbmVlZHMgdG8gYmUgc21hcnRlciAjNgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NTEiPjg2NTE8L2E+CitDb2RlIGFzc2lzdCBzaG91bGQgb2ZmZXIgZXhjZXB0aW9uIGluc3RlYWQgb2YgYW55IGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NjciPjE0NzY3PC9hPgorYnVnIGluIElKYXZhUHJvamVjdC5maW5kVHlwZShTdHJpbmcsIFN0cmluZykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDY0MiI+MTQ2NDI8L2E+CitTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byB2aWV3IHNvbWUgY2xhc3NlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU1OCI+MTQ1NTg8L2E+CitBZGRpbmcgYmluYXJ5IHByb2plY3QgZG9lc24ndCBmaXggY2xhc3NwYXRoIHByb2JsZW1zLiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1ODgiPjE0NTg4PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gVXRpbC5lcXVhbEFycmF5c09yTnVsbCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM0OTIiPjEzNDkyPC9hPgorU2hvdWxkIGhhbmRsZSBKYXZhTW9kZWxFeGNlcHRpb25zIHRoYXQgY29udGFpbnMgQ29yZUV4Y2VwdGlvbiBtb3JlIGdyYWNlZnVsbHkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTQwIj4xMjU0MDwvYT4KK0NvZGUgZm9ybWF0dGVyIHNob3VsZCBsZWF2ZSBjb21tZW50cyBhdCBlbmQgb2YgbGluZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM4NyI+MTQzODc8L2E+CitGb3JtYXR0ZXIgaXNuJ3QgLy8kTk9OLU5MUy0xJCBhd2FyZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzEzIj4xNDMxMzwvYT4KK0RDUjogQVNUIGluIG1ldGhvZHMgd2l0aCBtaXNzaW5nIHJldHVybiB0eXBlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDk0Ij4xNDA5NDwvYT4KK0luZGV4ZXI6IERlYWRsb2NrIG9uIGRlbGV0ZSBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU5NCI+MTQ1OTQ8L2E+CisiT3BlbiB0eXBlIiBkb2Vzbid0IGZpbmQgdHlwZXMgaW4gcHJvamVjdCB3aXRoIEphdmEgbmF0dXJlIGFkZGVkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDYwMiI+MTQ2MDI8L2E+Cithc3Q6IGxlbmd0aCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDU5MiI+MTQ1OTI8L2E+CitJVHlwZSNnZXRUeXBlcyBhbmQgSVR5cGUjZ2V0RGVjbGFyaW5nVHlwZSBhcmUgbm90IGNvaGVyZW50IHdpdGggSGFzdGFibGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NjgiPjEzODY4PC9hPgorSmF2YSBNb2RlbCBub3QgdXBkYXRlZCBwcm9wZXJseSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzQiPjEzMjM0PC9hPgorQ2FuJ3Qgb3BlbiB0eXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTI5NiI+OTI5NjwvYT4KK0hhbmcgb24gb3BlbiB0eXBlIGR1cmluZyBpbmRleGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTE2Ij4xMzkxNjwvYT4KK2FwaTogSVNjYW5uZXIgLSBTY2FubmVyLmxpbmVQdHIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUyNiI+MTQ1MjY8L2E+CitOUEUgd2hlbiByZXNvbHZpbmcgYSBTaW1wbGVOYW1lIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTI5Ij4xMTUyOTwvYT4KK2FzdDogbWlzc2luZyAoPykgYmluZGluZyBvbiBzaW1wbGVOYW1lIGluIFZhcmlhYmxlRGVjbGFyYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NTMiPjE0NDUzPC9hPgorUmVtb3ZlIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTlNUQU5DRU9GIG9wZXJhdG9yIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDkwIj4xNDQ5MDwvYT4KK1Bvc3NpYmxlIGNvbmN1cnJlbmN5IGhvbGUgd2hlbiBzYXZpbmcgaW5kZXggYmVmb3JlIHF1ZXJ5ICAKKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NDQiPjE0ODQ0PC9hPgorTlBFIGNyZWF0aW5nIGJpbmFyeSBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0OTA4Ij4xNDkwODwvYT4KKzEwMCUgQ1BVIHV0aWxpemF0aW9uLCBoYW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3MzMiPjE0NzMzPC9hPgorTlBFIHNldHRpbmcgbWFya2VyIGF0dHJpYnV0ZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzc0MyI+MTM3NDM8L2E+CisoTlBFKSBFY2xpcHNlIGZyb3plIGR1cmluZyAib3BlbiB0eXBlIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDc0Ij4xNDA3NDwvYT4KK1NlYXJjaDogTm90IGFsbCByZWZzIHRvIFR3b1BhbmVFbGVtZW50U2VsZWN0b3IgY29uc3RydWN0b3IgZm91bmQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODg5Ij4xNDg4OTwvYT4KK2J1ZyBpbiBJSmF2YVByb2plY3QuZmluZFR5cGUoU3RyaW5nLCBTdHJpbmcpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MzkiPjEyNDM5PC9hPgorYXV0byBjb21wbGV0aW9uIGRvZXNuJ3QgY29uc2lzdGVudGx5IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDgxOCI+MTQ4MTg8L2E+CitubyBtZXNzYWdlIGZvciB1bmNhdWdodCBleGNlcHRpb24gaW4gdHJ5IGJsb2NrIHdoZW4gcmV0dXJuIGluIGZpbmFsbHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgxMCI+MTM4MTA8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gaW4gaW5kZXhlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNTI3Ij4xMzUyNzwvYT4KK05QRSArIEdQIHN3aXRjaGluZyBKUkUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA5NiI+MTQwOTY8L2E+CitJV29ya2luZ0NvcHkuZmluZEVsZW1lbnRzIHNob3VsZCBub3QgcmV0dXJuIG51bGwgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTQzIj4xMzk0MzwvYT4KK0VjbGlwc2UgY3Jhc2hlcyB3aGVuIGRvaW5nIGEgInJlYnVpbGQgYWxsIgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDQwIj4xNDQ0MDwvYT4KK1Bvc3NpYmxlIGJ1ZyBpbiBjb21waWxpbmcgaW5uZXIgY2xhc3NlcworCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTA4LU01cGF0Y2giIC0gOHRoIE1heSAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDJiCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkphdmEgYnVpbGRlciBpcyBsb2dnaW5nIGl0cyBpbnRlcm5hbCBlcnJvcnMgPC9saT4KKzwvdWw+Cis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDIzIC0gMjNyZCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDJhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkphdmEgbW9kZWwgQVBJIGFkZGl0aW9uczoKKwkJPHVsPgorCQkJPGxpPjxjb2RlPklKYXZhUHJvamVjdC5maW5kVHlwZShTdHJpbmcpPC9jb2RlPjwvbGk+CisJCQk8bGk+PGNvZGU+SUphdmFQcm9qZWN0LmZpbmRUeXBlKFN0cmluZywgU3RyaW5nKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklNZXRob2QuaXNNYWluTWV0aG9kKCk8L2NvZGU+PC9saT4KKwkJCTxsaT48Y29kZT5JTWV0aG9kLmlzU2ltaWxhcihJTWV0aG9kKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShjaGFyKTwvY29kZT48L2xpPgorCQkJPGxpPjxjb2RlPklUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKGNoYXIpPC9jb2RlPjwvbGk+CisJCTwvdWw+CisJPC9saT4KKwk8bGk+QVBJIGNoYW5nZTogPGNvZGU+SVdvcmtpbmdDb3B5LmZpbmRTaGFyZWRXb3JraW5nQ29weSgpPC9jb2RlPiBpcyBub3cgdGFraW5nIGFuIGV4dHJhIGFyZ3VtZW50OiB0aGUgYnVmZmVyIGZhY3RvcnkgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBUaGlzIGVuc3VyZXMgdGhhdAorCQl3b3JraW5nIGNvcGllcyBjYW4gb25seSBiZSByZXVzZWQgZm9yIHRoZSBzYW1lIGJ1ZmZlciBmYWN0b3JpZXMuCisJPC9saT4KKwk8bGk+IEphdmFNb2RlbE9wZXJhdGlvbnMgbm93IGd1YXJhbnRlZSB0aGUgSmF2YU1vZGVsIGlzIHVwIHRvIGRhdGUgd2hlbiBub3RpZnlpbmcgdGhlIEphdmEgbW9kZWwgY2hhbmdlIGxpc3RlbmVycy4gSW4gcGFydGljdWxhciwKKwlhIGJ1aWxkZXIgcnVubmluZyBhZnRlciB0aGUgSmF2YSBidWlsZGVyIHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUgSmF2YSBtb2RlbCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNoYW5nZXMgaW50cm9kdWNlZCB0aHJvdWdoIEphdmEgbW9kZWwKKwlvcGVyYXRpb25zIChleGNlcHQgZm9yIGluZGV4IHF1ZXJpZXMpLiBUaGlzIHdhcyBuZXZlciBndWFyYW50ZWVkIGluIDEuMCwgYnV0IGluZGlyZWN0bHkgb2NjdXJyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHByZXZpb3VzIEphdmEKKwlidWlsZGVyIGltcGxlbWVudGF0aW9uIGRpZCBmb3JjZSB0byByZWZyZXNoIHRoZSBKYXZhIG1vZGVsIHdoaWxlIGJ1aWxkaW5nLiA8L2xpPgorCTxsaT5DbGFzc3BhdGggQ29udGFpbmVyIEVuaGFuY2VtZW50IChhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9jbGFzc3BhdGglMjBjb250YWluZXIvY2xhc3NwYXRoQ29udGFpbmVyLmh0bWwiPm5vdGVzPC9hPik6CisJPGJyPkFkZGVkIG5ldyB0eXBlIG9mIGNsYXNzcGF0aCBlbnRyeSAoPGNvZGU+Q1BFX0NPTlRBSU5FUjwvY29kZT4pLCAoc2VlIHByb3Bvc2FsIGhlcmUpIHNvIGFzIHRvIGJldHRlciBlbmNhcHN1bGF0ZSBjbGllbnQgZGVmaW5lZCBsaWJyYXJpZXMuCisJVHlwaWNhbGx5LCBWTSBpbnN0YWxscyB3b3VsZCB1c2UgY2xhc3NwYXRoIGNvbnRhaW5lcnMgaW5zdGVhZCBvZiBjbGFzc3BhdGggdmFyaWFibGVzICg8Y29kZT5KUkVfTElCPC9jb2RlPikgc28gYXMgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjb3JyZXNwb25kaW5nCisJc2V0IG9mIGxpYnJhcmllcyAoaW5jbHVkaW5nIGV4dGVuc2lvbiBkaXJzKSB0byBiZSBwbGFjZWQgb24gdGhlIGJ1aWxkIHBhdGguIAorCTxwPk5ldyBBUElzIGFkZGVkIHRvIHJlZmxlY3QgdGhpcyBhZGRpdGlvbjoKKwk8dWw+CisJPGxpPjxjb2RlPkphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KElQYXRoIGNvbnRhaW5lclBhdGgpPC9jb2RlPjwvbGk+CisJPGxpPjxjb2RlPkphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KElQYXRoIGNvbnRhaW5lclBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCk8L2NvZGU+PC9saT4KKwk8bGk+PGNvZGU+SmF2YUNvcmUuY2xhc3NwYXRoQ29udGFpbmVyQ2hhbmdlZChJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YUVsZW1lbnQgc2NvcGUpIDwvY29kZT48L2xpPgorCTxsaT48Y29kZT5DbGFzc3BhdGhDb250YWluZXJSZXNvbHZlciA8L2NvZGU+PC9saT4KKwk8L3VsPgorCTwvbGk+CisJPGxpPkRPTS9BU1Q6PGJyPkEgbmV3IHR5cGUgb2Ygbm9kZSBoYXMgYmVlbiBhZGRlZCB0byBoYW5kbGUgcHJvcGVybHkgdGhlIGluc3RhbmNlb2YgZXhwcmVzc2lvbi4gU28gdGhlIG5ldyBJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlIAorCXJlcGxhY2VkIHRoZSB1c2FnZSBvZiBJbmZpeEV4cHJlc3Npb24gd2l0aCB0aGUgb3BlcmF0b3IgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLklOU1RBTkNFT0YuIFRoaXMgb3BlcmF0b3IgaGFzIGJlZW4KKwlkZXByZWNhdGVkIGFuZCBpcyBleHBlY3RlZCB0byBiZSByZW1vdmVkIGZvciB0aGUgbmV4dCBpbnRlZ3JhdGlvbiBidWlsZC4gU2VlIGJ1ZyA8QSBIUkVGPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDUzIj4xNDQ1MzwvYT4uPC9saT4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDciPjEzODA3PC9hPgorbnVsbCBiaW5kaW5nIHJldHVybmVkIGZvciBmdWxseSBxdWFsaWZpZWQgYXJyYXkgZGVjbGFyYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MDMiPjE0NDAzPC9hPgorYXN0OiBleGNlcHRpb24gb24gY3JlYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyMjkiPjE0MjI5PC9hPgorRmFpbHVyZSB3cml0aW5nIHRvIGEgcmVhZCBvbmx5IC5wcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5MDUiPjEzOTA1PC9hPgorY2hhbmdlcyB0byByZWFkLW9ubHkgLmNsYXNzcGF0aCBmaWxlIGFyZSBub3QgdGhyb3duIG91dAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjUiPjYxNjU8L2E+CitoYW5kbGUgcmVhZC1vbmx5IGNsYXNzIHBhdGggZmlsZSBpbiBhIGdyYWNlZnVsIHdheQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzIyIj4xNDMyMjwvYT4KK0FTVC9ET00gOiBJVmFyaWFibGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkgZm9yICdsZW5ndGgnIGZpZWxkIG9mIGFuIGFycmF5IHJldHVybiBudWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzQzIj4xNDM0MzwvYT4KK0NsYXNzRmlsZVJlYWRlci5nZXRFbmNsb3NpbmdUeXBlTmFtZSgpIHNob3VsZCByZXR1cm4gbnVsbCBmb3IgYW5vbnltb3VzIHR5cGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MyI+MTIzNjM8L2E+CitCZXR0ZXIgaW50ZWdyYXRpb24gb2YgdGhlIGJhdGNoIGNvbXBpbGVyIHdpdGggYW50IGphdmFjIHRhc2sgb3B0aW9uIC1leHRkaXJzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjE3Ij4xNDIxNzwvYT4KK0RPTS9BU1Q6IHdyb25nIHN0YXJ0IHBvc2l0aW9uIGZvciBleHByZXNzaW9uIHN0YXRlbWVudCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEwNiI+MTQxMDY8L2E+CitEZWNsYXJhdGlvbnMgaW4gSGllcmFyY2h5IGRvZXMgbm90IGZpbmQgZGVjbGFyYXRpb25zIGluIGhpZXJhcmNoeSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNjAiPjEzMDYwPC9hPiAKK1R5cGUgaGllcmFyY2h5IG9uIHJlZ2lvbiBwb3B1bGF0ZXMgSmF2YSBNb2RlbCBjYWNoZSBmb3IgdHlwZXMgaW4gdGhlIHJlZ2lvbiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTciPjE0MTE3PC9hPgorTlBFIGltcG9ydGluZyBiaW5hcnkgcHJvamVjdHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE3MiI+MTQxNzI8L2E+CitCdWlsZGVyIGlzIHNldHRpbmcgc291cmNlIHJlc291cmNlcyBhcyBkZXJpdmVkIQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjYiPjMyNjY8L2E+CitDaGFuZ2luZyBraW5kIG9mIGNsYXNzcGF0aCBlbnRyeSByZXBvcnRzIDEgZGVsdGEgKDFHRFRSVFApICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMSI+MTMyMzE8L2E+CitRdWljayBGaXg6IHdyb25nIHByb3Bvc2FsIAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE0MSI+MTQxNDE8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBkdXJpbmcgc2VhcmNoICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgzMSI+MTM4MzE8L2E+CitOUEUgaW4gUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjkxNCI+MTI5MTQ8L2E+CitDb21waWxlciBjYW5ub3QgcmVzb2x2ZSBqYXZheC5uZXQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk2NCI+MTM5NjQ8L2E+CitFeGNlcHRpb24gb24gc3RhcnR1cAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTk4Ij4xNDE5ODwvYT4KK0FTVDogQ2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCkgaXMgbnVsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTM5Ij4xMzkzOTwvYT4KK0RCQ1M6IG5vIGVycm9yIG1lc3NhZ2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgaW4gamF2YSBzb3VyY2UgCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDE4IC0gMTh0aCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yNDFhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+CisJPGxpPkNoYW5naW5nIHRoZSBzb3VyY2UgYXR0YWNoZW1lbnQgb2YgYSBqYXIgd2lsbCBub3cgY29ycmVjdGx5IGZpcmUgc291cmNlCisJCWF0dGFjaG1lbnQgamF2YSBkZWx0YXMuIFRoZSBmbGFncyBvZiB0aGVzZSBkZWx0YXMgYXJlOgorCQk8dWw+CisJCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VBVFRBQ0hFRDwvY29kZT4gaWYgYSBzb3VyY2UKKwkJCQloYXMgYmVlbiBhdHRhY2hlZCB0byBhIGphciBhbmQgbm8gc291cmNlIHByZXZpb3VzbHkgZXhpc3RlZC4KKwkJCTwvbGk+CisJCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9TT1VSQ0VERVRBQ0hFRDwvY29kZT4gaWYgYSBzb3VyY2UKKwkJCQloYXMgYmVlbiBkZXRhY2hlZCBmcm9tIGEgamFyIGFuZCBubyBvdGhlciBzb3VyY2UgaGFzIGJlZW4gYXR0YWNoZWQuCisJCQk8L2xpPgorCQkJPGxpPjxjb2RlPklKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFREVUQUNIRUQgfCBKYXZhRWxlbWVudERlbHRhLkZfU09VUkNFQVRUQUNIRUQ8L2NvZGU+IAorCQkJCWlmIGFuIGF0dGFjaGVkIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorCQkJPC9saT4KKwkJPC91bD4KKwk8L2xpPgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDIzIj4xNDAyMzwvYT4KK05QRSBpbiBidWlsZCBub3RpZmllcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTE1Ij4xNDExNTwvYT4KK0NoYW5naW5nIHNvdXJjZSBhdHRhY2htZW50IHNob3VsZCBub3QgZmlyZSBhIEZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCBkZWx0YSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwNTUiPjE0MDU1PC9hPgorTlBFIGluIEphdmFNb2RlbE1hbmFnZXIuZ2V0VmFyaWFibGVBc1hNTFN0cmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDA3Ij4xNDAwNzwvYT4KK1N0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlIGRvZXMgbm90IGRvIFVuaWNvZGUgZXNjYXBpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMTMiPjE0MDEzPC9hPgorQ29tcGlsZXIgc2hvdWxkIG5vdCBjb25zaWRlciAndGhpcy5DT05TVCcgYXMgY29uc3RhbnQgZXhwcmVzc2lvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDA4Ij4xNDAwODwvYT4KK1ZhcmlhYmxlQmluZGluZy5nZXRWYXJpYWJsZUlkIGNvbnRhaW5zIHN1c3BpY2lvdXMgY29kZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk4OSI+MTM5ODkgPC9hPgorUGFja2FnZSB2aWV3IGRvZXNuJ3QgcmVmcmVzaCBhZnRlciBKUkUgc3dpdGNoaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1ODgiPjEyNTg4PC9hPgorR29vZCBtYXRjaCBtYXJrZWQgYXMgcG90ZW50aWFsICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzE0MyI+MTMxNDM8L2E+CitCaW5hcnkgY29uc3RydWN0b3Igc2VhcmNoIGRvZXMgbm90IHdvcmsgKHJlZiAmIGRlY2wpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgwNyI+MTM4MDc8L2E+CitudWxsIGJpbmRpbmcgcmV0dXJuZWQgZm9yIGZ1bGx5IHF1YWxpZmllZCBhcnJheSBkZWNsYXJhdGlvbgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDEwMyI+MTQxMDM8L2E+CitUb28gbWFueSBkZXBlbmRlbnRzIGZvdW5kIHdoZW4gaW5jcmVtZW50YWxseSByZWNvbXBpbGluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQzODQiPjQzODQ8L2E+CitTZXR0aW5nIGNsYXNzcGF0aCB2YXJpYWJsZXMgZG9lcyB0d28gYnVpbGRzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjg1Ij4zMjg1PC9hPgorV2h5IGRvZXMgY2hhbmdlIHRoZSBzb3VyY2UgYXR0YWNobWVudCB0cmlnZ2VyIGEgYnVpbGQgKDFHRUhYVzMpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzkwNiI+MTM5MDY8L2E+CitDb21waWxlciBkaWQgbm90IGRldGVjdCB1bmNhdWdodCBleGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDAxOSI+MTQwMTk8L2E+CitOUEUgd2l0aCBjb2RlIGFzc2lzdCB3b3JraW5nIGluIGFuIGFub255bW91cyBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNjMiPjkyNjM8L2E+CitDb2RlIGFzc2lzdCBjYW4ndCBzZWUgb3RoZXIgcHJvamVjdCdzIGNsYXNzIGZvbGRlcnMgIAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDE2IC0gMTZ0aCBBcHJpbCAyMDAyIC0gTUlMRVNUT05FIDUKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjQwCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IENoYW5nZWQgdGhlIHBhY2thZ2UgZnJhZ21lbnQgY2FjaGluZyBwb2xpY3kgc28gYXMgdG8gYWNjb21vZGF0ZSBsYXJnZSB3b3Jrc3BhY2VzLiBJdCB1c2VkIHRvIGJlIGFuIG92ZXJmbG93aW5nIExSVSBjYWNoZSBvZiBzaXplIDEwMDAKK3BhY2thZ2UgZnJhZ21lbnRzLiBJdCBub3cgaXMgYSBzaW1wbGUgdGFibGUsIHdoaWNoIGlzIG5ldmVyIGVtcHRpZWQgaW1wbGljaXRseSBhbnkgbG9uZ2VyLiBNZW1vcnkgb3ZlcmhlYWQgbG9va3MgbmVnbGlnZWFibGUsIGFuZCBpdCBhbGxvd3MgdG8KK2RlYWwgbXVjaCBiZXR0ZXIgd2l0aCB2ZXJ5IGxhcmdlIHdvcmtzcGFjZXMuIE90aGVyIHNpbWlsYXIgaW1wcm92ZW1lbnRzIHdlcmUgbWFkZSBvbiB0aGUgc2FtZSBmcm9udCBzbyBhcyB0byBpbXByb3ZlIEpSRSBzd2l0Y2hpbmcgd2l0aCBzdWNoCit3b3Jrc3BhY2VzLgorCis8L2xpPgorPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50IGdvdCBhZGRlZCBub3Rpb24gb2YgdHlwZSAoc2ltaWxhciB0byBJUmVzb3VyY2VDaGFuZ2VFdmVudCksIHNvIGFzIHRvIGJldHRlcgorYWxsb3cgY2xpZW50cyB0byByZWFjdCB0byBKYXZhTW9kZWwgY2hhbmdlczogCisJPHVsPiAKKwkJPGxpPiBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIDogIAorPHByZT4KKwkvKioKKwkgKiBFdmVudCB0eXBlIGNvbnN0YW50IChiaXQgbWFzaykgaW5kaWNhdGluZyBhbiBhZnRlci10aGUtZmFjdCAKKwkgKiByZXBvcnQgb2YgY3JlYXRpb25zLCBkZWxldGlvbnMsIGFuZCBtb2RpZmljYXRpb25zCisJICogdG8gb25lIG9yIG1vcmUgSmF2YSBlbGVtZW50KHMpIGV4cHJlc3NlZCBhcyBhIGhpZXJhcmNoaWNhbAorCSAqIGphdmEgZWxlbWVudCBkZWx0YSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXREZWx0YTwvY29kZT4uCisJICoKKwkgKiBOb3RlOiB0aGlzIG5vdGlmaWNhdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBjb3JyZXNwb25kaW5nIFBPU1RfQ0hBTkdFCisJICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiwgYW5kIGNvbnRhaW5zIGEgZnVsbCBkZWx0YSBhY2NvdW50aW5nIGZvcgorCSAqIGFueSBKYXZhTW9kZWwgb3BlcmF0aW9uICBhbmQvb3IgcmVzb3VyY2UgY2hhbmdlLgorCSAqCisJICogQHNlZSBJSmF2YUVsZW1lbnREZWx0YQorCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlRXZlbnQKKwkgKiBAc2VlICNnZXREZWx0YQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX0NIQU5HRSA9IDE7Cis8L3ByZT4KKwkJPC9saT4KKworCQk8bGk+IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUFJFX0FVVE9fQlVJTEQgCis8cHJlPgorCS8qKgorCSAqIEV2ZW50IHR5cGUgY29uc3RhbnQgKGJpdCBtYXNrKSBpbmRpY2F0aW5nIGFuIGFmdGVyLXRoZS1mYWN0IAorCSAqIHJlcG9ydCBvZiBjcmVhdGlvbnMsIGRlbGV0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMKKwkgKiB0byBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnQocykgZXhwcmVzc2VkIGFzIGEgaGllcmFyY2hpY2FsCisJICogamF2YSBlbGVtZW50IGRlbHRhIGFzIHJldHVybmVkIGJ5IDxjb2RlPmdldERlbHRhPC9jb2RlPi4KKwkgKgorCSAqIE5vdGU6IHRoaXMgbm90aWZpY2F0aW9uIG9jY3VycyBkdXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgUFJFX0FVVE9fQlVJTEQKKwkgKiByZXNvdXJjZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLiBUaGUgZGVsdGEgd2hpY2ggaXMgbm90aWZpZWQgaGVyZSBvbmx5IGNvbnRhaW5zCisJICogaW5mb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIEphdmFNb2RlbCBvcGVyYXRpb25zIChpLmUuIGlnbm9yZXMgdGhlCisJICogcG9zc2libGUgcmVzb3VyY2VzIHdoaWNoIGhhdmUgY2hhbmdlZCBvdXRzaWRlIEphdmEgb3BlcmF0aW9ucykuIEluCisJICogcGFydGljdWxhciwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgSmF2YU1vZGVsIGJlIGluY29uc2lzdGVudCB3aXRoIHJlc3BlY3QgdG8KKwkgKiByZXNvdXJjZXMgd2hpY2ggZ290IG1vZGlmaWVkIG91dHNpZGUgSmF2YU1vZGVsIG9wZXJhdGlvbnMgKGl0IHdpbGwgb25seSBiZQorCSAqIGZ1bGx5IGNvbnNpc3RlbnQgb25jZSB0aGUgUE9TVF9DSEFOR0Ugbm90aWZpY2F0aW9uIGhhcyBvY2N1cmVkKS4KKwkgKiAKKwkgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisJICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VFdmVudAorCSAqIEBzZWUgI2dldERlbHRhCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9BVVRPX0JVSUxEID0gMjsKKzwvcHJlPgorCQk8L2xpPgorCisJCTxsaT4gRWxlbWVudENoYW5nZWRFdmVudC5SRUNPTkNJTEUgCis8cHJlPgorCS8qKgorCSAqIEV2ZW50IHR5cGUgY29uc3RhbnQgKGJpdCBtYXNrKSBpbmRpY2F0aW5nIGFuIGFmdGVyLXRoZS1mYWN0IAorCSAqIHJlcG9ydCBvZiBjcmVhdGlvbnMsIGRlbGV0aW9ucywgYW5kIG1vZGlmaWNhdGlvbnMKKwkgKiB0byBvbmUgb3IgbW9yZSBKYXZhIGVsZW1lbnQocykgZXhwcmVzc2VkIGFzIGEgaGllcmFyY2hpY2FsCisJICogamF2YSBlbGVtZW50IGRlbHRhIGFzIHJldHVybmVkIGJ5IDxjb2RlPmdldERlbHRhPC9jb2RlPi4KKwkgKgorCSAqIE5vdGU6IHRoaXMgbm90aWZpY2F0aW9uIG9jY3VycyBhcyBhIHJlc3VsdCBvZiBhIHdvcmtpbmcgY29weSByZWNvbmNpbGUKKwkgKiBvcGVyYXRpb24uCisJICoKKwkgKiBAc2VlIElKYXZhRWxlbWVudERlbHRhCisJICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VFdmVudAorCSAqIEBzZWUgI2dldERlbHRhCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVDT05DSUxFID0gNDsJCis8L3ByZT4KKwkJPC9saT4KKwk8L3VsPgorPC9saT4JCis8bGk+CQorCUFsc28gYWRkZWQgYSBjb3JyZXNwb25kaW5nIEFQSSBvbiBKYXZhQ29yZSBzbyBhcyB0byBhbGxvdyByZWdpc3RlcmluZyBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIHR5cGUgb2YgZXZlbnQuCisJPHByZT4KKwkvKioKKwkgKiBBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzLgorCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KKwkgKiBBZnRlciBjb21wbGV0aW9uIG9mIHRoaXMgbWV0aG9kLCB0aGUgZ2l2ZW4gbGlzdGVuZXIgd2lsbCBiZSByZWdpc3RlcmVkIGZvciBleGFjdGx5IHRoZQorCSAqIHRoZSBzcGVjaWZpZWQgZXZlbnRzLiAgSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmb3Igb3RoZXIgZXZlbnRzLCB0aGV5CisJICogd2lsbCBiZSBkZXJlZ2lzdGVyZWQuICAKKwkgKgorCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvCisJICogamF2YSBlbGVtZW50cyBpbiB0aGUgbW9kZWwuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZSAKKwkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlcGxhY2VkIG9yIHJlbW92ZWQuIAorCSAqIAorCSAqIExpc3RlbmVycyBjYW4gbGlzdGVuIGZvciBzZXZlcmFsIHR5cGVzIG9mIGV2ZW50IGFzIGRlZmluZWQgaW4gPGNvZGU+RWxlbWVudENoYW5nZUV2ZW50PC9jb2RlPi4KKwkgKiBDbGllbnRzIGFyZSBmcmVlIHRvIHJlZ2lzdGVyIGZvciBhbnkgbnVtYmVyIG9mIGV2ZW50IHR5cGVzIGhvd2V2ZXIgaWYgdGhleSByZWdpc3RlcgorCSAqIGZvciBtb3JlIHRoYW4gb25lLCBpdCBpcyB0aGVpciByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhleSBjb3JyZWN0bHkgaGFuZGxlIHRoZQorCSAqIGNhc2Ugd2hlcmUgdGhlIHNhbWUgamF2YSBlbGVtZW50IGNoYW5nZSBzaG93cyB1cCBpbiBtdWx0aXBsZSBub3RpZmljYXRpb25zLiAgCisJICogQ2xpZW50cyBhcmUgZ3VhcmFudGVlZCB0byByZWNlaXZlIG9ubHkgdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhleSBhcmUgcmVnaXN0ZXJlZC4KKwkgKgorCSAqIAorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKKwkgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBiaXQtd2lzZSBPUiBvZiBhbGwgZXZlbnQgdHlwZXMgb2YgaW50ZXJlc3QgdG8gdGhlIGxpc3RlbmVyCisJICogQHNlZSBJRWxlbWVudENoYW5nZUxpc3RlbmVyCisJICogQHNlZSBFbGVtZW50Q2hhbmdlRXZlbnQKKwkgKiBAc2VlICNyZW1vdmVFbGVtZW50Q2hhbmdlTGlzdGVuZXIKKwkgKglAc2luY2UgMi4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spCisJPC9wcmU+CisKKzwvbGk+CQorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzUzIj4xMjM1MzwvYT4KK0RvY3VtZW50QWRhcHRlciBjYW4gbmV2ZXIgYmUgY2xvc2VkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTYyOCI+OTYyODwvYT4KK1N3aXRjaGluZyBKUkUgaXMgc2xvdworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTg1Ij4xMTU4NTwvYT4KK0xhcmdlICMgb2YgcHJvamVjdHMgbG9jayBlc3NlbnRpYWwgb3BlcmF0aW9ucyBpbiB0aGUgV29ya3NwYWNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMzOTMiPjEzMzkzPC9hPgorRXh0cmVtZWx5IHBvb3IgamF2YSBlZGl0b3IgcGVyZm9ybWFuY2UgaW4gMjAwMjA0MHgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMyI+MTMyMzM8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gZXZhbHVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYyNSI+MTM2MjU8L2E+CitSZW1vdmUgZGVwcmVjYXRlZCBtZXRob2QgZnJvbSBBU1QvRE9NIAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzU5MyI+MTM1OTM8L2E+CitDb2RlIEZvcm1hdHRlciBmb3JtYXRzIHN5bmNocm9uaXplZCBpbmNvcnJlY3RseS4gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MjEiPjEyOTIxPC9hPgorQnVpbGQgc29tZXRpbWVzIGJ1aWxkcyBmaWxlcyB0aGF0IGhhdmUgbm90IGNoYW5nZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzUyMiI+MTM1MjI8L2E+CitOUEUgb24gYW5vbnltb3VzIGNsYXNzIGNvZGUgYXNzaXN0LgorCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTEgLSAxMXRoIEFwcmlsIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzOQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIGEgZmlyc3QgcHJvcG9zYWwgZm9yIC5jbGFzcyBmaWxlIHJlYWRpbmcgQVBJcy4gVGhpcyBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1pZ2h0IGNoYW5nZSBzbGlnaHRseS4KK1NlZSBuZXcgQVBJIGluIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuCis8dWw+Cis8bGk+Qnl0ZUNvZGVWaXNpdG9yQWRhcHRlcjwvbGk+Cis8bGk+Q2xhc3NGb3JtYXRFeGNlcHRpb248L2xpPgorPGxpPkRlY29kaW5nRmxhZzwvbGk+Cis8bGk+SUF0dHJpYnV0ZU5hbWVzQ29uc3RhbnRzPC9saT4KKzxsaT5JQnl0ZWNvZGVWaXNpdG9yPC9saT4KKzxsaT5JQ2xhc3NGaWxlQXR0cmlidXRlPC9saT4KKzxsaT5JQ2xhc3NGaWxlRGlzYXNzZW1ibGVyIGFuZCBUb29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q2xhc3NGaWxlRGlzYXNzZW1ibGVyPC9saT4gCis8bGk+SUNsYXNzRmlsZVJlYWRlcjwvbGk+Cis8bGk+SUNvZGVBdHRyaWJ1dGU8L2xpPgorPGxpPklDb25zdGFudFBvb2w8L2xpPgorPGxpPklDb25zdGFudFBvb2xDb25zdGFudDwvbGk+Cis8bGk+SUNvbnN0YW50UG9vbEVudHJ5PC9saT4KKzxsaT5JQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZTwvbGk+Cis8bGk+SUV4Y2VwdGlvbkF0dHJpYnV0ZTwvbGk+Cis8bGk+SUV4Y2VwdGlvblRhYmxlRW50cnk8L2xpPgorPGxpPklGaWVsZEluZm88L2xpPgorPGxpPklJbm5lckNsYXNzZXNBdHRyaWJ1dGU8L2xpPgorPGxpPklJbm5lckNsYXNzZXNBdHRyaWJ1dGVFbnRyeTwvbGk+Cis8bGk+SUxpbmVOdW1iZXJBdHRyaWJ1dGU8L2xpPgorPGxpPklMb2NhbFZhcmlhYmxlQXR0cmlidXRlPC9saT4KKzxsaT5JTG9jYWxWYXJpYWJsZVRhYmxlRW50cnk8L2xpPgorPGxpPklNZXRob2RJbmZvPC9saT4KKzxsaT5JTW9kaWZpZXJDb25zdGFudHM8L2xpPgorPGxpPklPcGNvZGVNbmVtb25pY3M8L2xpPgorPGxpPklTb3VyY2VBdHRyaWJ1dGU8L2xpPgorPGxpPk9wY29kZVN0cmluZ1ZhbHVlczwvbGk+Cis8L3VsPgorVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLiBBbnkgY29tbWVudCBpcyB3ZWxjb21lIGFuZCByZWxhdGVkIGJ1Z3MgCitzaG91bGQgYmUgZW50ZXJlZCBpbiBKRFQvQ29yZS4KKzxsaT5BZGRlZCBjaGFyIGFycmF5IGJhc2VkIEFQSXMgb24gU2lnbmF0dXJlLiBUaGlzIEFQSXMgYXZvaWQgY3JlYXRpbmcgbmVlZGxlc3MgU3RyaW5ncyBhbmQKKwlhcmUgdGh1cyBtdWNoIG1vcmUgcGVyZm9ybWFudCB0aGFuIHRoZWlyIFN0cmluZyBiYXNlZCBlcXVpdmFsZW50LgorCTx1bD4KKwkJPGxpPjxjb2RlPmNyZWF0ZUFycmF5U2lnbmF0dXJlKGNoYXJbXSwgaW50IGFycmF5Q291bnQpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5jcmVhdGVDaGFyQXJyYXlUeXBlU2lnbmF0dXJlKGNoYXJbXSwgYm9vbGVhbik8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmNyZWF0ZU1ldGhvZFNpZ25hdHVyZShjaGFyW11bXSwgY2hhcltdKSA8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmdldEFycmF5Q291bnQoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0RWxlbWVudFR5cGUoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UGFyYW1ldGVyQ291bnQoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UGFyYW1ldGVyVHlwZXMoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0UXVhbGlmaWVyKGNoYXJbXSk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPmdldFJldHVyblR5cGUoY2hhcltdKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+Z2V0U2ltcGxlTmFtZShjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5nZXRTaW1wbGVOYW1lcyhjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b0NoYXJBcnJheShjaGFyW10sIGNoYXJbXSwgY2hhcltdW10sIGJvb2xlYW4sIGJvb2xlYW4pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b0NoYXJBcnJheShjaGFyW10pPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT50b1F1YWxpZmllZE5hbWUoY2hhcltdW10pPC9jb2RlPjwvbGk+CisJPC91bD4KKzwvbGk+Cis8bGk+UmVtb3ZlZCB0ZW1wb3JhcnkgMi4wIEFQSSB3aGljaCB3ZXJlIGRlcHJlY2F0ZWQgaW4gcHJldmlvdXMgYnVpbGRzOgorCTx1bD4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNnZXRTaGFyZWRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSk8L2NvZGU+LCB1c2UgQVBJIHdpdGggZXh0cmEgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNnZXRXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yLCBJQnVmZmVyRmFjdG9yeSk8L2NvZGU+LCB1c2UgQVBJIHdpdGggZXh0cmEgPGNvZGU+SVByb2JsZW1SZXF1ZXN0b3I8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weSNyZWNvbmNpbGUoSVByb2JsZW1SZXF1ZXN0b3IpPC9jb2RlPiwgdXNlIEFQSSB3aXRoIG5vIDxjb2RlPklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPjwvbGk+CisJPC91bD4KKzwvbGk+CQorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzYyIj4xMjc2MjwvYT4KK1BlcmZvcm1hbmNlIC0gU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRlcm0gb2YgY2hhcltdICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY4OCI+MTI2ODg8L2E+CitOUEUgd2l0aCBjb2RlIGFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDA4Ij4xMzQwODwvYT4KK1N1YmZvbGRlcnMgb2YgYnVpbGQgZm9sZGVyIGFyZSBub3QgbWFya2VkIGFzIGRlcml2ZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM1NSI+MTMzNTU8L2E+CitOUEUgZHVyaW5nIGNvZGUgY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzkxIj4xMzM5MTwvYT4KK05QRSBkb2luZyBjb2RlIGFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDg3Ij4xMzQ4NzwvYT4KK05QRSBpbiBDb21wbGV0aW9uRW5pZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM5NSI+MTMzOTU8L2E+Citsb2FkaW5nIHN3dCtleGFtcGxlcyB3aXRoIGF1dG8tYnVpbGQgb24gY2F1c2VzIGRlYWRsb2NrIChvciB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDYzIj4xMzA2MzwvYT4KK05QRSBpbiBleHRyYWN0IG1ldGhvZCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzI0NyI+MTMyNDc8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQVNUIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMzg2Ij4xMzM4NjwvYT4KKydub3QgaW1wbGVtZW50ZWQgeWV0JyBzdXJmYWNlZCBvbiBEaXNwbGF5IGluIGRlYnVnIAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYxNyI+MTI2MTc8L2E+Citjb2RlIGFzc2lzdDogUHJvcG9zYWxzIGluc2lkZSBtZXRob2QgcGFyYW1ldGVycworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzM4Ij4xMjMzODwvYT4KK1VubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24gd2hlbiBhZGRpbmcgcGFja2FnZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI2MiI+MTIyNjI8L2E+CitDb21waWxlciBCdWcgd2l0aCBpbXBvcnQgU3RhdGVtZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MiI+NzA4MjwvYT4KK05QRSBkdXJpbmcgYnVpbGQKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQwOSAtIDl0aCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzhhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkaW5nIGEgbmV3IGVtcHR5IHNvdXJjZSBmb2xkZXIgbm8gbG9uZ2VyIGNhdXNlcyBhIGZ1bGwgYnVpbGQuIE9ubHkgYW4gaW5jcmVtZW50YWwgYnVpbGQgaXMgbmVlZGVkIG5vdy4KKzwvbGk+Cis8bGk+SmF2YSBtb2RlbCBBUEkgYWRkaXRpb25zOgorCTx1bD4KKwkJPGxpPjxjb2RlPklKYXZhRWxlbWVudC5nZXRBbmNlc3RvcihpbnQpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5JSmF2YUVsZW1lbnQuZ2V0T3BlbmFibGUoKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50LmdldFBhdGgoKTwvY29kZT48L2xpPgorCQk8bGk+PGNvZGU+SUphdmFFbGVtZW50LmdldFJlc291cmNlKCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklKYXZhUHJvamVjdC5pc09uQ2xhc3NwYXRoKElKYXZhRWxlbWVudCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklUeXBlLmZpbmRNZXRob2RzKElNZXRob2QpPC9jb2RlPjwvbGk+CisJCTxsaT48Y29kZT5JV29ya2luZ0NvcHkuZmluZEVsZW1lbnRzKElKYXZhRWxlbWVudCk8L2NvZGU+PC9saT4KKwkJPGxpPjxjb2RlPklXb3JraW5nQ29weS5maW5kUHJpbWFyeVR5cGUoKTwvY29kZT48L2xpPgorCTwvdWw+Cis8L2xpPgorPGxpPklDb21wbGV0aW9uUmVxdWVzdG9yIEFQSSBjaGFuZ2UgOgorCTx1bD4KKwkJPGxpPiBBZGRlZCAjYmVnaW5SZXBvcnRpbmcoKSBhbmQgI2VuZFJlcG9ydGluZygpIEFQSSBvbiA8Y29kZT5JUHJvYmxlbVJlcXVlc3RvcjwvY29kZT4uICNiZWdpblJlcG9ydGluZyBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSByZXN0YXJ0aW5nIGVycm9yIGRldGVjdGlvbi4gI2VuZFJlcG9ydGluZyBpcyBhbHdheXMgY2FsbGVkIGF0IHRoZQorCQkJCWVuZCBvZiBkZXRlY3Rpb24uCisJCTwvbGk+CisJCTxsaT4gQWRkZWQgQVBJIGZvciBzZXR0aW5nIG11bHRpcGxlIGNsYXNzcGF0aCB2YXJpYWJsZXMgYXQgb25jZSAoPGNvZGU+SmF2YUNvcmUjc2V0Q2xhc3NwYXRoVmFyaWFibGVzPC9jb2RlPiwgdGhpcyBhbGxvd3MgdG8gdXBkYXRlCisJCQlhbGwgYWZmZWN0ZWQgcHJvamVjdHMgZXhhY3RseSBvbmNlLCBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBtdWx0aXBsZSB0aW1lcyBvbiBlYWNoIHByb2plY3QgKGlmIGl0IHJlZmVyZW5jZXMgdGhlIHZhcmlhYmxlKS4gVGhpcyBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZQorCQkJd2hlbiBzZXR0aW5nIEpSRSB2YXJpYWJsZXMuCisJCTwvbGk+CisJCTxsaT4gQWRkZWQgYSBuZXcgcGFyYW1ldGVyIDxjb2RlPnJlbGV2YW5jZTwvY29kZT4gdG8gYmUgYWJsZSB0byBzb3J0IHByb3Bvc2FsIGJ5IGRlZ3JlZSBvZiByZWxldmFuY2UuCisJCTxjb2RlPnJlbGV2YW5jZTwvY29kZT4gaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4KKwkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlCisJCXZhbHVlIGlzIGhpZ2hlci4KKwkJPGJyPgorCQk8YnI+PHR0PklDb21wbGV0aW9uUmVxdWVzdG9yezwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRDbGFzcyguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0RXJyb3IoLi4uKTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0RmllbGQoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdEludGVyZmFjZSguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0S2V5d29yZCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TGFiZWwoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdE1ldGhvZCguLi4sIDxiPmludCByZWxldmFuY2U8L2I+KTs8L3R0PgorCQk8YnI+PHR0PiZuYnNwOyZuYnNwO3ZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD4mbmJzcDsmbmJzcDt2b2lkIGFjY2VwdE1vZGlmaWVyKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRQYWNrYWdlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRUeXBlKC4uLiwgPGI+aW50IHJlbGV2YW5jZTwvYj4pOzwvdHQ+CisJCTxicj48dHQ+Jm5ic3A7Jm5ic3A7dm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoLi4uLCA8Yj5pbnQgcmVsZXZhbmNlPC9iPik7PC90dD4KKwkJPGJyPjx0dD59PC90dD4KKwkJPGJyPgorCQk8YnI+CisJCTwvbGk+CisJCTxsaT4KKwkJSWYgdGhlIGNvbXBsZXRpb24gaWRlbnRpZmllciBhbmQgcHJvcG9zYWwgYXJlIGVxdWFsIGFuZCB0aGUgY2FzZSBtYXRjaCB0aGVuIHRoZSBwcm9wb3NhbCByZWxldmFuY2UgZ3Jvdy4gTm90ZSB0aGF0IHRoaXMgaXNuJ3QgYSAxLjAgYnJlYWtpbmcgQVBJIGNoYW5nZSwgaXQKKwkJb25seSBhZmZlY3RzIHRoZSAyLjAgbmV3IGNvZGUgYXNzaXN0IEFQSSAoaS5lLiBzdGlsbCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggMS4wIGNsaWVudHMpIHdoaWNoIGhhc24ndCB5ZXQgcmVhY2hlZCBzdGFiaWxpdHksIHRob3VnaCBpdCBzaG91bGQgYmUgY2xvc2UgdG8gbm93LgorCQk8L2xpPgorCTwvdWw+Cis8L2xpPgkKKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjYxNCI+MTI2MTQ8L2E+CitJbml0aWFsaXppbmcgSlJFIHZhcmlhYmxlcyBzbG93IG9uIHBsdWctaW4gYWN0aXZhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTg2Ij4xMjk4NjwvYT4KK0NyZWF0aW5nIGEgd29ya2luZyBjb3B5IGRvZXMgbm90IGludm9sdmUgdGhlIHByb2JsZW0gcmVxdWVzdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4NTgiPjEyODU4PC9hPgorQ29tcGlsZXIgQnVnIDogSW52YWxpZCBCeXRlIENvZGU6IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzM5Ij4xMTczOTwvYT4KK0RlYWQgYnJhbmNoZXMgaW4gcGFja2FnZS9wcm9qZWN0IEhpZXJhcmNoeSBWaWV3ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjg3MyI+MTI4NzM8L2E+CitDb2RlQXNzaXN0IDogbWlzc2luZyAgcHJvcG9zYWwgb2YgbWV0aG9kIGRlY2xhcmF0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwMDciPjEyMDA3PC9hPgorU291cmNlIGZvbGRlciBlbmRpbmcgd2l0aCAuamFyIGNvbnNpZGVyZWQgYXMgSkFSIGFyY2hpdmUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTA4Ij4xMjkwODwvYT4KK0J1aWxkIGFuZCBzYXZlIGF0dGVtcHQgZmFpbCB3aXRoIE5QRSBhbmQgdHJ5aW5nIGl0IG1hbnkgdGltZXMgY3Jhc2hzIEVjbGlwc2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjI0NiI+MTIyNDY8L2E+CitQYWNrYWdlcyB2aWV3IHNob3dzIC5jbGFzcyBhbmQgLmphdmEgZmlsZXMgd2hlbiBKQVIgaGFzIHNvdXJjZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0OSI+MzM0OTwvYT4KK05lZWQgYSBJSmF2YUVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlIHRoYXQgZG9lcyBub3QgZG8gdGhlIGV4aXN0cyB0ZXN0ICgxR0o2OUdQKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTc1Ij4xMjk3NTwvYT4KK2phY2tzIC0gcXVhbGlmaWVkIGFzc2lnbm1lbnQgdG8gZmluYWwgZmllbGQgc2hvdWxkIGJlIHJlamVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5NjkiPjEyOTY5PC9hPgoramFja3MgLSBzeW5jaHJvbml6ZWQgKHZvaWQgZXhwcmVzc2lvbikgc2hvdWxkIGJlIHJlamVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3MDUiPjEyNzA1PC9hPgorUHJvZ3Jlc3MgbW9uaXRvciBjdXRzIG9mZiBwYWNrYWdlIG5hbWUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjc2NyI+MTI3Njc8L2E+CitBU1QgTWV0aG9kQmluZGluZyBxdWVzdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzkiPjkxNzk8L2E+CitEQ1I6IE5lZWQgSUphdmFTZWFyY2hTY29wZSBlcXVhbHMgb3IgZW5jbG9zZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ0Ij4xMjQ0NDwvYT4KK3N0cmFuZ2UgdHlwZXMgbmFtZXMgaW4gUmVvcmRlclBhcmFtZXRlcnMgZXJyb3IgZGlhbG9nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzgxIj4xMjc4MTwvYT4KK0FTVCBpbnN0YW5jZW9mLUluZml4RXhwcmVzc2lvbjogQ2FudCByZXNvbHZlIHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NzgiPjEyNzc4PC9hPgorVHlwbyBpbiBjb21tZW50OiBJbmZpeEV4cHJlc3Npb24uUklHSFRfU0hJRlRfVU5TSUdORUQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjgiPjEyNzY4PC9hPgorSVNjYW5uZXIgZG9lc24ndCBsZXQgdXNlciBzdGF0ZSB3aGV0aGVyIGxpbmUgc2VwYXJhdG9ycyBhcmUgdG8gYmUgcmVjb3JkZWQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjY1MSI+MTI2NTE8L2E+CitOUEUgb3V0IG9mIHRoZSBDb21wbGV0aW9uRW5naW5lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjEiPjEyNzYxPC9hPgorQ2xvc2luZyBhIHRvcCBsZXZlbCBiaW5hcnkgdHlwZSBkb2Vzbid0IGNsb3NlIHRoZSBjbGFzcyBmaWxlcyBvZiBpdHMgaW5uZXIgdHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzYwIj4xMjc2MDwvYT4KK1R5cGUgaGllcmFyY2h5IG1pc3NpbmcgYW5vbnltb3VzIGJpbmFyeSB0eXBlIGlmIGNsb3NlZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2NzQiPjEyNjc0PC9hPgorVG9vIG1hbnkgcHJvYmxlbXMgd2hpbGUgcmVjb25jaWxpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM3MyI+MTIzNzM8L2E+CitBc3NlcnQkQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGVycm9yIHdoaWxlIHJlY29uY2lsaW5nCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMwNTkiPjEzMDU5PC9hPgoraW5jb3JyZWN0ICg/KSBjb2RlIGNvbXBpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI4ODAiPjEyODgwPC9hPgorU1FMSiBTdXBwb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2MDMiPjEyNjAzPC9hPgorQ291bGQgbm90IGRlbGV0ZSBlbXB0eSBqYXZhIGZpbGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MDAiPjk2MDA8L2E+CitGaWVsZCByZWZlcmVuY2UgaW4gd29ya2luZyBjb3B5IG5vdCBmb3VuZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5OTUiPjEyOTk1PC9hPgorVG9vbEZhY3Rvcnk6OmNyZWF0ZVNjYW5uZXIgLSBpbmNvcnJlY3QgamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTMzIj4xMjkzMzwvYT4KKyJOZXZlciB1c2VkIiB2YXJpYWJsZSB3YXJuaW5ncyBjYW4ndCBkZXRlY3QgYWNyb3NzIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTEzNSI+NTEzNTwvYT4KK09wZW4gSmF2YSBlZGl0b3Igb24gSVJlc291cmNlLmNsYXNzIGRvIGFuIGVycm9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjgwOSI+MTI4MDk8L2E+CitVbmltcGxlbWVudGVkIG1ldGhvZHMgc2hvdWxkIG5vdCBwcmV2ZW50IGNsYXNzIGZyb20gcnVubmluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQyMSI+MTA0MjE8L2E+CitXU0FEIGhhbmcgd2hpbGUgc2V0dGluZyBidWlsZHBhdGggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTkwIj4xMjU5MDwvYT4KK1JldHVybmluZyB0aGUgdHlwZSB3aGVuIGxvY2FsIHZhciBpcyBzZWxlY3RlZCBicmVha3MgcmVmYWN0b3JpbmcKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjcxMCI+MTI3MTA8L2E+CitJbmNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIHRoZSBtZXRob2QgSVR5cGUuY3JlYXRlRmllbGQoKQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDAyIC0gMm5kIEFwcmlsIDIwMDIgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzNworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkltcHJvdmVkIHNwZWNpZmljYXRpb24gb2YgPGNvZGU+SUJ1ZmZlcjwvY29kZT4gYnkgc2F5aW5nIHRoYXQ6CisJPHVsPgorCQk8bGk+IEphdmEgbW9kZWwgb3BlcmF0aW9ucyB0aGF0IG1hbmlwdWxhdGUgYW4gPGNvZGU+SUJ1ZmZlcjwvY29kZT4gKGUuZy4gCisJCQk8Y29kZT5JVHlwZS5jcmVhdGVNZXRob2QoLi4uKTwvY29kZT4pIGVuc3VyZXMgdGhhdCB0aGUgc2FtZSBsaW5lIGRlbGltaXRlciAKKwkJCShpLmUuIGVpdGhlciA8Y29kZT4iXG4iPC9jb2RlPiBvciA8Y29kZT4iXHIiPC9jb2RlPiBvciA8Y29kZT4iXHJcbiI8L2NvZGU+KSBpcyAKKwkJCXVzZWQgYWNjcm9zcyB0aGUgd2hvbGUgYnVmZmVyLiBUaHVzIHRoZXNlIG9wZXJhdGlvbnMgbWF5IGNoYW5nZSB0aGUgbGluZSBkZWxpbWl0ZXIocykgCisJCQlpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHRvIGJlIGFwcGVuZCwgb3IgcmVwbGFjZWQuCisJCQlIb3dldmVyIGltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgYXdhcmUgdGhhdCBvdGhlciBjbGllbnRzIG9mIDxjb2RlPklCdWZmZXI8L2NvZGU+CisJCQltaWdodCBub3QgZG8gc3VjaCB0cmFuc2Zvcm1hdGlvbnMgYmVmb3JlaGFuZC48L2xpPgorCQk8bGk+IDxjb2RlPmFkZEJ1ZmZlckNoYW5nZWRMaXN0ZW5lcjwvY29kZT4gYW5kIDxjb2RlPnJlbW92ZUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcjwvY29kZT4KKwkJCWhhdmUgbm8gZWZmZWN0IGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBjbG9zZWQuPC9saT4KKwkJPGxpPiBPdGhlciBvcGVyYXRpb25zIHRoYXQgbWFuaXB1bGF0ZSB0aGUgYnVmZmVyIChsaWtlIDxjb2RlPnNldENvbnRlbnQ8L2NvZGU+CisJCQltaWdodCB0aHJvdyBhIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+IGlmIGNhbGxlZCBhZnRlciB0aGUgYnVmZmVyCisJCQloYXMgYmVlbiBjbG9zZWQuPC9saT4KKwk8L3VsPgorPC9saT4KKzxsaT4gSVNjYW5uZXIgQVBJIDoKKwk8dWw+CisJCTxsaT4gYWRkZWQgPGNvZGU+SVNjYW5uZXIjZ2V0U291cmNlPC9jb2RlPiBzbyBhcyB0byByZXRyaWV2ZSB0aGUgc2Nhbm5lciBvcmlnaW5hbCBzb3VyY2UKKwkJPGxpPiByZW5hbWVkIDxjb2RlPklTY2FubmVyI3NldFNvdXJjZUJ1ZmZlcjwvY29kZT4gaW50byA8Y29kZT5JU2Nhbm5lciNzZXRTb3VyY2U8L2NvZGU+CisJPC91bD4KKzwvbGk+CQorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDU0Ij4xMjQ1NDwvYT4KK0FTVC9ET006IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBnZW5lcmF0ZWQgYnkgYmFkIHNvdXJjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDMxIj4xMjQzMTwvYT4KK1VuY2xlYXIgY29tcGlsZXIgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxNiI+MTI0MTY8L2E+CitTZXBhcmF0ZSBjYWNoaW5nIG9mIHByb2plY3QgYW5kIHBrZyBmcmFnbWVudCByb290IGZyb20gY2FjaGluZyBvZiBvcGVuYWJsZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDU3Ij4xMjQ1NzwvYT4KK05lZWQgdG8gc3luY2hyb25pemUgSm9iTWFuYWdlci5kaXNjYXJkSm9icyguLi4pICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0NSI+MTI0NDU8L2E+CitDb21waWxlciBGYWlsdXJlIG9uIHJlZmVyZW5jZSB0byBhYnN0cmFjdCBpbnRlcmZhY2UgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0MTciPjEyNDE3PC9hPgorYXBpOiBJU2Nhbm5lciwgSVRlcm1pbmFsU3ltYm9scyAtIG5vIHdheSB0byBnZXQgc29tZSB0b2tlbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxOSI+MTI0MTk8L2E+CitXZWlyZCBzZWNvbmRhcnkgZXJyb3IgaW4gY29uc3RydWN0b3IgcmVjb25jaWxpYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQxOSI+MTI0MTk8L2E+CithcGk6IElTY2FubmVyIC0gbWlzc2luZyAoPykgZ2V0U291cmNlQnVmZmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIzODAiPjEyMzgwPC9hPgorQVNUL0RPTTogcmVzb2x2ZVR5cGVCaW5kaW5nKCkgb24gdGhlIHNlY29uZCBvcGVyYW5kIG9mIGEgaW5zdGFuY2VvZiBleHByZXNzaW9uIHJldHVybiBudWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3OTAiPjk3OTA8L2E+CitBZGQgY29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzcyBpbnNlcnRzIGluIHdyb25nIHBsYWNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzg3Ij4xMjM4NzwvYT4KK091dCBPZiBNZW1vcnkgZXJyb3IgaW1wb3J0aW5nIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDIzIj4zNDIzPC9hPgorTmVlZCBJQ29uc3RhbnRzICgxR0tNNTFPKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTgzIj4xMTU4MzwvYT4KK0luZmluaXRlIGxvb3AgaW4gT3ZlcmZsb3dpbmdMUlVDYWNoZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzQ2Ij4xMjM0NjwvYT4KK0xlYWtpbmcgY2xvc2VkIGJ1ZmZlcnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQzMSI+MTE0MzE8L2E+CitTdGVwcGluZyBmcm9tIG9uZSBjYXNlIHN0YXRlbWVudCdzIGJyZWFrIGVuZHMgdXAgaW4gbmV4dCBjYXNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzI2Ij4xMjMyNjwvYT4KK0JhZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIENvbXBpbGF0aW9uVW5pdCB3aXRoIG5vIHRyYWlsaW5nIG5ld2xpbmUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzEzIj4zMzEzPC9hPgorU2V2ZXJlIC0gUGVyZm9ybWFuY2UgLSBKYXZhIE1vZGVsIHJlZHVuZGFuY2llcyAoMUdGS1RVTikgIAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDcwIj4xMjQ3MDwvYT4KKzAyMTQgLSBXYWxrYmFjayBkdXJpbmcgZW5jYXBzdWxhdGUgbWV0aG9kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxNzkiPjkxNzk8L2E+CitEQ1I6IE5lZWQgSUphdmFTZWFyY2hTY29wZSBlcXVhbHMgb3IgZW5jbG9zZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwNyI+MTAzMDc8L2E+CitDb2RlIGFzc2lzdCBmYWlsZWQgdG8gc2VhcmNoIHdob2xlIGNsYXNzIHBhdGgKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDc5Ij43MDc5PC9hPgorQ29kZSBmb3JtYXR0aW5nIGZhaWxzIHdpdGggamF2YS5sYW5nLkVycm9yIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTUiPjMyNTU8L2E+CitSZW1pbmRlciAtIHJlLWVuYWJsZSB0cmFuc2llbnQgbWFya2VyIGdlbmVyYXRpb24gZHVyaW5nIGNvZGUtYXNzaXN0ICgxR0RDWExCKQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNDI2IC0gMjZ0aCBBcHJpbCAyMDAyIAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzYKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gUmVjb25jaWxpbmcgd2l0aCBlcnJvcnMgcHJvdmlkZSB0eXBlIGVycm9ycyBpbiBhZGRpdGlvbiB0byBzeW50YXggb25lcy4gVGhpcyBpcyBzdGlsbCBleHBlcmltZW50YWwsCisJYW5kIGNhbiBiZSBkaXNhYmxlZCBieSB1bmNoZWNraW5nIHRoZSBlZGl0b3IgcHJlZmVyZW5jZSBmb3IgdHJhbnNpZW50IHByb2JsZW1zLgorPC9saT4JCis8bGk+UGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgaW5kZXggcXVlcmllcyB3aXRoIHRoZSA8Y29kZT5XYWl0VW50aWxSZWFkeTwvY29kZT4gcG9saWN5LiAKKwlUaGUgYmFja2dyb3VuZCBpbmRleGVyIG5vdyB0YWtlcyBhbGwgdGhlIENQVSB3aGVuIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGl0IHRvIAorCWZpbmlzaCBpbmRleGluZy4KKyAgICBVc2VyIHdpbGwgbm90aWNlIHRoaXMgaW1wcm92ZW1lbnQgd2hlbiBkb2luZyBhIHNlYXJjaCBvciBvcGVuaW5nIGEgdHlwZSBhbmQgdGhlcmUgYXJlIAorICAgIHN0aWxsIGZpbGVzIHRvIGluZGV4LgorPC9saT4KKzxsaT5TY2FubmVyIEFQSQorCTx1bD4KKwkJPGxpPmRlZmluZWQgc2Nhbm5lciBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjwvY29kZT4pLiA8L2xpPgorCQk8bGk+YWRkZWQgdG9vbCBmYWN0b3J5IEFQSSAoc2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5I2NyZWF0ZVNjYW5uZXI8L2NvZGU+KSwgYWxsb3dpbmcgdG8gb2J0YWluCisJCQlhIHNjYW5uZXIgKGltcGxlbWVudGluZyA8Y29kZT5JU2Nhbm5lcjwvY29kZT4gQVBJKS4gPC9saT4KKwk8L3VsPgorPC9saT4KKzxsaT4gQ29kZSBmb3JtYXR0ZXIgQVBJCisJPHVsPgorCQk8bGk+ZGVmaW5lZCBjb2RlIGZvcm1hdHRlciBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29kZUZvcm1hdHRlcjwvY29kZT4pLiA8L2xpPgorCQk8bGk+YWRkZWQgdG9vbCBmYWN0b3J5IEFQSSAoc2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5I2NyZWF0ZUNvZGVGb3JtYXR0ZXI8L2NvZGU+KSwgYWxsb3dpbmcgdG8gb2J0YWluCisJCQlhIGNvZGUgZm9ybWF0dGVyIChpbXBsZW1lbnRpbmcgPGNvZGU+SUNvZGVGb3JtYXR0ZXI8L2NvZGU+IEFQSSkuIE5vdGUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgd2FzIGFsc28gYWRkZWQKKwkJCXRvIGFsbG93IGNsaWVudCBjb2RlIHRvIGNvbnRyaWJ1dGUgYSBjb2RlIGZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbi4gVGhlIGNvZGUgZm9ybWF0dGVyIGV4dGVuc2lvbiBwb2ludCBpcyBuYW1lZAorCQkJPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlcjwvY29kZT4sIGFsc28gc2VlIGFzc29jaWF0ZSBjb21tZW50IGluIHBsdWdpbi54bWwuPC9saT4KKwkJPGxpPmFkZGVkIHRvb2wgZmFjdG9yeSBBUEkgKHNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeSNjcmVhdGVEZWZhdWx0Q29kZUZvcm1hdHRlcjwvY29kZT4pLCBhbGxvd2luZyB0byBvYnRhaW4KKwkJCWEgZGVmYXVsdCBjb2RlIGZvcm1hdHRlciAoaW1wbGVtZW50aW5nIDxjb2RlPklDb2RlRm9ybWF0dGVyPC9jb2RlPiBBUEkpLiA8L2xpPgorCTwvdWw+Cis8L2xpPgorPGxpPiBXb3JraW5nIENvcHkgQVBJIDogaW5zdGVhZCBvZiBwYXNzaW5nIGEgcHJvYmxlbSByZXF1ZXN0b3IgKDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yPC9jb2RlPikgdG8gd29ya2luZyBjb3B5ICNyZWNvbmNpbGUoLi4uKQorb3BlcmF0aW9uLiBUaGUgcHJvYmxlbSByZXF1ZXN0b3IgaXMgcGFzc2VkIGFsb25nIGF0IGNyZWF0aW9uIHRpbWUuIAorCTx1bD4KKwk8bGk+YWRkZWQgSVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5LCBJUHJvYmxlbVJlcXVlc3Rvcik8L2xpPgorCTxsaT5hZGRlZCBJV29ya2luZ0NvcHkuZ2V0U2hhcmVkV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnksIElQcm9ibGVtUmVxdWVzdG9yKTwvbGk+CisJPC91bD4KKwlQcmV2aW91cyBBUEkgdGFraW5nIDxjb2RlPklCdWZmZXJGYWN0b3J5PC9jb2RlPiBnb3QgZGVwcmVjYXRlZCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IGJ1aWxkLgorPC9saT4JCis8bGk+U29tZSBpbnRlcm5hbCBjbGFzc2VzIGdvdCBkZXByZWNhdGVkIChhcyBjbGllbnQgY29kZSByZWxpZXMgb24gdGhlbSksIHNpbmNlIGJlaW5nIHN1cmZhY2VkOgorCTx1bD4KKwkJPGxpPiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuSW52YWxpZElucHV0RXhjZXB0aW9uPC9jb2RlPiA8YnI+PT0+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gPC9saT4KKwkJPGxpPiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5wYXJzZXIuVGVybWluYWxTeW1ib2xzPC9jb2RlPiA8YnI+PT0+IDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM8L2NvZGU+IDwvbGk+CisJPC91bD4KKwlUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIHN1YnNlcXVlbnQgYnVpbGQuCis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MyI+MzM1MzwvYT4KK0FQSSAtIFNob3VsZCBwcm92aWRlIGFwaSBmb3IgZm9ybWF0dGluZyBzb3VyY2UgKDFHSklXQ0YpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3OSI+MzE3OTwvYT4KK0NvbXBpbGVyIC0gTEYgY2Fubm90IHJ1biBjbGFzc2VzIHRoYXQgbWlzcyBpbXBsZW1lbnRhdGlvbnMgb2YgYW4gaW50ZXJmYWNlICgxRk5GVlk4KSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE5OSI+MTIxOTk8L2E+CitHZW5lcmF0ZWQgY2xhc3NmaWxlcyBzaG91bGQgYmUgdGFnZ2VkIGFzIGRlcml2ZWQgcmVzb3VyY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NDAiPjExNjQwPC9hPgorQnVnIGluIHRoZSBjb2RlIGZvcm1hdHRlciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU0NCI+MTA1NDQ8L2E+CitJbnRlcm5hbCBlcnJvciBjcmVhdGluZyBsb25nIHBhY2thZ2UgbmFtZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjE0MCI+MTIxNDA8L2E+Cit0eXBvIGluIElQYWNrYWdlRnJhZ21lbnRSb290OjpjcmVhdGVQYWNrYWdlRnJhZ21lbnQgamF2YWRvYyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQyMiI+MTE0MjI8L2E+CitBdHRhY2hpbmcgc291cmNlIHdoZW4gdXNpbmcgdmFyaWFibGVzIHRvIHBvaW50IHRvIGphcnMgdmVyeSB1bmludHVpdGl2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDAwIj4xMjAwMDwvYT4KK01haW4uY29tcGlsZSBkb2VzIG5vdCBjbG9zZSBsb2cgZmlsZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTU4Ij42NTU4PC9hPgorTWlzc2luZyBjbGFzcyBwYXRoIGVudHJpZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhbiBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTQiPjMzNTQ8L2E+CitBUEkgLSBzaG91bGQgcHJvdmlkZSBhcGkgZm9yIFNjYW5uaW5nICgxR0pJV0NUKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc0OTYiPjc0OTY8L2E+CitJbnRlcmZhY2Ugc2hvd3MgYXMgY2xhc3MgdW5kZXIgY29udGVudCBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ3NSI+MTE0NzU8L2E+CitDb2RlIHJlc29sdmUgcmVwb3J0cyB0eXBlcyBpbiBzZWN1cml0eSBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4OTkiPjEwODk5PC9hPgorQ2FuJ3Qgb3BlbiBvbiBzZWxlY3Rpb24gZm9yIG1lbWJlciB0eXBlIGluIGJpbmFyeSBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDEzIj4xMjAxMzwvYT4KK0phdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlIGZhaWxzIG9uIGVtcHR5IHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODQ1Ij4xMTg0NTwvYT4KK0ludGVybmFsIENvbXBpbGVyIEVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MjIiPjExOTIyPC9hPgoraXMgdGhpcyBjb2RlIHJlYWNoYWJsZSBvciBub3Q/CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMTkiPjEyMTE5PC9hPgorRWNsaXBzZSBidWlsZCBzbG93IG9uIG5ldHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODgxIj43ODgxPC9hPgorSVR5cGUubW92ZSgpIGNsb2JiZXJzIGVkaXRpbmcgYnVmZmVyIG9mIGRlc3RpbmF0aW9uIGVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDcwMyI+MTA3MDM8L2E+Cithc3Q6IG5vIEFQSSB0byBmaWd1cmUgb3V0IHRoZSBzb3VyY2UgcmFuZ2Ugb2YgJ3N1cGVyJyBrZXl3b3JkcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTgzIj4xMDk4MzwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGluIEphdmFCdWlsZGVyIGR1cmluZyBTYXZlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1NSI+MzM1NTwvYT4KK0FQSSAtIHNob3VsZCBwcm92aWRlIEFQSSBmb3Igc291cmNlIGVsZW1lbnQgcGFyc2luZyAoMUdKSVdEOCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk1NSI+MTA5NTU8L2E+CitEQ1IgLSBzZWFyY2g6IHRvbyBsaW1pdGluZyBhcGkgb2YgSUphdmFTZWFyY2hTY29wZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgxOSI+ODgxOTwvYT4KK1NlbGYgaG9zdGluZyB0b29sIGRvZXNuJ3QgdXBkYXRlIHNlYXJjaCBpbmRleAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDk3Ij4xMTQ5NzwvYT4KK1JlbmFtaW5nIHByb2plY3QgZmFpbGVkIHdpdGggSmF2YSBNb2RlbCBFeGNlcHRpb246IEphdmEgTW9kZWwgU3RhdHVzIFtOYW1lIGNvbGxpc2lvbi5dCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTIwNTkiPjEyMDU5PC9hPgorYXBpOiBKYXZhQ29yZTo6Z2V0T3B0aW9ucyBzaG91bGQgcmV0dXJuIE1hcCwgbm90IEhhc2h0YWJsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMDQ0Ij4xMjA0NDwvYT4KK1NlYXJjaCBmb3IgZmllbGQgcmVmZXJlbmNlIGJyb2tlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA1Ij4xMTkwNTwvYT4KK0RDUiAtIHByb3ZpZGUgc2Nhbm5pbmcgQVBJCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMjEgLSAyMXN0IE1hcmNoIDIwMDIgLSBNSUxFU1RPTkUgNAorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzVhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAxNCI+MTIwMTQ8L2E+CitObyBkZWx0YSB3aGVuIGFkZGluZyBwYWNrYWdlIHdoZXJlIHNyYz1iaW4gYW5kIHNyYyE9cHJvaiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3NTUiPjExNzU1PC9hPgorcmVzb3VyY2UgY29weSBmaWx0ZXIgYW5kIGR1cGxpY2F0ZWQgcmVzb3VyY2UgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY0MCI+MTE2NDA8L2E+CitCdWcgaW4gdGhlIGNvZGUgZm9ybWF0dGVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4NjAiPjExODYwPC9hPgorQ2Fubm90IG1vdmUgYSBjb21waWxhdGlvbiB1bml0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MjciPjExNjI3PC9hPgorUmVmYWN0b3Jpbmc6IENDRSBpbiBQdWxsdXAgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzUiPjExNzM1PC9hPgorTlBFIHNlbGVjdGluZyBGMyBpbiBlZGl0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTg1NCI+MTE4NTQ8L2E+CitOUEUgb24gc2F2ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODA1Ij4xMTgwNTwvYT4KK2J1aWxkIG91dHB1dCBmaWx0ZXIgaXMgaWdub3JlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTY4Ij4xMTU2ODwvYT4KK0NvZGUgcmVzb2x2ZSBkb2VzIG5vdCB3b3JrIGZvciBjaGFuZ2VkIGNvbnN0cnVjdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTYiPjExNjU2PC9hPgorUGxlYXNlIGFkZCBhIElDb21wbGV0aW9uUmVxdWVzdG9yQWRhcHRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyNzEiPjkyNzE8L2E+CitOUEUgaW5zcGVjdGluZyAibnVsbCIgaW4gdGhlIGV4cHJlc3Npb25zIHZpZXcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MzgiPjExNjM4PC9hPgorYXN0OiBDb21waWxhdGlvblVuaXQ6OmZpbmREZWNsYXJpbmdOb2RlIGZhaWxzIAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTI3MiI+MTEyNzI8L2E+CitzbG93IGNvbnRleHQgYXNzaXN0IG9uIG1ldGhvZC9maWVsZC1yaWNoIGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM0MCI+MTEzNDA8L2E+CitvcGVuIG9uIHNlbGVjdGlvbiBkb2VzIG5vdCB3b3JrIGZvciBiaW5hcnkgdHlwZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1NCI+MTE2NTQ8L2E+CitOUEUgZHVyaW5nIGJ1aWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTkiPjExNjU5PC9hPgorYXN0OiBDb21waWxhdGlvblVuaXQ6OmZpbmREZWNsYXJpbmdOb2RlIGZhaWxzICMyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDg2Ij4xMTA4NjwvYT4KK0NsYXNzRmlsZUNvbXBpbGF0aW9uVW5pdCBzaG91bGQgaW1wbGVtZW50IElDbGFzc0ZpbGUKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDMxOSAtIDE5dGggTWFyY2ggMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gTmV3IEFQSSBvbiBJVHlwZSBmb3IgY29tcGxldGUgc25pcHBldCBpbiBjdXJyZW50IHR5cGUgY29udGV4dC4gQ29kZSBjb21wbGV0ZSBpcyBwZXJmb3JtZWQgYWdhaW5zdAorIHNvdXJjZSAoaWYgYXZhaWxhYmxlKSBvciBhZ2FpbnN0IHR5cGUgc3RydWN0dXJlCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDx0dD52b2lkIGNvZGVDb21wbGV0ZSg8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHNuaXBwZXQsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBpbnNlcnRpb24sPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBwb3NpdGlvbiw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gbG9jYWxWYXJpYWJsZU5hbWVzLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnRbXSBsb2NhbFZhcmlhYmxlTW9kaWZpZXJzLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzU3RhdGljLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247PC90dD4KKzxicj4mbmJzcDsKKzwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMTgiPjEwMzE4PC9hPgorRmVhdHVyZSBSZXF1ZXN0OiBuZXcgQ29kZSBBc3Npc3QgQVBJIHJlcXVpcmVkCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzE4IC0gMTh0aCBNYXJjaCAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzMworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBBZGRlZCBvcHRpb24gdG8gdHJhY2UgamF2YSBzZWFyY2ggYWN0aXZpdHkuCisgICAgVG8gZW5hYmxlIGl0LCBzZWUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBmaWxlOgorICAgIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaD10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+Q29ycmVjdGlvbkVuZ2luZSNjb21wdXRlQ29ycmVjdGlvbnMoSVByb2JsZW0sIElDb21waWxhdGlvblVuaXQsIElDb3JyZWN0aW9uUmVxdWVzdG9yKTwvY29kZT4sIGFsbG93aW5nLgordG8gY29tcHV0ZSByZXBsYWNlbWVudCBjb3JyZWN0aW9ucyBmb3IgSVByb2JsZW0ocykgZGV0ZWN0ZWQgd2hpbGUgcmVjb25jaWxpbmcuPC9saT4KKzxsaT5BZGRlZCBBUEkgPGNvZGU+SVNvdXJjZVJlZmVyZW5jZSNleGlzdHMoKTwvY29kZT4sIGFsbG93aW5nLgordG8gY2hlY2sgZXhpc3RlbmN5IGJlZm9yZSBpbnZva2luZyA8Y29kZT5JU291cmNlUmVmZXJlbmNlPC9jb2RlPiBiZWhhdmlvci4gQWxsIGltcGxlbWVudGF0aW9ucyBkaWQgYWxyZWFkeSBwcm92aWRlCithbiA8Y29kZT5leGlzdHMoKTwvY29kZT4gbWV0aG9kIHNpbmNlIHRoZXkgYWxzbyBhcmUgaW1wbGVtZW50aW5nIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT4uPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUyNCI+MTE1MjQ8L2E+CithcGk6IElXb3JraW5nQ29weTo6IGdldFdvcmtpbmdDb3B5KCkgamF2YWRvYworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExIj4xMTUxMTwvYT4KK0NvbXBpbGVyIDEuNCBmb29sZWQgYnkgZXh0cmEgaW50ZXJmYWNlIG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM4OSI+MTEzODk8L2E+CitVbnVzZWQgcGFyYW1ldGVycyBub3Qgc2hvd2luZyB1cCBhcyBjb21waWxlciB3YXJuaW5ncyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQxMCI+MTE0MTA8L2E+CitFeGNlcHRpb24gaW4gSmF2YSBCdWlsZGVyIHdoZW4gZGVidWcgb3B0aW9ucyB0dXJuZWQgb2ZmIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjg1Ij4xMTI4NTwvYT4KK1BvdGVudGlhbCBOUEUgaW4gQ29weVJlc291cmNlRWxlbWVudHNPcGVyYXRpb24ucHJvY2Vzc1BhY2thZ2VGcmFnbWVudFJlc291cmNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNDQwIj4xMTQ0MDwvYT4KK25wZSBpbiByZW5hbWUgdGVtcCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQ2OCI+MTE0Njg8L2E+CitOUEUgZGVsZXRpbmcgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE0MzUiPjExNDM1PC9hPgorY29tcGlsZXIgYnVnOiBvdmVyd3JpdGluZyBpbXBsaWNpdGVseSBhYnN0cmFjdCBtZXRob2QgaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNTAiPjExMjUwPC9hPgorTlBFIGluIGxvZyBhZnRlciBpbXBvcnRpbmcgcGx1Z2lucyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNzEiPjExMjcxPC9hPgorVW5hYmxlIHRvIGRlbGV0ZSBhIGJpbmFyeSBwcm9qZWN0IGluIEphdmEgcGVyc3BlY3RpdmUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjEwIj4xMTIxMDwvYT4KK1Jlc291cmNlRGVsdGFzIGFyZSBsb3N0IHdoZW4gbWVyZ2luZyBkZWx0YXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzcxIj4xMTM4MDwvYT4KK2FzdDogbWlzc2luZyBiaW5kaW5nIGZvciBDb25kaXRpb25hbEV4cHJlc3Npb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzNzEiPjExMzcxPC9hPgorRE9NL0FTVDogbm9kZSBtaXNzaW5nIGZvciBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyNDMiPjYyNDM8L2E+CithbiBJU291cmNlUmVmZXJlbmNlIEFQSSBpc3N1ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjk2Ij4xMTI5NjwvYT4KK05QRSBkdXJpbmcgYnVpbGQKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzOCI+MzQzODwvYT4KK09wZW5PblNlbGVjdGlvbiAtIHNob3VsZCBiZSBhYmxlIHRvIGxvY2F0ZSBtaXNzaW5nIG1ldGhvZCBieSBndWVzc2luZyAoMUdMMTg2UCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTQwNiI+MTE0MDY8L2E+CitBY3Rpb25QZXJmb3JtZWQoKSBtZXRob2QgaW4gQWJzdHJhY3RBY3Rpb24gbm90IGZvdW5kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjEiPjMyMjE8L2E+CitKTSAtIERlYWRsb2NrIHdoaWxlIHNhdmluZyBpbiBFZGl0b3IgKDFHQUo2N1cpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMDEiPjExMjAxPC9hPgorQ2xhc3NDYXN0RXhjZXB0aW9uIGR1cmluZyBidWlsZCBwcm9jZXNzCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMTQgLSAxNHRoIE1hcmNoIDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjMyCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+QWRkZWQgQVBJIDxjb2RlPklET01GYWN0b3J5LmNyZWF0ZUludGVyZmFjZSgpPC9jb2RlPiBhbmQgPGNvZGU+SURPTUZhY3RvcnkuY3JlYXRlQ2xhc3MoKTwvY29kZT4uCitTZWUgPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODAiPjEwOTgwPC9hPiBmb3IgZGV0YWlscy48L2xpPgorPC91bD4KKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM1NSI+MTEzNTU8L2E+CitPcGVuT25TZWxlY3Rpb24gdW5hYmxlIHRvIHBlcmZvcm0gaW4gc2luZ2xlLXR5cGUgaW1wb3J0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIzMiI+OTIzMjwvYT4KK0lDb21waWxhdGlvblVuaXQuZGVsZXRlKCkgZmFpbHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTc2Ij4xMTE3NjwvYT4KK09yZ2FuaXplIGltcG9ydHMgbWlzc2VzIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI0Ij4zMjI0PC9hPgorVGVzdHMgLSBSZS1lbmFibGUgcmVjb25jaWxlciB0ZXN0cyAoMUdBS1haTSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4MCI+MTA5ODA8L2E+CitKRFQgLyBmYWN0b3J5IGZvciBuZXcgaW50ZXJmYWNlcyB3b3VsZCBiZSBuaWNlIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTk2Ij4xMDk5NjwvYT4KK2NyZWF0ZUNvbXBpbGF0aW9uVW5pdCBkb2Vzbid0IGJlaGF2ZSBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMjUiPjExMTI1PC9hPgorRE9NL0FTVDogQVBJIHJlcXVlc3QgPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjc3Ij4xMTI3NzwvYT4KK0RpZmZlcmVuY2UgaW4gYmV0d2VlbiBvdXRsaW5lciBjb250ZW50IGFuZCB1bml0IGNvbnRlbnQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgzMyI+MTA4MzM8L2E+CitPcGVuIHR5cGUgZG9lc24ndCBwcm9wb3NlIGFsbCB0eXBlIGFmdGVyIGEgY2hlY2tvdXQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDY3Ij4xMTA2NzwvYT4KK0FkZGluZyB1c2VmdWwgdG9TdHJpbmcoKSBtZXRob2QgZm9yIGVhY2ggbmV3IERPTS9BU1Qgbm9kZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTkzMyI+OTkzMzwvYT4KK0Zvcm1hdCBkb2VzIG5vdCBoYW5kbGUgc3luY2hyb25pemVkIGtleXdvcmQgY29ycmVjdGx5IAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njc1Ij44Njc1PC9hPgorRENSIC0gQ29kZSBjb3JyZWN0aW9uIGNvdWxkIHN1Z2dlc3QgbmV3IGVsZW1lbnQgY3JlYXRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM0MSI+MTEzNDE8L2E+CitpbmNvcnJlY3Qgb3V0bGluZSAoaSBzZWUgb25seSBpbXBvcnRzKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjE3Ij4xMTIxNzwvYT4KK2lzIGRvdWJsZSAiOyAiIG9uIGEgcmV0dXJuIHN0YXRlbWVudCBhbiBlcnJvcj8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAzMSI+MTAwMzE8L2E+CitTRUYgQ2xhc3NDYXN0RXhjZXB0aW9uIAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMzEyIC0gMTJ0aCBNYXJjaCAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIzMQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDoKKyAgICAgPHVsPgorICAgICAJPGxpPiBTZWFyY2ggZG9lc24ndCBwb3B1bGF0ZSB0aGUgSmF2YSBNb2RlbCBhbnkgbG9uZ2VyLiBUaHVzIHRoZSBtZW1vcnkKKyAgICAgCSAgICB1c2VkIGJ5IGEgc2VhcmNoIG9wZXJhdGlvbiBjYW4gYmUgcmVjbGFpbWVkIGF0IHRoZSBlbmQuIDwvbGk+CisgICAgIAk8bGk+IEFjY2VzcyB0byB6aXAgYW5kIGphciBmaWxlcyBoYXMgYmVlbiBpbXByb3ZlZCwgd2hpY2ggc2hvdWxkIHJlc3VsdAorICAgICAJICAgICBpbiBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gYSBzbG93IG5ldHdvcmsuIDwvbGk+CisgICAgIDwvdWw+CisgICAgIDwvbGk+Cis8bGk+IEFkZGVkIGZsYWcgPGNvZGU+SUphdmFFbGVtZW50RGVsdGEuRl9GSU5FX0dSQUlORUQ8L2NvZGU+IHRoYXQgaW5kaWNhdGVzCisgICAgIHRoYXQgYSBmaW5lLWdyYWluZWQgZGVsdGEgd2FzIGNvbXB1dGVkIGZvciBhIGdpdmVuIGRlbHRhLgorICAgICBDbGllbnRzIGNhbiB1c2UgdGhpcyBmbGFnIHRvIGZpbmQgb3V0IGlmIGEgY29tcGlsYXRpb24gdW5pdCAKKyAgICAgdGhhdCBoYXZlIGEgPGNvZGU+Rl9DT05URU5UPC9jb2RlPiBjaGFuZ2Ugc2hvdWxkIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSAKKyAgICAgbm8gZmluZXIgZ3JhaW5lZCBjaGFuZ2VzICg8Y29kZT5GX0ZJTkVfR1JBSU5FRDwvY29kZT4gaXMgc2V0KSBvciBpZiAKKyAgICAgZmluZXIgZ3JhaW5lZCBjaGFuZ2VzIHdlcmUgbm90IGNvbnNpZGVyZWQgKDxjb2RlPkZfRklORV9HUkFJTkVEPC9jb2RlPiAKKyAgICAgaXMgbm90IHNldCkuIAorICAgICA8L2xpPgorPGxpPiBTdXJmYWNpbmcgSVByb2JsZW0gKDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtPC9jb2RlPikgCisJPGJyPlRoaXMgYWxsb3dzIHNvbWUgSmF2YSBBUEkgdG8gcmVwb3J0IGZhaWx1cmVzIGluIGEgbGlnaHRlciB3YXkgdGhhbiBnZW5lcmF0aW5nIG1hcmtlcnMuIE1hcmtlciBiYXNlZCBBUEkgaGF2ZSBiZWVuCisJZGVwcmVjYXRlZCAobm90ZSB0aGF0IGR1ZSB0byBzb21lIGRlYWRsb2NrIGluIGNsaWVudCBjb2RlLCBzb21lIG9mIHRoZXNlIEFQSSBkaWQgbm90IGV2ZW4gcHJvZHVjZSBtYXJrZXJzLCBlLmcuIHJlY29uY2lsaW5nKS4gSW4gYWRkaXRpb24gdG8KKwlzdXJmYWNpbmcgcHJvYmxlbSBkZXNjcmlwdGlvbnMsIElQcm9ibGVtIGV4cG9zZXMgYWxsIHRoZSBJRHMgZm9yIHRoZSBKYXZhIHByb2JsZW0gbWFya2VycyAoYXR0cmlidXRlICJpZCIgb24gbWFya2VycyBvZiB0eXBlICJvcmcuZWNsaXBzZS5qZHQuY29yZS5wcm9ibGVtIik8L2xpPgorPGxpPiBDaGFuZ2VkIGVycm9yIHJlcG9ydGluZyBtZXRob2QgZm9yIDxjb2RlPklDb21wbGV0aW9uUmVxdWVzdG9yPC9jb2RlPiB0byBzdXJmYWNlIElQcm9ibGVtcyBpbnN0ZWFkIG9mIElNYXJrZXJzLjwvbGk+Cis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTkxIj4xMTE5MTwvYT4KK1N0cmFuZ2UgYW5vbnltb3VzIHR5cGVzIGluIG91dGxpbmUgc3RydWN0dXJlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExNTEiPjExMTUxPC9hPgorYXN0OiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb24gQVNUIGNyZWF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTM4Ij4xMDUzODwvYT4KK1Bvc3NpYmxlIG1lbW9yeSBsZWFrPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjE2Ij4xMDYxNjwvYT4KK1N0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb3BlbmluZyB0eXBlIHNlbGVjdGlvbiBkaWFsb2cKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE1MiI+MTExNTI8L2E+CitDb2RlIFNlbGVjdCAtIGRvZXMgbm90IHdvcmsgd2l0aCBlbXB0eSBzZWxlY3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEyOSI+MTExMjk8L2E+CitET00vQVNUOiBDYWxsIHJlc29sdmVUeXBlQmluZGluZygpIG9uIGEgQ2FzdEV4cHJlc3Npb24gb2JqZWN0IHRocm93cyBhIE51bGxQb2l0bmVyRXhjZXB0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTYiPjMyNTY8L2E+CitTZWFyY2hhYmxlRW52aXJvbm1lbnQgLSBjb252ZXJ0cyBjaGFyW10gdG8gU3RyaW5nLCB3aGljaCBhZmZlY3RzIHBlcmZvcm1hbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODQiPjEwOTg0PC9hPgorRE9NL0FTVDogQ1Ugd2l0aCBzeW50YXggZXJyb3JzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTA2Ij4xMTEwNjwvYT4KK0RPTS9BU1Q6IGRvIHN0YXRlbWVudCBkb2Vzbid0IGNvbnRhaW4gdHJhaWxpbmcgc2VtaWNvbG9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTA0Ij4xMTEwNDwvYT4KK0RPTS9BU1Q6IE51bWJlckxpdGVyYWwgY29udGFpbnMgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMTMiPjEwMjEzPC9hPgorU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZSgoSUphdmFFbGVtZW50W10pIGRvZXMgbm90IHdvcmsgZm9yIGJpbmFyeSBlbGVtZW50cyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTI0MCI+OTI0MDwvYT4KK1NlYXJjaCBmaW5kcyBkZWxldGVkIGNsYXNzZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDExIj4xMTAxMTwvYT4KK2luY29ycmVjdCAndmFyaWFibGUgbmV2ZXIgdXNlZCcgd2FybmluZworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDI1Ij4xMTAyNTwvYT4KK2V4dHJhY3QgbWV0aG9kOiBpbmNvcnJlY3RseSBkaXNhbGxvd2VkIG9uIHNvbWUgYm9vbGVhbiBleHByZXNzaW9ucyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY5NyI+MTA2OTc8L2E+CitQZXJmb3JtYW5jZSAtIEJpbmFyeSBtb2RlbCBzaG91bGQgbm90IGNhY2hlIHRoZSBjbGFzc2ZpbGUgYnl0ZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMzciPjExMDM3PC9hPgorRE9NL0FTVDogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gY3JlYXRpbiBBU1QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzUiPjEwNjM1PC9hPgorT3ZlcnJpZGUgbWV0aG9kcyBub3Qgc2hvd2luZyBtaXNzaW5nIG1ldGhvZHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5MzAiPjc5MzA8L2E+CitDb2RlIEFzc2lzdCAtIE5vIGNvbXBsZXRpb24gaW4gc3dpdGNoIHN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTc5Ij4xMDk3OTwvYT4KK0pET00vYWRkIHN1cGVyaW50ZXJmYWNlIGZvcm1hdCBwcm9ibGVtIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTg2Ij4xMDk4NjwvYT4KK0RPTS9BU1Q6IE5QRSB3aGVuIHRyeWluZyB0byByZXNvbHZlIGEgYmluZGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MCI+MTA1ODA8L2E+Cit0eXBlIGhpZXJhcmNoeSBpbmNvcnJlY3QgZm9yIG5lc3RlZCB0eXBlcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MzUiPjEwOTM1PC9hPgorRE9NL0FTVDogd3JvbmcgbGVuZ3RoIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMTEiPjYxMTE8L2E+CitNaXNzaW5nIGNvbXBsZXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4OTgiPjEwODk4PC9hPgorRE9NL0FTVDogTnVsbFBvaW50ZXJFeGNlcHRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2MSI+MzI2MTwvYT4KK1NlYXJjaCAtIE1lbW9yeSBwZWFrIGR1cmluZyBzZWFyY2ggKDFHRU4xN0wpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjY3Ij42NjY3PC9hPgorU2VhcmNoOiBPdXRPZk1lbW9yeUVycm9yIHNlYXJjaGluZyB3aWxkY2FyZGVkIGZpZWxkIHJlZiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQiPjEwODc0PC9hPgorRE9NL0FTVDogQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNvbnRhaW5zIHRyYWlsaW5nIGNvbW1lbnQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODEiPjEwODgxPC9hPgorRE9NL0FTVDogU3dpdGNoQ2FzZS5pc0RlZmF1bHQgYWx3YXlzIHJldHVybnMgZmFsc2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NjUiPjEwODY1PC9hPgorRE9NL0FTVDsgQVNULnJlc29sdmVXZWxsS25vd25UeXBlKCJ2b2lkIikgcmV0dXJucyBudWxsIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODYxIj4xMDg2MTwvYT4KK0RPTS9BU1Q6IFR5cGVMaXRlcmFsLnJlc29sdmVUeXBlQmluZGluZyBkb2Vzbid0IHJldHVybiBjbGFzcyBDbGFzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgxOSI+MTA4MTk8L2E+CitJbmNvbXBsZXRlIHRhc2sgZGVzY3JpcHRpb24gYWZ0ZXIgYnVpbGQgd2l0aCBpbmNvbXBsZXRlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDY4Ij4xMDQ2ODwvYT4KK0RPTS9BU1Q6IFR5cGVEZWNsYXJhdGlvbiNpc0xvY2FsVHlwZURlY2xhcmF0aW9uIGRvZXNuJ3QgY29uc2lkZXIgYW5vbnltb3VzIHR5cGVzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDk5Ij4xMDQ5OTwvYT4KK0RPTS9BU1Q6IG5lZWQgYSB3YXkgdG8gYWNjZXNzIHRoZSBJTWV0aG9kQmluZGluZyBvZiBhIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ5NiI+MTA0OTY8L2E+CitET00vQVNUOiBuZWVkIGZvciBhIG5vZGUgdGhhdCBob2xkcyB0aGUgYm9keSBzdGF0ZW1lbnRzIG9mIGEgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzgxIj4xMDc4MTwvYT4KK2FzdDogaW5jb3JyZWN0IHBvc2l0aW9uIGFuZCBsZW5ndGggZm9yIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NDMiPjEwODQzPC9hPgorRE9NL0FTVDogd3Jvbmcgc3RydWN0dXJlIGZvciBmb3Igc3RhdGVtZW50cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY2MyI+MTA2NjM8L2E+Cithc3Q6IGV4Y2VwdGlvbiBpbiBBU1QgY29udmVydGVyIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzU5Ij4xMDc1OTwvYT4KK2FzdDogaW5jb3JyZWN0IGxlbmd0aCBvZiBTaW1wbGVOYW1lIChzdWJzdWJub2RlIG9mIEFycmF5VHlwZSkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1MDAiPjEwNTAwPC9hPgorU2hvdWxkbid0IGlnbm9yZSBpbmhlcml0ZWQgbWV0aG9kIHdpdGggd3JvbmcgYXJndW1lbnQgdHlwZXMKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MjciPjEwNjI3PC9hPgorUmVidWlsZCBEZWxldGVzIG5vbi1DbGFzcyBSZXNvdXJjZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMzIj4zMjMzPC9hPgorSk0gLSBDcmVhdGVFbGVtZW50SW5DdU9wZXJhdGlvbiBzaG91bGQgbm90IHNhdmUgd29ya2luZyBjb3B5ICgxR0JFS0FXKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0NSI+MzQ0NTwvYT4KK3NlYXJjaDogdHlwZSBoaWVyYXJjaHkgc2NvcGUgaW5jb3JyZWN0ICgxR0xDOFZTKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5NTQiPjEwOTU0PC9hPgorSU1lbWJlcjo6Z2V0RmxhZ3Mgc2VtYW50aWNzIG9uIGludGVyZmFjZSBtZW1iZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5NSI+MzE5NTwvYT4KK1VubmVjZXNzYXJ5IHByb3Bvc2FscyBpbiBPcGVuIG9uIHNlbGVjdGlvbiB3aGl0aCBzeW50YXggZXJyb3IgKDFHMEVJQkIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MzMiPjEwOTMzPC9hPgorRE9NL0FTVDogcG9zaXRpb24gb2YgQW5vbnltb3VzVHlwZURlY2xhcmF0aW9uIGlzIFstMSwwXSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgxNSI+MTA4MTU8L2E+CitFcnJvciBtZXNzYWdlIGZvciAiaW5jb21wbGV0ZSBwYXRoIiBsYWNrcyBkZXRhaWxzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5MTMiPjEwOTEzPC9hPgorRE9NL0FTVDogcmVzb2x2ZUJpbmRpbmcoKSBmb3Igc3RhdGljIGZpZWxkIGFjY2VzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY5OCI+MTA2OTg8L2E+CitET00vQVNUOiBleGNlcHRpb24gd2hlbiBjcmVhdGluZyBBU1QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDk0NiI+NDk0NjwvYT4KK0Nyb3NzLXByb2plY3QgYnVpbGRlciBlZmZpY2llbmN5IGlzc3VlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTMiPjMyMTM8L2E+CitObyBjb21waWxlIGVycm9yIGZvciBiYWQgaW50ZXJmYWNlICgxRzdHNk0xKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjY3Ij4xMDY2NzwvYT4KK05QRSBpbiBzZWxmIGVuY2Fwc3VsYXRlIGZpZWxkIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzg5Ij4xMDM4OTwvYT4KK0VkaXRpbmcgbm9uLUphdmEgZmlsZXMgY2F1c2VzIGEgcmVjb21waWxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMTMiPjEwMzEzPC9hPgorQ2FuIG5vdCBjcmVhdGUgSmF2YSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc291cmNlICgxMDAwKyBKYXZhIGZpbGVzKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzk0Ij4xMDc5NDwvYT4KK05QRSBmcm9tIHNlYXJjaCBkdXJpbmcgcmVmYWN0b3IsIHB1bGwgdXAgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTkiPjEwNjk5PC9hPgorYXN0OiBub3RoaW5nIGluIGFub255bW91cyBpbm5lciBjbGFzc2VzIGlzIGNyZWF0ZWQgCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAzMDUgLSA1dGggTWFyY2ggMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMzAKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gQWRkZWQgQVBJIDxjb2RlPklDbGFzc0ZpbGUuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciwgSUJ1ZmZlckZhY3RvcnkpPC9jb2RlPgorCSBmb3IgY29uc2lzdGVuY2Ugd2l0aCA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+LgorICAgICBUaGUgcmV0dXJuZWQgd29ya2luZyBjb3B5IGlzIGp1c3QgYSB3cmFwcGVyIG9uIHRoZSBjbGFzcyBmaWxlJ3MgYnVmZmVyLgorICAgICBUaHVzIG9ubHkgdGhlIDxjb2RlPmdldEJ1ZmZlcigpPC9jb2RlPiBvcGVyYXRpb24gaXMgdmFsaWQgb24gdGhpcyB3b3JraW5nCisgICAgIGNvcHkuCis8L2xpPgorPGxpPiBBZGRlZCB0aGUgbm90aW9uIG9mIHNoYXJlZCB3b3JraW5nIGNvcGllcy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byBhbHdheXMKKyAgICAgZ2V0IHRoZSBzYW1lIDxjb2RlPklXb3JraW5nQ29weTwvY29kZT4gaW5zdGFuY2Ugd2hlbiBhc2tpbmcgZm9yIGEgd29ya2luZyBjb3B5LgorICAgICBTZWUgPGNvZGU+SVdvcmtpbmdDb3B5LmdldFNoYXJlZFdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IsIElCdWZmZXJGYWN0b3J5KTwvY29kZT4sCisgICAgIDxjb2RlPklXb3JraW5nQ29weS5maW5kU2hhcmVkV29ya2luZ0NvcHkoKTwvY29kZT4KKyAgICAgYW5kIDxjb2RlPklXb3JraW5nQ29weS5kZXN0cm95KCk8L2NvZGU+IGZvciBtb3JlIGRldGFpbC4KKzwvbGk+Cis8bGk+IEFkZGVkIG9wdGlvbiB0byB0cmFjZSB1c2Ugb2Ygc2hhcmVkIHdvcmtpbmcgY29waWVzLgorICAgIFRvIGVuYWJsZSBpdCwgc2VlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUgb3JnLmVjbGlwc2UuamR0LmNvcmUvLm9wdGlvbnMgZmlsZToKKyAgICA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zaGFyZWR3b3JraW5nY29weT10cnVlPC9jb2RlPgorPC9saT4KKzxsaT4gQWRkZWQgZXh0ZW5zaW9uIHBvaW50IHRvIGpkdGNvcmUgc28gYXMgdG8gYWxsb3cgY2xpZW50IHBsdWdpbnMgdG8gcmVnaXN0ZXIgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycy4KKyAgRXh0ZW5zaW9uIHBvaW50IGlzICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIi4KKyAgKGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvfmNoZWNrb3V0fi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlJTIwaW5pdC91bmluaXQtY2xhc3NwYXRoLXZhcnMuaHRtbCI+ZGVzaWduIG5vdGVzPC9hPikKKyAgTm90ZSB0aGF0IGVhY2ggY2xhc3NwYXRoIHZhcmlhYmxlLCBpZiB1bmJvdW5kLCB3aWxsIHRyaWdnZXIgaXRzIHJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXIgZXhhY3RseSBvbmNlIHBlciBzZXNzaW9uLiBJZiB1bnN1Y2Nlc3NmdWwsIGl0IHdpbGwgc3RheSB1bmJvdW5kLgorCis8L2xpPgorPGxpPiBBZGRlZCBvcHRpb24gdG8gdHJhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucy4KKyAgICBUbyBlbmFibGUgaXQsIHNlZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLy5vcHRpb25zIGZpbGU6CisgICAgPGNvZGU+b3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3B2YXJpYWJsZT10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5BZGRlZCBvcHRpb24gdG8gdHJhY2UgYWNjZXNzIHRvIHppcCBhbmQgamFyIGZpbGVzIGZyb20gdGhlIEphdmEgbW9kZWwuCisgICAgVG8gZW5hYmxlIGl0LCBzZWUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBvcmcuZWNsaXBzZS5qZHQuY29yZS8ub3B0aW9ucyBmaWxlOgorICAgIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2Vzcz10cnVlPC9jb2RlPgorPC9saT4KKzxsaT5SZXN1cnJlY3Qgc29tZSBjb2RlIGZvciBiYWNrcG9ydCAxLjAgaW50ZXJuYWwgZnVuY3Rpb25hbGl0eQorCTx1bD4KKwk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db25maWd1cmFibGVPcHRpb24gKGFsbCB0aGUgY2xhc3MpLgorCTxsaT4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyIChzb21lIG1ldGhvZHMpIDoKKwkJPHVsPgorCQk8bGk+IHB1YmxpYyBDb2RlRm9ybWF0dGVyKENvbmZpZ3VyYWJsZU9wdGlvbltdIHNldHRpbmdzKQorCQk8bGk+IHByaXZhdGUgc3RhdGljIE1hcCBjb252ZXJ0Q29uZmlndXJhYmxlT3B0aW9ucyhDb25maWd1cmFibGVPcHRpb25bXSBzZXR0aW5ncykKKwkJPGxpPiBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYWJsZU9wdGlvbltdIGdldERlZmF1bHRPcHRpb25zKExvY2FsZSBsb2NhbGUpCisJCTxsaT4gcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBzb3VyY2VTdHJpbmcsIGludCBpbml0aWFsSW5kZW50YXRpb25MZXZlbCwgQ29uZmlndXJhYmxlT3B0aW9uW10gb3B0aW9ucykKKwkJPC91bD4KKwk8bGk+IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5mb3JtYXR0ZXIuT3B0aW9ucy5wcm9wZXJ0aWVzIChhbGwgdGhlIGZpbGUpCisJPC91bD4KKzwvbGk+Cis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDMiPjMzMDM8L2E+CitNYW55IGVycm9ycyB3aGVuIGFkZGluZyBwcm9qZWN0cyBmcm9tIHJlcG9zaXRvcnkgaW4gYSBmcmVzaCBpbnN0YWxsICgxR0Y1UFU3KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyODUiPjUyODU8L2E+CitDb21waWxlIGVycm9ycyBvbiBsb2FkIHdoZW4gSmF2YSBQZXJzcGVjdGl2ZSBub3Qgb3BlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwODUiPjcwODU8L2E+CitCdWlsZCBlcnJvcnMgd2hlbiBhZGRpbmcgdGhlIEpVbml0IGV4YW1wbGUgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzAwIj4xMDcwMDwvYT4KK2FzdDogcmVzb2x2ZUJpbmRpbmcgcmV0dXJucyBudWxsIG9uIHBhcmFtZXRlciByZWZlcmVuY2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzYiPjEwNjc2PC9hPgorU3RyaW5nTGl0ZXJhbC5yZXNvbHZlVHlwZUJpbmRpbmcoKSByZXR1cm4gbnVsbCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY3OSI+MTA2Nzk8L2E+CitDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBjYWxsaW5nIHJlc29sdmVUeXBlQmluZGluZygpIHdpdGggYW4gZXJyb3IgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MzQiPjEwNjM0PC9hPgorUHJvYmxlbSB3aXRoIGNvbXBpbGluZyBzb21lIGphdmEgY2xhc3NlczsgY2xhc3Mgbm90IHZpc2libGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM0MCI+MTAzNDA8L2E+CitOUEUgd2hlbiBzZWxlY3RpbmcgbXVsdGlwbGUgbWV0aG9kcyB0byAiUHVsbCB1cCIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjYyIj4xMDY2MjwvYT4KK0Nhc3RpbmcgdG8gQnVmZmVyIG1ha2VzIGl0IGltcG9zc2libGUgZm9yIGNsaWVudHMgdG8gaW1wbGVtZW50IElCdWZmZXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkyIj4xMDU5MjwvYT4gCithc3Q6IE5QRSBpbiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOjpyZXNvbHZlQmluZGluZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTgzIj45NTgzPC9hPgorRE9NIDogU2VsZiBlbmNhcHN1bGF0ZSBmaWVsZDogTlBFIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTcwIj4xMDU3MDwvYT4KK2FzdDogQ2F0Y2hDbGF1c2UgaGFzIGluY29ycmVjdCBzdGFydGluZ1BvaW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg3Ij4xMDU4NzwvYT4KK2FzdDogbWlzc2luZyBub2RlIGZvciBhIHZhcmlhYmxlIGJpbmRpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU4OCI+OTU4ODwvYT4KK0ludmFsaWQgZGVsdGEgd2hlbiByZXBsYWNpbmcgamFyIGFuZCBwcm9qPXNyYz1iaW4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDk1Ij4xMDQ5NTwvYT4KK3R5cG8gaW4gQVNUTm9kZTo6TUFMRk9STUVEIGphdmFkb2MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA0NzIiPjEwNDcyPC9hPgorQ29kZUFzc2lzdCAtIE5vIGNvbXBsZXRpb24gYmV0d2VlbiBkb3QgYW5kIG51bWJlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjMiPjMzMjM8L2E+CitPcGVuT25TZWxlY3Rpb24gLSBubyBzZWxlY3Rpb24gaW5zaWRlIENvZGVGb3JtYXR0ZXJQcmVmZXJlbmNlUGFnZS5mVGV4dExpc3RlbmVyIGluaXRpYWxpemVyICgxR0dORDNTKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDY2Ij4xMDQ2NjwvYT4KKyJDYW5ub3QgcmVmZXJlbmNlIGEgZmllbGQgYmVmb3JlIGl0IGlzIGRlZmluZWQiIC0gY29tcGlsZXIgYnVnPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzg2Ij4xMDM4NjwvYT4KK05QRSBpbiBNYXRjaExvY2F0b3IubG9va3VwVHlwZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNzgiPjEwMzc4PC9hPgorcGVyZiBwcm9ibGVtIHdpdGggZXh0ZXJuYWwgSkFScyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5MyI+OTU5MzwvYT4KK1NlbGVjdGlvbkVuZ2luZSBnaXZlIG1vcmUgcmVzdWx0cyB0aGFuIGV4cGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTk2OSI+OTk2OTwvYT4KK0NvZGVGb3JtYXR0ZXI6IEJ1ZyB3aGVuIGZvcm1hdHRpbmcgdHJ5L2NhdGNoIEJsb2NrIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzEiPjMyMzE8L2E+CisxLjQgLSB0YXJnZXQgaXMgbm93IDEuMiAoMUdIVzBERikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTk4Ij45OTk4PC9hPgorUGVyZm9ybWFuY2UgLSBCZXR0ZXIgcHJ1bmluZyBtZWFuaW5nbGVzcyBBU1Qgbm9kZXMgdXBvbiBjb21wbGV0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDAiPjEwMjQwPC9hPgorSkRUQ29tcGlsZXJBZGFwdGVyIGRvZXNuJ3QgdW5kZXJzdGFuZCAiZGVwcmVjYXRpb24iIGZyb20gQW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc0Ij4xMDI3NDwvYT4KK0RPTS9BU1Q6IHdyb25nIGltcGxlbWVudGF0aW9uIG9mIFR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyNDEiPjEwMjQxPC9hPgorUmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gY29tLmlibSAKKzxoMz4gCitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzUzIj4xMDc1MzwvYT4KK0NvbXBpbGVyIGJhcmZzIG9uIGM6XHViaXplbiB3aXRoIGludmFsaWQgdW5pY29kZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc0OSI+MTA3NDk8L2E+CitCdWcgaXMgY29kZSBmb3JtYXR0ZXIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3MDEiPjEwNzAxPC9hPgorVW5kZWZpbmVkIG1ldGhvZCB3aGVuIGNvbXBpbGluZyB1c2luZyBKREsgMS40Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzQiPjEwNjc0PC9hPgorQVNUIEFQSSByZXF1ZXN0IDogbWV0aG9kIGJpbmRpbmcgZm9yIENsYXNzSW5zdGFuY2VDcmVhdGlvbiAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4MyI+MTA1ODM8L2E+CitDYW4gbm90IHNhdmUgYW55IGphdmEgZmlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjc1Ij4xMDI3NTwvYT4KK1NlYXJjaDogcmVmZXJlbmNlIHRvIGNsYXNzIG5vdCBmb3VuZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNyI+MzQzNzwvYT4KK0NvZGUgQXNzaXN0IGZhaWxzIHdoZW4gbWV0aG9kIGhhcyB1bmtub3duIHJldHVybiB0eXBlICgxR0wxMkVHKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1NzkiPjk1Nzk8L2E+CitTZWFyY2g6IGRlY2xhcmF0aW9uIGluIGhpZXJhcmNoeSAtIHdyb25nIG1hdGNoZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDYwIj4xMDQ2MDwvYT4KK1RoZSBDb21waWxlciBjYW4gbm90IHJlc29sdmUgcGFja2FnZSBsZXZlbCBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjQ0Ij4xMDI0NDwvYT4KK0RPTS9BU1Q6IE1ldGhvZEludm9jYXRpb24gc2hvdWxkIGhhdmUgcmVzb2x2ZUJpbmRpbmcoKSBtZXRob2QgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE1NyI+OTE1NzwvYT4KK015IGV4aXN0aW5nIC5jbGFzcyBmaWxlcyBhcmUgZGVsZXRlZCEKKyAKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMjAyMjYgLSAyNnRoIEZlYnJ1YXJ5IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI5Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+SmF2YSB0b29saW5nIG5vdyBwZXJmb3JtcyBub3JtYWxseSBpbnNpZGUgbWV0aG9kIGJvZGllcyB3aG9zZSBzaWduYXR1cmUgY291bGQgbm90CitiZSByZXNvbHZlZC4KKzwvbGk+Cis8bGk+IFNwZWNpZmllZCB0aGF0IHdoZW4gYW4gPGNvZGU+SUJ1ZmZlcjwvY29kZT4gaXMgY3JlYXRlZCB0aHJvdWdoIGFuIAorICAgICA8Y29kZT5JQnVmZmVyRmFjdG9yeTwvY29kZT4sIGl0cyBjb250ZW50IGlzIHNldCB3aXRoIHRoZSBvcmlnaW5hbAorICAgICBlbGVtZW50J3MgY29udGVudC4KKzwvdWw+Cis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxMTAiPjEwMTEwPC9hPgorUHJvamVjdCBub3QgYnVpbGQgc2luY2UgaXQgd2FzIGluY29uc2lzdGVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2NDIiPjk2NDI8L2E+CitTZWFyY2ggLSBtaXNzaW5nIGluYWNjdXJhdGUgdHlwZSBtYXRjaGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05OTkyIj45OTkyPC9hPgorTWVtYmVyIGNsYXNzIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAyMjEiPjEwMjIxPC9hPgorTm8gdmFyaWFibGUgbmFtZSBzdWdnZXN0aW9uIG9uIGFycmF5IHR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDE2NiI+MTAxNjY8L2E+CitJbnRlcmZhY2UgaGlkZXMgT2JqZWN0IG1ldGhvZHMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTM0Ij43OTM0PC9hPgorQnVpbGRlciBhbHdheXMgcmVidWlsZHMgd2hlbiB3b3JrYmVuY2ggcmVzdGFydGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NiI+NzQ1NjwvYT4KK0Vycm9yIG1lc3NhZ2Ugd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgaXMgY29uZnVzaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNTIiPjEwMTUyPC9hPgorQ29tcHV0aW5nIGhpZXJhcmNoeSBvZiBJUmVzb3VyY2UgaXMgc2xvdyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODgwOSI+ODgwOTwvYT4KK0NvZGUgYXNzaXN0IHdpdGggY2xhc3MgZm9sZGVycyBkb2VzIG5vdCB3b3JrCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTc2MyI+OTc2MzwvYT4KK0NvZGUgYXNzaXN0IGZhaWx1cmUgZHVlIHRvIGVycm9yIGluIG1ldGhvZCBzaWduYXR1cmU6MUdSVk41UgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5ODUiPjk5ODU8L2E+CitCdWlsdCBpbiBjb21waWxlciB3aWxsIHNvbWV0aW1lcyBub3QgYWxsb3cgT2JqZWN0IG1ldGhvZCBjYWxscyBvbiBJbnRlcmZhY2VzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMDgiPjEwMDA4PC9hPgorSW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igd2hlbiBjb21waWxpbmcgc3dpdGNoIHN0YXRlbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk5MTIiPjk5MTI8L2E+CitCYXRjaCBjb21waWxlciBkb2Vzbid0IHB1dCBiaW5hcmllcyBpbiB0aGUgcmlnaHQgZm9sZGVyIHdoZW4gLWQgaXMgbWlzc2luZyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDU5Ij42MDU5PC9hPgorTlBFIGluIEphdmFNb2RlbFN0YXR1cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzUxIj45MzUxPC9hPgorQ29weWluZyBhIGNvbXBpbGF0aW9uIHVuaXQgb250byBpdHNlbGYgZGVzdHJveXMgY29tcGlsYXRpb24gdW5pdCAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODEzIj45ODEzPC9hPgorVmVyaWZ5RXJyb3Igd2l0aCBJbm5lciBDbGFzcyBoYXZpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk0OTIiPjk0OTI8L2E+CitXYWxrYmFjayB3aGlsZSBzZWFyY2hpbmcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk4MzciPjk4Mzc8L2E+CitJbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2hlbiBjb21waWxpbmcgZnJvbSBzb3VyY2Ugb3IgdXNpbmcgYmluYXJpZXMgZm9yIGNvbnN0YW50IGV4cHJlc3Npb25zCisKKzxoMz4gCitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTEiPjY5NTE8L2E+CitEQ1IgLSBCdWlsZGVyIHNob3VsZCBpZ25vcmUgZmlsdGVyZWQgb3V0IHJlc291cmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MDkiPjU4MDk8L2E+CitEdXBsaWNhdGUgY2xhc3MgbmFtZXMgaW4gc2VwYXJhdGUgcGFja2FnZSBpbXBvcnRzIGNhdXNlIGNvbXBpbGUgZXJyb3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05ODg4Ij45ODg4PC9hPgorSkFSIGV4b3J0ZXIgcHJvYmxlbXMgd2l0aCBNRVRBLUlORiBpbiBwcm9qZWN0cyB3aXRoIG5vIHNvdXJjZSBmb2xkZXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTA0Ij4xMDEwNDwvYT4KK0NhbGN1bGF0ZWQgc2VyaWFsVmVyc2lvbklEJ3MgYXJlIGluY29tcGF0aWJsZSB3aXRoIFN1bidzIEpESworCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjE0IC0gMTR0aCBGZWJydWFyeSAyMDAyIC0gTUlMRVNUT05FIDMKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI4Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDc5Ij45NDc5PC9hPgorZXhjZXB0aW9uIG9uIHBhY2thZ2UgY3JlYXRpb24gKGRpc2NvdXJhZ2VkIG5hbWUpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTk5Ij41OTk5PC9hPgorSVR5cGUucmVzb2x2ZVR5cGUgcmV0dXJucyBtdWx0aXBsZSBtYXRjaGVzIGFsc28gdGhlIHR5cGUgaXMgdW5hbWJpZ2lvdXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDg1Ij43NDg1PC9hPgorSVR5cGUgcmVzb2x2ZSBmYWlscworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk3ODUiPjk3ODU8L2E+ICAKK1Byb2JsZW0gaW4gSVR5cGUucmVzb2x2ZVR5cGUoKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkyMzkiPjkyMzk8L2E+CitzZWFyY2ggZm9yIG1ldGhvZCBkZWNsYXJhdGlvbiAtIHN0cmFuZ2UgYmVoYXZpb3IgIAorCis8aDM+IAorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjQ3Ij41NjQ3PC9hPgorU2VhcmNoIHJlc3VsdHMgZGlmZmVyIHdoZW4gdXNpbmcgb3V0bGluZXIgY29udGV4dCBtZW51IHZzLiBkaWFsb2cgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMzkiPjUyMzk8L2E+CitvdXRsaW5lciBnZXRzIG91dCBvZiBzeW5jaCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTAyOSI+NTAyOTwvYT4KK0ludGVybmFsIEVycm9yIHNhdmluZyBqYXZhIGZpbGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1ODYiPjk1ODY8L2E+ICAKK0phdmEgMS40IGZlYXR1cmUgYXNzZXJ0IGRvZXMgbm90IHRocm93IGFueSBleGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTA0Ij45NTA0PC9hPiAgCisxR1JVMUwzOlNlYXJjaCByZWZlcmVuY2Ugd29ya3Mgb25seSBpbiBvdXRsaW5lIHZpZXcgYW5kIG5vdCBpbiBlZGl0b3IKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDc2Ij45NDc2PC9hPiAgCitBcnJheUluZGV4T3V0T2ZCb3VuZHMgaW4gSmF2YUJ1aWxkZXIgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjIiPjMyNjI8L2E+CitTdHJhbmdlIG91dHB1dCBmaWxlIGRlbGV0aW9uICgxR0RTMklYKQorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjEyIC0gMTJ0aCBGZWJydWFyeSAyMDAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI3Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+UmVzb3VyY2UgY29weSBmaWx0ZXJzIDogQSBuZXcgc2V0dGluZyBhbGxvd3MgdG8gc3BlY2lmeSBleGNsdXNpb24gZmlsdGVycyBmb3IgcmVzb3VyY2UgYmVpbmcgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLi4KKwk8dWw+CisJPGxpPm9wdGlvbiBpZDoJCQkib3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXJzIgorCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIjxuYW1lPlssPG5hbWU+XSogfSB3aGVyZSA8bmFtZT4gaXMgYSBmaWxlIG5hbWUgcGF0dGVybiAob25seSAqIHdpbGQtY2FyZHMgYWxsb3dlZCkKKwk8bGk+ZGVmYXVsdDoJCQkiIiAKKwk8L3VsPgorPC9saT4KKzxsaT5FbmNvZGluZyBzdXBwb3J0IDogQmF0Y2ggY29tcGlsZXIgY2FuIGJlIHNwZWNpZmllZCB0aGUgc291cmNlIGVuY29kaW5nIGZvcm1hdCB1c2luZyAnLWVuY29kaW5nIG15RW5jb2RpbmcnIGNvbW1hbmQgbGluZSBvcHRpb24uCitJbiBjYXNlIG9mIG5lY2Vzc2l0eSwgZWFjaCBpbmRpdmlkdWFsIGZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGN1c3RvbSBlbmNvZGluZworYnkgc3VmZml4aW5nIGl0cyBuYW1lIHdpdGggJ1tteUVuY29kaW5nXScgKGlmIGFwcGxpZWQgdG8gYSBmb2xkZXIsIHRoZW4gYWxsIGZpbGVzIGluIGl0IHdpbGwgYmUgc2hhcmluZyB0aGUgY3VzdG9tCitlbmNvZGluZykuIFdoZW4gbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGlzIHVzZWQgKGFzIGJlZm9yZSkuIFNpbWlsYXJpbHksIGEgSmF2YUNvcmUgb3B0aW9uIGdvdCBhZGRlZCB0bworY29udHJvbCB0aGUgZGVmYXVsdCBlbmNvZGluZyAobm8gc3VwcG9ydCB5ZXQgZm9yIHBlciBmaWxlIGN1c3RvbSBlbmNvZGluZykuCisJPHVsPgorCTxsaT5vcHRpb24gaWQ6CQkJIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmVuY29kaW5nIgorCTxsaT5wb3NzaWJsZSB2YWx1ZXM6CXsgIiIgZm9yIHBsYXRmb3JtIGRlZmF1bHQsIG9yIGFueSBvZiB0aGUgc3VwcG9ydGVkIGVuY29kaW5nIG5hbWUgfS4KKwk8bGk+ZGVmYXVsdDoJCQkiIiAKKwk8L3VsPgorPC9saT4KKzxsaT4gRml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTgzIj45MTgzPC9hPiByZXF1aXJlZCB0byBpbmNyZW1lbnQgdGhlIGluZGV4IHNpZ25hdHVyZSAKK3ZlcnNpb24gc28gYXMgdG8gdHJpZ2dlciBhdXRvbWF0aWMgcmVpbmRleGluZyBvbiB3b3Jrc3BhY2Ugc3RhcnR1cCAoYW5kIHRodXMgYWRkIHNvbW1lIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHdlcmUgcHJldmlvdXNseQorbWlzc2luZyBmcm9tIHRoZSBiaW5hcnkgaW5kZXggZmlsZXMpLiBTdWJzZXF1ZW50IHN0YXJ0dXBzIHdpbGwgbm90IHJlaW5kZXggYW55IGZ1cnRoZXIgKG9ubHkgaWYgaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZCwgCitlLmcuIHNpZ25hdHVyZSB2ZXJzaW9uIGlzIGRpZmZlcmVudCkuCis8L2xpPgorPGxpPiBUaGUgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+IHVzZWQgd2hlbiBjcmVhdGluZyBhbiA8Y29kZT5JV29ya2luZ0NvcHk8L2NvZGU+Cisoc2VlIDxjb2RlPklDb21waWxhdGlvblVuaXQuZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQnVmZmVyRmFjdG9yeSBmYWN0b3J5KTwvY29kZT4pCitpcyBub3cgcmVtZW1iZXJlZCBhbmQgd2lsbCBiZSByZXVzZWQgaWYgdGhlIHdvcmtpbmcgY29weSBpcyBjbG9zZWQgdGhlbiByZW9wZW4uCis8L2xpPgorPGxpPk9sZCBKYXZhIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZ290IHJlbW92ZWQ8L2xpPgorPGxpPlByb2plY3QgZGVwZW5kZW5jeSBjeWNsZSBkZXRlY3Rpb24gcmVlbmFibGVkPC9saT4KKzxsaT4gT3BlbiBvbiBzZWxlY3Rpb24gbm8gbG9uZ2VyIG5lZWQgYSBub24tZW1wdHkgc2VsZWN0aW9uIHRvIHBlcmZvcm0gKHdoZW4gZW1wdHkgaXQgd2lsbCB1c2UgdGhlIHRva2VuCitpbiB3aGljaCB0aGUgc2VsZWN0aW9uIHN0YXJ0IHBvc2l0aW9uIGlzIGxvY2F0ZWQpLgorPGxpPkltcHJvdmVkIHByb2dyZXNzIHJlcG9ydGluZyB3aGlsZSBzZWFyY2hpbmcgYWxsIHR5cGVzIGluIHRoZSB3b3Jrc3BhY2UuPC9saT4KKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDUyIj45NDUyPC9hPiAgCitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBjcmVhdGluZyBhbiBBU1QgZm9yIFRlc3RDYXNlLmphdmEgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczOTAiPjczOTA8L2E+CitFZGl0aW5nIGFuZCBzYXZpbmcgcmVhZC1vbmx5IC5qYXZhIHNvdXJjZSBmaWxlIG1heSBjYXVzZSBsb3N0IG9mIGRhdGEKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTI2Ij43OTI2PC9hPgorQ29kZSBBc3Npc3QgLSBObyBjb21wbGV0aW9uIGZvciBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBhZnRlciBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2MzYiPjc2MzY8L2E+CitDYW4ndCBkbyBjb2RlIGFzc2lzdCBhZnRlciBmaWVsZCB3aXRoIGxvY2FsIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM2OSI+ODM2OTwvYT4KK0NvZGUgYXNzaXN0IHN0b3BzIHRvIHdvcmsgYWZ0ZXIgYW5vbnltb3VzIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM5OCI+OTM5ODwvYT4KK0NvbXBpbGVyIGVycm9yIHdpdGggZG91YmxlIGFycmF5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM5NSI+OTM5NTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBkdXJpbmcgYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTg1Ij45MTg1PC9hPgorU2V2ZXJlIHNodXRkb3duIHBlcmZvcm1hbmNlIHByb2JsZW0gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjciPjYxNjc8L2E+CitJbmRleGVyIG5vdCBzdG9wZWQgb24gZXhpdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjIiPjczNjI8L2E+CitPdmVycmlkZSBNZXRob2RzIGRvZXNuJ3QgaGFuZGxlIHVuaWNvZGVzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyOTUiPjcyOTU8L2E+CitJbmRlbmRhdGlvbiBpbiBnZW5lcmF0ZWQgZ2V0dGVycy9zZXR0ZXJzIG9mIGlubmVyIGNsYXNzZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3OCI+NjY3ODwvYT4KK0luY29ycmVjdCBvdXRwdXQgYWZ0ZXIgQWRkIFVuaW1wbGVtZW50ZWQgTWV0aG9kIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3NTgiPjg3NTg8L2E+CitudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGluIGVjbGlwc2UgY29yZSB3aGlsZSBjb21waWxpbmcgSmF2YSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNiI+NjIzNjwvYT4KK1JlbmFtZWQgZmlsZSBpcyBub3QgZXhjbHVkZWQgZnJvbSBwcm9qZWN0IGJ1aWxkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Njk2Ij44Njk2PC9hPgorQ29kZSBhc3Npc3QgZG9lc24ndCB3b3JrIGluIGluaXRpYWxpemVyIG9mIGFub255bW91cyBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNjQiPjYwNjQ8L2E+CitPcGVuIG9uIHNlbGVjdGlvbiBzaG91bGRuJ3QgcmVxdWlyZSBzZWxlY3Rpb24uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTIyMyI+OTIyMzwvYT4KK0NvZGVBc3Npc3QgZmFpbHVyZSBpbiBpbm5lciB0eXBlIGZyb20gY2xhc3MgZmlsZS4KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODQ3Ij42ODQ3PC9hPgorRENSIC0gRmlsdGVyaW5nIG91dHB1dCB0byBidWlsZCBkaXJlY3RvcnkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzA5Ij45MzA5PC9hPgorRE9NL0FTVDogTlBFIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgYSBiaW5kaW5nIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMDgiPjkzMDg8L2E+CitET00vQVNUOiB0d28gZXF1YWwgaGFzaCB0YWJsZSBhY2Nlc3NlcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTAxIj45MTAxPC9hPgorUGFyc2UgZXJyb3Igd2hpbGUgdHlwaW5nIGluIEphdmEgZWRpdG9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDMxIj45MDMxPC9hPgorTlBFIGluIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24uY29tcGlsYXRpb25SZXN1bHQgZHVyaW5nIHNlYXJjaCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4NCI+OTA4NDwvYT4KK05QRSBpbiBwYXJzZXIgZHVyaW5nIGJ1aWxkIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMDgiPjkwMDg8L2E+CitDb2RlIGFzc2lzdCBvbiBtZXRob2QgZGVjbGFyYXRpb24gZ2l2ZXMgd3JvbmcgdGhyb3cgZXhjZXB0aW9uCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg3OCI+ODg3ODwvYT4KK0NvZGUgYXNzaXN0IHByb3ZpZGVzIGFyYml0cmFyeSwgaW52YWxpZCBjaG9pY2UgYWZ0ZXIgYSBzcGFjZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxOTgiPjkxMjg8L2E+CitOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBzdGFydGluZyB3b3JrYmVuY2ggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMzUiPjkwMzU8L2E+CitJIGdvdCBhbiBOUEUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE4MyI+OTE4MzwvYT4KK0JpbmFyeUluZGV4ZXIgZG9lc24ndCBpbmRleCBhbGwgdHlwZSByZWZlcmVuY2VzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjEiPjMzMjE8L2E+CitBZGRpbmcgbWlzc2luZyBzb3VyY2UgZm9sZGVyIGRvZXNuJ3QgcmVtb3ZlIHdhcm5pbmcgKDFHR0NDNFApCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxOSI+MzIxOTwvYT4KK0pNIC0gJ0N5Y2xlIGRldGVjdGVkJyBzaG91bGQgbm90IGJlIGEgbWFya2VyIGF0dHJpYnV0ZSAoMUc4VlRTQSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTY5Ij45MTY5PC9hPgorV3JvbmcgY29kZSBnZW5lcmF0aW9uIGZvciBjb21wYXJpc29uIG9mIHN0cmluZyBjb25zdGFudHMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY4NSI+ODY4NTwvYT4KK0V4Y2VwdGlvbiB3aGlsZSBkZWxldGluZyBhIG1ldGhvZCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDAyMSI+NDAyMTwvYT4KK2pkdDogSmF2YSBlbGVtZW50cyBhbmQgcmVzb3VyY2VzOiBlcnJvciBpbiBzb3VyY2UgY29kZSAoMUdHODdTOSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4NzgiPjc4Nzg8L2E+CitPbiBQYWNrYWdlIGNyZWF0aW9uOiBObyB3YXJuaW5nIGZvciB1bmNvbnZlbnRpb25hbCBuYW1lcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MSI+OTA0MTwvYT4KK3NlYXJjaDogY2Fubm90IGNyZWF0ZSBhIHN1Yi1jdSBzY29wZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4OCI+OTA4ODwvYT4KK1VucmVhY2hhYmxlIGNhdGNoIGJsb2NrIHdoZW4gZXJyb3IgaW4gcmVmZXJlbmNlZCBjbGFzcydzIGZpZWxkcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk5Ij4zMjk5PC9hPgorQXV0b2J1aWxkIHByb2R1Y2VzIGVycm9ycyB3aGVuIHJlbmFtaW5nIHNvdXJjZSBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAwOSI+OTAwOTwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBjcmVhdGluZyBhbiBpbnZhbGlkIG1ldGhvZCAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTkwIj4zMTkwPC9hPgorSk0gLSB1c2Ugb2YgIm9wZW4iIGluIGphdmEgbW9kZWwgaW5jb25zaXN0ZW50IHdpdGggY29yZSAoMUZXMkVZUSkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjY4Ij4zMjY4PC9hPgorY3JlYXRlKElQcm9qZWN0KSBzdHJhbmdlIGZvciBub3JtYWwgcHJvamVjdHMgKDFHRFZURVIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUyNyI+ODUyNzwvYT4KK0RlbGV0ZSBpbm5lciBjbGFzcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzciPjMwMzc8L2E+CitDb3JlIGVycm9yIGNvbXBpbGluZyBhIGphdmEgY2xhc3MgKDFHRUpLOFEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM4NiI+OTM4NjwvYT4KK2Nhbm5vdCBpbXBvcnQgamFyIGZpbGVzIGludG8gcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc5NzYiPjc5NzY8L2E+CitKRFQgbWlzc2VzIHRoZSBuZXcgSmF2YSBmaWxlcyBjcmVhdGVkIGJ5IFBERSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcxMyI+NTcxMzwvYT4KK05QRSB3aGVuIHNlYXJjaGluZyBmb3IgcmVmZXJlbmNlcyBpbiBhIEpBUiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTE3NyI+OTE3NzwvYT4KK0J1aWxkZXIgdHJlYXRzIGJ1aWxkIGVycm9ycyBhcyBKYXZhRXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MCI+ODA0MDwvYT4KK2phdmEgc291cmNlIHdpdGggJCBpbiByZWZlcmVuY2Ugd29uJ3QgY29tcGlsZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwMzYiPjUwMzY8L2E+Cithc3NlcnRpb24gZmFpbHMgb24gYnVpbGQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDk4Ij44NDk4PC9hPgorZGVwcmVjYXRlZCBtZXRob2RzIGFyZSBub3QgZGlzcGxheWVkIGluIHRoZSB0YXNrIGNvbnNvbGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzEiPjMzNzE8L2E+CitBc3NlcnRpb24gZmFpbGVkIGV4Y2VwdGlvbiBkdXJpbmcgYnVpbGQgKDFHSzE4M08pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOSI+MzQxOTwvYT4KK2Fzc2VyaW9uIGZhaWxlZCBpbiBidWlsZCAoMUdLQjlDSCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03ODk1Ij43ODk1PC9hPgorV2llcmQgc3RhdGU6IFByb2plY3Qgbm90IGJ1aWx0IGJlY2F1c2UgaW5jb25zaXN0ZW50LgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc4MzAiPjc4MzA8L2E+CitEZWxldGluZyBtb3JlIHRoYW4gb25lIG1ldGhvZCBjb25zZWN1dGl2ZWx5IGZyb20gdGhlIGhpZXJhcmNoeSB2aWV3IGNhdXNlcyB1bmV4cGVjdGVkIGNvcnJ1cHRpb24gb2Ygb3RoZSBtZXRob2RzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxOTAiPjkxOTA8L2E+CitSZW1vdmluZyBhIGxpYnJhcnkgZnJvbSBjbGFzc3BhdGggZ2l2ZXMgbm90IGEgcmVtb3ZlIGRlbHRhICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MTA0Ij45MTA0PC9hPgorY29weSBwYWNrYWdlIHByb2dyZXNzIGRpYWxvZyBoYXMgbWlzc2luZyBzdHJpbmcgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcwNiI+NTcwNjwvYT4gIAorQ2Fubm90IGFkZCB0d28gZm9sZGVycyB3LyBzYW1lIG5hbWUgYnV0IGRpZmYgcHJvamVjdHMgdG8gYnVpbGQgcGF0aCBvZiBKYXZhIHByb2plY3QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkxMDMiPjkxMDM8L2E+CitTZWFyY2ggcmVwb3J0cyBubyByZWZlcmVuY2VzIHRvIFNXVC5IZWxwICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDE4Ij42NDE4PC9hPgorU2NyYXBib29rOiAiVW5leHBlY3RlZCBFbmQgT2YgRmlsZSIgZXhwZWN0ZWQgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTEiPjMxOTE8L2E+CitKTSAtIG5vbi1leGlzdGluZyBleHRlcm5hbCBqYXJzIHdpbGwgbm90IGNvbWUgdG8gbGlmZSB3aGVuIGNyZWF0ZWQgKDFGV0k1QzQpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTgwIj44OTgwPC9hPgorVW5wcmVkaWN0YWJsZSBlcnJvciBjYXRjaGluZyBvbiBvdmVycmlkZGVuIG1ldGhvZHMgd2l0aCBsZXNzIHZpc2liaWxpdHkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDI0Ij45MDI0PC9hPgorRG8gbm90IGZpbmQgcmVmZXJlbmNlIHRvIGFuIGludGVyZmFjZSBpbiBKQVIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA0MCI+OTA0MDwvYT4KK0RPTS9BU1Q6IHdoeSBpcyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBhbiBleHByZXNzaW9uIAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMjA1IC0gNXRoIEZlYnJ1YXJ5IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI2Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IFRoZSBKYXZhTW9kZWwgbm8gbG9uZ2VyIG5vdGlmaWVzIGNoYW5nZXMgZm9yIGdlbmVyYXRlZCBjbGFzc2ZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyLCB0aGVzZSAKK3dlcmUgbmV2ZXIgc3VwcG9zZWQgdG8gYmUgc2lnbmFsZWQuIDwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0OCI+MzQ0ODwvYT4KK05vIGVycm9yIGZvciBwYWNrYWdlIGFuZCB0eXBlIGNvbGxpc2lvbiBpbiBkZWZhdWx0IHBhY2thZ2UKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MDE2Ij45MDE2PC9hPgorRE9NL0FTVDogUHJvYmxlbXMgd2l0aCBhcnJheS5sZW5ndGggYWNjZXNzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwMTQiPjkwMTQ8L2E+CitET00vQVNUOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHJlc29sdmluZyBTeXN0ZW0uZXJyLnByaW50bG4gCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTAxOCI+OTAxODwvYT4KK0RPTS9BU1Q6IHdoeSBkb2VzIHRoZSBrZXkgb2YgYSB2YXJpYWJsZSBiaW5kaW5nIGluY2x1ZGUgdGhlIHR5cGUgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTM1NSI+NTM1NTwvYT4KK3NlYXJjaDogTlBFIGluIHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04OTI4Ij44OTI4PC9hPgorVW5hYmxlIHRvIGZpbmQgcmVmZXJlbmNlcyBvciBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kcyB0aGF0IHVzZSBzdGF0aWMgaW5uZXIgY2xhc3NlcyBpbiB0aGUgc2lnbmF0dXJlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjkxIj4zMjkxPC9hPgorRXhjZXB0aW9uIGFkZGluZyAuY2xhc3MgZmlsZSB0byBmb2xkZXIgaW4gcGFja2FnZSB2aWV3ICgxR0VVRjNJKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODkwMCI+ODkwMDwvYT4KK1NlYXJjaCBjYXVzaW5nIGludGVybmFsIGVycm9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODEyIj44ODEyPC9hPgorQ2hhbmdpbmcgZXhwb3J0IHN0YXRlIG5vdCBwcm9wYWdhdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NiI+ODg1NjwvYT4KK0RPTSBBU1Q6IHBvc2l0aW9ucyBhbmQgYmluZGluZ3MgbWlzc2luZyBvbiBRdWFsaWZpZWROYW1lIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDYiPjM0NDY8L2E+Cit0eXBlIGhpZXJhcmNoeTogaW5jb3JyZWN0IGJlaGF2aW9yIHdydCB3b3JraW5nIGNvcGllcyAoMUdMREhPQSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTAiPjMyMTA8L2E+CitTZWFyY2ggLSBtZXRob2QgZGVjbGFyYXRpb25zIHdpdGhpbiBUeXBlSGllcmFyY2h5IGdpdmVzIG5vIG1hdGNoZXMgKDFHNTRCTVIpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTQ1Ij44MTQ1PC9hPgorVHlwZURlY2xhcmF0aW9uIHNvdXJjZUVuZCBjb250YWlucyB0cmFpbGluZyBjb21tZW50IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4MzIiPjg4MzI8L2E+CitTYW5pdHkgY2hlY2sgZXJyb3IgKGludGVybmFsIGVycm9yKSB3aGVuIHVudXNlZCB2YXJpYWJsZXMgaW5zaWRlIGluaXRpYWxpemVycyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA3OCI+ODA3ODwvYT4KK01pc3NpbmcgcmVzb3VyY2UgaW4gY29weSBDVSBkaWFsb2cgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3NjQiPjg3NjQ8L2E+CitOUEUgd2hpbGUgY2xvc2luZyBwcm9qZWN0cyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1OSI+ODM1OTwvYT4KK0luZGV4IG91dCBvZiBkYXRlIHdoZW4gcmVwbGFjaW5nIGEgSkFSICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NzczIj44NzczPC9hPiAKK1ZlcmlmeUVycm9yIDogQSAuY2xhc3MgZmlsZSBleHBvcnRlZCBmcm9tIFZBSiBkb2VzIG5vdCBydW4gaW4gSkRLIDEuMi4yICgxR1BQRVQwKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2OTciPjg2OTc8L2E+IAorMiBjb21waWxlciBidWdzOiB0aGUgb3BlcmF0b3IgdW5rb3duIG9wZXJhdG9yIGlzIHVuZGVmaW5lZCBhbmQgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODcwNiI+ODcwNjwvYT4gCitDb21waWxlIGVycm9yIHdoZW4gY29tcGlsaW5nIGFuIGFub255bW91cyBjbGFzcyB3aGljaCBleHRlbmRzIGphdmEuYXd0LkZyYW1lCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODcwOSI+ODcwOTwvYT4gCitFcnJvciBjb21waWxpbmcgSkRLMS40IGNsYXNzZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzQwIj44MzQwPC9hPgoraW5hY2N1cmF0ZSBlcnJvciBtZXNzYWdlIHdoZW4gZGVwZW5kZW50IHByb2plY3QgaXMgY2xvc2VkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQ0Ij4zMzQ0PC9hPgorSmF2YUVsZW1lbnREZWx0YSByZXBvcnRzIGNoYW5nZWQgY2xhc3MgZmlsZXMgKDFHSVY4SUspICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04Mzg0Ij44Mzg0PC9hPiAKK1VuZXhwZWN0ZWQgY29tcGlsZSBlcnJvcnMgd2hlbiBhYnN0cmFjdCBtZXRob2QgbWlzc2luZyByZXR1cm4gdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg3ODkiPjg3ODk8L2E+IAorQ29tcGlsZXIgaW5jb3JyZWN0bHkgcmVwb3J0cyB0aGF0IGFic3RyYWN0IG1ldGhvZCBoYXMgYSBib2R5ICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTg3Ij43OTg3PC9hPgorRmllbGQgcmVmZXJlbmNlIHNlYXJjaCBzaG91bGQgZG8gbG9va3VwIGluIDEuNCBtb2RlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODYzIj44ODYzPC9hPgorLmNsYXNzcGF0aCBnZXRzIG92ZXJ3cml0dGVuIGlmIHRoZXJlJ3MgYW4gWE1MIGVycm9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MTYyIj43MTYyPC9hPgorSmF2YSBNb2RlbCBFeGNlcHRpb25zIGluIGxvZyBmcm9tIFR5cGVIaWVyYXJjaHlMaWZlQ3ljbGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2OTkiPjg2OTk8L2E+IAorQ29tcGlsZXIgZXJyb3IgbWVzc2FnZSBpbmNvbXBsZXRlOiBTeW50YXggZXJyb3Igb24gdG9rZW4gJycKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI0Ij4zMzI0PC9hPiAKK0JhZCBjb21waWxlciBlcnJvciAoMUdIRjI1UCkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0MSI+MzQ0MTwvYT4gIAorSW50ZXJuYWwgZXJyb3IgcmVuYW1pbmcgYSBjbGFzcyAoMUdMMlhDVykgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzg0MSI+Nzg0MTwvYT4gCitPdmVycmlkZW4gbWV0aG9kcyBpbnNlcnRlZCBwYXN0IHRoZSBlbmQgb2Ygc291cmNlCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTI5IC0gMjl0aCBKYW51YXJ5IDIwMDIKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjI1Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+IEphdmEgY29tcGlsZXIgaXMgSkNLIDEuNCBjb21wbGlhbnQuIFdoZW4gdG9nZ2xlZCBpbiAxLjQgbW9kZSAoYmF0Y2g6IC0xLjQgLXNvdXJjZSAxLjQpLCB0aGUgSmF2YSBjb21waWxlciBpcyBmdWxseSBKQ0sgMS40IGNvbXBsaWFudCAKK2FzIG9mIEpDSyAxLjQgMjAwMS0xMC0wMSB1cGRhdGUuIFdoZW4gaW4gMS4zIG1vZGUgKGRlZmF1bHQpLCBpdCBpcyBKQ0sgMS4zYSBjb21wbGlhbnQuCis8L2xpPgorPGxpPiBCeSBkZWZhdWx0LCB3aGVuIHRvZ2dsZWQgaW50byAxLjQgbW9kZSwgdGhlIGJhdGNoIGNvbXBpbGVyIHdpbGwgZW5hYmxlIGFzc2VydGlvbiBzdXBwb3J0IChlLmcuIC1zb3VyY2UgMS40KS4gSXQgY2FuIHN0aWxsIG1hbnVhbGx5CitiZSB0b2dnbGVkIGZvciAxLjMgc291cmNlIGxldmVsIGNvbXBhdGliaWxpdHkgKC1zb3VyY2UgMS4zKS4KKzwvbGk+Cis8bGk+IEFkZGVkIGNvbnN0cnVjdG9yIDxjb2RlPlNlYXJjaEVuZ2luZShJV29ya2luZ0NvcHlbXSk8L2NvZGU+CisgICAgIHdoaWNoIHRha2VzIGEgbGlzdCBvZiB3b3JraW5nIGNvcGllcyB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIAorICAgICBvdmVyIHRoZWlyIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXRzIGluIHRoZSBzdWJzZXF1ZW50IHNlYXJjaCAKKyAgICAgb3BlcmF0aW9ucyBvbiB0aGlzIHNlYXJjaCBlbmdpbmUuCisgICAgIDxicj4KKyAgICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgc29tZQorICAgICBwYXJ0cyBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIEZlZWRiYWNrIGlzIHdlbGNvbWUuCis8L2xpPgorPGxpPiBOZXcgZmVhdHVyZSB0byBhY2hpZXZlIHByb2JsZW1zIGNvcnJlY3Rpb25zIDogb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29ycmVjdGlvbkVuZ2luZS4KKyAgICAgQ29ycmVjdGlvbiByZXN1bHRzIGFyZSBhbnN3ZXJlZCB0aHJvdWdoIGEgcmVxdWVzdG9yIChvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29ycmVjdGlvblJlcXVlc3RvcikuCis8L2xpPgorPGxpPiBKYXZhQ29yZSB3aWxsIG5vIGxvbmdlciBhZGQgaW5kaXJlY3RseSBwcmVyZXEnZWQgcHJvamVjdCBhbW9uZ3N0IHByb2plY3QgcmVmZXJlbmNlcy4KKzwvbGk+Cis8bGk+IE5ldyBKRE9NIEFTVCBBUEkgYXZhaWxhYmxlIChhbHNvIHNlZSA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20lMjBhc3QvYXN0Lmh0bWw/cmV2PTEuMSZjb250ZW50LXR5cGU9dGV4dC9odG1sIj5kZXNpZ24KK25vdGU8L2E+KS4gVGhpcyBBUEkgaGFzIG5vdCB5ZXQgcmVhY2hlZCBmdWxsIHN0YWJpbGl0eSwgYW5kIGZlZWRiYWNrIGlzIHZlcnkgd2VsY29tZS4KKzwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODY0MSI+ODY0MTwvYT4KK0Nhbid0IGZpbmQgcmVmZXJlbmNlcyBpbiBoaWVyYXJjaHkgaW4gYmluYXJ5IHByb2plY3RzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjU5Ij44NjU5PC9hPiAgCitVbmV4cGVjdGVkIGNoYW5nZXMgaW4gcHJvamVjdCByZWZlcmVuY2VzICgudmNtLW1ldGEpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MzU4Ij44MzU4PC9hPgorU2VhcmNoOiBkb2Vzbid0IGZpbmQgcmVmZXJlbmNlIGFsdGhvdWdoIHRoZXJlIGFyZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc5OSI+Njc5OTwvYT4KK0R1cGxpY2F0ZSB0eXBlIGNvbGxpc2lvbnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NDE0Ij44NDE0PC9hPgorSW5jb3JyZWN0ICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmc/Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODQ4NCI+ODQ4NDwvYT4KK0ludGVybmFsIGVycm9yIHNlYXJjaGluZyBmb3Igd3JpdGUgYWNjZXNzIHRvIGEgdmFyaWFibGUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg1MzYiPjg1MzY8L2E+CitCdWcgb24gIk9wZW4gdHlwZSBoaWVyYXJjaHkiICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTc1Ij44NTc1PC9hPgorVmFyaWFibGUgbmFtZSBjb2RlIGNvbXBsZXRpb24gc2hvdWxkIGhhbmRsZSBhcnJheXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NTMwIj44NTMwPC9hPgorSW50ZXJuYWwgZXJyb3IgdXNpbmcgYXNzZXJ0aW9ucyAoMS40IGZlYXR1cmUpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODUzMSI+ODUzMTwvYT4KK1ZlcmlmeUVycm9yIGluIGNvZGUgY29udGFpbmluZyBhc3NlcnRpb25zCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzUwOSI+NzUwOTwvYT4KKzFHUTZEVUM6IFdTV0I6V0lOMjAwMCAtIEN0cmwtc3BhY2UgQ29kZSBDb21wbGV0aW9uIGRvZXMgbm90IHdvcmsKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDYwIj44MDYwPC9hPgorSGllcmFyY2h5IG9ubHkgc2hvd3MgT2JqZWN0IHdoZW4gb3BlbmluZyB0eXBlIGluIGJpbmFyeSBwcm9qZWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA4Ij4zNDA4PC9hPgorSkNLIDEuNCAtIE5BTUUgLSBxdWFsaWZpZWQgQW1iaWd1b3VzTmFtZSBhbmQgYW4gRXhwcmVzc2lvbk5hbWUgKDFHSzdNOUIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODU4NCI+ODU4NDwvYT4KK0ludmFsaWQgc3ludGF4IGVycm9yIGdlbmVyYXRlZCBieSBjb21waWxlcgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTI0IC0gMjR0aCBKYW51YXJ5IDIwMDIgLSBNSUxFU1RPTkUgMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzU0Ij4xMTM1NDwvYT4KK1VuYWJsZSB0byBlZGl0IEphdmEgY29kZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwMTYiPjgwMTY8L2E+CitnZXR0ZXIvc2V0dGVyIG91dGxpbmVyIHJlY29uY2lsaW5nIGJyb2tlbiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODM1MiI+ODM1MjwvYT4KK05vIGhpZXJhcmNoeSB3aGVuIHVzaW5nIEhpZXJhY2h5VHlwZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODA0MiI+ODA0MjwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBob3ZlcmluZyBpbiBqYXZhIGVkaXRvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgyMTYiPjgyMTY8L2E+CitJbmNvbXBsZXRlIHN1cGVyIHR5cGUgaGllcmFyY2h5IGZvciBiaW5hcmllcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODEyNSI+ODEyNTwvYT4KKydDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSB0eXBlIG5hbWUnIG1lc3NhZ2Ugb3BlbmluZyB0eXBlICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MjIxIj43MjIxPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHJlbmFtaW5nIHBhY2thZ2UgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzNDEiPjUzNDE8L2E+CitFcnJvciBtZXNzYWdlIHNob3VsZG4ndCBleHBvc2UgZXhjZXB0aW9uIGNsYXNzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MDM4Ij44MDM4PC9hPgorTnVsbCBQb2ludGVyIEV4Y2VwdGlvbiBBZGRpbmcgVW5pbXBsZW1lbnRlZCAgCisKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEyMyAtIDIzcmQgSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMworPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPkFkZGVkIHdvcmthcm91bmQgZm9yIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NjQiPjc3NjQ8L2E+CitVSSBEZWFkIExvY2sgLSBJREUgZnJvemVuICAKKzwvdWw+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjAwIj4zMjAwPC9hPgorSmF2YUJ1aWxkZXIgLSBCdWlsZCBwcm9ncmVzcyBtZXNzYWdlIGNvdWxkIGJlIHNob3J0ZW5lZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgwODciPjgwODc8L2E+CitOUEUgd2hlbiBoaWVyYXJjaHkgdmVyYm9zZSBvbiBhbmQgaGllcmFyY2h5IG9uIGEgcmVnaW9uICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CisKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDEyMiAtIDIybmQgSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBUaGUgc2VsZWN0aW9uIGVuZ2luZSBub3cgb25seSBzZWxlY3RzIGlkZW50aWZpZXIgYmV0d2VlbiBzZWxlY3Rpb24gc3RhcnQgYW5kIHNlbGVjdGlvbiBlbmQuCitQcmV2aW91cyBiZWhhdmlvdXIgd2FzIHRvIHNlbGVjdCBpZGVudGlmaWVyIGJldHdlZW4gc2VsZWN0aW9uIHN0YXJ0IGFuZCBpZGVudGlmaWVyIGVuZC4KKyhlLmcuIGlmIHlvdSBzZWxlY3QgPGI+RmlsZTwvYj4gaW4gPGI+RmlsZTwvYj5JbnB1dCwgbm93IHRoZSBzZWxlY3Rpb24gZW5naW5lIHNlbGVjdCB0aGUgY2xhc3MgRmlsZSBhbmQgbm90IEZpbGVJbnB1dCkKKzxsaT4gRml4IGZvciA8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODM5Ij42ODM5PC9hPiByZXF1aXJlZCB0byBpbmNyZW1lbnQgdGhlIGluZGV4IHNpZ25hdHVyZSAKK3ZlcnNpb24gc28gYXMgdG8gdHJpZ2dlciBhdXRvbWF0aWMgcmVpbmRleGluZyBvbiB3b3Jrc3BhY2Ugc3RhcnR1cCAoYW5kIHRodXMgZ2V0IHJpZCBvZiB1bmRlc2lyZWQgYW5vbnltb3VzIHR5cGUgZW50cmllcworaW4gdGhlIGluZGV4IGZpbGVzKS4gU3Vic2VxdWVudCBzdGFydHVwcyB3aWxsIG5vdCByZWluZGV4IGFueSBmdXJ0aGVyIChvbmx5IGlmIGluY29uc2lzdGVuY3kgaXMgZGV0ZWN0ZWQsIGUuZy4gc2lnbmF0dXJlIHZlcnNpb24KK2lzIGRpZmZlcmVudCkuCis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk5MyI+Nzk5MzwvYT4KK05QRSB3aGVuIGNyZWF0aW5nIHR5cGUgaGllcmFyY2h5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDE3Ij4zNDE3PC9hPiAKK0pDSyAxLjQgLSBCSU5DIC0gdGhlIG5ldyBtZXRob2QgaXMgYSBzdGF0aWMgKHJlc3BlY3RpdmVseSBpbnN0YW5jZSkgbWV0aG9kLiAoMUdLN1dDUCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDE2Ij4zNDE2PC9hPiAKK0pDSyAxLjQgLSBCSU5DIC0gdGhlIG5ldyBtZXRob2QgaXMgbGVzcyBhY2Nlc3NpYmxlIHRoYW4gdGhlIG9sZCBvbmUgKDFHSzdWWEQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNSI+MzQxNTwvYT4gCitKQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgZmllbGQgaXMgYSBzdGF0aWMgKHJlc3BlY3RpdmVseSBpbnN0YW5jZSkgZmllbGQgKDFHSzdWU04pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxNCI+MzQxNDwvYT4gCitKQ0sgMS40IC0gQklOQyAtIHRoZSBuZXcgZmllbGQgaXMgbGVzcyBhY2Nlc3NpYmxlIHRoYW4gdGhlIG9sZCBvbmUgKDFHSzdWTUQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxMyI+MzQxMzwvYT4gCitKQ0sgMS40IC0gQklOQyAtIGRldGVjdGlvbiBvZiBhbiBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yICgxR0s3VkNBKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTIiPjM0MTI8L2E+IAorSkNLIDEuNCAtIEJJTkMgLSBJbnZva2Ugb3ZlcnJpZGluZyBjbGFzcyBtZXRob2RzICgxR0s3VUdRKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTAiPjM0MTA8L2E+IAorSkNLIDEuNCAtIEJJTkMgLSBBZGRpbmcgYSBTdHJpbmcgZmllbGQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIFN0cmluZyBmaWVsZCBvZiBhIHN1cGVyY2xhc3MgKDFHSzdNSE8pCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzkyMCI+NzkyMDwvYT4KK0phdmFQcm9qZWN0LmNhbm9uaWNhbGl6ZWRQYXRoICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTk3Ij43NTk3PC9hPgorUGFja2FnZUZyYWdtZW50Um9vdCB3aGljaCBhcmUgYXJjaGl2ZXMgbG9vc2UgYXNzb2NpYXRlZCByZXNvdXJjZSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzgyNyI+NzgyNzwvYT4KK251bGwgcmV0dXJuZWQgZnJvbSBnZXRPcmlnaW5hbChJSmF2YUVsZW1lbnQgd29ya2luZ0NvcHlFbGVtZW50KSBmb3IgSU1QT1JUX0NPTlRBSU5FUiAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NCI+NzE0NDwvYT4KK0hpZXJhcmNoeSBpbmNvcnJlY3Qgd2hlbiB1c2luZyBiaW5hcnkgcHJvamVjdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MTEiPjM0MTE8L2E+CitKQ0sgMS40IC0gQklOQyAtIE92ZXJyaWRpbmcgaW5zdGFuY2UgYW5kIGNsYXNzIG1ldGhvZHMgKDFHSzdVNkMpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDE4Ij4zNDE4PC9hPgorSkNLIDEuNCAtIEVYUFIgLSBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHJhaXNlZCBpbiBydW4gdGltZSAoMUdLN1dIQSkgIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDQxIj43NDQxPC9hPgorT3BlbiBhIHR5cGUgaXMgZXh0cmVtZWx5IHNsb3cgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2MTYiPjc2MTY8L2E+CitVbm5lY2Vzc2FyeSBpbmRleGluZyB3aGVuIHByb2plY3QgaXMgb3BlbmVkICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI5Ij4zMjI5PC9hPgorT3Blbk9uU2VsZWN0aW9uIC0gc3RyYW5nZSBiZWhhdmlvdXIgb2YgY29kZSByZXNvbHZlICgxR0FWTDA4KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NTMiPjY5NTM8L2E+CitObyBjb2RlIGFzc2lzdCBwcm9wb3NhbHMgZm9yIGludGVyZmFjZSBjb25zdHJ1Y3RvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1ODMiPjc1ODM8L2E+CitET01Ob2RlI2dldENoaWxkKFN0cmluZykgbmVlZHMgdG8gaGFuZGxlIGNoaWxkcmVuIHdpdGggbnVsbCBuYW1lcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTg0Ij43NTg0PC9hPgorQ29tbWVudHMgb24gSURPTU1ldGhvZCNnZXRSZXR1cm5UeXBlKCkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0NyI+MzI0NzwvYT4gCitTZWxlY3Rpb25FbmdpbmUgbW92ZXMgc2VsZWN0aW9uIHRvIGVuY2xvc2luZyB0b2tlbiAoMUdDU0Q4RCkKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTU2Ij43OTU2PC9hPgorTm8gcmVmZXJlbmNlIGZvdW5kIHRvIEJsb2NrU2NvcGUuYW5hbHlzaXNJbmRleCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MyI+MzI4MzwvYT4gCitPcGVuT25TZWxlY3Rpb24gLSBDb2RlIHJlc29sdmUgZG9lc24ndCB3b3JrIGluIHNvbWUgc2l0dWF0aW9ucyAoMUdFSTVRVCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDUzIj41NDUzPC9hPiAKK0RDUjogQ29kZSBBc3Npc3QgZm9yIGFub255bW91cyB0eXBlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc2MTciPjc2MTc8L2E+IAorTlBFIGluIEJ1aWxkZXIgd2l0aCBkdXBsaWNhdGVkIHR5cGUgbmFtZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDY2Ij42NDY2PC9hPiAKK0NvZGUgRm9ybWF0dGVyICAKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAyMDExNSAtIDE1dGggSmFudWFyeSAyMDAyCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIyMQorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPGxpPiBUaGUgY29tcGlsZXIgd2lsbCBub3cgZm9sbG93IEpMUyA4LjYgd2l0aCByZXNwZWN0IHRvIGFub255bW91cyBjbGFzcyAKK2NvbnN0cnVjdG9ycyAoaS5lLiBhbGxvdyB0aGVtIHRvIHRocm93IGFueSBleGNlcHRpb25zKS4KKzxsaT4gVGhlIGNvbXBpbGVyIG5vdyBlbmZvcmNlcyB0aGF0IGludGVyZmFjZSBtZXRob2RzIGJlIGNvbXBhdGlibGUgd2l0aCBPYmplY3Qgb25lcy4KKzxsaT4gVGhlIGJhdGNoIGNvbXBpbGVyIHdpbGwgbm8gbG9uZ2VyIGNyZWF0ZSBwYWNrYWdlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW55bW9yZSB3aGVuIHRoZSBjb21tYW5kIGxpbmUKK2FyZ3VtZW50ICctZCcgPHR0PjxkZXN0aW5hdGlvbj48L3R0PiBpcyBvbWl0dGVkIChjb21wbGlhbnQgd2l0aCBzdGFuZGFyZCBiYXRjaCBjb21waWxlcnMpLgorPGxpPiBBIHR5cGUgaGllcmFyY2h5IHRoYXQgbWlzc2VzIGEgc3VwZXIgdHlwZSBpcyBub3Qgcm9vdGVkIGF0IE9iamVjdCBhbnkgbG9uZ2VyLAorICAgICBidXQgdGhlIHN1YnR5cGUgKG9mIHRoZSBtaXNzaW5nIHR5cGUpIHdpbGwgYmUgYSByb290ICh0aGlzIGlzIHRoZSBiZWhhdmlvciBvZgorICAgICBWQS9KYXZhIGFuZCBWQU1FLikKKzxsaT4gQWRkaW5nIGEgdHlwZSB0aGF0IHdhcyBtaXNzaW5nIGZyb20gYSBoaWVyYXJjaHkgd2lsbCB1cGRhdGUgdGhlIGhpZXJhcmNoeSBjb3JyZWN0bHkuCis8bGk+IE5ldyBBUEkgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IgZm9yIHN1Z2dlc3QgYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb246PC9saT4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPHR0PnZvaWQgYWNjZXB0QW5vbnltb3VzVHlwZSg8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gc3VwZXJUeXBlTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsPC90dD4KKzxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBjb21wbGV0aW9uTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IG1vZGlmaWVycyw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25TdGFydCw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IGNvbXBsZXRpb25FbmQpOzwvdHQ+Cis8YnI+Jm5ic3A7Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNSI+NzYyNTwvYT4KK05vIHR5cGVoaWVyYXJjaHkgaW4gd29ya2luZyBjb3B5ICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NTk1Ij43NTk1PC9hPgorTmV3IGJ1aWxkZXIgcGVyZm9ybXMgaW50ZW1wZXN0aXZlIGZ1bGwgYnVpbGQgb24gbWV0aG9kIGJvZHkgY2hhbmdlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc1MjgiPjc1Mjg8L2E+CitJbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBwYXRoIGNhbm9uaWNhbGlzYXRpb24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMzQiPjcwMzQ8L2E+Citjb2RlIGFzc2lzdCBwZXJmb3JtYW5jZSBwcm9ibGVtIGluIHNjcmFwYm9vaworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMTkiPjcxMTk8L2E+CitDb250ZW50IEFzc2lzdCBkb2VzIG5vdCBjb21wbGV0ZSBzb21lIGNvZGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDAwIj43MDAwPC9hPgorU3dpdGNoIGFuZCBUcnkgc3RhdGVtZW50IGRvZXNuJ3QgaW5jbHVkZSB0cmFpbGluZyB9IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MzIiPjY5MzI8L2E+CitJbmNyZW1lbnQgc3RhdGVtZW50IGluIGZvciBsb29wIGNvbnRhaW5zIHRyYWlsaW5nIGNvbW1lbnRzIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYzNDIiPjYzNDI8L2E+CitDb2RlIGFzc2lzdCBvbiBJbnRyZWZhY2UtJ0NvbnN0cnVjdG9ycycgaW5jb21wbGV0ZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNDQiPjczNDQ8L2E+CitTZWFyY2ggLSB3cml0ZSBhY2NlcyBnaXZlIHdyb25nIHJlc3VsdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NSI+NzQ1NTwvYT4gIAorQnVpbGQgcHJvYmxlbXMgd2hlbiBpbnN0YW5jZSB2YXJpYWJsZSBuYW1lIG1hdGNoZXMgY29uc3RydWN0b3IgcGFyYW1ldGVyIG5hbWUgYW5kIGFzc2lnbm1lbnQgdG8gdGhpcy5uYW1lIGluIHRyeSBibG9jayAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjgzOSI+NjgzOTwvYT4KK0FsbFR5cGVzU2VhcmNoRW5naW5lIHJldHVybnMgYW5vbnltb3VzIGNsYXNzZXMgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NSI+NzQ0NTwvYT4KK2NoYXIvc3RyaW5nIGNvbmNhdCBidWcgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTIiPjMxOTI8L2E+CitJbnZhbGlkIHR5cGUgaGllcmFyY2h5IHdoZW4gbWlzc2luZyB0eXBlKHMpIGluIGhpZXJhcmNoeSAoMUdGNVJONCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDQiPjMzMDQ8L2E+CitIaWVyYXJjaHkgbm90IHVwZGF0ZWQgd2hlbiBjaGFuZ2luZyBjbGFzc3BhdGggKDFHRjVRU1cpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NDIyIj43NDIyPC9hPgorTWlzc2luZyBwcm9qZWN0IHJlZmVyZW5jZXMgb24gc29tZSBpbXBvcnRlZCBKYXZhIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA2NyI+NTA2NzwvYT4KK0NvZGVBc3Npc3QgLSBubyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb24gZm9yIGJhc2UgdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczNjMiPjczNjM8L2E+CitSZWJ1aWxkIFByb2plY3QgYWN0aW9uIGlzIG5vdCBjb21waWxpbmcgYWxsIEphdmEgc291cmNlIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMyNSI+NzMyNTwvYT4KK0J1aWxkIGNvbGxpc2lvbnMgc2hvdWxkIGJlIG5vbi1mYXRhbD8KKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzI0Ij43MzI0PC9hPgorQW1iaWd1b3VzIG11bHRpcGxlIHByb2JsZW0gZGVzY3JpcHRpb25zIHdoZW4gY29sbGlzaW9uIG9mIGJ1aWxkIGZpbGVzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NSI+MzM4NTwvYT4KK0pDSyAxLjQgLSBJTlRGIC0gaWxsZWdhbCBtZXRob2QgZGVjbGFyYXRpb24gZm9yIGludGVyZmFjZSAoMUdLMkFXUykKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE4Ij4zMzE4PC9hPgorSkRPTSAtIElEb21Ob2RlIHJlZGVmaW5lcyBjbG9uZSgpIHdpdGggZGlmZmVyZW50IHNpZ25hdHVyZSAoMUdGVlUyVikKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTAxIj42MTAxPC9hPgorVW5leHBlY3RlZCBlcnJvciBpbiBpbm5lciBjbGFzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzMzIj43MzMzPC9hPgordHlwbyBpbiB0eXBlIG5hbWU6IFJlc2V0U2F0ZUZvckNvZGVHZW5lcmF0aW9uVmlzaXRvciAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzU0Ij43MzU0PC9hPgorQ29tcGF0aWJpbGl0eSB3aXRoIGphdmFjIHdoZW4gbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ3MyI+NjQ3MzwvYT4KK0phdmFDb252ZW50aW9ucyBzaG91bGQgdXNlIElXb3Jrc3BhY2UgdmFsaWRhdGUgbWV0aG9kcyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyOSI+NzEyOTwvYT4KK1Byb2JsZW1zIHdpdGggcmVwbGFjaW5nIGEgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODYiPjMzODY8L2E+CitKQ0sgMS40IC0gRVhDUCAtIGNoZWNrZWQgZXhjZXB0aW9uIGluIHZhcmlhYmxlIGluaXRpYWxpemVyIG9mIGFub255bW91cyBjbGFzcyAoMUdLN0I1TCkKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY3Ij4zMzY3PC9hPgorSkNLIDEuNCAtIElDTFMgLSBBbiBpbnN0YW5jZSBpbml0aWFsaXplciBpbiBhbiBhbm9ueW1vdXMgY2xhc3MgbWF5IHRocm93IGFueSBleGNlcHRpb24gKDFHSzdMWUYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE4NCI+NzE4NDwvYT4KK0J1aWx0IGluIGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IGFub255bW91cyBjbGFzcyBpbml0aWFsaXplcnMgdG8gdGhyb3cgZXhjZXB0aW9ucyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTA0Ij42NTA0PC9hPgorVHlwZSBoaWVyYXJjaHk6IFN1YnR5cGVzIGluIGphciBvZiBhbm90aGVyIHByb2plY3Qgbm90IGZvdW5kICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzM0Ij4zMzM0PC9hPgorVHlwZXMgaGllcmFyY2h5IHZpZXcgZG9lcyBub3Qgc2hvdyBhbGwgc3ViY2xhc3Nlcy4gKDFHSTkwMVEpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODY2Ij42ODY2PC9hPiAgCitDb2RlLUFzc2lzdCAoY3RybCtzcGFjZSkgdG8gc2xvdyB3aXRoIGpyZS1zcmMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDcxIj43MDcxPC9hPiAgCitBcnJheVN0b3JlRXhjZXB0aW9uIGdldHRpbmcgaG92ZXJoZWxwIGluIEphdmEgZWRpdG9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzE2NSI+NzE2NTwvYT4gIAorZXJyb25lb3VzIHdhcm5pbmcgb2YgdW51c2VkIHZhcmlhYmxlcyAgCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNyI+MzIxNzwvYT4KK0pNIC0gZGVsZXRpbmcgZGVmYXVsdCBwYWNrYWdlICgxRzg0MTdaKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NSI+NzM3NTwvYT4KK25ldyBjbGFzc2VzIHdpdGggZnVubnkgbmFtZXMgZG9uJ3QgYXBwZWFyIGluIHBhY2thZ2UgdmlldyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMiI+NzMwMjwvYT4KK05lZWQgdmlzaWJpbGl0eSBpbiBzZWFyY2ggcmVzdWx0cyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MzA1Ij43MzA1PC9hPgoraW50ZXJmYWNlIG1ldGhvZHMgYXJlIG1hcmtlZCBhYnN0cmFjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcyOTAiPjcyOTA8L2E+CitQcm9qZWN0IHNpemUgbGltaXRhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMzIiPjYyMzI8L2E+CitCdWlsZCBwcm9ibGVtczogSW50ZXJuYWwgZXJyb3I6IG51bGwgd2hlbiBjb21waWxpbmcgSkRLIHNvdXJjZSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MCI+NzM4MDwvYT4KK1dyb25nIHNjb3BlIGZvciB0cmF2ZXJzZSBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEzNyI+NzEzNzwvYT4KK0ludmFsaWQgdHlwZSBub3QgZmxhZ2dlZCBieSBjb21waWxlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MjQiPjY5MjQ8L2E+CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBidWlsZCBwYXRoLgorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTA4IC0gOHRoIEphbnVhcnkgMjAwMgorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMjBhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+CitBZGRlZCBuZXcgY29tcGlsZXIgb3B0aW9uIHRvIHRvZ2dsZSBjb21wbGlhbmNlIGxldmVsIChjYW4gYmUgZWl0aGVyCisiMS4zIiBvciAiMS40IiAtIDEuMyBiZWluZyB0aGUgZGVmYXVsdCksIGFuZCBpdCB3aWxsIGFmZmVjdCB0aGUgYmVoYXZpb3IKK29mIHRoZSBjb21waWxlciB3aXRoIHJlc3BlY3QgdG8gSkxTIDguMS41IChpbmhlcml0ZWQgbWVtYmVyIHNoYWRvd3MgZW5jbG9zaW5nCitvbmUpLiBPcHRpb24gaXMgbG9jYXRlZCBvbiA8dHQ+SmF2YUNvcmUjZ2V0T3B0aW9ucygpPC90dD4gYW5kIG5hbWVkIDx0dD4ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSI8L3R0PgorQWNjb3JkaW5nbHksIHRoZSBiYXRjaCBjb21waWxlciBhY2NlcHRzIGFuIGV4dHJhIGNvbW1hbmQgbGluZSBhcmd1bWVudAorIi0xLjMiIG9yICItMS40IiAoMS4zIGNvbXBsaWFuY2UgYmVpbmcgdGhlIGRlZmF1bHQpLjwvbGk+Cis8L3VsPgorPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMzAiPjMzMzA8L2E+ICAKK0pDSyAxLjQgLSBpbGxlZ2FsIHNpbXBsZSBuYW1lIGltcG9ydHMgKDFHSFcwRzEpICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDcwIj43MDcwPC9hPgorbW92ZWQgY2xhc3NlcyBsb3N0ISAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc4NSI+Njc4NTwvYT4KK05QRSBpbiBJVHlwZS5yZXNvbHZlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc3OSI+Njc3OTwvYT4KK3NlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVkIC0gbWlzc2luZyBleGNlcHRpb24gdHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMzUiPjcwMzU8L2E+IAorTmV3IGJ1aWxkZXIgLSBidWlsZGVyIGRvZXMgbm90IGNsb3NlIGFsbCBKQVJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMyI+NzAzMzwvYT4KK1N0YWxlIHBhY2thZ2VzIHZpZXcgYWZ0ZXIgbW92aW5nIGNvbXBpbGF0aW9uIHVuaXRzICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTI3Ij42OTI3PC9hPgorU3RhdGljIGlubmVyIGNsYXNzIHdvbid0IGNvbXBpbGUgKGRvZXNuJ3QgbWF0Y2ggSkRLIGJlaGF2aW9yKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcwMzAiPjcwMzA8L2E+CitJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcmVuYW1pbmcgcHJvamVjdCAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAyOSI+NzAyOTwvYT4KK1JlbmFtaW5nIGEgSmF2YSBwcm9qZWN0IGRvZXNuJ3QgcmVmcmVzaCB0aGUgcGFja2FnZXMgdmlldyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNyI+NzAyNzwvYT4KK3Byb2plY3QgZ29uZSBhZnRlciByZW5hbWluZyBpbiB0aGUgbmF2aWdhdG9yICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDI2Ij43MDI2PC9hPgord2Fsa2JhY2sgb24gcmVuYW1lIHByb2plY3QgLSBjb3VsZCBub3QgcmVwcm9kdWNlICAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODg5Ij42ODg5PC9hPgorTm8gdHlwZWhpZXJhcmNoeSBmb3IgaW5uZXIgdHlwZXMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDMiPjMzNDM8L2E+CitNaXNzaW5nIGphdmEubGFuZy5PYmplY3Qgc2hvdWxkIHByb2R1Y2UgYSBtb3JlIHByb21pbmVudCBjb21waWxlciBlcnJvcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5NDgiPjY5NDg8L2E+CitOZXcgYnVpbGRlciAtIGJ1aWxkZXIgZG9lcyBub3QgcmV1c2Ugb3BlbmVkIEpBUnMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzE0Ij4zMzE0PC9hPgorUmVzb3VyY2VzIG5vdCBhcHBlYXJpbmcgaW4gSmF2YSBwZXJzcGVjdGl2ZSBvciBKYXIgZXhwb3J0IHdpemFyZCAoMUdGTDBRVCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4OTAiPjY4OTA8L2E+CitNRVRBLUlORiBoaWRkZW4gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5OTMiPjY5OTM8L2E+CitKYXZhTW9kZWwgaW5jb25zaXN0ZW5jaWVzIHdpdGggdW5pdHMgb3V0c2lkZSBjbGFzc3BhdGggIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjAiPjMzNjA8L2E+IAorQ29kZSBhc3Npc3QgZG9lcyBub3Qgd29yayBpbiBpbm5lciBjbGFzc2VzICgxR0pPVlQ2KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4OTMiPjY4OTM8L2E+IAorTG9jYWxUeXBlRGVjbGFyYXRpb24gaW5jbHVkZXMgcHJlY2VlZGluZyBjb21tZW50IGV2ZW4gaWYgdGhlcmUgYXJlIHN0YXRlbWVudHMgaW4gYmV0d2VlbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzIiPjMzNzI8L2E+IAorTWFya2VycyBmb3IgYnVpbGQgcGF0aCBub3QgdXBkYXRlZCBvbiAocmUtKSBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MTMiPjU0MTM8L2E+IAoraW5jb3JyZWN0IGNsYXNzIHNvdXJjZSByYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0MjkiPjY0Mjk8L2E+CitkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgaW5jb3JyZWN0IG9uIGxvY2FsIHZhcmlhYmxlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQzMyI+NjQzMzwvYT4KK2RlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBpbmNvcnJlY3Qgb24gbG9jYWwgdmFyaWFibGUgIzIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzUiPjMyMzU8L2E+CitQYWNrYWdlRnJhZ21lbnRSb290IGV4aXN0ZW5jeSBjaGVjayBuZWVkIHRvIGJlIHJldmlzaXRlZCAoMUdDVU5PNykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4NjUiPjY4NjU8L2E+CitvcGVuIG9uIHNlbGVjdGlvbiBpbiBCdWlsZE5vdGlmaWVyIG9ubHkgZmluZHMgY29udGVudHMgb2YgcnQuamFyICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwMzciPjYwMzc8L2E+CitKYXJQYWNrYWdlRnJhZ21lbnRSb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpIGFsd2F5cyByZXR1cm5zIG51bGwKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NTAiPjY3NTA8L2E+CitCYXRjaCBjb21waWxlciAtIENsYXNzcGF0aCBoYW5kbGluZyBpcyB0b28gc3RyaWN0ICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDkiPjM0MDk8L2E+CitKQ0sgMS40IC0gU1RNVCAtIG51bGwgbGl0ZXJhbCBpbiB0aHJvdyBzdGF0ZW1lbnQgKDFHSzdNRVEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTE1Ij40OTE1PC9hPgorSkNLIDEuNCAtIG5lZWQgYSBtYWpvciBjb21waWxlciBzd2l0Y2ggZm9yIDEuMyAvIDEuNCBtb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02Njc4Ij42Njc4PC9hPgorSW5jb3JyZWN0IG91dHB1dCBhZnRlciBBZGQgVW5pbXBsZW1lbnRlZCBNZXRob2QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjEiPjMzNjE8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwdWJsaWMgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3TEFBKSAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTAiPjMzNTA8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0RWSikgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MSI+MzM1MTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0RaVikgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MiI+MzM1MjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0VCOSkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzYyIj4zMzYyPC9hPgorSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3TENYKSAgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2MyI+MzM2MzwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIHZhcmlhYmxlIHRoYXQgc2hhZG93cyBhIG5hbWUgZnJvbSBhbiBlbmNsb3Npbmcgbm9uLXBhY2thZ2Ugc2NvcGUgKDFHSzdMSFIpICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjQiPjMzNjQ8L2E+CitKQ0sgMS40IC0gSUNMUyAtIEFuIGluaGVyaXRlZCBtZXRob2QgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xLVikgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NSI+MzM2NTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gQW4gaW5oZXJpdGVkIGNsYXNzIHRoYXQgc2hhZG93cyBhIG5hbWUgZnJvbSBhbiBlbmNsb3Npbmcgbm9uLXBhY2thZ2Ugc2NvcGUgKDFHSzdMVEEpICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjYiPjMzNjY8L2E+CitKQ0sgMS40IC0gSUNMUyAtIEFuIGluaGVyaXRlZCBpbnRlcmZhY2UgdGhhdCBzaGFkb3dzIGEgbmFtZSBmcm9tIGFuIGVuY2xvc2luZyBub24tcGFja2FnZSBzY29wZSAoMUdLN0xXMikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzUiPjMzNzU8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHByb3RlY3RlZCBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0ZMQykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzYiPjMzNzY8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0ZPVCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNzciPjMzNzc8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RlRBKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3OCI+MzM3ODwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3Rlg3KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3OSI+MzM3OTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3RzJBKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MCI+MzM4MDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdHNUEpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgxIj4zMzgxPC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwcm90ZWN0ZWQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0c4RSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODIiPjMzODI8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHB1YmxpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gbmVzdGVkIGNsYXNzICgxR0s3R0MxKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MyI+MzM4MzwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0dRQSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODQiPjMzODQ8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzLiAoMUdLN0NUVikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODciPjMzODc8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHVibGljIGZpZWxkIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdIMEIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg4Ij4zMzg4PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBmcm9tIHN1cGVyY2xhc3MgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0JHUCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODkiPjMzODk8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdEMlApCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkwIj4zMzkwPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RDdRKSAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTEiPjMzOTE8L2E+CitKQ0sgMS40IC0gSUNMUyAtIHN0YXRpYyBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdEQkQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkyIj4zMzkyPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdFUkUpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzkzIj4zMzkzPC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHJvdGVjdGVkIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdFVkIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk0Ij4zMzk0PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgcHVibGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdFWkIpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk1Ij4zMzk1PC9hPgorSkNLIDEuNCAtIElDTFMgLSBzdGF0aWMgY2xhc3MgZnJvbSBvdXRlciBhbmQgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIG5lc3RlZCBjbGFzcyAoMUdLN0Y0UykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTYiPjMzOTY8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGNsYXNzIGZyb20gb3V0ZXIgYW5kIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgZnJvbSBzdXBlcmNsYXNzIGluIHRvcC1sZXZlbCBuZXN0ZWQgY2xhc3MgKDFHSzdGOEwpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzk3Ij4zMzk3PC9hPgorSkNLIDEuNCAtIElDTFMgLSBjbGFzcyBmcm9tIG91dGVyIGFuZCBwdWJsaWMgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RkNOKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5OCI+MzM5ODwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gY2xhc3MgZnJvbSBvdXRlciBhbmQgc3RhdGljIGNsYXNzIGZyb20gc3VwZXJjbGFzcyBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3RkhCKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5OSI+MzM5OTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3SDJaKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMCI+MzQwMDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwcm90ZWN0ZWQgZmllbGQgaW4gdG9wLWxldmVsIG5lc3RlZCBjbGFzcyAoMUdLN0dXNikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MDEiPjM0MDE8L2E+CitKQ0sgMS40IC0gSUNMUyAtIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3SEVGKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMiI+MzQwMjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwcm90ZWN0ZWQgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3SEgxKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwMyI+MzQwMzwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHByb3RlY3RlZCBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3SDVYKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNCI+MzQwNDwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gZmllbGQgZnJvbSBvdXRlciBjbGFzcyBhbmQgaW5oZXJpdGVkIHB1YmxpYyBmaWVsZCBpbiB0b3AtbGV2ZWwgbmVzdGVkIGNsYXNzICgxR0s3SEJKKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNSI+MzQwNTwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBwdWJsaWMgZmllbGQgaW4gbmVzdGVkIGNsYXNzICgxR0s3SEtFKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQwNiI+MzQwNjwvYT4KK0pDSyAxLjQgLSBJQ0xTIC0gc3RhdGljIGZpZWxkIGZyb20gb3V0ZXIgY2xhc3MgYW5kIGluaGVyaXRlZCBmaWVsZCBpbiBuZXN0ZWQgY2xhc3MgKDFHSzdITU4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDA3Ij4zNDA3PC9hPgorSkNLIDEuNCAtIElDTFMgLSBmaWVsZCBmcm9tIG91dGVyIGNsYXNzIGFuZCBpbmhlcml0ZWQgcHJvdGVjdGVkIGZpZWxkIGluIG5lc3RlZCBjbGFzcyAoMUdLN0w3OSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwNjEiPjYwNjE8L2E+Cit1bnJlYWNoYWJsZSBjb2RlL3VudXNlZCB0ZW1wID8gCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDQzIj42NDQzPC9hPgorSW5jcmVtZW50YWwgamF2YSBidWlsZGVyIGRvZXNuJ3QgaGFuZGxlIGZvbGRlciBjcmVhdGUvZGVsZXRlIG5pY2VseQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTMxNyI+NTMxNzwvYT4KK1JlcGFyZW50aW5nIGNsYXNzIHNob3VsZCByZWZyZXNoIGhpZXJhcmNoeSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzQwIj42NzQwPC9hPgorUHJvYmxlbXMgd2l0aCBkZWxldGluZyBwcm9qZWN0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDkxIj42NDkxPC9hPgorTm9uLWphdmEgcmVzb3VyY2UgZm9sZGVyIGRvZXNuJ3QgYXBwZWFyIHVuZGVyIHBrZyBmcmFnbWVudCByb290ICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDUiPjMyNDU8L2E+CitzdWIgZm9sZGVycyB3aXRoIGRvdCBub3QgdmlzaWJsZSBpbiBwYWNrYWdlcyB2aWV3ICgxR0NPSDE3KSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODA2Ij42ODA2PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gbW92aW5nIGVucHR5IGN1IG91dCBvZiBkZWZhdWx0IHBhY2thZ2UgIAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzA2NSI+NzA2NTwvYT4KK05QRSB3aGVuIHNhdmluZyBhIEphdmEgc291cmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU2Ij42OTU2PC9hPgoraW5jb3JyZWN0IGNvbXBpbGVyIGVycm9yIHJlcG9ydGVkIG9uIGV4dHJhY3QgbWV0aG9kCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDcyIj43MDcyPC9hPgorUHJvdGVjdGVkIG1lbWJlciBpbiBzdXBlcmNsYXNzIG5vdCB2aXNpYmxlIGluIHN1YmNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03MDY2Ij43MDY2PC9hPgorU3ViY2xhc3MgY2FuJ3Qgc2VlIHByb3RlY3RlZCBpbm5lciBjbGFzcyBvZiBzdXBlcmNsYXNzICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODQiPjMyODQ8L2E+CitQcm9qZWN0IGRvZXNuJ3QgYWx3YXlzIHJlYnVpbGQgYWZ0ZXIgY2hhbmdpbmcgdGhlIEphdmEgYnVpbGQgcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NyI+Njk1NzwvYT4KK0NDRSBpbiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjo6dHJhdmVyc2UgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02OTU4Ij42OTU4PC9hPgorTlBFIGluIERlbHRhUHJvY2Vzc29yICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY5MDAiPjY5MDA8L2E+CitSZWJ1aWxkIHByb2plY3QgZmFpbHMgd2l0aCBlcnJvciAiMTAwMCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQzODIiPjQzODI8L2E+CitOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBKYXZhQnVpbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5OSI+MzE5OTwvYT4KK01pc3NpbmcgY2xhc3NwYXRoIHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OCI+Njg0ODwvYT4KK0luZGV4IG91dCBvZiByYW5nZSBleGNlcHRpb24gd2l0aCBOZXcgYnVpbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxMyI+NDkxMzwvYT4KK251bGwgYXJndW1lbnQgaW4gSW5jcmVtZW50YWxJbWFnZUJ1aWxkZXIuZ2V0QnVpbGRlclR5cGUKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAiPjY3NjA8L2E+CitwYWNrYWdlIG5hbWVzIHRydW5jYXRlZCBpbiBjb21waWxhdGlvbiBkaWFsb2cKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTUiPjMyOTU8L2E+CitFcnJvcnMgZnJvbSBtaXNzaW5nIHJlZmVyZW5jZSB0byBhIGphciBkbyBub3QgZ28gYXdheQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1MCI+MzQ1MDwvYT4KK0J1ZyBpbiBKYXZhU2VhcmNoU2NvcGUgKDFHTEUxR0MpCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMTggLSAxOHRoIERlY2VtYmVyIDIwMDEgLSBNSUxFU1RPTkUgMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTlhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjExNyI+NjExNzwvYT4KK0NvZGVGb3JtYXR0ZXIgLSBpbXBvc3NpYmxlIHRvIHNldCBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgcG9zaXRpb24gbWFwcGluZyB3L28gZGVwcmVjYXRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzE5Ij42NzE5PC9hPgorTG9jYWxUeXBlRGVjbGFyYXRpb246OnRyYXZlcnNlCisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDMyIj41NDMyPC9hPgorY29tcGlsZXIgc3ludGF4IGVycm9yIGlzIGluY29ycmVjdAorCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMjExIC0gMTF0aCBEZWNlbWJlciAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxOAorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8dWw+Cis8bGk+IEphdmEgZWxlbWVudCBkZWx0YXMgYXJlIGJhdGNoZWQuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBtb2RpZmllcworCSBhIHJlc291cmNlLCB0aGVuIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGFzIGFyZSBtZXJnZWQgYW5kIGZpcmVkIGR1cmluZyAKKwkgdGhlIHJlc291cmNlIGRlbHRhIHByb2Nlc3NpbmcuIElmIHRoZSBqYXZhIG1vZGVsIG9wZXJhdGlvbiBkb2Vzbid0IAorCSBtb2RpZnkgYW55IHJlc291cmNlIChlLmcuIElXb3JraW5nQ29weS5yZWNvbmNpbGUoKSksIHRoZW4gdGhlIGphdmEKKwkgZWxlbWVudCBkZWx0YSBpcyBmaXJlZCByaWdodCBhd2F5LgorPC91bD4KKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+CisKKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIxNSI+MzIxNTwvYT4KK0pNIC0gQ3JlYXRpbmcgYSBuZXcgY2xhc3Mgc2VuZHMgb3V0IG1hbnkgbm90aWZpY2F0aW9ucyAoMUdEMkdUMCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5NSI+NjY5NTwvYT4KK0NoYW5naW5nIEphdmEgcHJlZmVyZW5jZSBpbiBidWlsZCAyMDAxMTIwNiB0aHJvd3MgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWx0YVByb2Nlc3Nvci5pbml0aWFsaXplUm9vdHMgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MSI+Njc2MTwvYT4KK051bGxQb2ludGVyRXhjZXB0aW9uIGR1cmluZyByZXBsYWNlICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTAiPjMyOTA8L2E+CitKYXZhQnVpbGRlciAtIE9sZCBjbGFzcyBmaWxlcyByZW1haW4gYWZ0ZXIgY2hhbmdlIG9mIG91dHB1dCBsb2NhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4OCI+MzE4ODwvYT4KK0phdmFCdWlsZGVyIC0gRGVsZXRpbmcgc291cmNlIGRvZXNuJ3QgZGVsZXRlIGJpbmFyeSBmb2xkZXJzICgxRlZQVFRLKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg1Ij4zMTg1PC9hPgorSmF2YUJ1aWxkZXIgLSBFcnJvcnMgZG9uJ3QgZGlzYXBwZWFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTg5Ij4zMTg5PC9hPgorSmF2YUJ1aWxkZXIgLSBNaXNzaW5nIGxpYnJhcmllcyByZXN1bHRzIGluIGluc3VmZmljaWVudCBkZXBlbmRlbmN5IGluZm8KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDQiPjMyMDQ8L2E+CitJbWFnZUJ1aWxkZXIgc2hvdWxkIHNob3cgZXJyb3IgY291bnQgaW4gdGhlIHByb2dyZXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI3Ij4zMjI3PC9hPgorSkNMIGRldiAtIEJ1aWxkZXIgZGlkIG5vdCByZWZyZXNoIHByb2JsZW1zIGluIGV4Y2VwdGlvbiBoaWVyYXJjaHkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjgiPjMyMjg8L2E+CitEaXNjYXJkaW5nIHJ0LmphciBmcm9tIGJ1aWxkIHBhdGggdHJpZ2dlcnMgdG9vIG1hbnkgcmVjb21waWxhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMiI+MzIzMjwvYT4KK0luY3JlbWVudGFsIGJ1aWxkZXIgdW5hYmxlIHRvIGhhbmRsZSBlZmZpY2llbnRseSBtaXNzaW5nIHJ0LmphciBzY2VuYXJpbworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNCI+MzIzNDwvYT4KK0luY3JlbWVudGFsIGJ1aWxkZXIgZG9lcyBub3Qgbm90aWNlIGFkZGl0aW9uIG9mIGphdmEubGFuZy5PYmplY3QgaW5zaWRlIHNhbWUgcHJvamVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MSI+MzI0MTwvYT4KK0J1aWxkIGRvZXNuJ3QgaG9ub3IgY2FuY2VsCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYwIj4zMjYwPC9hPgorTlBFIHdoZW4gZG9pbmcgaW5jcmVtZW50YWwgcHJvamVjdCBidWlsZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3OCI+MzI3ODwvYT4KK0phdmFCdWlsZGVyIC0gUHJvYmxlbSBDb3VudCByYXJlbHkgdXBkYXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4NyI+MzI4NzwvYT4KK0J1aWx0IHN0YXRlIGRvZXMgbm90IHJlbWVtYmVyIG9sZCBwa2cgZnJhZ21lbnQgcm9vdHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDEiPjMzMDE8L2E+CitJbmNyZW1lbnRhbCBidWlsZCBkb2Vzbid0IGRldGVjdCBkaXNhcHBlYXJhbmNlIG9mIGZpZWxkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA1Ij4zMzA1PC9hPgorSW5jcmVtZW50YWwgYnVpbGQgZG9lc24ndCBkZXRlY3QgYWJzdHJhY3QgbWV0aG9kIHRvIGltcGxlbWVudHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTEiPjMzMTE8L2E+CitwZXJmb3JtYW5jZTogdGFzayBsaXN0IHN0aWxsIGRvZXMgbm90IHNjYWxlIGF0IGFsbAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMiI+MzMxMjwvYT4KK0ludGVybmFsIGVycm9ycyBpbiBpbWFnZSBidWlsZGVyIGR1ZSB0byBkdXBsaWNhdGUgcGFja2FnZSBmcmFnbWVudAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxNyI+MzMxNzwvYT4KK0Z1bGxidWlsZCBhZnRlciBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIyIj4zMzIyPC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gZHVyaW5nIGJ1aWxkIGluIFN0YXRlSW1wbC5nZXRTb3VyY2VFbGVtZW50RW50cmllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNiI+MzMyNjwvYT4KK0luY3JlbWVudGFsIGJ1aWxkIGRvZXNuJ3Qgd29yayBpZiBiaW4gZGVsZXRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3MCI+MzM3MDwvYT4KK0luY3JlbWVudGFsIGNvbXBpbGVyIGlzIGNvbXBpbGluZyBwcm9qZWN0IHdoZW4gaXQgc2hvdWxkIG5vdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQyMiI+MzQyMjwvYT4KK05QRSBpbiBKYXZhIGJ1aWxkZXIgZHVyaW5nIGNhdGNodXAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjkiPjM0Mjk8L2E+CitJbmNyZW1lbnRhbCBjb21waWxhdGlvbiBidWcgb24gbmFtZXNwYWNlIGNoYW5nZSBpbiBwcml2YXRlIGxvY2FsIGNsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ0Ij4zNDQ0PC9hPgorQnVpbGQgcHJvYmxlbXM6IE1hcmtlciBzZXQgb24gRm9sZGVyPworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTAwNyI+NTAwNzwvYT4KK1Byb2plY3QgY2xhc3NwYXRoIHJlZmVyZW5jZXMgZG8gbm90IGZvbGxvdyBjbGFzcyBmb2xkZXJzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MTA5Ij41MTA5PC9hPgorQWRkaW5nIHByb2plY3QgZG9lc24ndCBmaXggYnVpbGQgZXJyb3JzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzIwIj41MzIwPC9hPgorTlBFIGR1cmluZyBjYXRjaHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjQxIj41NjQxPC9hPgorTlBFIG9uIHJlYnVpbGQgd2hlbiByZXBsYWNpbmcgaW50ZXJuYWwgamFyCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTM4Ij42NTM4PC9hPgorc2VhcmNoRGVjbGFyYXRpb25zT2YqIGluY29ycmVjdCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2OTAiPjY2OTA8L2E+CitDb2RlQXNzaXN0IGZpbmRzIHR5cGVzIG91dHNpZGUgdGhlIGNsYXNzcGF0aCAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2ODciPjY2ODc8L2E+CitXcm9uZyBKYXZhTW9kZWwgcmVmcmVzaCBhZnRlciBkcmFnIGFuZCBkcm9wIG91dHNpZGUgZm9sZGVyIHdpdGggZG90IGluIG5hbWUgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY5MyI+NjY5MzwvYT4KK0Fic3RyYWN0SW1hZ2VCdWlsZGVyLmNvbXBpbGUgdGhyb3dzIGFuIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBsaW5lIDE2NiBpbiBidWlsZCAyMDAxMTIwNgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MCI+NjY3MDwvYT4KK0NvZGUgQXNzaXN0OiBDYW5ub3QgcmVzb2x2ZSBpbiBtZXRob2QgYm9keQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NCI+NjY3NDwvYT4KK0Nhbm5vdCBhZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjI5Ij42NjI5PC9hPgorT3BlbiBPbiBTZWxlY3Rpb24gZG9lcyBub3Qgd29yayBvbiBMaW51eAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MiI+NTU0MjwvYT4KK1RvbyBtYW55IGRlbHRhcyBhcmUgZmlyZWQgb24gZWFjaCBKYXZhTW9kZWwgb3BlcmF0aW9uICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjkiPjMyNjk8L2E+IAorVXBkYXRpbmcgdGhlIEphdmEgcGFja2FnZXMgdmlldyBvbiBwcm9qZWN0IGNyZWF0aW9uICgxR0RXMFU5KSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjAyIj4zMjAyPC9hPgorRENSIC0gSk0gLSBNZXJnZSBKYXZhIEVsZW1lbnQgRGVsdGFzIHdpdGggUmVzb3VyY2UgRGVsdGFzICgxRzJCNjBaKSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NjIxIj42NjIxPC9hPgorTlBFIGluIERlbHRhIFByb2Nlc3NvciAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4Ij4zMzY4PC9hPgorSkNLIDEuNCAtIElOVEYgLSBUaGUgZmllbGQgb2YgcHJvdGVjdGVkIGludGVyZmFjZSBpcyB1c2VkIGluIG90aGVyIHBhY2thZ2UgKDFHSzdNMjUpICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1OTYiPjY1OTY8L2E+CitKYXZhIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBpbnZhbGlkIGJ5dGVjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTg2Ij42NTg2PC9hPgorTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiByZXNvdXJjZSBtb2RpZmljYXRpb24gZG9uZSBiZWZvcmUgamF2YSBtb2RlbCBpcyBvcGVuCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTQyIj42NTQyPC9hPgorZXh0cmFjdCBtZXRob2Q6IGluY29ycmVjdCBlcnJvciBtZXNzYWdlICAKKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NDUiPjY2NDU8L2E+CitCdWlsZC9SZWJ1aWxkIGRvZXMgbm90IHJlY29tcGlsZSBjb2RlICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY2NjkiPjY2Njk8L2E+CitTZWFyY2ggZG9lc24ndCBmaW5kIHJlZmVyZW5jZSB0byBhIGZpZWxkIHRoYXQgaXMgb25seSB1c2VkIGluIGFuIGluaXRpYWxpemF0aW9uICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzODUiPjUzODU8L2E+CitzZWFyY2g6IG5hbWUgc2VhcmNoRGVjbGFyYXRpb25zT2ZTZW50TWVzc2FnZXMgaXMgbm90IGdvb2QgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MyI+MzE4MzwvYT4KK0pNIC0gQnVpbGRlcnMgYW5kIG5lc3RlZCBvcGVyYXRpb25zIHVzaW5nIEphdmEgbW9kZWwgY2FuIGdldCBpbmNvbnNpc3RlbnQgcmVzdWx0cyAoMUZVQlY5MCkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1MCI+MzI1MDwvYT4KK0phdmFQcm9qZWN0LnJldHJpZXZlUmVzb3VyY2UgcGlja3MgZmlyc3QgcmVtb3ZlZCBjaGlsZCBkZWx0YSAoMUdDVjdQUSkgIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjM3OCI+NjM3ODwvYT4KK0NsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBpbm5lciBjbGFzcyBlbXVsYXRpb24gIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjY3NyI+NjY3NzwvYT4KK1x1IGluIGNvbW1lbnQgZ2l2ZXMgSW52YWxpZCB1bmljb2RlIGVycm9yCisgICAKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMDYgLSAwNnRoIERlY2VtYmVyIDIwMDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjE3Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1NjQiPjY1NjQ8L2E+CitOZXcgYnVpbGRlciAtIEluY3JlbWVudGFsIHJlY29tcGlsYXRpb24gZGV0ZWN0ZWQgcGFja2FnZSBwcm9ibGVtcyBpbmNvcnJlY3RseSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NTYzIj42NTYzPC9hPgorUGFja2FnZSB2aWV3IGRvZXMgbm90IHJlZnJlc2ggb2sgd2hlbiBhZGRpbmcgYm90aCBwYWNrYWdlIGFuZCB1bml0IGF0IG9uY2UgIAorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MiI+MzI0MjwvYT4KK1R5cGVSZWYuZ2V0VHlwZSBkb2VzIG5vdCB3b3JrIGZvciBpbm5lciB0eXBlcyAoMUdDRlVOVCkKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTIwNCAtIDR0aCBEZWNlbWJlciAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxNmMKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT4gTmV3IGluY3JlbWVudGFsIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZW5hYmxlZCBieSBkZWZhdWx0IChjYW4gcmVlbmFibGUgdGhlIAorb2xkIGltcGxlbWVudGF0aW9uIGJ5IGNoYW5naW5nIHRoZSBidWlsZGVyIGV4dGVuc2lvbiBpbiB0aGUgcGx1Z2luLnhtbCkKKzxsaT4gRGVsdGEgcHJvY2Vzc2luZyBpbXByb3ZlbWVudDoKKwk8dWw+CisJPGxpPiBObyBsb25nZXIgY3JlYXRlcyB1bm5lY2Vzc2FyeSBKYXZhIGVsZW1lbnRzIHdoZW4gdHJhdmVyc2luZyB0aGUgcmVzb3VyY2UgZGVsdGEuCisJPGxpPiBIYW5kbGVzIGNoYW5nZXMgaW4gYmluYXJ5IGZvbGRlciBsaWJyYXJpZXMuCisJPGxpPiBQcm9qZWN0cyB0aGF0IHNoYXJlIGxpYnJhcmllcyBhcmUgbm90aWZpZWQgaW5kaXZpZHVhbGx5LgorCTxsaT4gRG9lc24ndCBub3RpZnkgZW1wdHkgZGVsdGFzIGFueSBsb25nZXIuCisJPC91bD4KKzxsaT4gU291cmNlIGZvbGRlciByZXNvdXJjZSBjb3B5aW5nIG5vIGxvbmdlciBwZXJmb20gYW55IGNvcGllcyBhcyBzb29uIGFzCitvbmUgc291cmNlIGZvbGRlciBjb2luY2lkYXRlcyB3aXRoIHRoZSBvdXRwdXQgbG9jYXRpb24uCis8bGk+IE9wZW4gb24gc2VsZWN0aW9uIGlzIG1vcmUgZmF1bHQtdG9sZXJhbnQ6IHdpbGwgbm93IHRyeSB0byBsb2NhdGUgYQorc2VsZWN0ZWQgbWV0aG9kIGZvciB3aGljaCBhcmd1bWVudCB0eXBlcyBhcmUgaW5jb3JyZWN0LgorPGxpPiBDb21waWxlciBubyBsb25nZXIgcmVqZWN0cyBjb3JyZWN0IGNvZGUgd2l0aCByZXNwZWN0IHRvIGFjY2VzcyB0byBwcm90ZWN0ZWQKK21lbWJlcnMgZGVmaW5lZCBpbiBlbmNsb3NpbmcgdHlwZXMgKHdhcyBvbmx5IGFjY2VwdGluZyBhIHN1YnNldCBvZiBjb3JyZWN0IHNjZW5hcmlpKS4KKzwvdWw+Cis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorCis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY1MjgiPjY1Mjg8L2E+OgorSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0cnlpbmcgdG8gc2VhcmNoIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5NCI+NjQ5NDwvYT46CitOZXcgYnVpbGRlcjogSW52YWxpZCBlcnJvciBmb3VuZCAoVGhlIGRlY2xhcmVkIHBhY2thZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHBhY2thZ2UpIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ2MSI+NjQ2MTwvYT46CitOZXdCdWlsZGVyIC0gZG9lc24ndCBkZXRlY3QgaW5jb3JyZWN0bHkgbG9jYXRlZCBjb21waWxhdGlvbiB1bml0cyAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDU2Ij42NDU2PC9hPjoKK0ludmFsaWQgZXJyb3Igd2hlbiBjb21waWxpbmcgYWNjZXNzIHRvIHByb3RlY3RlZCBtZW1iZXIgaW5zaWRlIGlubmVyY2xhc3MgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU4Ij4zMzU4PC9hPjoKK1BlcmZvcm1hbmNlOiBpbmRleGVyIGRvaW5nIHRvbyBtdWNoIHdvcms/ICgxR0pMRE43KSAgCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDcxIj41NDcxPC9hPjogCitDb2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDMxIj42NDMxPC9hPjoKK0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiB0aGUgU291cmNlSW5kZXhlciByZXF1ZXN0b3IKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0MjIiPjY0MjI8L2E+OgorUmVzb3VyY2UgY29weSBzaG91bGQgbm90IG9jY3VyIGFzIHNvb24gYXMgb25lIHNvdXJjZSBmb2xkZXIgb3ZlcmxhcCB0aGUKK2JpbmFyeSBvdXRwdXQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY0MTYiPjY0MTY8L2E+OgorQ29kZSByZXNvbHZlIGRvZXNuJ3Qgd29yayBvbiBtZXNzYWdlIHNlbmQgd2hlbiBwYXJhbWV0ZXJzIGFyZSBub3QgY29ycmVjdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTcwNSI+NTcwNTwvYT46CitXcm9uZyBwb3NpdGlvbnMgZm9yIENsYXNzQ2FzdExpdGVyYWwKKzxoMz4KK1Byb2JsZW0gUmVwb3J0cyBDbG9zZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NDIzIj42NDIzPC9hPjogIAorU2VhcmNoIC0gZG9lcyBub3QgZmluZCBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kICJ0bypTdHJpbmciICAKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDYiPjMyNDY8L2E+OiAKK0NvZGVDb21wbGV0aW9uIC0gTm8gY29tcGxldGlvbiBvbiBtZW1iZXIgYWNjZXNzIG9uIGFub255bW91cyBjbGFzcyAoMUdEM09HQSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0NTQiPjU0NTQ8L2E+OgorQ29kZSBBc3Npc3QgYWRkcyBxdWFsaWZpZWQgY29kZSBpbnNpZGUgaW5uZXIgY2xhc3NlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTgzNyI+NTgzNzwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gaW5kZXggbWVyZ2luZworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTEyNyAtIDI3dGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTVhCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzx1bD4KKzxsaT4KK0JldHRlciBoaWdobGlnaHRpbmcgb2YgbXVsdGktbGluZSBtZXNzYWdlIHNlbmRpbmc8L2xpPgorCis8bGk+CitDb2RlIGFzc2lzdCBvbmx5IHF1YWxpZmllcyBpbXBsaWNpdCBtZW1iZXJzIHdoZW4gbmVjZXNzYXJ5PC9saT4KKworPGxpPgorTmV3IEFQSSBmb3Igc2V0dGluZyBib3RoIGNsYXNzcGF0aCBhbmQgb3V0cHV0IGxvY2F0aW9uIGF0IHRoZSBzYW1lIHRpbWUKKyhhbGxvd2luZyB0byBhdm9pZCBjbGFzc3BhdGggdmFsaWRhdGlvbiBmYWlsdXJlcyBpbiBjYXNlIHRoZXJlIGlzIG5vIHdheQordG8gY2hhbmdlIGJvdGggaW5kZXBlbmRhbnRseSk6PC9saT4KKworPGJyPjx0dD5JSmF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCwgSVBhdGgKK25ld091dHB1dExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC90dD48L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MzM5Ij42MzM5PC9hPiBBc3NlcnRpb24KK2ZhaWxlZCBpbiBTb3VyY2VUeXBlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjE4Ij41NjE4PC9hPgorVW5jYXVnaHQgQ29tcGxldGlvbk5vZGVGb3VuZCBleGNlcHRpb24gZG9pbmcgY29kZSBhc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyOTQiPjYyOTQ8L2E+CitFeGNlcHRpb24gZHVyaW5nIHNldHRpbmcgdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjMwMiI+NjMwMjwvYT4KK0Fzc2VydGlvbkZhaWx1cmUgaW4gb3BlbiBvbiBzZWxlY3Rpb24KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwOTQiPjYwOTQ8L2E+CitTZWFyY2ggLSBkb2VzIG5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gSmF2YVByb2plY3Quc2V0UHJvamVjdCguLi4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzIwIj4zMzIwPC9hPiIKK1NlYXJjaCAtIE1hdGNoIHRocm91Z2ggc3VwZXIgdHlwZSBub3QgZm91bmQgaWYgaW4gZGlmZmVyZW50IHByb2plY3QgKDFHR0FPRlQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTU4Ij42MTU4PC9hPiIKK1NlYXJjaCAtIFByZWZpeCBhbmQgcG9zdGZpeCBleHByZXNzaW9uIG5vdCBmb3VuZCBhcyB3cml0ZSByZWZlcmVuY2UKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NzQiPjQ5NzQ8L2E+OgorU2V0IGNsYXNzcGF0aCAvIG91dHB1dCBsb2NhdGlvbiBzaG91bGQgYmUgb25lIG9wZXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE3NiI+NjE3NjwvYT46CitFY2xpcHNlIHRvb2xzIGluZGV4IG91dCBvZiBib3VuZHMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxNjAiPjYxNjA8L2E+OgorSW5kZXggb3V0IG9mIGJvdW5kcyBpbiB1cGRhdGUgcmVmZXJlbmNlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE1MSI+NjE1MTwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gT2JqZWN0U2V0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTQzIj41OTQzPC9hPjoKK2ludGVybmFsIGVycm9yIGluIHNldHRpbmcgYnVpbGRwYXRoIChuYW1lIGNvbGxzaW9uKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MSI+NTQ3MTwvYT46CitDb2RlRm9ybWF0dGVyIG1hcHBlZCBwb3NpdGlvbnMgYnJva2VuIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTA3Ij41OTA3PC9hPjoKK0luZGV4ZXIgZXJyb3JzIHdoZW4gZGlzayBmdWxsCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODg0Ij41ODg0PC9hPjoKK0NvZGUgYXNzaXN0IHNob3VsZCBvbmx5IGZ1bGx5IHF1YWxpZnkgaWYgbmVlZGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NTE0Ij41NTE0PC9hPjoKK1NlbGVjdCBhIGRlY2xhcmF0aW9uIGRvZXMgbm90IHdvcmsgaW4gdW5zYXZlZCB3b3JraW5nIGNvcGllcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQxNCI+NTQxNDwvYT46CitBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gU2lnbmF0dXJlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mzg0Ij41Mzg0PC9hPjoKK3NlYXJjaCBlbmdpbmU6IGJlaGF2aW9yIGRpZmZlcmVudCB0aGFuIGV4cGVjdGVkCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTA0Ij42MTA0PC9hPjoKK1Vub3B0aW1hbCBkZWJ1Z2dlciBoaWdobGlnaHQgZm9yIG11bHRpLWxpbmUgbWVzc2FnZSBleHByZXNzaW9uCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIxMCI+NjIxMDwvYT46IENyZWF0aW9uCitmYWlsZWQgZXJyb3Igd2hlbiBjcmVhdGluZyBhIHNvdXJjZSBmb2xkZXIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjUiPjM0MjU8L2E+OgorSmF2YUNvcmUuY3JlYXRlKFN0cmluZyBoYW5kbGUpIGxvb3NlcyBpbmZvcm1hdGlvbiAoMUdMQTBRRykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMjciPjYxMjc8L2E+OgorUmVmZXJlbmNlIGJ5IGxvY2FsIGNsYXNzIG5vdCBmb3VuZCB3aGVuIHNlYXJjaGluZyBmb3IgaW50ZXJmYWNlIHJlZnMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5OTAiPjQ5OTA8L2E+OgorRXJyb3Igc3RhcnRpbmcgRWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MSI+MzQ3MTwvYT46CitMZWFkaW5nICcvJyBpbiBzcmMgcGFnZSBvZiBKYXZhIHdpemFyZCBpcyBtaXNsZWFkaW5nICgxRzg0MlRIKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYxOSI+MzYxOTwvYT46CitpbmNvbnNpc3RlbnQgc2VhcmNoIGZvciBtZXRob2QgZGVjbGFyYXRpb25zICgxR0NaWlMxKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU1NyI+NTU1NzwvYT46CitJbmNvcnJlY3QgaGllcmFyY2h5IHNob3duIChub3Qgcm9vdGVkIGF0IE9iamVjdCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxMDAiPjYxMDA8L2E+OgorQnVnIGluIE9iamVjdFNldC5FbnVtZXJhdGlvbi5uZXh0RWxlbWVudAorPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTEyMCAtIDIwdGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTMKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorQ29kZUFzc2lzdCBubyBsb25nZXIgZmluZCBzeW50aGV0aWMgY29tcGxldGlvbnMuPC9saT4KKworPGxpPgorUmVkdWNlZCBzdGFydHVwIHRpbWUgb2YgSmF2YSBwZXJzcGVjdGl2ZTwvbGk+CisKKzxsaT4KK0NvZGVBc3Npc3Qgb3B0aW9uIGFkZGVkIHRvIGZvcmNlIGZ1bGwgcXVhbGlmaWNhdGlvbiBvZiBpbXBsaWNpdCBmaWVsZC9tZXRob2QKK3JlZmVyZW5jZXMgKHNlZSBKYXZhQ29yZSBvcHRpb246ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZm9yY2VJbXBsaWNpdFF1YWxpZmljYXRpb24iKS48L2xpPgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk4MiI+NTk4MjwvYT46IGNvbnRlbnQKK2Fzc2lzdCBkaXNwbGF5cyBhY2Nlc3NvcnMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NTUiPjU5NTU8L2E+OgorTlBFIGluIExvb2t1cEVudmlyb25tZW50Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTIzIj41OTIzPC9hPjoKK1NlYXJjaCBmb3IgImxlbmd0aCIgZmllbGQgcmVmcyBmaW5kcyBbXS5sZW5ndGgKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MTYiPjU5MTY8L2E+OgorU2VhcmNoIC0gdG9vIG1hbnkgbWF0Y2hlcyBmb3IgcmVmcyB0byBOYW1lTG9va3VwLmZpbmRQYWNrYWdlRnJhZ21lbnRSb290Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01OTU3Ij41OTU3PC9hPjoKK0ludGVybmFsIGVycm9yIGluIFJlY292ZXJlZE1ldGhvZC5hZGQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5NzIiPjU5NzI8L2E+OgorSW5jcmVtZW50YWwgYnVpbGRlciAobmV3KSByZWNvbXBpbGluZyBkZXBlbmRlbnRzIG9mIFBhcnNlciBmb3Igbm8gYXBwYXJlbnQKK3JlYXNvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTk0MCI+NTk0MDwvYT46CitJbnN0YW5jZSBpbml0aWFsaXplciBpbiBhbm9uIGlubmVyIGNsYXNzIGdlbmVyYXRlcyBlcnJvcnMKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU5MTMiPjU5MTM8L2E+OgorUGVyZm9ybWFuY2UgLSBjcmVhdGluZyB0b25zIG9mIGNsYXNzZmlsZSBlbGVtZW50cyBhdCBzdGFydHVwCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01ODYyIj41ODYyPC9hPjoKK3NlYXJjaCA6IHRvbyBtYW55IG1hdGNoZXMgb24gc2VhcmNoIHdpdGggT3JQYXR0ZXJuCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MDcwIj42MDcwPC9hPjoKK05ldyBCdWlsZGVyOiBCdWlsZGVyIG9yZGVyIHByb2JsZW0KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4NTIiPjU4NTI8L2E+OgorUHJvamVjdCByZWZlcmVuY2VzIG5vdCB1cGRhdGVkIGFjY29yZGluZyB0byBidWlsZHBhdGgKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0NzEiPjU0NzE8L2E+OgorQ29kZUZvcm1hdHRlciBtYXBwZWQgcG9zaXRpb25zIGJyb2tlbiBmb3IgbXVsdGktbGluZSBjb21tZW50cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU2MyI+NTU2MzwvYT46CitXcml0ZSByZWZlcmVuY2Ugb24gZGVjbGFyYXRpb24gbm90IHJlcG9ydGVkCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI1NyI+MzI1NzwvYT46IElNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMKK2ZvciBDbGFzc0ZpbGVzIHNob3VsZCB1c2UgbmFtZXMgZnJvbSBzb3VyY2UgKDFHREdOM0cpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ1Ij4zMjQ1PC9hPjoKK3N1YiBmb2xkZXJzIHdpdGggZG90IG5vdCB2aXNpYmxlIGluIHBhY2thZ2VzIHZpZXcgKDFHQ09IMTcpCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMTEzIC0gMTN0aCBOb3ZlbWJlciAyMDAxCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzIxMWIKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTgyMSI+NTgyMTwvYT46IFJlZmFjdG9yCitSZW5hbWUgcmVuYW1lcyBsb2NhbCB2YXJpYWJsZSBpbnN0ZWFkIG9mIG1lbWJlciBpbiBjYXNlIG9mIG5hbWUgY2xhc2gKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwMDM+NTAwMzwvYT46ICAgICBSZXZpZXcgSmF2YUJ1aWxkZXIgY2FuY2VsYXRpb24gaGFuZGxpbmcgPGJyPjxhIGhyZWY9IiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPSI1NzkwIj41NzkwPC9hPjoKK0lKYXZhUHJvamVjdC5oYXNCdWlsZFN0YXRlKCkgZmFpbHMgd2l0aCBuZXcgYnVpbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTc5NCI+NTc5NDwvYT46CitQb2x5bW9ycGhpYyBzZWFyY2ggZG9lc24ndCB3b3JrIGluIGRlcGVuZGVudCBwcm9qZWN0cworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTc4MSI+NTc4MTwvYT46CitOUEUgdXNpbmcgbmV3IGltYWdlIGJ1aWxkZXIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU4MzQiPjU4MzQ8L2E+OgorSW5jcmVtZW50YWwgYnVpbGQgcmVjb21waWxlZCB1bnJlbGF0ZWQgcHJvamVjdAorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTUiPjUyMTU8L2E+OiBzZWFyY2g6CittaXNzaW5nIGZpZWxkIHJlZmVyZW5jZQorPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTExMiAtIDEydGggTm92ZW1iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMTBfMDEKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorUHJvamVjdCByZWZlcmVuY2VzIGFyZSBtYWludGFpbmVkIGJ5IHRoZSBKYXZhQ29yZSwgaW4gcGFyYWxsZWwgd2l0aCBidWlsZAorcGF0aC48L2xpPgorCis8bGk+CitSZXN1cnJlY3RlZCBkZXByZWNhdGVkIEFQSXMgZnJvbSAwLjkgd2hpY2ggd2VyZSBkaXNjYXJkZWQgcHJldmlvdXNseS48L2xpPgorCis8bGk+CitJQ29kZUNvbXBsZXRpb24gcmV2ZXJ0ZWQgdG8gMS4wIHZlcnNpb24sIGFuZCBnb3QgZGVwcmVjYXRlZC4gVXNlIElDb21wbGV0aW9uUmVxdWVzdG9yCitpbnN0ZWFkLjwvbGk+CisKKzxsaT4KK0Nyb3NzLXByb2plY3QgaW5jcmVtZW50YWwgcmVjb21waWxhdGlvbiBpbiBwcmVzZW5jZSBvZiBzdHJ1Y3R1cmFsIGNoYW5nZXMKK2luIHByb2R1Y2VkIGJpbmFyaWVzLjwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzYyIj41MzYyPC9hPjogRGVlcGVyCit0aGFuIG5lY2Vzc2FyeSBKYXZhRWxlbWVudERlbHRhIHdoZW4gcGFja2FnZSBhZGRlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNSI+NTUyNTwvYT46CitJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgaXNuJ3QgMS4wIGNvbXBhdGlibGUKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2MTYiPjU2MTY8L2E+OgorTlBFIHdoZW4gY29tcGlsaW5nIGludmFsaWQgY29kZSBkZWZpbmluZyBhIGFycmF5IG9mIHN0cmluZ3MKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTciPjUyMTc8L2E+OgoramF2YSBzZWFyY2ggc2NvcGU6IG1pc3NpbmcgZW5jbG9zaW5nIHByb2plY3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MjciPjU1Mjc8L2E+OgorVW5leHBlY3RlZCBpbmFjY3VyYXRlIG1hdGNoZXMgZm9yICNjbG9zZSgpIGRlY2xhcmF0aW9ucworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyMiI+NTUyMjwvYT46CitUeXBlIGhpZXJhcmNoeSAtIG1pc3Npbmcgc3VidHlwZXMgb2YgSmF2YUVsZW1lbnQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU1MDgiPjU1MDg8L2E+OgorSkRUIGNhbm5vdCBzdXBwb3J0IHBlcmlvZHMgaW4gdGhlIGZvbGRlcnMgYWJvdmUgdGhlIHBhY2thZ2UgbmFtZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTU0MSI+NTU0MTwvYT46CitObyByZWZyZXNoIHdoZW4gYWRkaW5nIGEgY29tcGlsYXRpb24gdW5pdCBpbnNpZGUgYSBkb3QgbmFtZWQgc291cmNlIGZvbGRlcgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUzMiI+NTUzMjwvYT46CitJbmNyZW1lbnRhbCBjb21waWxlIG1pc3NlZCBhIHJldHVybiB0eXBlIGNoYW5nZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUxNSI+NTUxNTwvYT46CitBYm9ydENvbXBpbGF0aW9uIGR1cmluZyBwb2x5bW9ycGhpYyBzZWFyY2gKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNzUiPjUyNzU8L2E+OgorQ3Jvc3MtcHJvamVjdCByZWNvbXBpbGF0aW9uIERlZmVjdCAxODYyNDkgLSBPVEkgUFIjIDFHTEVZVDEKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyNjciPjUyNjc8L2E+OgorRGVwZW5kZW50IFByb2plY3RzIG5vdCBjb21waWxlZCB3aGVuIHByb2plY3QgaXMgc2F2ZWQKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MjUiPjU0MjU8L2E+OgorRXhjZXB0aW9uIG9uIENvZGVBc3Npc3QKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTQiPjMxOTQ8L2E+OgorRENSIC0gSk0gLSBCdWZmZXIgY29udGVudHMgaXMgZHVwbGljYXRlZCAoMUcwM0hDUCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU0MzAiPjU0MzA8L2E+OgorTXVzdCByZXN1cnJlY3QgMC45IGRlcHJlY2F0ZWQgQVBJcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkyMyI+NDkyMzwvYT46CitJSmF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMgcmV0dXJucyByb290cyBmcm9tIG90aGVyIHByb2plY3RzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA4Ij4zMzA4PC9hPjoKK1Byb2plY3RzIG5vdCBidWlsZCBpbiBjb3JyZWN0IG9yZGVyIGFmdGVyIGxvYWQgKDFHRjYwVE4pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM1Ij4zNDM1PC9hPjoKK2tlZXBpbmcgdGhlIHByb2plY3QgcmVmZXJlbmNlcyBhbmQgcmVxdWlyZWQgcHJvamVjdCBpbiBzeW5jaCAoMUdMMEwzNCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMDMiPjUyMDM8L2E+OgorUHJvamVjdCBpbmRleGluZyBkb2VzIG5vdCByZXN0cmFpbiB0byBzb3VyY2UgZmlsZXMgb24gdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MyI+MzI5MzwvYT46CitzZWFyY2ggZG9lcyBub3Qgd29yayBpbiBpbm5lciBjbGFzcyAoMUdFVVFISikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDkiPjMyNDk8L2E+OgorRXJyb3IgbWVzc2FnZSBpcyBjb25mdXNpbmc6IHVzaW5nIHRva2VuIGluc3RlYWQgb2YgaWRlbnRpZmllciAoMUdDVERZTSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUyMTQiPjUyMTQ8L2E+OgorVFZUOiBBcG9zdHJvcGhlIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIGluIEphdmEgZXJyb3IgbWVzc2FnZXMgaW4gc29tZQordHJhbnNsYXRpb25zIChpdGFsaWFuKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTI2MyI+NTI2MzwvYT46CitUVlQ6IENvbXBpbGVyIGVycm9yIG1lc3NhZ2VzIGFyZSBoYXJkIGZvciB0cmFuc2xhdG9ycyB0byB1bmRlcnN0YW5kCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUxIj4zMjUxPC9hPjoKK1R5cGVzIG5vdCBpbmNsdWRlZCBpbiBjb2RlIGFzc2lzdCBsaXN0IGZvciBpbXBvcnQgKDFHRDA2VzkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01Mjc3Ij41Mjc3PC9hPjoKK0NvZGUgYXNzaXN0IG9uIGFzc2VydCBtZXRob2QgZG8gYW4gQWJvcnRFeGNlcHRpb24KKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNzAiPjUwNzA8L2E+Ogorc2VhcmNoOiBtaXNzaW5nIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY5Ij41MDY5PC9hPjoKK3NlYXJjaDogbWV0aG9kIHJlZmVyZW5jZSBpbiBzdXBlciBtaXNzaW5nCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MDY4Ij41MDY4PC9hPjoKK3NlYXJjaDogbWlzc2luZyBtZXRob2QgcmVmZXJlbmNlCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTUyNiI+NTUyNjwvYT46IE51bGxQb2ludGVyRXhjZXB0aW9uCitzZWFyY2hpbmcgZGVjbGFyYXRpb25zIG9mICNjbG9zZSgpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDk4Ij41NDk4PC9hPjoKK0phdmEgQ29tcGlsZSAtIGNvZGUgZG9lcyBub3QgY29tcGlsZSBjb3JyZWN0bHkgaW4gSkRULCBidXQgZG9lcyB3aXRoIGphdmFjCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NDkzIj41NDkzPC9hPjoKK0FkZGluZyBwcm9qZWN0IHJlZmVyZW5jZXMgZG9lc24ndCB1cGRhdGUgdGhlIGNsYXNzcGF0aAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTQyNiI+NTQyNjwvYT46CitDb2RlQXNzaXN0IHJldHVybnMgZW1wdHkgY29tcGxldGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY5MCI+MTY5MDwvYT46CitMb2NhbCB2YXJpYWJsZXMgbm90IGFsd2F5cyBkaXNwbGF5ZWQgd2hlbiBpbiBzY29wZSAoMUdKOFBYNCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQzNjgiPjQzNjg8L2E+OgorV3JvbmcgbWF0Y2ggaW4gSmF2YSBTZWFyY2gKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMzgiPjMyMzg8L2E+OgorQ29kZUFzc2lzdCAtIG5vIGNvbXBsZXRpb24gaWYgY3Vyc29yIGF0IHN0cmluZyBiZWdpbm5pbmcgKDFHSTNCWU8pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcxIj4zMjcxPC9hPjoKK1VuYWJsZSB0byBkZWxldGUgYXR0YWNoZWQgaW50ZXJuYWwgc291cmNlIGphciAoMUdEWDIxNSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDkiPjMyMDk8L2E+OgorRENSIC0gSk0gLUludmFsaWQgcmVmZXJlbmNlcyB0byBJUGF0aC5nZXREZXZpY2UoKSBwb3RlbnRpYWxseSBicmVha2luZworb24gTGludXggKDFHNFUxUjcpCis8YnI+Jm5ic3A7Cis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMDI1IC0gMjV0aCBPY3RvYmVyIDIwMDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjA2Cis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzx1bD4KKzxsaT4KK0phdmFNb2RlbCBpcyBubyBsb25nZXIgcGVyZm9ybWluZyBzbWFydCBjbGFzc3BhdGggdXBkYXRlcyB3aGVuIEphdmEgcGFja2FnZQorZnJhZ21lbnQgcm9vdHMgYXJlIGVpdGhlciBtb3ZlZCBvciByZW1vdmVkLjwvbGk+Cis8L3VsPgorCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTY4Ij4zNTY4PC9hPjogbm8KK2hvdmVyaGVscCBvdmVyIGNvbnN0cnVjdG9yIHJlZmVycmVuY2VzICgxR0FKMEtQKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTIxOCI+NTIxODwvYT46CitBY2NTdXBlciBpcyBub3Qgc2V0IHByb3Blcmx5Cis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MjAwIj41MjAwPC9hPjoKK1NldENsYXNzcGF0aE9wZXJhdGlvbiBtdXN0IGNsb3NlIHJvb3Qgb25seSB3aGVuIHJvb3QgaXMgcmVtb3ZlZAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0OSI+MzQ0OTwvYT46CitDb2RlQXNzaXN0IC0gdHdvIHR5cGUgd2l0aCBzYW1lIG5hbWUgbXVzdCBiZSBxdWFsaWZpZWQgKDFHTEROM1opCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00OTczIj40OTczPC9hPjoKK1JlbmFtZSBwYWNrYWdlIHJlbW92ZXMgZmlyc3QgbGV0dGVyIG9mIGltcG9ydCBzdGF0ZW1lbnRzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjc5Ij4zMjc5PC9hPjoKK1NldmVyZSAtIEpNIC0gU291cmNlIGZvdW5kLCBldmVuIHRob3VnaCBzb3VyY2VwYXRoIGlzIGZhbHNlICgxR0VMQVZCKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQzNCI+MzQzNDwvYT46CitEZWxldGluZyBhIHByb2plY3QgZnJvbSB0aGUgd3MgcmVtb3ZlcyBpdCBmcm9tIHRoZSBidWlsZHBhdGghICgxR0taTkJTKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTAyMSI+NTAyMTwvYT46CitSZWZhY3RvcmluZyB0cmFzaGVkIG15IGNvZGUKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUxMzYiPjUxMzY8L2E+OgorQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gYSBmaWVsZCBkZWNsYXJhdGlvbiBpcyBhbiBhbm9ueW1vdXMKK2NsYXNzCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQwIj4zNDQwPC9hPjoKK0NsYXNzZmlsZSBjb21wYXJhdG9yIHNob3VsZCBiZSBhYmxlIHRvIGlnbm9yZSBvcmRlciAoMUdMMkk3RSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MzkiPjM0Mzk8L2E+OgorQ2xhc3NmaWxlIGNvbXBhcmF0b3Igc2hvdWxkIGJlIGFibGUgdG8gaWdub3JlIHN5bnRoZXRpY3MgKDFHTDJJM04pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQyIj4zNDQyPC9hPjoKK05QRSBpbiBTb3VyY2VFbGVtZW50UGFyc2VyICgxR0w0OTZJKQorPGgzPgorUHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjkiPjMzNjk8L2E+OiBDbGFzc3BhdGgKK2dldHMgb3V0IG9mIHN5bmMgKDFHSlU4NTMpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjgxIj4zMjgxPC9hPjoKK2NoYW5nZSBqYXZhIHByb2plY3QgYmluYXJ5IG91dHB1dCBjcmVhdGUgbmV3IHBhY2thZ2UgKDFHRUhLMDcpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjk4Ij4zMjk4PC9hPjoKK0luY29ycmVjdCBjb21waWxlIGVycm9yIG9uIHZhbGlkIGNhc2Ugc3RhdGVtZW50ICgxR0VZV0VUKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzU2MiI+MzU2MjwvYT46CitPdXRsaW5lciBidWcgZm9yIGluaXRpYWxpemVycyAoMUc5M0NTMykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDciPjM0NDc8L2E+Ogorc2VhcmNoOiBjb3VsZCBhdXRvbWF0aWNhbGx5IG5hcnJvdyBkb3duIHNjb3BlICgxR0xESlZOKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4OCI+MzI4ODwvYT46CitDb2RlQXNzaXN0IC0gQ29kZSBhc3Npc3QgZG9lc24ndCB3b3JrIGluIHNvbWUgbWV0aG9kcyAoMUdFTEVCSCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUwNzMiPjUwNzM8L2E+OgorZGVsZXRlIGRvZXMgbm90IHdvcmsgb24gZGVmYXVsdCBwYWNrYWdlCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQzIj4zNDQzPC9hPjoKK1VudXNlZCBhcmd1bWVudC92YXJpYWJsZSB3YXJuaW5ncyBzaG93biB0d2ljZSAoMUdMNE9XNykKKzxicj4mbmJzcDsKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEwMTggLSAxOHRoIE9jdG9iZXIgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDUKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorQ29kZUFzc2lzdCBwcm92aWRlcyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb25zLjwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgKGJyZWFraW5nKSBBUEkgQ2hhbmdlcyBvbiA8dHQ+SUNvbXBsZXRpb25SZXF1ZXN0b3I8L3R0PgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyA8Yj4rPC9iPiA8dT5BZGRlZDwvdT4gQVBJIGZvciBzdWdnZXN0IHZhcmlhYmxlIG5hbWU6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDx0dD52b2lkIGFjY2VwdFZhcmlhYmxlTmFtZSg8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHR5cGVQYWNrYWdlTmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHR5cGVOYW1lLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gbmFtZSw8L3R0PgorPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LDwvdHQ+Cis8YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7PC90dD4KKzxicj4mbmJzcDsKKzxsaT4KK0hlbHBlciBtZXRob2QgZm9yIGNvbXB1dGluZyBhIHJlc29sdmVkIGFuZCBleHBhbmRlZCBwYXRoIChhbGwgZXhwb3J0cyBmcm9tCitwcmVyZXF1aXNpdGVzKSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiAyMDQsIGdvdCA8dT5yZW1vdmVkPC91Pi4gVGhpcyBpcworbm90IGFuIEFQSSBjaGFuZ2UsIGl0IG5ldmVyIG1hZGUgaXQgb3V0IG9mZmljaWFsbHkuPC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyA8Yj4tPC9iPiA8dHQ+SUphdmFQcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKGJvb2xlYW4pPC90dD4KKzxwPjx0dD5TZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElSZXNvdXJjZVtdKTwvdHQ+IGhhcyBiZWVuIGRlcHJlY2F0ZWQuCitVc2UgPHR0PlNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10pPC90dD4gaW5zdGVhZC4KK1RoZSByYXRpb25hbCBpcyB0aGF0IDx0dD5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoSVJlc291cmNlW10pPC90dD4gd2FzIG5vdAord2VsbCBkZWZpbmVkIGZvciBwcm9qZWN0cywgYW5kIGl0IGNvdWxkIG5vdCBkZWZpbmUgYSBzZWFyY2ggc2NvcGUgZm9yIGphdmEKK2VsZW1lbnRzIHRoYXQgZGlkbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHJlc291cmNlIChlLmcuIGV4dGVybmFsIGphcnMpLgorVGhpcyBkZXByZWNhdGVkIEFQSSdzIGJlaGF2aW9yIGhhcyBhbHNvIHJldmVydGVkIHRvIHRoZSAxLjAgc3RhdGUgZm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5LiBUaGUgc3BlY2lmaWNhdGlvbiBvZiA8dHQ+Y3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKTwvdHQ+CitpcyBhcyBmb2xsb3dzOgorPHVsPgorPGxpPgorSWYgYW4gZWxlbWVudCBpcyBhbiA8dHQ+SUphdmFQcm9qZWN0PC90dD4sIHRoZW4gdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVycywKK2l0cyBqYXJzIChleHRlcm5hbCBhbmQgaW50ZXJuYWwpIGFuZCBpdHMgcmVmZXJlbmNlcyBwcm9qZWN0cyAod2l0aCB0aGVpcgorc291cmNlIGZvbGRlcnMgYW5kIGphcnMsIHJlY3Vyc2l2ZWx5KSB3aWxsIGJlIGluY2x1ZGVkLjwvbGk+CisKKzxsaT4KK0lmIGFuIGVsZW1lbnQgaXMgYW4gPHR0PklQYWNrYWdlRnJhZ21lbnRSb290PC90dD4sIHRoZW4gb25seSB0aGUgcGFja2FnZQorZnJhZ21lbnRzIG9mIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmUgaW5jbHVkZWQuPC9saT4KKworPGxpPgorSWYgYW4gZWxlbWVudCBpcyBhbiA8dHQ+SVBhY2thZ2VGcmFnbWVudDwvdHQ+LCB0aGVuIG9ubHkgdGhlIGNvbXBpbGF0aW9uCit1bml0IGFuZCBjbGFzcyBmaWxlcyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgd2lsbCBiZSBpbmNsdWRlZC4gU3VicGFja2FnZXMKK3dpbGwgTk9UIGJlIGluY2x1ZGVkLjwvbGk+Cis8L3VsPgorPC91bD4KKworPGgzPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTA2NSI+NTA2NTwvYT46IE51bGxQb2ludGVyRXhjZXB0aW9uCitpbiBDb2RlIEFzc2lzdAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkyMSI+NDkyMTwvYT46CitTZXJhY2ggZG9lcyBub3QgZmluZCB0eXBlcyBpbiBpbnRlcm5hbCBqYXIKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5MTciPjQ5MTc8L2E+OgorTGF0ZXN0IGJ1aWxkIGZhaWxzIHVwZGF0aW5nIFR5cGVIaWVyYXJjaHkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyOTYiPjMyOTY8L2E+OgorQ29kZUFzc2lzdCAtIHNob3VsZCBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgaWYgYW55ICgxR0VXREw3KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNSI+MzMyNTwvYT46CitUb28gbXVjaCBjb2RlYXNzaXN0IG1hdGNoIG9uIGludGVyZmFjZSAoMUdIMEdWMSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0MjQiPjM0MjQ8L2E+OgorRENSOiBjb2RlIGFzc2lzdCBzdXBwb3J0IGZvciB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb25zICgxR0tNNk9RKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MiI+MzI4MjwvYT46CitKQ0sgMS40IC0gREFTRyAtIGFzc2lnbmVkIHZhcmlhYmxlIGJlZm9yZSBjYXRjaCBibG9jayBhZnRlciByZXR1cm4gc3RhdGVtZW50CisoMUdLMkFIWCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NTIiPjM0NTI8L2E+OgorTlBFIGRvaW5nIERpc3BsYXkgZnJvbSBCaW5hcnkgKDFHTEVHNUspCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzc0Ij4zMzc0PC9hPjoKK1NlYXJjaFBhdHRlci5jcmVhdGVQYXR0ZXJuKC4uLikgZG9lc24ndCB3b3JrIHdpdGggdW5pY29kZXMgKDFHSllCUlkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzA5Ij4zMzA5PC9hPjoKK0RDUiAtIEpNIC0gY291bGQgSUNvbXBpbGF0aW9uVW5pdDo6Z2V0VHlwZSB0aHJvdyBKTUU/ICgxR0Y5QUw5KQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMxMCI+MzMxMDwvYT46CitTbW9rZSAxMjQ6IENvbXBpbGUgZXJyb3JzIGludHJvZHVjZWQgd2l0aCByZW5hbWUgcmVmYWN0b3JpbmcgKDFHRkJLMkcpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDM2Ij4zNDM2PC9hPjoKK05QVyBpbiBUeXBlSGllcmFyY2h5ICgxR0wwTDhEKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDkxOSI+NDkxOTwvYT46CitDYW5ub3QgZHVwbGljYXRlIGxvY2FsIHZhcmlhYmxlIGluIGZpbmFsbHkgYmxvY2sKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ5NDMiPjQ5NDM8L2E+OgorVmVyaWZpY2F0aW9uIGVycm9yCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00Mzg1Ij40Mzg1PC9hPjoKK1F1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uLnNvdXJjZUVuZCBpbmNvcnJlY3QgaWYgdHlwZSBpcyBhbiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzMCI+MzIzMDwvYT46CitTZWFyY2ggLSBUb28gbWFueSB0eXBlIHJlZmVyZW5jZXMgZm9yIHF1ZXJ5IGVuZGluZyB3aXRoICogKDFHQVpWR0kpCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NCI+MzE3NDwvYT46IE9wZW4tb24tc2VsZWN0aW9uCitkb2Vzbid0IHdvcmsgb24gTW91c2VBZGFwdGVyICgxR0Y2OVRIKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzNyI+MzMzNzwvYT46CitPcGVuIG9uIHNlbGVjdGlvbiBmYWlsZWQgd2l0aCBkb3VibGUgbWVzc2FnZSAoMUdJRkE4MCkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDciPjMyMDc8L2E+OgorSk0gLSBTbWFydCBzYXZlIHdoZW4gZW1wdHkgQ1UgKDFHNEVWSE0pCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjcyIj4xNjcyPC9hPjoKK0Nhbm5vdCBldmFsdWF0ZSBjbGFzc2VzIGluIGEgc2VhbGVkIGphciAoMUdIVTZZSykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjAiPjMyMjA8L2E+OgorRm9ybWF0dGVyIHRlc3RzIHJlZmVyIHRvIGhhcmRjb2RlZCBwYXRoIG9uIGRpc2sgKDFHOVI1RzQpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU4Ij4zMjU4PC9hPjoKK2V4Y2VwdGlvbiBkb2luZyBpbXBvcnQgYXNzaXN0ICgxR0RJSjlEKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MCI+MzI0MDwvYT46CituZWVkIHRvIGZpbmQgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBhbm9ueW1vdXMgaW5uZXIgdHlwZXMgKDFHQ0JQUkkpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU0Ij4zMjU0PC9hPjoKK0luZGV4ZXIgLSBTaG91bGQgbmVzdCBpbmRleCBzb3VyY2UgcmV0cmlldmFsIGluIElXb3Jrc3BhY2VSdW5uYWJsZSAoMUdEN0o2RikKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMjUiPjMyMjU8L2E+OgorSUphdmFQcm9qZWN0LmZpbmRQYWNrYWdlRnJhZ21lbnQgc3RyYW5nZSBzZW1hbnRpYyAoMUdBT0xXUSkKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTgiPjMyMTg8L2E+OgorTm8gaW50ZXJmYWNlIHRvIHBvbHltb3JwaGljYWxseSBhY2VzcyBJQ29tcGlsYXRpb25Vbml0ICgxRzhEMlpQKQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNSI+MzIwNTwvYT46CitQcm9ibGVtcyB3aXRoIElKYXZhTW9kZWwuZmluZFBhY2thZ2VGcmFnbWVudCAoMUc0NTZETykKKzxicj48YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTciPjMxOTc8L2E+OgorRENSIC0gT3Blbk9uU2VsZWN0aW9uIC0gQ29kZSByZXNvbHZlIGRvZXNuJ3Qgd29yayBvbiBkZWNsYXJhdGlvbnMgKDFHMFVYOVYpCis8YnI+PGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc3Ij4zMTc3PC9hPjoKKzY0a2IgbWV0aG9kIHNob3VsZCBiZSBhIGNvbmZpZ3VyYWJsZSBwcm9ibGVtICgxRkpIR1ZGKQorPGJyPiZuYnNwOworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyBCdWlsZCAyMDAxMTAxMSAtIE9jdG9iZXIgMTF0aCwgMjAwMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8yMDQKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKworPHVsPgorPGxpPgorQ2xhc3NwYXRoIGVudHJpZXMgKGV4Y2VwdCBmb3Igc291cmNlIGZvbGRlcnMpIGNhbiBiZSB0YWdnZWQgYXMgZXhwb3J0ZWQKK3Vwb24gY3JlYXRpb24uIFdoZW4gZXhwb3J0ZWQsIGFuIGVudHJ5IGlzIGNvbnRyaWJ1dGVkIHRvIGRlcGVuZGVudCBwcm9qZWN0cworYWxvbmcgd2l0aCBpdHMgb3V0cHV0IGxvY2F0aW9uLjwvbGk+CisKKzxsaT4KK0FkZGVkIEFQSXM6PC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBUZXN0aW5nIHN0YXR1cyBvZiBhIGdpdmVuIGVudHJ5Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgSUNsYXNzcGF0aEVudHJ5LmlzRXhwb3J0ZWQoKTwvdWw+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ3JlYXRpbmcKK2VudHJpZXMgd2l0aCBleHBvcnQgZmxhZworPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworKyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoSVBhdGgsIGJvb2xlYW4pCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisrIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShJUGF0aCwgSVBhdGgsIElQYXRoLCBib29sZWFuKQorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworKyBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KElQYXRoLCBib29sZWFuKQorPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEhlbHBlcgorbWV0aG9kIGNvbXB1dGluZyBhIHJlc29sdmVkIGFuZCBleHBhbmRlZCBwYXRoIChhbGwgZXhwb3J0cyBmcm9tIHByZXJlcXVpc2l0ZXMpCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisrIElKYXZhUHJvamVjdC5nZXRFeHBhbmRlZENsYXNzcGF0aChib29sZWFuKQorPHVsPgorPGxpPgorQ29kZUFzc2lzdCBpbnNlcnRzIHF1YWxpZmljYXRpb24gb24gZmllbGQvbWV0aG9kIHJlZmVyZW5jZXMgaW4gY2FzZSBvZgorYW1iaWd1aXRpZXMuPC9saT4KKworPGxpPgorQ29kZUFzc2lzdCBwcm92aWRlcyBwYXJhbWV0ZXIgbmFtZXMgb24gbWV0aG9kIGNvbXBsZXRpb25zLjwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQVBJIENoYW5nZXMgb24gSUNvbXBsZXRpb25SZXF1ZXN0b3IKKzxicj4mbmJzcDsmbmJzcDsgKyBBZGRlZCBBUEkgZm9yIGFuc3dlcmluZyBtZXRob2QgZGVjbGFyYXRpb24gY29tcGxldGlvbnM6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIHNlbGVjdG9yLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICsgQWRkZWQgcGFyYW1ldGVyTmFtZXMgdG8gbm9ybWFsIG1ldGhvZCByZXN1bHRzCitBUEk6Cis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZvaWQgYWNjZXB0TWV0aG9kKAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSBzZWxlY3RvciwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsmbHQ7Jmx0OyZsdDsKK0FEREVECis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNoYXJbXSByZXR1cm5UeXBlTmFtZSwKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hhcltdIGNvbXBsZXRpb25OYW1lLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgbW9kaWZpZXJzLAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvblN0YXJ0LAorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgY29tcGxldGlvbkVuZCk7Cis8YnI+Jm5ic3A7Cis8bGk+CitDb2RlQXNzaXN0IG9wdGlvbmFsbHkgcGVyZm9ybXMgdmlzaWJpbGl0eSBjaGVja3MgKHNlZSBKYXZhQ29yZSBvcHRpb246Cisib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayIpLjwvbGk+CisKKzxsaT4KK1NlYXJjaCBmb3IgZmllbGQgcmVhZCBhbmQgZmllbGQgd3JpdGUgcmVmZXJlbmNlcy4gVHdvIG5ldyBjb25zdGFudHMgaGF2ZQorYmVlbiBhZGRlZDwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb24gSUphdmFTZWFyY2hDb25zdGFudHMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nCithIGZpZWxkIHJlZmVyZW5jZSBzZWFyY2ggcGF0dGVybjoKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBSRUFEX1JFRkVSRU5DRVM6IHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluICpvbmx5KgorcmVhZCBhY2Nlc3MgdG8gYSBmaWVsZC4KKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBXUklURV9SRUZFUkVOQ0VTOiB0aGUgc2VhcmNoIHJlc3VsdHMgY29udGFpbiAqb25seSoKK3dyaXRlIGFjY2VzcyB0byBhIGZpZWxkLgorPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBOb3RlIHRoYXQgaWYgUkVGRVJFTkNFUyBpcyB1c2VkLCB0aGVuIHNlYXJjaCByZXN1bHRzCitjb250YWluIGJvdGggcmVhZCBhbmQgd3JpdGUKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYWNjZXNzcyB0byBhIGZpZWxkLgorPGxpPgorT3Blbk9uU2VsZWN0aW9uIGNhbiBub3cgbG9jYXRlIHNlbGVjdGVkIGRlY2xhcmF0aW9ucyB3aGljaCBoYXZlIGEgY29ycmVzcG9uZGluZzwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgSmF2YSBlbGVtZW50IChpLmUuIG5vIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGZvdW5kKSwKK2FuZCBpcyBtb3JlIHRvbGVyYW50IG9mCis8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGluY29ycmVjdCBjb2RlLjwvdWw+CisKKzxoMj4KK1Byb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDI+CismbmJzcDsgMzQzMCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cyAoMUdLWVhLNSkKKzxicj4mbmJzcDsgMzQzMSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBVbnJlYWNoYWJsZSBjb2RlIGluIEpDb3JlCisoMUdMMlY2SykKKzxicj4mbmJzcDsgMzE3NSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKQ0sxLjNhIC0gSUNMUyAtIENvbXBhcmluZworY3VycmVudCBpbnN0YW5jZSBhZ2FpbnN0IGVuY2xvc2luZyBpbnN0YW5jZSBpbnNpZGUgb2YgYW5vbnltb3VzIGNsYXNzLgorKDFHTERTQlMpCis8YnI+Jm5ic3A7IDFHTEJPSlo6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBVbmFyeUV4cHJlc3Npb24gZG9lc24ndCBzdG9yZQorZXhwcmVzc2lvbiB0eXBlIGluIGJpdCBtYXNrCis8YnI+Jm5ic3A7IDFHRFM3SVA6Jm5ic3A7IElUUEpDT1JFOldJTjIwMDAgLSBWZXJpZnlFcnJvciByZWxhdGVkIHRvIGEgbG9jYWwKK2luZGV4IGNvbXB1dGF0aW9uCis8YnI+Jm5ic3A7IDFHTEFCUTc6IElUUEpDT1JFOldJTjIwMDAgLSBKYXZhQ29yZS5jcmVhdGUoU3RyaW5nKSB0aHJvd3MgYW4KK3VuZXhwZWN0ZWQgZXhjZXB0aW9uCis8YnI+Jm5ic3A7IDFHTDBQR1Y6IElUUEpDT1JFOldJTk5UIC0gQmF0Y2ggY29tcGlsZXIgbGVhdmluZyBKQVJzIG9wZW4KKzxicj4mbmJzcDsgNTI2OCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJVFBKQ09SRTpBTEwgLSBWZXJpZnlFcnJvciB3aGVuIHJ1bm5pbmcgYXBwICgxR0w0UUtJKQorPGJyPiZuYnNwOyAxR0xCUDY1OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiB0eXBlIHJlZnMgLSBpbmNvcnJlY3QgbWF0Y2gKKzxicj4mbmJzcDsgMUdLWENPTTogSVRQSkNPUkU6V0lOMjAwMCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBkdXJpbmcgaW5uZXIKK2NsYXNzIGVtdWxhdGlvbgorPGJyPiZuYnNwOyAxR0QwN0dLOiBJVFBKVUk6V0lOOTggLSBDb2RlIGFzc2lzdCBzaG91bGQgcXVhbGlmeSBtZXRob2RzIGlmCituZWVkZWQuCis8YnI+Jm5ic3A7IDFHTDFIRjg6IElUUEpDT1JFOldJTjIwMDAgLSBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBjb21waWxlcgorY29tcGlsaW5nIGludmFsaWQgY29kZQorPGJyPiZuYnNwOyAxR0wxM09UOiBJVFBKQ09SRTpBTEwgLSBJTmFtZUxvb2t1cCBzaG91bGQgYmUgcmVtb3ZlZAorPGJyPiZuYnNwOyAxR0wxSTlGOiBJVFBKQ09SRTpXSU4yMDAwIC0gV3Jvbmcgc291cmNlIG1hcHBpbmcgZm9yIGJpbmFyeQorbWV0aG9kcyB3aXRoIHBhcmFtZXRlcnMgd2l0aCBpZGVudGljYWwgc2ltcGxlIG5hbWVzCis8YnI+Jm5ic3A7IDFHNENJUDA6IElUUEpVSTpXSU4gLSBTb3VyY2UgZm9yIGJpbmFyaWVzIGRvZXNuJ3Qgd29yayBmb3IgYW5vbnltb3VzCitpbm5lciBjbGFzc2VzCis8YnI+Jm5ic3A7IDFHRDc5WE06IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gc2VhcmNoIGZvciBmaWVsZCByZWZlcmVuY2VzCistIG5vdCBhbGwgZm91bmQKKzxicj4mbmJzcDsgMUdMQTYwVzogSVRQSkNPUkU6V0lOTlQgLSBDb2RlQXNzaXN0IC0gc2hvdWxkIG5vdCBwcm9wb3NlIGRlY2xhcmF0aW9ucworb2YgbWV0aG9kIGFscmVhZHkgbG9jYWxseSBpbXBsZW1lbnRlZAorPGJyPiZuYnNwOyAxR0xBRVpCOiBJVFBKQ09SRTpXSU5OVCAtIENvZGVBc3Npc3QgZG9lcyBub3QgZGlzYW1iaWd1YXRlIG1ldGhvZAorcmVmZXJlbmNlcworPGJyPiZuYnNwOyAxR0w0RjNKOiBJVFBKQ09SRTpXSU5OVCAtIENvbXBsZXRpb24gb24gZGVjbGFyYXRpb24gc2hvdWxkIGFsc28KK3Byb3ZpZGUgdGhyb3duIGV4Y2VwdGlvbnMKKzxicj4mbmJzcDsgMUdMMTFKNjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBmaWVsZCByZWZlcmVuY2VzCisobmVzdGVkIHR5cGVzKQorPGJyPiZuYnNwOyAxR0wxMlhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMKK2luIGlubmVyIGNsYXNzCis8YnI+Jm5ic3A7IDFHTDBYODI6IElUUEpDT1JFOkFMTCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBzZXR0aW5nIGFyZ3Mgb24gY2xhc3MKK2ZpbGUKKzxicj4mbmJzcDsgMUdLQVFKUzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogaW5jb3JyZWN0IHJlc3VsdHMgZm9yIG5lc3RlZAordHlwZXMKKzxicj4mbmJzcDsgMUdLWjhWWjogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBkaWQgbm90IGZpbmQgcmVmZXJlbmNlcyB0bworbWVtYmVyIGNvbnN0cnVjdG9yCis8YnI+Jm5ic3A7IDFHS1lTN1k6IElUUEpDT1JFOldJTk5UIC0gTWFpbiBub3QgZm91bmQKKzxicj4mbmJzcDsgMUdFTFNEUTogSVRQSlVJOldJTk5UIC0gSkRPTTogSVR5cGUuY3JlYXRlTWV0aG9kIGRvZXMgbm90IGluc2VydAorbmljZWx5IGZvciBpbm5lciB0eXBlcworPGJyPiZuYnNwOyAxR0Y2N1ZMOiBJVFBKVUk6V0lOOTggLSBEQ1IgLSBDb2RlQ29tcGxldGlvbiAtIENvZGUtYXNzaXN0IGZvcgorbGlzdGVuZXIgbWV0aG9kcworPGJyPiZuYnNwOyAxR0ZLOFlUOiBJVFBKVUk6QUxMIC0gUmVuYW1lIENVIEEuQi5qYXZhIHRvIEFCLmphdmEgZmFpbHMgKE5QRSkKKzxicj4mbmJzcDsgMUdEMDZKNjogSVRQSlVJOldJTjk4IC0gQ29kZSBhc3Npc3Qgc2hvdWxkIHF1YWxpZnkgZmllbGRzIGlmCituZWVkZWQuCis8YnI+Jm5ic3A7IDFGWldHTUc6IElUUENPTTpXSU45OCAtIERDUiAtIENvZGVBc3Npc3QgLSBjb2RlIGFzc2lzdCBzaG91bGQKK3Byb3ZpZGUgbWV0aG9kIHNpZ25hdHVyZSBjb21wbGV0aW9ucworPGJyPiZuYnNwOyAxR0hWT1FFOiBJVFBKQ09SRTpXSU5OVCAtIEFtYmlndW91cyBjb21wbGV0aW9uIGluIENvZGVBc3Npc3QKKzxicj4mbmJzcDsgMUc4REVBQjogSVRQSlVJOldJTk5UIC0gRENSOiBjb2RlIGFzc2lzdCBzdXBlciBtZXRob2RzIHdoZW4KK2RlZmluaW5nIG1ldGhvZAorPGJyPiZuYnNwOyAxR0dOTkRaOiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vbiB2aXNpYmxlIHRhcmdldAoraXMgZXF1aXZhbGVudCB0byBubyB0YXJnZXQKKzxicj4mbmJzcDsgMUdFMTROTjogSVRQSlVJOldJTk5UIC0gVW5hYmxlIHRvIGZpbmQvc2VhcmNoIGZvciAuY2xhc3MgZmlsZXMKKzxicj4mbmJzcDsgMUdKWUZVTzogSVRQRFVJOkFMTCAtIEV2YWx1YXRpb24gaGFuZ3MsIGV2YWx1YXRpb24gdGhyZWFkIGlzCitzdXNwZW5kZWQKKzxicj4mbmJzcDsgMUZXRzQ1MzogSVRQSkNPUkU6V0lOOTggLSBPcGVuT25TZWxlY3Rpb24gLSBmYWlscyBmb3IgZGVmYXVsdAorY29uc3RydWN0b3JzCis8YnI+Jm5ic3A7IDFHRFFEMzc6IElUUEpVSTpXSU4yMDAwIC0gT3Blbk9uU2VsZWN0aW9uIC0gT3BlbiBvbiBzZWxlY3Rpb24KK2ZhaWx1cmUKKzxicj4mbmJzcDsgMUdHWjJSNzogSVRQSlVJOldJTjIwMDAgLSBTZWFyY2ggZm9yIG1ldGhvZCByZWZzIGZhaWxlZAorPGJyPiZuYnNwOyAxR0tOWFg2OiBJVFBKQ09SRTpXSU5OVCAtIE9wZW5PblNlbGVjdGlvbiAtIG5vIHNlbGVjdGlvbiBpZgordGFyZ2V0aW5nIG1lbWJlciB0eXBlIGluIGRlZmF1bHQgcGFja2FnZQorPGJyPiZuYnNwOyAxR0UzNEVFOiBJVFBKVUk6V0lOMjAwMCAtIE9wZW5PblNlbGVjdGlvbiAtIGluaXRpYWwgc2VsZWN0aW9uCit3cm9uZworPGJyPiZuYnNwOyAxR0tFRzczOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoICgxMzYpOiBtaXNzaW5nIGZpZWxkIGRlY2xhcmF0aW9uCis8YnI+Jm5ic3A7IDFHS0I5WUg6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2ggZm9yIGZpZWxkIHJlZnMgLSBpbmNvcnJlY3QKK3Jlc3VsdHMKKzxicj4mbmJzcDsgMUdKTDZFSjogSVRQSkNPUkU6V0lOTlQgLSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGg6CitDb21wYXJlcyBhZ2FpbnN0IHZhcmlhYmxlIG5hbWUKKzxicj4mbmJzcDsgMUdEUUVBUzogSVRQSlVJOkFMTCAtIEluZGV4ZXIgLSBkZWxldGUgdW51c2VkIGluZGV4ZXMgb24gSmF2YQorY29yZSBwbHVnLWluIHNodXRkb3duCis8YnI+Jm5ic3A7IDFHS000TTk6IElUUEpDT1JFOldJTk5UIC0gRENSOiBjb2RlIHNlbGVjdCBzaG91bGQgd29yayBvbiBkZWNsYXJhdGlvbnMKKzxicj4mbmJzcDsgMUcyTlpWVDogSVRQSlVJOldJTjIwMDAgLSBEQ1IgLSBPcGVuT25TZWxlY3Rpb24gLSBDb2RlIHJlc29sdmUKK2RvZXNuJ3Qgd29yayBmb3IgZGVjbGFyYXRpb25zCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKyZuYnNwOyAzMjIzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNlYXJjaCBmcm9tIGVkaXRvcidzIGNvbnRleHQKK21lbnUgZG9lc24ndCB3b3JrICgxR0FKQ0Q4KQorPGJyPiZuYnNwOyAzNDMzJm5ic3A7IHNlYXJjaDogbWlzc2luZyBmaWVsZCBvY2N1cnJlY25jZXMgKDFHS1o4SjYpCis8YnI+Jm5ic3A7IDMxNzYmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSkNLMS4zYSAtIFNUTVQgLSBTaW5nbGUgZGVjbGFyYXRpb24KK2luIHRyeSBibG9jayAoMUdMRFNIOSkKKzxicj4mbmJzcDsgMUdMME1OOTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbm90IGNvbnNpc3RlbnQgcmVzdWx0cyBmb3IKK25lc3RlZCB0eXBlcworPGJyPiZuYnNwOyAxR0w5VU1IOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHR5cGUgb2NjdXJyZW5jZXMKKzxicj4mbmJzcDsgMUdLWVhLNTogSVRQSlVJOldJTjIwMDAgLSB1c2FiaWxpdHk6IHBhcmFtZXRlciBoaW50cworPGJyPiZuYnNwOyAxR0VWNzhFOiBJVFBKVUk6V0lOMjAwMCAtIENvZGUgYXNzaXN0OiBwcml2YXRlIHN1cGVyY2xhc3MgbWV0aG9kcworc2hvdyB1cCwgYnV0IG90aGVycyBkb24ndAorPGJyPiZuYnNwOyAxR0RLS1RTOiBJVFBKVUk6V0lOTlQgLSBDb2RlQ29tcGxldGlvbiAtIGltcG9ydCBhc3Npc3Qgc2hvd3MKK2ludmlzaWJsZSB0eXBlcworPGJyPiZuYnNwOyAxRzczMTdPOiBJVFBKQ09SRTpXSU4yMDAwIC0gRENSIC0gQ29kZUFzc2lzdCAtIGNvZGUgYXNzaXN0IHNob3dzCitpbnZpc2libGUgbWVtYmVycworPGJyPiZuYnNwOyAxR0tLOTMwOiBJVFBKQ09SRTpXSU5OVCAtIE5vIGNvZGUgYXNzaXN0IGZvciBJbm5lciB0eXBlCis8YnI+Jm5ic3A7IDFHSUlER1g6IElUUEpVSTpXSU5OVCAtIG9wZW4gb24gdHlwZTogZG9lcyBub3Qgd29yayBvbiBzb21lCit0eXBlcworPGJyPiZuYnNwOyAxR0tPRk82OiBJVFBKQ09SRTpXSU5OVCAtIEludGVybmFsIGVycm9yIHNlYXJjaGluZyBmb3IgY2xhc3MKK3JlZmVyZW5jZXMKKzxicj4mbmJzcDsgMUdLOTZBMDogSVRQSkNPUkU6V0lOTlQgLSBOUEUgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb24KKzxicj4mbmJzcDsgMUdLOUI1UTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzcyByZWZlcmVuY2Ugc2VhcmNoIGJyb2tlbgorPGJyPiZuYnNwOyAxR0JPRks1OiBJVFBKVUk6QUxMIC0gIlJlZmVyZW5jZXMgdG8iIG9uIG1ldGhvZHMgaW4gamFycworPGJyPiZuYnNwOyAxR0tFQ1dDOiBJVFBKQ09SRTpXSU5OVCAtIE9yZ2FuaXplIEltcG9ydHMgZmFpbHM6IFR5cGVyZWZzIG5vdAorY29tcGxldGUKKzxicj4mbmJzcDsgMUdLQ0gzTjogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWV0aG9kIHJlZnMgLSBzdXBlciBjYWxsCitub3QgZm91bmQKKzxicj4mbmJzcDsgMUdLQjQ3NTogSVRQSkNPUkU6V0lOTlQgLSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIG9uCitzZWFyY2hmb3IgbWV0aG9kcworPGJyPiZuYnNwOyAxR0pMNlYwOiBJVFBKQ09SRTpXSU5OVCAtIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aDoKK0lTdGF0dXMgdXNhZ2UKKzxicj4mbmJzcDsgMUdLTTFNVTogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc3BhdGggdmFsaWRhdGlvbjogT3ZlcmxhcHBpbmcKK2FjY2VwdGVkCis8YnI+Jm5ic3A7IDFHSkw3UlM6IElUUEpDT1JFOldJTk5UIC0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoOgorbmVzdGVkIHNvdXJjZWZvbGRlcnMKKzxicj4mbmJzcDsgMUdLOU5CMDogSVRQSkNPUkU6V0lOMjAwMCAtIEFub3RoZXIgY29yZSBkdW1wIC0gc29ycnkKKzxicj4mbmJzcDsgMUdKWUczMzogSVRQSlVJOldJTjIwMDAgLSBDb3JlIGR1bXAgaW4gcnVuIHRpbWUgd29ya2JlbmNoIGluCitTZWFyY2gKKzxicj4mbmJzcDsgMUdLOVM1OTogSVRQSlVJOldJTjIwMDAgLSBJbnRlcm5hbCBlcnJvciB3aGVuIHN5bmNocm9uaXppbmcKKzxicj4mbmJzcDsgMUdMMlRaWTogSVRQSlVJOldJTjIwMDAgLSBDb2RlIENvbXBsZXRpb24gc2hvdWxkIG9ubHkgc2hvdyB2aXNpYmxlCitpdGVtcworPGJyPiZuYnNwOyAxR0tSTFo0OiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgb3ZlcnplYWxvdXMgd2l0aCBjb21tYXMKKzxicj4mbmJzcDsgMUdGOThSNDogSVRQSlVJOldJTk5UIC0gSk0gLSB3aHkgaXMgYSBmaWxlIEEuQi5qYXZhIHNlZW4gYXMKK2EgY29tcGlsYXRpb24gdW5pdD8KKzxicj4mbmJzcDsgMUc5OFhSNzogSVRQSkNPUkU6V0lOMjAwMCAtIEZlYXR1cmUgUmVxdWVzdCBmb3IgSmF2YURvYyBDb2RlQXNzaXN0Cis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIEJ1aWxkIDAuMjAyIC0gU3BldGVtYmVyIDI3dGgsIDIwMDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjAyCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+CisKKzx1bD4KKzxsaT4KK05ldyBBU1Qgbm9kZSBmb3IgZW1wdHkgc3RhdGVtZW50cyAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5FbXB0eVN0YXRlbWVudCk8L2xpPgorCis8YnI+Jm5ic3A7Jm5ic3A7IGkuZS4gMiBtb3JlIEFQSXMgb24gdGhlIEFTVCB2aXNpdG9yLiBOb3RlOiB0aGlzIHdhcyBub3QKK2FuIG9mZmljaWFsIEFQSQorPGxpPgorSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3Igbm90aWZpZXMgZW50ZXIvZXhpdCBpbml0aWFsaXplcnMgaW5zdGVhZCBvZiBqdXN0CithY2NlcHRJbml0aWFsaXplci4gTm90ZTogdGhpcyB3YXMgbm90IGFuIG9mZmljaWFsIEFQSTwvbGk+CisKKzxsaT4KK1NlYXJjaCBpbiBpbm5lci1jbGFzc2VzIG5vdyB3b3Jrcy4gSW5kZXhlcyBhcmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5CitvbiBzdGFydC11cC48L2xpPgorCis8bGk+CismbmJzcDsgUmVtb3ZlZCBDb2RlQXNzaXN0IG9wdGlvbiBmb3IgaHVuZ3J5IG1vZGUgKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5lbnRpcmVXb3JkUmVwbGFjZW1lbnQpPC9saT4KKworPGJyPiZuYnNwOyZuYnNwOyBDbGllbnQgY29kZSBjYW4gZGVjaWRlIHdoZXRoZXIgdXNpbmcgaW5mZXJyZWQgZW5kIHBvc2l0aW9uCisoaHVuZ3J5IGJlaGF2aW9yKSBvciBvcmlnaW5hbCBjdXJzb3IgbG9jYXRpb24gKGluc2VydCBiZWhhdmlvcikKKzxicj4mbmJzcDsmbmJzcDsgYmFzZWQgb24gdGhlIGtleXN0cm9rZSAoZW50ZXIvaW5zZXJ0PykuCis8bGk+CismbmJzcDsgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIG5vdyBjbGVhcmx5CitzdGF0ZXMgdGhhdDwvbGk+CisKKzxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIG9yZGVyIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGlzIHVuc3BlY2lmaWVkLjwvdWw+CisKKzxoMj4KK1Byb2JsZW0gcmVwb3J0cyBmaXhlZDwvaDI+CismbmJzcDsgMUdLMkE0NTogSVRQSkNPUkU6V0lOMjAwMCAtIEpDSyAxLjQgLSBwb3NzaWJseSBhc3NpZ25lZCB2YXJpYWJsZQorYWZ0ZXIgYXNzaWdubWVudCBleHByZXNzaW9uIHdoZW4gdHJ1ZQorPGJyPiZuYnNwOyAxR0syOVE4OiBJVFBKQ09SRTpXSU4yMDAwIC0gSkNLIDEuNCAtIHBvc3NpYmx5IGFzc2lnbmVkIHZhbHVlCitvZiBhIGZpbmFsIGluc3RhbmNlIHZhcmlhYmxlIGFmdGVyIGEgY29uc3RhbnQgYm9vbGVhbiBleHByZXNzaW9uIHdoZW4gZmFsc2UKKzxicj4mbmJzcDsgMUc1MkY3UDogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBmaW5kcyBib2d1cyByZWZlcmVuY2VzIHRvCitjbGFzcworPGJyPiZuYnNwOyAxRzRUTlgxOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIE5vIHNlYXJjaCBhbm9ueW1vdXMgcmVzdWx0cworaW4gaW5uZXIgY2xhc3NlcworPGJyPiZuYnNwOyAxR0hXMEFaOiBJVFBKQ09SRTpXSU5OVCAtIEpDSyAxLjQgLSB1bnJlYWNoYWJsZSBlbXB0eSBzdGF0ZW1lbnRzCis8YnI+Jm5ic3A7IDFHSzJCTE06IElUUEpDT1JFOldJTjIwMDAgLSBKQ0sgMS40IC0gZGVmaW5pdGVseSBhc3NpZ25lZCB2YWx1ZQorYWZ0ZXIgdGhlIGJvb2xlYW4gb3BlcmF0b3IgPyA6IHdoZW4gdHJ1ZQorPGJyPiZuYnNwOyAxR0tCMjhBOiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgYWNjZXB0cyBpbmNvcnJlY3QgY29kZQorPGJyPiZuYnNwOyAxRkw0VDFROiBMRkNPTTpXSU5OVCAtIEpDSyAxLjQgLSBWZXJpZnlFcnJvciBkdWUgdG8gYW4gaWxsZWdhbAoranVtcAorPGJyPiZuYnNwOyAxR0syQjZEOiBJVFBKQ09SRTpXSU4yMDAwIC0gSkNLIDEuNCAtIGRlZmluaXRlbHkgYXNzaWduZWQgdmFsdWUKK2JlZm9yZSB0aGUgc2Vjb25kIG9wZXJhbmQgb2YgdGhlIGJvb2xlYW4gb3BlcmF0b3IgJmFtcDsmYW1wOworPGJyPiZuYnNwOyAxR0syQU9GOiBJVFBKQ09SRTpXSU4yMDAwIC0gSkNLIDEuNCAtIGFzc2lnbmVkIHZhcmlhYmxlIGJlZm9yZQorZmluYWxseSBibG9jayBhZnRlciByZXR1cm4gc3RhdGVtZW50Cis8YnI+Jm5ic3A7IDFHSzZXRDM6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6bm8gZnVsbHkgcXVhbGlmaWVkIHJlZmVyZW5jZXMKK2FyZSBmb3VuZAorPGJyPiZuYnNwOyAxR0s3MjMxOiBJVFBKQ09SRTpXSU4yMDAwIC0gdHlwb3MgaW4gY29tbWVudHMKKzxicj4mbmJzcDsgMUdLNzdIQTogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBtaXNzaW5nIGJhc2UgdHlwZSByZWZlcmVuY2VzCis8YnI+Jm5ic3A7IDFHSlkyWE46IElUUEpVSTpXSU4yMDAwIC0gcmVuYW1lIHR5cGU6IGVycm9yIHdoZW4gd2l0aCByZWZlcmVuY2UKKzxicj4mbmJzcDsgMUdLMUkySjogSVRQSkNPUkU6V0lOMjAwMCAtIEJyb2tlbiBTb3VyY2VFbmQgaW4gRm9yU3RhdGVtZW50CithbmQgV2hpbGVTdGF0ZW1lbnQKKzxicj4mbmJzcDsgMUdLMUhXWTogSVRQSkNPUkU6V0lOMjAwMCAtIEJyb2tlbiBzb3VyY2VFbmQgaW4gZm9yIEFzc2lnbm1lbnQKK2FuZCBDb21wb3VuZEFzc2lnbm1lbnQKKzxicj4mbmJzcDsgMUdJSUJDMzogSVRQSkNPUkU6V0lOTlQgLSBzZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIC0gbWlzc2luZworbWF0Y2hlcworPGJyPiZuYnNwOyAxR0dOT1RGOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCBkb2Vzbid0IGZpbmQgbWV0aG9kIHJlZmVyZW5jZWQKK2luIGFub255bW91cyBpbm5lciBjbGFzcworPGJyPiZuYnNwOyAxR0sxR0pFOiBJVFBKQ09SRTpBTEwgLSBTZWFyY2ggLSBTdHJpbmdPdXRCb3VuZHNFeGNlcHRpb24gd2hlbgorc2VhcmNoaW5nIHJlZmVyZW5jZXMgaW4gSkFSCis8aDM+CitQcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKyZuYnNwOzFHSlkzS0c6IElUUEpVSTpXSU4yMDAwIC0gTlBFIGluIGpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZUluZm8KKzxicj4mbmJzcDsgMUdLOTBINDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBwYWNrYWdlIHJlZmVyZW5jZQorPGJyPiZuYnNwOyAxR0s4VFhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZQorPGJyPiZuYnNwOyAxR0s3SzE3OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHR5cGUgcmVmZXJlbmNlCis8YnI+Jm5ic3A7IDFHS0NKSUw6IElUUEpDT1JFOldJTjIwMDAgLSBidWlsZCBleGNlcHRpb24gaW4gMTM1Cis8YnI+Jm5ic3A7IDFHSzZXUDk6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFjaDogbWlzc2luZyB0eXBlIHJlZmVyZW5jZQorPGJyPiZuYnNwOyAxR0paU0JFOiBJVFBKQ09SRTpXSU5OVCAtIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBkdXJpbmcKK3JlYnVpbGQKKzxicj4mbmJzcDsgMUdLN0U2UzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogU3RyaW5nSW5kZXhPdWZPZkJvdW5kCis8YnI+Jm5ic3A7IDFHSVQ4NTc6IElUUEpDT1JFOldJTjIwMDAgLSBQZXJmb3JtYW5jZSAtIEN0cmwrUyB0cmlnZ2VycyBmaXZlCitwYXJzZXIgcnVucworPGJyPiZuYnNwOyAxR0VIQ1lMOiBJVFBVSTpXSU5OVCAtIE1pbm9yOiBDb2xvbiBhdCB3cm9uZyBwbGFjZSBpbiBidWlsZAorZGlhbG9nCis8YnI+Jm5ic3A7IDFGTFVCUlI6IEpSSURFOldJTk5UIC0gUHJvYmxlbXM6IGluc3RhbnRpYXRpbmcgaW5uZXIgY2xhc3NlcworPGJyPiZuYnNwOyAxRkxVT0pJOiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiB2YWd1ZSBlcnJvciBtZXNzYWdlIHdpdGggaWxsZWdhbAorY29uc3RydWN0b3IgaW52b2NhdGlvbgorPGJyPiZuYnNwOyAxRkxaVUc1OiBKUklERTpXSU5OVCAtIFByb2JsZW1zOiBpbnZhbGlkIGV4cHJlc3Npb24gYXMgc3RhdGVtZW50CitpcyBub3QgcmVwb3J0ZWQKKzxicj4mbmJzcDsgMUZMWlY0TTogSlJJREU6V0lOTlQgLSBQcm9ibGVtczogaW52YWxpZCBoZXhhIGxpdGVyYWwgbnVtYmVyCitub3QgcmVwb3J0ZWQKKzxicj4mbmJzcDsgMUZMWllFUzogSlJJREU6V0lOTlQgLSBQcm9ibGVtczogdGhlIGludGVyZmFjZSBjYW5ub3QgZGVmaW5lCithbiBpbml0aWFsaXplciBpcyBub3QgcmVwb3J0ZWQKKzxicj4mbmJzcDsgMUZRVlRJMTogTEZDT006V0lOTlQgLSBDb21waWxlciAtIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gc2hvdWxkCitub3QgZ2VuZXJhdGUgYWNvbnN0bnVsbAorPGJyPiZuYnNwOyAxRlVaWVhUOiBJVFBKQ09SRTpXSU5OVCAtIEpNIC0gU291cmNlIGZvciBCaW5hcmllcyBpc3N1ZQorPGJyPiZuYnNwOyAxRlgwTFowOiBJVFBDT006QUxMIC0gUmVxdWVzdCBmb3IgY29tbWVudHMgcHJlY2VlZGluZyBpbXBvcnRzCismYW1wOyBwYWNrYWdlIGRlY2xzCis8YnI+Jm5ic3A7IDFGVzhFTlA6IElUUEpVSTpXSU45OCAtIEpET00gLSBEZWxldGluZyBpbXBvcnQgc3RhdGVtZW50cyBmcm9tCitPdXRsaW5lIG9ibGl0ZXJhdGVzIGludGVydmVuaW5nIGNvbW1lbnRzCis8YnI+Jm5ic3A7IDFHNFBXQzc6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gTm8gbWF0Y2hlcyB3aXRoIGNsYXNzIGZpbGVzCis8YnI+Jm5ic3A7IDFHODNaS0w6IElUUEpVSTpXSU5OVCAtIENvbXBpbGVyIC0gdW5jbGVhciBlcnJvciBtZXNzYWdlIGZvcgorYSByZXNlcnZlZCB3b3JkIHVzZWQgYXMgYW4gaWRlbnRpZmllcgorPGJyPiZuYnNwOyAxR0Y1VzFTOiBJVFBKVUk6V0lOMjAwMCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiBpbiBMb29rdXBFbnZpcm9ubWVudAorPGJyPiZuYnNwOyAxR0tGMDFTOiBJVFBKQ09SRTpXSU5OVCAtIFNldmVyZTogaW50ZXJuYWwgZXJyb3IgZHVyaW5nIHNlYXJjaAorPGJyPiZuYnNwOyAxR0RWRlJYOiBJVFBKVUk6V0lOMjAwMCAtIENvZGVDb21wbGV0aW9uIC0gZWF0cyB0aGUgZm9sbG93aW5nCit3b3JkCis8YnI+Jm5ic3A7IDFHRjY3Sk06IElUUEpVSTpXSU45OCAtIENvZGVDb21wbGV0aW9uIC0gQ29kZS1hc3Npc3QgY29uc3VtZXMKK25leHQgdG9rZW4KKzxicj4mbmJzcDsgMUdDU0hBQzogSVRQSkNPUkU6SW5jb25zaXN0ZW50IGNvZGVhc3Npc3QgYmVoYXZpb3IKKzxicj4mbmJzcDsgMUdDTkJUTDogSVRQSkNPUkU6QUxMIC0gRENSIC0gSk0gLSBQcm92aWRlIGEgd2F5IHRvIHJlYWQgSmF2YUNvcmUKK2RlZmF1bHQgb3B0aW9ucyBmcm9tIHRoZSBwbHVnaW4ueG1sIGZpbGUKKzxicj4mbmJzcDsgMUdBSkJPVTogSVRQSlVJOldJTk5UIC0gQ29kZSBBc3Npc3Qgc2hvd3MgbWF0Y2hlcyBhZnRlciAoKQorPGJyPiZuYnNwOyAxRlc4TlY2OiBJVFBKQ09SRTpBTEwgLSBEQ1IgLSBKTSAtIE5lZWQgQVBJIGZvciBjb21waWxlciBvcHRpb25zCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0J1aWxkIDAuMjAwIC0gU2VwdGVtYmVyIDEzdGgsIDIwMDEKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMjAwCis8aDI+CitXaGF0IGlzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorCis8dWw+Cis8bGk+CitKQ0sxLjNhIGNvbXBsaWFudC48L2xpPgorCis8bGk+CitBZGRlZCAyIG5ldyBBUElzIG9uIEphdmFDb252ZW50aW9ucyBmb3IgY2xhc3NwYXRoIHZhbGlkYXRpb24uPC9saT4KKworPHVsPgorPGxpPgorSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aChJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10KK2NsYXNzcGF0aCwgSVBhdGggb3V0cHV0TG9jYXRpb24pPC9saT4KKworPGxpPgorSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkKK2VudHJ5LCBib29sZWFuIGNoZWNrU291cmNlQXR0YWNobWVudCk8L2xpPgorPC91bD4KKworPGxpPgorQW50IEVjbGlwc2UgY29tcGlsZXIgdGFzayBhZGRlZCAob3JnLmVjbGlwc2UuamR0LmNvcmUuYW50LkpkdGNvbSk8L2xpPgorCis8bGk+CitBc3NlcnRpb25zIHN1cHBvcnQgZW5hYmxlZDogYnkgZGVmYXVsdCB0aGUgY29tcGlsZXIgaXMgMS4zIGNvbXBsaWFudCwgYnV0CitpdCBjYW4gb3B0aW9uYWxseSBiZSB0dXJuZWQgaW50byBzb3VyY2UgMS40IG1vZGUgY2YuIEphdmFDb3JlIG9wdGlvbnMuPC9saT4KKworPGxpPgorTW9yZSBvcHRpb25zIGFyZSBzdXJmYWNlZCBvbiBKYXZhQ29yZS4gU2VlIEphdmFDb3JlLmdldERlZmF1bHRPcHRpb25zKCkKK2ZvciBkZXNjcmlwdGlvbi48L2xpPgorCis8dWw+Cis8bGk+CisuLi5pbnRlcm5hbC4uLkNvbmZpZ3VyYWJsZU9wdGlvbiBoYXMgZGlzYXBwZWFyZWQuPC9saT4KKworPGxpPgorRXZhbHVhdGlvbiBpbiBiaW5hcmllcyBpcyBmdW5jdGlvbmFsPC9saT4KKzwvdWw+CisKKzxsaT4KK1NlYXJjaCBmb3IgcmVmZXJlbmNlcyBub3cgZmluZHMgcmVzdWx0cyBpbiBiaW5hcmllcy4gSW5kZXhlcyBpbiBvbGQgd29ya3NwYWNlcworYXJlIHJlY29tcHV0ZWQgd2hlbiByZXN0YXJ0ZWQgd2hpY2ggbWF5IHJlc3VsdCBpbiBsb25nZXIgc3RhcnR1cCB0aW1lcy48L2xpPgorPC91bD4KKworPGgyPgorUHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMj4KKzFHRUtLVU86IElUUEpDT1JFOkFMTCAtIEpNIC0gVXRpbC5yZWFkQ29udGVudHNBc0J5dGVzKElucHV0U3RyZWFtKSBkb2Vzbid0CithbGxvdyBmb3Igc2l6ZSBoaW50Cis8YnI+MUdCUlBTSjogSVRQSkNPUkU6T3B0aW9ucyAtIHNob3VsZCBzdXJmYWNlIHRoZSBjb2RlIGZvcm1hdHRlciBvcHRpb25zCitvbiBKYXZhQ29yZQorPGJyPjFHSlUzWVY6IElUUEpDT1JFOkFMTCAtIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbiBzY2FubmVyCis8YnI+MUdKTDFSNTogSVRQSkNPUkU6QUxMIC0gTlBFIGluIENsYXNzRmlsZS5nZXRTb3VyY2VSYW5nZQorPGJyPjFHSDQ5WFI6IElUUEpVSTpXSU4yMDAwIC0gT3JnYW5pemUgSW1wb3J0cyBpbnNlcnRzIGJvZ3VzIGltcG9ydAorPGJyPjFHSlUzTzg6IElUUEpDT1JFOldJTk5UIC0gdHlwZSBoaWVyYXJjaHk6IE5QRQorPGJyPjFHSklZS1A6IElUUEpDT1JFOldJTk5UIC0gdHlwZSBoaWVyYXJjaHkgLSBjb250YWlucyB1bnJlbGF0ZWQgdHlwZXMKKzxicj4xR0lURlFSOiBJVkpJRFQ6V0lOMjAwMCAtIFdyb25nIGJ5dGUgY29kZSBnZW5lcmF0aW9uLCBJbmNvbnNpc3RlbnQKK3N0YWNrIGhlaWdodCAxICE9IDAgZXJyb3IKKzxicj4xR0lIVVFQOiBJVFBKQ09SRTpXSU5OVCAtIHNlYXJjaCBmb3Igc3RhdGljIGZpZWxkIHNob3VsZCBiZSBtb3JlIGFjY3VyYXRlCis8YnI+MUdJVDY2WDogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBjYWxsaW5nIENvZGVBc3Npc3QKKzxicj4xR0pBMFdHOiBJVFBKQ09SRTpXSU5OVCAtIEFib3J0Q29tcGlsYXRpb25Vbml0IHdoZW4gZG9pbmcgYSBTZWFyY2gKKzxicj4xR0g0OUhXOiBJVFBKVUk6V0lOTlQgLSBTZWFyY2ggZnVuY3Rpb25hbGl0eSBpcyBtaXNsZWFkaW5nIHdoZW4gdmlld2luZworc291cmNlIGZyb20gamFyCis8YnI+MUdGWFBFNTogSVRQSlVJOkFMTCAtIFNlYXJjaCBmb3IgbWV0aG9kIHJlZmVyZW5jZXMgYnJva2VuCis8YnI+MUdGTTNYMzogSVRQSlVJOldJTk5UIC0gV3JvbmcgY29kZSBmb3JtYXR0ZXIgZGVmYXVsdCBmb3Iga2VlcGluZyBlbHNlCitvbiBzYW1lIGxpbmUKKzxicj4xR0hTTTdCOiBJVFBKVUk6QUxMIC0gZm9ybWF0dGluZyBvZiBhbm9ueW1vdXMgY2xhc3NlcworPGJyPjFHR1BWSE46IElUUEpVSTpXSU4yMDAwIC0gTm90IGdldHRpbmcgaG92ZXIgSmF2YWRvYyBmb3IgSVNlbGVjdGlvbgorPGJyPjFHRTJMTzI6IElUUEpDT1JFOldJTjIwMDAgLSBTb3VyY2VTdGFydCBhbmQgU291cmNlRW5kIG9mIHN5bmNocm9uaXplZAorc3RhdGVtZW50Cis8YnI+MUdJVVRJWjogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogY2FzZSBzdGF0ZW1lbnQgZG9lc24ndCBjb3ZlciBjYXNlCitrZXl3b3JkCis8YnI+MUdJVENDWTogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogc3RyYW5nZSBMb2NhbERlY2xhcmF0aW9uLmRlY2xhcmF0aW9uU291cmNlRW5kCis8YnI+MUdJUlFGVzogSVRQSkNPUkU6V0lOMjAwMCAtIEFTVDogd3Jvbmcgc291cmNlIGVuZCBpZiBzdWJub2RlIGlzIG9mCit0eXBlIEFubm9ueW1vdXNUeXBlRGVjbGFyYXRpb24KKzxicj4xR0lSSFJQOiBJVFBKQ09SRTpXSU4yMDAwIC0gQVNUOiB3cm9uZyBzb3VyY2VTdGFydCBhbmQgc291cmNlRW5kIGluCitTeW5jaHJvbml6ZWRTdGF0ZW1lbnQKKzxicj4xR0hVQVVPOiBJVFBKQ09SRTpBTEwgLSBSZW5hbWluZyBhbiBlbGVtZW50IGluIGEgd29ya2luZyBjb3B5IGNvcnJ1cHRzCit0aGUgd29ya2luZyBjb3B5Cis8YnI+MUdIVUFNMTogSVRQSkNPUkU6QUxMIC0gTlBFIHdoZW4gcmVuYW1pbmcgYW4gZWxlbWVudCBpbiBhIHdvcmtpbmcgY29weQorPGJyPjFHSERBMlY6IElUUEpDT1JFOldJTk5UIC0gQ2xhc3NDYXN0RXhjZXB0aW9uIHdoZW4gZG9pbmcgYSBzZWFyY2gKKzxicj4xR0ZZMDJCOiBJVFBKVUk6QUxMIC0gRGVsZXRlIGEgbWV0aG9kIGFuZCBzYXZpbmcgaW50cm9kdWNlcyBleHRyYSBsaW5lcworPGJyPjFHRk9GTUQ6IElUUEpVSTpXSU4yMDAwIC0gTmV3IGNsYXNzIHNob3VsZCBoYXZlIHNwYWNlIGJldHdlZW4gcGFja2FnZQorYW5kIGNsYXNzIGRlY2xzCis8YnI+MUdJM1IxSTogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGF0aW9uIGVycm9yIGV2YWx1YXRpbmcgc3VwZXIgZXhwcmVzc2lvbgoraW4gZGVidWdnZXIKKzxicj4xR0lJMDdWOiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24udHJhdmVyc2UgZG9lc24ndAorY2FsbCB2aXNpdG9yLmVuZFZpc2l0Cis8YnI+MUdJUjM0NTogSVRQSkNPUkU6QUxMIC0gSW5kZXhlcjogTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24KKzxicj4xR0lSQzIzOiBJVFBKQ09SRTpBTEwgLSBDb2RlRm9ybWF0dGVyIGJyYWNlIG9uIG5ldyBsaW5lIHByb2JsZW0KKzxicj4xR0lUOFNBOiBJVFBKQ09SRTpXSU4yMDAwIC0gQVNUOiB3cm9uZyBzb3VyY2VFbmQgaWYgYWN0aW9uIGlzIEJsb2NrCis8YnI+MUdJVVFWTDogSVRQSkNPUkU6V0lOTlQgLSBJQ2xhc3NQYXRoRW50cnk6IGphdmEgZG9jIGluY29ycmVjdAorPGJyPjFHSVZHTUg6IElUUEpVSTpBTEwgLSBFQzogSmF2YWRvYyBob3ZlcmhlbHAgaW5jb3JyZWN0bHkgdXNlcyBmaXJzdAorb2YgbXVsdGlwbGUgY29tbWVudHMKKzxicj4xR0lZS1NSOiBJVFBKQ09SRTpXSU4yMDAwIC0gQXN0OiBGaWVsZERlY2xhcmF0aW9uLnRyYXZlcnNlIGltcGxlbWV0ZWQKK2RpZmZlcmVudGx5Cis8YnI+MUdJM05ENTogSVRQSkNPUkU6V0lOTlQgLSBQb3RlbnRpYWwgb3B0aW1pemF0aW9uIGR1cmluZyBJQiBwcm9ibGVtCitnZW5lcmF0aW9uCis8YnI+MUdGQlZaSDogSVRQVUk6V0lOMjAwMCAtIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjogSmF2YSBlZGl0b3IKKzxicj4xR0k1MDlFOiBJVFBKQ09SRTpXSU5OVCAtIElKYXZhUHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzIHJldHVybnMKK2phdmEgYW5kIGNsYXNzIGZpbGVzCis8YnI+MUdJMldBVzogSVRQSkNPUkU6V0lOTlQgLSBUb28gbWFueSByZXN1bHRzIGZvciBkZWZhdWx0IHBhY2thZ2UKKzxicj4xR0hRWjlIOiBJVFBKVUk6QUxMIC0gV2Fsa2JhY2sgZG9pbmcgYSBzZWFyY2gKKzxicj4xR0dZVDNTOiBJVFBKQ09SRTpXSU5OVCAtIGphdmFjb252ZW50aW9uczo6dmFsaWRhdGVQYWNrYWdlTmFtZSBhbmQKK2RlZmF1bHQgcGFja2FnZQorPGJyPjFHRjk4NTY6IElUUEpDT1JFOldJTk5UIC0gSk0gLSBKYXZhQ29udmVudGlvbnM6OnZhbGlkYXRlQ29tcGlsYXRpb25Vbml0TmFtZQorPGJyPjFHRjgyMlA6IElUUEpDT1JFOldJTjIwMDAgLSBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBpbiBQYXJzZXIKKzxicj4xR0k2VDRZOiBJVFBKQ09SRTpXSU5OVCAtIE5QRSBpbiBKYXZhTW9kZU1hbmFnZXIgcmV0cmlldmluZyB3b3Jrc3BhY2UKK29wdGlvbnMKKzxicj4xR0U0SUxSOiBJVFBKQ09SRTpBTEwgLSBFdmFsIC0gRXZhbHVhdGlvbiBpbiBCaW5hcnkgUHJvamVjdCBmYWlscworPGJyPjFHSTNMTEM6IElUUEpDT1JFOkFMTCAtIEluY29ycmVjdCBmb3JtYXR0aW5nIGZvciB0aGUgbmV3IGtleXdvcmQKKzxicj4xR0hVNk81OiBJVFBKQ09SRTpXSU5OVCAtIFJNSUMgdGVzdCBmYWlsCis8YnI+MUdISDZPNzogSVRQSkNPUkU6QUxMIC0gTmVlZCB0byB0dW5lIHRoZSBleGNlcHRpb24gYW5hbHlzaXMgZm9yIEFzc2VydFN0YXRlbWVudAorPGJyPjFHSFVXN1Q6IElUUEpDT1JFOldJTjIwMDAgLSBCdWlsZCBQcm9ibGVtCis8YnI+MUdJM0lHOTogSVRQSkNPUkU6QUxMIC0gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgaW52b2x2aW5nIGJvZ3VzIG1ldGhvZC9maWVsZAorZGVjbGFyYXRpb24KKzxicj4xR0hVNFBLOiBJVFBKQ09SRTpXSU5OVCAtIE5vU3VjaE1ldGhvZEVycm9yIHdoZW4gcnVubmluZyBwcm9ncmFtCis8YnI+MUdIT05BWDogSVRQSkNPUkU6V0lOMjAwMCAtIENvbXBpbGVyIHVzZXMgZGlmZmVyZW50IG5hbWUgbG9va3VwIGZvcgorcmVmYWN0b3JpbmcKKzxicj4xR0VKWUFKOiBJVFBKQ09SRTpXSU4yMDAwIC0gQ29tcGlsZXIgLSBCaW5kaW5nIG9mIFF1YWxpZmllZE5hbWVSZWZlcmVuY2UKK2lzIG51bGwKKzxicj4xR0hGSFdSOiBJVFBKQ09SRTpBTEwgLSBBc3NlcnRpb25zOiBDb2RlQXNzaXN0IGFuZCBTZWxlY3Rpb24gbmVlZCB0bworYmUgdXBkYXRlZAorPGJyPjFHSEZIWEc6IElUUEpDT1JFOkFMTCAtIEFzc2VydGlvbnM6IEFkZCBvcHRpb25hbCB3YXJuaW5nIG9uIGFzc2VydAoraWRlbnRpZmllcgorPGJyPjFHQ1o5Vk06IElUUEpDT1JFOldJTjIwMDAgLSBEQ1IgLSBDb21waWxlciAtIEJhdGNoIGNvbXBpbGVyIHNob3VsZAorYmUgQVBJCis8YnI+MUdITzZRUjogSVRQSkNPUkU6V0lOTlQgLSBDb2RlIEFzc2lzdCAtIG5vIG1ldGhvZCBjb21wbGV0aW9uIHdoZW4gcmV0dXJuCit0eXBlIGlzIHNlY29uZGFyeSBvbmUKKzxicj4xR0gwQVU3OiBJVFBKQ09SRTpBTEwgLSBFdmFsIC0gVmVyaWZ5RXJyb3IgaW4gc2NyYXBib29rIHBhZ2UKKzxicj4xR0gyUjYyOiBJVFBKQ09SRTpXSU4yMDAwIC0gVHlwbyBpbiBwcm9ncmVzcyBtZXNzYWdlCis8YnI+MUdHWUwzMjogSVRQSkNPUkU6QUxMIC0gRGVmYXVsdCBzdXBlcnR5cGVzIGFyZSBub3QgdmlzaWJsZSB3aGVuIHF1YWxpZmllZAorPGJyPjFHREZKSzA6IElWSklEVDpXSU4yMDAwIC0gVXNpbmcgJ3N5bmNocm9uaXplZCcgcHJvZHVjZXMgaW52YWxpZCBleGNlcHRpb24KK3RhYmxlIHZhbHVlcyBpbiBjbGFzcywgY2F1c2VzICJJbGxlZ2FsIGV4Y2VwdGlvbiB0YWJsZSByYW5nZSIgZXhjZXB0aW9uLAorVkFKIDMuNSsKKzxicj4xR0dBSzZHOiBJVFBKQ09SRTpBTEwgLSBJbmNvcnJlY3QgamF2YWRvYyBjb21tZW50IGluIEphdmFFbGVtZW50Cis8YnI+MUdGOUwzSzogSVRQRFVJOkFMTCAtIEV2YWwgLSBQcml2YXRlIGFycmF5IHJlc29sdXRpb24gZmFpbHVyZQorPGJyPjFHRjhLSFg6IElUUEpVSTpBTEwgLSBJbnZhbGlkIHByb2plY3QgYnVpbGQgcGF0aCBzaG91bGQgYmUgd2FybmluZywKK25vdCBlcnJvcgorPGJyPjFHRjdKSUg6IElUUEpDT1JFOkFMTCAtIEV4Y2VwdGlvbiB3aGVuIHJlbW92aW5nIG5ldHdvcmsgZHJpdmUKKzxicj4xR0VZQkw5OiBJVFBKVUk6V0lOTlQgLSBBZGRpbmcgc291cmNlIGZvbGRlcnMgb24gQ1AgaXMgdmVyeSBjb25mdXNpbmcKKzxicj4xR0VKQU9UOiBJVFBKVUk6V0lOTlQgLSBKUkUgU291cmNlIGF0dGFjaG1lbnQgc2V0IHRvIHBhdGggdG8gZG9lcyBub3QKK2V4aXN0Cis8YnI+MUdFSFpOQjogSVRQSlVJOldJTk5UIC0gc21va2UgMTE0OiBmb3JtYXR0ZXIgaW5zZXJ0cyBleHRyYSB0YWIgaW4gZmlyc3QKK2xpbmUKKzxicj4xR0NaWlQ0OiBJVFBKQ09SRTpGYXVsdC10b2xlcmFuY2UgLSBtaXNzaW5nIGNvbnN0cnVjdG9yIGludm9jYXRpb24KK2NvdWxkIHN0aWxsIGFuc3dlciB0aGUgYWxsb2NhdGVkIHR5cGUKKzxicj4xR0FVOTZQOiBJVFBKQ09SRTpXSU5OVCAtIERDUiAtIEpNIC0gSmF2YVByb2plY3Qgc2hvdWxkIHByb3ZpZGUgYSBjbGFzcworcGF0aCB2YWxpZGF0aW9uIG1ldGhvZAorPGJyPjFHN0ExVEw6IElUUEpDT1JFOldJTk5UIC0gRENSIC0gSk0gLSBSdWxlcyBmb3IgY2xhc3NwYXRoIG5vdCBzcGVjaWZpZWQKKzxicj4xRlZWV1pUOiBJVFBKQ09SRTpBTEwgLSBKTSAtIElCaW5hcnlUeXBlIHNob3VsZCBpbXBsZW1lbnQgZ2V0U291cmNlRmlsZU5hbWUoKQorPGJyPiZuYnNwOworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vYmF0Y2ggY29tcGlsZS9iYXRjaENvbXBpbGUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2JhdGNoIGNvbXBpbGUvYmF0Y2hDb21waWxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGQ0YjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vYmF0Y2ggY29tcGlsZS9iYXRjaENvbXBpbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzkgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkhvdyB0bzogUnVuIGJhdGNoIGNvbXBpbGVyPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+Ci0mbmJzcDsKLTx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IENFTExQQURESU5HPTIgV0lEVEg9IjEwMCUiID4KLTx0cj4KLTx0ZCBBTElHTj1MRUZUIFZBTElHTj1UT1AgQ09MU1BBTj0iMiIgQkdDT0xPUj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkpEVAotQ29yZSAvIEhvd1RvOiBSdW4gdGhlIEJhdGNoIENvbXBpbGVyJm5ic3A7PC9mb250PjwvYj48L3RkPgotPC90cj4KLQotPHRyPgotPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQotPHRkIFdJRFRIPSI5OCUiPjxiPkZpbmRpbmcgdGhlIGJhdGNoIGNvbXBpbGVyPC9iPgotPGJyPlRoZSBiYXRjaCBjb21waWxlciBjbGFzcyBpcyBsb2NhdGVkIGluIHRoZSBpbnRlcm5hbCBjbGFzc2VzIG9mIHRoZQotSkRUL0NvcmUgcGx1Z2luLiBTbyBpdCBpcyBpbiB0aGUgPGk+amR0Y29yZS5qYXI8L2k+IGZpbGUgaW4gdGhlIGRpcmVjdG9yeQotPGk+cGx1Z2lucy9vcmcuZWNsaXBzZS5qZHQuY29yZTwvaT4uCi1UaGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgPGk+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW48L2k+LiZuYnNwOzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgQUxJR049UklHSFQgVkFMSUdOPVRPUCBXSURUSD0iMiUiPjxpbWcgU1JDPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2ltYWdlcy9BZGFycm93LmdpZiIgTk9TQVZFIEJPUkRFUj0wIGhlaWdodD0xNiB3aWR0aD0xNj48L3RkPgotCi08dGQgV0lEVEg9Ijk4JSI+PGI+UnVubmluZyB0aGUgYmF0Y2ggY29tcGlsZXI8L2I+Ci08dWw+Ci08bGk+Ci1Vc2luZyB0aGUgbWFpbiBtZXRob2QuPC9saT4KLQotPGJsb2NrcXVvdGU+VXNpbmcgdGhlIG1haW4gbWV0aG9kLiBUaGUgTWFpbiBjbGFzcyBoYXMgYSBtYWluIG1ldGhvZC4gVGhpcwotaXMgdGhlIGNsYXNzaWNhbCB3YXkgdG8gaW52b2tlIHRoZSBiYXRjaCBjb21waWxlciBvbiBhIGNvbW1hbmQtbGluZS4KLTx1bD4KLTxsaT4KLUZvciBleGFtcGxlIG9uIGEgY29tbWFuZC1saW5lOjwvbGk+Ci0KLTxicj48Zm9udCBjb2xvcj0iIzMzNjZGRiI+amF2YSAtY2xhc3NwYXRoIGpkdGNvcmUuamFyIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluCi0tY2xhc3NwYXRoIHJ0LmphciBBLmphdmE8L2ZvbnQ+Ci08bGk+Ci1Gb3IgZXhhbXBsZSBpbiBhIGphdmEgc291cmNlOjwvbGk+Ci0KLTxicj48Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4ubWFpbihuZXcKLVN0cmluZ1tdIHsiLWNsYXNzcGF0aCIsICJydC5qYXIiLCAiQS5qYXZhIn0pOzwvZm9udD48L3VsPgotPC9ibG9ja3F1b3RlPgotCi08bGk+Ci1Vc2luZyB0aGUgc3RhdGljIGNvbXBpbGUoU3RyaW5nKSBtZXRob2QuPC9saT4KLQotPGJsb2NrcXVvdGU+VGhlIGNvbXBpbGUoU3RyaW5nKSBtZXRob2QgaXMgYSBjb252ZW5pZW50IG1ldGhvZCB0byBpbnZva2UKLXRoZSBiYXRjaCBjb21waWxlciBpbiBhIGphdmEgYXBwbGljYXRpb24uCi08YnI+SW5zdGVhZCBvZjoKLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guTWFpbi5tYWluKG5ldwotU3RyaW5nW10geyItY2xhc3NwYXRoIiwgInJ0LmphciIsICJBLmphdmEifSk7PC9mb250PjwvbGk+Ci0KLTxsaT4KLXlvdSBjYW4gc2ltcGx5IHdyaXRlOiA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4uY29tcGlsZSgiLWNsYXNzcGF0aAotcnQuamFyIEEuamF2YSIpOzwvZm9udD48L2xpPgotPC91bD4KLTwvYmxvY2txdW90ZT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLQotPHRyPgotPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQotPHRkIFdJRFRIPSI5OCUiPjxiPldoaWNoIG9wdGlvbnMgYXJlIGF2YWlsYWJsZT88L2I+Ci08cD4KLVdpdGggdGhlIHllbGxvdyBiYWNrZ3JvdW5kLCB0aGVzZSBhcmUgcmVxdWlyZWQgb3B0aW9ucy48YnI+Ci1XaXRoIHRoZSBvcmFuZ2UgYmFja2dyb3VuZCwgdGhlc2UgYXJlIHN1Z2dlc3RlZCBvcHRpb25zLgotPC9wPgotPGJsb2NrcXVvdGU+Jm5ic3A7Ci08dGFibGUgQk9SREVSIENFTExTUEFDSU5HPTIgQ0VMTFBBRERJTkc9MiBDT0xTPTIgV0lEVEg9IjEwMCUiID4KLTx0cj4KLTx0aD5OYW1lPC90aD4KLTx0aD5Vc2FnZTwvdGg+Ci08L3RyPgotPHRyPgotPHRkPi1oZWxwPC90ZD4KLTx0ZCB2YWxpZ249dG9wPkRpc3BsYXkgdGhlIGhlbHAgbWVzc2FnZTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LXZlcnNpb248L3RkPgotPHRkPkRpc3BsYXkgdGhlIGJ1aWxkIG51bWJlciBvZiB0aGUgY29tcGlsZXIuIFRoaXMgaXMgdmVyeSB1c2VmdWwgdG8gcmVwb3J0IGEgYnVnLjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0iI0ZGRkZDQyI+LWNsYXNzcGF0aCAmbHQ7ZGlyIDEmZ3Q7OyZsdDtkaXIgMiZndDs7Li4uOyZsdDtkaXIgUCZndDs8L3RkPgotPHRkIHZhbGlnbj10b3AgYmdjb2xvcj0iI0ZGRkZDQyI+VGhpcyBpcyBhIGxpc3Qgb2YgZGlyZWN0b3J5IG9yIGphciBmaWxlcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlcy4gVGhlcmUgaXMgbm8gZGVmYXVsdCBjbGFzc3BhdGguIFNvIHRoaXMgb3B0aW9uCi1pcyBhbHdheXMgcmVxdWlyZWQgdG8gY29tcGlsZSBzb3VyY2UgZmlsZXMuPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcCBiZ2NvbG9yPSIjRkZDQ0FBIj4tZCAmbHQ7ZGlyIDEmZ3Q7fG5vbmU8L3RkPgotPHRkIGJnY29sb3I9IiNGRkNDQUEiPlRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGluIHdoaWNoIGRpcmVjdG9yeSB0aGUgZ2VuZXJhdGVkIC5jbGFzcyBmaWxlcyBzaG91bGQgYmUgZHVtcGVkLiBJZiBpdCBpcyBvbWl0dGVkLCBubyBwYWNrYWdlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC48YnI+Ci1JZiB5b3UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSAuY2xhc3MgZmlsZXMsIHVzZSA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+LWQgbm9uZTwvZm9udD4uPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tdGFyZ2V0IDEuMXwxLjI8L3RkPgotPHRkPlRoaXMgc3BlY2lmaWVzIHRoZSBjbGFzc2ZpbGUgdGFyZ2V0IHNldHRpbmcuIFRoZSBwb3NzaWJsZSB2YWx1ZSBhcmUgPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuMTwvZm9udD4gb3IgPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuMjwvZm9udD4sIGRlZmF1bHQgaXMgPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuMTwvZm9udD48L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPi0xLjM8L3RkPgotPHRkPlNldCBjb21wbGlhbmNlIGxldmVsIHRvIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjM8L2ZvbnQ+IChkZWZhdWx0KTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LTEuNDwvdGQ+Ci08dGQ+U2V0IGNvbXBsaWFuY2UgbGV2ZWwgdG8gPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuNDwvZm9udD4uPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tc291cmNlIDEuM3wxLjQ8L3RkPgotPHRkPlRoaXMgaXMgdXNlZCB0byBlbmFibGUgdGhlIGFzc2VydGlvbiBzdXBwb3J0IG9mIHRoZSBjb21waWxlci4gVGhlIHBvc3NpYmxlIHZhbHVlIGFyZTogPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuMzwvZm9udD4gb3IgPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuNDwvZm9udD4sIGRlZmF1bHQgaXMgPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuMzwvZm9udD4gaW4gPGZvbnQgY29sb3I9IiMzMzY2RkYiPi0xLjM8L2ZvbnQ+IG1vZGUgYW5kIDxmb250IGNvbG9yPSIjMzM2NkZGIj4xLjQ8L2ZvbnQ+IGluIDxmb250IGNvbG9yPSIjMzM2NkZGIj4tMS40PC9mb250PiBtb2RlLgotSW4gPGZvbnQgY29sb3I9IiMzMzY2RkYiPjEuNDwvZm9udD4sIDxmb250IGNvbG9yPSIjMzM2NkZGIj48ST5hc3NlcnQ8L0k+PC9mb250PiBpcyB0cmVhdGVkIGFzIGEga2V5d29yZC48L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPi13YXJuOiA8YmxvY2txdW90ZT5jb25zdHJ1Y3Rvck5hbWU8YnI+fHBhY2thZ2VEZWZhdWx0TWV0aG9kPGJyPnxkZXByZWNhdGlvbjxicj58bWFza2VkQ2F0Y2hCbG9ja3M8YnI+fHVudXNlZExvY2Fsczxicj58dW51c2VkQXJndW1lbnRzPGJyPnx1bnVzZWRJbXBvcnRzPGJyPnxzeW50aGV0aWNBY2Nlc3M8YnI+fGFzc2VydElkZW50aWZpZXI8L2Jsb2NrcXVvdGU+Ci08L3RkPgotPHRkPlNldCB3YXJuaW5nIGxldmVsLjxicj5lLmcuIDxmb250IGNvbG9yPSIjMzM2NkZGIj4td2Fybjp1bnVzZWRMb2NhbHMsZGVwcmVjYXRpb248L2ZvbnQ+PGJyPgotPHRhYmxlPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+Y29uc3RydWN0b3JOYW1lPC90aD4KLTx0ZD53YXJuIG1ldGhvZCB3aXRoIGNvbnN0cnVjdG9yIG5hbWU8L3RkPgotPC90cj4KLTx0cj4KLTx0aCBhbGlnbj1sZWZ0PnBhY2thZ2VEZWZhdWx0TWV0aG9kPC90aD4KLTx0ZD53YXJuIGF0dGVtcHQgdG8gb3ZlcnJpZGUgcGFja2FnZS1kZWZhdWx0IG1ldGhvZDwvdGQ+Ci08L3RyPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+ZGVwcmVjYXRpb248L3RoPgotPHRkPndhcm4gdXNhZ2Ugb2YgZGVwcmVjYXRlZCB0eXBlIG9yIG1lbWJlcjwvdGQ+Ci08L3RyPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+bWFza2VkQ2F0Y2hCbG9ja3M8L3RoPgotPHRkPndhcm4gaGlkZGVuIGNhdGNoIGJsb2NrPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGggYWxpZ249bGVmdD51bnVzZWRMb2NhbHM8L3RoPgotPHRkPndhcm4gdW51c2VkIGxvY2FsIHZhcmlhYmxlPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGggYWxpZ249bGVmdD51bnVzZWRBcmd1bWVudHM8L3RoPgotPHRkPndhcm4gdW51c2VkIG1ldGhvZCBhcmd1bWVudDwvdGQ+Ci08L3RyPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+dW51c2VkSW1wb3J0czwvdGg+Ci08dGQ+V2hlbiBlbmFibGVkLCB0aGUgY29tcGlsZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgZm9yIHVudXNlZCBpbXBvcnQgcmVmZXJlbmNlCi08L3RkPgotPC90cj4KLTx0cj4KLTx0aCBhbGlnbj1sZWZ0PnN5bnRoZXRpY0FjY2VzczwvdGg+Ci08dGQ+d2FybiB3aGVuIHBlcmZvcm1pbmcgc3ludGhldGljIGFjY2VzcyBmb3IgaW5uZXJjbGFzczwvdGQ+Ci08L3RyPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+YXNzZXJ0SWRlbnRpZmllcjwvdGg+Ci08dGQ+d2FybiBvY2N1cnJlbmNlIG9mIDxpPmFzc2VydDwvaT4gdXNlZCBhcyBpZGVudGlmaWVyPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tbm93YXJuPC90ZD4KLTx0ZD5ObyB3YXJuaW5nIChlcXVpdmFsZW50IHRvIDxmb250IGNvbG9yPSIjMzM2NkZGIj4td2Fybjpub25lPC9mb250Pik8L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPi1kZXByZWNhdGlvbjwvdGQ+Ci08dGQ+RXF1aXZhbGVudCB0byA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+LXdhcm46ZGVwcmVjYXRpb248L2ZvbnQ+LjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LWdbOm5vbmV8OmxpbmVzLHZhcnMsc291cmNlXQotPC90ZD4KLTx0ZD5TZXQgdGhlIGRlYnVnIGF0dHJpYnV0ZXMgbGV2ZWw8YnI+Ci08dGFibGU+Ci08dHI+Ci08dGggYWxpZ249bGVmdD4tZzwvdGg+Ci08dGQ+QWxsIGRlYnVnIGluZm8gKGVxdWl2YWxlbnQgdG8gPGZvbnQgY29sb3I9IiMzMzY2RkYiPi1nOmxpbmVzLHZhcnMsc291cmNlPC9mb250PikKLTwvdGQ+Ci08L3RyPgotPHRoIGFsaWduPWxlZnQ+LWc6bm9uZTwvdGg+Ci08dGQ+Tm8gZGVidWcgaW5mbzwvdGQ+Ci08L3RyPgotPHRyPgotPHRoIGFsaWduPWxlZnQ+LWc6W2xpbmVzLHZhcnMsc291cmNlXTwvdGg+Ci08dGQ+U2VsZWN0aXZlIGRlYnVnIGluZm88L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LXByZXNlcnZlQWxsTG9jYWxzPC90ZD4KLTx0ZD5FeHBsaWNpdGx5IHJlcXVlc3QgdGhlIGNvbXBpbGVyIHRvIHByZXNlcnZlIGFsbCBsb2NhbCB2YXJpYWJsZXMgKGZvciBkZWJ1ZyBwdXJwb3NlKS4gSWYgb21pdHRlZCwgdGhlIGNvbXBpbGVyIHdpbGwgcmVtb3ZlZCB1bnVzZWQgbG9jYWxzLjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LW5vSW1wb3J0RXJyb3I8L3RkPgotPHRkPlRoZSBjb21waWxlciB3b24ndCByZXBvcnQgYW4gZXJyb3IgZm9yIHVucmVzb2x2ZWQgaW1wb3J0cy4gQSB3YXJuaW5nIGlzIGlzc3VlZCBpbnN0ZWFkLjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LWVuY29kaW5nICZsdDtlbmNvZGluZyBuYW1lJmd0OzwvdGQ+Ci08dGQ+U3BlY2lmeSBkZWZhdWx0IHNvdXJjZSBlbmNvZGluZyBmb3JtYXQgKGN1c3RvbSBlbmNvZGluZyBjYW4gYWxzbyBiZSBzcGVjaWZlZCBvbiBhIHBlciBmaWxlIGJhc2lzIGJ5IHN1ZmZpeGluZyBlYWNoIGlucHV0IHNvdXJjZSBmaWxlL2ZvbGRlciBuYW1lIHdpdGggPGZvbnQgY29sb3I9IiMzMzY2RkYiPltlbmNvZGluZyAmbHQ7ZW5jb2RpbmcgbmFtZSZndDtdPC9mb250PikuPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tbG9nICZsdDtmaWxlbmFtZSZndDs8L3RkPgotPHRkPlNwZWNpZnkgYSBsb2cgZmlsZSBpbiB3aGljaCBhbGwgb3V0cHV0IGZyb20gdGhlIGNvbXBpbGVyIHdpbGwgYmUgZHVtcGVkLiBUaGlzIGlzIHJlYWxseSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZGVidWcgdGhlIGJhdGNoCi1jb21waWxlciBvciBnZXQgYSBmaWxlIHdoaWNoIGNvbnRhaW5zIGFsbCBlcnJvcnMgYW5kIHdhcm5pbmdzIGZyb20gYSBiYXRjaCBidWlsZC48L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPi1wcm9jZWVkT25FcnJvcjwvdGQ+Ci08dGQ+S2VlcCBjb21waWxpbmcgd2hlbiBlcnJvciwgZHVtcGluZyBjbGFzcyBmaWxlcyB3aXRoIHByb2JsZW0gbWV0aG9kcyBvciBwcm9ibGVtIHR5cGVzLiBUaGlzIGlzIHJlY29tbWFuZGVkIG9ubHkgaWYgeW91IHdhbnQKLXRvIGJlIGFibGUgdG8gcnVuIHlvdXIgYXBwbGljYXRpb24gZXZlbiBpZiB5b3UgaGF2ZSByZW1haW5pbmcgZXJyb3JzLjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LXZlcmJvc2U8L3RkPgotPHRkPlByaW50IGFjY2Vzc2VkL3Byb2Nlc3NlZCBjb21waWxhdGlvbiB1bml0cyBpbiB0aGUgY29uc29sZSBvciB0aGUgbG9nIGZpbGUgaWYgc3BlY2lmaWVkLjwvdGQ+Ci08L3RyPgotPHRyPgotPHRkIHZhbGlnbj10b3A+LXJlZmVyZW5jZUluZm88L3RkPgotPHRkPkNvbXB1dGUgcmVmZXJlbmNlIGluZm8uIFRoaXMgaXMgdXNlZnVsIG9ubHkgaWYgY29ubmVjdGVkIHRvIHRoZSBidWlsZGVyLiBUaGUgcmVmZXJlbmNlIGluZm9zIGFyZSB1c2VsZXNzIG90aGVyd2lzZS48L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPi1wcm9ncmVzczwvdGQ+Ci08dGQ+U2hvdyBwcm9ncmVzcyAob25seSBpbiAtbG9nIG1vZGUpPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tdGltZQotPC90ZD4KLTx0ZD5EaXNwbGF5IHNwZWVkIGluZm9ybWF0aW9uPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tbm9FeGl0PC90ZD4KLTx0ZD5EbyBub3QgY2FsbCA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+U3lzdGVtLmV4aXQobik8L2ZvbnQ+IGF0IGVuZCBvZiBjb21waWxhdGlvbiAoPGZvbnQgY29sb3I9IiMzMzY2RkYiPm49MDwvZm9udD4gaWYgbm8gZXJyb3IpPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgdmFsaWduPXRvcD4tcmVwZWF0ICZsdDtuJmd0OwotPC90ZD4KLTx0ZD5SZXBlYXQgY29tcGlsYXRpb24gcHJvY2VzcyA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+Jmx0O24mZ3Q7PC9mb250PiB0aW1lcyAocGVyZiBhbmFseXNpcykuPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ibG9ja3F1b3RlPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQgQUxJR049UklHSFQgVkFMSUdOPVRPUCBXSURUSD0iMiUiPjxpbWcgU1JDPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2ltYWdlcy9BZGFycm93LmdpZiIgTk9TQVZFIEJPUkRFUj0wIGhlaWdodD0xNiB3aWR0aD0xNj48L3RkPgotCi08dGQgV0lEVEg9Ijk4JSI+PGI+RXhhbXBsZXM8L2I+Ci08YmxvY2txdW90ZT4KLTx0YWJsZT4KLTx0ZCB2YWxpZ249dG9wPjxmb250IGNvbG9yPSIjMzM2NkZGIj5kOlx0ZW1wIC1jbGFzc3BhdGggcnQuamFyIC10aW1lIC1nIC1kIGQ6L3RtcDwvZm9udD4KLTwvdGQ+Ci08dGQgdmFsaWduPXRvcD5JdCBjb21waWxlcyBhbGwgc291cmNlIGZpbGVzIGluIGQ6XHRlbXAgYW5kIGl0cyBzdWJmb2xkZXJzLiBUaGUgY2xhc3NwYXRoIGlzIHNpbXBseSBydC5qYXIuIEl0IGdlbmVyYXRlcyBhbGwgZGVidWcKLWF0dHJpYnV0ZXMgYW5kIGFsbCBnZW5lcmF0ZWQgLmNsYXNzIGZpbGVzIGFyZSBkdW1wZWQgaW4gZDpcdG1wLiBUaGUgc3BlZWQgb2YgdGhlIGNvbXBpbGVyIHdpbGwgYmUgZGlzcGxheWVkIG9uY2UgdGhlIGJhdGNoIHByb2Nlc3MKLWlzIGNvbXBsZXRlZC48L3RkPgotPC90cj4KLTx0cj4KLTx0ZCB2YWxpZ249dG9wPjxmb250IGNvbG9yPSIjMzM2NkZGIj5kOlx0ZW1wXFRlc3QuamF2YSAtY2xhc3NwYXRoIGQ6XHRlbXA7cnQuamFyIC1nOm5vbmU8L2ZvbnQ+Ci08L3RkPgotPHRkIHZhbGlnbj10b3A+SXQgY29tcGlsZXMgb25seSBUZXN0LmphdmEgYW5kIGl0IHdpbGwgcmV0cmlldmUgYW55IGRlcGVuZGFudCBmaWxlcyBmcm9tIGQ6XHRlbXAuIFRoZSBjbGFzc3BhdGggaXMgcnQuamFyIGFuZCBkOlx0ZW1wLCB3aGljaCBtZWFucyB0aGF0IGFsbCBuZWNlc3NhcnkgY2xhc3NlcwotYXJlIHNlYXJjaGVkIGZpcnN0IGluIGQ6XHRlbXAgYW5kIHRoZW4gaW4gcnQuamFyLiBJdCBnZW5lcmF0ZXMgbm8gZGVidWcgYXR0cmlidXRlcyBhbmQgYWxsIGdlbmVyYXRlZCAuY2xhc3MgZmlsZXMgYXJlIGR1bXBlZCBpbiBkOlx0bXAuPC90ZD4KLTwvdGFibGU+Ci08L2Jsb2NrcXVvdGU+Ci08L3RkPgotPC90cj4KLQotPC90YWJsZT4KLQotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2ZsdXNoIG1ldGFkYXRhL2ZsdXNoTWV0YWRhdGEuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2ZsdXNoIG1ldGFkYXRhL2ZsdXNoTWV0YWRhdGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyMDhmZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9mbHVzaCBtZXRhZGF0YS9mbHVzaE1ldGFkYXRhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTx0aXRsZT5Ib3cgdG86IEZsdXNoIHRoZSBNZXRhZGF0YTwvdGl0bGU+Ci0JCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCQk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KLQk8L2hlYWQ+Ci0JPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+Ci0JPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgotCi08dHI+IAotICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj4gCi0gICBKRFQgQ29yZSAvIEhvd1RvOiBGbHVzaCB0aGUgTWV0YWRhdGEgPC9mb250PjwvYj48L3RkPgotPC90cj4KLSAgCi08dHI+Ci0JPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQk8dGQgV0lEVEg9Ijk4JSI+PGI+VG9waWMxPC9iPjxicj4KLQlUaGlzIGlzIHRoZSBmaXJzdCB0b3BpYwotCTx1bD4KLQkJQmxhYmxhMQotCTwvdWw+Ci0JPC90ZD4KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9nZW5lcmF0ZSBwYXJzZXIvVXBkYXRlUGFyc2VyRmlsZXMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2dlbmVyYXRlIHBhcnNlci9VcGRhdGVQYXJzZXJGaWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmYxMWZiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2dlbmVyYXRlIHBhcnNlci9VcGRhdGVQYXJzZXJGaWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVQYXJzZXJGaWxlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYXJncy5sZW5ndGggIT0gMSkgewotCQkJcHJpbnRVc2FnZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVBhcnNlci5idWlsZEZpbGVzRnJvbUxQRyhhcmdzWzBdKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFVwZGF0ZVBhcnNlckZpbGVzIDxwYXRoIHRvIGphdmFkY2wuamF2YT4iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJlLmcuIFVwZGF0ZVBhcnNlckZpbGVzIGM6L2phdmFkY2wuamF2YSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL2dlbmVyYXRlIHBhcnNlci9nZW5lcmF0ZVBhcnNlci5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vZ2VuZXJhdGUgcGFyc2VyL2dlbmVyYXRlUGFyc2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDM3NzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vZ2VuZXJhdGUgcGFyc2VyL2dlbmVyYXRlUGFyc2VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCTxoZWFkPgotCQk8dGl0bGU+SG93IHRvOiBHZW5lcmF0ZSB0aGUgUGFyc2VyPC90aXRsZT4KLQkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotCTwvaGVhZD4KLQk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KLQk8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+Ci0KLTx0cj4gCi0gIDx0ZCBhbGlnbj1MRUZUIHZhbGlnbj1UT1AgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiAKLSAgIEpEVCBDb3JlIC8gSG93VG86IEdlbmVyYXRlIHRoZSBQYXJzZXIgPC9mb250PjwvYj48L3RkPgotPC90cj4KLSAgCi08dHI+Ci0JPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQk8dGQgV0lEVEg9Ijk4JSI+PGI+V2hlcmUgdG8gZ2V0IHRoZSBwYXJzZXIgZ2VuZXJhdG9yPC9iPjxicj4KLQk8YmxvY2txdW90ZT5UaGUgcGFyc2VyIGZpbGVzIGFuZCByZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHVzaW5nIHRoZSBMUEcgcGFyc2VyIGdlbmVyYXRvci4gVGhpcyB0b29scyBoYXMKLQliZWVuIHJlbmFtZWQgSmlrZXMgUGFyc2VyIGdlbmVyYXRvci4gWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYW5kIGxhdGVzdCByZWxlYXNlcyBhdCB0aGlzIDxBIEhSRUY9Imh0dHA6Ly93d3ctMTI0LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvcHJvamVjdHMvamlrZXMvIj5saW5rPC9BPi4KLQlUaGUgbGF0ZXN0IHRvb2wgaXMgcHJvdmlkZWQgaW4gc291cmNlIGZvcm1hdC4gV2UgZG9uJ3QgcHJvdmlkZSBhbnkgaGVscCBmb3IgY29tcGlsaW5nIHRoZXNlCi0Jc291cmNlIGZpbGVzLiBSZWZlciB0byB0aGUgbGluayBhYm92ZSBpZiB5b3UgaGF2ZSB0cm91YmxlIHRvIGdldCBiaW5hcmllcy4KLQk8YnI+T3VyIGdyYW1tYXIgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSB2ZXJzaW9uIDIuMzAgb2YgTFBHLiBJZiBuZXdlciB2ZXJzaW9ucyBmYWlsIHRvIGdlbmVyYXRlIHJlc291cmNlcyBmcm9tIG91cgotCWdyYW1tYXIsIHBsZWFzZSBzZW5kIHJlcXVlc3QgdG8gdGhlIEppa2VzIFBhcnNlciBHZW5lcmF0b3IgdGVhbS4KLQk8L2Jsb2NrcXVvdGU+Ci0JPC9wPgotCTwvdGQ+Ci08L3RyPgotPHRyPgotCTx0ZCBBTElHTj1SSUdIVCBWQUxJR049VE9QIFdJRFRIPSIyJSI+PGltZyBTUkM9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvaW1hZ2VzL0FkYXJyb3cuZ2lmIiBOT1NBVkUgQk9SREVSPTAgaGVpZ2h0PTE2IHdpZHRoPTE2PjwvdGQ+Ci0JPHRkIFdJRFRIPSI5OCUiPjxiPldoZXJlIHRvIGdldCB0aGUgZ3JhbW1hcjwvYj48YnI+Ci0JPGJsb2NrcXVvdGU+VGhlIGxhdGVzdCBncmFtbWFyIGlzIGFsd2F5cyBsb2NhdGVkIGluIHRoZSA8Y29kZT5ncmFtbWFyKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgPGNvZGU+UGFyc2VyPC9jb2RlPiBjbGFzcy4gR28gdG8gdGhlIG9yZy5lY2xpcHNlLmpkdC5jb3JlIHBsdWdpbnMKLQlkaXJlY3RvcnkgKDxmb250IGNvbG9yPSIjMzM2NkZGIj5lY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmNvcmU8L2ZvbnQ+IHdoZXJlIGVjbGlwc2UgaXMgdGhlIHJvb3Qgb2YgeW91ciBlY2xpcHNlIGluc3RhbGxhdGlvbikgYW5kIG9wZW4gdGhlIAotCTxmb250IGNvbG9yPSIjMzM2NkZGIj5qZHRjb3Jlc3JjLnppcDwvZm9udD4gZmlsZS4gVGhlbiBzZWFyY2ggZm9yIHRoZSA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+UGFyc2VyLmphdmE8L2ZvbnQ+IGluc2lkZSB0aGUKLQlmb2xkZXIgPGZvbnQgY29sb3I9IiMzMzY2RkYiPm9yZ1xlY2xpcHNlXGpkdFxpbnRlcm5hbFxjb21waWxlclxwYXJzZXJcPC9mb250Pi4gWW91IG5lZWQgdG8gbG9vayBmb3IgdGhlIG1ldGhvZCBuYW1lZAotCTxjb2RlPmdyYW1tYXIoKTwvY29kZT4uIFRoZW4gY29weSBpdHMgY29udGVudHMgZnJvbTogCi08UFJFPi0tbWFpbiBvcHRpb25zCi0lb3B0aW9ucyBBQ1RJT04sIEFOPUphdmFBY3Rpb24uamF2YSwgR1A9amF2YSwgCi0uLi4uCi0kZW5kCi0tLSBuZWVkIGEgY2FycmlhZ2UgcmV0dXJuIGFmdGVyIHRoZSAkZW5kCi08L1BSRT4KLQlpbnRvIGEgZmlsZSBjYWxsZWQgPGZvbnQgY29sb3I9IiMzMzY2RkYiPmphdmEuZzwvZm9udD4uIEl0IGlzIGltcG9ydGFudCB0byBhZGQgYSBjYXJyaWFnZSByZXR1cm4gYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lLgotCVlvdSBjYW4gc2F2ZSB0aGlzIGZpbGUgd2hlcmUgeW91IHdhbnQsIHdlIHdpbGwgYXNzdW1lIGZyb20gdGhlcmVvbiB5b3Ugc2F2ZWQgaXQgaW4gPGNvZGU+ZDpcdGVtcFw8L2NvZGU+LgotCTwvYmxvY2txdW90ZT4KLQk8L3A+Ci0JPC90ZD4KLTwvdHI+Ci08dHI+Ci0JPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQk8dGQgV0lEVEg9Ijk4JSI+PGI+V2hhdCB0byBkbyB3aXRoIHRoZXNlIGZpbGVzIGFuZCB1cGRhdGUgdGhlIHBhcnNlciBjbGFzcy4uLjwvYj48YnI+Ci0JPGJsb2NrcXVvdGU+Ci1Bc3N1bWluZywgdGhlIExQRyBleGVjdXRhYmxlICg8Y29kZT5scGcuZXhlPC9jb2RlPiBvciA8Y29kZT5qaWtlc3BnLmV4ZTwvY29kZT4pIGlzIGxvY2F0ZWQgaW5zaWRlIDxjb2RlPmQ6XGxwZzwvY29kZT4uCi0gPG9sPgotIDxsaT5GaXJzdCBpbiBhIGNvbnNvbGUsIHJ1bjoKLSA8UFJFPgotIAlkOgotIAljZCBcdGVtcAotIAlkOlxscGdcbHBnLmV4ZSBqYXZhLmcKLSA8L1BSRT4KLSA8L2xpPgotIDxsaT5Zb3Ugd2lsbCBnZXQgYW4gb3V0cHV0IHRoYXQgbG9va3MgbGlrZSB0aGlzOgotIDxQUkU+Ci0gTFBHIFBhcnNlciBHZW5lcmF0b3IgKFYyLjMwKSAgICAgICAgICAgIFR1ZSBBcHIgMDIgMTI6NDk6MTMgMjAwMgotJU9QVElPTlMgQUNUSU9OLCBBTj1KYXZhQWN0aW9uLmphdmEsIEdQPWphdmEsCi0lT1BUSU9OUyBGSUxFLVBSRUZJWD1qYXZhLCBFU0NBUEU9JCwgUFJFRklYPVRva2VuTmFtZSwgT1VUUFVULVNJWkU9MTI1ICwKLSVPUFRJT05TIE5PR09UTy1ERUZBVUxULCBTSU5HTEUtUFJPRFVDVElPTlMsIExBTFI9MSAsIFRBQkxFPVRJTUUgLAotJU9QVElPTlMgRVJST1JfTUFQUwotJU9QVElPTlMgZmlyc3QgZm9sbG93Ci0lT1BUSU9OUyBUUkFDRT1GVUxMICwKLSVPUFRJT05TIFZFUkJPU0UKLU9wdGlvbnMgaW4gZWZmZWN0OgotICAgIEFDVElPTiAgQUNURklMRS1OQU1FPUphdmFBY3Rpb24uamF2YSAgQkxPQ0tCPS8uICBCTE9DS0U9Li8gIEJZVEUgIENPTkZMSUMKLSAgICBERUZBVUxUPTUgIE5PREVCVUcgIERFRkVSUkVEICBOT0VESVQgIEVSUk9SLU1BUFMgIEVTQ0FQRT0kCi0gICAgRklMRS1QUkVGSVg9amF2YSAgRklSU1QgIEZPTExPVyAgR0VORVJBVEUtUEFSU0VSPUpBVkEgIE5PR09UTy1ERUZBVUxUCi0gICAgSEFDVEZJTEUtTkFNRT1qYXZhaGRyLmphdmEgIEhCTE9DS0I9LzogIEhCTE9DS0U9Oi8gIExBTFI9MSAgTElTVAotICAgIE1BWC1ESVNUQU5DRT0zMCAgTUlOLURJU1RBTkNFPTMgIE5BTUVTPU9QVElNSVpFRCAgTk9OVC1DSEVDSyAgT1JNQVJLPXwKLSAgICBPVVRQVVQtU0laRT0xMjUgIFBSRUZJWD1Ub2tlbk5hbWUgIFJFQUQtUkVEVUNFICBOT1NDT1BFUyAgTk9TSElGVC1ERUZBVUxUCi0gICAgU0lOR0xFLVBST0RVQ1RJT05TICBTVEFDSy1TSVpFPTEyOCAgU1RBVEVTICBTVUZGSVg9ICBUQUJMRT1USU1FICBUUkFDRT1GVQotICAgIFZFUkJPU0UgIFdBUk5JTkdTICBYUkVGCi0KLQotVGhpcyBncmFtbWFyIGlzIExBTFIoMSkuCi0KLU51bWJlciBvZiBUZXJtaW5hbHM6IDEwNQotTnVtYmVyIG9mIE5vbnRlcm1pbmFsczogMjAyCi1OdW1iZXIgb2YgUHJvZHVjdGlvbnM6IDQzNwotTnVtYmVyIG9mIFNpbmdsZSBQcm9kdWN0aW9uczogMTYyCi1OdW1iZXIgb2YgSXRlbXM6IDEyNjUKLU51bWJlciBvZiBTdGF0ZXM6IDU5MQotTnVtYmVyIG9mIFNoaWZ0IGFjdGlvbnM6IDM0ODIKLU51bWJlciBvZiBHb3RvIGFjdGlvbnM6IDQwNjEKLU51bWJlciBvZiBTaGlmdC9SZWR1Y2UgYWN0aW9uczogMzY5Ci1OdW1iZXIgb2YgR290by9SZWR1Y2UgYWN0aW9uczogNjg3Ci1OdW1iZXIgb2YgUmVkdWNlIGFjdGlvbnM6IDc3MzYKLU51bWJlciBvZiBTaGlmdC1SZWR1Y2UgY29uZmxpY3RzOiAwCi1OdW1iZXIgb2YgUmVkdWNlLVJlZHVjZSBjb25mbGljdHM6IDAKLU51bWJlciBvZiBSZWR1Y3Rpb25zIHNhdmVkIGJ5IGRlZmF1bHQ6IDQ5MTMKLVJlYWxsb2NhdGluZyBzdG9yYWdlIGZvciBUSU1FIHRhYmxlLCBhZGRpbmcgMzYwMyBlbnRyaWVzCi0KLUxlbmd0aCBvZiBDaGVjayB0YWJsZTogMTY4MzYKLUxlbmd0aCBvZiBBY3Rpb24gdGFibGU6IDE2NjA4Ci1OdW1iZXIgb2YgZW50cmllcyBpbiBBY3Rpb24gVGFibGU6IDEyMDEzCi1QZXJjZW50YWdlIG9mIGluY3JlYXNlOiAzOC4yJQotSGlnaGVzdCBzeW1ib2wgaW4gQ2hlY2sgVGFibGU6IDMwNwotU3RvcmFnZSBSZXF1aXJlZCBmb3IgVGFibGVzOiA2Njg4OCBCeXRlcywgNjZLCi1TdG9yYWdlIFJlcXVpcmVkIGZvciBSdWxlczogMTMwOCBCeXRlcwotCi0KLUFjdGlvbnMgaW4gQ29tcHJlc3NlZCBUYWJsZXM6Ci0gICAgIE51bWJlciBvZiBTaGlmdHM6IDM0ODIKLSAgICAgTnVtYmVyIG9mIFNoaWZ0L1JlZHVjZXM6IDM2OQotICAgICBOdW1iZXIgb2YgR290b3M6IDQwNjEKLSAgICAgTnVtYmVyIG9mIEdvdG8vUmVkdWNlczogNjg3Ci0gICAgIE51bWJlciBvZiBSZWR1Y2VzOiAyODIzCi0gICAgIE51bWJlciBvZiBEZWZhdWx0czogMzkwCi0KLUVycm9yIG1hcHMgc3RvcmFnZToKLSAgICBTdG9yYWdlIHJlcXVpcmVkIGZvciBBQ1RJT05fU1lNQk9MU19CQVNFIG1hcDogMTE4MiBCeXRlcwotICAgIFN0b3JhZ2UgcmVxdWlyZWQgZm9yIEFDVElPTl9TWU1CT0xTX1JBTkdFIG1hcDogMTAwNyBCeXRlcwotICAgIFN0b3JhZ2UgcmVxdWlyZWQgZm9yIE5BQ1RJT05fU1lNQk9MU19CQVNFIG1hcDogMTE4MiBCeXRlcwotICAgIFN0b3JhZ2UgcmVxdWlyZWQgZm9yIE5BQ1RJT05fU1lNQk9MU19SQU5HRSBtYXA6IDYzMCBCeXRlcwotICAgIFN0b3JhZ2UgcmVxdWlyZWQgZm9yIFNZTUJPTF9JTkRFWCBtYXA6IDYxNiBCeXRlcwotICAgIFN0b3JhZ2UgcmVxdWlyZWQgZm9yIFNUUklOR19CVUZGRVIgbWFwOiA0NjUyIEJ5dGVzCi0KLSoqKldhcm5pbmc6IEJhc2UgQ2hlY2sgdmVjdG9yIGNvbnRhaW5zIHZhbHVlID4gMTI3LiAxNi1iaXQgd29yZHMgdXNlZC4KLSoqKldhcm5pbmc6IFRlcm1pbmFsIHN5bWJvbCA+IDEyNy4gMTYtYml0IHdvcmRzIHVzZWQuCi1Fc2NhcGVkIHN5bWJvbCAkZW9mIGlzIGFuIGludmFsaWQgQyB2YXJpYWJsZS4KLQotRXNjYXBlZCBzeW1ib2wgJGVycm9yIGlzIGFuIGludmFsaWQgQyB2YXJpYWJsZS4KLSA8L1BSRT4KLSBJdCBjYW4gYmUgcXVpdGUgZGlmZmVyZW50IGlmIHRoZSBvdXRwdXQgY2hhbmdlZCBzaW5jZSB0aGUgdmVyc2lvbiAyLjMwIG9mIGxwZy4gVGhlIGltcG9ydGFudCBwYXJ0IGlzOjxicj4KLSA8YmxvY2txdW90ZT48Yj5UaGlzIGdyYW1tYXIgaXMgTEFMUigxKS48L2I+PC9ibG9ja3F1b3RlPgotIFRoaXMgY3JlYXRlcyBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc29tZSBqYXZhIHNvdXJjZSBmaWxlcyBhbmQgaW5mb3JtYXRpb24gZmlsZXMuCi0gPGJsb2NrcXVvdGU+PHRhYmxlIEJPUkRFUj0xIENFTExTUEFDSU5HPTIgQ0VMTFBBRERJTkc9MTA+Ci0gPHRyPgotIDx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YS5sPC90aD4KLSA8dGQgVkFMSUdOPXRvcD5JbmZvcm1hdGlvbiBnZW5lcmF0ZWQgYnkgbHBnL2ppa2VzcGcuIEVudW1hcmF0ZSBhbGwgdGhlIHN0YXRlcyBjcmVhdGVkIGZvciB0aGUgYXV0b21hdG9uLCBldGMuPC90ZD4KLSA8L3RyPgotIDx0cj4KLSA8dGggVkFMSUdOPXRvcCBhbGlnbj1sZWZ0PkphdmFBY3Rpb24uamF2YTwvdGg+Ci0gPHRkPkl0IGNvbnRhaW5zIHRoZSBtZXRob2QgY29uc3VtZVJ1bGUoaW50KSBvZiB0aGUgY2xhc3Mgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXIgdGhhdCBoYW5kbGVzIGFsbCBzZW1hbnRpYyBhY3Rpb25zIGRpc3BhdGNoZXMuPC90ZD4KLSA8L3RyPgotIDx0cj4KLTx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YWhkci5qYXZhPC90aD4KLSA8dGQ+WW91IGRvbid0IG5lZWQgdGhpcyBmaWxlLiBJdCBpcyBhY3R1YWxseSBlbXB0eS48L3RkPgotIDwvdHI+Ci0gPHRyPgotPHRoIFZBTElHTj10b3AgYWxpZ249bGVmdD5qYXZhZGNsLmphdmE8L3RoPgotIDx0ZD5UaGlzIGZpbGVzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlc291cmNlcyBmaWxlcy48L3RkPgotIDwvdHI+Ci0gPHRyPgotPHRoIFZBTElHTj10b3AgYWxpZ249bGVmdD5qYXZhc3ltLmphdmE8L3RoPgotIDx0ZD5UaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3Mgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVRlcm1pbmFsU3ltYm9scy4gWW91IG5lZWQgdG8gcmVwbGFjZTo8YnI+Ci0gPHVsPgotIDxsaT5Ub2tlbk5hbWUkZW9mIHdpdGggVG9rZW5OYW1lRU9GPC9saT4KLSA8bGk+VG9rZW5OYW1lJGVycm9yIHdpdGggVG9rZW5OYW1lRVJST1I8L2xpPgotIDwvdWw+PC90ZD4KLSA8L3RyPgotIDx0cj4KLTx0aCBWQUxJR049dG9wIGFsaWduPWxlZnQ+amF2YWRlZi5qYXZhPC90aD4KLSA8dGQ+VGhpcyBpcyB0aGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuUGFyc2VyQmFzaWNJbmZvcm1hdGlvbi48L3RkPgotIDwvdHI+Ci0gPHRyPgotPHRoIFZBTElHTj10b3AgYWxpZ249bGVmdD5qYXZhcHJzLmphdmE8L3RoPgotIDx0ZD5Zb3UgZG9uJ3QgbmVlZCB0aGlzIGZpbGUuIEl0cyBjb250ZW50cyBpcyBhbHJlYWR5IGlubGluZWQgaW4gdGhlIFBhcnNlciBjbGFzcy48L3RkPgotIDwvdHI+Ci0gPC90YWJsZT48L2Jsb2NrcXVvdGU+Ci0gPC9saT4KLSA8bGk+PGJsb2NrcXVvdGU+Tm93IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBkaWZmZXJlbnQgY2xhc3NlcyBhbmQgcmVzb3VyY2UgZmlsZXMuCi0gPC9ibG9ja3F1b3RlPgotIDxvbD4KLSA8bGk+Q29weSB0aGUgY29udGVudHMgb2YgdGhlIDxmb250IGNvbG9yPSIjMzM2NkZGIj5KYXZhQWN0aW9uLmphdmE8L2ZvbnQ+IGZpbGUgaW50byB0aGUgPGZvbnQgY29sb3I9IiMzMzY2RkYiPmNvbnN1bWVSdWxlKGludCk8L2ZvbnQ+IG1ldGhvZCBvZiB0aGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXIgY2xhc3MuCi0gPC9saT4KLSA8bGk+VGhlIGRlZmluaXRpb24gb2YgdGhlIFBhcnNlciBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdHdvIHRhYmxlcyBmcm9tIDxmb250IGNvbG9yPSIjMzM2NkZGIj5qYXZhZGNsLmphdmE8L2ZvbnQ+LiBUaG9zZSBhcmUgPGZvbnQgY29sb3I9IiMzMzY2RkYiPnJoc1tdPC9mb250PiBhbmQgPGZvbnQgY29sb3I9IiMzMzY2RkYiPm5hbWVbXTwvZm9udD4uCi0gVGhlIGZvbGxvd2luZyBlbnRyaWVzIGluIG5hbWVbXSBuZWVkIHRvIGJlIHJlcGxhY2VkOgotIDx1bD4KLSA8bGk+PGZvbnQgY29sb3I9IiMzMzY2RkYiPiRlb2Y8L2ZvbnQ+IHdpdGggPGZvbnQgY29sb3I9IiMzMzY2RkYiPlVORVhQRUNURURfRU9GPC9mb250PjwvbGk+Ci0gPGxpPjxmb250IGNvbG9yPSIjMzM2NkZGIj4kZXJyb3I8L2ZvbnQ+IHdpdGggPGZvbnQgY29sb3I9IiMzMzY2RkYiPiJJbnZhbGlkIENoYXJhY3RlciI8L2ZvbnQ+PC9saT4KLSA8L3VsPgotVGhlIHByZXZpb3VzIGRlZmluaXRpb24gb2YgbmFtZVtdIHdpbGwgZ3VpZGUgeW91LgotIDwvbGk+Ci0gPGxpPlRoZSBjbGFzcyA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXJCYXNpY0luZm9ybWF0aW9uPC9mb250PiBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgPGZvbnQgY29sb3I9IiMzMzY2RkYiPmphdmFkZWYuamF2YTwvZm9udD4uIERvbid0IGNvcHkgdGhlIAotIGludGVyZmFjZSBuYW1lLiBTaW1wbHkgY29weSB0aGUgZmllbGQgZGVjbGFyYXRpb25zLiBUaGUgYWN0dWFsIHNvdXJjZSBvZiB0aGlzIGNsYXNzIHdpbGwgZ3VpZGUgeW91LjwvbGk+Ci0gPGxpPlRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlRlcm1pbmFsU3ltYm9scy4gWW91IG5lZWQgdG8gcmVwbGFjZTo8YnI+Ci0gPHVsPgotIDxsaT48Zm9udCBjb2xvcj0iIzMzNjZGRiI+VG9rZW5OYW1lJGVvZjwvZm9udD4gd2l0aCA8Zm9udCBjb2xvcj0iIzMzNjZGRiI+VG9rZW5OYW1lRU9GPC9mb250PjwvbGk+Ci0gPGxpPjxmb250IGNvbG9yPSIjMzM2NkZGIj5Ub2tlbk5hbWUkZXJyb3I8L2ZvbnQ+IHdpdGggPGZvbnQgY29sb3I9IiMzMzY2RkYiPlRva2VuTmFtZUVSUk9SPC9mb250PjwvbGk+Ci0gPC91bD4KLSA8L2xpPgotIDxsaT5UaGUgbGFzdCBzdGVwIGlzIHRvIHVwZGF0ZSB0aGUgcmVzb3VyY2UgZmlsZXM6PGJyPgotIENvcHkgdGhlIGpkdGNvcmUuamFyIGZpbGUgaW4gZDpcdGVtcC4gQ29tcGlsZSB0aGlzIDxBIEhSRUY9IlVwZGF0ZVBhcnNlckZpbGVzLmphdmEiPnNvdXJjZTwvQT4gaW5zaWRlIGQ6XHRlbXAuIFlvdSB3aWxsIGhhdmUgYSBmaWxlIFVwZGF0ZVBhcnNlckZpbGVzLmNsYXNzLgotIFRoZW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZC1saW5lOgotICA8UFJFPgotIEQ6XHRlbXA+amF2YSAtY2xhc3NwYXRoIGpkdGNvcmUuamFyOy4gVXBkYXRlUGFyc2VyRmlsZXMgamF2YWRjbC5qYXZhCi0gPC9QUkU+Ci1PbmNlIHRoaXMgZG9uZSwgeW91IHdpbGwgZW5kIHVwIHdpdGggNSBuZXcgZmlsZXMgaW5zaWRlIGQ6XHRlbXAuIFRoZXkgYXJlIGNhbGxlZCBwYXJzZXImbHQ7biZndDsucnNjLCB3aXRoIG4gZXF1YWxzIHRvIDEuLjUuCi1BbGwgdGhlc2UgZmlsZXMgbmVlZCB0byBiZSBtb3ZlZCB0byB0aGUgb3JnXGVjbGlwc2VcamR0XGludGVybmFsXGNvbXBpbGVyXHBhcnNlciBmb2xkZXIuIE5vdyB5b3UgYXJlIHJlYWR5IHRvIGV4ZWN1dGUgYW5kIHRlc3QKLXRoZSBuZXcgcGFyc2VyLgotIDwvbGk+Ci0gPC9vbD4KLSA8L2xpPgotIDwvb2w+Ci0gPFA+Ci0gPGI+Tk9URTo8L2I+ICA8YmxvY2txdW90ZT5DaGFuZ2luZyB0aGUgcGFyc2VyIGlzIGEgcmlza3kgb3BlcmF0aW9uIGlmIHlvdSBtaXNzIG9uZSBvZiB0aGUgc3RlcHMgYWJvdmUuIFRoZSByZXN1bHRpbmcgcGFyc2VyIGNhbiBiZSBjb21wbGV0ZWx5Ci0gdW5wcmVkaWN0YWJsZS4gSXQgY2FuIGdvIGZyb20gY3Jhc2hpbmcgdG8gcmVwb3J0aW5nIGludmFsaWQgZXJyb3JzLiBCZSBzdXJlIHRoYXQgeW91IGZvbGxvd2VkIGFsbCB0aGUgc3RlcHMgYW5kIHRoYXQgYWxsIHRoZQotIGZpbGVzIGFyZSB1cGRhdGVkIGFuZCByZWNvbXBpbGVkIGJlZm9yZSB5b3UgcnVuIGl0LiA8L2Jsb2NrcXVvdGU+Ci0gPC9QPgotIDwvYmxvY2txdW90ZT4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL3BhdGNoIGpkdGNvcmUvcGF0Y2hKZHRjb3JlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9wYXRjaCBqZHRjb3JlL3BhdGNoSmR0Y29yZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQyOTMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL2hvd3RvL3BhdGNoIGpkdGNvcmUvcGF0Y2hKZHRjb3JlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTx0aXRsZT5Ib3cgdG86IFBhdGNoIEpkdC9Db3JlPC90aXRsZT4KLQkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9kZWZhdWx0X3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotCTwvaGVhZD4KLQk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIj4KLQk8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+Ci0KLTx0cj4gCi0gIDx0ZCBhbGlnbj1MRUZUIHZhbGlnbj1UT1AgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiAKLSAgIEpEVCBDb3JlIC8gSG93VG86IFBhdGNoIEpkdC9Db3JlPC9mb250PjwvYj48L3RkPgotPC90cj4KLSAgCi08dHI+Ci0JPHRkIEFMSUdOPVJJR0hUIFZBTElHTj1UT1AgV0lEVEg9IjIlIj48aW1nIFNSQz0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9pbWFnZXMvQWRhcnJvdy5naWYiIE5PU0FWRSBCT1JERVI9MCBoZWlnaHQ9MTYgd2lkdGg9MTY+PC90ZD4KLQk8dGQgV0lEVEg9Ijk4JSI+PGI+VG9waWMxPC9iPjxicj4KLQlUaGlzIGlzIHRoZSBmaXJzdCB0b3BpYwotCTx1bD4KLQkJQmxhYmxhMQotCTwvdWw+Ci0JPC90ZD4KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9zZXQgY2xhc3NwYXRoL3NldENsYXNzcGF0aC5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvaG93dG8vc2V0IGNsYXNzcGF0aC9zZXRDbGFzc3BhdGguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwZWM3ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9ob3d0by9zZXQgY2xhc3NwYXRoL3NldENsYXNzcGF0aC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCTxoZWFkPgotCQk8dGl0bGU+SG93IHRvOiBTZXQgdGhlIENsYXNzcGF0aDwvdGl0bGU+Ci0JCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCQk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvZGVmYXVsdF9zdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KLQk8L2hlYWQ+Ci0JPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+Ci0JPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MiB3aWR0aD0iMTAwJSIgPgotCi08dHI+IAotICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj4gCi0gICBKRFQgQ29yZSAvIEhvd1RvOiBTZXQgdGhlIENsYXNzcGF0aCA8L2ZvbnQ+PC9iPjwvdGQ+Ci08L3RyPgotICAKLTx0cj4KLQk8dGQgQUxJR049UklHSFQgVkFMSUdOPVRPUCBXSURUSD0iMiUiPjxpbWcgU1JDPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2ltYWdlcy9BZGFycm93LmdpZiIgTk9TQVZFIEJPUkRFUj0wIGhlaWdodD0xNiB3aWR0aD0xNj48L3RkPgotCTx0ZCBXSURUSD0iOTglIj48Yj5Ub3BpYzE8L2I+PGJyPgotCVRoaXMgaXMgdGhlIGZpcnN0IHRvcGljCi0JPHVsPgotCQlCbGFibGExCi0JPC91bD4KLQk8L3RkPgotPC90cj4KLQotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvY2xhc3NwYXRoIGNvbnRhaW5lci9jbGFzc3BhdGhDb250YWluZXIuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvY2xhc3NwYXRoIGNvbnRhaW5lci9jbGFzc3BhdGhDb250YWluZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiMDM1Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2NsYXNzcGF0aCBjb250YWluZXIvY2xhc3NwYXRoQ29udGFpbmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotICAgPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLSAgIDx0aXRsZT5DbGFzcyBQYXRoIENvbnRhaW5lciBFbmhhbmNlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgxPkNsYXNzIFBhdGggQ29udGFpbmVyIEVuaGFuY2VtZW50PC9oMT4KLTxzcGFuIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPkxhc3QgTW9kaWZpZWQgQXByaWwgMjMsIDIwMDI8L3NwYW4+Ci0KLQotPGgyPgotQmFja2dyb3VuZDwvaDI+Ci1KRFQgc3VwcG9ydHMgdG8gc3dpdGNoIHRoZSBKREsgdGhhdCBpcyB1c2VkIGZvciBidWlsZGluZy4gSXQgaXMgY3VycmVudGx5Ci1pbXBsZW1lbnRlZCBhcyBmb2xsb3dzOgotPHVsPgotPGxpPgotb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyBtYWludGFpbnMgdGhlIGZvbGxvd2luZyBKREsvVk0gaW5mb3JtYXRpb24gaW4KLWl0cyBwbHVnaW4gbWV0YWRhdGE6PC9saT4KLQotPHVsPgotPGxpPgotYSBzZXQgb2YgPGk+Vk0gaW5zdGFsbCB0eXBlczwvaT46IGEgZGVzY3JpcHRpb24gb2YgYSBWTSBpbnN0YWxsLiBJdCBrbm93cwotaG93IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcnkgSkFSIGFuZCB0aGUgc291cmNlIEpBUnMuPC9saT4KLQotPGxpPgotPGk+Vk0gaW5zdGFsbHM6IDwvaT50aGUgbG9jYXRpb24vaG9tZSBvZiBhIFZNIGluc3RhbGwgb24gdGhlIGZpbGUgc3lzdGVtLgotQSBWTSBpbnN0YWxsIGhhcyBhbiBpbnRlcm5hbCBJRCB0aGF0IGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyLjwvbGk+Ci0KLTxsaT4KLW9uZSBvZiB0aGUgVk0gaW5zdGFsbHMgaXMgbWFya2VkIGFzIHRoZSA8aT5kZWZhdWx0IFZNIGluc3RhbGw8L2k+LjwvbGk+Ci08L3VsPgotCi08bGk+Ci1vcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIGRlZmluZXMgYSBKUkVfTElCLCBKUkVfU1JDLCBKUkVfU1JDUk9PVCB2YXJpYWJsZXMKLXRoYXQgYmluZHMgdG8gdGhlIGRlZmF1bHQgVk0gaW5zdGFsbDo8L2xpPgotCi08dWw+Ci08bGk+Ci1KUkVfTElCOiB0aGUgYmluYXJ5IEpBUiAoZS5nLiBydC5qYXIpPC9saT4KLQotPGxpPgotSlJFX1NSQzogdGhlIHNvdXJjZSBKQVIvemlwIChlLmcuIHNyYy5qYXIpPC9saT4KLQotPGxpPgotSlJFX1NSQ1JPT1Q6IHRoZSBwcmVmaXggaW4gdGhlIHNvdXJjZSBKQVIgKGUuZy4gInNyYyIpPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVRoZSBKYXZhIHByb2plY3QgY3JlYXRpb24gd2l6YXJkIGFkZHMgYSBKUkVfTElCIGNsYXNzcGF0aCB2YXJpYWJsZSBvbiBhCi1wcm9qZWN0J3MgYnVpbGQgY2xhc3MgcGF0aC48L2xpPgotCi08bGk+Ci1vcmcuZWNsaXBzZS5qZHQuZGVidWcudWkgY29udHJpYnV0ZXMgYSBwcmVmZXJlbmNlIHBhZ2UgdG8gZGVmaW5lIG5ldyBWTQotaW5zdGFsbHMgYW5kIHRvIHNldCB0aGUgZGVmYXVsdCBWTSBpbnN0YWxsLiBXaGVuIHRoZSBkZWZhdWx0IFZNIGluc3RhbGwKLWNoYW5nZXMsIHRoZW4gdGhlIGJpbmRpbmdzIG9mIHRoZSBKUkVfKiB2YXJpYWJsZXMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuPC9saT4KLQotPGxpPgotb3JnLmVjbGlwc2UuamR0LnVpIGNvbnRyaWJ1dGVzIGEgY2xhc3MgcGF0aCB2YXJpYWJsZSBwcmVmZXJlbmNlIHBhZ2UuIEl0Ci0ia25vd3MiIHRoYXQgdGhlIEpSRV8qIHZhcmlhYmxlcyBhcmUgcmVzZXJ2ZWQgYW5kIGRvZXNuJ3QgYWxsb3cgdGhlIHVzZXIKLXRvIGVkaXQgdGhlbS48L2xpPgotCi08bGk+Ci1UaGUgcGFja2FnZXMgdmlldyBzaG93cyB0aGUgcmVzb2x2ZWQgSlJFX0xJQiBjb250ZW50cyBhcyBhIHJlZmVyZW5jZWQgbGlicmFyeS48L2xpPgotPC91bD4KLUNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjoKLTx1bD4KLTxsaT4KLUNsYXNzIHBhdGggc3RhYmlsaXR5OiBjaGFuZ2luZyB0aGUgZGVmYXVsdCBKUkUvVk0gaW5zdGFsbCBkb2Vzbid0IGFmZmVjdAotdGhlIGJ1aWxkIGNsYXNzIHBhdGggc2luY2UgdGhlIEpSRV9MSUIgdmFyaWFibGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMKLWNoYW5nZS4gSW4gb3RoZXIgd29yZHMsIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlIEpSRSBmb3IgYnVpbGRpbmcgdGhlbiB0aGUKLS5jbGFzc3BhdGggZmlsZSBpcyBub3QgYWZmZWN0ZWQuPC9saT4KLQotPGxpPgotSkRLIHN3aXRjaGluZyBhdCB0aGUgd29ya3NwYWNlIGxldmVsIGZvciBhbGwgcHJvamVjdHMgaXMgc3RyYWlnaHRmb3J3YXJkCi1ieSB0aGUgdXNlciwgb25seSB0aGUgZGVmYXVsdCBWTSBpbnN0YWxsIG5lZWRzIHRvIGJlIGNoYW5nZWQgYW5kIGFsbCBwcm9qZWN0cwotaW4gdGhlIHdvcmtzcGFjZSBzd2l0Y2ggdG8gdXNlIHRoaXMgVk0gaW5zdGFsbC48L2xpPgotCi08bGk+Ci1TaW5jZSBjbGFzcyBwYXRoIHZhcmlhYmxlcyBjYW4gb25seSBiaW5kIHRvIGEgc2luZ2xlIEpBUiwgdGhlIEpSRV9MSUIgdmFyaWFibGUKLWNhbiBvbmx5IGJpbmQgdG8gYSBzaW5nbGUgSkFSIChmb3IgdGhlIHN0YW5kYXJkIFNVTiBKUkUgdGhpcyBpcyBydC5qYXIpLjwvbGk+Ci0KLTxsaT4KLVRoZXJlIGlzIHNvbWUgbWFnaWMgaW52b2x2ZWQgd2l0aCByZWdhcmQgdG8gdGhlIGhhbmRsaW5nIG9mIEpSRV8qIHZhcmlhYmxlcwotdGhhdCBpcyBub3Qgb2J2aW91cyB0byB0aGUgdXNlcjo8L2xpPgotCi08dWw+Ci08bGk+Ci1vbiB0aGUgYnVpbGQgY2xhc3MgcGF0aCB0aGUgdXNlciBzZWVzIEpSRV9MSUIgYnV0IHdoZW4gZGVmaW5pbmcgYSBsYXVuY2gKLWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgdXNlciBzZWVzIFZNIEluc3RhbGxzLiBUaGUgdXNlciBoYXMgdG8ga25vdyB0aGF0Ci1KUkVfTElCIGlzIGluZGlyZWN0bHkgYm91bmQgdG8gdGhlIFZNIGluc3RhbGwgdmlhIHRoZSBKUkUgaW5zdGFsbGVkIHByZWZlcmVuY2UKLXNldHRpbmdzLjwvbGk+Ci0KLTxsaT4KLVRoZSB1c2VyIGFsc28gaGFzIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgcmVzZXJ2ZWQgdmFyaWFibGVzIGNhbm5vdCBiZSBlZGl0ZWQKLWxpa2UgdGhlIG90aGVyIGNsYXNzIHBhdGggdmFyaWFibGVzLCBldGMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUJ1aWxkIGNsYXNzIHBhdGggb3JkZXJpbmcgLSB1c2VycyBjYW4gY29udHJvbCB0aGUgb3JkZXIgb2YgdGhlIGJ1aWxkIGNsYXNzCi1wYXRoIGluIGEgc2ltcGxlIHdheS4gRm9yIGV4YW1wbGUsIHRvIGRvIEpDTCBkZXZlbG9wbWVudCwgdG8gZG8gc28gdXNlcnMKLWNhbiBwdXQgdGhlaXIgc291cmNlIGZvbGRlcnMgaW4gZnJvbnQgb2YgdGhlIEpSRV9MSUIgY2xhc3MgcGF0aCBlbnRyeS48L2xpPgotCi08bGk+Ci1KYXZhIENvcmUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBKREsgc3dpdGNoaW5nIHN1cHBvcnQgYW5kIGlzIGluZGVwZW5kZW50Ci1vZiBsYXVuY2hpbmcgY29uY2VybnMuPC9saT4KLTwvdWw+Ci0KLTxoMj4KLU1vdGl2YXRpb24gZm9yIGVuaGFuY2luZyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjwvaDI+Ci0KLTxoMz4KLU5ldyBSZXF1aXJlbWVudHM8L2gzPgotVGhlcmUgYXJlIG5ldyByZXF1aXJlbWVudHMgd2l0aCByZWdhcmQgdG8gdGhlIGhhbmRsaW5nIG9mIHRoZSBKUkUvSkRLIG9uCi10aGUgYnVpbGQgY2xhc3MgcGF0aCB0aGF0IG5lZWQgdG8gYmUgYWRkcmVzc2VkIGJ5IDIuMDoKLTx1bD4KLTxsaT4KLU11bHRpcGxlIEpBUnMgcGVyIEpESzwvbGk+Ci0KLTxicj5UaGUgSlJFX0xJQiBjbGFzcyBwYXRoIHZhcmlhYmxlIGNhbiBvbmx5IGJpbmQgdG8gYSBzaW5nbGUgSkFSIGZpbGUKLXR5cGljYWxseSB0aGUgcnQuamFyLiBIb3dldmVyLCB0aGVyZSBhcmUgSkRLIGluc3RhbGxzIHRoYXQgaGF2ZSBzcGxpdCB0aGUKLXJ0LmphciBpbnRvIG11bHRpcGxlIEpBUnMuIEZvciBleGFtcGxlLCB0aGUgSkRLIG9uIHRoZSBNYWNPUyBYIGhhcyBzcGxpdAotdGhlIHJ0LmphciBpbnRvOiBjbGFzc2VzLmphciBhbmQgdWkuamFyIChjb250YWlucyBBV1QgYW5kIFN3aW5nKS4KLTxicj4mbmJzcDsKLTxsaT4KLVdvcmtzcGFjZXMgd2l0aCBhIGRpZmZlcmVudCBKREsgcGVyIHByb2plY3Q8L2xpPgotCi08YnI+V1NERCBuZWVkcyBzdXBwb3J0IGZvciBoYXZpbmcgYSB3b3Jrc3BhY2Ugd2hlcmUgZGlmZmVyZW50IHByb2plY3RzCi1idWlsZCBhZ2FpbnN0IGRpZmZlcmVudCBKREtzLiBUaGUgSlJFX0xJQiB2YXJpYWJsZSBpcyBnbG9iYWwgYW5kIHRoZXJlCi1pcyBubyBpbmZyYXN0cnVjdHVyZSBhbmQgVUkgc3VwcG9ydCB0byBoYXZlIGRpZmZlcmVudCBKREtzIGZvciBkaWZmZXJlbnQKLXByb2plY3RzLiBXU0REIGRlZmluZWQgdGhlaXIgb3duIGJ1aWxkIGRlc2NyaXB0aW9uIG1lY2hhbmlzbSB0aGF0IGJ5cGFzc2VzCi10aGUgSlJFX0xJQiBzdXBwb3J0LiBUaGlzIHJlc3VsdHMgaW4gYSBwcm9ibGVtYXRpYyB1c2VyIGV4cGVyaWVuY2Ugd2hlbiZuYnNwOwotc3dpdGNoaW5nIGZyb20gV1NBRCBvciB2YW5pbGxhIEVjbGlwc2UgSmF2YSBkZXZlbG9wbWVudCB0byBXU0RELjwvdWw+Ci0KLTxoMz4KLUV4aXN0aW5nIGNoYXJhY3RlcmlzdGljcyB0byBiZSBwcmVzZXJ2ZWQgaW4gdGhlIG5ldyBpbXBsZW1lbnRhdGlvbjwvaDM+Ci0KLTx1bD4KLTxsaT4KLUNsYXNzIHBhdGggc3RhYmlsaXR5LCBpdCBoYXMgdG8gYmUgcG9zc2libGUgdG8gc3dpdGNoIGEgSkRLIGxvY2FsbHkgaW4KLWEgd29ya3NwYWNlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSAuY2xhc3NwYXRoIGZpbGUuPC9saT4KLQotPGxpPgotRWFzeSBKREsgc3dpdGNoaW5nIGF0IHRoZSB3b3Jrc3BhY2UgbGV2ZWwsIGkuZS4sIGEgc2luZ2xlIHNldHRpbmcgY2FuIGJlCi1jaGFuZ2VkIHRvIGNoYW5nZSB0aGUgYnVpbGQgY2xhc3MgcGF0aCBvZiBhbGwgcHJvamVjdHMuPC9saT4KLQotPGxpPgotSmF2YSBDb3JlIGlzIGluZGVwZW5kZW50IG9mIHRoZSBWTSBpbnN0YWxsIGluZnJhc3RydWN0dXJlPC9saT4KLTwvdWw+Ci0KLTxoMj4KLVByb3Bvc2FsPC9oMj4KLVRoZSBwcm9wb3NhbCBhZmZlY3RzIGNvcmUsIGxhdW5jaGluZywgamF2YSBkZWJ1ZyBVSSwgYW5kIHRoZSBKYXZhIFVJIGNvbXBvbmVudHMuCi08aDM+Ci1KYXZhQ29yZTwvaDM+Ci1KYXZhQ29yZSBwcm92aWRlcyBhIG5ldyB0eXBlIG9mIGNsYXNzcGF0aCBlbnRyeSAiQ1BFX0NPTlRBSU5FUiIsCi13aGljaCBpcyBqdXN0IGEgbmFtZWQgcmVmZXJlbmNlIHRvIGEgc2V0IG9mIG90aGVyIGNsYXNzcGF0aCBlbnRyaWVzLiAKLUEgY29udGFpbmVyIGVudHJ5IHJlZmVycyB0byBhIGNvbnRhaW5lciBwYXRoLCB3aGljaCBjYW4gYmUgcmVzb2x2ZWQgYnkKLWEgPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IHRocm91Z2ggYW4gZXh0ZW5zaW9uIHBvaW50LAotb3IgZXhwbGljaXRseSBhc3NpZ25lZCB1c2luZyBhIHNldHRlciBtZXRob2QuIAotCi1UaGUgYWN0dWFsIGJpbmRpbmcgZnJvbSB0aGUgQ1BFX0NvbnRhaW5lciBlbnRyeSB0bwotdGhlIHRhcmdldCBjbGFzc3BhdGggZW50cmllcyBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtIG9mIGFuIGV4dGVuc2lvbiBwb2ludAotdG8ga2VlcCBKYXZhIENvcmUgaW5kZXBlbmRlbnQgb2YgVk0gaW5zdGFsbCBjb25jZXJuczoKLTxwPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi1FTVBUWT48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DREFUQSAjUkVRVUlSRUQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2xhc3MmbmJzcDsmbmJzcDsKLUNEQVRBICNSRVFVSVJFRDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyA+PC90dD4KLTx1bD4KLTxsaT48Yj5pZDwvYj4gLSB0aGUgY29udGFpbmVyIHVuaXF1ZSBuYW1lIGZvciB3aGljaCB0aGlzIHJlc29sdmVyIHdpbGwgYmUgYWN0aXZhdGVkLjwvbGk+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRhaW5lciBpbml0aWFsaXplci4KLVRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBhIHB1YmxpYyBzdWJjbGFzcyBvZiA8Y29kZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjwvY29kZT4KLXdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci48L2xpPgotPC91bD4KLTx0dD4mbmJzcDsmbmJzcDsgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoQ29udGFpbmVyUmVzb2x2ZXIKLXs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247PC90dD4KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQotPHA+VGhlIGluaXRpYWxpemUgY2FsbCBwYXNzZXMgaW4gYSBwcm9qZWN0LCB0aGlzIGVuYWJsZXMKLXRvIHJlc29sdmUgYSBjbGFzc3BhdGggY29udGFpbmVyIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBwcm9qZWN0LgotVGhlIGluaXRpYWxpemUgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHRvIHJlc29sdmUgdGhlIGNsYXNzIHBhdGgKLWVudHJ5IChpbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBjb250YWluZXIgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhcyBoYXZpbmcgYmVlbgotcmVzb2x2ZWQpLgotCi08cD5JdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciBhbiBpbml0aWFsaXplciBwZXIgY29udGFpbmVyIElELiBUaGUgZnVsbCBjb250YWluZXIgcGF0aCAKLWJlaW5nIHBhc3NlZCBhbG9uZyB0byB0aGUgaW5pdGlhbGl6ZXIuIEl0cyBmaXJzdCBzZWdtZW50IGlzCi10aGUgY29udGFpbmVyIElEIGZvciB3aGljaCBhbiBpbml0aWFsaXplciBzaG91bGQgYmUgcmVnaXN0ZXJlZC4gVGhlIHJlbWFpbmluZyBzZWdtZW50cwotY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGhpbnRzIGZvciB0aGUgY29udGFpbmVyIGV4cGFuc2lvbi4KLUluIGNhc2UgbXVsdGlwbGUgcmVzb2x2ZXJzIGFyZSByZWdpc3RlcmVkIG9uIHRoZSBzYW1lIGNvbnRhaW5lciBJRCwgdGhlIGZpcnN0Ci1yZWdpc3RlcmVkIG9uZSB3aWxsIGJlIHVzZWQpLgotCi08cD5KYXZhQ29yZSBwcm92aWRlcyBhIG1ldGhvZCB0byBwZXJmb3JtIGV4cGxpY2l0IG1vZGlmaWNhdGlvbnMgb2YgYSBjb250YWluZXI6Ci08cHJlPgotSmF2YUNvcmUjc2V0Q2xhc3NwYXRoQ29udGFpbmVyKAotCUlQYXRoIGNvbnRhaW5lclBhdGgsIAotCUlKYXZhUHJvamVjdFtdIGFmZmVjdGVkUHJvamVjdHMsIAotCUlDbGFzc3BhdGhDb250YWluZXJbXSByZXNwZWN0aXZlQ29udGFpbmVycywgCi0JSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotPC9wcmU+Ci1JbiBwYXJ0aWN1bGFyLCB0aGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIGluICB0aGUgY29udGV4dCBvZiBhIGNsYXNzcGF0aCBpbml0aWFsaXplciBzbyBhcyB0byBwZXJmb3JtCi10aGUgYWN0dWFsIGluaXRpYWxpemF0aW9uLiBOb3RlIHRoYXQgaXQgYWxsb3dzIHRvIG1vZGlmeSB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIHByb2plY3RzCi1hdCBvbmNlLiBJbiByZWFjdGlvbiB0byBpbnZva2luZyB0aGlzIG1ldGhvZCwgdGhlIEphdmFNb2RlbCB3aWxsIGJlIHJlZnJlc2hlZCBhbmQgY29ycmVzcG9uZGluZyBKYXZhIGVsZW1lbnQKLWNoYW5nZXMgd2lsbCBiZSBub3RpZmllZC4KLQotPHA+IEEgY2xhc3NwYXRoIGNvbnRhaW5lciBpbXBsZW1lbnRzIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI8L2NvZGU+IGFuZCBjYW4gYmUgcXVlcmllZAotdGhyb3VnaCBhIEphdmFDb3JlIEFQSTogPGNvZGU+SmF2YUNvcmUjZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSA8L2NvZGU+LgotCi1UaGVyZSBpcyBubyBhc3N1bXB0aW9uIHRoYXQgdGhlIHJldHVybmVkIGNvbnRhaW5lciBtdXN0IGFuc3dlciB0aGUgZXhhY3Qgc2FtZSBjb250YWluZXJQYXRoCi13aGVuIHJlcXVlc3RlZCA8Y29kZT5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldFBhdGg8L2NvZGU+LiAKLUluZGVlZCwgdGhlIGNvbnRhaW5lclBhdGggaXMganVzdCBhbiBpbmRpY2F0aW9uIGZvciByZXNvbHZpbmcgaXQgdG8gYW4gYWN0dWFsIGNvbnRhaW5lciBvYmplY3QuCi08cD4KLUNsYXNzcGF0aCBjb250YWluZXIgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgbG9jYWxseSB0byB0aGUgd29ya3NwYWNlLCBidXQgCi1hcmUgbm90IHByZXNlcnZlZCBmcm9tIGEgc2Vzc2lvbiB0byBhbm90aGVyLiBJdCBpcyB0aHVzIGhpZ2hseSByZWNvbW1lbmRlZCB0byByZWdpc3RlciBhIAotPGNvZGU+Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI8L2NvZGU+IGZvciBlYWNoIHJlZmVyZW5jZWQgY29udGFpbmVyIAotKHRocm91Z2ggdGhlIGV4dGVuc2lvbiBwb2ludCAib3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiKS4KLQkgCi08cHJlPgotcHVibGljIGludGVyZmFjZSBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQkKLQkvKioKLQkgKiBLaW5kIGZvciBhIGNvbnRhaW5lciBtYXBwaW5nIHRvIGFuIGFwcGxpY2F0aW9uIGxpYnJhcnkKLQkgKi8KLQlpbnQgS19BUFBMSUNBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBLaW5kIGZvciBhIGNvbnRhaW5lciBtYXBwaW5nIHRvIGEgc3lzdGVtIGxpYnJhcnkKLQkgKi8KLQlpbnQgS19TWVNURU0gPSAyOwotCi0JLyoqCi0JICogS2luZCBmb3IgYSBjb250YWluZXIgbWFwcGluZyB0byBhIGRlZmF1bHQgc3lzdGVtIGxpYnJhcnksIGltcGxpY2l0bHkgY29udHJpYnV0ZWQgYnkgdGhlIHJ1bnRpbWUKLQkgKi8KLQlpbnQgS19ERUZBVUxUX1NZU1RFTSA9IDM7Ci0JCi0JLyoqCi0JICogQW5zd2VycyB0aGUgc2V0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHRoaXMgY29udGFpbmVyIGlzIG1hcHBpbmcgdG8uCi0JICogVGhlIHNldCBvZiBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBhIGNsYXNzcGF0aCBjb250YWluZXIgbWF5IGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0JICogLSBsaWJyYXJ5IGVudHJpZXMgKDxjb2RlPkNQRV9MSUJSQVJZPC9jb2RlPikgCi0JICogLSBwcm9qZWN0IGVudHJpZXMgKDxjb2RlPkNQRV9QUk9KRUNUPC9jb2RlPikgCi0JICogQSBjbGFzc3BhdGggY29udGFpbmVyIGNhbiBuZWl0aGVyIHJlZmVyZW5jZSBmdXJ0aGVyIGNsYXNzcGF0aCBjb250YWluZXJzIG9yIGNsYXNzcGF0aCB2YXJpYWJsZXMuCi0JICovCQotICAgIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKTsKLQotCS8qKgotCSAqIEFuc3dlcnMgYSByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbnRhaW5lcgotCSAqLwkKLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIGtpbmQgb2YgdGhpcyBjb250YWluZXIuIENhbiBiZSBlaXRoZXI6Ci0JICogLSBLX0FQUExJQ0FUSU9OICBpZiB0aGlzIGNvbnRhaW5lciBtYXBzIHRvIGFuIGFwcGxpY2F0aW9uIGxpYnJhcnkKLQkgKiAtIEtfU1lTVEVNICBpZiB0aGlzIGNvbnRhaW5lciBtYXBzIHRvIGEgc3lzdGVtIGxpYnJhcnkKLQkgKiBUeXBpY2FsbHksIHN5c3RlbSBjb250YWluZXJzIHNob3VsZCBiZSBwbGFjZWQgZmlyc3Qgb24gYSBidWlsZCBwYXRoLgotCSAqLwkKLSAgICBpbnQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogQW5zd2VycyB0aGUgY29udGFpbmVyIHBhdGggaWRlbnRpZnlpbmcgdGhpcyBjb250YWluZXIuCi0JICogQSBjb250YWluZXIgcGF0aCBpcyBmb3JtZWQgYnkgYSBmaXJzdCBJRCBzZWdtZW50IGZvbGxvd2VkIHdpdGggZXh0cmEgc2VnbWVudHMuCi0JICogd2hpY2ggY2FuIHByb3ZpZGUgYWRkaXRpb25hbCBoaW50IGZvciByZXNvbHZpbmcuCi0JICogVGhpcyBjb250YWluZXIgSUQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBoaW50cyBmb3IgcmVzb2x2aW5nIHRvIHRoaXMgY29udGFpbmVyLgotCSAqIFRoZSBjb250YWluZXIgSUQgaXMgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IGEgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgCi0JICogcmVnaXN0ZXJlZCBvbiB0aGUgZXh0ZW5zaW9uIHBvaW50ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIsIHdoaWNoIGNhbgotCSAqIGJlIGludm9rZWQgaWYgbmVlZGluZyB0byByZXNvbHZlIHRoZSBjb250YWluZXIgYmVmb3JlIGl0IGlzIGV4cGxpY2l0ZWx5IHNldC4KLQkgKi8JCi0gICAgSVBhdGggZ2V0UGF0aCgpOwotfQotPC9wcmU+Ci0KLTxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5Jc3N1ZTwvYj46IFRoZSBNYWMgT1MgWCBKREsgaW5zdGFsbCBpcwotYW4gaW50ZXJlc3RpbmcgY2FzZS4gVGhlcmUgdGhlIHJ0LmphciBpcyBzcGxpdCBpbnRvIHR3byBiaW5hcnkgSkFScyAoY2xhc3Nlcy5qYXIsCi11aS5qYXIpLCBidXQgdGhlcmUgaXMgc3RpbGwgYSBzaW5nbGUgc3JjLmphci4gVGhpcyBjYXNlcyBuZWVkcyB0byBiZSBoYW5kbGVkIGJ5IDwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+dGhlCi1zb3VyY2UgbG9va3VwLiBGb3IgZXhhbXBsZSwgd2hlbiBzcmMuamFyIGlzIGF0dGFjaGVkIHRvIGNsYXNzZXMuamFyIHRoZW4gd2hlbgotbG9va2luZyB1cCBqYXZhLmF3dC5GcmFtZSBvdXQgb2YgdWkuamFyLCB0aGUgc291cmNlIGF0dGFjaG1lbnQgb2YgY2xhc3Nlcy5qYXIKLW5lZWRzIHRvIHNlYXJjaGVkIGFzIHdlbGwuPC9mb250PgotCi08aDI+Ci1FeGFtcGxlPC9oMj4KLVRoZSBjbGFzcyBwYXRoIG9mIGEgcHJvamVjdCB3aWxsIGxvb2sgYXMgZm9sbG93czoKLTxwPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aCZndDsKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSZxdW90O3NyYyZxdW90OyBwYXRoPSZxdW90Oy9zcmMmcXVvdDsvJmd0OwotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbnRhaW5lciIgcGF0aD0iSkRLLzEuMyIvPgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0mbHQ7L2NsYXNzcGF0aCZndDsKLTxwPkluIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGRpZG4ndCBvdmVycmlkZSB0aGUKLVZNIGluc3RhbGwgYXQgdGhlIHByb2plY3QgbGV2ZWwuIFRoZW4gdGhlIEphdmEgbGF1bmNoaW5nIGNvbnRyaWJ1dGVkIGNvbnRhaW5lcgotcmVzb2x2ZXIgKHJlZ2lzdGVyZWQgZm9yIGNvbnRhaW5lciBwcmVmaXhlczogIkpESyIpIHdvdWxkIHJlc29sdmUgIkpESy8xLjMiIHVzaW5nIHRoZSBkZWZhdWx0Ci1WTSBpbnN0YWxsLCB1c2luZyAiMS4zIiBhcyBhbiBoaW50LCBhbmQgbWF5IGV4cGFuZCBpdCBpbnRvIHRoZSBmb2xsb3dpbmc6Ci08cD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9JnF1b3Q7ZDovamRrLzEuMy4xL2pyZS9saWIvcnQuamFyJnF1b3Q7Ci1yb290cGF0aD0mcXVvdDtkOi9qZGsxLjMuMS9saWIvc3JjLmphciZxdW90OyBzb3VyY2VwYXRoPSZxdW90Oy9zcmMmcXVvdDsvJmd0OwotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvQVNUUG9zaXRpb25zLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvQVNUUG9zaXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDQxM2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L0FTVFBvc2l0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci08L2hlYWQ+Ci08Ym9keT4KLUhpLAotPHA+SGVyZSBhcmUgbXkgdGhvdWdodHMgcmVnYXJkaW5nIHBvc2l0aW9ucyBhbmQgQVNULiBUaGUgbWFqb3IgZ29hbCB3YXMKLXRvIGNvbWUgdXAgd2l0aCBhIGNvbnNpc3RlbnQgdmlldywgZXZlbiB0aG91Z2ggdGhpcyBjYXVzZXMgc29tZSBtb3JlIHdvcmsKLWZvciByZWZhY3RvcmluZyBhbmQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IEFTVC4gQnV0IEkgdGhpbmsKLWl0IG1pZ2h0IGJlIHdvcnRoIGlmIHdlIGNhbiBjb21lIHVwIHdpdGggYSBjb25zaXN0ZW50IHN0b3J5IGZvciBwb3NpdGlvbnMuCi08aDM+Ci1Tb21lIGdlbmVyYWwgc3RhdGVtZW50czwvaDM+Ci0KLTxvbD4KLTxsaT4KLXNvdXJjZVN0YXJ0IGFuZCBzb3VyY2VFbmQgc2hvdWxkIGFsd2F5cyBjb3ZlciB0aGUgd2hvbGUgbm9kZS4gVGhpcyBpcyBkaWZmZXJlbnQKLXRvIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdoZXJlIGZvciBzb21lIG5vZGVzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQKLWFuZCBkZWNsYXJhcmlvblNvdXJjRW5kIGNvdmVycyB0aGUgd2hvbGUgbm9kZSBhbmQgc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZAotb25seSBjb3ZlcnMgdGhlIG5hbWUgKGV4YW1wbGVzIGFyZTogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXJpb24sCi0uLi4pPC9saT4KLQotPGxpPgotc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBzaG91bGQgYWxzbyBjb3ZlciBhbGwgc3Vibm9kZXM8L2xpPgotCi08bGk+Ci13aGVuZXZlciBwb3NzaWJsZSB3ZSBzaG91bGQgZm9sbG93IHRoZSBncmFtbWFyIGFzIGRlZmluZWQgaW4gVGhlIEphdmEgTGFuZ3VhZ2UKLVNwZWNpZmljYXRpb24gYm9vay4gU28gaWYgdGhlIGdyYW1tYXIgc2F5cyB0aGF0IGEgcHJvZHVjdGlvbiBpbmNsdWRlcyB0aGUKLXNlbWljb2xvbiB0aGVuIHRoZSBBU1Qgbm9kZSBzaG91bGQgaW5jbHVkZSBpdCB0b28uIEZvciBleGFtcGxlIHRoZSBncmFtbWFyCi1kZWZpbmVzIGEgcmV0dXJuIHN0YXRlbWVudCBsaWtlPC9saT4KLQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gKGV4cHJlc3Npb24pIDsKLTxicj5TbyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBzaG91bGQgaW5jbHVkZSB0aGUgOzwvb2w+Ci0KLTxoMz4KLVNvbWUgc3RhdGVtZW50cyBmcm9tIGVhcmxpZXIgZGlzY3Vzc2lvbnMgKG1haW5seSBiZXR3ZWVuIEppbSwgUGhpbGlwcGUsCi1hbmQgbWUpPC9oMz4KLQotPHVsPgotPGxpPgotVGhlcmUgd2lsbCBiZSBhbiBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUgZm9yIGV4cHJlc3Npb25zIHVzZWQgYXMgc3RhdGVtZW50cy4KLUZvciBleGFtcGxlICJpZiAoaXNDaGVja2VkKCkpIHt9IiB2ZXJzdXMgImlzQ2hlY2soKTsiLiBXZSBhZ3JlZWQgdGhhdCB0aGUKLWV4cHJlc3Npb24gd2lsbCBub3QgaW5jbHVkZSB0aGUgc2VtaWNvbG9uIGFuZCB0aGUgRXhwcmVzc2lvblN0YXRlbWVudCB3aWxsLgotRm9yIHRoZSBpc0NoZWNrKCkgZXhhbXBsZSB0aGlzIHdpbGwgbG9vayBsaWtlIFtbaXNDaGVja2VkKCldO10uIFRoaXMgaXMKLWNvbnNpc3RlbnQgd2l0aCB0aGUgZ3JhbW1lciBkZWZpbmVkIGluICgzKS4gVGhpcyB0b2dldGhlciB3aXRoIHRoZSBnZW5lcmFsCi1zdGF0ZW1lbnQgKDIpIGxlYWRzIHRvIHRoZSBjb25jbHVzaW9uIHRoYXQgc3RhdGVtZW50cyB0aGF0IGhhdmUgY2hpbGQgc3RhdGVtZW50cwotd2lsbCBpbmNsdWRlIHRoZSBzZW1pY29sb24gaWYgdGhlIGNoaWxkIHN0YXRlbWVudCBoYXMgb25lLiBGb3IgdGhlIGV4YW1wbGU8L2xpPgotCi08cD48YnI+Zm9yIChpbnQgaT0gMDsgaSAmbHQ7IDEwOyBpKyspCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvbygpOwotPHA+c291cmNlRW5kIG9mIHRoZSBmb3Igc3RhdGVtZW50IHdpbGwgaW5jbHVkZSB0aGUgc2VtaWNvbG9uIG9mIHRoZSBleHByZXNzaW9uCi1zdGF0ZW1lbnQuPC91bD4KLQotPGgzPgotT3BlbiBpc3N1ZXM8L2gzPgotCi08aDQ+Ci1NdWx0aXBsZSBsb2NhbCBkZWNsYXJhdGlvbnM8L2g0PgotQ3VycmVudGx5IG11bHRpcGxlIGxvY2FsIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIEFTVCBhcyBuIHNlcGFyYXRlIGxvY2FsCi1kZWNsYXJhdGlvbnMgd2l0aG91dCBhbnkgcmVsYXRpb25zaGlwIHRvIGVhY2ggb3RoZXJzLiBUaGlzIHJhaXNlcyB2YXJpb3VzCi1xdWVzdGlvbnM6Ci08dWw+Ci08bGk+Ci13aGF0IGFyZSB0aGUgcG9zaXRpb25zIG9mIHRob3NlIGxvY2FsIGRlY2xhcmF0aW9uczwvbGk+Ci0KLTxsaT4KLWhvdyBpcyBhIHZpc2l0b3Igb2YgdGhhdCBBU1QgYWJsZSB0byBmaWd1cmUgb3V0IHRoYXQgaGUgZGVhbHMgd2l0aCBtdWx0aXBsZQotbG9jYWwgZGVjbGFyYXRpb24uPC9saT4KLTwvdWw+Ci1TaW5jZSB0aGUgbmV3IEFTVCBpc24ndCBhIDE6MSBtYXBwaW5nIG9mIHRoZSBjb21waWxlcidzIEFTVCBhbnl3YXkgKHdlCi1oYXZlIHRoZSBFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIEkgb3B0IHRvIGludHJvZHVjZSBuZXcgbm9kZXMgYXMgZGVmaW5lZAotaW4gdGhlIGdyYW1tYXIuIFNpbmNlIHRoZSBzZW1pY29sb24gZG9lc24ndCBiZWxvbmcgdG8gdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uLAotaXQgc2hvdWxkIGJlIG1hbmFnZWQgYnkgdGhlIHBhcmVudCBub2RlIHRoYXQgdGllcyB0b2dldGhlciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuCi1IZXJlIGlzIGFuIGV4YW1wbGU6Ci08cD5pbnQgeD0gMTAsIHhbXT0gbnVsbCwgaTsKLTxwPkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlIG1hbmFnZXM6Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSB0eXBlIChlLmcuIGludCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY29tbWFzIChpZiBuZWVkZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSBhY3R1YWwgdmFyaWFibGUgZGVjbGFyYXRvcnMKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlU3RhcnQ9IHN0YXJ0IG9mIHRoZSB0eXBlCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZUVuZD0gOwotPHA+VmFyaWFibGVEZWNsYXJhdG9yIG5vZGUgbWFuYWdlczoKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIHZhcmlhYmxlIG5hbWUgYW5kIGl0cyBwb3NpdGlvbnMKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgdGhlIGluaXRpYWxpemF0aW9uCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZVN0YXJ0PSBzdGFydCBvZiB2YXJpYWJsZSBuYW1lCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNvdXJjZUVuZD0gZW5kIG9mIGluaXRpYWxpemF0aW9uLiBEb2Vzbid0IGluY2x1ZGUKLXRoZSBjb21tYS4KLTxwPklmIHdlIHdhbnQgdG8gZG8gc29tZSBvcHRpbWl6YXRpb24gd2UgY291bGQgYWxzbyBoYXZlIGEgbm9kZSBTaW5nbGVMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24KLWZvciBkZWNsYXJhdGlvbiBsaWtlIGludCB4OyBvciBpbnQgeT0gMTA7IFRoZSBub2RlIHdvdWxkIGhhdmUgdGhlIGZvbGxvd2luZwotZmllbGRzOgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgdHlwZQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgdmFyaWFibGUgbmFtZSBhbmQgaXRzIHBvc2l0aW9ucwotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB0aGUgaW5pdGlhbGl6YXRpb24KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlU3RhcnQ9IHN0YXJ0IG9mIHR5cGUKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlRW5kPSA7Ci08aDQ+Ci1VcGRhdGVzIGluIGZvciBzdGF0ZW1lbnRzPC9oND4KLUFuYWxvZ291cyB0byB0aGUgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24sIHRoZSBjb21tYSB0byBzZXBhcmF0ZSB0aGUKLXVwZGF0ZSBleHByZXNzaW9ucyBjYW4gbm90IGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gKGV4cHJlc3Npb25zIGRvbid0Ci1jb250YWluIGEgc2VtaWNvbG9uIHNvIHRoZXkgY2FuJ3QgY29udGFpbiBhIGNvbW1hIGVpdGhlcikuIFRvIGtub3cgdGhlCi1wb3NpdGlvbnMgb2YgdGhlIGNvbW1hcyB0aGUgZm9yIHN0YXRlbWVudCBzaG91bGQgbWFuYWdlIHRoZW0gaW4gYSBzZXBhcmF0ZQotYXJyYXkuCi08cD48aT5UaGUgZ2VuZXJhbCBydWxlIGlzLCB0aGF0IHdoZW5ldmVyIGxhbmd1YWdlIGVsZW1lbnRzIGFyZSBzZXBhcmF0ZQotdXNpbmcgYSBjb21tYSAoZm9yIGV4YW1wbGUgYW4gaW50ZXJmYWNlIGxpc3QgaW4gdGhlIGltcGxlbWVudHMgc3RhdGVtZW50LAotYXJndW1lbnRzIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uLCAuLi4pIHRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIHNlcGFyYXRlZAotbm9kZXMgc2hvdWxkIG1hbmFnZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBjb21tYSwgaWYgdGhleSBhcmUgb2YgYW55IGludGVyZXN0LgotSW4gYSBmaXJzdCBpbXBsZW1lbnRhdGlvbiB3ZSBjb3VsZCBsZWF2ZSB0aGVzZSBwb3NpdGlvbnMgb3V0IGFuZCB1c2UgdGhlCi1zY2FubmVyIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZSBvZiBpbnRlcmVzdC48L2k+Ci08aDQ+Ci1UcmVhdG1lbnQgb2Ygc2VtaWNvbG9uPC9oND4KLUZyb20gb3VyIGV4cGVyaWVuY2VzIHdpdGggcmVmYWN0b3JpbmcgaXQgaXMgaGVscGZ1bCBpbiBzb21lIGNhc2VzIHRvIGtub3cKLXdoZXJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VtaWNvbG9uIGlzLiBGb3IgZXhhbXBsZSBpZiB0aGUgdXNlciBleHRyYWN0Ci1hIGZvciBzdGF0ZW1lbnQgYW5kIGhlIGRvZXNuJ3Qgc2VsZWN0IHRoZSBhY3Rpb24ncyBzZW1pY29sb24gd2UgYWxsb3cgdGhlCi1leHRyYWN0aW9uLiBTbyB3aGF0IGNhbiB3ZSBkbyBpbiB0aGVzZSBjYXNlczoKLTx1bD4KLTxsaT4KLXNpbXBsZSBkb24ndCBhbGxvdyB0aGUgY2FzZS4gVG8gc3VwcG9ydCBiZXR0ZXIgc2VsZWN0aW9uIHdlIGNhbiBvZmZlciBzb21lCi1hY3Rpb25zIHRvIGV4dGVuZCB0aGUgdGV4dCBzZWxlY3Rpb24gdG8gc3Bhd24gdmFsaWQgQVNUIG5vZGVzLiBXZSBoYXZlCi1hIHJ1bm5pbmcgcHJvdG90eXBlIGZvciB0aGlzLjwvbGk+Ci0KLTxsaT4KLWRvIHNvbWUgcGFyc2luZyBvZiB0aGUgc291cmNlIGNvZGUgdG8gZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlbWljb2xvbi4KLVdlIGNvdWxkIHVzZSB0aGUgc2Nhbm5lciBmb3IgdGhpcy48L2xpPgotPC91bD4KLQotPGg0PgotQW5zd2VycyB0byBleHBsaWNpdCBxdWVzdGlvbnMgZnJvbSBPbGl2aWVyPC9oND4KLQotPHVsPgotPGxpPgotZm9yICg7Oyk7IDogaW4gdGhpcyBjYXNlIHRoZSBmb3Igc3RhdGVtZW50IHNob3VsZCBjb3ZlciB0aGUgc2VtaWNvbG9uLgotVGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBoYXZlIGFuIGVtcHR5IHN0YXRlbWVudCBhcyBkZWZpbmVkIGluCi10aGUgZ3JhbW1hci48L2xpPgotCi08bGk+Ci1kZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgb2YgYW4gYXJndW1lbnQ6IHllcywgQWRhbSB1c2VzIGFyZ3VtZW50LnR5cGUuc291cmNlU3RhcnQKLWFzIHRoZSBzdGFydCBub3QgZGVjbGFyYXRpb25Tb3VyY2VTdGFydC48L2xpPgotCi08bGk+Ci10ZXN0OiB0aGUgdGVzdCB3ZSBoYXZlIGFyZSB0aGUgcmVmYWN0b3JpbmcgdGVzdC4gV2UgZG9uJ3QgaGF2ZSBzcGVjaWFsCi10ZXN0IHRvIGNoZWNrIGlmIHRoZSBBU1QgcG9zaXRpb25zIGFyZSBjb3JyZWN0LjwvbGk+Ci08L3VsPgotCi08YnI+Jm5ic3A7Ci08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvTm9kZVR5cGVOYW1lcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9Ob2RlVHlwZU5hbWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWVkOTgzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9Ob2RlVHlwZU5hbWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotJnN0YXJ0O0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24mZW5kOw0KLSZzdGFydDtBcnJheUFjY2VzcyZlbmQ7DQotJnN0YXJ0O0FycmF5Q3JlYXRpb24mZW5kOw0KLSZzdGFydDtBcnJheUluaXRpYWxpemVyJmVuZDsNCi0mc3RhcnQ7QXJyYXlUeXBlJmVuZDsNCi0mc3RhcnQ7QXNzZXJ0U3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7QXNzaWdubWVudCZlbmQ7DQotJnN0YXJ0O0Jsb2NrJmVuZDsNCi0mc3RhcnQ7Qm9vbGVhbkxpdGVyYWwmZW5kOw0KLSZzdGFydDtCcmVha1N0YXRlbWVudCZlbmQ7DQotJnN0YXJ0O0Nhc3RFeHByZXNzaW9uJmVuZDsNCi0mc3RhcnQ7Q2F0Y2hDbGF1c2UmZW5kOw0KLSZzdGFydDtDaGFyYWN0ZXJMaXRlcmFsJmVuZDsNCi0mc3RhcnQ7Q2xhc3NJbnN0YW5jZUNyZWF0aW9uJmVuZDsNCi0mc3RhcnQ7Q29tcGlsYXRpb25Vbml0JmVuZDsNCi0mc3RhcnQ7Q29uZGl0aW9uYWxFeHByZXNzaW9uJmVuZDsNCi0mc3RhcnQ7Q29uc3RydWN0b3JJbnZvY2F0aW9uJmVuZDsNCi0mc3RhcnQ7Q29udGludWVTdGF0ZW1lbnQmZW5kOw0KLSZzdGFydDtEb1N0YXRlbWVudCZlbmQ7DQotJnN0YXJ0O0VtcHR5U3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7RXhwcmVzc2lvblN0YXRlbWVudCZlbmQ7DQotJnN0YXJ0O0ZpZWxkQWNjZXNzJmVuZDsNCi0mc3RhcnQ7RmllbGREZWNsYXJhdGlvbiZlbmQ7DQotJnN0YXJ0O0ZvclN0YXRlbWVudCZlbmQ7DQotJnN0YXJ0O0lmU3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7SW1wb3J0RGVjbGFyYXRpb24mZW5kOw0KLSZzdGFydDtJbmZpeEV4cHJlc3Npb24mZW5kOw0KLSZzdGFydDtJbnN0YW5jZW9mRXhwcmVzc2lvbiZlbmQ7DQotJnN0YXJ0O0luaXRpYWxpemVyJmVuZDsNCi0mc3RhcnQ7SmF2YWRvYyZlbmQ7DQotJnN0YXJ0O0xhYmVsZWRTdGF0ZW1lbnQmZW5kOw0KLSZzdGFydDtNZXRob2REZWNsYXJhdGlvbiZlbmQ7DQotJnN0YXJ0O01ldGhvZEludm9jYXRpb24mZW5kOw0KLSZzdGFydDtOdWxsTGl0ZXJhbCZlbmQ7DQotJnN0YXJ0O051bWJlckxpdGVyYWwmZW5kOw0KLSZzdGFydDtQYWNrYWdlRGVjbGFyYXRpb24mZW5kOw0KLSZzdGFydDtQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiZlbmQ7DQotJnN0YXJ0O1Bvc3RmaXhFeHByZXNzaW9uJmVuZDsNCi0mc3RhcnQ7UHJlZml4RXhwcmVzc2lvbiZlbmQ7DQotJnN0YXJ0O1ByaW1pdGl2ZVR5cGUmZW5kOw0KLSZzdGFydDtRdWFsaWZpZWROYW1lJmVuZDsNCi0mc3RhcnQ7UmV0dXJuU3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7U2ltcGxlTmFtZSZlbmQ7DQotJnN0YXJ0O1NpbXBsZVR5cGUmZW5kOw0KLSZzdGFydDtTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uJmVuZDsNCi0mc3RhcnQ7U3RyaW5nTGl0ZXJhbCZlbmQ7DQotJnN0YXJ0O1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uJmVuZDsNCi0mc3RhcnQ7U3VwZXJGaWVsZEFjY2VzcyZlbmQ7DQotJnN0YXJ0O1N1cGVyTWV0aG9kSW52b2NhdGlvbiZlbmQ7DQotJnN0YXJ0O1N3aXRjaENhc2UmZW5kOw0KLSZzdGFydDtTd2l0Y2hTdGF0ZW1lbnQmZW5kOw0KLSZzdGFydDtTeW5jaHJvbml6ZWRTdGF0ZW1lbnQmZW5kOw0KLSZzdGFydDtUaGlzRXhwcmVzc2lvbiZlbmQ7DQotJnN0YXJ0O1Rocm93U3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7VHJ5U3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7VHlwZURlY2xhcmF0aW9uJmVuZDsNCi0mc3RhcnQ7VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50JmVuZDsNCi0mc3RhcnQ7VHlwZUxpdGVyYWwmZW5kOw0KLSZzdGFydDtWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiZlbmQ7DQotJnN0YXJ0O1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCZlbmQ7DQotJnN0YXJ0O1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQmZW5kOw0KLSZzdGFydDtXaGlsZVN0YXRlbWVudCZlbmQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2FzdC5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2FzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDJiOWFkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9hc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOTEgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjUgW2VuXSAoV2luOTg7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkpEVCAtIEFic3RyYWN0IFN5bnRheCBUcmVlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPgotQWJzdHJhY3QgU3ludGF4IFRyZWVzPC9oMj4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5MYXN0IHJldmlzZWQgMTQ6MDAgRnJpZGF5IE9jdG9iZXIgMjYsIDIwMDEgKG1vc3QKLXJlY2VudCBjaGFuZ2UgaW4gYmx1ZSk8L2ZvbnQ+Ci08cD5PcmlnaW5hbCB3b3JrIGl0ZW06ICJFeHBvc2luZyB0aGUgQVNUIEFQSS4iCi08cD5SZWxhdGVkIHdvcmsgaXRlbTogIkltcHJvdmVkIEphdmEgY29kZSBtYW5pcHVsYXRpb24gc3VwcG9ydCwgYWRkcmVzcwotSkRPTSBsaW1pdGF0aW9uczsgSkRPTSBkb2Vzbid0IHByZXNlcnZlIG1hcmtlcnMgYW5kIGlzbid0IGRvY3VtZW50IGF3YXJlOwotSkRPTSBmaW5lciBncmFpbmVkIHVwZGF0ZSBzdXBwb3J0IChlLmcuIGNoYW5nZSBtZXRob2QgbmFtZSwgdHlwZSBuYW1lKTsKLWJ1ZmZlciBjb250ZW50cyBpcyBkdXBsaWNhdGVkIGluIEphdmEgVUkgZG9jdW1lbnQgYW5kIG5lZWRzIHRvIGJlIG1hbnVhbGx5Ci1zeW5jaHJvbml6ZWQuIgotPGgzPgotQmFja2dyb3VuZDwvaDM+Ci0KLTx1bD4KLTxsaT5yZWZhY3RvcmluZyBpcyBhIGtleSBjdXN0b21lciAoRGlyayBCLik8L2xpPgotPGxpPmZvciAyLjA6IGhhdmUgZ29vZCBzdXBwb3J0IGluIHBsYWNlIHNvIHRoYXQgcmVmYWN0b3JpbmcgY2FuIGJlIG1hZGUgYW4KLW9wZW4gQVBJOyB3b3VsZCBuZWVkIGNvcnJlc3BvbmRpbmcgY29yZSBBUElzIGZvciBhYnN0cmFjdCBzeW50YXggdHJlZXM8L2xpPgotPGxpPmN1cnJlbnQgcmVmYWN0b3JpbmcgYXBwb2FjaCB1c2VzIEFTVCB2aXNpdG9yIHdoaWNoIHJ1bnMgcG9zdC1yZXNvbHZlIG9uCi1kZXNpZ25hdGVkIGNvbXBpbGF0aW9uIHVuaXQ8L2xpPgotPGxpPnZpc2l0b3IgY29sbGVjdHMgaW5mbyAocGFyZW50IHN0YWNrKSBpbmNsdWRpbmcgc291cmNlIHBvc2l0aW9uczwvbGk+Ci08bGk+dXNlcyBuYW1lIGVudmlyb25tZW50IChiaW5kaW5ncywgc2NvcGVzKSB0byB2YWxpZGF0ZS9sb2NhdGU8L2xpPgotPGxpPmFsbCBjaGFuZ2VzIGFyZSBmb3JtdWxhdGVkIGFzIHJlaWZpZWQgdW5kb2FibGUgZWRpdHMgaW4gYSBzb3VyY2UgYnVmZmVyPC9saT4KLTxsaT5hIGJhdGNoIG9mIGNoYW5nZXMgYXJlIG1hZGUgYXQgYSB0aW1lPC9saT4KLTxsaT5yZWZhY3RvcmluZyBkb2VzIG5vdCByZWFzb24gaHlwb3RoZXRpY2FsbHkgKGNoYW5nZXMgYXJlIHVuZG9hYmxlKTwvbGk+Ci08bGk+SkRPTSBpcyBub3QgdXNlZCBieSByZWZhY3RvcmluZywgYnV0IHBvdGVudGlhbGx5IGNvdWxkIGJlIChKRE9NIGlzIHVzZWQKLWluc2lkZSBKYXZhIE1vZGVsKTwvbGk+Ci08L3VsPgotRGlyaydzIHdpc2ggbGlzdCB3aXRoIHJlZ2FyZCB0byB0aGUgQVNUIHN1cHBvcnQ6Ci08dWw+Ci08bGk+Ci1jb25zaXN0ZW50IHBvc2l0aW9ucyBpbiBBU1QgKGUuZy4gc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBzaG91bGQgYWx3YXlzCi1jb3ZlciB0aGUgd2hvbGUgbm9kZSkuPC9saT4KLQotPGxpPgotY29tbWVudCBoYW5kbGluZyBpbiBBU1QuIFNvbWUgbm9kZSBjb250YWluIHByZWNlZGluZyBjb21tZW50cyBvdGhlciBkb24ndDwvbGk+Ci0KLTxsaT4KLVBhcmVudCBwb2ludGVyIGluIEFTVCBub2RlLjwvbGk+Ci0KLTxsaT4KLURhdGEgcG9pbnRlciBpbiBBU1Qgbm9kZS48L2xpPgotCi08bGk+Ci1FeHByZXNzaW9uIHNob3VsZCBwcm92aWRlIGdldFR5cGUgbWV0aG9kIChjYWNoZWQgdmFsdWUgb2YgcmVzb2x2ZVR5cGUoU2NvcGUpKS48L2xpPgotPC91bD4KLQotPGgzPgotU3VtbWFyeSBmcm9tIFNlcHQuIDEwLTExIG1lZXRpbmdzPC9oMz4KLURpcmsgdHJhdmVsbGVkIHRvIFNOWiB0byBkaXNjdXNzIHJlZmFjdG9yaW5nIHJlcXVpcmVtZW50cyBhbmQgcG9zc2libGUKLXNvbHV0aW9ucyB3aXRoIFBoaWxpcHBlIE0uIGFuZCBKZWVtLgotPHA+U29tZSBvZiB0aGUgZm9ybXMgb2Ygc29sdXRpb25zIGRpc2N1c3NlZCwgYnV0IHVsdGltYXRlbHkgYWJhbmRvbmVkOgotPHVsPgotPGxpPgotQSB2YW5pbGxhIERPTS48L2xpPgotCi08dWw+Ci08bGk+Ci10b28gbGltaXRpbmc6IGRpZmZpY3VsdCB0byBwcm92aWRlIGZvciBwcmUtY29tcHV0aW5nIGJpbmRpbmdzLjwvbGk+Ci0KLTxsaT4KLWNsdW1zeSBmb3IgY2xpZW50cyB0byB1c2Ugd2l0aG91dCBBU1Qgbm9kZSB0eXBlcyByZXByZXNlbnRlZCBieSBkaWZmZXJlbnQKLUphdmEgdHlwZXM8L2xpPgotPC91bD4KLQotPGxpPgotQVNUIHBsdXMgcmVzb2x2ZXMgaW5mbyBpbiBmb3JtIG9mIEphdmEgbW9kZWwgZWxlbWVudHMuPC9saT4KLQotPHVsPgotPGxpPgotSmF2YSBtb2RlbCBtZXRob2RzIGFyZSB1bnN1aXRhYmxlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3IgcmVzb2x2ZWQKLW1ldGhvZHMgYmVjYXVzZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGFzIHBlciBzb3VyY2UuPC9saT4KLQotPGxpPgotSXQgaXMgaGFyZCB0byBtYXAgYSB0eXBlIGJhY2sgdG8gYSBKYXZhIGVsZW1lbnQgKG5lZWQgdG8gcmVtZW1iZXIgcGFja2FnZQotZnJhZ21lbnQpLjwvbGk+Ci0KLTxsaT4KLVdvdWxkIG5lZWQgYWRkaXRpb25hbCBKYXZhIG1vZGVsIGVsZW1lbnRzIHRvIHJlcHJlc2VudCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotV291bGQgbmVlZCBzcGVjaWFsIEphdmEgZWxlbWVudCBpbXBsZW1lbnRhdGlvbnMgZm9yIGxvY2FsIHR5cGVzLCBtZXRob2RzLAotYW5kIGZpZWxkcy48L2xpPgotPC91bD4KLTwvdWw+Ci1JbiB0aGUgZW5kLCB3ZSBhZ3JlZWQgb24gQVNUIHBsdXMgYmluZGluZ3M6Ci08dWw+Ci08bGk+Ci1BU1QgaXMgc2ltcGxlIHRyZWUgb2YgdHlwZWQgbm9kZXMgYXMgZGV0ZXJtaW5lZCBieSBwYXJzZXIuPC9saT4KLQotPGxpPgotQSBkaWZmZXJlbnQgSmF2YSB0eXBlIGZvciBlYWNoIEFTVCBub2RlIHR5cGUuPC9saT4KLQotPGxpPgotVEJEOiBhcmUgbm9kZSB0eXBlcyBBUEkgY2xhc3NlcywgQVBJIGludGVyZmFjZXMsIG9yIGJvdGg/PC9saT4KLQotPGxpPgotU2ltcGxlIGNhc2U6IG5vIGJpbmRpbmdzLjwvbGk+Ci0KLTxsaT4KLUJhc2ljIEFTVCBMaWZlY3ljbGU6IGNsaWVudCByZXF1ZXN0cyBBU1Q7IGNvbXBpbGF0aW9uIHVuaXQgaXMgcGFyc2VkIGFuZAotbm9kZXMgYXJlIGNyZWF0ZWQ7IHJvb3QgaXMgaGFuZGVkIGJhY2sgdG8gY2xpZW50OyBBU1QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQKLWFmdGVyIGNsaWVudCBsZXRzIGdvIG9mIGFsbCBBU1Qgbm9kZXMuIEFTVCBpcyBub3QgYWZmZWN0ZWQgaWYgdW5kZXJseWluZwotY29tcGlsYXRpb24gdW5pdCBpcyBjaGFuZ2VkIChpLmUuLCBlYWdlciBwYXJzZSwgd2l0aCBubyByZXNpZHVhbCBkZXBlbmRlbmNlCi1vbiBzdGF0ZSBvZiBmaWxlIGluIHdvcmtzcGFjZSkuPC9saT4KLQotPGxpPgotQW55IHN5bnRheCBlcnJvcnMgZGV0ZWN0ZWQgbmVlZCB0byBiZSByZXBvcnRlZCB0byBjbGllbnQuIFByb2JsZW1zIGFyZQotb3BhcXVlOiBzb3VyY2UgY2hhcmFjdGVyIHBvc2l0aW9uIHBsdXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gQ2xpZW50cwotbmVlZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gQVNUIGlzIG9ubHkgcGFydGlhbCAoZS5nLiwgYnVzdGVkIGZsYWdzKS48L2xpPgotCi08bGk+Ci1QcmVkaWNhdGFibGUgdHJlZXMgd2l0aCBzaW1wbGUgY29ycmVzcG9uZGVuY2UgdG8gc291cmNlIGNvZGUgKHBhcnNlciBzaG91bGQKLW5vdCBvcHRpbWl6ZSBBU1RzKS48L2xpPgotCi08bGk+Ci1SZWxpYWJsZSBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBub2Rlcy48L2xpPgotCi08bGk+Ci1TY3JhdGNoICJkYXRhIiBmaWVsZCBvbiBlYWNoIEFTVCBub2RlIGZvciBjbGllbnQgdG8gcmVjb3JkIGFuIE9iamVjdC48L2xpPgotCi08bGk+Ci1OYXZpZ2F0ZSBBU1QgdXB3YXJkcyBhcyB3ZWxsIGFzIGRvd253YXJkcy4gUGFyZW50IGxpbmsuPC9saT4KLQotPGxpPgotQVNUIHdhbGtlciBmb3IgY29udmVuaWVudCB0cmF2ZXJzYWwuPC9saT4KLQotPGxpPgotQVNUcyBjYW4gYmUgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUuPC9saT4KLQotPGxpPgotUmVhZC13cml0ZSBBU1RzIGNhbiBiZSBtb2RpZmllZCBpbiB0ZXJtcyBvZiBBU1RzLiBBU1Qgbm9kZSBmYWN0b3JpZXMgKG5vCi1KYXZhIHBhcnNlciByZXF1aXJlZCkuIEN1dC9jb3B5L3Bhc3RlLjwvbGk+Ci0KLTxsaT4KLUN1dC9jb3B5L3Bhc3RlIGJldHdlZW4gc2VwYXJhdGUgQVNUcyByZXF1aXJlcyBmcmFnbWVudCBjbG9uaW5nIHRvIHByZXNlcnZlCi1pbmRlcGVuZGVuY2Ugb2Ygc3RvcmFnZS48L2xpPgotCi08bGk+Ci1DbGllbnQgbWF5IGJlIGludGVyZXN0ZWQgaW4gY3V0L2NvcHkvcGFzdGluZyBjb21tZW50cyB0b28uPC9saT4KLQotPGxpPgotTmV3IG5vZGVzIHdvdWxkIG5vdCBjYXJyeSBzb3VyY2UgcG9zaXRpb25zLjwvbGk+Ci0KLTxsaT4KLVJlYWQtd3JpdGUgQVNUIGNhbiBiZSBzZXJpYWxpemVkIGJhY2sgdG8gY29tcGlsYXRpb24gdW5pdCBjaGFyW10uPC9saT4KLQotPHVsPgotPGxpPgotUHJlc2VydmUgZXhpc3RpbmcgY29tbWVudHMsIHdoaXRlc3BhY2UsIGFuZCB1c2Ugb2YgXHUuPC9saT4KLQotPGxpPgotQ29udHJvbCB3aGl0ZXNwYWNlIGFuZCB1c2Ugb2YgXHUgZm9yIGluc2VydGlvbnMuPC9saT4KLQotPGxpPgotUHJvdmlkZSBlZGl0IG1hcCBmb3IgdXBkYXRpbmcgbWFya2Vycy48L2xpPgotPC91bD4KLQotPGxpPgotUmVzb2x2ZWQgQVNUczogYmFzaWMgQVNUIGFubm90YXRlZCB3aXRoIGJpbmRpbmdzIChub24tc3ludGFjdGljIGluZm9ybWF0aW9uKS48L2xpPgotCi08bGk+Ci1CaW5kaW5nIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBBU1QgcGx1cyB0aGUgSmF2YSBtb2RlbCAocmVsYXRpdmUgdG8KLXNvbWUgcHJvamVjdCkuPC9saT4KLQotPGxpPgotQXZhaWxhYmlsaXR5L3ZhbGlkaXR5IG9mIGJpbmRpbmdzIGNlYXNlcyB3aGVuIEphdmEgbW9kZWwgY2hhbmdlcy48L2xpPgotCi08bGk+Ci1DbGllbnQgbXVzdCByZXF1ZXN0IHVwIGZyb250IHRoYXQgYmluZGluZ3MgYmUgY3JlYXRlZC48L2xpPgotCi08bGk+Ci1DZXJ0YWluIEFTVCBub2RlcyBnZXQgZGVjb3JhdGVkIHdpdGggYmluZGluZ3MuPC9saT4KLQotPGxpPgotQ2xpZW50IHNob3VsZCBoYXZlIHdheXMgdG8gY29tbXVuaWNhdGUgdXAgZnJvbnQgd2hhdCBraW5kIG9mIGJpbmRpbmdzIGFyZQotcmVxdWlyZWQgYW5kIHdoZXJlLjwvbGk+Ci0KLTxsaT4KLUF2YWlsYWJpbGl0eS92YWxpZGl0eSBvZiBiaW5kaW5ncyBmb3IgYSByZWFkLXdyaXRlIEFTVCBjZWFzZXMgd2hlbiBpdCBpcwotZmlyc3QgbW9kaWZpZWQuPC9saT4KLQotPGxpPgotQmluZGluZ3MgKG5vbi1zeW50YWN0aWMgaW5mb3JtYXRpb24pIGluY2x1ZGVzIHRoaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6PC9saT4KLQotPHVsPgotPGxpPgotUmVzb2x2ZWQgbmFtZXMgLSB3aGljaCB0eXBlLCBmaWVsZCwgbWV0aG9kLCBvciBsb2NhbCB2YXJpYWJsZSBkb2VzIGEgQVNUCi1uYW1lIHJlZmVybmNlIHJlc29sdmUgdG8uPC9saT4KLQotPGxpPgotUmVzb2x2ZWQgdHlwZXMgLSB3aGF0IGlzIHRoZSByZXNvbHZlZCB0eXBlIG9mIGFuIEFTVCBleHByZXNzaW9uIG9yIHR5cGUKLXJlZmVyZW5jZS48L2xpPgotCi08bGk+Ci1SZXNvbHZlZCBzdXBlcnR5cGVzIC0gd2hhdCBhcmUgdGhlIHJlc29sdmVkIHN1cGVydHlwZXMgb2YgYSByZXNvbHZlZCB0eXBlLjwvbGk+Ci0KLTxsaT4KLVJlc29sdmVkIGRlY2xhcmF0aW9ucyAtIHdoYXQgcmVzb2x2ZWQgdHlwZSwgZmllbGQsIG1ldGhvZCwgb3IgbG9jYWwgdmFyaWFibGUKLWRvZXMgYW4gQVNUIGRlY2xhcmF0aW9uIG1hcCB0by48L2xpPgotCi08bGk+Ci1UaHJvd24gZXhjZXB0aW9ucyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCB0eXBlcyBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24KLWJ5IGEgZ2l2ZW4gZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQuPC9saT4KLQotPGxpPgotUmVzb2x2ZWQgbWVtYmVycyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCBtZW1iZXJzIG9mIGEgcmVzb2x2ZWQgdHlwZS48L2xpPgotPC91bD4KLQotPGxpPgotUHJvYmxlbXMgYWxzbyBzaG91bGQgYmUgcmVwb3J0ZWQgd2l0aCByZXNvbHZpbmcuIFByb2JsZW1zIGFyZSBvcGFxdWU6IHNvdXJjZQotY2hhcmFjdGVyIHBvc2l0aW9uIHBsdXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS48L2xpPgotCi08bGk+Ci1TcGFjZSBmb3IgYmluZGluZ3Mgc3RvcmFnZSBpcyBzaWduaWZpY2FudDsgaW5jcmVhc2VzIG1vbm90b25pY2FsbHkgYXMgbW9yZQotYmluZGluZ3MgYXJlIGFjY2Vzc2VkLjwvbGk+Ci0KLTxsaT4KLVNwYWNlIGZvciBiaW5kaW5ncyBpcyBmb3IgbGlmZXRpbWUgb2YgdGhlIEFTVC48L2xpPgotCi08bGk+Ci1BZHZhbmNlZCBBU1QgTGlmZWN5Y2xlOiBjbGllbnQgcmVxdWVzdHMgQVNUIHdpdGggYmluZGluZ3M7IGNvbXBpbGF0aW9uCi11bml0IGlzIHBhcnNlZCwgbm9kZXMgY3JlYXRlZCwgYW5kIHBlcmhhcHMgc29tZSBiaW5kaW5ncyBjcmVhdGVkIGFuZCBhbm5vdGF0ZWQKLW9uIG5vZGVzOyByb290IGlzIGhhbmRlZCBiYWNrIHRvIGNsaWVudDsgQVNUIGlzIGdhcmJhZ2UgY29sbGVjdGVkIGFmdGVyCi1jbGllbnQgbGV0cyBnbyBvZiBhbGwgQVNUIG5vZGVzIGFuZCBiaW5kaW5ncy4gQVNUIGl0c2VsZiBpcyBub3QgYWZmZWN0ZWQKLWlmIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdCBpcyBjaGFuZ2VkIChpLmUuLCBlYWdlciBwYXJzZSwgd2l0aCBubyByZXNpZHVhbAotZGVwZW5kZW5jZSBvbiBzdGF0ZSBvZiBmaWxlIGluIHdvcmtzcGFjZSkuIEJpbmRpbmdzIG1heSBiZWNvbWUgc3RhbGUgb3IKLWludmFsaWQgaWYgd29ya3NwYWNlIGNoYW5nZXMgKGkuZS4sIHBvc3NpYmx5IGxhenkgYW5kIGluY3JlbWVudGFsIGNvbnN0cnVjdGlvbgotb2YgYmluZGluZ3MgdXNpbmcgSmF2YSBtb2RlbCkuPC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPkJpbmRpbmdzIGZyb20gdHdvIEFTVHMgYXJlIG5vdCBnZW5lcmFsbHkgY29tcGFyYWJsZS48L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPkZvciBiaW5kaW5ncyB3aXRoIHN0YWJsZSBnbG9iYWwgbmFtZXMsIEFQSSBwcm92aWRlcwotc3RyaW5ncyB0aGF0IGNhbiBiZSBjb21wYXJlZCBiZXR3ZWVuIEFTVHMuPC9mb250PjwvbGk+Ci08L3VsPgotPC91bD4KLUFTVCB3aWxsIGVpdGhlciBleHRlbmQgb3IgcmVwbGFjZSBKRE9NLiBJbiB0aGUgbGF0dGVyIGNhc2UsIEpET00gd291bGQKLWJlIGRlcHJlY2F0ZWQuCi08cD5BU1Qgd2lsbCBleGlzdCBhbG9uZyBzaWRlIEphdmEgbW9kZWwuCi08aDM+Ci1BUEkgRGVzaWduIElzc3VlOiBBU1QgTm9kZSBUeXBlcyAtIENsYXNzZXMsIGludGVyZmFjZSwgb3IgYm90aDwvaDM+Ci1UaGVyZSBhcmUgb24gdGhlIG9yZGVyIG9mIDg3IG5vZGUgdHlwZXMgZm9yIEphdmEgQVNUcy4gQmluZGluZ3Mgd2lsbCBhZGQKLXNvbWUgbW9yZS4gVGhlcmUgYXJlIGEgY291cGxlIG9mIHdheSB0aGlzIGNhbiBiZSBtYXBwZWQgdG8gSmF2YSB0eXBlcy4KLTxwPigxKSBVc2Ugb3JnLnczYy5ET00gaW50ZXJmYWNlcyBhcyBBUEkuIFByb3ZpZGUgYSBwcml2YXRlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCi1vZiB0aGUgRE9NLgotPHA+UHJvOiBWZXJ5IHNtYWxsLCBhbmQgc3RhbmRhcmQgQVBJIGZvciByZWFkLXdyaXRlIGRvY3VtZW50cy4KLTxicj5Db246IEFQSSBpcyBub3QgY29udmVuaWVudCBmb3IgY2xpZW50cy4KLTxicj5Db246IEFQSSBpcyBub3QgYW1lbmFibGUgdG8gZXhwb3NpbmcgYmluZGluZ3MgYW5kIG90aGVyIG5vbi1zdHJ1Y3R1cmFsCi1pbmZvcm1hdGlvbi4KLTxwPigyKSBDb25jcmV0ZSBBUEkgY2xhc3MgcGVyIEFTVCBub2RlIHR5cGUuCi08cD5Qcm86IEFQSSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KLTxicj5Qcm86IENsaWVudCBjYW4gY3JlYXRlIG5vZGVzIGRpcmVjdGx5LgotPHA+Q29uOiBDYW5ub3QgZWFzaWx5IGhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlsczsgZS5nLiByZXByZXNlbnRhdGlvbgotYW5kIG1lY2hhbmlzbSBmb3IgcmVhc3NlbWJsaW5nIGNvbXBpbGF0aW9uIHVuaXQgdGV4dCBhZnRlciBlZGl0aW5nOyBsYXp5Ci1iaW5kaW5nIGNyZWF0aW9uLgotPHA+Q2xpZW50cyB3aG8gY3JlYXRlIG5vZGUgZnJvbSBzY3JhdGNoIG9ubHkgZXZlciBuZWVkIGJhc2ljIGNvbnN0cnVjdG9ycwotKHRoZSBub2RlcyB0aGV5IGNyZWF0ZSBkbyBub3QgaGF2ZSBzb3VyY2UgcG9zaXRpb25zLCBiaW5kaW5ncywgb3Igb3RoZXIKLWRlY29yYXRpb25zKS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBwYXJzZXIgbmVlZHMgdG8gcmVtZW1iZXIgbW9yZSBpbmZvCi1pbmNsdWRpbmcgZmluZS1ncmFpbmVkIHNvdXJjZSBwb3NpdGlvbnMuCi08cD4oMykgQVBJIGludGVyZmFjZSBwZXIgQVNUIG5vZGUgdHlwZSwgYWxvbmcgd2l0aCBub2RlIGZhY3RvcnkgbWV0aG9kcy4KLVByb3ZpZGUgYSBwcml2YXRlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uLiBBbGxvdyBjbGllbnRzIHRvIHJlaW1wbGVtZW50Ci1ub2RlIHR5cGVzIChmcm9tIHNjcmF0Y2gpIGFuZCBzdXBwbHkgYSBmYWN0b3J5LgotPHA+TGlrZSBKRE9NIChleGNlcHQgSkRPTSBkb2VzIG5vdCBwZXJtaXQgY2xpZW50IHRvIHJlaW1wbGVtZW50KSBhbmQgb3JnLnczYy5kb20uCi08cD5Qcm86IEFQSSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KLTxicj5Qcm86IEVhc3kgdG8gdGFpbG9yIGRpZmZlcmVudCBraW5kcyBvZiByZXByZXNlbnRhdGlvbjogcmVhZC13cml0ZSB2cy4KLXJlYWQtb25seSBBU1RzOyByYXcgQVNUcyB2cy4gQVNUK2JpbmRpbmdzLgotPHA+Q29uOiZuYnNwOyBIaWRkZW4gY29uY3JldGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyB0YWtlcyBtb3JlIHNwYWNlLgotPGJyPkNvbjogVXNpbmcgZmFjdG9yeSBtZXRob2RzIGlzIGEgYml0IGxlc3MgZGlyZWN0IHRoYW4gdXNpbmcgY29uc3RydWN0b3JzLgotPHA+V2Ugd2lsbCB1c2UgQVBJIGludGVyZmFjZXMgZm9yIGJpbmRpbmdzLCBhbmQgZXhwb3NlZCBBUEkgY2xhc3NlcyBmb3IKLUFTVCBub2Rlcy4KLTxoMz4KLUFQSSBEZXNpZ24gSXNzdWU6IFN0YXRlbWVudCB2cy4gU3RhdGVtZW50IExpc3RzPC9oMz4KLUZvciBzdHJ1Y3R1cmVkIHN0YXRlbWVudHMsIGxpa2Ugd2hpbGUsIHRoZSBjaGlsZCBzdGF0ZW1lbnQgaXMgZ3JhbW1hdGljYWxseQotYSBzaW5nbGUgc3RhdGVtZW50LiBIb3dldmVyLCBzaW5jZSBhIGJsb2NrIGlzIG9uZSB0eXBlIG9mIHN0YXRlbWVudCwgaXQKLWlzIHBvc3NpYmxlIHRvIGhhdmUgYSBsaXN0IG9mIHN0YXRlbWVudHMgdW5kZXJuZWF0aC4gVGhlcmUgYXJlIG9wdGlvbnMKLWZvciByZW5kZXJpbmcgdGhpczoKLTxwPigxKSBDaGlsZCBpcyBhIHNpbmdsZSBzdGF0ZW1lbnQuCi08cD4oTGlrZSBjdXJyZW50IGNvbXBpbGVyJ3MgaW50ZXJuYWwgQVNUcy4pCi08cD5Qcm86IEFzIHBlciB0aGUgSmF2YSBncmFtbWFyLgotPGJyPkNvbjogQSBjbGllbnQgd2FudGluZyB0byBpbnNlcnQgYW4gYWRkaXRpb25hbCBzdGF0ZW1lbnQgaW50byB0aGUgY2hpbGQKLW11c3QgYmUgcHJlcGFyZWQgdG8gcmVwbGFjZSBieSBhIGJsb2NrIGlmIHRoZXJlIGlzbid0IG9uZS4KLTxwPigyKSBDaGlsZCBpcyBhIGxpc3Qgb2Ygc3RhdGVtZW50cy4KLTxwPihMaWtlIHRoZSAubmV0IGNvZGVET00uKQotPHA+UHJvOiBNb3JlIGNvbnZlbmllbnQgZm9yIGNsaWVudHMgdGhhdCBlZGl0IEFTVHMuIFVuaWZvcm0gbWVjaGFuaXNtIGZvcgotaW5zZXJ0aW5nIGFuZCByZW1vdmluZyBzdGF0ZW1lbnRzIGZyb20gY2hpbGQuCi08YnI+Q29uOiBNdWRkaWVzIHNjb3BlcyAoZW5jbG9zaW5nIGJyYWNlcyBhcm91bmQgc3RhdGVtZW50cyBpbnRyb2R1Y2UgYQotc2NvcGUgYW5kIG1ha2UgZGVjbGFyYXRpb25zIHN5bnRhY3RpY2FsbHkgbGVnYWwpLgotPHA+V2Ugd2lsbCBnbyB3aXRoICgxKSBhbmQgc3RpY2sgY2xvc2VseSB0byB0aGUgZ3JhbW1hci4KLTxoMz4KLVVzYWdlPC9oMz4KLVRoZXJlIGFyZSBhIGNvdXBsZSBkaWZmZXJlbnQgdXNhZ2Ugc2NlbmFyaW9zIGZvciBBU1RzOgotPHVsPgotPGxpPgotQW5hbHl6ZSBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0IHRvIGRpc2NvdmVyIHN5bnRhY3RpYyBzdHJ1Y3R1cmUuPC9saT4KLQotPGxpPgotRGlzY292ZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gc3ludGFjdGljIHN0cnVjdHVyZSBhbmQgb3JpZ2luYWwgdGV4dC48L2xpPgotCi08bGk+Ci1EaXNjb3ZlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBzeW50YWN0aWMgc3RydWN0dXJlIGFuZCByZXNvbHZlZCB3b3JsZC48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBuZXcgY29tcGlsYXRpb24gdW5pdCBmcm9tIHNjcmF0Y2guPC9saT4KLQotPGxpPgotRWRpdCBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0LjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Tb3VyY2UgQ29uc3RydWN0IE5vcm1hbGl6YXRpb248L2gzPgotCi08dWw+Ci08bGk+Ci1Nb3N0IHN5bnRhY3RpYyBjb25zdHJ1Y3Rpb25zIGFyZSByZW5kZXJlZCBpbiBvbmUgYW5kIG9ubHkgb25lIHdheS48L2xpPgotCi08bGk+Ci1XaGVuIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgQVNUIGNvbnN0cnVjdGlvbiBpcyAibG9zc3kiLjwvbGk+Ci0KLTxsaT4KLVNvbWUgZm9ybXMgY2Fubm90IGJlIGRpc3Rpbmd1aXNlZCBpbiBpbnB1dCAoaWYgb25lIGNhcmVzKS48L2xpPgotCi08bGk+Ci1Tb21lIGZvcm1zIGNhbm5vdCBiZSBwcm9kdWNlZCBpbiBvdXRwdXQuPC9saT4KLQotPGxpPgotQ29weWluZyB0aGUgY29uc3RydWN0IG5vcm1hbGl6ZXMgaXQuPC9saT4KLQotPGxpPgotRXhhbXBsZTogTW9kaWZpZXIgb3JkZXI8L2xpPgotCi08dWw+Ci08bGk+Ci1maW5hbCBzdGF0aWMgcHVibGljIGludCBYID0gMTs8L2xpPgotCi08bGk+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBYID0gMTsgLy8gcHJlZmVycmVkIGZvcm08L2xpPgotPC91bD4KLQotPGxpPgotRXhhbXBsZTogQ29tcG91bmQgdmFyaWFibGUgZGVjbGFyYXRpb25zPC9saT4KLQotPHVsPgotPGxpPgotaW50IGkgPSAxLCBqID0gMjs8L2xpPgotCi08bGk+Ci1pbnQgaSA9IDE7IGludCBqID0gMjsmbmJzcDsgLy8gcHJlZmVycmVkIGZvcm08L2xpPgotPC91bD4KLQotPGxpPgotRXhhbXBsZTogQXJyYXkgdHlwZSBkZWNsYXJhdG9yczwvbGk+Ci0KLTx1bD4KLTxsaT4KLWludFtdIHhbXTs8L2xpPgotCi08bGk+Ci1pbnRbXVtdIHg7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUV4YW1wbGU6IFNob3J0IGlmczwvbGk+Ci0KLTx1bD4KLTxsaT4KLWlmIChhKSBmKCk7IGVsc2UgOzwvbGk+Ci0KLTxsaT4KLWlmIChhKSBmKCk7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUNhbiBvbmx5IGJlIGRvbmUgZm9yIHN5bnRhY3RpYyBudWFuY2VzIHRoYXQgYXJlIGhhdmUgbm8gc2VtYW50aWMgaW1wb3J0LjwvbGk+Ci0KLTxsaT4KLU5vcm1hbGl6YXRpb24gaXMgZ2VuZXJhbGx5IGFjY2VwdGFibGUgd2hlcmUgdW5pbXBvcnRhbnQgc3ludGFjdGljIG51YW5jZXMKLWFyZSBpbnZvbHZlZC48L2xpPgotCi08bGk+Ci1Ob3JtYWwgZm9ybSBzaG91bGQgZm9sbG93IEpMUyByZWNvbW1lbmRhdGlvbnMgYW5kIEphdmEgY29kaW5nIHN0YW5kYXJkcy48L2xpPgotCi08bGk+Ci1Ob3RlIHRoYXQgcGFyZW50aGVzZXMgYW5kIGJsb2NrcyBhcmUgaW1wb3J0YW50IHRvIHVzZXIgYW5kIHNob3VsZCBub3QgYmUKLW5vcm1hbGl6ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVNvdXJjZSBQb3NpdGlvbnM8L2gzPgotCi08dWw+Ci08bGk+Ci1XaGVuIEFTVCBpcyBvYnRhaW5lZCBieSBwYXJzaW5nIGEgdGV4dCBzdHJpbmcsIGV4cG9zaW5nIHNvdXJjZSByYW5nZXMgZm9yCi1ub2RlcyBhbGxvd3MgY2xpZW50cyB0byBuYXZpZ2F0ZSBiYWNrIGludG8gb3JpZ2luYWwgc3RyaW5nOyBlLmcuLCBmb3IgbWFraW5nCi10ZXh0IGVkaXRvciBzZWxlY3Rpb25zLjwvbGk+Ci0KLTxsaT4KLUFTVCBzdXBwb3J0cyBvbmx5IGNoYXJhY3Rlci1vcmllbnRlZCBwb3NpdGlvbiBpbmZvcm1hdGlvbjsgbWFwcGluZyBjaGFyYWN0ZXIKLXBvc2l0aW9ucyB0byBsaW5lcyBhcmUgaGFuZGxlZCBlbHNld2hlcmUgKGUuZy4sIHRleHQgZWRpdG9yKS48L2xpPgotCi08bGk+Ci1Tb3VyY2UgcmFuZ2VzIGFyZSBpcnJlbGV2YW50IGZvciBub2RlcyBjcmVhdGVkIGJ5IG90aGVyIG1lYW5zLjwvbGk+Ci0KLTxsaT4KLVNvdXJjZSByYW5nZXMgZ2l2ZSBvcmlnaW5hbCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBzdHJpbmcuPC9saT4KLQotPHVsPgotPGxpPgotRWRpdGluZyB0aGUgQVNUIGRvZXMgbm90IGFsdGVyIHBvc2l0aW9ucyBvciBhbnl0aGluZyBjbGV2ZXIuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLU1vc3QgY29uc3RydWN0cyBvY2N1cHkgY29udGlndW91cyBjaGFyYWN0ZXIgcG9zaXRpb25zLCBvciByYW5nZXMuPC9saT4KLQotPGxpPgotUmFuZ2VzIGFyZSByZXByZXNlbnRlZCBieSAwLWJhc2VkIHN0YXJ0IHBvc2l0aW9uIGFuZCBsZW5ndGguPC9saT4KLQotPGxpPgotU3RhcnQgcG9zaXRpb24gYmVnaW5zIGF0IGZpcnN0IHNpZ25pZmljYW50IGNoYXJhY3RlciBvZiBjb25zdHJ1Y3QgY29ycmVzcG9uZGluZwotdG8gQVNUIG5vZGUuPC9saT4KLQotPHVsPgotPGxpPgotRmlyc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyLjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgbGVhZGluZyB3aGl0ZXNwYWNlLjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgcHJlY2VkaW5nIGNvbW1lbnQgKGV4Y2VwdCB0aGUgamF2YWRvYyBjb21tZW50IHByZWNlZGluZwotYSBkZWNsYXJhdGlvbiwgb3IgdGhlIGNvbW1lbnQgcHJlY2VkaW5nIGEgc3RhdGVtZW50IC0gc2VlIGJlbG93KS48L2xpPgotPC91bD4KLQotPGxpPgotRW5kIHBvc2l0aW9uIGluY2x1ZGVzIGxhc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyIG9mIGNvbnN0cnVjdCBjb3JyZXNwb25kaW5nCi10byBBU1Qgbm9kZS48L2xpPgotCi08dWw+Ci08bGk+Ci1MYXN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci48L2xpPgotCi08bGk+Ci1JbmNsdWRlcyB0cmFpbGluZyB0ZXJtaW5hdG9ycyB0aGF0IGFyZSBwYXJ0IG9mIGNvbnN0cnVjdDsgZS5nLiwgaW5jbHVkZQotdHJhaWxpbmcgc2VtaWNvbG9uIGF0IGVuZCBvZiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbi48L2xpPgotCi08bGk+Ci1Eb2VzIG5vdCBpbmNsdWRlIHNlcGFyYXRvcnM7IGUuZy4sIGV4Y2x1ZGUgdHJhaWxpbmcgY29tbWEgaW4gcGFyYW1ldGVyCi1saXN0LjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZS48L2xpPgotCi08bGk+Ci1Eb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIGNvbW1lbnQuPC9saT4KLQotPGxpPgotU3RhdGVtZW50IGVuZC1vZi1saW5lIGNvbW1lbnRzIGFyZSBub3QgZW5jb21wYXNzZWQgYnkgc3RhdGVtZW50LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLTx0dD5TeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIik7IC8vICRub24tbmxzJDwvdHQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5FbWJlZGRlZCBjb21tZW50cyBhcmUgZW5jb21wYXNzZWQgaWYgdGhleSBvY2N1ciBiZWZvcmUKLWVuZCBwb3NpdGlvbi48L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj5TeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIikgLyogY29tbWVudCAqLzs8L2ZvbnQ+PC90dD48L2xpPgotPC91bD4KLTwvdWw+Ci0KLTxsaT4KLVNvbWUgbm9kZSB0eXBlcyB3b3VsZCBoYXZlIHNvdXJjZSByYW5nZXMgZm9yIHNpZ25pZmljYW50IGNvbnRpZ3VvdXMgc3ViY29uc3RydWN0cwotbm90IHJlYWRpbHkgZ2xlYW5hYmxlIGZyb20gc291cmNlIHJhbmdlcyBvZiB0aGUgc3Vibm9kZXMuPC9saT4KLQotPHVsPgotPGxpPgotQWRkaXRpb25hbCBzb3VyY2UgcmFuZ2VzIHdvdWxkIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBub2RlIHR5cGUuPC9saT4KLQotPGxpPgotRS5nLiwgbWV0aG9kIGRlY2xhcmF0aW9uIGhhcyBhZGRpdGlvbmFsIHNvdXJjZSByYW5nZSBmb3IgdGhlIG1ldGhvZCBuYW1lCi1hbmQgZm9yIHRoZSBtZXRob2QgZGVjbGFyYXRpb24gZXhjbHVkaW5nIGl0cyBqYXZhZG9jIGNvbW1lbnQuPC9saT4KLQotPGxpPgotVXNlIHN0YXJ0IGFuZCBsZW5ndGggYXJyYXlzIHJhdGhlciB0aGFuIHByb2xpZmVyYXRlIEFQSSBtZXRob2RzIGZvciBhZGRpdGlvbmFsCi1zb3VyY2UgcmFuZ2VzLjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotVW5pY29kZSBFc2NhcGVzPC9oMz4KLQotPHVsPgotPGxpPgotT3JpZ2luYWwgc291cmNlIHRleHQgbWlnaHQgY29udGFpbiBVbmljb2RlIGVzY2FwZXMgKEpMUyAzLjIsIDMuMykuPC9saT4KLQotPGxpPgotRS5nLiwgdm9pZFx1MDA0MFx1MDA1YSgpOyBkZWNsYXJlcyBhIG1ldGhvZCBuYW1lZCBaLjwvbGk+Ci0KLTxsaT4KLVNjYW5uZXIgcmVtb3ZlcyBhbGwgVW5pY29kZSBlc2NhcGVzIGFuZCByZXR1cm5zIGEgVW5pY29kZSB0b2tlbiBzdHJlYW0uPC9saT4KLQotPGxpPgotTmV3bHkgY3JlYXRlZCBBU1Qgbm9kZXMgYXJlICJwb3N0IiBVbmljb2RlIGVzY2FwaW5nLjwvbGk+Ci0KLTxsaT4KLU91dHB1dCBvcHRpb25zOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVByZXNlcnZlIGV4aXN0aW5nIFVuaWNvZGUgZXNjYXBlcyAoZGVmYXVsdCk7IHJlbW92ZSBhbGwgZXhpc3RpbmcgVW5pY29kZQotZXNjYXBlcy48L2xpPgotCi08bGk+Ci1EbyBub3QgaW50cm9kdWNlIFVuaWNvZGUgZXNjYXBlcyAoZGVmYXVsdCk7IGludHJvZHVjZSBVbmljb2RlIGVzY2FwZXMgZm9yCi1jaGFyYWN0ZXJzIGluIGEgc3BlY2lmaWVkIHNldCAoZS5nLiwgYWxsIG5vbi1BU0NJSSkuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUluaXRpYWwgaW1wbGVtZW50YXRpb246IHN1cHBvcnQgZGVmYXVsdCBiZWhhdmlvciBvbmx5LjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Db21tZW50czwvaDM+Ci0KLTx1bD4KLTxsaT4KLUNvbW1lbnRzIGFyZSBwcm9ibGVtYXRpYyBmb3IgQVNUczsgdGhlc2UgbGV4aWNhbCBpdGVtcyBhcmUgbm9ybWFsbHkgZmlsdGVyZWQKLW91dCBvZiB0b2tlbiBzdHJlYW0uPC9saT4KLQotPGxpPgotQ29tbWVudHMgYXJlIHNpZ25pZmljYW50IHRvIHVzZXIuPC9saT4KLQotPGxpPgotRWRpdGluZyBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0IHNob3VsZCBnZW5lcmFsbHkgcHJlc2VydmUgZXhpc3RpbmcKLWNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLVNob3VsZCBiZSBhYmxlIHRvIGluY2x1ZGUgY29tbWVudHMgZm9yIG5ld2x5IGNyZWF0ZWQgc3VidHJlZXMuPC9saT4KLQotPGxpPgotQ29weWluZyBhIHN1YnRyZWUgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlciBzaG91bGQgaW5jbHVkZSByZWxldmFudCBjb21tZW50cy48L2xpPgotCi08bGk+Ci1Nb3N0IGNvbW1vbiBmb3JtcyBvZiBjb21tZW50czo8L2xpPgotCi08dWw+Ci08bGk+Ci1KYXZhZG9jIGNvbW1lbnRzIC0gb24gb25lIG9yIG1vcmUgbGluZXMgcHJlY2VkaW5nIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlCi1kZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotQm9pbGVycGxhY2UgY29tbWVudHMgKGNvcHlyaWdodCBub3RpY2VzKSAtIG9uZSBvciBtb3JlIGxpbmVzIHByZWNlZGluZwotdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24sIG9yIGJldHdlZW4gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gYW5kIGZpcnN0IGltcG9ydAotb3IgdHlwZSBkZWNsYXJhdGlvbi48L2xpPgotCi08bGk+Ci1TdGF0ZW1lbnQgY29tbWVudHMgLSBvbmUgb3IgbW9yZSBsaW5lcyBiZXR3ZWVuIHN0YXRlbWVudHMgaW4gYSBibG9jay48L2xpPgotCi08bGk+Ci1TdGF0ZW1lbnQgZW5kLW9mLWxpbmUgY29tbWVudHMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVZBL1NUIGV4cGVyaWVuY2U6IG5vdCB3b3J0aCBiZW5kaW5nIG92ZXIgYmFja3dhcmRzIHRvIGFjY29tb2RhdGUgYWxsIGNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLURldGVybWluZWQgY2xpZW50cyBjYW4gcmVzY2FuIG9yaWdpbmFsIHN0cmluZyB0byBnZXQgYXQgYWxsIGNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLUV4cG9zZSBoaWdoIHZhbHVlIGNvbW1lbnRzOjwvbGk+Ci0KLTxsaT4KLUphdmFkb2MgY29tbWVudHMgLSB0cmVhdCBhcyBhdHRyaWJ1dGUgb2YgdGhlIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlIGRlY2xhcmF0aW9ucy48L2xpPgotCi08dWw+Ci08bGk+Ci1DbGllbnRzIGNhbiBleHRyYWN0IEphdmFkb2MgYXR0cmlidXRlcyAoaW5jbHVkaW5nIEBkZXByZWNhdGVkKS48L2xpPgotCi08bGk+Ci1DbGllbnRzIGNhbiBjcmVhdGUgZGVjbGFyYXRpb25zIHdpdGggSmF2YWRvYy48L2xpPgotPC91bD4KLQotPGxpPgotU3RhdGVtZW50IGNvbW1lbnRzIHdpdGhpbiBibG9ja3M8L2xpPgotCi08dWw+Ci08bGk+Ci1BcHByb2FjaCAxOiBUcmVhdCBhcyBwc2V1ZG8tc3RhdGVtZW50cyB3aXRoIGEgc3BlY2lhbCBBU1Qgbm9kZSB0eXBlLjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVBybzogQ2xpZW50cyBjYW4gaW5jbHVkZSBjb21tZW50cyB3aXRoIGJsb2Nrcy48L2xpPgotCi08bGk+Ci1Db246IE9ubHkgd29ya3MgZm9yIGNvbW1lbnRzIHdpdGhpbiBnZW51aW5lIGJsb2Nrcy4gRS5nLiwgY2FuJ3QgaGFuZGxlPC9saT4KLQotPGxpPgotPHR0PmlmICh0ZXN0KTwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBzaG91bGQgbm90IGhhcHBlbjwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOzwvdHQ+PC9saT4KLQotPGxpPgotV291bGQgd29yayBiZXR0ZXIgaWYgd2Ugd2VyZSB1c2luZyBzdGF0ZW1lbnQgbGlzdHMgaW4gbW9yZSBwbGFjZXMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUFwcHJvYWNoIDI6IFRyZWF0IGFzIGEgcHJvcGVydHkgb2YgZm9sbG93aW5nIHN0YXRtZW50IG5vZGUuPC9saT4KLQotPHVsPgotPGxpPgotUHJvOiBDbGllbnRzIGNhbiBpbmNsdWRlIGNvbW1lbnRzIGJlZm9yZSBhbnkgc3RhdGVtZW50LjwvbGk+Ci0KLTxsaT4KLUNvbjogRG9lcyBub3QgaGFuZGxlIHRyYWlsaW5nIGNvbW1lbnRzIGluIGJsb2Nrcy4gRS5nLiw8L2xpPgotCi08bGk+Ci08dHQ+ezwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOzwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBjYW4ndCByZWFjaCBoZXJlPC90dD48L2xpPgotCi08bGk+Ci08dHQ+fTwvdHQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLVJlY29tbWVuZCBhcHByb2FjaCAyIHNpbmNlIGl0IGNvdmVycyBtb3N0IGNhc2VzLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1Cb2lsZXJwbGF0ZSBjb21tZW50cyB3b3VsZCBub3QgYmUgZXhwb3NlZCwgYnV0IHdvdWxkIGJlIHByZXNlcnZlZCB0aHJvdWdoCi1lZGl0IGFuZCBvdXRwdXQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVdoaXRlc3BhY2U8L2gzPgotCi08dWw+Ci08bGk+Ci1XaGl0ZXNwYWNlIChKTFMgMy42KSBpbmNsdWRlcyBBU0NJSSBTUCwgSFQsIGFuZCBGRiBjaGFyYWN0ZXJzLCBhbmQgbGluZQotdGVybWluYXRvcnMuPC9saT4KLQotPGxpPgotTGlrZSBjb21tZW50cywgd2hpdGVzcGFjZSBpcyBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+Ci0KLTxsaT4KLUVkaXRpbmcgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlIHdoaXRlc3BhY2UuPC9saT4KLQotPGxpPgotV2hpdGVzcGFjZSBmb3IgbmV3bHkgY3JlYXRlZCBzdWJ0cmVlcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB0byBwcm9kdWNlCi1vdXRwdXQgdGhhdCBmb2xsb3dzIGNvbW1vbiBjb252ZW50aW9ucyBhbmQgYmxlbmRzIGluIHdpdGggc3Vycm91bmRpbmcgdGV4dAotKHVzZSB0aGUgc2FtZSBsZWFkaW5nIHdoaXRlc3BhY2UpLjwvbGk+Ci0KLTxsaT4KLUNvcHlpbmcgYSBzdWJ0cmVlIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIgc2hvdWxkIHNob3VsZCBnZW5lcmFsbHkgcHJlc2VydmUKLXdoaXRlc3BhY2UuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUFTVCBQYXJlbnQgQmFja3BvaW50ZXI8L2gzPgotCi08dWw+Ci08bGk+Ci1FYWNoIEFTVCBub2RlIHdpbGwgY2FycnkgYSBiYWNrcG9pbnRlciB0byBpdHMgcGFyZW50IG5vZGUuPC9saT4KLQotPGxpPgotQVNUTm9kZS5nZXRQYXJlbnQoKSByZXR1cm5zIEFTVE5vZGU8L2xpPgotCi08bGk+Ci1UaGlzIHBlcm1pdHMgY2xpZW50cyB0byB0cmF2ZXJzZSBBU1RzIGluIHVwd2FyZCBhcyB3ZWxsIGFzIGRvd253YXJkIGRpcmVjdGlvbi48L2xpPgotCi08bGk+Ci1CaWRpcmVjdGlvbmFsIGxpbmtzIG11c3QgYmUgbWFpbnRhaW5lZCBkdXJpbmcgZWRpdGluZy48L2xpPgotCi08bGk+Ci1EZWxldGlvbiBBUEkgbXVzdCB1bmxpbmsgY2hpbGQgZnJvbSBwYXJlbnQuPC9saT4KLQotPGxpPgotSW5zZXJ0aW9uIEFQSSBtdXN0IGxpbmsgY2hpbGQgdG8gcGFyZW50LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVRvIHByZXNlcnZlIHRyZWVuZXNzLCBhdXRvbWF0aWNhbGx5IGNsb25lIGNoaWxkIHN1YnRyZWUgaWYgY2hpbGQgYWxyZWFkeQotaGFzIHBhcmVudC48L2xpPgotPC91bD4KLQotPGxpPgotUmVwbGFjZSBBUEkgbXVzdCB1bmxpbmsgb2xkIGNoaWxkIGJlZm9yZSBpbnNlcnRpbmcgbmV3IGNoaWxkLjwvbGk+Ci0KLTxsaT4KLVBhcmVudCBiYWNrbGlua3MgbWVhbnMgdGhhdCBoYW5naW5nIG9uIHRvIDxpPmFueTwvaT4gbm9kZSBpbiBhbiBBU1QgaW5zdGFuY2UKLXdpbGwgcHJldmVudCBhbnkgcGFydCBvZiB0aGUgQVNUIGluc3RhbmNlIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLU11bHRpcGxlIEFTVHM8L2gzPgotCi08dWw+Ci08bGk+Ci1NdWxpcGxlIEFTVHMgY2FuIGV4aXN0IHNpZGUgYnkgc2lkZSAoYW5kIEFTVHMgYXJlIHBvdGVudGlhbGx5IGZvciBzYW1lCi1jb21waWxhdGlvbiB1bml0KS48L2xpPgotCi08bGk+Ci1BbGxvdyBpbnNlcnRpb24gb2Ygbm9kZXMgZnJvbSBvbmUgQVNUIGludG8gYW5vdGhlciBBU1QuPC9saT4KLQotPHVsPgotPGxpPgotQXV0b21hdGljYWxseSBjbG9uZXMgY2hpbGQgc3VidHJlZSAoZm9yZ2V0dGluZyBzb3VyY2UgcG9zaXRpb25zIGFuZCBiaW5kaW5nCi1kZWNvcmF0aW9ucykuPC9saT4KLQotPGxpPgotRW5zdXJlIG1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBBU1RzIHJlbWFpbiBjb21wbGV0ZWx5IGluZGVwZW5kZW50LjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlN0cnVjdHVyYWwgRXF1YWxpdHk8L2ZvbnQ+PC9oMz4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlN0cnVjdHVyYWwgZXF1YWxpdHkgcHJlZGljYXRlIG9uIEFTVCBub2Rlcy48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPklzb21vcnBoaWMgc3VidHJlZXMuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5CZWxvbmdpbmcgdG8gc2FtZSBvciBkaWZmZXJlbnQgQVNULjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+Q29uc2lkZXJzIHN0cnVjdHVyYWwgaW5mbyBvbmx5OyBpZ25vcmVzIHNvdXJjZSBwb3NpdGlvbnMsCi1iaW5kaW5ncywgZXRjLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+TmFtZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gImVxdWFscyIgdG8gYXZvaWQgaGF2aW5nCi10byByZWltcGxlbWVudCBoYXNoQ29kZSB0b28uPC9mb250PjwvbGk+Ci08L3VsPgotCi08aDM+Ci1TeW50YWN0aWMgQ29ycmVjdG5lc3Mgb2YgUGFyc2VyLWJ1aWx0IEFTVHM8L2gzPgotCi08dWw+Ci08bGk+Ci1Gb3IgQVNUcyBidWlsdCBieSBhIEphdmEgcGFyc2VyLCB0aGVyZSBhcmUgaXNzdWVzIG9mIHN5bnRhY3RpYyBjb3JyZWN0bmVzcy48L2xpPgotCi08bGk+Ci1TeW50YWN0aWMgY29ycmVjdG5lc3MgaXMganVkZ2VkIGJ5IHRoZSBTeW50YWN0aWMgR3JhbW1hciAoYXMgZGVmaW5lZCBpbgotSkxTMiBzZWN0aW9uIDIuMykuPC9saT4KLQotPGxpPgotSmF2YSBwYXJzZXIgPGI+bXVzdDwvYj4gZ3VhcmFudGVlIHRvIHByb2R1Y2UgYSBmYWl0aGZ1bCBBU1QgZm9yIGFueSBzeW50YWN0aWNhbGx5Ci1jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPGxpPgotSmF2YSBwYXJzZXIgPGI+bWF5PC9iPiBhbHNvIGJ1aWxkIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uCi11bml0cy48L2xpPgotCi08bGk+Ci1Db21wbGljYW50IEphdmEgY29tcGlsZXJzIG11c3QgcmVqZWN0IHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uCi11bml0cy48L2xpPgotCi08bGk+Ci1XaGF0IHByaW5jaXBsZSBkbyB3ZSBhcHBseSB0byBKYXZhIHBhcnNlcnMgYW5kIHRoZSBBU1RzIHRoZXkgcmV0dXJuPzwvbGk+Ci0KLTxsaT4KLVJlYWwgSmF2YSBwYXJzZXJzIGFyZSBpbnZhcmlhYmx5IG1vcmUgbGliZXJhbCB0aGFuIHRoZSBTeW50YWN0aWMgR3JhbW1hciwKLWFuZCByZWx5IG9uIHBvc3QtcGFyc2UgY2hlY2tzIHRvIHJlcG9ydCBlcnJvcnMgZm9yIGFueSBzeW50YWN0aWNhbGx5IGluY29ycmVjdAotY29uc3RydWN0cyB0aGF0IG1ha2VzIGl0IHBhc3QgdGhlIHBhcnNlci48L2xpPgotCi08dWw+Ci08bGk+Ci1FLmcuLCBjb25mbGljdGluZyBtb2RpZmllcnM6IHB1YmxpYyBwcml2YXRlPC9saT4KLQotPGxpPgotRS5nLiwgZmllbGQgZGVjbGFyZWQgd2l0aCBubyBpbml0aWFsaXplciBvY2N1cnMgaW4gYW4gaW50ZXJmYWNlPC9saT4KLQotPGxpPgotRS5nLiwgdm9pZCBmb28oKSBbXTs8L2xpPgotPC91bD4KLQotPGxpPgotSW4gdGhlIGN1cnJlbnQgRWNsaXBzZSBjb21waWxlciwgbWFueSBvZiB0aGVzZSBjaGVja3MgYXJlIGRvbmUgaW4gdGhlIGNvdXJzZQotb2YgdHlwZSBhbmQgbmFtZSByZXNvbHV0aW9uLiBJZiBjbGllbnQgb25seSB3YW50cyBBU1QsIHdlIHdhbnQgdG8gYXZvaWQKLWRvaW5nIGV4cGVuc2l2ZSBuYW1lIGFuZCB0eXBlIGFuYWx5c2lzLjwvbGk+Ci0KLTxsaT4KLUFwcHJvYWNoIDE6IEd1YXJhbnRlZSB0aGF0IG5vIEFTVHMgYXJlIGJ1aWx0IGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdAotY29tcGlsYXRpb24gdW5pdHMuPC9saT4KLQotPHVsPgotPGxpPgotWW91IGRvIG5vdCBnZXQgYW4gQVNUIGF0IGFsbCBmb3IgY29tcGlsYXRpb24gdW5pdHMgd2l0aCBzeW50YXggZXJyb3JzLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiB0cnVzdCBwYXJzZXIgdG8gZGlzdGluZ3Vpc2ggc3ludGFjdGljYWxseSBjb3JyZWN0IGZyb20KLWluY29ycmVjdC48L2xpPgotCi08bGk+Ci1Db246IENsaWVudCBjYW5ub3QgbWFuaXB1bGF0ZSBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbiB1bml0cwotYXQgYWxsLjwvbGk+Ci0KLTxsaT4KLUNvbjogUmVxdWlyZXMgcG9zdC1wYXJzZSBjaGVjayB0byBkZXRlY3QgcmVzaWR1YWwgc3ludGF4IGVycm9ycy48L2xpPgotPC91bD4KLQotPGxpPgotQXBwcm9hY2ggMjogUHJvdmlkZSBubyBndWFyYW50ZWUgYWJvdXQgdGhlIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0Ci1jb21waWxhdGlvbiB1bml0cy48L2xpPgotCi08dWw+Ci08bGk+Ci1Zb3UgbWlnaHQgbm90IGdldCBhIHVzZWZ1bCBBU1QgYXQgYWxsLjwvbGk+Ci0KLTxsaT4KLVlvdSBtaWdodCBnZXQgYW4gQVNUIHRoYXQgaGFkIHBpZWNlcyBtaXNzaW5nOyBlLmcuLCBhIG1hbGZvcm1lZCBtZXRob2QKLXdhcyBleGNpc2VkPC9saT4KLQotPGxpPgotWW91IG1pZ2h0IGdldCBhbiBBU1QgdGhhdCBpcyBpbmNvaGVyZW50IG9yIHNlbGYtY29udHJhZGljdG9yeTsgZS5nLiwgYQotdHJhbnNpZW50IGNsYXNzIT88L2xpPgotCi08bGk+Ci1Qcm86IE1heGltdW0gZmxleGliaWxpdHkgZm9yIGltcGxlbWVudGF0aW9uLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiBnZXQgdXNlZnVsIEFTVHMgZm9yIHNvbWUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgcHJvZ3JhbXMuPC9saT4KLQotPGxpPgotQ29uOiBDbGllbnQgY2Fubm90IHRydXN0IHBhcnNlciB0byBkaXN0aW5ndWlzaCBzeW50YWN0aWNhbGx5IGNvcnJlY3QgZnJvbQotaW5jb3JyZWN0LjwvbGk+Ci08L3VsPgotCi08bGk+Ci1BcHByb2FjaCAzOiBHdWFyYW50ZWUgdGhhdCB0aGUgY2xpZW50IGV4YW1pbmluZyB0aGUgcmVzdWx0aW5nIEFTVCBoYXMgc29tZQotd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0cyBpcyBpbmNvcnJlY3QuPC9saT4KLQotPHVsPgotPGxpPgotUHJpbmljaXBsZTogU3ludGFjdGljIGVycm9ycyBtdXN0IG5vdCBiZSBzdXBwcmVzc2VkLjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlcyBjb3VsZCBjYXJyeSBmbGFncyBpbmRpY2F0aW5nIGNlcnRhaW4gc3ludGF4IHByb2JsZW07IGUuZy4sIGR1cGxpY2F0ZQotbW9kaWZpZXJzIHB1YmxpYyBwdWJsaWM8L2xpPgotCi08bGk+Ci1BIGJpdCBvbiByb290IG5vZGUgY291bGQgc2F5ICJ1bnNwZWNpZmllZCBzeW50YXggZXJyb3JzIi48L2xpPgotCi08bGk+Ci1Db3VsZCBiZSBzcGVjaWFsIEFTVCBub2RlcyB0eXBlcyBpbmRpY2F0aW5nIG1ham9yIHByb2JsZW1zOyBlLmcuLCBib2d1cwotbWV0aG9kIGJvZHk8L2xpPgotCi08bGk+Ci1Db3VsZCBiZSByZXByZXNlbnRhYmxlIGNvbmZpZ3VyYXRpb25zIG9mIEFTVCBub2RlIHR5cGVzIHRoYXQgYXJlIHJlY29nbml6YWJsZQotYXMgc3ludGFjdGlhbGx5IGluY29ycmVjdDsgZS5nLiwgY29uZmxpY3RpbmcgbW9kaWZpZXJzIHB1YmxpYyBwcml2YXRlOwotbWlzc2luZyBmaWVsZCBpbml0aWFsaXplciBpbiBpbnRlcmZhY2U8L2xpPgotCi08bGk+Ci1Qcm86IENsaWVudCBjYW4gdHJ1c3QgcGFyc2VyIHRvIG5vdCBoaWRlIGFueSBzeW50YXggZXJyb3JzIHRoYXQgYXJlIGluCi10aGUgc291cmNlLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiBnZXQgdXNlZnVsIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IHByb2dyYW1zLjwvbGk+Ci0KLTxsaT4KLUNvbjogQ2xpZW50IG11c3QgZG8gZXh0cmEgd29yayB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgc3ludGF4IGVycm9ycy48L2xpPgotCi08bGk+Ci1Db246IEV4dHJhIHdvcmsgdG8gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGlmIG5vIGNsaWVudCByZWFsbHkgY2FyZXMgYWJvdXQKLXRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3ludGFjdGljYWxseSBjb3JyZWN0IGFuZCBpbmNvcnJlY3QuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVRoZSBmaXJzdCBhcHByb2FjaCBpcyB0b28gaGFyc2guIEl0IGlzIG11Y2ggbW9yZSByZWFzb25hYmxlLCBhbmQgaW50ZXJlc3RpbmcsCi10byBiZSBhYmxlIHRvIHdvcmsgd2l0aCBzb21lIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXRzLjwvbGk+Ci0KLTxsaT4KLVRoZSBzZWNvbmQgYXBwcm9hY2ggZmVlbHMgcmVhc29uYWJsZSBpZiBjbGllbnRzIG5ldmVyIGNhcmUgd2hldGhlciB0aGUKLXNvdXJjZSBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3Qgb3Igbm90LjwvbGk+Ci0KLTxsaT4KLVRoZSB0aGlyZCBhcHByb2FjaCBmZWVscyByZWFzb25hYmxlIGlmIHNvbWUgY2xpZW50cyB3b3VsZCBjYXJlIHdoZXRoZXIKLXRoZSBzb3VyY2UgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0IG9yIG5vdC48L2xpPgotCi08bGk+Ci1UaGUgcHJpbmNpcGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcHBvYWNoZXMgaXMgdGhhdAotdGhlIGZvcm1lciBzYW5jdGlvbnMgcXVpZXRseSBzdXBwcmVzc2luZyBzeW50YXggZXJyb3JzIHdoZXJlYXMgdGhlIGxhdHRlcgotcHJlY2x1ZGVzIGl0LjwvbGk+Ci0KLTxsaT4KLVRoZSBuYXR1cmUgb2YgdGhlIEFTVCBub2RlcyBpbmhlcmVudGx5IG1ha2VzIHJvb20gdG8gZXhwcmVzcyBhIHdpZGUgcmFuZ2UKLW9mIHN5bnRhY3RpY2FsbHkgbWFsZm9ybWVkIHByb2dyYW1zLjwvbGk+Ci0KLTxsaT4KLUFuIGV4dHJhIGZsYWcgcGVyIG5vZGUgZm9yICJ1bnNwZWNpZmllZCBzeW50YXggZXJyb3JzIiBzaG91bGQgY292ZXIgdGhlCi1iYXNlcy48L2xpPgotCi08bGk+Ci1UaGUgZXhpc3RpbmcgY29tcGlsZXIncyBBU1RzIGFscmVhZHkgY2FycnkgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGVuYWJsZQotdGhlIGNvbXBpbGVyIHRvIGRvIHRob3JvdWdoIHBvc3QtcGFyc2UgZGV0ZWN0aW5nIG9mIHJlc2lkdWFsIHN5bnRheCBlcnJvcnMuPC9saT4KLQotPGxpPgotVGhlcmVmb3JlIHRoZSB0aGlyZCBhcHByb2FjaCBpcyB3aXRoaW4gZWFzeSByZWFjaC48L2xpPgotCi08bGk+Ci1UaGUgdGhpcmQgYXBwcm9hY2ggZ2l2ZXMgY2xpZW50cyBtb3JlIHRoYW4gdGhlIHNlY29uZCBhcHByb2FjaC48L2xpPgotCi08bGk+Ci1SZWNvbW1lbmRhdGlvbjogd2UgYWRvcHQgdGhlIHRoaXJkIGFwcHJvYWNoLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1TeW50YWN0aWMgQ29ycmVjdG5lc3Mgb2YgTm9uLXBhcnNlci1idWlsdCBBU1RzPC9oMz4KLQotPHVsPgotPGxpPgotQVNUcyBkbyBub3QganVzdCBjb21lIGZyb20gYSBwYXJzZXIuPC9saT4KLQotPHVsPgotPGxpPgotVGhleSBjYW4gYmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2guPC9saT4KLQotPGxpPgotQSBwYXJzZXItYnVpbGQgQVNUIGNhbiBiZSBlZGl0ZWQuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVRoZXNlIEFTVHMgd2lsbCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgdG8gYSBzb3VyY2UgY29tcGlsYXRpb24gdW5pdCAod2h5Ci1lbHNlIHdvdWxkIHRoZXkgZXhpc3Q/KS48L2xpPgotCi08bGk+Ci1XaGF0IGtpbmRzIG9mIHN1cHBvcnQgYW5kIGd1YXJhbnRlZXMgYXJlIGluIHBsYWNlIHRvIGVuc3VyZSB0aGF0IHN1Y2ggYQotc3VpdGFibGUgc291cmNlIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIGdlbmVyYXRlZD88L2xpPgotCi08bGk+Ci1CYXNpYyBndWFyYW50ZWU6IGFueSBBU1QgdGhhdCBjb3VsZCBoYXZlIGNvbWUgZnJvbSBwYXJzaW5nIGEgc3ludGFjdGljYWxseQotY29ycmVjdCBjb21waWxhdGlvbiB1bml0IHdpbGwgc2VyaWFsaXplIHRvIGEgY29tcGlsYXRpb24gdW5pdCB0aGF0IGlzPC9saT4KLQotPHVsPgotPGxpPgotKGEpIHN5bnRhY3RpY2FsbHkgY29ycmVjdDwvbGk+Ci0KLTxsaT4KLShiKSBzdHJvbmdseSBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdC48L2xpPgotCi08bGk+Ci1hbmQgcG9zc2libHkgKGMpIG5vcm1hbGl6ZWQ7IHRoYXQgaXMsIHBhcnNlKHNlcmlhbGl6ZSh4KSkgaXMgaXNvbW9ycGhpYwotdG8geDwvbGk+Ci08L3VsPgotCi08bGk+Ci1UaGVyZSBhcmUgbGlrZWx5IG1hbnkgd2F5cyB0byBnZXQgQVNUcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBzeW50YWN0aWNhbGx5Ci1jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgdXNlIGlsbGVnYWwgaWRlbnRpZmllcnMgKCIxYWJjIiBvciAidHJ5IiBvciAiLy8iKS48L2xpPgotCi08bGk+Ci1FLmcuLCB1c2UgaWxsZWdhbCBtb2RpZmllciBjb21iaW5hdGlvbnMgd2l0aCBtb2RpZmllciBiaXQgbWFza3MuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVBvc3Qtc2NyZWVuaW5nIHRoZSBBU1QgZm9yIHN5bnRhY3RpYyBjb3JyZWN0bmVzcyB3b3VsZCBiZSBtaXNndWlkZWQuPC9saT4KLQotPGxpPgotU2hvdWxkIGp1c3QgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIHRoZSBvYnZpb3VzLCBzeW50YWN0aWNhbGx5IGluY29ycmVjdCwKLWNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPGxpPgotTW9yZSBpbXBvcnRhbnRseTogZW5zdXJlIHNlbWFudGljIGVxdWl2YWxlbmNlLjwvbGk+Ci0KLTxsaT4KLU9wZXJhdG9yIHByZWNlZGVuY2UgY3JlYXRlcyBpc3N1ZXM6PC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgZ2l2ZW4gQVNUIGZvciBleHByZXNzaW9uIDx0dD52MSp2MjwvdHQ+LCByZXBsYWNlIDx0dD52MTwvdHQ+IG5vZGUKLWJ5IGV4cHJlc3Npb24gPHR0PnYxK3YzPC90dD4uPC9saT4KLQotPGxpPgotTmFpdmUgc2VyaWFsaXphdGlvbiB5aWVsZHMgPHR0PnYxK3YzKnYyPC90dD4gd2hpY2ggaXMgbm90IHNlbWFudGljYWxseQotZXF1aXZhbGVudCB0byB0aGUgQVNULjwvbGk+Ci0KLTxsaT4KLVJlc3VsdCBzaG91bGQgYmUgKDx0dD52MSt2MykqdjI8L3R0Pi48L2xpPgotCi08bGk+Ci1QYXJlbnRoZXNlcyBtYXkgbmVlZCB0byBiZSBpbnRyb2R1Y2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1OZXN0ZWQgaWYgc3RhdGVtZW50IGNyZWF0ZXMgaXNzdWVzOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUUuZy4sIGdpdmVuIEFTVCBmb3Igc3RhdGVtZW50IDx0dD5pZiAoYSkgZigpOyBlbHNlIGcoKTs8L3R0PiwgcmVwbGFjZSA8dHQ+ZigpOzwvdHQ+Ci1ieSA8dHQ+aWYgKGIpIGgoKTs8L3R0PjwvbGk+Ci0KLTxsaT4KLU5haXZlIHNlcmlhbGl6YXRpb24geWllbGRzIDx0dD5pZiAoYSkgaWYgKGIpIGgoKTsgZWxzZSBnKCk7PC90dD48L2xpPgotCi08bGk+Ci1SZXN1bHQgc2hvdWxkIGJlIDx0dD5pZiAoYSkgaWYgKGIpIGgoKTsgPGI+ZWxzZSA8L2I+OyBlbHNlIGcoKTs8L3R0PjwvbGk+Ci0KLTxsaT4KLUV4dHJhIHZlcmJpYWdlIG1heSBuZWVkIHRvIGJlIGludHJvZHVjZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uPC9saT4KLTwvdWw+Ci08L3VsPgotCi08aDM+Ci1EZWVwIENvbnN0cnVjdHM8L2gzPgotCi08dWw+Ci08bGk+Ci1Tb21lIHByb2dyYW1zIGludm9sdmUgaW1wb3NzaWJseSBkZWVwIGNvbnN0cnVjdHMuPC9saT4KLQotPGxpPgotTXVsdGktbGluZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucyBhcmUgdGhlIG1haW4gb2ZmZW5kZXIuPC9saT4KLQotPHVsPgotPGxpPgotRm9yIGV4YW1wbGUsIDx0dD4iTGluZSAxXFxuIisiTGluZSAyXFxuIisuLi4rIkxpbmUgNTAwMCI8L3R0PjwvbGk+Ci08L3VsPgotCi08bGk+Ci1SdW50aW1lIHN0YWNrcyBibG93IHdoZW4gcmVjdXJzaW5nIG92ZXIgZGVlcCBBU1RzLjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlIHR5cGVzIHNob3VsZCBiZSBkZXNpZ25lZCB0byBrZWVwIHRyZWVzIHJlYXNvbmFibHkgc2hhbGxvdyBmb3IKLXJlYXNvbmFibHkgdHlwaWNhbCBwcm9ncmFtcy48L2xpPgotCi08bGk+Ci1JbnRyb2R1Y2UgTi1hcnkgb3BlcmF0b3IgZXhwcmVzc2lvbiBub2RlIHR5cGUgdG8gZGVhbCB3aXRoIG11bHRpLWxpbmUgc3RyaW5nCi1jb25jYXRlbmF0aW9uIGV4cHJlc3Npb25zLjwvbGk+Ci0KLTxsaT4KLU4uQi4gQ3VycmVudCBjb21waWxlciBwZXJmb3JtcyBjb21waWxlLXRpbWUgY29uY2F0ZW5hdGlvbnMgZHVyaW5nIHBhcnNlCi1waGFzZSB0byBkZWFsIHdpdGggdGhpcyBwcm9ibGVtLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1FZGl0aW5nIFByb3RvY29sPC9oMz4KLQotPHVsPgotPGxpPgotV2hhdCBnZW5lcmFsIGZvcm0gc2hvdWxkIHRoZSBlZGl0aW5nIEFQSSB0YWtlPzwvbGk+Ci0KLTxsaT4KLVNldHRlcnMgb24gcmVjZWl2ZXIgdG8gbWFuaXB1bGF0ZSBpdHMgY2hpbGRyZW4gKHBhcmVudCBuZXZlciBhZmZlY3RlZCk8L2xpPgotCi08dWw+Ci08bGk+Ci1FLmcuLCB3aGlsZVN0YXRlbWVudC5zZXRDb25kaXRpb24obmV3RXhwcmVzc2lvbik8L2xpPgotCi08bGk+Ci1Vc2UgbnVsbCBmb3Igb3B0aW9uYWwgY2hpbGRyZW48L2xpPgotPC91bD4KLQotPGxpPgotVHJlYXQgbGlzdHMgYXMgYW4gYXJyYXktdmFsdWVkIHByb3BlcnR5LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUUuZy4sIGJsb2NrLmdldFN0YXRlbWVudHMoKSByZXR1cm5zIFN0YXRlbWVudFtdPC9saT4KLQotPGxpPgotRS5nLiwgYmxvY2suc2V0U3RhdGVtZW50cyhTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzKTwvbGk+Ci0KLTxsaT4KLVVzZSBlbXB0eSBsaXN0IGZvciBubyBjaGlsZHJlbiAocmF0aGVyIHRoYW4gbnVsbCk8L2xpPgotPC91bD4KLQotPGxpPgotQWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIGxpc3RzOiB1c2UgQ29sbGVjdGlvbi1saWtlIHByb3RvY29sPC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgYmxvY2suYWRkU3RhdGVtZW50KHBvcywgbmV3Q2hpbGRTdGF0ZW1lbnQpPC9saT4KLQotPGxpPgotRS5nLiwgYmxvY2sucmVtb3ZlU3RhdGVtZW50KG9sZENoaWxkU3RhdGVtZW50KTwvbGk+Ci0KLTxsaT4KLUNvbjogSW5jcmVhc2VkIG51bWJlciBvZiBtZXRob2RzIG9uIEFQSTsgYmFkIHdoZW4gYSBub2RlIHR5cGUgaGFzIHNldmVyYWwKLWxpc3QgcHJvcGVydGllcy48L2xpPgotPC91bD4KLQotPGxpPgotQWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIGRlbGV0ZS9yZXBsYWNlOiB1c2UgcGFyZW50IGJhY2twb2ludGVycyB0byBpbXBsZW1lbnQKLWdlbmVyaWMgZGVsZXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbiB3aGljaCBhZmZlY3QgdGhlIHJlY2VpdmVyJ3MgcmVsYXRpb25zaGlwCi10byBpdHMgcGFyZW50PC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgb2xkQ2hpbGRTdGF0ZW1lbnQuZGVsZXRlKCk8L2xpPgotCi08bGk+Ci1Db246IHNlbWFudGljcyBvZiBkZWxldGlvbiB1Z2x5IHdoZW4gbm9kZSBvY2N1cnMgb3V0c2lkZSBvZiBhbnkgbGlzdDwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotVXNlciBEYXRhIEZpZWxkPC9oMz4KLQotPHVsPgotPGxpPgotRWFjaCBBU1Qgbm9kZSBoYXMgYSB1c2VyIGRhdGEgc2xvdCByZXNlcnZlZCBmb3IgY2xpZW50IHVzZS48L2xpPgotCi08bGk+Ci1BU1ROb2RlLmdldENsaWVudERhdGEoKSByZXR1cm5zIE9iamVjdDwvbGk+Ci0KLTxsaT4KLUFTVE5vZGUuc2V0Q2xpZW50RGF0YShPYmplY3QgZGF0YSk8L2xpPgotCi08bGk+Ci1UaGUgaW5pdGlhbCB2YWx1ZSBpcyBudWxsLjwvbGk+Ci0KLTxsaT4KLUNsaWVudCBtYXkgdXNlIGZvciBkZWNvcmF0aW9ucywgb3Igd2hhdGV2ZXIuPC9saT4KLQotPGxpPgotQVNUIG5vZGVzIGNyZWF0ZWQgYnkgcGFyc2VyIGNhcnJ5IG5vIGRhdGEgaW5pdGlhbGx5LjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlcyBjcmVhdGVkIGV4cGxpY2l0bHkgY2Fycnkgbm8gZGF0YSBpbml0aWFsbHkuPC9saT4KLQotPGxpPgotRXZlbiByZWFkLW9ubHkgQVNUcyBoYXZlIHJlYWQtd3JpdGUgZGF0YSBzbG90cy48L2xpPgotCi08bGk+Ci1DbG9uaW5nIGFuIEFTVCBub2RlIGNyZWF0ZXMgYSBuZXcgbm9kZSAoZG9lcyA8Yj5ub3Q8L2I+IGNvcHkgb3IgY2xvbmUgZGF0YSkuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUxpc3RzIG9mIE1lbWJlcnM8L2gzPgotCi08dWw+Ci08bGk+Ci1MaXN0IG9mIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlIG1lbWJlcnMgb2YgYSB0eXBlIGRlY2xhcmF0aW9uLjwvbGk+Ci0KLTxsaT4KLVRoaXMgbGlzdCBpcyBzeW50YWN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkgaGV0ZXJvZ2Vub3VzLjwvbGk+Ci0KLTxsaT4KLU5vIHN5bnRhY3RpYyBjb25zdHJhaW50cyBvbiBudW1iZXIgYW5kIG9yZGVyLjwvbGk+Ci0KLTxsaT4KLU9yZGVyIGlzIHNpZ25pZmljYW50IHRvIHVzZXIuPC9saT4KLQotPGxpPgotV2l0aGluIGZpZWxkIGRlY2xhcmF0aW9ucywgcmVsYXRpdmUgb3JkZXIgaXMgc2VtYW50aWNhbGx5IHNpZ25pZmljYW50LjwvbGk+Ci0KLTxsaT4KLVN0YW5kYXJkIHByYWN0aWNlczo8L2xpPgotCi08dWw+Ci08bGk+Ci1QbGFjZSBmaWVsZCBkZWNsYXJhdGlvbnMgYmVmb3JlIG1lbWJlciBtZXRob2RzIGFuZCB0eXBlcy48L2xpPgotCi08bGk+Ci1QbGFjZSB0eXBlcyBiZWZvcmUgbWV0aG9kcy48L2xpPgotPC91bD4KLQotPGxpPgotT3B0aW9uICgxKTogZXhwb3NlIHNlcGFyYXRlIGxpc3RzIGZvciBmaWVsZCwgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLVBybzogVGhpcyBpcyB3YXkgaW50ZXJuYWwgQVNUIHdvcmtzLjwvbGk+Ci0KLTxsaT4KLVBybzogQ29udmVuaWVudCBmb3IgY2xpZW50cyB0byBsb2NhdGUgbWVtYmVyIGZpZWxkcywgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLUNvbjogTm90IGZsZXhpYmxlIGZvciBlZGl0aW5nOyBlZGl0aW5nIHdpbGwgbWFuZ2xlIG1lbWJlciBvcmRlci48L2xpPgotCi08bGk+Ci1PcHRpb24gKDIpOiBleHBvc2UgYSBzaW5nbGUgbGlzdCBvZiBtZW1iZXJzPC9saT4KLQotPGxpPgotUHJvOiBwYXJzZXIgZG9lcyBub3Qgbm9ybWFsaXplOyBjbGllbnQgY29udHJvbHMgb3JkZXIgb2YgbWVtYmVycy48L2xpPgotCi08bGk+Ci1Db246IE1vcmUgd29yayBmb3IgY2xpZW50cyB0byBsb2NhdGUgbWVtYmVyIGZpZWxkcywgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLU9wdGlvbiAoMyk6IGV4cG9zZSBhIHNpbmdsZSBsaXN0IG9mIG1lbWJlcnMsIHdpdGggZXh0cmEgZ2V0dGVycyBmb3IgbG9jYXRpbmcKLW1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgotCi08bGk+Ci1Qcm86IENvbWJpbmVzIGFkdmFudGFnZSBvZiAoMikgd2l0aCBjb252ZW5pZW5jZSBvZiAoMSkuPC9saT4KLQotPGxpPgotUmVjb21tZW5kZWQgYXBwcm9hY2g6ICgzKS48L2xpPgotCi08bGk+Ci1Gb3IgY2xhc3MgZGVjbGFyYXRpb25zLCB0cmVhdCBpbml0aWFsaXplcnMgYW5kIGNvbnN0cnVjdG9ycyBhcyBtZW1iZXJzLjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUx1bXAgaW5zdGFuY2UgYW5kIHN0YXRpYyBpbml0aWFsaXplcnMgaW4gd2l0aCBmaWVsZCBkZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotTHVtcCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMgaW4gd2l0aCBtZXRob2QgZGVjbGFyYXRpb25zLjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotU2VyaWFsaXphdGlvbjwvaDM+Ci0KLTx1bD4KLTxsaT4KLUNsaWVudHMgb2YgcmVhZC13cml0ZSBBU1RzIHdpbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2VyaWFsaXplIHRvIGEgSmF2YSBjb21waWxhdGlvbgotdW5pdC48L2xpPgotCi08bGk+Ci1TZXJpYWxpemF0aW9uIHZpYSBzaW1wbGUgQVNUIHRyZWUgd2Fsay48L2xpPgotCi08dWw+Ci08bGk+Ci1TdHJhaWdodGZvcndhcmQuPC9saT4KLQotPGxpPgotSW50cm9kdWNlIGxpbmUgYnJlYWtzIGFuZCB3aGl0ZXNwYWNlIHRvIG1ha2UgaXQgbG9vayBwcmV0dHkuPC9saT4KLQotPGxpPgotT3IgcG9zdC1wcm9jZXNzIGl0IHdpdGggdGhlIEphdmEgZm9ybWF0dGVyLjwvbGk+Ci0KLTxsaT4KLUlmIEFTVCBvcmlnaW5hdGVkIGJ5IHBhcnNpbmcsIHRoZSByZXN1bHQgaXMgbGlrZWx5IHVuYWNjZXB0YWJsZSB0byB1c2VyOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUNvbXBsZXRlbHkgcmVmb3JtYXR0ZWQuPC9saT4KLQotPGxpPgotQ29uc3RydWN0cyBhcmUgbm9ybWFsaXplZC48L2xpPgotCi08bGk+Ci1Tb21lIGNvbW1lbnRzIG1heSBoYXZlIGJlIGxvc3QuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUNvdWxkIGJlIHByb3ZpZGVkIGJ5IEFQSSB0aGF0IG1ha2VzIHVzZSBvZiByZWd1bGFyIEFTVCBBUEkgb25seS48L2xpPgotCi08bGk+Ci1Db3VsZCBiZSB3cml0dGVuIGJ5IGNsaWVudHMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVNlcmlhbGl6YXRpb24gdmlhIHNvdXJjZSByZWNvbnN0cnVjdGlvbi48L2xpPgotCi08dWw+Ci08bGk+Ci1Pbmx5IGFwcGxpY2FibGUgdG8gQVNUcyBpbml0aWFsbHkgY29uc3RydWN0ZWQgYnkgcGFyc2VyLjwvbGk+Ci0KLTxsaT4KLVVzZSBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaW4gbW9kaWZpZWQgQVNUIHRvIHJlY29uc3RydWN0IGNvbXBpbGF0aW9uCi11bml0LjwvbGk+Ci0KLTxsaT4KLVJldGFpbiBwYXNzYWdlcyBvZiBvcmlnaW5hbCB0ZXh0IGNvcnJlc3BvbmRpbmcgdG8gdW5jaGFuZ2VkIEFTVCB0cmVlcy48L2xpPgotCi08bGk+Ci1HZW5lcmF0ZXMgbmV3IHRleHQgb25seSB3aGVyZSByZXF1aXJlZC48L2xpPgotCi08bGk+Ci1Qcm9kdWNlIGEgcmVzdWx0IHRoYXQgYSB1c2VyIHdpbGwgcmVjb2duaXplIGFuZCBhY2NlcHQuPC9saT4KLQotPHVsPgotPGxpPgotUHJlc2VydmUgZm9ybWF0dGluZyB3aGVyZXZlciBwb3NzaWJsZS48L2xpPgotCi08bGk+Ci1QcmVzZXJ2ZSZuYnNwOyBzb3VyY2UgY29uc3RydWN0IG5vcm1hbGl6YXRpb24gd2hlcmV2ZXIgcG9zc2libGUuPC9saT4KLQotPGxpPgotUHJlc2VydmUgYXJiaXRyYXJpbHktcGxhY2VkIGNvbW1lbnRzIHdoZXJldmVyIHBvc3NpYmxlLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1SZXF1aXJlcyByZXRhaW5pbmcgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQsIGFuZCBsaWtlbHkgcmVjb3JkaW5nCi1hZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIG5vZGVzIHRvIGFsbG93IHJlY29uc3RydWN0aW9uLjwvbGk+Ci0KLTxsaT4KLVRoaXMgaXMgdGhlIHdheSB0aGUgY3VycmVudCBKRE9NIGltcGxlbWVudGF0aW9uIHdvcmtzLjwvbGk+Ci0KLTxsaT4KLUNvdWxkIGJlIHByb3ZpZGVkIGJ5IEFQSSB0aGF0IGhhcyBwcml2aWxlZ2VkIGFjY2VzcyB0byBBU1Qgbm9kZXMgYW5kIHBhcnNlci1yZWNvcmRlZAotaW5mb3JtYXRpb24uPC9saT4KLQotPGxpPgotU2hvdWxkIGFsc28gcmV0dXJuIGEgbGlzdCBvZiBlZGl0IGluc3RydWN0aW9ucyBzbyB0aGF0IG1hcmtlcnMgY2FuIGJlIGFkanVzdGVkLAotZXRjLjwvbGk+Ci0KLTxsaT4KLUNsaWVudHMgd291bGQgaGF2ZSBhIGhhcmQgdGltZSBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5SZWNvbW1lbmQgZGVmZXJyaW5nIGltcGxlbWVudGF0aW9uIG9mIHNlcmlhbGl6ZXIKLXRoYXQgZG9lcyBzb3VyY2UgcmVjb25zdHJ1Y3Rpb24uPC9mb250PjwvbGk+Ci0KLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5JbiBpbnRlcmltLCByZWZhY3RvcmluZyBjYW4gYXBwbHkgZWRpdHMgdG8gb3JpZ2luYWwKLWNvbXBpbGF0aW9uIHVuaXQgdGV4dCBkaXJlY3RseS48L2ZvbnQ+PC9saT4KLTwvdWw+Ci08L3VsPgotCi08aDM+Ci1Ob2RlIHR5cGVzPC9oMz4KLVRoZSBBU1Qgbm9kZSB0eXBlcyBhcmUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGdyYW1tYXIgZm9yIHRoZSBKYXZhIGxhbmd1YWdlCi1naXZlbiBpbiB0aGUgSkxTMi4KLTxwPkV2ZXJ5IEFTVCBub2RlIGJlbG9uZ3MgdG8gYSBzaW5nbGUgQVNUIGluc3RhbmNlLiAoSW4gRE9NIHRlcm1pbm9sb2d5LAotdGhlIEFTVCBpcyB0aGUgZG9jdW1lbnQgYW5kIHRoZSBBU1Qgbm9kZXMgYXJlIHRoZSBlbGVtZW50cykuIFRoZSBBU1QgaW5zdGFuY2UKLWNhbiBzZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBub2Rlcy4gTm9kZXMgcG9pbnQgdG8gdGhlaXIgb3duaW5nCi1BU1QgKGZpeGVkIGZvciB0aGUgbm9kZSdzIGxpZmV0aW1lKS4gVGhlIEFTVCBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIHJvb3QKLW5vZGUgKGEgY29tcGlsYXRpb24gdW5pdCkuCi08cD5UaGUgQVNUIG5vZGUgdHlwZXMgZG8gbm90IGRlZmluZSB0aGVpciBvd24gbm90aW9uIG9mIGVxdWFsaXR5OyB0aGV5Ci1qdXN0IGluaGVyaXQgdGhlIG9iamVjdCBpZGVudGl0eSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9iamVjdC4KLTxwPk5vdGU6IEdyYW1tYXIgcnVsZXMgKGluIGNvbW1lbnRzKSBhcmUgZXhwcmVzc2VkIGluIHRoZSBQYXNjYWwtc3R5bGUKLWV4dGVuZGVkIEJORiB1c2VkIGluIDx0dD5zZWN0aW9uIDE4PC90dD4gb2YgSkxTMi4gV2UgdXNlIEMjIHN0eWxlIHByb3BlcnR5Ci1kZWNsYXJhdGlvbnMgYXMgYSBjb252ZW5pZW50IGFiYnJldmlhdGlvbiBmb3IgYSBzdGFuZGFyZCBtYXRjaGVkIHBhaXIgb2YKLWdldCBhbmQgc2V0IG1ldGhvZHMuCi08cD48dHQ+cHVibGljIGNsYXNzIEFTVDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBDb21waWxhdGlvblVuaXQgcm9vdDs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHZvaWQgbG9hZEZyb21Tb3VyY2UoY2hhcltdIHNvdXJjZSk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyB2b2lkIHNldE9wdGlvbnMoLi4uKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNoYXJbXSBzZXJpYWxpemUoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU1ROb2RlPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHByb3RlY3RlZCBBU1ROb2RlKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUIGdldE93bmVyKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnRbXSBzdGFydFBvc2l0aW9uczs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludFtdIGxlbmd0aHM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBib29sZWFuIGlzV2hvbGVMaW5lOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgT2JqZWN0IGNsaWVudERhdGE7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBU1ROb2RlIGdldFBhcmVudCgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi4gb3RoZXIgcHJvdG9jb2wgY29tbW9uIHRvIGFsbCBBU1Qgbm9kZSB0eXBlczwvdHQ+Ci08aDQ+Ci1OYW1lczwvaDQ+Ci1BcyBleHBsYWluZWQgaW4gSkxTMiBzZWN0aW9uIDYuNSwgdGhlIGdyYW1tYXIgZG9lcyBub3QgYWxsb3cgbmFtZXMgdG8gYmUKLXJlc29sdmVkIG1vcmUgZmluZWx5IHRoYW4gdGhlIGZvbGxvd2luZyA2IGNhdGVnb3JpZXMgYnkgc3ludGFjdGljIG1lYW5zCi1hbG9uZToKLTxwPjx0dD5QYWNrYWdlTmFtZTo8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUlkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVBhY2thZ2VOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PlR5cGVOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUGFja2FnZU9yVHlwZU5hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5FeHByZXNzaW9uTmFtZTo8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUlkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUFtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5NZXRob2ROYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotQW1iaWd1b3VzTmFtZSAuIElkZW50aWZpZXI8L3R0PgotPHA+PHR0PlBhY2thZ2VPclR5cGVOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUGFja2FnZU9yVHlwZU5hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5BbWJpZ3VvdXNOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotQW1iaWd1b3VzTmFtZSAuIElkZW50aWZpZXI8L3R0PgotPHA+R2l2ZW4gdGhhdCBuYW1lcyBjYW5ub3QgYmUgcmVzb2x2ZWQgZGVmaW5pdGl2ZWx5IHRvIGEgcGFja2FnZSwgdHlwZSwKLWZpZWxkLCBvciB2YXJpYWJsZSBhdCBBU1Qgbm9kZSBjb25zdHJ1Y3Rpb24gdGltZSwgYW4gb3BlbiBxdWVzdGlvbiBpcyBob3cKLW11Y2ggb2YgdGhlIGNhdGVnb3JpemF0aW9uIHRoYXQgY291bGQgYmUgZG9uZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZQotQVNULiBNb3JlIGNhdGVnb3JpZXMgbWVhbnMgbW9yZSBpbmZvcm1hdGlvbiBmbG93IGZyb20gdGhlIHBhcnNlciB0byB0aGUKLUFTVCBjbGllbnQ7IG9uIHRoZSBvdGhlciBoYW5kLCBhIHZhcmlldHkgb2YgY2F0ZWdvcmllcyBpcyBub3QgbmVjZXNzYXJpbHkKLWNvbnZlbmllbnQgZm9yIGNsaWVudHMuIEZvciBleGFtcGxlLCBpbiA8dHQ+aW1wb3J0IGEuYi5jPC90dD4gdGhlIG5hbWUKLWlzIGEgPHR0PlR5cGVOYW1lPC90dD4gd2hlcmVhcyBpbiA8dHQ+aW1wb3J0IGEuYi5jLio8L3R0PiB0aGUgbmFtZSA8dHQ+YS5iLmM8L3R0PgotaXMgYSA8dHQ+UGFja2FnZU9yVHlwZU5hbWU8L3R0Pi4gSWYgdGhlIG5hbWUgY2F0ZWdvcnkgd2FzIHRvIGJlIHJlZmxlY3RlZAotaW4gdGhlIHR5cGUgb2YgdGhlIEFTVCBub2RlcywgdGhlIGNsaWVudCB3b3VsZCBuZWVkIHRvIGtub3cgdG8gY3JlYXRlIHRoZQotYXBwcm9wcmlhdGUgdHlwZSBvZiBuYW1lIG5vZGVzIHdoZW4gZWRpdGluZyB0aGUgQVNULgotPHA+UHJvcG9zYWw6IFVzZSB0d28gQVNUIG5vZGUgdHlwZXMgZm9yIG5hbWVzOiBzaW1wbGUgbmFtZXMsIGFuZCBxdWFsaWZpZWQKLW5hbWVzLiBRdWFsaWZpZWQgbmFtZXMgYXJlIGV4cHJlc3NlZCByZWN1cnNpdmVseSwgdG8gZmFjaWxpdGF0ZSBjbGllbnRzCi1kaXNjb3ZlcmluZyBob3cgdGhlIHF1YWxpZmllciBwYXJ0IG9mIGEgbmFtZSByZXNvbHZlcy4gVXNlIHRoZXNlIGZvciBldmVyeXRoaW5nCi1idXQgPHR0Pk1ldGhvZE5hbWU8L3R0PjsgZm9yIDx0dD5NZXRob2ROYW1lPC90dD4sIHdoaWNoIGNhbiBhcHBlYXIgb25seQotaW4gYSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLCBzZXBhcmF0ZSB0aGUgc2VsZWN0b3IgaWRlbnRpZmllciBmcm9tCi1hbnkgcHJlY2VkaW5nIHF1YWxpZmllci4KLTxwPihOb3RlOiBUaGUgY3VycmVudCBpbnRlcm5hbCBBU1Qgbm9kZXMgZ28gYmV5b25kIG1ha2luZyB0aGUgc2ltcGxlL3F1YWxpZmllZAotZGlzdGluY3Rpb246IHRoZXkgYWxzbyBoYXZlIHNpbXBsZSAmYW1wOyBxdWFsaWZpZWQgdHlwZSBuYW1lcyAoY2xhc3NlcwotPHR0PlNpbXBsZVR5cGVSZWZlcmVuY2U8L3R0PgotYW5kIDx0dD5RdWFsaWZpZWRUeXBlUmVmZXJlbmNlPC90dD4pIGluIGFkZGl0aW9uYWwgdG8gc2ltcGxlICZhbXA7IHF1YWxpZmllZAotbmFtZWQgKGNsYXNzZXMgPHR0PlNpbXBsZU5hbWVSZWZlcmVuY2U8L3R0PiBhbmQKLTx0dD5RdWFsaWZpZWROYW1lUmVmZXJlbmNlPC90dD4pLikKLTxwPjx0dD4vLyBOYW1lOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1TaW1wbGVOYW1lPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVF1YWxpZmllZE5hbWU8L3R0PgotPGJyPjx0dD4vLyBTaW1wbGVOYW1lOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1JZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8gUXVhbGlmaWVkTmFtZTo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTmFtZSA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU5hbWUgLy8gIm1hcmtlciIgaW50ZXJmYWNlPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZEJpbmRpbmcoKTsmbmJzcDsgLy8KLW9wdGlvbmFsPC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgU2ltcGxlTmFtZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTmFtZSwgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFNpbXBsZU5hbWUoQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gaWRlbnRpZmllcjs8L3R0PgotPHA+PHR0PnB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElOYW1lLCBJRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgUXVhbGlmaWVkTmFtZShBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElOYW1lIHF1YWxpZmllcjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBpZGVudGlmaWVyOzwvdHQ+Ci08aDM+Ci1Db21waWxhdGlvbiBVbml0cyBhbmQgTWFqb3IgRGVjbGFyYXRpb25zPC9oMz4KLTx0dD4vLyBDb21waWxhdGlvblVuaXQ6PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT5wYWNrYWdlPC91PjwvYj4gSWRlbnRpZmllciB7IDxiPjx1Pi48L3U+PC9iPiBJZGVudGlmaWVyIH0gPGI+PHU+OzwvdT48L2I+Jm5ic3A7Ci1dPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXtJbXBvcnREZWNsYXJhdGlvbn08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote1R5cGVEZWNsYXJhdGlvbiB8IDxiPjx1Pjs8L3U+PC9iPn08L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgQVNUTm9kZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQ29tcGlsYXRpb25Vbml0KEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBwYWNrYWdlTmFtZTsgLy8gb3B0aW9uYWw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IEltcG9ydERlY2xhcmF0aW9uW10gaW1wb3J0czs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGVEZWNsYXJhdGlvbltdIHR5cGVzOzwvdHQ+Ci08cD48dHQ+Ly8gSW1wb3J0RGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aW1wb3J0PC91PjwvYj4KLUlkZW50aWZpZXIgeyA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciB9IFsgPGI+PHU+LjwvdT48L2I+Jm5ic3A7IDxiPjx1Pio8L3U+PC9iPiZuYnNwOyZuYnNwOwotXQotPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIGltcG9ydE5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBib29sZWFuIG9uRGVtYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgotPHA+PHR0Pi8vIFR5cGVEZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSA8Yj48dT5jbGFzczwvdT48L2I+IElkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PmV4dGVuZHM8L3U+PC9iPiBUeXBlXTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+aW1wbGVtZW50czwvdT48L2I+IFR5cGUgeyA8Yj48dT4sPC91PjwvYj4gVHlwZX1dPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLTxiPjx1Pns8L3U+PC9iPiB7Q2xhc3NCb2R5RGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj4gfSA8Yj48dT59PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSA8Yj48dT5pbnRlcmZhY2U8L3U+PC9iPiBJZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT5leHRlbmRzPC91PjwvYj4gVHlwZSB7IDxiPjx1Piw8L3U+PC9iPiBUeXBlfV08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotPGI+PHU+ezwvdT48L2I+IHtJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj4gfSA8Yj48dT59PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyBNb2RpZmllcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5wdWJsaWM8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnByb3RlY3RlZDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cHJpdmF0ZTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3RhdGljPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5hYnN0cmFjdDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZmluYWw8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pm5hdGl2ZTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3luY2hyb25pemVkPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50cmFuc2llbnQ8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnZvbGF0aWxlPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zdHJpY3RmcDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8gQ2xhc3NCb2R5RGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLU1ldGhvZERlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUNvbnN0cnVjdG9yRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRmllbGREZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DbGFzc0RlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVR5cGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1Jbml0aWFsaXplcjwvdHQ+Ci08YnI+PHR0Pi8vIEludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTWV0aG9kRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRmllbGREZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1UeXBlRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQsCi1JTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIHN1cGVyY2xhc3M7IC8vIG9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lW10gc3VwZXJJbnRlcmZhY2VzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSU1lbWJlcltdIG1lbWJlcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIGNvbnZlbmllbmNlIG1ldGhvZHM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHM7IC8vIGluY2x1ZGVzCi1jb25zdGFudHM7IGV4Y2x1ZGVzIGluaXRpYWxpemVyczwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIGdldE1ldGhvZHM7Ci0vLyBpbmNsdWRlcyBjb25zdHJ1Y3RvcnM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSVR5cGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KLTxwPjx0dD4vLyBNZXRob2REZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSAoVHlwZSB8IDxiPjx1PnZvaWQ8L3U+PC9iPikgSWRlbnRpZmllciA8Yj48dT4oPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotW0Zvcm1hbFBhcmFtZXRlciB7IDxiPjx1Piw8L3U+PC9iPiBGb3JtYWxQYXJhbWV0ZXJ9XSA8Yj48dT4pPC91PjwvYj4mbmJzcDsKLXs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+dGhyb3dzPC91PjwvYj4gUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdICggTWV0aG9kQm9keSB8IDxiPjx1Pjs8L3U+PC9iPgotKTwvdHQ+Ci08YnI+PHR0Pi8vIENvbnN0cnVjdG9yRGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXtNb2RpZmllcn0gSWRlbnRpZmllciA8Yj48dT4oPC91PjwvYj4gW0Zvcm1hbFBhcmFtZXRlciB7IDxiPjx1Piw8L3U+PC9iPgotRm9ybWFsUGFyYW1ldGVyfV0gPGI+PHU+KTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT50aHJvd3M8L3U+PC9iPiBRdWFsaWZpZWRJZGVudGlmaWVyTGlzdF0gTWV0aG9kQm9keTwvdHQ+Ci08YnI+PHR0Pi8vIEZvcm1hbFBhcmFtZXRlcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PmZpbmFsPC91PjwvYj5dIFR5cGUgSWRlbnRpZmllciB7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn08L3R0PgotPGJyPjx0dD5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUKLWltcGxlbWVudHMgSU1lbWJlcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcm90ZWN0ZWQgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gc2VsZWN0b3I7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBGb3JtYWxQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZVtdIHRocm93bkV4Y2VwdGlvbnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBCbG9jayBib2R5OyAvLyBvcHRpb25hbDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSByZXR1cm5UeXBlOyAvLyBpbmNsdWRlcwotdm9pZDwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Ci08cD48dHQ+Ly8gRmllbGREZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSBUeXBlIElkZW50aWZpZXIgezxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj59IFsgPGI+PHU+PTwvdT48L2I+Ci1FeHByZXNzaW9uXTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci17IDxiPjx1Piw8L3U+PC9iPiBJZGVudGlmaWVyIHs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgotRXhwcmVzc2lvbl0gfTwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJRmllbGRCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KLTxwPjx0dD4vLyBJbml0aWFsaXplcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PnN0YXRpYzwvdT48L2I+XSBCbG9jazwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBmaW5hbCBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJbml0aWFsaXplcihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBCbG9jayBib2R5OzwvdHQ+Ci08cD48dHQ+Ly8gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+ZmluYWw8L3U+PC9iPl0gVHlwZSBJZGVudGlmaWVyIHs8Yj48dT5bXTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgotRXhwcmVzc2lvbiBdPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXsgPGI+PHU+LDwvdT48L2I+IElkZW50aWZpZXIgezxiPjx1PltdPC91PjwvYj59IFsgPGI+PHU+PTwvdT48L2I+IEV4cHJlc3Npb25dCi19IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMKLUlTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gbmFtZTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgdHlwZTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIGluaXRpYWxpemVyOyAvLwotb3B0aW9uYWw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElMb2NhbFZhcmlhYmxlQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Ci08YnI+Jm5ic3A7Ci08aDQ+Ci1UeXBlczwvaDQ+Ci1UaGUgVHlwZSBub2RlICg9IFR5cGVSZWZlcmVuY2UpIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBiYXNlIHR5cGUsCi1hIG5hbWVkIHR5cGUsIG9yIGFuIGFycmF5IHRoZXJlb2YuCi08cD48dHQ+Ly8gVHlwZTo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKEJhc2ljVHlwZSB8IFR5cGVOYW1lICkgezxiPjx1PltdPC91PjwvYj59PC90dD4KLTxicj48dHQ+Ly8gQmFzaWNUeXBlOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJ5dGU8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnNob3J0PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5jaGFyPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5pbnQ8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pmxvbmc8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZsb2F0PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5kb3VibGU8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJvb2xlYW48L3U+PC9iPjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBUeXBlIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlIChBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBiYXNlVHlwZTsgLy8gZWl0aGVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIHR5cGVOYW1lOyAvLyBvcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IGRpbWVuc2lvbnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZFR5cGUoKTs8L3R0PgotPGg0PgotU3RhdGVtZW50czwvaDQ+Ci1UaGVyZSBpcyBhIGRpZmZlcmVudCBBU1Qgbm9kZSB0eXBlIGZvciBlYWNoIGRpZmZlcmVudCBraW5kIG9mIHN0YXRlbWVudC4KLVVzZSBhICJtYXJrZXIiIGludGVyZmFjZSAoPHR0PklTdGF0ZW1lbnQ8L3R0PikgdG8gYnJpbmcgYWxsIGNvbnN0cnVjdHMKLXRoYXQgY2FuIGFwcGVhciB3aXRoaW4gYSBibG9jayAobm9udGVybWluYWwgPHR0PkJsb2NrU3RhdGVtZW50PC90dD4sIHdoaWNoCi1pbmNsdWRlcyBsb2NhbCB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMpLgotPHA+PHR0Pi8vIEJsb2NrOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pns8L3U+PC9iPgotQmxvY2tTdGF0ZW1lbnQgPGI+PHU+fTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8gQmxvY2tTdGF0ZW1lbnQgOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFR5cGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFtJZGVudGlmaWVyCi08Yj48dT46PC91PjwvYj4KLV0gU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Ly9TdGF0ZW1lbnQ6PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmxvY2s8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5pZgotKDwvdT48L2I+RXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gU3RhdGVtZW50IFs8Yj48dT5lbHNlPC91PjwvYj4gU3RhdGVtZW50XTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZvcgotKDwvdT48L2I+IEZvckluaXRPcHQmbmJzcDsgPGI+PHU+OzwvdT48L2I+Jm5ic3A7Jm5ic3A7IFtFeHByZXNzaW9uXQotPGI+PHU+OzwvdT48L2I+Jm5ic3A7Jm5ic3A7Ci1Gb3JVcGRhdGVPcHQgPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PndoaWxlCi0oPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZG88L3U+PC9iPgotU3RhdGVtZW50IDxiPjx1PndoaWxlPC91PjwvYj4gPGI+PHU+KDwvdT48L2I+IEV4cHJlc3Npb24KLTxiPjx1Pik7PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50cnk8L3U+PC9iPgotQmxvY2sgW0NhdGNoZXNdIFsgPGI+PHU+ZmluYWxseTwvdT48L2I+IEJsb2NrIF08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zd2l0Y2gKLSg8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pik8L3U+PC9iPiA8Yj48dT57PC91PjwvYj4gU3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMKLTxiPjx1Pn08L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN5bmNocm9uaXplZAotKDwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IEJsb2NrPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cmV0dXJuPC91PjwvYj4KLVtFeHByZXNzaW9uXSA8Yj48dT47PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50aHJvdzwvdT48L2I+Ci1FeHByZXNzaW9uJm5ic3A7Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJyZWFrPC91PjwvYj4KLVtJZGVudGlmaWVyXSZuYnNwOyA8Yj48dT47PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5jb250aW51ZTwvdT48L2I+Ci1bSWRlbnRpZmllcl0mbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRXhwcmVzc2lvblN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IElkZW50aWZpZXIKLTxiPjx1Pjo8L3U+PC9iPgotU3RhdGVtZW50PC90dD4KLTxicj48dHQ+cHVibGljIGludGVyZmFjZSBJU3RhdGVtZW50Jm5ic3A7IC8vICJtYXJrZXIiIGludGVyZmFjZTwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIEJsb2NrIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEJsb2NrKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSVN0YXRlbWVudFtdIHN0YXRlbWVudHM7PC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIElmU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElmU3RhdGVtZW50KEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gdGVzdDs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElTdGF0ZW1lbnQgdGhlblBhcnQ7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJU3RhdGVtZW50IGVsc2VQYXJ0OyZuYnNwOyAvLwotb3B0aW9uYWw8L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgV2hpbGVTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIERvU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIFRyeVN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIFJldHVyblN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBUaHJvd1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBCcmVha1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBOdWxsU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgQXNzZXJ0U3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxoND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5FeHByZXNzaW9uIFN0YXRlbWVudHM8L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5DZXJ0YWluIHR5cGVzIG9mIGV4cHJlc3Npb25zIGNhbiBhbHNvIGFwcGVhciBhcyBzdGF0ZW1lbnRzLgotVGhlIEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSB3cmFwcyBhbiBleHByZXNzaW9uIHVwIGFzIGEgc3RhdGVtZW50LiBUaGUKLXNvdXJjZSByYW5nZSBmb3IgdGhlIEV4cHJlc3Npb25TdGF0ZW1lbnQgaW5jbHVkZXMgdGhlIHRyYWlsaW5nIHNlbWljb2xvbi48L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjwvZm9udD4KLTxwPjx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+cHVibGljIGNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlCi1pbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L2ZvbnQ+PC90dD4KLTxicj48dHQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgRXhwcmVzc2lvblN0YXRlbWVudChBU1QKLWFzdCk7PC9mb250PjwvdHQ+Ci08YnI+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uCi1leHByZXNzaW9uOzwvZm9udD48L3R0PgotPGg0PgotRXhwcmVzc2lvbnM8L2g0PgotVGhlcmUgaXMgYSBkaWZmZXJlbnQgQVNUIG5vZGUgdHlwZSBmb3IgZWFjaCBkaWZmZXJlbnQga2luZCBvZiBleHByZXNzaW9uLgotVXNlIGEgIm1hcmtlciIgaW50ZXJmYWNlICg8dHQ+SUV4cHJlc3Npb248L3R0PikgdG8gYnJpbmcgYWxsIGNvbnN0cnVjdHMKLXRoYXQgY2FuIGFwcGVhciBhcyBleHByZXNzaW9ucy4KLTxwPihNYW55IGRldGFpbHMgVEJEKS4KLTxwPjx0dD4vLyBFeHByZXNzaW9uOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1JZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotU3RyaW5nTGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1GbG9hdGluZ1BvaW50TGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1Cb29sZWFuTGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DaGFyYWN0ZXJMaXRlcmFsPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVN0cmluZ0xpdGVyYWw8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTnVsbExpdGVyYWw8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKCBUeXBlIHwgPGI+PHU+dm9pZDwvdT48L2I+ICkgPGI+PHU+LjwvdT48L2I+IGNsYXNzPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVsgQ2xhc3NOYW1lIDxiPjx1Pi48L3U+PC9iPiBdIDxiPjx1PnRoaXM8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pig8L3U+PC9iPgotRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWyBFeHByZXNzaW9uIDxiPjx1Pi48L3U+PC9iPiBdIDxiPjx1Pm5ldzwvdT48L2I+IFR5cGUgPGI+PHU+KDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVsgRXhwcmVzc2lvbiB7IDxiPjx1Piw8L3U+PC9iPiBFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj4gWyBDbGFzc0JvZHkKLV08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5zdXBlciAuPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1NZXRob2ROYW1lIDxiPig8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPjx1Piw8L3U+PC9iPiBFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4KLUV4cHJlc3Npb24gfSBdIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5zdXBlciAuPC91PjwvYj4gSWRlbnRpZmllciA8Yj4oPC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gSW5maXhPcGVyYXRvciBFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gPGI+PHU+aW5zdGFuY2VvZjwvdT48L2I+IFR5cGU8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiBQb3N0Zml4T3BlcmF0b3I8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUHJlZml4T3BlcmF0b3IgRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pig8L3U+PC9iPgotVHlwZSA8Yj48dT4pPC91PjwvYj4gRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1FeHByZXNzaW9uIDxiPjx1Pj88L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pjo8L3U+PC9iPiBFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gQXNzaWdubWVudE9wZXJhdG9yIEV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBBcnJheUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+cHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbiZuYnNwOyAvLyAibWFya2VyIiBpbnRlcmZhY2U8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElCaW5kaW5nIHJlc29sdmVkVHlwZSgpOyZuYnNwOyAvLyBvcHRpb25hbDwvdHQ+Ci08cD48dHQ+Ly8gQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotUHJpbWl0aXZlVHlwZSA8Yj48dT5bPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT5dPC91PjwvYj4geyA8Yj48dT5bPC91PjwvYj4KLUV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IH0geyA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IH08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotVHlwZU5hbWUgPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IHsKLTxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uCi08Yj48dT5dPC91PjwvYj4KLX0geyA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IH08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotUHJpbWl0aXZlVHlwZSA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IHsgPGI+PHU+W108L3U+PC9iPiB9IEFycmF5SW5pdGlhbGl6ZXI8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotVHlwZU5hbWUgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB7IDxiPjx1PltdPC91PjwvYj4gfSBBcnJheUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBFeHByZXNzaW9uW10gZGltZW5zaW9uczsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBFeHByZXNzaW9uIGFycmF5SW5pdGlhbGl6ZXI7Ci0vLyBvcHRpb25hbDwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFN0cmluZ0xpdGVyYWwoQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBTdHJpbmcgdmFsdWU7PC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgQ2FzdEV4cHJlc3Npb24gZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIENhc3RFeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gdmFsdWU7PC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgSW5maXhFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJbmZpeEV4cHJlc3Npb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgaW5maXhPcGVyYXRvcjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIGxlZnRPcGVyYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gcmlnaHRPcGVyYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb25bXSBleHRlbmRlZE9wZXJhbmRzOyZuYnNwOwotLy8gTCBvcCBSIG9wIFIyIG9wIFIzLi4uPC90dD4KLTxoMz4KLUJpbmRpbmdzPC9oMz4KLVRoZSAid29ybGQgb2YgYmluZGluZ3MiIGlzIGFuIGludGVncmF0ZWQgcGljdHVyZSBvZiB0aGUgc3RydWN0dXJlIG9mIHRoZQotcHJvZ3JhbSBhcyBzZWVuIGZyb20gdGhlIGNvbXBpbGVyJ3MgcG9pbnQgb2Ygdmlldy4gVGhlIGJpbmRpbmdzIGNvcnJlc3BvbmQKLXRvIG5hbWVkIGVudGl0aWVzIChwYWNrYWdlcywgdHlwZXMsIGZpZWxkcywgbWV0aG9kcywgbG9jYWwgdmFyaWFibGVzKS4KLTxwPkNsaWVudHMgbmF2aWdhdGUgZnJvbSBBU1Qgbm9kZXMgaW50byB0aGUgd29ybGQgb2YgYmluZGluZ3MgdG8gZGlzY292ZXIKLXRoaW5ncyBsaWtlOgotPHVsPgotPGxpPgotdGhlIGVudGl0eSBhbiBpZGVudGlmaWVyIHJlc29sdmVzIHRvPC9saT4KLQotPGxpPgotdGhlIHJlc29sdmVkIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiBub2RlPC9saT4KLQotPGxpPgotdGhlIHJlc29sdmVkIGJpbmRpbmcgb2YgYSBkZWNsYXJhdGlvbiBub2RlPC9saT4KLQotPGxpPgotb3RoZXJzPzwvbGk+Ci08L3VsPgotT25jZSBpbiB0aGUgd29ybGQgb2YgYmluZGluZ3MsIHRoZSBjbGllbnQgY2FuIG5hdmlnYXRlIHRoZSB3ZWIgb2YgYmluZGluZ3M6Ci08dWw+Ci08bGk+Ci1mcm9tIGFycmF5IHR5cGUgdG8gaXRzIGNvbXBvbmVudCB0eXBlLCBhbmQgdmljZSB2ZXJzYTwvbGk+Ci0KLTxsaT4KLWZyb20gZmllbGQgb3IgdmFyaWFibGUgdG8gaXRzIGRlY2xhcmVkIHR5cGU8L2xpPgotCi08bGk+Ci1mcm9tIG1ldGhvZCB0byBpdHMgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZXM8L2xpPgotCi08bGk+Ci1mcm9tIHR5cGUgdG8gaXRzIGNvbnN0cnVjdG9ycyBhbmQgaXRzIGRlY2xhcmVkIG1ldGhvZCwgZmllbGQsIGFuZCB0eXBlCi1tZW1iZXJzPC9saT4KLQotPGxpPgotZnJvbSBjb25zdHJ1Y3RvciwgbWV0aG9kLCBvciBmaWVsZCB0byBpdHMgZGVjbGFyaW5nIHR5cGU8L2xpPgotCi08bGk+Ci1mcm9tIG5lc3RlZCB0eXBlIHRvIGl0cyBlbmNsb3NpbmcgdHlwZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBkZWNsYXJpbmcgcGFja2FnZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBpdHMgc3VwZXJ0eXBlcyAoYnV0LCBzaWduaWZpY2FudGx5LCA8aT5ub3Q8L2k+IHRvIGl0cyBzdWJ0eXBlcyk8L2xpPgotCi08bGk+Ci1kaXJlY3RseSB0byB0aGUgYmluZGluZyBmb3IgYW55IGJhc2UgdHlwZSAoaW50LCBmbG9hdCwgY2hhciwgZXRjLik8L2xpPgotCi08bGk+Ci1kaXJlY3RseSB0byB0aGUgYmluZGluZyBmb3IgYSBoYW5kZnVsIG9mIHdlbGwta25vd24gdHlwZXMgKGphdmEubGFuZy5PYmplY3QsCi1ldGMuKTwvbGk+Ci08L3VsPgotU29tZSBvZiB0aGUgbmF2aWdhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAocXVpdGUgaW50ZW50aW9uYWxseSk6Ci08dWw+Ci08bGk+Ci1mcm9tIHBhY2thZ2UgdG8gaXRzIChrbm93bikgdHlwZXMgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+Ci0KLTxsaT4KLWZyb20gcGFja2FnZSB0byBvbmUgb2YgaXRzIHR5cGVzIGJ5IG5hbWUgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBpdHMgKGtub3duKSBzdWJ0eXBlcyAtIHZlcnkgZXhwZW5zaXZlPC9saT4KLQotPGxpPgotZnJvbSB0eXBlIG9yIG1ldGhvZCB0byB0aGUgbG9jYWwgdHlwZXMgaXQgZW5jbG9zZXMgLSBiaW5kaW5nIGZvciBsb2NhbAotdHlwZXMgYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhvc2Ugd2l0aCB0aGUgZW5jbG9zaW5nIHR5cGUncyBBU1QgaW4gdGhlaXIKLWhhbmQ8L2xpPgotCi08bGk+Ci1mcm9tIG1ldGhvZCB0byB0aGUgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGhpbiBpdCAtIGJpbmRpbmcgZm9yIHZhcmlhYmxlcwotYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhvc2Ugd2l0aCB0aGUgbWV0aG9kJ3MgQVNUIGluIHRoZWlyIGhhbmQ8L2xpPgotPC91bD4KLVRoZXJlIGFyZSBubyBsaW5rcyBmcm9tIHRoZSB3b3JsZCBvZiBiaW5kaW5ncyBiYWNrIHRvIHRoZSB3b3JsZCBvZiBBU1RzLgotPHA+T3RoZXIgdGhpbmdzIGRlYWx0IHdpdGggaW4gdGhlIHdvcmxkIG9mIGJpbmRpbmdzOgotPHVsPgotPGxpPgotc3ludGhldGljIGVudGl0aWVzIHN0ZW1taW5nIGZyb20gZGVmYXVsdCBjb25zdHJ1Y3RvcnMsIGFic3RyYWN0IG1ldGhvZAotY29weS1kb3duIGZyb20gaW50ZXJmYWNlcywgYW5kIGlubmVyIGNsYXNzIGVtdWxhdGlvbjwvbGk+Ci0KLTxsaT4KLW1pc3NpbmcgYmluZGluZ3MgZm9yIGVudGl0aWVzIHRoYXQgYXJlIHJlcXVpcmVkIChtZW50aW9uZWQgYnkgbmFtZSkgYnV0Ci13ZXJlIG5vdCBmb3VuZDwvbGk+Ci0KLTxsaT4KLXR5cGUgaGllcmFjaHkgY2lyY3VsYXJpdGllczwvbGk+Ci0KLTxsaT4KLWludGVybmFsIGluY29uc2lzdGVuY2llczwvbGk+Ci08L3VsPgotT3RoZXIgaXNzdWVzOgotPHVsPgotPGxpPgotQ29tcGlsZS10aW1lLWNvbXB1dGVkIHZhbHVlcyBmb3IgY29uc3RhbnRzIChwdWJsaWMgc3RhdGljIGZpbmFsIGZpZWxkcwotd2l0aCBjb21waWxlLXRpbWUgY29tcHV0YWJsZSB2YWx1ZXMpPC9saT4KLTwvdWw+Ci0KLTxoND4KLUV4aXN0aW5nIEJpbmRpbmcgY2xhc3NlczwvaDQ+Ci1UbyBnaXZlIGFuIGlkZWEgb2YgdGhlIHNjb3BlIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nIGluZnJhc3RydWN0dXJlLCBiZWxvdwotaXMgYSBkdW1wIG9mIHRoZSB0eXBlIGhpZXJhcmNoeSBvZiB0aGUgY29tcGlsZXIncyBiaW5kaW5nIGNsYXNzZXMgZnJvbQotcGFja2FnZSA8dHQ+cmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwPC90dD4uCi08cD48dHQ+cHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBmaW5hbCBjbGFzcyBBcnJheUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGZpbmFsIGNsYXNzIEJhc2VUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MKLVJlZmVyZW5jZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGNsYXNzIE5lc3RlZFR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGZpbmFsIGNsYXNzIE1lbWJlclR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXB1YmxpYyBjbGFzcyBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgUGFja2FnZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1QYWNrYWdlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBMb2NhbFZhcmlhYmxlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGNsYXNzIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgRmllbGRCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgU3ludGhldGljRmllbGRCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgUHJvYmxlbUZpZWxkQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgTWV0aG9kQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgUHJvYmxlbU1ldGhvZEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIEltcG9ydEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1CaW5kaW5nPC90dD4KLTxoND4KLUJpbmRpbmcgQVBJPC9oND4KLVRoZSBleGlzdGluZyBiaW5kaW5nIGNsYXNzZXMgYXJlIG5vdCBpbW1lZGlhdGVseSBzdWl0YWJsZSBmb3IgZXhwb3NpbmcKLWFzIGEgYmluZGluZyBBUEkuCi08cD5Ib3dldmVyLCB0aGUgSmF2YSBidWlsZGVyIGRvZXMgaGF2ZSBhbiBBUEkgZm9yIHRoZSBidWlsdCAiaW1hZ2UiLCBpbgotcGFja2FnZSA8dHQ+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjwvdHQ+LiAoVGhpcyBBUEkgaXMgYQotaG9sZC1vdmVyIGZyb20gTGVhcGZyb2cgZXJhLCBhbmQgaXMgbm90IGV4cG9zZWQgaW4gdGhlIEVjbGlwc2UgY29kZSBiYXNlKS4KLVRoaXMgQVBJIHdhcyBkZXNpZ25lZCB0byBleHBvc2UgdGhlIHNhbWUga2luZCBvZiBpbnRlZ3JhdGVkIHBpY3R1cmUgb2YKLXRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2dyYW0gYXMgc2VlbiBmcm9tIHRoZSBjb21waWxlcidzIHBvaW50IG9mIHZpZXcuCi1UaGlzIEFQSSBoYXMgYSBkZXRhaWxlZCBzcGVjaWZpY2F0aW9uIHRoYXQgZG9lcyBub3QgZXhwb3NlIGltcGxlbWVudGF0aW9uCi1kZXRhaWxzLCBzbyB0aGUgcHJvcG9zYWwgaXMgdG8gdXNlIGl0IGFzIHRoZSBiYXNpcyBmb3IgdGhlIG5ldyBiaW5kaW5nCi1BUEkuCi08cD5SZS1wdXJwb3NpbmcgdGhpcyBBUEkgd291bGQgZW50YWlsOgotPHVsPgotPGxpPgotaW50cm9kdWNpbmcgZW50aXRpZXMgZm9yIGxvY2FsIHZhcmlhYmxlczwvbGk+Ci0KLTxsaT4KLXJlbW92aW5nIHByb3RvY29sIGZvciBuYXZpZ2F0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIChlLmcuLCBmcm9tIHBhY2thZ2UKLXRvIGl0cyBrbm93biB0eXBlcyk8L2xpPgotCi08bGk+Ci1yZW1vdmluZyB1bm5lZWRlZCBwcm90b2NvbDsgaW5jbHVkaW5nIHN0YXRlcywgbm9uLXN0YXRlLXNwZWNpZmljIGhhbmRsZXMsCi1kZWx0YXMsIHJlcG9ydCBjYXJkcywgZGVwZW5kZW5jeSBncmFwaCwgcGFja2FnZSByZWZlcmVuY2VzPC9saT4KLTwvdWw+Ci1CZWxvdyBpcyBhIGR1bXAgb2YgdGhlIHJlbGV2YW50IGludGVyZmFjZXMgZnJvbSBwYWNrYWdlIDx0dD5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyPC90dD4uCi1Vbm5lY2Vzc2FyeSBwcm90b2NvbCBoYXMgYmVlbiBvbWl0dGVkLiAoTm90ZSB0aGF0IE5vdFByZXNlbnRFeGNlcHRpb24gaXMKLWFuIHVuY2hlY2tlZCBleGNlcHRpb24sIGFuZCB3b3VsZCBub3QgYmUgcmVxdWlyZWQuKQotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgS19KQVZBX0lNQUdFID0gMTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9QQUNLQUdFID0gMjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9UWVBFID0gMzs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9GSUVMRCA9IDQ7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfTUVUSE9EID0gNTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9DT05TVFJVQ1RPUiA9IDY7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgaGFzaENvZGUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0ZpY3Rpb25hbCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQga2luZCgpOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJTWVtYmVyIGV4dGVuZHMgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXREZWNsYXJpbmdDbGFzcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgZ2V0TW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNCaW5hcnkoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJUGFja2FnZSBleHRlbmRzIElIYW5kbGU8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldENsYXNzSGFuZGxlKFN0cmluZyBuYW1lKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1VubmFtZWQoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRBcnJheUhhbmRsZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRDb21wb25lbnRUeXBlKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckhhbmRsZShJVHlwZVtdIHBhcmFtZXRlclR5cGVzKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXREZWNsYXJlZENsYXNzZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSUNvbnN0cnVjdG9yW10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MKLU5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElGaWVsZFtdIGdldERlY2xhcmVkRmllbGRzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElNZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldERlY2xhcmVkTW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXREZWNsYXJlZE5hbWUoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSUZpZWxkIGdldEZpZWxkSGFuZGxlKFN0cmluZyBuYW1lKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRJbnRlcmZhY2VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElNZXRob2QgZ2V0TWV0aG9kSGFuZGxlKFN0cmluZyBuYW1lLCBJVHlwZVtdCi1wYXJhbWV0ZXJUeXBlcyk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXRNb2RpZmllcnMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVBhY2thZ2UgZ2V0UGFja2FnZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRTdXBlcmNsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0FycmF5KCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNCaW5hcnkoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0NsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNJbm5lckNsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0xvY2FsKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQYWNrYWdlTWVtYmVyKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmltaXRpdmUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzVG9wTGV2ZWwoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZCBleHRlbmRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRSZXR1cm5UeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJ1Y3RvciBleHRlbmRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJRmllbGQgZXh0ZW5kcyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxwPkluIHRoaXMgdmVpbiwgdGhlIGludGVyZmFjZSBmb3IgbG9jYWwgdmFyaWFibGVzIHdvdWxkIGxvb2sgc29tZXRoaW5nCi1saWtlOgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVZhcmlhYmxlIGV4dGVuZHMgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0TmFtZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzU3ludGhldGljKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldFR5cGUoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgotPHA+QWxzbyB3aWxsIG5lZWQgdG8gYWRkOgotPHVsPgotPGxpPgotUHNldWRvLWJpbmRpbmdzIGZvciBiYXNlIHR5cGVzOiBib29sZWFuLCBpbnQsIGZsb2F0LCBldGMuPC9saT4KLQotPGxpPgotQWNjZXNzIHRvIHdlbGwta25vd24gamF2YS5sYW5nIGJpbmRpbmdzOiBPYmplY3QsIFN0cmluZywgVGhyb3dhYmxlLCBFeGNlcHRpb24sCi1SdW50aW1lRXhjZXB0aW9uLCBFcnJvciwgQ2xhc3MuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLURvY3VtZW50IEhpc3Rvcnk8L2gzPgotMTg6MzAgVGh1cnNkYXkgU2VwdGVtYmVyIDI3LCAyMDAxIC0gaW5jb3Jwb3JhdGVkIGZpcnN0IHJvdW5kIGNvbW1lbnRzIGZyb20KLVBNIGFuZCBEQi4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+MTA6NDUgTW9uZGF5IE9jdG9iZXIgMSwgMjAwMSAtIGluY29ycG9yYXRlZCBjb21tZW50cwotZnJvbSBEQi48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjEwOjQ1IFR1ZXNkYXkgT2N0b2JlciAyLCAyMDAxIC0gY2xhcmlmeSBoYW5kaW5nCi1vZiBFeHByZXNzaW9uU3RhdGVtZW50LjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzMzNjZGRiI+MTQ6MDAgRnJpZGF5IE9jdG9iZXIgMjYsIDIwMDEgLSBhZGQgc3VidHJlZSBzdHJ1Y3R1cmFsCi1lcXVhbGl0eS48L2ZvbnQ+Ci08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvZXhhbXBsZS1hc3QudHh0IGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2V4YW1wbGUtYXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3MTRmYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2RvbSBhc3QvZXhhbXBsZS1hc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLUV4YW1wbGUgQVNUCi09PT09PT09PT09PQotCi1UaGUgSmF2YSBwcm9ncmFtIHNob3duIGluIHNvdXJjZSBmb3JtIGZpcnN0IGlzIGZvbGxvd2VkIGJ5IGEgcmVwcmVzZW50YXRpb24KLW9mIG9mIGl0cyBBU1QuCi0KLT09PT09PT09PT09PT09PT0KLXBhY2thZ2UgY29tLmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEhlbGxvV29ybGQgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIgKyAiIHdvcmxkIik7Ci0JfQotfQotPT09PT09PT09PT09PT09PQotPENvbXBpbGF0aW9uVW5pdAotCXBhY2thZ2U6Ci0JPFBhY2thZ2VEZWNsYXJhdGlvbgotCQluYW1lOgotCQk8UXVhbGlmaWVkTmFtZQotCQkJcXVhbGlmaWVyOiA8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiY29tIj4KLQkJCW5hbWU6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJleGFtcGxlIj4KLQkJPgotCT4KLQlpbXBvcnRzOgotCQlbCi0JCTxJbXBvcnREZWNsYXJhdGlvbgotCQkJbmFtZToKLQkJCQk8UXVhbGlmaWVkTmFtZQotCQkJCQlxdWFsaWZpZXI6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJqYXZhIj4KLQkJCQkJbmFtZTogPFNpbXBsZU5hbWUgaWRlbnRpZmllcjogInV0aWwiPgotCQkJCT4KLQkJCWlzT25EZW1hbmQ6IHRydWUKLQkJPgotCQldCi0JdHlwZXM6Ci0JCVsKLQkJPFR5cGVEZWNsYXJhdGlvbgotCQkJaXNJbnRlcmZhY2U6IGZhbHNlCi0JCQltb2RpZmllcnM6IElNb2RpZmllci5QVUJMSUMKLQkJCW5hbWU6Ci0JCQkJPFNpbXBsZU5hbWUgaWRlbnRpZmllcjogIkhlbGxvV29ybGQiPgotCQkJc3VwZXJjbGFzczogbnVsbAotCQkJc3VwZXJJbnRlcmZhY2VzOiBbXQotCQkJYm9keURlY2xhcmF0aW9uczoKLQkJCQlbCi0JCQkJPE1ldGhvZERlY2xhcmF0aW9uCi0JCQkJCWlzQ29uc3RydWN0b3I6IGZhbHNlCi0JCQkJCW1vZGlmaWVyczogSU1vZGlmaWVyLlBVQkxJQyB8IElNb2RpZmllci5TVEFUSUMKLQkJCQkJc2VsZWN0b3I6IDxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJtYWluIj4KLQkJCQkJcmV0dXJuVHlwZToKLQkJCQkJCTxQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGVDb2RlOiBQcmltaXRpdmVUeXBlLlZPSUQ+Ci0JCQkJCXBhcmFtZXRlcnM6Ci0JCQkJCQlbCi0JCQkJCQk8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgotCQkJCQkJCW1vZGlmaWVyczogSU1vZGlmaWVyLk5PTkUKLQkJCQkJCQl0eXBlOgotCQkJCQkJCQk8QXJyYXlUeXBlCi0JCQkJCQkJCQljb21wb25lbnRUeXBlOgotCQkJCQkJCQkJCTxTaW1wbGVUeXBlCi0JCQkJCQkJCQkJCW5hbWU6Ci0JCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiU3RyaW5nIj4KLQkJCQkJCQkJCQk+Ci0JCQkJCQkJCQk+Ci0JCQkJCQkJCT4KLQkJCQkJCQluYW1lOgotCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiYXJncyI+Ci0JCQkJCQkJaW5pdGlhbGl6ZXI6IG51bGwKLQkJCQkJCT4KLQkJCQkJCV0KLQkJCQkJdGhyb3duRXhjZXB0aW9uczogW10KLQkJCQkJYm9keToKLQkJCQkJCTxCbG9jawotCQkJCQkJCXN0YXRlbWVudHM6Ci0JCQkJCQkJCVsKLQkJCQkJCQkJPEV4cHJlc3Npb25TdGF0ZW1lbnQKLQkJCQkJCQkJCWV4cHJlc3Npb246Ci0JCQkJCQkJCQkJPE1ldGhvZEludm9jYXRpb24KLQkJCQkJCQkJCQkJZXhwcmVzc2lvbjoKLQkJCQkJCQkJCQkJCTxRdWFsaWZpZWROYW1lCi0JCQkJCQkJCQkJCQkJcXVhbGlmaWVyOgotCQkJCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAiU3lzdGVtIj4KLQkJCQkJCQkJCQkJCQluYW1lOgotCQkJCQkJCQkJCQkJCQk8U2ltcGxlTmFtZSBpZGVudGlmaWVyOiAib3V0Ij4KLQkJCQkJCQkJCQkJCT4KLQkJCQkJCQkJCQkJbmFtZToKLQkJCQkJCQkJCQkJCTxTaW1wbGVOYW1lIGlkZW50aWZpZXI6ICJwcmludGxuIj4KLQkJCQkJCQkJCQkJYXJndW1lbnRzOgotCQkJCQkJCQkJCQkJWwotCQkJCQkJCQkJCQkJPEluZml4RXhwcmVzc2lvbgotCQkJCQkJCQkJCQkJCW9wZXJhdG9yOiBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUwotCQkJCQkJCQkJCQkJCWxlZnRPcGVyYW5kOgotCQkJCQkJCQkJCQkJCQk8U3RyaW5nTGl0ZXJhbCBlc2NhcGVkVmFsdWU6ICJcIkhlbGxvXCIiPgotCQkJCQkJCQkJCQkJCXJpZ2h0T3BlcmFuZDoKLQkJCQkJCQkJCQkJCQkJPFN0cmluZ0xpdGVyYWwgZXNjYXBlZFZhbHVlOiAiXCIgd29ybGRcIiI+Ci0JCQkJCQkJCQkJCQkJZXh0ZW5kZWRPcGVyYW5kczogW10KLQkJCQkJCQkJCQkJCT4KLQkJCQkJCQkJCQkJCV0KLQkJCQkJCQkJCQk+Ci0JCQkJCQkJCQkJXQotCQkJCQkJCQk+Ci0JCQkJCQkJCV0KLQkJCQkJCT4KLQkJCQk+Ci0JCQkJXQotCQldCi0JCi0JCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZG9tIGFzdC9rbm93UHJvYmxlbXMudHh0IGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2tub3dQcm9ibGVtcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmE2NjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9kb20gYXN0L2tub3dQcm9ibGVtcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS0gc2V0TGVhZGluZ0NvbW1lbnQgaXMgYSBwcm9ibGVtLiBUaGUgcGFyc2VyIGRvZXNuJ3Qgc3RvcmUgdGhlIGNvbW1lbnQKLQotVE9ETzoKLQkKLWdldERlY2xhcmVkTW9kaWZpZXJzKCkKLQotY2hlY2sgdGhhdCB3ZSBmaWx0ZXIgb3V0IHN5bnRoZXRpYyBtZXRob2RzLCBmaWVsZHMgYW5kIHBhcmFtZXRlcnMuCi0KLVNpbXBsZVR5cGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZWxlbWVudCBkZWx0YXMvamF2YS1lbGVtZW50LWRlbHRhcy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9lbGVtZW50IGRlbHRhcy9qYXZhLWVsZW1lbnQtZGVsdGFzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjYwZDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9lbGVtZW50IGRlbHRhcy9qYXZhLWVsZW1lbnQtZGVsdGFzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc1IFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5KRFQgLSBKYXZhIEVsZW1lbnQgRGVsdGFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci1KYXZhIEVsZW1lbnQgRGVsdGFzPC9oMj4KLUxhc3QgcmV2aXNlZCAxMjowMCBUaHVyc2RheSBTZXB0ZW1iZXIgNiwgMjAwMQotPHA+T3JpZ2luYWwgd29yayBpdGVtOiAiSUphdmFFbGVtZW50RGVsdGEgc2hvdWxkIGNhcnJ5IGluZm9ybWF0aW9uIGFib3V0Ci1tYXJrZXIgY2hhbmdlcyAoUHJvYmxlbU1hcmtlcnMpLiIKLTxoMz4KLU1hcmtlcnMgYW5kIEphdmEgRWxlbWVudHM8L2gzPgotVGhlIHdvcmtzcGFjZSBhbGxvd3MgbWFya2VycyB0byBiZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2VzLiBUaGUgSmF2YQotY29tcGlsZXIgYXNzb2NpYXRlcyBKYXZhIHByb2JsZW0gbWFya2VycyB3aXRoIEphdmEgc291cmNlIGZpbGVzOyB0aGVzZQotbWFya2VycyBsb2NhdGUgdGhlIGVycm9yIHdpdGhpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBieSBzb3VyY2UgY2hhcmFjdGVyCi1wb3NpdGlvbi4KLTxwPlRoZSBKYXZhIG1vZGVsIGRvZXMgbm90IGRpcmVjdGx5IHN1cHBvcnQgbWFya2VycyBvbiBKYXZhIGVsZW1lbnRzLiBJdAotZG9lcyBwcm92aWRlIGEgbWVhbnMgKDx0dD5JQ29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnRBdDwvdHQ+KSBmb3IgbWFwcGluZwotZnJvbSBhIHNvdXJjZSBjaGFyYWN0ZXIgcG9zaXRpb24gd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdCByZXNvdXJjZSB0bwotdGhlIG5lYXJlc3QgZW5jbG9zaW5nIEphdmEgZWxlbWVudC4gU2luY2UgYWxsIEphdmEgcHJvYmxlbSBtYXJrZXJzIGNhcnJ5Ci1hIHNvdXJjZSBjaGFyYWN0ZXIgcG9zaXRpb24sIGFueSBKYXZhIHByb2JsZW0gbWFya2VyIGNhbiBiZSBtYXBwZWQgdG8gdGhlCi1uZWFyZXN0IGVuY2xvc2luZyBKYXZhIGVsZW1lbnQuIEluIG1vc3QgY2FzZXMsIHRoaXMgZWxlbWVudCB3aWxsIGJlIGEgZmluZS1ncmFpbmVkCi1KYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byBhIGRlY2xhcmF0aW9uIG9mIGEgSmF2YSBtZXRob2QsIGZpZWxkLCB0eXBlLAotb3IgaW1wb3J0LiBJbiB0aGUgd29yc3QgY2FzZSwgaXQgbWFwcyB0byB0aGUgY29tcGlsYXRpb24gdW5pdCBlbGVtZW50IGl0c2VsZi4KLVRodXMgaXQgaXMgYWx3YXlzIHBvc3NpYmxlIGluIHByaW5jaXBsZSB0byBhc3NvY2lhdGUgbWFya2VycyB3aXRoIEphdmEKLWVsZW1lbnRzLgotPHA+VGhlIEphdmEgVUkgdmlzdWFsbHkgYW5ub3RhdGVzIEphdmEgZWxlbWVudHMgdGhhdCBoYXZlIHByb2JsZW1zICh3aXRoCi1hIHJlZCBYKS4KLTxwPlRoZSBjb3N0IG9mIG1hcHBpbmcgZnJvbSBhIG1hcmtlciBwb3NpdGlvbiB0byBhIGZpbmUtZ3JhaW5lZCBKYXZhIGVsZW1lbnQKLXJlcXVpcmVzIG9wZW5pbmcgKGFuZCBwYXJzaW5nKSB0aGUgY29tcGlsYXRpb24gdW5pdC4gT25jZSBvcGVuZWQsIGFkZGl0aW9uYWwKLW1hcmtlcnMgd2l0aGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIG1hcHBlZCB3aXRoIG5lZ2xpZ2libGUKLWFkZGl0aW9uYWwgY29zdC4KLTxoMz4KLUphdmEgRWxlbWVudCBEZWx0YXM8L2gzPgotVW5saWtlIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YXMsIEphdmEgZWxlbWVudCBkZWx0YXMgZG8gbm90IGN1cnJlbnRseQotaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCBtYXJrZXIgY2hhbmdlcy4KLTxwPlRoZSBKYXZhIFVJIG5lZWRzIHRvIG1haW50YWluIHRoZSB2aXN1YWwgYW5ub3RhdGlvbnMgb24gSmF2YSBlbGVtZW50cwotdGhhdCBoYXZlIHByb2JsZW1zLgotPHA+VGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIEphdmEgZWxlbWVudCBkZWx0YXMgaXNzdWVkOgotPG9sPgotPGxpPgotQnkgdGhlIEphdmEgbW9kZWwgd2hlbiA8dHQ+SVdvcmtpbmdDb3B5LmNvbW1pdDwvdHQ+IGlzIGNhbGxlZCB0byBzYXZlIGEKLWNvbXBpbGF0aW9uIHVuaXQgd29ya2luZyBjb3B5LjwvbGk+Ci0KLTxsaT4KLUJ5IHRoZSBKYXZhIG1vZGVsIHdoZW4gPHR0PklXb3JraW5nQ29weS5yZWNvbmNpbGU8L3R0PiBpcyBjYWxsZWQgZHVyaW5nCi1lZGl0aW5nLjwvbGk+Ci0KLTxsaT4KLUJ5IHRoZSBKYXZhIG1vZGVsIGluIHJlc3BvbnNlIHRvIG5vdGlmaWNhdGlvbiBvZiBhIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YQotYWZmZWN0aW5nIGEgY29tcGlsYXRpb24gdW5pdCByZXNvdXJjZS48L2xpPgotPC9vbD4KLVRoZSBmaXJzdCB0d28ga2luZHMgb2YgSmF2YSBlbGVtZW50IGRlbHRhIGFyZSBhbHdheXMgaXNzdWVkIGFnYWluc3QgZmluZS1ncmFpbmVkCi1KYXZhIGVsZW1lbnRzLiBUaGUgcHJldmlvdXMgZmluZS1ncmFpbmVkIHN0cnVjdHVyZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotaXMgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgZmluZS1ncmFpbmVkIHN0cnVjdHVyZS4gVGhlc2UgZGVsdGFzIGFyZSByZWNvZ25pemFibGUKLWFzIGtpbmQgPHR0PkNIQU5HRUQ8L3R0PiBhdCB0aGUgY29tcGlsYXRpb24gdW5pdCBsZXZlbCB3aXRoIDx0dD5GX0NISUxEUkVOPC90dD4KLWZsYWcgc2V0IGFuZCA8dHQ+Rl9DT05URU5UPC90dD4gZmxhZyA8aT5ub3Q8L2k+IHNldC4KLTxwPlRoZSBsYXN0IGtpbmQgb2YgSmF2YSBlbGVtZW50IGRlbHRhIGlzIG5ldmVyIGZpbmUtZ3JhaW5lZDsgaXQgZ29lcyBubwotZmluZXIgdGhhbiB0aGUgY29tcGlsYXRpb24gdW5pdCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBmaW5lLWdyYWluZWQKLXN0cnVjdHVyZSBvZiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGF2YWlsYWJsZQotKHRoZSBKYXZhIG1vZGVsIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgYSByZWNvcmQgb2YgdGhlIHByZXZpb3VzIHN0cnVjdHVyZQotKGFsdGhvdWdoIGl0IDxpPm1pZ2h0IDwvaT5iZSBpbiBhbiBpbnRlcm5hbCBjYWNoZSksIGFuZCBjYW5ub3QgY29tcHV0ZQotaXQgc2luY2UgaXQgZG9lcyBub3QgYSBjb3B5IG9mIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCkuCi1UaGVzZSBkZWx0YXMgYXJlIHJlY29nbml6YWJsZSBhcyBraW5kIDx0dD5DSEFOR0VEPC90dD4gYXQgdGhlIGNvbXBpbGF0aW9uCi11bml0IGxldmVsIHdpdGggPHR0PkZfQ0hJTERSRU48L3R0PiBmbGFnIDxpPm5vdCA8L2k+c2V0IGFuZCB3aXRoIDx0dD5GX0NPTlRFTlQ8L3R0PgotZmxhZyBzZXQuCi08aDM+Ci1NYXJrZXJzIGFuZCBKYXZhIEVsZW1lbnQgRGVsdGFzPC9oMz4KLUphdmEgcHJvYmxlbXMgbWFya2VycyBvbiBKYXZhIGNvbXBpbGF0aW9uIHVuaXRzIG9yaWdpbmF0ZSB3aGVuIHRoZSBKYXZhCi1idWlsZGVyIGlzIGNhbGxlZC4gVGhlc2UgbWFya2VycyBhcmUgYXNzb2NpYXRlZCB3aXRoIEphdmEgY29tcGlsYXRpb24gdW5pdAotZmlsZXMsIGFuZCBjb21lIHRvIHRoZSBhdHRlbnRpb24gb2YgdGhlIEphdmEgbW9kZWwgdmlhIGEgcHJvYmxlbSBkZWx0YQotYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSBkZWx0YSB0aGF0IGZvbGxvd3MgdGhlIGJ1aWxkLiBUaGUgSmF2YSBidWlsZGVyCi1vbmx5IGRlbGV0ZXMgb3IgYWRkcyBKYXZhIHByb2JsZW0gbWFya2VyczsgaXQgbmV2ZXIgY2hhbmdlcyBleGlzdGluZyBvbmVzLgotVGhlIEphdmEgYnVpbGRlciBkb2VzIG5vdCBkZWNvcmF0ZSBKYXZhIHByb2JsZW0gbWFya2VycyB3aXRoIGluZm9ybWF0aW9uCi1vdGhlciB0aGFuIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHBvc2l0aW9uLgotPHA+PHR0PihJV29ya2luZ0NvcHkucmVjb25jaWxlPC90dD4gYWxzbyByZXR1cm5zIGEgc2V0IG9mIHRyYW5pc2VudCBtYXJrZXJzLikKLTxwPldoZW4gdGhlIHVzZXIgb3BlbnMgYSBjb21waWxhdGlvbiB1bml0LCB0aGUgSmF2YSBlZGl0b3IgY3JlYXRlcyBhbmQKLWxvY2F0ZXMgdmlzdWFsIG1hcmtlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgSmF2YSBwcm9ibGVtIG1hcmtlcnMuIFRoZXNlCi12aXN1YWwgbWFya2VycyBhcmUgc3RpY2t5LCBhbmQgbW92ZSBhcm91bmQgYXMgdGhlIHRleHQgaXMgZWRpdGVkLgotPHA+V2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXMgaW50byBhbiBhbHJlYWR5IG9wZW4gY29tcGlsYXRhdGlvbiB1bml0IGZyb20KLWEgcHJvYmxlbSBtYXJrZXIgaW4gdGhlIFRhc2tzIHZpZXcsIHRoZSBKYXZhIGVkaXRvciBhdXRvbWF0aWNhbGx5IGFkanVzdHMKLXRoZSBwb3NpdGlvbnMgdG8gYWNjb3VudCBmb3IgcmVjZW50IGVkaXRzLgotPHA+V2hlbiB0aGUgSmF2YSBlZGl0b3Igc2F2ZXMgYSBjb21waWxhdGlvbiB1bml0LCBpdCBwZXJtYW5lbnRseSBhZGp1c3RzCi10aGUgc291cmNlIHBvc2l0aW9ucyBvZiBKYXZhIHByb2JsZW0gbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKLWNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBuZXh0IGJ1aWxkIG1heSBiZSBhIHdheXMgb2ZmCi1hbmQgdGhlc2UgbWFya2VycyBzaG93IHVwIGluIHRoZSBUYXNrcyB2aWV3ICh0aGUgSmF2YSBlZGl0b3IgbWlnaHQgYmUgY2xvc2VkKS4KLTxwPkphdmEgZWxlbWVudCBkZWx0YXMgYWxzbyBjYXJyeSBpbmZvcm1hdGlvbiBhYm91dCBub24tSmF2YSByZXNvdXJjZXM7Ci10aGlzIGlzIHN1cmZhY2VkIGJ5IDx0dD5JSmF2YUVsZW1lbnREZWx0YS5nZXRSZXNvdXJjZURlbHRhczwvdHQ+LiBUaGlzCi13b3JrcyBhcyBmb2xsb3dzOiB3aGVuIGEgbm9uLUphdmEgcmVzb3VyY2UgaXMgYWZmZWN0ZWQsIHRoZSBjb3JyZXNwb25kaW5nCi1yZXNvdXJjZSBkZWx0YSBpcyBleHBvc2VkIG9uIHRoZSBuZWFyZXN0IHBhcmVudCBKYXZhIGVsZW1lbnQuIEZvciBmaWxlcwotZGlyZWN0bHkgdW5kZXIgdGhlIHByb2plY3QsIHRoZSByZXNvdXJjZSBkZWx0YSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aAotSmF2YSBlbGVtZW50IGRlbHRhIGZvciB0aGUgPHR0PklKYXZhUHJvamVjdDwvdHQ+OyBmb3IgZmlsZXMgc2l0dGluZyBpbgotdGhlIHNhbWUgZm9sZGVyIGFzIGEgSmF2YSBzb3VyY2UgZmlsZSwgdGhlIHJlc291cmNlIGRlbHRhIHdpbGwgYmUgYXNzb2NpYXRlZAotd2l0aCBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSA8dHQ+SVBhY2thZ2VGcmFnbWVudDwvdHQ+OyBmb3IgZmlsZXMgc2l0dGluZwotaW5zaWRlIGEgc291cmNlIGZvbGRlciBidXQgbm90IGluIGFueSBwYWNrYWdlIGZyYWdtZW50LCB0aGUgcmVzb3VyY2UgZGVsdGEKLXdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIEphdmEgZWxlbWVudCBkZWx0YSBmb3IgdGhlIDx0dD5JUGFja2FnZUZyYWdtZW50Um9vdDwvdHQ+Ci0odGhpcyBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSB0aGUgcHJvamVjdCBpdHNlbGYgaXMgYSBwYWNrYWdlIGZyYWdtZW50Ci1yb290LiBUaHVzIHRoZSA8dHQ+SUphdmFFbGVtZW50RGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXM8L3R0PiBtZWNoYW5pc20gaXMKLW9ubHkgb2YgdXNlIGZvciBkaXNjb3ZlcmluZyBub24tcmVzb3VyY2UgZGVsdGFzOyBpdCBpcyBub3QgdXNlZnVsIGZvciBkaXNjb3ZlcmluZwotbWFya2VyIGNoYW5nZXMgdG8gcmVzb3VyY2VzIGNvcnJlc3BvbmRpbmcgdG8gSmF2YSBlbGVtZW50cy4KLTxwPlRodXMgdGhlIG9ubHkgd2F5IGEgY2xpZW50IGNhbiBmaW5kIG91dCBhYm91dCBtb3N0IG1hcmtlciBkZWx0YXMgaXMKLXRvIHJlZ2lzdGVyIGl0cyBvd24gcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyIHdpdGggdGhlIHdvcmtzcGFjZS4gU2luY2UKLXRoZSBjbGllbnQgd291bGQgc3RpbGwgbmVlZCB0byByZWdpc3RlciBhIEphdmEgbW9kZWwgY2hhbmdlIGxpc3RlbmVyLCBoYXZpbmcKLXRvIGRvIHJhaXNlcyB0aGUgcXVlc3Rpb24gb2YgcmVsYXRpdmUgb3JkZXJpbmcgb2YgdGhlc2UgdHdvIG5vdGlmaWNhdGlvbnMKLSh0aGVyZSBpcyBubyBndWFyYW50ZWUgd2hpY2ggd2lsbCBjb21lcyBmaXJzdCkuCi08aDM+Ci1Qcm9wb3NhbDogRXhwb3NlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZGVsdGFzIG9uIEphdmEgZWxlbWVudCBkZWx0YTwvaDM+Ci1UaGUgcHJvcG9zZWQgY2hhbmdlIGlzIHRvIGltcHJvdmUgdGhlIEphdmEgZWxlbWVudCBkZWx0YSB0byBleHBvc2UgdGhlCi1jb3JyZXNwb25kaW5nIHJlc291cmNlIGRlbHRhcyB3aGVuZXZlciB0aGV5IGFyZSBhdmFpbGFibGUuIFRoaXMgd291bGQgYmUKLWRvbmUgdmlhIHRoZSBmb2xsb3dpbmcgbmV3IG1ldGhvZCBvbiA8dHQ+SUphdmFFbGVtZW50RGVsdGE8L3R0PjoKLTxwPjx0dD4vKio8L3R0PgotPGJyPjx0dD4mbmJzcDsqIFJldHVybnMgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIHJlc291cmNlIHRoYXQKLWNvcnJlc3BvbmRzIGRpcmVjdGx5IHRvIHRoZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyogSmF2YSBlbGVtZW50LCBvciAmbHQ7Y29kZT5udWxsJmx0Oy9jb2RlPiBpZiBlaXRoZXIgdGhlcmUKLWlzIG5vIHJlc291cmNlIHRoYXQgY29ycmVzcG9uZHM8L3R0PgotPGJyPjx0dD4mbmJzcDsqIHRvIHRoZSBKYXZhIGVsZW1lbnQsIG9yIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZQotYnV0IHRoZXJlIGlzIG5vIHJlc291cmNlIGRlbHRhPC90dD4KLTxicj48dHQ+Jm5ic3A7KiBmb3IgaXQuPC90dD4KLTxicj48dHQ+Jm5ic3A7KiAmbHQ7cD48L3R0PgotPGJyPjx0dD4mbmJzcDsqIE5vdGUgdGhhdCBhIEphdmEgZWxlbWVudCBkZWx0YSB0aGF0IGRvZXMgbm90IGFyaXNlIGZyb20KLWEgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhIHdpbGwgYWx3YXlzPC90dD4KLTxicj48dHQ+Jm5ic3A7KiByZXR1cm4gJmx0O2NvZGU+bnVsbCZsdDsvY29kZT4uPC90dD4KLTxicj48dHQ+Jm5ic3A7KiAmbHQ7L3A+PC90dD4KLTxicj48dHQ+Jm5ic3A7KiAmbHQ7cD48L3R0PgotPGJyPjx0dD4mbmJzcDsqIElmIHRoZSByZXN1bHQgaXMgbm9uLSZsdDtjb2RlPm51bGwmbHQ7L2NvZGU+LCB0aGVuPC90dD4KLTxicj48dHQ+Jm5ic3A7KiAmbHQ7Y29kZT5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2VEZWx0YSgpLmdldFJlc291cmNlKCkmbHQ7L2NvZGU+Ci1pcyB0aGUgc2FtZSByZXNvdXJjZSBhczwvdHQ+Ci08YnI+PHR0PiZuYnNwOyogJmx0O2NvZGU+Z2V0RWxlbWVudCgpLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpJmx0Oy9jb2RlPi48L3R0PgotPGJyPjx0dD4mbmJzcDsqICZsdDsvcD48L3R0PgotPGJyPjx0dD4mbmJzcDsqPC90dD4KLTxicj48dHQ+Jm5ic3A7KiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHdvcmtzcGFjZSByZXNvdXJjZSBkZWx0YSwgb3IKLSZsdDtjb2RlPm51bGwmbHQ7L2NvZGU+IGlmIG5vdCBhcHBsaWNhYmxlIG9yIG5vbmU8L3R0PgotPGJyPjx0dD4mbmJzcDsqLzwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2VEZWx0YSgpOzwvdHQ+Ci08cD5SZXNvdXJjZSBkZWx0YXMgd2lsbCBiZSBhdmFpbGFibGUgd2hlbiB0aGUgSmF2YSBlbGVtZW50IGRlbHRhIHJlc3VsdHMKLWZyb20gdGhlIEphdmEgbW9kZWwgcmVjZWl2aW5nIGEgcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbi4gV2hlbiB0aGlzCi1oYXBwZW5zLCB0aGUgcmVzb3VyY2UgZGVsdGEgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKLWZyb20gdGhlIEphdmEgZWxlbWVudCBkZWx0YSBmb3IgdGhlIEphdmEgZWxlbWVudDoKLTx1bD4KLTxsaT4KLUphdmEgcHJvamVjdDogZXhwb3NlIHJlc291cmNlIGRlbHRhIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IHJlc291cmNlLjwvbGk+Ci0KLTxsaT4KLUphdmEgY29tcGlsYXRpb24gdW5pdDogZXhwb3NlIHJlc291cmNlIGRlbHRhIGZvciB0aGUgY29ycmVzcG9uZGluZyBKYXZhCi1zb3VyY2UgZmlsZS48L2xpPgotCi08bGk+Ci1KYXZhIGNsYXNzIGZpbGU6IGV4cG9zZSByZXNvdXJjZSBkZWx0YSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBjbGFzcwotZmlsZS48L2xpPgotCi08bGk+Ci1KYXZhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdDogZXhwb3NlIHJlc291cmNlIGRlbHRhIGZvciB0aGUgY29ycmVzcG9uZGluZwotc291cmNlIGZvbGRlciwgamFyIG9yIHppcCBmaWxlLjwvbGk+Ci0KLTxsaT4KLUphdmEgcGFja2FnZSBmcmFnbWVudDogZXhwb3NlIHJlc291cmNlIGRlbHRhIGZvciB0aGUgY29ycmVzcG9uZGluZyBwYWNrYWdlCi1mb2xkZXIgdW5kZXIgYSBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290LjwvbGk+Ci08L3VsPgotTm90ZSB0aGF0IHRoZSBwcm9wb3NlZCBBUEkgY2hhbmdlIHdvdWxkIG5vdCBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggRWNsaXBzZQotMS4wLiBJdCBhZGRzIGEgbmV3IG1ldGhvZCB0byBhbiBpbnRlcmZhY2UgdGhhdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQKLWJ5IGNsaWVudHMuCi08cD5XaXRoIHRoZSBwcm9wb3NlZCBjaGFuZ2UsIGEgY2xpZW50IG9mIHRoZSBKYXZhIG1vZGVsIHdvdWxkIGJlIGFibGUgdG8KLWRpc2NvdmVyIG1hcmtlciBjaGFuZ2VzIHRvIGJvdGggSmF2YSBhbmQgbm9uLUphdmEgcmVzb3VyY2UgYnkgcmVnaXN0ZXJpbmcKLWZvciBKYXZhIG1vZGVsIGNoYW5nZXMgYW5kIGNvbXBvc2luZyA8dHQ+SUphdmFFbGVtZW50RGVsdGEuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlRGVsdGE8L3R0PgotYW5kIDx0dD5JUmVzb3VyY2VEZWx0YS5nZXRNYXJrZXJEZWx0YXM8L3R0Pi4gVGhlc2UgbWFya2VyIGNoYW5nZXMgd2lsbAotb25seSBiZSBwcmVzZW50IG9uIEphdmEgZWxlbWVudCBkZWx0YXMgc3RlbW1pbmcgZnJvbSB3b3Jrc3BhY2UgcmVzb3VyY2UKLWRlbHRhcy4gVGhleSBhcmUgbm8gbWFya2VyIGRlbHRhcyBhc3NvY2lhdGVkIHdpdGggZmluZS1ncmFpbmVkIEphdmEgZWxlbWVudAotZGVsdGFzIGFyaXNpbmcgZnJvbSB3b3JraW5nIGNvcHkgcmVjb25jaWxpYXRpb24gb3Igc2F2aW5nIChubyBtYXJrZXJzIGhhdmUKLWNoYW5nZXMpLgotPHA+T3RoZXIgdGhpbmdzIHdlIGNvbnNpZGVyZWQ6Ci08dWw+Ci08bGk+Ci1Gb3IgdGhlIGNhc2Ugd2hlcmUgYSBjb2Fyc2UtZ3JhaW5lZCBKYXZhIGVsZW1lbnQgZGVsdGFzIGlzIGlzc3VlZCwgYWRkCi1tYXJrZXIgZGVsdGEgaW5mb3JtYXRpb24gdG8gSmF2YSBlbGVtZW50cyBmaW5lciB0aGFuIHRoZSBjb21waWxhdGlvbiB1bml0LgotVGhpcyBpcyBub3QgZmVhc2libGUgYmVjYXVzZSB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gY29tcHV0ZSBmaW5lLWdyYWluZWQKLUphdmEgZWxlbWVudCBvciBtYXJrZXIgZGVsdGFzIHNpbmNlIHRoZSBKYXZhIG1vZGVsIGhhcyBubyAiYmVmb3JlIiBzdGF0ZQotdG8gY29tcGFyZSBhZ2FpbnN0LjwvbGk+Ci0KLTxsaT4KLUZvciB0aGUgY2FzZXMgd2hlcmUgYSBmaW5lLWdyYWluZWQgSmF2YSBlbGVtZW50IGRlbHRhcyBpcyBpc3N1ZWQsIGFkZCBtYXJrZXIKLWRlbHRhIGluZm9ybWF0aW9uIHRvIEphdmEgZWxlbWVudHMgZmluZXIgdGhhbiB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhpcwotaXMgbm90IGZlYXNpYmxlIGJlY2F1c2UgdGhlIG1hcmtlcnMgYXJlbid0IGNoYW5naW5nIGluIHRoaXMgY2FzZSwgYW5kIHRoZQotSmF2YSBtb2RlbCBpdHNlbGYgaXMgbm90IGluIHRoZSBidXNpbmVzcyBvZiBhZGp1c3RpbmcgbWFya2Vycy48L2xpPgotPC91bD4KLQotPGgzPgotRG9jdW1lbnQgSGlzdG9yeTwvaDM+Ci0KLTx1bD4KLTxsaT4KLTEzOjQ1IFRodXJzZGF5IEF1Z3VzdCAzMSwgMjAwMSAtIEZpcnN0IHByb3Bvc2FsIHNlbmQgdG8gRXJpY2ggYW5kIFBoaWxpcHBlPC9saT4KLQotPGxpPgotMTY6MzAgV2VkbmVzZGF5IFNlcGVtYmVyIDUsIDIwMDEgLSBNb2RpZmllZCBhZnRlciBkaXNjdXNzaW9uIHdpdGggRXJpY2gKLWFuZCBNYXJ0aW4uPC9saT4KLQotPGxpPgotMTI6MDAgVGh1cnNkYXkgU2VwdGVtYmVyIDYsIDIwMDEgLSBNb2RpZmllZCBhZnRlciBkaXNjdXNzaW9uIHdpdGggSmVyb21lCi13aG8gY2xhcmlmaWVkIGhvdyA8dHQ+SUphdmFFbGVtZW50RGVsdGEuZ2V0UmVzb3VyY2VEZWx0YXM8L3R0PiB3b3Jrcy48L2xpPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dC1kaXJzLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2V4dGVuc2lvbiBkaXIvZXh0LWRpcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhOWY0YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2V4dGVuc2lvbiBkaXIvZXh0LWRpcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJCdWlsZCI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5KRFQgLSBFeHRlbnNpb24gRGlyZWN0b3JpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLUV4dGVuc2lvbiBEaXJlY3RvcmllczwvaDI+Ci1MYXN0IHJldmlzZWQgMTc6MTAgVGh1cnNkYXkgT2N0b2JlciAyNSwgMjAwMQotPHA+V29yayBpdGVtOiBBZGQgc3VwcG9ydCB0byBKYXZhIG1vZGVsIGZvciBKREsgMS4yLXN0eWxlIGV4dGVuc2lvbiBkaXJlY3RvcmllcwotKGFrYSBvcHRpb25hbCBwYWNrYWdlcykKLTxwPkFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgaXMgYSBmb2xkZXIgY29udGFpbmluZyBhbnkgbnVtYmVyIG9mIEpBUiBmaWxlcwotKGluY2x1ZGluZyAwKS4gRXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHdlcmUgb3JpZ2luYWxseSBhZGRlZCBpbiBKREsgMS4yLAotYW5kIGFyZSBkZXNjcmliZWQgaW4gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvaW5kZXguaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvaW5kZXguaHRtbDwvYT4uCi08cD5UaGUgcHJvcG9zYWwgaXMgdG8gYWxsb3cgYSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeSB0byByZWZlciB0byBhbiBleHRlbnNpb24KLWRpcmVjdG9yeS4gQSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeSAoPHR0PkNQRV9MSUJSQVJZPC90dD4pIHdpdGggYSBwYXRoCi13aG9zZSBsYXN0IHNlZ21lbnQgaXMgIioiIGluZGljYXRlcyBhbiBleHRlbnNpb24gZGlyZWN0b3J5OyBmb3IgZXhhbXBsZSwKLWEgbGlicmFyeSBlbnRyeSB3aXRoIHRoZSBwYXRoICJEOi9qZGsxLjQvanJlL2xpYi9leHQvKiIgbWVhbnMgdGhlIGV4dGVuc2lvbgotZGlyZWN0b3J5ICJEOi9qZGsxLjQvanJlL2xpYi9leHQiLiBMaWtlIGFsbCBsaWJyYXJ5IGVudHJpZXMsIGV4dGVuc2lvbgotZGlyZWN0b3JpZXMgY2FuIGJlIGluIGZvbGRlcnMgaW5zaWRlIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gZGlyZWN0b3JpZXMgaW4KLXRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuIEEgdmFyaWFibGUgY2xhc3NwYXRoIGVudHJ5Ci1tYXkgYWxzbyByZXNvbHZlIHRvIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGUgYWJvdXQKLWVuZGluZyBpbiAiKiIuIFRodXMgYSB2YXJpYWJsZSBjbGFzc3BhdGggZW50cnkgbGlrZSAiSlJFX0xJQi9leHQvKiIgd291bGQKLXJlc29sdmUgdG8gYW4gZXh0ZW5zaW9uIGRpcmVjdG9yeTsgYW5kIGEgc2ltcGxlIG9uZSBsaWtlICJGT08iIGNvdWxkIHJlc29sdmUKLXRvIGVpdGhlciBhIEpBUiBsaWJyYXJ5LCBhIGxpYnJhcnkgZm9sZGVyLCBhbiBleHRlbnNpb24gZGlyZWN0b3J5LCBvciBhCi1wcm9qZWN0LgotPHA+RWFjaCBvZiB0aGUgSkFScyBpbiBhbiBleHRlbnNpb24gZGlyZWN0b3J5IG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGgKLXdvdWxkIGdpdmUgcmlzZSB0byBhIHNlcGFyYXRlIDx0dD5JUGFja2FnZUZyYWdtZW50Um9vdDwvdHQ+IChraW5kIDx0dD5LX0JJTkFSWTwvdHQ+KTsKLXRoZXNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYXJlIGFsbCBjaGlsZCBlbGVtZW50cyBvZiB0aGUgPHR0PklKYXZhUHJvamVjdDwvdHQ+LgotVGhlIEphdmEgbW9kZWwgd291bGQgbm90IGhhdmUgYSBKYXZhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZXh0ZW5zaW9uCi1kaXJlY3RvcnkgaXRzZWxmLiBBIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGlkZW50aWZpZXMgYSBleHRlbnNpb24gZm9sZGVyCi1pbnRlcm5hbCB0byB0aGUgd29ya3NwYWNlIGdpdmVzIHJpc2UgdG8gMCwgMSwgb3IgbW9yZSBiaW5hcnkgcGFja2FnZSBmcmFnbWVudAotcm9vdHMgZm9yIEpBUiBmaWxlIHJlc291cmNlcyBpbnRlcm5hbCB0byB0aGUgd29ya3NwYWNlOyBzaW1pbGFybHksIGEgY2xhc3NwYXRoCi1lbnRyeSB0aGF0IGlkZW50aWZpZXMgYSBleHRlbnNpb24gZm9sZGVyIGV4dGVybmFsIHRvIHRoZSB3b3Jrc3BhY2UgZ2l2ZXMKLXJpc2UgdG8gYmluYXJ5IHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgZm9yIEpBUiBmaWxlcyBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuCi08cD5FdmVyeSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhhdCBpcyBhIGNoaWxkIG9mIGEgcHJvamVjdCBlbGVtZW50IHN0ZW1zCi1mcm9tIHNvbWUgZW50cnkgb24gdGhhdCBwcm9qZWN0J3Mgb3JpZ2luYWwgY2xhc3NwYXRoLiBHaXZlbiBhIHBhY2thZ2UgZnJhZ21lbnQKLXJvb3QsIGhvdyBkb2VzIG9uZSB0cmFjZSBpdCBiYWNrIHRvIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBnYXZlIHJpc2UKLXRvIGl0PyBJbiB0aGUgcHJlc2VuY2Ugb2YgdmFyaWFibGUgY2xhc3NwYXRoIGVudHJpZXMgYW5kIGV4dGVuc2lvbiBkaXJlY3RvcmllcywKLXRoZSBhbnN3ZXIgaXMgbm90IG9idmlvdXMuIEhhdmluZyBhIHNpbXBsZSBhbnN3ZXIgaXMgaW1wb3J0YW50IHRvIHNvbWUKLWNsaWVudHMuIEZvciBpbnN0YW5jZSwgdGhlIEphdmEgVUkgaW5jbHVkZXMgdGhlIG5hbWVzIG9mIGNsYXNzcGF0aCB2YXJpYWJsZXMKLWluIGl0ZW1zIGluIGl0cyBQYWNrYWdlcyB2aWV3LgotPHA+PHR0PklQYWNrYWdlRnJhZ21lbnRSb290PC90dD4KLTxicj48dHQ+LyoqPC90dD4KLTxicj48dHQ+Jm5ic3A7KiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cnkgdGhhdCBnaXZlcyByaXNlIHRvIHRoaXMgcGFja2FnZQotZnJhZ21lbnQgcm9vdC48L3R0PgotPGJyPjx0dD4mbmJzcDsqIFRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IG11c3QgZXhpc3QuIFRoZSByZXR1cm5lZCBjbGFzc3BhdGgKLWVudHJ5IGlzPC90dD4KLTxicj48dHQ+Jm5ic3A7KiBlcXVpdmFsZW50IHRvIG9uZSBvZiB0aGUgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhpcyBwYWNrYWdlCi1mcmFnbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyogcm9vdCdzIHByb2plY3QuPC90dD4KLTxicj48dHQ+Jm5ic3A7KjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyogQHJldHVybiB0aGUgb3JpZ2luYXRpbmcgY2xhc3NwYXRoIGVudHJ5PC90dD4KLTxicj48dHQ+Jm5ic3A7KiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QKLWV4aXN0PC90dD4KLTxicj48dHQ+Jm5ic3A7Ki88L3R0PgotPGJyPjx0dD5JQ2xhc3NwYXRoRW50cnkgZ2V0T3JpZ2luYXRpbmdDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247PC90dD4KLTxwPlRoaXMgbWV0aG9kIHdvdWxkIHJlcGxhY2UgPHR0PklKYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJQ2xhc3NwYXRoRW50cnkKLWVudHJ5KTwvdHQ+LCB3aGljaCBoYXMgcHJvYmxlbXMgYW5kIHdvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgQVBJICh2aWEKLWRlcHJlY2F0aW9uKS4KLTxoMz4KLVBhY2thZ2VzIFZpZXcgQ2x1dHRlcjwvaDM+Ci1UaGUgcGFja2FnZXMgdmlldyB3b3VsZCBzaG93IGFsbCB0aGUgSkFScyBmcm9tIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgYXMKLWNoaWxkcmVuIG9mIGEgcHJvamVjdC4gUGFja2FnZXMgdmlldyBjbHV0dGVyIGV4aXN0cyBmb3IgYW55b25lIHdpdGggYSBsYXJnZQotbnVtYmVyIG9mIEpBUiBsaWJyYXJpZXMgb24gdGhlaXIgYnVpbGQgY2xhc3NwYXRoLiBFeHRlbnNpb24gZGlyZWN0b3JpZXMKLWV4YWNlcmJhdGUgdGhlIHByb2JsZW0gYnkgbWFraW5nIGl0IGVhc3kgdG8gaW5jbHVkZSBhIHdob2xlIHNldCBvZiBKQVIKLWxpYnJhcmllcyB3aXRoIGEgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSAoV1NBRCByZXB1dGVkbHkgaGFzIDcwKyBKQVJzIGluCi1pdHMgZXh0ZW5zaW9uIGRpcmVjdG9yeSkuCi08cD5UaGUgcGFja2FnZXMgdmlldyBzdXBwb3J0cyBmaWx0ZXJpbmcgb3V0IEpBUiBsaWJyYXJpZXMsIG1lYW5pbmcgdGhleQotY291bGQgYmUgaGlkZGVuLiBIb3dldmVyLCB0aGUgZmlsdGVyIGlzIG9mZiBieSBkZWZhdWx0IGFuZCBub3QgYWxsIHVzZXJzCi1hcmUgYXdhcmUgdGhhdCB0aGUgZmlsdGVyIGV2ZW4gZXhpc3RzLgotPHA+Tm90ZSB0aGF0IGV4dGVuc2lvbiBmb2xkZXJzIHR5cGljYWxseSBjb250YWluIGEgYnVuY2ggb2YgdW5yZWxhdGVkIEpBUnMsCi1tYWtpbmcgaXQgbGlrZWx5IHRoYXQgYSB1c2VyIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiBhIHBhcnRpY3VsYXIgc3Vic2V0Ci1hbmQgdW5pbnRlcmVzdGVkIGluIHRoZSByZXN0LiBUaGUgSUJNIDEuMy4wIEpSRSBqcmVcbGliXGV4dCBjb250YWlucyBpbmRpY2ltLmphcgotYW5kIEphd0JyaWRnZS5qYXIuIFRoZSBTdW4gSkRLIDEuNC4wLWJldGEganJlXGxpYlxleHQgY29udGFpbnMgZG5zbnMuamFyLAotbGRhcHNlYy5qYXIsIGFuZCBzdW5qcmVfcHJvdmlkZXIuamFyLiBBbGwgdGhlc2UgSkFScyBhcmUgbGlrZWx5IHB1cmUgbm9pc2UKLWFuZCBkbyBub3QgY29udGFpbiBBUEkgdGhhdCBhIGNsaWVudCB3b3VsZCB3cml0ZSB0by4mbmJzcDsgSW4gYSBKMkVFIEpSRSwKLXRoZXJlIHdvdWxkIGJlIGEgZGl2ZXJzZSBjb2xsZWN0aW9uIG9mIEpBUnMgaW4gdGhlIGpyZVxsaWJcZXh0IGV4dGVuc2lvbgotZGlyZWN0b3J5IChlLmcuLCBKYXZhIFRlbGVwaG9ueSwgSmF2YU1haWwsIEphdmEgMkQsIEphdmEgM0QsIEphdmEgTWVkaWEKLUZyYW1ld29ya3MpLCBvbmx5IGEgaGFuZGZ1bCBvZiB3aGljaCB3b3VsZCBiZSB1c2VkIHdpdGhpbiBhbnkgZ2l2ZW4gcHJvamVjdC4KLTxwPk9uZSBpZGVhIGlzIHRvIGFsbG93IGEgbmV3IEphdmFFbGVtZW50ICJFeHRlbnNpb25Gb2xkZXIiLiBUaGlzIHdvdWxkCi1hbGxvdyB0byBncm91cCB0aGUgZXh0ZW5zaW9uIEpBUnMgYW5kIHdvdWxkIGF2b2lkIHNvbWUgY2x1dHRlci4gQWx0aG91Z2gKLWFuIGV4dGVuc2lvbiBmb2xkZXIgZWxlbWVudCBjb3VsZCBhdm9pZCBjbHV0dGVyLCBpdCBtYXkgbm90IHByb3ZpZGUgZW5vdWdoCi1vZiBhbiBpbXByb3ZlbWVudCBvdmVyIHRoZSBleGlzdGluZyBmaWx0ZXJpbmcgbWVjaGFuaXNtIHRvIHdhcnJhbnQgY29tcGxpY2F0aW5nCi10aGUgSmF2YSBtb2RlbCBBUEkuCi08cD5bVGhpcyBwcm9ibGVtIGlzIHN0aWxsIG9wZW4uIEkgcmVjb21tZW5kIGxpdmluZyB3aXRoIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkCi1maWx0ZXJpbmcgZm9yIG5vdy4gV2UgY291bGQgY29tZSBiYWNrIGxhdGVyIGFuZCBsb29rIGF0IHdheXMgdG8gcmVkdWNlCi1jbHV0dGVyIGFzIGEgc2VwYXJhdGUgd29yayBpdGVtLl0KLTxoMz4KLURlZmF1bHQgQnVpbGQgQ2xhc3NwYXRoPC9oMz4KLVRoZSBzdGFuZGFyZCBKUkUgaW1wbGljaXRseSBoYXMgdGhlIGpyZS9saWIvZXh0IGV4dGVuc2lvbiBkaXJlY3Rvcnkgb24KLWl0cyBydW50aW1lIGNsYXNzcGF0aC4gQnkgZGVmYXVsdCwgdGhlIGJ1aWxkIGNsYXNzcGF0aCBmb3IgYSB0eXBpY2FsIHByb2plY3QKLXNob3VsZCBpbmNsdWRlIGVudHJpZXMgZm9yIGJvdGggdGhlIHN0YW5kYXJkIGNsYXNzIGxpYnJhcnkgKGpyZS9saWIvcnQuamFyKQotYW5kIHRoZSBzdGFuZGFyZCBleHRlbnNpb24gZGlyZWN0b3J5IChqcmUvbGliL2V4dC8qKS4KLTxwPlRoZXNlIGRlZmF1bHRzIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBWTSBsYXVuY2hlciBmb3IgdGhlIHByb2plY3QuCi1JdCBzaG91bGQgYWx3YXlzIGJlIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgYW5kCi1zZXQgdXAgdGhlaXIgYnVpbGQgY2xhc3NwYXRoIGFzIHRoZXkgc2VlIGZpdC4KLTxoMz4KLUJ1aWxkIENsYXNzcGF0aCBPcmRlcmluZzwvaDM+Ci1UaGUgVUkgY3VycmVudGx5IGFsbG93cyB1c2VycyB0byBmcmVlbHkgcmVvcmRlciBwYWNrYWdlIGZyYWdtZW50IHJvb3RzCi1mb3IgdGhlIHByb2plY3QuIFRoaXMgZG9lcyBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgZm9yIHBhY2thZ2UgZnJhZ21lbnRzCi1yb290cyB0aGF0IGFyaXNlIGZyb20gZXh0ZW5zaW9uIGRpcmVjdG9yaWVzLgotPHA+SW5kZWVkLCB0aGUgYWRkaXRpb24gb2YgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8KLWxvbmdlciBhIDEtMSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgYW5kIGNsYXNzcGF0aAotZW50cmllcy4gVGhlIFVJIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGNsYXNzcGF0aAotZW50cmllcy4gSGVyZSBhcmUgdGhlIGd1aWRlbGluZXMgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoCi1mb3IgYSBwcm9qZWN0IChOLkIuLCB0aGVzZSBhcHBseSB0byB0aGUgcmF3IGNsYXNzcGF0aCwgbm90IG5lY2Vzc2FyaWx5Ci10byBhIHBhcnRpYWxseSBvciBmdWxseSAicmVzb2x2ZWQiIGNsYXNzcGF0aCk6Ci08dWw+Ci08bGk+Ci1UaGVyZSBtYXkgYmUgMCwgMSwgb3IgbW9yZSBzb3VyY2UgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoLiBUaGUgcmVsYXRpdmUKLW9yZGVyaW5nIG9mIG11bHRpcGxlIHNvdXJjZSBmb2xkZXJzIGlzIHNpZ25pZmljYW50IHRvIHRoZSB1c2VyLiBTb3VyY2UKLWNvZGUgaW4gYW4gZWFybGllciBzb3VyY2UgZm9sZGVyIGhpZGVzIGEgc291cmNlIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBpbgotYSBsYXRlciBmb2xkZXIuIFRoaXMgZmxleGliaWxpdHkgaXMgcmFyZWx5IHVzZWQ6IG11bHRpcGxlIHNvdXJjZSBmb2xkZXJzCi1pcyByYXJlIGVub3VnaCwgYW5kIGR1cGxpY2F0ZWQgc291cmNlIGZpbGVzLCBldmVuIHJhcmVyLjwvbGk+Ci0KLTxsaT4KLVNvdXJjZSBmb2xkZXJzIG11c3QgcHJlY2VkZSBhbGwgb3RoZXIgdHlwZXMgb2YgY2xhc3NwYXRoIGVudHJpZXMuIE5vdGhpbmcKLXNob3VsZCBoaWRlIHNvdXJjZSAoZXhjZXB0IGFub3RoZXIgc291cmNlKS4gVGhpcyBwcm9wZXJ0eSBpcyBpbXBsaWNpdGx5Ci1yZWxpZWQgb24gd2hlbmV2ZXIgYSBzb3VyY2UgY29kZSBwYXRjaCBpcyBiZWluZyBhcHBsaWVkIHRvIGEgYmluYXJ5IGxpYnJhcnkuPC9saT4KLQotPGxpPgotVGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIG5vbi1zb3VyY2UgY2xhc3NwYXRoIGVudHJpZXMgKGxpYnJhcnkgZm9sZGVycywKLWxpYnJhcnkgSkFScywgZXh0ZW5zaW9uIGZvbGRlcnMsIHJlcXVpcmVkIHByb2plY3RzLCBhbmQgb25lcyBpbnZvbHZpbmcKLXZhcmlhYmxlcykgaXMgc2lnbmlmaWNhbnQgdG8gdGhlIHVzZXIuIFRoZSBtYWluIHJlYXNvbiBpdCBpcyBzaWduaWZpY2FudAotaXMgdG8gZGVhbCB3aXRoIGNvbmZsaWN0aW5nIGxpYnJhcnkgdmVyc2lvbnMsIHdoZXJlIHRoZSB1c2VyIG5lZWRzIHRvIGNvbnRyb2wKLXdoaWNoIHZlcnNpb24gd2lucy4gVGhlIG9uZXMgZWFybGllciBpbiB0aGUgbGlzdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlCi1vdmVyIG9uZXMgbGF0ZXIgaW4gdGhlIGxpc3QuPC9saT4KLQotPGxpPgotRm9yIGEgc3RhbmRhcmQgSmF2YSBydW50aW1lLCBhbGwgbGlicmFyaWVzIG9uIHRoZSBib290IGNsYXNzcGF0aCAodXN1YWxseQotanVzdCB0aGUgc3RhbmRhcmQgSlJFIGNsYXNzIGxpYnJhcnkpIGFyZSBjb25zdWx0ZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQsCi1hbmQgYmVmb3JlIG90aGVyIGxpYnJhcmllcykuIFBsYWNpbmcgdGhlIHN0YW5kYXJkIEpSRSBjbGFzcyBsaWJyYXJ5IGFzCi10aGUgZmlyc3Qgbm9uLXNvdXJjZSBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG1pcnJvcnMgdGhlIG1vc3QgY29tbW9uCi1jb25maWd1cmF0aW9uLjwvbGk+Ci0KLTxsaT4KLUZvciBhIHN0YW5kYXJkIEphdmEgcnVudGltZSwgYWxsIGV4dGVuc2lvbiBkaXJlY3RvcmllcyAodXN1YWxseSBqdXN0IHRoZQotc3RhbmRhcmQgSlJFIGV4dGVuc2lvbiBkaXJlY3RvcnkpIGFyZSBjb25zdWx0ZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQsCi1hZnRlciBsaWJyYXJpZXMgb24gdGhlIGJvb3QgY2xhc3NwYXRoIGJ1dCBiZWZvcmUgb3RoZXIgbGlicmFyaWVzLiBXaXRoaW4KLWFuIGV4dGVuc2lvbiBkaXJlY3RvcnksIHRoZSB2YXJpb3VzIGxpYnJhcnkgSkFScyBhcmUgY29uc3VsdGVkIGluIHVuc3BlY2lmaWVkCi1vcmRlci4gUGxhY2luZyB0aGUgc3RhbmRhcmQgSlJFIGV4dGVuc2lvbiBkaXJlY3RvcnkgYXMgdGhlIHNlY29uZCBub24tc291cmNlCi1lbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG1pcnJvcnMgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24uPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUJ1aWxkIENsYXNzcGF0aCBEdXBsaWNhdGVzPC9oMz4KLUhvdyBhcmUgZHVwbGljYXRlcyBsaWJyYXJpZXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBoYW5kbGVkPyBGb3IgaW5zdGFuY2UsCi1pZiB0aGVyZSBhcmUgdHdvIGNsYXNzcGF0aCBlbnRyaWVzIG9uIGEgcHJvamVjdCdzIGJ1aWxkIGNsYXNzcGF0aCBmb3IgZXhhY3RseQotdGhlIHNhbWUgSkFSLCBzaG91bGQgdGhlcmUgYmUgb25lIG9yIHR3byBwYWNrYWdlIGZyYWdtZW50IHJvb3RzPyBXaGF0IGlmCi1hIEpBUiBjbGFzc3BhdGggZW50cnkgZXhwbGljaXRseSBtZW50aW9ucyBhIEpBUiB0aGF0IGlzIGluY2x1ZGVkIGluIGFuCi1leHRlbnNpb24gZm9sZGVyIGFsc28gb24gdGhlIGJ1aWxkIGNsYXNzcGF0aD8KLTxwPkF0IHRoZSBKYXZhIG1vZGVsIEFQSSwgcGFja2FnZSBmcmFnbWVudCByb290cyBhcmUgaGFuZGxlIG9iamVjdHMgd2l0aAotd2VsbC1rbm93biBpZGVudGl0eSBjcml0ZXJpYS4gSXQgdHVybnMgb3V0IHRoYXQgdGhpcyBkaWN0YXRlcyB0aGUgYW5zd2VyCi10byBob3cgZHVwaWNhdGVzIGFyZSBoYW5kbGVkLgotPHA+Rm9yIGxpYnJhcnkgcGFja2FnZSBmcmFnbWVudCByb290cyBiYXNlZCBvbiBhIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UsCi10aGUgaWRlbnRpdHkgY3JpdGVyaWEgaW5jbHVkZXMgdGhlIHJlc291cmNlIGhhbmRsZSAoaGFuZGxlIGNvbnN0cnVjdG9yCi1pc0phdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoSVJlc291cmNlKSkgRm9yIGxpYnJhcnkgcGFja2FnZSBmcmFnbWVudAotcm9vdHMgYmFzZWQgb24gZmlsZXMgb3V0c2lkZSB0aGUgd29ya3NwYWNlLCB0aGUgaWRlbnRpdHkgY3JpdGVyaWEgaW5jbHVkZXMKLXRoZSBwYXRoIChoYW5kbGUgY29uc3RydWN0b3IgaXNKYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZykpLgotPHA+VGhpcyBtZWFucyB0aGUgYW5zd2VyIGlzIGZvcmNlZDogYW55IGR1cGxpY2F0aW9uIGluIHRoZSBidWlsZCBjbGFzc3BhdGgKLW5lY2Vzc2FyaWx5IHdhc2hlcyBvdXQgaW4gdGhlIG1hcHBpbmcgdG8gcGFja2FnZSBmcmFnbWVudCByb290cy4gVHdvIGNsYXNzcGF0aAotZW50cmllcyBmb3IgZXhhY3RseSB0aGUgc2FtZSBKQVIgbXVzdCBtYXAgdG8gYSBzaW5nbGUgcGFja2FnZSBmcmFnbWVudAotcm9vdC4gSkFScyBmcm9tIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgZ2l2ZXMgcmlzZSB0byB0aGUgc2FtZSBwYWNrYWdlIGZyYWdtZW50Ci1yb290cyBvbmUgd291bGQgZ2V0IGlmIGVhY2ggSkFSIHdhcyBtZW50aW9uZWQgZXhwbGljaXRseS4KLTxwPkluIHRoZSBjYXNlIG9mIGR1cGxpY2F0ZXMsIHdlIGRvIGhhdmUgYSBjaG9pY2UgZm9yIHdoaWNoIGNsYXNzcGF0aCBlbnRyeQotaXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcgb25lLiA8dHQ+SVBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0T3JpZ2luYXRpbmdDbGFzc3BhdGhFbnRyeSgpPC90dD4sCi1kZXNjcmliZWQgYWJvdmUsIHdpbGwgYmUgdXNlZCB0byBsb2NhdGUgYW4gZW50cnkgaW4gdGhlIGJ1aWxkIGNsYXNzcGF0aAotY2FycmluZyBpbXBvcnRhbnQgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24uIEEgc3BlY2lmaWMgY2xhc3NwYXRoIGVudHJ5Ci1zaG91bGQgYWx3YXlzIGJlIHByZWZlcnJlZCB0byBhIGdlbmVyaWMgY2xhc3NwYXRoIGVudHJ5IChleHRlbnNpb24gZm9sZGVycwotZW50cmllcyBjYXJyeSBubyBzb3VyY2UgYXR0YWhtZW50IGluZm8pLCBhbmQgYW4gZWFybGllciBlbnRyeSBzaG91bGQgYmUKLXByZWZlcnJlZCBvdmVyIGEgbGF0ZXIgb25lLgotPHA+Rm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgKHVudXN1YWwpIGJ1aWxkIGNsYXNzcGF0aDoKLTxicj4mbHQ7Y2xhc3NwYXRoPgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIvanJlL2xpYi9leHQvKiI+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBhdGg9Ii9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlcGF0aD0iL3NyYy9zZXJ2bGV0c3JjLnppcCI+Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBhdGg9Ii9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc291cmNlcGF0aD0iL2JhY2t1cC9zZXJ2bGV0c3JjLnppcCI+Ci08YnI+Jmx0Oy9jbGFzc3BhdGg+Ci08YnI+dGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBmb3IgIi9qcmUvbGliL2V4dC9zZXJ2bGV0LmphciIgaXMgY29uc2lkZXJlZAotdG8gb3JpZ2luYXRlIGZyb20gdGhlIHNlY29uZCBjbGFzc3BhdGggZW50cnk6IHRoZSBzZWNvbmQgaXMgbW9yZSBzcGVjaWZpYwotdGhhdCB0aGUgZmlyc3QsIGFuZCBpcyBlcXVhbGx5IHNwZWNpZmljIHRvLCBidXQgb3JkZXJlZCBlYXJsaWVyIHRoYW4sIHRoZQotdGhpcmQuCi08aDM+Ci1FeHRlbnNpb24gRGlyZWN0b3JpZXMgYW5kIHRoZSBSdW50aW1lIENsYXNzcGF0aDwvaDM+Ci1CeSBkZWZhdWx0LCBqcmUvbGliL2V4dCBpcyB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yeSBhdCBydW50aW1lLiBPdmVycmlkaW5nCi10aGlzIGRlZmF1bHQgZW50YWlscyBzcGVjaWZ5aW5nIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHNldCB0aGUgdmFsdWUKLW9mIHRoZSA8dHQ+amF2YS5leHQuZGlyczwvdHQ+IHN5c3RlbSBwcm9wZXJ0eS4gVGhpcyBzeXN0ZW0gcHJvcGVydHkgc3BlY2lmaWVzCi1vbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGluc3RhbGxlZCBleHRlbnNpb25zLCBlYWNoIHNlcGFyYXRlZAotYnkgPHR0PkZpbGUucGF0aFNlcGFyYXRvckNoYXI8L3R0Pi4KLTxwPldlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEpBUiBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgcnVudGltZQotY2xhc3MgcGF0aCBvciBub3QuIFNpbmNlIHRoZSBsYXVuY2hlciBpcyBKVk0taW5zdGFsbC10eXBlLXNwZWNpZmljLCBpdAotZmVlbHMgbGlrZSB0aGUgcmlnaHQgcGxhY2UgdG8gaGFyZGNvZGUgdGhlIGtub3dsZWRnZSBvZiBob3cgdG8gbWFwIGEgYnVpbGQKLWNsYXNzcGF0aCB0byBhIHJ1bnRpbWUgY2xhc3NwYXRoLiBUaGUgSkFSIGZvciB0aGUgc3RhbmRhcmQgY2xhc3MgbGlicmFyeQotZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcnVudGltZSBjbGFzc3BhdGggYmVjYXVzZSBpdCBpcyBpbXBsaWNpdGx5Ci1vbiB0aGUgYm9vdCBjbGFzc3BhdGguIFNpbWlsYXJseSwgYW55IEpBUiB0aGF0IGlzIGluY2x1ZGVkIGluIGFuIGV4dGVuc2lvbgotZGlyZWN0b3J5IGRvZXMgbm90IG5lZWQgdG8gYmUgbWVudGlvbmVkIGV4cGxpY2l0bHkuCi08aDM+Ci1BdHRhY2hpbmcgU291cmNlIHRvIExpYnJhcnkgSkFScyBpbiBhbiBFeHRlbnNpb24gRm9sZGVyPC9oMz4KLUpBUnMgZnJvbSBleHRlbnNpb24gZGlyZWN0b3JpZXMgYXJlIG5vdCByZWFsbHkgYW55IGRpZmZlcmVudCBmcm9tIG90aGVyCi1jbGFzcyBsaWJyYXJpZXMuIEl0IHdvdWxkIG1ha2UgZGVidWdnaW5nIGRpZmZpY3VsdCBpZiB0aGVyZSB3ZXJlIG5vIHdheQotdG8gYXR0YWNoZWQgc291cmNlIGNvZGUgdG8gYSBKQVIgaW4gYSBleHRlbnNpb24gZGlyZWN0b3J5LgotPHA+SG93IGRvZXMgb25lIGF0dGFjaCBzb3VyY2UgdG8gSkFScyBpbiBhbiBleHRlbnNpb24gZGlyZWN0b3J5PyBBcyB5b3UKLXJlY2FsbCBmcm9tIFIwLjksIHdlIGNvbnNjaW91c2x5IG9wdGVkIHRvIHB1dCB0aGUgc291cmNlIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24KLWluIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgc2hhcmFibGUsIHJhdGhlciB0aGFuIGxlYXZlIHRoaXMgaW5mb3JtYXRpb24KLWxvY2FsIHRvIHRoZSB3b3Jrc3BhY2UuIFRoZSBBUEkgZm9yIGF0dGFjaGluZyBzb3VyY2UgaXMgb24gdGhlIGNsYXNzcGF0aAotZW50cnk7IHRoaXMgYWxsb3dzIHRoaXMgaW5mb3JtYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gZGV2ZWxvcGVycy4gQ2xlYXJseSwKLXRoaXMgd291bGQgbm90IHdvcmsgZm9yIGV4dGVuc2lvbiBkaXJlY3Rvcmllcywgd2hlcmUgdGhlIG5hbWVzIG9mIHRoZSBKQVJzCi1pbiB0aGUgZGlyZWN0b3J5IG1pZ2h0IG5vdCBldmVuIGJlIGtub3duIGluIGFkdmFuY2UuIFRoZXJlIGlzIG5vIGdlbmVyYWwKLW5hbWluZyBzY2hlbWUgZm9yIGxvY2F0aW5nIHRoZSBzb3VyY2UgY29kZSBmb3IgYSBnaXZlbiBKQVIgKHdlIGRvIG5vdCBwcm9wb3NpbmcKLXRvIGludmVudCBvbmUpLgotPHA+QXMgZGlzY3Vzc2VkIGluIHRoZSBzZWN0aW9uIG9uIHBhY2thZ2UgdmlldyBjbHV0dGVyLCBpdCB3aWxsIGJlIGNvbW1vbgotZm9yIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkgdG8gY29udGFpbiBhIGRpdmVyc2Ugc2V0IG9mIEpBUnMsIG9ubHkgYSBoYW5kZnVsCi1vZiB3aGljaCB3b3VsZCBiZSB1c2VkIHdpdGhpbiBhbnkgZ2l2ZW4gcHJvamVjdC4gVGhlIHByb3Bvc2FsIGlzIHRvIHByb3ZpZGUKLW5vIGRpcmVjdCBzdXBwb3J0IGZvciBhdHRhY2hpbmcgc291cmNlIHZpYSBhbiBleHRlbnNpb24gZm9sZGVyIGNsYXNzcGF0aAotZW50cnkuIElmIHRoZSB1c2VyIG5lZWRzIHRvIHNlZSBzb3VyY2UgY29kZSBmb3IgYSBKQVIgaW4gYW4gZXh0ZW5zaW9uIGZvbGRlciwKLXRoZXkgd291bGQgbmVlZCB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBleHBsaWNpdCBjbGFzc3BhdGggZW50cnkgZm9yIHRoYXQKLUpBUi4gQXMgZGlzY3Vzc2VkIGFib3ZlLCB0aGlzIHdvdWxkIG5vdCByZXN1bHQgaW4gYSBuZXcgcGFja2FnZSBmcmFnbWVudAotcm9vdDsgaG93ZXZlciwgaXQgd291bGQgZWZmZWN0aXZlbHkgY2hhbmdlIHRoZSBvcmlnaW5hdGluZyBjbGFzc3BhdGggZW50cnkKLXRvIHRoZSBleHBsaWNpdCBvbmUgd2hlcmUgdGhlIHNvdXJjZSBhdHRhY2htZW50IGluZm9ybWF0aW9uIHdvdWxkIGJlIGZvdW5kLgotVGhpcyB3b3VsZCBhbGxvdyB0aGUgdXNlciB0byBhdHRhY2ggc291cmNlIGNvZGUgdG8gSkFScyBvbiBhbiBhcy1uZWVkZWQKLWJhc2lzLiBUaGUgYmV0IGlzIHRoYXQgdGhpcyB3aWxsIHN1ZmZpY2UgKGFuZCBmaW5lc3NlcyB0aGUgaXNzdWUgb2Ygd2hlcmUKLW9uZSBtaWdodCBmaW5kIHRoZSBzb3VyY2UgZm9yIGEgSkFSIGluIGFuIGV4dGVuc2lvbiBmb2xkZXIpLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dGVuc2lvbkRpci5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9leHRlbnNpb24gZGlyL2V4dGVuc2lvbkRpci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmZjNDliLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvZXh0ZW5zaW9uIGRpci9leHRlbnNpb25EaXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW45ODsgVSkgW05ldHNjYXBlXSI+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgxPgotRXh0ZW5zaW9uIERpcmVjdG9yeSBTdXBwb3J0PC9oMT4KLVRoZSBXU0FEIGVmZm9ydCBoYXMgZXhwb3NlZCB0aGUgbmVlZCBmb3IgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHNvIGFzIHRvCi1zaW1wbGlmeSB0aGVpciBjbGFzc3BhdGggc2V0dXAuIEludGVyZXN0aW5nbHkgZW5vdWdoLCB0aGUgY2xhc3NwYXRoIHJld29yawotKG1ha2UgY2xhc3NwYXRoIGxlc3Mgc2Vuc2l0aXZlIHRvIHByb2plY3QgY2hhbmdlIGZyb20gc291cmNlIHRvIGJpbmFyeQotZm9ybSkgaGFzIHNvbWUgbmljZSBjb25uZWN0aW9ucyB3aXRoIHRoaXMgcHJvamVjdC4KLTxwPlRoZSBkaXJlY3Rpb24gZm9sbG93ZWQgd291bGQgYWxsb3cgdG8gY29udHJpYnV0ZSBhbGwgSkFScyBjb250YWluZWQKLWluc2lkZSBhIGdpdmVuIHByb2plY3QgdG8gZGVwZW5kZW50IHByb2plY3RzLiBUaHVzIHN1Y2ggYSBwcm9qZWN0IGNvdWxkCi1hY3QgYXMgYW4gZXh0ZW5zaW9uIGRpcmVjdG9yeSByZWxhdGl2ZWx5IHRvIGl0cyBkZXBlbmRlbnQgcHJvamVjdHMuIFRoaXMKLXdvdWxkIGhvd2V2ZXIgcmVxdWlyZSB0byBtYXRlcmlhbGl6ZSBzdWNoIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB3aXRoIHRydWUKLXByb2plY3RzLCBhbmQgY291bGQgYmUgY29uc2lkZXJlZCBhcyBvbmUgd2F5IHRvIGFjaGlldmUgdGhpcywgYnV0IGEgdHJ1ZQotZXh0ZW5zaW9uIGRpcmVjdG9yeSBzdXBwb3J0IHNob3VsZCBhbHNvIGV4aXN0LCBpbiBhIHNpbWlsYXIgd2F5IGFzIHdlIGFsbG93Ci11c2VycyB0byBkaXJlY3RseSByZWZlciB0byBleHRlcm5hbCBKQVJzIGlmIHRoZXkgd2FudC4KLTxwPldlIGNvdWxkIGFkZCBhIG5ldyBjbGFzc3BhdGggZW50cnkga2luZCBmb3IgdGhlc2UuIE5vdyB0aGUgbmV4dCBpc3N1ZQotaXM6IGRvIHdlIGFsbG93IGNsYXNzcGF0aCB2YXJpYWJsZXMgdG8gZGVub3RlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyA/IFByZXN1bWFibHksCi10aGlzIHdvdWxkIGJlIGV4cGVjdGVkLgotPHA+QSBjbGFzc3BhdGggdmFyaWFibGUgaXMgbm90IGJvdW5kIHRvIGEgcGFydGljdWxhciBjbGFzc3BhdGggZW50cnksIGJ1dAotcmF0aGVyIHRvIGFuIElQYXRoIHdoaWNoIGlzIHRoZW4gcmVzb2x2ZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMgc3Vic3RpdHV0ZWQKLXdpdGggYSByZXNvbHZlZCBjbGFzc3BhdGggZW50cnkuIFRoZSByZXNvbHV0aW9uIHByb2Nlc3MgY2FuIGVpdGhlciBiaW5kCi1hIHZhcmlhYmxlIHRvIGEgcHJvamVjdCBvciBhIGxpYnJhcnksIGRlcGVuZGluZyB0byB3aGF0IHRoZSBJUGF0aCBtYXBzCi10by4KLTxwPkluIHRoZSBsaWJyYXJ5IGNhc2UsIGl0IGNhbiBlaXRoZXIgYmUgYW4gYXJjaGl2ZSBmaWxlICgqLmphciwgKi56aXApCi1vciBhIGJpbmFyeSBmb2xkZXIgKCouY2xhc3MgZmlsZXMpLiBUaGUgZGlzdGluY3Rpb24gaXMgbWFkZSBhZ2FpbiBkZXBlbmRpbmcKLW9uIHRoZSBuYXR1cmUgb2Ygd2hhdCB0aGUgSVBhdGggbWFwcyB0bywgaXMgaXQgYSBKQVIvWklQIGZpbGUgb3IgYSBmb2xkZXIuCi1Ob3csIGlmIHdlIHdhbnQgdG8gZml0IHRoZSBleHRlbnNpb24gZGlyZWN0b3J5IHN1cHBvcnQgaW4gdGhpcywgaXQgd2lsbAotYmUgaGFyZCB0byBkaXN0aW5ndWlzaCBpbiBiZXR3ZWVuIGEgZm9sZGVyIGNvbnRhaW5pbmcgSkFScyBvciAuY2xhc3MgZmlsZXMuLi4KLTxwPldlIGNvdWxkIGhvd2V2ZXIgaW1hZ2luZSB0aGF0IHRoZSBzeW50YXggb2YgdGhlIElQYXRoIHdvdWxkIHRlbGwgd2hpY2gKLW9uZSBpcyBleHBlY3RlZCB0byBiZSByZXNvbHZlZC4gRm9yIGV4YW1wbGUsIGEgcGF0aCBvZiB0aGUgZm9ybSAiL1NvbWVEaXJlY3RvcnkiCi13b3VsZCBjb250aW51ZSB0byBpbmRpY2F0ZSBhIGJpbmFyeSBmb2xkZXIsIHdoZXJlYXMgIi9Tb21lRGlyZWN0b3J5LyoiCi13b3VsZCBtZWFuIGFuIGV4dGVuc2lvbiBkaXJlY3RvcnkuIFRoZSBiZW5lZml0IGZvciB0aGlzIGlzIHRoYXQgd2UgYWN0dWFsbHkKLWRvIG5vdCBuZWVkIHRvIGFkZCBhIG5ldyB0eXBlIG9mIGVudHJ5LiBXZSBqdXN0IGFkZCBhIHRoaXJkIGZsYXZvciBvZiBhCi1saWJyYXJ5IGVudHJ5LCB0aGUgb25lIG1hcHBpbmcgdG8gYW4gZXh0ZW5zaW9uIGRpcmVjdG9yeS4KLTxwPlRodXMsIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB3b3VsZCBqdXN0IGJlIHBhcnRpY3VsYXIgY2FzZXMgb2YgbGlicmFyeQotb25lcywgYW5kIGJlIGVsaWdpYmxlIGluIGNsYXNzcGF0aCB2YXJpYWJsZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2pkb20gYXN0L2FzdC5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9qZG9tIGFzdC9hc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NmU2Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL2pkb20gYXN0L2FzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEwOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+SkRUIC0gQWJzdHJhY3QgU3ludGF4IFRyZWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci1BYnN0cmFjdCBTeW50YXggVHJlZXM8L2gyPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPkxhc3QgcmV2aXNlZCAxNDowMCBGcmlkYXkgT2N0b2JlciAyNiwgMjAwMSAobW9zdAotcmVjZW50IGNoYW5nZSBpbiBibHVlKTwvZm9udD4KLTxwPk9yaWdpbmFsIHdvcmsgaXRlbTogIkV4cG9zaW5nIHRoZSBBU1QgQVBJLiIKLTxwPlJlbGF0ZWQgd29yayBpdGVtOiAiSW1wcm92ZWQgSmF2YSBjb2RlIG1hbmlwdWxhdGlvbiBzdXBwb3J0LCBhZGRyZXNzCi1KRE9NIGxpbWl0YXRpb25zOyBKRE9NIGRvZXNuJ3QgcHJlc2VydmUgbWFya2VycyBhbmQgaXNuJ3QgZG9jdW1lbnQgYXdhcmU7Ci1KRE9NIGZpbmVyIGdyYWluZWQgdXBkYXRlIHN1cHBvcnQgKGUuZy4gY2hhbmdlIG1ldGhvZCBuYW1lLCB0eXBlIG5hbWUpOwotYnVmZmVyIGNvbnRlbnRzIGlzIGR1cGxpY2F0ZWQgaW4gSmF2YSBVSSBkb2N1bWVudCBhbmQgbmVlZHMgdG8gYmUgbWFudWFsbHkKLXN5bmNocm9uaXplZC4iCi08aDM+Ci1CYWNrZ3JvdW5kPC9oMz4KLQotPHVsPgotPGxpPgotcmVmYWN0b3JpbmcgaXMgYSBrZXkgY3VzdG9tZXIgKERpcmsgQi4pPC9saT4KLQotPGxpPgotZm9yIDIuMDogaGF2ZSBnb29kIHN1cHBvcnQgaW4gcGxhY2Ugc28gdGhhdCByZWZhY3RvcmluZyBjYW4gYmUgbWFkZSBhbgotb3BlbiBBUEk7IHdvdWxkIG5lZWQgY29ycmVzcG9uZGluZyBjb3JlIEFQSXMgZm9yIGFic3RyYWN0IHN5bnRheCB0cmVlczwvbGk+Ci0KLTxsaT4KLWN1cnJlbnQgcmVmYWN0b3JpbmcgYXBwb2FjaCB1c2VzIEFTVCB2aXNpdG9yIHdoaWNoIHJ1bnMgcG9zdC1yZXNvbHZlIG9uCi1kZXNpZ25hdGVkIGNvbXBpbGF0aW9uIHVuaXQ8L2xpPgotCi08bGk+Ci12aXNpdG9yIGNvbGxlY3RzIGluZm8gKHBhcmVudCBzdGFjaykgaW5jbHVkaW5nIHNvdXJjZSBwb3NpdGlvbnM8L2xpPgotCi08bGk+Ci11c2VzIG5hbWUgZW52aXJvbm1lbnQgKGJpbmRpbmdzLCBzY29wZXMpIHRvIHZhbGlkYXRlL2xvY2F0ZTwvbGk+Ci0KLTxsaT4KLWFsbCBjaGFuZ2VzIGFyZSBmb3JtdWxhdGVkIGFzIHJlaWZpZWQgdW5kb2FibGUgZWRpdHMgaW4gYSBzb3VyY2UgYnVmZmVyPC9saT4KLQotPGxpPgotYSBiYXRjaCBvZiBjaGFuZ2VzIGFyZSBtYWRlIGF0IGEgdGltZTwvbGk+Ci0KLTxsaT4KLXJlZmFjdG9yaW5nIGRvZXMgbm90IHJlYXNvbiBoeXBvdGhldGljYWxseSAoY2hhbmdlcyBhcmUgdW5kb2FibGUpPC9saT4KLQotPGxpPgotSkRPTSBpcyBub3QgdXNlZCBieSByZWZhY3RvcmluZywgYnV0IHBvdGVudGlhbGx5IGNvdWxkIGJlIChKRE9NIGlzIHVzZWQKLWluc2lkZSBKYXZhIE1vZGVsKTwvbGk+Ci08L3VsPgotRGlyaydzIHdpc2ggbGlzdCB3aXRoIHJlZ2FyZCB0byB0aGUgQVNUIHN1cHBvcnQ6Ci08dWw+Ci08bGk+Ci1jb25zaXN0ZW50IHBvc2l0aW9ucyBpbiBBU1QgKGUuZy4gc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCBzaG91bGQgYWx3YXlzCi1jb3ZlciB0aGUgd2hvbGUgbm9kZSkuPC9saT4KLQotPGxpPgotY29tbWVudCBoYW5kbGluZyBpbiBBU1QuIFNvbWUgbm9kZSBjb250YWluIHByZWNlZGluZyBjb21tZW50cyBvdGhlciBkb24ndDwvbGk+Ci0KLTxsaT4KLVBhcmVudCBwb2ludGVyIGluIEFTVCBub2RlLjwvbGk+Ci0KLTxsaT4KLURhdGEgcG9pbnRlciBpbiBBU1Qgbm9kZS48L2xpPgotCi08bGk+Ci1FeHByZXNzaW9uIHNob3VsZCBwcm92aWRlIGdldFR5cGUgbWV0aG9kIChjYWNoZWQgdmFsdWUgb2YgcmVzb2x2ZVR5cGUoU2NvcGUpKS48L2xpPgotPC91bD4KLQotPGgzPgotU3VtbWFyeSBmcm9tIFNlcHQuIDEwLTExIG1lZXRpbmdzPC9oMz4KLURpcmsgdHJhdmVsbGVkIHRvIFNOWiB0byBkaXNjdXNzIHJlZmFjdG9yaW5nIHJlcXVpcmVtZW50cyBhbmQgcG9zc2libGUKLXNvbHV0aW9ucyB3aXRoIFBoaWxpcHBlIE0uIGFuZCBKZWVtLgotPHA+U29tZSBvZiB0aGUgZm9ybXMgb2Ygc29sdXRpb25zIGRpc2N1c3NlZCwgYnV0IHVsdGltYXRlbHkgYWJhbmRvbmVkOgotPHVsPgotPGxpPgotQSB2YW5pbGxhIERPTS48L2xpPgotCi08dWw+Ci08bGk+Ci10b28gbGltaXRpbmc6IGRpZmZpY3VsdCB0byBwcm92aWRlIGZvciBwcmUtY29tcHV0aW5nIGJpbmRpbmdzLjwvbGk+Ci0KLTxsaT4KLWNsdW1zeSBmb3IgY2xpZW50cyB0byB1c2Ugd2l0aG91dCBBU1Qgbm9kZSB0eXBlcyByZXByZXNlbnRlZCBieSBkaWZmZXJlbnQKLUphdmEgdHlwZXM8L2xpPgotPC91bD4KLQotPGxpPgotQVNUIHBsdXMgcmVzb2x2ZXMgaW5mbyBpbiBmb3JtIG9mIEphdmEgbW9kZWwgZWxlbWVudHMuPC9saT4KLQotPHVsPgotPGxpPgotSmF2YSBtb2RlbCBtZXRob2RzIGFyZSB1bnN1aXRhYmxlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3IgcmVzb2x2ZWQKLW1ldGhvZHMgYmVjYXVzZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGFzIHBlciBzb3VyY2UuPC9saT4KLQotPGxpPgotSXQgaXMgaGFyZCB0byBtYXAgYSB0eXBlIGJhY2sgdG8gYSBKYXZhIGVsZW1lbnQgKG5lZWQgdG8gcmVtZW1iZXIgcGFja2FnZQotZnJhZ21lbnQpLjwvbGk+Ci0KLTxsaT4KLVdvdWxkIG5lZWQgYWRkaXRpb25hbCBKYXZhIG1vZGVsIGVsZW1lbnRzIHRvIHJlcHJlc2VudCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotV291bGQgbmVlZCBzcGVjaWFsIEphdmEgZWxlbWVudCBpbXBsZW1lbnRhdGlvbnMgZm9yIGxvY2FsIHR5cGVzLCBtZXRob2RzLAotYW5kIGZpZWxkcy48L2xpPgotPC91bD4KLTwvdWw+Ci1JbiB0aGUgZW5kLCB3ZSBhZ3JlZWQgb24gQVNUIHBsdXMgYmluZGluZ3M6Ci08dWw+Ci08bGk+Ci1BU1QgaXMgc2ltcGxlIHRyZWUgb2YgdHlwZWQgbm9kZXMgYXMgZGV0ZXJtaW5lZCBieSBwYXJzZXIuPC9saT4KLQotPGxpPgotQSBkaWZmZXJlbnQgSmF2YSB0eXBlIGZvciBlYWNoIEFTVCBub2RlIHR5cGUuPC9saT4KLQotPGxpPgotVEJEOiBhcmUgbm9kZSB0eXBlcyBBUEkgY2xhc3NlcywgQVBJIGludGVyZmFjZXMsIG9yIGJvdGg/PC9saT4KLQotPGxpPgotU2ltcGxlIGNhc2U6IG5vIGJpbmRpbmdzLjwvbGk+Ci0KLTxsaT4KLUJhc2ljIEFTVCBMaWZlY3ljbGU6IGNsaWVudCByZXF1ZXN0cyBBU1Q7IGNvbXBpbGF0aW9uIHVuaXQgaXMgcGFyc2VkIGFuZAotbm9kZXMgYXJlIGNyZWF0ZWQ7IHJvb3QgaXMgaGFuZGVkIGJhY2sgdG8gY2xpZW50OyBBU1QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQKLWFmdGVyIGNsaWVudCBsZXRzIGdvIG9mIGFsbCBBU1Qgbm9kZXMuIEFTVCBpcyBub3QgYWZmZWN0ZWQgaWYgdW5kZXJseWluZwotY29tcGlsYXRpb24gdW5pdCBpcyBjaGFuZ2VkIChpLmUuLCBlYWdlciBwYXJzZSwgd2l0aCBubyByZXNpZHVhbCBkZXBlbmRlbmNlCi1vbiBzdGF0ZSBvZiBmaWxlIGluIHdvcmtzcGFjZSkuPC9saT4KLQotPGxpPgotQW55IHN5bnRheCBlcnJvcnMgZGV0ZWN0ZWQgbmVlZCB0byBiZSByZXBvcnRlZCB0byBjbGllbnQuIFByb2JsZW1zIGFyZQotb3BhcXVlOiBzb3VyY2UgY2hhcmFjdGVyIHBvc2l0aW9uIHBsdXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gQ2xpZW50cwotbmVlZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gQVNUIGlzIG9ubHkgcGFydGlhbCAoZS5nLiwgYnVzdGVkIGZsYWdzKS48L2xpPgotCi08bGk+Ci1QcmVkaWNhdGFibGUgdHJlZXMgd2l0aCBzaW1wbGUgY29ycmVzcG9uZGVuY2UgdG8gc291cmNlIGNvZGUgKHBhcnNlciBzaG91bGQKLW5vdCBvcHRpbWl6ZSBBU1RzKS48L2xpPgotCi08bGk+Ci1SZWxpYWJsZSBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBub2Rlcy48L2xpPgotCi08bGk+Ci1TY3JhdGNoICJkYXRhIiBmaWVsZCBvbiBlYWNoIEFTVCBub2RlIGZvciBjbGllbnQgdG8gcmVjb3JkIGFuIE9iamVjdC48L2xpPgotCi08bGk+Ci1OYXZpZ2F0ZSBBU1QgdXB3YXJkcyBhcyB3ZWxsIGFzIGRvd253YXJkcy4gUGFyZW50IGxpbmsuPC9saT4KLQotPGxpPgotQVNUIHdhbGtlciBmb3IgY29udmVuaWVudCB0cmF2ZXJzYWwuPC9saT4KLQotPGxpPgotQVNUcyBjYW4gYmUgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUuPC9saT4KLQotPGxpPgotUmVhZC13cml0ZSBBU1RzIGNhbiBiZSBtb2RpZmllZCBpbiB0ZXJtcyBvZiBBU1RzLiBBU1Qgbm9kZSBmYWN0b3JpZXMgKG5vCi1KYXZhIHBhcnNlciByZXF1aXJlZCkuIEN1dC9jb3B5L3Bhc3RlLjwvbGk+Ci0KLTxsaT4KLUN1dC9jb3B5L3Bhc3RlIGJldHdlZW4gc2VwYXJhdGUgQVNUcyByZXF1aXJlcyBmcmFnbWVudCBjbG9uaW5nIHRvIHByZXNlcnZlCi1pbmRlcGVuZGVuY2Ugb2Ygc3RvcmFnZS48L2xpPgotCi08bGk+Ci1DbGllbnQgbWF5IGJlIGludGVyZXN0ZWQgaW4gY3V0L2NvcHkvcGFzdGluZyBjb21tZW50cyB0b28uPC9saT4KLQotPGxpPgotTmV3IG5vZGVzIHdvdWxkIG5vdCBjYXJyeSBzb3VyY2UgcG9zaXRpb25zLjwvbGk+Ci0KLTxsaT4KLVJlYWQtd3JpdGUgQVNUIGNhbiBiZSBzZXJpYWxpemVkIGJhY2sgdG8gY29tcGlsYXRpb24gdW5pdCBjaGFyW10uPC9saT4KLQotPHVsPgotPGxpPgotUHJlc2VydmUgZXhpc3RpbmcgY29tbWVudHMsIHdoaXRlc3BhY2UsIGFuZCB1c2Ugb2YgXHUuPC9saT4KLQotPGxpPgotQ29udHJvbCB3aGl0ZXNwYWNlIGFuZCB1c2Ugb2YgXHUgZm9yIGluc2VydGlvbnMuPC9saT4KLQotPGxpPgotUHJvdmlkZSBlZGl0IG1hcCBmb3IgdXBkYXRpbmcgbWFya2Vycy48L2xpPgotPC91bD4KLQotPGxpPgotUmVzb2x2ZWQgQVNUczogYmFzaWMgQVNUIGFubm90YXRlZCB3aXRoIGJpbmRpbmdzIChub24tc3ludGFjdGljIGluZm9ybWF0aW9uKS48L2xpPgotCi08bGk+Ci1CaW5kaW5nIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBBU1QgcGx1cyB0aGUgSmF2YSBtb2RlbCAocmVsYXRpdmUgdG8KLXNvbWUgcHJvamVjdCkuPC9saT4KLQotPGxpPgotQXZhaWxhYmlsaXR5L3ZhbGlkaXR5IG9mIGJpbmRpbmdzIGNlYXNlcyB3aGVuIEphdmEgbW9kZWwgY2hhbmdlcy48L2xpPgotCi08bGk+Ci1DbGllbnQgbXVzdCByZXF1ZXN0IHVwIGZyb250IHRoYXQgYmluZGluZ3MgYmUgY3JlYXRlZC48L2xpPgotCi08bGk+Ci1DZXJ0YWluIEFTVCBub2RlcyBnZXQgZGVjb3JhdGVkIHdpdGggYmluZGluZ3MuPC9saT4KLQotPGxpPgotQ2xpZW50IHNob3VsZCBoYXZlIHdheXMgdG8gY29tbXVuaWNhdGUgdXAgZnJvbnQgd2hhdCBraW5kIG9mIGJpbmRpbmdzIGFyZQotcmVxdWlyZWQgYW5kIHdoZXJlLjwvbGk+Ci0KLTxsaT4KLUF2YWlsYWJpbGl0eS92YWxpZGl0eSBvZiBiaW5kaW5ncyBmb3IgYSByZWFkLXdyaXRlIEFTVCBjZWFzZXMgd2hlbiBpdCBpcwotZmlyc3QgbW9kaWZpZWQuPC9saT4KLQotPGxpPgotQmluZGluZ3MgKG5vbi1zeW50YWN0aWMgaW5mb3JtYXRpb24pIGluY2x1ZGVzIHRoaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6PC9saT4KLQotPHVsPgotPGxpPgotUmVzb2x2ZWQgbmFtZXMgLSB3aGljaCB0eXBlLCBmaWVsZCwgbWV0aG9kLCBvciBsb2NhbCB2YXJpYWJsZSBkb2VzIGEgQVNUCi1uYW1lIHJlZmVybmNlIHJlc29sdmUgdG8uPC9saT4KLQotPGxpPgotUmVzb2x2ZWQgdHlwZXMgLSB3aGF0IGlzIHRoZSByZXNvbHZlZCB0eXBlIG9mIGFuIEFTVCBleHByZXNzaW9uIG9yIHR5cGUKLXJlZmVyZW5jZS48L2xpPgotCi08bGk+Ci1SZXNvbHZlZCBzdXBlcnR5cGVzIC0gd2hhdCBhcmUgdGhlIHJlc29sdmVkIHN1cGVydHlwZXMgb2YgYSByZXNvbHZlZCB0eXBlLjwvbGk+Ci0KLTxsaT4KLVJlc29sdmVkIGRlY2xhcmF0aW9ucyAtIHdoYXQgcmVzb2x2ZWQgdHlwZSwgZmllbGQsIG1ldGhvZCwgb3IgbG9jYWwgdmFyaWFibGUKLWRvZXMgYW4gQVNUIGRlY2xhcmF0aW9uIG1hcCB0by48L2xpPgotCi08bGk+Ci1UaHJvd24gZXhjZXB0aW9ucyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCB0eXBlcyBvZiB0aGUgZXhjZXB0aW9ucyB0aHJvd24KLWJ5IGEgZ2l2ZW4gZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQuPC9saT4KLQotPGxpPgotUmVzb2x2ZWQgbWVtYmVycyAtIHdoYXQgYXJlIHRoZSByZXNvbHZlZCBtZW1iZXJzIG9mIGEgcmVzb2x2ZWQgdHlwZS48L2xpPgotPC91bD4KLQotPGxpPgotUHJvYmxlbXMgYWxzbyBzaG91bGQgYmUgcmVwb3J0ZWQgd2l0aCByZXNvbHZpbmcuIFByb2JsZW1zIGFyZSBvcGFxdWU6IHNvdXJjZQotY2hhcmFjdGVyIHBvc2l0aW9uIHBsdXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS48L2xpPgotCi08bGk+Ci1TcGFjZSBmb3IgYmluZGluZ3Mgc3RvcmFnZSBpcyBzaWduaWZpY2FudDsgaW5jcmVhc2VzIG1vbm90b25pY2FsbHkgYXMgbW9yZQotYmluZGluZ3MgYXJlIGFjY2Vzc2VkLjwvbGk+Ci0KLTxsaT4KLVNwYWNlIGZvciBiaW5kaW5ncyBpcyBmb3IgbGlmZXRpbWUgb2YgdGhlIEFTVC48L2xpPgotCi08bGk+Ci1BZHZhbmNlZCBBU1QgTGlmZWN5Y2xlOiBjbGllbnQgcmVxdWVzdHMgQVNUIHdpdGggYmluZGluZ3M7IGNvbXBpbGF0aW9uCi11bml0IGlzIHBhcnNlZCwgbm9kZXMgY3JlYXRlZCwgYW5kIHBlcmhhcHMgc29tZSBiaW5kaW5ncyBjcmVhdGVkIGFuZCBhbm5vdGF0ZWQKLW9uIG5vZGVzOyByb290IGlzIGhhbmRlZCBiYWNrIHRvIGNsaWVudDsgQVNUIGlzIGdhcmJhZ2UgY29sbGVjdGVkIGFmdGVyCi1jbGllbnQgbGV0cyBnbyBvZiBhbGwgQVNUIG5vZGVzIGFuZCBiaW5kaW5ncy4gQVNUIGl0c2VsZiBpcyBub3QgYWZmZWN0ZWQKLWlmIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdCBpcyBjaGFuZ2VkIChpLmUuLCBlYWdlciBwYXJzZSwgd2l0aCBubyByZXNpZHVhbAotZGVwZW5kZW5jZSBvbiBzdGF0ZSBvZiBmaWxlIGluIHdvcmtzcGFjZSkuIEJpbmRpbmdzIG1heSBiZWNvbWUgc3RhbGUgb3IKLWludmFsaWQgaWYgd29ya3NwYWNlIGNoYW5nZXMgKGkuZS4sIHBvc3NpYmx5IGxhenkgYW5kIGluY3JlbWVudGFsIGNvbnN0cnVjdGlvbgotb2YgYmluZGluZ3MgdXNpbmcgSmF2YSBtb2RlbCkuPC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPkJpbmRpbmdzIGZyb20gdHdvIEFTVHMgYXJlIG5vdCBnZW5lcmFsbHkgY29tcGFyYWJsZS48L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPkZvciBiaW5kaW5ncyB3aXRoIHN0YWJsZSBnbG9iYWwgbmFtZXMsIEFQSSBwcm92aWRlcwotc3RyaW5ncyB0aGF0IGNhbiBiZSBjb21wYXJlZCBiZXR3ZWVuIEFTVHMuPC9mb250PjwvbGk+Ci08L3VsPgotPC91bD4KLUFTVCB3aWxsIGVpdGhlciBleHRlbmQgb3IgcmVwbGFjZSBKRE9NLiBJbiB0aGUgbGF0dGVyIGNhc2UsIEpET00gd291bGQKLWJlIGRlcHJlY2F0ZWQuCi08cD5BU1Qgd2lsbCBleGlzdCBhbG9uZyBzaWRlIEphdmEgbW9kZWwuCi08aDM+Ci1BUEkgRGVzaWduIElzc3VlOiBBU1QgTm9kZSBUeXBlcyAtIENsYXNzZXMsIGludGVyZmFjZSwgb3IgYm90aDwvaDM+Ci1UaGVyZSBhcmUgb24gdGhlIG9yZGVyIG9mIDg3IG5vZGUgdHlwZXMgZm9yIEphdmEgQVNUcy4gQmluZGluZ3Mgd2lsbCBhZGQKLXNvbWUgbW9yZS4gVGhlcmUgYXJlIGEgY291cGxlIG9mIHdheSB0aGlzIGNhbiBiZSBtYXBwZWQgdG8gSmF2YSB0eXBlcy4KLTxwPigxKSBVc2Ugb3JnLnczYy5ET00gaW50ZXJmYWNlcyBhcyBBUEkuIFByb3ZpZGUgYSBwcml2YXRlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCi1vZiB0aGUgRE9NLgotPHA+UHJvOiBWZXJ5IHNtYWxsLCBhbmQgc3RhbmRhcmQgQVBJIGZvciByZWFkLXdyaXRlIGRvY3VtZW50cy4KLTxicj5Db246IEFQSSBpcyBub3QgY29udmVuaWVudCBmb3IgY2xpZW50cy4KLTxicj5Db246IEFQSSBpcyBub3QgYW1lbmFibGUgdG8gZXhwb3NpbmcgYmluZGluZ3MgYW5kIG90aGVyIG5vbi1zdHJ1Y3R1cmFsCi1pbmZvcm1hdGlvbi4KLTxwPigyKSBDb25jcmV0ZSBBUEkgY2xhc3MgcGVyIEFTVCBub2RlIHR5cGUuCi08cD5Qcm86IEFQSSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KLTxicj5Qcm86IENsaWVudCBjYW4gY3JlYXRlIG5vZGVzIGRpcmVjdGx5LgotPHA+Q29uOiBDYW5ub3QgZWFzaWx5IGhpZGUgaW1wbGVtZW50YXRpb24gZGV0YWlsczsgZS5nLiByZXByZXNlbnRhdGlvbgotYW5kIG1lY2hhbmlzbSBmb3IgcmVhc3NlbWJsaW5nIGNvbXBpbGF0aW9uIHVuaXQgdGV4dCBhZnRlciBlZGl0aW5nOyBsYXp5Ci1iaW5kaW5nIGNyZWF0aW9uLgotPHA+Q2xpZW50cyB3aG8gY3JlYXRlIG5vZGUgZnJvbSBzY3JhdGNoIG9ubHkgZXZlciBuZWVkIGJhc2ljIGNvbnN0cnVjdG9ycwotKHRoZSBub2RlcyB0aGV5IGNyZWF0ZSBkbyBub3QgaGF2ZSBzb3VyY2UgcG9zaXRpb25zLCBiaW5kaW5ncywgb3Igb3RoZXIKLWRlY29yYXRpb25zKS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBwYXJzZXIgbmVlZHMgdG8gcmVtZW1iZXIgbW9yZSBpbmZvCi1pbmNsdWRpbmcgZmluZS1ncmFpbmVkIHNvdXJjZSBwb3NpdGlvbnMuCi08cD4oMykgQVBJIGludGVyZmFjZSBwZXIgQVNUIG5vZGUgdHlwZSwgYWxvbmcgd2l0aCBub2RlIGZhY3RvcnkgbWV0aG9kcy4KLVByb3ZpZGUgYSBwcml2YXRlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uLiBBbGxvdyBjbGllbnRzIHRvIHJlaW1wbGVtZW50Ci1ub2RlIHR5cGVzIChmcm9tIHNjcmF0Y2gpIGFuZCBzdXBwbHkgYSBmYWN0b3J5LgotPHA+TGlrZSBKRE9NIChleGNlcHQgSkRPTSBkb2VzIG5vdCBwZXJtaXQgY2xpZW50IHRvIHJlaW1wbGVtZW50KSBhbmQgb3JnLnczYy5kb20uCi08cD5Qcm86IEFQSSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KLTxicj5Qcm86IEVhc3kgdG8gdGFpbG9yIGRpZmZlcmVudCBraW5kcyBvZiByZXByZXNlbnRhdGlvbjogcmVhZC13cml0ZSB2cy4KLXJlYWQtb25seSBBU1RzOyByYXcgQVNUcyB2cy4gQVNUK2JpbmRpbmdzLgotPHA+Q29uOiZuYnNwOyBIaWRkZW4gY29uY3JldGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyB0YWtlcyBtb3JlIHNwYWNlLgotPGJyPkNvbjogVXNpbmcgZmFjdG9yeSBtZXRob2RzIGlzIGEgYml0IGxlc3MgZGlyZWN0IHRoYW4gdXNpbmcgY29uc3RydWN0b3JzLgotPHA+V2Ugd2lsbCB1c2UgQVBJIGludGVyZmFjZXMgZm9yIGJpbmRpbmdzLCBhbmQgZXhwb3NlZCBBUEkgY2xhc3NlcyBmb3IKLUFTVCBub2Rlcy4KLTxoMz4KLUFQSSBEZXNpZ24gSXNzdWU6IFN0YXRlbWVudCB2cy4gU3RhdGVtZW50IExpc3RzPC9oMz4KLUZvciBzdHJ1Y3R1cmVkIHN0YXRlbWVudHMsIGxpa2Ugd2hpbGUsIHRoZSBjaGlsZCBzdGF0ZW1lbnQgaXMgZ3JhbW1hdGljYWxseQotYSBzaW5nbGUgc3RhdGVtZW50LiBIb3dldmVyLCBzaW5jZSBhIGJsb2NrIGlzIG9uZSB0eXBlIG9mIHN0YXRlbWVudCwgaXQKLWlzIHBvc3NpYmxlIHRvIGhhdmUgYSBsaXN0IG9mIHN0YXRlbWVudHMgdW5kZXJuZWF0aC4gVGhlcmUgYXJlIG9wdGlvbnMKLWZvciByZW5kZXJpbmcgdGhpczoKLTxwPigxKSBDaGlsZCBpcyBhIHNpbmdsZSBzdGF0ZW1lbnQuCi08cD4oTGlrZSBjdXJyZW50IGNvbXBpbGVyJ3MgaW50ZXJuYWwgQVNUcy4pCi08cD5Qcm86IEFzIHBlciB0aGUgSmF2YSBncmFtbWFyLgotPGJyPkNvbjogQSBjbGllbnQgd2FudGluZyB0byBpbnNlcnQgYW4gYWRkaXRpb25hbCBzdGF0ZW1lbnQgaW50byB0aGUgY2hpbGQKLW11c3QgYmUgcHJlcGFyZWQgdG8gcmVwbGFjZSBieSBhIGJsb2NrIGlmIHRoZXJlIGlzbid0IG9uZS4KLTxwPigyKSBDaGlsZCBpcyBhIGxpc3Qgb2Ygc3RhdGVtZW50cy4KLTxwPihMaWtlIHRoZSAubmV0IGNvZGVET00uKQotPHA+UHJvOiBNb3JlIGNvbnZlbmllbnQgZm9yIGNsaWVudHMgdGhhdCBlZGl0IEFTVHMuIFVuaWZvcm0gbWVjaGFuaXNtIGZvcgotaW5zZXJ0aW5nIGFuZCByZW1vdmluZyBzdGF0ZW1lbnRzIGZyb20gY2hpbGQuCi08YnI+Q29uOiBNdWRkaWVzIHNjb3BlcyAoZW5jbG9zaW5nIGJyYWNlcyBhcm91bmQgc3RhdGVtZW50cyBpbnRyb2R1Y2UgYQotc2NvcGUgYW5kIG1ha2UgZGVjbGFyYXRpb25zIHN5bnRhY3RpY2FsbHkgbGVnYWwpLgotPHA+V2Ugd2lsbCBnbyB3aXRoICgxKSBhbmQgc3RpY2sgY2xvc2VseSB0byB0aGUgZ3JhbW1hci4KLTxoMz4KLVVzYWdlPC9oMz4KLVRoZXJlIGFyZSBhIGNvdXBsZSBkaWZmZXJlbnQgdXNhZ2Ugc2NlbmFyaW9zIGZvciBBU1RzOgotPHVsPgotPGxpPgotQW5hbHl6ZSBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0IHRvIGRpc2NvdmVyIHN5bnRhY3RpYyBzdHJ1Y3R1cmUuPC9saT4KLQotPGxpPgotRGlzY292ZXIgcmVsYXRpb25zaGlwIGJldHdlZW4gc3ludGFjdGljIHN0cnVjdHVyZSBhbmQgb3JpZ2luYWwgdGV4dC48L2xpPgotCi08bGk+Ci1EaXNjb3ZlciByZWxhdGlvbnNoaXAgYmV0d2VlbiBzeW50YWN0aWMgc3RydWN0dXJlIGFuZCByZXNvbHZlZCB3b3JsZC48L2xpPgotCi08bGk+Ci1DcmVhdGUgYSBuZXcgY29tcGlsYXRpb24gdW5pdCBmcm9tIHNjcmF0Y2guPC9saT4KLQotPGxpPgotRWRpdCBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0LjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Tb3VyY2UgQ29uc3RydWN0IE5vcm1hbGl6YXRpb248L2gzPgotCi08dWw+Ci08bGk+Ci1Nb3N0IHN5bnRhY3RpYyBjb25zdHJ1Y3Rpb25zIGFyZSByZW5kZXJlZCBpbiBvbmUgYW5kIG9ubHkgb25lIHdheS48L2xpPgotCi08bGk+Ci1XaGVuIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgQVNUIGNvbnN0cnVjdGlvbiBpcyAibG9zc3kiLjwvbGk+Ci0KLTxsaT4KLVNvbWUgZm9ybXMgY2Fubm90IGJlIGRpc3Rpbmd1aXNlZCBpbiBpbnB1dCAoaWYgb25lIGNhcmVzKS48L2xpPgotCi08bGk+Ci1Tb21lIGZvcm1zIGNhbm5vdCBiZSBwcm9kdWNlZCBpbiBvdXRwdXQuPC9saT4KLQotPGxpPgotQ29weWluZyB0aGUgY29uc3RydWN0IG5vcm1hbGl6ZXMgaXQuPC9saT4KLQotPGxpPgotRXhhbXBsZTogTW9kaWZpZXIgb3JkZXI8L2xpPgotCi08dWw+Ci08bGk+Ci1maW5hbCBzdGF0aWMgcHVibGljIGludCBYID0gMTs8L2xpPgotCi08bGk+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBYID0gMTsgLy8gcHJlZmVycmVkIGZvcm08L2xpPgotPC91bD4KLQotPGxpPgotRXhhbXBsZTogQ29tcG91bmQgdmFyaWFibGUgZGVjbGFyYXRpb25zPC9saT4KLQotPHVsPgotPGxpPgotaW50IGkgPSAxLCBqID0gMjs8L2xpPgotCi08bGk+Ci1pbnQgaSA9IDE7IGludCBqID0gMjsmbmJzcDsgLy8gcHJlZmVycmVkIGZvcm08L2xpPgotPC91bD4KLQotPGxpPgotRXhhbXBsZTogQXJyYXkgdHlwZSBkZWNsYXJhdG9yczwvbGk+Ci0KLTx1bD4KLTxsaT4KLWludFtdIHhbXTs8L2xpPgotCi08bGk+Ci1pbnRbXVtdIHg7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUV4YW1wbGU6IFNob3J0IGlmczwvbGk+Ci0KLTx1bD4KLTxsaT4KLWlmIChhKSBmKCk7IGVsc2UgOzwvbGk+Ci0KLTxsaT4KLWlmIChhKSBmKCk7IC8vIHByZWZlcnJlZCBmb3JtPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUNhbiBvbmx5IGJlIGRvbmUgZm9yIHN5bnRhY3RpYyBudWFuY2VzIHRoYXQgYXJlIGhhdmUgbm8gc2VtYW50aWMgaW1wb3J0LjwvbGk+Ci0KLTxsaT4KLU5vcm1hbGl6YXRpb24gaXMgZ2VuZXJhbGx5IGFjY2VwdGFibGUgd2hlcmUgdW5pbXBvcnRhbnQgc3ludGFjdGljIG51YW5jZXMKLWFyZSBpbnZvbHZlZC48L2xpPgotCi08bGk+Ci1Ob3JtYWwgZm9ybSBzaG91bGQgZm9sbG93IEpMUyByZWNvbW1lbmRhdGlvbnMgYW5kIEphdmEgY29kaW5nIHN0YW5kYXJkcy48L2xpPgotCi08bGk+Ci1Ob3RlIHRoYXQgcGFyZW50aGVzZXMgYW5kIGJsb2NrcyBhcmUgaW1wb3J0YW50IHRvIHVzZXIgYW5kIHNob3VsZCBub3QgYmUKLW5vcm1hbGl6ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVNvdXJjZSBQb3NpdGlvbnM8L2gzPgotCi08dWw+Ci08bGk+Ci1XaGVuIEFTVCBpcyBvYnRhaW5lZCBieSBwYXJzaW5nIGEgdGV4dCBzdHJpbmcsIGV4cG9zaW5nIHNvdXJjZSByYW5nZXMgZm9yCi1ub2RlcyBhbGxvd3MgY2xpZW50cyB0byBuYXZpZ2F0ZSBiYWNrIGludG8gb3JpZ2luYWwgc3RyaW5nOyBlLmcuLCBmb3IgbWFraW5nCi10ZXh0IGVkaXRvciBzZWxlY3Rpb25zLjwvbGk+Ci0KLTxsaT4KLUFTVCBzdXBwb3J0cyBvbmx5IGNoYXJhY3Rlci1vcmllbnRlZCBwb3NpdGlvbiBpbmZvcm1hdGlvbjsgbWFwcGluZyBjaGFyYWN0ZXIKLXBvc2l0aW9ucyB0byBsaW5lcyBhcmUgaGFuZGxlZCBlbHNld2hlcmUgKGUuZy4sIHRleHQgZWRpdG9yKS48L2xpPgotCi08bGk+Ci1Tb3VyY2UgcmFuZ2VzIGFyZSBpcnJlbGV2YW50IGZvciBub2RlcyBjcmVhdGVkIGJ5IG90aGVyIG1lYW5zLjwvbGk+Ci0KLTxsaT4KLVNvdXJjZSByYW5nZXMgZ2l2ZSBvcmlnaW5hbCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBzdHJpbmcuPC9saT4KLQotPHVsPgotPGxpPgotRWRpdGluZyB0aGUgQVNUIGRvZXMgbm90IGFsdGVyIHBvc2l0aW9ucyBvciBhbnl0aGluZyBjbGV2ZXIuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLU1vc3QgY29uc3RydWN0cyBvY2N1cHkgY29udGlndW91cyBjaGFyYWN0ZXIgcG9zaXRpb25zLCBvciByYW5nZXMuPC9saT4KLQotPGxpPgotUmFuZ2VzIGFyZSByZXByZXNlbnRlZCBieSAwLWJhc2VkIHN0YXJ0IHBvc2l0aW9uIGFuZCBsZW5ndGguPC9saT4KLQotPGxpPgotU3RhcnQgcG9zaXRpb24gYmVnaW5zIGF0IGZpcnN0IHNpZ25pZmljYW50IGNoYXJhY3RlciBvZiBjb25zdHJ1Y3QgY29ycmVzcG9uZGluZwotdG8gQVNUIG5vZGUuPC9saT4KLQotPHVsPgotPGxpPgotRmlyc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyLjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgbGVhZGluZyB3aGl0ZXNwYWNlLjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgcHJlY2VkaW5nIGNvbW1lbnQgKGV4Y2VwdCB0aGUgamF2YWRvYyBjb21tZW50IHByZWNlZGluZwotYSBkZWNsYXJhdGlvbiwgb3IgdGhlIGNvbW1lbnQgcHJlY2VkaW5nIGEgc3RhdGVtZW50IC0gc2VlIGJlbG93KS48L2xpPgotPC91bD4KLQotPGxpPgotRW5kIHBvc2l0aW9uIGluY2x1ZGVzIGxhc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyIG9mIGNvbnN0cnVjdCBjb3JyZXNwb25kaW5nCi10byBBU1Qgbm9kZS48L2xpPgotCi08dWw+Ci08bGk+Ci1MYXN0IHNpZ25pZmljYW50IGNoYXJhY3Rlci48L2xpPgotCi08bGk+Ci1JbmNsdWRlcyB0cmFpbGluZyB0ZXJtaW5hdG9ycyB0aGF0IGFyZSBwYXJ0IG9mIGNvbnN0cnVjdDsgZS5nLiwgaW5jbHVkZQotdHJhaWxpbmcgc2VtaWNvbG9uIGF0IGVuZCBvZiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbi48L2xpPgotCi08bGk+Ci1Eb2VzIG5vdCBpbmNsdWRlIHNlcGFyYXRvcnM7IGUuZy4sIGV4Y2x1ZGUgdHJhaWxpbmcgY29tbWEgaW4gcGFyYW1ldGVyCi1saXN0LjwvbGk+Ci0KLTxsaT4KLURvZXMgbm90IGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZS48L2xpPgotCi08bGk+Ci1Eb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIGNvbW1lbnQuPC9saT4KLQotPGxpPgotU3RhdGVtZW50IGVuZC1vZi1saW5lIGNvbW1lbnRzIGFyZSBub3QgZW5jb21wYXNzZWQgYnkgc3RhdGVtZW50LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLTx0dD5TeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIik7IC8vICRub24tbmxzJDwvdHQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5FbWJlZGRlZCBjb21tZW50cyBhcmUgZW5jb21wYXNzZWQgaWYgdGhleSBvY2N1ciBiZWZvcmUKLWVuZCBwb3NpdGlvbi48L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj5TeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIikgLyogY29tbWVudCAqLzs8L2ZvbnQ+PC90dD48L2xpPgotPC91bD4KLTwvdWw+Ci0KLTxsaT4KLVNvbWUgbm9kZSB0eXBlcyB3b3VsZCBoYXZlIHNvdXJjZSByYW5nZXMgZm9yIHNpZ25pZmljYW50IGNvbnRpZ3VvdXMgc3ViY29uc3RydWN0cwotbm90IHJlYWRpbHkgZ2xlYW5hYmxlIGZyb20gc291cmNlIHJhbmdlcyBvZiB0aGUgc3Vibm9kZXMuPC9saT4KLQotPHVsPgotPGxpPgotQWRkaXRpb25hbCBzb3VyY2UgcmFuZ2VzIHdvdWxkIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBub2RlIHR5cGUuPC9saT4KLQotPGxpPgotRS5nLiwgbWV0aG9kIGRlY2xhcmF0aW9uIGhhcyBhZGRpdGlvbmFsIHNvdXJjZSByYW5nZSBmb3IgdGhlIG1ldGhvZCBuYW1lCi1hbmQgZm9yIHRoZSBtZXRob2QgZGVjbGFyYXRpb24gZXhjbHVkaW5nIGl0cyBqYXZhZG9jIGNvbW1lbnQuPC9saT4KLQotPGxpPgotVXNlIHN0YXJ0IGFuZCBsZW5ndGggYXJyYXlzIHJhdGhlciB0aGFuIHByb2xpZmVyYXRlIEFQSSBtZXRob2RzIGZvciBhZGRpdGlvbmFsCi1zb3VyY2UgcmFuZ2VzLjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotVW5pY29kZSBFc2NhcGVzPC9oMz4KLQotPHVsPgotPGxpPgotT3JpZ2luYWwgc291cmNlIHRleHQgbWlnaHQgY29udGFpbiBVbmljb2RlIGVzY2FwZXMgKEpMUyAzLjIsIDMuMykuPC9saT4KLQotPGxpPgotRS5nLiwgdm9pZFx1MDA0MFx1MDA1YSgpOyBkZWNsYXJlcyBhIG1ldGhvZCBuYW1lZCBaLjwvbGk+Ci0KLTxsaT4KLVNjYW5uZXIgcmVtb3ZlcyBhbGwgVW5pY29kZSBlc2NhcGVzIGFuZCByZXR1cm5zIGEgVW5pY29kZSB0b2tlbiBzdHJlYW0uPC9saT4KLQotPGxpPgotTmV3bHkgY3JlYXRlZCBBU1Qgbm9kZXMgYXJlICJwb3N0IiBVbmljb2RlIGVzY2FwaW5nLjwvbGk+Ci0KLTxsaT4KLU91dHB1dCBvcHRpb25zOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVByZXNlcnZlIGV4aXN0aW5nIFVuaWNvZGUgZXNjYXBlcyAoZGVmYXVsdCk7IHJlbW92ZSBhbGwgZXhpc3RpbmcgVW5pY29kZQotZXNjYXBlcy48L2xpPgotCi08bGk+Ci1EbyBub3QgaW50cm9kdWNlIFVuaWNvZGUgZXNjYXBlcyAoZGVmYXVsdCk7IGludHJvZHVjZSBVbmljb2RlIGVzY2FwZXMgZm9yCi1jaGFyYWN0ZXJzIGluIGEgc3BlY2lmaWVkIHNldCAoZS5nLiwgYWxsIG5vbi1BU0NJSSkuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUluaXRpYWwgaW1wbGVtZW50YXRpb246IHN1cHBvcnQgZGVmYXVsdCBiZWhhdmlvciBvbmx5LjwvbGk+Ci08L3VsPgotCi08aDM+Ci1Db21tZW50czwvaDM+Ci0KLTx1bD4KLTxsaT4KLUNvbW1lbnRzIGFyZSBwcm9ibGVtYXRpYyBmb3IgQVNUczsgdGhlc2UgbGV4aWNhbCBpdGVtcyBhcmUgbm9ybWFsbHkgZmlsdGVyZWQKLW91dCBvZiB0b2tlbiBzdHJlYW0uPC9saT4KLQotPGxpPgotQ29tbWVudHMgYXJlIHNpZ25pZmljYW50IHRvIHVzZXIuPC9saT4KLQotPGxpPgotRWRpdGluZyBhbiBleGlzdGluZyBjb21waWxhdGlvbiB1bml0IHNob3VsZCBnZW5lcmFsbHkgcHJlc2VydmUgZXhpc3RpbmcKLWNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLVNob3VsZCBiZSBhYmxlIHRvIGluY2x1ZGUgY29tbWVudHMgZm9yIG5ld2x5IGNyZWF0ZWQgc3VidHJlZXMuPC9saT4KLQotPGxpPgotQ29weWluZyBhIHN1YnRyZWUgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlciBzaG91bGQgaW5jbHVkZSByZWxldmFudCBjb21tZW50cy48L2xpPgotCi08bGk+Ci1Nb3N0IGNvbW1vbiBmb3JtcyBvZiBjb21tZW50czo8L2xpPgotCi08dWw+Ci08bGk+Ci1KYXZhZG9jIGNvbW1lbnRzIC0gb24gb25lIG9yIG1vcmUgbGluZXMgcHJlY2VkaW5nIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlCi1kZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotQm9pbGVycGxhY2UgY29tbWVudHMgKGNvcHlyaWdodCBub3RpY2VzKSAtIG9uZSBvciBtb3JlIGxpbmVzIHByZWNlZGluZwotdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24sIG9yIGJldHdlZW4gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gYW5kIGZpcnN0IGltcG9ydAotb3IgdHlwZSBkZWNsYXJhdGlvbi48L2xpPgotCi08bGk+Ci1TdGF0ZW1lbnQgY29tbWVudHMgLSBvbmUgb3IgbW9yZSBsaW5lcyBiZXR3ZWVuIHN0YXRlbWVudHMgaW4gYSBibG9jay48L2xpPgotCi08bGk+Ci1TdGF0ZW1lbnQgZW5kLW9mLWxpbmUgY29tbWVudHMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVZBL1NUIGV4cGVyaWVuY2U6IG5vdCB3b3J0aCBiZW5kaW5nIG92ZXIgYmFja3dhcmRzIHRvIGFjY29tb2RhdGUgYWxsIGNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLURldGVybWluZWQgY2xpZW50cyBjYW4gcmVzY2FuIG9yaWdpbmFsIHN0cmluZyB0byBnZXQgYXQgYWxsIGNvbW1lbnRzLjwvbGk+Ci0KLTxsaT4KLUV4cG9zZSBoaWdoIHZhbHVlIGNvbW1lbnRzOjwvbGk+Ci0KLTxsaT4KLUphdmFkb2MgY29tbWVudHMgLSB0cmVhdCBhcyBhdHRyaWJ1dGUgb2YgdGhlIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlIGRlY2xhcmF0aW9ucy48L2xpPgotCi08dWw+Ci08bGk+Ci1DbGllbnRzIGNhbiBleHRyYWN0IEphdmFkb2MgYXR0cmlidXRlcyAoaW5jbHVkaW5nIEBkZXByZWNhdGVkKS48L2xpPgotCi08bGk+Ci1DbGllbnRzIGNhbiBjcmVhdGUgZGVjbGFyYXRpb25zIHdpdGggSmF2YWRvYy48L2xpPgotPC91bD4KLQotPGxpPgotU3RhdGVtZW50IGNvbW1lbnRzIHdpdGhpbiBibG9ja3M8L2xpPgotCi08dWw+Ci08bGk+Ci1BcHByb2FjaCAxOiBUcmVhdCBhcyBwc2V1ZG8tc3RhdGVtZW50cyB3aXRoIGEgc3BlY2lhbCBBU1Qgbm9kZSB0eXBlLjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVBybzogQ2xpZW50cyBjYW4gaW5jbHVkZSBjb21tZW50cyB3aXRoIGJsb2Nrcy48L2xpPgotCi08bGk+Ci1Db246IE9ubHkgd29ya3MgZm9yIGNvbW1lbnRzIHdpdGhpbiBnZW51aW5lIGJsb2Nrcy4gRS5nLiwgY2FuJ3QgaGFuZGxlPC9saT4KLQotPGxpPgotPHR0PmlmICh0ZXN0KTwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBzaG91bGQgbm90IGhhcHBlbjwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOzwvdHQ+PC9saT4KLQotPGxpPgotV291bGQgd29yayBiZXR0ZXIgaWYgd2Ugd2VyZSB1c2luZyBzdGF0ZW1lbnQgbGlzdHMgaW4gbW9yZSBwbGFjZXMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUFwcHJvYWNoIDI6IFRyZWF0IGFzIGEgcHJvcGVydHkgb2YgZm9sbG93aW5nIHN0YXRtZW50IG5vZGUuPC9saT4KLQotPHVsPgotPGxpPgotUHJvOiBDbGllbnRzIGNhbiBpbmNsdWRlIGNvbW1lbnRzIGJlZm9yZSBhbnkgc3RhdGVtZW50LjwvbGk+Ci0KLTxsaT4KLUNvbjogRG9lcyBub3QgaGFuZGxlIHRyYWlsaW5nIGNvbW1lbnRzIGluIGJsb2Nrcy4gRS5nLiw8L2xpPgotCi08bGk+Ci08dHQ+ezwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOzwvdHQ+PC9saT4KLQotPGxpPgotPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBjYW4ndCByZWFjaCBoZXJlPC90dD48L2xpPgotCi08bGk+Ci08dHQ+fTwvdHQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLVJlY29tbWVuZCBhcHByb2FjaCAyIHNpbmNlIGl0IGNvdmVycyBtb3N0IGNhc2VzLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1Cb2lsZXJwbGF0ZSBjb21tZW50cyB3b3VsZCBub3QgYmUgZXhwb3NlZCwgYnV0IHdvdWxkIGJlIHByZXNlcnZlZCB0aHJvdWdoCi1lZGl0IGFuZCBvdXRwdXQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVdoaXRlc3BhY2U8L2gzPgotCi08dWw+Ci08bGk+Ci1XaGl0ZXNwYWNlIChKTFMgMy42KSBpbmNsdWRlcyBBU0NJSSBTUCwgSFQsIGFuZCBGRiBjaGFyYWN0ZXJzLCBhbmQgbGluZQotdGVybWluYXRvcnMuPC9saT4KLQotPGxpPgotTGlrZSBjb21tZW50cywgd2hpdGVzcGFjZSBpcyBzaWduaWZpY2FudCB0byB1c2VyLjwvbGk+Ci0KLTxsaT4KLUVkaXRpbmcgYW4gZXhpc3RpbmcgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgZ2VuZXJhbGx5IHByZXNlcnZlIHdoaXRlc3BhY2UuPC9saT4KLQotPGxpPgotV2hpdGVzcGFjZSBmb3IgbmV3bHkgY3JlYXRlZCBzdWJ0cmVlcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB0byBwcm9kdWNlCi1vdXRwdXQgdGhhdCBmb2xsb3dzIGNvbW1vbiBjb252ZW50aW9ucyBhbmQgYmxlbmRzIGluIHdpdGggc3Vycm91bmRpbmcgdGV4dAotKHVzZSB0aGUgc2FtZSBsZWFkaW5nIHdoaXRlc3BhY2UpLjwvbGk+Ci0KLTxsaT4KLUNvcHlpbmcgYSBzdWJ0cmVlIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIgc2hvdWxkIHNob3VsZCBnZW5lcmFsbHkgcHJlc2VydmUKLXdoaXRlc3BhY2UuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUFTVCBQYXJlbnQgQmFja3BvaW50ZXI8L2gzPgotCi08dWw+Ci08bGk+Ci1FYWNoIEFTVCBub2RlIHdpbGwgY2FycnkgYSBiYWNrcG9pbnRlciB0byBpdHMgcGFyZW50IG5vZGUuPC9saT4KLQotPGxpPgotQVNUTm9kZS5nZXRQYXJlbnQoKSByZXR1cm5zIEFTVE5vZGU8L2xpPgotCi08bGk+Ci1UaGlzIHBlcm1pdHMgY2xpZW50cyB0byB0cmF2ZXJzZSBBU1RzIGluIHVwd2FyZCBhcyB3ZWxsIGFzIGRvd253YXJkIGRpcmVjdGlvbi48L2xpPgotCi08bGk+Ci1CaWRpcmVjdGlvbmFsIGxpbmtzIG11c3QgYmUgbWFpbnRhaW5lZCBkdXJpbmcgZWRpdGluZy48L2xpPgotCi08bGk+Ci1EZWxldGlvbiBBUEkgbXVzdCB1bmxpbmsgY2hpbGQgZnJvbSBwYXJlbnQuPC9saT4KLQotPGxpPgotSW5zZXJ0aW9uIEFQSSBtdXN0IGxpbmsgY2hpbGQgdG8gcGFyZW50LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVRvIHByZXNlcnZlIHRyZWVuZXNzLCBhdXRvbWF0aWNhbGx5IGNsb25lIGNoaWxkIHN1YnRyZWUgaWYgY2hpbGQgYWxyZWFkeQotaGFzIHBhcmVudC48L2xpPgotPC91bD4KLQotPGxpPgotUmVwbGFjZSBBUEkgbXVzdCB1bmxpbmsgb2xkIGNoaWxkIGJlZm9yZSBpbnNlcnRpbmcgbmV3IGNoaWxkLjwvbGk+Ci0KLTxsaT4KLVBhcmVudCBiYWNrbGlua3MgbWVhbnMgdGhhdCBoYW5naW5nIG9uIHRvIDxpPmFueTwvaT4gbm9kZSBpbiBhbiBBU1QgaW5zdGFuY2UKLXdpbGwgcHJldmVudCBhbnkgcGFydCBvZiB0aGUgQVNUIGluc3RhbmNlIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLU11bHRpcGxlIEFTVHM8L2gzPgotCi08dWw+Ci08bGk+Ci1NdWxpcGxlIEFTVHMgY2FuIGV4aXN0IHNpZGUgYnkgc2lkZSAoYW5kIEFTVHMgYXJlIHBvdGVudGlhbGx5IGZvciBzYW1lCi1jb21waWxhdGlvbiB1bml0KS48L2xpPgotCi08bGk+Ci1BbGxvdyBpbnNlcnRpb24gb2Ygbm9kZXMgZnJvbSBvbmUgQVNUIGludG8gYW5vdGhlciBBU1QuPC9saT4KLQotPHVsPgotPGxpPgotQXV0b21hdGljYWxseSBjbG9uZXMgY2hpbGQgc3VidHJlZSAoZm9yZ2V0dGluZyBzb3VyY2UgcG9zaXRpb25zIGFuZCBiaW5kaW5nCi1kZWNvcmF0aW9ucykuPC9saT4KLQotPGxpPgotRW5zdXJlIG1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBBU1RzIHJlbWFpbiBjb21wbGV0ZWx5IGluZGVwZW5kZW50LjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlN0cnVjdHVyYWwgRXF1YWxpdHk8L2ZvbnQ+PC9oMz4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlN0cnVjdHVyYWwgZXF1YWxpdHkgcHJlZGljYXRlIG9uIEFTVCBub2Rlcy48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPklzb21vcnBoaWMgc3VidHJlZXMuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5CZWxvbmdpbmcgdG8gc2FtZSBvciBkaWZmZXJlbnQgQVNULjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+Q29uc2lkZXJzIHN0cnVjdHVyYWwgaW5mbyBvbmx5OyBpZ25vcmVzIHNvdXJjZSBwb3NpdGlvbnMsCi1iaW5kaW5ncywgZXRjLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+TmFtZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gImVxdWFscyIgdG8gYXZvaWQgaGF2aW5nCi10byByZWltcGxlbWVudCBoYXNoQ29kZSB0b28uPC9mb250PjwvbGk+Ci08L3VsPgotCi08aDM+Ci1TeW50YWN0aWMgQ29ycmVjdG5lc3Mgb2YgUGFyc2VyLWJ1aWx0IEFTVHM8L2gzPgotCi08dWw+Ci08bGk+Ci1Gb3IgQVNUcyBidWlsdCBieSBhIEphdmEgcGFyc2VyLCB0aGVyZSBhcmUgaXNzdWVzIG9mIHN5bnRhY3RpYyBjb3JyZWN0bmVzcy48L2xpPgotCi08bGk+Ci1TeW50YWN0aWMgY29ycmVjdG5lc3MgaXMganVkZ2VkIGJ5IHRoZSBTeW50YWN0aWMgR3JhbW1hciAoYXMgZGVmaW5lZCBpbgotSkxTMiBzZWN0aW9uIDIuMykuPC9saT4KLQotPGxpPgotSmF2YSBwYXJzZXIgPGI+bXVzdDwvYj4gZ3VhcmFudGVlIHRvIHByb2R1Y2UgYSBmYWl0aGZ1bCBBU1QgZm9yIGFueSBzeW50YWN0aWNhbGx5Ci1jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPGxpPgotSmF2YSBwYXJzZXIgPGI+bWF5PC9iPiBhbHNvIGJ1aWxkIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uCi11bml0cy48L2xpPgotCi08bGk+Ci1Db21wbGljYW50IEphdmEgY29tcGlsZXJzIG11c3QgcmVqZWN0IHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uCi11bml0cy48L2xpPgotCi08bGk+Ci1XaGF0IHByaW5jaXBsZSBkbyB3ZSBhcHBseSB0byBKYXZhIHBhcnNlcnMgYW5kIHRoZSBBU1RzIHRoZXkgcmV0dXJuPzwvbGk+Ci0KLTxsaT4KLVJlYWwgSmF2YSBwYXJzZXJzIGFyZSBpbnZhcmlhYmx5IG1vcmUgbGliZXJhbCB0aGFuIHRoZSBTeW50YWN0aWMgR3JhbW1hciwKLWFuZCByZWx5IG9uIHBvc3QtcGFyc2UgY2hlY2tzIHRvIHJlcG9ydCBlcnJvcnMgZm9yIGFueSBzeW50YWN0aWNhbGx5IGluY29ycmVjdAotY29uc3RydWN0cyB0aGF0IG1ha2VzIGl0IHBhc3QgdGhlIHBhcnNlci48L2xpPgotCi08dWw+Ci08bGk+Ci1FLmcuLCBjb25mbGljdGluZyBtb2RpZmllcnM6IHB1YmxpYyBwcml2YXRlPC9saT4KLQotPGxpPgotRS5nLiwgZmllbGQgZGVjbGFyZWQgd2l0aCBubyBpbml0aWFsaXplciBvY2N1cnMgaW4gYW4gaW50ZXJmYWNlPC9saT4KLQotPGxpPgotRS5nLiwgdm9pZCBmb28oKSBbXTs8L2xpPgotPC91bD4KLQotPGxpPgotSW4gdGhlIGN1cnJlbnQgRWNsaXBzZSBjb21waWxlciwgbWFueSBvZiB0aGVzZSBjaGVja3MgYXJlIGRvbmUgaW4gdGhlIGNvdXJzZQotb2YgdHlwZSBhbmQgbmFtZSByZXNvbHV0aW9uLiBJZiBjbGllbnQgb25seSB3YW50cyBBU1QsIHdlIHdhbnQgdG8gYXZvaWQKLWRvaW5nIGV4cGVuc2l2ZSBuYW1lIGFuZCB0eXBlIGFuYWx5c2lzLjwvbGk+Ci0KLTxsaT4KLUFwcHJvYWNoIDE6IEd1YXJhbnRlZSB0aGF0IG5vIEFTVHMgYXJlIGJ1aWx0IGZvciBzeW50YWN0aWNhbGx5IGluY29ycmVjdAotY29tcGlsYXRpb24gdW5pdHMuPC9saT4KLQotPHVsPgotPGxpPgotWW91IGRvIG5vdCBnZXQgYW4gQVNUIGF0IGFsbCBmb3IgY29tcGlsYXRpb24gdW5pdHMgd2l0aCBzeW50YXggZXJyb3JzLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiB0cnVzdCBwYXJzZXIgdG8gZGlzdGluZ3Vpc2ggc3ludGFjdGljYWxseSBjb3JyZWN0IGZyb20KLWluY29ycmVjdC48L2xpPgotCi08bGk+Ci1Db246IENsaWVudCBjYW5ub3QgbWFuaXB1bGF0ZSBzeW50YWN0aWNhbGx5IGluY29ycmVjdCBjb21waWxhdGlvbiB1bml0cwotYXQgYWxsLjwvbGk+Ci0KLTxsaT4KLUNvbjogUmVxdWlyZXMgcG9zdC1wYXJzZSBjaGVjayB0byBkZXRlY3QgcmVzaWR1YWwgc3ludGF4IGVycm9ycy48L2xpPgotPC91bD4KLQotPGxpPgotQXBwcm9hY2ggMjogUHJvdmlkZSBubyBndWFyYW50ZWUgYWJvdXQgdGhlIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0Ci1jb21waWxhdGlvbiB1bml0cy48L2xpPgotCi08dWw+Ci08bGk+Ci1Zb3UgbWlnaHQgbm90IGdldCBhIHVzZWZ1bCBBU1QgYXQgYWxsLjwvbGk+Ci0KLTxsaT4KLVlvdSBtaWdodCBnZXQgYW4gQVNUIHRoYXQgaGFkIHBpZWNlcyBtaXNzaW5nOyBlLmcuLCBhIG1hbGZvcm1lZCBtZXRob2QKLXdhcyBleGNpc2VkPC9saT4KLQotPGxpPgotWW91IG1pZ2h0IGdldCBhbiBBU1QgdGhhdCBpcyBpbmNvaGVyZW50IG9yIHNlbGYtY29udHJhZGljdG9yeTsgZS5nLiwgYQotdHJhbnNpZW50IGNsYXNzIT88L2xpPgotCi08bGk+Ci1Qcm86IE1heGltdW0gZmxleGliaWxpdHkgZm9yIGltcGxlbWVudGF0aW9uLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiBnZXQgdXNlZnVsIEFTVHMgZm9yIHNvbWUgc3ludGFjdGljYWxseSBpbmNvcnJlY3QgcHJvZ3JhbXMuPC9saT4KLQotPGxpPgotQ29uOiBDbGllbnQgY2Fubm90IHRydXN0IHBhcnNlciB0byBkaXN0aW5ndWlzaCBzeW50YWN0aWNhbGx5IGNvcnJlY3QgZnJvbQotaW5jb3JyZWN0LjwvbGk+Ci08L3VsPgotCi08bGk+Ci1BcHByb2FjaCAzOiBHdWFyYW50ZWUgdGhhdCB0aGUgY2xpZW50IGV4YW1pbmluZyB0aGUgcmVzdWx0aW5nIEFTVCBoYXMgc29tZQotd2F5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0cyBpcyBpbmNvcnJlY3QuPC9saT4KLQotPHVsPgotPGxpPgotUHJpbmljaXBsZTogU3ludGFjdGljIGVycm9ycyBtdXN0IG5vdCBiZSBzdXBwcmVzc2VkLjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlcyBjb3VsZCBjYXJyeSBmbGFncyBpbmRpY2F0aW5nIGNlcnRhaW4gc3ludGF4IHByb2JsZW07IGUuZy4sIGR1cGxpY2F0ZQotbW9kaWZpZXJzIHB1YmxpYyBwdWJsaWM8L2xpPgotCi08bGk+Ci1BIGJpdCBvbiByb290IG5vZGUgY291bGQgc2F5ICJ1bnNwZWNpZmllZCBzeW50YXggZXJyb3JzIi48L2xpPgotCi08bGk+Ci1Db3VsZCBiZSBzcGVjaWFsIEFTVCBub2RlcyB0eXBlcyBpbmRpY2F0aW5nIG1ham9yIHByb2JsZW1zOyBlLmcuLCBib2d1cwotbWV0aG9kIGJvZHk8L2xpPgotCi08bGk+Ci1Db3VsZCBiZSByZXByZXNlbnRhYmxlIGNvbmZpZ3VyYXRpb25zIG9mIEFTVCBub2RlIHR5cGVzIHRoYXQgYXJlIHJlY29nbml6YWJsZQotYXMgc3ludGFjdGlhbGx5IGluY29ycmVjdDsgZS5nLiwgY29uZmxpY3RpbmcgbW9kaWZpZXJzIHB1YmxpYyBwcml2YXRlOwotbWlzc2luZyBmaWVsZCBpbml0aWFsaXplciBpbiBpbnRlcmZhY2U8L2xpPgotCi08bGk+Ci1Qcm86IENsaWVudCBjYW4gdHJ1c3QgcGFyc2VyIHRvIG5vdCBoaWRlIGFueSBzeW50YXggZXJyb3JzIHRoYXQgYXJlIGluCi10aGUgc291cmNlLjwvbGk+Ci0KLTxsaT4KLVBybzogQ2xpZW50IGNhbiBnZXQgdXNlZnVsIEFTVHMgZm9yIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IHByb2dyYW1zLjwvbGk+Ci0KLTxsaT4KLUNvbjogQ2xpZW50IG11c3QgZG8gZXh0cmEgd29yayB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgc3ludGF4IGVycm9ycy48L2xpPgotCi08bGk+Ci1Db246IEV4dHJhIHdvcmsgdG8gaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGlmIG5vIGNsaWVudCByZWFsbHkgY2FyZXMgYWJvdXQKLXRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3ludGFjdGljYWxseSBjb3JyZWN0IGFuZCBpbmNvcnJlY3QuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVRoZSBmaXJzdCBhcHByb2FjaCBpcyB0b28gaGFyc2guIEl0IGlzIG11Y2ggbW9yZSByZWFzb25hYmxlLCBhbmQgaW50ZXJlc3RpbmcsCi10byBiZSBhYmxlIHRvIHdvcmsgd2l0aCBzb21lIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXRzLjwvbGk+Ci0KLTxsaT4KLVRoZSBzZWNvbmQgYXBwcm9hY2ggZmVlbHMgcmVhc29uYWJsZSBpZiBjbGllbnRzIG5ldmVyIGNhcmUgd2hldGhlciB0aGUKLXNvdXJjZSBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3Qgb3Igbm90LjwvbGk+Ci0KLTxsaT4KLVRoZSB0aGlyZCBhcHByb2FjaCBmZWVscyByZWFzb25hYmxlIGlmIHNvbWUgY2xpZW50cyB3b3VsZCBjYXJlIHdoZXRoZXIKLXRoZSBzb3VyY2UgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0IG9yIG5vdC48L2xpPgotCi08bGk+Ci1UaGUgcHJpbmNpcGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcHBvYWNoZXMgaXMgdGhhdAotdGhlIGZvcm1lciBzYW5jdGlvbnMgcXVpZXRseSBzdXBwcmVzc2luZyBzeW50YXggZXJyb3JzIHdoZXJlYXMgdGhlIGxhdHRlcgotcHJlY2x1ZGVzIGl0LjwvbGk+Ci0KLTxsaT4KLVRoZSBuYXR1cmUgb2YgdGhlIEFTVCBub2RlcyBpbmhlcmVudGx5IG1ha2VzIHJvb20gdG8gZXhwcmVzcyBhIHdpZGUgcmFuZ2UKLW9mIHN5bnRhY3RpY2FsbHkgbWFsZm9ybWVkIHByb2dyYW1zLjwvbGk+Ci0KLTxsaT4KLUFuIGV4dHJhIGZsYWcgcGVyIG5vZGUgZm9yICJ1bnNwZWNpZmllZCBzeW50YXggZXJyb3JzIiBzaG91bGQgY292ZXIgdGhlCi1iYXNlcy48L2xpPgotCi08bGk+Ci1UaGUgZXhpc3RpbmcgY29tcGlsZXIncyBBU1RzIGFscmVhZHkgY2FycnkgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGVuYWJsZQotdGhlIGNvbXBpbGVyIHRvIGRvIHRob3JvdWdoIHBvc3QtcGFyc2UgZGV0ZWN0aW5nIG9mIHJlc2lkdWFsIHN5bnRheCBlcnJvcnMuPC9saT4KLQotPGxpPgotVGhlcmVmb3JlIHRoZSB0aGlyZCBhcHByb2FjaCBpcyB3aXRoaW4gZWFzeSByZWFjaC48L2xpPgotCi08bGk+Ci1UaGUgdGhpcmQgYXBwcm9hY2ggZ2l2ZXMgY2xpZW50cyBtb3JlIHRoYW4gdGhlIHNlY29uZCBhcHByb2FjaC48L2xpPgotCi08bGk+Ci1SZWNvbW1lbmRhdGlvbjogd2UgYWRvcHQgdGhlIHRoaXJkIGFwcHJvYWNoLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1TeW50YWN0aWMgQ29ycmVjdG5lc3Mgb2YgTm9uLXBhcnNlci1idWlsdCBBU1RzPC9oMz4KLQotPHVsPgotPGxpPgotQVNUcyBkbyBub3QganVzdCBjb21lIGZyb20gYSBwYXJzZXIuPC9saT4KLQotPHVsPgotPGxpPgotVGhleSBjYW4gYmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2guPC9saT4KLQotPGxpPgotQSBwYXJzZXItYnVpbGQgQVNUIGNhbiBiZSBlZGl0ZWQuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVRoZXNlIEFTVHMgd2lsbCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgdG8gYSBzb3VyY2UgY29tcGlsYXRpb24gdW5pdCAod2h5Ci1lbHNlIHdvdWxkIHRoZXkgZXhpc3Q/KS48L2xpPgotCi08bGk+Ci1XaGF0IGtpbmRzIG9mIHN1cHBvcnQgYW5kIGd1YXJhbnRlZXMgYXJlIGluIHBsYWNlIHRvIGVuc3VyZSB0aGF0IHN1Y2ggYQotc3VpdGFibGUgc291cmNlIGNvbXBpbGF0aW9uIHVuaXQgY2FuIGJlIGdlbmVyYXRlZD88L2xpPgotCi08bGk+Ci1CYXNpYyBndWFyYW50ZWU6IGFueSBBU1QgdGhhdCBjb3VsZCBoYXZlIGNvbWUgZnJvbSBwYXJzaW5nIGEgc3ludGFjdGljYWxseQotY29ycmVjdCBjb21waWxhdGlvbiB1bml0IHdpbGwgc2VyaWFsaXplIHRvIGEgY29tcGlsYXRpb24gdW5pdCB0aGF0IGlzPC9saT4KLQotPHVsPgotPGxpPgotKGEpIHN5bnRhY3RpY2FsbHkgY29ycmVjdDwvbGk+Ci0KLTxsaT4KLShiKSBzdHJvbmdseSBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdC48L2xpPgotCi08bGk+Ci1hbmQgcG9zc2libHkgKGMpIG5vcm1hbGl6ZWQ7IHRoYXQgaXMsIHBhcnNlKHNlcmlhbGl6ZSh4KSkgaXMgaXNvbW9ycGhpYwotdG8geDwvbGk+Ci08L3VsPgotCi08bGk+Ci1UaGVyZSBhcmUgbGlrZWx5IG1hbnkgd2F5cyB0byBnZXQgQVNUcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBzeW50YWN0aWNhbGx5Ci1jb3JyZWN0IGNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgdXNlIGlsbGVnYWwgaWRlbnRpZmllcnMgKCIxYWJjIiBvciAidHJ5IiBvciAiLy8iKS48L2xpPgotCi08bGk+Ci1FLmcuLCB1c2UgaWxsZWdhbCBtb2RpZmllciBjb21iaW5hdGlvbnMgd2l0aCBtb2RpZmllciBiaXQgbWFza3MuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVBvc3Qtc2NyZWVuaW5nIHRoZSBBU1QgZm9yIHN5bnRhY3RpYyBjb3JyZWN0bmVzcyB3b3VsZCBiZSBtaXNndWlkZWQuPC9saT4KLQotPGxpPgotU2hvdWxkIGp1c3QgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIHRoZSBvYnZpb3VzLCBzeW50YWN0aWNhbGx5IGluY29ycmVjdCwKLWNvbXBpbGF0aW9uIHVuaXQuPC9saT4KLQotPGxpPgotTW9yZSBpbXBvcnRhbnRseTogZW5zdXJlIHNlbWFudGljIGVxdWl2YWxlbmNlLjwvbGk+Ci0KLTxsaT4KLU9wZXJhdG9yIHByZWNlZGVuY2UgY3JlYXRlcyBpc3N1ZXM6PC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgZ2l2ZW4gQVNUIGZvciBleHByZXNzaW9uIDx0dD52MSp2MjwvdHQ+LCByZXBsYWNlIDx0dD52MTwvdHQ+IG5vZGUKLWJ5IGV4cHJlc3Npb24gPHR0PnYxK3YzPC90dD4uPC9saT4KLQotPGxpPgotTmFpdmUgc2VyaWFsaXphdGlvbiB5aWVsZHMgPHR0PnYxK3YzKnYyPC90dD4gd2hpY2ggaXMgbm90IHNlbWFudGljYWxseQotZXF1aXZhbGVudCB0byB0aGUgQVNULjwvbGk+Ci0KLTxsaT4KLVJlc3VsdCBzaG91bGQgYmUgKDx0dD52MSt2MykqdjI8L3R0Pi48L2xpPgotCi08bGk+Ci1QYXJlbnRoZXNlcyBtYXkgbmVlZCB0byBiZSBpbnRyb2R1Y2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1OZXN0ZWQgaWYgc3RhdGVtZW50IGNyZWF0ZXMgaXNzdWVzOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUUuZy4sIGdpdmVuIEFTVCBmb3Igc3RhdGVtZW50IDx0dD5pZiAoYSkgZigpOyBlbHNlIGcoKTs8L3R0PiwgcmVwbGFjZSA8dHQ+ZigpOzwvdHQ+Ci1ieSA8dHQ+aWYgKGIpIGgoKTs8L3R0PjwvbGk+Ci0KLTxsaT4KLU5haXZlIHNlcmlhbGl6YXRpb24geWllbGRzIDx0dD5pZiAoYSkgaWYgKGIpIGgoKTsgZWxzZSBnKCk7PC90dD48L2xpPgotCi08bGk+Ci1SZXN1bHQgc2hvdWxkIGJlIDx0dD5pZiAoYSkgaWYgKGIpIGgoKTsgPGI+ZWxzZSA8L2I+OyBlbHNlIGcoKTs8L3R0PjwvbGk+Ci0KLTxsaT4KLUV4dHJhIHZlcmJpYWdlIG1heSBuZWVkIHRvIGJlIGludHJvZHVjZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uPC9saT4KLTwvdWw+Ci08L3VsPgotCi08aDM+Ci1EZWVwIENvbnN0cnVjdHM8L2gzPgotCi08dWw+Ci08bGk+Ci1Tb21lIHByb2dyYW1zIGludm9sdmUgaW1wb3NzaWJseSBkZWVwIGNvbnN0cnVjdHMuPC9saT4KLQotPGxpPgotTXVsdGktbGluZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBleHByZXNzaW9ucyBhcmUgdGhlIG1haW4gb2ZmZW5kZXIuPC9saT4KLQotPHVsPgotPGxpPgotRm9yIGV4YW1wbGUsIDx0dD4iTGluZSAxXFxuIisiTGluZSAyXFxuIisuLi4rIkxpbmUgNTAwMCI8L3R0PjwvbGk+Ci08L3VsPgotCi08bGk+Ci1SdW50aW1lIHN0YWNrcyBibG93IHdoZW4gcmVjdXJzaW5nIG92ZXIgZGVlcCBBU1RzLjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlIHR5cGVzIHNob3VsZCBiZSBkZXNpZ25lZCB0byBrZWVwIHRyZWVzIHJlYXNvbmFibHkgc2hhbGxvdyBmb3IKLXJlYXNvbmFibHkgdHlwaWNhbCBwcm9ncmFtcy48L2xpPgotCi08bGk+Ci1JbnRyb2R1Y2UgTi1hcnkgb3BlcmF0b3IgZXhwcmVzc2lvbiBub2RlIHR5cGUgdG8gZGVhbCB3aXRoIG11bHRpLWxpbmUgc3RyaW5nCi1jb25jYXRlbmF0aW9uIGV4cHJlc3Npb25zLjwvbGk+Ci0KLTxsaT4KLU4uQi4gQ3VycmVudCBjb21waWxlciBwZXJmb3JtcyBjb21waWxlLXRpbWUgY29uY2F0ZW5hdGlvbnMgZHVyaW5nIHBhcnNlCi1waGFzZSB0byBkZWFsIHdpdGggdGhpcyBwcm9ibGVtLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1FZGl0aW5nIFByb3RvY29sPC9oMz4KLQotPHVsPgotPGxpPgotV2hhdCBnZW5lcmFsIGZvcm0gc2hvdWxkIHRoZSBlZGl0aW5nIEFQSSB0YWtlPzwvbGk+Ci0KLTxsaT4KLVNldHRlcnMgb24gcmVjZWl2ZXIgdG8gbWFuaXB1bGF0ZSBpdHMgY2hpbGRyZW4gKHBhcmVudCBuZXZlciBhZmZlY3RlZCk8L2xpPgotCi08dWw+Ci08bGk+Ci1FLmcuLCB3aGlsZVN0YXRlbWVudC5zZXRDb25kaXRpb24obmV3RXhwcmVzc2lvbik8L2xpPgotCi08bGk+Ci1Vc2UgbnVsbCBmb3Igb3B0aW9uYWwgY2hpbGRyZW48L2xpPgotPC91bD4KLQotPGxpPgotVHJlYXQgbGlzdHMgYXMgYW4gYXJyYXktdmFsdWVkIHByb3BlcnR5LjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUUuZy4sIGJsb2NrLmdldFN0YXRlbWVudHMoKSByZXR1cm5zIFN0YXRlbWVudFtdPC9saT4KLQotPGxpPgotRS5nLiwgYmxvY2suc2V0U3RhdGVtZW50cyhTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzKTwvbGk+Ci0KLTxsaT4KLVVzZSBlbXB0eSBsaXN0IGZvciBubyBjaGlsZHJlbiAocmF0aGVyIHRoYW4gbnVsbCk8L2xpPgotPC91bD4KLQotPGxpPgotQWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIGxpc3RzOiB1c2UgQ29sbGVjdGlvbi1saWtlIHByb3RvY29sPC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgYmxvY2suYWRkU3RhdGVtZW50KHBvcywgbmV3Q2hpbGRTdGF0ZW1lbnQpPC9saT4KLQotPGxpPgotRS5nLiwgYmxvY2sucmVtb3ZlU3RhdGVtZW50KG9sZENoaWxkU3RhdGVtZW50KTwvbGk+Ci0KLTxsaT4KLUNvbjogSW5jcmVhc2VkIG51bWJlciBvZiBtZXRob2RzIG9uIEFQSTsgYmFkIHdoZW4gYSBub2RlIHR5cGUgaGFzIHNldmVyYWwKLWxpc3QgcHJvcGVydGllcy48L2xpPgotPC91bD4KLQotPGxpPgotQWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIGRlbGV0ZS9yZXBsYWNlOiB1c2UgcGFyZW50IGJhY2twb2ludGVycyB0byBpbXBsZW1lbnQKLWdlbmVyaWMgZGVsZXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbiB3aGljaCBhZmZlY3QgdGhlIHJlY2VpdmVyJ3MgcmVsYXRpb25zaGlwCi10byBpdHMgcGFyZW50PC9saT4KLQotPHVsPgotPGxpPgotRS5nLiwgb2xkQ2hpbGRTdGF0ZW1lbnQuZGVsZXRlKCk8L2xpPgotCi08bGk+Ci1Db246IHNlbWFudGljcyBvZiBkZWxldGlvbiB1Z2x5IHdoZW4gbm9kZSBvY2N1cnMgb3V0c2lkZSBvZiBhbnkgbGlzdDwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotVXNlciBEYXRhIEZpZWxkPC9oMz4KLQotPHVsPgotPGxpPgotRWFjaCBBU1Qgbm9kZSBoYXMgYSB1c2VyIGRhdGEgc2xvdCByZXNlcnZlZCBmb3IgY2xpZW50IHVzZS48L2xpPgotCi08bGk+Ci1BU1ROb2RlLmdldENsaWVudERhdGEoKSByZXR1cm5zIE9iamVjdDwvbGk+Ci0KLTxsaT4KLUFTVE5vZGUuc2V0Q2xpZW50RGF0YShPYmplY3QgZGF0YSk8L2xpPgotCi08bGk+Ci1UaGUgaW5pdGlhbCB2YWx1ZSBpcyBudWxsLjwvbGk+Ci0KLTxsaT4KLUNsaWVudCBtYXkgdXNlIGZvciBkZWNvcmF0aW9ucywgb3Igd2hhdGV2ZXIuPC9saT4KLQotPGxpPgotQVNUIG5vZGVzIGNyZWF0ZWQgYnkgcGFyc2VyIGNhcnJ5IG5vIGRhdGEgaW5pdGlhbGx5LjwvbGk+Ci0KLTxsaT4KLUFTVCBub2RlcyBjcmVhdGVkIGV4cGxpY2l0bHkgY2Fycnkgbm8gZGF0YSBpbml0aWFsbHkuPC9saT4KLQotPGxpPgotRXZlbiByZWFkLW9ubHkgQVNUcyBoYXZlIHJlYWQtd3JpdGUgZGF0YSBzbG90cy48L2xpPgotCi08bGk+Ci1DbG9uaW5nIGFuIEFTVCBub2RlIGNyZWF0ZXMgYSBuZXcgbm9kZSAoZG9lcyA8Yj5ub3Q8L2I+IGNvcHkgb3IgY2xvbmUgZGF0YSkuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUxpc3RzIG9mIE1lbWJlcnM8L2gzPgotCi08dWw+Ci08bGk+Ci1MaXN0IG9mIGZpZWxkLCBtZXRob2QsIGFuZCB0eXBlIG1lbWJlcnMgb2YgYSB0eXBlIGRlY2xhcmF0aW9uLjwvbGk+Ci0KLTxsaT4KLVRoaXMgbGlzdCBpcyBzeW50YWN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkgaGV0ZXJvZ2Vub3VzLjwvbGk+Ci0KLTxsaT4KLU5vIHN5bnRhY3RpYyBjb25zdHJhaW50cyBvbiBudW1iZXIgYW5kIG9yZGVyLjwvbGk+Ci0KLTxsaT4KLU9yZGVyIGlzIHNpZ25pZmljYW50IHRvIHVzZXIuPC9saT4KLQotPGxpPgotV2l0aGluIGZpZWxkIGRlY2xhcmF0aW9ucywgcmVsYXRpdmUgb3JkZXIgaXMgc2VtYW50aWNhbGx5IHNpZ25pZmljYW50LjwvbGk+Ci0KLTxsaT4KLVN0YW5kYXJkIHByYWN0aWNlczo8L2xpPgotCi08dWw+Ci08bGk+Ci1QbGFjZSBmaWVsZCBkZWNsYXJhdGlvbnMgYmVmb3JlIG1lbWJlciBtZXRob2RzIGFuZCB0eXBlcy48L2xpPgotCi08bGk+Ci1QbGFjZSB0eXBlcyBiZWZvcmUgbWV0aG9kcy48L2xpPgotPC91bD4KLQotPGxpPgotT3B0aW9uICgxKTogZXhwb3NlIHNlcGFyYXRlIGxpc3RzIGZvciBmaWVsZCwgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLVBybzogVGhpcyBpcyB3YXkgaW50ZXJuYWwgQVNUIHdvcmtzLjwvbGk+Ci0KLTxsaT4KLVBybzogQ29udmVuaWVudCBmb3IgY2xpZW50cyB0byBsb2NhdGUgbWVtYmVyIGZpZWxkcywgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLUNvbjogTm90IGZsZXhpYmxlIGZvciBlZGl0aW5nOyBlZGl0aW5nIHdpbGwgbWFuZ2xlIG1lbWJlciBvcmRlci48L2xpPgotCi08bGk+Ci1PcHRpb24gKDIpOiBleHBvc2UgYSBzaW5nbGUgbGlzdCBvZiBtZW1iZXJzPC9saT4KLQotPGxpPgotUHJvOiBwYXJzZXIgZG9lcyBub3Qgbm9ybWFsaXplOyBjbGllbnQgY29udHJvbHMgb3JkZXIgb2YgbWVtYmVycy48L2xpPgotCi08bGk+Ci1Db246IE1vcmUgd29yayBmb3IgY2xpZW50cyB0byBsb2NhdGUgbWVtYmVyIGZpZWxkcywgbWV0aG9kcywgYW5kIHR5cGVzLjwvbGk+Ci0KLTxsaT4KLU9wdGlvbiAoMyk6IGV4cG9zZSBhIHNpbmdsZSBsaXN0IG9mIG1lbWJlcnMsIHdpdGggZXh0cmEgZ2V0dGVycyBmb3IgbG9jYXRpbmcKLW1lbWJlciBmaWVsZHMsIG1ldGhvZHMsIGFuZCB0eXBlcy48L2xpPgotCi08bGk+Ci1Qcm86IENvbWJpbmVzIGFkdmFudGFnZSBvZiAoMikgd2l0aCBjb252ZW5pZW5jZSBvZiAoMSkuPC9saT4KLQotPGxpPgotUmVjb21tZW5kZWQgYXBwcm9hY2g6ICgzKS48L2xpPgotCi08bGk+Ci1Gb3IgY2xhc3MgZGVjbGFyYXRpb25zLCB0cmVhdCBpbml0aWFsaXplcnMgYW5kIGNvbnN0cnVjdG9ycyBhcyBtZW1iZXJzLjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUx1bXAgaW5zdGFuY2UgYW5kIHN0YXRpYyBpbml0aWFsaXplcnMgaW4gd2l0aCBmaWVsZCBkZWNsYXJhdGlvbnMuPC9saT4KLQotPGxpPgotTHVtcCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbnMgaW4gd2l0aCBtZXRob2QgZGVjbGFyYXRpb25zLjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotU2VyaWFsaXphdGlvbjwvaDM+Ci0KLTx1bD4KLTxsaT4KLUNsaWVudHMgb2YgcmVhZC13cml0ZSBBU1RzIHdpbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2VyaWFsaXplIHRvIGEgSmF2YSBjb21waWxhdGlvbgotdW5pdC48L2xpPgotCi08bGk+Ci1TZXJpYWxpemF0aW9uIHZpYSBzaW1wbGUgQVNUIHRyZWUgd2Fsay48L2xpPgotCi08dWw+Ci08bGk+Ci1TdHJhaWdodGZvcndhcmQuPC9saT4KLQotPGxpPgotSW50cm9kdWNlIGxpbmUgYnJlYWtzIGFuZCB3aGl0ZXNwYWNlIHRvIG1ha2UgaXQgbG9vayBwcmV0dHkuPC9saT4KLQotPGxpPgotT3IgcG9zdC1wcm9jZXNzIGl0IHdpdGggdGhlIEphdmEgZm9ybWF0dGVyLjwvbGk+Ci0KLTxsaT4KLUlmIEFTVCBvcmlnaW5hdGVkIGJ5IHBhcnNpbmcsIHRoZSByZXN1bHQgaXMgbGlrZWx5IHVuYWNjZXB0YWJsZSB0byB1c2VyOjwvbGk+Ci0KLTx1bD4KLTxsaT4KLUNvbXBsZXRlbHkgcmVmb3JtYXR0ZWQuPC9saT4KLQotPGxpPgotQ29uc3RydWN0cyBhcmUgbm9ybWFsaXplZC48L2xpPgotCi08bGk+Ci1Tb21lIGNvbW1lbnRzIG1heSBoYXZlIGJlIGxvc3QuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUNvdWxkIGJlIHByb3ZpZGVkIGJ5IEFQSSB0aGF0IG1ha2VzIHVzZSBvZiByZWd1bGFyIEFTVCBBUEkgb25seS48L2xpPgotCi08bGk+Ci1Db3VsZCBiZSB3cml0dGVuIGJ5IGNsaWVudHMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVNlcmlhbGl6YXRpb24gdmlhIHNvdXJjZSByZWNvbnN0cnVjdGlvbi48L2xpPgotCi08dWw+Ci08bGk+Ci1Pbmx5IGFwcGxpY2FibGUgdG8gQVNUcyBpbml0aWFsbHkgY29uc3RydWN0ZWQgYnkgcGFyc2VyLjwvbGk+Ci0KLTxsaT4KLVVzZSBzb3VyY2UgcG9zaXRpb24gaW5mb3JtYXRpb24gaW4gbW9kaWZpZWQgQVNUIHRvIHJlY29uc3RydWN0IGNvbXBpbGF0aW9uCi11bml0LjwvbGk+Ci0KLTxsaT4KLVJldGFpbiBwYXNzYWdlcyBvZiBvcmlnaW5hbCB0ZXh0IGNvcnJlc3BvbmRpbmcgdG8gdW5jaGFuZ2VkIEFTVCB0cmVlcy48L2xpPgotCi08bGk+Ci1HZW5lcmF0ZXMgbmV3IHRleHQgb25seSB3aGVyZSByZXF1aXJlZC48L2xpPgotCi08bGk+Ci1Qcm9kdWNlIGEgcmVzdWx0IHRoYXQgYSB1c2VyIHdpbGwgcmVjb2duaXplIGFuZCBhY2NlcHQuPC9saT4KLQotPHVsPgotPGxpPgotUHJlc2VydmUgZm9ybWF0dGluZyB3aGVyZXZlciBwb3NzaWJsZS48L2xpPgotCi08bGk+Ci1QcmVzZXJ2ZSZuYnNwOyBzb3VyY2UgY29uc3RydWN0IG5vcm1hbGl6YXRpb24gd2hlcmV2ZXIgcG9zc2libGUuPC9saT4KLQotPGxpPgotUHJlc2VydmUgYXJiaXRyYXJpbHktcGxhY2VkIGNvbW1lbnRzIHdoZXJldmVyIHBvc3NpYmxlLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1SZXF1aXJlcyByZXRhaW5pbmcgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQsIGFuZCBsaWtlbHkgcmVjb3JkaW5nCi1hZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIG5vZGVzIHRvIGFsbG93IHJlY29uc3RydWN0aW9uLjwvbGk+Ci0KLTxsaT4KLVRoaXMgaXMgdGhlIHdheSB0aGUgY3VycmVudCBKRE9NIGltcGxlbWVudGF0aW9uIHdvcmtzLjwvbGk+Ci0KLTxsaT4KLUNvdWxkIGJlIHByb3ZpZGVkIGJ5IEFQSSB0aGF0IGhhcyBwcml2aWxlZ2VkIGFjY2VzcyB0byBBU1Qgbm9kZXMgYW5kIHBhcnNlci1yZWNvcmRlZAotaW5mb3JtYXRpb24uPC9saT4KLQotPGxpPgotU2hvdWxkIGFsc28gcmV0dXJuIGEgbGlzdCBvZiBlZGl0IGluc3RydWN0aW9ucyBzbyB0aGF0IG1hcmtlcnMgY2FuIGJlIGFkanVzdGVkLAotZXRjLjwvbGk+Ci0KLTxsaT4KLUNsaWVudHMgd291bGQgaGF2ZSBhIGhhcmQgdGltZSBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5SZWNvbW1lbmQgZGVmZXJyaW5nIGltcGxlbWVudGF0aW9uIG9mIHNlcmlhbGl6ZXIKLXRoYXQgZG9lcyBzb3VyY2UgcmVjb25zdHJ1Y3Rpb24uPC9mb250PjwvbGk+Ci0KLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5JbiBpbnRlcmltLCByZWZhY3RvcmluZyBjYW4gYXBwbHkgZWRpdHMgdG8gb3JpZ2luYWwKLWNvbXBpbGF0aW9uIHVuaXQgdGV4dCBkaXJlY3RseS48L2ZvbnQ+PC9saT4KLTwvdWw+Ci08L3VsPgotCi08aDM+Ci1Ob2RlIHR5cGVzPC9oMz4KLVRoZSBBU1Qgbm9kZSB0eXBlcyBhcmUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGdyYW1tYXIgZm9yIHRoZSBKYXZhIGxhbmd1YWdlCi1naXZlbiBpbiB0aGUgSkxTMi4KLTxwPkV2ZXJ5IEFTVCBub2RlIGJlbG9uZ3MgdG8gYSBzaW5nbGUgQVNUIGluc3RhbmNlLiAoSW4gRE9NIHRlcm1pbm9sb2d5LAotdGhlIEFTVCBpcyB0aGUgZG9jdW1lbnQgYW5kIHRoZSBBU1Qgbm9kZXMgYXJlIHRoZSBlbGVtZW50cykuIFRoZSBBU1QgaW5zdGFuY2UKLWNhbiBzZXJ2ZSBhcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBub2Rlcy4gTm9kZXMgcG9pbnQgdG8gdGhlaXIgb3duaW5nCi1BU1QgKGZpeGVkIGZvciB0aGUgbm9kZSdzIGxpZmV0aW1lKS4gVGhlIEFTVCBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIHJvb3QKLW5vZGUgKGEgY29tcGlsYXRpb24gdW5pdCkuCi08cD5UaGUgQVNUIG5vZGUgdHlwZXMgZG8gbm90IGRlZmluZSB0aGVpciBvd24gbm90aW9uIG9mIGVxdWFsaXR5OyB0aGV5Ci1qdXN0IGluaGVyaXQgdGhlIG9iamVjdCBpZGVudGl0eSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9iamVjdC4KLTxwPk5vdGU6IEdyYW1tYXIgcnVsZXMgKGluIGNvbW1lbnRzKSBhcmUgZXhwcmVzc2VkIGluIHRoZSBQYXNjYWwtc3R5bGUKLWV4dGVuZGVkIEJORiB1c2VkIGluIDx0dD5zZWN0aW9uIDE4PC90dD4gb2YgSkxTMi4gV2UgdXNlIEMjIHN0eWxlIHByb3BlcnR5Ci1kZWNsYXJhdGlvbnMgYXMgYSBjb252ZW5pZW50IGFiYnJldmlhdGlvbiBmb3IgYSBzdGFuZGFyZCBtYXRjaGVkIHBhaXIgb2YKLWdldCBhbmQgc2V0IG1ldGhvZHMuCi08cD48dHQ+cHVibGljIGNsYXNzIEFTVDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBDb21waWxhdGlvblVuaXQgcm9vdDs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHZvaWQgbG9hZEZyb21Tb3VyY2UoY2hhcltdIHNvdXJjZSk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyB2b2lkIHNldE9wdGlvbnMoLi4uKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNoYXJbXSBzZXJpYWxpemUoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU1ROb2RlPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHByb3RlY3RlZCBBU1ROb2RlKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQVNUIGdldE93bmVyKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnRbXSBzdGFydFBvc2l0aW9uczs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludFtdIGxlbmd0aHM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBib29sZWFuIGlzV2hvbGVMaW5lOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgT2JqZWN0IGNsaWVudERhdGE7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBBU1ROb2RlIGdldFBhcmVudCgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi4gb3RoZXIgcHJvdG9jb2wgY29tbW9uIHRvIGFsbCBBU1Qgbm9kZSB0eXBlczwvdHQ+Ci08aDQ+Ci1OYW1lczwvaDQ+Ci1BcyBleHBsYWluZWQgaW4gSkxTMiBzZWN0aW9uIDYuNSwgdGhlIGdyYW1tYXIgZG9lcyBub3QgYWxsb3cgbmFtZXMgdG8gYmUKLXJlc29sdmVkIG1vcmUgZmluZWx5IHRoYW4gdGhlIGZvbGxvd2luZyA2IGNhdGVnb3JpZXMgYnkgc3ludGFjdGljIG1lYW5zCi1hbG9uZToKLTxwPjx0dD5QYWNrYWdlTmFtZTo8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUlkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVBhY2thZ2VOYW1lIC4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PlR5cGVOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUGFja2FnZU9yVHlwZU5hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5FeHByZXNzaW9uTmFtZTo8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUlkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUFtYmlndW91c05hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5NZXRob2ROYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotQW1iaWd1b3VzTmFtZSAuIElkZW50aWZpZXI8L3R0PgotPHA+PHR0PlBhY2thZ2VPclR5cGVOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUGFja2FnZU9yVHlwZU5hbWUgLiBJZGVudGlmaWVyPC90dD4KLTxwPjx0dD5BbWJpZ3VvdXNOYW1lOjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotQW1iaWd1b3VzTmFtZSAuIElkZW50aWZpZXI8L3R0PgotPHA+R2l2ZW4gdGhhdCBuYW1lcyBjYW5ub3QgYmUgcmVzb2x2ZWQgZGVmaW5pdGl2ZWx5IHRvIGEgcGFja2FnZSwgdHlwZSwKLWZpZWxkLCBvciB2YXJpYWJsZSBhdCBBU1Qgbm9kZSBjb25zdHJ1Y3Rpb24gdGltZSwgYW4gb3BlbiBxdWVzdGlvbiBpcyBob3cKLW11Y2ggb2YgdGhlIGNhdGVnb3JpemF0aW9uIHRoYXQgY291bGQgYmUgZG9uZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZQotQVNULiBNb3JlIGNhdGVnb3JpZXMgbWVhbnMgbW9yZSBpbmZvcm1hdGlvbiBmbG93IGZyb20gdGhlIHBhcnNlciB0byB0aGUKLUFTVCBjbGllbnQ7IG9uIHRoZSBvdGhlciBoYW5kLCBhIHZhcmlldHkgb2YgY2F0ZWdvcmllcyBpcyBub3QgbmVjZXNzYXJpbHkKLWNvbnZlbmllbnQgZm9yIGNsaWVudHMuIEZvciBleGFtcGxlLCBpbiA8dHQ+aW1wb3J0IGEuYi5jPC90dD4gdGhlIG5hbWUKLWlzIGEgPHR0PlR5cGVOYW1lPC90dD4gd2hlcmVhcyBpbiA8dHQ+aW1wb3J0IGEuYi5jLio8L3R0PiB0aGUgbmFtZSA8dHQ+YS5iLmM8L3R0PgotaXMgYSA8dHQ+UGFja2FnZU9yVHlwZU5hbWU8L3R0Pi4gSWYgdGhlIG5hbWUgY2F0ZWdvcnkgd2FzIHRvIGJlIHJlZmxlY3RlZAotaW4gdGhlIHR5cGUgb2YgdGhlIEFTVCBub2RlcywgdGhlIGNsaWVudCB3b3VsZCBuZWVkIHRvIGtub3cgdG8gY3JlYXRlIHRoZQotYXBwcm9wcmlhdGUgdHlwZSBvZiBuYW1lIG5vZGVzIHdoZW4gZWRpdGluZyB0aGUgQVNULgotPHA+UHJvcG9zYWw6IFVzZSB0d28gQVNUIG5vZGUgdHlwZXMgZm9yIG5hbWVzOiBzaW1wbGUgbmFtZXMsIGFuZCBxdWFsaWZpZWQKLW5hbWVzLiBRdWFsaWZpZWQgbmFtZXMgYXJlIGV4cHJlc3NlZCByZWN1cnNpdmVseSwgdG8gZmFjaWxpdGF0ZSBjbGllbnRzCi1kaXNjb3ZlcmluZyBob3cgdGhlIHF1YWxpZmllciBwYXJ0IG9mIGEgbmFtZSByZXNvbHZlcy4gVXNlIHRoZXNlIGZvciBldmVyeXRoaW5nCi1idXQgPHR0Pk1ldGhvZE5hbWU8L3R0PjsgZm9yIDx0dD5NZXRob2ROYW1lPC90dD4sIHdoaWNoIGNhbiBhcHBlYXIgb25seQotaW4gYSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uLCBzZXBhcmF0ZSB0aGUgc2VsZWN0b3IgaWRlbnRpZmllciBmcm9tCi1hbnkgcHJlY2VkaW5nIHF1YWxpZmllci4KLTxwPihOb3RlOiBUaGUgY3VycmVudCBpbnRlcm5hbCBBU1Qgbm9kZXMgZ28gYmV5b25kIG1ha2luZyB0aGUgc2ltcGxlL3F1YWxpZmllZAotZGlzdGluY3Rpb246IHRoZXkgYWxzbyBoYXZlIHNpbXBsZSAmYW1wOyBxdWFsaWZpZWQgdHlwZSBuYW1lcyAoY2xhc3NlcwotPHR0PlNpbXBsZVR5cGVSZWZlcmVuY2U8L3R0PgotYW5kIDx0dD5RdWFsaWZpZWRUeXBlUmVmZXJlbmNlPC90dD4pIGluIGFkZGl0aW9uYWwgdG8gc2ltcGxlICZhbXA7IHF1YWxpZmllZAotbmFtZWQgKGNsYXNzZXMgPHR0PlNpbXBsZU5hbWVSZWZlcmVuY2U8L3R0PiBhbmQKLTx0dD5RdWFsaWZpZWROYW1lUmVmZXJlbmNlPC90dD4pLikKLTxwPjx0dD4vLyBOYW1lOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1TaW1wbGVOYW1lPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVF1YWxpZmllZE5hbWU8L3R0PgotPGJyPjx0dD4vLyBTaW1wbGVOYW1lOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1JZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8gUXVhbGlmaWVkTmFtZTo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTmFtZSA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU5hbWUgLy8gIm1hcmtlciIgaW50ZXJmYWNlPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZEJpbmRpbmcoKTsmbmJzcDsgLy8KLW9wdGlvbmFsPC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgU2ltcGxlTmFtZSBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTmFtZSwgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFNpbXBsZU5hbWUoQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gaWRlbnRpZmllcjs8L3R0PgotPHA+PHR0PnB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElOYW1lLCBJRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgUXVhbGlmaWVkTmFtZShBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElOYW1lIHF1YWxpZmllcjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGNoYXJbXSBpZGVudGlmaWVyOzwvdHQ+Ci08aDM+Ci1Db21waWxhdGlvbiBVbml0cyBhbmQgTWFqb3IgRGVjbGFyYXRpb25zPC9oMz4KLTx0dD4vLyBDb21waWxhdGlvblVuaXQ6PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT5wYWNrYWdlPC91PjwvYj4gSWRlbnRpZmllciB7IDxiPjx1Pi48L3U+PC9iPiBJZGVudGlmaWVyIH0gPGI+PHU+OzwvdT48L2I+Jm5ic3A7Ci1dPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXtJbXBvcnREZWNsYXJhdGlvbn08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote1R5cGVEZWNsYXJhdGlvbiB8IDxiPjx1Pjs8L3U+PC9iPn08L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgQVNUTm9kZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQ29tcGlsYXRpb25Vbml0KEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZSBwYWNrYWdlTmFtZTsgLy8gb3B0aW9uYWw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IEltcG9ydERlY2xhcmF0aW9uW10gaW1wb3J0czs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGVEZWNsYXJhdGlvbltdIHR5cGVzOzwvdHQ+Ci08cD48dHQ+Ly8gSW1wb3J0RGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+aW1wb3J0PC91PjwvYj4KLUlkZW50aWZpZXIgeyA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciB9IFsgPGI+PHU+LjwvdT48L2I+Jm5ic3A7IDxiPjx1Pio8L3U+PC9iPiZuYnNwOyZuYnNwOwotXQotPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIGltcG9ydE5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBib29sZWFuIG9uRGVtYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSUJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgotPHA+PHR0Pi8vIFR5cGVEZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSA8Yj48dT5jbGFzczwvdT48L2I+IElkZW50aWZpZXI8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PmV4dGVuZHM8L3U+PC9iPiBUeXBlXTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+aW1wbGVtZW50czwvdT48L2I+IFR5cGUgeyA8Yj48dT4sPC91PjwvYj4gVHlwZX1dPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLTxiPjx1Pns8L3U+PC9iPiB7Q2xhc3NCb2R5RGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj4gfSA8Yj48dT59PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSA8Yj48dT5pbnRlcmZhY2U8L3U+PC9iPiBJZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT5leHRlbmRzPC91PjwvYj4gVHlwZSB7IDxiPjx1Piw8L3U+PC9iPiBUeXBlfV08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotPGI+PHU+ezwvdT48L2I+IHtJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24gfCA8Yj48dT47PC91PjwvYj4gfSA8Yj48dT59PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyBNb2RpZmllcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5wdWJsaWM8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnByb3RlY3RlZDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cHJpdmF0ZTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3RhdGljPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5hYnN0cmFjdDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZmluYWw8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pm5hdGl2ZTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+c3luY2hyb25pemVkPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50cmFuc2llbnQ8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnZvbGF0aWxlPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zdHJpY3RmcDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8gQ2xhc3NCb2R5RGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLU1ldGhvZERlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUNvbnN0cnVjdG9yRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRmllbGREZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DbGFzc0RlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVR5cGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1Jbml0aWFsaXplcjwvdHQ+Ci08YnI+PHR0Pi8vIEludGVyZmFjZUJvZHlEZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTWV0aG9kRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRmllbGREZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1UeXBlRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQsCi1JTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIHN1cGVyY2xhc3M7IC8vIG9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lW10gc3VwZXJJbnRlcmZhY2VzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSU1lbWJlcltdIG1lbWJlcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIGNvbnZlbmllbmNlIG1ldGhvZHM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHM7IC8vIGluY2x1ZGVzCi1jb25zdGFudHM7IGV4Y2x1ZGVzIGluaXRpYWxpemVyczwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIGdldE1ldGhvZHM7Ci0vLyBpbmNsdWRlcyBjb25zdHJ1Y3RvcnM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSVR5cGVCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KLTxwPjx0dD4vLyBNZXRob2REZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSAoVHlwZSB8IDxiPjx1PnZvaWQ8L3U+PC9iPikgSWRlbnRpZmllciA8Yj48dT4oPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotW0Zvcm1hbFBhcmFtZXRlciB7IDxiPjx1Piw8L3U+PC9iPiBGb3JtYWxQYXJhbWV0ZXJ9XSA8Yj48dT4pPC91PjwvYj4mbmJzcDsKLXs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+dGhyb3dzPC91PjwvYj4gUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdICggTWV0aG9kQm9keSB8IDxiPjx1Pjs8L3U+PC9iPgotKTwvdHQ+Ci08YnI+PHR0Pi8vIENvbnN0cnVjdG9yRGVjbGFyYXRpb246PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXtNb2RpZmllcn0gSWRlbnRpZmllciA8Yj48dT4oPC91PjwvYj4gW0Zvcm1hbFBhcmFtZXRlciB7IDxiPjx1Piw8L3U+PC9iPgotRm9ybWFsUGFyYW1ldGVyfV0gPGI+PHU+KTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVs8Yj48dT50aHJvd3M8L3U+PC9iPiBRdWFsaWZpZWRJZGVudGlmaWVyTGlzdF0gTWV0aG9kQm9keTwvdHQ+Ci08YnI+PHR0Pi8vIEZvcm1hbFBhcmFtZXRlcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PmZpbmFsPC91PjwvYj5dIFR5cGUgSWRlbnRpZmllciB7PGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPn08L3R0PgotPGJyPjx0dD5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEFTVE5vZGUKLWltcGxlbWVudHMgSU1lbWJlcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcm90ZWN0ZWQgQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gc2VsZWN0b3I7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBGb3JtYWxQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgTmFtZVtdIHRocm93bkV4Y2VwdGlvbnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBCbG9jayBib2R5OyAvLyBvcHRpb25hbDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgSU1ldGhvZEJpbmRpbmcgcmVzb2x2ZUJpbmRpbmcoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSByZXR1cm5UeXBlOyAvLyBpbmNsdWRlcwotdm9pZDwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKEFTVCBhc3QpOzwvdHQ+Ci08cD48dHQ+Ly8gRmllbGREZWNsYXJhdGlvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwote01vZGlmaWVyfSBUeXBlIElkZW50aWZpZXIgezxiPjx1Pls8L3U+PC9iPiA8Yj48dT5dPC91PjwvYj59IFsgPGI+PHU+PTwvdT48L2I+Ci1FeHByZXNzaW9uXTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci17IDxiPjx1Piw8L3U+PC9iPiBJZGVudGlmaWVyIHs8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgotRXhwcmVzc2lvbl0gfTwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgbW9kaWZpZXJzOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgY2hhcltdIG5hbWU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW11bXSBqYXZhZG9jQ29tbWVudDsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJRXhwcmVzc2lvbiBpbml0aWFsaXplcjsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJRmllbGRCaW5kaW5nIHJlc29sdmVCaW5kaW5nKCk7PC90dD4KLTxwPjx0dD4vLyBJbml0aWFsaXplcjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWzxiPjx1PnN0YXRpYzwvdT48L2I+XSBCbG9jazwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBmaW5hbCBjbGFzcyBJbml0aWFsaXplciBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJbml0aWFsaXplcihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBCbG9jayBib2R5OzwvdHQ+Ci08cD48dHQ+Ly8gTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bPGI+PHU+ZmluYWw8L3U+PC9iPl0gVHlwZSBJZGVudGlmaWVyIHs8Yj48dT5bXTwvdT48L2I+fSBbIDxiPjx1Pj08L3U+PC9iPgotRXhwcmVzc2lvbiBdPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXsgPGI+PHU+LDwvdT48L2I+IElkZW50aWZpZXIgezxiPjx1PltdPC91PjwvYj59IFsgPGI+PHU+PTwvdT48L2I+IEV4cHJlc3Npb25dCi19IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMKLUlTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbihBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBtb2RpZmllcnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBjaGFyW10gbmFtZTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IFR5cGUgdHlwZTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIGluaXRpYWxpemVyOyAvLwotb3B0aW9uYWw8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElMb2NhbFZhcmlhYmxlQmluZGluZyByZXNvbHZlQmluZGluZygpOzwvdHQ+Ci08YnI+Jm5ic3A7Ci08aDQ+Ci1UeXBlczwvaDQ+Ci1UaGUgVHlwZSBub2RlICg9IFR5cGVSZWZlcmVuY2UpIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBiYXNlIHR5cGUsCi1hIG5hbWVkIHR5cGUsIG9yIGFuIGFycmF5IHRoZXJlb2YuCi08cD48dHQ+Ly8gVHlwZTo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKEJhc2ljVHlwZSB8IFR5cGVOYW1lICkgezxiPjx1PltdPC91PjwvYj59PC90dD4KLTxicj48dHQ+Ly8gQmFzaWNUeXBlOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJ5dGU8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnNob3J0PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5jaGFyPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5pbnQ8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pmxvbmc8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZsb2F0PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5kb3VibGU8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJvb2xlYW48L3U+PC9iPjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBUeXBlIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBUeXBlIChBU1QgYXN0KTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IGludCBiYXNlVHlwZTsgLy8gZWl0aGVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBOYW1lIHR5cGVOYW1lOyAvLyBvcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgaW50IGRpbWVuc2lvbnM7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJQmluZGluZyByZXNvbHZlZFR5cGUoKTs8L3R0PgotPGg0PgotU3RhdGVtZW50czwvaDQ+Ci1UaGVyZSBpcyBhIGRpZmZlcmVudCBBU1Qgbm9kZSB0eXBlIGZvciBlYWNoIGRpZmZlcmVudCBraW5kIG9mIHN0YXRlbWVudC4KLVVzZSBhICJtYXJrZXIiIGludGVyZmFjZSAoPHR0PklTdGF0ZW1lbnQ8L3R0PikgdG8gYnJpbmcgYWxsIGNvbnN0cnVjdHMKLXRoYXQgY2FuIGFwcGVhciB3aXRoaW4gYSBibG9jayAobm9udGVybWluYWwgPHR0PkJsb2NrU3RhdGVtZW50PC90dD4sIHdoaWNoCi1pbmNsdWRlcyBsb2NhbCB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMpLgotPHA+PHR0Pi8vIEJsb2NrOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pns8L3U+PC9iPgotQmxvY2tTdGF0ZW1lbnQgPGI+PHU+fTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8gQmxvY2tTdGF0ZW1lbnQgOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IExvY2FsVmFyaWFibGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFR5cGVEZWNsYXJhdGlvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFtJZGVudGlmaWVyCi08Yj48dT46PC91PjwvYj4KLV0gU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Ly9TdGF0ZW1lbnQ6PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmxvY2s8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5pZgotKDwvdT48L2I+RXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gU3RhdGVtZW50IFs8Yj48dT5lbHNlPC91PjwvYj4gU3RhdGVtZW50XTwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmZvcgotKDwvdT48L2I+IEZvckluaXRPcHQmbmJzcDsgPGI+PHU+OzwvdT48L2I+Jm5ic3A7Jm5ic3A7IFtFeHByZXNzaW9uXQotPGI+PHU+OzwvdT48L2I+Jm5ic3A7Jm5ic3A7Ci1Gb3JVcGRhdGVPcHQgPGI+PHU+KTwvdT48L2I+IFN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PndoaWxlCi0oPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj4gU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+ZG88L3U+PC9iPgotU3RhdGVtZW50IDxiPjx1PndoaWxlPC91PjwvYj4gPGI+PHU+KDwvdT48L2I+IEV4cHJlc3Npb24KLTxiPjx1Pik7PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50cnk8L3U+PC9iPgotQmxvY2sgW0NhdGNoZXNdIFsgPGI+PHU+ZmluYWxseTwvdT48L2I+IEJsb2NrIF08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5zd2l0Y2gKLSg8L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pik8L3U+PC9iPiA8Yj48dT57PC91PjwvYj4gU3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHMKLTxiPjx1Pn08L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PnN5bmNocm9uaXplZAotKDwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+KTwvdT48L2I+IEJsb2NrPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+cmV0dXJuPC91PjwvYj4KLVtFeHByZXNzaW9uXSA8Yj48dT47PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT50aHJvdzwvdT48L2I+Ci1FeHByZXNzaW9uJm5ic3A7Jm5ic3A7IDxiPjx1Pjs8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1PmJyZWFrPC91PjwvYj4KLVtJZGVudGlmaWVyXSZuYnNwOyA8Yj48dT47PC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5jb250aW51ZTwvdT48L2I+Ci1bSWRlbnRpZmllcl0mbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPGI+PHU+OzwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRXhwcmVzc2lvblN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IElkZW50aWZpZXIKLTxiPjx1Pjo8L3U+PC9iPgotU3RhdGVtZW50PC90dD4KLTxicj48dHQ+cHVibGljIGludGVyZmFjZSBJU3RhdGVtZW50Jm5ic3A7IC8vICJtYXJrZXIiIGludGVyZmFjZTwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIEJsb2NrIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEJsb2NrKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSVN0YXRlbWVudFtdIHN0YXRlbWVudHM7PC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIElmU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElmU3RhdGVtZW50KEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gdGVzdDs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElTdGF0ZW1lbnQgdGhlblBhcnQ7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBJU3RhdGVtZW50IGVsc2VQYXJ0OyZuYnNwOyAvLwotb3B0aW9uYWw8L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgV2hpbGVTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIERvU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIFRyeVN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIFJldHVyblN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBUaHJvd1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBCcmVha1N0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgaW1wbGVtZW50cyBJU3RhdGVtZW50PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC4uLjwvdHQ+Ci08YnI+PHR0PnB1YmxpYyBjbGFzcyBOdWxsU3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIExhYmVsZWRTdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSVN0YXRlbWVudDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAuLi48L3R0PgotPGJyPjx0dD5wdWJsaWMgY2xhc3MgQXNzZXJ0U3RhdGVtZW50IGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgLi4uPC90dD4KLTxoND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5FeHByZXNzaW9uIFN0YXRlbWVudHM8L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5DZXJ0YWluIHR5cGVzIG9mIGV4cHJlc3Npb25zIGNhbiBhbHNvIGFwcGVhciBhcyBzdGF0ZW1lbnRzLgotVGhlIEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSB3cmFwcyBhbiBleHByZXNzaW9uIHVwIGFzIGEgc3RhdGVtZW50LiBUaGUKLXNvdXJjZSByYW5nZSBmb3IgdGhlIEV4cHJlc3Npb25TdGF0ZW1lbnQgaW5jbHVkZXMgdGhlIHRyYWlsaW5nIHNlbWljb2xvbi48L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjwvZm9udD4KLTxwPjx0dD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+cHVibGljIGNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBBU1ROb2RlCi1pbXBsZW1lbnRzIElTdGF0ZW1lbnQ8L2ZvbnQ+PC90dD4KLTxicj48dHQ+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgRXhwcmVzc2lvblN0YXRlbWVudChBU1QKLWFzdCk7PC9mb250PjwvdHQ+Ci08YnI+PHR0Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uCi1leHByZXNzaW9uOzwvZm9udD48L3R0PgotPGg0PgotRXhwcmVzc2lvbnM8L2g0PgotVGhlcmUgaXMgYSBkaWZmZXJlbnQgQVNUIG5vZGUgdHlwZSBmb3IgZWFjaCBkaWZmZXJlbnQga2luZCBvZiBleHByZXNzaW9uLgotVXNlIGEgIm1hcmtlciIgaW50ZXJmYWNlICg8dHQ+SUV4cHJlc3Npb248L3R0PikgdG8gYnJpbmcgYWxsIGNvbnN0cnVjdHMKLXRoYXQgY2FuIGFwcGVhciBhcyBleHByZXNzaW9ucy4KLTxwPihNYW55IGRldGFpbHMgVEJEKS4KLTxwPjx0dD4vLyBFeHByZXNzaW9uOjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1JZGVudGlmaWVyPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotU3RyaW5nTGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1GbG9hdGluZ1BvaW50TGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1Cb29sZWFuTGl0ZXJhbDwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1DaGFyYWN0ZXJMaXRlcmFsPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVN0cmluZ0xpdGVyYWw8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotTnVsbExpdGVyYWw8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotKCBUeXBlIHwgPGI+PHU+dm9pZDwvdT48L2I+ICkgPGI+PHU+LjwvdT48L2I+IGNsYXNzPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVsgQ2xhc3NOYW1lIDxiPjx1Pi48L3U+PC9iPiBdIDxiPjx1PnRoaXM8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pig8L3U+PC9iPgotRXhwcmVzc2lvbiA8Yj48dT4pPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotWyBFeHByZXNzaW9uIDxiPjx1Pi48L3U+PC9iPiBdIDxiPjx1Pm5ldzwvdT48L2I+IFR5cGUgPGI+PHU+KDwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLVsgRXhwcmVzc2lvbiB7IDxiPjx1Piw8L3U+PC9iPiBFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj4gWyBDbGFzc0JvZHkKLV08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5zdXBlciAuPC91PjwvYj4gSWRlbnRpZmllcjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1NZXRob2ROYW1lIDxiPig8L2I+IFsgRXhwcmVzc2lvbiB7IDxiPjx1Piw8L3U+PC9iPiBFeHByZXNzaW9uIH0gXSA8Yj48dT4pPC91PjwvYj48L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiA8Yj48dT4uPC91PjwvYj4gSWRlbnRpZmllciA8Yj4oPC9iPiBbIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4KLUV4cHJlc3Npb24gfSBdIDxiPjx1Pik8L3U+PC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIENsYXNzTmFtZSA8Yj48dT4uPC91PjwvYj4gXSA8Yj48dT5zdXBlciAuPC91PjwvYj4gSWRlbnRpZmllciA8Yj4oPC9iPjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1bIEV4cHJlc3Npb24geyA8Yj48dT4sPC91PjwvYj4gRXhwcmVzc2lvbiB9IF0gPGI+PHU+KTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+PC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gSW5maXhPcGVyYXRvciBFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gPGI+PHU+aW5zdGFuY2VvZjwvdT48L2I+IFR5cGU8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRXhwcmVzc2lvbiBQb3N0Zml4T3BlcmF0b3I8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotUHJlZml4T3BlcmF0b3IgRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDxiPjx1Pig8L3U+PC9iPgotVHlwZSA8Yj48dT4pPC91PjwvYj4gRXhwcmVzc2lvbjwvdHQ+Ci08YnI+PHR0Pi8vJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1FeHByZXNzaW9uIDxiPjx1Pj88L3U+PC9iPiBFeHByZXNzaW9uIDxiPjx1Pjo8L3U+PC9iPiBFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Ly8mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLUV4cHJlc3Npb24gQXNzaWdubWVudE9wZXJhdG9yIEV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBBcnJheUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+cHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbiZuYnNwOyAvLyAibWFya2VyIiBpbnRlcmZhY2U8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIElCaW5kaW5nIHJlc29sdmVkVHlwZSgpOyZuYnNwOyAvLyBvcHRpb25hbDwvdHQ+Ci08cD48dHQ+Ly8gQXJyYXlBbGxvY2F0aW9uRXhwcmVzc2lvbjo8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotUHJpbWl0aXZlVHlwZSA8Yj48dT5bPC91PjwvYj4gRXhwcmVzc2lvbiA8Yj48dT5dPC91PjwvYj4geyA8Yj48dT5bPC91PjwvYj4KLUV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IH0geyA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IH08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotVHlwZU5hbWUgPGI+PHU+WzwvdT48L2I+IEV4cHJlc3Npb24gPGI+PHU+XTwvdT48L2I+IHsKLTxiPjx1Pls8L3U+PC9iPiBFeHByZXNzaW9uCi08Yj48dT5dPC91PjwvYj4KLX0geyA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IH08L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotUHJpbWl0aXZlVHlwZSA8Yj48dT5bPC91PjwvYj4gPGI+PHU+XTwvdT48L2I+IHsgPGI+PHU+W108L3U+PC9iPiB9IEFycmF5SW5pdGlhbGl6ZXI8L3R0PgotPGJyPjx0dD4vLyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8Yj48dT5uZXc8L3U+PC9iPgotVHlwZU5hbWUgPGI+PHU+WzwvdT48L2I+IDxiPjx1Pl08L3U+PC9iPiB7IDxiPjx1PltdPC91PjwvYj4gfSBBcnJheUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+cHVibGljIGNsYXNzIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEFycmF5QWxsb2NhdGlvbkV4cHJlc3Npb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBUeXBlIHR5cGU7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBFeHByZXNzaW9uW10gZGltZW5zaW9uczsgLy8KLW9wdGlvbmFsPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBFeHByZXNzaW9uIGFycmF5SW5pdGlhbGl6ZXI7Ci0vLyBvcHRpb25hbDwvdHQ+Ci08cD48dHQ+cHVibGljIGNsYXNzIFN0cmluZ0xpdGVyYWwgZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFN0cmluZ0xpdGVyYWwoQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBTdHJpbmcgdmFsdWU7PC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgQ2FzdEV4cHJlc3Npb24gZXh0ZW5kcyBBU1ROb2RlIGltcGxlbWVudHMgSUV4cHJlc3Npb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIENhc3RFeHByZXNzaW9uKEFTVCBhc3QpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgVHlwZSB0eXBlOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gdmFsdWU7PC90dD4KLTxwPjx0dD5wdWJsaWMgY2xhc3MgSW5maXhFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIElFeHByZXNzaW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJbmZpeEV4cHJlc3Npb24oQVNUIGFzdCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBwcm9wZXJ0eSBpbnQgaW5maXhPcGVyYXRvcjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHByb3BlcnR5IElFeHByZXNzaW9uIGxlZnRPcGVyYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb24gcmlnaHRPcGVyYW5kOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgcHJvcGVydHkgSUV4cHJlc3Npb25bXSBleHRlbmRlZE9wZXJhbmRzOyZuYnNwOwotLy8gTCBvcCBSIG9wIFIyIG9wIFIzLi4uPC90dD4KLTxoMz4KLUJpbmRpbmdzPC9oMz4KLVRoZSAid29ybGQgb2YgYmluZGluZ3MiIGlzIGFuIGludGVncmF0ZWQgcGljdHVyZSBvZiB0aGUgc3RydWN0dXJlIG9mIHRoZQotcHJvZ3JhbSBhcyBzZWVuIGZyb20gdGhlIGNvbXBpbGVyJ3MgcG9pbnQgb2Ygdmlldy4gVGhlIGJpbmRpbmdzIGNvcnJlc3BvbmQKLXRvIG5hbWVkIGVudGl0aWVzIChwYWNrYWdlcywgdHlwZXMsIGZpZWxkcywgbWV0aG9kcywgbG9jYWwgdmFyaWFibGVzKS4KLTxwPkNsaWVudHMgbmF2aWdhdGUgZnJvbSBBU1Qgbm9kZXMgaW50byB0aGUgd29ybGQgb2YgYmluZGluZ3MgdG8gZGlzY292ZXIKLXRoaW5ncyBsaWtlOgotPHVsPgotPGxpPgotdGhlIGVudGl0eSBhbiBpZGVudGlmaWVyIHJlc29sdmVzIHRvPC9saT4KLQotPGxpPgotdGhlIHJlc29sdmVkIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiBub2RlPC9saT4KLQotPGxpPgotdGhlIHJlc29sdmVkIGJpbmRpbmcgb2YgYSBkZWNsYXJhdGlvbiBub2RlPC9saT4KLQotPGxpPgotb3RoZXJzPzwvbGk+Ci08L3VsPgotT25jZSBpbiB0aGUgd29ybGQgb2YgYmluZGluZ3MsIHRoZSBjbGllbnQgY2FuIG5hdmlnYXRlIHRoZSB3ZWIgb2YgYmluZGluZ3M6Ci08dWw+Ci08bGk+Ci1mcm9tIGFycmF5IHR5cGUgdG8gaXRzIGNvbXBvbmVudCB0eXBlLCBhbmQgdmljZSB2ZXJzYTwvbGk+Ci0KLTxsaT4KLWZyb20gZmllbGQgb3IgdmFyaWFibGUgdG8gaXRzIGRlY2xhcmVkIHR5cGU8L2xpPgotCi08bGk+Ci1mcm9tIG1ldGhvZCB0byBpdHMgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZXM8L2xpPgotCi08bGk+Ci1mcm9tIHR5cGUgdG8gaXRzIGNvbnN0cnVjdG9ycyBhbmQgaXRzIGRlY2xhcmVkIG1ldGhvZCwgZmllbGQsIGFuZCB0eXBlCi1tZW1iZXJzPC9saT4KLQotPGxpPgotZnJvbSBjb25zdHJ1Y3RvciwgbWV0aG9kLCBvciBmaWVsZCB0byBpdHMgZGVjbGFyaW5nIHR5cGU8L2xpPgotCi08bGk+Ci1mcm9tIG5lc3RlZCB0eXBlIHRvIGl0cyBlbmNsb3NpbmcgdHlwZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBkZWNsYXJpbmcgcGFja2FnZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBpdHMgc3VwZXJ0eXBlcyAoYnV0LCBzaWduaWZpY2FudGx5LCA8aT5ub3Q8L2k+IHRvIGl0cyBzdWJ0eXBlcyk8L2xpPgotCi08bGk+Ci1kaXJlY3RseSB0byB0aGUgYmluZGluZyBmb3IgYW55IGJhc2UgdHlwZSAoaW50LCBmbG9hdCwgY2hhciwgZXRjLik8L2xpPgotCi08bGk+Ci1kaXJlY3RseSB0byB0aGUgYmluZGluZyBmb3IgYSBoYW5kZnVsIG9mIHdlbGwta25vd24gdHlwZXMgKGphdmEubGFuZy5PYmplY3QsCi1ldGMuKTwvbGk+Ci08L3VsPgotU29tZSBvZiB0aGUgbmF2aWdhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAocXVpdGUgaW50ZW50aW9uYWxseSk6Ci08dWw+Ci08bGk+Ci1mcm9tIHBhY2thZ2UgdG8gaXRzIChrbm93bikgdHlwZXMgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+Ci0KLTxsaT4KLWZyb20gcGFja2FnZSB0byBvbmUgb2YgaXRzIHR5cGVzIGJ5IG5hbWUgLSB2ZXJ5IGV4cGVuc2l2ZTwvbGk+Ci0KLTxsaT4KLWZyb20gdHlwZSB0byBpdHMgKGtub3duKSBzdWJ0eXBlcyAtIHZlcnkgZXhwZW5zaXZlPC9saT4KLQotPGxpPgotZnJvbSB0eXBlIG9yIG1ldGhvZCB0byB0aGUgbG9jYWwgdHlwZXMgaXQgZW5jbG9zZXMgLSBiaW5kaW5nIGZvciBsb2NhbAotdHlwZXMgYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhvc2Ugd2l0aCB0aGUgZW5jbG9zaW5nIHR5cGUncyBBU1QgaW4gdGhlaXIKLWhhbmQ8L2xpPgotCi08bGk+Ci1mcm9tIG1ldGhvZCB0byB0aGUgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGhpbiBpdCAtIGJpbmRpbmcgZm9yIHZhcmlhYmxlcwotYXJlIG9ubHkgb2YgaW50ZXJlc3QgdG8gdGhvc2Ugd2l0aCB0aGUgbWV0aG9kJ3MgQVNUIGluIHRoZWlyIGhhbmQ8L2xpPgotPC91bD4KLVRoZXJlIGFyZSBubyBsaW5rcyBmcm9tIHRoZSB3b3JsZCBvZiBiaW5kaW5ncyBiYWNrIHRvIHRoZSB3b3JsZCBvZiBBU1RzLgotPHA+T3RoZXIgdGhpbmdzIGRlYWx0IHdpdGggaW4gdGhlIHdvcmxkIG9mIGJpbmRpbmdzOgotPHVsPgotPGxpPgotc3ludGhldGljIGVudGl0aWVzIHN0ZW1taW5nIGZyb20gZGVmYXVsdCBjb25zdHJ1Y3RvcnMsIGFic3RyYWN0IG1ldGhvZAotY29weS1kb3duIGZyb20gaW50ZXJmYWNlcywgYW5kIGlubmVyIGNsYXNzIGVtdWxhdGlvbjwvbGk+Ci0KLTxsaT4KLW1pc3NpbmcgYmluZGluZ3MgZm9yIGVudGl0aWVzIHRoYXQgYXJlIHJlcXVpcmVkIChtZW50aW9uZWQgYnkgbmFtZSkgYnV0Ci13ZXJlIG5vdCBmb3VuZDwvbGk+Ci0KLTxsaT4KLXR5cGUgaGllcmFjaHkgY2lyY3VsYXJpdGllczwvbGk+Ci0KLTxsaT4KLWludGVybmFsIGluY29uc2lzdGVuY2llczwvbGk+Ci08L3VsPgotT3RoZXIgaXNzdWVzOgotPHVsPgotPGxpPgotQ29tcGlsZS10aW1lLWNvbXB1dGVkIHZhbHVlcyBmb3IgY29uc3RhbnRzIChwdWJsaWMgc3RhdGljIGZpbmFsIGZpZWxkcwotd2l0aCBjb21waWxlLXRpbWUgY29tcHV0YWJsZSB2YWx1ZXMpPC9saT4KLTwvdWw+Ci0KLTxoND4KLUV4aXN0aW5nIEJpbmRpbmcgY2xhc3NlczwvaDQ+Ci1UbyBnaXZlIGFuIGlkZWEgb2YgdGhlIHNjb3BlIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nIGluZnJhc3RydWN0dXJlLCBiZWxvdwotaXMgYSBkdW1wIG9mIHRoZSB0eXBlIGhpZXJhcmNoeSBvZiB0aGUgY29tcGlsZXIncyBiaW5kaW5nIGNsYXNzZXMgZnJvbQotcGFja2FnZSA8dHQ+cmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwPC90dD4uCi08cD48dHQ+cHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBmaW5hbCBjbGFzcyBBcnJheUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGZpbmFsIGNsYXNzIEJhc2VUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MKLVJlZmVyZW5jZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXB1YmxpYyBjbGFzcyBTb3VyY2VUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGNsYXNzIE5lc3RlZFR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgZmluYWwgY2xhc3MgTG9jYWxUeXBlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGZpbmFsIGNsYXNzIE1lbWJlclR5cGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXB1YmxpYyBjbGFzcyBVbnJlc29sdmVkUmVmZXJlbmNlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgUGFja2FnZUJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1QYWNrYWdlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFibGVCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBjbGFzcyBMb2NhbFZhcmlhYmxlQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcHVibGljIGNsYXNzIFN5bnRoZXRpY0FyZ3VtZW50QmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgRmllbGRCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgU3ludGhldGljRmllbGRCaW5kaW5nPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1wdWJsaWMgY2xhc3MgUHJvYmxlbUZpZWxkQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgTWV0aG9kQmluZGluZzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwdWJsaWMgY2xhc3MgUHJvYmxlbU1ldGhvZEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFN5bnRoZXRpY0FjY2Vzc01ldGhvZEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIEltcG9ydEJpbmRpbmc8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIGNsYXNzIFByb2JsZW1CaW5kaW5nPC90dD4KLTxoND4KLUJpbmRpbmcgQVBJPC9oND4KLVRoZSBleGlzdGluZyBiaW5kaW5nIGNsYXNzZXMgYXJlIG5vdCBpbW1lZGlhdGVseSBzdWl0YWJsZSBmb3IgZXhwb3NpbmcKLWFzIGEgYmluZGluZyBBUEkuCi08cD5Ib3dldmVyLCB0aGUgSmF2YSBidWlsZGVyIGRvZXMgaGF2ZSBhbiBBUEkgZm9yIHRoZSBidWlsdCAiaW1hZ2UiLCBpbgotcGFja2FnZSA8dHQ+b3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlcjwvdHQ+LiAoVGhpcyBBUEkgaXMgYQotaG9sZC1vdmVyIGZyb20gTGVhcGZyb2cgZXJhLCBhbmQgaXMgbm90IGV4cG9zZWQgaW4gdGhlIEVjbGlwc2UgY29kZSBiYXNlKS4KLVRoaXMgQVBJIHdhcyBkZXNpZ25lZCB0byBleHBvc2UgdGhlIHNhbWUga2luZCBvZiBpbnRlZ3JhdGVkIHBpY3R1cmUgb2YKLXRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2dyYW0gYXMgc2VlbiBmcm9tIHRoZSBjb21waWxlcidzIHBvaW50IG9mIHZpZXcuCi1UaGlzIEFQSSBoYXMgYSBkZXRhaWxlZCBzcGVjaWZpY2F0aW9uIHRoYXQgZG9lcyBub3QgZXhwb3NlIGltcGxlbWVudGF0aW9uCi1kZXRhaWxzLCBzbyB0aGUgcHJvcG9zYWwgaXMgdG8gdXNlIGl0IGFzIHRoZSBiYXNpcyBmb3IgdGhlIG5ldyBiaW5kaW5nCi1BUEkuCi08cD5SZS1wdXJwb3NpbmcgdGhpcyBBUEkgd291bGQgZW50YWlsOgotPHVsPgotPGxpPgotaW50cm9kdWNpbmcgZW50aXRpZXMgZm9yIGxvY2FsIHZhcmlhYmxlczwvbGk+Ci0KLTxsaT4KLXJlbW92aW5nIHByb3RvY29sIGZvciBuYXZpZ2F0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIChlLmcuLCBmcm9tIHBhY2thZ2UKLXRvIGl0cyBrbm93biB0eXBlcyk8L2xpPgotCi08bGk+Ci1yZW1vdmluZyB1bm5lZWRlZCBwcm90b2NvbDsgaW5jbHVkaW5nIHN0YXRlcywgbm9uLXN0YXRlLXNwZWNpZmljIGhhbmRsZXMsCi1kZWx0YXMsIHJlcG9ydCBjYXJkcywgZGVwZW5kZW5jeSBncmFwaCwgcGFja2FnZSByZWZlcmVuY2VzPC9saT4KLTwvdWw+Ci1CZWxvdyBpcyBhIGR1bXAgb2YgdGhlIHJlbGV2YW50IGludGVyZmFjZXMgZnJvbSBwYWNrYWdlIDx0dD5vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyPC90dD4uCi1Vbm5lY2Vzc2FyeSBwcm90b2NvbCBoYXMgYmVlbiBvbWl0dGVkLiAoTm90ZSB0aGF0IE5vdFByZXNlbnRFeGNlcHRpb24gaXMKLWFuIHVuY2hlY2tlZCBleGNlcHRpb24sIGFuZCB3b3VsZCBub3QgYmUgcmVxdWlyZWQuKQotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgS19KQVZBX0lNQUdFID0gMTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9QQUNLQUdFID0gMjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9UWVBFID0gMzs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9GSUVMRCA9IDQ7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBLX0pBVkFfTUVUSE9EID0gNTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IEtfSkFWQV9DT05TVFJVQ1RPUiA9IDY7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgaGFzaENvZGUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0ZpY3Rpb25hbCgpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQga2luZCgpOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJTWVtYmVyIGV4dGVuZHMgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXREZWNsYXJpbmdDbGFzcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgZ2V0TW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXROYW1lKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNCaW5hcnkoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJUGFja2FnZSBleHRlbmRzIElIYW5kbGU8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldENsYXNzSGFuZGxlKFN0cmluZyBuYW1lKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1VubmFtZWQoKTs8L3R0PgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRBcnJheUhhbmRsZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRDb21wb25lbnRUeXBlKCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvckhhbmRsZShJVHlwZVtdIHBhcmFtZXRlclR5cGVzKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXREZWNsYXJlZENsYXNzZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSUNvbnN0cnVjdG9yW10gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB0aHJvd3MKLU5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElGaWVsZFtdIGdldERlY2xhcmVkRmllbGRzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElNZXRob2RbXSBnZXREZWNsYXJlZE1ldGhvZHMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldERlY2xhcmVkTW9kaWZpZXJzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFN0cmluZyBnZXREZWNsYXJlZE5hbWUoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSUZpZWxkIGdldEZpZWxkSGFuZGxlKFN0cmluZyBuYW1lKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRJbnRlcmZhY2VzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElNZXRob2QgZ2V0TWV0aG9kSGFuZGxlKFN0cmluZyBuYW1lLCBJVHlwZVtdCi1wYXJhbWV0ZXJUeXBlcyk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCBnZXRNb2RpZmllcnMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgU3RyaW5nIGdldE5hbWUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVBhY2thZ2UgZ2V0UGFja2FnZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRTdXBlcmNsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0FycmF5KCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNCaW5hcnkoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0NsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNEZXByZWNhdGVkKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNJbm5lckNsYXNzKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc0xvY2FsKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQYWNrYWdlTWVtYmVyKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmltaXRpdmUoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzVG9wTGV2ZWwoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZCBleHRlbmRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRSZXR1cm5UeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxwPjx0dD5wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJ1Y3RvciBleHRlbmRzIElNZW1iZXI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzUHJlc2VudCgpOzwvdHQ+Ci08cD48dHQ+cHVibGljIGludGVyZmFjZSBJRmllbGQgZXh0ZW5kcyBJTWVtYmVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBJVHlwZSBnZXRUeXBlKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJvb2xlYW4gaXNQcmVzZW50KCk7PC90dD4KLTxwPkluIHRoaXMgdmVpbiwgdGhlIGludGVyZmFjZSBmb3IgbG9jYWwgdmFyaWFibGVzIHdvdWxkIGxvb2sgc29tZXRoaW5nCi1saWtlOgotPHA+PHR0PnB1YmxpYyBpbnRlcmZhY2UgSVZhcmlhYmxlIGV4dGVuZHMgSUhhbmRsZTwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgSVR5cGUgZ2V0RGVjbGFyaW5nQ2xhc3MoKTs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgaW50IGdldE1vZGlmaWVycygpIHRocm93cyBOb3RQcmVzZW50RXhjZXB0aW9uOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBTdHJpbmcgZ2V0TmFtZSgpOzwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBib29sZWFuIGlzU3ludGhldGljKCkgdGhyb3dzIE5vdFByZXNlbnRFeGNlcHRpb247PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IElUeXBlIGdldFR5cGUoKSB0aHJvd3MgTm90UHJlc2VudEV4Y2VwdGlvbjs8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgYm9vbGVhbiBpc1ByZXNlbnQoKTs8L3R0PgotPHA+QWxzbyB3aWxsIG5lZWQgdG8gYWRkOgotPHVsPgotPGxpPgotUHNldWRvLWJpbmRpbmdzIGZvciBiYXNlIHR5cGVzOiBib29sZWFuLCBpbnQsIGZsb2F0LCBldGMuPC9saT4KLQotPGxpPgotQWNjZXNzIHRvIHdlbGwta25vd24gamF2YS5sYW5nIGJpbmRpbmdzOiBPYmplY3QsIFN0cmluZywgVGhyb3dhYmxlLCBFeGNlcHRpb24sCi1SdW50aW1lRXhjZXB0aW9uLCBFcnJvciwgQ2xhc3MuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLURvY3VtZW50IEhpc3Rvcnk8L2gzPgotMTg6MzAgVGh1cnNkYXkgU2VwdGVtYmVyIDI3LCAyMDAxIC0gaW5jb3Jwb3JhdGVkIGZpcnN0IHJvdW5kIGNvbW1lbnRzIGZyb20KLVBNIGFuZCBEQi4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+MTA6NDUgTW9uZGF5IE9jdG9iZXIgMSwgMjAwMSAtIGluY29ycG9yYXRlZCBjb21tZW50cwotZnJvbSBEQi48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPjEwOjQ1IFR1ZXNkYXkgT2N0b2JlciAyLCAyMDAxIC0gY2xhcmlmeSBoYW5kaW5nCi1vZiBFeHByZXNzaW9uU3RhdGVtZW50LjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzMzNjZGRiI+MTQ6MDAgRnJpZGF5IE9jdG9iZXIgMjYsIDIwMDEgLSBhZGQgc3VidHJlZSBzdHJ1Y3R1cmFsCi1lcXVhbGl0eS48L2ZvbnQ+Ci08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL291dHB1dCBmb2xkZXIvb3V0cHV0LWZvbGRlci5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9vdXRwdXQgZm9sZGVyL291dHB1dC1mb2xkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMjlkMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL291dHB1dCBmb2xkZXIvb3V0cHV0LWZvbGRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDx0aXRsZT5KRFQgLSBKYXZhIE91dHB1dCBGb2xkZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLUphdmEgT3V0cHV0IEZvbGRlcjwvaDI+Ci1MYXN0IHJldmlzZWQgMTc6MzAgVHVlc2RheSBPY3RvYmVyIDMwLCAyMDAxIDxmb250IGNvbG9yPSIjMzMzM0ZGIj4ocmVjZW50Ci1jaGFuZ2VzIGluIGJsdWU7PC9mb250Pjxmb250IGNvbG9yPSIjQ0MwMDAwIj4gbGF0ZXN0IGluIHJlZDwvZm9udD48Zm9udCBjb2xvcj0iIzMzMzNGRiI+KTwvZm9udD4KLTxwPldvcmsgaXRlbTogIlN1cHBvcnQgZm9yIGRlYWxpbmcgd2l0aCBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQgYnkgZXh0ZXJuYWwKLUphdmEgY29tcGlsZXJzIGxpa2UgamF2YWMgYW5kIGppa2VzIGZyb20gYW4gQW50IHNjcmlwdC4iCi08cD5IZXJlJ3MgdGhlIGNydXggb2Ygb25lIHByb2JsZW0gKGZyb20gV1NBRCwgdmlhIEpvaG4gVy4pOgotPHA+SW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIGNsaWVudCBoYXMgbGltaXRlZCBmbGV4aWJpbGl0eSBpbiBob3cgdGhleQotc3RydWN0dXJlIHRoZWlyIEphdmEgcHJvamVjdHMuIFNvdXJjZXMgbXVzdCBnbyBoZXJlOyByZXNvdXJjZSBmaWxlcyBoZXJlOwotbWl4ZWQgcmVzb3VyY2UgYW5kIGNsYXNzIGZpbGVzIGhlcmU7IGV0Yy4KLTx1bD4KLTxsaT4KLVRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZSBjbGllbnQgbmVlZHMgdG8gcGxhY2UgYWRkaXRpb25hbCBjbGFzcyBmaWxlcwotYW5kIHJlc291cmNlIGZpbGVzIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LjwvbGk+Ci0KLTxsaT4KLVRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZSBjbGllbnQgbmVlZHMgdG8gZ2VuZXJhdGUgY2xhc3MgZmlsZXMgaW50bwotYW4gZXhpc3RpbmcgZm9sZGVyIGZpbGxlZCB3aXRoIHRoZWlyIGNsYXNzIGZpbGVzIGFuZCByZXNvdXJjZSBmaWxlcyAoZS5nLiwKLWFuIGV4cGxvZGVkIFdBUiBmaWxlKS48L2xpPgotPC91bD4KLVdoZW4gY2xpZW50cyBhdHRlbXB0cyBlaXRoZXIsIHRoZXkgZGlzY292ZXIgdGhhdCAoYSkgdGhlIEphdmEgbW9kZWwgYW5kCi1idWlsZGVyIGlnbm9yZSBhbnkgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIGFuZCAoYikgZnJvbSB0aW1lCi10byB0aW1lIHRoZXNlIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGdldCBkZWxldGVkIHdpdGhvdXQgd2FybmluZy4KLTxwPlRoZSBKYXZhIGJ1aWxkZXIgd2FzIGRlc2lnbmVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgIm93bnMiIHRoZQotb3V0cHV0IGZvbGRlci4gVGhlIHdvcmsgaXRlbSwgdGhlcmVmb3JlLCBpcyB0byBjaGFuZ2UgdGhlIEphdmEgYnVpbGRlcgotdG8gZ2l2ZSBjbGllbnRzIGFuZCB1c2VycyBtb3JlIGZsZXhpYmxpbGl0eSBhcyB0byB3aGVyZSB0aGV5IHBsYWNlIHRoZWlyCi1zb3VyY2UsIHJlc291cmNlLCBsaWJyYXJ5IGNsYXNzLCBhbmQgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzLgotPGgzPgotQ3VycmVudCBGdW5jdGlvbmFsaXR5PC9oMz4KLUVjbGlwc2UgMS4wIEphdmEgYnVpbGRlciBoYXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3MgKGFuZCBpbmNvbnNpc3RlbmNpZXMpOgotPHVsPgotPGxpPgotVGhlIGNsYXNzIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgSmF2YSBidWlsZGVyIGdvIGluIGEgc2luZ2xlIG91dHB1dCBmb2xkZXIuCi1KYXZhIHNvdXJjZSBmaWxlcyBnbyBpbiBvbmUgb3IgbW9yZSBzb3VyY2UgZm9sZGVycy4gQW55IG90aGVyIGtpbmQgb2YgZmlsZXMKLWNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZvbGRlciB0b287IHRoaXMgaW5jbHVkZXMgcHJlLWNvbXBpbGVkIGNsYXNzCi1maWxlcy4gQWxsIHRoZXNlIG90aGVyIGZpbGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBtaXJyb3JlZCB0byB0aGUgYmluYXJ5Ci1vdXRwdXQgZGlyZWN0b3J5IHdoZW4gYSBidWlsZCBpcyBkb25lLiBUaGUgbWlycm9yIGlzIG1haW50YWluZWQgYXMgdGhlCi1zb3VyY2UgZm9sZGVyIGNoYW5nZXM7IGRhbWFnZSBtYWRlIGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQgZm9sZGVyIGdldHMgcmVwYWlyZWQKLW5vIGxhdGVyIHRoYW4gdGhlIG5leHQgZnVsbCBidWlsZC48L2xpPgotCi08bGk+Ci1UaGUgb3V0cHV0IGZvbGRlciBiZWxvbmdzIHRvIHRoZSBKYXZhIGJ1aWxkZXIuIEl0IHN1bW1hcmlseSBkZWxldGVzIGZpbGVzCi1mcm9tIHRoZSBvdXRwdXQgZm9sZGVyIHRoYXQgaXQgZG9lcyBub3QgdGhpbmsgYmVsb25nIHRoZXJlLiBJdCBpcyBub3QgcG9zc2libGUKLXRvIGdldCBhd2F5IHdpdGggYWRkaW5nIGZpbGVzIGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQgZm9sZGVyLiBTbyB5b3UgY2Fubm90Ci1ldmVuIG1hdGUgdGhlIGV4dHJhIHJlc291cmNlIGZpbGVzIHdpdGggdGhlIGNsYXNzIGZpbGVzIG1hbnVhbGx5LjwvbGk+Ci0KLTxsaT4KLVdoZW4gdGhlIHByb2plY3Qgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVyIGNvaW5jaWRlIChwZXJoYXBzIGF0IHRoZSBwcm9qZWN0Ci1pdHNlbGYpLCB0aGUgYnVpbGRlciBiZWhhdmVzIGRpZmZlcmVudGx5LiBJdCBncmFudHMgdGhhdCBzb3VyY2UgZmlsZXMgYmVsb25nCi10aGVyZSwgc28gaXQgbmV2ZXIgZGVsZXRlcyB0aGVtLiBJdCBhbHNvIGdyYW50cyB0aGF0IG5vbi1jbGFzcyBmaWxlcyBiZWxvbmcKLXRoZXJlLCBzbyBpdCBuZXZlciBkZWxldGVzIHRoZW0gZWl0aGVyLiBCdXQgaXQgYXNzdW1lcyB0aGF0IGFsbCBjbGFzcyBmaWxlcwotYXJlIGdlbmVyYXRlZCwgYW5kIHNvIGl0IHN1bW1hcmlseSBkZWxldGVzIHRoZW0gb24gZXZlcnkgZnVsbCBidWlsZCwgaW5jbHVkaW5nCi1jbGFzcyBmaWxlcyB0aGF0IHdlcmUgZXhwbGljaXRseSBwdXQgdGhlcmUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCi13YXkgdGhpbmdzIHdvcmsgb3V0IHdoZW4gdGhlIG91dHB1dCBmb2xkZXIgYW5kIHRoZSBzb3VyY2UgZm9sZGVyIGRvIG5vdAotY29pbmNpZGUuIEFuZCBpdCBpcyBub3Qgd2hhdCB5b3Ugd2FudCBpZiB5b3UgbmVlZCB0byBtYXRlIG90aGVyIGNsYXNzIGZpbGVzCi13aXRoIHRoZSBnZW5lcmF0ZWQgb25lcy48L2xpPgotPC91bD4KLQotPGgzPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPldTQUQgdXNlY2FzZSAtIGZvciB0aGUgcmVjb3JkPC9mb250PjwvaDM+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIDwvZm9udD48Zm9udCBjb2xvcj0iI0NDMDAwMCI+KHByb3Bvc2VkKTwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+Ci1XU0FEIHNjZW5hcmlvIGlzIHRoYXQgdGhleSBoYXZlIGEgc3JjLyBmb2xkZXIgZm9yIHNvdXJjZSBjb2RlLCBhIGNsYXNzZXMvCi1mb2xkZXIgZm9yIHByZS1leGlzdGluZyBjbGFzcyBmaWxlcyAoZXh0cmFjdGVkIGZyb20gYSBXQVIgZmlsZSksIGFuZCBhCi1iaW4vIGZvbGRlciBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMuPC9mb250PgotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlRoZSB0eXBpY2FsIGNhc2UgaXMgd2hlcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlcnMKLWFyZSBkaXN0aW5jdC4gSW4gdGhpcyBjYXNlLCB0aGUgY2xhc3Nlcy8gZm9sZGVyIG1heSBvciBtYXkgY29udGFpbiBjbGFzcwotZmlsZXMuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgc291cmNlIGNvZGUgbXVzdCBiZSBjb21waWxlZCBhZ2FpbnN0IHRoZSBjbGFzc2VzCi1pbiBjbGFzc2VzLyBmb2xkZXIuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyBtYXkgY29pbmNpZGUuIFRoZSBjbGFzc2VzLwotZm9sZGVyIGlzIGFsd2F5cyBzZXBhcmF0ZSBmcm9tIGVpdGhlci48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPkluIG9yZGVyIHRvIGJlIGV4ZWN1dGFibGUsIGFsbCBjbGFzcyBmaWxlcyBtdXN0IGVuZAotdXAgaW4gdGhlIG91dHB1dCBmb2xkZXIuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgY2xpZW50IHdvdWxkIGxpa2UgYSB3YXkgdG8gZGVsZXRlIGNsYXNzIGZpbGVzCi1mcm9tIHRoZSBjbGFzc2VzLyBmb2xkZXIgZm9yIHdoaWNoIHRoZXJlIGlzIGNvcnJlc3BvbmRpbmcgc291cmNlLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGtlZXAgcmVzb3VyY2UgZmlsZXMgaW4gdGhlCi1vdXRwdXQgZm9sZGVyIG9uIGFuIG9uZ29pbmcgYmFzaXMuPC9mb250PjwvbGk+Ci08L3VsPgotCi08aDM+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJvcG9zYWw8L2ZvbnQ+PC9oMz4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgSmF2YSBidWlsZGVyIGNvbXBpbGVzIHNvdXJjZSBmaWxlcyBmb3VuZCBpbiB0aGUKLXNvdXJjZSBmb2xkZXJzIHNwZWNpZmllZCBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIGFuZCBnZW5lcmF0ZXMgY2xhc3MgZmlsZXMKLWludG8gdGhlIG91dHB1dCBmb2xkZXIuIFRoZSBKYXZhIGJ1aWxkZXIgYWxzbyBjb3BpZXMgInJlc291cmNlIiBmaWxlcyBmcm9tCi1zb3VyY2UgZm9sZGVycyB0byB0aGUgb3V0cHV0IGZvbGRlciAocHJvdmlkZWQgdGhhdCBzb3VyY2UgYW5kIG91dHB1dCBkbwotbm90IGNvaW5jaWRlKS4gT25jZSBpbiB0aGUgb3V0cHV0IGZvbGRlciwgdGhlIHJlc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUKLWF0IHJ1bnRpbWUgYmVjYXVzZSB0aGUgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgcnVudGltZSBjbGFzcwotcGF0aC4gVGhlIHByb3Bvc2FsIGlzIHRvIGV4dGVuZCB0aGlzIG1lY2hhbmlzbS48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgZm9sbG93aW5nIHByb3Bvc2FsIGludm9sdmVzOjwvZm9udD4KLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5DbGFyaWZ5aW5nIG93bmVyc2hpcCBvZiBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiNGRjAwMDAiPkNsYXJpZnlpbmcgc2VtYW50aWNzIG9mIHJlc291cmNlIGZpbGUgY29weWluZyBmcm9tCi1zb3VyY2UgZm9sZGVycyB0byBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+TWFraW5nIHJlc291cmNlIGZpbGUgY29weWluZyBmcm9tIHNvdXJjZSBmb2xkZXJzCi10byBvdXRwdXQgZm9sZGVyIG9wdGlvbmFsLCByYXRoZXIgdGhhbiBtYW5kYXRvcnkuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5Qcm92aWRpbmcgY2xhc3MgZmlsZSBjb3B5aW5nIGZyb20gbGlicmFyeSBmb2xkZXJzCi10byBvdXRwdXQgZm9sZGVyLCBhbHNvIG9uIGFuIG9wdGlvbmFsIGJhc2lzLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UHJvdmlkaW5nIGFuZCBwcm9tb3RpbmcgdXNlZnVsIGFsdGVybmF0aXZlcyB0byBmaWxlCi1jb3B5aW5nLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UHJvaGliaXRpbmcgY2FzZXMgd2hlcmUgZXhwZW5kYWJsZSBjb3BpZXMgd291bGQgZW5kCi11cCBtaXhlZCB3aXRoIGltcG9ydGFudCB1c2VyIGRhdGEuPC9mb250PjwvbGk+Ci08L3VsPgotCi08aDQ+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+T3V0cHV0IGZvbGRlciBvd25lcnNoaXA8L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5XaGVuIHRoZSBvdXRwdXQgZm9sZGVyIGRvZXMgbm90IGNvaW5jaWRlIHdpdGggYSBzb3VyY2UKLWZvbGRlciwgdGhlIEphdmEgYnVpbGRlciBvd25zIHRoZSBvdXRwdXQgZm9sZGVyIGFuZCBldmVyeXRoaW5nIGluIGl0LiBUaGUKLW91dHB1dCBmb2xkZXIgaXMgdGFrZW4gdG8gY29udGFpbiBvbmx5IGZpbGVzIHRoYXQgYXJlICJleHBlbmRhYmxlIiAtIGVpdGhlcgotZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIG9yIGNvcGllcyBvZiBmaWxlcyB0aGF0IGxpdmUgaW4gYSBzb3VyY2Ugb3IgbGlicmFyeQotZm9sZGVyLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPlVzZXJzIG9yIGNsaWVudHMgdGhhdCBhZGQsIHJlbW92ZSwgb3IgcmVwbGFjZQotZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgY2FuIGV4cGVjdCB1bnByZWRpY2F0YWJsZSByZXN1bHRzLiBJZiB0aGUgdXNlcgotb3IgY2xpZW50IGRvZXMgdGFtcGVyIHdpdGggZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIKLWRvZXMgbm90IGF0dGVtcHQgdG8gcmVwYWlyIHRoZSBkYW1hZ2UuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKLXVzZXIgb3IgY2xpZW50IHRvIGNsZWFuIHVwIHRoZWlyIG1lc3MgKGJ5IG1hbnVhbGx5IHJlcXVlc3RpbmcgYSBmdWxsIGJ1aWxkKS48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5XaGVuIHRoZSBvdXRwdXQgZm9sZGVyIGNvaW5jaWRlcyB3aXRoIGEgc291cmNlCi1mb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIgb25seSBvd25zIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci4KLU9ubHkgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGV4cGVuZGFibGUuIFVzZXJzCi1vciBjbGllbnRzIHRoYXQgYWRkLCByZW1vdmUsIG9yIHJlcGxhY2UgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIKLWNhbiBleHBlY3QgdW5wcmVkaWN0YWJsZSByZXN1bHRzLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPihOLkIuIFRoaXMgaXMgYSByZXN0YXRlbWVudCBvZiB0aGUgY3VycmVudCBiZWhhdmlvci4KLVtWZXJpZnkgdGhhdCBkYW1hZ2UgdG8gb3V0cHV0IGZvbGRlciBpcyBub3QgdHJpZ2dlcmluZyBidWlsZHMuXSk8L2ZvbnQ+Ci08aDQ+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+T3V0cHV0IGZvbGRlciByZXNvdXJjZSBmaWxlIGNvbnNvbGlkYXRpb248L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGUgSmF2YSBidWlsZGVyIHByb3ZpZGVzIHJlc291cmNlIGZpbGUgY29uc29saWRhdGlvbiwKLWZvciByZXNvdXJjZSBmaWxlcyBzdG9yZWQgaW4gc291cmNlIGZvbGRlcnMuPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+V2hlbiB0aGUgb3V0cHV0IGZvbGRlciBkb2VzIG5vdCBjb2luY2lkZSB3aXRoCi1hIHNvdXJjZSBmb2xkZXIsIHRoZSBKYXZhIGJ1aWxkZXIgY2FuIGFsc28gYmUgdXNlZCB0byBjb25zb2xpZGF0ZSByZXNvdXJjZXMKLWZpbGVzIG5lZWRlZCBhdCBydW50aW1lIGluIHRoZSBvdXRwdXQgZm9sZGVyLiBJbiBzb21lIGNhc2VzLCB0aGlzIGNvbnNvbGlkYXRpb24KLW1heSBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgYWx0ZXJuYXRpdmUgb2YgaW5jbHVkaW5nIGFkZGl0aW9uYWwgcnVudGltZSBjbGFzc3BhdGgKLWVudHJpZXMgZm9yIHNvdXJjZSBmb2xkZXJzIGNvbnRhaW5pbmcgcmVzb3VyY2VzIGZpbGVzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IGZsYWdnaW5nIGEgc291cmNlIGZvbGRlciBhcyBjb3BpZWQsIGFsbCBub24tc291cmNlLAotbm9uLWNsYXNzIGZpbGVzIGJlY29tZSBlbGlnaWJsZSB0byBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuIFdoZW4KLXRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggc3BlY2lmeWluZyBjb3B5aW5nLCBlbGlnaWJsZQotZmlsZXMgZm9yIGVhcmxpZXIgY2xhc3NwYXRoIGVudHJpZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgb25lcyBmb3IgbGF0ZXIKLWVudHJpZXMuPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+V2hlbiB0aGUgb3V0cHV0IGZvbGRlciBjb2luY2lkZXMgd2l0aCBhIHNvdXJjZQotZm9sZGVyLCB0aGUgSmF2YSBidWlsZGVyIGNhbm5vdCBwZXJmb3JtIGFueSByZXNvdXJjZSBmaWxlIGNvbnNvbGlkYXRpb24KLShyZXNvdXJjZSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBiZWxvbmcgdG8gdGhlIHVzZXIsIG5vdCB0byB0aGUgSmF2YQotYnVpbGRlcikuIEl0IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgdG8gc3BlY2lmeSBjb3B5aW5nIGZyb20gb3RoZXIgc291cmNlCi1mb2xkZXJzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPihOLkIuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gY3VycmVudCBiZWhhdmlvcgotaW4gYSBjb3VwbGUgb2YgcmVnYXJkczo8L2ZvbnQ+Ci08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+UmVzb3VyY2UgZmlsZSBjb3B5aW5nIGZvciBzb3VyY2UgZm9sZGVycyBpcyBjdXJyZW50bHkKLW1hbmRhdG9yeS4gSXQgd291bGQgYmVjb21lIG9wdGlvbmFsLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q2xhc3MgZmlsZXMgYXJlIGN1cnJlbnRseSBjb3BpZWQgZnJvbSBzb3VyY2UgZm9sZGVycy4KLVRoaXMgd291bGQgc3RvcC48L2ZvbnQ+PC9saT4KLTwvdWw+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+KTwvZm9udD4KLTxoND4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5PdXRwdXQgZm9sZGVyIGNsYXNzIGZpbGUgY29uc29saWRhdGlvbjwvZm9udD48L2g0PgotPGZvbnQgY29sb3I9IiNGRjAwMDAiPlRoZSBKYXZhIGJ1aWxkZXIgYWxzbyBwcm92aWRlcyBjbGFzcyBmaWxlIGNvbnNvbGlkYXRpb24sCi1mb3IgY2xhc3MgZmlsZXMgc3RvcmVkIGluIGxpYnJhcnkgZm9sZGVycy48L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGUgSmF2YSBidWlsZGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29uc29saWRhdGUKLWNsYXNzIGluIHRoZSBvdXRwdXQgZm9sZGVyLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG91dHB1dCBmb2xkZXIgY29pbmNpZGVzCi13aXRoIGEgc291cmNlIGZvbGRlci4gSW4gc29tZSBjYXNlcywgdGhpcyBjb25zb2xpZGF0aW9uIG1heSBiZSBwcmVmZXJyZWQKLW92ZXIgdGhlIGFsdGVybmF0aXZlIG9mIGluY2x1ZGluZyBhZGRpdGlvbmFsIHJ1bnRpbWUgY2xhc3NwYXRoIGVudHJpZXMKLWZvciBsaWJyYXJ5IGZvbGRlcnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyB3b3JrcyBvbmx5IHdoZW4gdGhlIGxpYnJhcnkKLWZvbGRlciBjb250YWlucyBubyBpbXBvcnRhbnQgcmVzb3VyY2UgZmlsZXMgbmVlZGVkIGF0IHJ1bnRpbWUgKHJlc291cmNlCi1maWxlcyBhcmUgbm90IGNvcGllZCBmcm9tIGxpYnJhcnkgZm9sZGVycywgYmVjYXVzZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUKLW91dHB1dCBmb2xkZXIgYmVsb25nIHRvIHRoZSB1c2VyIHJhdGhlciB0aGFuIHRvIHRoZSBKYXZhIGJ1aWxkZXIpLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IGZsYWdnaW5nIGEgbGlicmFyeSBmb2xkZXIgYXMgY29waWVkLCBhbGwgY2xhc3MKLWZpbGVzIGJlY29tZSBlbGlnaWJsZSB0byBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuCi1DbGFzcyBmaWxlcyBnZW5lcmF0ZWQKLWluIHRoZSBvdXRwdXQgZm9sZGVyIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjbGFzcyBmaWxlcyBjb3BpZWQgZnJvbQotbGlicmFyeSBmb2xkZXJzLjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPihOLkIuIFRoaXMgbmV3IGJlaGF2aW9yLiBGaWxlcyBhcmUgbm90IGNvcGllZAotZnJvbSBsaWJyYXJ5IGZvbGRlcnMgYnkgdGhlIGN1cnJlbnQgSmF2YSBidWlsZGVyLik8L2ZvbnQ+Ci08aDQ+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+U2VtYW50aWNzPC9mb250PjwvaDQ+Ci0KLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5BZGQgYSAiY29weSIgZmxhZyB0byBzb3VyY2UgYW5kIGxpYnJhcnkgKGFuZCB2YXJpYWJsZSkKLWNsYXNzcGF0aCBlbnRyaWVzLjwvZm9udD48L2xpPgotCi08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+Rm9yIGEgc291cmNlIGZvbGRlciwgY29weSBmbGFnIG1lYW5zIHRoYXQgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5yZXNvdXJjZQotKGkuZSwgbm9uLXNvdXJjZSwgbm9uLWNsYXNzKSBmaWxlcyA8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPmluIHRoZQotc291cmNlIGZvbGRlciBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgotCi08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJpbWFyeSB1c2UgaXMgdG8gY29uc29saWRhdGUgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5yZXNvdXJjZQotZmlsZXM8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPiBpbiBvdXRwdXQgZm9sZGVyIHNvIHRoYXQgc291cmNlIGZvbGRlcgotZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBvbiBydW50aW1lIGNsYXNzcGF0aC48L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSBsaWJyYXJ5IGZvbGRlciAoYnV0IG5vdCBhIGxpYnJhcnkgSkFSKSwgY29weQotZmxhZyBtZWFucyB0aGF0IDwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+YWxsIGNsYXNzIGZpbGVzPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj4KLWluIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgZm9sZGVyLjwvZm9udD48L2xpPgotCi08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJpbWFyeSB1c2UgaXMgdG8gY29uc29saWRhdGUgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5jbGFzcwotZmlsZXM8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPiBpbiBvdXRwdXQgZm9sZGVyIHNvIHRoYXQgbGlicmFyeSBmb2xkZXIKLWRvZXMgbm90IG5lZWQgdG8gYmUgaW5jbHVkZWQgb24gcnVudGltZSBjbGFzc3BhdGguPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5OLkIuIFJlc291cmNlIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgbm90Ci1jb3BpZWQuPC9mb250PjwvbGk+Ci08L3VsPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGNvcHkgZmxhZyBzaG91bGQgYmUgb2ZmIGJ5IGRlZmF1bHQgZm9yIGJvdGggdHlwZXMKLW9mIGZvbGRlcjsgaS5lLiwgbm8gZmlsZSBjb3B5aW5nLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+U291cmNlIGZvbGRlciBjb3B5IGZsYWcgb24gZGVzY3JpYmVzIGN1cnJlbnQgYmVoYXZpb3IuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgZXhpc3RpbmcgcHJvamVjdHMgc2hvdWxkCi1oYXZlIGNvcHlpbmcgb24gZm9yIHNvdXJjZSBmb2xkZXJzIHRoYXQgbWlnaHQgY29udGFpbiByZXNvdXJjZSBmaWxlcy48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiNGRjAwMDAiPkxpYnJhcnkgZm9sZGVyIGNvcHkgZmxhZyBvZmYgZGVzY3JpYmVzIGN1cnJlbnQgYmVoYXZpb3IuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5FcnJvciBpZiBhbnkgc291cmNlIGZvbGRlciBjb3B5aW5nIHNwZWNpZmllZCB3aGVuCi1hIHNvdXJjZSBmb2xkZXIgYW5kIG91dHB1dCBmb2xkZXIgY29pbmNpZGUuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5BUEkgb24gSmF2YUNvcmUgZm9yIGNyZWF0aW5nIGNsYXNzcGF0aCBlbnRyaWVzIHdpdGgKLWNvcHkgYml0IHNldC48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPkFQSSBvbiBJQ2xhc3NwYXRoRW50cnkgZm9yIHJlYWRpbmcgY29weSBiaXQuPC9mb250PjwvbGk+Ci08L3VsPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+R2VuZXJhdGVkIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIHRha2UgcHJlY2VkZW5jZQotb3ZlciBjbGFzcyBmaWxlcyBjb3BpZWQgZnJvbSBsaWJyYXJ5IGZvbGRlcnMuPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5GaWxlcyBjb3BpZWQgZnJvbSBlYXJsaWVyIGNsYXNzcGF0aCBlbnRyaWVzIHRha2UKLXByZWNlZGVuY2Ugb3ZlciBvbmVzIGZvciBsYXRlciBlbnRyaWVzLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+VUkgcHJvdmlkZXMgdGhlIHVzZXIgd2l0aCBjb250cm9sIG92ZXIgcmVzb3VyY2UgZmlsZQotY29uc29saWRhdGlvbi48L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiNGRjAwMDAiPkZvciBzb3VyY2UgZm9sZGVyOiAiQ29weSByZXNvdXJjZSAobm9uLXNvdXJjZSwgbm9uLWNsYXNzKQotZmlsZXMgdG8gb3V0cHV0IGZvbGRlciI8L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5VSSBkb2VzIG5vdCBwcm92aWRlIHRoZSB1c2VyIHdpdGggY29udHJvbCBvdmVyIGNsYXNzCi1maWxlIGNvbnNvbGlkYXRpb24uPC9mb250PjwvbGk+Ci0KLTx1bD4KLTxsaT4KLTxmb250IGNvbG9yPSIjRkYwMDAwIj5UaGlzIGZlYXR1cmUgd291bGQgYmUgZW5hYmxlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5Ci1jbGllbnRzIHRoYXQgbmVlZCBpdC48L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5Db25zb2xpZGF0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgYnVpbHQgaW4gdG8gSmF2YSBidWlsZGVyLjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+UHJvOiBQdXRzIHVzIGluIGEgcG9zaXRpb24gd2hlcmUgcmVzb3VyY2UgY29weWluZwotaXMgbm8gbG9uZ2VyIG1hbmRhdG9yeS48L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPlBybzogR2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW1wcm92ZSByZXNvdXJjZQotY29weWluZyBpbXBsZW1lbnRhdGlvbi48L2ZvbnQ+PC9saT4KLTwvdWw+Ci08Zm9udCBjb2xvcj0iI0ZGMDAwMCI+U3VtbWFyeTogUmVzb3VyY2UgZmlsZXMgKG5vbi1zb3VyY2UsIG5vbi1jbGFzcykgbWF5Ci1iZSBjb3BpZWQgZnJvbSBlaXRoZXIgc291cmNlIGZvbGRlcnMuIENsYXNzIGZpbGVzIG1heSBiZSBjb3BpZWQgZnJvbSBsaWJyYXJ5Ci1mb2xkZXJzLCBidXQgbmV2ZXIgb3ZlcnJpZGUgZ2VuZXJhdGVkIGZpbGVzLiBTb3VyY2UgZmlsZXMgbmV2ZXIgZ2V0IGNvcGllZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5PdXRwdXQgZm9sZGVyIGludmFyaWFudDo8L2ZvbnQ+Ci08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+Rm9yIGEgY2xhc3MgZmlsZSBYLmNsYXNzIGluIHRoZSBvdXRwdXQgZm9sZGVyIE88L2ZvbnQ+PC9saT4KLQotPHVsPgotPGxpPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPmlmIGV4aXN0cyBhIFkuamF2YSBpbiBhIHNvdXJjZSBmb2xkZXIgdGhhdCBjb21waWxlcwotdG8gWC5jbGFzcyB0aGVuIHRoZSBYLmNsYXNzIGluIE8gaXMgdGhlIG9uZSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcKLVkuamF2YTwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgZXhpc3RzIGFuIFguY2xhc3MgPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5pbgotc29tZSBsaWJyYXJ5IGZvbGRlciB3aXRoIGNvcHlpbmcgb24gPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj50aGVuIGEKLWNvcHkgb2YgdGhlIFguY2xhc3MgZnJvbSB0aGUgZWFybGllc3Qgc3VjaCA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmxpYnJhcnkKLWZvbGRlcjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3RoZXJ3aXNlIG5vIFguY2xhc3Mgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPnJlc291cmNlIChpLmUuLAotbm9uLXNvdXJjZSwgbm9uLWNsYXNzKSA8L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPmZpbGUgWC5vdGhlciBpbiB0aGUKLW91dHB1dCBmb2xkZXIgTzwvZm9udD48L2xpPgotCi08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgTyBpcyBhbHNvIGEgc291cmNlIGZvbGRlciB0aGVuIGFueSBYLm90aGVyIHRoYXQKLWxpdmVzIHRoZXJlPC9mb250PjwvbGk+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5pZiBleGlzdHMgYW4gWC5vdGhlciA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmluCi1zb21lIHNvdXJjZSBmb2xkZXIgd2l0aCBjb3B5aW5nIG9uPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj4gdGhlbiBhCi1jb3B5IG9mIHRoZSBYLm90aGVyIGZyb20gdGhlIGVhcmxpZXN0IHN1Y2ggPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj5zb3VyY2UKLWZvbGRlcjwvZm9udD48L2xpPgotCi08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+b3RoZXJ3aXNlIG5vIFgub3RoZXIgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxsaT4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5Gb3IgYSBzb3VyY2UgZmlsZSBYLmphdmEgaW4gdGhlIG91dHB1dCBmb2xkZXIgTzwvZm9udD48L2xpPgotCi08dWw+Ci08bGk+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+aWYgTyBpcyBhbHNvIGEgc291cmNlIGZvbGRlciB0aGVuIGFueSBYLmphdmEgdGhhdAotbGl2ZXMgdGhlcmU8L2ZvbnQ+PC9saT4KLQotPGxpPgotPGZvbnQgY29sb3I9IiNGRjAwMDAiPm90aGVyd2lzZSBubyBYLmphdmEgc2hvdWxkIGJlIHByZXNlbnQ8L2ZvbnQ+PC9saT4KLTwvdWw+Ci08L3VsPgotPGZvbnQgY29sb3I9IiMzMzY2RkYiPkEgZnVsbCBidWlsZHMgbXVzdCBhY2hpZXZlIHRoZSBvdXRwdXQgZm9sZGVyIGludmFyaWFudAotZnJvbSA8aT5hcmJpdHJhcnk8L2k+IGluaXRpYWwgY29uZGl0aW9ucy4gV2hlbiBvdXRwdXQgYW5kIHNvdXJjZSBmb2xkZXJzCi1kbyBub3QgY29pbmNpZGUsIGEgZnVsbCBidWlsZCBzaG91bGQgc2NydWIgYWxsIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlCi1vdXRwdXQgZm9sZGVyLCByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGdvdCB0aGVyZS4gV2hlbiBvdXRwdXQgYW5kIHNvdXJjZQotZm9sZGVycyBkbyBjb2luY2lkZSwgYSBmdWxsIGJ1aWxkIHNob3VsZCBzY3J1YiBhbGwgZXhpc3RpbmcgY2xhc3MgZmlsZXMKLWZyb20gdGhlIG91dHB1dCBmb2xkZXIsIGJ1dCBsZWF2ZSBhbGwgb3RoZXIgZmlsZXMgYWxvbmUuPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+QXNzdW1pbmcgdGhhdCBhIHVzZXIgb3IgY2xpZW50IGlzIG9ubHkgYWRkaW5nLAotcmVtb3ZpbmcsIG9yIGNoYW5naW5nIGZpbGVzIGluIHNvdXJjZSBvciBsaWJyYXJ5IGZvbGRlcnMsIGJ1dCBub3QgdGFtcGVyaW5nCi13aXRoIGFueSBvZiB0aGUgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgdGhhdCB0aGUgSmF2YSBidWlsZGVyIG93bnMsCi10aGVuIGFuIGluY3JlbWVudGFsIGJ1aWxkIHNob3VsZCByZS1hY2hpZXZlIHRoZSBvdXRwdXQgZm9sZGVyIGludmFyaWFudC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5BbGdvcml0aG06PC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+RnVsbCBidWlsZDo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBTY3J1YiBhbGwgY2xhc3MgZmlsZXMgZnJvbQotdGhlIG91dHB1dCBmb2xkZXIuPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgaWYgcGVyZm9ybWluZyByZXNvdXJjZSBjb25zb2xpZGF0aW9uCi0ocmVxdWlyZXMgb3V0cHV0IGZvbGRlciAhPSBzb3VyY2UgZm9sZGVyKTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNjcnViCi1hbGwgcmVzb3VyY2UgZmlsZXMgZnJvbSB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBDb21waWxlIGFsbCBzb3VyY2UgZmlsZXMgaW50bwotY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIuPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkgZWxpZ2libGUgY2xhc3MKLWZpbGVzIGZyb20gbGlicmFyeSBmb2xkZXJzIGludG8gdGhlIG91dHB1dCBmb2xkZXIgKG5vIG92ZXJ3cml0aW5nKS48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBpZiBwZXJmb3JtaW5nIHJlc291cmNlIGNvbnNvbGlkYXRpb24KLShyZXF1aXJlcyBvdXRwdXQgZm9sZGVyICE9IHNvdXJjZSBmb2xkZXIpPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkKLWVsaWdpYmxlIHJlc291cmNlIGZpbGVzIGZyb20gc291cmNlIGZvbGRlcnMgaW50byB0aGUgb3V0cHV0IGZvbGRlci48L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5JbmNyZW1lbnRhbCBidWlsZDo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgMSkgcHJvY2VzcyBjaGFuZ2VzCi10byBsaWJyYXJ5IGZvbGRlcnM6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZm9yCi1hZGQgb3IgcmVtb3ZlIG9yIGNoYW5nZSBmaWxlIHAveC5jbGFzcyBpbiBvbmUgb2YgdGhlIGxpYnJhcnkgZm9sZGVyczwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1pZiBwL3guY2xhc3MgaW4gdGhlIG91dHB1dCBmb2xkZXIgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgY29tcGlsZXIgdGhlbjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1zY3J1YiBwL3guY2xhc3MgZnJvbSB0aGUgb3V0cHV0IGZvbGRlcjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1yZW1lbWJlciB0byBjb21waWxlIHNvdXJjZSBmaWxlcyB0aGF0IGRlcGVuZCBvbiBwL3g8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcmVtZW1iZXIgdG8gaW5maWxsIHAveC5jbGFzczwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChwaGFzZSAyKSBwcm9jZXNzIGNoYW5nZXMKLXRvIHNvdXJjZSBmb2xkZXJzOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgotYWRkIHAveS5qYXZhIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotcmVtZW1iZXIgdG8gY29tcGlsZSBzb3VyY2UgZmlsZSBhdCBwYXRoIHAveS5qYXZhPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZm9yCi1yZW1vdmUgb3IgY2hhbmdlIHAveS5qYXZhIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotc2NydWIgYW55IGNsYXNzIGZpbGUgcC94LmNsYXNzIGZyb20gdGhlIG91dHB1dCBmb2xkZXIgdGhhdCBzb21lIHAveS5qYXZhCi1jb21waWxlZCBpbnRvIGxhc3QgdGltZTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1yZW1lbWJlciB0byBpbmZpbGwgcC94LmNsYXNzPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXJlbWVtYmVyIHRvIGNvbXBpbGUgc291cmNlIGZpbGUgYXQgcGF0aCBwL3kuamF2YTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgotYWRkIG9yIHJlbW92ZSBvciBjaGFuZ2UgcmVzb3VyY2UgcC94Lm90aGVyIGluIG9uZSBvZiB0aGUgc291cmNlIGZvbGRlcnM8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotaWYgcGVyZm9ybWluZyByZXNvdXJjZSBjb25zb2xpZGF0aW9uIChyZXF1aXJlcyBvdXRwdXQgZm9sZGVyICE9IHNvdXJjZQotZm9sZGVyKTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1zY3J1YiBwL3gub3RoZXIgZnJvbSB0aGUgb3V0cHV0IGZvbGRlcjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1yZW1lbWJlciB0byBpbmZpbGwgcC94Lm90aGVyPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDMpIHJlY29tcGlsZTo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb21waWxlCi1hbGwgcmVtZW1iZXJlZCBzb3VyY2UgZmlsZXMgaW50byB0aGUgb3V0cHV0IGZvbGRlciAoYW5kIGFueSBkZXBlbmRlbnQgc291cmNlCi1maWxlcyk8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgNCkgaW5maWxsOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgotZWFjaCBob2xlIHAveC5jbGFzcyB0byBpbmZpbGw8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotY29weSBmaXJzdC1mb3VuZCBmaWxlIHAveC5jbGFzcyBpbiBhIGxpYnJhcnkgZm9sZGVyIHRvIHAveC5jbGFzcyBpbiB0aGUKLW91dHB1dCBmb2xkZXIgKG5vIG92ZXJ3cml0aW5nKTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmCi1wZXJmb3JtaW5nIHJlc291cmNlIGNvbnNvbGlkYXRpb24gKHJlcXVpcmVzIG91dHB1dCBmb2xkZXIgIT0gc291cmNlIGZvbGRlcik8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotZm9yIGVhY2ggaG9sZSBwL3gub3RoZXIgdG8gaW5maWxsPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjRkYwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLWNvcHkgZmlyc3QtZm91bmQgZmlsZSBwL3gub3RoZXIgaW4gYSBzb3VyY2UgZm9sZGVyIHRvIHAveC5vdGhlciBpbiB0aGUKLW91dHB1dCBmb2xkZXI8L2ZvbnQ+Ci08aDQ+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+SG93IFRoZXNlIENoYW5nZXMgU29sdmUgV1NBRCdzIFByb2JsZW08L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5XU0FEIHdvdWxkIGluY2x1ZGUgdGhlaXIgY2xhc3Nlcy8gZm9sZGVyIG9uIHRoZSBidWlsZAotY2xhc3NwYXRoIGFzIGEgbGlicmFyeSBmb2xkZXIgd2l0aCBjbGFzcyBmaWxlIGNvcHlpbmcgdHVybmVkIG9uLiBEb2luZwotc28gbWVhbnMgdGhhdCB0aGUgcHJlLWNvbXBpbGVkIGNsYXNzIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGFyZSBhdmFpbGFibGUKLXRvIGJ1aWxkIGFnYWluc3QsIGFuZCB3aWxsIGJlIHVzZWQgd2hlbmV2ZXIgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBzb3VyY2UKLWNvZGUgaW4gYSBzb3VyY2UgZm9sZGVyLiA8L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkJ5IHR1cm5pbmcgY2xhc3MKLWZpbGUgY29weWluZyBvbiBmb3IgdGhhdCBsaWJyYXJ5IGZvbGRlciAocHJvZ3JhbWF0aWNhbGx5IC0gdGhlcmUgaXMgbm8KLVVJKSwgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciBhcmUgYXV0b21hdGljYWxseSBjb25zb2xpZGF0ZWQKLXdpdGggdGhlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcy48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj5SZXNvdXJjZSBmaWxlcyBjYW4gYWx3YXlzIGJlIGtlcHQgaW4gdGhlIHNhbWUKLWZvbGRlciBhcyB0aGUgc291cmNlIGZpbGVzLiBXaGVuIHRoZSBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzIGRvIG5vdCBjb2luY2lkZSwKLXRoZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBjbGFzc3BhdGggY291bGQgaGF2ZSBjb3B5aW5nIHR1cm5lZCBvbiB0byBlbnN1cmUKLXRoYXQgcmVzb3VyY2UgZmlsZXMgd2VyZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBmb2xkZXIuIFdoZW4gdGhlIHNvdXJjZSBhbmQKLW91dHB1dCBmb2xkZXJzIGRvIGNvaW5jaWRlLCBmdXJ0aGVyIHJlc291cmNlIGZpbGUgY29uc29saWRhdGlvbiBpcyBub3QKLXJlcXVpcmVkIChvciBwb3NzaWJsZSkgYW5kIHRoZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBjbGFzc3BhdGggd291bGQgaGF2ZQotY29weWluZyB0dXJuZWQgb2ZmLiBUaGUgcmVzb3VyY2UgZmlsZXMgdGhhdCBub3JtYWxseSBsaXZlIGluIHRoZSBzb3VyY2UKLWZvbGRlciB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZm9sZGVyICh3aXRob3V0IGNvcHlpbmcpLjwvZm9udD4KLTxoMz4KLTxmb250IGNvbG9yPSIjMzM2NkZGIj5NaW5pbWl6aW5nIENsYXNzIEZpbGVzPC9mb250PjwvaDM+Ci08Zm9udCBjb2xvcj0iIzMzNjZGRiI+KFRoaXMgcHJvYmxlbSBpcyBub3QgcmVhbGx5IGFuIG91dHB1dCBmb2xkZXIgaXNzdWUuKTwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPldTQUQgaGFzIGEgc3BlY2lhbCBwcm9ibGVtLiBUaGV5IGhhdmUgY2xhc3MgZmlsZXMKLWluIGEgY2xhc3Nlcy8gZm9sZGVyIHdoaWNoIHRoZXkgb2J0YWluIGZyb20gdW56aXBwaW5nIGEgV0FSIGZpbGUuIFRoZXkKLWhhdmUgYSBmb2xkZXIgb2Ygc291cmNlIGNvZGU7IHNvbWUgb2YgdGhlIHNvdXJjZSBjb2RlIG1heSBiZSBicmFuZCBuZXc7Ci1zb21lIG9mIHRoZSBzb3VyY2UgY29kZSBtYXkgY29ycmVzcG9uZCB0byBjbGFzcyBmaWxlcyBpbiB0aGUgY2xhc3Nlcy8gZm9sZGVyLgotVGhleSBuZWVkIHRvIHBydW5lIGZyb20gdGhlIGNsYXNzZXMvIGRpcmVjdG9yeSB0aG9zZSBjbGFzcyBmaWxlcyBmb3Igd2hpY2gKLWNvcnJlc3BvbmRpbmcgc291cmNlIGlzIGF2YWlsYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBzYXZlIG9ubHkgdGhvc2UKLWNsYXNzIGZpbGVzIHdoaWNoIHRoZXkgYWN0dWFsbHkgbmVlZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5UaGUgaGVhcnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgaWRlbnRpZnlpbmcgdGhlCi1jbGFzcyBmaWxlcyB3aGljaCBjb3VsZCBoYXZlIGNvbWUgZnJvbSBhIGdpdmVuIHNvdXJjZSBmaWxlLiBBIHNvdXJjZSBmaWxlCi1jYW4gYmUgbGlnaHRseSBwYXJzZWQgdG8gb2J0YWluIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIHRvcC1sZXZlbAotdHlwZXMgZGVjbGFyZWQgd2l0aGluOyBlLmcuLCBhIHNvdXJjZSBmaWxlIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvby5qYXZhCi1taWdodCBjb250YWluIHR5cGVzIG5hbWVkIGNvbS5leGFtcGxlLmFjbWUuYXBwLkZvbyBhbmQgY29tLmV4YW1wbGUuYWNtZS5hcHAuRm9vSGVscGVyLgotU3VjaCB0eXBlIG5hbWVzIG1hcCBkaXJlY3RseSB0byBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGUgbmFtZSBwYXR0ZXJuczsKLWUuZy4sIGNvbS5leGFtcGxlLmFjbWUuYXBwLkZvb0hlbHBlciB3b3VsZCBjb21waWxlIHRvIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvb0hlbHBlci5jbGFzcwotYW5kIHBvc3NpYmx5IG90aGVyIGNsYXNzIGZpbGVzIG1hdGNoaW5nIGNvbS9leGFtcGxlL2FjbWUvYXBwL0Zvb0hlbHBlciQqLmNsYXNzLjwvZm9udD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+PC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMzMzY2RkYiPlRoaXMgYmFzaWMgb3BlcmF0aW9uIGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZQotZXhpc3RpbmcgSkRPTSBBUEkgKG9yIHRoZSBwcm9wb3NlZCBBU1QgQVBJKTogc2ltcGx5IG9wZW4gdGhlIGNvbXBpbGF0aW9uCi11bml0IGFuZCByZWFkIG9mZiB0aGUgbmFtZXMgZnJvbSB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBhbmQgYW5kIHRvcC1sZXZlbAotdHlwZSBkZWNsYXJhdGlvbnMuPC9mb250Pjxmb250IGNvbG9yPSIjMzM2NkZGIj48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+R2l2ZW4gdGhpcyBiYXNpYyBvcGVyYXRpb24sIGl0IGlzIHN0cmFpZ2h0Zm9yd2FyZAotdG8gd2FsayBhbnkgc2V0IG9mIHNvdXJjZSBmaWxlcyBhbmQgdXNlIGl0IHRvIHBydW5lIGEgZ2l2ZW4gc2V0IG9mIGNsYXNzCi1maWxlcy4gU291cmNlIGZpbGVzIGluIHNvbWUgZm9sZGVyIGluIHRoZSB3b3Jrc3BhY2UgY2FuIGJlIG1vbml0b3JlZCB3aXRoCi1hIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lci4gSXQgaXMgdHJpdmlhbCB0byBkZWxldGUgY29ycmVzcG9uZGluZyBjbGFzcwotZmlsZXMgaW5jcmVtZW50YWxseSBhcyBuZXcgc291cmNlIGZpbGVzIGFyZSBhZGRlZC48L2ZvbnQ+PGZvbnQgY29sb3I9IiMzMzY2RkYiPjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMzM2NkZGIj5Db25jbHVzaW9uOiBOZXcgQVBJIGlzIG5vdCByZXF1aXJlZC48L2ZvbnQ+Ci08aDI+Ci1Ob3RlcyBMZWZ0b3ZlciBmcm9tIEVhcmxpZXIgUHJvcG9zYWxzPC9oMj4KLVRoZSBmb2xsb3dpbmcgbm90ZXMgYXJlIHJldGFpbmVkIGFzIGJhY2tncm91bmQgbWF0ZXJpYWwuIFRoZXkgaW5jbHVkZSBzb21lCi1vZiB0aGUgb3RoZXIgYXBwcm9hY2hlcyB3ZSB0cmllZCwgYW5kIHByb2JsZW1zIHdlIHJhbiBpbnRvLgotPHA+VGhlIEphdmEgbW9kZWwgaGFzIDIgcHJpbWl0aXZlIGtpbmRzIG9mIGlucHV0czogSmF2YSBzb3VyY2UgZmlsZXMsIGFuZAotSmF2YSBsaWJyYXJ5IGNsYXNzIGZpbGVzLiBUaGUgSmF2YSBidWlsZGVyIHByb2R1Y2VzIG9uZSBwcmltYXJ5IG91dHB1dDoKLWdlbmVyYXRlZCBKYXZhIGNsYXNzIGZpbGVzLiBFYWNoIEphdmEgcHJvamVjdCBoYXMgYSBidWlsZCBjbGFzc3BhdGggbGlzdGluZwotd2hhdCBraW5kcyBvZiBpbnB1dHMgaXQgaGFzIGFuZCB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZCwgYW5kIGEgZGVzaWduYXRlZAotb3V0cHV0IGZvbGRlciB3aGVyZSBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgYXJlIHRvIGJlIHBsYWNlZC4gVGhlIHJ1bnRpbWUKLWNsYXNzcGF0aCBpcyBjb21wdXRlZCBmcm9tIHRoZSBidWlsZCBjbGFzc3BhdGggYnkgc3Vic3RpdHV0aW5nIHRoZSBvdXRwdXQKLWZvbGRlciBpbiBwbGFjZSBvZiB0aGUgc291cmNlIGZvbGRlcnMuCi08cD5KYXZhICJyZXNvdXJjZSIgZmlsZXMsIGRlZmluZWQgdG8gYmUgZmlsZXMgb3RoZXIgdGhhbiBKYXZhIHNvdXJjZXMgYW5kCi1jbGFzcyBmaWxlcywgYXJlIG9mIG5vIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8gdGhlIEphdmEgbW9kZWwgZm9yIGNvbXBpbGluZwotcHVycG9zZXMuIEhvd2V2ZXIsIHRoZXNlIHJlc291cmNlIGZpbGVzIGFyZSB2ZXJ5IGltcG9ydGFudCB0byB0aGUgdXNlciwKLWFuZCB0byB0aGUgcHJvZ3JhbSB3aGVuIGl0IHJ1bnMuIFJlc291cmNlIGZpbGVzIGFyZSByb3V0aW5lbHkgY28tbG9jYXRlZAotd2l0aCBsaWJyYXJ5IGNsYXNzIGZpbGVzLiBCdXQgaXQgaXMgYWxzbyBjb252ZW5pZW50IGZvciB0aGUgdXNlciBpZiByZXNvdXJjZQotZmlsZXMgY2FuIGJlIGVpdGhlciBjby1sb2NhdGVkIHdpdGggc291cmNlIGNvZGUsIG9yIHNlZ3JlZ2F0ZWQgaW4gYSBzZXBhcmF0ZQotZm9sZGVyLgotPHA+SWRlYWxseSwgdGhlIEphdmEgbW9kZWwgc2hvdWxkIG5vdCBpbnRyb2R1Y2UgY29uc3RyYWludHMgb24gd2hlcmUgaW5wdXRzCi1hbmQgb3V0cHV0cyBhcmUgbG9jYXRlZC4gVGhpcyB3b3VsZCBnaXZlIGNsaWVudHMgYW5kIHVzZXJzIG1heGltdW0gZmxleGliaWxpdHkKLXdpdGggd2hlcmUgdGhleSBsb2NhdGUgdGhlaXIgZmlsZXMuCi08cD5UaGUgcHJvcG9zYWwgaGVyZSBoYXMgNCBzZXBhcmF0ZSBwYXJ0cy4gVGFrZW4gaW4gY29uanVuY3Rpb24gdGhleSByZW1vdmUKLXRoZSBjdXJyZW50IGNvbnN0cmFpbnRzIHRoYXQgbWFrZSBpdCBkaWZmaWN1bHQgZm9yIHNvbWUgY2xpZW50cyB0byBwbGFjZQotdGhlaXIgZmlsZXMgd2hlcmUgdGhleSBuZWVkIHRvIGJlLgotPHVsPgotPGxpPgotPGEgaHJlZj0iI0phdmEgQnVpbGRlciBBdHRpdHVkZSBBZGp1c3RtZW50Ij5DaGFuZ2UgdGhlIEphdmEgYnVpbGRlcidzIGF0dGl0dWRlCi10b3dhcmRzIHRoZSBvdXRwdXQgZm9sZGVyLjwvYT48L2xpPgotCi08bGk+Ci08YSBocmVmPSIjQWxsb3dpbmcgRm9sZGVycyB0byBQbGF5IE11bHRpcGxlIFJvbGVzIj5BbGxvdyBmb2xkZXJzIHRvIHBsYXkKLW11bHRpcGxlIHJvbGVzIG9uIHRoZSBzYW1lIGJ1aWxkIGNsYXNzcGF0aC48L2E+PC9saT4KLQotPGxpPgotPGEgaHJlZj0iI0NvbXBsZXRlbHkgZWxpbWluYXRlIHJlc291cmNlIGZpbGUgY29weWluZyBiZWhhdmlvciI+Q29tcGxldGVseQotZWxpbWluYXRlIHRoZSByZXNvdXJjZSBjb3B5aW5nIGJlaGF2aW9yIG9mIGN1cnJlbnQgSmF2YSBidWlsZGVyLjwvYT48L2xpPgotCi08bGk+Ci08YSBocmVmPSIjTWluaW1pemUgdGhlIG9wcG9ydHVuaXR5IGZvciBvYnNvbGV0ZSBjbGFzcyBmaWxlcyB0byBoYXZlIGJhZCBlZmZlY3RzIj5NaW5pbWl6ZQotdGhlIG9wcG9ydHVuaXR5IGZvciBvYnNvbGV0ZSBjbGFzcyBmaWxlcyB0byBoYXZlIGJhZCBlZmZlY3RzLjwvYT48L2xpPgotPC91bD4KLVtSZXZpc2VkIHByb3Bvc2FsOiBSYXRoZXIgdGhhbiB3cml0ZSBhIGNvbXBsZXRlbHkgbmV3IHByb3Bvc2FsLCBJJ3ZlIGFkZGVkCi1hIG5vdGUgbGlrZSB0byB0aGUgZW5kIG9mIGVhY2ggc3Vic2VxdWVudCBzZWN0aW9uIGRlc2NyaWJpbmcgYSByZXZpc2VkCi1wcm9wb3NhbC5dCi08aDM+Ci08YSBOQU1FPSJKYXZhIEJ1aWxkZXIgQXR0aXR1ZGUgQWRqdXN0bWVudCI+PC9hPkphdmEgQnVpbGRlciBBdHRpdHVkZSBBZGp1c3RtZW50PC9oMz4KLVRvIGFwcHJlY2lhdGUgdGhlIGRpZmZpY3VsdGllcyBpbmhlcmVudCB3aXRoIHRoZSBKYXZhIGJ1aWxkZXIgc2hhcmluZyBpdHMKLW91dHB1dCBmb2xkZXIgd2l0aCBvdGhlciBmb2xrLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHdvcmtzcGFjZSBjb250YWluaW5nCi1hIEphdmEgcHJvamVjdC4gQXNzdW1lIHRoYXQgdGhpcyBwcm9qZWN0IGhhcyBub3QgYmVlbiBidWlsdCBpbiBxdWl0ZSBhCi13aGlsZSwgYW5kIHRoZSB1c2VyIGhhcyBiZWVuIG1hbnVhbGx5IGluc2VydGluZyBhbmQgZGVsZXRpbmcgY2xhc3MgZmlsZXMKLWluIHRoZSBwcm9qZWN0J3Mgb3V0cHV0IGZvbGRlci4KLTxwPkphdmEgcHJvamVjdCBwMS8KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhci5qYXZhCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvby5qYXZhCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguamF2YQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBiaW4vY29tL2V4YW1wbGUvIChvdXRwdXQgZm9sZGVyKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYXIuY2xhc3Mge1NvdXJjZUZpbGU9IkJhci5qYXZhIn0KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRm9vLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvbyQxLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludGVybmFsLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IE1haW4uY2xhc3Mge1NvdXJjZUZpbGU9Ik1haW4uamF2YSJ9Ci08cD5Gcm9tIHRoaXMgYXJyYW5nZW1lbnQgb2YgZmlsZXMgKGFuZCBsb29raW5nIGF0IHRoZSBTb3VyY2VGaWxlIGF0dHJpYnV0ZWQKLWVtYmVkZGVkIGluIGNsYXNzIGZpbGVzKSwgd2UgY2FuIGluZmVyIHRoYXQ6Ci08dWw+Ci08bGk+Ci1CYXIuY2xhc3MgY2FtZSBmcm9tIGNvbXBpbGluZyBhIHNvdXJjZSBmaWxlIG5hbWVkICJCYXIuamF2YSIuPC9saT4KLQotPGxpPgotRm9vLmNsYXNzLCBGb28kMS5jbGFzcywgYW5kIEludGVybmFsLmNsYXNzIGFsbCBjYW1lIGZyb20gY29tcGlsaW5nIGEgIkZvby5qYXZhIi4KLShBIHNpbmdsZSBzb3VyY2UgZmlsZSB3aWxsIGNvbXBpbGUgdG8gbXVsdGlwbGUgc2VwYXJhdGUgY2xhc3MgZmlsZXMgaWYKLWl0IGhhcyBuZXN0ZWQgY2xhc3NlcyBvciBzZWNvbmRhcnkgbm9uLXB1YmxpYyBjbGFzc2VzLik8L2xpPgotCi08bGk+Ci1UaGVyZSBhcmUgbm8gZXhpc3RpbmcgY2xhc3MgZmlsZXMgY29ycmVzcG9uZGluZyB0byAiUXV1eC5qYXZhIi48L2xpPgotCi08bGk+Ci1NYWluLmNsYXNzIGNhbWUgZnJvbSBjb21waWxpbmcgYSBzb3VyY2UgZmlsZSBuYW1lZCAiTWFpbi5qYXZhIiwgd2hpY2ggdGhlCi13b3Jrc3BhY2UgZG9lcyd0IGhhdmUuPC9saT4KLTwvdWw+Ci0KLTxoND4KLUphdmEgQnVpbGRlciAtIE9ic29sZXRlIENsYXNzIEZpbGUgRGVsZXRpb248L2g0PgotSWYgdGhlIHVzZXIgd2FzIHRvIHJlcXVlc3QgYSBmdWxsIGJ1aWxkIG9mIHRoaXMgcHJvamVjdCwgaG93IHdvdWxkIHRoZQotSmF2YSBidWlsZGVyIHByb2NlZWQ/IEJlZm9yZSBpdCBjb21waWxlIGFueSBzb3VyY2UgZmlsZXMsIGl0IGJlZ2lucyBieQotZGVsZXRpbmcgZXhpc3RpbmcgY2xhc3MgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIHNvdXJjZSBmaWxlcyBpdCBpcyBhYm91dAotdG8gcmVjb21waWxlLiBXaHk/IEJlY2F1c2Ugb2Jzb2xldGUgY2xhc3MgZmlsZXMgbGVmdCBhcm91bmQgKGEpIHdhc3RlIHN0b3JhZ2UKLWFuZCAoYikgd291bGQgYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUgd2hlcmUgdGhleSBjb3VsZCBjYXVzZSB0aGUgcHJvZ3JhbQotdG8gcnVuIGluY29ycmVjdGx5LgotPHA+SW4gdGhpcyBzaXR1YXRpb24sIHRoZSBKYXZhIGJ1aWxkZXIgZGVsZXRlcyB0aGUgY2xhc3MgZmlsZXMgY29ycmVzcG9uZGluZwotdG8gQmFyLmphdmEgKGkuZS4sIEJhci5jbGFzcyksIHRvIEZvby5qYXZhIChpLmUuLCBGb28uY2xhc3MsIEZvbyQxLmNsYXNzLAotYW5kIEludGVybmFsLmNsYXNzKSwgYW5kIHRvIFF1dXguamF2YSAobm9uZSwgaW4gdGhpcyBjYXNlKS4gVGhlIHJlbWFpbmluZwotY2xhc3MgZmlsZXMgKE1haW4uY2xhc3MpIG11c3QgYmUgcmV0YWluZWQgYmVjYXVzZSBpdCBpcyBpcnJlcGxhY2VhYmxlLgotPHA+VGhlIEphdmEgYnVpbGRlciB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgZGVsZXRpbmcgb2Jzb2xldGUgY2xhc3MgZmlsZXMKLWluIG9yZGVyIHRvIHN1cHBvcnQgYXV0b21hdGVkIGluY3JlbWVudGFsIHJlY29tcGlsYXRpb24gb2YgZW50aXJlIGZvbGRlcnMKLW9mIHNvdXJjZSBmaWxlcy4gTm90ZSB0aGF0IHN0YW5kYXJkIEphdmEgY29tcGlsZXJzIGxpa2UgamF2YWMgbmV2ZXIgZXZlcgotZGVsZXRlIGNsYXNzIGZpbGVzOyB0aGV5IHNpbXBseSB3cml0ZSAob3Igb3ZlcndyaXRlKSBjbGFzcyBmaWxlcyB0byB0aGUKLW91dHB1dCBmb2xkZXIgZm9yIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCB0aGV5IGFyZSBnaXZlbiB0byBjb21waWxlLiBTdGFuZGFyZAotSmF2YSBjb21waWxlcnMgZG8gbm90IHN1cHBvcnQgaW5jcmVtZW50YWwgcmVjb21waWxhdGlvbjogdGhlIHVzZXIgaXMgcmVzcG9uc2libGUKLWZvciBkZWxldGluZyBhbnkgb2Jzb2xldGUgY2xhc3MgZmlsZXMgdGhhdCB0aGV5IGJyaW5nIGFib3V0LgotPHA+SWYgdGhlIEphdmEgYnVpbGRlciBpcyBmcmVlIHRvIGFzc3VtZSB0aGF0IGFsbCBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0Ci1mb2xkZXIgYXJlIG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIHNvdXJjZSBmaWxlcywgdGhlbiBpdCBjYW4gc2ltcGx5IGRlbGV0ZQotYWxsIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGF0IHRoZSBzdGFydCBvZiBhIGZ1bGwgYnVpbGQuIElmIGl0Ci1jYW5ub3QgYXNzdW1lIHRoaXMsIHRoZSBidWlsZGVyIGlzIGZvcmNlZCB0byBsb29rIGF0IGNsYXNzIGZpbGVzIGluIHRoZQotb3V0cHV0IGZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBoYXMgc291cmNlIGNvZGUgZm9yIHRoZW0uIFRoaXMgaXMKLWNsZWFybHkgbW9yZSBleHBlbnNpdmUgdGhhdCBub3QgaGF2aW5nIHRvIGRvIHNvLiBCeSBkZWNsYXJpbmcgdGhhdCBpdCAib3ducyIKLXRoZSBvdXRwdXQgZm9sZGVyLCB0aGUgY3VycmVudCBidWlsZGVyIGlzIGFibGUgdG8gbWFrZXMgdGhpcyBzaW1wbGlmeWluZwotYXNzdW1wdGlvbi4gQWxsb3dpbmcgdXNlcnMgYW5kIGNsaWVudHMgdG8gcGxhY2UgYWRkaXRpb25hbCBjbGFzcyBmaWxlcwotaW4gdGhlIG91dHB1dCBmb2xkZXIgcmVxdWlyZXMgdGhyb3dpbmcgb3V0IHRoaXMgYXNzdW1wdGlvbi4KLTxwPklmIHRoZSB1c2VyIG9yIGNsaWVudCBpcyBmcmVlIHRvIG1hbmlwdWxhdGUgY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dAotZm9sZGVyIHdpdGhvdXQgdGhlIEphdmEgYnVpbGRlcidzIGludm9sdmVtZW50LCB0aGVuIHRoZSBidWlsZGVyIGNhbm5vdAotcGVyZm9ybSBmdWxsIG9yIGluY3JlbWVudGFsIGJ1aWxkcyB3aXRob3V0IGxvb2tpbmcgYXQgYW5kIGRlbGV0aW5nIHRoZQotb2Jzb2xldGUgY2xhc3MgZmlsZXMgZnJvbSB0aGUgb3V0cHV0IGZvbGRlciBjb3JyZXNwb25kaW5nIHRvIHNvdXJjZSBmaWxlcwotYmVpbmcgY29tcGlsaW5nLgotPHA+VW5kZXIgdGhlIHByb3Bvc2VkIGNoYW5nZSwgdGhlIEphdmEgYnVpbGRlciB3b3VsZCBuZWVkIHRvIGxvb2sgYXQgdGhlCi1jbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGQgZGVsZXRlCi10aGVtLiA8aT5UaGUgb25seSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0aGF0IHRoZSBKYXZhIGJ1aWxkZXIgd291bGQKLWJlIGVudGl0bGVkIHRvIG92ZXJ3cml0ZSBvciBkZWxldGUgYXJlIGNsYXNzIGZpbGVzIHdoaWNoIHRoZSBKYXZhIGJ1aWxkZXIKLXdvdWxkIHJlYXNvbmFibHkgZ2VuZXJhdGUsIG9yIGRpZCBnZW5lcmF0ZSwgd2hpbGUgY29tcGlsaW5nIHRoYXQgcHJvamVjdC48L2k+Ci08dWw+Ci08bGk+Ci1UaGUgSmF2YSBidWlsZGVyIGlzIGVudGl0bGVkIHRvIG92ZXJ3cml0ZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlcgotdGhhdCBjb3JyZXNwb25kIHRvIGN1cnJlbnQgc291cmNlIGZpbGVzLiBBbnkgY2xhc3MgZmlsZSBhdCBzdWNoIGEgcGF0aAotaXMgdGhlIEphdmEgYnVpbGRlcidzLiBFdmVuIHdoZW4gdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgY2xhc3MgZmlsZQotY2FtZSBmcm9tIGVsc2V3aGVyZSwgdGhlIGJ1aWxkZXIgaXMgYWx3YXlzIGVudGl0bGVkIHRvIGRlbGV0ZSB0aGVtIG9yIG92ZXJ3cml0ZQotdGhlbSB3aXRoIGl0cyBjb250ZW50cy48L2xpPgotCi08bGk+Ci1UaGUgb25seSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciB0aGF0IHRoZSBKYXZhIG1vZGVsL2J1aWxkZXIgd291bGQgYmUKLWVudGl0bGVkIHRvIGRlbGV0ZSBvdXRyaWdodCBhcmUgb25lcyB0aGF0IGhhZCBiZWVuIGdlbmVyYXRlZCBieSB0aGUgSmF2YQotYnVpbGRlciB3aGVuIGNvbXBpbGluZyB0aGlzIHByb2plY3QgYnV0IHdoaWNoIG5vIGxvbmdlciBjb3JyZXNwb25kIHRvIGEKLWN1cnJlbnQgc291cmNlIGZpbGUuIFRoaXMgcGVybWl0cyB0aGUgSmF2YSBidWlsZGVyIHRvIGNsZWFuIHVwIG9ic29sZXRlCi1jbGFzcyBmaWxlcyB0aGF0IGl0IGtub3dzIGl0IGdlbmVyYXRlZCwgb3Igd291bGQgaGF2ZSBnZW5lcmF0ZWQsIG9uIGFuCi1lYXJsaWVyIGJ1aWxkLiBJdCBkb2VzIG5vdCBoYXZlIHRoZSByaWdodCB0byBkZWxldGUgb3RoZXIgY2xhc3MgZmlsZXMsCi1ldmVuIG9uZXMgd2hpY2ggZG8gbm90IGNvcnJlc3BvbmQgdG8gYSBjdXJyZW50IHNvdXJjZSBmaWxlLiAoT3RoZXJ3aXNlCi10aGUgSmF2YSBidWlsZGVyIGNvdWxkIGp1c3RpZnkgZGVsZXRpbmcgYW55IGNsYXNzIGZpbGUgdGhhdCBpdCBkb2VzIG5vdAotaGF2ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmb3IuKSBFdmVuIGZvciBhIGZ1bGwgYnVpbGQsIHRoZSBKYXZhIGJ1aWxkZXIKLWlzIG5vdCBhbGxvd2VkIHRvIHNjcnViIGFsbCBjbGFzcyBmaWxlcyBmcm9tIHRoZSBvdXRwdXQgZm9sZGVyICh1bmxlc3MKLWl0IGhhcHBlbnMgdG8ga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIG9ubHkgY2xhc3MgZmlsZXMgaW4gdGhlcmUgb25lcyBpdAotZ2VuZXJhdGVkKS48L2xpPgotCi08bGk+Ci1UaGUgc291cmNlIGZpbGUgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlIG9mIGNsYXNzIGZpbGVzIHRoYXQgaXMgbm90IGdlbmVyYXRlZAotd2hlbiBkZWJ1ZyBpbmZvIGlzIHN1cHByZXNzZWQgKGphdmFjIC1nOm5vbmUpLiBDbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0Ci1mb2xkZXIgd2l0aG91dCB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgdGhlcmUgd2FzCi1ubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlLiBUaGlzIG1lYW5zIHRoZXkgbmV2ZXIgZ2V0IGRlbGV0ZWQgb3V0cmlnaHQsCi1hbHRob3VnaCB0aGV5IG1heSBzdGlsbCBiZSBvdmVyd3JpdHRlbiBhcyByZXF1aXJlZC48L2xpPgotCi08bGk+Ci1Ob3RlOiBjaGFuZ2luZyBhIHByb2plY3QgdG8gZ2l2ZSBpdCBhIGRpZmZlcmVudCBvdXRwdXQgZm9sZGVyIHNob3VsZCBhYnNvbHZlCi10aGUgSmF2YSBidWlsZGVyIG9mIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIGluIHRoZQotZm9ybWVyIG91dHB1dCBmb2xkZXIuIFRoaXMgbWVhbnMgdGhlIEphdmEgYnVpbGRlciBkb2VzIG5vdCBuZWVkIHRvIHBlcmZvcm0KLWNsZWFudXAgb3IgdHJhY2sgYW55dGhpbmcgb3V0c2lkZSB0aGUgY3VycmVudCBvdXRwdXQgZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLU5vdGU6IGFkZGluZyBhIHNvdXJjZSBlbnRyeSB0byB0aGUgYnVpbGQgY2xhc3NwYXRoIGNhdXNlcyBhIGJ1bmNoIG9mIG5ldwotc291cmNlIGZpbGVzIHRvIGVudGVyIHRoZSBmcmFtZS4gU29tZSBvZiB0aGUgZXhpc3RpbmcgY2xhc3MgZmlsZXMgaW4gdGhlCi1vdXRwdXQgZm9sZGVyIG1pZ2h0IG5vdyBtYXAgdG8gdGhlc2Ugc291cmNlIGZpbGVzLCBwb3NzaWJseSBpbiBwcmVmZXJlbmNlCi10byB3aGVyZSB0aGV5IG1hcHBlZCBiZWZvcmUuIFJlbW92aW5nIGEgc291cmNlIGVudHJ5IGZyb20gdGhlIGJ1aWxkIGNsYXNzcGF0aAotY2F1c2VzIGEgYnVuY2ggb2Ygc291cmNlIGZpbGVzIHRvIGxlYXZlIHRoZSBwaWN0dXJlLiBTb21lIG9mIHRoZSBleGlzdGluZwotY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgbWlnaHQgbm93IG1hcCB0byBvdGhlciBzb3VyY2UgZmlsZXMsIG9yCi1ub3QgbWFwIHRvIGFueSBzb3VyZSBmaWxlIGF0IGFsbC4gW1dlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgb2Jzb2xldGUgY2xhc3MKLWZpbGVzIG5lZWQgdG8gYmUgdHJhY2tlZCBhY3Jvc3MgdGhlIGFkZGl0aW9uYWwgYW5kL29yIHJlbW92YWwgb2Ygc291cmNlCi1lbnRyaWVzIGZyb20gdGhlIGJ1aWxkIGNsYXNzcGF0aC5dPC9saT4KLTwvdWw+Ci1UaGlzIGNoYW5nZSBpcyBub3QgYSBicmVha2luZyBBUEkgY2hhbmdlLiBUaGUgb2xkIHNwZWMgc2FpZCB0aGF0IHRoZSBKYXZhCi1tb2RlbC9idWlsZGVyIG93bmVkIHRoZSBvdXRwdXQgZm9sZGVyLCBidXQgZGlkbid0IGZ1cnRoZXIgc3BlY2lmeSB3aGF0Ci1hbGwgdGhhdCBlbnRhaWxlZC4gVGhlIG5ldyBzcGVjIHdpbGwgbW9kaWZ5IHRoaXMgcG9zaXRpb24gdG8gYWxsb3cgY2xpZW50cwotdG8gc3RvcmUgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXI7IGl0IHdpbGwgcHJvbWlzZSB0aGF0IHRoZXNlIGZpbGVzIGFyZQotcGVyZmVjdGx5IHNhZmUgdW5sZXNzIHRoZXkgYXJlIGluIHRoZSBKYXZhIGJ1aWxkZXIncyBkaXJlY3QgbGluZSBvZiBmaXJlLgotPGg0PgotSmF2YSBNb2RlbCAtIE9ic29sZXRlIENsYXNzIEZpbGUgRGVsZXRpb248L2g0PgotVGhlcmUgaXMgYW5vdGhlciBmYWNldCBvZiB0aGUgb2Jzb2xldGUgY2xhc3MgZmlsZSBwcm9ibGVtIHRoYXQgdGhlIEphdmEKLWJ1aWxkZXIgaXMgbm90IGluIGEgcG9zaXRpb24gdG8gaGVscCB3aXRoLgotPHA+SWYgdGhlIHNvdXJjZSBmaWxlIEZvby5qYXZhIHdlcmUgdG8gYmUgZGVsZXRlZCwgaXRzIHRocmVlIGNsYXNzIGZpbGVzCi1iZWNvbWUgb2Jzb2xldGUgYW5kIG5lZWQgdG8gYmUgZGVsZXRlZCA8aT5pbW1lZGlhdGVseTwvaT4uIFdoeSBpbW1lZGlhdGVseT8KLUNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiB0aGUgY2xhc3MgZmlsZXMgYXJlIG5vdCBkZWxldGVkIGltbWVkaWF0ZWx5LiBJZgotdGhlIHVzZXIgcmVxdWVzdHMgYSBmdWxsIGJ1aWxkLCB0aGUgSmF2YSBidWlsZGVyIGlzIHByZXNlbnRlZCB3aXRoIHRoZQotZm9sbG93aW5nIHdvcmtzcGFjZToKLTxwPkphdmEgcHJvamVjdCBwMS8KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhci5qYXZhCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguamF2YQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBiaW4vY29tL2V4YW1wbGUvIChvdXRwdXQgZm9sZGVyKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYXIuY2xhc3Mge1NvdXJjZUZpbGU9IkJhci5qYXZhIn0KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRm9vLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvbyQxLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludGVybmFsLmNsYXNzIHtTb3VyY2VGaWxlPSJGb28uamF2YSJ9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IE1haW4uY2xhc3Mge1NvdXJjZUZpbGU9Ik1haW4uamF2YSJ9Ci08cD5TaW5jZSBhIGZ1bGwgYnVpbGQgaXMgcmVxdWVzdGVkLCB0aGUgSmF2YSBidWlsZGVyIGlzIG5vdCBwYXNzZWQgYSByZXNvdXJjZQotZGVsdGEgdHJlZSBmb3IgdGhlIHByb2plY3QuIFRoaXMgbWVhbnMgdGhhdCB0aGUgSmF2YSBidWlsZGVyIGhhcyBubyB3YXkKLW9mIGtub3dpbmcgdGhhdCBGb28uamF2YSB3YXMganVzdCBkZWxldGVkLiBUaGUgSmF2YSBidWlsZGVyIGhhcyBubyBjaG9pY2UKLWJ1dCB0byByZXRhaW4gdGhlIHRocmVlIGNsYXNzIGZpbGVzIEZvby5jbGFzcywgRm9vJDEuY2xhc3MsIGFuZCBJbnRlcm5hbC5jbGFzcywKLWp1c3QgYXMgaXQgcmV0YWlucyBNYWluLmNsYXNzLiBUaGlzIHRvbyBpcyBhIGNvbnNlcXVlbmNlIG9mIGFsbG93aW5nIHRoZQotSmF2YSBidWlsZGVyIHRvIHNoYXJlIHRoZSBvdXRwdXQgZm9sZGVyIHdpdGggdGhlIHVzZXIncyBjbGFzcyBmaWxlcy4KLTxwPklmIHRoZSBvYnNvbGV0ZSBjbGFzcyBmaWxlcyBhcmUgbm90IGRlbGV0ZWQgaW4gcmVzcG9uc2UgdG8gdGhlIGRlbGV0aW9uCi1vZiBhIHNvdXJjZSBmaWxlLCB0aGVzZSBjbGFzcyBmaWxlcyB3aWxsIGxpbmdlciBhcm91bmQuIFRoZSBKYXZhIGJ1aWxkZXIKLXdpbGwgYmUgdW5hYmxlIHRvIGdldCByaWQgb2YgdGhlbS4KLTxwPlRoZSBwcm9wb3NhbCBpcyB0byBoYXZlIHRoZSBKYXZhIG1vZGVsIG1vbml0b3Igc291cmNlIGZpbGUgZGVsZXRpb25zCi1vbiBhbiBvbmdvaW5nIGJhc2lzIGFuZCBpZGVudGlmeSBhbmQgZGVsZXRlIGFueSBjb3JyZXNwb25kaW5nIG9ic29sZXRlCi1jbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlci4gVGhpcyBjbGVhbiB1cCBhY3Rpdml0eSBtdXN0IGhhbmRsZSB0aGUKLWNhc2Ugb2Ygc291cmNlIGZpbGVzIHRoYXQgZGlzYXBwZWFyIHdoaWxlIHRoZSBKYXZhIENvcmUgcGx1Zy1pbiBpcyBub3QKLWFjdGl2YXRlZCAodGhpcyBlbnRhaWxzIHJlZ2lzdGVyaW5nIGEgQ29yZSBzYXZlIHBhcnRpY2lwYW50KS4KLTxwPlNpbmNlIGRlbGV0aW5nIChpbmNsdWRpbmcgcmVuYW1pbmcgYW5kIG1vdmluZykgYSBzb3VyY2UgZmlsZSBpcyBhIHJlbGF0aXZlbHkKLXVuY29tbW9uIHRoaW5nIGZvciBhIGRldmVsb3BlciB0byBkbywgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZXQgaXQKLWRvZXMgbm90IGhhdmUgdG8gZG8gdGhpcyB2ZXJ5IG9mdGVuLiBXaGVuIGEgc291cmNlIGZpbGUgaW4gZGVsZXRlZCwgaXRzCi1wYWNrYWdlIG5hbWUgZ2l2ZXMgdXMgZXhhY3RseSB3aGljaCBzdWJmb2xkZXIgb2YgdGhlIG91dHB1dCBmb2xkZXIgbWlnaHQKLWNvbnRhaW4gY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyB0aGF0IG1pZ2h0IG5vdyBiZSBvYnNvbGV0ZS4gSW4gdGhlIHdvcnN0Ci1jYXNlLCB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBhY2Nlc3MgYWxsIGNsYXNzIGZpbGVzIGluIHRoYXQgc3ViZm9sZGVyCi10byBkZXRlcm1pbmUgd2hldGhlciBhbnkgb2YgdGhlbSBoYXZlIGJlY29tZSBvYnNvbGV0ZS4gSW4gY2FzZXMgd2hlcmUgdGhlcmUKLWlzIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlciBvbiB0aGUgYnVpbGRlciBjbGFzc3BhdGgsIGFuZCB0aGVyZSBpcyB0aGVyZWZvcmUKLXRoZSBwb3NzaWJpbGl0eSBvZiBvbmUgc291cmNlIGZpbGUgaGlkaW5nIGFub3RoZXIgYnkgdGhlIHNhbWUgbmFtZSwgaXQKLWlzIG5lY2Vzc2FyeSB0byBjb25zdWx0IHRoZSBidWlsZCBjbGFzc3BhdGggdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGV0ZWQKLXNvdXJjZSBmaWxlIHdhcyBleHBvc2VkIG9yIGJ1cmllZC4KLTxoND4KLUltcGxlbWVudGF0aW9uIFRyaWNrczwvaDQ+Ci1Tb21lIG9ic2VydmF0aW9ucyBhbmQgaW1wbGVtZW50YXRpb24gdHJpY2tzIHRoYXQgc2hvdWxkIGhlbHAgcmVkdWNlIHRoZQotc3BhY2UgYW5kIHRpbWUgaW1wYWN0IG9mIGRvaW5nIHRoaXMuCi08dWw+Ci08bGk+Ci1XaGVuIG9uZSBvciBtb3JlIHNvdXJjZSBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmb2xkZXIsCi10aGVpciBwb3NpdGlvbiB1bmRlciB0aGUgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBnaXZlcyB1cyB0aGUgcGFja2FnZQotbmFtZS4gVGhpcyBwYWNrYWdlIG5hbWUgdGVsbHMgdXMgZXhhY3RseSB3aGljaCBzdWJmb2xkZXIgb2YgdGhlIG91dHB1dAotZm9sZGVyIG1pZ2h0IGNvbnRhaW4gY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyB0aGF0IG1pZ2h0IG5vdyBiZSBvYnNvbGV0ZS4KLUluIHRoZSB3b3JzdCBjYXNlLCB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBhY2Nlc3MgYWxsIGNsYXNzIGZpbGVzCi1pbiB0aGF0IHN1YmZvbGRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhbnkgb2YgdGhlbSBoYXZlIGJlY29tZSBvYnNvbGV0ZS4KLVRoaXMgc2hvd3MgdGhhdCB5b3Ugb25seSBuZWVkIGluZm9ybWF0aW9uIGFib3V0IGEgc21hbGwgcG9ydGlvbiBvZiB0aGUKLW91dHB1dCBmb2xkZXIgaW4gb3JkZXIgdG8gcHJvY2VzcyBvbmUgb3IgbW9yZSBkZWxldGlvbnMgd2l0aGluIGEgc2luZ2xlCi1zb3VyY2UgZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLUEgc291cmNlIGZpbGUgbmFtZWQgRm9vLmphdmEgdHlwaWNhbGx5IGNvbXBpbGVzIHRvIGEgc2luZ2xlIGNsYXNzIGZpbGUKLW5hbWVkIEZvby5jbGFzcy4gVGhlcmUgbWlnaHQgYmUgbW9yZSBjbGFzcyBmaWxlcyAoZm9yIG5lc3RlZCBjbGFzc2VzIGFuZC9vcgotc2Vjb25kYXJ5IG5vbi1wdWJsaWMgdHlwZXMpOyBhbmQgdGhlcmUgbWlnaHQgYmUgbGVzcyAod2hlbiB0aGUgc291cmNlIGZpbGUKLWNvbnRhaW5zIG9ubHkgbm9uLXB1YmxpYyB0eXBlcyB3aXRoIG5hbWVzIG90aGVyIHRoYW4gIkZvbyIpLiBXaGVuIHJlY29yZGluZwotdGhlIGV4dHJhY3RlZCBzb3VyY2UgZmlsZSBuYW1lIGluZm9ybWF0aW9uLCBvbmx5IHRoZSBleGNlcHRpb25hbCBjYXNlcwotbmVlZCB0byBiZSByZXByZXNlbnRlZCBleHBsaWNpdGx5LiBGb3IgZXhhbXBsZSwgb25seSBGb28kMS5jbGFzcyAoZGVyaXZlZAotZnJvbSBGb28uamF2YSkgYW5kIEludGVybmFsLmNsYXNzIChkZXJpdmVkIGZyb20gRm9vLmphdmEpIGFyZSB1bnVzdWFsOwotQmFyLmNsYXNzLCBGb28uY2xhc3MsIGFuZCBNYWluLmNsYXNzIGFyZSBhbGwgZGVyaXZlZCBmcm9tIHNvdXJjZSBmaWxlcwotd2l0aCB0aGUgZXhwZWN0ZWQgbmFtZS4gVGhpcyBtZWFucyB5b3UgY2FuIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBleHRyYWN0ZWQKLWZyb20gY2xhc3MgZmlsZXMgbXVjaCBtb3JlIGNvbXBhY3RseSB0aGF0IGEgc2ltcGxlIGNsYXNzIGZpbGUgbmFtZSB0byBTb3VyY2VGaWxlCi1zdHJpbmcgbWFwcGluZy48L2xpPgotCi08bGk+Ci1UaGVyZSBpcyBvZnRlbiBvbmx5IG9uZSBzb3VyY2UgZm9sZGVyIG9uIHRoZSBidWlsZGVyIGNsYXNzcGF0aC4gSW4gdGhpcwotY2FzZSwgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgc291cmNlIGZvbGRlciBnZXQgY29tcGlsZWQ7IHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5Ci1vZiBvbmUgc291cmNlIGZpbGUgImhpZGluZyIgYW5vdGhlciBieSB0aGUgc2FtZSBuYW1lLiBUaGlzIG9ic2VydmF0aW9uCi1jYW4gYmUgdXNlZCB0byBhdm9pZCBjaGVja2luZyBmb3Igc291cmNlIGZpbGUgaGlkaW5nLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1XaGVuIGFsbCBlbHNlIGZhaWxzPC9oMz4KLUEgc3BlY2lhbCBjb25jZXJuIGlzIHRoYXQgdGhlIHVzZXIgbXVzdCBiZSBhYmxlIHRvIHJlY292ZXIgZnJvbSBjcmFzaGVzCi1vciBvdGhlciBwcm9ibGVtcyB0aGF0IHJlc3VsdCBpbiBvYnNvbGV0ZSBjbGFzcyBmaWxlcyBiZWluZyBsZWZ0IGJlaGluZAotaW4gdGhlIG91dHB1dCBmb2xkZXIuIEl0IGNhbiBiZSB2ZXJ5IGJhZCB3aGVuIHRoaXMga2luZCBvZiB0aGluZyBoYXBwZW5zCi0oYW5kIGl0IGRvZXMgaGFwcGVuLCBkZXNwaXRlIG91ciBiZXN0IGVmZm9ydHMpLCBhbmQgY2FuIHVuZGVyY3V0IHRoZSB1c2VyJ3MKLWNvbmZpZGVuY2UgaW4gdGhlIEphdmEgY29tcGlsZXIgYW5kIElERS4gSW4gYSBsYXJnZSBvdXRwdXQgZm9sZGVyIHRoYXQKLWNvbnRhaW5zIGltcG9ydGFudCB1c2VyIGZpbGVzLCB0aGUgdXNlciBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUgb3V0cHV0IGZvbGRlcgotYW5kIGRvIGEgZnVsbCBidWlsZC4gVGhlIHVzZXIgaGFzIG5vIGVhc3kgd2F5IHRvIGRpc3Rpbmd1aXNoIGNsYXNzIGZpbGVzCi13aXRoIGNvcnJlc3BvbmRpbmcgc291cmNlIGZyb20gb25lcyB3aXRob3V0LiBBIHNpbXBsZSB3YXkgdG8gYWRkcmVzcyB0aGlzCi1uZWVkIHdvdWxkIGJlIHRvIGhhdmUgYSBjb21tYW5kIChzb21ld2hlcmUgaW4gdGhlIFVJKSB0aGF0IHdvdWxkIGRlbGV0ZQotYWxsIGNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGZvciB3aGljaCBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUKLSgiRGVsZXRlIEdlbmVyYXRlZCBDbGFzcyBGaWxlcyIpLiBUaGlzIHdvdWxkIGF0IGxlYXN0IGdpdmUgdGhlIHVzZXIgc29tZQotaGVscCBpbiByZWNvdmVyaW5nIGZyb20gdGhlc2UgbWlub3IgZGlzYXN0ZXJzLgotPHA+W1JldmlzZWQgcHJvcG9zYWw6IFRoZSBKYXZhIGJ1aWxkZXIgcmVtZW1iZXJzIHRoZSBuYW1lcyBvZiB0aGUgY2xhc3MKLWZpbGVzIGl0IGhhcyBnZW5lcmF0ZWQuIE9uIGZ1bGwgYnVpbGRzLCBpdCBjbGVhbnMgb3V0IGFsbCBjbGFzcyBmaWxlcyB0aGF0Ci1pdCBoYXMgb24gcmVjb3JkIGFzIGhhdmluZyBnZW5lcmF0ZWQ7IGFsbCBvdGhlciBjbGFzcyBmaWxlcyBhcmUgbGVmdCBpbgotcGxhY2UuIE9uIGluY3JlbWVudGFsIGJ1aWxkcywgaXQgc2VsZWN0aXZlbHkgY2xlYW5zIG91dCB0aGUgY2xhc3MgZmlsZXMKLXRoYXQgaXQgaGFzIG9uIHJlY29yZCBhcyBoYXZpbmcgZ2VuZXJhdGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvdXJjZSBmaWxlcwotdGhhdCBpdCBpcyBnb2luZyB0byByZWNvbXBpbGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbW9uaXRvciBzb3VyY2UgZmlsZQotZGVsZXRpb25zOiBjb3JyZXNwb25kaW5nIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyB3aWxsIGJlIGRlbGV0ZWQgb24gdGhlIG5leHQKLWZ1bGwgYnVpbGQgKGJlY2F1c2UgaXQgbnVrZXMgdGhlbSBhbGwpIG9yIG5leHQgaW5jcmVtZW50YWwgYnVpbGQgKGJlY2F1c2UKLWl0IHNlZXMgdGhlIHNvdXJjZSBmaWxlIGRlbGV0aW9uIGluIHRoZSBkZWx0YSkuIFRoZSBKYXZhIGJ1aWxkZXIgbmV2ZXIKLWxvb2tzIGF0IGNsYXNzIGZpbGVzIGZvciB0aGVpciBTb3VyY2VGaWxlIGF0dHJpYnV0ZXMuIEEgZnVsbCBidWlsZCBhbHdheXMKLWRlbGV0ZXMgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gYSBzcGVjaWFsIFVJIGFjdGlvbi5dCi08aDM+Ci08YSBOQU1FPSJBbGxvd2luZyBGb2xkZXJzIHRvIFBsYXkgTXVsdGlwbGUgUm9sZXMiPjwvYT5BbGxvd2luZyBGb2xkZXJzCi10byBQbGF5IE11bHRpcGxlIFJvbGVzPC9oMz4KLVRoZSBwcm9wb3NlZCBjaGFuZ2UgaXMgdG8gY29uc2lzdGVudGx5IGFsbG93IHRoZSBzYW1lIGZvbGRlciB0byBiZSB1c2VkCi1pbiBtdWx0aXBsZSB3YXlzIG9uIHRoZSBzYW1lIGJ1aWxkIGNsYXNzcGF0aC4KLTx1bD4KLTxsaT4KLUFzIHNvdXJjZSBmb2xkZXIgYW5kIGFzIG91dHB1dCBmb2xkZXIuPC9saT4KLQotPHVsPgotPGxpPgotTi5CLiBUaGlzIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgKGUuZy4sIHdoZW4gZm9sZGVyIGlzIHRoZSBwcm9qZWN0IHJvb3QpLjwvbGk+Ci0KLTxsaT4KLUFsbG93cyBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgdG8gYmUgY28tbG9jYXRlZCB3aXRoIEphdmEgc291cmNlIGZpbGVzLjwvbGk+Ci0KLTxsaT4KLVNpbmNlIG91dHB1dCBmb2xkZXIgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBvbiBydW50aW1lIGNsYXNzcGF0aCwgdGhpcwotYXJyYW5nZW1lbnQgd291bGQgYXV0b21hdGljYWxseSBtYWtlIGFueSBjbGFzcyBmaWxlcyBvciByZXNvdXJjZSBmaWxlcwotYXZhaWxhYmxlIGF0IHJ1bnRpbWUuPC9saT4KLQotPHVsPgotPGxpPgotSG93ZXZlciwgdGhlc2UgY2xhc3MgZmlsZXMgd291bGQgbm90IGJlIHNlZW4gYXQgY29tcGlsZSB0aW1lIGxpYnJhcnkgZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLVJlY29tbWVuZGF0aW9uOiB3aGVuIGNsYXNzIGZpbGVzIG9yIHJlc291cmNlcyBhcmUgcHJlc2VudCBpbiBhIGZvbGRlciwKLXRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBsaWJyYXJ5IGZvbGRlciBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIGZvcgotaXQuPC9saT4KLTwvdWw+Ci08L3VsPgotCi08bGk+Ci1BcyBzb3VyY2UgZm9sZGVyIGFuZCBhcyBsaWJyYXJ5IGZvbGRlci48L2xpPgotCi08dWw+Ci08bGk+Ci1OLkIuIFRoaXMgaXMgY3VycmVudGx5IGRpc2FsbG93ZWQuPC9saT4KLQotPGxpPgotQWxsb3dzIGxpYnJhcnkgY2xhc3MgZmlsZXMgdG8gYmUgY28tbG9jYXRlZCB3aXRoIEphdmEgc291cmNlIGZpbGVzLjwvbGk+Ci0KLTxsaT4KLUFsbG93cyByZXNvdXJjZSBmaWxlcyB0byBiZSBjby1sb2NhdGVkIHdpdGggSmF2YSBzb3VyY2UgZmlsZXMuPC9saT4KLQotPGxpPgotSW4gdmlydHVlIG9mIGJlaW5nIGEgbGlicmFyeSBlbnRyeSBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB0aGUgZm9sZGVyIGlzCi11c2VkIGF0IGNvbXBpbGUgdGltZSBmb3IgbGlicmFyeSBjbGFzcyBmaWxlcyBhbmQgaXMgaW5jbHVkZWQgb24gdGhlIHJ1bnRpbWUKLWNsYXNzcGF0aC48L2xpPgotPC91bD4KLQotPGxpPgotQXMgbGlicmFyeSBmb2xkZXIgYW5kIGFzIG91dHB1dCBmb2xkZXIuPC9saT4KLQotPHVsPgotPGxpPgotTi5CLiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhbGxvd2VkLjwvbGk+Ci0KLTxsaT4KLUFsbG93cyBsaWJyYXJ5IGNsYXNzIGZpbGVzIHRvIGJlIGNvLWxvY2F0ZWQgd2l0aCBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMuPC9saT4KLQotPGxpPgotQWxsb3dzIHJlc291cmNlIGZpbGVzIHRvIGJlIGNvLWxvY2F0ZWQgd2l0aCBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMuPC9saT4KLQotPGxpPgotUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSB3aGVuIGZvcm1pbmcgdGhlIHJ1bnRpbWUgY2xhc3MgcGF0aC48L2xpPgotCi08bGk+Ci1Ob3RlIHRoYXQgdGhlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcyBpbiB0aGlzIGxpYnJhcnkgZm9sZGVyIGFyZSBpZ25vcmVkCi1ieSB0aGUgYnVpbGRlciBiZWNhdXNlIGl0IGhhcyBzb3VyY2UgZm9yIGFsbCB0aGVzZSBieSBkZWZpbml0aW9uLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1BcyBzb3VyY2UgZm9sZGVyIGFuZCBhcyBvdXRwdXQgZm9sZGVyIGFuZCBhcyBsaWJyYXJ5IGZvbGRlci48L2xpPgotCi08dWw+Ci08bGk+Ci1UaGlzIGlzIGp1c3QgYSBjb21iaW5hdGlvbiBvZiBhbGwgb2YgYWJvdmUuPC9saT4KLQotPGxpPgotQWxsb3dzIGxpYnJhcnkgY2xhc3MgZmlsZXMsIGdlbmVyYXRlZCBjbGFzcyBmaWxlcywgYW5kIHJlc291cmNlIGZpbGVzIHRvCi1iZSBjby1sb2NhdGVkIHdpdGggSmF2YSBzb3VyY2UgZmlsZXMuPC9saT4KLQotPGxpPgotU2ltcGxlICJvbmUgZm9sZGVyIEphdmEgZGV2ZWxvcG1lbnQiIHNldHVwIGZvciBzb21lb25lIHdpdGggbGlicmFyeSBjbGFzcwotZmlsZXMgYW5kIHBvc3NpYmx5IHJlc291cmNlcy48L2xpPgotPC91bD4KLTwvdWw+Ci1UaGlzIGNoYW5nZSBpcyBub3QgYSBicmVha2luZyBjaGFuZ2U7IGl0IHdvdWxkIHNpbXBseSBhbGxvdyBzb21lIGNsYXNzcGF0aAotY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc2FsbG93ZWQgdG8gYmUgY29uc2lkZXJlZCBsZWdpdGltYXRlLgotVGhlIEFQSSB3b3VsZCBub3QgbmVlZCB0byBjaGFuZ2UuCi08cD5bUmV2aXNlZCBwcm9wb3NhbDogTWFueSBwYXJ0cyBvZiB0aGUgSmF2YSBtb2RlbCBhc3N1bWUgdGhhdCBsaWJyYXJ5Ci1mb2xkZXJzIGFyZSByZWxhdGl2ZWx5IHF1aWV0LiBBbGxvdyBhIGxpYnJhcnkgZm9sZGVyIHRvIGNvaW5jaWRlIHdpdGggdGhlCi1vdXRwdXQgZm9sZGVyIHdvdWxkIGludmFsaWRhdGUgdGhpcyBhc3N1bXB0aW9uLCB3aGljaCB3b3VsZCB0ZW5kIHRvIGRlZ3JhZGUKLXBlcmZvcm1hbmNlLiBGb3IgaW5zdGFuY2UsIHRoZSBpbmRleGVyIGluZGV4ZXMgbGlicmFyaWVzIGFuZCBzb3VyY2UgZm9sZGVycywKLWJ1dCBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlIG91dHB1dCBmb2xkZXIuIElmIHRoZSBvdXRwdXQgZm9sZGVyIHdhcyBhbHNvCi1hIGxpYnJhcnksIGl0IHdvdWxkIHJlcGVhdGVkbHkgZXh0cmFjdCBpbmRleGVzIGZvciBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQKLWJ5IHRoZSBidWlsZGVyLgotPHA+PGk+Ti5CLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9yaWdpbmFsIHNjZW5hcmlvIG9mIGxpYnJhcnkgY2xhc3MgZmlsZXMKLWluIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGNhbm5vdCBiZSBkb25lIHRoaXMgd2F5LiBJdCB3aWxsIG5lZWQgdG8gYmUgYWRkcmVzc2VkCi1pbiBzb21lIG90aGVyIHdheSAoZGlzY3Vzc2VkIGxhdGVyIG9uKS48L2k+Ci08cD48Zm9udCBjb2xvcj0iIzMzNjZGRiI+VGhlIGlkZW50aXR5IGNyaXRlcmlhIGZvciBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLWhhbmRsZXMgYXJlIGJhc2VkIG9uIHJlc291cmNlcy9wYXRocyBhbmQgZG8gbm90IHRha2Uga2luZCAoc291cmNlIHZzLiBiaW5hcnkpCi1pbnRvIGFjY291bnQuIFRoaXMgbWVhbnMgdGhhdCBhIHNvdXJjZSBmb2xkZXIgYW5kIGEgbGlicmFyeSBmb2xkZXIgYXQgdGhlCi1zYW1lIHBhdGggbWFwIHRvIHRoZSBzYW1lIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBoYW5kbGUhIFRodXMgYWxsb3dpbmcgYQotc291cmNlIGZvbGRlciB0byBjb2luY2lkZSB3aXRoIGEgbGlicmFyeSBmb2xkZXIgY2Fubm90IGJlIHN1cHBvcnRlZCB3aXRob3V0Ci1yZXZpc2luZyBKYXZhIGVsZW1lbnQgaWRlbnRpdHkgY3JpdGVyaWEgKHdoaWNoIGlzIGR1ZSBmb3IgYW4gb3ZlcmhhdWwsCi1idXQgdGhhdCdzIGEgZGlmZmVyZW50LCBhbmQgYmlnZ2VyLCB3b3JrIGl0ZW0pLjwvZm9udD4KLTxicj5dCi08aDM+Ci08YSBOQU1FPSJDb21wbGV0ZWx5IGVsaW1pbmF0ZSByZXNvdXJjZSBmaWxlIGNvcHlpbmcgYmVoYXZpb3IiPjwvYT5Db21wbGV0ZWx5Ci1lbGltaW5hdGUgcmVzb3VyY2UgZmlsZSBjb3B5aW5nIGJlaGF2aW9yPC9oMz4KLVRoZSBjdXJyZW50IEphdmEgYnVpbGRlciBjb3BpZXMgInJlc291cmNlIiBmaWxlcyBmcm9tIHNvdXJjZSBmb2xkZXJzIHRvCi10aGUgb3V0cHV0IGZvbGRlciAocHJvdmlkZWQgdGhhdCBzb3VyY2UgYW5kIG91dHB1dCBkbyBub3QgY29pbmNpZGUpLiBPbmNlCi1pbiB0aGUgb3V0cHV0IGZvbGRlciwgdGhlIHJlc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXQgcnVudGltZSBiZWNhdXNlCi10aGUgb3V0cHV0IGZvbGRlciBpcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgcnVudGltZSBjbGFzcyBwYXRoLgotPHA+VGhpcyBjb3B5aW5nIGlzIHByb2JsZW1hdGljOgotPHVsPgotPGxpPgotQ29weWluZyBjcmVhdGVzIGR1cGxpY2F0ZXMgb2YgcmVzb3VyY2UgZmlsZXMuPC9saT4KLQotPHVsPgotPGxpPgotVGFrZXMgdXAgZXh0cmEgZGlzayBzcGFjZS48L2xpPgotCi08bGk+Ci1Db3B5aW5nIHJlc291cmNlcyB0YWtlcyBleHRyYSB0aW1lLjwvbGk+Ci0KLTxsaT4KLUluY3JlYXNlcyByaXNrIG9mIHVzZXIgY29uZnVzaW9uIChtb2RpZnkgdGhlIGNvcHkpLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1Db3B5aW5nIGlzIG91dCBvZiBjaGFyYWN0ZXIgZm9yIEphdmEgYnVpbGRlci48L2xpPgotCi08dWw+Ci08bGk+Ci1KYXZhIGJ1aWxkZXIgc2hvdWxkIGNvbXBpbGUgSmF2YSBzb3VyY2UgZmlsZXMgdG8gYmluYXJ5IGNsYXNzIGZpbGVzLjwvbGk+Ci08L3VsPgotCi08bGk+Ci1Db3B5aW5nIGJlaGF2aW9yIGlzIHF1aXJreS48L2xpPgotCi08dWw+Ci08bGk+Ci1SZXNvdXJjZXMgYXJlIG5ldmVyIGNvcGllZCBmcm9tIGEgc291cmNlIGZvbGRlciB0aGF0IGNvaW5jaWRlcyB3aXRoIHRoZQotb3V0cHV0IGZvbGRlci48L2xpPgotCi08bGk+Ci1SZXNvdXJjZXMgYXJlIGNvcGllZCBmcm9tIGEgc291cmNlIGZvbGRlciB0aGF0IGRvZXMgbm90IGNvaW5jaWRlIHdpdGggdGhlCi1vdXRwdXQgZm9sZGVyLCBldmVuIGlmIHRoZSBvdXRwdXQgZm9sZGVyIGhhcHBlbnMgdG8gYmUgYW5vdGhlciBzb3VyY2UgZm9sZGVyLjwvbGk+Ci0KLTxsaT4KLU1vZGlmeWluZyB0aGUgY29weSBhbmQgYnVpbGRpbmcgY2F1c2VzIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQgKCEpOyBpdCBpcwotcmVwbGFjZWQgYnkgYSBmcmVzaCBjb3B5IG9uIHRoZSBuZXh0IGZ1bGwgYnVpbGQuPC9saT4KLQotPGxpPgotV2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCByZXNvdXJjZSBmaWxlcyB3aXRoIHNhbWUgbmFtZSwgaXQgaXMgaW1wb3NzaWJsZQotdG8gcmVsaWFibHkgY29udHJvbCB3aGljaCBvbmUgZW5kcyB1cCBpbiB0aGUgb3V0cHV0IGZvbGRlci48L2xpPgotCi08bGk+Ci1XaGVuIHRoZSBwcm9qZWN0IHNvdXJjZSBpcyB0aGUgcHJvamVjdCBpdHNlbGYsIGFuZCB0aGUgb3V0cHV0IGlzIGluIGEgZm9sZGVyCi11bmRlciB0aGUgcHJvamVjdCwgdGhlIGJ1aWxkZXIgY29waWVzIHRoZSAuY2xhc3NwYXRoIGZpbGUgaW50byB0aGUgb3V0cHV0Ci1mb2xkZXIgdG9vLjwvbGk+Ci08L3VsPgotPC91bD4KLVRoZSBwcm9wb3NhbCBpcyB0byBlbGltaW5hdGUgdGhpcyBjb3B5aW5nIGJlaGF2aW9yLiBUaGUgcHJvcGVyIHdheSB0byBoYW5kbGUKLXRoaXMgaXMgdG8gaW5jbHVkZSBhbiBhZGRpdGlvbmFsIGxpYnJhcnkgZW50cnkgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBmb3IKLWFueSBzb3VyY2UgZm9sZGVycyB0aGF0IGNvbnRhaW4gcmVzb3VyY2VzLiBTaW5jZSBsaWJyYXJ5IGVudHJpZXMgYXJlIGFsc28KLWluY2x1ZGVkIG9uIHRoZSBydW50aW1lIGNsYXNzcGF0aCwgdGhlIHJlc291cmNlIGZpbGVzIGNvbnRhaW5lZCB0aGVyZWluCi13aWxsIGJlIGF2YWlsYWJsZSBhdCBydW50aW1lLgotPHA+V2Ugd291bGQgYmVlZiB1cCB0aGUgQVBJIHNwZWNpZmljYXRpb24gdG8gZXhwbGFpbiBob3cgdGhlIGJ1aWxkIGNsYXNzcGF0aAotYW5kIHRoZSBydW50aW1lIGNsYXNzcGF0aCBhcmUgcmVsYXRlZCwgYW5kIHN1Z2dlc3RzIHRoYXQgb25lIGRlYWxzIHdpdGgKLXJlc291cmNlIGZpbGVzIGluIHNvdXJjZSBmb2xkZXJzIHVzaW5nIGxpYnJhcnkgZW50cmllcy4gVGhpcyB3b3VsZCBiZSBhCi1icmVha2luZyBjaGFuZ2UgZm9yIGNsaWVudHMgb3IgdXNlcnMgdGhhdCByZWx5IG9uIHRoZSBjdXJyZW50IHJlc291cmNlCi1maWxlIGNvcHlpbmcgYmVoYXZpb3IuCi08cD5UaGUgY2xpZW50cyB0aGF0IHdvdWxkIGJlIG1vc3QgYWZmZWN0ZWQgYXJlIG9uZXMgdGhhdCBjby1sb2NhdGUgdGhlaXIKLXJlc291cmNlIGZpbGVzIHdpdGggdGhlaXIgc291cmNlIGZpbGVzIGluIGEgZm9sZGVyIHNlcGFyYXRlIGZyb20gdGhlaXIKLW91dHB1dCBmb2xkZXIuIFRoaXMgaXMgYSBmYWlybHkgbGFyZ2UgYmFzZSBvZiBjdXN0b21lcnMgdGhhdCB3b3VsZCBuZWVkCi10byBhZGQgYW4gYWRkaXRpb25hbCBsaWJyYXJ5IGVudHJ5IGZvciB0aGVpciBzb3VyY2UgZm9sZGVyLgotPHA+SXQgd291bGQgYmUgc2ltcGxlIHRvIHdyaXRlIGEgcGx1Zy1pbiB0aGF0IGRldGVjdGVkIGFuZCBmaXhlZCB1cCB0aGUKLUphdmEgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBhcyByZXF1aXJlZC4gQnkgdGhlIHNhbWUgdG9rZW4sIHRoZSBzYW1lCi1tZWNoYW5pc20gY291bGQgYmUgYnVpbHQgaW4gdG8gdGhlIEphdmEgVUkuIElmIHRoZSB1c2VyIGludHJvZHVjZXMgYSByZXNvdXJjZQotZmlsZXMgaW50byBhIHNvdXJjZSBmb2xkZXIgdGhhdCBoYWQgbm9uZSBhbmQgdGhlcmUgaXMgbm8gbGlicmFyeSBlbnRyeQotZm9yIHRoYXQgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGgsIGFzayB0aGUgdXNlciB3aGV0aGVyIHRoZXkgaW50ZW5kCi10aGlzIHJlc291cmNlIGZpbGUgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCi08cD4oSlcgYmVsaWV2ZXMgdGhhdCBXU0FEIHdpbGwgYmUgYWJsZSB0byByb2xsIHdpdGggdGhpcyBwdW5jaC4pCi08cD5bUmV2aXNlZCBwcm9wb3NhbDogUmV0YWluIGNvcHlpbmcgZnJvbSBzb3VyY2UgdG8gb3V0cHV0IGZvbGRlciB3aGVyZQotbmVjZXNzYXJ5LgotPHVsPgotPGxpPgotU291cmNlIGZvbGRlciBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgZm9sZGVyLCBubyBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOgotY29weSByZXNvdXJjZXMgZnJvbSBzb3VyY2UgZm9sZGVyIHRvIG91dHB1dCBmb2xkZXIgKGN1cnJlbnQgYmVoYXZpb3IpLjwvbGk+Ci0KLTxsaT4KLVNvdXJjZSBmb2xkZXIgZGlmZmVyZW50IGZyb20gb3V0cHV0IGZvbGRlciwgYWRkaXRpb25hbCBzb3VyY2UgZm9sZGVyczoKLWNvcHkgcmVzb3VyY2VzIGZyb20gYWxsIHNvdXJjZSBmb2xkZXJzIHRvIG91dHB1dCBmb2xkZXIgaG9ub3JpbmcgYnVpbGQKLWNsYXNzcGF0aCBvcmRlcmluZyAoY3VycmVudCBiZWhhdmlvcikuPC9saT4KLQotPGxpPgotU291cmNlIGZvbGRlciBzYW1lIGFzIG91dHB1dCBmb2xkZXIsIGFuZCBubyBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOgotbm8gY29weWluZyAoY3VycmVudCBiZWhhdmlvcikuPC9saT4KLQotPGxpPgotU291cmNlIGZvbGRlciBzYW1lIGFzIG91dHB1dCBmb2xkZXIsIGFuZCBhZGRpdGlvbmFsIHNvdXJjZSBmb2xkZXJzOiBlcnJvcgotKG5ldyBiZWhhdmlvcikuPC9saT4KLTwvdWw+Ci1UaGlzIGVsaW1pbmF0ZXMgdGhlIHNjcmV3IGNhc2Ugd2hlcmUgcmVzb3VyY2VzIGdldCBjb3BpZWQgZnJvbSBvbmUgc291cmNlCi1mb2xkZXIgaW50byBhbm90aGVyIHNvdXJjZSBmb2xkZXIsIHBvc3NpYmx5IG92ZXJ3cml0aW5nIGNsaWVudCBkYXRhLl0KLTxoMz4KLTxhIE5BTUU9Ik1pbmltaXplIHRoZSBvcHBvcnR1bml0eSBmb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMgdG8gaGF2ZSBiYWQgZWZmZWN0cyI+PC9hPk1pbmltaXplCi10aGUgb3Bwb3J0dW5pdHkgZm9yIG9ic29sZXRlIGNsYXNzIGZpbGVzIHRvIGhhdmUgYmFkIGVmZmVjdHM8L2gzPgotVGhlIEphdmEgY29tcGlsZXIgc2hvdWxkIG1pbmltaXplIHRoZSBvcHBvcnR1bml0eSBmb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMKLXRvIGhhdmUgYmFkIGVmZmVjdHMuCi08cD5Db25zaWRlciB0aGUgZm9sbG93aW5nIHdvcmtzcGFjZToKLTxwPkphdmEgcHJvamVjdCBwMS8KLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc3JjL2NvbS9leGFtcGxlLyZuYnNwOyAoc291cmNlIGZvbGRlciBvbiBidWlsZCBjbGFzc3BhdGgpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMxLmphdmEge3BhY2thZ2UgY29tLmV4YW1wbGU7Ci1wdWJsaWMgY2xhc3MgQzEge319Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMyLmphdmEge3BhY2thZ2UgY29tLmV4YW1wbGU7Ci1wdWJsaWMgY2xhc3MgQzIgZXh0ZW5kcyBTZWNvbmRhcnkge30pCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYi9jb20vZXhhbXBsZS8gKGxpYnJhcnkgZm9sZGVyIG9uIGJ1aWxkIGNsYXNzcGF0aCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQzEuY2xhc3Mge2Zyb20gY29tcGlsaW5nCi1hbiBvbGQgdmVyc2lvbiBvZiBDMS5qYXZhCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoYXQgcmVhZAotcGFja2FnZSBjb20uZXhhbXBsZTsgcHVibGljIGNsYXNzIEMxIHt9OyBjbGFzcyBTZWNvbmRhcnkge319Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMyLmNsYXNzIHtmcm9tIGNvbXBpbGluZwotYW4gb2xkIGJ1dCB1bmNoYW5nZWQgdmVyc2lvbiBvZiBDMi5qYXZhfQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBTZWNvbmRhcnkuY2xhc3Mge2Zyb20gY29tcGlsaW5nCi1hbiBvbGQgYnV0IHVuY2hhbmdlZCB2ZXJzaW9uIG9mIEMyLmphdmF9Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFF1dXguY2xhc3Mge2Zyb20gY29tcGlsaW5nCi1RdXV4LmphdmF9Ci08cD5Bc3N1bWUgdGhlIHNvdXJjZSBmb2xkZXIgcHJlY2VkZXMgdGhlIGxpYnJhcnkgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGgKLShzb3VyY2VzIHNob3VsZCBhbHdheXMgcHJlY2VkZSBsaWJyYXJpZXMpLgotPHA+V2hlbiB0aGUgY29tcGlsZXIgaXMgY29tcGlsaW5nIGJvdGggQzEuamF2YSBhbmQgQzIuamF2YSwgaXQgc2hvdWxkIG5vdAotc2F0aXNmeSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBjb20uZXhhbXBsZS5TZWNvbmRhcnkgdXNpbmcgdGhlIGV4aXN0aW5nCi1TZWNvbmRhcnkuY2xhc3MgYmVjYXVzZSB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGVzIHNob3dzIHRoYXQgU2Vjb25kYXJ5LmNsYXNzCi1pcyBjbGVhcmx5IGFuIG91dHB1dCBmcm9tIGNvbXBpbGluZyBDMS5qYXZhLCBub3QgYW4gaW5wdXQuIEluIGdlbmVyYWwsCi10aGUgY29tcGlsZXIgc2hvdWxkIGlnbm9yZSBsaWJyYXJ5IGNsYXNzIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byBzb3VyY2UKLWZpbGVzIHdoaWNoIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZWNvbXBpbGVkLiAoSW4gdGhpcyBjYXNlLCBvbmx5Ci1RdXV4LmNsYXNzIGlzIGF2YWlsYWJsZSB0byBzYXRpc2Z5IHJlZmVyZW5jZXMuKSBUaGUgSmF2YSBidWlsZGVyIGRvZXMgbm90Ci1kbyB0aGlzLgotPHA+QXJndWFibHksIHRoZSBjdXJyZW50IGJlaGF2aW9yIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgYnVnLiAoamF2YWMgMS40Ci0oYmV0YSkgaGFzIHRoaXMgYnVnIHRvby4pIEZpeGluZyB0aGlzIGJ1ZyBzaG91bGQgbm90IGJlIGEgYnJlYWtpbmcgY2hhbmdlLgotPHA+V2hlbiB0aGUgU291cmNlRmlsZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQgaW4gYSBjbGFzcyBmaWxlLCB0aGVyZQotaXMgbm8gY2hvaWNlIGJ1dCB0byB1c2UgaXQuCi08cD5bUmV2aXNlZCBwcm9wb3NhbDogTWFpbnRhaW4gY3VycmVudCBiZWhhdmlvci5dCi08aDM+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+TGlicmFyeSBDb3B5aW5nIFByb3Bvc2FsPC9mb250PjwvaDM+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+VGhlIHByb3Bvc2FsIGlzIHRvIGFycmFuZ2UgdG8gY29weSBjbGFzcyBmaWxlcyBmcm9tCi1hIGNlcnRhaW4gbGlicmFyeSBmb2xkZXIgaW50byB0aGUgb3V0cHV0IGZvbGRlci4gVGhlIGxpYnJhcnkgZm9sZGVyIHdvdWxkCi1oYXZlIHRvIGJlIHJlcHJlc2VudGVkIGJ5IGEgbGlicmFyeSBjbGFzc3BhdGggZW50cnkgc28gdGhhdCB0aGUgY29tcGlsZXIKLWNhbiBmaW5kIGFueSBjbGFzcyBmaWxlcyBpdCBuZWVkcyB0byBjb21waWxlIHNvdXJjZSBmaWxlcy4gQ29weWluZyB0aGUKLWNsYXNzIGZpbGVzIHRvIHRoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIHVuaXRlIHRoZW0gd2l0aCB0aGUgY2xhc3MgZmlsZXMKLWdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuIFNpbmNlIHRoZXJlIG1heSBiZSBzb3VyY2UgY29kZSBpbiB0aGUgc291cmNlCi1mb2xkZXIgY29ycmVzcG9uZGluZyB0byBzb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBsaWJyYXJ5IGZvbGRlciwgdGhlCi1idWlsZGVyIHNob3VsZCBvbmx5IHVzZSBhIGNsYXNzIGZpbGUgd2hlbiBzb3VyY2UgaXMgYXZhaWxhYmxlLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5EZXNpcmVkIHNlbWFudGljczo8L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+UyAoc291cmNlIGZvbGRlcik8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkwgKGxpYnJhcnkgZm9sZGVyKTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+TyAob3V0cHV0IGZvbGRlcik8L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW52YXJpYW50OjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj54LmNsYXNzIGluIE8gPTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIHNvbWUgeS5qYXZhIGluIFMgZ2VuZXJhdGVzCi14LmNsYXNzIHRoZW48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB4LmNsYXNzCi1mcm9tIGNvbXBpbGluZyB4LmphdmEgaW4gUzwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGVsc2U8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZgoteC5jbGFzcyBpbiBMIHRoZW48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwoteC5jbGFzcyBpbiBMPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZWxzZTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1ub25lPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZW5kaWY8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBlbmRpZjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5GdWxsIGJ1aWxkcyBhY2hpZXZlIGludmFyaWFudC48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkluY3JlbWVudGFsIGJ1aWxkcyBtYWludGFpbiBpbnZhcmlhbnQuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkZ1bGwgYnVpbGQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgU2NydWIgYWxsIGNsYXNzIGZpbGVzIGZyb20KLU8uPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZSBhbGwgc291cmNlIGZpbGVzIGluCi1TIGludG8gY2xhc3MgZmlsZXMgaW4gTy48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBJbmZpbGwvY29weSBhbGwgY2xhc3MgZmlsZXMKLWZyb20gTCB0byBPIChubyBvdmVyd3JpdGluZykuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkluY3JlbWVudGFsIGJ1aWxkOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IChwaGFzZSAxKSBwcm9jZXNzIGFsbCBjaGFuZ2VzCi10byBMOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvcgotZGVsZXRlIG9yIGNoYW5nZSB4LmNsYXNzIGluIEw8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZgoteC5jbGFzcyBpbiBPIHdhcyBub3QgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVyIHRoZW4gc2NydWIgeC5jbGFzcyBmcm9tIE88L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKLWFkZCBvciBjaGFuZ2UgeC5jbGFzcyB0byBMPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXJlbWVtYmVyIHRvIGluZmlsbCB4LmNsYXNzPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDIpIHByb2Nlc3MgbmVnYXRpdmUKLWNoYW5nZXMgdG8gUzo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKLWRlbGV0ZSBvciBjaGFuZ2UgeS5qYXZhIGZyb20gUzwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1zY3J1YiBhbnkgY2xhc3MgZmlsZSB4LmNsYXNzIGZyb20gTyB0aGF0IHkuamF2YSBjb21waWxlZCBpbnRvPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLXJlbWVtYmVyIHRvIGluZmlsbCB4LmNsYXNzPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgKHBoYXNlIDMpIHByb2Nlc3MgcG9zaXRpdmUKLWNoYW5nZXMgdG8gUzo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IKLWFkZCBvciBjaGFuZ2UgeS5qYXZhIGZyb20gUzwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1jb21waWxlIHkuamF2YSBpbnRvIE88L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyAocGhhc2UgNCkgSW5maWxsL2NvcHkgaW5kaWNhdGVkCi1jbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5XZSB3aWxsIGxvb2sgYXQgd2F5cyB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGJlaGF2aW9yCi10aGF0IGRvIG5vdCBpbnZvbHZlIGNoYW5naW5nIHRoZSBKYXZhIGJ1aWxkZXIuIFRoaXMgd291bGQgbWVhbiB0aGF0IGEgY3VzdG9tZXIKLShzdWNoIGFzIFdTQUQpIHRoYXQgcmVxdWlyZXMgbGlicmFyeSBjb3B5aW5nIHdvdWxkIGJlIGFibGUgdG8gYWRkIGl0IHRoZW1zZWx2ZXM7Ci1vdGhlcndpc2UsIHdlIHdpbGwgbmVlZCB0byBjb21wbGljYXRlIHRoZSBKYXZhIGJ1aWxkZXIgKHdoaWNoIGlzIGNvbXBsZXgKLWVub3VnaCBhcyBpdCBpcykgYW5kIGludGVncmF0ZSB0aGUgbWVjaGFuaXNtIGludG8gSkRUIENvcmUuPC9mb250PgotPGg0PgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPkNvcHlpbmcgcHJlLWJ1aWxkZXI8L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5Db3VsZCB0aGUgY29weWluZyBvZiBjbGFzcyBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5Ci1mb2xkZXIgTCB0byB0aGUgb3V0cHV0IGZvbGRlciBPIGJlIGFjY29tcGxpc2hlZCBpbiBhIHNlcGFyYXRlIGluY3JlbWVudGFsCi1wcm9qZWN0IGJ1aWxkZXIgdGhhdCB3b3VsZCBydW4gPGk+YmVmb3JlPC9pPiB0aGUgSmF2YSBidWlsZGVyPzwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Bc3N1bWUgdGhlIEphdmEgYnVpbGRlciBtYW5hZ2VzIGl0cyBvd24gY2xhc3MKLWZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyIGFuZCBrbm93cyBub3RoaW5nIG9mIHRoZSBwcmUtYnVpbGRlci4gQ29udmVyc2VseSwKLWFzc3VtZSB0aGF0IHRoZSBwcmUtYnVpbGRlciBoYXMgbm8gYWNjZXNzIHRvIHRoZSBpbnNpZGVzIG9mIHRoZSBKYXZhIGJ1aWxkZXIuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlByZS1jb3B5aW5nIG9mIGNsYXNzIGZpbGVzIHRvIHRoZSBvdXRwdXQgZm9sZGVyCi1jYW5ub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc291cmNlIGZpbGUgZ2V0cyBkZWxldGVkIGFuZCBhIHByZS1leGlzdGluZwotY2xhc3MgZmlsZSBpbiB0aGUgbGlicmFyeSBmb2xkZXIgc2hvdWxkIG5vdyB0YWtlIGl0cyBwbGFjZS4gVGhlIEphdmEgYnVpbGRlciwKLXdoaWNoIHJ1bnMgbGFzdCwgZGVsZXRlcyB0aGUgY2xhc3MgZmlsZTsgdGhlIHByZS1idWlsZGVyIGhhcyBtaXNzZWQgaXRzCi1jaGFuY2UgYW5kIGRvZXMgbm90IGdldCBhbiBvcHBvcnR1bml0eSB0byBmaWxsIHRoYXQgaG9sZS4gV2hlbiB0aGlzIGhhcHBlbnMKLW9uIGEgZnVsbCBidWlsZCwgdGhlIGZ1bGwgYnVpbGQgZG9lcyBub3QgYWNoaWV2ZSB0aGUgaW52YXJpYW50LiBUaGlzIGlzCi11bmFjY2VwdGFibGUuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkhlcmUncyB0aGUgbmFzdHkgY2FzZTo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBTIChzb3VyY2UgZm9sZGVyKTogQmFyLmphdmEKLShidXQgcmVjZW50bHkgaGFzIEZvby5qYXZhIGFzIHdlbGwpPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgTCAobGlicmFyeSBmb2xkZXIpOiBGb28uY2xhc3M8L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+T24gYSBmdWxsIGJ1aWxkPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgUHJlLWJ1aWxkZXIgcnVucyBmaXJzdDo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBTY3J1YnMKLUZvby5jbGFzcyBhbmQgQmFyLmNsYXNzIGZyb20gTy48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBDb3BpZXMKLWluIEZvby5jbGFzcyBmcm9tIEwgdG8gTy48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgU2NydWJzCi1Gb28uY2xhc3MgZnJvbSBPIChnZW5lcmF0ZWQgYnkgSmF2YSBidWlsZGVyIGZyb20gRm9vLmphdmEgb24gbGFzdCBidWlsZCkuPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZQotQmFyLmphdmEgaW50byBCYXIuY2xhc3MgTyAoRm9vLmphdmEgaXMgbm8gbG9uZ2VyIGFyb3VuZCkuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRoZSBvdXRwdXQgZm9sZGVyIHNob3VsZCBjb250YWluIGEgY29weSBvZiBGb28uY2xhc3MKLWZyb20gTCBzaW5jZSB0aGVyZSBpcyBubyBlcXVpdmFsZW50IHNvdXJjZSBmaWxlIHRoYXQgY29tcGlsZXMgdG8gRm9vLmNsYXNzLgotSXQgZG9lc24ndC48L2ZvbnQ+Ci08aDQ+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29weWluZyBwb3N0LWJ1aWxkZXI8L2ZvbnQ+PC9oND4KLTxmb250IGNvbG9yPSIjMDAwMDAwIj5Db3VsZCB0aGUgY29weWluZyBvZiBjbGFzcyBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5Ci1mb2xkZXIgdG8gdGhlIG91dHB1dCBmb2xkZXIgYmUgYWNjb21wbGlzaGVkIGluIGEgc2VwYXJhdGUgaW5jcmVtZW50YWwgcHJvamVjdAotYnVpbGRlciB0aGF0IHdvdWxkIHJ1biA8aT5hZnRlcjwvaT4gdGhlIEphdmEgYnVpbGRlcj88L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+QWdhaW4sIGFzc3VtZSB0aGUgSmF2YSBidWlsZGVyIG1hbmFnZXMgaXRzIG93bgotY2xhc3MgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgYW5kIGtub3dzIG5vdGhpbmcgb2YgdGhlIHBvc3QtYnVpbGRlciwKLWFuZCBjb252ZXJzZWx5LjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Qb3N0LWNvcHlpbmcgb2YgY2xhc3MgZmlsZXMgdG8gdGhlIG91dHB1dCBmb2xkZXIKLShubyBvdmVyd3JpdGluZykgY2Fubm90IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBsaWJyYXJ5IGNsYXNzIGZpbGVzIGFyZSBjaGFuZ2VkCi1vciBkZWxldGVkIHNpbmNlIHRoZSBsYXN0IGJ1aWxkLCBiZWNhdXNlIHRoZSBwb3N0LWJ1aWxkZXIgaXMgbmV2ZXIgaW4gYQotcG9zaXRpb24gdG8gZGVsZXRlIG9yIG92ZXJ3cml0ZSBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciAodGhleQotbWlnaHQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgSmF2YSBidWlsZGVyKS4gT25jZSBsb3N0LCB0aGUgaW52YXJpYW50Ci1jYW5ub3QgYmUgcmVhY2hpZXZlZCBubyBtYXR0ZXIgaG93IG1hbnkgZnVsbCBidWlsZHMgeW91IGRvICh5b3UncmUgc3R1Y2sKLXdpdGggc3RhbGUgb3Igb2Jzb2xldGUgY2xhc3MgZmlsZXMpLiBUaGlzIGlzIHVuYWNjZXB0YWJsZS48L2ZvbnQ+Ci08aDQ+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29tYmluYXRpb24gb2YgcHJlLSBhbmQgcG9zdC1idWlsZGVyPC9mb250PjwvaDQ+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q291bGQgdGhlIGNvcHlpbmcgb2YgY2xhc3MgZmlsZXMgZnJvbSB0aGUgbGlicmFyeQotZm9sZGVyIHRvIHRoZSBvdXRwdXQgZm9sZGVyIGJlIGFjY29tcGxpc2hlZCBieSBhIHBhaXIgb2Ygc2VwYXJhdGUgaW5jcmVtZW50YWwKLXByb2plY3QgYnVpbGRlcnMgdGhhdCBydW4gb24gZWl0aGVyIHNpZGUgb2YgdGhlIEphdmEgYnVpbGRlcj88L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+QXNzdW1lIHRoZSBKYXZhIGJ1aWxkZXIgbWFuYWdlcyBpdHMgb3duIGNsYXNzCi1maWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBhbmQga25vd3Mgbm90aGluZyBvZiB0aGUgcHJlLWJ1aWxkZXIgYW5kIHBvc3QtYnVpbGRlciwKLWFuZCB0aGUgcHJlLSBhbmQgcG9zdC1idWlsZGVycyBoYXZlIG5vIGFjY2VzcyB0byB0aGUgaW5zaWRlcyBvZiB0aGUgSmF2YQotYnVpbGRlci48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+RnVsbCBidWlsZDo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFNjcnVicwotYWxsIGNsYXNzIGZpbGVzIGZyb20gTy48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgU2NydWJzCi1hbGwgY2xhc3MgZmlsZXMgZnJvbSBPIGdlbmVyYXRlZCBieSBKYXZhIGJ1aWxkZXIuPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZXMKLWFsbCBzb3VyY2UgZmlsZXMgaW50byBPLjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBvc3QtYnVpbGRlciBydW5zIHRoaXJkOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEluZmlsbC9jb3B5Ci1jbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmNyZW1lbnRhbCBidWlsZCB3aGVuIEwgY2hhbmdlczo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvcgotZGVsZXRlIG9yIGNoYW5nZSB4LmNsYXNzIGluIEw8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotRG9lcyBub3RoaW5nIChGQUlMcyBpZiBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlKTwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvcgotYWRkIHguY2xhc3MgdG8gTDwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci1JbmZpbGwvY29weSBGb28uY2xhc3MgZnJvbSBMIHRvIE8gKG5vIG92ZXJ3cml0aW5nKS48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgUmVjb21waWxlcwotY2xhc3NlcyB0aGF0IGRlcGVuZCBvbiBhZmZlY3RlZCBjbGFzcyBmaWxlcyBpbiBMLjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBvc3QtYnVpbGRlciBydW5zIHRoaXJkOjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEluZmlsbC9jb3B5Ci1jbGFzcyBmaWxlcyBmcm9tIEwgdG8gTyAobm8gb3ZlcndyaXRpbmcpLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmNyZW1lbnRhbCBidWlsZCAtIGNoYW5nZXMgdG8gc291cmNlIGZvbGRlcjo8L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBQcmUtYnVpbGRlciBydW5zIGZpcnN0OjwvZm9udD4KLTxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IERvZXMKLW5vdGhpbmcgc2luY2UgbGlicmFyeSBkaWQgbm90IGNoYW5nZS48L2ZvbnQ+Ci08YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPiZuYnNwOyZuYnNwOyZuYnNwOyBKYXZhIEJ1aWxkZXIgcnVucyBzZWNvbmQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQ29tcGlsZXMKLXNvdXJjZSBmaWxlcyBpbnRvIE8uPC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsgUG9zdC1idWlsZGVyIHJ1bnMgdGhpcmQ6PC9mb250PgotPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5maWxsL2NvcHkKLWNsYXNzIGZpbGVzIGZyb20gTCB0byBPIChubyBvdmVyd3JpdGluZykuPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkFuIGluY3JlbWVudGFsIGJ1aWxkIG1heSBmYWlsIGluIHRoZSBjYXNlIG9mIGEKLWxpYnJhcnkgY2xhc3MgZmlsZSBiZWluZyBjaGFuZ2VkIG9yIGRlbGV0ZWQsIGxlYWRpbmcgdG8gc3RhbGUgb3Igb2Jzb2xldGUKLWNsYXNzIGZpbGVzIGluIHRoZSBvdXRwdXQgZm9sZGVyLiBGb3J0dW5hdGVseSwgYSBmdWxsIGJ1aWxkIGFsd2F5cyBhY2hpZXZlcwotdGhlIGludmFyaWFudCwgYW5kIGNhbiBiZSB1c2VkIHRvIHJlcGFpciB0aGUgZGFtYWdlIGR1ZSB0byBjaGFuZ2VzIHRvIHRoZQotbGlicmFyeS48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U28gd2hpbGUgdGhlIGNvbWJpbmF0aW9uIG9mIHByZS0gYW5kIHBvc3QtYnVpbGRlcnMKLWlzIG5vdCBwZXJmZWN0LCBpdCBkb2VzIHdvcmsgaW4gbWFueSBjYXNlcy4gSWYgdGhlIHVzZXIgY291bGQgZG8gYSBmdWxsCi1idWlsZCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBmb2xkZXIsIHRoZXkgd291bGQgYXZvaWQgYWxsCi10aGUgcHJvYmxlbXMuIFRoZSBzb2x1dGlvbiBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFueXRoaW5nCi1zcGVjaWFsIGZyb20gdGhlIEphdmEgQ29yZSAoaS5lLiwgV1NBRCBzaG91bGQgYmUgYWJsZSB0byBpbXBsZW1lbnQgaXQgdGhlbXNlbHZlcykuPC9mb250PgotPGgzPgotPGZvbnQgY29sb3I9IiMwMDAwMDAiPlJlc291cmNlcyBpbiBPdXRwdXQgRm9sZGVyPC9mb250PjwvaDM+Ci08Zm9udCBjb2xvcj0iIzAwMDAwMCI+V2hlbiB0aGUgc291cmNlIGZvbGRlciBhbmQgb3V0cHV0IGZvbGRlciBjb2luY2lkZSwKLXRoZXJlIGlzIG5vIHByb2JsZW0ga2VlcGluZyByZXNvdXJjZSBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBzaW5jZSB0aGV5Ci1hcmUgbm90IGF0IHJpc2sgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gKG5vIHdpdGggdGhlIHByb3Bvc2VkIGNoYW5nZSB0byBkaXNhYmxlCi1yZXNvdXJjZSBjb3B5aW5nIHdoZW4gdGhlIHNvdXJjZSBmb2xkZXIgYW5kIG91dHB1dCBmb2xkZXIgY29pbmNpZGUpLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5XaGVuIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBvdXRwdXQgZm9sZGVyIGRvIG5vdAotY29pbmNpZGUsIGtlZXBpbmcgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIG91dHB1dCBmb2xkZXIgb24gYSBwZXJtYW5lbnQgYmFzaXMKLWVuY291bnRlcnMgdHdvIGlzc3Vlczo8L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+KDEpIFRoZSBmaXJzdCBpc3N1ZSBpcyB0aGF0IG91dHB1dCBmb2xkZXIgaGFzCi1ubyBwcmVzZW5jZSBpbiB0aGUgcGFja2FnZXMgdmlldy4gQW55IHJlc291cmNlcyB0aGF0IHBlcm1hbmVudGx5IHJlc2lkZWQKLWluIHRoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIHRoZXJlZm9yZSBiZSBpbnZpc2libGUgZHVyaW5nIHJlZ3VsYXIgSmF2YSBkZXZlbG9wbWVudC4KLU9uZSB3b3VsZCBoYXZlIHRvIHN3aXRjaCB0byB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yIHZpZXcgdG8gYWNjZXNzIHRoZW0uPC9mb250PgotPHA+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRoZSBwYWNrYWdlcyB2aWV3IG9ubHkgc2hvd3MgcmVzb3VyY2UgZmlsZXMgaW4KLXNvdXJjZSBhbmQgbGlicmFyeSBmb2xkZXJzLiBDaGFuZ2luZyB0aGUgcGFja2FnZXMgdmlldyB0byBzaG93IHJlc291cmNlcwotaW4gdGhlIG91dHB1dCBmb2xkZXIgaXMgaW5mZWFzaWJsZS4gSW5jbHVkaW5nIHRoZSBvdXRwdXQgZm9sZGVyIG9uIHRoZQotY2xhc3NwYXRoIGFzIGEgbGlicmFyeSBmb2xkZXIgd2FzIGRpc2N1c3NlZCBhdCBsZW5ndGggYWJvdmUgYW5kIGlzIG91dAotb2YgdGhlIHF1ZXN0aW9uLiBJbmNsdWRpbmcgdGhlIG91dHB1dCBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aCBhcyBhIHNvdXJjZQotZm9sZGVyIGlzIGFuIG9wdGlvbiAoaW4gZmFjdCwgaXQncyBleGFjdGx5IHdoYXQgeW91IGdldCB3aGVuIHlvdXIgc291cmNlCi1hbmQgb3V0cHV0IGZvbGRlcnMgY29pbmNpZGUpLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj4oMikgVGhlIHNlY29uZCBpc3N1ZSBpcyB0aGF0IHJlc291cmNlIGZpbGVzIGluCi10aGUgb3V0cHV0IGZvbGRlciBhcmUgaW4gaGFybSdzIHdheSBvZiByZXNvdXJjZXMgb2YgdGhlIHNhbWUgbmFtZSBiZWluZwotY29waWVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JZiByZXNvdXJjZXMgZXhpc3RpbmcgaW4gdGhlIG91dHB1dCBmb2xkZXIgYXJlCi1naXZlbiBwcmVjZWRlbmNlIG92ZXIgdGhlIG9uZXMgaW4gc291cmNlIGZvbGRlcnMsIHRoZW4gdGhlIG9uZXMgZnJvbSBzb3VyY2UKLWZvbGRlcnMgd291bGQgb25seSBiZSBjb3BpZWQgb25jZSBhbmQgbmV2ZXJtb3JlIG92ZXJ3cml0dGVuLiBDb3BpZXMgaW4KLXRoZSBvdXRwdXQgZm9sZGVyIHdvdWxkIGdldCBzdGFsZSBvciBvYnNvbGV0ZTsgYXV0b21hdGljIGNsZWFudXAgd291bGQKLW5vdCBiZSBwb3NzaWJsZS48L2ZvbnQ+Ci08cD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+T24gdGhlIG90aGVyIGhhbmQsIGlmIHJlc291cmNlcyBleGlzdGluZyBpbiBzb3VyY2UKLWZvbGRlcnMgYXJlIGdpdmVuIHByZWNlZGVuY2Ugb3ZlciB0aGUgb25lcyBpbiB0aGUgb3V0cHV0IGZvbGRlcnMsIHRoZW4KLW9uZSB0aGF0IGV4aXN0cyBvbmx5IGluIHRoZSBvdXRwdXQgZm9sZGVycyB3b3VsZCBiZSBwZXJtYW5lbnRseSBsb3N0IGlmCi1hIHJlc291cmNlIGJ5IHRoZSBzYW1lIG5hbWUgd2FzIGV2ZXIgdG8gYmUgY3JlYXRlZCBpbiBhIHNvdXJjZSBmb2xkZXIuCi1JdCBpcyBhIGRhbmdlcm91cyBwcmFjdGljZSB0byBhbGxvdyB0aGUgdXNlciB0byBzdG9yZSBpbXBvcnRhbnQgZGF0YSBpbgotYSBwbGFjZSB0aGF0IGNvdWxkIGJlIGNsb2JiZXJlZCBieSBhbiBhdXRvbWF0aWMgbWVjaGFuaXNtIHRoYXQgdXN1YWxseQotb3BlcmF0ZXMgdW5zZWVuIHRvIHRoZSB1c2VyLjwvZm9udD4KLTxwPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Db25jbHVzaW9uOiBLZWVwaW5nIHJlc291cmNlIGZpbGVzIGluIHRoZSBvdXRwdXQKLWZvbGRlciBvbiBhIHBlcm1hbmVudCBiYXNpcyBpcyBub3Qgd2VsbCBzdXBwb3J0ZWQgYXQgdGhlIFVJLCBhbmQgc2hvdWxkCi1vbmx5IGJlIGRvbmUgaWYgdGhlIHJlc291cmNlIGZpbGVzIGNhbiBiZSBjb25zaWRlcmVkIGV4cGVuZGFibGUuPC9mb250PgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9wbHVnZ2FibGUgamRrcy9wbHVnZ2FibGUtamRrcy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC9wbHVnZ2FibGUgamRrcy9wbHVnZ2FibGUtamRrcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE2MzgyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvcGx1Z2dhYmxlIGpka3MvcGx1Z2dhYmxlLWpka3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW45ODsgSSkgW05ldHNjYXBlXSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkJ1aWxkIj4KLSAgIDx0aXRsZT5KRFQgLSBQbHVnZ2FibGUgSkRLczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPgotUGx1Z2dhYmxlIEpES3M8L2gyPgotTGFzdCByZXZpc2VkIDExOjQ1IEZyaWRheSBPY3RvYmVyIDE5LCAyMDAxCi08cD5Xb3JrIGl0ZW06IHBsdWdnYWJsZSBKREtzCi08cD5SZWxhdGVkIHdvcmsgaXRlbTogIlN1cHBvcnQgZm9yIGRlYWxpbmcgd2l0aCBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQgYnkKLWV4dGVybmFsIEphdmEgY29tcGlsZXJzIGxpa2UgamF2YWMgYW5kIGppa2VzIGZyb20gYW4gQW50IHNjcmlwdC4iCi08cD5SZWxhdGVkIGlzc3VlOiByZW1vdGUgYnVpbGRzCi08cD5PdGhlciBJREVzIGNhbiBjbGFpbSB0aGF0IHdoZW4gU3VuIG9yIElCTSByZWxlYXNlcyBhIG5ldyBKREssIGEgZGV2ZWxvcGVyCi1jYW4ganVzdCAicGx1ZyBpdCBpbiIgdG8gdGhlaXIgSURFLiBXZSB3b3VsZCBsaWtlIEVjbGlwc2UgdG8gYmUgc2ltaWxhcmx5Ci1mbGV4aWJsZSwgYW5kIGJlIGFibGUgdG8gbWFrZSBhIHNpbWlsYXIgY2xhaW0uCi08cD5JbiBwcmFjdGljZSwgd2hhdCBkb2VzIHRoaXMgbWVhbj8gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IGFzcGVjdHMuCi08b2w+Ci08bGk+Ci1UaGUgYWJsaWxpdHkgdG8gcnVuIEphdmEgcHJvZ3JhbXMgd2l0aCB0aGUgSkRLJ3MgSlJFLjwvbGk+Ci0KLTxsaT4KLVRoZSBhYmxpbGl0eSB0byBjb21waWxlIEphdmEgc291cmNlIGNvZGUgYWdhaW5zdCB0aGUgSkRLJ3MgY2xhc3MgbGlicmFyaWVzLjwvbGk+Ci0KLTxsaT4KLVRoZSBhYmxpbGl0eSB0byBjb21waWxlIEphdmEgc291cmNlIGNvZGUgd2l0aCB0aGUgSkRLJ3MgamF2YWMgY29tcGlsZXIuPC9saT4KLQotPGxpPgotVGhlIGFibGlsaXR5IHRvIGRlYnVnIEphdmEgcHJvZ3JhbXMgd2l0aCB0aGUgSkRLJ3MgSkRQQSBhbmQgSlZNLjwvbGk+Ci0KLTxsaT4KLVRoZSBhYmxpbGl0eSB0byBicm93c2UgdGhlIEpESydzIGNsYXNzIGxpYnJhcnkgQVBJIGphdmFkb2MgKG9yIHBlcmhhcHMKLW90aGVyIHJlbGVhc2UgZG9jKS48L2xpPgotCi08bGk+Ci1UaGUgYWJsaWxpdHkgdG8gcnVuIHRoZSBKREsncyB1dGlsaXR5IHByb2dyYW1zIGxpa2UgamF2YXAsIGphdmFkb2MsIGphdmFoLjwvbGk+Ci08L29sPgotV2Ugd2lsbCB0YWtlIHRoZSBmaXJzdCBmb3VyIGFzIHRoZSBtb3N0IGltcG9ydGFudCBvbmVzIGZvciBFY2xpcHNlIHRvIGFkZHJlc3MsCi1hbmQgbG9vayBhdCBlYWNoIGluIHR1cm4uCi08aDM+Ci1QbHVnZ2FibGUgSlJFczwvaDM+Ci1UaGlzIGlzIHN1cHBvcnRlZCBpbiBFY2xpcHNlIDEuMC4KLTxwPlRoZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIHBsdWctaW4gcHJvdmlkZXMgcGx1Z2dhYmxlIHN1cHBvcnQgKCJ2bUluc3RhbGxUeXBlcyIKLWV4dGVuc2lvbiBwb2ludCkgZm9yIGRlc2NyaWJpbmcgaW5zdGFsbGVkIEphdmEyLXN0eWxlIEphdmEgcnVudGltZSBlbnZpcm9ubWVudHMKLWFuZCBsYXVuY2hpbmcgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyBvZiBhIEphdmEgdmlydHVhbCBtYWNoaW5lLgotPHA+SkRUIGRlZmluZXMgYSB3b3JrYmVuY2ggcHJlZmVyZW5jZSAoIkluc3RhbGxlZCBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnRzIikKLXNvIHRoYXQgdGhlIHVzZXIgY2FuIGNyZWF0ZSwgcmVtb3ZlLCBhbmQgZWRpdCBKUkUgZGVmaW5pdGlvbnMgKGkuZS4sIGluc3RhbmNlcwotb2YgdGhlIGtub3duIFZNIGluc3RhbGxlZCB0eXBlcykuIFRoZSB1c2VyIGNob29zZXMgd2hpY2ggb25lIG9mIHRoZSBKUkUKLWRlZmluaXRpb25zIGlzIHRoZSBkZWZhdWx0LgotPHA+SkRUIGFsc28gZGVmaW5lcyBhIEpSRSBwcm9wZXJ0eSBmb3IgZWFjaCBKYXZhIHByb2plY3QgdG8gY29udHJvbCB3aGljaAotSlJFIGlzIHVzZWQgdG8gcnVuIHByb2dyYW1zIGluIHRoYXQgcHJvamVjdC4gQnkgZGVmYXVsdCwgZWFjaCBwcm9qZWN0IHNoYXJlcwotdGhlIHdvcmtzcGFjZS13aWRlIGRlZmF1bHQuIFRoZSB1c2VyIGNhbiBlbGVjdCB0byBzcGVjaWZ5IGEgSlJFIGZvciB0aGF0Ci1wcm9qZWN0LCB3aGljaCBvdmVycmlkZXMgdGhlIHdvcmtzcGFjZS13aWRlIGRlZmF1bHQuCi08aDM+Ci1QbHVnZ2FibGUgSkRLIGNsYXNzIGxpYnJhcmllczwvaDM+Ci1UaGlzIGlzIHN1cHBvcnRlZCBpbiBFY2xpcHNlIDEuMC4KLTxwPkpEVCBDb3JlIHByb3ZpZGVzIGEgcmVzZXJ2ZWQgYnVpbGQgY2xhc3NwYXRoIHZhcmlhYmxlLCBuYW1lZCAiSlJFX0xJQiIsCi13aGljaCBnZXRzIGJvdW5kIHRvIHRoZSBKQVIgbGlicmFyeSAoYW5kIGFzc29jaWF0ZWQgc291cmNlIGNvZGUgWklQKSBvZgotdGhlIGN1cnJlbnQgd29ya3NwYWNlLXdpZGUgZGVmYXVsdCBKUkUgKGUuZy4sICJEOlxqZGsxLjRcanJlXGxpYlxydC5qYXIiCi13aXRoIHNvdXJjZSBpbiAiRDpcamRrMS40XHNyYy56aXAiKS4gQnkgZGVmYXVsdCwgYSBjbGFzc3BhdGggZW50cnkgaXMgaW5jbHVkZWQKLW9uIHRoZSBidWlsZCBjbGFzc3BhdGggb2YgYSBuZXdseSBjcmVhdGVkIHByb2plY3QuIFRoaXMgbGlicmFyeSB3b3VsZCBvcmRpbmFyaWx5Ci1zdXBwbHkgdGhlIGNvbXBpbGUtdGltZSBkZWZpbml0aW9ucyBvZiB0aGUgc3RhbmRhcmQgY2xhc3MgbGlicmFyaWVzIHVzZWQKLXdoZW4gYnJvd3NpbmcgYW5kIGJ1aWxkaW5nIGEgSmF2YSBwcm9qZWN0LgotPHA+VGhlIGNsaWVudCB0aGF0IGlzIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGlzIHZhcmlhYmxlIGlzIGZyZWUgdG8gcmVtb3ZlCi10aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20gdGhlIGJ1aWxkIGNsYXNzcGF0aCBhbmQgcmVwbGFjZSBpdCB3aXRoIHNvbWV0aGluZwotZWxzZS4gVGhlIGNsaWVudCBjb3VsZCBkZWNsYXJlIHRoZWlyIG93biBidWlsZCBjbGFzc3BhdGggdmFyaWFibGUsIGJpbmQKLWl0IHRvIGEgc3VpdGFibGUgdmFsdWUsIGFuZCBpbmNsdWRlIHRoYXQgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBpbnN0ZWFkCi0oRm9yIGluc3RhbmNlLCBWQU1FL1dTREQgZGVjbGFyZXMgYSBjbGFzc3BhdGggdmFyaWFibGUgbmFtZWQgIklWSl9IT01FIgotYW5kIHJlZmVyZW5jZXMmbmJzcDsgdmFyaW91cyBjbGFzcyBsaWJyYXJpZXMgcmVsYXRpdmUgdG8gaXQ7IGUuZy4sICJJVkpfSE9NRS9saWIvamNsbWF4LmphciIuKQotT3IgdGhleSBjb3VsZCBqdXN0IGhhcmQtd2lyZSBhIGxpYnJhcnkgZW50cnkgZm9yIGEgcGFydGljdWxhciBKUkUgbGlicmFyeS4KLTxwPldoaWxlIHRoZSBiYXNpYyBtZWNoYW5pc20gaXMgcmVhc29uYWJsZSwgaXQgaXMgdW5mb3J0dW5hdGUgdGhhdCBpdCBpcwotdGllZCBzbyB0aWdodGx5IHRvIHRoZSBkZWZhdWx0IEpSRS4gSXQgbWlnaHQgYmUgbW9yZSBjb252ZW5pZW50IGlmIHNlbGVjdGluZwotYSBkaWZmZXJlbnQgd29ya3NwYWNlLXdpZGUgZGVmYXVsdCBKUkUgZGVmaW5pdGlvbiB3b3VsZCBwcm9tcHQgdGhlIHVzZXIKLXRvIGNoYW5nZSB0aGUgSlJFX0xJQiBjbGFzc3BhdGggdmFyaWFibGUgYXMgd2VsbC4KLTxwPlBhcmFsbGVsaW5nIHRoZSB3b3JrYmVuY2ggSlJFIG1lY2hhbmlzbSwgd2UgY291bGQgY29uc2lkZXIgYWxsb3dpbmcKLXRoZSB1c2VyIHRvIHNwZWNpZnkgY2xhc3NwYXRoIHZhcmlhYmxlIGJpbmRpbmdzIGF0IHRoZSBwcm9qZWN0IGxldmVsIHRoYXQKLW92ZXJyaWRlIHRoZSB3b3Jrc3BhY2Utd2lkZSBkZWZhdWx0LiBUaGlzIHdvdWxkIGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZQotdGhlIGJpbmRpbmcgdG8gYWZmZWN0IGp1c3QgdGhhdCBwcm9qZWN0LiBTb21ldGhpbmcgc2ltaWxhciBjYW4gYWxyZWFkeQotYmUgYWNoaWV2ZWQgYnkgdXNpbmcgZGlzdGluY3RseS1uYW1lZCBjbGFzc3BhdGggdmFyaWFibGVzIGZvciBlYWNoIHByb2plY3QKLShlLmcuLCAiUDFfSlJFX0xJQiIgZm9yIHByb2plY3QgUDEncyAiSlJFX0xJQiIpLiBTbyBpdCdzIHVuY2xlYXIgd2hldGhlcgotYW55IGludGVyZXN0aW5nIG5ldyB1c2VjYXNlcyB3b3VsZCBiZSBzdXBwb3J0ZWQgYnkgdGhpcy4KLTxoMz4KLVBsdWdnYWJsZSBKYXZhIGNvbXBpbGVyczwvaDM+Ci1KYXZhIGNvbXBpbGVycyBjYW4gZGlmZmVyIGFsb25nIG1hbnkgYXhlczoKLTx1bD4KLTxsaT4KLXN1cHBvcnRlZCBKYXZhIGxhbmd1YWdlIGxldmVsPC9saT4KLQotPGxpPgotSmF2YSBieXRlY29kZSB2ZXJzaW9uPC9saT4KLQotPGxpPgotcXVhbGl0eSBvZiBnZW5lcmF0ZWQgY29kZTwvbGk+Ci0KLTxsaT4KLWhlbHBmdWxuZXNzIG9mIGVycm9yIG1lc3NhZ2VzPC9saT4KLQotPGxpPgotcGVyZm9ybWFuY2U8L2xpPgotCi08bGk+Ci1yb2J1c3RuZXNzPC9saT4KLQotPGxpPgotcHJvZHVjdCBzdXBwb3J0IGZvciBjb21waWxlcjwvbGk+Ci08L3VsPgotSW4gdGhlIHNpbXBsZSB3b3JsZCBvZiB0aGUgY29tbWFuZCBsaW5lIGNvbXBpbGVyLCBpdCdzIGVhc3kgdG8gdXNlIHdoYXRldmVyCi1KYXZhIGNvbXBpbGVyIHlvdSBjaG9vc2UgdG8gdXNlLiBUaGUgY29tbWFuZCBsaW5lcyBhcmUgc3Vic3RhbnRpYWxseSB0aGUKLXNhbWUsIGFuZCB0aGUgb3ZlcnQgY29tcGlsZXIgYmVoYXZpb3Igb2YgdHJhbnNsYXRpbmcgLmphdmEgc291cmNlIGZpbGVzCi10byAuY2xhc3MgZmlsZXMgaXMgdXR0ZXJseSBzdGFuZGFyZC4KLTxwPkluIGFkZGl0aW9uYWwgdG8gdGhlIGJhc2ljIGNvbXBpbGVyIGZ1bmN0aW9uYWxpdHksIHRoZXJlIGFyZSB1c3VhbGx5Ci1hIG51bWJlciBvZiBJREUgZmVhdHVyZXMgdGhhdCBhbHNvIG5lZWQgdG8gYmUgImxhbmd1YWdlIGF3YXJlIiAodG8gc29tZQotZXh0ZW50KSwgaW5jbHVkaW5nOgotPHVsPgotPGxpPgotc291cmNlIGNvZGUgZWRpdGluZyAoc3ludGF4IGhpZ2hsaWdodGluZyk8L2xpPgotCi08bGk+Ci1jb2RlIGFzc2lzdCAoY29tcGxldGlvbiwgc2VsZWN0aW9uKTwvbGk+Ci0KLTxsaT4KLWNvZGUgcmVmb3JtYXR0ZXI8L2xpPgotCi08bGk+Ci1zZWFyY2g8L2xpPgotPC91bD4KLVRoZSBsYW5ndWFnZSBhd2FyZSBmZWF0dXJlcyByZXF1aXJlIGNvbXBpbGVyIGluZnJhc3RydWN0dXJlIChlLmcuLCBhIHNjYW5uZXIpLgotPHA+VGhlIHN0YW5kYXJkIFN1biBKYXZhIGNvbXBpbGVyIGhhcyBubyBvZmZpY2lhbCBBUElzOyB0aGUgY29tcGlsZXIgaW5mcmFzdHJ1Y3R1cmUKLWlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSB0aGUgY29tcGlsZXIuIFRoaXMgbWVhbnMgdGhhdCBKYXZhIElERXMgaGF2ZSBubwotY2hvaWNlIGJ1dCB0byByZWltcGxlbWVudCB3aGF0ZXZlciBjb21waWxlciBpbmZyYXN0cnVjdHVyZSB0aGV5IG1pZ2h0IG5lZWQuCi1XaXRob3V0IHN0YW5kYXJkIEphdmEgY29tcGlsZXIgQVBJcywgbm8gSmF2YSBJREUgY2FuIGJlIHRydWVseSBwbHVnZ2FibGUKLWluIHRoZXNlIHJlZ2FyZHMuIFRoZSBiZXN0IHRoYXQgYSBKYXZhIElERSBjYW4gZG8gaW4gdGhlIGNpcmN1bXN0YW5jZXMKLWlzIHRvIHVzZSBhIHBsdWdnYWJsZSBKYXZhIGNvbXBpbGVyIGZvciBpdHMgYmFzaWMgY29tcGlsZXIgZnVuY3Rpb25hbGl0eS4KLTxwPkluIEVjbGlwc2UgMS4wLCB0aGUgSURFJ3MgYmFzaWMgSmF2YSBjb21waWxlciBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkCi1ieSB0aGUgYnVpbHQtaW4gRWNsaXBzZSBjb21waWxlci4gV2hhdCB3b3VsZCBpdCB0YWtlIHRvIG1ha2UgdGhpcyBwYXJ0Ci1wbHVnZ2FibGU/Ci08cD5JbiBFY2xpcHNlLCB0aGUgYmFzaWMgSmF2YSBjb21waWxlciBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIHRocm91Z2gKLXRoZSBKYXZhIGJ1aWxkZXIuIFRoZSBKYXZhIGJ1aWxkZXIgaXMgYWN0aXZhdGVkIHdoZW4gaXRzIGJ1aWxkIG1ldGhvZCBpcwotY2FsbGVkLiBUaGlzIGhhcHBlbnMgd2hlbiAoYSkgYW4gZXhwbGljaXQgQnVpbGQgY29tbWFuZHMgcmVxdWVzdGVkIGJ5IHRoZQotdXNlciwgKGIpIHRoZSB3b3Jrc3BhY2UgcGVyZm9ybXMgYW4gYXV0byBidWlsZCwgb3IgKGMpIHNvbWUgcGx1Zy1pbiBpbnN0aWdhdGVkCi1hIGJ1aWxkIHByb2dyYW1tYXRpY2FsbHkuCi08cD5TbyB0aGUgZmlyc3QgaWRlYSBpcyB0aGF0IHRoZSBKYXZhIGJ1aWxkZXIncyBidWlsZCBtZXRob2Qgc2hvdWxkIGludm9rZQotYSBwbHVnZ2FibGUgSmF2YSBjb21waWxlciB0byBkbyBhIGJ1aWxkLgotPGg0PgotQ2FsbGluZyBhIHBsdWdnYWJsZSBqYXZhYyBmcm9tIHdpdGhpbiB0aGUgSmF2YSBidWlsZGVyPC9oND4KLUZvciBhIGZ1bGwgYnVpbGQsIHRoaXMgaXMgY2xlYXJseSBkb2FibGUuIFRoZSBzb3VyY2UgZm9sZGVycyBtZW50aW9uZWQKLW9uIHRoZSBidWlsZCBjbGFzc3BhdGggY2FuIGJlIHdhbGtlZCB0byBpZGVudGlmeSBhbGwgSmF2YSBzb3VyY2UgZmlsZXMuCi1UaGUgY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlcyBpbiB0aGUgb3V0cHV0IGZvbGRlciBhcmUgZGVsZXRlZCwgYW5kIEphdmEKLXByb2JsZW0gbWFya2VycyBhcmUgcmVtb3ZlZC4gVGhlIG5hbWVzIG9mIHRoZXNlIHNvdXJjZSBmaWxlcyBhcmUgdGhlbiBwYXNzZWQKLXRvIGphdmFjIGFzIHRoZSBvbmVzIHRvIGNvbXBpbGUgKGxhcmdlIGZpbGUgc2V0cyBwZXJoYXBzIGJyb2tlbiB1cCBpbnRvCi1yZWFzb25hYmxlIHNpemVkIGJhdGNoZXMpOyB0aGUgY2xhc3NwYXRoIHBhc3NlZCBpcyBjb21wdXRlZCBmcm9tIHRoZSBwcm9qZWN0J3MKLWJ1aWxkIGNsYXNzcGF0aDsgdGhlIG91dHB1dCBmb2xkZXIgaXMgcGFzc2VkIGFzIHRoZSB0YXJnZXQgZm9yIHRoZSBnZW5lcmF0ZWQKLWNsYXNzIGZpbGVzLiBUaGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBjbGFzcyBmaWxlcyBpbnRvIHRoZSB0YXJnZXQgZm9sZGVyCi1hbmQgcHJpbnQgdGV4dCBlcnJvciBtZXNzYWdlcyB0byBpdHMgb3V0cHV0IHN0cmVhbS4gRGVwZW5kaW5nIG9uIGhvdyAic3RhbmRhcmQiCi10aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgc3RyZWFtIHdhcywgdGhlIEphdmEgYnVpbGRlciBtaWdodCBiZSBhYmxlIHRvCi1hbmFseXplIHRoZSBzdHJlYW0gb2YgdGV4dCBlcnJvciBtZXNzYWdlcyBhbmQgY29udmVydCB0aGVzZSBpbnRvIEphdmEgcHJvYmxlbQotbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIG9mZmVuZGluZyBzb3VyY2UgZmlsZXMgKHRoZSBjb21wbGV0ZSBzdHJlYW0KLWNvdWxkIGFsc28gYmUgc2F2ZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHRvIHVzZXIgdGhyb3VnaCBzb21lIG90aGVyIG1lY2hhbmlzbSkuCi1PdGhlcndpc2UgdGhlIG5ldCByZXN1bHQgaXMgY2xvc2UgdG8gdGhhdCBvZiBydW5uaW5nIHRoZSBFY2xpcHNlIGNvbXBpbGVyLgotT25lIG90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgSmF2YSBidWlsZGVyIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHByb2R1Y2UKLWFueXRoaW5nIHJlc2VtYmxpbmcgaXRzIGN1cnJlbnQgaW50ZXJuYWwgYnVpbHQgc3RhdGUgKGkuZS4sIG5vIGRlcGVuZGVuY3kKLWdyYXBoKS4KLTxwPkZvciBhbiBpbmNyZW1lbnRhbCBidWlsZCwgaXQgaXMgaW1wb3NzaWJsZSB0byBkbyBhbnl0aGluZyBtb3JlIHRoYW4KLWEgY3Vyc29yeSBqb2Igd2l0aG91dCBwcm9wZXIgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gVGhlIEphdmEgYnVpbGRlciBpcwotcGFzc2VkIGEgcmVzb3VyY2UgZGVsdGEgZm9yIHRoZSBwcm9qZWN0IHNob3dpbmcgd2hpY2ggc291cmNlIGZpbGVzIGhhdmUKLWNoYW5nZWQuIFRoZSBkZWx0YSB3b3VsZCBhbHNvIHNob3cgdGhhdCB0aGUgYnVpbGQgY2xhc3NwYXRoIGhhZCBjaGFuZ2VkCi0odGhlIEphdmEgYnVpbGRlciBjb3VsZCBlYXNpbHkgcmVtZW1iZXIgc29tZSBjbGFzc3BhdGhzIGJldHdlZW4gYnVpbGRzKS4KLTxwPkhvdyB0byBkbyBhbiBpbmNyZW1lbnRhbCBidWlsZDoKLTx1bD4KLTxsaT4KLWRlbGV0ZSBhIHNvdXJjZSBmaWxlID0+IGlkZW50aWZ5IGFuZCBkZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZXM8L2xpPgotCi08bGk+Ci1hZGQgYSBzb3VyY2UgZmlsZSA9PiBpZGVudGlmeSBhbmQgZGVsZXRlIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZXMgKGp1c3QKLWluIGNhc2UpOyBpbmNsdWRlIHNvdXJjZSBmaWxlIGluIGxpc3QgdG8gYmUgcmVjb21waWxlZDwvbGk+Ci0KLTxsaT4KLWNoYW5nZSBhIHNvdXJjZSBmaWxlID0+IGlkZW50aWZ5IGFuZCBkZWxldGUgY29ycmVzcG9uZGluZyBjbGFzcyBmaWxlczsKLWluY2x1ZGUgc291cmNlIGZpbGUgaW4gbGlzdCB0byBiZSByZWNvbXBpbGVkPC9saT4KLTwvdWw+Ci1UaGUgY29tcGlsZXIgaXMgY2FsbGVkIHRvIHJlY29tcGlsZSB0aGUgaWRlbnRpZmllZCBsaXN0IG9mIHNvdXJjZSBmaWxlcy4KLVRoZSBKYXZhIGJ1aWxkZXIgbWlnaHQgYmUgYWJsZSB0byBhbmFseXplIHRoZSAtdmVyYm9zZSBvdXRwdXQgc3RyZWFtIHRvCi1kaXNjb3ZlciB3aGljaCBzb3VyY2UgZmlsZXMgd2VyZSBhY3R1YWxseSBjb21waWxlZCBhbmQgdXBkYXRlIHRoZWlyIEphdmEKLXByb2JsZW0gbWFya2Vycy4KLTxwPlRoaXMga2luZCBvZiBzaW1wbGUtbWluZGVkIGluY3JlbWVudGFsIGJ1aWxkIGhhbmRsZXMgbWFueSBzaW1wbGUgY2FzZXMKLShlLmcuLCBjaGFuZ2luZyB0aGUgYm9keSBvZiBhIG1ldGhvZCwgZml4aW5nIGphdmFkb2MgY29tbWVudHMsIHJlZm9ybWF0dGluZykuCi1UaGUgcmVzdWx0cyB3b3VsZCB1c3VhbGx5IGJlIGxlc3Mgc2F0aXNmYWN0b3J5IHdoZW4gdGhlIHByaW5jaXBhbCBzdHJ1Y3R1cmUKLW9mIGNsYXNzIGlzIGNoYW5nZWQgYmVjYXVzZSBhbnkgZGVwZW5kZW50IHNvdXJjZSBmaWxlcyBkbyBub3QgZ2V0IHJlY29tcGlsZWQsCi13aGljaCBtYXkgbGVhZCB0byBpbmNvbXBhdGlibGUgc2V0cyBvZiBiaW5hcmllcyBjbGFzcyBmaWxlcy4gVGhlIGRldmVsb3Blcgotd291bGQgbmVlZCB0byBiZSBlZHVjYXRlZCBhYm91dCB3aGVuIHRvIGJlIGFza2luZyBmb3IgYSBmdWxsIGJ1aWxkLiBNYW55Ci13aWxsIGFscmVhZHkgYmUgZmFtaWxpYXIgd2l0aCB0aGVzZSBydWxlcyBmcm9tIHVzaW5nIG90aGVyIEphdmEgSURFcy4gV2l0aAotYSBKYXZhIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHJvZHVjZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLCBpdCBpcyBoYXJkCi1mb3IgYW4gSURFIHdpdGggcGx1Z2dhYmxlIEphdmEgY29tcGlsZXJzIHRvIGRvIGFueSBiZXR0ZXIuCi08cD5BdXRvYnVpbGQgaXMganVzdCBhbiBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IGlzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5LgotTm90ZSB0aGF0IHRoZSB1c2VyIG1heSBmaW5kIGl0IGludG9sZXJhYmxlIHRvIHJ1biB3aXRoIGF1dG9idWlsZCBlbmFibGVkCi1pZiB0aGUgb3ZlcmhlYWQgZm9yIGludm9raW5nIHRoZSBwbHVnZ2FibGUgY29tcGlsZXIgaXMgaGlnaCAod2hpY2ggaXQgaXMKLWxpa2VseSB0byBiZSBpZiBhIHNlcGFyYXRlIEpWTSB3b3VsZCBuZWVkIHRvIGJlIGxhdW5jaGVkKS4KLTxwPlRoZSBjb25jbHVzaW9uIGlzIHRoYXQgdGhpcyBpcyBmZWFzaWJsZSwgYWx0aG91Z2ggYXV0b2J1aWxkaW5nIG1heSBiZQotaW50b2xlcmFibGUuIEFzIGxvbmcgYXMgdGhlIHBsdWdnYWJsZSBKYXZhIGNvbXBpbGVyIHdhcyB2ZXJ5IGphdmFjLWxpa2UKLWluIHRlcm1zIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBmb3JtYXQgb2YgZ2VuZXJhdGVkIGVycm9yIG1lc3NhZ2VzLAotaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBpdCB0byBidWlsZCBhIEphdmEgcHJvamVjdC4KLTxoND4KLUNhbGxpbmcgYW4gQW50IHNjcmlwdCBpbnN0ZWFkIG9mIHRoZSBKYXZhIGJ1aWxkZXI8L2g0PgotQW4gZXZlbiBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGFsbG93IGEgSmF2YSBwcm9qZWN0IHRvIGJlIGNvbmZpZ3VyZWQKLXdpdGggYSBnZW5lcmljIEFudC1iYXNlZCBpbmNyZW1lbnRhbCBwcm9qZWN0IGJ1aWxkZXIgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQKLUphdmEgYnVpbGRlci4gVGhlIEFudC1iYXNlZCBidWlsZGVyIGlzIGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIDIuMCBQbGF0Zm9ybQotQ29yZSBmZWF0dXJlIHByb3Bvc2FsLgotPHA+QWxsIG9mIHRoZSBhYm92ZSBjb25zaWRlcmF0aW9ucyB3b3VsZCBzdGlsbCBhcHBseTsgdGhlIG9ubHkgcmVhbCBkaWZmZXJlbmNlCi1pcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW1wbGVtZW50ZWQgaW4gQW50IHRlcm1zLgotPGgzPgotUGx1Z2dhYmxlIEpEUEEgRGVidWdnZXJzPC9oMz4KLUVjbGlwc2UgcmVpbXBsZW1lbnRzIHRoZSBKUERBIGRlYnVnZ2VyIGZyb250IGVuZDsgaXQgZG9lcyBub3QgdXNlIHRoZSBKREkKLWltcGxlbWVudGF0aW9uIHN1cHBsaWVkIGJ5IFN1bi4gRXZlbiBpZiBpdCBkaWQgdXNlIFN1biBKREksIGl0IHN0aWxsIHdvdWxkCi1iZSB3b3JrIGZvciB0aGUgRWNsaXBzZSBkZWJ1Z2dlciB0byBjYXBpdGFsaXplIG9uIGFueSBuZXcgZGVidWdnZXIgZnVuY3Rpb25hbGl0eQotdGhlcmVieSBpbnRyb2R1Y2VkLiBTbyB0aGUgZGVidWdnZXIgZnJvbnQgZW5kIGlzIHVwZ3JhZGVhYmxlLCBidXQgbm90IHBsdWdnYWJsZS4KLTxwPlRoZSBKRFBBIGRlYnVnZ2VyIGJhY2sgZW5kIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBKYXZhIHJ1bnRpbWUgZW52aXJvbm1lbnQsCi1hbmQgc2hpcHMgd2l0aCB0aGUgSUJNIGFuZCBTdW4gSjJTRSBKREtzIHNpbmNlIDEuMy4gU28gdGhpcyBwYXJ0IGlzIGFscmVhZHkKLXBsdWdnYWJsZS4KLTxicj4mbmJzcDsKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvcmVsZWFzZSBub3Rlcy9jaGFuZ2Vfc3VtbWFyeS50eHQgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3JlbGVhc2Ugbm90ZXMvY2hhbmdlX3N1bW1hcnkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRjMWJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvcmVsZWFzZSBub3Rlcy9jaGFuZ2Vfc3VtbWFyeS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBCUkVBS0lORyBBUEkgQ0hBTkdFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBOb25lCi0gIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBOT04tQlJFQUtJTkcgQVBJIENIQU5HRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICogQWRkZWQgQVBJIHRvIHNldCBib3RoIHRoZSBjbGFzc3BhdGggYW5kIHRoZSBvdXRwdXQgbG9jYXRpb24gYXQgb25jZS4KLSAgCUlKYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoCi0gIAkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoLCAKLSAgCQlJUGF0aCBuZXdPdXRwdXRMb2NhdGlvbiwgCi0gIAkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAJCi0gICogSUNvZGVDb21wbGV0aW9uUmVxdWVzdG9yIGdvdCBkZXByZWNhdGVkLCBzaG91bGQgdXNlIElDb21wbGV0aW9uUmVxdWVzdG9yCi0gICAgaW5zdGVhZCB0byBvYnRhaW46Ci0gICAgICgxKSAtIGxvY2FsIHZhcmlhYmxlIG5hbWUgc3VnZ2VzdGlvbnMKLSAgICAgKDIpIC0gcGFyYW1ldGVyIG5hbWUgaGludHMKLSAgICAgKDMpIC0gbWV0aG9kIGRlY2xhcmF0aW9uIHN1Z2dlc3Rpb25zLgotICAgIAotICAgSUNvbXBsZXRpb25SZXF1ZXN0b3IgaXMgZXF1aXZhbGVudCB0byBJQ29kZUNvbXBsZXRpb25SZXF1ZXN0b3IgZXhjZXB0IGZvcgotICAgdGhlIGZvbGxvd2luZyBBUEkgY2hhbmdlczoKLSAgIAotICAgKDEpICsgQWRkZWQgQVBJIGZvciBzdWdnZXN0IHZhcmlhYmxlIG5hbWU6Ci0gICAgICB2b2lkIGFjY2VwdFZhcmlhYmxlTmFtZSgKLSAgICAgICAgICBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLAotICAgICAgICAgIGNoYXJbXSB0eXBlTmFtZSwKLSAgICAgICAgICBjaGFyW10gbmFtZSwKLSAgICAgICAgICBjaGFyW10gY29tcGxldGlvbk5hbWUsCi0gICAgICAgICAgaW50IGNvbXBsZXRpb25TdGFydCwKLSAgICAgICAgICBpbnQgY29tcGxldGlvbkVuZCk7Ci0KLSAgICAoMikgKyBBZGRlZCBwYXJhbWV0ZXJOYW1lcyB0byBub3JtYWwgbWV0aG9kIHJlc3VsdHMgQVBJOgotICAgICAgdm9pZCBhY2NlcHRNZXRob2QoCi0gICAgICAgICAgY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwKLSAgICAgICAgICBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsCi0gICAgICAgICAgY2hhcltdIHNlbGVjdG9yLAotICAgICAgICAgIGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywKLSAgICAgICAgICBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsCi0gICAgICAgICAgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsPDw8PDw8PDw8PDw8PDw8PCBBRERFRAotICAgICAgICAgIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCi0gICAgICAgICAgY2hhcltdIHJldHVyblR5cGVOYW1lLAotICAgICAgICAgIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwKLSAgICAgICAgICBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgIGludCBjb21wbGV0aW9uU3RhcnQsCi0gICAgICAgICAgaW50IGNvbXBsZXRpb25FbmQpOwotCi0gICAoMykgKyBBZGRlZCBBUEkgZm9yIGFuc3dlcmluZyBtZXRob2QgZGVjbGFyYXRpb24gY29tcGxldGlvbnM6Ci0gICAgICB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKAotICAgICAgICAgIGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCi0gICAgICAgICAgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAotICAgICAgICAgIGNoYXJbXSBzZWxlY3RvciwKLSAgICAgICAgICBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCi0gICAgICAgICAgY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAotICAgICAgICAgIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAotICAgICAgICAgIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCi0gICAgICAgICAgY2hhcltdIHJldHVyblR5cGVOYW1lLAotICAgICAgICAgIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwKLSAgICAgICAgICBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgIGludCBjb21wbGV0aW9uU3RhcnQsCi0gICAgICAgICAgaW50IGNvbXBsZXRpb25FbmQpOwotCi0gICogU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJUmVzb3VyY2VbXSkgaGFzIGJlZW4gZGVwcmVjYXRlZC4KLSAgCVVzZSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSBpbnN0ZWFkLgotICAJVGhlIHJhdGlvbmFsIGlzIHRoYXQgY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElSZXNvdXJjZVtdKSB3YXMgbm90IHdlbGwKLSAgCWRlZmluZWQgZm9yIHByb2plY3RzLCBhbmQgaXQgY291bGQgbm90IGRlZmluZSBhIHNlYXJjaCBzY29wZSBmb3IgamF2YQotICAJZWxlbWVudHMgdGhhdCBkaWRuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgKGUuZy4gZXh0ZXJuYWwgamFycykuCi0gIAkKLSAgCVRoZSBzcGVjaWZpY2F0aW9uIG9mIGNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSkgaXMgYXMgZm9sbG93czoKLQktIElmIGFuIGVsZW1lbnQgaXMgYW4gSUphdmFQcm9qZWN0LCB0aGVuIHRoZSBwcm9qZWN0J3Mgc291cmNlIGZvbGRlcnMsIAotICAgICAgaXRzIGphcnMgKGV4dGVybmFsIGFuZCBpbnRlcm5hbCkgYW5kIGl0cyByZWZlcmVuY2VzIHByb2plY3RzICh3aXRoIHRoZWlyIAotICAgICAgc291cmNlIGZvbGRlcnMgYW5kIGphcnMsIHJlY3Vyc2l2ZWx5KSB3aWxsIGJlIGluY2x1ZGVkLgotICAgIC0gSWYgYW4gZWxlbWVudCBpcyBhbiBJUGFja2FnZUZyYWdtZW50Um9vdCwgdGhlbiBvbmx5IHRoZSBwYWNrYWdlIGZyYWdtZW50cyBvZiAKLSAgICAgIHRoaXMgcGFja2FnZSBmcmFnbWVudCByb290IHdpbGwgYmUgaW5jbHVkZWQuCi0gICAgLSBJZiBhbiBlbGVtZW50IGlzIGFuIElQYWNrYWdlRnJhZ21lbnQsIHRoZW4gb25seSB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgY2xhc3MgCi0gICAgICBmaWxlcyBvZiB0aGlzIHBhY2thZ2UgZnJhZ21lbnQgd2lsbCBiZSBpbmNsdWRlZC4gU3VicGFja2FnZXMgd2lsbCBOT1QgYmUgCi0gICAgICBpbmNsdWRlZC4KLSAgICAgIAotICAqIENsYXNzcGF0aCBlbnRyaWVzIChleGNlcHQgZm9yIHNvdXJjZSBmb2xkZXJzKSBjYW4gYmUgdGFnZ2VkIGFzIGV4cG9ydGVkIHVwb24KLSAgICBjcmVhdGlvbi4gV2hlbiBleHBvcnRlZCwgYW4gZW50cnkgaXMgY29udHJpYnV0ZWQgdG8gZGVwZW5kZW50IHByb2plY3RzIGFsb25nIAotICAgIHdpdGggaXRzIG91dHB1dCBsb2NhdGlvbi4KLSAgICBBZGRlZCBBUElzOgotICAgIAotICAgIFRlc3Rpbmcgc3RhdHVzIG9mIGEgZ2l2ZW4gZW50cnkKLSAgICAgKyBJQ2xhc3NwYXRoRW50cnkuaXNFeHBvcnRlZCgpCi0KLSAgICBDcmVhdGluZyBlbnRyaWVzIHdpdGggZXhwb3J0IGZsYWcKLSAgICAgKyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkoSVBhdGgsIGJvb2xlYW4pCi0gICAgICsgSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KElQYXRoLCBJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0gICAgICsgSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShJUGF0aCwgYm9vbGVhbikKLSAgICAgICAgICAgCi0gICogU2VhcmNoIGZvciBmaWVsZCByZWFkIGFuZCBmaWVsZCB3cml0ZSBhY2Nlc3Nlcy4gVHdvIG5ldyBjb25zdGFudHMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgb24gSUphdmFTZWFyY2hDb25zdGFudHMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgZmllbGQgcmVmZXJlbmNlIHNlYXJjaCBwYXR0ZXJuOgotICAgIC0gUkVBRF9BQ0NFU1NFUzogdGhlIHNlYXJjaCByZXN1bHRzIGNvbnRhaW4gKm9ubHkqIHJlYWQgYWNjZXNzIHRvIGEgZmllbGQuCi0gICAgLSBXUklURV9BQ0NFU1NFUzogdGhlIHNlYXJjaCByZXN1bHRzIGNvbnRhaW4gKm9ubHkqIHdyaXRlIGFjY2VzcyB0byBhIGZpZWxkLgotICAgIE5vdGUgdGhhdCBpZiBSRUZFUkVOQ0VTIGlzIHVzZWQsIHRoZW4gc2VhcmNoIHJlc3VsdHMgY29udGFpbiBib3RoIHJlYWQgYW5kIHdyaXRlCi0gICAgYWNjZXNzcyB0byBhIGZpZWxkLgotCi0gICogb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIG5vdyBjbGVhcmx5IHN0YXRlcyB0aGF0Ci0gICAgdGhlIG9yZGVyIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgotCi0gICogQWRkZWQgMiBuZXcgQVBJcyBvbiBKYXZhQ29udmVudGlvbnMgZm9yIGNsYXNzcGF0aCB2YWxpZGF0aW9uLgotICAgICAgICAgLSBJSmF2YU1vZGVsU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgsIElQYXRoIG91dHB1dExvY2F0aW9uKSAKLSAgICAgICAgIC0gSUphdmFNb2RlbFN0YXR1cyB2YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGJvb2xlYW4gY2hlY2tTb3VyY2VBdHRhY2htZW50KSAKLSAKLSAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZVTkNUSU9OQUxJVFkgQ0hBTkdFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgCi0gICogQ29kZUFzc2lzdCBwcm92aWRlcyB2YXJpYWJsZSBuYW1lIHN1Z2dlc3Rpb25zLgotICAqIENvZGVBc3Npc3QgcHJvdmlkZXMgYXJndW1lbnQgbmFtZXMgaW4gbWV0aG9kIGNvbXBsZXRpb25zLgotICAqIENvZGVBc3Npc3QgY29tcGxldGVzIG9uIG1ldGhvZCBkZWNsYXJhdGlvbnMgKGp1c3QgZW50ZXIgc2VsZWN0b3IgcHJlZml4KSAgCi0gICogUHJvamVjdCBjYW4gY29udHJpYnV0ZSBtb3JlIHRoYW4gdGhlaXIgb3V0cHV0IGZvbGRlciwgdXNpbmcgZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMuCi0gICogQ29kZUFzc2lzdCBpbnNlcnRzIHF1YWxpZmljYXRpb24gb24gZmllbGQvbWV0aG9kL3R5cGUgcmVmZXJlbmNlcyBpbiBjYXNlIG9mIGFtYmlndWl0aWVzIChvcHRpb25hbGx5IHRoZXNlCi0gICAgcXVhbGlmaWNhdGlvbiBjYW4gYmUgZm9yY2VkIHRvIG9jY3VyKS4KLSAgKiBDb2RlQXNzaXN0IG9wdGlvbmFsbHkgcGVyZm9ybXMgdmlzaWJpbGl0eSBjaGVja3MgKHNlZSBKYXZhQ29yZSBvcHRpb246ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIikuCi0gICogT3Blbk9uU2VsZWN0aW9uIGNhbiBub3cgbG9jYXRlIHNlbGVjdGVkIGRlY2xhcmF0aW9ucy4KLSAgKiBTZWFyY2ggY2FuIG5hcnJvdyBmaWVsZCByZWFkL3dyaXRlIGFjY2Vzcy4KLSAgKiBBc3NlcnRpb25zIHN1cHBvcnQgZW5hYmxlZDogYnkgZGVmYXVsdCB0aGUgY29tcGlsZXIgaXMgMS4zIGNvbXBsaWFudCwgYnV0IGl0IGNhbiAKLSAgICBvcHRpb25hbGx5IGJlIHR1cm5lZCBpbnRvIHNvdXJjZSAxLjQgbW9kZSBjZi4gSmF2YUNvcmUgb3B0aW9ucy4KLSAgKiBFdmFsdWF0aW9uIGluIGJpbmFyaWVzIGlzIGZ1bmN0aW9uYWwKLSAgKiBTZWFyY2ggZm9yIHJlZmVyZW5jZXMgbm93IGZpbmRzIHJlc3VsdHMgaW4gYmluYXJpZXMuIEluZGV4ZXMgaW4gb2xkIHdvcmtzcGFjZXMgYXJlIHJlY29tcHV0ZWQgd2hlbiByZXN0YXJ0ZWQgCi0gICAgIHdoaWNoIG1heSByZXN1bHQgaW4gbG9uZ2VyIHN0YXJ0dXAgdGltZXMuCi0gICogU2VhcmNoIGluIGlubmVyLWNsYXNzZXMgbm93IHdvcmtzLiBJbmRleGVzIGFyZSByZWNvbXB1dGVkIGF1dG9tYXRpY2FsbHkgb24gc3RhcnQtdXAuCi0gCi0gICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlIGluaXQvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkYjZlOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3ZhcmlhYmxlIGluaXQvQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGFsbCBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXJzLgotICogQ2xhc3NwYXRoIHZhcmlhYmxlIGluaXRpYWxpemVycyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICogIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyB0byBpbXBsZW1lbnQgYSBzcGVjaWZpYyBjbGFzc3BhdGgKLSAqIHZhcmlhYmxlIGluaXRpYWxpemVyLiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQKLSAqIGNvbnN0cnVjdG9yIGFuZCBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmluaXRpYWxpemU8L2NvZGU+LgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCaW5kcyBhIHZhbHVlIHRvIHRoZSB3b3Jrc3BhY2UgY2xhc3NwYXRoIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsCi0gICAgICogb3IgZmFpbHMgc2lsZW50bHkgaWYgdGhpcyBjYW5ub3QgYmUgZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlIGNsYXNzcGF0aCB2YXJpYWJsZQotICAgICAqICAgIHRoYXQgcmVxdWlyZXMgYSBiaW5kaW5nCi0gICAgICogQHNlZSBKYXZhQ29yZSNzZXRDbGFzc3BhdGhWYXJpYWJsZSAgICAgCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgdmFyaWFibGUpOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWY2YzAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5Xb3JrYmVuY2ggRXh0ZW5zaW9uIFBvaW50IC0gQ2xhc3NwYXRoIFZhcmlhYmxlIEluaXRpYWxpemVyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLQotPGNlbnRlcj4KLTxoMT4KLUNsYXNzcGF0aCBWYXJpYWJsZSBJbml0aWFsaXplcjwvaDE+PC9jZW50ZXI+Ci08Yj48aT5JZGVudGlmaWVyOiA8L2k+PC9iPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIKLTxwPjxiPjxpPkRlc2NyaXB0aW9uOiA8L2k+PC9iPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIHBsdWctaW4gdG8KLXJlZ2lzdGVyIGNvZGUgZm9yIHByb2dyYW1tYXRpY2FsbHkgaW5pdGlhbGl6aW5nIGEgcGFydGljdWxhciBuYW1lZCBjbGFzc3BhdGgKLXZhcmlhYmxlLgotPHA+PGI+PGk+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9pPjwvYj4KLTxwPjx0dD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhcmlhYmxlJm5ic3A7Jm5ic3A7IENEQVRBICNSRVFVSVJFRDwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjbGFzcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotQ0RBVEEgI1JFUVVJUkVEPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7ID48L3R0PgotPHVsPgotPGxpPgotPGI+dmFyaWFibGU8L2I+IC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCB2YXJpYWJsZTwvbGk+Ci0KLTxsaT4KLTxiPmNsYXNzPC9iPiAtIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBjbGFzc3BhdGggdmFyaWFibGUgaW5pdGlhbGl6ZXIuCi1UaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgPHR0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXI8L3R0Pgotd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHR0PmluaXRpYWxpemUoU3RyaW5nKTwvdHQ+Ci1tZXRob2QuPC9saT4KLTwvdWw+Ci08Yj48aT5FeGFtcGxlczo8L2k+PC9iPgotPGJyPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBJQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciBmb3IKLWEgY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVkICJGT08iOgotPHA+PHR0PiZsdDtleHRlbnNpb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2YXJpYWJsZT0iRk9PIjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjbGFzcz0iY29tLmV4YW1wbGUuQ1BWSW5pdGlhbGl6ZXIiLz48L3R0PgotPGJyPjx0dD4mbHQ7L2V4dGVuc2lvbj48L3R0PgotPHA+PGI+PGk+U3VwcGxpZWQgSW1wbGVtZW50YXRpb246PC9pPjwvYj4KLTxicj5Ob25lLgotPGJyPiZuYnNwOwotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L3VuaW5pdC1jbGFzc3BhdGgtdmFycy5odG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC92YXJpYWJsZSBpbml0L3VuaW5pdC1jbGFzc3BhdGgtdmFycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg0ZmIwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL25vdGVzL3IyLjAvdmFyaWFibGUgaW5pdC91bmluaXQtY2xhc3NwYXRoLXZhcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5KRFQgLSBVbmluaXRpYWxpemVkIENsYXNzcGF0aCBWYXJpYWJsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj4KLVVuaW5pdGlhbGl6ZWQgQ2xhc3NwYXRoIFZhcmlhYmxlczwvaDI+Ci1MYXN0IHJldmlzZWQgMTE6MzAgTW9uZGF5IE5vdmVtYmVyIDE5LCAyMDAxCi08cD5PcmlnaW5hbCB3b3JrIGl0ZW06ICJCdWlsZGluZyB3aXRoIHVuaW5pdGlhbGl6ZWQgY2xhc3MgcGF0aCB2YXJpYWJsZXMuCi1Zb3UgY2FuIGFkZCBhIHByb2plY3QgZnJvbSB0aGUgcmVwb3NpdG9yeSB0aGF0IGdldHMgYnVpbHQgd2l0aG91dCBoYXZpbmcKLXRoZSBKYXZhVUkgdGhhdCBpbml0aWFsaXplcyB0aGUgSlJFXyB2YXJpYWJsZXMgaXMgYWN0aXZhdGVkLiIKLTxwPlRoZSBnZW5lcmFsIHByb2JsZW0gaXMgdGhhdCBhIGNsYXNzcGF0aCB2YXJpYWJsZSBjYW4gc2hvdyB1cCBpbiBhIHByb2plY3QncwotY2xhc3NwYXRoIHF1aXRlIGVhcmx5IChmb3IgZXhhbXBsZSwgd2hlbiBhIHByb2plY3QgaXMgbG9hZGVkIGZyb20gYSByZXBvc2l0b3J5KSwKLWFuZCB3ZWxsIGJlZm9yZSB0aGUgYWN0aXZhdGlvbiBvZiBhIHBsdWctaW4gdGhhdCBtaWdodCB3aWxsaW5nbHkgaW5pdGlhbGl6ZQotdGhlIHdvcmtzcGFjZSdzIGJpbmRpbmcgZm9yIHRoYXQgdmFyaWFibGUuIFdpdGhvdXQgYSBiaW5kaW5nIGZvciBhbGwgdGhlCi12YXJpYWJsZXMgbWVudGlvbmVkIG9uIGl0cyBidWlsZCBjbGFzc3BhdGgsIHRoZSBwcm9qZWN0IGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkKLWJ1aWx0LiBIb3dldmVyLCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXNlIHZhcmlhYmxlcwotY2FuIGdldCBpbml0aWFsaXplZC4KLTxwPkZvciB2YXJpYWJsZXMgdGhhdCB0aGUgZGV2ZWxvcGVyIChvciBoaXMgdGVhbSBtYXRlcykgaW50cm9kdWNlcyBleHBsaWNpdGx5LAotdGhpcyBpcyBub3QgYSBwYXJ0aWN1bGFyIHByb2JsZW0uIFRoZSBkZXZlbG9wZXIncyBjb3JyZWN0aXZlIGFjdGlvbiBpcwotdG8gZXhwbGljaXRseSBlc3RhYmxpc2ggYSBiaW5kaW5nIGZvciB0aGUgdmFyaWFibGUsIGFuZCB0aGVuIHJlYnVpbGQuCi08cD5Ib3dldmVyLCB0aGVyZSBpcyBhIHByb2JsZW0gZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGFuZCBvcmRpbmFscmlseQotaW5pdGlhbGl6ZWQgYnkgc29tZSB0b29sLiBGb3IgdGhlc2UsIHRoZSBkZXZlbG9wZXIgbWF5IG5vdCBiZSBpbiBhIHBvc2l0aW9uCi10byBleHBsaWNpdGx5IGVzdGFibGlzaCBhIGJpbmRpbmcgZm9yIHRoZSB2YXJpYWJsZSwgYW5kIG1pZ2h0IG5vdCBldmVuCi1rbm93IHdoaWNoIHBsdWctaW4gbmVlZHMgdG8gYmUgYWN0aXZhdGVkLgotPHA+VGhpcyBwcm9ibGVtIGlzIGEgc3ltcHRvbSBvZiBhIG1vcmUgd2lkZXNwcmVhZCBwcm9ibGVtLiBGb3IgZXhhbXBsZSwKLVBERSBzdWZmZXJzIHRoaXMgcHJvYmxlbSB3aXRoIHRoZSAiRUNMSVBTRV9IT01FIiB2YXJpYWJsZS4KLTxoMz4KLVByb3Bvc2FsPC9oMz4KLVdlIGludHJvZHVjZSBhIEpEVCBDb3JlIGV4dGVuc2lvbiBwb2ludCA8dHQ+PGEgaHJlZj0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5odG1sIj5vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC9hPjwvdHQ+Ci10aHJvdWdoIHdoaWNoIHBsdWctaW5zIGNhbiBzdXBwbHkgaW5pdGlhbGl6ZXIgY29kZSBmb3IgbmFtZWQgY2xhc3NwYXRoCi12YXJpYWJsZXMuCi08cD5FeGFtcGxlcyBvZiBob3cgdGhpcyB3b3VsZCBiZSB1c2VkOgotPHA+PHR0PiZsdDtleHRlbnNpb248L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcG9pbnQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciI+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhcmlhYmxlPSJFQ0xJUFNFX0hPTUUiPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzPSJvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS5FY2xpcHNlSG9tZUluaXRpYWxpemVyIi8+PC90dD4KLTxicj48dHQ+Jmx0Oy9leHRlbnNpb24+PC90dD4KLTxwPjx0dD4mbHQ7ZXh0ZW5zaW9uPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBvaW50ID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2YXJpYWJsZT0iSlJFX0xJQiI8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5DUFZJbml0aWFsaXplciIvPjwvdHQ+Ci08YnI+PHR0PiZsdDsvZXh0ZW5zaW9uPjwvdHQ+Ci08cD5UaGUgbWVjaGFuaXNtIHdvdWxkIHdvcmsgYXMgZm9sbG93czoKLTx1bD4KLTxsaT4KLUl0IGFwcGxpZXMgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgYSBjbGFzc3BhdGggY29udGFpbmluZyBhbiB1bmJvdW5kIGNsYXNzcGF0aAotdmFyaWFibGUgaXMgYmVpbmcgcmVzb2x2ZWQgKGUuZy4sIGJ5IEphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkKLW9yIElKYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCkuPC9saT4KLQotPGxpPgotSWYgY2xhc3NwYXRoIHZhcmlhYmxlIGlzIHVuYm91bmQgaW4gdGhlIHdvcmtzcGFjZSwgaXQgYXNrIGlmIHRoZXJlIGlzIGEKLXJlZ2lzdGVyZWQgaW5pdGlhbGl6ZXIgZm9yIHRoYXQgdmFyaWFibGUuPC9saT4KLQotPGxpPgotSWYgdGhlcmUgaXMgYW4gaW5pdGlhbGl6ZXIsIGl0IGlzIGludm9rZWQgKGl0IGlzIHBhc3NlZCB0aGUgbmFtZSBvZiB0aGUKLWNsYXNzcGF0aCB2YXJpYWJsZSB0aGF0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkKS48L2xpPgotCi08bGk+Ci1UaGUgaW5pdGlhbGl6ZXIgcmV0dXJucyBubyByZXN1bHQ7IGl0IHNpbXBseSBoYXMgdGhlIHNpZGUgZWZmZWN0IGluaXRpYWxpemluZwotdGhlIHZhcmlhYmxlIGlmIGl0IGNhbi48L2xpPgotCi08bGk+Ci1BZnRlciB0aGUgaW5pdGlhbGl6ZXIgaXMgaW52b2tlZCwgdGhlIHJlc29sdXRpb24gcHJvY2VzcyBwcm9jZWVkcyB3aGV0aGVyCi1vciBub3QgdGhlIHZhcmlhYmxlIGlzIGJvdW5kIG9yIHVuYm91bmQuPC9saT4KLQotPGxpPgotSWYgdGhlcmUgYXJlIG11bHRpcGxlIGluaXRpYWxpemVycyByZWdpc3RlcmVkIGZvciB0aGUgc2FtZSB2YXJpYWJsZSwgb25seQotdGhlIGZpcnN0IG9uZSBpcyB1c2VkICh0aGlzIG1lY2hhbmltcyBkb2VzIG5vdCBzdXBwb3J0IGFsdGVybmF0ZSBvciBoaWVyYXJjaGljYWwKLWNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplcnMpLjwvbGk+Ci08L3VsPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLW5vdGVzLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLW5vdGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjE0ODkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC93b3Jrc3BhY2Ugc3RydWN0dXJlL3dzLXN0cnVjdHVyZS1ub3Rlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtlbl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5KRFQgLSBOb3RlcyBvbiBXb3Jrc3BhY2Ugc3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+Ci1Ob3RlcyBvbiBXb3Jrc3BhY2UgU3RydWN0dXJlPC9oMj4KLUxhc3QgcmV2aXNlZCZuYnNwOyAxNzowMCBXZWRuZXNkYXkgU2VwdGVtYmVyIDI2LCAyMDAxCi08cD5JbiBsYXJnZSBKYXZhIGRldmVsb3BtZW50IGVmZm9ydHMsIGl0IGlzIG5vdCB1bmNvbW1vbiBmb3Igc2V2ZXJhbCBpbnRlci1yZWxhdGVkCi1wcm9qZWN0cyB0byBiZSB1bmRlciBkZXZlbG9wbWVudCBhdCB0aGUgc2FtZSB0aW1lLiBGb3IgdGhlIHB1cnBvc2VzIG9mCi10aGlzIGRpc2N1c3Npb24sIGFzc3VtZSB0ZWFtcywgcHJvamVjdHMsIGFuZCBjb21wb25lbnRzIGFsaWduLiBBbGwgdGVhbXMKLWFyZSB3b3JraW5nIGluIHRoZSBzYW1lIHJlcG9zaXRvcnksIHNoYXJpbmcgYSBzZXQgb2YgcHJvamVjdHMgdmlhIGEgc2luZ2xlCi1zdHJlYW07IGVhY2ggcHJvamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIGEgc2luZ2xlIGNvbXBvbmVudC4KLTxwPk91ciBleGFtcGxlIHNjZW5hcmlvIGhhcyA0IHByb2plY3RzOiBQMSwgUDIsIFAzLCBhbmQgUDQsIHdpdGggY29tcG9uZW50cwotQzEgdGhyb3VnaCBDNCwgcmVzcGVjdGl2ZWx5LiBDMSBpcyB0aGUgb25seSBjb21wb25lbnQgdGhhdCBkb2VzIG5vdCBkZXBlbmQKLW9uIGFueSBvdGhlcnM7IEMyIGRlcGVuZHMgb24gQzE7IEMzIGRlcGVuZHMgb24gQzEgYW5kIEMyOyBDNCBkZXBlbmRzIG9uCi1DMiAoTi5CLiwgYnV0IG5vdCBvbiBDMSBvciBDMykuCi08cD5XZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSBDVlMgcmVwb3NpdG9yeSB0aGF0IGNvbnRhaW5zIGFsbCA0Ci1wcm9qZWN0cyBpbiBzb3VyY2UgY29kZSBmb3JtLiBJbiBhZGRpdGlvbiwgd2UgYXNzdW1lIHRoYXQgY2VudHJhbGl6ZWQgYnVpbGRzCi1hcmUgZG9uZSBwZXJpb2RpY2FsbHkgYW5kIHBvc3RlZCB0byBhIHdlYiBzZXJ2ZXIgd2hlcmUgdGhleSBjYW4gYmUgZG93bmxvYWRlZAotYXMgYSB1bml0LiBUaGVzZSBkb3dubG9hZHMgdGFrZSB0aGUgZm9ybSBvZiBhIHppcHBlZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMKLWEgYmluYXJ5IGphciBmb3IgZWFjaCBjb21wb25lbnQsIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzb3VyY2UgamFycyB0bwotYWlkIGRlYnVnZ2luZy4KLTxwPldlIGFzc3VtZSB0aGF0IGVhY2ggZGV2ZWxvcGVyIGNhbiBkb3dubG9hZCBidWlsZHMgZnJvbSB0aGUgd2ViIHNlcnZlcgotYW5kIGluc3RhbGwgdGhlbSBvbiB0aGVpciBsb2NhbCBtYWNoaW5lLiBUbyBkbyB0aGVpciB3b3JrLCB0aGV5IHNldCB1cAotRWNsaXBzZSB3b3Jrc3BhY2VzIG9uIHRoZWlyIGxvY2FsIG1hY2hpbmUgYW5kIGxvYWQgb25lIG9yIG1vcmUgcHJvamVjdHMKLWZyb20gdGhlIENWUyByZXBvc2l0b3J5LiBUaGV5IGFsc28gdXBncmFkZSB0aGVpciB3b3Jrc3BhY2UgZnJvbSB0aW1lIHRvCi10aW1lIGFzIG5ldyBidWlsZHMgYmVjb21lIGF2YWlsYWJsZS4KLTxwPlRoZXNlIGFzc3VtcHRpb25zIGFyZSBhIHBsYXVzaWJsZSBhYnN0cmFjdGlvbiBvZiB3aGF0IGdvZXMgb24gaW4gb3Blbgotc291cmNlIHByb2plY3RzLiAoSXQgaXMgYW4gb3BlbiBxdWVzdGlvbiBhcyB0byBob3cgY2xvc2VseSB0aGUgRWNsaXBzZQotcHJvamVjdCB3aXRoIGZvbGxvdyB0aGlzIHdvcmsgbW9kZWwuKQotPGgzPgotRGV2ZWxvcGluZywgVXNpbmcsIGFuZCBQYXRjaGluZyBDb21wb25lbnRzPC9oMz4KLVRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgbm9ybSBmb3Igc29tZW9uZSBhY3RpdmVseSA8Yj5kZXZlbG9waW5nPC9iPgotYSBjb21wb25lbnQ6Ci08dWw+Ci08bGk+Ci1zb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZm9yIGVudGlyZSBjb21wb25lbnQ8L2xpPgotCi08bGk+Ci1zb3VyY2UgY29kZSBpcyBiZWluZyBicm93c2VkIGFuZCBjaGFuZ2VkPC9saT4KLQotPGxpPgotc291cmNlIGNvZGUgaXMgYmVpbmcgY29tcGlsZWQgcmVndWxhcmx5PC9saT4KLQotPGxpPgotc291cmNlIGNvZGUgY2hhbmdlcyBhcmUgc2hhcmVkIG9jY2FzaW9uYWxseSB3aXRoIG90aGVyIHRlYW0gbWVtYmVyczwvbGk+Ci08L3VsPgotQXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgc3BlY3RydW0gYXJlIGNvbXBvbmVudHMgdGhhdCBhcmUgcGFzc2l2ZWx5IDxiPnVzZWQ8L2I+OgotPHVsPgotPGxpPgotY29tcG9uZW50IGlzIGF2YWlsYWJsZSBhcyBwcmUtY29tcGlsZWQgYmluYXJ5IGxpYnJhcnk8L2xpPgotCi08bGk+Ci1zb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgZm9yIGJyb3dzaW5nIGJ1dCBub3QgZm9yIGVkaXRpbmc8L2xpPgotCi08bGk+Ci1zaW5jZSB1c2VkIGNvbXBvbmVudCBpcyBzdGF0aWMsIG5vIGNoYW5nZXMgdG8gc2hhcmUgd2l0aCBvdGhlciB0ZWFtIG1lbWJlcnM8L2xpPgotPC91bD4KLUNvbXBvbmVudHMgdGhhdCBhcmUgYmVpbmcgPGI+cGF0Y2hlZDwvYj4gYXJlIG9uZSBzdGVwIGZyb20gYmVpbmcgYSB1c2VkCi1jb21wb25lbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiBiZWluZyBhIGNvbXBvbmVudCBiZWluZyBkZXZlbG9wZWQ6Ci08dWw+Ci08bGk+Ci1jb21wb25lbnQgaXMgYXZhaWxhYmxlIGFzIHByZS1jb21waWxlZCBiaW5hcnkgbGlicmFyeTwvbGk+Ci0KLTxsaT4KLXNvdXJjZSBjb2RlIGlzIHNlbGVjdGl2ZWx5IGF2YWlsYWJsZSBmb3IgZWRpdGluZyAocGF0Y2hpbmcpPC9saT4KLQotPGxpPgotcGF0Y2hlZCBzb3VyY2UgY29kZSBpcyBjb21waWxlZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIHByZS1jb21waWxlZCBiaW5hcnk8L2xpPgotCi08bGk+Ci1wYXRjaGVkIHNvdXJjZSBjb2RlIGlzIGZvciBsb2NhbCBjb25zdW1wdGlvbiAobm90IHNoYXJlZCB3aXRoIG90aGVyIHRlYW0KLW1lbWJlcnMpPC9saT4KLTwvdWw+Ci1UaGUgZ2VuZXJhbCBwcm9ibGVtIGNhbiBiZSBzdGF0ZWQgYXMgZm9sbG93czogZWFjaCBkZXZlbG9wZXIgbmVlZHMgdGhlaXIKLW93biB3b3Jrc3BhY2Ugc28gdGhhdCB0aGV5IGNhbiA8aT5kZXZlbG9wPC9pPiB0aGVpciBhc3NpZ25lZCBjb21wb25lbnQuCi1UbyB0byBkbywgdGhleSB3aWxsIG5lZWQgdG8gPGk+dXNlPC9pPiB0aGUgY29tcG9uZW50cyB0aGF0IHRoZWlyIGNvbXBvbmVudAotZGVwZW5kcyBvbiwgYW5kIHBlcmhhcHMgdXNlIHNvbWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudHMgdGhhdCBkZXBlbmQgb24KLXRoZWlycy4gSW4gb3JkZXIgdG8gZG8gdGhlaXIgd29yaywgYSBkZXZlbG9wZXIgbWF5IG5lZWQgdG8gPGk+cGF0Y2g8L2k+Ci1hIGNvbXBvbmVudCB0aGF0IHRoZXkgd291bGQgb3JkaW5hcmlseSBqdXN0IDxpPnVzZTwvaT47IGluIHNvbWUgY2FzZXMsCi10aGV5IG1pZ2h0IGV2ZW4gbmVlZCB0byBhY3RpdmVseSBkZXZlbG9wIGEgY29tcG9uZW50IHRoYXQgdGhleSB3b3VsZCBvcmRpbmFyaWx5Ci1qdXN0IDxpPnVzZTwvaT4uIEhvdyBjYW4gdGhlIGRldmVsb3BlcnMgc3RydWN0dXJlIHRoZWlyIHdvcmtzcGFjZXMgc28gdGhhdAotdGhleSByZXRhaW4gc3VmZmljaWVudCBmbGV4aWJseSB0byBzd2l0Y2ggYmV0d2VlbiB1c2luZyBhbmQgcGF0Y2hpbmcgKG9yCi1kZXZlbG9waW5nKSB0aGVzZSBvdGhlciBjb21wb25lbnRzPwotPHA+VGhlIHZhcmlvdXMgc2NlbmFyaW9zIHByZXNlbnRlZCBiZWxvdyBhcmUgYWxsIHBsYXVzaWJsZSB3b3Jrc3BhY2Ugc2V0dXBzLAotZWFjaCB3aXRoIGNlcnRhaW4gYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlczoKLTx1bD4KLTxsaT4KLTxhIGhyZWY9IiNDb21wb25lbnQgcGx1cyBsaWJyYXJpZXMiPkNvbXBvbmVudCBwbHVzIGxpYnJhcmllczwvYT48L2xpPgotCi08bGk+Ci08YSBocmVmPSIjU291cmNlIGZvciBldmVyeXRoaW5nIj5Tb3VyY2UgZm9yIGV2ZXJ5dGhpbmc8L2E+PC9saT4KLQotPGxpPgotPGEgaHJlZj0iI0NsYXNzcGF0aCB2YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzIj5DbGFzc3BhdGgKLXZhcmlhYmxlcyB0byBzd2l0Y2ggYmV0d2VlbiBsaWJyYXJpZXMgYW5kIHNvdXJjZXM8L2E+PC9saT4KLQotPGxpPgotPGEgaHJlZj0iI1Vuc2hhcmVkIFByb3h5IGxpYnJhcnkgcHJvamVjdHMiPlVuc2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHM8L2E+PC9saT4KLQotPGxpPgotPGEgaHJlZj0iI1NoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIj5TaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0czwvYT48L2xpPgotCi08bGk+Ci08YSBocmVmPSIjU3R1YiBwcm9qZWN0cyI+U3R1YiBwcm9qZWN0czwvYT48L2xpPgotCi08bGk+Ci08YSBocmVmPSIjT3RoZXIgU2NlbmFyaW9zIj5Bc3NvcnRlZCBPdGhlciBTY2VuYXJpb3M8L2E+PC9saT4KLTwvdWw+Ci0KLTxoMz4KLTxhIE5BTUU9IkNvbXBvbmVudCBwbHVzIGxpYnJhcmllcyI+PC9hPkNvbXBvbmVudCBwbHVzIGxpYnJhcmllczwvaDM+Ci0KLTx1bD4KLTxsaT4KLVRlYW0gbWVtYmVyJ3Mgd29ya3NwYWNlIGNvbnRhaW5zIGp1c3QgdGhlIHByb2plY3QgZm9yIHRoZWlyIGNvbXBvbmVudC48L2xpPgotCi08bGk+Ci1FYWNoIHRlYW0gbWVtYmVycyBkb3dubG9hZHMgbGF0ZXN0IGJpbmFyeSBidWlsZCB0byBjOlx0ZW1wXGJ1aWxkXCBvciBzb21lCi1zdWNoIGFuZCBzZXRzIGNsYXNzcGF0aCB2YXJpYWJsZSBCVUlMRCA9IGM6XHRlbXBcYnVpbGRcPC9saT4KLQotPGxpPgotQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBsaWJyYXJpZXMgcmVsYXRpdmUgdG8gQlVJTEQgY2xhc3NwYXRoCi12YXJpYWJsZS48L2xpPgotCi08bGk+Ci1Vc2Ugb2YgY2xhc3NwYXRoIHZhcmlhYmxlIGFsbG93cyBlYWNoIGRldmVsb3BlciB0byBjaG9vc2Ugd2hlcmUgdG8gaW5zdGFsbAotdGhlIGJ1aWxkLjwvbGk+Ci0KLTxsaT4KLUNsYXNzcGF0aCBpbmNsdWRlcyBsaWJyYXJpZXMgZm9yIGFsbCBwcmVyZXF1aXNpdGUgY29tcG9uZW50cy48L2xpPgotCi08bGk+Ci1Qcm86IHNpbXBsZSB3b3Jrc3BhY2Ugc2V0dXAgKGxvYWQgYSBzaW5nbGUgc2hhcmVkIHByb2plY3QgZnJvbSByZXBvc2l0b3J5Ci1hbmQgc2V0IHNpbmdsZSBjbGFzc3BhdGggdmFyaWFibGUpLjwvbGk+Ci0KLTxsaT4KLVBybzogbm8gcmVzdGljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgotCi08bGk+Ci1Qcm86IGVhc3kgdG8gdXBncmFkZSB0byBhbm90aGVyIGJpbmFyeSBidWlsZCAodW56aXAgYnVpbGQgaW4gcGxhY2UsIGFuZAotY2xvc2UgYW5kIHJlb3BlbiBwcm9qZWN0IGluIHdvcmtzcGFjZSB0byBmb3JjZSBhIHJlZnJlc2gpLjwvbGk+Ci0KLTxsaT4KLUNvbjogdW5hYmxlIHRvIHZpZXcgY29kZSBmb3IgYSBjb21wb25lbnQgdGhhdCBpcyBub3QgYSBwcmVyZXF1aXNpdGUgKHJlcXVpcmVzCi1sb2FkaW5nIGFuIGFkZGl0aW9uYWwgcHJvamVjdCkuPC9saT4KLQotPGxpPgotQ29uOiB1bmFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIHByZXJlcXVpc3RlIGNvbXBvbmVudHMgaW4gcHJvcGVyIGNvbnRlbnQKLShjb2RlIGNvbXBsZXRpb24pLjwvbGk+Ci0KLTxsaT4KLUNvbjogc3dpdGNoaW5nIHRvIGRldmVsb3BpbmcgYW5vdGhlciBjb21wb25lbnQgaW52b2x2ZXMgbG9hZGluZyBhbm90aGVyCi1wcm9qZWN0IGFuZCBjaGFuZ2luZyBjbGFzc3BhdGhzIG9uIGRlcGVuZGVudCBjb21wb25lbnRzIChiYWQsIGJlY2F1c2UgdGhlc2UKLWFyZSBzaGFyZWQpLjwvbGk+Ci0KLTxsaT4KLUNvbjogcGF0Y2hpbmcgb25seSB2aWEgc3dpdGNoaW5nIHRvIGFjdGl2ZSBkZXZlbG9wbWVudC48L2xpPgotCi08bGk+Ci1Ob3RlOiB1c2VzIGNsYXNzcGF0aCB2YXJpYWJsZXMgd2hvc2UgdmFsdWUgaXMgYSBsaWJyYXJ5IGphciAod29ya3MgaW4gUjEuMCkuPC9saT4KLQotPGxpPgotTm90ZTogdGhpcyBpcyByb3VnaGx5IHRoZSB3YXkgUERFIDEuMCB3b3Jrcy48L2xpPgotPC91bD4KLXByb2plY3QgUDEgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQMiAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBCVUlMRC9jMS5qYXIrQlVJTEQvYzFzcmMuemlwCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AyL2JpbgotPGJyPnwKLTxicj5wcm9qZWN0IFAzIChzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDMvQzM7IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXA7Ci1CVUlMRC9jMi5qYXIrQlVJTEQvYzJzcmMuemlwCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AzL2JpbgotPGJyPnwKLTxicj5wcm9qZWN0IFA0IChzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDQvQzQ7IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDQvYmluCi08aDM+Ci08YSBOQU1FPSJTb3VyY2UgZm9yIGV2ZXJ5dGhpbmciPjwvYT5Tb3VyY2UgZm9yIGV2ZXJ5dGhpbmc8L2gzPgotCi08dWw+Ci08bGk+Ci1UZWFtIG1lbWJlcidzIHdvcmtzcGFjZSBjb250YWlucyBhbGwgZm91ciBwcm9qZWN0cyBhbmQgd29ya3MgZW50aXJlbHkgZnJvbQotc291cmNlIGNvZGUuPC9saT4KLQotPGxpPgotQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBkZXBlbmRlbnQgcHJvamVjdHMgYnkgbmFtZS48L2xpPgotCi08bGk+Ci1DbGFzc3BhdGggaW5jbHVkZXMgcHJvamVjdHMgZm9yIGFsbCBwcmVyZXF1aXNpdGUgY29tcG9uZW50cy48L2xpPgotCi08bGk+Ci1Qcm86IGFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzLjwvbGk+Ci0KLTxsaT4KLVBybzogYWJsZSB0byBkZXZlbG9wIGFueSBjb21wb25lbnQuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIG5vdGljZSBkb3duc3RyZWFtIGltcGFjdCBvZiBhbnkgY2hhbmdlcyBtYWRlIHNpbmNlIGFsbCBjb21wb25lbnRzCi1hcmUgcHJlc2VudC48L2xpPgotCi08bGk+Ci1Qcm86IGVhc3kgdG8ga2VlcCBjdXJyZW50IChieSBjYXRjaGluZyB1cCB3aXRoIHN0cmVhbSBpbiByZXBvc2l0b3J5KS48L2xpPgotCi08bGk+Ci1Db246IFZlcnkgc2xvdyB3b3Jrc3BhY2Ugc3RhcnR1cCBhbmQgbGFyZ2UgZm9vdHByaW50IGJlY2F1c2UgZW50YWlscyByZWNvbXBpbGluZwotc291cmNlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzLjwvbGk+Ci0KLTxsaT4KLUNvbjogSW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyAoYXV0b21hdGlvbgotcG9zc2libGUpLjwvbGk+Ci0KLTxsaT4KLUNvbjogZGlmZmljdWx0eSBoYW5kbGluZyBwcm9qZWN0cyB3aXRoIHByZWNvbXBpbGVkIGxpYnJhcnkgamFycyB0aGF0IG11c3QKLWJlIGV4cG9ydGVkIGJ1dCBkbyBub3QgZXhpc3QgaW4gc291cmNlIChlLmcuLCB0aGUgRWNsaXBzZSBkZWJ1Z2dlcidzIEpESQotamFyKTwvbGk+Ci0KLTxsaT4KLU5vdGU6IHVzZXMgcmVxdWlyZWQgcHJvamVjdHMgKHdvcmtzIGluIFIxLjApLjwvbGk+Ci08L3VsPgotcHJvamVjdCBQMSAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxL0MxCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AxL2JpbgotPGJyPiZhbXA7Ci08YnI+cHJvamVjdCBQMiAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBwcm9qZWN0IFAxCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AyL2JpbgotPGJyPiZhbXA7Ci08YnI+cHJvamVjdCBQMyAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0Ci1QMgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDQgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QNC9DNDsgcHJvamVjdCBQMgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QNC9iaW4KLTxoMz4KLTxhIE5BTUU9IkNsYXNzcGF0aCB2YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzIj48L2E+Q2xhc3NwYXRoCi12YXJpYWJsZXMgdG8gc3dpdGNoIGJldHdlZW4gbGlicmFyaWVzIGFuZCBzb3VyY2VzPC9oMz4KLQotPHVsPgotPGxpPgotVGVhbSBtZW1iZXIncyB3b3Jrc3BhY2UgY29udGFpbnMganVzdCB0aGUgcHJvamVjdCBmb3IgdGhlaXIgY29tcG9uZW50LjwvbGk+Ci0KLTxsaT4KLUVhY2ggdGVhbSBtZW1iZXJzIGRvd25sb2FkcyBsYXRlc3QgYmluYXJ5IGJ1aWxkIHRvIGM6XHRlbXBcYnVpbGRcIG9yIHNvbWUKLXN1Y2ggYW5kIHNldHMgZmFtaWx5IG9mIGNsYXNzcGF0aCB2YXJpYWJsZXMsIG9uZSBwZXIgY29tcG9uZW50OjwvbGk+Ci0KLTx1bD4KLTxsaT4KLVAxX0xJQiA9IGM6XHRlbXBcYnVpbGRcYzEuamFyPC9saT4KLQotPGxpPgotUDJfTElCID0gYzpcdGVtcFxidWlsZFxjMi5qYXI8L2xpPgotCi08bGk+Ci1QM19MSUIgPSBjOlx0ZW1wXGJ1aWxkXGMzLmphcjwvbGk+Ci0KLTxsaT4KLVA0X0xJQiA9IGM6XHRlbXBcYnVpbGRcYzQuamFyPC9saT4KLTwvdWw+Ci0KLTxsaT4KLUJ1aWxkIGNsYXNzcGF0aCByZWZlcmVuY2VzIGFuIGluZGl2aWR1YWwgY29tcG9uZW50IHZpYSBhIGNsYXNzcGF0aCB2YXJpYWJsZS48L2xpPgotCi08bGk+Ci1Vc2Ugb2YgY2xhc3NwYXRoIHZhcmlhYmxlIGFsbG93cyBlYWNoIGRldmVsb3BlciB0byBjaG9vc2Ugd2hlcmUgdG8gaW5zdGFsbAotdGhlIGJ1aWxkLjwvbGk+Ci0KLTxsaT4KLUNsYXNzcGF0aCBpbmNsdWRlcyBlbnRyaWVzIGZvciBhbGwgcHJlcmVxdWlzaXRlIGNvbXBvbmVudHMuPC9saT4KLQotPGxpPgotUHJvOiBzd2l0Y2ggdG8gZGV2ZWxvcG1lbnQgaW52b2x2ZXMgbG9hZGluZyBhbiBhZGRpdGlvbmFsIHByb2plY3QgaW50bwotd29ya3NwYWNlIGFuZCByZWJpbmRpbmcgYSBzaW5nbGUgY2xhc3NwYXRoIHZhcmlhYmxlIHRvIHJlZmVyIHRvIHRoYXQgcHJvamVjdC4KLUZvciBleGFtcGxlLCBsb2FkIHByb2plY3QgUDIgYW5kIHJlYmluZCBQMl9MSUIgPSAvUDIuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKHVuemlwIGJ1aWxkIGluIHBsYWNlLCBhbmQKLWNsb3NlIGFuZCByZW9wZW4gcHJvamVjdCBpbiB3b3Jrc3BhY2UgdG8gZm9yY2UgYSByZWZyZXNoKS48L2xpPgotCi08bGk+Ci1Db246IGRpZmZpY3VseSBhdHRhY2hpbmcgZGVidWcgc291cmNlIHRvIGxpYnJhcnkgamFyPC9saT4KLQotPGxpPgotQ29uOiBvbmx5IHdvcmtzIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIGxpYnJhcnkgamFyIHBlciBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLUNvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIGEgc2luZ2xlIHNoYXJlZCBwcm9qZWN0IGFuZCBtdWx0aXBsZQotdmFyaWFibGUgYmluZGluZ3MgKGF1dG9tYXRpb24gcmVxdWlyZWQpLjwvbGk+Ci0KLTxsaT4KLUNvbjogY2xhc3NwYXRoIHZhcmlhYmxlIG5hbWVzIG11c3QgYmUgYWdyZWVkIG9uIGFjcm9zcyBjb21wb25lbnRzLjwvbGk+Ci0KLTxsaT4KLUNvbjogdW5hYmxlIHRvIHZpZXcgY29kZSBmb3IgYSBjb21wb25lbnQgdGhhdCBpcyBub3QgYSBwcmVyZXF1aXNpdGUgKHJlcXVpcmVzCi1sb2FkaW5nIGFuIGFkZGl0aW9uYWwgcHJvamVjdCkuPC9saT4KLQotPGxpPgotQ29uOiB1bmFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIHByZXJlcXVpc3RlIGNvbXBvbmVudHMgaW4gcHJvcGVyIGNvbnRlbnQKLShjb2RlIGNvbXBsZXRpb24pLjwvbGk+Ci0KLTxsaT4KLU5vdGU6IHVzZXMgY2xhc3NwYXRoIHZhcmlhYmxlcyB3aG9zZSB2YWx1ZSBpcyBlaXRoZXIgYSBwcm9qZWN0IG9yIGEgbGlicmFyeQotKGluIFIxLjAsIEpEVCBjb3JlIHN1cHBvcnRzIHRoZXNlIGJ1dCBKRFQgVUkgZG9lcyBub3QgZXhwb3NlKS48L2xpPgotPC91bD4KLXByb2plY3QgUDEgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQMiAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AyL0MyOyBQMV9MSUIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDIvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDMgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgUDFfTElCOyBQMl9MSUIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDQgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QNC9DNDsgUDJfTElCCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgotPGgzPgotPGEgTkFNRT0iVW5zaGFyZWQgUHJveHkgbGlicmFyeSBwcm9qZWN0cyI+PC9hPlVuc2hhcmVkIFByb3h5IGxpYnJhcnkgcHJvamVjdHM8L2gzPgotCi08dWw+Ci08bGk+Ci1UZWFtIG1lbWJlcidzIHdvcmtzcGFjZSBjb250YWlucyBhIHByb2plY3QgZm9yIGVhY2ggY29tcG9uZW50LjwvbGk+Ci0KLTxsaT4KLU1haW4gcHJvamVjdCBpcyBpbiBzb3VyY2UgYW5kIGlzIHNoYXJlZCB2aWEgdGhlIHJlcG9zaXRvcnkuPC9saT4KLQotPGxpPgotQWxsIG90aGVyIHByb2plY3RzIGluIHdvcmtzcGFjZSBhcmUgcHJveHkgbGlicmFyeSBwcm9qZWN0cyAoc2FtZSBuYW1lIGFzCi1zb3VyY2UgcHJvamVjdDsgY29udGFpbnMgbm8gc291cmNlIGNvZGU7IG5vdCBzaGFyZWQgdmlhIHJlcG9zaXRvcnkpLjwvbGk+Ci0KLTxsaT4KLUVhY2ggdGVhbSBtZW1iZXJzIGRvd25sb2FkcyBsYXRlc3QgYmluYXJ5IGJ1aWxkIHRvIGM6XHRlbXBcYnVpbGRcIG9yIHNvbWUKLXN1Y2ggYW5kIHNldHMgY2xhc3NwYXRoIHZhcmlhYmxlIEJVSUxEID0gYzpcdGVtcFxidWlsZFw8L2xpPgotCi08bGk+Ci1CdWlsZCBjbGFzc3BhdGggZXhwb3J0cyBsaWJyYXJpZXMgcmVsYXRpdmUgdG8gQlVJTEQgY2xhc3NwYXRoIHZhcmlhYmxlLjwvbGk+Ci0KLTxsaT4KLVVzZSBvZiBjbGFzc3BhdGggdmFyaWFibGUgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvIGNob29zZSB3aGVyZSB0byBpbnN0YWxsCi10aGUgYnVpbGQuPC9saT4KLQotPGxpPgotQnVpbGQgY2xhc3NwYXRoIHJlZmVyZW5jZXMgaW5kaXZpZHVhbCBkZXBlbmRlbnQgcHJvamVjdHMgYnkgbmFtZS48L2xpPgotCi08bGk+Ci1Qcm86IGFibGUgdG8gYnJvd3NlIGNvZGUgZm9yIGFsbCBjb21wb25lbnRzIGluIGNvbnRleHQuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIHN3aXRjaCB0byBhbm90aGVyIGJpbmFyeSBidWlsZC48L2xpPgotCi08bGk+Ci1Qcm86IHN3aXRjaCB0byBwYXRjaGluZyBpbnZvbHZlcyBhZGRpbmcgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyB0byBub24tc2hhcmVkCi1wcm9qZWN0LCBwb3B1bGF0aW5nIHdpdGggc2VsZWN0ZWQgc291cmNlIGZpbGVzLCBhbmQgYnVpbGRpbmc7IG5vIG90aGVyCi1jbGFzc3BhdGhzIG5lZWQgdG8gYmUgY2hhbmdlZC48L2xpPgotCi08bGk+Ci1Qcm86IHN3aXRjaCB0byBkZXZlbG9wbWVudCBpbnZvbHZlcyBsb2FkaW5nIGFuIGFkZGl0aW9uYWwgc2hhcmVkIHByb2plY3QKLWludG8gd29ya3NwYWNlIG92ZXIgdG9wIG9mIG5vbi1zaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0OyBubyBjbGFzc3BhdGhzCi1uZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKHVuemlwIGJ1aWxkIGluIHBsYWNlLCBhbmQKLWNsb3NlIGFuZCByZW9wZW4gcHJvamVjdCBpbiB3b3Jrc3BhY2UgdG8gZm9yY2UgYSByZWZyZXNoKS48L2xpPgotCi08bGk+Ci1Db246IGluaXRpYWwgd29ya3NwYWNlIHNldHVwIGludm9sdmluZyBtdWx0aXBsZSBub24tc2hhcmVkIGFuZCBzaGFyZWQgcHJvamVjdHMKLShhdXRvbWF0aW9uIHJlcXVpcmVkOyBlLmcuLCBwcmVjb25zdHJ1Y3RlZCBiYXNlIHdvcmtzcGFjZSkuPC9saT4KLQotPGxpPgotQ29uOiBwcm9qZWN0IGhvbGRpbmcgY29tcG9uZW50IHVuZGVyIGRldmVsb3BtZW50IGlzIGxvc3QgaW4gc2VhIG9mIHByb3h5Ci1saWJyYXJ5IHByb2plY3RzLjwvbGk+Ci0KLTxsaT4KLVBybzogbm8gcmVzdHJpY3Rpb24gb24gbnVtYmVyIG9mIGphcnMgcGVyIHByb2plY3QuPC9saT4KLQotPGxpPgotTm90ZTogdGhlIGV4cG9ydGVkIGxpYnJhcmllcyBhcmUgZXh0ZXJuYWwgdG8gdGhlIHByb2plY3QuPC9saT4KLQotPGxpPgotTm90ZTogdXNlcyBsaWJyYXJ5IHByb2plY3RzIChwcm9wb3NlZCBmb3IgUjIuMCkuPC9saT4KLTwvdWw+Ci1UaGUgYmFzZSB3b3Jrc3BhY2UgZm9yIGRldmVsb3BlcnMgb24gYWxsIHRlYW1zIGxvb2tzIGxpa2U6Ci08cD5wcm9qZWN0IFAxIChub3Qgc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXAKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDIgKG5vdCBzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzIuamFyK0JVSUxEL2Myc3JjLnppcDsKLXByb2plY3QgUDEKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDMgKG5vdCBzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzMuamFyK0JVSUxEL2Mzc3JjLnppcDsKLXByb2plY3QgUDE7IHByb2plY3QgUDIKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDQgKG5vdCBzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzQuamFyK0JVSUxEL2Mzc3JjLnppcDsKLXByb2plY3QgUDIKLTxwPk5vbmUgb2YgdGhlc2UgcHJvamVjdHMgYXJlIHNoYXJlZDsgaG93ZXZlciwgdGhleSBoYXZlIHRoZSBzYW1lIG5hbWVzCi1hcyB0aGUgc291cmNlIHByb2plY3RzIGluIHJlcG9zaXRvcnkuIFRoaXMgbWVhbnMgdGhhdCBhbnkgb2YgdGhlIGxpYnJhcnkKLXByb2plY3RzIGNhbiBiZSByZXBsYWNlZCBieSBsb2FkaW5nIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBwcm9qZWN0IGZyb20KLXRoZSByZXBvc2l0b3J5LiAoTm9uZSBvZiB0aGUgb3RoZXIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBuZWVkIHRvIGNoYW5nZS4pCi08cD5wcm9qZWN0IFAxIChzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDIgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9DMjsgcHJvamVjdCBQMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMi9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQMyAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0Ci1QMgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQNCAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgotPHA+UmVnYXJkaW5nIGF1dG9tYXRpb24sIHRoZSBjZW50cmFsaXplZCBidWlsZCBjb3VsZCBjcmVhdGUgYSBzaW1wbGUgWE1MCi1kb2N1bWVudCBkZXNjcmliaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgZm9yIHRoZSB3b3Jrc3BhY2UuCi1HaXZlbiB0aGlzIGRvY3VtZW50LCBhIHNwZWNpYWwgcHVycG9zZSBwbHVnLWluIGNvdWxkIGJlIHdyaXR0ZW4gdGhhdCB3b3VsZAotY3JlYXRlIChvciBtb2RpZnkgZXhpc3RpbmcpIHVuc2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KLTxwPjx0dD4mbHQ7cHJvamVjdHM+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwcm9qZWN0IG5hbWU9IlAxIj48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O25hdHVyZXM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtuYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9uYXR1cmVzPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bGlicmFyaWVzPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQlVJTEQvYzEuamFyIiBzb3VyY2VwYXRoPSJCVUlMRC9jMXNyYy56aXAiCi1leHBvcnQ9InRydWUiLz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9saWJyYXJpZXM+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvcHJvamVjdD48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3Byb2plY3QgbmFtZT0iUDIiPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bmF0dXJlczwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O25hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L25hdHVyZXM+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtsaWJyYXJpZXM+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0mbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJCVUlMRC9jMi5qYXIiIHNvdXJjZXBhdGg9IkJVSUxEL2Myc3JjLnppcCIKLWV4cG9ydD0idHJ1ZSIvPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InByb2plY3QiIHBhdGg9Ii9QMSIvPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2xpYnJhcmllcz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9wcm9qZWN0PjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7cHJvamVjdCBuYW1lPSJQMyI+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtuYXR1cmVzPC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0mbHQ7bmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvbmF0dXJlcz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2xpYnJhcmllcz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkJVSUxEL2MzLmphciIgc291cmNlcGF0aD0iQlVJTEQvYzNzcmMuemlwIgotZXhwb3J0PSJ0cnVlIi8+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0mbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0icHJvamVjdCIgcGF0aD0iL1AxIi8+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0mbHQ7Y2xhc3NwYXRoZW50cnkga2luZD0icHJvamVjdCIgcGF0aD0iL1AyIi8+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvbGlicmFyaWVzPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L3Byb2plY3Q+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwcm9qZWN0IG5hbWU9IlA0Ij48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O25hdHVyZXM8L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtuYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9uYXR1cmVzPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7bGlicmFyaWVzPjwvdHQ+Ci08YnI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwotJmx0O2NsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iQlVJTEQvYzQuamFyIiBzb3VyY2VwYXRoPSJCVUlMRC9jNHNyYy56aXAiCi1leHBvcnQ9InRydWUiLz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSZsdDtjbGFzc3BhdGhlbnRyeSBraW5kPSJwcm9qZWN0IiBwYXRoPSIvUDIiLz48L3R0PgotPGJyPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9saWJyYXJpZXM+PC90dD4KLTxicj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvcHJvamVjdD48L3R0PgotPGJyPjx0dD4mbHQ7L3Byb2plY3RzPjwvdHQ+Ci08aDM+Ci08YSBOQU1FPSJTaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cyI+PC9hPlNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzPC9oMz4KLUluIHRoZSBwcmV2aW91cyBhcHByb2FjaCB0byB1c2luZyBwcm94eSBsaWJyYXJ5IHByb2plY3RzLCB0aGVzZSBwcm9qZWN0cwotd2VyZSBub3QgdW5kZXIgVkNNLiBJbiB0aGlzIHZhcmlhbnQgb2YgaXQsIHRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzIGFyZQotb2J0YWluZWQgZnJvbSBhIHJlcG9zaXRvcnkgYXMgd2VsbC4gV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgcHJveHkgbGlicmFyeQotcHJvamVjdHMgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCByZXBvc2l0b3J5IGZyb20gdGhlIHNvdXJjZSBwcm9qZWN0cy4KLUJ5IGFzc3VtaW5nIHRoZXkncmUgaW4gYSBzZXBhcmF0ZSBiaW5hcnkgcmVwb3NpdG9yeSwgaXQgaXMgZWFzeSB0byB1c2UKLXRoZSBzYW1lIHByb2plY3QgbmFtZXMgZm9yIGJvdGggc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgKGRvaW5nIHNvIGluIHRoZQotc2FtZSByZXBvc2l0b3J5IHdvdWxkIHJlcXVpcmVkIGludHJvZHVjaW5nIG5vbi1zdGFuZGFyZCBiaW5hcnktb25seSBhbmQKLXNvdXJjZS1vbmx5IGJyYW5jaGVzIGluIHRoZSBwcm9qZWN0IHZlcnNpb24gaGlzdG9yaWVzKS4KLTx1bD4KLTxsaT4KLVRlYW0gbWVtYmVyJ3Mgd29ya3NwYWNlIGNvbnRhaW5zIGEgcHJvamVjdCBmb3IgZWFjaCBjb21wb25lbnQuPC9saT4KLQotPGxpPgotTWFpbiBwcm9qZWN0IGlzIGluIHNvdXJjZSBhbmQgaXMgc2hhcmVkIHZpYSB0aGUgcmVwb3NpdG9yeS48L2xpPgotCi08bGk+Ci1BbGwgb3RoZXIgcHJvamVjdHMgaW4gd29ya3NwYWNlIGFyZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzOyBzYW1lIG5hbWUgYXMKLXNvdXJjZSBwcm9qZWN0LCBidXQgaW4gYSBkaWZmZXJlbnQgcmVwb3NpdG9yeS48L2xpPgotCi08bGk+Ci1FYWNoIHByb3h5IGxpYnJhcnkgcHJvamVjdCBjb250YWlucyBhbmQgZXhwb3J0cyBvbmUgb3IgbW9yZSBiaW5hcnkgamFyCi1saWJyYXJpZXMgKHBsdXMgYXR0YWNoZWQgc291cmNlIHppcHMpIGVxdWl2YWxlbnQgdG8gdGhlIHNvdXJjZS48L2xpPgotCi08bGk+Ci1CdWlsZCBjbGFzc3BhdGggcmVmZXJlbmNlcyBpbmRpdmlkdWFsIGRlcGVuZGVudCBwcm9qZWN0cyBieSBuYW1lLjwvbGk+Ci0KLTxsaT4KLVBybzogYWJsZSB0byBicm93c2UgY29kZSBmb3IgYWxsIGNvbXBvbmVudHMuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIHN3aXRjaCB0byBhbm90aGVyIGJpbmFyeSBidWlsZC48L2xpPgotCi08bGk+Ci1Qcm86IHN3aXRjaCB0byBwYXRjaGluZyBpbnZvbHZlcyBhZGRpbmcgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyB0byBzaGFyZWQKLXByb3h5IGxpYnJhcnkgcHJvamVjdCwgcG9wdWxhdGluZyB3aXRoIHNlbGVjdGVkIHNvdXJjZSBmaWxlcywgYW5kIGJ1aWxkaW5nOwotbm8gb3RoZXIgY2xhc3NwYXRocyBuZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KLQotPGxpPgotUHJvOiBzd2l0Y2ggdG8gZGV2ZWxvcG1lbnQgaW52b2x2ZXMgbG9hZGluZyBzaGFyZWQgc291cmNlIHByb2plY3QgaW50bwotd29ya3NwYWNlIG92ZXIgdG9wIG9mIHNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lOwotbm8gY2xhc3NwYXRocyBuZWVkIHRvIGJlIGNoYW5nZWQuPC9saT4KLQotPGxpPgotUHJvOiBlYXN5IHRvIHVwZ3JhZGUgdG8gYW5vdGhlciBiaW5hcnkgYnVpbGQgKGJ5IGNhdGNoaW5nIHVwIHdpdGggYmluYXJ5Ci1zdHJlYW0gaW4gcmVwb3NpdG9yeSkuPC9saT4KLQotPGxpPgotUHJvOiBubyByZXN0cmljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgotCi08bGk+Ci1Qcm86IFByb3h5IGxpYnJhcnkgcHJvamVjdHMgYXJlIGFsc28gdW5kZXIgVkNNLjwvbGk+Ci0KLTxsaT4KLUNvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyAoYXV0b21hdGlvbgotcG9zc2libGUpLjwvbGk+Ci0KLTxsaT4KLUNvbjogQWRkaXRpb25hbCBlZmZvcnQgb2YgYnVpbGRpbmcgYW5kIG1haW50YWluZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cwotaW4gYSBzZXBhcmF0ZSByZXBvc2l0b3J5IChhdXRvbWF0aW9uIHBvc3NpYmxlLCBwZXJoYXBzIGFzIHBhcnQgb2YgY2VudHJhbGl6ZWQKLWJ1aWxkIHByb2Nlc3MpLjwvbGk+Ci0KLTxsaT4KLUNvbjogcHJvamVjdCBob2xkaW5nIGNvbXBvbmVudCB1bmRlciBkZXZlbG9wbWVudCBpcyBsb3N0IGluIHNlYSBvZiBwcm94eQotbGlicmFyeSBwcm9qZWN0cy48L2xpPgotCi08bGk+Ci1Ob3RlOiB0aGUgZXhwb3J0ZWQgbGlicmFyaWVzIGFyZSBpbnRlcm5hbCB0byB0aGUgcHJvamVjdC48L2xpPgotCi08bGk+Ci1Ob3RlOiB1c2VzIGxpYnJhcnkgcHJvamVjdHMgKHByb3Bvc2VkIGZvciBSMi4wKS48L2xpPgotPC91bD4KLVRoZSBiYXNlIHdvcmtzcGFjZSBmb3IgZGV2ZWxvcGVycyBvbiBhbGwgdGVhbXMgbG9va3MgbGlrZToKLTxwPnByb2plY3QgUDEgKHNoYXJlZCB2aWEgYmluYXJ5IHJlcG9zaXRvcnkpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgL1AxL2MxLmphcitCVUlMRC9jMXNyYy56aXAKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDIgKHNoYXJlZCB2aWEgYmluYXJ5IHJlcG9zaXRvcnkpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgL1AyL2MyLmphcitCVUlMRC9jMnNyYy56aXA7Ci1wcm9qZWN0IFAxCi08YnI+JmFtcDsKLTxicj5wcm9qZWN0IFAzIChzaGFyZWQgdmlhIGJpbmFyeSByZXBvc2l0b3J5KQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IC9QMy9jMy5qYXIrQlVJTEQvYzNzcmMuemlwOwotcHJvamVjdCBQMTsgcHJvamVjdCBQMgotPGJyPiZhbXA7Ci08YnI+cHJvamVjdCBQNCAoc2hhcmVkIHZpYSBiaW5hcnkgcmVwb3NpdG9yeSkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCAvUDQvYzQuamFyK0JVSUxEL2M0c3JjLnppcDsKLXByb2plY3QgUDIKLTxwPlRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3RzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIHNvdXJjZSBwcm9qZWN0cywKLWJ1dCBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgcmVwb3NpdG9yeS4KLTxwPnByb2plY3QgUDEgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDIgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDIvQzI7IHByb2plY3QgUDEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDIvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDMgKHNoYXJlZCB2aWEgc291cmNlIHJlcG9zaXRvcnkpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDMvQzM7IHByb2plY3QgUDE7IHByb2plY3QKLVAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1AzL2JpbgotPGJyPnwKLTxicj5wcm9qZWN0IFA0IChzaGFyZWQgdmlhIHNvdXJjZSByZXBvc2l0b3J5KQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgotPGgzPgotPGEgTkFNRT0iU3R1YiBwcm9qZWN0cyI+PC9hPlN0dWIgcHJvamVjdHM8L2gzPgotVGhpcyBpcyBhIHZhcmlhdGlvbiBvbiB1bnNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIHRoYXQgbWFrZXMgZGlmZmVyZW50Ci10cmFkZW9mZnMuIFdlIGNhbGwgdGhlc2UgPGk+c3R1YiBwcm9qZWN0czwvaT4uIEluIHBhcnRpY3VsYXIsIHRoZSBhYmlsaXR5Ci10byBicm93c2UgYSBwcmVyZXFpc2l0ZSBjb21wb25lbnQgaXMgdHJhZGVkIGZvciB0aGUgYWJpbGl0eSB0byBoYXZlIG9ubHkKLWEgbWluaW1hbCBzZXQgb2YgZXh0cmEgbGlicmFyeSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLiBUaGUgb25seSBkaWZmZXJlbmNlCi1pcyB0aGF0IHN0dWIgcHJvamVjdHMgZG8gbm90IHJlcXVpcmUgb3RoZXIgcHJvamVjdHMgKHdoZXJlYXMgcHJveHkgbGlicmFyeQotcHJvamVjdHMgZGlkIHJlcXVpcmUgb3RoZXIgcHJvamVjdHMpLiBUaGlzIGFsbG93IGEgd29ya3NwYWNlIHRvIGdldCBieQotd2l0aCBhIGxlc3MgdGhhbiBjb21wbGV0ZSBzZXQgb2Ygc3R1YiBwcm9qZWN0cy4gQ3JlYXRpbmcgYSBzdHViIHByb2plY3QKLW5ldmVyIGZvcmNlcyB5b3UgdG8gY3JlYXRlIG90aGVyIHN0dWIgcHJvamVjdHMuCi08dWw+Ci08bGk+Ci1NYWluIHByb2plY3QgaXMgaW4gc291cmNlIGFuZCBpcyBzaGFyZWQgdmlhIHRoZSByZXBvc2l0b3J5LjwvbGk+Ci0KLTxsaT4KLVRoYXQgcHJvamVjdCdzIHJlcXVpcmVkIHByb2plY3RzIGFyZSByZXByZXNlbnRlZCBpbiB3b3Jrc3BhY2UgYnkgc3R1YiBwcm9qZWN0cwotKHNhbWUgbmFtZSBhcyBzb3VyY2UgcHJvamVjdDsgbm90IHNoYXJlZCB2aWEgcmVwb3NpdG9yeSkuPC9saT4KLQotPGxpPgotU3R1YiBwcm9qZWN0cyBhcmUgbGlicmFyeSBwcm9qZWN0cyAobm8gc291cmNlIGNvZGUpLjwvbGk+Ci0KLTxsaT4KLUEgc3R1YiBwcm9qZWN0IG9ubHkgcmVwcmVzZW50cyBhIHByb2plY3QncyBvdXR3YXJkIGFwcGVhcmFuY2UgdG8gb3RoZXIKLXByb2plY3RzLjwvbGk+Ci0KLTxsaT4KLVN0dWIgcHJvamVjdHMgbmV2ZXIgcmVxdWlyZSBhbnkgb3RoZXIgcHJvamVjdHMuPC9saT4KLQotPGxpPgotRWFjaCB0ZWFtIG1lbWJlcnMgZG93bmxvYWRzIGxhdGVzdCBiaW5hcnkgYnVpbGQgdG8gYzpcdGVtcFxidWlsZFwgb3Igc29tZQotc3VjaCBhbmQgc2V0cyBjbGFzc3BhdGggdmFyaWFibGUgQlVJTEQgPSBjOlx0ZW1wXGJ1aWxkXDwvbGk+Ci0KLTxsaT4KLUJ1aWxkIGNsYXNzcGF0aCBleHBvcnRzIGxpYnJhcmllcyByZWxhdGl2ZSB0byBCVUlMRCBjbGFzc3BhdGggdmFyaWFibGUuPC9saT4KLQotPGxpPgotVXNlIG9mIGNsYXNzcGF0aCB2YXJpYWJsZSBhbGxvd3MgZWFjaCBkZXZlbG9wZXIgdG8gY2hvb3NlIHdoZXJlIHRvIGluc3RhbGwKLXRoZSBidWlsZC48L2xpPgotCi08bGk+Ci1CdWlsZCBjbGFzc3BhdGggcmVmZXJlbmNlcyBpbmRpdmlkdWFsIGRlcGVuZGVudCBwcm9qZWN0cyBieSBuYW1lLjwvbGk+Ci0KLTxsaT4KLVBybzogc3R1YiBwcm9qZWN0cyBhcmUgbmVlZGVkIG9ubHkgZm9yIGltbWVkaWF0ZSBwcmVyZXF1aXNpdGVzIG9mIG1haW4KLXByb2plY3QuPC9saT4KLQotPGxpPgotQ29uOiB1bmFibGUgdG8gdmlldyBjb2RlIGZvciBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHByZXJlcXVpc2l0ZSAocmVxdWlyZXMKLWxvYWRpbmcgYW4gYWRkaXRpb25hbCBwcm9qZWN0KS48L2xpPgotCi08bGk+Ci1Db246IHVuYWJsZSB0byBicm93c2UgY29kZSBmb3IgcHJlcmVxdWlzdGUgY29tcG9uZW50cyBpbiBwcm9wZXIgY29udGVudAotKGNvZGUgY29tcGxldGlvbikgYmVjYXVzZSBzdHViIGRvZXMgbm90IHByb3ZpZGUgc3VmZmljaWVudCBjb250ZXh0LjwvbGk+Ci0KLTxsaT4KLUNvbjogcGF0Y2hpbmcgb25seSB2aWEgc3dpdGNoaW5nIHRvIGFjdGl2ZSBkZXZlbG9wbWVudC48L2xpPgotCi08bGk+Ci1Qcm86IHN3aXRjaCB0byBkZXZlbG9wbWVudCBpbnZvbHZlcyBsb2FkaW5nIGFuIGFkZGl0aW9uYWwgc2hhcmVkIHByb2plY3QKLWludG8gd29ya3NwYWNlLCBwb3NzaWJseSBvdmVyIHRvcCBvZiBzdHViIHByb2plY3Q7IG5vIGNsYXNzcGF0aHMgbmVlZCB0bwotYmUgY2hhbmdlZC48L2xpPgotCi08bGk+Ci1Qcm86IGVhc3kgdG8gdXBncmFkZSB0byBhbm90aGVyIGJpbmFyeSBidWlsZCAodW56aXAgYnVpbGQgaW4gcGxhY2UsIGFuZAotY2xvc2UgYW5kIHJlb3BlbiBwcm9qZWN0IGluIHdvcmtzcGFjZSB0byBmb3JjZSBhIHJlZnJlc2gpLjwvbGk+Ci0KLTxsaT4KLUNvbjogaW5pdGlhbCB3b3Jrc3BhY2Ugc2V0dXAgaW52b2x2aW5nIG11bHRpcGxlIHNoYXJlZCBwcm9qZWN0cyBhbmQgc3R1YgotcHJvamVjdHM7IG9uZ29pbmcgbmVlZCBmb3IgYWRkaXRpb25hbCBzdHViIHByb2plY3RzIHdoZW4gbmV3IHNvdXJjZSBwcm9qZWN0cwotYXJlIGxvYWRlZCAoYXV0b21hdGlvbiByZXF1aXJlZCkuPC9saT4KLQotPGxpPgotUHJvOiBubyByZXN0cmljdGlvbiBvbiBudW1iZXIgb2YgamFycyBwZXIgcHJvamVjdC48L2xpPgotCi08bGk+Ci1GYXRhbCBmbGF3ICghKTogbGltaXRlZCBhYmxlIHRvIGNvbXBpbGUgYWdhaW5zdCBhIHN0dWIgcHJvamVjdCBkdWUgdG8gbGFjawotb2Ygc3VmZmljaWVudCBjb250ZXh0IE5vdGU6IHRoZSBleHBvcnRlZCBsaWJyYXJpZXMgYXJlIGV4dGVybmFsIHRvIHRoZQotcHJvamVjdC48L2xpPgotCi08bGk+Ci1Ob3RlOiB1c2VzIGxpYnJhcnkgcHJvamVjdHMgKHByb3Bvc2VkIGZvciBSMi4wKS48L2xpPgotPC91bD4KLVRoZSBzb3VyY2UgcHJvamVjdHM6Ci08cD5wcm9qZWN0IFAxIChzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDEvQzEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDEvYmluCi08YnI+fAotPGJyPnByb2plY3QgUDIgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9DMjsgcHJvamVjdCBQMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMi9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQMyAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AzL0MzOyBwcm9qZWN0IFAxOyBwcm9qZWN0Ci1QMgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMy9iaW4KLTxicj58Ci08YnI+cHJvamVjdCBQNCAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgotPHA+VGhlIGNvcnJlc3BvbmRpbmcgc3R1YiBwcm9qZWN0cyAobm90ZSB0aGUgYWJzZW5jZSBvZiByZXF1aXJlZCBwcm9qZWN0cyk6Ci08cD5wcm9qZWN0IFAxIChub3Qgc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MxLmphcitCVUlMRC9jMXNyYy56aXAKLTxwPnByb2plY3QgUDIgKG5vdCBzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzIuamFyK0JVSUxEL2Myc3JjLnppcAotPHA+cHJvamVjdCBQMyAobm90IHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCBCVUlMRC9jMy5qYXIrQlVJTEQvYzNzcmMuemlwCi08cD5wcm9qZWN0IFA0IChub3Qgc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2M0LmphcitCVUlMRC9jM3NyYy56aXAKLTxwPkZvciBleGFtcGxlLCBhIGRldmVsb3BlciB3b3JraW5nIG9uIFAzIHdvdWxkIG5lZWQgc3R1YiBwcm9qZWN0cyBmb3IKLVAxIGFuZCBQMi4KLTxwPnByb2plY3QgUDMgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgcHJvamVjdCBQMTsgcHJvamVjdAotUDIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCi08YnI+JmFtcDsKLTxicj5wcm9qZWN0IFAyIChub3Qgc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDEgKG5vdCBzaGFyZWQpCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxpYnJhcnkgcHJvamVjdAotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBleHBvcnQgQlVJTEQvYzEuamFyK0JVSUxEL2Mxc3JjLnppcAotPHA+SWYgdGhleSB0aGVuIGRlY2lkZWQgdG8gZGV2ZWxvcCBQMSBhcyB3ZWxsLCB0aGV5IHdvdWxkIHJlcGxhY2UgUDEgYnkKLXRoZSBzb3VjZSBwcm9qZWN0LiBUaGVpciB3b3Jrc3BhY2Ugd291bGQgbm93IGxvb2sgbGlrZToKLTxwPnByb2plY3QgUDMgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMy9DMzsgcHJvamVjdCBQMTsgcHJvamVjdAotUDIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IGZvbGRlciAvUDMvYmluCi08YnI+JmFtcDsKLTxicj5wcm9qZWN0IFAyIChub3Qgc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBsaWJyYXJ5IHByb2plY3QKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gZXhwb3J0IEJVSUxEL2MyLmphcitCVUlMRC9jMnNyYy56aXAKLTxicj4mYW1wOwotPGJyPnByb2plY3QgUDEgKHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9DMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgZm9sZGVyIC9QMS9iaW4KLTxwPlRoZSBmYXRhbCBmbGF3IGlzIGNsZWFyIGluIHRoZSBjYXNlIG9mIGEgd29ya3NwYWNlIGNvbnRhaW5pbmcgUDQgYW5kCi1hIHN0dWIgZm9yIFAyLgotPHA+cHJvamVjdCBQNCAoc2hhcmVkKQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1A0L0M0OyBwcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCBmb2xkZXIgL1A0L2JpbgotPGJyPiZhbXA7Ci08YnI+cHJvamVjdCBQMiAobm90IHNoYXJlZCkKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgbGlicmFyeSBwcm9qZWN0Ci08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IGV4cG9ydCBCVUlMRC9jMi5qYXIrQlVJTEQvYzJzcmMuemlwCi08cD5JZiwgZm9yIGV4YW1wbGUsIGEgY2xhc3MgaW4gQzQgc3ViY2xhc3NlcyBhIGNsYXNzIGluIEMyIHdoaWNoIHN1YmNsYXNzZXMKLWEgY2xhc3MgaW4gQzEsIHRoZW4gdGhlIGNvbXBpbGVyIHdpbGwgbmVlZCB0byBnZXQgaXRzIGhhbmRzIG9uIHRoZSBjbGFzcwotaW4gQzEuIFVuZm9ydHVuYXRlbHksIG5laXRoZXIgdGhlIHNvdXJjZSBjb2RlIG5vciBiaW5hcnkgZm9yIEMxIGlzIGFueXdoZXJlCi10byBiZSBmb3VuZC4KLTxoMz4KLTxhIE5BTUU9Ik90aGVyIFNjZW5hcmlvcyI+PC9hPkFzc29ydGVkIE90aGVyIFNjZW5hcmlvczwvaDM+Ci1BIGNvdXBsZSBvZiBvdGhlciBzY2VuYXJpb3MgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlCi10ZWNobmlxdWVzIGVtcGxveWVkIGFib3ZlOgotPHVsPgotPGxpPgotVW5zaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cyB3aXRoIGRpZmZlcmVudCBwcm9qZWN0IG5hbWVzLjwvbGk+Ci0KLTxicj5Vc2UgYSBjbGFzc3BhdGggdmFyaWFibGUgcGVyIGNvbXBvbmVudDsgYmluZCBpdCBpbml0aWFsbHkgdG8gdGhlIG5hbWUKLW9mIHRoZSBwcm94eSBsaWJyYXJ5IHByb2plY3Q7IHJlYmluZCB0byBuYW1lIG9mIHRoZSBzb3VyY2UgcHJvamVjdC4KLTx1bD4KLTxsaT4KLVBybzogQWxsb3dzIHNpZGUtYnktc2lkZSBwcm94eSBsaWJyYXJ5IHByb2plY3QgYW5kIHNvdXJjZSBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLUNvbjogVXNlcyBib3RoIGNsYXNzcGF0aCB2YXJpYWJsZXMgYW5kIHByb3h5IGxpYnJhcnkgcHJvamVjdHMuPC9saT4KLTwvdWw+Ci0KLTxsaT4KLVNoYXJlZCBwcm94eSBsaWJyYXJ5IHByb2plY3RzIHdpdGggZGlmZmVyZW50IHByb2plY3QgbmFtZXMuPC9saT4KLQotPGJyPlNhbWUgYXMgcHJlY2VkaW5nIGV4Y2VwdCB0aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0cyBjYW4gYmUgc2hhcmVkLgotVXNlIGEgY2xhc3NwYXRoIHZhcmlhYmxlIHBlciBjb21wb25lbnQ7IGJpbmQgaXQgaW5pdGlhbGx5IHRvIHRoZSBuYW1lIG9mCi10aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0OyByZWJpbmQgdG8gbmFtZSBvZiB0aGUgc291cmNlIHByb2plY3QuIFNpbmNlCi10aGUgcHJveHkgbGlicmFyeSBwcm9qZWN0IGFuZCBzb3VyY2UgcHJvamVjdHMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMsIHRoZXJlCi1hcmUgbm8gVkNNIGFub21hbGllcy4KLTx1bD4KLTxsaT4KLVBybzogQWxsb3dzIHNpZGUtYnktc2lkZSBwcm94eSBsaWJyYXJ5IHByb2plY3QgYW5kIHNvdXJjZSBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLVBybzogUHJveHkgbGlicmFyeSBwcm9qZWN0cyBhcmUgYWxzbyB1bmRlciBWQ00uPC9saT4KLQotPGxpPgotQ29uOiBVc2VzIGJvdGggY2xhc3NwYXRoIHZhcmlhYmxlcyBhbmQgcHJveHkgbGlicmFyeSBwcm9qZWN0cy48L2xpPgotPC91bD4KLQotPGxpPgotU2hhcmVkIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgd2l0aCBzYW1lIHByb2plY3QgbmFtZXMgYW5kIHNhbWUgcmVwb3NpdG9yeS48L2xpPgotCi08YnI+VGhlIHByb3h5IGxpYnJhcnkgcHJvamVjdHMgY2FuIHVzZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzb3VyY2UgcHJvamVjdAotYW5kIGJlIG1haW50YWluZWQgdW5kZXIgVkNNIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkgYXMgdGhlIHNvdXJjZSBwcm9qZWN0cy4KLU5vdGUgdGhhdCB0aGlzIGlzIGEgbm9uLXN0YW5kYXJkIGFycmFuZ2VtZW50IGZvciBhIFZDTSBwcm9qZWN0LiBUaGUgc291cmNlCi1hbmQgYmluYXJ5IHZlcnNpb25zIG9mIGEgcHJvamVjdCBuZWVkIHRvIGJlIHRob3VnaHQgb2YgYXMgdHdvIHBlcm1hbmVudGx5Ci1zZXBhcmF0ZSBicmFuY2hlcyBpbiB0aGUgdmVyc2lvbiBoaXN0b3J5OiB0aGUgc291cmNlIHZlcnNpb25zIGNvbnRhaW5zCi1zb3VyY2UgY29kZSBidXQgbm8gYmluYXJpZXMsIHdoZXJlYXMgdGhlIGJpbmFyeSB2ZXJzaW9ucyBjb250YWlucyBiaW5hcmllcwotYnV0IG5vIHNvdXJjZSBjb2RlLiBUaGUgZGlmZmVyZW5jZXMgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZSBwcm9qZWN0J3MKLS5jbGFzc3BhdGggZmlsZS4gSW4gRWNsaXBzZSwgdGhpcyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgdXNlIG9mIGEKLWJpbmFyaWVzLW9ubHkgc3RyZWFtIHNlcGFyYXRlIGZyb20gdGhlIHVzdWFsIHN0cmVhbSBpbiB3aGljaCB0aGUgc291cmNlCi1pcyBtYWludGFpbmVkLiBJbiBvcmRlciB0byBhdm9pZCBnZW5lcmF0aW5nIHVud2FudGVkIG91dGdvaW5nIG9yIGluY29taW5nCi1jaGFuZ2VzIHdoZW4gc3dpdGNoaW5nIGZyb20gYmluYXJ5IHRvIHNvdXJjZSwgcHJvY2VlZCBhcyBmb2xsb3dzOiB1bnNoYXJlCi1mcm9tIGJpbmFyeSBzdHJlYW07IGRlbGV0ZSBmcm9tIHdvcmtzcGFjZTsgbG9hZCBhbmQgc2hhcmUgZnJvbSBzb3VyY2Ugc3RyZWFtLgotPHVsPgotPGxpPgotUHJvOiBQcm94eSBsaWJyYXJ5IHByb2plY3RzIGFyZSBhbHNvIHVuZGVyIFZDTS48L2xpPgotCi08bGk+Ci1Qcm86IE9uZSByZXBvc2l0b3J5IGhvbGRzIGV2ZXJ5dGhpbmcuPC9saT4KLQotPGxpPgotQ29uOiBQcm9qZWN0IGhhcyBub24tc3RhbmRhcmQgZHVhbCB2ZXJzaW9uIGhpc3RvcnkuPC9saT4KLQotPGxpPgotQ29uOiBTZXBhcmF0ZSBiaW5hcmllcy1vbmx5IHN0cmVhbSBtZWFucyBzZXBhcmF0ZSBicmFuY2ggaW4gdmVyc2lvbiBoaXN0b3J5LjwvbGk+Ci08L3VsPgotPC91bD4KLQotPGgzPgotRGlzY3Vzc2lvbjwvaDM+Ci1PZiB0aGUgdmFyaW91cyB3b3Jrc3BhY2Ugc2V0dXBzIGRpc2N1c3NlZCwgdGhlICJDb21wb25lbnQgcGx1cyBsaWJyYXJpZXMiCi1hcHByb2FjaCBpcyB0aGUgbW9zdCBzdHJhaWdodGZvcndhcmQsIGJ1dCBhbHNvIHRoZSB3ZWFrZXN0LiBJdCBzaG91bGQgd29yawotd2VsbCBpbiBjYXNlcyB3aGVyZSBkZXZlbG9wZXJzIHdvcmsgb24gZXhhY3RseSB0aGUgY29tcG9uZW50IHRoZXkgYXJlIGFzc2lnbmVkLgotQnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCBpbiBjYXNlcyB3aGVyZSBkZXZlbG9wZXJzIGFzc2lnbmVkIHRvIG9uZSBjb21wb25lbnQKLXdvdWxkIG5lZWQgdG8gcGF0Y2ggb3IgZGV2ZWxvcCBhbm90aGVyIGNvbXBvbmVudCBpbiB0aGUgc2FtZSB3b3Jrc3BhY2UuCi08cD5UaGUgIlNvdXJjZSBmb3IgZXZlcnl0aGluZyIgYXBwcm9hY2ggaXMgYmVzdCBmb3IgZGV2ZWxvcGVycyB3aG8gYXJlCi1hbGwgaW52b2x2ZWQgaW4gdGhlIGpvaW50IGFjdGl2ZSBkZXZlbG9wbWVudCBvZiBhbGwgb2YgdGhlIGNvbXBvbmVudHMuCi1UaGVyZSBpcyBhIGxpbWl0IHRvIGhvdyBsYXJnZSBpdCB3aWxsIHNjYWxlLCBzaW5jZSB0aGUgY29zdCBvZiByZWNvbXBpbGluZwotZXZlcnl0aGluZyBmcm9tIHNvdXJjZSBpbmNyZWFzZXMgbWV0aG9kIHRoZSBudW1iZXIgYW5kIHNpemUgb2YgY29tcG9uZW50cy4KLUl0IGlzIG5vdCByZWNvbW1lbmRlZCBpbiBzaXR1YXRpb25zIHdoZXJlIG1hbnkgb2YgdGhlIGNvbXBvbmVudHMgYXJlIG5vdAotdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50OyBpdCB3aWxsIGJlIG1vcmUgZWZmaWNpZW50IHRvIHVzZSBwcmUtY29tcGlsZWQKLWJpbmFyeSBsaWJyYXJpZXMgZm9yIHRoZSBzdGF0aWMgY29tcG9uZW50cy4KLTxwPkFwcHJvYWNoZXMgaW52b2x2aW5nIGNsYXNzcGF0aCB2YXJpYWJsZXMgZG8gbm90IGhhdmUgbXVjaCB0byByZWNvbW1lbmQKLXRoZW0uIFRoZXkgc2hhcmUgbW9zdCBvZiB0aGUgZGlzYWR2YW50YWdlcyAoYW5kIG5vbmUgb2YgdGhlIGFkdmFudGFnZXMpCi1vZiB1c2luZyBwcm94eSBsaWJyYXJ5IHByb2plY3RzLgotPHA+VGhlICJQcm94eSBMaWJyYXJ5IFByb2plY3RzIiB3b3Jrc3BhY2Ugc2V0dXAgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvCi13b3JrIG9uIHRoZWlyIGFzc2lnbmVkIGNvbXBvbmVudCB3aGlsZSBwcm92aWRpbmcgcmVhZHkgYWNjZXNzIHRvIGFsbCBvdGhlcgotY29tcG9uZW50cy4gVGhlIGFycmFuZ2VtZW50IGlzIGZsZXhpYmxlIGluIGFsbG93aW5nIGVhc3kgc3dpdGNoaW5nIGZyb20KLXVzaW5nIGEgY29tcG9uZW50IHRvIHBhdGNoaW5nIGl0IChvciB0byBhY3RpdmVseSBkZXZlbG9waW5nIGl0KS4gVGhlIHR3bwotc2V0dXBzIG91dGxpbmVkIGluIGRldGFpbCBzaG93IGhvdyB0aGUgcHJveHkgYmluYXJ5IHByb2plY3RzIGNhbiBiZSBjb25zdHJ1Y3RlZAotZnJvbSBhIGRvd25sb2FkYWJsZSBiaW5hcnkgYnVpbGQgb3Igb2J0YWluZWQgZnJvbSBhIHZlcnNpb24tbWFuYWdlZCByZXBvc2l0b3J5LgotRWFjaCBoYXMgdGhlcmUgcGx1c2VzIGFuZCBtaW51c2VzLiBUaGUgbWFpbiBkcmF3YmFjayBvZiB1c2luZyB1bnNoYXJlZAotcHJveHkgbGlicmFyeSBwcm9qZWN0cyBpcyB0aGUgc2lnbmlmaWNhbnQgdGFzayBvZiBzZXR0aW5nIHVwIGEgd29ya3NwYWNlCi1pbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgdGFzayB3b3VsZCBoYXZlIHRvIGJlIGF1dG9tYXRlZCBieSBzb21lIG1lYW5zOwotaXQgd291bGQgdG9vIHRlZGlvdXMgYW5kIGVycm9yIHByb25lIHRvIGhhdmUgZWFjaCBkZXZlbG9wZXIgY3JlYXRlIGEgd29ya3NwYWNlCi1mcm9tIHNjcmF0Y2guIEZvciBzaGFyZWQgcHJveHkgbGlicmFyeSBwcm9qZWN0cywgdGhlIHRlZGl1bSBpcyBpbiBjcmVhdGluZwotbmV3IHZlcnNpb25zIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGVpciByZXBvc2l0b3J5LiBUaGlzIHRhc2sgY291bGQgYmUgYXV0b21hdGVkCi1hcyBwYXJ0IG9mIHRoZSBjZW50cmFsaXplZCBidWlsZCBwcm9jZXNzLgotPHA+VGhlICJTdHViIFByb2plY3RzIiB3b3Jrc3BhY2Ugc2V0dXAgYWxsb3dzIGVhY2ggZGV2ZWxvcGVyIHRvIHdvcmsgb24KLXRoZWlyIGFzc2lnbmVkIGNvbXBvbmVudCB3aGlsZSBwcm92aWRpbmcgcGxhY2Vob2xkZXJzIGZvciBvdGhlciBjb21wb25lbnRzCi10aGF0IGl0IGRlcGVuZHMgb24uIFRoZSBhcnJhbmdlbWVudCBpcyBmbGV4aWJsZSBpbiBhbGxvd2luZyBlYXN5IHN3aXRjaGluZwotZnJvbSB1c2luZyBhIGNvbXBvbmVudCB0byBhY3RpdmVseSBkZXZlbG9waW5nIGl0IGJ5IHJlcGxhY2luZyB0aGUgcGxhY2Vob2xkZXIuCi1VbmZvcnR1bmF0ZWx5LCB0aGlzIGFwcHJvYWNoIGlzIGZhdGFsbHkgZmxhd2VkIGJlY2F1c2UgYSBjb21waWxlciBtaWdodAotbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNvbXBpbGUuIFRoZSBvdGhlciBkcmF3YmFja3MgYXJlIHRoZWlyIGxpbWl0ZWQKLXVzZWZ1bCBvZiB0aGUgc3R1YiBwcm9qZWN0cyAoY2FuJ3QgYnJvd3NlIHRoZSBjb21wb25lbnQ7IGNhbid0IHBhdGNoIHRoZQotY29tcG9uZW50KSwgYW5kIHRoZSBvbmdvaW5nIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgcHJveHkgcHJvamVjdHMgdG8KLWZpbGwgaW4gZm9yIHRoZSBtaXNzaW5nIHByZXJlcXVpc2l0ZXMgYXMgcmVhbCBzb3VyY2UgcHJvamVjdHMgZ2V0IGFkZGVkCi10byB0aGUgd29ya3NwYWNlLgotPGgzPgotRG9jdW1lbnQgSGlzdG9yeTwvaDM+Ci0xNTo0NSBXZWRuZXNkYXkgU2VwdGVtYmVyIDUsIDIwMDEgLSBmaXJzdCB2ZXJzaW9uIHNlbnQgZm9yIGNvbW1lbnRzCi08YnI+MTM6MzAgVGh1cnNkYXkgU2VwdGVtYmVyIDYsIDIwMDEgLSByZXZpc2VkIGZvciBmaXJzdCByb3VuZCBvZiBjb21tZW50cwotPGJyPjE5OjQwIFdlZG5lc2RheSBTZXB0ZW1iZXIgMTIsIDIwMDEgLSBhdXRvbWF0aW9uIGZvciB1bnNoYXJlZCBwcm94eQotbGlicmFyeSBwcm9qZWN0cwotPGJyPjEwOjE1IFdlZG5lc2RheSBTZXB0ZW1iZXIgMjYsIDIwMDEgLSBhZGRlZCBzdHViIHByb2plY3RzCi08YnI+MTc6MDAgV2VkbmVzZGF5IFNlcHRlbWJlciAyNiwgMjAwMSAtIGRvY3VtZW50ZWQgZmF0YWwgZmxhdyB3aXRoIHN0dWIKLXByb2plY3RzCi08YnI+Jm5ic3A7Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9ub3Rlcy9yMi4wL3dvcmtzcGFjZSBzdHJ1Y3R1cmUvd3Mtc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGM4MDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvcjIuMC93b3Jrc3BhY2Ugc3RydWN0dXJlL3dzLXN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43NSBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+SkRUIC0gV29ya3NwYWNlIHN0cnVjdHVyZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPgotV29ya3NwYWNlIFN0cnVjdHVyZTwvaDI+Ci1MYXN0IHJldmlzZWQgMTE6MTUgU2F0dXJkYXkgU2VwdGVtYmVyIDgsIDIwMDEKLTxwPk9yaWdpbmFsIHdvcmsgaXRlbTogIk1ha2UgdGhlIGJ1aWxkIHBhdGggbGVzcyBzZW5zaXRpdmUgd2l0aCByZWdhcmQKLXRvIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGEgc291cmNlIG9yIGEgYmluYXJ5IHByb2plY3QuIFRoaXMgaXMgYWxzbyByZWxhdGVkCi10byBwYXRjaGluZyAoaS5lLiwgYWRkaW5nIGEgc291cmNlIGZvbGRlciB0byBhIGJpbmFyeSBwcm9qZWN0KS4iCi08cD5SZWxhdGVkIGlzc3VlOiBzdXBwb3J0IGZvciBleHRlbnNpb24gZGlyZWN0b3JpZXMgY29udGFpbmluZyBtYW55IGphcnMuCi08cD5UaGVyZSB3YXMgbXVjaCBkaXNjdXNzaW9uLiBUaGUgdW5kZXJseWluZyBpc3N1ZSBpcyBob3cgdG8gc3RydWN0dXJlCi13b3Jrc3BhY2VzIGZvciBzaWduaWZpY2FudCBKYXZhIGRldmVsb3BtZW50IGVmZm9ydHMuIFRoZSBFY2xpcHNlIFByb2plY3QKLWlzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhbiBlZmZvcnQsIHNvIHRoZSBxdWVzdGlvbiBpcyBub3QgbWVyZWx5IG9mIHBhc3NpbmcKLWludGVyZXN0LiBTaW5jZSBtdWNoIG9mIHdoYXQgaXMgYmVpbmcgZGV2ZWxvcGVkIGluIHRoZSBFY2xpcHNlIFByb2plY3QKLWFyZSBwbHVnLWlucywgdGhlIHF1ZXN0aW9uIGFsc28gdG91Y2hlcyBvbiBQREUncyBkb21haW4uIEhvd2V2ZXIsIHNvbWUKLWFzcGVjdHMgb2YgdGhlIHByb2JsZW0gYWZmZWN0IGFsbCBzaWduaWZpY2FudCBKYXZhIGRldmVsb3BtZW50IGVmZm9ydHMKLWFuZCBub3QganVzdCBvbmVzIGZvciBkZXZlbG9waW5nIHBsdWctaW5zLiBTbyB3ZSBiZWdpbiB0byBpbnZlc3RpZ2F0aW5nCi10aG9zZS4KLTxoMz4KLVByb2JsZW06IENsb3NlIENvbGxhYm9yYXRpb24gYmV0d2VlbiBBZGphY2VudCBUZWFtczwvaDM+Ci1UaGUgZm9sbG93aW5nIGlzIGFuIGF0dGVtcHQgdG8gY2FwdHVyZSBhIGZhbWlsaWFyIHByb2JsZW0gaW4gYSBnZW5lcmFsCi13YXkgdGhhdCBkb2VzIG5vdCBwcmVzdW1lIGV4YWN0bHkgaG93IGRldmVsb3BlcnMnIHdvcmtzcGFjZXMgYXJlIHRvIGJlCi1zdHJ1Y3R1cmVkLiBDb25zaWRlciB0aGUgY2FzZSBvZiB0d28gY29tcG9uZW50cywgd2l0aCBQVUkgZGVwZW5kZW50IG9uCi1Db3JlIChpbWFnaW5lIHRoYXQgQ29yZSBpcyB0aGUgY29yZSBjb21wb25lbnQsIGFuZCBVSSBpcyB0aGUgY29ycmVzcG9uZGluZwotVUkgY29tcG9uZW50IGJ1aWx0IGF0b3AgaXQpLiBOb3cgaW1hZ2luZSB0aGF0IENvcmUgYW5kIFVJIGFyZSB1bmRlciBhY3RpdmUKLWRldmVsb3BtZW50IGJ5IHR3byB0ZWFtcywgd2l0aCBvd25lcnNoaXAgc3BsaXQgYWxvbmcgY29tcG9uZW50IGxpbmVzLiBGb3IKLW1heGltdW0gY29udmVuaWVuY2UgdG8gYm90aCB0ZWFtcywgdGhlIHRlYW1zIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBkbwotdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLUVhY2ggdGVhbSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gd29yayBpbiBhIHdvcmtzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZQotc291cmNlIGNvZGUgZm9yIHRoZWlyIGNvbXBvbmVudCBhbmQgdGhlIGJpbmFyeSBlcXVpdmFsZW50ICh3aXRoIGF0dGFjaGVkCi1zb3VyY2UpIGZvciBhbGwgb3RoZXIgY29tcG9uZW50cy48L2xpPgotCi08bGk+Ci1PY2Nhc2lvbmFsbHkgKGUuZy4sIGR1cmluZyBkZWJ1Z2dpbmcpIGVhY2ggdGVhbSB3b3VsZCBsaWtlIGFuIGVhc3kgd2F5Ci10byB3b3JrYXJvdW5kIChvciBwZXJoYXBzIGluZHVjZSkgcHJvYmxlbXMgaW4gYW5vdGhlciBjb21wb25lbnQuPC9saT4KLQotPGxpPgotT2NjYXNpb25hbGx5IGVhY2ggdGVhbSB3b3VsZCBsaWtlIGFuIGVhc3kgd2F5IGZvciBtZW1iZXJzIHRvICJqb2luIHRoZQotb3RoZXIgdGVhbSIgYW5kIG1vcmUgYWN0aXZlbHkgd29yayBvbiBhbm90aGVyIGNvbXBvbmVudC48L2xpPgotPC91bD4KLUdlbmVyYWxpemUgZnJvbSAyIHRvIE4gdGhlIG51bWJlciBvZiB0ZWFtcyBhbmQgY29tcG9uZW50cyB0byBnZXQgdGhlIGZ1bGwKLWV4dGVudCBvZiB0aGUgcHJvYmxlbS4KLTxoMz4KLVByb2JsZW06IExhcmdlIE51bWJlcnMgb2YgTGlicmFyaWVzPC9oMz4KLVRoZSBmb2xsb3dpbmcgRWNsaXBzZSBDb3JuZXIgcG9zdGluZyAoSm9uIFNrZWV0ICZsdDtza2VldEBwb2JveC5jb20+IG9uCi0yMC44LjIwMDEpIGRlc2NyaWJlcyBvbmUgY29uY2VybiB3ZWxsOgotPGJsb2NrcXVvdGU+PGk+UmVmZXJlbmNpbmcgYSBwcm9qZWN0J3MgbGlicmFyaWVzIGluIGFub3RoZXIgcHJvamVjdDogVGhlCi1wcm9qZWN0IEknbSB3b3JraW5nIG9uIHVzZXMgYSBmYWlybHkgbGFyZ2UgbnVtYmVyIG9mIGxpYnJhcmllcyAoYWJvdXQgMjAKLWphciBmaWxlcywgSUlSQykuIEkgaGFkIGhvcGVkIEknZCBiZSBhYmxlIHRvIGNyZWF0ZSBvbmUgcHJvamVjdCB3aGljaCB1c2VkCi10aGVzZSBsaWJyYXJpZXMsIGFuZCBtYWtlIGFsbCBvdGhlciBwcm9qZWN0cyBoYXZlIHRoYXQgcHJvamVjdCBvbiB0aGVpcgotYnVpbGQtcGF0aHMgdG8gYnJpbmcgaW4gdGhlIGxpYnJhcmllcyAtIHRoYXQgd2F5IEkgd291bGRuJ3QgbmVlZCB0byBjaGFuZ2UKLSpldmVyeSogcHJvamVjdCBldmVyeSB0aW1lIEkgYWRkZWQgb3IgcmVtb3ZlZCBhIGxpYnJhcnkuIChJdCdzIG5vdCBhIGNvbW1vbgotb3BlcmF0aW9uLCBidXQgZXZlbiBzby4uLikgVW5mb3J0dW5hdGVseSwgSSBjYW4ndCBnZXQgdGhpcyB0byB3b3JrIC0gcHV0dGluZwotcHJvamVjdCBBIG9uIHRoZSBjbGFzc3BhdGggb2YgcHJvamVjdCBCIG9ubHkgc2VlbXMgdG8gcHV0IHByb2plY3QgQSdzIGluZGl2aWR1YWwKLXNvdXJjZS9jbGFzcyBmaWxlcyBvbiB0aGUgY2xhc3NwYXRoIGZvciBwcm9qZWN0IEIuIEkndmUgdHJpZWQgYWRkaW5nIGFzCi1hbiBleHRlcm5hbCBqYXIgYW5kIGltcG9ydGluZyB0aGUgamFyIGZpbGUgaW50byB0aGUgcHJvamVjdCwgYW5kIGhhZCBubwotam95IHdpdGggZWl0aGVyIDooPC9pPjwvYmxvY2txdW90ZT4KLUhlcmUgaXMgdGhlIGFycmFuZ2VtZW50OgotPGJsb2NrcXVvdGU+cHJvamVjdCBQMQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1AxL3NyYzsgbGlicmFyeSBsaWIxLmphcjsKLWxpYnJhcnkgbGliMi5qYXI7IC4uLjsgbGlicmFyeSBsaWIyMC5qYXIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IC9QMS9iaW4KLTxicj5wcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDIvc3JjOyBsaWJyYXJ5IGxpYjEuamFyOwotbGlicmFyeSBsaWIyLmphcjsgLi4uOyBsaWJyYXJ5IGxpYjIwLmphcgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AyL2JpbjwvYmxvY2txdW90ZT4KLUl0IGlzIGNsZWFyIHRoYXQgdGhlIGN1c3RvbWVyIGlzIGxvb2tpbmcgZm9yIGEgd2F5IHRvIGRlYWwgd2l0aCBhIHNldCBvZgotbGlicmFyaWVzIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgYnkgc2V2ZXJhbCBwcm9qZWN0cywgYW5kIHdhcyBob3BpbmcgdGhhdAotcmVxdWlyZWQgcHJvamVjdHMgd291bGQgZ2l2ZSBoaW0gdGhhdC4KLTxoMz4KLVJldmlldzogUmVxdWlyZWQgUHJvamVjdHM8L2gzPgotSW4gRWNsaXBzZSAxLjAsIHRoZSBidWlsZCBjbGFzc3BhdGggZm9yIGEgcHJvamVjdCBQIGNhbiBjb250YWluIGFuIGVudHJ5Ci1mb3IgYW5vdGhlciBwcm9qZWN0IFIsIGNhbGxlZCBhIDxiPnJlcXVpcmVkIHByb2plY3Q8L2I+LiBSZXF1aXJlZCBwcm9qZWN0cwotd29yayBhcyBmb2xsb3dzOgotPHVsPgotPGxpPgotVGhlIGNsYXNzIGZpbGVzIGluIHRoZSBiaW5hcnkgb3V0cHV0IGRpcmVjdG9yeSBvZiBSIGFyZSBpbmNsdWRlZCwgbGlrZQotYSBsaWJyYXJ5LCBvbiB0aGUgZWZmZWN0aXZlIGJ1aWxkIGNsYXNzcGF0aCBvZiBQLiBQJ3MgYnVpbGQgY2xhc3NwYXRoIGluZGljYXRlcwotdGhlIG9yZGVyIG9mIHRoaXMgbGlicmFyeSByZWxhdGl2ZSB0byBvdGhlcnMuIE90aGVyIGxpYnJhcnkgKGFuZCBwcm9qZWN0KQotZW50cmllcyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG9mIFIgaGF2ZSBubyBiZWFyaW5nIG9uIFA7IHRoZXkgYXJlIG9ubHkKLWNvbnN1bHRlZCB0byBicm93c2Ugb3IgYnVpbGQgUi48L2xpPgotCi08bGk+Ci1UaGUgbmFtZXMgb2YgcmVxdWlyZWQgcHJvamVjdHMgYXJlIHJlY29yZGVkIGluIHRoZSAuY2xhc3NwYXRoIGZpbGUsIHdoaWNoCi1pcyB1bmRlciBWQ00uIFRoZXkgYXJlIHRoZXJlZm9yZSBzaGFyZWFibGUgd2l0aCBvdGhlciBkZXZlbG9wZXJzLjwvbGk+Ci0KLTxsaT4KLVByb2plY3RzIGFyZSBwcmVzZW50ZWQgYXMgdG9wIGxldmVsIGVsZW1lbnRzIGluIHRoZSBzdGFuZGFyZCBwYWNrYWdlcyB2aWV3LgotQSByZXF1aXJlZCBwcm9qZWN0IGlzIG5vdCBwcmVzZW50ZWQgaW4gdGhlIHBhY2thZ2VzIHZpZXcgYXMgYSBjaGlsZCBvZgotdGhlIHByb2plY3QocykgdGhhdCByZXF1aXJlcyBpdC48L2xpPgotCi08bGk+Ci1BIHByb2plY3QncyBsaXN0IG9mIHJlcXVpcmVkIHByb2plY3RzIChhIEpEVCBjb3JlIG5vdGlvbikgaXMgdXNlZCB0byBjb21wdXRlZAotdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcm9qZWN0J3MgbGlzdCBvZiBwcm9qZWN0IHJlZmVyZW5jZXMgKGEgd29ya3NwYWNlCi1ub3Rpb24pLjwvbGk+Ci0KLTxsaT4KLU1pc3NpbmcgcmVxdWlyZWQgcHJvamVjdHMgYW5kIGxpYnJhcmllcywgYW5kIHVuYm91bmQgY2xhc3NwYXRoIHZhcmlhYmxlcywKLWdlbmVyYXRlIHByb2JsZW1zIHJlcG9ydGVkIGFnYWluc3QgdGhlIHByb2plY3QgcmVzb3VyY2UgaXRzZWxmLiBUaGVzZSBraW5kCi1vZiBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgYnkgdGhlIEphdmEgbW9kZWwgKHJhdGhlciB0aGFuIHRoZSBKYXZhIGJ1aWxkZXIpLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1SZXZpZXc6IENsYXNzcGF0aCBFbnRyaWVzPC9oMz4KLUluIEVjbGlwc2UgMS4wLCBhIGNsYXNzcGF0aCBpcyBleHByZXNzZWQgYXMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLSg8dHQ+SUNsYXNzcGF0aEVudHJ5PC90dD4pLiBUaGVyZSBhcmUgZm91ciBraW5kcyBvZiBjbGFzc3BhdGggZW50cmllczoKLTx1bD4KLTxsaT4KLVNvdXJjZSBmb2xkZXIgZW50cnk6IGRlbm90ZXMgYSBwcm9qZWN0IGZvbGRlciBjb250YWluaW5nIC5qYXZhIGZpbGVzLiBUaGUKLXNvdXJjZSBmb2xkZXIgbXVzdCBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBwcm9qZWN0IHdoZXJlIHRoaXMgY2xhc3NwYXRoCi1lbnRyeSBpcyB1c2VkLiBTb3VyY2UgZm9sZGVyIGVudHJpZXMgYXJlIGdlbmVyYWxseSB1c2VkIHRvIGNvbXBvbmVudGl6ZQotdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwcm9qZWN0IChlLmcuIG9yZy5lY2xpcHNlLmpkdC5jb3JlL0VjbGlwc2UgSmF2YQotQ29tcGlsZXIvKS4gVGhlIGFjdGlvbiBvZiBidWlsZGluZyBhIEphdmEgcHJvamVjdCB3aWxsIGxlYWQgdG8gcG9wdWxhdGluZwotdGhlIHByb2plY3Qgb3V0cHV0IGZvbGRlciB3aXRoIC5jbGFzcyBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSAuamF2YQotZmlsZXMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiBhbGwgdGhlIHNvdXJjZSBmb2xkZXJzIHByZXNlbnQgb24gdGhpcyBwcm9qZWN0Ci1jbGFzc3BhdGguIE5vdGUgdGhhdCB0aGUgcHJvamVjdCByb290IGNhbiBpdHNlbGYgYmUgdXNlZCBhcyBhIHNvdXJjZSBmb2xkZXIKLShpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGFsc28gdGhlIHByb2plY3QgaXRzZWxmKS48L2xpPgotCi08bGk+Ci1MaWJyYXJ5IGVudHJ5OiBkZW5vdGVzIGEgYmluYXJ5IEpBUiBhcmNoaXZlIG9yIGJpbmFyeSBmb2xkZXIuIEluIGNhc2Ugb2YKLXBvaW50aW5nIGF0IGEgSkFSLCB0aGUgZW50cnkgY2FuIGFsc28gZGVmaW5lIGEgc291cmNlIGF0dGFjaG1lbnQgcmVjb21tZW5kYXRpb24KLShwYXRoIHRvIHNvdXJjZSBhcmNoaXZlLCBhbmQgcGF0aCBvZiBzb3VyY2Ugcm9vdCBpbnNpZGUgdGhpcyBhcmNoaXZlLCBlLmcuCi0iYzovanJlL3NyYy5qYXIiICsgIi9zcmMiKS48L2xpPgotCi08bGk+Ci1Qcm9qZWN0IGVudHJ5OiBkZW5vdGVzIGEgcmVxdWlyZWQgcHJvamVjdC4gV2hlbiBidWlsZGluZywgdGhlIHJlcXVpcmVkCi1wcm9qZWN0IGlzIGJ1aWx0IGJlZm9yZSB0aGUgZGVwZW5kZW50IHByb2plY3QsIGFuZCBjb250cmlidXRlcyBpdHMgZW50aXJlCi1vdXRwdXQgZm9sZGVyIChpLmUuIGFsbCBpdHMgcHJvZHVjZWQgLmNsYXNzIGZpbGVzKS4gVGh1cyBhIHByb2plY3QgbmV2ZXIKLWRpcmVjdGx5IGNvbnRyaWJ1dGVzIGl0cyBzb3VyY2UgZmlsZXMgd2hlbiBidWlsZGluZy4gSG93ZXZlciwgZm9yIGFsbCBzb3VyY2UtYmFzZWQKLWZ1bmN0aW9uYWxpdGllcyAoY29kZSBhc3Npc3QsIHNlYXJjaCwgLi4uKSwgYSByZXF1aXJlZCBwcm9qZWN0IGRpcmVjdGx5Ci1jb250cmlidXRlcyBpdHMgc291cmNlcyAoaS5lLiBhbGwgb2YgaXRzIHNvdXJjZSBmb2xkZXJzIGFyZSBleHBvc2VkKSBzbwotdGhhdCBhIGJ1aWxkIGFjdGlvbiBpcyBub3QgbWFuZGF0b3J5IHRvIG9idGFpbiBhY2N1cmF0ZSBpbmZvcm1hdGlvbjsgaW4KLXBhcnRpY3VsYXIsIHdoZW4gZG9pbmcgaW50ZW5zaXZlIGNvZGUgcmVvcmdhbml6YXRpb24sIGNvZGUgYXNzaXN0IGFuZCBzZWFyY2gKLXdpbGwgc3RpbGwgcGVyZm9ybSBhY2N1cmF0ZWx5IGV2ZW4gaWYgYXV0by1idWlsZCBpcyB0dXJuZWQgb2ZmLjwvbGk+Ci0KLTxsaT4KLVZhcmlhYmxlIGVudHJ5OiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gZWl0aGVyIGEgbGlicmFyeSBvciBhIHJlcXVpcmVkIHByb2plY3QuCi1BIHZhcmlhYmxlIGVudHJ5IHVzZXMgYSB2YXJpYWJsZSBwYXRoIG9mIHRoZSBmb3JtICV2YXJpYWJsZU5hbWUlWyVwYXRoU3VmZml4JV0uCi1UaGUgdmFyaWFibGUgbmFtZSB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggaXRzIGFjdHVhbCB2YWx1ZSwgd2hpY2ggaXMgYQotd29ya3NwYWNlIGRlZmluZWQgY29uc3RhbnQuIFRoZSBwYXRoIHN1ZmZpeCBpcyBhbiBvcHRpb25hbCBzdWZmaXggd2hpY2gKLWNhbiBiZSBhcHBlbmRlZCB0byB0aGUgdmFyaWFibGUgdmFsdWUuIFBERSB1c2VzIGEgZ2xvYmFsIHZhcmlhYmxlIHRvIHJlcHJlc2VudAotdGhlIEVjbGlwc2UgaG9tZSBkaXJlY3RvcnksIGFuZCBwYXRoIHN1ZmZpeGVzIHRvIHJlYWNoIHRoZSB3ZWxsLWtub3duIGxpYnJhcmllcwotKGUuZy4mbmJzcDsmbmJzcDsmbmJzcDsgIkVDTElQU0VfSE9NRS9vcmcuZWNsaXBzZS5qZHQuY29yZS9qZHRjb3JlLmphciIpLgotTm90ZSB0aGF0IGluIGEgY29uc2lzdGVudCBtYW5uZXIgd2l0aCBsaWJyYXJ5IGVudHJpZXMsIHZhcmlhYmxlIGVudHJpZXMKLWNhbiBiZSBwcm92aWRlZCB3aXRoIGEgdmFyaWFibGUgc291cmNlIGF0dGFjaG1lbnQgcmVjb21tZW5kYXRpb24uPC9saT4KLTwvdWw+Ci0KLTxoMz4KLUludmVzdGlnYXRpb246IE1ha2UgQ2xhc3NwYXRoIFZhcmlhYmxlcyBNb3JlIFBvd2VyZnVsPC9oMz4KLVdvdWxkIG1ha2luZyBjbGFzc3BhdGggdmFyaWFibGVzIG1vcmUgcG93ZXJmdWwgYWRkcmVzcyBzb21lIHRoZSBwcm9ibGVtcwotZmFjaW5nIGxhcmdlIHNjYWxlIEphdmEgZGV2ZWxvcG1lbnQgZWZmb3J0cz8KLTxwPk9uZSBpZGVhIHdvdWxkIGJlIHRvIGFsbG93IHZhcmlhYmxlcyB0byBiZSBib3VuZCB0byBhIGxpc3Qgb2YgcGF0aHMKLWluc3RlYWQgb2YgYSBzaW5nbGUgcGF0aC4gVGhpcyB3b3VsZCBhbGxvdywgZm9yIGV4YW1wbGUsIGEgc2luZ2xlIGNsYXNzcGF0aAotdmFyaWFibGUgIkJBU0VfTElCUyIgdG8gYmUgYm91bmQgdG8gdGhlIGxpc3Qgb2YgdGhlIHBhdGhzIG9mIHRoZSBsaWJyYXJ5Ci1qYXJzIGxpYjEuamFyOyBsaWIyLmphcjsgLi4uOyBsaWIyMC5qYXIuIEVhY2ggcHJvamVjdCByZWZlcmVuY2luZyB0aGlzCi1jbGFzc3BhdGggdmFyaWFibGUgd291bGQgdGhlcmVieSBnYWluIGFjY2VzcyB0byBhbGwgdGhlIGxpYnJhcmllczoKLTxibG9ja3F1b3RlPnByb2plY3QgUDEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9zcmM7IEJBU0VfTElCUwotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AxL2JpbgotPGJyPnByb2plY3QgUDIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9zcmM7IEJBU0VfTElCUwotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AyL2JpbjwvYmxvY2txdW90ZT4KLUNoYW5naW5nIHRoZSB3b3Jrc3BhY2UgYmluZGluZyBvZiB0aGUgY2xhc3NwYXRoIHZhcmlhYmxlIGFmZmVjdHMgYWxsIHByb2plY3RzCi10aGF0IHJlZmVyZW5jZSB0aGUgdmFyaWFibGUuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjaGFuZ2UgdGhlIHNldCBvZiBsaWJyYXJpZXMKLXdpdGhvdXQgaGF2aW5nIHRvIGNoYW5nZSB0aGUgcHJvamVjdHMgaW5kaXZpZHVhbGx5LgotPHA+U2luY2UgY2xhc3NwYXRoIHZhcmlhYmxlIGJpbmRpbmdzIGFyZSBsb2NhbCB0byB0aGUgd29ya3NwYWNlLCB0aGVyZQotaXMgbm8gb2J2aW91cyBhdXRvbWF0aWMgd2F5IGJ5IHdoaWNoIHRoZXNlIGNsYXNzcGF0aCB2YXJpYWJsZXMgd291bGQgZ2V0Ci10aGVpciBiaW5kaW5ncy4gVGhlIGJpbmRpbmdzIHdvdWxkIGhhdmUgdG8gYmUgY29uZmlndXJlZCBmb3IgZWFjaCB3b3Jrc3BhY2U7Ci1sb2FkaW5nIGJpbmRpbmdzIGZyb20gYSBmaWxlLCBvciBpbml0aWFsaXppbmcgdGhlbSB2aWEgYSBzY3JpcHQsIGFyZSBmZWFzaWJsZQotb3B0aW9ucy4uCi08cD5UaGUgY2xhc3NwYXRoIHZhcmlhYmxlcyBjdXJyZW50bHkgYmluZCB0byBwYXRocywgYW5kIGNsYXNzcGF0aCBlbnRyaWVzCi1jYW4gY29udGFpbnMgcGF0aHMgdGhhdCBiZWdpbiBpbiBhIHZhcmlhYmxlLiBDaGFuZ2luZyB2YXJpYWJsZXMgdG8gYmluZAotdG8gYSBsaXN0IG9mIHBhdGhzIHdvdWxkIGJlIGEgbWFqb3IgY2hhbmdlLCBhbmQgd291bGQgbGlrZWx5IHJlcXVpcmUgcmV3b3JraW5nCi1tdWNoIG9mIGV4aXN0aW5nIEFQSS4gV2UgZ2VuZXJhbGx5IGFncmVlZCB0aGF0IHdlIHdvdWxkIG5vdCBwdXJzdWUgdGhpcwotYXBwcm9hY2ggc2luY2UgaXQgc2VlbXMgc29tZXdoYXQgdW5saWtlbHkgdG8gc29sdmUgbXVjaCBvZiB0aGUgcHJvYmxlbS4KLTxoMz4KLVByb3Bvc2FsOiBFeHBsaWNpdGx5IEV4cG9ydCBMaWJyYXJpZXMgZnJvbSBSZXF1aXJlZCBQcm9qZWN0czwvaDM+Ci1UaGUgcHJvcG9zYWwgaXMgdG8gZXh0ZW5kIHRoZSByZXF1aXJlZCBwcm9qZWN0cyBtZWNoYW5pc20gdG8gYWxsb3cgYSByZXF1aXJlZAotcHJvamVjdCB0byBjb250cmlidXRlIG1vcmUgdGhhbiBqdXN0IGl0cyBiaW5hcnkgb3V0cHV0IGZvbGRlci4gUmF0aGVyLAotYSBwcm9qZWN0IHdvdWxkIGJlIGFibGUgdG8gaW5kaWNhdGUgdGhhdCBhbnkgb2YgaXRzIGxpYnJhcmllcyBhcmUgdG8gYmUKLTxiPmV4cG9ydGVkPC9iPi4KLUV4cG9ydGVkIGxpYnJhcmllcyBhbHNvIGJlY29tZSBhdmFpbGFibGUgdG8gb3RoZXIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZQotdGhhdCBsaXN0IHRoaXMgcHJvamVjdCBhcyBhIHJlcXVpcmVkIHByb2plY3QuCi08cD5JbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGN1c3RvbWVyIGNvdWxkIGluc3RlYWQgaGF2ZSBhbiBhcnJhbmdlbWVudAotbGlrZToKLTxibG9ja3F1b3RlPnByb2plY3QgUDEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMS9zb3VyY2U7IHByb2plY3QgUExpYgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AxL2JpbgotPGJyPnByb2plY3QgUDIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMi9zb3VyY2U7IHByb2plY3QgUExpYgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AyL2JpbgotPGJyPnByb2plY3QgUExpYgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBidWlsZCBjbGFzc3BhdGggPSBzb3VyY2UgL1BMaWIvc291cmNlOyA8Yj5leHBvcnQ8L2I+Ci1saWJyYXJ5IGxpYjEuamFyOyAuLi47IDxiPmV4cG9ydDwvYj4gbGlicmFyeSBsaWIyMC5qYXIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IC9QTGliL2JpbjwvYmxvY2txdW90ZT4KLVdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHdoZW4gUDEgKHNpbWlsYXJseSwgUDIpIGlzIGJ1aWx0LCB0aGUgbGlicmFyaWVzCi1vbiBpdHMgYnVpbGQgY2xhc3NwYXRoIGNvbnNpc3RzIG9mIC9QTGliL2JpbiwgbGliMS5qYXIsIC4uLiwgbGliMjAuamFyLgotPHA+VGhlIG1vZGlmaWVkIHNlbWFudGljcyBvZiBhIHByb2plY3QgUCB3aXRoIGEgcmVxdWlyZWQgcHJvamVjdCBSIGFyZQotYXMgZm9sbG93czoKLTx1bD4KLTxsaT4KLVRoZXJlIGlzIGFuIGV4cG9ydCBmbGFnIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGxpYnJhcnkgZXhwbGljaXRseSBpbmNsdWRlZAotb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBvZiBhIHByb2plY3QuIFRoaXMgZmxhZyBpcyBtZWFuaW5nZnVsIGZvciBib3RoIGxpYnJhcnkKLWNsYXNzcGF0aCBlbnRyaWVzIChib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCksIGFuZCByZXF1aXJlZCBwcm9qZWN0cyAoaXQKLWlzIG5vdCBhc3NvY2lhdGVkIHdpdGggc291cmNlIGFuZCBvdXRwdXQgZW50cmllcy4pIFRoZSBleHBvcnQgZmxhZ3MgYXJlCi1yZWNvcmRlZCBpbiB0aGUgLmNsYXNzcGF0aCBmaWxlLCB3aGljaCBpcyB1bmRlciBWQ00uIFRoZXNlIGZsYWdzIGFyZSB0aGVyZWZvcmUKLXNoYXJlYWJsZSB3aXRoIG90aGVyIGRldmVsb3BlcnMuIChUaGVzZSBmbGFncyBjYW4gYmUgYWRkZWQgaW4gYSB3YXkgdGhhdAotZG9lcyBub3QgaW52YWxpZGF0ZSBleGlzdGluZyBSMS4wIC5jbGFzc3BhdGggZmlsZXMuKTwvbGk+Ci0KLTxsaT4KLVRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgYmluYXJ5IG91dHB1dCBkaXJlY3Rvcnkgb2YgUiwgYWxvbmcgd2l0aCBhbnkgbGlicmFyaWVzCi1leHBsaWNpdGx5IGV4cG9ydGVkIG9uIFIncyBidWlsZCBjbGFzc3BhdGgsIGFyZSBpbmNsdWRlZCBhcyBsaWJyYXJpZXMgb24KLXRoZSBidWlsZCBjbGFzc3BhdGggb2YgUC4gUCdzIGJ1aWxkIGNsYXNzcGF0aCBpbmRpY2F0ZXMgdGhlIHBsYWNlbWVudCBvZgotdGhpcyBsaWJyYXJ5IHJlbGF0aXZlIHRvIG90aGVyczsgdGhlIG91dHB1dCBmb2xkZXIgaXMgYWx3YXlzIGZpcnN0LCB3aXRoCi10aGUgZXhwb3J0ZWQgbGlicmFyaWVzIGFuZCBwcm9qZWN0cyBpbmNsdWRlZCBpbiB0aGUgdXNlci1zcGVjaWZpZWQgb3JkZXIuCi1FeHBvcnRlZCByZXF1aXJlZCBwcm9qZWN0cyBhcmUgZXhwYW5kZWQgaW5saW5lLiBUaGlzIG9yZGVyaW5nIHN1cHBvcnRzCi1zY2VuYXJpb3Mgd2hlcmUgdGhlIG91dHB1dCBmb2xkZXIgY29udGFpbnMgcGF0Y2hlcyB0byB0aGUgbGlicmFyaWVzLiBOb24tZXhwb3J0ZWQKLWxpYnJhcnkgZW50cmllcyBhbmQgcHJvamVjdCBlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb2YgUiBoYXZlIG5vCi1iZWFyaW5nIG9uIFAuPC9saT4KLQotPGxpPgotVGhlIG5hbWVzIG9mIHJlcXVpcmVkIHByb2plY3RzIGFyZSByZWNvcmRlZCBpbiB0aGUgLmNsYXNzcGF0aCBmaWxlLCB3aGljaAotaXMgdW5kZXIgVkNNLiBUaGV5IGFyZSB0aGVyZWZvcmUgc2hhcmVhYmxlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gKFVuY2hhbmdlZC4pPC9saT4KLQotPGxpPgotUHJvamVjdHMgYXJlIHByZXNlbnRlZCBhcyB0b3AgbGV2ZWwgZWxlbWVudHMgaW4gdGhlIHN0YW5kYXJkIHBhY2thZ2VzIHZpZXcuCi1BIHJlcXVpcmVkIHByb2plY3QgaXMgbm90IHByZXNlbnRlZCBpbiB0aGUgcGFja2FnZXMgdmlldyBhcyBhIGNoaWxkIG9mCi10aGUgcHJvamVjdChzKSB0aGF0IHJlcXVpcmVzIGl0OyBub3IgYXJlIHRoZSByZXF1aXJlZCBwcm9qZWN0J3MgZXhwb3J0ZWQKLWxpYnJhcmllcy48L2xpPgotCi08bGk+Ci1BIHByb2plY3QncyBsaXN0IG9mIHJlcXVpcmVkIHByb2plY3RzIChhIEpEVCBjb3JlIG5vdGlvbikgaXMgdXNlZCB0byBjb21wdXRlCi10aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb2plY3QncyBsaXN0IG9mIHByb2plY3QgcmVmZXJlbmNlcyAoYSB3b3Jrc3BhY2UKLW5vdGlvbikuIChVbmNoYW5nZWQuKTwvbGk+Ci0KLTxsaT4KLU1pc3NpbmcgcmVxdWlyZWQgcHJvamVjdHMgYW5kIGxpYnJhcmllcywgYW5kIHVuYm91bmQgY2xhc3NwYXRoIHZhcmlhYmxlcywKLWdlbmVyYXRlIHByb2JsZW1zIHJlcG9ydGVkIGFnYWluc3QgdGhlIHByb2plY3QgcmVzb3VyY2UgaXRzZWxmLiBUaGVzZSBraW5kCi1vZiBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgYnkgdGhlIEphdmEgbW9kZWwgKHJhdGhlciB0aGFuIHRoZSBKYXZhIGJ1aWxkZXIpLgotKFVuY2hhbmdlZC4pPC9saT4KLQotPGxpPgotQ2xhc3NwYXRoIHByb2JsZW1zIHBlcnRhaW5pbmcgdG8gbGlicmFyaWVzIGV4cG9ydGVkIGZyb20gYSByZXF1aXJlZCBwcm9qZWN0Ci1hcmUgcmVwb3J0ZWQgb25seSBvbmNlLCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGNsb3Nlc3QgdG8gdGhlIHByb2JsZW0uIFRoZQotcHJvYmxlbWF0aWMgZW50cmllcyBhcmUgZWxpZGVkIGZyb20gdGhlIGVmZmVjdGl2ZSBjbGFzc3BhdGggb2YgZGVwZW5kZW50Ci1wcm9qZWN0cy48L2xpPgotPC91bD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT5wcm9qZWN0IFAKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QL3NvdXJjZTsgcHJvamVjdCBSOyBsaWJyYXJ5Ci1wbGliLmphcgotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1AvYmluCi08YnI+cHJvamVjdCBSCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUi9zb3VyY2U7IDxiPmV4cG9ydDwvYj4KLWxpYnJhcnkgcmxpYjEuamFyOyBsaWJyYXJ5IHJsaWIyLmphcjsgPGI+ZXhwb3J0PC9iPiBwcm9qZWN0IFE7IDxiPmV4cG9ydDwvYj4KLWxpYnJhcnkgcmxpYjMuamFyCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dCAvUi9iaW4KLTxicj5wcm9qZWN0IFEKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9RL3NvdXJjZQotPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXQgL1EvYmluPC9ibG9ja3F1b3RlPgotRWZmZWN0aXZlIGJ1aWxkIGNsYXNzcGF0aCBvZiBQOgotPGJsb2NrcXVvdGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUC9zb3VyY2U7IGxpYnJhcnkKLS9SL2JpbjsgbGlicmFyeSBybGliMS5qYXI7IGxpYnJhcnkgL1EvYmluOyBsaWJyYXJ5IHJsaWIzLmphcjsgbGlicmFyeSBwbGliLmphcjwvYmxvY2txdW90ZT4KLQotPGg0PgotRXhwb3J0aW5nIEV4dGVybmFsIExpYnJhcmllczwvaDQ+Ci1SZWxhdGl2ZSB0byBhIGdpdmVuIHByb2plY3QsIGEgbGlicmFyeSBpcyBpbnRlcm5hbCBpZmYgdGhlIHBhdGggdG8gdGhlCi1qYXIgb3IgZm9sZGVyIGxpZXMgaW5zaWRlIHRoZSBwcm9qZWN0J3MgcmVzb3VyY2UgdHJlZS4gT3RoZXIgbGlicmFyaWVzCi1hcmUgY29uc2lkZXJlZCBleHRlcm5hbCB0byB0aGUgcHJvamVjdC4KLTxwPlNob3VsZCBwcm9qZWN0cyBiZSBhbGxvd2VkIHRvIGV4cG9ydCBhcmJpdHJhcnkgbGlicmFyaWVzLCBvciBzaG91bGQKLWV4cG9ydGVkIGxpYnJhcmllcyBhbHdheXMgYmUgaW50ZXJuYWwgdG8gdGhlIHByb2plY3Q/Ci08cD5SZXN0cmljdGluZyBleHBvcnRzIHRvIGludGVybmFsIGxpYnJhcmllcyBlbnN1cmVzIHRoYXQgYSBwcm9qZWN0IHRoYXQKLWlzIHRvIGJlIHVzZWQgYnkgb3RoZXIgcHJvamVjdHMgaXMgc29tZXdoYXQgc2VsZiBjb250YWluZWQuIElmIHlvdSBsb2FkCi1zdWNoIGEgcHJvamVjdCBmcm9tIGEgcmVwb3NpdG9yeSwgeW91IGFyZSBndWFyYW50ZWVkIGFsbCB0aGUgbGlicmFyaWVzCi1pdCBleHBvcnRzIHdpbGwgYmUgY29udGFpbmVkIHRoZXJlaW4uCi08cD5PbiB0aGUgb3RoZXIgaGFuZCwgdW5yZXN0cmljdGVkIGV4cG9ydHMgYXJlIG1vcmUgZmxleGlibGUsIGFuZCBhbGxvdwotYSBwcm9qZWN0IHRvIGV4cG9ydCBhIGNvbGxlY3Rpb24gb2YgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBuZWNlc3NhcmlseQotY29udGFpbmVkIHdpdGhpbiB0aGUgcHJvamVjdCdzIHJlc291cmNlIHRyZWUuIChIb3dldmVyLCBpdCBpcyB1bmNsZWFyIHdoZXRoZXIKLXRoaXMgYWRkaXRpb25hbCBmbGV4aWJpbGl0eSB3b3VsZCBiZSB1c2VmdWwuKQotPHA+V2Ugb3B0ZWQgdG8gYWxsb3cgdW5yZXN0cmljdGVkIGltcG9ydHMsIGJ1dCBkZWNpZGVkIHRvIHNpbXBsaWZ5IHRoZQotZXJyb3IgcHJvY2Vzc2luZyBieSBvbmx5IHJlcG9ydGluZyBwcm9ibGVtcyBhZ2FpbnN0IHRoZSBwcm9qZWN0IHdpdGggdGhlCi1taXNzaW5nIGxpYnJhcnkgKG9yIHJlcXVpcmVkIHByb2plY3QpIGV4cGxpY2l0bHkgb24gaXRzIGNsYXNzcGF0aC4gQW55Ci1taXNzaW5nIGVudHJpZXMgd291bGQgc2ltcGx5IGJlIG9taXR0ZWQgZnJvbSB0aGUgZWZmZWN0aXZlIGNsYXNzcGF0aCBjYWxjdWxhdGlvbi5mb3IKLWRlcGVuZGVudCBwcm9qZWN0cy4KLTxoND4KLUNsYXNzcGF0aCBWYXJpYWJsZXM8L2g0PgotQSBwcm9qZWN0J3MgYnVpbGQgY2xhc3NwYXRoIG1heSBpbmNsdWRlIHJlZmVyZW5jZXMgdG8gY2xhc3NwYXRoIHZhcmlhYmxlcwotdGhhdCBnZXQgYm91bmQgdG8gbGlicmFyaWVzIChvciBvdGhlciBwcm9qZWN0cykuIEhvdyBkbyBleHBvcnRzIGFuZCB2YXJpYWJsZXMKLWludGVyYWN0PwotPHA+VGhlIGV4cG9ydCBmbGFnIGNvdWxkIGJlIGFzc29jaWF0ZWQgZWl0aGVyIHdpdGggdGhlIHZhcmlhYmxlIHJlZmVyZW5jZQotb3Igd2l0aCB0aGUgdmFyaWFibGUgYmluZGluZy4gSWYgdGhlIGV4cG9ydCBmbGFnIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLXZhcmlhYmxlIHJlZmVyZW5jZSwgaXQgd291bGQgaW5kaWNhdGUgZXhwb3J0aW5nIHdoYXRldmVyIGxpYnJhcnkgdGhlIGNsYXNzcGF0aAotdmFyaWFibGUgaGFwcGVuZWQgdG8gYmUgYm91bmQgdG8gb24gYSBnaXZlbiBvY2Nhc2lvbi4gSWYgdGhlIGV4cG9ydCBmbGFnCi1pcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZhcmlhYmxlIGJpbmRpbmcgaXRzZWxmLCB0aGUgbGlicmFyeSB0aGUgY2xhc3NwYXRoCi12YXJpYWJsZSBoYXBwZW5lZCB0byBiZSBib3VuZCB0byBvbiBhIGdpdmVuIG9jY2FzaW9uIHdvdWxkIGJlIGV4cG9ydGVkCi1jb25kaXRpb25hbGx5IG9uIHRoZSBmbGFnIGluIHRoZSBiaW5kaW5nLiBUaGUgcHJvcG9zYWwgaXMgdG8gZ28gd2l0aCB0aGUKLWZvcm1lciAoZXhwb3J0IGZsYWcgd2l0aCB2YXJpYWJsZSByZWZlcmVuY2UpIHNpbmNlIGl0cyBzZW1hbnRpY3MgYXJlIHNvbWV3aGF0Ci1zaW1wbGVyIGFuZCBhbGxvdyB0aGUgZXhwb3J0IGZsYWcgdG8gYmUgc2hhcmVkIHdpdGggb3RoZXIgdGVhbSBtZW1iZXJzCi0odGhlIGJpbmRpbmdzIG9mIGNsYXNzcGF0aCB2YXJpYWJsZXMgYXJlIG5vdCBzaGFyZWFibGUpLgotPGg0PgotRXhwb3J0aW5nIEF1eGlsbGFyeSBMaWJyYXJpZXM8L2g0PgotTm90ZSB0aGF0IGV4cGxpY2l0IGV4cG9ydHMgYWxzbyBhZGRyZXNzIGFub3RoZXIgcHJvYmxlbSB0aGF0IGFyaXNlcyB3aGVuCi1hIHByb2plY3QgbmVlZHMgdG8gZXhwb3J0IGEgcHJlLWJ1aWx0IGxpYnJhcnkgaW4gYWRkaXRpb24gdG8gdGhlIHJlc3VsdHMKLW9mIGNvbXBpbGluZyBpdHMgc291cmNlIGZpbGVzICh0aGUgRWNsaXBzZSBkZWJ1Z2dlcidzIGpkaS5qYXIgaXMgYSBmaW5lCi1pbnN0YW5jZSBvZiB0aGlzKS4gSW4gRWNsaXBzZSAxLjAsIG9ubHkgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBwcm9qZWN0J3MKLWJpbmFyeSBvdXRwdXQgZm9sZGVyIGFyZSBleHBvcnRlZCB0byBkZXBlbmRlbnQgcHJvamVjdHMuIFRoaXMgcHJvcG9zYWwKLWFsbG93cyBhIHByb2plY3QgdG8gZXhwb3J0IGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBsaWJyYXJpZXMgYXMgcmVxdWlyZWQuCi08aDQ+Ci1FeHBvcnRpbmcgUHJvamVjdHM8L2g0PgotQnkgZXhwb3J0aW5nIG90aGVyIHByb2plY3RzLCBhIHByb2plY3QgY2FuIGNvbnNvbGlkYXRlIGFuZCBjb25jZW50cmF0ZQotdGhlIG91dHB1dHMgZnJvbSBzZXZlcmFsIG90aGVyIHByb2plY3RzOi4uCi08YmxvY2txdW90ZT5wcm9qZWN0IFAxCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUC9zb3VyY2U7IGV4cG9ydCBsaWJyYXJ5Ci0vUDEvbGliMS5qYXIKLTxicj4mbmJzcDsmbmJzcDsmbmJzcDsgb3V0cHV0IC9QMS9iaW4KLTxicj5wcm9qZWN0IFAyCi08YnI+Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IHNvdXJjZSAvUDIvc291cmNlOyBleHBvcnQgbGlicmFyeSAvUDIvbGliMi5qYXIKLTxicj4mbmJzcDsmbmJzcDsgb3V0cHV0IC9QMi9iaW4KLTxicj5wcm9qZWN0IFAxYW5kUDIKLTxicj4mbmJzcDsmbmJzcDsgYnVpbGQgY2xhc3NwYXRoID0gc291cmNlIC9QMWFuZFAyL3NvdXJjZTsgZXhwb3J0IHByb2plY3QKLVAxOyBleHBvcnQgcHJvamVjdCBQMgotPGJyPiZuYnNwOyZuYnNwOyBvdXRwdXQgL1AxYW5kUDIvYmluPC9ibG9ja3F1b3RlPgotRWZmZWN0aXZlIGJ1aWxkIGNsYXNzcGF0aCBvZiBQMWFuZFAyIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgZXhwb3J0ZWQgZnJvbQotYm90aCBQMSBhbmQgUDI6Ci08YmxvY2txdW90ZT5idWlsZCBjbGFzc3BhdGggPSBsaWJyYXJ5IC9QMWFuZFAyL3NvdXJjZTsgbGlicmFyeSAvUDEvYmluOwotbGlicmFyeSAvUDEvbGliMS5qYXI7IGxpYnJhcnkgL1AyL2JpbjsgbGlicmFyeSAvUDIvbGliMi5qYXIKLTxicj5vdXRwdXQgL1AxYW5kUDIvYmluPC9ibG9ja3F1b3RlPgotCi08aDM+Ci1Qcm9wb3NhbDogQWRtaXQgTGlicmFyeSBQcm9qZWN0cyB3aGljaCBDb250YWluIE5vIFNvdXJjZSBDb2RlPC9oMz4KLU9uZSBvYmplY3Rpb24gdG8gdGhpcyB3aG9sZSBhcHByb2FjaCBpcyB0aGF0IHRoZSBKYXZhIHByb2plY3QgaXMgYmVpbmcKLWhpamFja2VkLiBJbiB0aGUgb3JpZ2luYWwgZGVzaWduLCBhIEphdmEgcHJvamVjdCBpcyBhIGJ1aWxkYWJsZSBjb250YWluZXIKLW9mIEphdmEgc291cmNlIGNvZGUuIFRoZSBhZGRpdGlvbiBvZiBleHBvcnRlZCBsaWJyYXJpZXMgc3RhcnRzIHRvIHR1cm4KLXRoZSBwcm9qZWN0IGludG8gc29tZXRoaW5nIG1vcmUgZ2VuZXJhbC4gSWYgd2UgYXJlIGNvbWZvcnRhYmxlIHdpdGggdGhpcwotZ2VuZXJhbCB0cmVuZCwgdGhlcmUgYXJlIHdheXMgdGhhdCB0aGUgZGVzaWduIGNhbiBlbWJyYWNlIGl0IG1vcmUgd2hvbGUtaGVhcnRlZGx5LgotPHA+VGhlIGFib3ZlIHByb3Bvc2FsIHRvIGV4cGFuZCB0aGUgc2VtYW50aWNzIG9mIHJlcXVpcmVkIHByb2plY3QgY3JlYXRlcwotYSBuZXcgcm9sZSBmb3IgYSBKYXZhIHByb2plY3QgYXMgYSBjb250YWluZXIgb2YgbGlicmFyaWVzLiBUaGlzIG5vdGlvbgotb2YgPGI+bGlicmFyeSBwcm9qZWN0PC9iPiBpcyByb3VuZGVkIG91dCBieSBhbGxvd2luZyBKYXZhIHByb2plY3RzIHdpdGhvdXQKLXNvdXJjZSBvciBvdXRwdXQgZm9sZGVycy4gVGhlIGJ1aWxkIGNsYXNzcGF0aCBvZiBhIGxpYnJhcnkgcHJvamVjdCBvcmRlcnMKLXRoZSBsaXN0IG9mIGV4cG9ydGVkIGxpYnJhcmllcyBhbmQgcHJvamVjdHMgKGFuZCBwcm92aWRlcyB0aGUgYWRkaXRpb25hbAotY29udGV4dCByZXF1aXJlZCBmb3IgYnJvd3NpbmcgdGhlIHByb2plY3QgaXRzZWxmKS4KLTxwPkluIG91ciBleGFtcGxlLCB0aGUgbGlicmFyeSBwcm9qZWN0IGNvdWxkIGJlIGV4cHJlc3NlZCBtb3JlIGRpcmVjdGx5Ci13aXRob3V0IGhhdmluZyB0byBwb3N0dWxhdGUgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycyB3aGljaCBhcmUgY29tcGxldGVseQotdW5tb3RpdmF0ZWQgaW4gdGhpcyBjYXNlOgotPHA+cHJvamVjdCBQTGliCi08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJ1aWxkIGNsYXNzcGF0aCA9IDxiPmV4cG9ydDwvYj4gbGlicmFyeSBsaWIxLmphcjsKLS4uLjsgPGI+ZXhwb3J0PC9iPiBsaWJyYXJ5IGxpYjIwLmphcgotPHA+QSBsaWJyYXJ5IHByb2plY3QgaXMgcmVjb2duaXphYmxlIHNpbXBseSBieSB0aGUgYWJzZW5jZSBvZiBzb3VyY2UgZm9sZGVycwotb24gdGhlIGJ1aWxkIGNsYXNzcGF0aC4gKFdlIGNvbnNpZGVyZWQgYWRkaW5nIGEgbmV3IGZsYWcgdG8gdGhlIHByb2plY3QKLXRvIGV4cGxpY2l0bHkgbWFyayBsaWJyYXJ5IHByb2plY3RzLCBidXQgZGVjaWRlZCB0aGlzIHdhcyBub3QgbmVjZXNzYXJ5Ci1hbmQgd291bGQgYmUgY29uZnVzaW5nLikKLTxwPk5vdGUgdGhhdCBsaWJyYXJ5IHByb2plY3RzIGFyZSBub3QgImJ1aWxkYWJsZSIgaW4gYW55IG1lYW5pbmdmdWwgc2Vuc2UKLXNpbmNlIHRoZXkgbGFjayBzb3VyY2UgY29kZSB0byBjb21waWxlIChhbmQgd2l0aG91dCBzb3VyY2UgY29kZSB0aGVyZSBpcwotbm8gcHJlc3NpbmcgbmVlZCBmb3IgYSBiaW5hcnkgb3V0cHV0IGZvbGRlcikuIEhvd2V2ZXIsIHRoZXJlIHN0aWxsIG5lZWRzCi10byBiZSBhIG1lY2hhbmlzbSBmb3IgZGV0ZWN0aW5nIGFuZCByZXBvcnRpbmcgZXJyb3JzIGluIHRoZSBidWlsZCBjbGFzc3BhdGgKLWZvciBsaWJyYXJ5IHByb2plY3RzLiBFeGNlcHQgZm9yIHN1Y2ggY2hlY2tzLCB0aGUgSmF2YSBpbmNyZW1lbnRhbCBwcm9qZWN0Ci1idWlsZGVyIHNob3VsZCBpZ25vcmUgbGlicmFyeSBwcm9qZWN0cy4KLTxwPlRoZSBmb2xsb3dpbmcga2luZHMgb2YgZW50cmllcyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG9mIGEgbGlicmFyeSBwcm9qZWN0Ci13b3VsZCBzZXJ2ZSB0aGVzZSBwdXJwb3NlczoKLTx1bD4KLTxsaT4KLVNvdXJjZSBmb2xkZXJzIC0gYSBsaWJyYXJ5IHByb2plY3QgaGFzIG5vIHNvdXJjZSBmb2xkZXJzLCBieSBkZWZpbml0aW9uLjwvbGk+Ci0KLTxsaT4KLU91dHB1dCBmb2xkZXJzIC0gbm90IG5lZWRlZCBmb3IgYSBsaWJyYXJ5IHByb2plY3QuPC9saT4KLQotPGxpPgotVW5leHBvcnRlZCBsaWJyYXJpZXMgLSBwcm92aWRlcyBjb250ZXh0IHdoZW4gYnJvd3NpbmcgdGhpcyBwcm9qZWN0LjwvbGk+Ci0KLTxsaT4KLVVuZXhwb3J0ZWQgcmVxdWlyZWQgcHJvamVjdHMgLSBwcm92aWRlcyBjb250ZXh0IHdoZW4gYnJvd3NpbmcgdGhpcyBwcm9qZWN0LjwvbGk+Ci08L3VsPgotSG93ZXZlciwgdGhlIEFQSSAoYW5kIFVJPykgc2hvdWxkIGFsbG93IHRoZSBpbmZvcm1hdGlvbiBpbiBhbGwgZmllbGRzIHRvCi1iZSBtYWludGFpbmVkIGV2ZW4gZm9yIGxpYnJhcnkgcHJvamVjdHMsIHBvc3NpYmx5IHRvIGZhY2lsaXRhdGUgc3dpdGNoaW5nCi1hIHByb2plY3QgYmV0d2VlbiBhIHJlZ3VsYXIgYW5kIGEgbGlicmFyeSBwcm9qZWN0LgotPHA+VGhlIHdvcmtzcGFjZSBtdXN0IGNvbXB1dGUgYW4gaW5wdXQgZGVsdGEgZXZlbiBmb3IgaW5jcmVtZW50YWwgcHJvamVjdAotYnVpbGRlcnMgdGhhdCBpZ25vcmUgdGhlIGRlbHRhIHRoZXkgYXJlIGhhbmRlZC4gV2UgY29uc2lkZXJlZCB3aGV0aGVyIHdlCi1zaG91bGQgZ28gb25lIHN0ZXAgZnVydGhlciBhbmQgcmVtb3ZlIHRoZSBKYXZhIGJ1aWxkZXIgZnJvbSBhIGxpYnJhcnkgcHJvamVjdCdzCi1saXN0IG9mIGluY3JlbWVudGFsIHByb2plY3QgYnVpbGRlcnMuIFRoaXMgd291bGQgbWFrZSBpdCBjcnlzdGFsIGNsZWFyCi10aGF0IHRoZXJlIGlzIG5vIEphdmEgYnVpbGRpbmcgZ29pbmcgb24sIGFuZCBpdCB3b3VsZCByZWR1Y2Ugd29ya3NwYWNlCi1tZW1vcnkgZm9vdHByaW50IGJlY2F1c2UgdGhlIHdvcmtzcGFjZSB3b3VsZCBub3QgbmVlZCB0byByZW1lbWJlciB0aGUgc2hhcGUKLW9mIHRoZSByZXNvdXJjZSB0cmVlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IGJ1aWxkLiBIb3dldmVyLCBpZiB0aGUgYnVpbGRlcgotd2FzIHJlbW92ZWQgZm9yIGxpYnJhcnkgcHJvamVjdHMsIHRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgbWVjaGFuaXNtIHRvIGFkZAotaXQgaWYgdGhlIGNsYXNzcGF0aCB3YXMgY2hhbmdlZCB0byBpbmNsdWRlIGEgc291cmNlIHByb2plY3QuIFdlIGRlY2lkZWQKLXRoYXQgd2Ugc2hvdWxkIHNpbXBseSBhdm9pZCB0aGUgYWRkaXRpb25hbCBoYXNzbGVzIGFuZCBsZWF2ZSB0aGUgSmF2YSBidWlsZGVyCi1pbnN0YWxsZWQgZm9yIGFsbCBKYXZhIHByb2plY3RzLgotPGgzPgotQmFja2dyb3VuZDwvaDM+Ci1Gcm9tIFBoaWxpcHBlIE11bGV0IDA4LzMxLzIwMDEgMTI6MTMgUE0KLTxwPkkgYWxzbyB0aGluayB0aGlzIGhhcyB0byBiZSBhIGJhc2ljIG1lY2hhbmlzbSBhdCB0aGUgSmF2YUNvcmUgbGV2ZWwsCi13aGljaCB0aGUgUERFIGNhbiB0aGVuIHN1cmZhY2UgdG8gcGx1Z2luIHdyaXRlcnMuCi08YnI+SSB3b3VsZCBsaWtlIHRvIHNlZSB0aGlzIG9uZSBhZGRyZXNzZWQgYXNhcCwgc28gdGhhdCBpdCBpcyBwb3NzaWJsZQotdG8gc2hhcmUgcHJvamVjdHMgdHJhbnNwYXJlbnRseSBhdCBsZWFzdCBhbW9uZ3N0IHVzLgotPHA+PT09PT09PQotPHA+RnJvbSBFcmljaCBHYW1tYSBvbiAwOC8zMS8yMDAxIDEyOjQzIFBNCi08cD5IZXJlIGlzIHNvbWUgbW9yZSBpbnB1dCBvbiBvdXIgZmF2b3JpdGUgdG9waWMgIm1ha2UgdGhlIGJ1aWxkIGNsYXNzCi1wYXRoIGxlc3Mgc2Vuc2l0aXZlCi08YnI+d2l0aCByZWdhcmQgdG8gd2hldGhlciBhIHByb2plY3QgaXMgYSBzb3VyY2Ugb3IgYmluYXJ5IHByb2plY3QiLgotPHA+T3VyIGNvbmNsdXNpb24gaW4gU05aIHdhcyB0aGF0IHRoaXMgYm9pbHMgZG93biB0byBhIFBERSBwcm9qZWN0IGxheW91dAotaXNzdWUgKGJpbmFyeQotPGJyPnByb2plY3RzIGV0YykuIEhvd2V2ZXIsIHRoZSBFQyBkaXNjdXNzaW9uIGZyb20gYmVsb3cgaWxsdXN0cmF0ZXMgYQotdXNlIGNhc2UgZm9yIGFsbG93aW5nIHRvIGV4cG9ydAotPGJyPkpBUnMgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dCBmb2xkZXIgZnJvbSBhIHByb2plY3QsIHRoYXQgaXMgaW5kZXBlbmRlbnQKLW9mIFBERS4KLTxicj5UaGUgc2NlbmFyaW8gaXMgc2ltaWxhciB0byB0aGUgV1NBRCBzY2VuYXJpbyB3aXRoIGV4dGVuc2lvbiBkaXJzLiBJZgotd2Ugc3VwcG9ydCB0bwotPGJyPmNvbnRyaWJ1dGUgY29udGFpbmVkIEpBUnMgZnJvbSBhIHByb2plY3QgdGhlbiB0aGlzIHByb2JsZW0gd291bGQgYmUKLWFkZHJlc3NlZC4KLTxwPldlIHNob3VsZCB0aGVyZWZvcmUgcmVjb25zaWRlciB0aGUgc29sdXRpb24gaW5kZXBlbmRlbnQgb2YgdGhlIFBERSBpc3N1ZS4KLTxicj5JZiBJIGRvIHRoYXQgdGhlbiBJIGNvbWUgdG8gdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgcHJvcG9zZWQgbWVjaGFuaXNtCi1pcyB2YWx1YWJsZQotPGJyPmFuZCBJIHN1Z2dlc3QgdG8gZ28gYWhlYWQgd2l0aCBzcGVjaWZ5aW5nIGl0IGluIGRldGFpbC4KLTxwPlRob3VnaHRzPwotPHA+PT09PT09PQotPGJyPkZyb20gSm9uIFNrZWV0ICZsdDtza2VldEBwb2JveC5jb20+IG9uIEVjbGlwc2UgQ29ybmVyIDIwLjguMjAwMQotPHA+UmVmZXJlbmNpbmcgYSBwcm9qZWN0J3MgbGlicmFyaWVzIGluIGFub3RoZXIgcHJvamVjdDoKLTxicj5UaGUgcHJvamVjdCBJJ20gd29ya2luZyBvbiB1c2VzIGEgZmFpcmx5IGxhcmdlIG51bWJlciBvZiBsaWJyYXJpZXMKLTxicj4oYWJvdXQgMjAgamFyIGZpbGVzLCBJSVJDKS4gSSBoYWQgaG9wZWQgSSdkIGJlIGFibGUgdG8gY3JlYXRlIG9uZQotPGJyPnByb2plY3Qgd2hpY2ggdXNlZCB0aGVzZSBsaWJyYXJpZXMsIGFuZCBtYWtlIGFsbCBvdGhlciBwcm9qZWN0cyBoYXZlCi08YnI+dGhhdCBwcm9qZWN0IG9uIHRoZWlyIGJ1aWxkLXBhdGhzIHRvIGJyaW5nIGluIHRoZSBsaWJyYXJpZXMgLSB0aGF0Ci13YXkgSQotPGJyPndvdWxkbid0IG5lZWQgdG8gY2hhbmdlICpldmVyeSogcHJvamVjdCBldmVyeSB0aW1lIEkgYWRkZWQgb3IgcmVtb3ZlZAotYQotPGJyPmxpYnJhcnkuIChJdCdzIG5vdCBhIGNvbW1vbiBvcGVyYXRpb24sIGJ1dCBldmVuIHNvLi4uKSBVbmZvcnR1bmF0ZWx5LAotSQotPGJyPmNhbid0IGdldCB0aGlzIHRvIHdvcmsgLSBwdXR0aW5nIHByb2plY3QgQSBvbiB0aGUgY2xhc3NwYXRoIG9mIHByb2plY3QKLUIKLTxicj5vbmx5IHNlZW1zIHRvIHB1dCBwcm9qZWN0IEEncyBpbmRpdmlkdWFsIHNvdXJjZS9jbGFzcyBmaWxlcyBvbiB0aGUKLTxicj5jbGFzc3BhdGggZm9yIHByb2plY3QgQi4gSSd2ZSB0cmllZCBhZGRpbmcgYXMgYW4gZXh0ZXJuYWwgamFyIGFuZAotPGJyPmltcG9ydGluZyB0aGUgamFyIGZpbGUgaW50byB0aGUgcHJvamVjdCwgYW5kIGhhZCBubyBqb3kgd2l0aCBlaXRoZXIKLTooCi08aDM+Ci1Eb2N1bWVudCBIaXN0b3J5PC9oMz4KLVsuLi5dCi08YnI+UmV2aXNlZCAxMDo0MCBXZWRuZXNkYXkgU2VwdGVtYmVyIDUsIDIwMDEgLSBMaWJyYXJ5IHByb2plY3RzIG5vdCBleHBsaWNpdGx5Ci1tYXJrZWQuCi08YnI+UmV2aXNlZCAxMToxNSBTYXR1cmRheSBTZXB0ZW1iZXIgOCwgMjAwMSAtIEFsbG93IGV4cG9ydGluZyBleHRlcm5hbAotbGlicmFyaWVzIGFuZCBwcm9qZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi5qYXJzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLmphcnMKaW5kZXggNWVjZDg5Ny4uYjQ3YzFjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLmphcnMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLmphcnMKQEAgLTEsOSArMSw5IEBACi1qZHRjb3JlLmphcj1cDQotCWJhdGNoLFwNCi0JY29kZWFzc2lzdCxcDQotCWNvbXBpbGVyLFwNCi0JZXZhbCxcDQotCWZvcm1hdHRlcixcDQotCWRvbSxcDQotCW1vZGVsLCBcDQotCXNlYXJjaA0KK2pkdGNvcmUuamFyPVwKKwliYXRjaCxcCisJY29kZWFzc2lzdCxcCisJY29tcGlsZXIsXAorCWV2YWwsXAorCWZvcm1hdHRlcixcCisJZG9tLFwKKwltb2RlbCwgXAorCXNlYXJjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ucHJvcGVydGllcwppbmRleCA5NmZmNmQxLi5jMjI3NTNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMSwzICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCiBwbHVnaW5OYW1lPUphdmEgRGV2ZWxvcG1lbnQgVG9vbHMgQ29yZQogamF2YU5hdHVyZU5hbWU9SmF2YQpAQCAtNyw0ICsxNyw1IEBACiB0cmFuc2llbnRKYXZhUHJvYmxlbU5hbWU9VHJhbnNpZW50IEphdmEgUHJvYmxlbQogY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcnNOYW1lPUNsYXNzcGF0aCBWYXJpYWJsZSBJbml0aWFsaXplcnMKIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyc05hbWU9Q2xhc3NwYXRoIENvbnRhaW5lciBJbml0aWFsaXplcnMKLWNvZGVGb3JtYXR0ZXJOYW1lPUNvZGUgRm9ybWF0dGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorY29kZUZvcm1hdHRlcnNOYW1lPVNvdXJjZSBDb2RlIEZvcm1hdHRlcnMKK2phdmFUYXNrTmFtZT1KYXZhIFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvcGx1Z2luLnhtbAppbmRleCA1NTcwNjZkLi4zOTg0MjU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9wbHVnaW4ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3BsdWdpbi54bWwKQEAgLTcsNyArNyw3IEBACiA8cGx1Z2luCiAgICAgbmFtZSA9ICIlcGx1Z2luTmFtZSIKICAgICBpZCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZSIKLSAgICB2ZXJzaW9uID0gIjIuMC4wIgorICAgIHZlcnNpb24gPSAiMi4xLjAiCiAgICAgcHJvdmlkZXItbmFtZSA9ICIlcHJvdmlkZXJOYW1lIgogICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZSI+CiAKQEAgLTE5LDYgKzE5LDcgQEAKICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS54ZXJjZXMiLz4KICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiIG9wdGlvbmFsPSJ0cnVlIi8+CisgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIgb3B0aW9uYWw9InRydWUiLz4KIDwvcmVxdWlyZXM+CiAJCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMjcsNyArMjgsOCBAQAogCiA8cnVudGltZT4KICAgPGxpYnJhcnkgbmFtZT0iamR0Y29yZS5qYXIiPiAgCi0gICAgIDxleHBvcnQgbmFtZSA9ICIqIi8+CisgICAgIDxleHBvcnQgbmFtZT0iKiIvPgorICAgICA8cGFja2FnZXMgcHJlZml4ZXM9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbCIvPgogICA8L2xpYnJhcnk+IAogPC9ydW50aW1lPgogCkBAIC01Niw3ICs1OCw5IEBACiA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAotPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcnNOYW1lIiBpZD0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIvPgorPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcnNOYW1lIiAKKwlpZD0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIKKwlzY2hlbWE9InNjaGVtYS9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmV4c2QiLz4KICAgCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSBFeHRlbnNpb24gUG9pbnQ6IEluaXRpYWxpemVycyBvZiBDbGFzc3BhdGggQ29udGFpbmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KQEAgLTY3LDkgKzcxLDkgQEAKIDwhLS0gICAgY2xhc3MgIENEQVRBICNSRVFVSVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiA8IS0tICAgPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSB3aGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgLSBpZCAtIGFuIHVuaXF1ZSBuYW1lIGlkZW50aWZ5aW5nIGFsbCBjb250YWluZXJzIGZvciB3aGljaCB0aGlzIHJlc29sdmVyIHdpbGwgICAgLS0+Cis8IS0tICAgIC0gaWQgLSBhIHVuaXF1ZSBuYW1lIGlkZW50aWZ5aW5nIGFsbCBjb250YWluZXJzIGZvciB3aGljaCB0aGlzIGluaXRpYWxpemVyIHdpbGwgIC0tPgogPCEtLSAgICAgICAgICAgICAgYmUgYWN0aXZhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgLSBjbGFzcyAtIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBjb250YWluZXIgcmVzb2x2ZXIuICAgICAgICAgICAgICAgICAgICAgLS0+IAorPCEtLSAgICAtIGNsYXNzIC0gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRhaW5lciBpbml0aWFsaXplci4gICAgICAgICAgICAgICAgICAtLT4gCiA8IS0tICAgICAgICAgICAgICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVyUmVzb2x2ZXIgd2l0aCBhIHB1YmxpYyAgICAgICAgICAtLT4KIDwhLS0gICAgICAgICAgICAgIDAtYXJndW1lbnQgY29uc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CkBAIC03Nyw3ICs4MSw3IEBACiA8IS0tIEV4YW1wbGUgb2YgYW4gQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZm9yIGEgY2xhc3NwYXRoIGNvbnRhaW5lciBuYW1lZCAgICAgICAgIC0tPgogPCEtLSAiSkRLLzEuMiI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIDwhLS0gPGV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbnRhaW5lclJlc29sdmVyIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+ICAgICAgICAgICAgICAgICAgICAtLT4KIDwhLS0gICAgPGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiA8IS0tICAgICAgICAgaWQ9IkpESyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSAgICAgICAgIGNsYXNzPSJjb20uZXhhbXBsZS5NeUluaXRpYWxpemVyIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KQEAgLTg1LDcgKzg5LDkgQEAKIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogCi08ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcnNOYW1lIiBpZD0iY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiLz4KKzxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyc05hbWUiIAorCWlkPSJjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIgCisJc2NoZW1hPSJzY2hlbWEvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZXhzZCIvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSBFeHRlbnNpb24gUG9pbnQ6IEZvcm1hdHRlciBvZiBTb3VyY2UgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KQEAgLTEwOSw3ICsxMTUsOSBAQAogPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWNvZGVGb3JtYXR0ZXJOYW1lIiBpZD0iY29kZUZvcm1hdHRlciIvPgorPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY29kZUZvcm1hdHRlcnNOYW1lIiAKKwlpZD0iY29kZUZvcm1hdHRlciIKKwlzY2hlbWE9InNjaGVtYS9jb2RlRm9ybWF0dGVyLmV4c2QiLz4KIAogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTY0LDYgKzE3Miw4IEBACiAJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KIAk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgogCTxhdHRyaWJ1dGUgbmFtZSA9ImN5Y2xlRGV0ZWN0ZWQiLz4KKwk8YXR0cmlidXRlIG5hbWU9ImlkIi8+CisJPGF0dHJpYnV0ZSBuYW1lPSJhcmd1bWVudHMiLz4KIDwvZXh0ZW5zaW9uPiAgIAogCiA8IS0tIEphdmEgdHJhbnNpZW50IHByb2JsZW1zIC0tPgpAQCAtMTc1LDYgKzE4NSwxMyBAQAogCTxhdHRyaWJ1dGUgbmFtZT0iZmxhZ3MiLz4KIAk8YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50cyIvPgogPC9leHRlbnNpb24+CisKKzwhLS0gSmF2YSB0YXNrcyAtLT4KKworPGV4dGVuc2lvbiBpZD0idGFzayIgbmFtZT0iJWphdmFUYXNrTmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+IAorICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Cis8L2V4dGVuc2lvbj4KICAgICAKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIEV4dGVuc2lvbjogSmF2YWMgQW50IEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmV4c2QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDEyY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmV4c2QKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgPGFwcEluZm8+CisgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgaWQ9ImNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIiBuYW1lPSJDbGFzc3BhdGggQ29udGFpbmVyIEluaXRpYWxpemVycyIvPgorICAgPC9hcHBJbmZvPgorICAgPGRvY3VtZW50YXRpb24+CisgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGN1c3RvbSBjbGFzc3BhdGggY29udGFpbmVyIGluaXRpYWxpemVycywgCisgICAgICB3aGljaCBhcmUgdXNlZCB0byBsYXppbHkgYmluZCBjbGFzc3BhdGggY29udGFpbmVycyB0byBpbnN0YW5jZXMgb2Ygb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lci4KKyAgIDwvZG9jdW1lbnRhdGlvbj4KKzwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgdW5pcXVlIG5hbWUgaWRlbnRpZnlpbmcgYWxsIGNvbnRhaW5lcnMgZm9yIHdoaWNoIHRoaXMgaW5pdGlhbGl6ZXIgd2lsbCBiZSBhY3RpdmF0ZWQuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRhaW5lciBpbml0aWFsaXplci4KKyAgICAgICAgIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBwdWJsaWMgc3ViY2xhc3Mgb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMi4wCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEV4YW1wbGUgb2YgYSBkZWNsYXJhdGlvbiBvZiBhICZsdDtjb2RlJmd0O0NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyJmx0Oy9jb2RlJmd0OyBmb3IgYSBjbGFzc3BhdGggY29udGFpbmVyIG5hbWVkICJKREsvMS4yIjogICZsdDtwcmUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIiZndDsgICAgICAgICAgICAKKyAgICZsdDtjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWQ9IkpESyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgY2xhc3M9ImNvbS5leGFtcGxlLk15SW5pdGlhbGl6ZXIiLyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgJmx0O3AmZ3Q7CismbHQ7YSBocmVmPSJoZ2xlZ2FsLmh0bSImZ3Q7CisgJmx0O2ltZyBTUkM9Im5naWJtY3B5LmdpZiIKKyAgIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyAgIEJPUkRFUj0wIGhlaWdodD0xNCB3aWR0aD0zMjQmZ3Q7Jmx0Oy9hJmd0OworJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyLmV4c2QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjBiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY2hlbWEvY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplci5leHNkCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZHQuY29yZSI+Cis8YW5ub3RhdGlvbj4KKyAgIDxhcHBJbmZvPgorICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIGlkPSJjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIiBuYW1lPSJDbGFzc3BhdGggVmFyaWFibGUgSW5pdGlhbGl6ZXJzIi8+CisgICA8L2FwcEluZm8+CisgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgY3VzdG9tIGNsYXNzcGF0aCB2YXJpYWJsZSBpbml0aWFsaXplcnMsIAorICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gbGF6aWx5IGJpbmQgY2xhc3NwYXRoIHZhcmlhYmxlcy4KKyAgIDwvZG9jdW1lbnRhdGlvbj4KKzwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBuYW1lIGlkZW50aWZ5aW5nIHRoZSB2YXJpYWJsZSBmb3Igd2hpY2ggdGhpcyBpbml0aWFsaXplciB3aWxsIGJlIGFjdGl2YXRlZC4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgdmFyaWFibGUgaW5pdGlhbGl6ZXIuCisgICAgICAgICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgcHVibGljIHN1YmNsYXNzIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMi4wCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEV4YW1wbGUgb2YgYSBkZWNsYXJhdGlvbiBvZiBhICZsdDtjb2RlJmd0O0NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IGZvciBhIGNsYXNzcGF0aCB2YXJpYWJsZSBuYW1lZCAiRk9PIjogICZsdDtwcmUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIiJmd0OyAgICAgICAgICAgIAorICAgJmx0O2NsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHZhcmlhYmxlPSJGT08iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGNsYXNzPSJjb20uZXhhbXBsZS5DUFZJbml0aWFsaXplciIvJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAmbHQ7cCZndDsKKyZsdDthIGhyZWY9ImhnbGVnYWwuaHRtIiZndDsKKyAmbHQ7aW1nIFNSQz0ibmdpYm1jcHkuZ2lmIgorICAgQUxUPSJDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgQk9SREVSPTAgaGVpZ2h0PTE0IHdpZHRoPTMyNCZndDsmbHQ7L2EmZ3Q7CismbHQ7L3AmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NoZW1hL2NvZGVGb3JtYXR0ZXIuZXhzZCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jb2RlRm9ybWF0dGVyLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiNDY2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjaGVtYS9jb2RlRm9ybWF0dGVyLmV4c2QKQEAgLTAsMCArMSwxMDkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIj4KKzxhbm5vdGF0aW9uPgorICAgPGFwcEluZm8+CisgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgaWQ9ImNvZGVGb3JtYXR0ZXIiIG5hbWU9IkNvZGUgRm9ybWF0dGVycyIvPgorICAgPC9hcHBJbmZvPgorICAgPGRvY3VtZW50YXRpb24+CisgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIG5ldyBzb3VyY2UgY29kZSBmb3JtYXR0ZXIgaW1wbGVtZW50YXRpb25zLgorICAgPC9kb2N1bWVudGF0aW9uPgorPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb2RlRm9ybWF0dGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iY29kZUZvcm1hdHRlciI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGRlZmluZXMgdGhlIGNvZGUgZm9ybWF0dGVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvZGVGb3JtYXR0ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgMi4wCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEV4YW1wbGUgb2YgYW4gaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7SUNvZGVGb3JtYXR0ZXImbHQ7L2NvZGUmZ3Q7OiAgJmx0O3ByZSZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorJmx0O2V4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUZvcm1hdHRlciImZ3Q7ICAgICAgICAgICAgCisgICAmbHQ7Y29kZUZvcm1hdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGNsYXNzPSJjb20uZXhhbXBsZS5NeUNvZGVGb3JtYXR0ZXIiLyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgJmx0O3AmZ3Q7CismbHQ7YSBocmVmPSJoZ2xlZ2FsLmh0bSImZ3Q7CisgJmx0O2ltZyBTUkM9Im5naWJtY3B5LmdpZiIKKyAgIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyAgIEJPUkRFUj0wIGhlaWdodD0xNCB3aWR0aD0zMjQmZ3Q7Jmx0Oy9hJmd0OworJmx0Oy9wJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYnVpbGRFeHRyYUphcnMueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9idWlsZEV4dHJhSmFycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzYjc3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvYnVpbGRFeHRyYUphcnMueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLi4iPgorCisJPHByb3BlcnR5IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHZhbHVlPSIiLz4KKworCTx0YXJnZXQgbmFtZT0ibWFpbiI+CisJCTxhdmFpbGFibGUgZmlsZT0iJHtiYXNlZGlyfS9qZHRDb21waWxlckFkYXB0ZXIuamFyIiBwcm9wZXJ0eT0iZG8ubm90LnJlYnVpbGQiLz4KKwkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZCIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJidWlsZCIgdW5sZXNzPSJkby5ub3QucmVidWlsZCI+CisJCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KKwkJPGFudGNhbGwgdGFyZ2V0PSJqZHRDb21waWxlckFkYXB0ZXIuamFyIi8+CisJCTxhbnRjYWxsIHRhcmdldD0icmVmcmVzaCIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KKwkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KKwkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgorCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iamR0Q29tcGlsZXJBZGFwdGVyLmphciIgZGVwZW5kcz0iaW5pdCI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vamR0Q29tcGlsZXJBZGFwdGVyLmphci5iaW4iLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2pkdENvbXBpbGVyQWRhcHRlci5qYXIuYmluIi8+CisJCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L2pkdENvbXBpbGVyQWRhcHRlci5qYXIuYmluIi8+CisJCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+CisJCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9qZHRDb21waWxlckFkYXB0ZXIuamFyLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB0YXJnZXQ9IjEuMSIgc291cmNlPSIxLjMiIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0ib24iIGluY2x1ZGVBbnRSdW50aW1lPSJubyIgYm9vdGNsYXNzcGF0aD0iJHtib290Y2xhc3NwYXRofSIgY2xhc3NwYXRoPSIuLi9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvYmluOy4uL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lLmphcjsuLi9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9iaW47Li4vb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzb3VyY2VzLmphcjsuLi9vcmcuYXBhY2hlLmFudC9hbnQuamFyOy4uL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JpbjsuLi9vcmcuZWNsaXBzZS5qZHQuY29yZS9qZHRjb3JlLmphcjsiPgorCQkJPHNyYyBwYXRoPSJhbnRhZGFwdGVyLyIvPgorCQk8L2phdmFjPgorCQk8IS0tIGNvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyBhY3RpdmF0ZSB3aGVuIHdlIAorCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vamR0Q29tcGlsZXJBZGFwdGVyLmphci5iaW4iPgorCQkJPGZpbGVzZXQgZGlyPSJhbnRhZGFwdGVyLyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgorCQk8L2NvcHk+IC0tPgorCQk8amFyIGphcmZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vamR0Q29tcGlsZXJBZGFwdGVyLmphciIgYmFzZWRpcj0iJHt0ZW1wLmZvbGRlcn0vamR0Q29tcGlsZXJBZGFwdGVyLmphci5iaW4iLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KKwkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2pkdENvbXBpbGVyQWRhcHRlci5qYXIiLz4KKwkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgorCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cGx1Z2lufSIgZGVwdGg9ImluZmluaXRlIi8+CisJPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKaW5kZXggNmRiYmJmNy4uNGJlOTJjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NjcmlwdHMvZXhwb3J0cGx1Z2luLnhtbApAQCAtMSwyOCArMSw0NyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIAogPCEtLSBidWlsZCBzY3JpcHQgdG8gY3JlYXRlIGEgcGx1Z2luIGZyb20gb3JnLmVjbGlwc2UuamR0LmNvcmUgLS0+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgZGVmYXVsdD0iZXhwb3J0IHBsdWctaW4gW18yLjAuMF0iIGJhc2VkaXI9Ii4uIj4KKzxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiBkZWZhdWx0PSJleHBvcnQgcGx1Zy1pbiBbXzIuMS4wXSIgYmFzZWRpcj0iLi4iPgogCiA8dGFyZ2V0IG5hbWU9Inp6X2luaXQiPgogCTx0c3RhbXAvPgogCTxwcm9wZXJ0eSBuYW1lPSJleHBvcnQtZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KIDwvdGFyZ2V0PgogCis8dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMi4xLjBdIiBkZXBlbmRzPSJ6el9pbml0Ij4KKwk8YW50Y2FsbCB0YXJnZXQ9Inp6X2ludGVybmFsX2V4cG9ydCI+CisJCTxwYXJhbSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9vcmcuZWNsaXBzZS5qZHQuY29yZV8yLjEuMCIvPgorCTwvYW50Y2FsbD4KKzwvdGFyZ2V0PgorCis8dGFyZ2V0IG5hbWU9ImV4cG9ydCBwbHVnLWluIFtfMi4xLjBdIChkaXJlY3Rvcnkgc3RydWN0dXJlKSIgZGVwZW5kcz0ienpfaW5pdCI+CisJPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnRfc3RydWN0dXJlIj4KKwkJPHBhcmFtIG5hbWU9ImJpbl9kZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LmNvcmVfMi4xLjAiLz4KKwkJPHBhcmFtIG5hbWU9InNyY19kZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8yLjEuMC9zcmMvb3JnLmVjbGlwc2UuamR0LmNvcmVfMi4xLjAiLz4KKwk8L2FudGNhbGw+Cis8L3RhcmdldD4KKworPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzIuMC4xXSIgZGVwZW5kcz0ienpfaW5pdCI+CisJPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgorCQk8cGFyYW0gbmFtZT0iZGVzdCIgdmFsdWU9IiR7ZXhwb3J0LWRpcn0vb3JnLmVjbGlwc2UuamR0LmNvcmVfMi4wLjEiLz4KKwk8L2FudGNhbGw+Cis8L3RhcmdldD4KKwogPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzIuMC4wXSIgZGVwZW5kcz0ienpfaW5pdCI+CiAJPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCTxwYXJhbSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9vcmcuZWNsaXBzZS5qZHQuY29yZV8yLjAuMCIvPgorCQk8cGFyYW0gbmFtZT0iZGVzdCIgdmFsdWU9IiR7ZXhwb3J0LWRpcn0vb3JnLmVjbGlwc2UuamR0LmNvcmVfMi4wLjAiLz4KIAk8L2FudGNhbGw+CiA8L3RhcmdldD4KIAogPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbXzEuOS4wXSIgZGVwZW5kcz0ienpfaW5pdCI+CiAJPGFudGNhbGwgdGFyZ2V0PSJ6el9pbnRlcm5hbF9leHBvcnQiPgotCTxwYXJhbSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtleHBvcnQtZGlyfS9vcmcuZWNsaXBzZS5qZHQuY29yZV8xLjkuMCIvPgorCQk8cGFyYW0gbmFtZT0iZGVzdCIgdmFsdWU9IiR7ZXhwb3J0LWRpcn0vb3JnLmVjbGlwc2UuamR0LmNvcmVfMS45LjAiLz4KIAk8L2FudGNhbGw+CiA8L3RhcmdldD4KIAogPHRhcmdldCBuYW1lPSJleHBvcnQgcGx1Zy1pbiBbbm8gdmVyc2lvbl0iIGRlcGVuZHM9Inp6X2luaXQiPgogCTxhbnRjYWxsIHRhcmdldD0ienpfaW50ZXJuYWxfZXhwb3J0Ij4KLQk8cGFyYW0gbmFtZT0iZGVzdCIgdmFsdWU9IiR7ZXhwb3J0LWRpcn0vb3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KKwkJPHBhcmFtIG5hbWU9ImRlc3QiIHZhbHVlPSIke2V4cG9ydC1kaXJ9L29yZy5lY2xpcHNlLmpkdC5jb3JlIi8+CiAJPC9hbnRjYWxsPgogPC90YXJnZXQ+CiAKQEAgLTYwLDYgKzc5LDU3IEBACiAKIAk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Y29yZXNyYy56aXAiIC8+CiAJPHppcCB6aXBmaWxlPSIke2Rlc3R9L2pkdGNvcmVzcmMuemlwIj4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJiYXRjaCIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJjb2RlYXNzaXN0IiAvPgorCSAgICA8emlwZmlsZXNldCBkaXI9ImNvbXBpbGVyIiAvPgorCSAgICA8emlwZmlsZXNldCBkaXI9ImRvbSIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJldmFsIiAvPgorCSAgICA8emlwZmlsZXNldCBkaXI9ImZvcm1hdHRlciIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJtb2RlbCIgLz4KKwkgICAgPHppcGZpbGVzZXQgZGlyPSJzZWFyY2giIC8+CisJPC96aXA+CQkKKwk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Q29tcGlsZXJBZGFwdGVyc3JjLnppcCIgLz4KKwk8emlwIHppcGZpbGU9IiR7ZGVzdH0vamR0Q29tcGlsZXJBZGFwdGVyc3JjLnppcCI+CisJCTx6aXBmaWxlc2V0IGRpcj0iYW50YWRhcHRlciIgLz4KKwk8L3ppcD4JICAgIAorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0ienpfaW50ZXJuYWxfZXhwb3J0X3N0cnVjdHVyZSI+CisKKwk8dHN0YW1wLz4KKworCTxlY2hvIG1lc3NhZ2U9IlRBUkdFVDogJHtleHBvcnQtZGlyfSIgLz4KKwk8bWtkaXIgZGlyPSIke2V4cG9ydC1kaXJ9IiAvPgorCTxkZWxldGUgZGlyPSIke2Jpbl9kZXN0fSIgLz4KKwk8ZGVsZXRlIGRpcj0iJHtzcmNfZGVzdH0iIC8+CisJPG1rZGlyIGRpcj0iJHtiaW5fZGVzdH0iIC8+CisJPG1rZGlyIGRpcj0iJHtzcmNfZGVzdH0iIC8+CisKKwk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Y29yZS5qYXIiIC8+CisJPGphciAKKwkJamFyZmlsZT0iJHtiaW5fZGVzdH0vamR0Y29yZS5qYXIiCisJCWJhc2VkaXI9ImJpbiIgCisJCWV4Y2x1ZGVzPSIqKi9KRFRDb21waWxlckFkYXB0ZXIuY2xhc3MiLz4KKwkJCisJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIGpkdENvbXBpbGVyQWRhcHRlci5qYXIiIC8+CisJPGphciAKKwkJamFyZmlsZT0iJHtiaW5fZGVzdH0vamR0Q29tcGlsZXJBZGFwdGVyLmphciIKKwkJYmFzZWRpcj0iYmluIiAKKwkJaW5jbHVkZXM9IioqL0pEVENvbXBpbGVyQWRhcHRlci5jbGFzcyIvPgorCisJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIHBsdWdpbi54bWwiIC8+CisJPGNvcHkgZmlsZT0icGx1Z2luLnhtbCIgdG9kaXI9IiR7YmluX2Rlc3R9IiAvPgorCTxlY2hvIG1lc3NhZ2U9IlVQREFURSBwbHVnaW4ucHJvcGVydGllcyIgLz4KKwk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7YmluX2Rlc3R9IiAvPgorCisJPGVjaG8gbWVzc2FnZT0iVVBEQVRFIC5vcHRpb25zIiAvPgorCTxjb3B5IGZpbGU9Ii5vcHRpb25zIiB0b2Rpcj0iJHtiaW5fZGVzdH0iIC8+CisKKwk8ZWNobyBtZXNzYWdlPSJVUERBVEUgYWJvdXQuaHRtbCIgLz4KKwk8Y29weSBmaWxlPSJhYm91dC5odG1sIiB0b2Rpcj0iJHtiaW5fZGVzdH0iIC8+CisKKwk8ZWNobyBtZXNzYWdlPSJVUERBVEUgamR0Y29yZXNyYy56aXAiIC8+CisJPHppcCB6aXBmaWxlPSIke3NyY19kZXN0fS9qZHRjb3Jlc3JjLnppcCI+CiAJICAgIDx6aXBmaWxlc2V0IGRpcj0iYW50YWRhcHRlciIgLz4KIAkgICAgPHppcGZpbGVzZXQgZGlyPSJiYXRjaCIgLz4KIAkgICAgPHppcGZpbGVzZXQgZGlyPSJjb2RlYXNzaXN0IiAvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaENvbnN0YW50cy5qYXZhCmluZGV4IGJiMDRkYTMuLmU5NTM0MmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoQ29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy4qOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCmluZGV4IDFmYzI0MTQuLjdlOTRjY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lKYXZhU2VhcmNoU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCmluZGV4IDhkYTA2ZDcuLjA2N2ZhNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSUphdmFTZWFyY2hTY29wZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwpAQCAtNDQsMTUgKzQ0LDI4IEBACiAvKioKICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIGVsZW1lbnQuCiAgKgotICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKKyAqIEBwYXJhbSBlbGVtZW50IHRoZSBnaXZlbiBlbGVtZW50CiAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGluIHRoaXMgc2NvcGUKICAqLwogcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpOwogLyoqCiAgKiBSZXR1cm5zIHRoZSBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzIGFuZCBKQVJzIGZvciB0aGlzIHNlYXJjaCBzY29wZS4KKyAqIDx1bD4KKyAqIDxsaT4gSWYgdGhlIHBhdGggaXMgYSBwcm9qZWN0IHBhdGgsIHRoaXMgaXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcHJvamVjdAorICogICAgICAgKHNlZSA8Y29kZT5JUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTwvY29kZT4pLgorICogICAgICAgIEUuZy4gL015UHJvamVjdAorICogPC9saT4KKyAqIDxsaT4gSWYgdGhlIHBhdGggaXMgYSBKQVIgcGF0aCBhbmQgdGhpcyBKQVIgaXMgaW50ZXJuYWwgdG8gdGhlIHdvcmtzcGFjZSwKKyAqICAgICAgICB0aGlzIGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIEpBUiBmaWxlIChzZWUgPGNvZGU+SVJlc291cmNlLmdldEZ1bGxQYXRoKCk8L2NvZGU+KS4KKyAqICAgICAgICBFLmcuIC9NeVByb2plY3QvbXlsaWIuamFyCisgKiA8L2xpPgorICogPGxpPiBJZiB0aGUgcGF0aCBpcyBhIEpBUiBwYXRoIGFuZCB0aGlzIEpBUiBpcyBleHRlcm5hbCB0byB0aGUgd29ya3NwYWNlLAorICogICAgICAgIHRoaXMgaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGUgSkFSIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgorICogICAgICAgIEUuZy4gZDpcbGlic1xteWxpYi5qYXIKKyAqIDwvbGk+CisgKiA8L3VsPgogICogCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBhdGhzIHRvIHRoZSBlbmNsb3NpbmcgcHJvamVjdHMgYW5kIEpBUlMuIEEgcHJvamVjdCBwYXRoIGlzCi0gKgkJCXRoZSBmdWxsIHBhdGggdG8gdGhlIHByb2plY3QuIEEgSkFSIHBhdGggaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGUgSkFSIGZpbGUuCQkJCisgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBhdGhzIHRvIHRoZSBlbmNsb3NpbmcgcHJvamVjdHMgYW5kIEpBUlMuCiAgKi8KIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7CiAvKioKQEAgLTYwLDcgKzczLDggQEAKICAqIGluIGZvbGRlcnMgb3Igd2l0aGluIEpBUnMpLgogICogCiAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBzY29wZSBjb250YWlucyBhbnkgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcwotICogQGRlcHJlY2F0ZWQKKyAqIEBkZXByZWNhdGVkIFVzZSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdKSB3aXRoIHRoZSBwYWNrYWdlIGZyYWdtZW50CisgKiAJCQkJcm9vdHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBiaW5hcmllcyBpbnN0ZWFkCiAgKi8KIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpOwogLyoqCkBAIC02OCw3ICs4Miw4IEBACiAgKiB0aGUgcHJvamVjdHMgb2YgdGhlIHJlc291cmNlcyBvZiB0aGlzIHNlYXJjaCBzY29wZS4KICAqIAogICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2NvcGUgaW5jbHVkZXMgY2xhc3NwYXRocwotICogQGRlcHJlY2F0ZWQgCisgKiBAZGVwcmVjYXRlZCBVc2UgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSkgCisgKiAJCQkJd2l0aCBhIGphdmEgcHJvamVjdCBpbnN0ZWFkCiAgKi8KIGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKCk7CiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVNlYXJjaFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVNlYXJjaFBhdHRlcm4uamF2YQppbmRleCAyNzgzOWNlLi5iNjNmODlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lTZWFyY2hQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JU2VhcmNoUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVR5cGVOYW1lUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL0lUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCmluZGV4IGQzODA5ZTIuLmZhNGUwYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvSVR5cGVOYW1lUmVxdWVzdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9JVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaDsKIAogLyoqCkBAIC0zMiw3ICszMiwxMSBAQAogICogICAgICAgICAgaXMgYSB0b3AtbGV2ZWwgdHlwZS4KICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGNsYXNzLiBJZiB0aGUgcmVzb3VyY2UgaXMgYSAuY2xhc3MgZmlsZQogICogICAgICAgICAgb3IgYSAuamF2YSBmaWxlLCB0aGlzIGlzIHRoZSBmdWxsIHBhdGggaW4gdGhlIHdvcmtzcGFjZSB0byB0aGlzIHJlc291cmNlLiBJZiB0aGUKLSAqICAgICAgICAgIHJlc291cmNlIGlzIGEgLnppcCBvciAuamFyIGZpbGUsIHRoaXMgaXMgdGhlIGZ1bGwgT1MgcGF0aCB0byB0aGlzIGZpbGUuCisgKiAgICAgICAgICByZXNvdXJjZSBpcyBhbiBhcmNoaXZlIChpLmUuIGEgLnppcCBvciAuamFyIGZpbGUpLCB0aGUgcGF0aCBpcyBjb21wb3NlZCBvZiAyIHBhdGhzIHNlcGFyYXRlZAorICoJCSAJIGJ5IDxjb2RlPklKYXZhU2VhcmNoU2NvcGUuSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SPC9jb2RlPjogCisgKgkJCSB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBleHRlcm5hbCBhcmNoaXZlKSwgCisgKgkJCSBvciB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIDxjb2RlPklQYXRoPC9jb2RlPiB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gaW50ZXJuYWwgYXJjaGl2ZSksIAorICogCQkgdGhlIHNlY29uZCBwYXRoIGlzIHRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbnNpZGUgdGhlIGFyY2hpdmUuCiAgKi8KIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpOwogLyoqCkBAIC00Nyw3ICs1MSwxMSBAQAogICogICAgICAgICAgaXMgYSB0b3AtbGV2ZWwgdHlwZS4KICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZS4gSWYgdGhlIHJlc291cmNlIGlzIGEgLmNsYXNzIGZpbGUKICAqICAgICAgICAgIG9yIGEgLmphdmEgZmlsZSwgdGhpcyBpcyB0aGUgZnVsbCBwYXRoIGluIHRoZSB3b3Jrc3BhY2UgdG8gdGhpcyByZXNvdXJjZS4gSWYgdGhlCi0gKiAgICAgICAgICByZXNvdXJjZSBpcyBhIC56aXAgb3IgLmphciBmaWxlLCB0aGlzIGlzIHRoZSBmdWxsIE9TIHBhdGggdG8gdGhpcyBmaWxlLgotICovCisgKiAgICAgICAgICByZXNvdXJjZSBpcyBhbiBhcmNoaXZlIChpLmUuIGEgLnppcCBvciAuamFyIGZpbGUpLCB0aGUgcGF0aCBpcyBjb21wb3NlZCBvZiAyIHBhdGhzIHNlcGFyYXRlZAorICoJCSAJIGJ5IDxjb2RlPklKYXZhU2VhcmNoU2NvcGUuSkFSX0ZJTEVfRU5UUllfU0VQQVJBVE9SPC9jb2RlPjogCisgKgkJCSB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgZnVsbCBPUyBwYXRoIHRvIHRoZSBhcmNoaXZlIChpZiBpdCBpcyBhbiBleHRlcm5hbCBhcmNoaXZlKSwgCisgKgkJCSBvciB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIDxjb2RlPklQYXRoPC9jb2RlPiB0byB0aGUgYXJjaGl2ZSAoaWYgaXQgaXMgYW4gaW50ZXJuYWwgYXJjaGl2ZSksIAorICogCQkgdGhlIHNlY29uZCBwYXRoIGlzIHRoZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbnNpZGUgdGhlIGFyY2hpdmUuCisgKiAqLwogdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKaW5kZXggZDVkZWU5Yi4uOGQxMDgxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9jb3JlL3NlYXJjaC9TZWFyY2hFbmdpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSGllcmFyY2h5U2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkluZGV4U2VhcmNoQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOwpAQCAtNDYsMTMgKzQ3LDE2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZWFyY2hFbmdpbmUgewogCi0JLyoqCi0JICogQSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgCi0JICogY29tcGlsYXRpb24gdW5pdHMuCi0JICovCi0JcHJpdmF0ZSBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gVkVSQk9TRSA9IGZhbHNlOwkKKy8qKgorICogQSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHRoYXQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXIgb3JpZ2luYWwgCisgKiBjb21waWxhdGlvbiB1bml0cy4KKyAqLworcHJpdmF0ZSBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzID0gbnVsbDsKKworLyoqCisgKiBGb3IgdHJhY2luZyBwdXJwb3NlLgorICovCQorcHVibGljIHN0YXRpYyBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsJCiAKIC8qKgogICogQ3JlYXRlcyBhIG5ldyBzZWFyY2ggZW5naW5lLgpAQCAtNzIsNiArNzYsMzkgQEAKIHB1YmxpYyBTZWFyY2hFbmdpbmUoSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcykgewogCXRoaXMud29ya2luZ0NvcGllcyA9IHdvcmtpbmdDb3BpZXM7CiB9CisvKgorICogUmVtb3ZlcyBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHRoZSBvbmVzIHRoYXQgY2Fubm90IHNlZSB0aGUgZ2l2ZW4gZm9jdXMuCisgKi8KK3ByaXZhdGUgSVdvcmtpbmdDb3B5W10gZmlsdGVyV29ya2luZ0NvcGllcyhJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLCBJSmF2YUVsZW1lbnQgZm9jdXMsIGJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCkgeworCWlmIChmb2N1cyA9PSBudWxsIHx8IHdvcmtpbmdDb3BpZXMgPT0gbnVsbCkgcmV0dXJuIHdvcmtpbmdDb3BpZXM7CisJd2hpbGUgKCEoZm9jdXMgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpICYmICEoZm9jdXMgaW5zdGFuY2VvZiBKYXJQYWNrYWdlRnJhZ21lbnRSb290KSkgeworCQlmb2N1cyA9IGZvY3VzLmdldFBhcmVudCgpOworCX0KKwlpbnQgbGVuZ3RoID0gd29ya2luZ0NvcGllcy5sZW5ndGg7CisJSVdvcmtpbmdDb3B5W10gcmVzdWx0ID0gbnVsbDsKKwlpbnQgaW5kZXggPSAtMTsKKwlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKwkJSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gd29ya2luZ0NvcGllc1tpXTsKKwkJSVBhdGggcHJvamVjdE9ySmFyID0gSW5kZXhTZWxlY3Rvci5nZXRQcm9qZWN0T3JKYXIoKElKYXZhRWxlbWVudCl3b3JraW5nQ29weSkuZ2V0UGF0aCgpOworCQlpZiAoIUluZGV4U2VsZWN0b3IuY2FuU2VlRm9jdXMoZm9jdXMsIGlzUG9seW1vcnBoaWNTZWFyY2gsIHByb2plY3RPckphcikpIHsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IG5ldyBJV29ya2luZ0NvcHlbbGVuZ3RoLTFdOworCQkJCVN5c3RlbS5hcnJheWNvcHkod29ya2luZ0NvcGllcywgMCwgcmVzdWx0LCAwLCBpKTsKKwkJCQlpbmRleCA9IGk7CisJCQl9CisJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJlc3VsdFtpbmRleCsrXSA9IHdvcmtpbmdDb3B5OworCQl9CisJfQorCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQlpZiAocmVzdWx0Lmxlbmd0aCAhPSBpbmRleCkgeworCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHJlc3VsdCA9IG5ldyBJV29ya2luZ0NvcHlbaW5kZXhdLCAwLCBpbmRleCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9IGVsc2UgeworCQlyZXR1cm4gd29ya2luZ0NvcGllczsKKwl9Cit9CiAvKioKICAqIFJldHVybnMgYSBqYXZhIHNlYXJjaCBzY29wZSBsaW1pdGVkIHRvIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGdpdmVuIHR5cGUuCiAgKiBUaGUgamF2YSBlbGVtZW50cyByZXN1bHRpbmcgZnJvbSBhIHNlYXJjaCB3aXRoIHRoaXMgc2NvcGUgd2lsbApAQCAtOTgsMTEgKzEzNSwxMCBAQAogICogQGRlcHJlY2F0ZWQgVXNlIGNyZWF0ZUphdmFTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSkgaW5zdGVhZAogICovCiBwdWJsaWMgc3RhdGljIElKYXZhU2VhcmNoU2NvcGUgY3JlYXRlSmF2YVNlYXJjaFNjb3BlKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCUphdmFDb3JlIGphdmFDb3JlID0gSmF2YUNvcmUuZ2V0SmF2YUNvcmUoKTsKIAlpbnQgbGVuZ3RoID0gcmVzb3VyY2VzLmxlbmd0aDsKIAlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbbGVuZ3RoXTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWVsZW1lbnRzW2ldID0gamF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1tpXSk7CisJCWVsZW1lbnRzW2ldID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1tpXSk7CiAJfQogCXJldHVybiBjcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwogfQpAQCAtMTMzLDcgKzE2OSw3IEBACiAgKiBSZXR1cm5zIGEgamF2YSBzZWFyY2ggc2NvcGUgbGltaXRlZCB0byB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50cy4KICAqIFRoZSBqYXZhIGVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIGEgc2VhcmNoIHdpdGggdGhpcyBzY29wZSB3aWxsCiAgKiBiZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudHMuCi0gKiA8cD4KKyAqIAogICogSWYgYW4gZWxlbWVudCBpcyBhbiBJSmF2YVByb2plY3QsIHRoZW4gdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVycywgCiAgKiBpdHMgamFycyAoZXh0ZXJuYWwgYW5kIGludGVybmFsKSBhbmQgLSBpZiBzcGVjaWZpZWQgLSBpdHMgcmVmZXJlbmNlZCBwcm9qZWN0cyAKICAqICh3aXRoIHRoZWlyIHNvdXJjZSBmb2xkZXJzIGFuZCBqYXJzLCByZWN1cnNpdmVseSkgd2lsbCBiZSBpbmNsdWRlZC4KQEAgLTE4Myw3ICsyMTksNyBAQAogICogUmV0dXJucyBhIHNlYXJjaCBwYXR0ZXJuIGJhc2VkIG9uIGEgZ2l2ZW4gc3RyaW5nIHBhdHRlcm4uIFRoZSBzdHJpbmcgcGF0dGVybnMgc3VwcG9ydCAnKicgd2lsZC1jYXJkcy4KICAqIFRoZSByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBuYXJyb3cgZG93biB0aGUgdHlwZSBvZiBleHBlY3RlZCByZXN1bHRzLgogICoKLSAqIDxwPgorICogPGJyPgogICoJRXhhbXBsZXM6CiAgKgk8dWw+CiAgKiAJCTxsaT5zZWFyY2ggZm9yIGNhc2UgaW5zZW5zaXRpdmUgcmVmZXJlbmNlcyB0byA8Y29kZT5PYmplY3Q8L2NvZGU+OgpAQCAtMTkzLDYgKzIyOSw3IEBACiAgKiAgCTxsaT5zZWFyY2ggZm9yIGltcGxlbWVudGVycyBvZiA8Y29kZT5qYXZhLmxhbmcuUnVubmFibGU8L2NvZGU+OgogICoJCQk8Y29kZT5jcmVhdGVTZWFyY2hQYXR0ZXJuKCJqYXZhLmxhbmcuUnVubmFibGUiLCBUWVBFLCBJTVBMRU1FTlRPUlMsIHRydWUpOzwvY29kZT48L2xpPgogICogIDwvdWw+CisgKiBAcGFyYW0gc3RyaW5nUGF0dGVybiB0aGUgZ2l2ZW4gcGF0dGVybgogICogQHBhcmFtIHNlYXJjaEZvciBkZXRlcm1pbmVzIHRoZSBuYXR1cmUgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnRzCiAgKgk8dWw+CiAgKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT46IG9ubHkgbG9vayBmb3IgY2xhc3NlczwvbGk+CkBAIC0yMjEsOCArMjU4LDEzIEBACiAgKiBAcmV0dXJuIGEgc2VhcmNoIHBhdHRlcm4gb24gdGhlIGdpdmVuIHN0cmluZyBwYXR0ZXJuLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3RyaW5nIHBhdHRlcm4gaXMgaWxsLWZvcm1lZC4KICAqLwogcHVibGljIHN0YXRpYyBJU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKFN0cmluZyBzdHJpbmdQYXR0ZXJuLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQotCXJldHVybiBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oc3RyaW5nUGF0dGVybiwgc2VhcmNoRm9yLCBsaW1pdFRvLCBJSmF2YVNlYXJjaENvbnN0YW50cy5QQVRURVJOX01BVENILCBpc0Nhc2VTZW5zaXRpdmUpOworCWludCBtYXRjaE1vZGU7CisJaWYgKHN0cmluZ1BhdHRlcm4uaW5kZXhPZignKicpICE9IC0xIHx8IHN0cmluZ1BhdHRlcm4uaW5kZXhPZignPycpICE9IC0xKSB7CisJCW1hdGNoTW9kZSA9IElKYXZhU2VhcmNoQ29uc3RhbnRzLlBBVFRFUk5fTUFUQ0g7CisJfSBlbHNlIHsKKwkJbWF0Y2hNb2RlID0gSUphdmFTZWFyY2hDb25zdGFudHMuRVhBQ1RfTUFUQ0g7CisJfQorCXJldHVybiBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oc3RyaW5nUGF0dGVybiwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CiB9CiAvKioKICAqIFJldHVybnMgYSBzZWFyY2ggcGF0dGVybiBiYXNlZCBvbiBhIGdpdmVuIEphdmEgZWxlbWVudC4gCkBAIC0yMzMsMTQgKzI3NSwxNCBAQAogICogCTx1bD4KICAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUzwvY29kZT46IHdpbGwgc2VhcmNoIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCiAgKiAJCQllbGVtZW50LiBJbiBjYXNlIHRoZSBlbGVtZW50IGlzIGEgbWV0aG9kLCBkZWNsYXJhdGlvbnMgb2YgbWF0Y2hpbmcgbWV0aG9kcyBpbiBzdWJ0eXBlcyB3aWxsIGFsc28KLSAqICAJCWJlIGZvdW5kLCBhbGxvd2luZyB0byBmaW5kIGRlY2xhcmF0aW9ucyBvZiBhYnN0cmFjdCBtZXRob2RzLCBldGMuCisgKiAgCQliZSBmb3VuZCwgYWxsb3dpbmcgdG8gZmluZCBkZWNsYXJhdGlvbnMgb2YgYWJzdHJhY3QgbWV0aG9kcywgZXRjLjwvbGk+CiAgKgotICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUzwvY29kZT46IHdpbGwgc2VhcmNoIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCisgKgkJIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTPC9jb2RlPjogd2lsbCBzZWFyY2ggcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC48L2xpPgogICoKICAqCQkgPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUzwvY29kZT46IHdpbGwgc2VhcmNoIGZvciBlaXRoZXIgZGVjbGFyYXRpb25zIG9yIHJlZmVyZW5jZXMgYXMgc3BlY2lmaWVkCi0gKiAgCQlhYm92ZS4KKyAqICAJCWFib3ZlLjwvbGk+CiAgKgotICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTPC9jb2RlPjogZm9yIGludGVyZmFjZSwgd2lsbCBmaW5kIGFsbCB0eXBlcyB3aGljaCBpbXBsZW1lbnRzIGEgZ2l2ZW4gaW50ZXJmYWNlLgorICoJCSA8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTPC9jb2RlPjogZm9yIGludGVyZmFjZSwgd2lsbCBmaW5kIGFsbCB0eXBlcyB3aGljaCBpbXBsZW1lbnRzIGEgZ2l2ZW4gaW50ZXJmYWNlLjwvbGk+CiAgKgk8L3VsPgogICogQHJldHVybiBhIHNlYXJjaCBwYXR0ZXJuIGZvciBhIGphdmEgZWxlbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBpbGwtZm9ybWVkCiAgKi8KQEAgLTI1OSwxOCArMzAxLDE4IEBACiAvKioKICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuCiAgKi8KLXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKElKYXZhRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKK3ByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CiAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTWVtYmVyKSB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoKElNZW1iZXIpZWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CiAJCWlmIChjdSAhPSBudWxsKSB7CiAJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQkJcmV0dXJuIGN1LmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJCXJldHVybiBjdS5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpOwogCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gY3UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkJcmV0dXJuIGN1LmdldFJlc291cmNlKCk7CiAJCQl9CiAJCX0gCiAJfSAKLQlyZXR1cm4gZWxlbWVudC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlyZXR1cm4gZWxlbWVudC5nZXRSZXNvdXJjZSgpOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHdvcmtpbmcgY29waWVzIHVzZWQgdG8gZG8gdGhlIHNlYXJjaCBvbiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50LgpAQCAtMzE1LDEzICszNTcsMTMgQEAKICAqCQkgIGZvciBib3RoIGRlY2xhcmF0aW9ucyBhbmQgYWxsIHJlZmVyZW5jZXMgPC9saT4KICAqCSAgPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUzwvY29kZT46IHNlYXJjaCBmb3IKICAqCQkgIGFsbCBpbXBsZW1lbnRvcnMgb2YgYW4gaW50ZXJmYWNlOyB0aGUgdmFsdWUgaXMgb25seSB2YWxpZCBpZgotICoJCSAgdGhlIEphdmEgZWxlbWVudCByZXByZXNlbnRzIGFuIGludGVyZmFjZQorICoJCSAgdGhlIEphdmEgZWxlbWVudCByZXByZXNlbnRzIGFuIGludGVyZmFjZTwvbGk+CiAgKiAJPC91bD4KICAqIEBwYXJhbSBzY29wZSB0aGUgc2VhcmNoIHJlc3VsdCBoYXMgdG8gYmUgbGltaXRlZCB0byB0aGUgZ2l2ZW4gc2NvcGUKICAqIEBwYXJhbSByZXN1bHRDb2xsZWN0b3IgYSBjYWxsYmFjayBvYmplY3QgdG8gd2hpY2ggZWFjaCBtYXRjaCBpcyByZXBvcnRlZAkgCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgogICoJPHVsPgotICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldAorICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAgKgk8L3VsPgogICovCiBwdWJsaWMgdm9pZCBzZWFyY2goSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTM0MywxNCArMzg1LDE0IEBACiAgKgkJICBmb3IgYm90aCBkZWNsYXJhdGlvbnMgYW5kIGFsbCByZWZlcmVuY2VzIDwvbGk+CiAgKgkgIDxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlM8L2NvZGU+OiBzZWFyY2ggZm9yCiAgKgkJICBhbGwgaW1wbGVtZW50b3JzIG9mIGFuIGludGVyZmFjZTsgdGhlIHZhbHVlIGlzIG9ubHkgdmFsaWQgaWYKLSAqCQkgIHRoZSBKYXZhIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2UKKyAqCQkgIHRoZSBKYXZhIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbnRlcmZhY2U8L2xpPgogICogCTwvdWw+CiAgKiBAcGFyYW0gc2NvcGUgdGhlIHNlYXJjaCByZXN1bHQgaGFzIHRvIGJlIGxpbWl0ZWQgdG8gdGhlIGdpdmVuIHNjb3BlCiAgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CiAgKgk8dWw+Ci0gKgkJPGxpPnRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLSAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdDwvbGk+CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0PC9saT4KICAqCTwvdWw+CiAgKi8KIHB1YmxpYyB2b2lkIHNlYXJjaChJV29ya3NwYWNlIHdvcmtzcGFjZSwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBsaW1pdFRvLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewpAQCAtMzY4LDcgKzQxMCw3IEBACiAgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CiAgKgk8dWw+Ci0gKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0PC9saT4KICAqCTwvdWw+CiAgKi8KIHB1YmxpYyB2b2lkIHNlYXJjaChJV29ya3NwYWNlIHdvcmtzcGFjZSwgSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTM5MSwxNiArNDMzLDMzIEBACiAKIAkJLyogaW5kZXggc2VhcmNoICovCiAJCVBhdGhDb2xsZWN0b3IgcGF0aENvbGxlY3RvciA9IG5ldyBQYXRoQ29sbGVjdG9yKCk7CisJCQorCQkvLyBJbiB0aGUgY2FzZSBvZiBhIGhpZXJhcmNoeSBzY29wZSBtYWtlIHN1cmUgdGhhdCB0aGUgaGllcmFyY2h5IGlzIG5vdCBjb21wdXRlZC4KKwkJLy8gTWF0Y2hMb2NhdG9yIHdpbGwgZmlsdGVyIG91dCBlbGVtZW50cyBub3QgaW4gdGhlIGhpZXJhcmNoeQorCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSAoU2VhcmNoUGF0dGVybilzZWFyY2hQYXR0ZXJuOworCQlpZiAoc2NvcGUgaW5zdGFuY2VvZiBIaWVyYXJjaHlTY29wZSkgeworCQkJKChIaWVyYXJjaHlTY29wZSlzY29wZSkubmVlZHNSZWZyZXNoID0gZmFsc2U7CisJCQlwYXR0ZXJuLm5lZWRzUmVzb2x2ZSA9IHRydWU7IC8vIGZvcmNlIHJlc29sdmUgdG8gY29tcHV0ZSB0eXBlIGJpbmRpbmdzCisJCX0KIAogCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gKChKYXZhTW9kZWxNYW5hZ2VyKUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpKQogCQkJCQkJCQkJCS5nZXRJbmRleE1hbmFnZXIoKTsKIAkJaW50IGRldGFpbExldmVsID0gSUluZm9Db25zdGFudHMuUGF0aEluZm8gfCBJSW5mb0NvbnN0YW50cy5Qb3NpdGlvbkluZm87Ci0JCU1hdGNoTG9jYXRvciBtYXRjaExvY2F0b3IgPSBuZXcgTWF0Y2hMb2NhdG9yKChTZWFyY2hQYXR0ZXJuKXNlYXJjaFBhdHRlcm4sIGRldGFpbExldmVsLCByZXN1bHRDb2xsZWN0b3IsIHNjb3BlKTsKKwkJTWF0Y2hMb2NhdG9yIG1hdGNoTG9jYXRvciA9IAorCQkJbmV3IE1hdGNoTG9jYXRvcjIoCisJCQkJcGF0dGVybiwgCisJCQkJZGV0YWlsTGV2ZWwsIAorCQkJCXJlc3VsdENvbGxlY3RvciwgCisJCQkJc2NvcGUsCisJCQkJcHJvZ3Jlc3NNb25pdG9yID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDk1KQorCQkpOwogCiAJCWluZGV4TWFuYWdlci5wZXJmb3JtQ29uY3VycmVudEpvYigKIAkJCW5ldyBQYXR0ZXJuU2VhcmNoSm9iKAotCQkJCShTZWFyY2hQYXR0ZXJuKXNlYXJjaFBhdHRlcm4sIAorCQkJCXBhdHRlcm4sIAogCQkJCXNjb3BlLCAKKwkJCQlwYXR0ZXJuLmZvY3VzLAorCQkJCXBhdHRlcm4uaXNQb2x5bW9ycGhpY1NlYXJjaCgpLAogCQkJCWRldGFpbExldmVsLCAKIAkJCQlwYXRoQ29sbGVjdG9yLCAKIAkJCQlpbmRleE1hbmFnZXIpLApAQCAtNDEyLDggKzQ3MSw3IEBACiAJCW1hdGNoTG9jYXRvci5sb2NhdGVNYXRjaGVzKAogCQkJcGF0aENvbGxlY3Rvci5nZXRQYXRocygpLCAKIAkJCXdvcmtzcGFjZSwKLQkJCXRoaXMud29ya2luZ0NvcGllcywKLQkJCXByb2dyZXNzTW9uaXRvciA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCA5NSkKKwkJCWZpbHRlcldvcmtpbmdDb3BpZXModGhpcy53b3JraW5nQ29waWVzLCBwYXR0ZXJuLmZvY3VzLCBwYXR0ZXJuLmlzUG9seW1vcnBoaWNTZWFyY2goKSkKIAkJKTsKIAkJCiAKQEAgLTQ0MywzMyArNTAxLDMzIEBACiAgKiBAcGFyYW0gbWF0Y2hNb2RlIG9uZSBvZgogICogPHVsPgogICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5FWEFDVF9NQVRDSDwvY29kZT4gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGFyZSB0aGUgZnVsbCBuYW1lcwotICoJCQlvZiB0aGUgc2VhcmNoZWQgdHlwZXMuCisgKgkJCW9mIHRoZSBzZWFyY2hlZCB0eXBlcy48L2xpPgogICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5QUkVGSVhfTUFUQ0g8L2NvZGU+IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBhcmUgcHJlZml4ZXMgb2YgdGhlIG5hbWVzCi0gKgkJCW9mIHRoZSBzZWFyY2hlZCB0eXBlcy4KLSAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuUEFUVEVSTl9NQVRDSDwvY29kZT4gaWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdHlwZSBuYW1lIGNvbnRhaW4gd2lsZC1jYXJkcy4KKyAqCQkJb2YgdGhlIHNlYXJjaGVkIHR5cGVzLjwvbGk+CisgKgkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLlBBVFRFUk5fTUFUQ0g8L2NvZGU+IGlmIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHR5cGUgbmFtZSBjb250YWluIHdpbGQtY2FyZHMuPC9saT4KICAqIDwvdWw+CiAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHdoZXRoZXIgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUKICAqIEBwYXJhbSBzZWFyY2hGb3Igb25lIG9mCiAgKiA8dWw+Ci0gKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT4gaWYgc2VhcmNoaW5nIGZvciBjbGFzc2VzIG9ubHkKLSAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4gaWYgc2VhcmNoaW5nIGZvciBpbnRlcmZhY2VzIG9ubHkKLSAqIAkJPGxpPjxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEU8L2NvZGU+IGlmIHNlYXJjaGluZyBmb3IgYm90aCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzwvY29kZT4gaWYgc2VhcmNoaW5nIGZvciBjbGFzc2VzIG9ubHk8L2xpPgorICogCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFPC9jb2RlPiBpZiBzZWFyY2hpbmcgZm9yIGludGVyZmFjZXMgb25seTwvbGk+CisgKiAJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFPC9jb2RlPiBpZiBzZWFyY2hpbmcgZm9yIGJvdGggY2xhc3NlcyBhbmQgaW50ZXJmYWNlczwvbGk+CiAgKiA8L3VsPgogICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSB0byBzZWFyY2ggaW4KICAqIEBwYXJhbSBuYW1lUmVxdWVzdG9yIHRoZSByZXF1ZXN0b3IgdGhhdCBjb2xsZWN0cyB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoCiAgKiBAcGFyYW0gd2FpdGluZ1BvbGljeSBvbmUgb2YKICAqIDx1bD4KLSAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuRk9SQ0VfSU1NRURJQVRFX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkKKyAqCQk8bGk+PGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuRk9SQ0VfSU1NRURJQVRFX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHk8L2xpPgogICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5DQU5DRUxfSUZfTk9UX1JFQURZX1RPX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FuY2VsbGVkIGlmIHRoZQotICoJCQl1bmRlcmx5aW5nIGluZGV4ZXIgaGFzIG5vdCBmaW5pc2hlZCBpbmRleGluZyB0aGUgd29ya3NwYWNlCisgKgkJCXVuZGVybHlpbmcgaW5kZXhlciBoYXMgbm90IGZpbmlzaGVkIGluZGV4aW5nIHRoZSB3b3Jrc3BhY2U8L2xpPgogICoJCTxsaT48Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSDwvY29kZT4gaWYgdGhlIHNlYXJjaCBzaG91bGQgd2FpdCBmb3IgdGhlCi0gKgkJCXVuZGVybHlpbmcgaW5kZXhlciB0byBmaW5pc2ggaW5kZXhpbmcgdGhlIHdvcmtzcGFjZQorICoJCQl1bmRlcmx5aW5nIGluZGV4ZXIgdG8gZmluaXNoIGluZGV4aW5nIHRoZSB3b3Jrc3BhY2U8L2xpPgogICogPC91bD4KICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcwogICoJCQkJCQkJbW9uaXRvciBpcyBwcm92aWRlZAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmYWlsZWQuIFJlYXNvbnMgaW5jbHVkZToKICAqCTx1bD4KLSAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQ8L2xpPgogICoJPC91bD4KICAqLwogcHVibGljIHZvaWQgc2VhcmNoQWxsVHlwZU5hbWVzKApAQCAtNTY1LDggKzYyMyw4IEBACiAgKiBAcGFyYW0gcmVzdWx0Q29sbGVjdG9yIGEgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIGVhY2ggbWF0Y2ggaXMgcmVwb3J0ZWQKICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmFpbGVkLiBSZWFzb25zIGluY2x1ZGU6CiAgKgk8dWw+Ci0gKgkJPGxpPnRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLSAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQKKyAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdDwvbGk+CisgKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0PC9saT4KICAqCTwvdWw+CiAgKi8JCiBwdWJsaWMgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnNPZkFjY2Vzc2VkRmllbGRzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTU3NywxNiArNjM1LDE2IEBACiAJCWlmIChWRVJCT1NFKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaGluZyBmb3IgIiArIHBhdHRlcm4gKyAiIGluICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJfQotCQlNYXRjaExvY2F0b3IgbG9jYXRvciA9IG5ldyBNYXRjaExvY2F0b3IoCisJCU1hdGNoTG9jYXRvciBsb2NhdG9yID0gbmV3IE1hdGNoTG9jYXRvcjIoCiAJCQlwYXR0ZXJuLAogCQkJSUluZm9Db25zdGFudHMuRGVjbGFyYXRpb25JbmZvLAogCQkJcmVzdWx0Q29sbGVjdG9yLAotCQkJc2NvcGUpOworCQkJc2NvcGUsCisJCQlyZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCQlsb2NhdG9yLmxvY2F0ZU1hdGNoZXMoCiAJCQluZXcgU3RyaW5nW10ge3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0sIAogCQkJd29ya3NwYWNlLAotCQkJdGhpcy5nZXRXb3JraW5nQ29waWVzKGVuY2xvc2luZ0VsZW1lbnQpLAotCQkJcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCXRoaXMuZ2V0V29ya2luZ0NvcGllcyhlbmNsb3NpbmdFbGVtZW50KSk7CiAJfSBlbHNlIHsKIAkJc2VhcmNoKHdvcmtzcGFjZSwgcGF0dGVybiwgc2NvcGUsIHJlc3VsdENvbGxlY3Rvcik7CiAJfQpAQCAtNjEzLDcgKzY3MSw3IEBACiAgKgkJCX07CiAgKgkJfQogICogPC9wcmU+Ci0gKiA8Y29kZT4KKyAqIDwvY29kZT4KICAqIHRoZW4gc2VhcmNoaW5nIGZvciBkZWNsYXJhdGlvbnMgb2YgcmVmZXJlbmNlZCB0eXBlcyBpbiBtZXRob2QgPGNvZGU+WC50ZXN0KCk8L2NvZGU+CiAgKiB3b3VsZCBjb2xsZWN0IHRoZSBjbGFzcyA8Y29kZT5CPC9jb2RlPiBhbmQgdGhlIGludGVyZmFjZSA8Y29kZT5JPC9jb2RlPi4KICAqIDwvcD4KQEAgLTYyMyw4ICs2ODEsOCBAQAogICogQHBhcmFtIHJlc3VsdENvbGxlY3RvciBhIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCBlYWNoIG1hdGNoIGlzIHJlcG9ydGVkCiAgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZhaWxlZC4gUmVhc29ucyBpbmNsdWRlOgogICoJPHVsPgotICoJCTxsaT50aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0gKgkJPGxpPnRoZSBjbGFzc3BhdGggaXMgaW5jb3JyZWN0bHkgc2V0CisgKgkJPGxpPnRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3Q8L2xpPgorICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldDwvbGk+CiAgKgk8L3VsPgogICovCQogcHVibGljIHZvaWQgc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoSVdvcmtzcGFjZSB3b3Jrc3BhY2UsIElKYXZhRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50LCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewpAQCAtNjM1LDE2ICs2OTMsMTYgQEAKIAkJaWYgKFZFUkJPU0UpIHsKIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvciAiICsgcGF0dGVybiArICIgaW4gIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQl9Ci0JCU1hdGNoTG9jYXRvciBsb2NhdG9yID0gbmV3IE1hdGNoTG9jYXRvcigKKwkJTWF0Y2hMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTWF0Y2hMb2NhdG9yMigKIAkJCXBhdHRlcm4sCiAJCQlJSW5mb0NvbnN0YW50cy5EZWNsYXJhdGlvbkluZm8sCiAJCQlyZXN1bHRDb2xsZWN0b3IsCi0JCQlzY29wZSk7CisJCQlzY29wZSwKKwkJCXJlc3VsdENvbGxlY3Rvci5nZXRQcm9ncmVzc01vbml0b3IoKSk7CiAJCWxvY2F0b3IubG9jYXRlTWF0Y2hlcygKIAkJCW5ldyBTdHJpbmdbXSB7cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSwgCiAJCQl3b3Jrc3BhY2UsCi0JCQl0aGlzLmdldFdvcmtpbmdDb3BpZXMoZW5jbG9zaW5nRWxlbWVudCksCi0JCQlyZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOworCQkJdGhpcy5nZXRXb3JraW5nQ29waWVzKGVuY2xvc2luZ0VsZW1lbnQpKTsKIAl9IGVsc2UgewogCQlzZWFyY2god29ya3NwYWNlLCBwYXR0ZXJuLCBzY29wZSwgcmVzdWx0Q29sbGVjdG9yKTsKIAl9CkBAIC02ODQsOCArNzQyLDggQEAKICAqIEBwYXJhbSByZXN1bHRDb2xsZWN0b3IgYSBjYWxsYmFjayBvYmplY3QgdG8gd2hpY2ggZWFjaCBtYXRjaCBpcyByZXBvcnRlZAogICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBmYWlsZWQuIFJlYXNvbnMgaW5jbHVkZToKICAqCTx1bD4KLSAqCQk8bGk+dGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdAotICoJCTxsaT50aGUgY2xhc3NwYXRoIGlzIGluY29ycmVjdGx5IHNldAorICoJCTxsaT50aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0PC9saT4KKyAqCQk8bGk+dGhlIGNsYXNzcGF0aCBpcyBpbmNvcnJlY3RseSBzZXQ8L2xpPgogICoJPC91bD4KICAqLwkKIHB1YmxpYyB2b2lkIHNlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudCwgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKQEAgLTY5NiwxNiArNzU0LDE2IEBACiAJCWlmIChWRVJCT1NFKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaGluZyBmb3IgIiArIHBhdHRlcm4gKyAiIGluICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJfQotCQlNYXRjaExvY2F0b3IgbG9jYXRvciA9IG5ldyBNYXRjaExvY2F0b3IoCisJCU1hdGNoTG9jYXRvciBsb2NhdG9yID0gbmV3IE1hdGNoTG9jYXRvcjIoCiAJCQlwYXR0ZXJuLAogCQkJSUluZm9Db25zdGFudHMuRGVjbGFyYXRpb25JbmZvLAogCQkJcmVzdWx0Q29sbGVjdG9yLAotCQkJc2NvcGUpOworCQkJc2NvcGUsCisJCQlyZXN1bHRDb2xsZWN0b3IuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCQlsb2NhdG9yLmxvY2F0ZU1hdGNoZXMoCiAJCQluZXcgU3RyaW5nW10ge3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0sIAogCQkJd29ya3NwYWNlLAotCQkJdGhpcy5nZXRXb3JraW5nQ29waWVzKGVuY2xvc2luZ0VsZW1lbnQpLAotCQkJcmVzdWx0Q29sbGVjdG9yLmdldFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCXRoaXMuZ2V0V29ya2luZ0NvcGllcyhlbmNsb3NpbmdFbGVtZW50KSk7CiAJfSBlbHNlIHsKIAkJc2VhcmNoKHdvcmtzcGFjZSwgcGF0dGVybiwgc2NvcGUsIHJlc3VsdENvbGxlY3Rvcik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0RvY3VtZW50RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0RvY3VtZW50RmFjdG9yeS5qYXZhCmluZGV4IDY5MGE0OTEuLjA2ZGI5YzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9Eb2N1bWVudEZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvRG9jdW1lbnRGYWN0b3J5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRG9jdW1lbnQuamF2YQppbmRleCBmMDg2NDYzLi5lMTY3MjEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSURvY3VtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lEb2N1bWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTYsMTAgKzE2LDYgQEAKICAqIEFuIDxjb2RlPklEb2N1bWVudDwvY29kZT4gcmVwcmVzZW50IGEgZGF0YSBzb3VyY2UsIGUuZy4mbmJzcDthIDxjb2RlPkZpbGU8L2NvZGU+ICg8Y29kZT5GaWxlRG9jdW1lbnQ8L2NvZGU+KSwgCiAgKiBhbiA8Y29kZT5JRmlsZTwvY29kZT4gKDxjb2RlPklGaWxlRG9jdW1lbnQ8L2NvZGU+KSwgCiAgKiBvciBvdGhlciBraW5kcyBvZiBkYXRhIHNvdXJjZXMgKFVSTCwgLi4uKS4gQW4gPGNvZGU+SUluZGV4ZXI8L2NvZGU+IGluZGV4ZXMgYW48Y29kZT5JRG9jdW1lbnQ8L2NvZGU+LgotICogPGJyPgotICogQSBkb2N1bWVudCBoYXMgYSBzZXQgb2YgcHJvcGVydGllcywgc2F2ZWQgaW4gdGhlIGluZGV4IGZpbGUgKHNvIG9uZSBkb2VzIG5vdCBuZWVkIHRvIG9wZW4gdGhlIGRvY3VtZW50Ci0gKiB0byBvYnRhaW4gYmFzaWMgaW5mb3JtYXRpb24gYXM6IGRhdGUgb2YgY3JlYXRpb24gb2YgdGhlIGRvY3VtZW50LCBzdW0gdXAsIC4uLikuIEEgcHJvcGVydHkgaXMgYSBTdHJpbmcKLSAqIChjYWxsZWQgcHJvcGVydHkpIGFzc29jaWF0ZWQgdG8gYSB2YWx1ZSAoU3RyaW5nKS4gRXhhbXBsZTogImRhdGVfY3JlYXRpb24iLT4iMDIvMDgvMjAwMCIuCiAgKi8KIAogcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnQgewpAQCAtMzIsMjAgKzI4LDE1IEBACiAJICovCiAJY2hhcltdIGdldENoYXJDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCS8qKgorCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIGZvciB0aGlzIGRvY3VtZW50CisJICovCisJU3RyaW5nIGdldEVuY29kaW5nKCk7CisJLyoqCiAJICogcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQgKGUuZy4gaXRzIHBhdGggZm9yIGEgPGNvZGU+RmlsZTwvY29kZT4sIG9yIGl0cyByZWxhdGl2ZSBwYXRoCiAJICogaW4gdGhlIHdvcmtiZW5jaCBmb3IgYW4gPGNvZGU+SUZpbGU8L2NvZGU+KS4KIAkgKi8KIAlTdHJpbmcgZ2V0TmFtZSgpOwogCS8qKgotCSAqIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGhhdmUKLQkgKiBzdWNoIGEgcHJvcGVydHkuCi0JICovCi0JU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSk7Ci0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdGhlIGRvY3VtZW50IGhhcy4KLQkgKi8KLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0UHJvcGVydHlOYW1lcygpOwotCS8qKgogCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50LCBhcyBhIFN0cmluZy4KIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0NvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CkBAIC01Myw4ICs0NCw0IEBACiAJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQuCiAJICovCiAJU3RyaW5nIGdldFR5cGUoKTsKLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqLwotCXZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRW50cnlSZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JRW50cnlSZXN1bHQuamF2YQppbmRleCA5YzgyMzg0Li43NGY0MDViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUVudHJ5UmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lFbnRyeVJlc3VsdC5qYXZhCkBAIC0xLDE2ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXg7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUVudHJ5UmVzdWx0IHsKIAlwdWJsaWMgaW50W10gZ2V0RmlsZVJlZmVyZW5jZXMoKTsKIAlwdWJsaWMgY2hhcltdIGdldFdvcmQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4LmphdmEKaW5kZXggNjAzY2FmMC4uOGZiYmE5OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JSW5kZXguamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXIuamF2YQppbmRleCAxZjY5OTVhLi5lYWRjOTJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSUluZGV4ZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4OwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JSW5kZXhlck91dHB1dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyT3V0cHV0LmphdmEKaW5kZXggZDIwMTNiZi4uMGM5ZjE1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyT3V0cHV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lJbmRleGVyT3V0cHV0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvdXRwdXQgZnJvbSBhbiBpbmRleGVyIHRvIGFuIGluZGV4IApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lRdWVyeVJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L0lRdWVyeVJlc3VsdC5qYXZhCmluZGV4IGIyZjE2YjIuLjQxZDdjNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9JUXVlcnlSZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvSVF1ZXJ5UmVzdWx0LmphdmEKQEAgLTEsMTggKzEsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleDsKIAogcHVibGljIGludGVyZmFjZSBJUXVlcnlSZXN1bHQgewogCVN0cmluZyBnZXRQYXRoKCk7Ci0JU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JU3RyaW5nIHByb3BlcnRpZXNUb1N0cmluZygpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2NrLmphdmEKaW5kZXggZjNmYjRlMC4uYmE0YzU2OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9jay5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleElucHV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleElucHV0LmphdmEKaW5kZXggNGI2N2ZjMC4uZjliOTk1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhJbnB1dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4SW5wdXQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNSw3ICsxNSw3IEBACiBpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JUXVlcnlSZXN1bHQ7CkBAIC01MSw5ICs1MSwxMCBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG9wZW5lZCkgewotCQkJcmFmLmNsb3NlKCk7CiAJCQlzdW1tYXJ5PSBudWxsOwogCQkJb3BlbmVkPSBmYWxzZTsKKwkJCWlmIChyYWYgIT0gbnVsbCkKKwkJCQlyYWYuY2xvc2UoKTsKIAkJfQogCX0KIAkvKioKQEAgLTI2OCw3ICsyNjksNyBAQAogCQl9CiAJCXJldHVybiBlbnRyaWVzOwogCX0KLQlwdWJsaWMgSUVudHJ5UmVzdWx0W10gcXVlcnlFbnRyaWVzUHJlZml4ZWRCeShjaGFyW10gcHJlZml4LyosIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKi8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIElFbnRyeVJlc3VsdFtdIHF1ZXJ5RW50cmllc1ByZWZpeGVkQnkoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3BlbigpOwogCQkKIAkJaW50IGJsb2NrTG9jID0gc3VtbWFyeS5nZXRGaXJzdEJsb2NrTG9jYXRpb25Gb3JQcmVmaXgocHJlZml4KTsKQEAgLTI4Miw3ICsyODMsNyBAQAogCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwogCQkJV29yZEVudHJ5IGVudHJ5ID0gbmV3IFdvcmRFbnRyeSgpOwogCQkJd2hpbGUgKGJsb2NrLm5leHRFbnRyeShlbnRyeSkpIHsKLQkJCQlpZiAoQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBlbnRyeS5nZXRXb3JkKCkvKiwgaXNDYXNlU2Vuc2l0aXZlKi8pKSB7CisJCQkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHByZWZpeCwgZW50cnkuZ2V0V29yZCgpKSkgewogCQkJCQlpZiAoY291bnQgPT0gZW50cmllcy5sZW5ndGgpewogCQkJCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBlbnRyaWVzID0gbmV3IElFbnRyeVJlc3VsdFtjb3VudCoyXSwgMCwgY291bnQpOwogCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleE91dHB1dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQmxvY2tzSW5kZXhPdXRwdXQuamF2YQppbmRleCAwZjQ5Yzg5Li41MDE5NTVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9CbG9ja3NJbmRleE91dHB1dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0Jsb2Nrc0luZGV4T3V0cHV0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQ29kZUJ5dGVTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0NvZGVCeXRlU3RyZWFtLmphdmEKaW5kZXggMDczYjk3OS4uNTQ3MDRmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvQ29kZUJ5dGVTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Db2RlQnl0ZVN0cmVhbS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbjsKQEAgLTExMyw4ICsxMTMsMTQgQEAKIAkJaW50IG51bUJpdHM9IHJlYWRVbmFyeSgpOwogCQlyZXR1cm4gcmVhZEJpdHMobnVtQml0cyAtIDEpIHwgKDEgPDwgKG51bUJpdHMgLSAxKSk7CiAJfQotCXB1YmxpYyBjaGFyW10gcmVhZFNtYWxsVVRGKCkgdGhyb3dzIFVURkRhdGFGb3JtYXRFeGNlcHRpb24geworCXB1YmxpYyBjaGFyW10gcmVhZFVURigpIHRocm93cyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJaW50IHV0Zmxlbj0gcmVhZEJ5dGUoKTsKKwkJaWYgKHV0ZmxlbiA9PSAyNTUpIHsKKwkJCS8vIGxvbmcgVVRGCisJCQlpbnQgaGlnaCA9IHJlYWRCeXRlKCk7CisJCQlpbnQgbG93ID0gcmVhZEJ5dGUoKTsKKwkJCXV0ZmxlbiA9IChoaWdoIDw8IDgpICsgbG93OworCQl9CiAJCWNoYXIgc3RyW109IG5ldyBjaGFyW3V0Zmxlbl07CiAJCWludCBjb3VudD0gMDsKIAkJaW50IHN0cmxlbj0gMDsKQEAgLTI3MSwxMCArMjc3LDcgQEAKIAkJd3JpdGVVbmFyeShudW1CaXRzKTsKIAkJd3JpdGVCaXRzKHZhbHVlLCBudW1CaXRzIC0gMSk7CiAJfQotCXB1YmxpYyB2b2lkIHdyaXRlU21hbGxVVEYoY2hhcltdIHN0cikgewotCQl3cml0ZVNtYWxsVVRGKHN0ciwgMCwgc3RyLmxlbmd0aCk7Ci0JfQotCXB1YmxpYyB2b2lkIHdyaXRlU21hbGxVVEYoY2hhcltdIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJcHVibGljIHZvaWQgd3JpdGVVVEYoY2hhcltdIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWludCB1dGZsZW49IDA7CiAJCWZvciAoaW50IGk9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKIAkJCWludCBjPSBzdHJbaV07CkBAIC0yODYsOSArMjg5LDE1IEBACiAJCQkJdXRmbGVuICs9IDI7CiAJCQl9CiAJCX0KLQkJaWYgKHV0ZmxlbiA+IDI1NSkKKwkJaWYgKHV0ZmxlbiA8IDI1NSkgeworCQkJd3JpdGVCeXRlKHV0ZmxlbiAmIDB4RkYpOworCQl9IGVsc2UgaWYgKHV0ZmxlbiA+IDY1NTM1KSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXdyaXRlQnl0ZSh1dGZsZW4gJiAweEZGKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlQnl0ZSgyNTUpOyAvLyBtYXJrZXIgZm9yIGxvbmcgVVRGCisJCQl3cml0ZUJ5dGUoKHV0ZmxlbiA+Pj4gOCkgJiAweEZGKTsgLy8gaGlnaCBieXRlCisJCQl3cml0ZUJ5dGUoKHV0ZmxlbiA+Pj4gMCkgJiAweEZGKTsgLy8gbG93IGJ5dGUKKwkJfQogCQlmb3IgKGludCBpPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAJCQlpbnQgYz0gc3RyW2ldOwogCQkJaWYgKChjID49IDB4MDAwMSkgJiYgKGMgPD0gMHgwMDdGKSkgewpAQCAtMzMwLDM1ICszMzksNCBAQAogCQkJCWdyb3coKTsKIAkJfQogCX0KLQlwdWJsaWMgdm9pZCB3cml0ZVVURihjaGFyW10gc3RyKSB7Ci0JCWludCBzdHJsZW49IHN0ci5sZW5ndGg7Ci0JCWludCB1dGZsZW49IDA7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzdHJsZW47IGkrKykgewotCQkJaW50IGM9IHN0cltpXTsKLQkJCWlmICgoYyA+PSAweDAwMDEpICYmIChjIDw9IDB4MDA3RikpIHsKLQkJCQl1dGZsZW4rKzsKLQkJCX0gZWxzZSBpZiAoYyA+IDB4MDdGRikgewotCQkJCXV0ZmxlbiArPSAzOwotCQkJfSBlbHNlIHsKLQkJCQl1dGZsZW4gKz0gMjsKLQkJCX0KLQkJfQotCQlpZiAodXRmbGVuID4gNjU1MzUpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXdyaXRlQnl0ZSgodXRmbGVuID4+PiA4KSAmIDB4RkYpOwotCQl3cml0ZUJ5dGUoKHV0ZmxlbiA+Pj4gMCkgJiAweEZGKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHN0cmxlbjsgaSsrKSB7Ci0JCQlpbnQgYz0gc3RyW2ldOwotCQkJaWYgKChjID49IDB4MDAwMSkgJiYgKGMgPD0gMHgwMDdGKSkgewotCQkJCXdyaXRlQnl0ZShjKTsKLQkJCX0gZWxzZSBpZiAoYyA+IDB4MDdGRikgewotCQkJCXdyaXRlQnl0ZSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKLQkJCQl3cml0ZUJ5dGUoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKLQkJCQl3cml0ZUJ5dGUoMHg4MCB8ICgoYyA+PiAwKSAmIDB4M0YpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVCeXRlKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7Ci0JCQkJd3JpdGVCeXRlKDB4ODAgfCAoKGMgPj4gMCkgJiAweDNGKSk7Ci0JCQl9Ci0JCX0KLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9FbnRyeVJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRW50cnlSZXN1bHQuamF2YQppbmRleCA4YTljODk2Li4yODRhOGQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9FbnRyeVJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0VudHJ5UmVzdWx0LmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKIAogcHVibGljIGNsYXNzIEVudHJ5UmVzdWx0IGltcGxlbWVudHMgSUVudHJ5UmVzdWx0IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpZWxkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWVsZC5qYXZhCmluZGV4IGFmNjFkZTUuLmNlZjdkYzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpZWxkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmllbGQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlRG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpbGVEb2N1bWVudC5qYXZhCmluZGV4IGFjYTI1NjYuLmYwMmJkNWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpbGVEb2N1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpbGVEb2N1bWVudC5qYXZhCkBAIC0xLDE4ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CisKIC8qKgogICogQSA8Y29kZT5GaWxlRG9jdW1lbnQ8L2NvZGU+IHJlcHJlc2VudHMgYSBqYXZhLmlvLkZpbGUuCiAgKi8KQEAgLTM3LDYgKzM5LDEzIEBACiAJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVDaGFyQ29udGVudChmaWxlLCBudWxsKTsKIAl9CiAJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQjZ2V0RW5jb2RpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisJCXJldHVybiBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7IC8vIG5vIGN1c3RvbSBlbmNvZGluZworCX0KKworCS8qKgogCSAqIEBzZWUgSURvY3VtZW50I2dldE5hbWUKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlTGlzdEJsb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9GaWxlTGlzdEJsb2NrLmphdmEKaW5kZXggMTE3ODY4MS4uYmIxNmU5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvRmlsZUxpc3RCbG9jay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ZpbGVMaXN0QmxvY2suamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzMsNyArMzMsNyBAQAogCQkJZmllbGQucHV0SW50NChvZmZzZXQsIGluZGV4ZWRGaWxlLmdldEZpbGVOdW1iZXIoKSk7CiAJCQlvZmZzZXQgKz0gNDsKIAkJfQotCQlTdHJpbmcgcGF0aD0gaW5kZXhlZEZpbGUuZ2V0UGF0aCgpICsgaW5kZXhlZEZpbGUucHJvcGVydGllc1RvU3RyaW5nKCk7CisJCVN0cmluZyBwYXRoPSBpbmRleGVkRmlsZS5nZXRQYXRoKCk7CiAJCWludCBwcmVmaXhMZW49IHByZXZQYXRoID09IG51bGwgPyAwIDogVXRpbC5wcmVmaXhMZW5ndGgocHJldlBhdGgsIHBhdGgpOwogCQlpbnQgc2l6ZUVzdGltYXRlPSAyICsgMiArIChwYXRoLmxlbmd0aCgpIC0gcHJlZml4TGVuKSAqIDM7CiAJCWlmIChvZmZzZXQgKyBzaXplRXN0aW1hdGUgPiBibG9ja1NpemUgLSAyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvR2FtbWFDb21wcmVzc2VkSW5kZXhCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvR2FtbWFDb21wcmVzc2VkSW5kZXhCbG9jay5qYXZhCmluZGV4IGNhNDNhYTUuLjYyN2I5Y2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0dhbW1hQ29tcHJlc3NlZEluZGV4QmxvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9HYW1tYUNvbXByZXNzZWRJbmRleEJsb2NrLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5VVEZEYXRhRm9ybWF0RXhjZXB0aW9uOwpAQCAtNDQsNyArNDQsNyBAQAogCQljaGFyW10gd29yZD0gZW50cnkuZ2V0V29yZCgpOwogCQlpbnQgcHJlZml4TGVuPSBwcmV2V29yZCA9PSBudWxsID8gMCA6IFV0aWwucHJlZml4TGVuZ3RoKHByZXZXb3JkLCB3b3JkKTsKIAkJY29kZVN0cmVhbS53cml0ZUJ5dGUocHJlZml4TGVuKTsKLQkJY29kZVN0cmVhbS53cml0ZVNtYWxsVVRGKHdvcmQsIHByZWZpeExlbiwgd29yZC5sZW5ndGgpOworCQljb2RlU3RyZWFtLndyaXRlVVRGKHdvcmQsIHByZWZpeExlbiwgd29yZC5sZW5ndGgpOwogCQlpbnQgbj0gZW50cnkuZ2V0TnVtUmVmcygpOwogCQljb2RlU3RyZWFtLndyaXRlR2FtbWEobik7CiAJCWludCBwcmV2UmVmPSAwOwpAQCAtNzksNyArNzksNyBAQAogCQl0cnkgewogCQkJcmVhZENvZGVTdHJlYW0ucmVzZXQoZmllbGQuYnVmZmVyKCksIG9mZnNldCk7CiAJCQlpbnQgcHJlZml4TGVuZ3RoPSByZWFkQ29kZVN0cmVhbS5yZWFkQnl0ZSgpOwotCQkJY2hhcltdIHdvcmQ9IHJlYWRDb2RlU3RyZWFtLnJlYWRTbWFsbFVURigpOworCQkJY2hhcltdIHdvcmQ9IHJlYWRDb2RlU3RyZWFtLnJlYWRVVEYoKTsKIAkJCWlmIChwcmV2V29yZCAhPSBudWxsICYmIHByZWZpeExlbmd0aCA+IDApIHsKIAkJCQljaGFyW10gdGVtcD0gbmV3IGNoYXJbcHJlZml4TGVuZ3RoICsgd29yZC5sZW5ndGhdOwogCQkJCVN5c3RlbS5hcnJheWNvcHkocHJldldvcmQsIDAsIHRlbXAsIDAsIHByZWZpeExlbmd0aCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUNhY2hlRW51bWVyYXRpb24uamF2YQppbmRleCA1MDg2YTkxLi43ZTJlZWI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JQ2FjaGVFbnVtZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lDYWNoZUVudW1lcmF0aW9uLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUZpbGVEb2N1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUZpbGVEb2N1bWVudC5qYXZhCmluZGV4IDZmYWQ4ODcuLmNhZDFjNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lGaWxlRG9jdW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JRmlsZURvY3VtZW50LmphdmEKQEAgLTEsMTkgKzEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEFuIDxjb2RlPklGaWxlRG9jdW1lbnQ8L2NvZGU+IHJlcHJlc2VudHMgYW4gSUZpbGUuCkBAIC02MCw4ICs2MiwxNiBAQAogCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoY2hhckNvbnRlbnRzICE9IG51bGwpIHJldHVybiBjaGFyQ29udGVudHM7CiAJCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIG5ldyBjaGFyWzBdOwotCQlyZXR1cm4gY2hhckNvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQ2hhckNvbnRlbnQobG9jYXRpb24udG9GaWxlKCksIG51bGwpOworCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuIENoYXJPcGVyYXRpb24uTk9fQ0hBUjsKKwkJcmV0dXJuIGNoYXJDb250ZW50cyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KAorCQkJCQlsb2NhdGlvbi50b0ZpbGUoKSwgCisJCQkJCWdldEVuY29kaW5nKCkpOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXRFbmNvZGluZygpCisJICovCisJcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKwkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSkuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOwogCX0KIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudCNnZXROYW1lKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lJbmRleENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEKaW5kZXggYTM1NmE4Yi4uZWZkMDU2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiAvKioKQEAgLTE3LDkgKzE3LDkgQEAKIAkvKioKIAkgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBpbmRleCBmaWxlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRT0gIklOREVYIEZJTEUgMC4wMDciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFPSAiSU5ERVggRklMRSAwLjAxMiI7IC8vJE5PTi1OTFMtMSQKIAkvKioKLQkgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBpbmRleCBmaWxlLgorCSAqIFRoZSBzZXBhcmF0b3IgZm9yIGZpbGVzIGluIHRoZSBpbmRleCBmaWxlLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGSUxFX1NFUEFSQVRPUj0gJy8nOwogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUxSVUNhY2hlYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSUxSVUNhY2hlYWJsZS5qYXZhCmluZGV4IDlmYjRiYjMuLmY1ZWI0MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0lMUlVDYWNoZWFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JTFJVQ2FjaGVhYmxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luTWVtb3J5SW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luTWVtb3J5SW5kZXguamF2YQppbmRleCA5ZmMxMjk3Li42ZTMyNzJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Jbk1lbW9yeUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5NZW1vcnlJbmRleC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTY2LDcgKzY2LDYgQEAKIAkgKiBJZiB0aGUgd29yZCBkb2VzIG5vdCBleGlzdCwgaXQgYWRkcyBpdCBpbiB0aGUgaW5kZXguCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgYWRkUmVmKGNoYXJbXSB3b3JkLCBpbnQgZmlsZU51bSkgewotCQl3b3JkPSBwcmVwcm9jZXNzV29yZCh3b3JkKTsKIAkJV29yZEVudHJ5IGVudHJ5PSAoV29yZEVudHJ5KSB0aGlzLndvcmRzLmdldCh3b3JkKTsKIAkJaWYgKGVudHJ5ID09IG51bGwpIHsKIAkJCWVudHJ5PSBuZXcgV29yZEVudHJ5KHdvcmQpOwpAQCAtMTUzLDEyICsxNTIsNiBAQAogCQlzb3J0ZWRXb3JkRW50cmllcz0gbnVsbDsKIAkJc29ydGVkRmlsZXM9IG51bGw7CiAJfQotCXByb3RlY3RlZCBjaGFyW10gcHJlcHJvY2Vzc1dvcmQoY2hhcltdIHdvcmQpIHsKLQkJaWYgKHdvcmQubGVuZ3RoID4gMjU1KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHdvcmQsIDAsIHdvcmQ9IG5ldyBjaGFyWzI1NV0sIDAsIDI1NSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmQ7Ci0JfQogCS8qKgogCSAqIFNhdmVzIHRoZSBpbmRleCBpbiB0aGUgZ2l2ZW4gZmlsZS4KIAkgKiBTdHJ1Y3R1cmUgb2YgdGhlIHNhdmVkIEluZGV4IDoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleC5qYXZhCmluZGV4IGZkY2JlNjIuLjc0YTQ2NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXguamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC02NCw3ICs2NCw3IEBACiAJLyoqCiAJICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgaW5kZXguCiAJICovCi0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmc7CisJcHVibGljIFN0cmluZyB0b1N0cmluZzsKIAlwdWJsaWMgSW5kZXgoRmlsZSBpbmRleERpcmVjdG9yeSwgYm9vbGVhbiByZXVzZUV4aXN0aW5nRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhpbmRleERpcmVjdG9yeSwiLmluZGV4IiwgcmV1c2VFeGlzdGluZ0ZpbGUpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMjExLDE0ICsyMTEsOCBAQAogCQkJCQlpbnB1dC5vcGVuZWQgPSBmYWxzZTsKIAkJCQl9CiAJCQkJaW5kZXhGaWxlLmRlbGV0ZSgpOwotCQkJCWlmIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guVXRpbC5iaW5kKCJleGNlcHRpb24ud3JvbmdGb3JtYXQiKS5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSW5NZW1vcnlJbmRleCBtYWluSW5kZXg9IG5ldyBJbk1lbW9yeUluZGV4KCk7CQkJCi0JCQkJCUluZGV4T3V0cHV0IG1haW5JbmRleE91dHB1dD0gbmV3IEJsb2Nrc0luZGV4T3V0cHV0KGluZGV4RmlsZSk7Ci0JCQkJCW1haW5JbmRleC5zYXZlKG1haW5JbmRleE91dHB1dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFpbkluZGV4SW5wdXQgPSBudWxsOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KKwkJCQltYWluSW5kZXhJbnB1dCA9IG51bGw7CisJCQkJdGhyb3cgZTsKIAkJCX0KIAkJCW1haW5JbmRleElucHV0LmNsb3NlKCk7CiAJCX0gZWxzZSB7CkBAIC0zNjEsNyArMzU1LDkgQEAKIAkJcmV0dXJuIChhZGRzSW5kZXguZ2V0Rm9vdHByaW50KCkgPj0gTUFYX0ZPT1RQUklOVCk7CiAJfQogcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlpZiAodGhpcy50b1N0cmluZyA9PSBudWxsKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQlyZXR1cm4gdGhpcy50b1N0cmluZzsKKwlTdHJpbmcgc3RyID0gdGhpcy50b1N0cmluZzsKKwlpZiAoc3RyID09IG51bGwpIHN0ciA9IHN1cGVyLnRvU3RyaW5nKCk7CisJc3RyICs9ICIobGVuZ3RoOiAiKyBnZXRJbmRleEZpbGUoKS5sZW5ndGgoKSArIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlyZXR1cm4gc3RyOwogfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhCbG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhCbG9jay5qYXZhCmluZGV4IGNiNjlkNmIuLjgzODRhYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4QmxvY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleEJsb2NrLmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiAvKioKICAqIEFuIGluZGV4QmxvY2sgc3RvcmVzIHdvcmRFbnRyaWVzLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhJbnB1dC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhJbnB1dC5qYXZhCmluZGV4IDBiMzIzNGYuLmNlY2RiNzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4SW5wdXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleElucHV0LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTExNSw4ICsxMTUsOCBAQAogCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHdvcmQgaW4gdGhlIGluZGV4LgogCSAqLwogCXB1YmxpYyBhYnN0cmFjdCBJUXVlcnlSZXN1bHRbXSBxdWVyeShTdHJpbmcgd29yZCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCXB1YmxpYyBhYnN0cmFjdCBJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXNQcmVmaXhlZEJ5KGNoYXJbXSBwcmVmaXggLyosIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKi8pIHRocm93cyBJT0V4Y2VwdGlvbjsKLXB1YmxpYyBhYnN0cmFjdCBJUXVlcnlSZXN1bHRbXSBxdWVyeUZpbGVzUmVmZXJyaW5nVG9QcmVmaXgoY2hhcltdIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCXB1YmxpYyBhYnN0cmFjdCBJRW50cnlSZXN1bHRbXSBxdWVyeUVudHJpZXNQcmVmaXhlZEJ5KGNoYXJbXSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwlwdWJsaWMgYWJzdHJhY3QgSVF1ZXJ5UmVzdWx0W10gcXVlcnlGaWxlc1JlZmVycmluZ1RvUHJlZml4KGNoYXJbXSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBmaWxlcyB3aG9zZSBuYW1lIGNvbnRhaW4gdGhlIGdpdmVuIHdvcmQgaW4gdGhlIGluZGV4LgogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4T3V0cHV0LmphdmEKaW5kZXggMTVmMWY0OS4uNGI5ZTk0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhPdXRwdXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleE91dHB1dC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleFN1bW1hcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCmluZGV4IDlmZDM2ZmEuLmYxZGI0ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4U3VtbWFyeS5qYXZhCkBAIC0xLDIwICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiAKIC8qKgogICogQW4gaW5kZXhTdW1tYXJ5IGlzIHVzZWQgd2hlbiBzYXZpbmcgYW4gaW5kZXggaW50byBhIEJsb2Nrc0luZGV4T3VwdXQgb3IgCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJd2hpbGUgKG1pbiA8PSBtYXggJiYgbWF0Y2ggPCAwKSB7CiAJCQlpbnQgbWlkPSAobWluICsgbWF4KSAvIDI7CiAJCQlGaXJzdFdvcmRJbkJsb2NrIGVudHJ5PSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChtaWQpOwotCQkJaW50IGNvbXBhcmU9IFV0aWwuc3RhcnRzV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpOworCQkJaW50IGNvbXBhcmU9IENoYXJPcGVyYXRpb24uY29tcGFyZVdpdGgoZW50cnkud29yZCwgcHJlZml4KTsKIAkJCWlmIChjb21wYXJlID09IDApIHsKIAkJCQltYXRjaD0gbWlkOwogCQkJCWJyZWFrOwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCS8vIExvb2sgaWYgcHJldmlvdXMgYmxvY2tzIGFyZSBhZmZlY3RlZAogCQlmb3IgKDsgZmlyc3RCbG9jayA+PSAwOyBmaXJzdEJsb2NrLS0pIHsKIAkJCUZpcnN0V29yZEluQmxvY2sgZW50cnk9IChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KGZpcnN0QmxvY2spOwotCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnN0YXJ0c1dpdGgoZW50cnkud29yZCwgcHJlZml4KSkKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBlbnRyeS53b3JkKSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoZmlyc3RCbG9jayA8IDApCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJaW50IGZpcnN0Tm90SW5jbHVkZWRCbG9jaz0gbWF0Y2ggKyAxOwogCQlmb3IgKDsgZmlyc3ROb3RJbmNsdWRlZEJsb2NrIDwgc2l6ZTsgZmlyc3ROb3RJbmNsdWRlZEJsb2NrKyspIHsKIAkJCUZpcnN0V29yZEluQmxvY2sgZW50cnk9IChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KGZpcnN0Tm90SW5jbHVkZWRCbG9jayk7Ci0JCQlpZiAoIUNoYXJPcGVyYXRpb24uc3RhcnRzV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpKQorCQkJaWYgKCFDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhwcmVmaXgsIGVudHJ5LndvcmQpKQogCQkJCWJyZWFrOwogCQl9CiAJCQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJd2hpbGUgKG1pbiA8PSBtYXgpIHsKIAkJaW50IG1pZCA9IChtaW4gKyBtYXgpIC8gMjsKIAkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeSA9IChGaXJzdFdvcmRJbkJsb2NrKSBmaXJzdFdvcmRzSW5CbG9ja3MuZ2V0KG1pZCk7Ci0JCWludCBjb21wYXJlID0gVXRpbC5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCk7CisJCWludCBjb21wYXJlID0gQ2hhck9wZXJhdGlvbi5jb21wYXJlV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpOwogCQlpZiAoY29tcGFyZSA9PSAwKSB7CiAJCQltYXRjaCA9IG1pZDsKIAkJCWJyZWFrOwpAQCAtMjE5LDkgKzIxOSw4IEBACiAJCS8vIGxvb2sgZm9yIHBvc3NpYmxlIG1hdGNoZXMgaW5zaWRlIHByZXZpb3VzIGJsb2NrcwogCQl3aGlsZSAobWF0Y2ggPiAwKXsKIAkJCUZpcnN0V29yZEluQmxvY2sgZW50cnkgPSAoRmlyc3RXb3JkSW5CbG9jaykgZmlyc3RXb3Jkc0luQmxvY2tzLmdldChtYXRjaCk7Ci0JCQlpZiAoIUNoYXJPcGVyYXRpb24uc3RhcnRzV2l0aChlbnRyeS53b3JkLCBwcmVmaXgpKXsKKwkJCWlmICghQ2hhck9wZXJhdGlvbi5wcmVmaXhFcXVhbHMocHJlZml4LCBlbnRyeS53b3JkKSkKIAkJCQlicmVhazsKLQkJCX0KIAkJCW1hdGNoLS07CiAJCX0KIAl9CkBAIC0yNDAsNyArMjM5LDcgQEAKIHB1YmxpYyBpbnQgZ2V0TmV4dEJsb2NrTG9jYXRpb25Gb3JQcmVmaXgoY2hhcltdIHByZWZpeCwgaW50IGJsb2NrTG9jKSB7CiAJaWYgKCsrYmxvY2tMb2MgPCBmaXJzdFdvcmRzSW5CbG9ja3Muc2l6ZSgpKXsKIAkJRmlyc3RXb3JkSW5CbG9jayBlbnRyeT0gKEZpcnN0V29yZEluQmxvY2spIGZpcnN0V29yZHNJbkJsb2Nrcy5nZXQoYmxvY2tMb2MpOwotCQlpZiAoQ2hhck9wZXJhdGlvbi5zdGFydHNXaXRoKGVudHJ5LndvcmQsIHByZWZpeCkpIHJldHVybiBibG9ja0xvYzsKKwkJaWYgKENoYXJPcGVyYXRpb24ucHJlZml4RXF1YWxzKHByZWZpeCwgZW50cnkud29yZCkpIHJldHVybiBibG9ja0xvYzsKIAl9CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZWRGaWxlLmphdmEKaW5kZXggMjY1NDFkZC4uZjEyYmE3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZS5qYXZhCkBAIC0xLDE5ICsxLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OwpAQCAtMjYsNTAgKzIyLDE4IEBACiBwdWJsaWMgY2xhc3MgSW5kZXhlZEZpbGUgaW1wbGVtZW50cyBJUXVlcnlSZXN1bHQgewogCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKIAlwcm90ZWN0ZWQgaW50IGZpbGVOdW1iZXI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19CRUdJTj0gIigiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19FTkQ9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fU0VQQVJBVE9SPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1ZBTFVFX1NFUEFSQVRPUj0gIjoiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST1BFUlRJRVNfU0laRT0gMiAqIDEwMjQ7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBwcm9wZXJ0aWVzOwotCXByb3RlY3RlZCBpbnQgcHJvcGVydGllc1NpemU9IDIgKiAoSU5GT19CRUdJTi5sZW5ndGgoKSArIElORk9fRU5ELmxlbmd0aCgpKTsKIAotCXB1YmxpYyBJbmRleGVkRmlsZShTdHJpbmcgcGF0aE9ySW5mbywgaW50IGZpbGVOdW0pIHsKKwlwdWJsaWMgSW5kZXhlZEZpbGUoU3RyaW5nIHBhdGgsIGludCBmaWxlTnVtKSB7CiAJCWlmIChmaWxlTnVtIDwgMSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJdGhpcy5maWxlTnVtYmVyPSBmaWxlTnVtOwotCQl0aGlzLnByb3BlcnRpZXM9IG51bGw7IC8vIGluaXRpYWxpemVkIHdoZW4gbmVlZGVkCi0JCWludCBkcD0gcGF0aE9ySW5mby5pbmRleE9mKElORk9fQkVHSU4pOwotCQlpZiAoZHAgPT0gLTEpCi0JCQlwYXRoPSBwYXRoT3JJbmZvOwotCQllbHNlIHsKLQkJCVN0cmluZyBmaWxlSW5mbz0gcGF0aE9ySW5mbzsKLQkJCXBhdGg9IGZpbGVJbmZvLnN1YnN0cmluZygwLCBkcCk7Ci0JCQlTdHJpbmcgcHJvcHM9IGZpbGVJbmZvLnN1YnN0cmluZyhkcCwgZmlsZUluZm8ubGVuZ3RoKCkpOwotCQkJU3RyaW5nVG9rZW5pemVyIHQ9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcHMuc3Vic3RyaW5nKDEsIHByb3BzLmxlbmd0aCgpIC0gMSksIElORk9fU0VQQVJBVE9SKTsKLQkJCXdoaWxlICh0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBnPSB0Lm5leHRUb2tlbigpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBkcHQ9IGcuaW5kZXhPZihJTkZPX1ZBTFVFX1NFUEFSQVRPUik7Ci0JCQkJCXNldFByb3BlcnR5KGcuc3Vic3RyaW5nKDAsIGRwdCksIGcuc3Vic3RyaW5nKGRwdCArIDEsIGcubGVuZ3RoKCkpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQorCQl0aGlzLnBhdGg9IHBhdGg7CiAJfQogCXB1YmxpYyBJbmRleGVkRmlsZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBmaWxlTnVtKSB7CiAJCWlmIChmaWxlTnVtIDwgMSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJdGhpcy5wYXRoPSBkb2N1bWVudC5nZXROYW1lKCk7CiAJCXRoaXMuZmlsZU51bWJlcj0gZmlsZU51bTsKLQkJdGhpcy5wcm9wZXJ0aWVzPSBudWxsOyAvLyBpbml0aWFsaXplZCB3aGVuIG5lZWRlZAotCQljb21wdXRlUHJvcGVydGllcyhkb2N1bWVudCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVQcm9wZXJ0aWVzKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmb3IgKEVudW1lcmF0aW9uIGU9IGRvY3VtZW50LmdldFByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBwcm9wZXJ0eT0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHksIGRvY3VtZW50LmdldFByb3BlcnR5KHByb3BlcnR5KSk7Ci0JCX0KIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgcGF0aCByZXByZXNlbnRlZCBieSBwYXRoU3RyaW5nIGNvbnZlcnRlZCBiYWNrIHRvIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCkBAIC0xMjQsNDkgKzg4LDEyIEBACiAJcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewogCQlyZXR1cm4gcGF0aDsKIAl9Ci0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0JLyoqCi0JICogZ2V0UHJvcGVydHlOYW1lcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgcmV0dXJuIG5ldyBIYXNodGFibGUoKS5rZXlzKCk7Ci0JCXJldHVybiBwcm9wZXJ0aWVzLmtleXMoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBwcm9wZXJ0aWVzVG9TdHJpbmcoKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHByb3A9IG5ldyBTdHJpbmdCdWZmZXIoSU5GT19CRUdJTik7Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gZ2V0UHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHByb3BlcnR5PSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgdmFsdWU9IGdldFByb3BlcnR5KHByb3BlcnR5KTsKLQkJCXByb3AuYXBwZW5kKHByb3BlcnR5KTsKLQkJCXByb3AuYXBwZW5kKElORk9fVkFMVUVfU0VQQVJBVE9SKTsKLQkJCXByb3AuYXBwZW5kKHZhbHVlKTsKLQkJCWlmIChlLmhhc01vcmVFbGVtZW50cygpKQotCQkJCXByb3AuYXBwZW5kKElORk9fU0VQQVJBVE9SKTsKLQkJfQotCQlwcm9wLmFwcGVuZChJTkZPX0VORCk7Ci0JCXJldHVybiBwcm9wLnRvU3RyaW5nKCk7Ci0JfQogCS8qKgogCSAqIFNldHMgdGhlIGZpbGUgbnVtYmVyLgogCSAqLwogCXB1YmxpYyB2b2lkIHNldEZpbGVOdW1iZXIoaW50IGZpbGVOdW1iZXIpIHsKIAkJdGhpcy5maWxlTnVtYmVyPSBmaWxlTnVtYmVyOwogCX0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eU5hbWVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoMyk7Ci0JCXByb3BlcnRpZXNTaXplICs9IChJTkZPX1NFUEFSQVRPUi5sZW5ndGgoKSArIHByb3BlcnR5TmFtZS5sZW5ndGgoKSArIElORk9fVkFMVUVfU0VQQVJBVE9SLmxlbmd0aCgpICsgdmFsdWUubGVuZ3RoKCkpICogMjsKLQkJaWYgKHByb3BlcnRpZXNTaXplIDwgTUFYX1BST1BFUlRJRVNfU0laRSkKLQkJCXByb3BlcnRpZXMucHV0KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gIkluZGV4ZWRGaWxlKCIgKyBmaWxlTnVtYmVyICsgIjogIiArIHBhdGggKyAiKSI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTMkCiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGVIYXNoZWRBcnJheS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlZEZpbGVIYXNoZWRBcnJheS5qYXZhCmluZGV4IGZjOTk4MmEuLjNjYmJiYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZWRGaWxlSGFzaGVkQXJyYXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVkRmlsZUhhc2hlZEFycmF5LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTEwNSw0ICsxMDUsNCBAQAogCQlzICs9IGZpbGVzW2ldLnRvU3RyaW5nKCkgKyAiXG4iOyAJLy8kTk9OLU5MUy0xJAogCXJldHVybiBzOwogfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZXJPdXRwdXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0luZGV4ZXJPdXRwdXQuamF2YQppbmRleCA0OTcwMWI1Li4xMDc5MTFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9JbmRleGVyT3V0cHV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW5kZXhlck91dHB1dC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklEb2N1bWVudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0ludC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW50LmphdmEKaW5kZXggNDI2ZWU3MS4uMjBhMDQ4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSW50LmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBwdWJsaWMgY2xhc3MgSW50IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0phckZpbGVEb2N1bWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKaW5kZXggNTU3MGM2YS4uMzFiZDQ2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZURvY3VtZW50LmphdmEKQEAgLTEsMTkgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiAKIC8qKgogICogQW4gPGNvZGU+SmFyRmlsZURvY3VtZW50PC9jb2RlPiByZXByZXNlbnRzIGFuIGphciBmaWxlLgpAQCAtNDEsOCArNDIsMjAgQEAKIAlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG51bGw7CiAJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEVuY29kaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOworCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKKwkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGxvY2F0aW9uLnRvRmlsZSgpOworCQl9CiAJfQogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldE5hbWUoKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZUVudHJ5RG9jdW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0phckZpbGVFbnRyeURvY3VtZW50LmphdmEKaW5kZXggZjM5OTI0Zi4uYzgzYzZkYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvSmFyRmlsZUVudHJ5RG9jdW1lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9KYXJGaWxlRW50cnlEb2N1bWVudC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00Nyw2ICs0NywxMyBAQAogcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcmV0dXJuIG51bGw7CiB9CisvKioKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldEVuY29kaW5nKCkKKyAqLworcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKwlyZXR1cm4gbnVsbDsKK30KKwogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50I2dldE5hbWUoKQogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL0xSVUNhY2hlLmphdmEKaW5kZXggMTNiZDVhYS4uZmM1NjM3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvTFJVQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9MUlVDYWNoZS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9NZXJnZUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL01lcmdlRmFjdG9yeS5qYXZhCmluZGV4IDViNmY4ZTEuLjU0OTI3NzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL01lcmdlRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL01lcmdlRmFjdG9yeS5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Qcm9wZXJ0eURvY3VtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Qcm9wZXJ0eURvY3VtZW50LmphdmEKaW5kZXggMGZhMjljNC4uOTU2NGM2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvUHJvcGVydHlEb2N1bWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1Byb3BlcnR5RG9jdW1lbnQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TYWZlUmFuZG9tQWNjZXNzRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2FmZVJhbmRvbUFjY2Vzc0ZpbGUuamF2YQppbmRleCA4NTI0M2I3Li5iZjhkNGIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TYWZlUmFuZG9tQWNjZXNzRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NhZmVSYW5kb21BY2Nlc3NGaWxlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NpbXBsZUluZGV4QmxvY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NpbXBsZUluZGV4QmxvY2suamF2YQppbmRleCA3Njc4ZWE1Li42NWRmZmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TaW1wbGVJbmRleEJsb2NrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2ltcGxlSW5kZXhCbG9jay5qYXZhCkBAIC0xLDE4ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAogaW1wb3J0IGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogLyoqCiAgKiBEb2VzIG5vIGNvbXByZXNzaW9uIG9mIHdvcmRzLCBhbmQgdXNlcyA0LWJ5dGUgaW50cyBmb3IgZmlsZSBudW1iZXJzIGFuZCBudW1iZXIgb2YgZmlsZXMuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TaW1wbGVJbmRleElucHV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9TaW1wbGVJbmRleElucHV0LmphdmEKaW5kZXggYjgxZjA3OS4uMDA2NmUwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvU2ltcGxlSW5kZXhJbnB1dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1NpbXBsZUluZGV4SW5wdXQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvVXRpbC5qYXZhCmluZGV4IDlkMTk3YjcuLjg2MjYwMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1V0aWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9VdGlsLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CkBAIC0yOTEsMjMgKzI5MSw2IEBACiAJCWlmIChsaXN0Lmxlbmd0aCA+IDEpCiAJCQlxdWlja1NvcnQobGlzdCwgMCwgbGlzdC5sZW5ndGggLSAxKTsKIAl9Ci0JcHVibGljIHN0YXRpYyBpbnQgc3RhcnRzV2l0aChjaGFyW10gc3RyLCBjaGFyW10gcHJlZml4KSB7Ci0JCWludCBsZW4xPSBzdHIubGVuZ3RoOwotCQlpbnQgbGVuMj0gcHJlZml4Lmxlbmd0aDsKLQkJaW50IG49IE1hdGgubWluKGxlbjEsIGxlbjIpOwotCQlpbnQgaT0gMDsKLQkJd2hpbGUgKG4tLSAhPSAwKSB7Ci0JCQljaGFyIGMxPSBzdHJbaV07Ci0JCQljaGFyIGMyPSBwcmVmaXhbaSsrXTsKLQkJCWlmIChjMSAhPSBjMikgewotCQkJCXJldHVybiBjMSAtIGMyOwotCQkJfQotCQl9Ci0JCWlmIChsZW4yID09IGkpCi0JCQlyZXR1cm4gMDsKLQkJCQotCQlyZXR1cm4gMTsJCi0JfQogCS8qKgogCSAqIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSB1c2luZyBVVEYtOCAKIAkgKiBlbmNvZGluZyBpbiBhIG1hY2hpbmUtaW5kZXBlbmRlbnQgbWFubmVyLiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1dvcmRFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5LmphdmEKaW5kZXggNDcyYzY5Ni4uNDYyNmEzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5LmphdmEKQEAgLTEsMjEgKzEsMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKKwogcHVibGljIGNsYXNzIFdvcmRFbnRyeSB7CiAJcHJvdGVjdGVkIGNoYXJbXSBmV29yZDsKIAlwcm90ZWN0ZWQgaW50IGZOdW1SZWZzOwogCXByb3RlY3RlZCBpbnRbXSBmUmVmczsKIAlwdWJsaWMgV29yZEVudHJ5KCkgewotCQl0aGlzKG5ldyBjaGFyWzBdKTsKKwkJdGhpcyhDaGFyT3BlcmF0aW9uLk5PX0NIQVIpOwogCX0KIAlwdWJsaWMgV29yZEVudHJ5KGNoYXJbXSB3b3JkKSB7CiAJCWZXb3JkPSB3b3JkOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5SGFzaGVkQXJyYXkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9pbmRleC9pbXBsL1dvcmRFbnRyeUhhc2hlZEFycmF5LmphdmEKaW5kZXggZDkzOTI4NS4uN2Q1ODg3YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL2luZGV4L2ltcGwvV29yZEVudHJ5SGFzaGVkQXJyYXkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvaW5kZXgvaW1wbC9Xb3JkRW50cnlIYXNoZWRBcnJheS5qYXZhCkBAIC0xLDE2ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFdvcmRFbnRyeUhhc2hlZEFycmF5IHsKIApAQCAtODAsNCArODAsNCBAQAogCQlzICs9IGVudHJpZXNbaV0udG9TdHJpbmcoKSArICJcbiI7IAkvLyROT04tTkxTLTEkCiAJcmV0dXJuIHM7CiB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFNjb3BlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0Fic3RyYWN0U2VhcmNoU2NvcGUuamF2YQppbmRleCBhMzM5NzczLi4zMTI1ODQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0Fic3RyYWN0U2VhcmNoU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0Fic3RyYWN0U2VhcmNoU2NvcGUuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9IaWVyYXJjaHlTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9IaWVyYXJjaHlTY29wZS5qYXZhCmluZGV4IDZmMDI5MWEuLmM4YjBlMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSGllcmFyY2h5U2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0hpZXJhcmNoeVNjb3BlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNSwxOCArMTUsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7CkBAIC0zNywxNSArMjksMTggQEAKICAqLwogcHVibGljIGNsYXNzIEhpZXJhcmNoeVNjb3BlIGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hTY29wZSB7CiAKLQlwcml2YXRlIElUeXBlSGllcmFyY2h5IGZIaWVyYXJjaHk7Ci0JcHJpdmF0ZSBJVHlwZVtdIGZUeXBlczsKKwlwdWJsaWMgSVR5cGUgZm9jdXNUeXBlOworCXByaXZhdGUgU3RyaW5nIGZvY3VzUGF0aDsKKwkKKwlwcml2YXRlIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeTsKKwlwcml2YXRlIElUeXBlW10gdHlwZXM7CiAJcHJpdmF0ZSBIYXNoU2V0IHJlc291cmNlUGF0aHM7CiAJcHJpdmF0ZSBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFyczsKIAogCXByb3RlY3RlZCBJUmVzb3VyY2VbXSBlbGVtZW50czsKIAlwcm90ZWN0ZWQgaW50IGVsZW1lbnRDb3VudDsKIAkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1JlZnJlc2g7CisJcHVibGljIGJvb2xlYW4gbmVlZHNSZWZyZXNoOwogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEFkZHMgdGhlIGdpdmVuIHJlc291cmNlIHRvIHRoaXMgc2VhcmNoIHNjb3BlLgpAQCAtNjYsOSArNjEsMzUgQEAKIAkgKiBDcmVhdGVzIGEgbmV3IGhpZWFyY2h5IHNjb3BlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KIAkgKi8KIAlwdWJsaWMgSGllcmFyY2h5U2NvcGUoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQlmSGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQlidWlsZFJlc291cmNlVmVjdG9yKCk7CisJCXRoaXMuZm9jdXNUeXBlID0gdHlwZTsKKwkJCisJCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzID0gdGhpcy5jb21wdXRlUHJvamVjdHNBbmRKYXJzKHR5cGUpOworCisJCS8vIHJlc291cmNlIHBhdGgKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCl0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpOworCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJSVBhdGggamFyUGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQkJT2JqZWN0IHRhcmdldCA9IEphdmFNb2RlbC5nZXRUYXJnZXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgamFyUGF0aCwgdHJ1ZSk7CisJCQlTdHJpbmcgemlwRmlsZU5hbWU7CisJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCQkvLyBpbnRlcm5hbCBqYXIKKwkJCQl6aXBGaWxlTmFtZSA9IGphclBhdGgudG9TdHJpbmcoKTsKKwkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmlsZSkgeworCQkJCS8vIGV4dGVybmFsIGphcgorCQkJCXppcEZpbGVOYW1lID0gKChGaWxlKXRhcmdldCkuZ2V0UGF0aCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm47IC8vIHVua25vd24gdGFyZ2V0CisJCQl9CisJCQl0aGlzLmZvY3VzUGF0aCA9CisJCQkJemlwRmlsZU5hbWUKKwkJCQkJKyBKQVJfRklMRV9FTlRSWV9TRVBBUkFUT1IKKwkJCQkJKyB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpCisJCQkJCSsgIi5jbGFzcyI7Ly8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJdGhpcy5mb2N1c1BhdGggPSB0eXBlLmdldFBhdGgoKS50b1N0cmluZygpOworCQl9CisJCQorCQl0aGlzLm5lZWRzUmVmcmVzaCA9IHRydWU7CiAJCQkKIAkJLy9kaXNhYmxlZCBmb3Igbm93IGFzIHRoaXMgY291bGQgYmUgZXhwZW5zaXZlCiAJCS8vSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtZW1iZXJTY29wZSh0aGlzKTsKQEAgLTc2LDExICs5NywxMSBAQAogCXByaXZhdGUgdm9pZCBidWlsZFJlc291cmNlVmVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CiAJCUhhc2hNYXAgcmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKIAkJSGFzaE1hcCBwYXRocyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZUeXBlcyA9IGZIaWVyYXJjaHkuZ2V0QWxsVHlwZXMoKTsKKwkJdGhpcy50eXBlcyA9IHRoaXMuaGllcmFyY2h5LmdldEFsbFR5cGVzKCk7CiAJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSVR5cGUgdHlwZSA9IGZUeXBlc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50eXBlcy5sZW5ndGg7IGkrKykgeworCQkJSVR5cGUgdHlwZSA9IHRoaXMudHlwZXNbaV07CisJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFJlc291cmNlKCk7CiAJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZXMuZ2V0KHJlc291cmNlKSA9PSBudWxsKSB7CiAJCQkJcmVzb3VyY2VzLnB1dChyZXNvdXJjZSwgcmVzb3VyY2UpOwogCQkJCWFkZChyZXNvdXJjZSk7CkBAIC0xMjEsMTAgKzE0MiwxMDIgQEAKIAkJCXRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzW2krK10gPSAoSVBhdGgpIGl0ZXIubmV4dCgpOwogCQl9CiAJfQorCS8qCisJICogQ29tcHV0ZXMgdGhlIHBhdGhzIG9mIHByb2plY3RzIGFuZCBqYXJzIHRoYXQgdGhlIGhpZXJhcmNoeSBvbiB0aGUgZ2l2ZW4gdHlwZSBjb3VsZCBjb250YWluLgorCSAqIFRoaXMgaXMgYSBzdXBlciBzZXQgb2YgdGhlIHByb2plY3QgYW5kIGphciBwYXRocyBvbmNlIHRoZSBoaWVyYXJjaHkgaXMgY29tcHV0ZWQuCisJICovCisJcHJpdmF0ZSBJUGF0aFtdIGNvbXB1dGVQcm9qZWN0c0FuZEphcnMoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCl0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhcmVudCgpOworCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJLy8gYWRkIHRoZSByb290CisJCQlzZXQuYWRkKHJvb3QuZ2V0UGF0aCgpKTsKKwkJCS8vIGFkZCBhbGwgcHJvamVjdHMgdGhhdCByZWZlcmVuY2UgdGhpcyBhcmNoaXZlIGFuZCB0aGVpciBkZXBlbmRlbnRzCisJCQlJUGF0aCByb290UGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQkJSUphdmFNb2RlbCBtb2RlbCA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKKwkJCUhhc2hTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NwYXRoLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChyb290UGF0aC5lcXVhbHMoY2xhc3NwYXRoW2pdLmdldFBhdGgoKSkpIHsKKwkJCQkJCS8vIGFkZCB0aGUgcHJvamVjdCBhbmQgaXRzIGJpbmFyeSBwa2cgZnJhZ21lbnQgcm9vdHMKKwkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisJCQkJCQlzZXQuYWRkKHByb2plY3QuZ2V0UGF0aCgpKTsKKwkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcm9vdHMubGVuZ3RoOyBrKyspIHsKKwkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwa2dGcmFnbWVudFJvb3QgPSByb290c1trXTsKKwkJCQkJCQlpZiAocGtnRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkgeworCQkJCQkJCQlzZXQuYWRkKHBrZ0ZyYWdtZW50Um9vdC5nZXRQYXRoKCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIGFkZCB0aGUgZGVwZW5kZW50IHByb2plY3RzCisJCQkJCQl0aGlzLmNvbXB1dGVEZXBlbmRlbnRzKHByb2plY3QsIHNldCwgdmlzaXRlZCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGFkZCBhbGwgdGhlIHByb2plY3QncyBwa2cgZnJhZ21lbnQgcm9vdHMKKwkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKElKYXZhUHJvamVjdClyb290LmdldFBhcmVudCgpOworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IHByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwa2dGcmFnbWVudFJvb3QgPSByb290c1tpXTsKKwkJCQlpZiAocGtnRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkgeworCQkJCQlzZXQuYWRkKHBrZ0ZyYWdtZW50Um9vdC5nZXRQYXRoKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXNldC5hZGQocGtnRnJhZ21lbnRSb290LmdldFBhcmVudCgpLmdldFBhdGgoKSk7CisJCQkJfQorCQkJfQorCQkJLy8gYWRkIHRoZSBkZXBlbmRlbnQgcHJvamVjdHMKKwkJCXRoaXMuY29tcHV0ZURlcGVuZGVudHMocHJvamVjdCwgc2V0LCBuZXcgSGFzaFNldCgpKTsKKwkJfQorCQlJUGF0aFtdIHJlc3VsdCA9IG5ldyBJUGF0aFtzZXQuc2l6ZSgpXTsKKwkJc2V0LnRvQXJyYXkocmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVEZXBlbmRlbnRzKElKYXZhUHJvamVjdCBwcm9qZWN0LCBIYXNoU2V0IHNldCwgSGFzaFNldCB2aXNpdGVkKSB7CisJCWlmICh2aXNpdGVkLmNvbnRhaW5zKHByb2plY3QpKSByZXR1cm47CisJCXZpc2l0ZWQuYWRkKHByb2plY3QpOworCQlJUHJvamVjdFtdIGRlcGVuZGVudHMgPSBwcm9qZWN0LmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2luZ1Byb2plY3RzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlJSmF2YVByb2plY3QgZGVwZW5kZW50ID0gSmF2YUNvcmUuY3JlYXRlKGRlcGVuZGVudHNbaV0pOworCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBkZXBlbmRlbnQuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCQlzZXQuYWRkKGRlcGVuZGVudC5nZXRQYXRoKCkpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdHMubGVuZ3RoOyBqKyspIHsKKwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGtnRnJhZ21lbnRSb290ID0gcm9vdHNbal07CisJCQkJCWlmIChwa2dGcmFnbWVudFJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJCQkJCXNldC5hZGQocGtnRnJhZ21lbnRSb290LmdldFBhdGgoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJdGhpcy5jb21wdXRlRGVwZW5kZW50cyhkZXBlbmRlbnQsIHNldCwgdmlzaXRlZCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCS8vIHByb2plY3QgaXMgbm90IGEgamF2YSBwcm9qZWN0CisJCQl9CisJCX0KKwl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgSUphdmFTZWFyY2hTY29wZSNlbmNsb3NlcyhTdHJpbmcpCiAJICovCiAJcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCkgeworCQlpZiAodGhpcy5oaWVyYXJjaHkgPT0gbnVsbCkgeworCQkJaWYgKHJlc291cmNlUGF0aC5lcXVhbHModGhpcy5mb2N1c1BhdGgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLm5lZWRzUmVmcmVzaCkgeworCQkJCQl0cnkgeworCQkJCQkJdGhpcy5pbml0aWFsaXplKCk7CisJCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyB0aGUgc2NvcGUgaXMgdXNlZCBvbmx5IHRvIGZpbmQgZW5jbG9zaW5nIHByb2plY3RzIGFuZCBqYXJzCisJCQkJCS8vIGNsaWVudHMgaXMgcmVzcG9uc2libGUgZm9yIGZpbHRlcmluZyBvdXQgZWxlbWVudHMgbm90IGluIHRoZSBoaWVyYXJjaHkgKHNlZSBTZWFyY2hFbmdpbmUpCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQogCQlpZiAodGhpcy5uZWVkc1JlZnJlc2gpIHsKIAkJCXRyeSB7CiAJCQkJdGhpcy5yZWZyZXNoKCk7CkBAIC0xNDgsNiArMjYxLDIzIEBACiAJICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2VzKElKYXZhRWxlbWVudCkKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgeworCQlpZiAodGhpcy5oaWVyYXJjaHkgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuZm9jdXNUeXBlLmVxdWFscyhlbGVtZW50LmdldEFuY2VzdG9yKElKYXZhRWxlbWVudC5UWVBFKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CisJCQkJCXRyeSB7CisJCQkJCQl0aGlzLmluaXRpYWxpemUoKTsKKwkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIHRoZSBzY29wZSBpcyB1c2VkIG9ubHkgdG8gZmluZCBlbmNsb3NpbmcgcHJvamVjdHMgYW5kIGphcnMKKwkJCQkJLy8gY2xpZW50cyBpcyByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIG91dCBlbGVtZW50cyBub3QgaW4gdGhlIGhpZXJhcmNoeSAoc2VlIFNlYXJjaEVuZ2luZSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQkJCQkJCisJCQl9CisJCX0KIAkJaWYgKHRoaXMubmVlZHNSZWZyZXNoKSB7CiAJCQl0cnkgewogCQkJCXRoaXMucmVmcmVzaCgpOwpAQCAtMTYyLDMyICsyOTIsMjAgQEAKIAkJCXR5cGUgPSAoKElNZW1iZXIpIGVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKTsKIAkJfQogCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkhpZXJhcmNoeS5jb250YWlucyh0eXBlKSkgeworCQkJaWYgKHRoaXMuaGllcmFyY2h5LmNvbnRhaW5zKHR5cGUpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9IGVsc2UgewogCQkJCS8vIGJlIGZsZXhpYmxlOiBsb29rIGF0IG9yaWdpbmFsIGVsZW1lbnQgKHNlZSBidWcgMTQxMDYgRGVjbGFyYXRpb25zIGluIEhpZXJhcmNoeSBkb2VzIG5vdCBmaW5kIGRlY2xhcmF0aW9ucyBpbiBoaWVyYXJjaHkpCiAJCQkJSVR5cGUgb3JpZ2luYWw7CiAJCQkJaWYgKCF0eXBlLmlzQmluYXJ5KCkgCiAJCQkJCQkmJiAob3JpZ2luYWwgPSAoSVR5cGUpdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRPcmlnaW5hbCh0eXBlKSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZkhpZXJhcmNoeS5jb250YWlucyhvcmlnaW5hbCk7CisJCQkJCXJldHVybiB0aGlzLmhpZXJhcmNoeS5jb250YWlucyhvcmlnaW5hbCk7CiAJCQkJfQogCQkJfQogCQl9IAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZWFyY2ggc2NvcGUgZW5jbG9zZXMgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVuY2xvc2VzKElSZXNvdXJjZSBlbGVtZW50KSB7Ci0JCUlQYXRoIGVsZW1lbnRQYXRoID0gZWxlbWVudC5nZXRGdWxsUGF0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRDb3VudDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5lbGVtZW50c1tpXS5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YoZWxlbWVudFBhdGgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBJSmF2YVNlYXJjaFNjb3BlI2VuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpCiAJICogQGRlcHJlY2F0ZWQKIAkgKi8KQEAgLTIwMSwyNiArMzE5LDMyIEBACiAJCX0KIAkJcmV0dXJuIHRoaXMuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzOwogCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5yZXNvdXJjZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKIAkJdGhpcy5lbGVtZW50cyA9IG5ldyBJUmVzb3VyY2VbNV07CiAJCXRoaXMuZWxlbWVudENvdW50ID0gMDsKLQkJdGhpcy5uZWVkc1JlZnJlc2ggPSBmYWxzZTsJCQorCQl0aGlzLm5lZWRzUmVmcmVzaCA9IGZhbHNlOworCQlpZiAodGhpcy5oaWVyYXJjaHkgPT0gbnVsbCkgeworCQkJdGhpcy5oaWVyYXJjaHkgPSB0aGlzLmZvY3VzVHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOworCQl9IGVsc2UgeworCQkJdGhpcy5oaWVyYXJjaHkucmVmcmVzaChudWxsKTsKKwkJfQorCQl0aGlzLmJ1aWxkUmVzb3VyY2VWZWN0b3IoKTsKIAl9CiAJLyoKIAkgKiBAc2VlIEFic3RyYWN0U2VhcmNoU2NvcGUjcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhKQogCSAqLwogCXB1YmxpYyB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewogCQlpZiAodGhpcy5uZWVkc1JlZnJlc2gpIHJldHVybjsKLQkJdGhpcy5uZWVkc1JlZnJlc2ggPSAoKFR5cGVIaWVyYXJjaHkpZkhpZXJhcmNoeSkuaXNBZmZlY3RlZChkZWx0YSk7CisJCXRoaXMubmVlZHNSZWZyZXNoID0gdGhpcy5oaWVyYXJjaHkgPT0gbnVsbCA/IGZhbHNlIDogKChUeXBlSGllcmFyY2h5KXRoaXMuaGllcmFyY2h5KS5pc0FmZmVjdGVkKGRlbHRhKTsKIAl9CiAJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJZkhpZXJhcmNoeS5yZWZyZXNoKG51bGwpOwotCQl0aGlzLmJ1aWxkUmVzb3VyY2VWZWN0b3IoKTsKKwkJaWYgKHRoaXMuaGllcmFyY2h5ICE9IG51bGwpIHsKKwkJCXRoaXMuaW5pdGlhbGl6ZSgpOworCQl9CiAJfQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSGllcmFyY2h5U2NvcGUgb24gIiArICgoSmF2YUVsZW1lbnQpZkhpZXJhcmNoeS5nZXRUeXBlKCkpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAiSGllcmFyY2h5U2NvcGUgb24gIiArICgoSmF2YUVsZW1lbnQpdGhpcy5mb2N1c1R5cGUpLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpOyAvLyROT04tTkxTLTEkCiAJfQogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5kZXhTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSUluZGV4U2VhcmNoUmVxdWVzdG9yLmphdmEKaW5kZXggYWQ4Y2Y5Ni4uNWI3MDNiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5kZXhTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lJbmRleFNlYXJjaFJlcXVlc3Rvci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCiBwdWJsaWMgaW50ZXJmYWNlIElJbmRleFNlYXJjaFJlcXVlc3RvciB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lJbmZvQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0lJbmZvQ29uc3RhbnRzLmphdmEKaW5kZXggZTY5MjEwYi4uOTVjNTUxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JSW5mb0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSUluZm9Db25zdGFudHMuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKIAogcHVibGljIGludGVyZmFjZSBJSW5mb0NvbnN0YW50cyB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VhcmNoQWRhcHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlYXJjaEFkYXB0ZXIuamF2YQppbmRleCA3MjA3MGI0Li40NWIwNzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VhcmNoQWRhcHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSW5kZXhTZWFyY2hBZGFwdGVyLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CiAKIHB1YmxpYyBjbGFzcyBJbmRleFNlYXJjaEFkYXB0ZXIgaW1wbGVtZW50cyBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9JbmRleFNlbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQppbmRleCAzZTBiZTFlLi41YjZmOWRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0luZGV4U2VsZWN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zNCw2NiArMzQsNzcgQEAKIAlJSmF2YVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlOwogCUlKYXZhRWxlbWVudCBmb2N1czsKIAlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyOwotCUlJbmRleFtdIGluZGV4ZXM7CisJSVBhdGhbXSBpbmRleEtleXM7IC8vIGNhY2hlIG9mIHRoZSBrZXlzIGZvciBsb29raW5nIGluZGV4IHVwCisJYm9vbGVhbiBpc1BvbHltb3JwaGljU2VhcmNoOwogcHVibGljIEluZGV4U2VsZWN0b3IoCiAJSUphdmFTZWFyY2hTY29wZSBzZWFyY2hTY29wZSwKIAlJSmF2YUVsZW1lbnQgZm9jdXMsCisJYm9vbGVhbiBpc1BvbHltb3JwaGljU2VhcmNoLAogCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIpIHsKIAl0aGlzLnNlYXJjaFNjb3BlID0gc2VhcmNoU2NvcGU7CiAJdGhpcy5mb2N1cyA9IGZvY3VzOwogCXRoaXMuaW5kZXhNYW5hZ2VyID0gaW5kZXhNYW5hZ2VyOworCXRoaXMuaXNQb2x5bW9ycGhpY1NlYXJjaCA9IGlzUG9seW1vcnBoaWNTZWFyY2g7CiB9CiAvKioKLSAqIFJldHVybnMgd2hldGhlciBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcHJvamVjdCBvciBqYXIgY2FuIHNlZSB0aGUgZm9jdXMgZWxlbWVudAotICogZWl0aGVyIGJlY2F1c2UgdGhlIGZvY3VzIGlzIHBhcnQgb2YgdGhlIHByb2plY3Qgb3IgdGhlIGphciwgb3IgYmVjYXVzZSBpdCBpcyAKKyAqIFJldHVybnMgd2hldGhlciBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gcHJvamVjdCBvciBqYXIgY2FuIHNlZSB0aGUgZ2l2ZW4gZm9jdXMgKGFuIElKYXZhUHJvamVjdCBvcgorICogYSBKYXJQYWNrYWdlRnJhZ21lbnRSb3QpIGVpdGhlciBiZWNhdXNlIHRoZSBmb2N1cyBpcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IG9yIHRoZSBqYXIsIG9yIGJlY2F1c2UgaXQgaXMgCiAgKiBhY2Nlc3NpYmxlIHRocm91Z2h0IHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoCiAgKi8KLXByaXZhdGUgYm9vbGVhbiBjYW5TZWVGb2N1cyhJUGF0aCBwcm9qZWN0T3JKYXJQYXRoKSB7Ci0JLy8gaWYgaXQgaXMgYSB3b3Jrc3BhY2Ugc2NvcGUsIGZvY3VzIGlzIHZpc2libGUgZnJvbSBldmVyeXdoZXJlCi0JaWYgKHRoaXMuc2VhcmNoU2NvcGUgaW5zdGFuY2VvZiBKYXZhV29ya3NwYWNlU2NvcGUpIHJldHVybiB0cnVlOwotCQorcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNlZUZvY3VzKElKYXZhRWxlbWVudCBmb2N1cywgYm9vbGVhbiBpc1BvbHltb3JwaGljU2VhcmNoLCBJUGF0aCBwcm9qZWN0T3JKYXJQYXRoKSB7CiAJdHJ5IHsKLQkJd2hpbGUgKCEodGhpcy5mb2N1cyBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgJiYgISh0aGlzLmZvY3VzIGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkpIHsKLQkJCXRoaXMuZm9jdXMgPSB0aGlzLmZvY3VzLmdldFBhcmVudCgpOwotCQl9Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSB0aGlzLmZvY3VzLmdldEphdmFNb2RlbCgpOwotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QocHJvamVjdE9ySmFyUGF0aCwgbW9kZWwpOwotCQlpZiAodGhpcy5mb2N1cyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBqYXIKLQkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpdGhpcy5mb2N1czsKLQkJCUlQYXRoIGphclBhdGggPSBqYXIuZ2V0UGF0aCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCS8vIGNvbnNpZGVyIHRoYXQgYSBqYXIgY2FuIHNlZSBhbm90aGVyIGphciBvbmx5IHRoZXkgYXJlIGJvdGggcmVmZXJlbmNlZCBieSB0aGUgc2FtZSBwcm9qZWN0Ci0JCQkJcmV0dXJuIHRoaXMuaGF2ZVNhbWVQYXJlbnQocHJvamVjdE9ySmFyUGF0aCwgamFyUGF0aCwgbW9kZWwpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJSUphdmFNb2RlbCBtb2RlbCA9IGZvY3VzLmdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3RPckphclBhdGgsIG1vZGVsKTsKKwkJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQkJLy8gcHJvamVjdE9ySmFyUGF0aCBpcyBhIGphcgorCQkJLy8gaXQgY2FuIHNlZSB0aGUgZm9jdXMgb25seSBpZiBpdCBpcyBvbiB0aGUgY2xhc3NwYXRoIG9mIGEgcHJvamVjdCB0aGF0IGNhbiBzZWUgdGhlIGZvY3VzCisJCQlJSmF2YVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFsbFByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJSUphdmFQcm9qZWN0IG90aGVyUHJvamVjdCA9IGFsbFByb2plY3RzW2ldOworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBvdGhlclByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwogCQkJCQlpZiAoKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgCi0JCQkJCQkmJiBlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKGphclBhdGgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkmJiBlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHByb2plY3RPckphclBhdGgpKSB7CisJCQkJCQkJaWYgKGNhblNlZUZvY3VzKGZvY3VzLCBpc1BvbHltb3JwaGljU2VhcmNoLCBvdGhlclByb2plY3QuZ2V0UGF0aCgpKSkgeworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwogCQkJfQorCQkJcmV0dXJuIGZhbHNlOwogCQl9IGVsc2UgewotCQkJLy8gZm9jdXMgaXMgcGFydCBvZiBhIHByb2plY3QKLQkJCUlKYXZhUHJvamVjdCBmb2N1c1Byb2plY3QgPSAoSUphdmFQcm9qZWN0KXRoaXMuZm9jdXM7Ci0JCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJLy8gY29uc2lkZXIgdGhhdCBhIGphciBjYW4gc2VlIGEgcHJvamVjdCBvbmx5IGlmIGl0IGlzIHJlZmVyZW5jZWQgYnkgdGhpcyBwcm9qZWN0Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICgoSmF2YVByb2plY3QpZm9jdXNQcm9qZWN0KS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKKwkJCS8vIHByb2plY3RPckphclBhdGggaXMgYSBwcm9qZWN0CisJCQlKYXZhUHJvamVjdCBmb2N1c1Byb2plY3QgPSBmb2N1cyBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QgPyAoSmF2YVByb2plY3QpZm9jdXMuZ2V0UGFyZW50KCkgOiAoSmF2YVByb2plY3QpZm9jdXM7CisJCQlpZiAoaXNQb2x5bW9ycGhpY1NlYXJjaCkgeworCQkJCS8vIGxvb2sgZm9yIHJlZmVyaW5nIHByb2plY3QKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gZm9jdXNQcm9qZWN0LmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOwogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJCWlmICgoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSAKKwkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QpIAogCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhwcm9qZWN0T3JKYXJQYXRoKSkgewogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQl9CiAJCQkJfQorCQkJfQorCQkJaWYgKGZvY3VzIGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgeworCQkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBqYXIKKwkJCQlJUGF0aCBmb2N1c1BhdGggPSBmb2N1cy5nZXRQYXRoKCk7CisJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9ICgoSmF2YVByb2plY3QpcHJvamVjdCkuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIAorCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhmb2N1c1BhdGgpKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoZm9jdXNQcm9qZWN0LmVxdWFscyhwcm9qZWN0KSkgeworCQkJCS8vIGZvY3VzIGlzIHBhcnQgb2YgYSBwcm9qZWN0CisJCQkJaWYgKGZvY3VzLmVxdWFscyhwcm9qZWN0KSkgewogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9IGVsc2UgeworCQkJCQkvLyBsb29rIGZvciBkZXBlbmRlbnQgcHJvamVjdHMKIAkJCQkJSVBhdGggZm9jdXNQYXRoID0gZm9jdXNQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOwogCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gKChKYXZhUHJvamVjdClwcm9qZWN0KS5nZXRFeHBhbmRlZENsYXNzcGF0aCh0cnVlKTsKIAkJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTExMSwxMCArMTIyLDE1IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiB9Ci1wcml2YXRlIHZvaWQgY29tcHV0ZUluZGV4ZXMoKSB7Ci0JQXJyYXlMaXN0IGluZGV4ZXNJblNjb3BlID0gbmV3IEFycmF5TGlzdCgpOworLyoKKyAqICBDb21wdXRlIHRoZSBsaXN0IG9mIHBhdGhzIHdoaWNoIGFyZSBrZXlpbmcgaW5kZXggZmlsZXMuCisgKi8KK3ByaXZhdGUgdm9pZCBpbml0aWFsaXplSW5kZXhLZXlzKCkgeworCQorCUFycmF5TGlzdCByZXF1aXJlZEluZGV4S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKIAlJUGF0aFtdIHByb2plY3RzQW5kSmFycyA9IHRoaXMuc2VhcmNoU2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7Ci0JSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQkuZ2V0Um9vdCgpOworCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCUlKYXZhRWxlbWVudCBwcm9qZWN0T3JKYXJGb2N1cyA9IHRoaXMuZm9jdXMgPT0gbnVsbCA/IG51bGwgOiBnZXRQcm9qZWN0T3JKYXIodGhpcy5mb2N1cyk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0c0FuZEphcnMubGVuZ3RoOyBpKyspIHsKIAkJSVBhdGggbG9jYXRpb247CiAJCUlQYXRoIHBhdGggPSBwcm9qZWN0c0FuZEphcnNbaV07CkBAIC0xMjUsMjcgKzE0MSwzMyBAQAogCQkJJiYgIW5ldyBqYXZhLmlvLkZpbGUocGF0aC50b09TU3RyaW5nKCkpLmV4aXN0cygpKSB7IC8vIGFuZCBleHRlcm5hbCBqYXIgZmlsZSBkb2VzIG5vdCBleGlzdAogCQkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmICh0aGlzLmZvY3VzID09IG51bGwgfHwgdGhpcy5jYW5TZWVGb2N1cyhwYXRoKSkgewotCQkJSUluZGV4IGluZGV4ID0gdGhpcy5pbmRleE1hbmFnZXIuZ2V0SW5kZXgocGF0aCwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7Ci0JCQlpZiAoaW5kZXggIT0gbnVsbCAmJiBpbmRleGVzSW5TY29wZS5pbmRleE9mKGluZGV4KSA9PSAtMSkgewotCQkJCWluZGV4ZXNJblNjb3BlLmFkZChpbmRleCk7CisJCWlmIChwcm9qZWN0T3JKYXJGb2N1cyA9PSBudWxsIHx8IGNhblNlZUZvY3VzKHByb2plY3RPckphckZvY3VzLCB0aGlzLmlzUG9seW1vcnBoaWNTZWFyY2gsIHBhdGgpKSB7CisJCQlpZiAocmVxdWlyZWRJbmRleEtleXMuaW5kZXhPZihwYXRoKSA9PSAtMSkgeworCQkJCXJlcXVpcmVkSW5kZXhLZXlzLmFkZChwYXRoKTsKIAkJCX0KIAkJfQogCX0KLQl0aGlzLmluZGV4ZXMgPSBuZXcgSUluZGV4W2luZGV4ZXNJblNjb3BlLnNpemUoKV07Ci0JaW5kZXhlc0luU2NvcGUudG9BcnJheSh0aGlzLmluZGV4ZXMpOworCXRoaXMuaW5kZXhLZXlzID0gbmV3IElQYXRoW3JlcXVpcmVkSW5kZXhLZXlzLnNpemUoKV07CisJcmVxdWlyZWRJbmRleEtleXMudG9BcnJheSh0aGlzLmluZGV4S2V5cyk7CiB9CiBwdWJsaWMgSUluZGV4W10gZ2V0SW5kZXhlcygpIHsKLQlpZiAodGhpcy5pbmRleGVzID09IG51bGwpIHsKLQkJdGhpcy5jb21wdXRlSW5kZXhlcygpOworCWlmICh0aGlzLmluZGV4S2V5cyA9PSBudWxsKSB7CisJCXRoaXMuaW5pdGlhbGl6ZUluZGV4S2V5cygpOyAKIAl9Ci0JcmV0dXJuIHRoaXMuaW5kZXhlczsKKwkvLyBhY3F1aXJlIHRoZSBpbi1tZW1vcnkgaW5kZXhlcyBvbiB0aGUgZmx5CisJaW50IGxlbmd0aCA9IHRoaXMuaW5kZXhLZXlzLmxlbmd0aDsKKwlJSW5kZXhbXSBpbmRleGVzID0gbmV3IElJbmRleFtsZW5ndGhdOworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQkvLyBtYXkgdHJpZ2dlciBzb21lIGluZGV4IHJlY3JlYXRpb24gd29yaworCQlpbmRleGVzW2ldID0gaW5kZXhNYW5hZ2VyLmdldEluZGV4KGluZGV4S2V5c1tpXSwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7CisJfQorCXJldHVybiBpbmRleGVzOwogfQogLyoqCiAgKiBSZXR1cm5zIHRoZSBqYXZhIHByb2plY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gcGF0aC4KICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcGF0aCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBwcm9qZWN0LgogICovCi1wcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUGF0aCBwYXRoLCBJSmF2YU1vZGVsIG1vZGVsKSB7Citwcml2YXRlIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVBhdGggcGF0aCwgSUphdmFNb2RlbCBtb2RlbCkgewogCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gbW9kZWwuZ2V0SmF2YVByb2plY3QocGF0aC5sYXN0U2VnbWVudCgpKTsKIAlpZiAocHJvamVjdC5leGlzdHMoKSkgewogCQlyZXR1cm4gcHJvamVjdDsKQEAgLTE1Myw0MCArMTc1LDEwIEBACiAJCXJldHVybiBudWxsOwogCX0KIH0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBqYXJzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBjbGFzc3BhdGggb2YgdGhlIHNhbWUgcHJvamVjdC4KLSAqLwotcHJpdmF0ZSBib29sZWFuIGhhdmVTYW1lUGFyZW50KElQYXRoIGphclBhdGgxLCBJUGF0aCBqYXJQYXRoMiwgSUphdmFNb2RlbCBtb2RlbCkgewotCWlmIChqYXJQYXRoMS5lcXVhbHMoamFyUGF0aDIpKSB7Ci0JCXJldHVybiB0cnVlOworcHVibGljIHN0YXRpYyBJSmF2YUVsZW1lbnQgZ2V0UHJvamVjdE9ySmFyKElKYXZhRWxlbWVudCBlbGVtZW50KSB7CisJd2hpbGUgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkpIHsKKwkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CiAJfQotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAoKEphdmFQcm9qZWN0KXByb2plY3QpLmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOwotCQkJYm9vbGVhbiByZWZlcmVuY2VzSmFyMSA9IGZhbHNlOwotCQkJYm9vbGVhbiByZWZlcmVuY2VzSmFyMiA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDAsIGxlbmd0aDIgPSBlbnRyaWVzLmxlbmd0aDsgaiA8IGxlbmd0aDI7IGorKykgewotCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0JCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlJUGF0aCBlbnRyeVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChlbnRyeVBhdGguZXF1YWxzKGphclBhdGgxKSkgewotCQkJCQkJcmVmZXJlbmNlc0phcjEgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYgKGVudHJ5UGF0aC5lcXVhbHMoamFyUGF0aDIpKSB7Ci0JCQkJCQlyZWZlcmVuY2VzSmFyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmZXJlbmNlc0phcjEgJiYgcmVmZXJlbmNlc0phcjIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCi0JCX0KLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0JCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBlbGVtZW50OwogfQotCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hTY29wZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhU2VhcmNoU2NvcGUuamF2YQppbmRleCA5ZTExNzNlLi4yMGE1NDRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFTZWFyY2hTY29wZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVNlYXJjaFNjb3BlLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2g7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMTExLDcgKzExMSw3IEBACiAJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewogCQkJCXRoaXMuYWRkKHJvb3QuZ2V0UGF0aCgpLmFwcGVuZChuZXcgUGF0aChlbGVtZW50LmdldEVsZW1lbnROYW1lKCkucmVwbGFjZSgnLicsICcvJykpKSwgZmFsc2UpOwogCQkJfSBlbHNlIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKIAkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewogCQkJCQl0aGlzLmFkZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBmYWxzZSk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhV29ya3NwYWNlU2NvcGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvSmF2YVdvcmtzcGFjZVNjb3BlLmphdmEKaW5kZXggY2UyNTdmNy4uYjA4ZDQxYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9KYXZhV29ya3NwYWNlU2NvcGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL0phdmFXb3Jrc3BhY2VTY29wZS5qYXZhCkBAIC0xLDI1ICsxLDIzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiAKIC8qKgogICogQSBKYXZhLXNwZWNpZmljIHNjb3BlIGZvciBzZWFyY2hpbmcgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCkBAIC03MiwyMCArNzAsMTMgQEAKIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJcmV0dXJuIEphdmFXb3Jrc3BhY2VTY29wZS5jbGFzcy5oYXNoQ29kZSgpOwogfQotCi0KIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCUphdmFDb3JlIGphdmFDb3JlID0gSmF2YUNvcmUuZ2V0SmF2YUNvcmUoKTsKLQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwcm9qZWN0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuYWRkKGphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgZmFsc2UsIG5ldyBIYXNoU2V0KDIpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KKwl0cnkgeworCQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0cygpOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcHJvamVjdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisJCQl0aGlzLmFkZChwcm9qZWN0c1tpXSwgZmFsc2UsIG5ldyBIYXNoU2V0KDIpKTsKKwl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gaWdub3JlZCkgewogCX0KIAl0aGlzLm5lZWRzSW5pdGlhbGl6ZSA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXRoQ29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdGhDb2xsZWN0b3IuamF2YQppbmRleCBkMzdlZjE1Li40ZTc5OWYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdGhDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdGhDb2xsZWN0b3IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9QYXR0ZXJuU2VhcmNoSm9iLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQppbmRleCA1Y2I4ODYyLi5jMWI0ZjkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1BhdHRlcm5TZWFyY2hKb2IuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMiw2ICszMiw3IEBACiAJcHJvdGVjdGVkIEluZGV4TWFuYWdlciBpbmRleE1hbmFnZXI7CiAJcHJvdGVjdGVkIGludCBkZXRhaWxMZXZlbDsKIAlwcm90ZWN0ZWQgSW5kZXhTZWxlY3RvciBpbmRleFNlbGVjdG9yOworCXByb3RlY3RlZCBib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2g7CiAJcHJvdGVjdGVkIGxvbmcgZXhlY3V0aW9uVGltZSA9IDA7CiAJCiAJcHVibGljIFBhdHRlcm5TZWFyY2hKb2IoCkBAIC00NSwxNSArNDYsMTYgQEAKIAkJCXBhdHRlcm4sCiAJCQlzY29wZSwKIAkJCW51bGwsCisJCQlmYWxzZSwKIAkJCWRldGFpbExldmVsLAogCQkJcmVxdWVzdG9yLAogCQkJaW5kZXhNYW5hZ2VyKTsKIAl9Ci0KIAlwdWJsaWMgUGF0dGVyblNlYXJjaEpvYigKIAkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAogCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLAogCQlJSmF2YUVsZW1lbnQgZm9jdXMsCisJCWJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCwKIAkJaW50IGRldGFpbExldmVsLAogCQlJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLAogCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyKSB7CkBAIC02MSwxOCArNjMsMTYgQEAKIAkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJdGhpcy5zY29wZSA9IHNjb3BlOwogCQl0aGlzLmZvY3VzID0gZm9jdXM7CisJCXRoaXMuaXNQb2x5bW9ycGhpY1NlYXJjaCA9IGlzUG9seW1vcnBoaWNTZWFyY2g7CiAJCXRoaXMuZGV0YWlsTGV2ZWwgPSBkZXRhaWxMZXZlbDsKIAkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7CiAJCXRoaXMuaW5kZXhNYW5hZ2VyID0gaW5kZXhNYW5hZ2VyOwogCX0KLQogCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KSB7CiAJCXJldHVybiB0cnVlOwogCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCisJcHVibGljIHZvaWQgY2FuY2VsKCkgeworCX0KIAlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CiAKIAkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpCkBAIC04MSw3ICs4MSw3IEBACiAJCWV4ZWN1dGlvblRpbWUgPSAwOwogCQlpZiAodGhpcy5pbmRleFNlbGVjdG9yID09IG51bGwpIHsKIAkJCXRoaXMuaW5kZXhTZWxlY3RvciA9Ci0JCQkJbmV3IEluZGV4U2VsZWN0b3IodGhpcy5zY29wZSwgdGhpcy5mb2N1cywgdGhpcy5pbmRleE1hbmFnZXIpOworCQkJCW5ldyBJbmRleFNlbGVjdG9yKHRoaXMuc2NvcGUsIHRoaXMuZm9jdXMsIHRoaXMuaXNQb2x5bW9ycGhpY1NlYXJjaCwgdGhpcy5pbmRleE1hbmFnZXIpOwogCQl9CiAJCUlJbmRleFtdIHNlYXJjaEluZGV4ZXMgPSB0aGlzLmluZGV4U2VsZWN0b3IuZ2V0SW5kZXhlcygpOwogCQl0cnkgewpAQCAtMTA5LDE1ICsxMDksMjMgQEAKIAkJCX0KIAkJfQogCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkeVRvUnVuKCkgeworCQlpZiAodGhpcy5pbmRleFNlbGVjdG9yID09IG51bGwpIHsgLy8gb25seSBjaGVjayBvbmNlLCBpLmUuIGFzIGxvbmcgYXMgdGhpcyBqb2IgaXMgdXNlZCwgaXQgd2lsbCBrZWVwIHRoZSBzYW1lIGluZGV4IHBpY3R1cmUKKwkJCXRoaXMuaW5kZXhTZWxlY3RvciA9IG5ldyBJbmRleFNlbGVjdG9yKHRoaXMuc2NvcGUsIHRoaXMuZm9jdXMsIHRoaXMuaXNQb2x5bW9ycGhpY1NlYXJjaCwgdGhpcy5pbmRleE1hbmFnZXIpOworCQkJdGhpcy5pbmRleFNlbGVjdG9yLmdldEluZGV4ZXMoKTsgLy8gd2lsbCBvbmx5IGNhY2hlIGFuc3dlciBpZiBhbGwgaW5kZXhlcyB3ZXJlIGF2YWlsYWJsZSBvcmlnaW5hbGx5CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQogCXB1YmxpYyBib29sZWFuIHNlYXJjaChJSW5kZXggaW5kZXgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CiAKIAkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpCiAJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKIAorLy8JCUlJbmRleCBpbk1lbUluZGV4ID0gaW5kZXhNYW5hZ2VyLnBlZWtBdEluZGV4KG5ldyBQYXRoKCgoSW5kZXgpaW5kZXgpLnRvU3RyaW5nLnN1YnN0cmluZygiSW5kZXggZm9yICIubGVuZ3RoKCkpLnJlcGxhY2UoJ1xcJywnLycpKSk7CisvLwkJaWYgKGluTWVtSW5kZXggIT0gaW5kZXgpIHsKKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJTQU5JVFkgQ0hFQ0s6IHNlYXJjaCBqb2IgdXNpbmcgb2Jzb2xldGUgaW5kZXg6IFsiK2luZGV4KyAiXSBpbnN0ZWFkIG9mOiBbIitpbk1lbUluZGV4KyJdIik7CisvLwkJfQorCQkKIAkJaWYgKGluZGV4ID09IG51bGwpCiAJCQlyZXR1cm4gQ09NUExFVEU7CiAJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IGluZGV4TWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKQEAgLTEzMSw5ICsxMzksNyBAQAogCQkJCXRyeSB7CiAJCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKIAkJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCi0JCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkKLQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gbWVyZ2luZyBpbmRleCAiICsgaW5kZXguZ2V0SW5kZXhGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWluZGV4LnNhdmUoKTsKKwkJCQkJdGhpcy5pbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJCXJldHVybiBGQUlMRUQ7CiAJCQkJfSBmaW5hbGx5IHsKQEAgLTE1NSwxNCArMTYxLDcgQEAKIAkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZmluaXNoZWQgcmVhZGluZwogCQl9CiAJfQotCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuICJzZWFyY2hpbmcgIiArIHBhdHRlcm4udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAogCX0KLQkvKgotCSAqIEBzZWUgSUpvYiNjYW5jZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1N1YlR5cGVTZWFyY2hKb2IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCmluZGV4IGE2NzdhZjIuLmYwMmIzNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvU3ViVHlwZVNlYXJjaEpvYi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5SZWFkV3JpdGVNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZy5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CiAKIHB1YmxpYyBjbGFzcyBTdWJUeXBlU2VhcmNoSm9iIGV4dGVuZHMgUGF0dGVyblNlYXJjaEpvYiB7CiAKQEAgLTMzLDggKzMyLDE1IEBACiBwdWJsaWMgU3ViVHlwZVNlYXJjaEpvYihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGludCBkZXRhaWxMZXZlbCwgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlcikgewogCXN1cGVyKHBhdHRlcm4sIHNjb3BlLCBkZXRhaWxMZXZlbCwgcmVxdWVzdG9yLCBpbmRleE1hbmFnZXIpOwogfQotcHVibGljIFN1YlR5cGVTZWFyY2hKb2IoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBJSmF2YUVsZW1lbnQgZm9jdXMsIGludCBkZXRhaWxMZXZlbCwgSUluZGV4U2VhcmNoUmVxdWVzdG9yIHJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIpIHsKLQlzdXBlcihwYXR0ZXJuLCBzY29wZSwgZm9jdXMsIGRldGFpbExldmVsLCByZXF1ZXN0b3IsIGluZGV4TWFuYWdlcik7CitwdWJsaWMgU3ViVHlwZVNlYXJjaEpvYihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIElKYXZhRWxlbWVudCBmb2N1cywgaW50IGRldGFpbExldmVsLCBJSW5kZXhTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyKSB7CisJc3VwZXIoCisJCXBhdHRlcm4sIAorCQlzY29wZSwgCisJCWZvY3VzLCAKKwkJZmFsc2UvKm5vdCBhIHBvbHltb3JwaGljIHNlYXJjaCovLCAKKwkJZGV0YWlsTGV2ZWwsIAorCQlyZXF1ZXN0b3IsIAorCQlpbmRleE1hbmFnZXIpOwogfQogcHVibGljIHZvaWQgY2xvc2VBbGwoKXsKIApAQCAtNjUsOSArNzEsNyBAQAogCQkJdHJ5IHsKIAkJCQltb25pdG9yLmV4aXRSZWFkKCk7IC8vIGZyZWUgcmVhZCBsb2NrCiAJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCi0JCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKSAKLQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleC5zYXZlKCk7CisJCQkJdGhpcy5pbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKIAkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7CiAJCQkJcmV0dXJuIEZBSUxFRDsKIAkJCX0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL1V0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCmluZGV4IDc3ZTIwZDEuLmI1OTg3ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvVXRpbC5qYXZhCkBAIC0xLDIwICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIAogcHVibGljIGNsYXNzIFV0aWwgewogCQpAQCAtMTAxLDcgKzEwMSwxMiBAQAogICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgogICovCiBwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2NhbGl6ZSgpIHsKLQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisJdHJ5ICB7CQkKKwkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOworCX0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIHJlc291cmNlIDogIiArIGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnByb3BlcnRpZXMgZm9yIGxvY2FsZSAiICsgTG9jYWxlLmdldERlZmF1bHQoKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCXRocm93IGU7CisJfQogfQogfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0Fic3RyYWN0SW5kZXhlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BYnN0cmFjdEluZGV4ZXIuamF2YQppbmRleCAyYjRjYWEwLi4zZWJlNzUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0Fic3RyYWN0SW5kZXhlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWJzdHJhY3RJbmRleGVyLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXJPdXRwdXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZENsYXNzRmlsZVRvSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhCmluZGV4IGEzMDc0Y2EuLjY4YzBiNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ2xhc3NGaWxlVG9JbmRleC5qYXZhCkBAIC0xLDg3ICsxLDQyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JRmlsZURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CiAKLWNsYXNzIEFkZENsYXNzRmlsZVRvSW5kZXggZXh0ZW5kcyBJbmRleFJlcXVlc3QgewotCUlGaWxlIHJlc291cmNlOwotCUluZGV4TWFuYWdlciBtYW5hZ2VyOwotCUlQYXRoIGluZGV4ZWRDb250YWluZXI7CitjbGFzcyBBZGRDbGFzc0ZpbGVUb0luZGV4IGV4dGVuZHMgQWRkRmlsZVRvSW5kZXggewogCWJ5dGVbXSBjb250ZW50czsKLQlwdWJsaWMgQWRkQ2xhc3NGaWxlVG9JbmRleCgKLQkJSUZpbGUgcmVzb3VyY2UsCi0JCUluZGV4TWFuYWdlciBtYW5hZ2VyLAotCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5pbmRleGVkQ29udGFpbmVyID0gaW5kZXhlZENvbnRhaW5lcjsKKworCXB1YmxpYyBBZGRDbGFzc0ZpbGVUb0luZGV4KElGaWxlIHJlc291cmNlLCBJUGF0aCBpbmRleGVkQ29udGFpbmVyLCBJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQlzdXBlcihyZXNvdXJjZSwgaW5kZXhlZENvbnRhaW5lciwgbWFuYWdlcik7CiAJfQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KSB7Ci0JCXJldHVybiBqb2JGYW1pbHkuZXF1YWxzKHRoaXMuaW5kZXhlZENvbnRhaW5lci5zZWdtZW50KDApKTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRleERvY3VtZW50KElJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFpbml0aWFsaXplQ29udGVudHMoKSkgcmV0dXJuIGZhbHNlOworCQlpbmRleC5hZGQobmV3IElGaWxlRG9jdW1lbnQocmVzb3VyY2UsIHRoaXMuY29udGVudHMpLCBuZXcgQmluYXJ5SW5kZXhlcih0cnVlKSk7CisJCXJldHVybiB0cnVlOwogCX0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOwotCQkKLQkJdHJ5IHsKLQkJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleGVkQ29udGFpbmVyLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7Ci0JCQkvKiBlbnN1cmUgbm8gY29uY3VycmVudCB3cml0ZSBhY2Nlc3MgdG8gaW5kZXggKi8KLQkJCWlmIChpbmRleCA9PSBudWxsKQotCQkJCXJldHVybiBDT01QTEVURTsKLQkJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7Ci0JCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJCXJldHVybiBDT01QTEVURTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKwlwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplQ29udGVudHMoKSB7CisJCWlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHsKIAkJCXRyeSB7Ci0JCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCi0JCQkJYnl0ZVtdIGNvbnRlbnRzID0gdGhpcy5nZXRDb250ZW50cygpOwotCQkJCWlmIChjb250ZW50cyA9PSBudWxsKQotCQkJCQlyZXR1cm4gRkFJTEVEOwotCQkJCWluZGV4LmFkZChuZXcgSUZpbGVEb2N1bWVudChyZXNvdXJjZSwgY29udGVudHMpLCBuZXcgQmluYXJ5SW5kZXhlcih0cnVlKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZXhpdFdyaXRlKCk7IC8vIGZyZWUgd3JpdGUgbG9jaworCQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKKwkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKKwkJCQkJdGhpcy5jb250ZW50cyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KGxvY2F0aW9uLnRvRmlsZSgpKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgewotCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIGluZGV4ICIgKyB0aGlzLnJlc291cmNlICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIEZBSUxFRDsKIAkJfQotCQlyZXR1cm4gQ09NUExFVEU7CisJCXJldHVybiB0aGlzLmNvbnRlbnRzICE9IG51bGw7CiAJfQotCXByaXZhdGUgYnl0ZVtdIGdldENvbnRlbnRzKCkgewotCQlpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKQotCQkJdGhpcy5pbml0aWFsaXplQ29udGVudHMoKTsKLQkJcmV0dXJuIHRoaXMuY29udGVudHM7Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDb250ZW50cygpIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZW50cyA9Ci0JCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUJ5dGVDb250ZW50KAotCQkJCQkJcmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gImluZGV4aW5nICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDb21waWxhdGlvblVuaXRUb0luZGV4LmphdmEKaW5kZXggN2M1YTZjZS4uMTUxZjI1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDb21waWxhdGlvblVuaXRUb0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRDb21waWxhdGlvblVuaXRUb0luZGV4LmphdmEKQEAgLTEsODggKzEsNDIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLklGaWxlRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKIAotY2xhc3MgQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleCBleHRlbmRzIEluZGV4UmVxdWVzdCB7Ci0JSUZpbGUgcmVzb3VyY2U7Ci0JSW5kZXhNYW5hZ2VyIG1hbmFnZXI7Ci0JSVBhdGggaW5kZXhlZENvbnRhaW5lcjsKK2NsYXNzIEFkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXggZXh0ZW5kcyBBZGRGaWxlVG9JbmRleCB7CiAJY2hhcltdIGNvbnRlbnRzOwotCXB1YmxpYyBBZGRDb21waWxhdGlvblVuaXRUb0luZGV4KAotCQlJRmlsZSByZXNvdXJjZSwKLQkJSW5kZXhNYW5hZ2VyIG1hbmFnZXIsCi0JCUlQYXRoIGluZGV4ZWRDb250YWluZXIpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLmluZGV4ZWRDb250YWluZXIgPSBpbmRleGVkQ29udGFpbmVyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgewotCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyh0aGlzLmluZGV4ZWRDb250YWluZXIuc2VnbWVudCgwKSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKIAotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOwotCQl0cnkgewotCQkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4ZWRDb250YWluZXIsIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKLQotCQkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCi0JCQlpZiAoaW5kZXggPT0gbnVsbCkKLQkJCQlyZXR1cm4gQ09NUExFVEU7Ci0JCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOwotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJcHVibGljIEFkZENvbXBpbGF0aW9uVW5pdFRvSW5kZXgoSUZpbGUgcmVzb3VyY2UsIElQYXRoIGluZGV4ZWRDb250YWluZXIsIEluZGV4TWFuYWdlciBtYW5hZ2VyKSB7CisJCXN1cGVyKHJlc291cmNlLCBpbmRleGVkQ29udGFpbmVyLCBtYW5hZ2VyKTsKKwl9CisJcHJvdGVjdGVkIGJvb2xlYW4gaW5kZXhEb2N1bWVudChJSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICghaW5pdGlhbGl6ZUNvbnRlbnRzKCkpIHJldHVybiBmYWxzZTsKKwkJaW5kZXguYWRkKG5ldyBJRmlsZURvY3VtZW50KHJlc291cmNlLCB0aGlzLmNvbnRlbnRzKSwgbmV3IFNvdXJjZUluZGV4ZXIocmVzb3VyY2UpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBib29sZWFuIGluaXRpYWxpemVDb250ZW50cygpIHsKKwkJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkgewogCQkJdHJ5IHsKLQkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKLQkJCQljaGFyW10gY29udGVudHMgPSB0aGlzLmdldENvbnRlbnRzKCk7Ci0JCQkJaWYgKGNvbnRlbnRzID09IG51bGwpCi0JCQkJCXJldHVybiBGQUlMRUQ7Ci0JCQkJaW5kZXguYWRkKG5ldyBJRmlsZURvY3VtZW50KHJlc291cmNlLCBjb250ZW50cyksIG5ldyBTb3VyY2VJbmRleGVyKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmV4aXRXcml0ZSgpOyAvLyBmcmVlIHdyaXRlIGxvY2sKKwkJCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7CisJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCisJCQkJCXRoaXMuY29udGVudHMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVDaGFyQ29udGVudChsb2NhdGlvbi50b0ZpbGUoKSwgbnVsbCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKLQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5yZXNvdXJjZSArICIgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBGQUlMRUQ7CiAJCX0KLQkJcmV0dXJuIENPTVBMRVRFOworCQlyZXR1cm4gdGhpcy5jb250ZW50cyAhPSBudWxsOwogCX0KLQlwcml2YXRlIGNoYXJbXSBnZXRDb250ZW50cygpIHsKLQkJaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkKLQkJCXRoaXMuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewotCi0JCXRyeSB7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGVudHMgPQotCQkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVDaGFyQ29udGVudCgKLQkJCQkJCWxvY2F0aW9uLnRvRmlsZSgpLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiaW5kZXhpbmcgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRGaWxlVG9JbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRGaWxlVG9JbmRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjMzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZpbGVUb0luZGV4LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworCithYnN0cmFjdCBjbGFzcyBBZGRGaWxlVG9JbmRleCBleHRlbmRzIEluZGV4UmVxdWVzdCB7CisJSUZpbGUgcmVzb3VyY2U7CisKKwlwdWJsaWMgQWRkRmlsZVRvSW5kZXgoSUZpbGUgcmVzb3VyY2UsIElQYXRoIGluZGV4UGF0aCwgSW5kZXhNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIoaW5kZXhQYXRoLCBtYW5hZ2VyKTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCX0KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiB0cnVlOworCisJCS8qIGVuc3VyZSBubyBjb25jdXJyZW50IHdyaXRlIGFjY2VzcyB0byBpbmRleCAqLworCQlJSW5kZXggaW5kZXggPSBtYW5hZ2VyLmdldEluZGV4KHRoaXMuaW5kZXhQYXRoLCB0cnVlLCAvKnJldXNlIGluZGV4IGZpbGUqLyB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCWlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisKKwkJdHJ5IHsKKwkJCW1vbml0b3IuZW50ZXJXcml0ZSgpOyAvLyBhc2sgcGVybWlzc2lvbiB0byB3cml0ZQorCQkJaWYgKCFpbmRleERvY3VtZW50KGluZGV4KSkgcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMucmVzb3VyY2UgKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmV4aXRXcml0ZSgpOyAvLyBmcmVlIHdyaXRlIGxvY2sKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaW5kZXhEb2N1bWVudChJSW5kZXggaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImluZGV4aW5nICIgKyB0aGlzLnJlc291cmNlLmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZvbGRlclRvSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkRm9sZGVyVG9JbmRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzg3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEZvbGRlclRvSW5kZXguamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CisKK2NsYXNzIEFkZEZvbGRlclRvSW5kZXggZXh0ZW5kcyBJbmRleFJlcXVlc3QgeworCUlQYXRoIGZvbGRlclBhdGg7CisJSVByb2plY3QgcHJvamVjdDsKKwljaGFyW11bXSBleGNsdXNpb25QYXR0ZXJuOworCisJcHVibGljIEFkZEZvbGRlclRvSW5kZXgoSVBhdGggZm9sZGVyUGF0aCwgSVByb2plY3QgcHJvamVjdCwgY2hhcltdW10gZXhjbHVzaW9uUGF0dGVybiwgSW5kZXhNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIocHJvamVjdC5nZXRGdWxsUGF0aCgpLCBtYW5hZ2VyKTsKKwkJdGhpcy5mb2xkZXJQYXRoID0gZm9sZGVyUGF0aDsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5leGNsdXNpb25QYXR0ZXJuID0gZXhjbHVzaW9uUGF0dGVybjsKKwl9CisJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSByZXR1cm4gdHJ1ZTsgLy8gbm90aGluZyB0byBkbworCQlJUmVzb3VyY2UgZm9sZGVyID0gdGhpcy5wcm9qZWN0LmdldFBhcmVudCgpLmZpbmRNZW1iZXIodGhpcy5mb2xkZXJQYXRoKTsKKwkJaWYgKGZvbGRlciA9PSBudWxsIHx8IGZvbGRlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvLCBzb3VyY2UgZm9sZGVyIHdhcyByZW1vdmVkCisKKwkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCisJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleFBhdGgsIHRydWUsIC8qcmV1c2UgaW5kZXggZmlsZSovIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKKwkJaWYgKGluZGV4ID09IG51bGwpIHJldHVybiB0cnVlOworCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQlpZiAobW9uaXRvciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKworCQl0cnkgeworCQkJbW9uaXRvci5lbnRlclJlYWQoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gcmVhZAorCisJCQlmaW5hbCBJUGF0aCBjb250YWluZXIgPSB0aGlzLmluZGV4UGF0aDsKKwkJCWZpbmFsIEluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7CisJCQlmaW5hbCBjaGFyW11bXSBwYXR0ZXJuID0gZXhjbHVzaW9uUGF0dGVybjsKKwkJCWZvbGRlci5hY2NlcHQoCisJCQkJbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKKwkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQkJCXN3aXRjaChwcm94eS5nZXRUeXBlKCkpIHsKKwkJCQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQkJCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJveHkucmVxdWVzdFJlc291cmNlKCk7CisJCQkJCQkJCQlpZiAocGF0dGVybiA9PSBudWxsIHx8ICFVdGlsLmlzRXhjbHVkZWQocmVzb3VyY2UsIHBhdHRlcm4pKQorCQkJCQkJCQkJCWluZGV4TWFuYWdlci5hZGRTb3VyY2UoKElGaWxlKXJlc291cmNlLCBjb250YWluZXIpOworCQkJCQkJCQl9CisJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQkJCQlpZiAocGF0dGVybiAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgcGF0dGVybikpCisJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0sCisJCQkJSVJlc291cmNlLk5PTkUKKwkJCSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgeworCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIGFkZCAiICsgdGhpcy5mb2xkZXJQYXRoICsgIiB0byBpbmRleCBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jaworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gImFkZGluZyAiICsgdGhpcy5mb2xkZXJQYXRoICsgIiB0byBpbmRleCAiICsgdGhpcy5pbmRleFBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQWRkSmFyRmlsZVRvSW5kZXguamF2YQppbmRleCAwZTRkODI1Li5hMDIyOGJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0FkZEphckZpbGVUb0luZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9BZGRKYXJGaWxlVG9JbmRleC5qYXZhCkBAIC0xLDE4ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKQEAgLTIxLDc1ICsyMCw3MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSmFyRmlsZUVudHJ5RG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogCiBjbGFzcyBBZGRKYXJGaWxlVG9JbmRleCBleHRlbmRzIEluZGV4UmVxdWVzdCB7Ci0KLQlJbmRleE1hbmFnZXIgbWFuYWdlcjsKLQlTdHJpbmcgcHJvamVjdE5hbWU7CiAJSUZpbGUgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmc7Ci0JSVBhdGggcGF0aDsKIAotCXB1YmxpYyBBZGRKYXJGaWxlVG9JbmRleCgKLQkJSUZpbGUgcmVzb3VyY2UsCi0JCUluZGV4TWFuYWdlciBtYW5hZ2VyLAotCQlTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwlwdWJsaWMgQWRkSmFyRmlsZVRvSW5kZXgoSUZpbGUgcmVzb3VyY2UsIEluZGV4TWFuYWdlciBtYW5hZ2VyKSB7CisJCXN1cGVyKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG1hbmFnZXIpOwogCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCXRoaXMucGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKIAl9Ci0JLy8gY2FuIGJlIGZvdW5kIGVpdGhlciBieSBwcm9qZWN0IG5hbWUgb3IgSkFSIHBhdGggbmFtZQotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgam9iRmFtaWx5KSB7Ci0JCXJldHVybiBqb2JGYW1pbHkuZXF1YWxzKHByb2plY3ROYW1lKSB8fCB0aGlzLnBhdGgudG9TdHJpbmcoKS5lcXVhbHMoam9iRmFtaWx5KTsKKwlwdWJsaWMgQWRkSmFyRmlsZVRvSW5kZXgoSVBhdGggaW5kZXhQYXRoLCBJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQkvLyBleHRlcm5hbCBKQVIgc2NlbmFyaW8gLSBubyByZXNvdXJjZQorCQlzdXBlcihpbmRleFBhdGgsIG1hbmFnZXIpOwogCX0KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCWlmICghKG8gaW5zdGFuY2VvZiBBZGRKYXJGaWxlVG9JbmRleCkpIHJldHVybiBmYWxzZTsKLQlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmVxdWFscygoKEFkZEphckZpbGVUb0luZGV4KW8pLnJlc291cmNlKTsKKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIHByb2plY3ROYW1lT3JKYXJQYXRoKSB7CisJCS8vIHVzZWQgdG8gcmVtb3ZlIHBlbmRpbmcgam9icyBiZWNhdXNlIHRoZSBwcm9qZWN0IHdhcyBkZWxldGVkLi4uIG5vdCB0byBkZWxldGUgaW5kZXggZmlsZXMKKwkJLy8gY2FuIGJlIGZvdW5kIGVpdGhlciBieSBwcm9qZWN0IG5hbWUgb3IgSkFSIHBhdGggbmFtZQorCQlyZXR1cm4gc3VwZXIuYmVsb25nc1RvKHByb2plY3ROYW1lT3JKYXJQYXRoKQorCQkJfHwgcHJvamVjdE5hbWVPckphclBhdGguZXF1YWxzKHRoaXMuaW5kZXhQYXRoLnRvU3RyaW5nKCkpOwogCX0KLQlpZiAodGhpcy5wYXRoICE9IG51bGwpIHsKLQkJcmV0dXJuIHRoaXMucGF0aC5lcXVhbHMoKChBZGRKYXJGaWxlVG9JbmRleClvKS5wYXRoKTsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKG8gaW5zdGFuY2VvZiBBZGRKYXJGaWxlVG9JbmRleCkgeworCQkJaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5lcXVhbHMoKChBZGRKYXJGaWxlVG9JbmRleCkgbykucmVzb3VyY2UpOworCQkJaWYgKHRoaXMuaW5kZXhQYXRoICE9IG51bGwpCisJCQkJcmV0dXJuIHRoaXMuaW5kZXhQYXRoLmVxdWFscygoKEFkZEphckZpbGVUb0luZGV4KSBvKS5pbmRleFBhdGgpOworCQl9CisJCXJldHVybiBmYWxzZTsKIAl9Ci0JcmV0dXJuIGZhbHNlOwotfQotcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmhhc2hDb2RlKCk7CisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkKKwkJCXJldHVybiB0aGlzLnJlc291cmNlLmhhc2hDb2RlKCk7CisJCWlmICh0aGlzLmluZGV4UGF0aCAhPSBudWxsKQorCQkJcmV0dXJuIHRoaXMuaW5kZXhQYXRoLmhhc2hDb2RlKCk7CisJCXJldHVybiAtMTsKIAl9Ci0JaWYgKHRoaXMucGF0aCAhPSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLnBhdGguaGFzaENvZGUoKTsKLQl9Ci0JcmV0dXJuIC0xOwotfQkKIAlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOworCisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gdHJ1ZTsKKwogCQl0cnkgewotCQkJSVBhdGggaW5kZXhlZFBhdGggPSB0aGlzLnBhdGg7Ci0JCQkvLyBpZiBpbmRleCBhbHJlYWR5IGNhY2hlZCwgdGhlbiBkbyBub3QgcGVyZm9ybSBhbnkgY2hlY2sKLQkJCUlJbmRleCBpbmRleCA9IChJSW5kZXgpIG1hbmFnZXIuZ2V0SW5kZXgoaW5kZXhlZFBhdGgsIGZhbHNlIC8qZG8gbm90IHJldXNlIGluZGV4IGZpbGUqLywgZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7CisJCQkvLyBpZiBpbmRleCBpcyBhbHJlYWR5IGNhY2hlZCwgdGhlbiBkbyBub3QgcGVyZm9ybSBhbnkgY2hlY2sKKwkJCS8vIE1VU1QgcmVzZXQgdGhlIEluZGV4TWFuYWdlciBpZiBhIGphciBmaWxlIGlzIGNoYW5nZWQKKwkJCUlJbmRleCBpbmRleCA9IChJSW5kZXgpIG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleFBhdGgsIGZhbHNlLCAvKmRvIG5vdCByZXVzZSBpbmRleCBmaWxlKi8gZmFsc2UgLypkbyBub3QgY3JlYXRlIGlmIG5vbmUqLyk7CiAJCQlpZiAoaW5kZXggIT0gbnVsbCkgewotCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIAotCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IG5vIGluZGV4aW5nIHJlcXVpcmVkIChpbmRleCBhbHJlYWR5IGV4aXN0cykgZm9yICIgKyB0aGlzLnBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIENPTVBMRVRFOworCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpCisJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gbm8gaW5kZXhpbmcgcmVxdWlyZWQgKGluZGV4IGFscmVhZHkgZXhpc3RzKSBmb3IgIiArIHRoaXMuaW5kZXhQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiB0cnVlOwogCQkJfQogCi0JCQlpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgoaW5kZXhlZFBhdGgsIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKKwkJCWluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4UGF0aCwgdHJ1ZSwgLypyZXVzZSBpbmRleCBmaWxlKi8gdHJ1ZSAvKmNyZWF0ZSBpZiBub25lKi8pOwogCQkJaWYgKGluZGV4ID09IG51bGwpIHsKLQkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSAKLQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCBmb3IgIiArIHRoaXMucGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gQ09NUExFVEU7CisJCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCBmb3IgIiArIHRoaXMuaW5kZXhQYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiB0cnVlOwogCQkJfQogCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKIAkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSAKLQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBpbmRleCBmb3IgIiArIHRoaXMucGF0aCArICIganVzdCBnb3QgZGVsZXRlZCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBDT01QTEVURTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKwkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKQorCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGluZGV4IGZvciAiICsgdGhpcy5pbmRleFBhdGggKyAiIGp1c3QgZ290IGRlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQlyZXR1cm4gdHJ1ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKIAkJCX0KIAkJCVppcEZpbGUgemlwID0gbnVsbDsKIAkJCXRyeSB7CkBAIC0xMDAsMTQgKzk1LDE3IEBACiAJCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCiAJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKIAkJCQkJSVBhdGggbG9jYXRpb24gPSB0aGlzLnJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbQWRkSmFyRmlsZVRvSW5kZXguZXhlY3V0ZSgpXSBDcmVhdGluZyBaaXBGaWxlIG9uICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAogCQkJCQl6aXAgPSBuZXcgWmlwRmlsZShsb2NhdGlvbi50b0ZpbGUoKSk7CiAJCQkJCXppcEZpbGVQYXRoID0gKFBhdGgpIHRoaXMucmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKIAkJCQkJLy8gYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlCiAJCQkJfSBlbHNlIHsKLQkJCQkJemlwID0gbmV3IFppcEZpbGUodGhpcy5wYXRoLnRvRmlsZSgpKTsKLQkJCQkJemlwRmlsZVBhdGggPSAoUGF0aCkgdGhpcy5wYXRoOworCQkJCQlpZiAoSmF2YU1vZGVsTWFuYWdlci5aSVBfQUNDRVNTX1ZFUkJPU0UpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIpIFtBZGRKYXJGaWxlVG9JbmRleC5leGVjdXRlKCldIENyZWF0aW5nIFppcEZpbGUgb24gIiArIHRoaXMuaW5kZXhQYXRoKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCisJCQkJCXppcCA9IG5ldyBaaXBGaWxlKHRoaXMuaW5kZXhQYXRoLnRvRmlsZSgpKTsKKwkJCQkJemlwRmlsZVBhdGggPSAoUGF0aCkgdGhpcy5pbmRleFBhdGg7CiAJCQkJCS8vIHBhdGggaXMgYWxyZWFkeSBjYW5vbmljYWwgc2luY2UgY29taW5nIGZyb20gYSBsaWJyYXJ5IGNsYXNzcGF0aCBlbnRyeQogCQkJCX0KIApAQCAtMTE1LDExMCArMTEzLDk1IEBACiAJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gaW5kZXhpbmcgIiArIHppcC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJbG9uZyBpbml0aWFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0JCQkJZmluYWwgSGFzaFNldCBpbmRleGVkRmlsZU5hbWVzID0gbmV3IEhhc2hTZXQoMTAwKTsKIAkJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdHMgPT0gbnVsbCA/IDAgOiByZXN1bHRzLmxlbmd0aDsKLQkJCQlpZiAocmVzdWx0TGVuZ3RoICE9IDApIHsKKwkJCQlpbnQgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOworCQkJCWlmIChtYXggIT0gMCkgewogCQkJCQkvKiBjaGVjayBpbnRlZ3JpdHkgb2YgdGhlIGV4aXN0aW5nIGluZGV4IGZpbGUKIAkJCQkJICogaWYgdGhlIGxlbmd0aCBpcyBlcXVhbCB0byAwLCB3ZSB3YW50IHRvIGluZGV4IHRoZSB3aG9sZSBqYXIgYWdhaW4KIAkJCQkJICogSWYgbm90LCB0aGVuIHdlIHdhbnQgdG8gY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBtaXNzaW5nIGVudHJ5LCBpZgotCQkJCQkgKiBvbmUgZW50cnkgaXMgbWlzc2luZyB0aGVuIHdlIAorCQkJCQkgKiBvbmUgZW50cnkgaXMgbWlzc2luZyB0aGVuIHdlIHJlY3JlYXRlIHRoZSBpbmRleAogCQkJCQkgKi8KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzdWx0c1tpXS5nZXRQYXRoKCk7Ci0JCQkJCQlpbmRleGVkRmlsZU5hbWVzLmFkZChmaWxlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBuZWVkVG9SZWluZGV4ID0gZmFsc2U7CisJCQkJCVN0cmluZyBFWElTVFMgPSAiT0siOyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCisJCQkJCVNpbXBsZUxvb2t1cFRhYmxlIGluZGV4ZWRGaWxlTmFtZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUobWF4ID09IDAgPyAzMyA6IG1heCArIDExKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykKKwkJCQkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KHJlc3VsdHNbaV0uZ2V0UGF0aCgpLCBERUxFVEVEKTsKIAkJCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gemlwLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKIAkJCQkJCS8vIGl0ZXJhdGUgZWFjaCBlbnRyeSB0byBpbmRleCBpdAogCQkJCQkJWmlwRW50cnkgemUgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKIAkJCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZSh6ZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJSmFyRmlsZUVudHJ5RG9jdW1lbnQgZW50cnlEb2N1bWVudCA9Ci0JCQkJCQkJCW5ldyBKYXJGaWxlRW50cnlEb2N1bWVudCh6ZSwgbnVsbCwgemlwRmlsZVBhdGgpOwotCQkJCQkJCWlmICghaW5kZXhlZEZpbGVOYW1lcy5yZW1vdmUoZW50cnlEb2N1bWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCW5lZWRUb1JlaW5kZXggPSB0cnVlOworCQkJCQkJCUphckZpbGVFbnRyeURvY3VtZW50IGVudHJ5RG9jdW1lbnQgPSBuZXcgSmFyRmlsZUVudHJ5RG9jdW1lbnQoemUsIG51bGwsIHppcEZpbGVQYXRoKTsKKwkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChlbnRyeURvY3VtZW50LmdldE5hbWUoKSwgRVhJU1RTKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlib29sZWFuIG5lZWRUb1JlaW5kZXggPSBpbmRleGVkRmlsZU5hbWVzLmVsZW1lbnRTaXplICE9IG1heDsgLy8gYSBuZXcgZmlsZSB3YXMgYWRkZWQKKwkJCQkJaWYgKCFuZWVkVG9SZWluZGV4KSB7CisJCQkJCQlPYmplY3RbXSB2YWx1ZVRhYmxlID0gaW5kZXhlZEZpbGVOYW1lcy52YWx1ZVRhYmxlOworCQkJCQkJZm9yIChpbnQgaSA9IDAsIGwgPSB2YWx1ZVRhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCQkJCWlmICh2YWx1ZVRhYmxlW2ldID09IERFTEVURUQpIHsKKwkJCQkJCQkJbmVlZFRvUmVpbmRleCA9IHRydWU7IC8vIGEgZmlsZSB3YXMgZGVsZXRlZCBzbyByZS1pbmRleAogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFuZWVkVG9SZWluZGV4ICYmIGluZGV4ZWRGaWxlTmFtZXMuc2l6ZSgpID09IDApIHsKLQkJCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpCi0JCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKAotCQkJCQkJCQkiLT4gbm8gaW5kZXhpbmcgcmVxdWlyZWQgKGluZGV4IGlzIGNvbnNpc3RlbnQgd2l0aCBsaWJyYXJ5KSBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJCQlpZiAoIW5lZWRUb1JlaW5kZXgpIHsKKwkJCQkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKQorCQkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IG5vIGluZGV4aW5nIHJlcXVpcmVkIChpbmRleCBpcyBjb25zaXN0ZW50IHdpdGggbGlicmFyeSkgZm9yICIgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQkrIHppcC5nZXROYW1lKCkgKyAiICgiIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBpbml0aWFsVGltZSkgKyAibXMpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBDT01QTEVURTsKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAogCQkJCS8qCiAJCQkJICogSW5kZXggdGhlIGphciBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgcmVpbmRleCB0aGUgamFyIGluIGNhc2UgdGhlIHByZXZpb3VzIGluZGV4IGZpbGUgaGFzIGJlZW4gY29ycnVwdGVkCiAJCQkJICovCi0JCQkJaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJCQkJLy8gaW5kZXggYWxyZWFkeSBleGlzdGVkOiByZWNyZWF0ZSBpdCBzbyB0aGF0IHdlIGZvcmdldCBhYm91dCBwcmV2aW91cyBlbnRyaWVzCi0JCQkJCWluZGV4ID0gbWFuYWdlci5yZWNyZWF0ZUluZGV4KGluZGV4ZWRQYXRoKTsKLQkJCQl9CisJCQkJLy8gaW5kZXggYWxyZWFkeSBleGlzdGVkOiByZWNyZWF0ZSBpdCBzbyB0aGF0IHdlIGZvcmdldCBhYm91dCBwcmV2aW91cyBlbnRyaWVzCisJCQkJaW5kZXggPSBtYW5hZ2VyLnJlY3JlYXRlSW5kZXgodGhpcy5pbmRleFBhdGgpOwogCQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CiAJCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7Ci0JCQkJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7Ci0JCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKAotCQkJCQkJCQkiLT4gaW5kZXhpbmcgb2YgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgemlwLmdldE5hbWUoKSAKLQkJCQkJCQkJKyAiIGhhcyBiZWVuIGNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gRkFJTEVEOworCQkJCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkKKwkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGluZGV4aW5nIG9mICIgKyB6aXAuZ2V0TmFtZSgpICsgIiBoYXMgYmVlbiBjYW5jZWxsZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJLy8gaXRlcmF0ZSBlYWNoIGVudHJ5IHRvIGluZGV4IGl0CiAJCQkJCVppcEVudHJ5IHplID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CiAJCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZSh6ZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMgPQotCQkJCQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0WmlwRW50cnlCeXRlQ29udGVudCh6ZSwgemlwKTsKKwkJCQkJCWJ5dGVbXSBjbGFzc0ZpbGVCeXRlcyA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0WmlwRW50cnlCeXRlQ29udGVudCh6ZSwgemlwKTsKIAkJCQkJCS8vIEFkZCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB0aGUgaW5kZXgKIAkJCQkJCWluZGV4LmFkZCgKIAkJCQkJCQluZXcgSmFyRmlsZUVudHJ5RG9jdW1lbnQoemUsIGNsYXNzRmlsZUJ5dGVzLCB6aXBGaWxlUGF0aCksCiAJCQkJCQkJbmV3IEJpbmFyeUluZGV4ZXIodHJ1ZSkpOwogCQkJCQl9CiAJCQkJfQorCQkJCXRoaXMubWFuYWdlci5zYXZlSW5kZXgoaW5kZXgpOwogCQkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpCi0JCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgKLQkJCQkJCSItPiBkb25lIGluZGV4aW5nIG9mICIgLy8kTk9OLU5MUy0xJAorCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGRvbmUgaW5kZXhpbmcgb2YgIiAvLyROT04tTkxTLTEkCiAJCQkJCQkrIHppcC5nZXROYW1lKCkgKyAiICgiIC8vJE5PTi1OTFMtMSQKIAkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaW5pdGlhbFRpbWUpICsgIm1zKSIpOyAvLyROT04tTkxTLTEkCiAJCQl9IGZpbmFsbHkgewotCQkJCWlmICh6aXAgIT0gbnVsbCkKKwkJCQlpZiAoemlwICE9IG51bGwpIHsKKwkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbQWRkSmFyRmlsZVRvSW5kZXguZXhlY3V0ZSgpXSBDbG9zaW5nIFppcEZpbGUgIiArIHppcCk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAogCQkJCQl6aXAuY2xvc2UoKTsKKwkJCQl9CiAJCQkJbW9uaXRvci5leGl0V3JpdGUoKTsgLy8gZnJlZSB3cml0ZSBsb2NrCiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKLQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5wYXRoICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5pbmRleFBhdGggKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQl9Ci0JCQltYW5hZ2VyLnJlbW92ZUluZGV4KHRoaXMucGF0aCk7Ci0JCQlyZXR1cm4gRkFJTEVEOworCQkJbWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmluZGV4UGF0aCk7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJcmV0dXJuIENPTVBMRVRFOworCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMC8xMC8wMCAxOjI3OjE4IFBNKQotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIHVwZGF0ZWRJbmRleFN0YXRlKCkgeworCQlyZXR1cm4gSW5kZXhNYW5hZ2VyLlJFQlVJTERJTkdfU1RBVEU7CisJfQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0b1N0cmluZyA9PSBudWxsKSB7Ci0JCQl0b1N0cmluZyA9ICJpbmRleGluZyAiICsgdGhpcy5wYXRoLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9TdHJpbmc7CisJCXJldHVybiAiaW5kZXhpbmcgIiArIHRoaXMuaW5kZXhQYXRoLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0KLQlwdWJsaWMgQWRkSmFyRmlsZVRvSW5kZXgoCi0JCUlQYXRoIHBhdGgsCi0JCUluZGV4TWFuYWdlciBtYW5hZ2VyLAotCQlTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJLy8gZXh0ZXJuYWwgSkFSIHNjZW5hcmlvIC0gbm8gcmVzb3VyY2UKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0JpbmFyeUluZGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhCmluZGV4IGIzMjQ1ZWEuLmU2ZDhjZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvQmluYXJ5SW5kZXhlci5qYXZhCkBAIC0xLDIzICsxLDIzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlU3RydWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuRmllbGRJbmZvOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5NZXRob2RJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OwogCiBwdWJsaWMgY2xhc3MgQmluYXJ5SW5kZXhlciBleHRlbmRzIEFic3RyYWN0SW5kZXhlciB7CkBAIC00MTMsOCArNDEzLDE2IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDbGFzc0ZpbGVTdHJ1Y3QuQ2xhc3NUYWcgOgorCQkJCS8vIGFkZCBhIHR5cGUgcmVmZXJlbmNlIAogCQkJCW5hbWUgPSByZXBsYWNlKCcvJywgJy4nLCBleHRyYWN0Q2xhc3NSZWZlcmVuY2UoY29uc3RhbnRQb29sT2Zmc2V0cywgcmVhZGVyLCBpKSk7IC8vIHNvIHRoYXQgaXQgbG9va3MgbGlrZSBqYXZhLmxhbmcuU3RyaW5nCiAJCQkJYWRkVHlwZVJlZmVyZW5jZShuYW1lKTsKKwkJCQkKKwkJCQkvLyBhbHNvIGFkZCBhIHNpbXBsZSByZWZlcmVuY2Ugb24gZWFjaCBzZWdtZW50IG9mIHRoZSBxdWFsaWZpY2F0aW9uIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NDEpCisJCQkJY2hhcltdW10gcXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIG5hbWUpOworCQkJCWZvciAoaW50IGogPSAwLCBsZW5ndGggPSBxdWFsaWZpY2F0aW9uLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCWFkZE5hbWVSZWZlcmVuY2UocXVhbGlmaWNhdGlvbltqXSk7CisJCQkJfQorCQkJCWJyZWFrOwogCQl9CiAJfQogfQpAQCAtNDQ4LDcgKzQ1Niw3IEBACiAJCWNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZSA9IG51bGw7CiAJCWlmIChyZWFkZXIuaXNOZXN0ZWRUeXBlKCkpIHsKIAkJCWlmIChyZWFkZXIuaXNBbm9ueW1vdXMoKSkgewotCQkJCW5hbWUgPSBOT19DSEFSOworCQkJCW5hbWUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQl9IGVsc2UgewogCQkJCW5hbWUgPSByZWFkZXIuZ2V0SW5uZXJTb3VyY2VOYW1lKCk7CiAJCQl9CkBAIC01NDYsNCArNTU0LDQgQEAKICAqIHNldEZpbGVUeXBlcyBtZXRob2QgY29tbWVudC4KICAqLwogcHVibGljIHZvaWQgc2V0RmlsZVR5cGVzKFN0cmluZ1tdIGZpbGVUeXBlcykge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JSW5kZXhDb25zdGFudHMuamF2YQppbmRleCBjMTViOGU5Li44MWYxZjlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0lJbmRleENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSUluZGV4Q29uc3RhbnRzLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUluZGV4Q29uc3RhbnRzIHsKQEAgLTM3LDggKzM3LDYgQEAKIAogCWNoYXJbXSBPTkVfU1RBUiA9IG5ldyBjaGFyW10geycqJ307CiAJY2hhcltdW10gT05FX1NUQVJfQ0hBUiA9IG5ldyBjaGFyW11bXSB7T05FX1NUQVJ9OwotCWNoYXJbXSBOT19DSEFSID0gbmV3IGNoYXJbMF07Ci0JY2hhcltdW10gTk9fQ0hBUl9DSEFSID0gbmV3IGNoYXJbMF1bXTsKIAogCS8vIHVzZWQgYXMgc3BlY2lhbCBtYXJrZXIgZm9yIGVuY2xvc2luZyB0eXBlIG5hbWUgb2YgbG9jYWwgYW5kIGFub255bW91cyBjbGFzc2VzCiAJY2hhcltdIE9ORV9aRVJPID0gbmV3IGNoYXJbXSB7JzAnfTsgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QWxsUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEFsbFByb2plY3QuamF2YQppbmRleCBjNmYxNTExLi5hOWRiN2Y3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QWxsUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhBbGxQcm9qZWN0LmphdmEKQEAgLTEsMjQgKzEsMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CkBAIC0yNiwxNTIgKzI1LDE5MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JSW5kZXg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSVF1ZXJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSUZpbGVEb2N1bWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnV0aWwuU2ltcGxlTG9va3VwVGFibGU7CiAKLXB1YmxpYyBjbGFzcyBJbmRleEFsbFByb2plY3QgZXh0ZW5kcyBJbmRleFJlcXVlc3QgaW1wbGVtZW50cyBJUmVzb3VyY2VWaXNpdG9yIHsKK3B1YmxpYyBjbGFzcyBJbmRleEFsbFByb2plY3QgZXh0ZW5kcyBJbmRleFJlcXVlc3QgewogCUlQcm9qZWN0IHByb2plY3Q7Ci0JSW5kZXhNYW5hZ2VyIG1hbmFnZXI7Ci0JSGFzaHRhYmxlIGluZGV4ZWRGaWxlTmFtZXM7Ci0JZmluYWwgU3RyaW5nIE9LID0gIk9LIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCi0JbG9uZyBpbmRleExhc3RNb2RpZmllZDsKKwogCXB1YmxpYyBJbmRleEFsbFByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSW5kZXhNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIocHJvamVjdC5nZXRGdWxsUGF0aCgpLCBtYW5hZ2VyKTsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKIAl9Ci0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKFN0cmluZyBqb2JGYW1pbHkpIHsKLQkJcmV0dXJuIGpvYkZhbWlseS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpOworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAobyBpbnN0YW5jZW9mIEluZGV4QWxsUHJvamVjdCkKKwkJCXJldHVybiB0aGlzLnByb2plY3QuZXF1YWxzKCgoSW5kZXhBbGxQcm9qZWN0KSBvKS5wcm9qZWN0KTsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCWlmICghKG8gaW5zdGFuY2VvZiBJbmRleEFsbFByb2plY3QpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRoaXMucHJvamVjdC5lcXVhbHMoKChJbmRleEFsbFByb2plY3QpbykucHJvamVjdCk7Ci19Ci1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCXJldHVybiB0aGlzLnByb2plY3QuaGFzaENvZGUoKTsKLX0JCQogCS8qKgogCSAqIEVuc3VyZSBjb25zaXN0ZW5jeSBvZiBhIHByb2plY3QgaW5kZXguIE5lZWQgdG8gd2FsayBhbGwgbmVzdGVkIHJlc291cmNlcywKIAkgKiBhbmQgZGlzY292ZXIgcmVzb3VyY2VzIHdoaWNoIGhhdmUgZWl0aGVyIGJlZW4gY2hhbmdlZCwgYWRkZWQgb3IgZGVsZXRlZAogCSAqIHNpbmNlIHRoZSBpbmRleCB3YXMgcHJvZHVjZWQuCiAJICovCiAJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkKLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBDT01QTEVURTsKIAotCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpCi0JCQlyZXR1cm4gQ09NUExFVEU7IC8vIG5vdGhpbmcgdG8gZG8KKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiB0cnVlOworCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvCiAKLQkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleChwcm9qZWN0LmdldEZ1bGxQYXRoKCksIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKLQkJaWYgKGluZGV4ID09IG51bGwpCi0JCQlyZXR1cm4gQ09NUExFVEU7Ci0JCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJCUlJbmRleCBpbmRleCA9IHRoaXMubWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4UGF0aCwgdHJ1ZSwgLypyZXVzZSBpbmRleCBmaWxlKi8gdHJ1ZSAvKmNyZWF0ZSBpZiBub25lKi8pOworCQlpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCVJlYWRXcml0ZU1vbml0b3IgbW9uaXRvciA9IHRoaXMubWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisKIAkJdHJ5IHsKIAkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHJlYWQKKwkJCXNhdmVJZk5lY2Vzc2FyeShpbmRleCwgbW9uaXRvcik7CiAKLQkJCS8qIGlmIGluZGV4IGhhcyBjaGFuZ2VkLCBjb21taXQgdGhlc2UgYmVmb3JlIHF1ZXJ5aW5nICovCi0JCQlpZiAoaW5kZXguaGFzQ2hhbmdlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jawotCQkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKLQkJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKQotCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXguc2F2ZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIEZBSUxFRDsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmV4aXRXcml0ZUVudGVyUmVhZCgpOyAvLyBmaW5pc2hlZCB3cml0aW5nIGFuZCByZWFjcXVpcmUgcmVhZCBwZXJtaXNzaW9uCi0JCQkJfQotCQkJfQotCQkJdGhpcy5pbmRleExhc3RNb2RpZmllZCA9IGluZGV4LmdldEluZGV4RmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCi0JCQl0aGlzLmluZGV4ZWRGaWxlTmFtZXMgPSBuZXcgSGFzaHRhYmxlKDEwMCk7CiAJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXMoIiIpOyAvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXN1bHRzW2ldLmdldFBhdGgoKTsKLQkJCQl0aGlzLmluZGV4ZWRGaWxlTmFtZXMucHV0KGZpbGVOYW1lLCBERUxFVEVEKTsKLQkJCX0KLQkJCUphdmFDb3JlIGphdmFDb3JlID0gSmF2YUNvcmUuZ2V0SmF2YUNvcmUoKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOyAvL29ubHkgaW50ZXJlc3RlZCBpbiBzb3VyY2UgZm9sZGVycworCQkJaW50IG1heCA9IHJlc3VsdHMgPT0gbnVsbCA/IDAgOiByZXN1bHRzLmxlbmd0aDsKKwkJCWZpbmFsIFNpbXBsZUxvb2t1cFRhYmxlIGluZGV4ZWRGaWxlTmFtZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUobWF4ID09IDAgPyAzMyA6IG1heCArIDExKTsKKwkJCWZpbmFsIFN0cmluZyBPSyA9ICJPSyI7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKQorCQkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KHJlc3VsdHNbaV0uZ2V0UGF0aCgpLCBERUxFVEVEKTsKKwkJCWZpbmFsIGxvbmcgaW5kZXhMYXN0TW9kaWZpZWQgPSBtYXggPT0gMCA/IDBMIDogaW5kZXguZ2V0SW5kZXhGaWxlKCkubGFzdE1vZGlmaWVkKCk7CisKKwkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOworCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwogCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHRoaXMucHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gRkFJTEVEOwotCQkJCQorCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gZmFsc2U7CisKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCS8vIEluZGV4IG9ubHkgdGhlIHByb2plY3QncyBzb3VyY2UgZm9sZGVycy4KLQkJCQkvLyBJbmRleGluZyBvZiBsaWJyYXJpZXMgaXMgZG9uZSBpbiBhIHNlcGFyYXRlIGpvYgotCQkJCWlmICgoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpKSB7Ci0JCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJSVJlc291cmNlIHNvdXJjZUZvbGRlciA9IHJvb3QuZmluZE1lbWJlcihlbnRyeVBhdGgpOworCQkJCWlmICgoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpKSB7IC8vIEluZGV4IG9ubHkgc291cmNlIGZvbGRlcnMuIExpYnJhcmllcyBhcmUgZG9uZSBhcyBhIHNlcGFyYXRlIGpvYgorCQkJCQlJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7CiAJCQkJCWlmIChzb3VyY2VGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJc291cmNlRm9sZGVyLmFjY2VwdCh0aGlzKTsKKwkJCQkJCQorCQkJCQkJLy8gY29sbGVjdCBvdXRwdXQgbG9jYXRpb25zIGlmIHNvdXJjZSBpcyBwcm9qZWN0IChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNDEpCisJCQkJCQlmaW5hbCBIYXNoU2V0IG91dHB1dHMgPSBuZXcgSGFzaFNldCgpOworCQkJCQkJaWYgKHNvdXJjZUZvbGRlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKKwkJCQkJCQlvdXRwdXRzLmFkZChqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKwkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJCQkJCUlQYXRoIG91dHB1dCA9IGVudHJpZXNbal0uZ2V0T3V0cHV0TG9jYXRpb24oKTsKKwkJCQkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7CisJCQkJCQkJCQlvdXRwdXRzLmFkZChvdXRwdXQpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZmluYWwgYm9vbGVhbiBoYXNPdXRwdXRzID0gIW91dHB1dHMuaXNFbXB0eSgpOworCQkJCQkJCisJCQkJCQlmaW5hbCBjaGFyW11bXSBwYXR0ZXJucyA9ICgoQ2xhc3NwYXRoRW50cnkpIGVudHJ5KS5mdWxsRXhjbHVzaW9uUGF0dGVybkNoYXJzKCk7CisJCQkJCQlpZiAobWF4ID09IDApIHsKKwkJCQkJCQlzb3VyY2VGb2xkZXIuYWNjZXB0KAorCQkJCQkJCQluZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHsKKwkJCQkJCQkJCQlpZiAoaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CisJCQkJCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJCQkJCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOworCQkJCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgKHBhdHRlcm5zID09IG51bGwgfHwgIVV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgcGF0dGVybnMpKSkgeworCQkJCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IG5ldyBJRmlsZURvY3VtZW50KChJRmlsZSkgcmVzb3VyY2UpLmdldE5hbWUoKTsKKwkJCQkJCQkJCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5wdXQobmFtZSwgcmVzb3VyY2UpOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKKwkJCQkJCQkJCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgcGF0dGVybnMpKQorCQkJCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQkJCWlmIChoYXNPdXRwdXRzICYmIG91dHB1dHMuY29udGFpbnMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkpKSB7CisJCQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSwKKwkJCQkJCQkJSVJlc291cmNlLk5PTkUKKwkJCQkJCQkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzb3VyY2VGb2xkZXIuYWNjZXB0KAorCQkJCQkJCQluZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQkJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHsKKwkJCQkJCQkJCQlpZiAoaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQlzd2l0Y2gocHJveHkuZ2V0VHlwZSgpKSB7CisJCQkJCQkJCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQkJCQkJCQkJaWYgKFV0aWwuaXNKYXZhRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOworCQkJCQkJCQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJCQkJCQkJCQkJCWlmIChwYXRoICE9IG51bGwgJiYgKHBhdHRlcm5zID09IG51bGwgfHwgIVV0aWwuaXNFeGNsdWRlZChyZXNvdXJjZSwgcGF0dGVybnMpKSkgeworCQkJCQkJCQkJCQkJCQlTdHJpbmcgbmFtZSA9IG5ldyBJRmlsZURvY3VtZW50KChJRmlsZSkgcmVzb3VyY2UpLmdldE5hbWUoKTsKKwkJCQkJCQkJCQkJCQkJaW5kZXhlZEZpbGVOYW1lcy5wdXQobmFtZSwKKwkJCQkJCQkJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMuZ2V0KG5hbWUpID09IG51bGwgfHwgaW5kZXhMYXN0TW9kaWZpZWQgPCBwYXRoLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpCisJCQkJCQkJCQkJCQkJCQkJPyAoT2JqZWN0KSByZXNvdXJjZQorCQkJCQkJCQkJCQkJCQkJCTogKE9iamVjdCkgT0spOworCQkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKKwkJCQkJCQkJCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsICYmIFV0aWwuaXNFeGNsdWRlZChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgcGF0dGVybnMpKQorCQkJCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCQkJCQkJCWlmIChoYXNPdXRwdXRzICYmIG91dHB1dHMuY29udGFpbnMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkpKSB7CisJCQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSwKKwkJCQkJCQkJSVJlc291cmNlLk5PTkUKKwkJCQkJCQkpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJCi0JCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGluZGV4ZWRGaWxlTmFtZXMua2V5cygpOwotCQkJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBGQUlMRUQ7CiAKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gaW5kZXhlZEZpbGVOYW1lcy5nZXQobmFtZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJbWFuYWdlci5hZGRTb3VyY2UoKElGaWxlKSB2YWx1ZSwgdGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgPT0gREVMRVRFRCkgewotCQkJCQltYW5hZ2VyLnJlbW92ZShuYW1lLCB0aGlzLnByb2plY3QuZ2V0RnVsbFBhdGgoKSk7CisJCQlPYmplY3RbXSBuYW1lcyA9IGluZGV4ZWRGaWxlTmFtZXMua2V5VGFibGU7CisJCQlPYmplY3RbXSB2YWx1ZXMgPSBpbmRleGVkRmlsZU5hbWVzLnZhbHVlVGFibGU7CisJCQlib29sZWFuIHNob3VsZFNhdmUgPSBmYWxzZTsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXNbaV07CisJCQkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJCQlpZiAodGhpcy5pc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOworCisJCQkJCU9iamVjdCB2YWx1ZSA9IHZhbHVlc1tpXTsKKwkJCQkJaWYgKHZhbHVlICE9IE9LKSB7CisJCQkJCQlzaG91bGRTYXZlID0gdHJ1ZTsKKwkJCQkJCWlmICh2YWx1ZSA9PSBERUxFVEVEKQorCQkJCQkJCXRoaXMubWFuYWdlci5yZW1vdmUobmFtZSwgdGhpcy5pbmRleFBhdGgpOworCQkJCQkJZWxzZQorCQkJCQkJCXRoaXMubWFuYWdlci5hZGRTb3VyY2UoKElGaWxlKSB2YWx1ZSwgdGhpcy5pbmRleFBhdGgpOworCQkJCQl9CiAJCQkJfQogCQkJfQorCisJCQkvLyByZXF1ZXN0IHRvIHNhdmUgaW5kZXggd2hlbiBhbGwgY3VzIGhhdmUgYmVlbiBpbmRleGVkCisJCQlpZiAoc2hvdWxkU2F2ZSkKKwkJCQl0aGlzLm1hbmFnZXIucmVxdWVzdChuZXcgU2F2ZUluZGV4KHRoaXMuaW5kZXhQYXRoLCB0aGlzLm1hbmFnZXIpKTsKKwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKIAkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5wcm9qZWN0ICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJfQotCQkJbWFuYWdlci5yZW1vdmVJbmRleChwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQkJcmV0dXJuIEZBSUxFRDsKKwkJCXRoaXMubWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmluZGV4UGF0aCk7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCWlmIChKb2JNYW5hZ2VyLlZFUkJPU0UpIHsKIAkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGZhaWxlZCB0byBpbmRleCAiICsgdGhpcy5wcm9qZWN0ICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJfQotCQkJbWFuYWdlci5yZW1vdmVJbmRleChwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQkJcmV0dXJuIEZBSUxFRDsKKwkJCXRoaXMubWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmluZGV4UGF0aCk7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZmluYWxseSB7CiAJCQltb25pdG9yLmV4aXRSZWFkKCk7IC8vIGZyZWUgcmVhZCBsb2NrCiAJCX0KLQkJcmV0dXJuIENPTVBMRVRFOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gImluZGV4aW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0RnVsbFBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoImphdmEiLmVxdWFsc0lnbm9yZUNhc2UoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQlGaWxlIHJlc291cmNlRmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbmV3IElGaWxlRG9jdW1lbnQoKElGaWxlKSByZXNvdXJjZSkuZ2V0TmFtZSgpOwotCQkJCQlpZiAodGhpcy5pbmRleGVkRmlsZU5hbWVzLmdldChuYW1lKSA9PSBudWxsKSB7Ci0JCQkJCQl0aGlzLmluZGV4ZWRGaWxlTmFtZXMucHV0KG5hbWUsIHJlc291cmNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMuaW5kZXhlZEZpbGVOYW1lcy5wdXQoCi0JCQkJCQkJbmFtZSwKLQkJCQkJCQlyZXNvdXJjZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0aGlzLmluZGV4TGFzdE1vZGlmaWVkCi0JCQkJCQkJCT8gKE9iamVjdCkgcmVzb3VyY2UKLQkJCQkJCQkJOiAoT2JqZWN0KSBPSyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KIAkJcmV0dXJuIHRydWU7CiAJfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gdGhpcy5wcm9qZWN0Lmhhc2hDb2RlKCk7CisJfQorCXByb3RlY3RlZCBJbnRlZ2VyIHVwZGF0ZWRJbmRleFN0YXRlKCkgeworCQlyZXR1cm4gSW5kZXhNYW5hZ2VyLlJFQlVJTERJTkdfU1RBVEU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiaW5kZXhpbmcgcHJvamVjdCAiICsgdGhpcy5wcm9qZWN0LmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QmluYXJ5Rm9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4QmluYXJ5Rm9sZGVyLmphdmEKaW5kZXggNjc3MzY0OS4uNjU4NWZiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleEJpbmFyeUZvbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhCaW5hcnlGb2xkZXIuamF2YQpAQCAtMSw1NSArMSw0NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklRdWVyeVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLklGaWxlRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogCiBwdWJsaWMgY2xhc3MgSW5kZXhCaW5hcnlGb2xkZXIgZXh0ZW5kcyBJbmRleFJlcXVlc3QgewogCUlGb2xkZXIgZm9sZGVyOwotCUluZGV4TWFuYWdlciBtYW5hZ2VyOwotCUlQcm9qZWN0IHByb2plY3Q7Ci0JcHVibGljIEluZGV4QmluYXJ5Rm9sZGVyKAotCQlJRm9sZGVyIGZvbGRlciwKLQkJSW5kZXhNYW5hZ2VyIG1hbmFnZXIsCi0JCUlQcm9qZWN0IHByb2plY3QpIHsKKworCXB1YmxpYyBJbmRleEJpbmFyeUZvbGRlcihJRm9sZGVyIGZvbGRlciwgSW5kZXhNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJc3VwZXIoZm9sZGVyLmdldEZ1bGxQYXRoKCksIG1hbmFnZXIpOwogCQl0aGlzLmZvbGRlciA9IGZvbGRlcjsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAl9Ci0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKFN0cmluZyBqb2JGYW1pbHkpIHsKLQkJcmV0dXJuIGpvYkZhbWlseS5lcXVhbHModGhpcy5wcm9qZWN0LmdldE5hbWUoKSk7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhCaW5hcnlGb2xkZXIpCisJCQlyZXR1cm4gdGhpcy5mb2xkZXIuZXF1YWxzKCgoSW5kZXhCaW5hcnlGb2xkZXIpIG8pLmZvbGRlcik7CisJCXJldHVybiBmYWxzZTsKIAl9Ci1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQlpZiAoIShvIGluc3RhbmNlb2YgSW5kZXhCaW5hcnlGb2xkZXIpKSByZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRoaXMuZm9sZGVyLmVxdWFscygoKEluZGV4QmluYXJ5Rm9sZGVyKW8pLmZvbGRlcik7Ci19Ci1wdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCXJldHVybiB0aGlzLmZvbGRlci5oYXNoQ29kZSgpOwotfQogCS8qKgogCSAqIEVuc3VyZSBjb25zaXN0ZW5jeSBvZiBhIGZvbGRlciBpbmRleC4gTmVlZCB0byB3YWxrIGFsbCBuZXN0ZWQgcmVzb3VyY2VzLAogCSAqIGFuZCBkaXNjb3ZlciByZXNvdXJjZXMgd2hpY2ggaGF2ZSBlaXRoZXIgYmVlbiBjaGFuZ2VkLCBhZGRlZCBvciBkZWxldGVkCkBAIC01NywxMDMgKzQ2LDExOSBAQAogCSAqLwogCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKIAotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOworCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIHRydWU7CisJCWlmICghdGhpcy5mb2xkZXIuaXNBY2Nlc3NpYmxlKCkpIHJldHVybiB0cnVlOyAvLyBub3RoaW5nIHRvIGRvCiAKLQkJaWYgKCF0aGlzLmZvbGRlci5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBDT01QTEVURTsgLy8gbm90aGluZyB0byBkbworCQlJSW5kZXggaW5kZXggPSB0aGlzLm1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleFBhdGgsIHRydWUsIC8qcmV1c2UgaW5kZXggZmlsZSovIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKKwkJaWYgKGluZGV4ID09IG51bGwpIHJldHVybiB0cnVlOworCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSB0aGlzLm1hbmFnZXIuZ2V0TW9uaXRvckZvcihpbmRleCk7CisJCWlmIChtb25pdG9yID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAogCi0JCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5mb2xkZXIuZ2V0RnVsbFBhdGgoKSwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLywgdHJ1ZSAvKmNyZWF0ZSBpZiBub25lKi8pOwotCQlpZiAoaW5kZXggPT0gbnVsbCkKLQkJCXJldHVybiBDT01QTEVURTsKLQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBDT01QTEVURTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKIAkJdHJ5IHsKIAkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHJlYWQKKwkJCXNhdmVJZk5lY2Vzc2FyeShpbmRleCwgbW9uaXRvcik7CiAKLQkJCS8qIGlmIGluZGV4IGhhcyBjaGFuZ2VkLCBjb21taXQgdGhlc2UgYmVmb3JlIHF1ZXJ5aW5nICovCi0JCQlpZiAoaW5kZXguaGFzQ2hhbmdlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jawotCQkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKLQkJCQkJaWYgKEluZGV4TWFuYWdlci5WRVJCT1NFKQotCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBtZXJnaW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXguc2F2ZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIEZBSUxFRDsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmV4aXRXcml0ZUVudGVyUmVhZCgpOyAvLyBmaW5pc2hlZCB3cml0aW5nIGFuZCByZWFjcXVpcmUgcmVhZCBwZXJtaXNzaW9uCi0JCQkJfQotCQkJfQorCQkJSVF1ZXJ5UmVzdWx0W10gcmVzdWx0cyA9IGluZGV4LnF1ZXJ5SW5Eb2N1bWVudE5hbWVzKCIiKTsgLy8gYWxsIGZpbGUgbmFtZXMgLy8kTk9OLU5MUy0xJAorCQkJaW50IG1heCA9IHJlc3VsdHMgPT0gbnVsbCA/IDAgOiByZXN1bHRzLmxlbmd0aDsKKwkJCWZpbmFsIFNpbXBsZUxvb2t1cFRhYmxlIGluZGV4ZWRGaWxlTmFtZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUobWF4ID09IDAgPyAzMyA6IG1heCArIDExKTsKIAkJCWZpbmFsIFN0cmluZyBPSyA9ICJPSyI7IC8vJE5PTi1OTFMtMSQKIAkJCWZpbmFsIFN0cmluZyBERUxFVEVEID0gIkRFTEVURUQiOyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBsb25nIGluZGV4TGFzdE1vZGlmaWVkID0gaW5kZXguZ2V0SW5kZXhGaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0KLQkJCWZpbmFsIEhhc2h0YWJsZSBpbmRleGVkRmlsZU5hbWVzID0gbmV3IEhhc2h0YWJsZSgxMDApOwotCQkJSVF1ZXJ5UmVzdWx0W10gcmVzdWx0cyA9IGluZGV4LnF1ZXJ5SW5Eb2N1bWVudE5hbWVzKCIiKTsvLyBhbGwgZmlsZSBuYW1lcyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXN1bHRzW2ldLmdldFBhdGgoKTsKLQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChmaWxlTmFtZSwgREVMRVRFRCk7Ci0JCQl9Ci0JCQl0aGlzLmZvbGRlci5hY2NlcHQobmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJCWlmIChpc0NhbmNlbGxlZCkgcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQkJaWYgKChleHRlbnNpb24gIT0gbnVsbCkKLQkJCQkJCQkmJiBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJCQlGaWxlIHJlc291cmNlRmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQkJCQkJCVN0cmluZyBuYW1lID0gbmV3IElGaWxlRG9jdW1lbnQoKElGaWxlKSByZXNvdXJjZSkuZ2V0TmFtZSgpOwotCQkJCQkJCQlpZiAoaW5kZXhlZEZpbGVOYW1lcy5nZXQobmFtZSkgPT0gbnVsbCkgeworCQkJaWYgKG1heCA9PSAwKSB7CisJCQkJdGhpcy5mb2xkZXIuYWNjZXB0KG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7CisJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB7CisJCQkJCQlpZiAoaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKKwkJCQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKwkJCQkJCQlpZiAoVXRpbC5pc0NsYXNzRmlsZU5hbWUocHJveHkuZ2V0TmFtZSgpKSkgeworCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgeworCQkJCQkJCQkJU3RyaW5nIG5hbWUgPSBuZXcgSUZpbGVEb2N1bWVudCgoSUZpbGUpIHJlc291cmNlKS5nZXROYW1lKCk7CiAJCQkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChuYW1lLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dCgKLQkJCQkJCQkJCQluYW1lLAotCQkJCQkJCQkJCXJlc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGluZGV4TGFzdE1vZGlmaWVkCi0JCQkJCQkJCQkJCT8gKE9iamVjdCkgcmVzb3VyY2UKLQkJCQkJCQkJCQkJOiAoT2JqZWN0KSBPSyk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9CisJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJcmV0dXJuIHRydWU7CiAJCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSk7Ci0JCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGluZGV4ZWRGaWxlTmFtZXMua2V5cygpOwotCQkJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybiBGQUlMRUQ7Ci0JCQkJCi0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IGluZGV4ZWRGaWxlTmFtZXMuZ2V0KG5hbWUpOwotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCW1hbmFnZXIuYWRkQmluYXJ5KChJRmlsZSkgdmFsdWUsIHRoaXMuZm9sZGVyLmdldEZ1bGxQYXRoKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgPT0gREVMRVRFRCkgewotCQkJCQltYW5hZ2VyLnJlbW92ZShuYW1lLCB0aGlzLnByb2plY3QuZ2V0RnVsbFBhdGgoKSk7CisJCQkJfSwgSVJlc291cmNlLk5PTkUpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKQorCQkJCQlpbmRleGVkRmlsZU5hbWVzLnB1dChyZXN1bHRzW2ldLmdldFBhdGgoKSwgREVMRVRFRCk7CisKKwkJCQlmaW5hbCBsb25nIGluZGV4TGFzdE1vZGlmaWVkID0gaW5kZXguZ2V0SW5kZXhGaWxlKCkubGFzdE1vZGlmaWVkKCk7CisJCQkJdGhpcy5mb2xkZXIuYWNjZXB0KAorCQkJCQluZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHsKKwkJCQkJCQlpZiAoaXNDYW5jZWxsZWQpIHJldHVybiBmYWxzZTsKKwkJCQkJCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQkJCWlmIChVdGlsLmlzQ2xhc3NGaWxlTmFtZShwcm94eS5nZXROYW1lKCkpKSB7CisJCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKKwkJCQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOworCQkJCQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJCQkJCQkJCVN0cmluZyBuYW1lID0gbmV3IElGaWxlRG9jdW1lbnQoKElGaWxlKSByZXNvdXJjZSkuZ2V0TmFtZSgpOworCQkJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMucHV0KG5hbWUsCisJCQkJCQkJCQkJCWluZGV4ZWRGaWxlTmFtZXMuZ2V0KG5hbWUpID09IG51bGwgfHwgaW5kZXhMYXN0TW9kaWZpZWQgPCBwYXRoLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpCisJCQkJCQkJCQkJCQk/IChPYmplY3QpIHJlc291cmNlCisJCQkJCQkJCQkJCQk6IChPYmplY3QpIE9LKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQl9LAorCQkJCQlJUmVzb3VyY2UuTk9ORQorCQkJCSk7CisJCQl9CisKKwkJCU9iamVjdFtdIG5hbWVzID0gaW5kZXhlZEZpbGVOYW1lcy5rZXlUYWJsZTsKKwkJCU9iamVjdFtdIHZhbHVlcyA9IGluZGV4ZWRGaWxlTmFtZXMudmFsdWVUYWJsZTsKKwkJCWJvb2xlYW4gc2hvdWxkU2F2ZSA9IGZhbHNlOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG5hbWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lc1tpXTsKKwkJCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQkJCWlmICh0aGlzLmlzQ2FuY2VsbGVkKSByZXR1cm4gZmFsc2U7CisKKwkJCQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzW2ldOworCQkJCQlpZiAodmFsdWUgIT0gT0spIHsKKwkJCQkJCXNob3VsZFNhdmUgPSB0cnVlOworCQkJCQkJaWYgKHZhbHVlID09IERFTEVURUQpCisJCQkJCQkJdGhpcy5tYW5hZ2VyLnJlbW92ZShuYW1lLCB0aGlzLmluZGV4UGF0aCk7CisJCQkJCQllbHNlCisJCQkJCQkJdGhpcy5tYW5hZ2VyLmFkZEJpbmFyeSgoSUZpbGUpIHZhbHVlLCB0aGlzLmluZGV4UGF0aCk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CisKKwkJCS8vIHJlcXVlc3QgdG8gc2F2ZSBpbmRleCB3aGVuIGFsbCBjbGFzcyBmaWxlcyBoYXZlIGJlZW4gaW5kZXhlZAorCQkJaWYgKHNob3VsZFNhdmUpCisJCQkJdGhpcy5tYW5hZ2VyLnJlcXVlc3QobmV3IFNhdmVJbmRleCh0aGlzLmluZGV4UGF0aCwgdGhpcy5tYW5hZ2VyKSk7CisKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CiAJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMuZm9sZGVyICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJfQotCQkJbWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmZvbGRlci5nZXRGdWxsUGF0aCgpKTsKLQkJCXJldHVybiBGQUlMRUQ7CisJCQl0aGlzLm1hbmFnZXIucmVtb3ZlSW5kZXgodGhpcy5pbmRleFBhdGgpOworCQkJcmV0dXJuIGZhbHNlOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlpZiAoSm9iTWFuYWdlci5WRVJCT1NFKSB7CiAJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gaW5kZXggIiArIHRoaXMuZm9sZGVyICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJfQotCQkJbWFuYWdlci5yZW1vdmVJbmRleCh0aGlzLmZvbGRlci5nZXRGdWxsUGF0aCgpKTsKLQkJCXJldHVybiBGQUlMRUQ7CisJCQl0aGlzLm1hbmFnZXIucmVtb3ZlSW5kZXgodGhpcy5pbmRleFBhdGgpOworCQkJcmV0dXJuIGZhbHNlOwogCQl9IGZpbmFsbHkgewogCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jawogCQl9Ci0JCXJldHVybiBDT01QTEVURTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiB0aGlzLmZvbGRlci5oYXNoQ29kZSgpOworCX0KKwlwcm90ZWN0ZWQgSW50ZWdlciB1cGRhdGVkSW5kZXhTdGF0ZSgpIHsKKwkJcmV0dXJuIEluZGV4TWFuYWdlci5SRUJVSUxESU5HX1NUQVRFOwogCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gImluZGV4aW5nIGJpbmFyeSBmb2xkZXIgIiArIHRoaXMuZm9sZGVyLmdldEZ1bGxQYXRoKCk7IC8vJE5PTi1OTFMtMSQKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhNYW5hZ2VyLmphdmEKaW5kZXggNjAzMDY5ZC4uNGY2OTMzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleE1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4TWFuYWdlci5qYXZhCkBAIC0xLDE2ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTE4LDIyICsyMCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWx0YVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwpAQCAtNDEsMTggKzM4LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSW5kZXhTZWxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSmF2YVdvcmtzcGFjZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLklKb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsLlNpbXBsZUxvb2t1cFRhYmxlOwogCiBwdWJsaWMgY2xhc3MgSW5kZXhNYW5hZ2VyIGV4dGVuZHMgSm9iTWFuYWdlciBpbXBsZW1lbnRzIElJbmRleENvbnN0YW50cyB7CiAJLyogbnVtYmVyIG9mIGZpbGUgY29udGVudHMgaW4gbWVtb3J5ICovCiAJcHVibGljIHN0YXRpYyBpbnQgTUFYX0ZJTEVTX0lOX01FTU9SWSA9IDA7Ci0JCi0JcHVibGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlOwogCi0JLyogaW5kZXhlcyAqLwotCU1hcCBpbmRleGVzID0gbmV3IEhhc2hNYXAoNSk7CisJcHVibGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlOworCXB1YmxpYyBTaW1wbGVMb29rdXBUYWJsZSBpbmRleE5hbWVzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKCk7CisJcHJpdmF0ZSBNYXAgaW5kZXhlcyA9IG5ldyBIYXNoTWFwKDUpOwogCiAJLyogcmVhZCB3cml0ZSBtb25pdG9ycyAqLwogCXByaXZhdGUgTWFwIG1vbml0b3JzID0gbmV3IEhhc2hNYXAoNSk7CkBAIC02MSwzMiArNTcsMzIgQEAKIAlwcml2YXRlIGJvb2xlYW4gbmVlZFRvU2F2ZSA9IGZhbHNlOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwogCXByaXZhdGUgSVBhdGggamF2YVBsdWdpbkxvY2F0aW9uID0gbnVsbDsKLQkKLQkvKiBwcm9qZWN0cyB0byBjaGVjayBjb25zaXN0ZW5jeSBmb3IgKi8KLQlJUHJvamVjdFtdIHByb2plY3RzVG9DaGVjayA9IG51bGw7Ci0JCi0vKioKLSAqIEJlZm9yZSBwcm9jZXNzaW5nIGFsbCBqb2JzLCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBpbmRleGVzIGFyZSB1cCB0byBkYXRlLgotICovCi1wdWJsaWMgdm9pZCBhY3RpdmF0ZVByb2Nlc3NpbmcoKSB7Ci0JdHJ5IHsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCgxMDAwMCk7IC8vIHdhaXQgMTAgc2Vjb25kcyBzbyBhcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggcGx1Z2luIHN0YXJ0dXAKLQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCX0JCi0JY2hlY2tJbmRleENvbnNpc3RlbmN5KCk7Ci0Jc3VwZXIuYWN0aXZhdGVQcm9jZXNzaW5nKCk7Ci19Ci0vKioKLSAqIFRyaWdnZXIgYWRkaXRpb24gb2YgYSByZXNvdXJjZSB0byBhbiBpbmRleAotICogTm90ZTogdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGJhY2tncm91bmQKLSAqLwotcHVibGljIHZvaWQgYWRkU291cmNlKElGaWxlIHJlc291cmNlLCBJUGF0aCBpbmRleGVkQ29udGFpbmVyKXsKLQlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOwkKLQlBZGRDb21waWxhdGlvblVuaXRUb0luZGV4IGpvYiA9IG5ldyBBZGRDb21waWxhdGlvblVuaXRUb0luZGV4KHJlc291cmNlLCB0aGlzLCBpbmRleGVkQ29udGFpbmVyKTsKLQlpZiAodGhpcy5hd2FpdGluZ0pvYnNDb3VudCgpIDwgTUFYX0ZJTEVTX0lOX01FTU9SWSkgewotCQlqb2IuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7CisKKwkvKiBjYW4gb25seSByZXBsYWNlIGEgY3VycmVudCBzdGF0ZSBpZiBpdHMgbGVzcyB0aGFuIHRoZSBuZXcgb25lICovCisJcHJpdmF0ZSBTaW1wbGVMb29rdXBUYWJsZSBpbmRleFN0YXRlcyA9IG51bGw7CisJcHJpdmF0ZSBGaWxlIHNhdmVkSW5kZXhOYW1lc0ZpbGUgPQorCQluZXcgRmlsZShnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkuYXBwZW5kKCJzYXZlZEluZGV4TmFtZXMudHh0IikudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBTQVZFRF9TVEFURSA9IG5ldyBJbnRlZ2VyKDApOworCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBVUERBVElOR19TVEFURSA9IG5ldyBJbnRlZ2VyKDEpOworCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBVTktOT1dOX1NUQVRFID0gbmV3IEludGVnZXIoMik7CisJcHVibGljIHN0YXRpYyBJbnRlZ2VyIFJFQlVJTERJTkdfU1RBVEUgPSBuZXcgSW50ZWdlcigzKTsKKworcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFib3V0VG9VcGRhdGVJbmRleChJUGF0aCBwYXRoLCBJbnRlZ2VyIG5ld0luZGV4U3RhdGUpIHsKKwkvLyBuZXdJbmRleFN0YXRlIGlzIGVpdGhlciBVUERBVElOR19TVEFURSBvciBSRUJVSUxESU5HX1NUQVRFCisJLy8gbXVzdCB0YWcgdGhlIGluZGV4IGFzIGluY29uc2lzdGVudCwgaW4gY2FzZSB3ZSBleGl0IGJlZm9yZSB0aGUgdXBkYXRlIGpvYiBpcyBzdGFydGVkCisJU3RyaW5nIGluZGV4TmFtZSA9IGNvbXB1dGVJbmRleE5hbWUocGF0aCk7CisJT2JqZWN0IHN0YXRlID0gZ2V0SW5kZXhTdGF0ZXMoKS5nZXQoaW5kZXhOYW1lKTsKKwlJbnRlZ2VyIGN1cnJlbnRJbmRleFN0YXRlID0gc3RhdGUgPT0gbnVsbCA/IFVOS05PV05fU1RBVEUgOiAoSW50ZWdlcikgc3RhdGU7CisJaWYgKGN1cnJlbnRJbmRleFN0YXRlLmVxdWFscyhSRUJVSUxESU5HX1NUQVRFKSkgcmV0dXJuOyAvLyBhbHJlYWR5IHJlYnVpbGRpbmcgdGhlIGluZGV4CisKKwlpbnQgY29tcGFyZSA9IG5ld0luZGV4U3RhdGUuY29tcGFyZVRvKGN1cnJlbnRJbmRleFN0YXRlKTsKKwlpZiAoY29tcGFyZSA+IDApIHsKKwkJLy8gc28gVVBEQVRJTkdfU1RBVEUgcmVwbGFjZXMgU0FWRURfU1RBVEUgYW5kIFJFQlVJTERJTkdfU1RBVEUgcmVwbGFjZXMgZXZlcnl0aGluZworCQl1cGRhdGVJbmRleFN0YXRlKGluZGV4TmFtZSwgbmV3SW5kZXhTdGF0ZSk7CisJfSBlbHNlIGlmIChjb21wYXJlIDwgMCAmJiB0aGlzLmluZGV4ZXMuZ2V0KHBhdGgpID09IG51bGwpIHsKKwkJLy8gaWYgYWxyZWFkeSBjYWNoZWQgaW5kZXggdGhlbiB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gZG8KKwkJcmVidWlsZEluZGV4KGluZGV4TmFtZSwgcGF0aCk7CiAJfQotCXJlcXVlc3Qoam9iKTsKIH0KIC8qKgogICogVHJpZ2dlciBhZGRpdGlvbiBvZiBhIHJlc291cmNlIHRvIGFuIGluZGV4CkBAIC05NCw5MyArOTAsNDEgQEAKICAqLwogcHVibGljIHZvaWQgYWRkQmluYXJ5KElGaWxlIHJlc291cmNlLCBJUGF0aCBpbmRleGVkQ29udGFpbmVyKXsKIAlpZiAoSmF2YUNvcmUuZ2V0UGx1Z2luKCkgPT0gbnVsbCkgcmV0dXJuOwkKLQlBZGRDbGFzc0ZpbGVUb0luZGV4IGpvYiA9IG5ldyBBZGRDbGFzc0ZpbGVUb0luZGV4KHJlc291cmNlLCB0aGlzLCBpbmRleGVkQ29udGFpbmVyKTsKKwlBZGRDbGFzc0ZpbGVUb0luZGV4IGpvYiA9IG5ldyBBZGRDbGFzc0ZpbGVUb0luZGV4KHJlc291cmNlLCBpbmRleGVkQ29udGFpbmVyLCB0aGlzKTsKIAlpZiAodGhpcy5hd2FpdGluZ0pvYnNDb3VudCgpIDwgTUFYX0ZJTEVTX0lOX01FTU9SWSkgewotCQlqb2IuaW5pdGlhbGl6ZUNvbnRlbnRzKCk7CisJCS8vIHJlZHVjZXMgdGhlIGNoYW5jZSB0aGF0IHRoZSBmaWxlIGlzIG9wZW4gbGF0ZXIgb24sIHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyBkZWxldGVkCisJCWlmICgham9iLmluaXRpYWxpemVDb250ZW50cygpKSByZXR1cm47CiAJfQogCXJlcXVlc3Qoam9iKTsKIH0KIC8qKgotICogSW5kZXggdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBmb2xkZXIuCisgKiBUcmlnZ2VyIGFkZGl0aW9uIG9mIGEgcmVzb3VyY2UgdG8gYW4gaW5kZXgKKyAqIE5vdGU6IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBiYWNrZ3JvdW5kCiAgKi8KLXB1YmxpYyB2b2lkIGluZGV4U291cmNlRm9sZGVyKEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUGF0aCBzb3VyY2VGb2xkZXIpIHsKLQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCWZpbmFsIElQYXRoIGNvbnRhaW5lciA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQlJQ29udGFpbmVyIGZvbGRlcjsKLQlpZiAoY29udGFpbmVyLmVxdWFscyhzb3VyY2VGb2xkZXIpKSB7Ci0JCWZvbGRlciA9IHByb2plY3Q7Ci0JfSBlbHNlIHsKLQkJZm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIoc291cmNlRm9sZGVyKTsKK3B1YmxpYyB2b2lkIGFkZFNvdXJjZShJRmlsZSByZXNvdXJjZSwgSVBhdGggaW5kZXhlZENvbnRhaW5lcil7CisJaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsJCisJQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleCBqb2IgPSBuZXcgQWRkQ29tcGlsYXRpb25Vbml0VG9JbmRleChyZXNvdXJjZSwgaW5kZXhlZENvbnRhaW5lciwgdGhpcyk7CisJaWYgKHRoaXMuYXdhaXRpbmdKb2JzQ291bnQoKSA8IE1BWF9GSUxFU19JTl9NRU1PUlkpIHsKKwkJLy8gcmVkdWNlcyB0aGUgY2hhbmNlIHRoYXQgdGhlIGZpbGUgaXMgb3BlbiBsYXRlciBvbiwgcHJldmVudGluZyBpdCBmcm9tIGJlaW5nIGRlbGV0ZWQKKwkJaWYgKCFqb2IuaW5pdGlhbGl6ZUNvbnRlbnRzKCkpIHJldHVybjsKIAl9Ci0JdHJ5IHsKLQkJZm9sZGVyLmFjY2VwdChuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIElSZXNvdXJjZVZpc2l0b3IjdmlzaXQoSVJlc291cmNlKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlpZiAoImphdmEiLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJCQkJYWRkU291cmNlKChJRmlsZSlyZXNvdXJjZSwgY29udGFpbmVyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJLy8gRm9sZGVyIGRvZXMgbm90IGV4aXN0LgotCQkvLyBJdCB3aWxsIGJlIGluZGV4ZWQgb25seSB3aGVuIERlbHRhUHJvY2Vzc29yIGRldGVjdHMgaXRzIGFkZGl0aW9uCisJcmVxdWVzdChqb2IpOworfQorU3RyaW5nIGNvbXB1dGVJbmRleE5hbWUoSVBhdGggcGF0aCkgeworCVN0cmluZyBuYW1lID0gKFN0cmluZykgaW5kZXhOYW1lcy5nZXQocGF0aCk7CisJaWYgKG5hbWUgPT0gbnVsbCkgeworCQlTdHJpbmcgcGF0aFN0cmluZyA9IHBhdGgudG9PU1N0cmluZygpOworCQljaGVja3N1bUNhbGN1bGF0b3IucmVzZXQoKTsKKwkJY2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoU3RyaW5nLmdldEJ5dGVzKCkpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKGNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCisJCWlmIChWRVJCT1NFKQorCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBpbmRleCBuYW1lIGZvciAiICsgcGF0aFN0cmluZyArICIgaXMgIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCW5hbWUgPSBnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKS50b09TU3RyaW5nKCk7CisJCWluZGV4TmFtZXMucHV0KHBhdGgsIG5hbWUpOwogCX0KKwlyZXR1cm4gbmFtZTsKIH0KIC8qKgotICogRW5zdXJlcyB0aGF0IGluZGV4ZXMgYXJlIHVwIHRvIGRhdGUgd2l0aCB3b3JrYmVuY2ggY29udGVudC4gVHlwaWNhbGx5Ci0gKiBpdCBpcyBpbnZva2VkIGluIGJhY2tncm91bmQgd2hlbiBhY3RpdmF0ZSB0aGUgam9iIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNoZWNrSW5kZXhDb25zaXN0ZW5jeSgpIHsKLQotCWlmIChWRVJCT1NFKSBKb2JNYW5hZ2VyLnZlcmJvc2UoIlNUQVJUSU5HIGVuc3VyaW5nIGNvbnNpc3RlbmN5Iik7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gd2FzRW5hYmxlZCA9IGlzRW5hYmxlZCgpOwkKLQl0cnkgewotCQlkaXNhYmxlKCk7Ci0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybjsgLy8gTkI6IHdvcmtzcGFjZSBjYW4gYmUgbnVsbCBpZiBpdCBoYXMgc2h1dCBkb3duIChzZWUgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE3NSkKLQkJaWYgKHRoaXMucHJvamVjdHNUb0NoZWNrICE9IG51bGwpewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHRoaXMucHJvamVjdHNUb0NoZWNrOwotCQkJdGhpcy5wcm9qZWN0c1RvQ2hlY2sgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKXsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJLy8gbm90IG9ubHkgamF2YSBwcm9qZWN0LCBnaXZlbiBhdCBzdGFydHVwIG5hdHVyZSBtYXkgbm90IGhhdmUgYmVlbiBzZXQgeWV0Ci0JCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsgCi0JCQkJCWluZGV4QWxsKHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCWlmICh3YXNFbmFibGVkKSBlbmFibGUoKTsKLQkJaWYgKFZFUkJPU0UpIEpvYk1hbmFnZXIudmVyYm9zZSgiRE9ORSBlbnN1cmluZyBjb25zaXN0ZW5jeSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUluZGV4TmFtZShJUGF0aCBwYXRoKSB7Ci0JCi0JU3RyaW5nIHBhdGhTdHJpbmcgPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQlieXRlW10gcGF0aEJ5dGVzID0gcGF0aFN0cmluZy5nZXRCeXRlcygpOwotCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotCWNoZWNrc3VtQ2FsY3VsYXRvci51cGRhdGUocGF0aEJ5dGVzKTsKLQlTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKGNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0JaWYgKFZFUkJPU0UpIEpvYk1hbmFnZXIudmVyYm9zZSgiLT4gaW5kZXggbmFtZSBmb3IgIiArIHBhdGhTdHJpbmcgKyAiIGlzICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCUlQYXRoIGluZGV4UGF0aCA9IGdldEphdmFQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQlTdHJpbmcgaW5kZXhEaXJlY3RvcnkgPSBpbmRleFBhdGgudG9PU1N0cmluZygpOwotCWlmIChpbmRleERpcmVjdG9yeS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJcmV0dXJuIGluZGV4RGlyZWN0b3J5ICsgZmlsZU5hbWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGluZGV4RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQl9IAotfQotCi0vKioKICAqIFJldHVybnMgdGhlIGluZGV4IGZvciBhIGdpdmVuIHByb2plY3QsIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKICAqIC0gaWYgaW5kZXggaXMgYWxyZWFkeSBpbiBtZW1vcnk6IGFuc3dlcnMgdGhpcyBvbmUgYmFjawogICogLSBpZiAocmV1c2VFeGlzdGluZ0ZpbGUpIHRoZW4gcmVhZCBpdCBhbmQgcmV0dXJuIHRoaXMgaW5kZXggYW5kIHJlY29yZCBpdCBpbiBtZW1vcnkKQEAgLTE5Miw0NSArMTM2LDgxIEBACiAJLy8gUGF0aCBpcyBhbHJlYWR5IGNhbm9uaWNhbCBwZXIgY29uc3RydWN0aW9uCiAJSUluZGV4IGluZGV4ID0gKElJbmRleCkgaW5kZXhlcy5nZXQocGF0aCk7CiAJaWYgKGluZGV4ID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbmRleFBhdGggPSBudWxsOwotCQkJCi0JCQkvLyBpbmRleCBpc24ndCBjYWNoZWQsIGNvbnNpZGVyIHJldXNpbmcgYW4gZXhpc3RpbmcgaW5kZXggZmlsZQotCQkJaWYgKHJldXNlRXhpc3RpbmdGaWxlKXsKLQkJCQlpbmRleFBhdGggPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOwotCQkJCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoaW5kZXhQYXRoKTsKLQkJCQlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKXsgLy8gY2hlY2sgYmVmb3JlIGNyZWF0aW5nIGluZGV4IHNvIGFzIHRvIGF2b2lkIGNyZWF0aW5nIGEgbmV3IGVtcHR5IGluZGV4IGlmIGZpbGUgaXMgbWlzc2luZwotCQkJCQlpbmRleCA9IG5ldyBJbmRleChpbmRleFBhdGgsICJJbmRleCBmb3IgIiArIHBhdGgudG9PU1N0cmluZygpLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5kZXggIT0gbnVsbCl7Ci0JCQkJCQlpbmRleGVzLnB1dChwYXRoLCBpbmRleCk7Ci0JCQkJCQltb25pdG9ycy5wdXQoaW5kZXgsIG5ldyBSZWFkV3JpdGVNb25pdG9yKCkpOwotCQkJCQkJcmV0dXJuIGluZGV4OwotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCS8vIGluZGV4IHdhc24ndCBmb3VuZCBvbiBkaXNrLCBjb25zaWRlciBjcmVhdGluZyBhbiBlbXB0eSBuZXcgb25lCi0JCQlpZiAoY3JlYXRlSWZNaXNzaW5nKXsKLQkJCQlpZiAoaW5kZXhQYXRoID09IG51bGwpIGluZGV4UGF0aCA9IGNvbXB1dGVJbmRleE5hbWUocGF0aCk7Ci0JCQkJaW5kZXggPSBuZXcgSW5kZXgoaW5kZXhQYXRoLCAiSW5kZXggZm9yICIgKyBwYXRoLnRvT1NTdHJpbmcoKSwgZmFsc2UgLypkbyBub3QgcmV1c2UgaW5kZXggZmlsZSovKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCAhPSBudWxsKXsKKwkJU3RyaW5nIGluZGV4TmFtZSA9IGNvbXB1dGVJbmRleE5hbWUocGF0aCk7CisJCU9iamVjdCBzdGF0ZSA9IGdldEluZGV4U3RhdGVzKCkuZ2V0KGluZGV4TmFtZSk7CisJCUludGVnZXIgY3VycmVudEluZGV4U3RhdGUgPSBzdGF0ZSA9PSBudWxsID8gVU5LTk9XTl9TVEFURSA6IChJbnRlZ2VyKSBzdGF0ZTsKKwkJaWYgKGN1cnJlbnRJbmRleFN0YXRlID09IFVOS05PV05fU1RBVEUpIHsKKwkJCS8vIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBmb3IgcXVlcnkgam9icworCQkJLy8gSUYgeW91IHB1dCBhbiBpbmRleCBpbiB0aGUgY2FjaGUsIHRoZW4gQWRkSmFyRmlsZVRvSW5kZXggZmFpbHMgYmVjYXVzZSBpdCB0aGlua3MgdGhlcmUgaXMgbm90aGluZyB0byBkbworCQkJcmVidWlsZEluZGV4KGluZGV4TmFtZSwgcGF0aCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGluZGV4IGlzbid0IGNhY2hlZCwgY29uc2lkZXIgcmV1c2luZyBhbiBleGlzdGluZyBpbmRleCBmaWxlCisJCWlmIChyZXVzZUV4aXN0aW5nRmlsZSkgeworCQkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZShpbmRleE5hbWUpOworCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgeyAvLyBjaGVjayBiZWZvcmUgY3JlYXRpbmcgaW5kZXggc28gYXMgdG8gYXZvaWQgY3JlYXRpbmcgYSBuZXcgZW1wdHkgaW5kZXggaWYgZmlsZSBpcyBtaXNzaW5nCisJCQkJdHJ5IHsKKwkJCQkJaW5kZXggPSBuZXcgSW5kZXgoaW5kZXhOYW1lLCAiSW5kZXggZm9yICIgKyBwYXRoLnRvT1NTdHJpbmcoKSwgdHJ1ZSAvKnJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOwogCQkJCQltb25pdG9ycy5wdXQoaW5kZXgsIG5ldyBSZWFkV3JpdGVNb25pdG9yKCkpOwogCQkJCQlyZXR1cm4gaW5kZXg7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBmYWlsZWQgdG8gcmVhZCB0aGUgZXhpc3RpbmcgZmlsZSBvciBpdHMgbm8gbG9uZ2VyIGNvbXBhdGlibGUKKwkJCQkJaWYgKGN1cnJlbnRJbmRleFN0YXRlICE9IFJFQlVJTERJTkdfU1RBVEUpIHsgLy8gcmVidWlsZCBpbmRleCBpZiBleGlzdGluZyBmaWxlIGlzIGNvcnJ1cHQsIHVubGVzcyB0aGUgaW5kZXggaXMgYWxyZWFkeSBiZWluZyByZWJ1aWx0CisJCQkJCQlpZiAoVkVSQk9TRSkKKwkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGNhbm5vdCByZXVzZSBleGlzdGluZyBpbmRleDogIitpbmRleE5hbWUrIiBwYXRoOiAiK3BhdGgudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlyZWJ1aWxkSW5kZXgoaW5kZXhOYW1lLCBwYXRoKTsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW5kZXggPSBudWxsOyAvLyB3aWxsIGZhbGwgdGhydSB0byBjcmVhdGVJZk1pc3NpbmcgJiBjcmVhdGUgYSBlbXB0eSBpbmRleCBmb3IgdGhlIHJlYnVpbGQgYWxsIGpvYiB0byBwb3B1bGF0ZQorCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUG9zc2libGUgcmVhc29uOiB0aGUgcHJvamVjdCBoYXMgYmVlbiBkZWxldGVkLgotCQkJcmV0dXJuIG51bGw7CisJCQlpZiAoY3VycmVudEluZGV4U3RhdGUgPT0gU0FWRURfU1RBVEUpIHsgLy8gcmVidWlsZCBpbmRleCBpZiBleGlzdGluZyBmaWxlIGlzIG1pc3NpbmcKKwkJCQlyZWJ1aWxkSW5kZXgoaW5kZXhOYW1lLCBwYXRoKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSAKKwkJLy8gaW5kZXggd2Fzbid0IGZvdW5kIG9uIGRpc2ssIGNvbnNpZGVyIGNyZWF0aW5nIGFuIGVtcHR5IG5ldyBvbmUKKwkJaWYgKGNyZWF0ZUlmTWlzc2luZykgeworCQkJdHJ5IHsKKwkJCQlpZiAoVkVSQk9TRSkKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBjcmVhdGUgZW1wdHkgaW5kZXg6ICIraW5kZXhOYW1lKyIgcGF0aDogIitwYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4TmFtZSwgIkluZGV4IGZvciAiICsgcGF0aC50b09TU3RyaW5nKCksIGZhbHNlIC8qZG8gbm90IHJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbmRleGVzLnB1dChwYXRoLCBpbmRleCk7CisJCQkJbW9uaXRvcnMucHV0KGluZGV4LCBuZXcgUmVhZFdyaXRlTW9uaXRvcigpKTsKKwkJCQlyZXR1cm4gaW5kZXg7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKFZFUkJPU0UpCisJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gdW5hYmxlIHRvIGNyZWF0ZSBlbXB0eSBpbmRleDogIitpbmRleE5hbWUrIiBwYXRoOiAiK3BhdGgudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJLy8gVGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBvc3NpYmxlIHJlYXNvbjogdGhlIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJfQogCX0KIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiIGluZGV4IG5hbWU6ICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICIgPC0tLS0+ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKS5nZXROYW1lKCkpOwkKIAlyZXR1cm4gaW5kZXg7CiB9Ci1wcml2YXRlIElQYXRoIGdldEphdmFQbHVnaW5Xb3JraW5nTG9jYXRpb24oKSB7Ci0JaWYgKGphdmFQbHVnaW5Mb2NhdGlvbiA9PSBudWxsKSB7Ci0JCWphdmFQbHVnaW5Mb2NhdGlvbiA9IEphdmFDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKTsKK3ByaXZhdGUgU2ltcGxlTG9va3VwVGFibGUgZ2V0SW5kZXhTdGF0ZXMoKSB7CisJaWYgKGluZGV4U3RhdGVzICE9IG51bGwpIHJldHVybiBpbmRleFN0YXRlczsKKworCXRoaXMuaW5kZXhTdGF0ZXMgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoKTsKKwljaGFyW10gc2F2ZWRJbmRleE5hbWVzID0gcmVhZEluZGV4U3RhdGUoKTsKKwlpZiAoc2F2ZWRJbmRleE5hbWVzLmxlbmd0aCA+IDApIHsKKwkJY2hhcltdW10gbmFtZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJ1xuJywgc2F2ZWRJbmRleE5hbWVzKTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKKwkJCWNoYXJbXSBuYW1lID0gbmFtZXNbaV07CisJCQlpZiAobmFtZS5sZW5ndGggPiAwKQorCQkJCXRoaXMuaW5kZXhTdGF0ZXMucHV0KG5ldyBTdHJpbmcobmFtZSksIFNBVkVEX1NUQVRFKTsKKwkJfQogCX0KLQlyZXR1cm4gamF2YVBsdWdpbkxvY2F0aW9uOworCXJldHVybiB0aGlzLmluZGV4U3RhdGVzOworfQorcHJpdmF0ZSBJUGF0aCBnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkgeworCWlmICh0aGlzLmphdmFQbHVnaW5Mb2NhdGlvbiAhPSBudWxsKSByZXR1cm4gdGhpcy5qYXZhUGx1Z2luTG9jYXRpb247CisKKwlyZXR1cm4gdGhpcy5qYXZhUGx1Z2luTG9jYXRpb24gPSBKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCk7CiB9CiAvKioKICAqIEluZGV4IGFjY2VzcyBpcyBjb250cm9sbGVkIHRocm91Z2ggYSByZWFkLXdyaXRlIG1vbml0b3Igc28gYXMKQEAgLTIzOCw4ICsyMTgsNyBAQAogICogKG9ubHkgY29uY3VycmVudCByZWFkaW5nIGlzIGFsbG93ZWQpLgogICovCiBwdWJsaWMgUmVhZFdyaXRlTW9uaXRvciBnZXRNb25pdG9yRm9yKElJbmRleCBpbmRleCl7Ci0JCi0JcmV0dXJuIChSZWFkV3JpdGVNb25pdG9yKW1vbml0b3JzLmdldChpbmRleCk7CisJcmV0dXJuIChSZWFkV3JpdGVNb25pdG9yKSBtb25pdG9ycy5nZXQoaW5kZXgpOwogfQogLyoqCiAgKiBUcmlnZ2VyIGFkZGl0aW9uIG9mIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIHByb2plY3QKQEAgLTI1MSwzMCArMjMwLDc4IEBACiAJLy8gQWxzbyByZXF1ZXN0IGluZGV4aW5nIG9mIGJpbmFyaWVzIG9uIHRoZSBjbGFzc3BhdGgKIAkvLyBkZXRlcm1pbmUgdGhlIG5ldyBjaGlsZHJlbgogCXRyeSB7Ci0JCUlKYXZhTW9kZWwgbW9kZWwgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRKYXZhTW9kZWwoKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKChKYXZhTW9kZWwpIG1vZGVsKS5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsJCisJCUphdmFNb2RlbCBtb2RlbCA9IChKYXZhTW9kZWwpIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEphdmFNb2RlbCgpOworCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBtb2RlbC5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsJCiAJCS8vIG9ubHkgY29uc2lkZXIgaW1tZWRpYXRlIGxpYnJhcmllcyAtIGVhY2ggcHJvamVjdCB3aWxsIGRvIHRoZSBzYW1lCiAJCS8vIE5PVEU6IGZvcmNlIHRvIHJlc29sdmUgQ1AgdmFyaWFibGVzIGJlZm9yZSBjYWxsaW5nIGluZGV4ZXIgLSAxOTMwMywgc28gdGhhdCBpbml0aWFsaXplcnMKIAkJLy8gd2lsbCBiZSBydW4gaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgogCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CQogCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKIAkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeT0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKKwkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpCiAJCQkJdGhpcy5pbmRleExpYnJhcnkoZW50cnkuZ2V0UGF0aCgpLCBwcm9qZWN0KTsKLQkJCX0KIAkJfQogCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpeyAvLyBjYW5ub3QgcmV0cmlldmUgY2xhc3NwYXRoIGluZm8KLQl9CQotCXRoaXMucmVxdWVzdChuZXcgSW5kZXhBbGxQcm9qZWN0KHByb2plY3QsIHRoaXMpKTsKKwl9CisKKwkvLyBjaGVjayBpZiB0aGUgc2FtZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZQorCUluZGV4UmVxdWVzdCByZXF1ZXN0ID0gbmV3IEluZGV4QWxsUHJvamVjdChwcm9qZWN0LCB0aGlzKTsKKwlmb3IgKGludCBpID0gdGhpcy5qb2JFbmQ7IGkgPiB0aGlzLmpvYlN0YXJ0OyBpLS0pIC8vIE5COiBkb24ndCBjaGVjayBqb2IgYXQgam9iU3RhcnQsIGFzIGl0IG1heSBoYXZlIGFscmVhZHkgc3RhcnRlZCAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg4KQorCQlpZiAocmVxdWVzdC5lcXVhbHModGhpcy5hd2FpdGluZ0pvYnNbaV0pKSByZXR1cm47CisJdGhpcy5yZXF1ZXN0KHJlcXVlc3QpOwogfQorLyoqCisgKiBUcmlnZ2VyIGFkZGl0aW9uIG9mIGEgbGlicmFyeSB0byBhbiBpbmRleAorICogTm90ZTogdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIGJhY2tncm91bmQKKyAqLworcHVibGljIHZvaWQgaW5kZXhMaWJyYXJ5KElQYXRoIHBhdGgsIElQcm9qZWN0IHJlcXVlc3RpbmdQcm9qZWN0KSB7CisJLy8gcmVxdWVzdGluZ1Byb2plY3QgaXMgbm8gbG9uZ2VyIHVzZWQgdG8gY2FuY2VsIGpvYnMgYnV0IGxlYXZlIGl0IGhlcmUganVzdCBpbiBjYXNlCisJaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsKIAorCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHBhdGgsIHRydWUpOworCUluZGV4UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKwlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJcmVxdWVzdCA9IG5ldyBBZGRKYXJGaWxlVG9JbmRleCgoSUZpbGUpdGFyZ2V0LCB0aGlzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSkgeworCQlyZXF1ZXN0ID0gbmV3IEFkZEphckZpbGVUb0luZGV4KHBhdGgsIHRoaXMpOworCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZvbGRlcikgeworCQlyZXF1ZXN0ID0gbmV3IEluZGV4QmluYXJ5Rm9sZGVyKChJRm9sZGVyKXRhcmdldCwgdGhpcyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KIAorCS8vIGNoZWNrIGlmIHRoZSBzYW1lIHJlcXVlc3QgaXMgbm90IGFscmVhZHkgaW4gdGhlIHF1ZXVlCisJZm9yIChpbnQgaSA9IHRoaXMuam9iRW5kOyBpID4gdGhpcy5qb2JTdGFydDsgaS0tKSAgLy8gTkI6IGRvbid0IGNoZWNrIGpvYiBhdCBqb2JTdGFydCwgYXMgaXQgbWF5IGhhdmUgYWxyZWFkeSBzdGFydGVkIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODgpCisJCWlmIChyZXF1ZXN0LmVxdWFscyh0aGlzLmF3YWl0aW5nSm9ic1tpXSkpIHJldHVybjsKKwl0aGlzLnJlcXVlc3QocmVxdWVzdCk7Cit9CisvKioKKyAqIEluZGV4IHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVyLgorICovCitwdWJsaWMgdm9pZCBpbmRleFNvdXJjZUZvbGRlcihKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVBhdGggc291cmNlRm9sZGVyLCBmaW5hbCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJuKSB7CisJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwlpZiAodGhpcy5qb2JFbmQgPiB0aGlzLmpvYlN0YXJ0KSB7CisJCS8vIGNoZWNrIGlmIGEgam9iIHRvIGluZGV4IHRoZSBwcm9qZWN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZQorCQlJbmRleFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBJbmRleEFsbFByb2plY3QocHJvamVjdCwgdGhpcyk7CisJCWZvciAoaW50IGkgPSB0aGlzLmpvYkVuZDsgaSA+IHRoaXMuam9iU3RhcnQ7IGktLSkgLy8gTkI6IGRvbid0IGNoZWNrIGpvYiBhdCBqb2JTdGFydCwgYXMgaXQgbWF5IGhhdmUgYWxyZWFkeSBzdGFydGVkIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI0ODgpCisJCQlpZiAocmVxdWVzdC5lcXVhbHModGhpcy5hd2FpdGluZ0pvYnNbaV0pKSByZXR1cm47CisJfQorCisJdGhpcy5yZXF1ZXN0KG5ldyBBZGRGb2xkZXJUb0luZGV4KHNvdXJjZUZvbGRlciwgcHJvamVjdCwgZXhjbHVzaW9uUGF0dGVybiwgdGhpcykpOworfQorcHVibGljIHZvaWQgam9iV2FzQ2FuY2VsbGVkKElQYXRoIHBhdGgpIHsKKwlPYmplY3QgbyA9IHRoaXMuaW5kZXhlcy5nZXQocGF0aCk7CisJaWYgKG8gaW5zdGFuY2VvZiBJSW5kZXgpIHsKKwkJdGhpcy5tb25pdG9ycy5yZW1vdmUobyk7CisJCXRoaXMuaW5kZXhlcy5yZW1vdmUocGF0aCk7CisJfQorCXVwZGF0ZUluZGV4U3RhdGUoY29tcHV0ZUluZGV4TmFtZShwYXRoKSwgVU5LTk9XTl9TVEFURSk7Cit9CiAvKioKICAqIEFkdmFuY2UgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGpvYiwgb25jZSB0aGUgY3VycmVudCBvbmUgaGFzIGJlZW4gY29tcGxldGVkLgogICogTm90ZTogY2xpZW50cyBhd2FpdGluZyB1bnRpbCB0aGUgam9iIGNvdW50IGlzIHplcm8gYXJlIHN0aWxsIHdhaXRpbmcgYXQgdGhpcyBwb2ludC4KICAqLwogcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG1vdmVUb05leHRKb2IoKSB7Ci0KIAkvLyByZW1lbWJlciB0aGF0IG9uZSBqb2Igd2FzIGV4ZWN1dGVkLCBhbmQgd2Ugd2lsbCBuZWVkIHRvIHNhdmUgaW5kZXhlcyBhdCBzb21lIHBvaW50CiAJbmVlZFRvU2F2ZSA9IHRydWU7CiAJc3VwZXIubW92ZVRvTmV4dEpvYigpOwpAQCAtMjg1LDM2ICszMTIsNjggQEAKIHByb3RlY3RlZCB2b2lkIG5vdGlmeUlkbGUobG9uZyBpZGxpbmdUaW1lKXsKIAlpZiAoaWRsaW5nVGltZSA+IDEwMDAgJiYgbmVlZFRvU2F2ZSkgc2F2ZUluZGV4ZXMoKTsKIH0KKy8qCisgKiBGb3IgZGVidWcgcHVycG9zZQorICovCitwdWJsaWMgSUluZGV4IHBlZWtBdEluZGV4KElQYXRoIHBhdGgpIHsKKwlyZXR1cm4gKElJbmRleCkgaW5kZXhlcy5nZXQocGF0aCk7Cit9CiAvKioKICAqIE5hbWUgb2YgdGhlIGJhY2tncm91bmQgcHJvY2VzcwogICovCiBwdWJsaWMgU3RyaW5nIHByb2Nlc3NOYW1lKCl7Ci0JcmV0dXJuIFV0aWwuYmluZCgicHJvY2Vzcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKKwlyZXR1cm4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLlV0aWwuYmluZCgicHJvY2Vzcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKIH0KK3ByaXZhdGUgdm9pZCByZWJ1aWxkSW5kZXgoU3RyaW5nIGluZGV4TmFtZSwgSVBhdGggcGF0aCkgeworCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHBhdGgsIHRydWUpOworCWlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuOwogCisJaWYgKFZFUkJPU0UpCisJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gcmVxdWVzdCB0byByZWJ1aWxkIGluZGV4OiAiK2luZGV4TmFtZSsiIHBhdGg6ICIrcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCXVwZGF0ZUluZGV4U3RhdGUoaW5kZXhOYW1lLCBSRUJVSUxESU5HX1NUQVRFKTsKKwlJbmRleFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7CisJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIHRhcmdldDsKKwkJaWYgKEphdmFQcm9qZWN0Lmhhc0phdmFOYXR1cmUocCkpCisJCQlyZXF1ZXN0ID0gbmV3IEluZGV4QWxsUHJvamVjdChwLCB0aGlzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJcmVxdWVzdCA9IG5ldyBJbmRleEJpbmFyeUZvbGRlcigoSUZvbGRlcikgdGFyZ2V0LCB0aGlzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElGaWxlKSB7CisJCXJlcXVlc3QgPSBuZXcgQWRkSmFyRmlsZVRvSW5kZXgoKElGaWxlKSB0YXJnZXQsIHRoaXMpOworCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5pby5GaWxlKSB7CisJCXJlcXVlc3QgPSBuZXcgQWRkSmFyRmlsZVRvSW5kZXgocGF0aCwgdGhpcyk7CisJfQorCWlmIChyZXF1ZXN0ICE9IG51bGwpCisJCXJlcXVlc3QocmVxdWVzdCk7Cit9CiAvKioKICAqIFJlY3JlYXRlcyB0aGUgaW5kZXggZm9yIGEgZ2l2ZW4gcGF0aCwga2VlcGluZyB0aGUgc2FtZSByZWFkLXdyaXRlIG1vbml0b3IuCiAgKiBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgaW5kZXggb3IgbnVsbCBpZiBpdCBkaWRuJ3QgZXhpc3QgYmVmb3JlLgogICogV2FybmluZzogRG9lcyBub3QgY2hlY2sgd2hldGhlciBpbmRleCBpcyBjb25zaXN0ZW50IChub3QgYmVpbmcgdXNlZCkKICAqLwogcHVibGljIHN5bmNocm9uaXplZCBJSW5kZXggcmVjcmVhdGVJbmRleChJUGF0aCBwYXRoKSB7Ci0JSUluZGV4IGluZGV4ID0gKElJbmRleCkgaW5kZXhlcy5nZXQocGF0aCk7Ci0JaWYgKGluZGV4ICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCS8vIFBhdGggaXMgYWxyZWFkeSBjYW5vbmljYWwKLQkJCVN0cmluZyBpbmRleFBhdGggPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOwotCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gKFJlYWRXcml0ZU1vbml0b3IpbW9uaXRvcnMucmVtb3ZlKGluZGV4KTsKLQkJCWluZGV4ID0gbmV3IEluZGV4KGluZGV4UGF0aCwgIkluZGV4IGZvciAiICsgcGF0aC50b09TU3RyaW5nKCksIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8pOyAvLyROT04tTkxTLTEkCi0JCQlpbmRleC5lbXB0eSgpOwotCQkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOwotCQkJbW9uaXRvcnMucHV0KGluZGV4LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBvc3NpYmxlIHJlYXNvbjogdGhlIHByb2plY3QgaGFzIGJlZW4gZGVsZXRlZC4KLQkJCXJldHVybiBudWxsOworCS8vIG9ubHkgY2FsbGVkIHRvIG92ZXIgd3JpdGUgYW4gZXhpc3RpbmcgY2FjaGVkIGluZGV4Li4uCisJdHJ5IHsKKwkJSUluZGV4IGluZGV4ID0gKElJbmRleCkgdGhpcy5pbmRleGVzLmdldChwYXRoKTsKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gKFJlYWRXcml0ZU1vbml0b3IpIHRoaXMubW9uaXRvcnMucmVtb3ZlKGluZGV4KTsKKworCQkvLyBQYXRoIGlzIGFscmVhZHkgY2Fub25pY2FsCisJCVN0cmluZyBpbmRleFBhdGggPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gcmVjcmVhdGluZyBpbmRleDogIitpbmRleFBhdGgrIiBmb3IgcGF0aDogIitwYXRoLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpbmRleCA9IG5ldyBJbmRleChpbmRleFBhdGgsICJJbmRleCBmb3IgIiArIHBhdGgudG9PU1N0cmluZygpLCBmYWxzZSAvKnJldXNlIGluZGV4IGZpbGUqLyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5kZXhlcy5wdXQocGF0aCwgaW5kZXgpOworCQltb25pdG9ycy5wdXQoaW5kZXgsIG1vbml0b3IpOworCQlyZXR1cm4gaW5kZXg7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkvLyBUaGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUG9zc2libGUgcmVhc29uOiB0aGUgcHJvamVjdCBoYXMgYmVlbiBkZWxldGVkLgorCQlpZiAoVkVSQk9TRSkgeworCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBmYWlsZWQgdG8gcmVjcmVhdGUgaW5kZXggZm9yIHBhdGg6ICIrcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQotCS8vU3lzdGVtLm91dC5wcmludGxuKCIgaW5kZXggbmFtZTogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiA8LS0tLT4gIiArIGluZGV4LmdldEluZGV4RmlsZSgpLmdldE5hbWUoKSk7CQotCXJldHVybiBpbmRleDsKIH0KIC8qKgogICogVHJpZ2dlciByZW1vdmFsIG9mIGEgcmVzb3VyY2UgdG8gYW4gaW5kZXgKQEAgLTMyOCw5NyArMzg3LDExMiBAQAogICogVGhpcyBpcyBhIG5vLW9wIGlmIHRoZSBpbmRleCBkaWQgbm90IGV4aXN0LgogICovCiBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSW5kZXgoSVBhdGggcGF0aCkgewotCUlJbmRleCBpbmRleCA9IChJSW5kZXgpdGhpcy5pbmRleGVzLmdldChwYXRoKTsKLQlpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuOwotCWluZGV4LmdldEluZGV4RmlsZSgpLmRlbGV0ZSgpOworCWlmIChWRVJCT1NFKQorCQlKb2JNYW5hZ2VyLnZlcmJvc2UoInJlbW92aW5nIGluZGV4ICIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBpbmRleE5hbWUgPSBjb21wdXRlSW5kZXhOYW1lKHBhdGgpOworCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoaW5kZXhOYW1lKTsKKwlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKQorCQlpbmRleEZpbGUuZGVsZXRlKCk7CisJT2JqZWN0IG8gPSB0aGlzLmluZGV4ZXMuZ2V0KHBhdGgpOworCWlmIChvIGluc3RhbmNlb2YgSUluZGV4KQorCQl0aGlzLm1vbml0b3JzLnJlbW92ZShvKTsKIAl0aGlzLmluZGV4ZXMucmVtb3ZlKHBhdGgpOwotCXRoaXMubW9uaXRvcnMucmVtb3ZlKGluZGV4KTsKKwl1cGRhdGVJbmRleFN0YXRlKGluZGV4TmFtZSwgbnVsbCk7CiB9CiAvKioKICAqIFJlbW92ZXMgYWxsIGluZGV4ZXMgd2hvc2UgcGF0aHMgc3RhcnQgd2l0aCAob3IgYXJlIGVxdWFsIHRvKSB0aGUgZ2l2ZW4gcGF0aC4gCiAgKi8KIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVJbmRleEZhbWlseShJUGF0aCBwYXRoKSB7CisJLy8gb25seSBmaW5kcyBjYWNoZWQgaW5kZXggZmlsZXMuLi4gc2h1dGRvd24gcmVtb3ZlcyBhbGwgbm9uLWNhY2hlZCBpbmRleCBmaWxlcwogCUFycmF5TGlzdCB0b1JlbW92ZSA9IG51bGw7CiAJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmluZGV4ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUlQYXRoIGluZGV4UGF0aCA9IChJUGF0aClpdGVyYXRvci5uZXh0KCk7CisJCUlQYXRoIGluZGV4UGF0aCA9IChJUGF0aCkgaXRlcmF0b3IubmV4dCgpOwogCQlpZiAocGF0aC5pc1ByZWZpeE9mKGluZGV4UGF0aCkpIHsKLQkJCWlmICh0b1JlbW92ZSA9PSBudWxsKSB7CisJCQlpZiAodG9SZW1vdmUgPT0gbnVsbCkKIAkJCQl0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCX0KIAkJCXRvUmVtb3ZlLmFkZChpbmRleFBhdGgpOwogCQl9CiAJfQotCWlmICh0b1JlbW92ZSAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0b1JlbW92ZS5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdGhpcy5yZW1vdmVJbmRleCgoSVBhdGgpdG9SZW1vdmUuZ2V0KGkpKTsKLQkJfQotCX0KKwlpZiAodG9SZW1vdmUgIT0gbnVsbCkKKwkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRvUmVtb3ZlLnNpemUoKTsgaSA8IGxlbmd0aDsgaSsrKQorCQkJdGhpcy5yZW1vdmVJbmRleCgoSVBhdGgpIHRvUmVtb3ZlLmdldChpKSk7CiB9CiAvKioKICAqIFJlbW92ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gc291cmNlIGZvbGRlciBmcm9tIHRoZSBpbmRleC4KICAqLwotcHVibGljIHZvaWQgcmVtb3ZlU291cmNlRm9sZGVyRnJvbUluZGV4KEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUGF0aCBzb3VyY2VGb2xkZXIpIHsKLQl0aGlzLnJlcXVlc3QobmV3IFJlbW92ZUZvbGRlckZyb21JbmRleChzb3VyY2VGb2xkZXIudG9TdHJpbmcoKSwgamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCksIHRoaXMpKTsKLX0KK3B1YmxpYyB2b2lkIHJlbW92ZVNvdXJjZUZvbGRlckZyb21JbmRleChKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVBhdGggc291cmNlRm9sZGVyLCBjaGFyW11bXSBleGNsdXNpb25QYXR0ZXJucykgeworCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7CisJaWYgKHRoaXMuam9iRW5kID4gdGhpcy5qb2JTdGFydCkgeworCQkvLyBjaGVjayBpZiBhIGpvYiB0byBpbmRleCB0aGUgcHJvamVjdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcXVldWUKKwkJSW5kZXhSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgSW5kZXhBbGxQcm9qZWN0KHByb2plY3QsIHRoaXMpOworCQlmb3IgKGludCBpID0gdGhpcy5qb2JFbmQ7IGkgPiB0aGlzLmpvYlN0YXJ0OyBpLS0pIC8vIE5COiBkb24ndCBjaGVjayBqb2IgYXQgam9iU3RhcnQsIGFzIGl0IG1heSBoYXZlIGFscmVhZHkgc3RhcnRlZCAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDg4KQorCQkJaWYgKHJlcXVlc3QuZXF1YWxzKHRoaXMuYXdhaXRpbmdKb2JzW2ldKSkgcmV0dXJuOworCX0KIAorCXRoaXMucmVxdWVzdChuZXcgUmVtb3ZlRm9sZGVyRnJvbUluZGV4KHNvdXJjZUZvbGRlciwgZXhjbHVzaW9uUGF0dGVybnMsIHByb2plY3QsIHRoaXMpKTsKK30KIC8qKgogICogRmx1c2ggY3VycmVudCBzdGF0ZQogICovCi1wdWJsaWMgdm9pZCByZXNldCgpewotCi0JSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JaWYgKHdvcmtzcGFjZSAhPSBudWxsKXsKLQkJLy8gZm9yY2UgdG8gcmVzb2x2ZSBjbGFzc3BhdGhzIGZvciBwcm9qZWN0cyB0byBjaGVjaywgc28gYXMgdG8gYXZvaWQgcnVubmluZyBDUCB2YXJpYWJsZSBpbml0aWFsaXplcnMgaW4gdGhlIGJhY2tncm91bmQgdGhyZWFkCi0JCXRoaXMucHJvamVjdHNUb0NoZWNrID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5wcm9qZWN0c1RvQ2hlY2sgPT0gbnVsbCA/IDAgOiB0aGlzLnByb2plY3RzVG9DaGVjay5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3RzVG9DaGVja1tpXSk7Ci0JCQl0cnkgewotCQkJCS8vIGZvcmNlIHRvIHJlc29sdmUgQ1AgdmFyaWFibGVzIGJlZm9yZSBjYWxsaW5nIGluZGV4ZXIgLSAxOTMwMyAoaW5kaXJlY3RseSB0aHJvdWdoIGNvbnNpc3RlbmN5IGNoZWNrKQotCQkJCXByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IAotCX0KK3B1YmxpYyB2b2lkIHJlc2V0KCkgewogCXN1cGVyLnJlc2V0KCk7Ci0JaWYgKGluZGV4ZXMgIT0gbnVsbCl7Ci0JCWluZGV4ZXMgPSBuZXcgSGFzaE1hcCg1KTsKLQkJbW9uaXRvcnMgPSBuZXcgSGFzaE1hcCg1KTsKKwlpZiAodGhpcy5pbmRleGVzICE9IG51bGwpIHsKKwkJdGhpcy5pbmRleGVzID0gbmV3IEhhc2hNYXAoNSk7CisJCXRoaXMubW9uaXRvcnMgPSBuZXcgSGFzaE1hcCg1KTsKKwkJdGhpcy5pbmRleFN0YXRlcyA9IG51bGw7CiAJfQotCWphdmFQbHVnaW5Mb2NhdGlvbiA9IG51bGw7CisJdGhpcy5pbmRleE5hbWVzID0gbmV3IFNpbXBsZUxvb2t1cFRhYmxlKCk7CisJdGhpcy5qYXZhUGx1Z2luTG9jYXRpb24gPSBudWxsOworfQorcHVibGljIHZvaWQgc2F2ZUluZGV4KElJbmRleCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvLyBtdXN0IGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSBmcm9tIHRoZSB3cml0ZSBtb25pdG9yCisJaWYgKGluZGV4Lmhhc0NoYW5nZWQoKSkgeworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gc2F2aW5nIGluZGV4ICIgKyBpbmRleC5nZXRJbmRleEZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJaW5kZXguc2F2ZSgpOworCX0KKwlTdHJpbmcgaW5kZXhOYW1lID0gaW5kZXguZ2V0SW5kZXhGaWxlKCkuZ2V0UGF0aCgpOworCWlmICh0aGlzLmpvYkVuZCA+IHRoaXMuam9iU3RhcnQpIHsKKwkJT2JqZWN0IGluZGV4UGF0aCA9IGluZGV4TmFtZXMua2V5Rm9yVmFsdWUoaW5kZXhOYW1lKTsKKwkJaWYgKGluZGV4UGF0aCAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gdGhpcy5qb2JFbmQ7IGkgPiB0aGlzLmpvYlN0YXJ0OyBpLS0pIHsgLy8gc2tpcCB0aGUgY3VycmVudCBqb2IKKwkJCQlJSm9iIGpvYiA9IHRoaXMuYXdhaXRpbmdKb2JzW2ldOworCQkJCWlmIChqb2IgaW5zdGFuY2VvZiBJbmRleFJlcXVlc3QpCisJCQkJCWlmICgoKEluZGV4UmVxdWVzdCkgam9iKS5pbmRleFBhdGguZXF1YWxzKGluZGV4UGF0aCkpIHJldHVybjsKKwkJCX0KKwkJfQorCX0KKwl1cGRhdGVJbmRleFN0YXRlKGluZGV4TmFtZSwgU0FWRURfU1RBVEUpOwogfQogLyoqCiAgKiBDb21taXQgYWxsIGluZGV4IG1lbW9yeSBjaGFuZ2VzIHRvIGRpc2sKICAqLwotcHVibGljIHZvaWQgc2F2ZUluZGV4ZXMoKXsKLQotCUFycmF5TGlzdCBpbmRleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3luY2hyb25pemVkKHRoaXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmRleGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0JCQlpbmRleExpc3QuYWRkKGl0ZXIubmV4dCgpKTsKK3B1YmxpYyB2b2lkIHNhdmVJbmRleGVzKCkgeworCS8vIG9ubHkgc2F2ZSBjYWNoZWQgaW5kZXhlcy4uLiB0aGUgcmVzdCB3ZXJlIG5vdCBtb2RpZmllZAorCUFycmF5TGlzdCB0b1NhdmUgPSBuZXcgQXJyYXlMaXN0KCk7CisJc3luY2hyb25pemVkKHRoaXMpIHsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5pbmRleGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKKwkJCWlmIChvIGluc3RhbmNlb2YgSUluZGV4KQorCQkJCXRvU2F2ZS5hZGQobyk7CiAJCX0KIAl9CiAKLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmRleExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsJCQotCQlJSW5kZXggaW5kZXggPSAoSUluZGV4KWl0ZXIubmV4dCgpOwotCQlpZiAoaW5kZXggPT0gbnVsbCkgY29udGludWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRvU2F2ZS5zaXplKCk7IGkgPCBsZW5ndGg7IGkrKykgeworCQlJSW5kZXggaW5kZXggPSAoSUluZGV4KSB0b1NhdmUuZ2V0KGkpOwogCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBnZXRNb25pdG9yRm9yKGluZGV4KTsKIAkJaWYgKG1vbml0b3IgPT0gbnVsbCkgY29udGludWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCiAJCXRyeSB7CiAJCQltb25pdG9yLmVudGVyV3JpdGUoKTsKLQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSl7Ci0JCQkJaWYgKGluZGV4Lmhhc0NoYW5nZWQoKSl7IAotCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IG1lcmdpbmcgaW5kZXggIiArIGluZGV4LmdldEluZGV4RmlsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KIAkJCXRyeSB7Ci0JCQkJaW5kZXguc2F2ZSgpOworCQkJCXNhdmVJbmRleChpbmRleCk7CiAJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJCWlmIChJbmRleE1hbmFnZXIuVkVSQk9TRSkgewotCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IGdvdCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiB3aGlsZSBtZXJnaW5nOiIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKFZFUkJPU0UpIHsKKwkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBnb3QgdGhlIGZvbGxvd2luZyBleGNlcHRpb24gd2hpbGUgc2F2aW5nOiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQkJfQotCQkJCS8vb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5sb2coZSk7CisJCQkJLy9VdGlsLmxvZyhlKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW1vbml0b3IuZXhpdFdyaXRlKCk7CkBAIC00MjYsNjUgKzUwMCwxMDMgQEAKIAl9CiAJbmVlZFRvU2F2ZSA9IGZhbHNlOwogfQotCiBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkKLQlIYXNoTWFwIGtlZXBpbmdJbmRleGVzUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCUluZGV4U2VsZWN0b3IgaW5kZXhTZWxlY3RvciA9IG5ldyBJbmRleFNlbGVjdG9yKG5ldyBKYXZhV29ya3NwYWNlU2NvcGUoKSwgbnVsbCwgdGhpcyk7CisJaWYgKFZFUkJPU0UpCisJCUpvYk1hbmFnZXIudmVyYm9zZSgiU2h1dGRvd24iKTsgLy8kTk9OLU5MUy0xJAorCisJSW5kZXhTZWxlY3RvciBpbmRleFNlbGVjdG9yID0gbmV3IEluZGV4U2VsZWN0b3IobmV3IEphdmFXb3Jrc3BhY2VTY29wZSgpLCBudWxsLCBmYWxzZSwgdGhpcyk7CiAJSUluZGV4W10gc2VsZWN0ZWRJbmRleGVzID0gaW5kZXhTZWxlY3Rvci5nZXRJbmRleGVzKCk7CisJU2ltcGxlTG9va3VwVGFibGUga25vd25QYXRocyA9IG5ldyBTaW1wbGVMb29rdXBUYWJsZSgpOwogCWZvciAoaW50IGkgPSAwLCBtYXggPSBzZWxlY3RlZEluZGV4ZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKIAkJU3RyaW5nIHBhdGggPSBzZWxlY3RlZEluZGV4ZXNbaV0uZ2V0SW5kZXhGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWtlZXBpbmdJbmRleGVzUGF0aHMucHV0KHBhdGgsIHBhdGgpOworCQlrbm93blBhdGhzLnB1dChwYXRoLCBwYXRoKTsKIAl9Ci0JRmlsZSBpbmRleGVzRGlyZWN0b3J5ID0gbmV3IEZpbGUodGhpcy5nZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKKworCWlmIChpbmRleFN0YXRlcyAhPSBudWxsKSB7CisJCU9iamVjdFtdIGluZGV4TmFtZXMgPSBpbmRleFN0YXRlcy5rZXlUYWJsZTsKKwkJZm9yIChpbnQgaSA9IDAsIGwgPSBpbmRleE5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGluZGV4TmFtZXNbaV07CisJCQlpZiAoa2V5ICE9IG51bGwgJiYgIWtub3duUGF0aHMuY29udGFpbnNLZXkoa2V5KSkKKwkJCQl1cGRhdGVJbmRleFN0YXRlKGtleSwgbnVsbCk7CisJCX0KKwl9CisKKwlGaWxlIGluZGV4ZXNEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXRKYXZhUGx1Z2luV29ya2luZ0xvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKIAlpZiAoaW5kZXhlc0RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CiAJCUZpbGVbXSBpbmRleGVzRmlsZXMgPSBpbmRleGVzRGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMCwgaW5kZXhlc0ZpbGVzTGVuZ3RoID0gaW5kZXhlc0ZpbGVzLmxlbmd0aDsgaSA8IGluZGV4ZXNGaWxlc0xlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBpbmRleGVzRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlpZiAoZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikgJiYga2VlcGluZ0luZGV4ZXNQYXRocy5nZXQoZmlsZU5hbWUpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChWRVJCT1NFKSB7Ci0JCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRGVsZXRpbmcgaW5kZXggZmlsZSAiICsgaW5kZXhlc0ZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaW5kZXhlc0ZpbGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBpbmRleGVzRmlsZXNMZW5ndGggPSBpbmRleGVzRmlsZXMubGVuZ3RoOyBpIDwgaW5kZXhlc0ZpbGVzTGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgZmlsZU5hbWUgPSBpbmRleGVzRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQkJaWYgKCFrbm93blBhdGhzLmNvbnRhaW5zS2V5KGZpbGVOYW1lKSAmJiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChWRVJCT1NFKQorCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCJEZWxldGluZyBpbmRleCBmaWxlICIgKyBpbmRleGVzRmlsZXNbaV0pOyAvLyROT04tTkxTLTEkCisJCQkJCWluZGV4ZXNGaWxlc1tpXS5kZWxldGUoKTsKIAkJCQl9Ci0JCQkJaW5kZXhlc0ZpbGVzW2ldLmRlbGV0ZSgpOwogCQkJfQogCQl9Ci0JCQogCX0KLQlzdXBlci5zaHV0ZG93bigpOwkJCisKKwlzdXBlci5zaHV0ZG93bigpOwogfQogCi0vKioKLSAqIFRyaWdnZXIgYWRkaXRpb24gb2YgYSBsaWJyYXJ5IHRvIGFuIGluZGV4Ci0gKiBOb3RlOiB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gYmFja2dyb3VuZAotICovCi1wdWJsaWMgdm9pZCBpbmRleExpYnJhcnkoSVBhdGggcGF0aCwgSVByb2plY3QgcmVmZXJpbmdQcm9qZWN0KSB7Ci0JaWYgKEphdmFDb3JlLmdldFBsdWdpbigpID09IG51bGwpIHJldHVybjsKLQotCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIHBhdGgsIHRydWUpOwotCQotCUluZGV4UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKLQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJcmVxdWVzdCA9IG5ldyBBZGRKYXJGaWxlVG9JbmRleCgoSUZpbGUpdGFyZ2V0LCB0aGlzLCByZWZlcmluZ1Byb2plY3QuZ2V0TmFtZSgpKTsKLQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZSkgewotCQkvLyByZW1lbWJlciB0aGUgdGltZXN0YW1wIG9mIHRoaXMgbGlicmFyeQotCQlsb25nIHRpbWVzdGFtcCA9IERlbHRhUHJvY2Vzc29yLmdldFRpbWVTdGFtcCgoamF2YS5pby5GaWxlKXRhcmdldCk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yLmV4dGVybmFsVGltZVN0YW1wcy5wdXQocGF0aCwgbmV3IExvbmcodGltZXN0YW1wKSk7Ci0JCXJlcXVlc3QgPSBuZXcgQWRkSmFyRmlsZVRvSW5kZXgocGF0aCwgdGhpcywgcmVmZXJpbmdQcm9qZWN0LmdldE5hbWUoKSk7Ci0JfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCXJlcXVlc3QgPSBuZXcgSW5kZXhCaW5hcnlGb2xkZXIoKElGb2xkZXIpdGFyZ2V0LCB0aGlzLCByZWZlcmluZ1Byb2plY3QpOwotCX0gZWxzZSB7Ci0JCXJldHVybjsKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOworCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7CisJYnVmZmVyLmFwcGVuZCgiSW4tbWVtb3J5IGluZGV4ZXM6XG4iKTsgLy8kTk9OLU5MUy0xJAorCWludCBjb3VudCA9IDA7CisJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5pbmRleGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQlidWZmZXIuYXBwZW5kKCsrY291bnQpLmFwcGVuZCgiIC0gIikuYXBwZW5kKGl0ZXIubmV4dCgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsgLy8kTk9OLU5MUy0xJAogCX0KLQkKLQkvLyBjaGVjayBpZiB0aGUgc2FtZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZQotCWZvciAoaW50IGkgPSB0aGlzLmpvYkVuZDsgaSA+PSB0aGlzLmpvYlN0YXJ0OyBpLS0pIHsKLQkJSUpvYiBhd2FpdGluZyA9IHRoaXMuYXdhaXRpbmdKb2JzW2ldOwotCQlpZiAoYXdhaXRpbmcgIT0gbnVsbCAmJiByZXF1ZXN0LmVxdWFscyhhd2FpdGluZykpIHsKLQkJCXJldHVybjsKKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKK3ByaXZhdGUgY2hhcltdIHJlYWRJbmRleFN0YXRlKCkgeworCXRyeSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVDaGFyQ29udGVudChzYXZlZEluZGV4TmFtZXNGaWxlLCBudWxsKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisJCWlmIChWRVJCT1NFKQorCQkJSm9iTWFuYWdlci52ZXJib3NlKCJGYWlsZWQgdG8gcmVhZCBzYXZlZCBpbmRleCBmaWxlIG5hbWVzIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG5ldyBjaGFyWzBdOworCX0KK30KK3ByaXZhdGUgdm9pZCB1cGRhdGVJbmRleFN0YXRlKFN0cmluZyBpbmRleE5hbWUsIEludGVnZXIgaW5kZXhTdGF0ZSkgeworCWdldEluZGV4U3RhdGVzKCk7IC8vIGVuc3VyZSB0aGUgc3RhdGVzIGFyZSBpbml0aWFsaXplZAorCWlmIChpbmRleFN0YXRlICE9IG51bGwpIHsKKwkJaWYgKGluZGV4U3RhdGUuZXF1YWxzKGluZGV4U3RhdGVzLmdldChpbmRleE5hbWUpKSkgcmV0dXJuOyAvLyBub3QgY2hhbmdlZAorCQlpbmRleFN0YXRlcy5wdXQoaW5kZXhOYW1lLCBpbmRleFN0YXRlKTsKKwl9IGVsc2UgeworCQlpZiAoIWluZGV4U3RhdGVzLmNvbnRhaW5zS2V5KGluZGV4TmFtZSkpIHJldHVybjsgLy8gZGlkIG5vdCBleGlzdCBhbnl3YXkKKwkJaW5kZXhTdGF0ZXMucmVtb3ZlS2V5KGluZGV4TmFtZSk7CisJfQorCisJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKwl0cnkgeworCQl3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoc2F2ZWRJbmRleE5hbWVzRmlsZSkpOworCQlPYmplY3RbXSBpbmRleE5hbWVzID0gaW5kZXhTdGF0ZXMua2V5VGFibGU7CisJCU9iamVjdFtdIHN0YXRlcyA9IGluZGV4U3RhdGVzLnZhbHVlVGFibGU7CisJCWZvciAoaW50IGkgPSAwLCBsID0gc3RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJaWYgKHN0YXRlc1tpXSA9PSBTQVZFRF9TVEFURSkgeworCQkJCXdyaXRlci53cml0ZSgoU3RyaW5nKSBpbmRleE5hbWVzW2ldKTsKKwkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7CisJCQl9CisJCX0KKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisJCWlmIChWRVJCT1NFKQorCQkJSm9iTWFuYWdlci52ZXJib3NlKCJGYWlsZWQgdG8gd3JpdGUgc2F2ZWQgaW5kZXggZmlsZSBuYW1lcyIpOyAvLyROT04tTkxTLTEkCisJfSBmaW5hbGx5IHsKKwkJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXdyaXRlci5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KIAkJfQogCX0KLQotCXRoaXMucmVxdWVzdChyZXF1ZXN0KTsKKwlpZiAoVkVSQk9TRSkgeworCQlTdHJpbmcgc3RhdGUgPSAiPyI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGluZGV4U3RhdGUgPT0gU0FWRURfU1RBVEUpIHN0YXRlID0gIlNBVkVEIjsgLy8kTk9OLU5MUy0xJAorCQllbHNlIGlmIChpbmRleFN0YXRlID09IFVQREFUSU5HX1NUQVRFKSBzdGF0ZSA9ICJVUERBVElORyI7IC8vJE5PTi1OTFMtMSQKKwkJZWxzZSBpZiAoaW5kZXhTdGF0ZSA9PSBVTktOT1dOX1NUQVRFKSBzdGF0ZSA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAorCQllbHNlIGlmIChpbmRleFN0YXRlID09IFJFQlVJTERJTkdfU1RBVEUpIHN0YXRlID0gIlJFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCisJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gaW5kZXggc3RhdGUgdXBkYXRlZCB0bzogIiArIHN0YXRlICsgIiBmb3I6ICIraW5kZXhOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQogfQogfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4UmVxdWVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9JbmRleFJlcXVlc3QuamF2YQppbmRleCA2NDJhOTg2Li5iMzdhNTBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL0luZGV4UmVxdWVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvSW5kZXhSZXF1ZXN0LmphdmEKQEAgLTEsMjggKzEsNTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5JSm9iOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5kZXhSZXF1ZXN0IGltcGxlbWVudHMgSUpvYiB7Ci0JCi0KLQkKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhbmNlbGxlZCA9IGZhbHNlOworCXByb3RlY3RlZCBJUGF0aCBpbmRleFBhdGg7CisJcHJvdGVjdGVkIEluZGV4TWFuYWdlciBtYW5hZ2VyOwogCi0JLyoKLQkgKiBAc2VlIElKb2IjY2FuY2VsKCkKLQkgKi8KKwlwdWJsaWMgSW5kZXhSZXF1ZXN0KElQYXRoIGluZGV4UGF0aCwgSW5kZXhNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJdGhpcy5pbmRleFBhdGggPSBpbmRleFBhdGg7CisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisJfQorCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJcmV0dXJuIHByb2plY3ROYW1lLmVxdWFscyh0aGlzLmluZGV4UGF0aC5zZWdtZW50KDApKTsKKwl9CiAJcHVibGljIHZvaWQgY2FuY2VsKCkgeworCQl0aGlzLm1hbmFnZXIuam9iV2FzQ2FuY2VsbGVkKHRoaXMuaW5kZXhQYXRoKTsKIAkJdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CiAJfQotCisJcHVibGljIGJvb2xlYW4gaXNSZWFkeVRvUnVuKCkgeworCQkvLyB0YWcgdGhlIGluZGV4IGFzIGluY29uc2lzdGVudAorCQl0aGlzLm1hbmFnZXIuYWJvdXRUb1VwZGF0ZUluZGV4KGluZGV4UGF0aCwgdXBkYXRlZEluZGV4U3RhdGUoKSk7CisJCXJldHVybiB0cnVlOworCX0KKwkvKgorCSAqIFRoaXMgY29kZSBpcyBhc3N1bWVkIHRvIGJlIGludm9rZWQgd2hpbGUgbW9uaXRvciBoYXMgcmVhZCBsb2NrCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElJbmRleCBpbmRleCwgUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvKiBpZiBpbmRleCBoYXMgY2hhbmdlZCwgY29tbWl0IHRoZXNlIGJlZm9yZSBxdWVyeWluZyAqLworCQlpZiAoaW5kZXguaGFzQ2hhbmdlZCgpKSB7CisJCQl0cnkgeworCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKKwkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKKwkJCQl0aGlzLm1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKKwkJCX0gZmluYWxseSB7CisJCQkJbW9uaXRvci5leGl0V3JpdGVFbnRlclJlYWQoKTsgLy8gZmluaXNoZWQgd3JpdGluZyBhbmQgcmVhY3F1aXJlIHJlYWQgcGVybWlzc2lvbgorCQkJfQorCQl9CisJfQorCXByb3RlY3RlZCBJbnRlZ2VyIHVwZGF0ZWRJbmRleFN0YXRlKCkgeworCQlyZXR1cm4gSW5kZXhNYW5hZ2VyLlVQREFUSU5HX1NUQVRFOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVhZFdyaXRlTW9uaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZWFkV3JpdGVNb25pdG9yLmphdmEKaW5kZXggYzE1NmVhYy4uMWQ3NTc1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZWFkV3JpdGVNb25pdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZWFkV3JpdGVNb25pdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmc7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRm9sZGVyRnJvbUluZGV4LmphdmEKaW5kZXggODE2NzVjZi4uZWI4ZmY1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGb2xkZXJGcm9tSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZvbGRlckZyb21JbmRleC5qYXZhCkBAIC0xLDc4ICsxLDY5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JUXVlcnlSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSUpvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5Kb2JNYW5hZ2VyOwogCi1jbGFzcyBSZW1vdmVGb2xkZXJGcm9tSW5kZXggaW1wbGVtZW50cyBJSm9iIHsKLQlTdHJpbmcgZm9sZGVyUGF0aDsKLQlJUGF0aCBpbmRleGVkQ29udGFpbmVyOwotCUluZGV4TWFuYWdlciBtYW5hZ2VyOwotCXB1YmxpYyBSZW1vdmVGb2xkZXJGcm9tSW5kZXgoCi0JCVN0cmluZyBmb2xkZXJQYXRoLAotCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyLAotCQlJbmRleE1hbmFnZXIgbWFuYWdlcikgeworY2xhc3MgUmVtb3ZlRm9sZGVyRnJvbUluZGV4IGV4dGVuZHMgSW5kZXhSZXF1ZXN0IHsKKwlJUGF0aCBmb2xkZXJQYXRoOworCWNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zOworCUlQcm9qZWN0IHByb2plY3Q7CisKKwlwdWJsaWMgUmVtb3ZlRm9sZGVyRnJvbUluZGV4KElQYXRoIGZvbGRlclBhdGgsIGNoYXJbXVtdIGV4Y2x1c2lvblBhdHRlcm5zLCBJUHJvamVjdCBwcm9qZWN0LCBJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQlzdXBlcihwcm9qZWN0LmdldEZ1bGxQYXRoKCksIG1hbmFnZXIpOwogCQl0aGlzLmZvbGRlclBhdGggPSBmb2xkZXJQYXRoOwotCQl0aGlzLmluZGV4ZWRDb250YWluZXIgPSBpbmRleGVkQ29udGFpbmVyOwotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgewotCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyhpbmRleGVkQ29udGFpbmVyLnNlZ21lbnQoMCkpOworCQl0aGlzLmV4Y2x1c2lvblBhdHRlcm5zID0gZXhjbHVzaW9uUGF0dGVybnM7CisJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAJfQogCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gQ09NUExFVEU7Ci0JCQotCQl0cnkgewotCQkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4ZWRDb250YWluZXIsIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIHRydWUgLypjcmVhdGUgaWYgbm9uZSovKTsKLQkJCWlmIChpbmRleCA9PSBudWxsKQotCQkJCXJldHVybiBDT01QTEVURTsKIAotCQkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCi0JCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOwotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCQlyZXR1cm4gQ09NUExFVEU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCi0JCQl0cnkgewotCQkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHJlYWQKLQkJCQlJUXVlcnlSZXN1bHRbXSByZXN1bHRzID0gaW5kZXgucXVlcnlJbkRvY3VtZW50TmFtZXModGhpcy5mb2xkZXJQYXRoKTsgLy8gYWxsIGZpbGUgbmFtZXMgYmVvbmxvbmdpbmcgdG8gdGhlIGZvbGRlciBvciBpdHMgc3ViZm9sZGVycwotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSByZXN1bHRzID09IG51bGwgPyAwIDogcmVzdWx0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXN1bHRzW2ldLmdldFBhdGgoKTsKLQkJCQkJbWFuYWdlci5yZW1vdmUoZmlsZU5hbWUsIHRoaXMuaW5kZXhlZENvbnRhaW5lcik7IC8vIHdyaXRlIGxvY2sgd2lsbCBiZSBhY3F1aXJlZCBieSB0aGUgcmVtb3ZlIG9wZXJhdGlvbgorCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIHRydWU7CisKKwkJLyogZW5zdXJlIG5vIGNvbmN1cnJlbnQgd3JpdGUgYWNjZXNzIHRvIGluZGV4ICovCisJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleFBhdGgsIHRydWUsIC8qcmV1c2UgaW5kZXggZmlsZSovIGZhbHNlIC8qY3JlYXRlIGlmIG5vbmUqLyk7CisJCWlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkgcmV0dXJuIHRydWU7IC8vIGluZGV4IGdvdCBkZWxldGVkIHNpbmNlIGFjcXVpcmVkCisKKwkJdHJ5IHsKKwkJCW1vbml0b3IuZW50ZXJSZWFkKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHJlYWQKKwkJCUlRdWVyeVJlc3VsdFtdIHJlc3VsdHMgPSBpbmRleC5xdWVyeUluRG9jdW1lbnROYW1lcyh0aGlzLmZvbGRlclBhdGgudG9TdHJpbmcoKSk7CisJCQkvLyBhbGwgZmlsZSBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGZvbGRlciBvciBpdHMgc3ViZm9sZGVycyBhbmQgdGhhdCBhcmUgbm90IGV4Y2x1ZGVkIChzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2MDcpCisJCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcmVzdWx0cyA9PSBudWxsID8gMCA6IHJlc3VsdHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKKwkJCQlTdHJpbmcgZG9jdW1lbnRQYXRoID0gcmVzdWx0c1tpXS5nZXRQYXRoKCk7CisJCQkJaWYgKHRoaXMuZXhjbHVzaW9uUGF0dGVybnMgPT0gbnVsbCB8fCAhVXRpbC5pc0V4Y2x1ZGVkKG5ldyBQYXRoKGRvY3VtZW50UGF0aCksIHRoaXMuZXhjbHVzaW9uUGF0dGVybnMpKSB7CisJCQkJCW1hbmFnZXIucmVtb3ZlKGRvY3VtZW50UGF0aCwgdGhpcy5pbmRleFBhdGgpOyAvLyB3cml0ZSBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkgdGhlIHJlbW92ZSBvcGVyYXRpb24KIAkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZXhpdFJlYWQoKTsgLy8gZnJlZSByZWFkIGxvY2sKIAkJCX0KIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgewogCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIHJlbW92ZSAiICsgdGhpcy5mb2xkZXJQYXRoICsgIiBmcm9tIGluZGV4IGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CiAJCQl9Ci0JCQlyZXR1cm4gRkFJTEVEOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5leGl0UmVhZCgpOyAvLyBmcmVlIHJlYWQgbG9jawogCQl9Ci0JCXJldHVybiBDT01QTEVURTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAicmVtb3ZpbmcgZnJvbSBpbmRleCAiICsgdGhpcy5mb2xkZXJQYXRoOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAicmVtb3ZpbmcgIiArIHRoaXMuZm9sZGVyUGF0aCArICIgZnJvbSBpbmRleCAiICsgdGhpcy5pbmRleFBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KLQkvKgotCSAqIEBzZWUgSUpvYiNjYW5jZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLQl9Ci0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRnJvbUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1JlbW92ZUZyb21JbmRleC5qYXZhCmluZGV4IDkyMjdmNDIuLmI0YzRlNTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvUmVtb3ZlRnJvbUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9SZW1vdmVGcm9tSW5kZXguamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNSw1OSArMTUsNDAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLklKb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3NpbmcuSm9iTWFuYWdlcjsKIAotY2xhc3MgUmVtb3ZlRnJvbUluZGV4IGltcGxlbWVudHMgSUpvYiB7CitjbGFzcyBSZW1vdmVGcm9tSW5kZXggZXh0ZW5kcyBJbmRleFJlcXVlc3QgewogCVN0cmluZyByZXNvdXJjZU5hbWU7Ci0JSVBhdGggaW5kZXhlZENvbnRhaW5lcjsKLQlJbmRleE1hbmFnZXIgbWFuYWdlcjsKLQlwdWJsaWMgUmVtb3ZlRnJvbUluZGV4KAotCQlTdHJpbmcgcmVzb3VyY2VOYW1lLAotCQlJUGF0aCBpbmRleGVkQ29udGFpbmVyLAotCQlJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCisJcHVibGljIFJlbW92ZUZyb21JbmRleChTdHJpbmcgcmVzb3VyY2VOYW1lLCBJUGF0aCBpbmRleFBhdGgsIEluZGV4TWFuYWdlciBtYW5hZ2VyKSB7CisJCXN1cGVyKGluZGV4UGF0aCwgbWFuYWdlcik7CiAJCXRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotCQl0aGlzLmluZGV4ZWRDb250YWluZXIgPSBpbmRleGVkQ29udGFpbmVyOwotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oU3RyaW5nIGpvYkZhbWlseSkgewotCQlyZXR1cm4gam9iRmFtaWx5LmVxdWFscyhpbmRleGVkQ29udGFpbmVyLnNlZ21lbnQoMCkpOwogCX0KIAlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIENPTVBMRVRFOwotCQkKLQkJdHJ5IHsKLQkJCUlJbmRleCBpbmRleCA9IG1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleGVkQ29udGFpbmVyLCB0cnVlIC8qcmV1c2UgaW5kZXggZmlsZSovLCB0cnVlIC8qY3JlYXRlIGlmIG5vbmUqLyk7Ci0JCQlpZiAoaW5kZXggPT0gbnVsbCkKLQkJCQlyZXR1cm4gQ09NUExFVEU7CiAKLQkJCS8qIGVuc3VyZSBubyBjb25jdXJyZW50IHdyaXRlIGFjY2VzcyB0byBpbmRleCAqLwotCQkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yRm9yKGluZGV4KTsKLQkJCWlmIChtb25pdG9yID09IG51bGwpCi0JCQkJcmV0dXJuIENPTVBMRVRFOyAvLyBpbmRleCBnb3QgZGVsZXRlZCBzaW5jZSBhY3F1aXJlZAotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmVudGVyV3JpdGUoKTsgLy8gYXNrIHBlcm1pc3Npb24gdG8gd3JpdGUKLQkJCQlpbmRleC5yZW1vdmUocmVzb3VyY2VOYW1lKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5leGl0V3JpdGUoKTsgLy8gZnJlZSB3cml0ZSBsb2NrCi0JCQl9CisJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gdHJ1ZTsKKworCQkvKiBlbnN1cmUgbm8gY29uY3VycmVudCB3cml0ZSBhY2Nlc3MgdG8gaW5kZXggKi8KKwkJSUluZGV4IGluZGV4ID0gbWFuYWdlci5nZXRJbmRleCh0aGlzLmluZGV4UGF0aCwgdHJ1ZSwgLypyZXVzZSBpbmRleCBmaWxlKi8gZmFsc2UgLypjcmVhdGUgaWYgbm9uZSovKTsKKwkJaWYgKGluZGV4ID09IG51bGwpIHJldHVybiB0cnVlOworCQlSZWFkV3JpdGVNb25pdG9yIG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQlpZiAobW9uaXRvciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKworCQl0cnkgeworCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQlpbmRleC5yZW1vdmUocmVzb3VyY2VOYW1lKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgewogCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIHJlbW92ZSAiICsgdGhpcy5yZXNvdXJjZU5hbWUgKyAiIGZyb20gaW5kZXggYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCX0KLQkJCXJldHVybiBGQUlMRUQ7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQltb25pdG9yLmV4aXRXcml0ZSgpOyAvLyBmcmVlIHdyaXRlIGxvY2sKIAkJfQotCQlyZXR1cm4gQ09NUExFVEU7CisJCXJldHVybiB0cnVlOwogCX0KIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gInJlbW92aW5nIGZyb20gaW5kZXggIiArIHJlc291cmNlTmFtZTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gInJlbW92aW5nICIgKyB0aGlzLnJlc291cmNlTmFtZSArICIgZnJvbSBpbmRleCAiICsgdGhpcy5pbmRleFBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KLQkvKgotCSAqIEBzZWUgSUpvYiNjYW5jZWwoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1NhdmVJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9TYXZlSW5kZXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjZjZGFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9pbmRleGluZy9TYXZlSW5kZXguamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5wcm9jZXNzaW5nLkpvYk1hbmFnZXI7CisKKy8qCisgKiBTYXZlIHRoZSBpbmRleCBvZiBhIHByb2plY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBTYXZlSW5kZXggZXh0ZW5kcyBJbmRleFJlcXVlc3QgeworCXB1YmxpYyBTYXZlSW5kZXgoSVBhdGggaW5kZXhQYXRoLCBJbmRleE1hbmFnZXIgbWFuYWdlcikgeworCQlzdXBlcihpbmRleFBhdGgsIG1hbmFnZXIpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisKKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiB0cnVlOworCisJCS8qIGVuc3VyZSBubyBjb25jdXJyZW50IHdyaXRlIGFjY2VzcyB0byBpbmRleCAqLworCQlJSW5kZXggaW5kZXggPSB0aGlzLm1hbmFnZXIuZ2V0SW5kZXgodGhpcy5pbmRleFBhdGgsIHRydWUgLypyZXVzZSBpbmRleCBmaWxlKi8sIGZhbHNlIC8qZG9uJ3QgY3JlYXRlIGlmIG5vbmUqLyk7CisJCWlmIChpbmRleCA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJUmVhZFdyaXRlTW9uaXRvciBtb25pdG9yID0gdGhpcy5tYW5hZ2VyLmdldE1vbml0b3JGb3IoaW5kZXgpOworCQlpZiAobW9uaXRvciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsgLy8gaW5kZXggZ290IGRlbGV0ZWQgc2luY2UgYWNxdWlyZWQKKworCQl0cnkgeworCQkJbW9uaXRvci5lbnRlcldyaXRlKCk7IC8vIGFzayBwZXJtaXNzaW9uIHRvIHdyaXRlCisJCQl0aGlzLm1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJaWYgKEpvYk1hbmFnZXIuVkVSQk9TRSkgeworCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZmFpbGVkIHRvIHNhdmUgaW5kZXggIiArIHRoaXMuaW5kZXhQYXRoICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5leGl0V3JpdGUoKTsgLy8gZnJlZSB3cml0ZSBsb2NrCisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAic2F2aW5nIGluZGV4IGZvciAiICsgdGhpcy5pbmRleFBhdGg7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1NvdXJjZUluZGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhCmluZGV4IDdlMGFmNTguLmY3ZGJhZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlci5qYXZhCkBAIC0xLDE4ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlNvdXJjZUVsZW1lbnRQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwpAQCAtMzcsNyArMzgsMTIgQEAKIAkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZJTEVfVFlQRVM9IG5ldyBTdHJpbmdbXSB7ImphdmEifTsgLy8kTk9OLU5MUy0xJAogCXByb3RlY3RlZCBEZWZhdWx0UHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3Rvcnk9IG5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSk7CisJSUZpbGUgcmVzb3VyY2VGaWxlOwogCQorU291cmNlSW5kZXhlcihJRmlsZSByZXNvdXJjZUZpbGUpCXsKKwl0aGlzLnJlc291cmNlRmlsZSA9IHJlc291cmNlRmlsZTsKK30KKwogLyoqCiAgKiBSZXR1cm5zIHRoZSBmaWxlIHR5cGVzIHRoZSA8Y29kZT5JSW5kZXhlcjwvY29kZT4gaGFuZGxlcy4KICAqLwpAQCAtNTIsNyArNTgsMTEgQEAKIAogCS8vIENyZWF0ZSBhIG5ldyBQYXJzZXIKIAlTb3VyY2VJbmRleGVyUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBTb3VyY2VJbmRleGVyUmVxdWVzdG9yKHRoaXMsIGRvY3VtZW50KTsKLQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IG5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKHJlcXVlc3RvciwgcHJvYmxlbUZhY3RvcnksIG5ldyBDb21waWxlck9wdGlvbnMoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKSwgdHJ1ZSk7IC8vIGluZGV4IGxvY2FsIGRlY2xhcmF0aW9ucworCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0gbmV3IFNvdXJjZUVsZW1lbnRQYXJzZXIoCisJCXJlcXVlc3RvciwgCisJCXByb2JsZW1GYWN0b3J5LCAKKwkJbmV3IENvbXBpbGVyT3B0aW9ucyhKYXZhQ29yZS5jcmVhdGUodGhpcy5yZXNvdXJjZUZpbGUuZ2V0UHJvamVjdCgpKS5nZXRPcHRpb25zKHRydWUpKSwgCisJCXRydWUpOyAvLyBpbmRleCBsb2NhbCBkZWNsYXJhdGlvbnMKIAogCS8vIExhdW5jaCB0aGUgcGFyc2VyCiAJY2hhcltdIHNvdXJjZSA9IG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL2luZGV4aW5nL1NvdXJjZUluZGV4ZXJSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhCmluZGV4IGYzZTMxNmUuLjg0NDZkNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvaW5kZXhpbmcvU291cmNlSW5kZXhlclJlcXVlc3Rvci5qYXZhCkBAIC0xLDE4ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7CiAKIC8qKgpAQCAtMTM1LDYgKzEzNSw5IEBACiAJLy8gZWxpbWluYXRlIHBvc3NpYmxlIHF1YWxpZmljYXRpb25zLCBnaXZlbiB0aGV5IG5lZWQgdG8gYmUgZnVsbHkgcmVzb2x2ZWQgYWdhaW4KIAlpZiAoc3VwZXJjbGFzcyAhPSBudWxsKXsKIAkJc3VwZXJjbGFzcyA9IENoYXJPcGVyYXRpb24ubGFzdFNlZ21lbnQoc3VwZXJjbGFzcywgJy4nKTsKKwkJCisJCS8vIGFkZCBpbXBsaWNpdCBjb25zdHJ1Y3RvciByZWZlcmVuY2UgdG8gZGVmYXVsdCBjb25zdHJ1Y3RvcgorCQl0aGlzLmluZGV4ZXIuYWRkQ29uc3RydWN0b3JSZWZlcmVuY2Uoc3VwZXJjbGFzcywgMCk7CiAJfQogCWlmIChzdXBlcmludGVyZmFjZXMgIT0gbnVsbCl7CiAJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBzdXBlcmludGVyZmFjZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspewpAQCAtMjIxLDcgKzIyNCw3IEBACiAvKioKICAqIGV4aXRGaWVsZCBtZXRob2QgY29tbWVudC4KICAqLwotcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBkZWNsYXJhdGlvbkVuZCkgeworcHVibGljIHZvaWQgZXhpdEZpZWxkKGludCBpbml0aWFsaXphdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGludCBkZWNsYXJhdGlvblNvdXJjZUVuZCkgewogCXRoaXMubWV0aG9kRGVwdGgtLTsKIH0KIC8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9BbmRQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YQppbmRleCA0MzA5NmUwLi4yYWU3MTkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0FuZFBhdHRlcm4uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NsYXNzcGF0aFNvdXJjZURpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9DbGFzc3BhdGhTb3VyY2VEaXJlY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc4MWQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9DbGFzc3BhdGhTb3VyY2VEaXJlY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuQ2xhc3NwYXRoTG9jYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUudXRpbC5TaW1wbGVMb29rdXBUYWJsZTsKKworcHVibGljIGNsYXNzIENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSBleHRlbmRzIENsYXNzcGF0aExvY2F0aW9uIHsKKworCUlDb250YWluZXIgc291cmNlRm9sZGVyOworCVN0cmluZyBzb3VyY2VMb2NhdGlvbjsgCisJU3RyaW5nIGVuY29kaW5nOworCVNpbXBsZUxvb2t1cFRhYmxlIGRpcmVjdG9yeUNhY2hlOworCVN0cmluZ1tdIG1pc3NpbmdQYWNrYWdlSG9sZGVyID0gbmV3IFN0cmluZ1sxXTsKKworQ2xhc3NwYXRoU291cmNlRGlyZWN0b3J5KElDb250YWluZXIgc291cmNlRm9sZGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKKwl0aGlzLnNvdXJjZUZvbGRlciA9IHNvdXJjZUZvbGRlcjsKKwlJUGF0aCBsb2NhdGlvbiA9IHNvdXJjZUZvbGRlci5nZXRMb2NhdGlvbigpOworCXRoaXMuc291cmNlTG9jYXRpb24gPSBsb2NhdGlvbiAhPSBudWxsID8gbG9jYXRpb24uYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKKwl0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CQorCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7Cit9CisKK3B1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisJdGhpcy5kaXJlY3RvcnlDYWNoZSA9IG51bGw7Cit9CisKK1N0cmluZ1tdIGRpcmVjdG9yeUxpc3QoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJU3RyaW5nW10gZGlyTGlzdCA9IChTdHJpbmdbXSkgZGlyZWN0b3J5Q2FjaGUuZ2V0KHF1YWxpZmllZFBhY2thZ2VOYW1lKTsKKwlpZiAoZGlyTGlzdCA9PSBtaXNzaW5nUGFja2FnZUhvbGRlcikgcmV0dXJuIG51bGw7IC8vIHBhY2thZ2UgZXhpc3RzIGluIGFub3RoZXIgY2xhc3NwYXRoIGRpcmVjdG9yeSBvciBqYXIKKwlpZiAoZGlyTGlzdCAhPSBudWxsKSByZXR1cm4gZGlyTGlzdDsKKworCXRyeSB7CisJCUlSZXNvdXJjZSBjb250YWluZXIgPSBzb3VyY2VGb2xkZXIuZmluZE1lbWJlcihxdWFsaWZpZWRQYWNrYWdlTmFtZSk7IC8vIHRoaXMgaXMgYSBjYXNlLXNlbnNpdGl2ZSBjaGVjaworCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUNvbnRhaW5lcikgY29udGFpbmVyKS5tZW1iZXJzKCk7CisJCQlkaXJMaXN0ID0gbmV3IFN0cmluZ1ttZW1iZXJzLmxlbmd0aF07CisJCQlpbnQgaW5kZXggPSAwOworCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBtZW1iZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworCQkJCUlSZXNvdXJjZSBtID0gbWVtYmVyc1tpXTsKKwkJCQlTdHJpbmcgbmFtZTsKKwkJCQlpZiAobS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgVXRpbC5pc0phdmFGaWxlTmFtZShuYW1lID0gbS5nZXROYW1lKCkpKQorCQkJCQlkaXJMaXN0W2luZGV4KytdID0gbmFtZTsKKwkJCX0KKwkJCWlmIChpbmRleCA8IGRpckxpc3QubGVuZ3RoKQorCQkJCVN5c3RlbS5hcnJheWNvcHkoZGlyTGlzdCwgMCwgZGlyTGlzdCA9IG5ldyBTdHJpbmdbaW5kZXhdLCAwLCBpbmRleCk7CisJCQlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIGRpckxpc3QpOworCQkJcmV0dXJuIGRpckxpc3Q7CisJCX0KKwl9IGNhdGNoKENvcmVFeGNlcHRpb24gaWdub3JlZCkgeworCX0KKwlkaXJlY3RvcnlDYWNoZS5wdXQocXVhbGlmaWVkUGFja2FnZU5hbWUsIG1pc3NpbmdQYWNrYWdlSG9sZGVyKTsKKwlyZXR1cm4gbnVsbDsKK30KKworYm9vbGVhbiBkb2VzRmlsZUV4aXN0KFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJU3RyaW5nW10gZGlyTGlzdCA9IGRpcmVjdG9yeUxpc3QocXVhbGlmaWVkUGFja2FnZU5hbWUpOworCWlmIChkaXJMaXN0ID09IG51bGwpIHJldHVybiBmYWxzZTsgLy8gbW9zdCBjb21tb24gY2FzZQorCisJZm9yIChpbnQgaSA9IGRpckxpc3QubGVuZ3RoOyAtLWkgPj0gMDspCisJCWlmIChmaWxlTmFtZS5lcXVhbHMoZGlyTGlzdFtpXSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3B1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworCWlmICghKG8gaW5zdGFuY2VvZiBDbGFzc3BhdGhTb3VyY2VEaXJlY3RvcnkpKSByZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gc291cmNlRm9sZGVyLmVxdWFscygoKENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSkgbykuc291cmNlRm9sZGVyKTsKK30gCisKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZENsYXNzKFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkU291cmNlRmlsZU5hbWUpIHsKKwlpZiAoIWRvZXNGaWxlRXhpc3Qoc291cmNlRmlsZU5hbWUsIHF1YWxpZmllZFBhY2thZ2VOYW1lKSkgcmV0dXJuIG51bGw7IC8vIG1vc3QgY29tbW9uIGNhc2UKKworCVN0cmluZyBmdWxsU291cmNlUGF0aCA9IHRoaXMuc291cmNlTG9jYXRpb24gKyBxdWFsaWZpZWRTb3VyY2VGaWxlTmFtZTsKKwlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihuZXcgQ29tcGlsYXRpb25Vbml0KG51bGwsIGZ1bGxTb3VyY2VQYXRoLCB0aGlzLmVuY29kaW5nKSk7Cit9CisKK3B1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgeworCXJldHVybiBzb3VyY2VGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworfQorCitwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoU3RyaW5nIHF1YWxpZmllZFBhY2thZ2VOYW1lKSB7CisJcmV0dXJuIGRpcmVjdG9yeUxpc3QocXVhbGlmaWVkUGFja2FnZU5hbWUpICE9IG51bGw7Cit9CisKK3B1YmxpYyB2b2lkIHJlc2V0KCkgeworCXRoaXMuZGlyZWN0b3J5Q2FjaGUgPSBuZXcgU2ltcGxlTG9va3VwVGFibGUoNSk7Cit9CisKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJTb3VyY2UgY2xhc3NwYXRoIGRpcmVjdG9yeSAiICsgc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IDQxYzE3YjEuLmFiM2I5MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JEZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsMTggKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKQEAgLTIxLDcgKzIyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklFbnRyeVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleGVkRmlsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0NvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IGYzZjM3OWQuLjZjMzE0M2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvQ29uc3RydWN0b3JSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Db25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMSwyNiArMSwyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFsbG9jYXRpb25FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOwpAQCAtODgsNiArODksMTYgQEAKIAkJCWlzQ2FzZVNlbnNpdGl2ZSk7CiB9CiAvKioKKyAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaENvbnRhaW5lcigpCisgKi8KK3Byb3RlY3RlZCBpbnQgbWF0Y2hDb250YWluZXIoKSB7CisJcmV0dXJuIAorCQlDT01QSUxBVElPTl9VTklUIC8vIGltcGxpY2l0IGNvbnN0cnVjdG9yIGNhbGw6IGNhc2Ugb2YgWSBleHRlbmRzIFggYW5kIFkgZG9lc24ndCBkZWZpbmUgYW55IGNvbnN0cnVjdG9yCisJCXwgQ0xBU1MgLy8gaW1wbGljaXQgY29uc3RydWN0b3IgY2FsbDogY2FzZSBvZiBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiB3aXRoIG5vIGV4cGxpY2l0IHN1cGVyIGNhbGwKKwkJfCBNRVRIT0QgLy8gcmVmZXJlbmNlIGluIGFub3RoZXIgY29uc3RydWN0b3IKKwkJfCBGSUVMRDsgLy8gYW5vbnltb3VzIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIKK30KKy8qKgogICogQHNlZSBTZWFyY2hQYXR0ZXJuI21hdGNoSW5kZXhFbnRyeQogICovCiBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEluZGV4RW50cnkoKSB7CkBAIC0xODgsMTcgKzE5OSwzMyBAQAogCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChBbGxvY2F0aW9uRXhwcmVzc2lvbilub2RlLCByZXNvbHZlKTsKIAl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCkgewogCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKChFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbClub2RlLCByZXNvbHZlKTsKKwl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pbm9kZSwgcmVzb2x2ZSk7CisJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKFR5cGVEZWNsYXJhdGlvbilub2RlLCByZXNvbHZlKTsKIAl9CiAJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CiB9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaGFzIGFuIGltcGxpY2l0IGNvbnN0cnVjdG9yIHJlZmVyZW5jZSB0aGF0IG1hdGNoZXMKKyAqIHRoaXMgY29uc3RydWN0b3IgcGF0dGVybi4KKyAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuCisgKi8KK3ByaXZhdGUgaW50IG1hdGNoTGV2ZWwoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciwgYm9vbGVhbiByZXNvbHZlKSB7CisJRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY29uc3RydWN0b3JDYWxsID0gY29uc3RydWN0b3IuY29uc3RydWN0b3JDYWxsOworCWlmIChjb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCAmJiBjb25zdHJ1Y3RvckNhbGwuYWNjZXNzTW9kZSA9PSBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbC5JbXBsaWNpdFN1cGVyKSB7CisJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoY29uc3RydWN0b3JDYWxsLCByZXNvbHZlKTsKKwl9IGVsc2UgeworCQkvLyBFbGltaW5hdGUgZXhwbGljaXQgc3VwZXIgY2FsbCBhcyBpdCB3aWxsIGJlIHRyZWF0ZWQgd2l0aCBtYXRjaExldmVsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLCBib29sZWFuKQorCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwl9Cit9CiAKIC8qKgogICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29uc3RydWN0b3IgcGF0dGVybiAgbWF0Y2hlcyB0aGUgZ2l2ZW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbC4KICAqIExvb2sgYXQgcmVzb2x2ZWQgaW5mb3JtYXRpb24gb25seSBpZiBzcGVjaWZpZWQuCiAgKi8KIHByaXZhdGUgaW50IG1hdGNoTGV2ZWwoRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgY2FsbCwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JLy8gVEJEOiBjb25zdHJ1Y3RvciBuYW1lIGlzIHN1cGVyIHNpbXBsZSB0eXBlIG5hbWUKLQogCWlmIChyZXNvbHZlKSB7CiAJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoY2FsbC5iaW5kaW5nKTsKIAl9IGVsc2UgewpAQCAtMjEyLDYgKzIzOSwzMCBAQAogCQlyZXR1cm4gdGhpcy5uZWVkc1Jlc29sdmUgPyBQT1NTSUJMRV9NQVRDSCA6IEFDQ1VSQVRFX01BVENIOwogCX0KIH0KKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uIGhhcyBhbiBpbXBsaWNpdCBjb25zdHJ1Y3RvciByZWZlcmVuY2UgdGhhdCBtYXRjaGVzCisgKiB0aGlzIGNvbnN0cnVjdG9yIHBhdHRlcm4uCisgKiBMb29rIGF0IHJlc29sdmVkIGluZm9ybWF0aW9uIG9ubHkgaWYgc3BlY2lmaWVkLgorICovCitwcml2YXRlIGludCBtYXRjaExldmVsKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBib29sZWFuIHJlc29sdmUpIHsKKwlpZiAocmVzb2x2ZSkgeworCQkvLyBmaW5kIGRlZmF1bHQgY29uc3RydWN0b3IKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZHMgPSB0eXBlLm1ldGhvZHM7CisJCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJCWlmIChtZXRob2QuaXNEZWZhdWx0Q29uc3RydWN0b3IoKQorCQkJCQkJJiYgbWV0aG9kLnNvdXJjZVN0YXJ0IDwgdHlwZS5ib2R5U3RhcnQpIHsgLy8gaWYgc3ludGhldGljCisJCQkJCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pbWV0aG9kLCB0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7CisJfSBlbHNlIHsKKwkJLy8gTmVlZCB0byB3YWl0IGZvciBhbGwgdGhlIGNvbnN0cnVjdG9yIGJvZGllcyB0byBoYXZlIGJlZW4gcGFyc2VkCisJCXJldHVybiB0aGlzLm5lZWRzUmVzb2x2ZSA/IFBPU1NJQkxFX01BVENIIDogQUNDVVJBVEVfTUFUQ0g7CisJfQorfQogCiAvKioKICAqIEBzZWUgU2VhcmNoUGF0dGVybiNtYXRjaExldmVsKEJpbmRpbmcgYmluZGluZykuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCmluZGV4IDg2Mjk0MDMuLjAwMWExYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwpAQCAtMzAsNyArMzEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuRmllbGRCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlNvdXJjZVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBEZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHNQYXR0ZXJuIGV4dGVuZHMgRmllbGRSZWZlcmVuY2VQYXR0ZXJuIHsKIAlIYXNoU2V0IGtub3duRmllbGRzOwpAQCAtOTMsNyArOTMsNyBAQAogCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQobmV3IFN0cmluZyhuYW1lKSk7CiAJaWYgKHRoaXMua25vd25GaWVsZHMuY29udGFpbnMoZmllbGQpKSByZXR1cm47CiAJdGhpcy5rbm93bkZpZWxkcy5hZGQoZmllbGQpOwotCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJSVJlc291cmNlIHJlc291cmNlID0gdHlwZS5nZXRSZXNvdXJjZSgpOwogCWJvb2xlYW4gaXNCaW5hcnkgPSB0eXBlLmlzQmluYXJ5KCk7CiAJSUJpbmFyeVR5cGUgaW5mbyA9IG51bGw7CiAJaWYgKGlzQmluYXJ5KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkTWV0aG9kc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybi5qYXZhCmluZGV4IGQzMDQ1ZTMuLjk4ZmQ1YzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRNZXRob2RzUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKQEAgLTI4LDcgKzI5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZE1ldGhvZHNQYXR0ZXJuIGV4dGVuZHMgTWV0aG9kUmVmZXJlbmNlUGF0dGVybiB7CiAJSGFzaFNldCBrbm93bk1ldGhvZHM7CkBAIC04MCw3ICs4MCw3IEBACiAJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChuZXcgU3RyaW5nKHNlbGVjdG9yKSwgcGFyYW1ldGVyVHlwZXMpOwogCWlmICh0aGlzLmtub3duTWV0aG9kcy5jb250YWlucyhtZXRob2QpKSByZXR1cm47CiAJdGhpcy5rbm93bk1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JSVJlc291cmNlIHJlc291cmNlID0gdHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFJlc291cmNlKCk7CiAJYm9vbGVhbiBpc0JpbmFyeSA9IHR5cGUuaXNCaW5hcnkoKTsKIAlJQmluYXJ5VHlwZSBpbmZvID0gbnVsbDsKIAlpZiAoaXNCaW5hcnkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlc1BhdHRlcm4uamF2YQppbmRleCA1MDJiNGEwLi5jMWZlNGM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0RlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXNQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9EZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkltcG9ydFJlZmVyZW5jZTsKQEAgLTMzLDcgKzM0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Tb3VyY2VUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiAKIHB1YmxpYyBjbGFzcyBEZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzUGF0dGVybiBleHRlbmRzIFR5cGVSZWZlcmVuY2VQYXR0ZXJuIHsKIAlIYXNoU2V0IGtub3duVHlwZXM7CkBAIC01MSw2ICs1MSwxMiBAQAogCS8vIG5lZWQgYWNjdXJhdGUgbWF0Y2ggdG8gYmUgYWJsZSB0byBvcGVuIG9uIHR5cGUgcmVmCiAJaWYgKGFjY3VyYWN5ID09IElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCkgcmV0dXJuOwogCQorCS8vIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSB0eXBlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGVuY2xvc2luZyBlbGVtZW50CisJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5lbmNsb3NpbmdFbGVtZW50LmVxdWFscyhlbGVtZW50KSkgeworCQllbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKKwl9CisJaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOworCiAJd2hpbGUgKGJpbmRpbmcgaW5zdGFuY2VvZiBSZWZlcmVuY2VCaW5kaW5nKSB7CiAJCVJlZmVyZW5jZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoUmVmZXJlbmNlQmluZGluZyliaW5kaW5nOwogCQl0aGlzLnJlcG9ydERlY2xhcmF0aW9uKHR5cGVCaW5kaW5nLCAxLCBsb2NhdG9yKTsKQEAgLTc0LDcgKzgwLDcgQEAKIAlpbnQgbWF4VHlwZSA9IC0xOwogCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbDsKIAlpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkgewotCQl0eXBlQmluZGluZyA9ICgoVHlwZVJlZmVyZW5jZSlyZWZlcmVuY2UpLmJpbmRpbmc7CisJCXR5cGVCaW5kaW5nID0gKChUeXBlUmVmZXJlbmNlKXJlZmVyZW5jZSkucmVzb2x2ZWRUeXBlOwogCQltYXhUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7CiAJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lUmVmZXJlbmNlKSB7CiAJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSlyZWZlcmVuY2U7CkBAIC0xMTQsNyArMTIwLDcgQEAKIHByaXZhdGUgdm9pZCByZXBvcnREZWNsYXJhdGlvbihUeXBlQmluZGluZyB0eXBlQmluZGluZywgaW50IG1heFR5cGUsIE1hdGNoTG9jYXRvciBsb2NhdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJSVR5cGUgdHlwZSA9IGxvY2F0b3IubG9va3VwVHlwZSh0eXBlQmluZGluZyk7CiAJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuOyAvLyBjYXNlIG9mIGEgc2Vjb25kYXJ5IHR5cGUKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCUlSZXNvdXJjZSByZXNvdXJjZSA9IHR5cGUuZ2V0UmVzb3VyY2UoKTsKIAlib29sZWFuIGlzQmluYXJ5ID0gdHlwZS5pc0JpbmFyeSgpOwogCUlCaW5hcnlUeXBlIGluZm8gPSBudWxsOwogCWlmIChpc0JpbmFyeSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IDQ2YjQ0MjIuLmEyZjRkMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGREZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsMTggKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuRmllbGREZWNsYXJhdGlvbjsKQEAgLTIyLDcgKzIzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZFJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmllbGRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKaW5kZXggNjBlY2U0Mi4uMjQwYmQzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWVsZFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0ZpZWxkUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0xLDE5ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzc2lnbm1lbnQ7CkBAIC0yOSw3ICszMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5GaWVsZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb2NhbFZhcmlhYmxlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhlZEZpbGU7CkBAIC03OSw3ICs3OSw3IEBACiAJdGhpcy5yZWFkQWNjZXNzID0gcmVhZEFjY2VzczsKIAl0aGlzLndyaXRlQWNjZXNzID0gd3JpdGVBY2Nlc3M7CiAKLQl0aGlzLm5lZWRzUmVzb2x2ZSA9IHRoaXMubmVlZHNSZXNvbHZlKCk7CisJdGhpcy5uZWVkc1Jlc29sdmUgPSB0cnVlOyAvLyBhbHdheXMgcmVzb2x2ZSAoaW4gY2FzZSBvZiBhIHNpbXBsZSBuYW1lIHJlZmVyZW5jZSBiZWluZyBhIHBvdGVudGlhbCBtYXRjaCkKIH0KIC8qKgogICogRWl0aGVyIGRlY29kZSByZWYvbmFtZSwgZmllbGRSZWYvbmFtZSAKQEAgLTI2OCwyMCArMjY4LDYgQEAKIAl9CiB9CiAvKioKLSAqIFJldHVybnMgd2hldGhlciBhIGZpZWxkIHJlZmVyZW5jZSBvciBuYW1lIHJlZmVyZW5jZSB3aWxsIG5lZWQgdG8gYmUgcmVzb2x2ZWQgdG8gCi0gKiBmaW5kIG91dCBpZiB0aGlzIG1ldGhvZCBwYXR0ZXJuIG1hdGNoZXMgaXQuCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBuZWVkc1Jlc29sdmUoKSB7Ci0KLQkvLyBkZWNsYXJpbmcgdHlwZQotCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwgfHwgZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLQotCS8vIHJldHVybiB0eXBlCi0JaWYgKHR5cGVTaW1wbGVOYW1lICE9IG51bGwgfHwgdHlwZVF1YWxpZmljYXRpb24gIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKICAqIEBzZWUgQW5kUGF0dGVybiNyZXNldFF1ZXJ5CiAgKi8KIHByb3RlY3RlZCB2b2lkIHJlc2V0UXVlcnkoKSB7CkBAIC00MzIsMjAgKzQxOCwyNyBAQAogCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQogCQkJCVF1YWxpZmllZE5hbWVSZWZlcmVuY2UgcU5hbWVSZWYgPSAoUXVhbGlmaWVkTmFtZVJlZmVyZW5jZSluYW1lUmVmOwogCQkJCUZpZWxkQmluZGluZyBmaWVsZEJpbmRpbmcgPSBudWxsOwotCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgRmllbGRCaW5kaW5nICYmIHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCAoZmllbGRCaW5kaW5nID0gKEZpZWxkQmluZGluZyliaW5kaW5nKS5uYW1lKSkgewotCQkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsKGZpZWxkQmluZGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IG90aGVyTGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOwotCQkJCQlpbnQgb3RoZXJNYXggPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzID09IG51bGwgPyAwIDogcU5hbWVSZWYub3RoZXJCaW5kaW5ncy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJNYXggJiYgKG90aGVyTGV2ZWwgPT0gSU1QT1NTSUJMRV9NQVRDSCk7IGkrKyl7Ci0JCQkJCQljaGFyW10gdG9rZW4gPSBxTmFtZVJlZi50b2tlbnNbaSArIHFOYW1lUmVmLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZ107Ci0JCQkJCQlpZiAodGhpcy5tYXRjaGVzTmFtZSh0aGlzLm5hbWUsIHRva2VuKSkgewotCQkJCQkJCUZpZWxkQmluZGluZyBvdGhlckJpbmRpbmcgPSBxTmFtZVJlZi5vdGhlckJpbmRpbmdzW2ldOwotCQkJCQkJCW90aGVyTGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWwob3RoZXJCaW5kaW5nKTsKLQkJCQkJCX0KKwkJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIEZpZWxkQmluZGluZykgeworCQkJCQlmaWVsZEJpbmRpbmcgPSAoRmllbGRCaW5kaW5nKWJpbmRpbmc7CisJCQkJCWNoYXJbXSBuYW1lID0gZmllbGRCaW5kaW5nLm5hbWU7CisJCQkJCWludCBsYXN0RG90ID0gQ2hhck9wZXJhdGlvbi5sYXN0SW5kZXhPZignLicsIG5hbWUpOworCQkJCQlpZiAobGFzdERvdCA+IC0xKSB7CisJCQkJCQluYW1lID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheShuYW1lLCBsYXN0RG90KzEsIG5hbWUubGVuZ3RoKTsKIAkJCQkJfQotCQkJCQlyZXR1cm4gb3RoZXJMZXZlbDsKKwkJCQkJaWYgKHRoaXMubWF0Y2hlc05hbWUodGhpcy5uYW1lLCBuYW1lKSkgeworCQkJCQkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbChmaWVsZEJpbmRpbmcpOworCQkJCQl9IAorCQkJCX0gCisJCQkJaW50IG90aGVyTGV2ZWwgPSBJTVBPU1NJQkxFX01BVENIOworCQkJCWludCBvdGhlck1heCA9IHFOYW1lUmVmLm90aGVyQmluZGluZ3MgPT0gbnVsbCA/IDAgOiBxTmFtZVJlZi5vdGhlckJpbmRpbmdzLmxlbmd0aDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyTWF4ICYmIChvdGhlckxldmVsID09IElNUE9TU0lCTEVfTUFUQ0gpOyBpKyspeworCQkJCQljaGFyW10gdG9rZW4gPSBxTmFtZVJlZi50b2tlbnNbaSArIHFOYW1lUmVmLmluZGV4T2ZGaXJzdEZpZWxkQmluZGluZ107CisJCQkJCWlmICh0aGlzLm1hdGNoZXNOYW1lKHRoaXMubmFtZSwgdG9rZW4pKSB7CisJCQkJCQlGaWVsZEJpbmRpbmcgb3RoZXJCaW5kaW5nID0gcU5hbWVSZWYub3RoZXJCaW5kaW5nc1tpXTsKKwkJCQkJCW90aGVyTGV2ZWwgPSB0aGlzLm1hdGNoTGV2ZWwob3RoZXJCaW5kaW5nKTsKKwkJCQkJfQogCQkJCX0KKwkJCQlyZXR1cm4gb3RoZXJMZXZlbDsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvRmlsZU5hbWVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWxlTmFtZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzAwMmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9GaWxlTmFtZUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guQ2xhc3NwYXRoSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5GaWxlU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlTmFtZUVudmlyb25tZW50IGV4dGVuZHMgRmlsZVN5c3RlbSB7Ci0JCi1wdWJsaWMgRmlsZU5hbWVFbnZpcm9ubWVudChTdHJpbmdbXSBjbGFzc3BhdGhOYW1lcywgU3RyaW5nIGVuY29kaW5nLCBpbnRbXSBjbGFzc3BhdGhEaXJlY3RvcnlNb2RlcykgewotCXN1cGVyKGNsYXNzcGF0aE5hbWVzLCBuZXcgU3RyaW5nWzBdLCBlbmNvZGluZywgY2xhc3NwYXRoRGlyZWN0b3J5TW9kZXMpOwotfQotCi1wdWJsaWMgQ2xhc3NwYXRoSmFyIGdldENsYXNzcGF0aEphcihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJWmlwRmlsZSB6aXBGaWxlID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0WmlwRmlsZShuZXcgUGF0aChmaWxlLmdldFBhdGgoKSkpOwotCQlyZXR1cm4gbmV3IENsYXNzcGF0aEphcih6aXBGaWxlLCBmYWxzZSk7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDbGFzc3BhdGhKYXIoZmlsZSk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9KYXZhU2VhcmNoTmFtZUVudmlyb25tZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL0phdmFTZWFyY2hOYW1lRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDcyYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9KYXZhU2VhcmNoTmFtZUVudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuTmFtZUVudmlyb25tZW50QW5zd2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuQ2xhc3NwYXRoSmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmJ1aWxkZXIuQ2xhc3NwYXRoTG9jYXRpb247CisKKy8vIFRPRE86IChqZXJvbWUpIFJlbW92ZSB3aGVuIHN3aXRjaGluZyB0byBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50MgorcHVibGljIGNsYXNzIEphdmFTZWFyY2hOYW1lRW52aXJvbm1lbnQgaW1wbGVtZW50cyBJTmFtZUVudmlyb25tZW50IHsKKwkKKwlDbGFzc3BhdGhMb2NhdGlvbltdIGxvY2F0aW9uczsKKwkKK3B1YmxpYyBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCXRyeSB7CisJCWNvbXB1dGVDbGFzc3BhdGhMb2NhdGlvbnMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCk7CisJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhpcy5sb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bMF07CisJfQorfQorCitwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQl0aGlzLmxvY2F0aW9uc1tpXS5jbGVhbnVwKCk7CisJfQorfQorCitwcml2YXRlIHZvaWQgY29tcHV0ZUNsYXNzcGF0aExvY2F0aW9ucygKKwlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290LAorCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOworCWludCBsZW5ndGggPSByb290cy5sZW5ndGg7CisJQ2xhc3NwYXRoTG9jYXRpb25bXSBsb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bbGVuZ3RoXTsKKwlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJSVBhdGggcGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJWmlwRmlsZSB6aXBGaWxlID0gbWFuYWdlci5nZXRaaXBGaWxlKHBhdGgpOworCQkJbG9jYXRpb25zW2ldID0gbmV3IENsYXNzcGF0aEphcih6aXBGaWxlKTsKKwkJfSBlbHNlIHsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIGZhbHNlKTsKKwkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgeworCQkJCWlmIChlbmNvZGluZyA9PSBudWxsKSB7CisJCQkJCWVuY29kaW5nID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOworCQkJCX0KKwkJCQlsb2NhdGlvbnNbaV0gPSBuZXcgQ2xhc3NwYXRoU291cmNlRGlyZWN0b3J5KChJQ29udGFpbmVyKXRhcmdldCwgZW5jb2RpbmcpOworCQkJfSBlbHNlIHsKKwkJCQlsb2NhdGlvbnNbaV0gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIoKElDb250YWluZXIpIHRhcmdldCwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCXRoaXMubG9jYXRpb25zID0gbG9jYXRpb25zOworfQorCitwcml2YXRlIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBjaGFyW10gdHlwZU5hbWUpIHsKKwlTdHJpbmcgCisJCWJpbmFyeUZpbGVOYW1lID0gbnVsbCwgcUJpbmFyeUZpbGVOYW1lID0gbnVsbCwgCisJCXNvdXJjZUZpbGVOYW1lID0gbnVsbCwgcVNvdXJjZUZpbGVOYW1lID0gbnVsbCwgCisJCXFQYWNrYWdlTmFtZSA9IG51bGw7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMubG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUNsYXNzcGF0aExvY2F0aW9uIGxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnNbaV07CisJCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXI7CisJCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSkgeworCQkJaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpIHsKKwkJCQlxU291cmNlRmlsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJCQlzb3VyY2VGaWxlTmFtZSA9IHFTb3VyY2VGaWxlTmFtZTsKKwkJCQlxUGFja2FnZU5hbWUgPSAgIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAocXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgPiB0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJaW50IHR5cGVOYW1lU3RhcnQgPSBxU291cmNlRmlsZU5hbWUubGVuZ3RoKCkgLSB0eXBlTmFtZS5sZW5ndGggLSA1OyAvLyBzaXplIG9mICIuamF2YSIKKwkJCQkJcVBhY2thZ2VOYW1lID0gIHFTb3VyY2VGaWxlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWVTdGFydCAtIDEpOworCQkJCQlzb3VyY2VGaWxlTmFtZSA9IHFTb3VyY2VGaWxlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWVTdGFydCk7CisJCQkJfQorCQkJfQorCQkJYW5zd2VyID0gbG9jYXRpb24uZmluZENsYXNzKAorCQkJCXNvdXJjZUZpbGVOYW1lLAorCQkJCXFQYWNrYWdlTmFtZSwKKwkJCQlxU291cmNlRmlsZU5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKGJpbmFyeUZpbGVOYW1lID09IG51bGwpIHsKKwkJCQlxQmluYXJ5RmlsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCQkJYmluYXJ5RmlsZU5hbWUgPSBxQmluYXJ5RmlsZU5hbWU7CisJCQkJcVBhY2thZ2VOYW1lID0gICIiOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpID4gdHlwZU5hbWUubGVuZ3RoKSB7CisJCQkJCWludCB0eXBlTmFtZVN0YXJ0ID0gcUJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gdHlwZU5hbWUubGVuZ3RoIC0gNjsgLy8gc2l6ZSBvZiAiLmNsYXNzIgorCQkJCQlxUGFja2FnZU5hbWUgPSAgcUJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZVN0YXJ0IC0gMSk7CisJCQkJCWJpbmFyeUZpbGVOYW1lID0gcUJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZVN0YXJ0KTsKKwkJCQl9CisJCQl9CisJCQlhbnN3ZXIgPSAKKwkJCQlsb2NhdGlvbi5maW5kQ2xhc3MoCisJCQkJCWJpbmFyeUZpbGVOYW1lLCAKKwkJCQkJcVBhY2thZ2VOYW1lLCAKKwkJCQkJcUJpbmFyeUZpbGVOYW1lKTsKKwkJfQorCQlpZiAoYW5zd2VyICE9IG51bGwpIHJldHVybiBhbnN3ZXI7CisJfQorCXJldHVybiBudWxsOworfQorCitwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdW10gcGFja2FnZU5hbWUpIHsKKwlpZiAodHlwZU5hbWUgIT0gbnVsbCkKKwkJcmV0dXJuIGZpbmRDbGFzcygKKwkJCW5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgJy8nKSksCisJCQl0eXBlTmFtZSk7CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CisJaWYgKGNvbXBvdW5kTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gZmluZENsYXNzKAorCQkJbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpKSwKKwkJCWNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCXJldHVybiBudWxsOworfQorCitwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoY2hhcltdW10gY29tcG91bmROYW1lLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKKwlyZXR1cm4gaXNQYWNrYWdlKG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgcGFja2FnZU5hbWUsICcvJykpKTsKK30KKworcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKHRoaXMubG9jYXRpb25zW2ldLmlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI2ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9KYXZhU2VhcmNoTmFtZUVudmlyb25tZW50Mi5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lk5hbWVFbnZpcm9ubWVudEFuc3dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkNsYXNzcGF0aEphcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkNsYXNzcGF0aExvY2F0aW9uOworCisvKgorICogQSBuYW1lIGVudmlyb25tZW50IGJhc2VkIG9uIHRoZSBjbGFzc3BhdGggb2YgYSBKYXZhIHByb2plY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50MiBpbXBsZW1lbnRzIElOYW1lRW52aXJvbm1lbnQgeworCQorCUNsYXNzcGF0aExvY2F0aW9uW10gbG9jYXRpb25zOworCQorcHVibGljIEphdmFTZWFyY2hOYW1lRW52aXJvbm1lbnQyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCXRyeSB7CisJCWNvbXB1dGVDbGFzc3BhdGhMb2NhdGlvbnMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgKEphdmFQcm9qZWN0KSBqYXZhUHJvamVjdCk7CisJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJdGhpcy5sb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bMF07CisJfQorfQorCitwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCQl0aGlzLmxvY2F0aW9uc1tpXS5jbGVhbnVwKCk7CisJfQorfQorCitwcml2YXRlIHZvaWQgY29tcHV0ZUNsYXNzcGF0aExvY2F0aW9ucygKKwlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290LAorCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOworCWludCBsZW5ndGggPSByb290cy5sZW5ndGg7CisJQ2xhc3NwYXRoTG9jYXRpb25bXSBsb2NhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoTG9jYXRpb25bbGVuZ3RoXTsKKwlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJSVBhdGggcGF0aCA9IHJvb3QuZ2V0UGF0aCgpOworCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJWmlwRmlsZSB6aXBGaWxlID0gbWFuYWdlci5nZXRaaXBGaWxlKHBhdGgpOworCQkJbG9jYXRpb25zW2ldID0gbmV3IENsYXNzcGF0aEphcih6aXBGaWxlKTsKKwkJfSBlbHNlIHsKKwkJCU9iamVjdCB0YXJnZXQgPSBKYXZhTW9kZWwuZ2V0VGFyZ2V0KHdvcmtzcGFjZVJvb3QsIHBhdGgsIGZhbHNlKTsKKwkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgeworCQkJCWlmIChlbmNvZGluZyA9PSBudWxsKSB7CisJCQkJCWVuY29kaW5nID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsIHRydWUpOworCQkJCX0KKwkJCQlsb2NhdGlvbnNbaV0gPSBuZXcgQ2xhc3NwYXRoU291cmNlRGlyZWN0b3J5KChJQ29udGFpbmVyKXRhcmdldCwgZW5jb2RpbmcpOworCQkJfSBlbHNlIHsKKwkJCQlsb2NhdGlvbnNbaV0gPSBDbGFzc3BhdGhMb2NhdGlvbi5mb3JCaW5hcnlGb2xkZXIoKElDb250YWluZXIpIHRhcmdldCwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCXRoaXMubG9jYXRpb25zID0gbG9jYXRpb25zOworfQorCitwcml2YXRlIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kQ2xhc3MoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lLCBjaGFyW10gdHlwZU5hbWUpIHsKKwlTdHJpbmcgCisJCWJpbmFyeUZpbGVOYW1lID0gbnVsbCwgcUJpbmFyeUZpbGVOYW1lID0gbnVsbCwgCisJCXNvdXJjZUZpbGVOYW1lID0gbnVsbCwgcVNvdXJjZUZpbGVOYW1lID0gbnVsbCwgCisJCXFQYWNrYWdlTmFtZSA9IG51bGw7CisJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHRoaXMubG9jYXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCUNsYXNzcGF0aExvY2F0aW9uIGxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnNbaV07CisJCU5hbWVFbnZpcm9ubWVudEFuc3dlciBhbnN3ZXI7CisJCWlmIChsb2NhdGlvbiBpbnN0YW5jZW9mIENsYXNzcGF0aFNvdXJjZURpcmVjdG9yeSkgeworCQkJaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpIHsKKwkJCQlxU291cmNlRmlsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKKwkJCQlzb3VyY2VGaWxlTmFtZSA9IHFTb3VyY2VGaWxlTmFtZTsKKwkJCQlxUGFja2FnZU5hbWUgPSAgIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAocXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgPiB0eXBlTmFtZS5sZW5ndGgpIHsKKwkJCQkJaW50IHR5cGVOYW1lU3RhcnQgPSBxU291cmNlRmlsZU5hbWUubGVuZ3RoKCkgLSB0eXBlTmFtZS5sZW5ndGggLSA1OyAvLyBzaXplIG9mICIuamF2YSIKKwkJCQkJcVBhY2thZ2VOYW1lID0gIHFTb3VyY2VGaWxlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWVTdGFydCAtIDEpOworCQkJCQlzb3VyY2VGaWxlTmFtZSA9IHFTb3VyY2VGaWxlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWVTdGFydCk7CisJCQkJfQorCQkJfQorCQkJYW5zd2VyID0gbG9jYXRpb24uZmluZENsYXNzKAorCQkJCXNvdXJjZUZpbGVOYW1lLAorCQkJCXFQYWNrYWdlTmFtZSwKKwkJCQlxU291cmNlRmlsZU5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKGJpbmFyeUZpbGVOYW1lID09IG51bGwpIHsKKwkJCQlxQmluYXJ5RmlsZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCQkJYmluYXJ5RmlsZU5hbWUgPSBxQmluYXJ5RmlsZU5hbWU7CisJCQkJcVBhY2thZ2VOYW1lID0gICIiOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpID4gdHlwZU5hbWUubGVuZ3RoKSB7CisJCQkJCWludCB0eXBlTmFtZVN0YXJ0ID0gcUJpbmFyeUZpbGVOYW1lLmxlbmd0aCgpIC0gdHlwZU5hbWUubGVuZ3RoIC0gNjsgLy8gc2l6ZSBvZiAiLmNsYXNzIgorCQkJCQlxUGFja2FnZU5hbWUgPSAgcUJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZVN0YXJ0IC0gMSk7CisJCQkJCWJpbmFyeUZpbGVOYW1lID0gcUJpbmFyeUZpbGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZVN0YXJ0KTsKKwkJCQl9CisJCQl9CisJCQlhbnN3ZXIgPSAKKwkJCQlsb2NhdGlvbi5maW5kQ2xhc3MoCisJCQkJCWJpbmFyeUZpbGVOYW1lLCAKKwkJCQkJcVBhY2thZ2VOYW1lLCAKKwkJCQkJcUJpbmFyeUZpbGVOYW1lKTsKKwkJfQorCQlpZiAoYW5zd2VyICE9IG51bGwpIHJldHVybiBhbnN3ZXI7CisJfQorCXJldHVybiBudWxsOworfQorCitwdWJsaWMgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlKGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdW10gcGFja2FnZU5hbWUpIHsKKwlpZiAodHlwZU5hbWUgIT0gbnVsbCkKKwkJcmV0dXJuIGZpbmRDbGFzcygKKwkJCW5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCB0eXBlTmFtZSwgJy8nKSksCisJCQl0eXBlTmFtZSk7CisJcmV0dXJuIG51bGw7Cit9CisKK3B1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmROYW1lKSB7CisJaWYgKGNvbXBvdW5kTmFtZSAhPSBudWxsKQorCQlyZXR1cm4gZmluZENsYXNzKAorCQkJbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLmNvbmNhdFdpdGgoY29tcG91bmROYW1lLCAnLycpKSwKKwkJCWNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoIC0gMV0pOworCXJldHVybiBudWxsOworfQorCitwdWJsaWMgYm9vbGVhbiBpc1BhY2thZ2UoY2hhcltdW10gY29tcG91bmROYW1lLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKKwlyZXR1cm4gaXNQYWNrYWdlKG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGNvbXBvdW5kTmFtZSwgcGFja2FnZU5hbWUsICcvJykpKTsKK30KKworcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyBxdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0aGlzLmxvY2F0aW9ucy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKwkJaWYgKHRoaXMubG9jYXRpb25zW2ldLmlzUGFja2FnZShxdWFsaWZpZWRQYWNrYWdlTmFtZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvci5qYXZhCmluZGV4IDVmYjM3MmQuLmVlMmRkNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3IuamF2YQpAQCAtMSwxMDEgKzEsNDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bcmd1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5DbGFzc3BhdGhEaXJlY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLklUeXBlUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluYXJ5VHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Mb29rdXBFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlBhY2thZ2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVW5yZXNvbHZlZFJlZmVyZW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNvdXJjZVR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5CaW5hcnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSGFuZGxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk5hbWVMb29rdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZUVsZW1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7Ci0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeS5IaWVyYXJjaHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSGllcmFyY2h5U2NvcGU7CiAvKioKICAqIExvY2F0ZSBtYXRjaGVzIGluIGNvbXBpbGF0aW9uIHVuaXRzLgogICovCkBAIC0xMDYsNyArNTIsNyBAQAogCXB1YmxpYyBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOwogCiAJcHVibGljIE1hdGNoTG9jYXRvclBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBJTmFtZUVudmlyb25tZW50IG5hbWVFbnZpcm9ubWVudDsKKwlwdWJsaWMgSU5hbWVFbnZpcm9ubWVudCBuYW1lRW52aXJvbm1lbnQ7CiAJcHVibGljIE5hbWVMb29rdXAgbmFtZUxvb2t1cDsKIAlwdWJsaWMgTG9va3VwRW52aXJvbm1lbnQgbG9va3VwRW52aXJvbm1lbnQ7CiAJcHVibGljIEhhc2h0YWJsZU9mT2JqZWN0IHBhcnNlZFVuaXRzOwpAQCAtMTE0LDE5ICs2MCwyNSBAQAogCXByaXZhdGUgTWF0Y2hpbmdPcGVuYWJsZSBjdXJyZW50TWF0Y2hpbmdPcGVuYWJsZTsKIAlwdWJsaWMgSGFuZGxlRmFjdG9yeSBoYW5kbGVGYWN0b3J5OwogCXB1YmxpYyBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzOworCXB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlciBoaWVyYXJjaHlSZXNvbHZlcjsKKwkKKwlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7CiAKLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gRU1QVFlfRklMRV9OQU1FID0gbmV3IGNoYXJbMF07CisJZmluYWwgc3RhdGljIGNoYXJbXSBFTVBUWV9GSUxFX05BTUUgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJYm9vbGVhbiBjb21waWxhdGlvbkFib3J0ZWQ7CiAKIAlwdWJsaWMgTWF0Y2hMb2NhdG9yKAogCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sCiAJCWludCBkZXRhaWxMZXZlbCwKIAkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7CisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUsCisJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CiAKIAkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJdGhpcy5kZXRhaWxMZXZlbCA9IGRldGFpbExldmVsOwogCQl0aGlzLmNvbGxlY3RvciA9IGNvbGxlY3RvcjsKIAkJdGhpcy5zY29wZSA9IHNjb3BlOworCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKIAl9CiAJCiAJLyoqCkBAIC0xNzIsMTkgKzEyNCwxNyBAQAogCQkJLy8gZ2V0IHNvdXJjZQogCQkJU291cmNlVHlwZUVsZW1lbnRJbmZvIGVsZW1lbnRJbmZvID0gKFNvdXJjZVR5cGVFbGVtZW50SW5mbykgc291cmNlVHlwZTsKIAkJCUlUeXBlIHR5cGUgPSBlbGVtZW50SW5mby5nZXRIYW5kbGUoKTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5idWlsZEJpbmRpbmdzKHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlOiBpZ25vcmUKLQkJCX0KKwkJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KXR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisJCQl0aGlzLmFjY2VwdChzb3VyY2VVbml0KTsKIAkJfSBlbHNlIHsKIAkJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9CiAJCQkJbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVR5cGUuZ2V0RmlsZU5hbWUoKSwgMCwgMCwgMCk7CiAJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0KIAkJCQlTb3VyY2VUeXBlQ29udmVydGVyLmJ1aWxkQ29tcGlsYXRpb25Vbml0KAotCQkJCQlzb3VyY2VUeXBlcywKLQkJCQkJdHJ1ZSwKLQkJCQkJdHJ1ZSwKKwkJCQkJc291cmNlVHlwZXMsLy9zb3VyY2VUeXBlc1swXSBpcyBhbHdheXMgdG9wbGV2ZWwgaGVyZQorCQkJCQl0cnVlLCAvLyBuZWVkIGZpZWxkIGFuZCBtZXRob2RzCisJCQkJCXRydWUsIC8vIG5lZWQgbWVtYmVyIHR5cGVzCisJCQkJCWZhbHNlLCAvLyBubyBuZWVkIGZvciBmaWVsZCBpbml0aWFsaXphdGlvbgogCQkJCQlsb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsCiAJCQkJCXJlc3VsdCk7CiAJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmJ1aWxkVHlwZUJpbmRpbmdzKHVuaXQpOwpAQCAtMTkzLDU3ICsxNDMsNyBAQAogCQl9CiAJfQogCi0vKgotICogUGFyc2UgdGhlIGdpdmVuIGNvbXBpYXRpb24gdW5pdCBhbmQgYnVpbGQgaXRzIHR5cGUgYmluZGluZ3MuCi0gKiBSZW1lbWJlciB0aGUgcGFyc2VkIHVuaXQuCi0gKi8KLXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBidWlsZEJpbmRpbmdzKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlmaW5hbCBJRmlsZSBmaWxlID0gCi0JCWNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkgPwotCQkJKElGaWxlKWNvbXBpbGF0aW9uVW5pdC5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSA6Ci0JCQkoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBudWxsOwotCQotCS8vIGdldCBtYWluIHR5cGUgbmFtZQotCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCWZpbmFsIGNoYXJbXSBtYWluVHlwZU5hbWUgPQotCQlmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSA1KS50b0NoYXJBcnJheSgpOwotCQotCS8vIGZpbmQgb3V0IGlmIHVuaXQgaXMgYWxyZWFkeSBrbm93bgotCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUobmV3IFN0cmluZyhtYWluVHlwZU5hbWUpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpOwotCXVuaXQgPSAoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24pdGhpcy5wYXJzZWRVbml0cy5nZXQocXVhbGlmaWVkTmFtZSk7Ci0JaWYgKHVuaXQgIT0gbnVsbCkgcmV0dXJuIHVuaXQ7CiAKLQkvLyBzb3VyY2UgdW5pdAotCUlCdWZmZXIgYnVmZmVyOwotCWZpbmFsIGNoYXJbXSBzb3VyY2UgPSAKLQkJY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSA/Ci0JCQkoYnVmZmVyID0gY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpKSA9PSBudWxsID8gbnVsbCA6IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCkgOgotCQkJVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoZmlsZSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IElDb21waWxhdGlvblVuaXQoKSB7Ci0JCXB1YmxpYyBjaGFyW10gZ2V0Q29udGVudHMoKSB7Ci0JCQlyZXR1cm4gc291cmNlOwotCQl9Ci0JCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWUudG9DaGFyQXJyYXkoKTsKLQkJfQotCQlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKLQkJCXJldHVybiBtYWluVHlwZU5hbWU7Ci0JCX0KLQkJcHVibGljIGNoYXJbXVtdIGdldFBhY2thZ2VOYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCQotCS8vIGRpZXQgcGFyc2UKLQl1bml0ID0gdGhpcy5wYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIHRoaXMsIGZpbGUsIChDb21waWxhdGlvblVuaXQpY29tcGlsYXRpb25Vbml0KTsKLQlpZiAodW5pdCAhPSBudWxsKSB7Ci0JCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7Ci0JCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModW5pdCwgdHJ1ZSk7Ci0JCXRoaXMucGFyc2VkVW5pdHMucHV0KHF1YWxpZmllZE5hbWUsIHVuaXQpOwotCX0KLQlyZXR1cm4gdW5pdDsKLX0KIAogCS8qKgogCSAqIENyZWF0ZXMgYW4gSUZpZWxkIGZyb20gdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCB0eXBlLiAKQEAgLTM3MSw5ICsyNzEsMTMgQEAKIAkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpcGtnLmdldFBhcmVudCgpOwogCQkJdHJ5IHsKIAkJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgewotCQkJCQlJUGF0aCB6aXBQYXRoID0gcm9vdC5pc0V4dGVybmFsKCkgPyByb290LmdldFBhdGgoKSA6IHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKKwkJCQkJSVBhdGggemlwUGF0aCA9IHJvb3QuaXNFeHRlcm5hbCgpID8gcm9vdC5nZXRQYXRoKCkgOiByb290LmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKKwkJCQkJaWYgKHppcFBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7IC8vIGxvY2F0aW9uIGlzIG51bGwKIAkJCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKIAkJCQkJdHJ5IHsKKwkJCQkJCWlmIChKYXZhTW9kZWxNYW5hZ2VyLlpJUF9BQ0NFU1NfVkVSQk9TRSkgeworCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIikgW01hdGNoTG9jYXRvci5jbGFzc0ZpbGVSZWFkZXIoKV0gQ3JlYXRpbmcgWmlwRmlsZSBvbiAiICsgemlwUGF0aCk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAorCQkJCQkJfQogCQkJCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcFBhdGgudG9PU1N0cmluZygpKTsKIAkJCQkJCWNoYXJbXSBwa2dQYXRoID0gcGtnLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJCQkJCUNoYXJPcGVyYXRpb24ucmVwbGFjZShwa2dQYXRoLCAnLicsICcvJyk7CkBAIC0zODksMTAgKzI5Myw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gQ2xhc3NGaWxlUmVhZGVyLnJlYWQodHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7CisJCQkJCXJldHVybiBDbGFzc0ZpbGVSZWFkZXIucmVhZCh0eXBlLmdldFBhdGgoKS50b09TU3RyaW5nKCkpOwogCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7CiAJCQl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC00MjAsMTIgKzMyMiw3IEBACiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCQkvLyBlbnN1cmUgdGhpcyBpcyBhIHRvcCBsZXZlbCB0eXBlIChzZWUgYnVnIDIwMDExICBTZWFyY2hpbmcgZm9yIElubmVyIENsYXNzZXMgZ2l2ZXMgYmFkIHNlYXJjaCByZXN1bHRzKQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJd2hpbGUgKGRlY2xhcmluZ1R5cGUgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBkZWNsYXJpbmdUeXBlOwotCQkJCWRlY2xhcmluZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCX0KLQkJCXJldHVybiB0eXBlOworCQkJcmV0dXJuIE1hdGNoaW5nT3BlbmFibGUuZ2V0VG9wTGV2ZWxUeXBlKHR5cGUpOwogCQl9CiAJfQogCS8qKgpAQCAtNDQyLDYgKzMzOSw0MiBAQAogCQlyZXR1cm4gdGhpcy5wYXJzZXIgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnBhcnNlci5zY2FubmVyOwogCX0KIAorCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBwYXJzZXIgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBhcyB3ZWxsIGFzIGEgbG9va3VwIGVudmlyb25tZW50LgorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCS8vIGNyZWF0ZSBsb29rdXAgZW52aXJvbm1lbnQKKwkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7CisJCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPQorCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKKwkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKKwkJCQlvcHRpb25zLAorCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSk7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQgPQorCQkJbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIG9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgdGhpcy5uYW1lRW52aXJvbm1lbnQpOworCQkJCisJCS8vIGNyZWF0ZSBwYXJzZXIKKwkJdGhpcy5wYXJzZXIgPSBuZXcgTWF0Y2hMb2NhdG9yUGFyc2VyKHByb2JsZW1SZXBvcnRlciwgb3B0aW9ucy5zb3VyY2VMZXZlbCA+PSBDb21waWxlck9wdGlvbnMuSkRLMV80KTsKKwkJCisJCS8vIHJlc2V0IHBhcnNlZCB1bml0cyAodGhleSBjb3VsZCBob2xkIG9udG8gb2Jzb2xldGUgYmluZGluZ3M6IHNlZSBidWcgMTYwNTIpCisJCU1hdGNoaW5nT3BlbmFibGVbXSBvcGVuYWJsZXMgPSB0aGlzLm1hdGNoaW5nT3BlbmFibGVzLmdldE1hdGNoaW5nT3BlbmFibGVzKHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvcGVuYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCU1hdGNoaW5nT3BlbmFibGUgbWF0Y2hpbmdPcGVuYWJsZSA9IG9wZW5hYmxlc1tpXTsKKwkJCW1hdGNoaW5nT3BlbmFibGUucmVzZXQoKTsKKwkJfQorCQl0aGlzLnBhcnNlZFVuaXRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKKwkJCisJCS8vIHJlbWVtYmVyIHByb2plY3QncyBuYW1lIGxvb2t1cAorCQl0aGlzLm5hbWVMb29rdXAgPSBwcm9qZWN0LmdldE5hbWVMb29rdXAoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmFtZUVudmlyb25tZW50KEphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkvLyBjbGVhbnVwIGFuZCByZWNyZWF0ZSBmaWxlIG5hbWUgZW52aXJvbm1lbnQKKwkJaWYgKHRoaXMubmFtZUVudmlyb25tZW50ICE9IG51bGwpIHsKKwkJCXRoaXMubmFtZUVudmlyb25tZW50LmNsZWFudXAoKTsKKwkJfQorCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IHRoaXMuZ2V0TmFtZUVudmlyb25tZW50KHByb2plY3QpOworCX0KIAogCS8qKgogCSAqIExvY2F0ZSB0aGUgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gZmlsZXMgYW5kIHJlcG9ydCB0aGVtIHVzaW5nIHRoZSBzZWFyY2ggcmVxdWVzdG9yLiAKQEAgLTQ0OSw4ICszODIsNyBAQAogCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoCiAJCVN0cmluZ1tdIGZpbGVQYXRocywgCiAJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlLAotCQlJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzLCAKLQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCisJCUlXb3JraW5nQ29weVtdIHdvcmtpbmdDb3BpZXMpCiAJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkJCiAJCWlmIChTZWFyY2hFbmdpbmUuVkVSQk9TRSkgewpAQCAtNTMwLDcgKzQ2Miw3IEBACiAJCQkJaWYgKHdvcmtpbmdDb3B5ICE9IG51bGwpIHsKIAkJCQkJb3BlbmFibGUgPSAoT3BlbmFibGUpd29ya2luZ0NvcHk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJb3BlbmFibGUgPSB0aGlzLmhhbmRsZUZhY3RvcnkuY3JlYXRlT3BlbmFibGUocGF0aFN0cmluZyk7CisJCQkJCW9wZW5hYmxlID0gdGhpcy5oYW5kbGVGYWN0b3J5LmNyZWF0ZU9wZW5hYmxlKHBhdGhTdHJpbmcsIHRoaXMuc2NvcGUpOwogCQkJCQlpZiAob3BlbmFibGUgPT0gbnVsbCkKIAkJCQkJCWNvbnRpbnVlOyAvLyBtYXRjaCBpcyBvdXRzaWRlIGNsYXNzcGF0aAogCQkJCX0KQEAgLTU0MSw5ICs0NzMsOSBAQAogCQkJCXRyeSB7CiAJCQkJCWphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBvcGVuYWJsZS5nZXRKYXZhUHJvamVjdCgpOwogCQkJCQlpZiAod29ya2luZ0NvcHkgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2UgPSB3b3JraW5nQ29weS5nZXRPcmlnaW5hbEVsZW1lbnQoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCQkJCXJlc291cmNlID0gd29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKTsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc291cmNlID0gb3BlbmFibGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkJCQlyZXNvdXJjZSA9IG9wZW5hYmxlLmdldFJlc291cmNlKCk7CiAJCQkJCX0KIAkJCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsgLy8gY2FzZSBvZiBhIGZpbGUgaW4gYW4gZXh0ZXJuYWwgamFyCiAJCQkJCQlyZXNvdXJjZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKQEAgLTU1Miw3ICs0ODQsNyBAQAogCQkJCQkJLy8gbG9jYXRlIG1hdGNoZXMgaW4gcHJldmlvdXMgcHJvamVjdAogCQkJCQkJaWYgKHByZXZpb3VzSmF2YVByb2plY3QgIT0gbnVsbCkgewogCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXRoaXMubG9jYXRlTWF0Y2hlcyhwcmV2aW91c0phdmFQcm9qZWN0LCBwcm9ncmVzc01vbml0b3IpOworCQkJCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMocHJldmlvdXNKYXZhUHJvamVjdCk7CiAJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQkJCQkJaWYgKGUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CiAJCQkJCQkJCQl0aHJvdyBlOwpAQCAtNTYzLDggKzQ5NSwxOSBAQAogCQkJCQkJCXRoaXMubWF0Y2hpbmdPcGVuYWJsZXMgPSBuZXcgTWF0Y2hpbmdPcGVuYWJsZVNldCgpOwogCQkJCQkJfQogCQotCQkJCQkJLy8gY3JlYXRlIHBhcnNlciBmb3IgdGhpcyBwcm9qZWN0Ci0JCQkJCQl0aGlzLmNyZWF0ZVBhcnNlcihqYXZhUHJvamVjdCk7CisJCQkJCQkvLyBpbml0aWFsaXphdGlvbiBmb3IgdGhpcyBwcm9qZWN0CisJCQkJCQlpZiAobGVuZ3RoID09IDEpIHsKKwkJCQkJCQkvLyBpZiBvbmx5IG9uZSBwb3RlbnRpYWwgbWF0Y2gsIGEgZmlsZSBuYW1lIGVudmlyb25tZW50IGNvc3RzIHRvbyBtdWNoLAorCQkJCQkJCS8vIHNvIHVzZSB0aGUgZXhpc3Rpbmcgc2VhcmNoYWJsZSAgZW52aXJvbm1lbnQgd2ljaCB3aWxsIHBvcHVsYXRlIHRoZSBqYXZhIG1vZGVsCisJCQkJCQkJLy8gb25seSBmb3IgdGhpcyBwb3RlbnRpYWwgbWF0Y2ggYW5kIGl0cyByZXF1aXJlZCB0eXBlcy4KKwkJCQkJCQlpZiAodGhpcy5uYW1lRW52aXJvbm1lbnQgIT0gbnVsbCkgeyAvLyBjbGVhbnVwCisJCQkJCQkJCXRoaXMubmFtZUVudmlyb25tZW50LmNsZWFudXAoKTsKKwkJCQkJCQl9CisJCQkJCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBqYXZhUHJvamVjdC5nZXRTZWFyY2hhYmxlTmFtZUVudmlyb25tZW50KCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXRoaXMuaW5pdGlhbGl6ZU5hbWVFbnZpcm9ubWVudChqYXZhUHJvamVjdCk7CisJCQkJCQl9CisJCQkJCQl0aGlzLmluaXRpYWxpemUoamF2YVByb2plY3QpOwogCQkJCQkJcHJldmlvdXNKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwogCQkJCQl9CiAJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKQEAgLTU3Myw3ICs1MTYsNyBAQAogCQkJCX0KIAkKIAkJCQkvLyBhZGQgbWF0Y2hpbmcgb3BlbmFibGUKLQkJCQl0aGlzLmFkZE1hdGNoaW5nT3BlbmFibGUocmVzb3VyY2UsIG9wZW5hYmxlKTsKKwkJCQl0aGlzLmFkZE1hdGNoaW5nT3BlbmFibGUocmVzb3VyY2UsIG9wZW5hYmxlLCBudWxsLypubyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB5ZXQqLywgbnVsbC8qbm8gTWF0Y2hzZXQgeWV0Ki8pOwogCQogCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewogCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwpAQCAtNTgzLDcgKzUyNiw3IEBACiAJCQkvLyBsYXN0IHByb2plY3QKIAkJCWlmIChwcmV2aW91c0phdmFQcm9qZWN0ICE9IG51bGwpIHsKIAkJCQl0cnkgewotCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMocHJldmlvdXNKYXZhUHJvamVjdCwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCQkJdGhpcy5sb2NhdGVNYXRjaGVzKHByZXZpb3VzSmF2YVByb2plY3QpOwogCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJCWlmIChlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewogCQkJCQkJdGhyb3cgZTsKQEAgLTY0MCwxMSArNTgzLDExIEBACiAJCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudClwa2dzW2tdOwogCQkJCQkJCWlmIChwa2cuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwIAogCQkJCQkJCQkJJiYgcGtnUGF0dGVybi5tYXRjaGVzTmFtZShwa2dQYXR0ZXJuLnBrZ05hbWUsIHBrZy5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkpKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHBrZy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcGtnLmdldFJlc291cmNlKCk7CiAJCQkJCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7IC8vIGNhc2Ugb2YgYSBmaWxlIGluIGFuIGV4dGVybmFsIGphcgogCQkJCQkJCQkJcmVzb3VyY2UgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7CiAJCQkJCQkJCX0KLQkJCQkJCQkJdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZSA9IG5ldyBNYXRjaGluZ09wZW5hYmxlKHRoaXMsIHJlc291cmNlLCBudWxsKTsKKwkJCQkJCQkJdGhpcy5jdXJyZW50TWF0Y2hpbmdPcGVuYWJsZSA9IG5ldyBNYXRjaGluZ09wZW5hYmxlKHRoaXMsIHJlc291cmNlLCBudWxsLCBudWxsLCBudWxsKTsKIAkJCQkJCQkJdHJ5IHsKIAkJCQkJCQkJCXRoaXMucmVwb3J0KC0xLCAtMiwgcGtnLCBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCk7CiAJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtNzYzLDkgKzcwNiwxMiBAQAogCQkJU291cmNlTWFwcGVyIG1hcHBlciA9IGNsYXNzRmlsZS5nZXRTb3VyY2VNYXBwZXIoKTsKIAkJCWlmIChtYXBwZXIgIT0gbnVsbCkgewogCQkJCUlUeXBlIHR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOwotCQkJCWNoYXJbXSBjb250ZW50cyA9IG1hcHBlci5maW5kU291cmNlKHR5cGUsIGluZm8pOwotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCXJhbmdlID0gbWFwcGVyLm1hcFNvdXJjZSh0eXBlLCBjb250ZW50cywgYmluYXJ5TWVtYmVyKTsKKwkJCQlTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBtYXBwZXIuZmluZFNvdXJjZUZpbGVOYW1lKHR5cGUsIGluZm8pOworCQkJCWlmIChzb3VyY2VGaWxlTmFtZSAhPSBudWxsKSB7CisJCQkJCWNoYXJbXSBjb250ZW50cyA9IG1hcHBlci5maW5kU291cmNlKHR5cGUsIHNvdXJjZUZpbGVOYW1lKTsKKwkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKKwkJCQkJCXJhbmdlID0gbWFwcGVyLm1hcFNvdXJjZSh0eXBlLCBjb250ZW50cywgYmluYXJ5TWVtYmVyKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtODkzLDkgKzgzOSw5IEBACiAJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKIAkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewogCQkJCX0KLQkJCX0gd2hpbGUgKHRva2VuICE9ICBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXIgJiYgdG9rZW4gIT0gIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKTsKKwkJCX0gd2hpbGUgKHRva2VuICE9ICBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVJZGVudGlmaWVyICYmIHRva2VuICE9ICBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpOwogCQotCQkJaWYgKHRva2VuICE9IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GKSB7CisJCQlpZiAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CiAJCQkJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CiAJCQkJYm9vbGVhbiBlcXVhbHMgPSBmYWxzZTsKIAkJCQl3aGlsZSAoaSA8IHRva2VuTnVtYmVyCkBAIC05MjcsNyArODczLDcgQEAKIAkJCQl9CiAJCQkJcmV0dXJuOwogCQkJfQotCQl9IHdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRik7CisJCX0gd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRik7CiAJCiAJfQogCS8qKgpAQCAtOTYyLDcgKzkwOCw3IEBACiAJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwogCQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJCX0KLQkJCWlmICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRikgeworCQkJaWYgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgewogCQkJCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOwogCQkJCWJvb2xlYW4gZXF1YWxzID0gZmFsc2U7CiAJCQkJd2hpbGUgKGkgPCBsZW5ndGgKQEAgLTk5OSw3ICs5NDUsNyBAQAogCQkJaWYgKGFjY3VyYWN5SW5kZXggPCBhY2N1cmFjaWVzLmxlbmd0aC0xKSB7CiAJCQkJYWNjdXJhY3lJbmRleCsrOwogCQkJfQotCQl9IHdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRik7CisJCX0gd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRik7CiAKIAl9CiAKQEAgLTExMDYsOTAgKzEwNTIsNDYgQEAKIAkJCWFjY3VyYWN5KTsKIAl9CiAKLXByaXZhdGUgTWF0Y2hpbmdPcGVuYWJsZSBuZXdNYXRjaGluZ09wZW5hYmxlKElSZXNvdXJjZSByZXNvdXJjZSwgT3BlbmFibGUgb3BlbmFibGUpIHsKLQlNYXRjaGluZ09wZW5hYmxlIG1hdGNoaW5nT3BlbmFibGU7Ci0JdHJ5IHsKLQkJbWF0Y2hpbmdPcGVuYWJsZSA9IG5ldyBNYXRjaGluZ09wZW5hYmxlKHRoaXMsIHJlc291cmNlLCBvcGVuYWJsZSk7Ci0JfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7Ci0JCS8vIHByb2JsZW0gd2l0aCBjbGFzcyBwYXRoOiBpZ25vcmUgdGhpcyBtYXRjaGluZyBvcGVuYWJsZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIG1hdGNoaW5nT3BlbmFibGU7Ci19Ci0KLXByaXZhdGUgdm9pZCBhZGRNYXRjaGluZ09wZW5hYmxlKElSZXNvdXJjZSByZXNvdXJjZSwgT3BlbmFibGUgb3BlbmFibGUpCi0JCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewordm9pZCBhZGRNYXRjaGluZ09wZW5hYmxlKAorCQlJUmVzb3VyY2UgcmVzb3VyY2UsIAorCQlPcGVuYWJsZSBvcGVuYWJsZSwKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCwKKwkJTWF0Y2hTZXQgbWF0Y2hTZXQpIHsKIAkJCi0JTWF0Y2hpbmdPcGVuYWJsZSBtYXRjaGluZ09wZW5hYmxlID0gdGhpcy5uZXdNYXRjaGluZ09wZW5hYmxlKHJlc291cmNlLCBvcGVuYWJsZSk7CisJTWF0Y2hpbmdPcGVuYWJsZSBtYXRjaGluZ09wZW5hYmxlID0gbmV3IE1hdGNoaW5nT3BlbmFibGUodGhpcywgcmVzb3VyY2UsIG9wZW5hYmxlLCBwYXJzZWRVbml0LCBtYXRjaFNldCk7CiAJaWYgKG1hdGNoaW5nT3BlbmFibGUgIT0gbnVsbCkgewogCQl0aGlzLm1hdGNoaW5nT3BlbmFibGVzLmFkZChtYXRjaGluZ09wZW5hYmxlKTsKIAl9CiB9Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwYXJzZXIgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBhcyB3ZWxsIGFzIGEgbG9va3VwIGVudmlyb25tZW50LgotCSAqIEFza3MgdGhlIHBhdHRlcm4gdG8gaW5pdGlhbGl6ZSBpdHNlbGYgZm9yIHBvbHltb3JwaGljIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJzZXIoSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIGNsZWF1cCBhbmQgcmVjcmVhdGUgZmlsZSBuYW1lIGVudmlyb25tZW50Ci0JCWlmICh0aGlzLm5hbWVFbnZpcm9ubWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5jbGVhbnVwKCk7Ci0JCX0KLQkJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSB0aGlzLmdldE5hbWVFbnZpcm9ubWVudChwcm9qZWN0KTsKLQkJCi0JCS8vIGNyZWF0ZSBsb29rdXAgZW52aXJvbm1lbnQKLQkJQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JCVByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIgPQotCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwKLQkJCQlvcHRpb25zLAotCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCXRoaXMubG9va3VwRW52aXJvbm1lbnQgPQotCQkJbmV3IExvb2t1cEVudmlyb25tZW50KHRoaXMsIG9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgdGhpcy5uYW1lRW52aXJvbm1lbnQpOwotCQkJCi0JCS8vIGNyZWF0ZSBwYXJzZXIKLQkJdGhpcy5wYXJzZXIgPSBuZXcgTWF0Y2hMb2NhdG9yUGFyc2VyKHByb2JsZW1SZXBvcnRlciwgb3B0aW9ucy5hc3NlcnRNb2RlKTsKLQkJCi0JCS8vIHJlc2V0IHBhcnNlZCB1bml0cyAodGhleSBjb3VsZCBob2xkIG9udG8gb2Jzb2xldGUgYmluZGluZ3M6IHNlZSBidWcgMTYwNTIpCi0JCU1hdGNoaW5nT3BlbmFibGVbXSBvcGVuYWJsZXMgPSB0aGlzLm1hdGNoaW5nT3BlbmFibGVzLmdldE1hdGNoaW5nT3BlbmFibGVzKHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvcGVuYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU1hdGNoaW5nT3BlbmFibGUgbWF0Y2hpbmdPcGVuYWJsZSA9IG9wZW5hYmxlc1tpXTsKLQkJCW1hdGNoaW5nT3BlbmFibGUucmVzZXQoKTsKLQkJfQotCQl0aGlzLnBhcnNlZFVuaXRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDEwKTsKLQkJCi0JCS8vIHJlbWVtYmVyIHByb2plY3QncyBuYW1lIGxvb2t1cAotCQl0aGlzLm5hbWVMb29rdXAgPSBwcm9qZWN0LmdldE5hbWVMb29rdXAoKTsKKy8qCisgKiBDYWNoZXMgdGhlIGdpdmVuIGJpbmFyeSB0eXBlIGluIHRoZSBsb29rdXAgZW52aXJvbm1lbnQgYW5kIHJldHVybnMgaXQuCisgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBvbmUgaWYgYWxyZWFkeSBjYWNoZWQuCisgKiBSZXR1cm5zIG51bGwgaWYgc291cmNlIHR5cGUgYmluZGluZyB3YXMgY2FjaGVkLgorICovCitCaW5hcnlUeXBlQmluZGluZyBjYWNoZUJpbmFyeVR5cGUoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJSVR5cGUgZW5jbG9zaW5nVHlwZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCWlmIChlbmNsb3NpbmdUeXBlICE9IG51bGwpIHsKKwkJLy8gZm9yY2UgY2FjaGluZyBvZiBlbmNsb3NpbmcgdHlwZXMgZmlyc3QsIHNvIHRoYXQgYmluYXJ5IHR5cGUgY2FuIGJlIGZvdW5kIGluIGxvb2t1cCBlbnZpcm9tZW50CisJCXRoaXMuY2FjaGVCaW5hcnlUeXBlKGVuY2xvc2luZ1R5cGUpOwogCX0KKwlJQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKElCaW5hcnlUeXBlKSgoQmluYXJ5VHlwZSl0eXBlKS5nZXRFbGVtZW50SW5mbygpOworCUJpbmFyeVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmNhY2hlQmluYXJ5VHlwZShiaW5hcnlUeXBlKTsKKwlpZiAoYmluZGluZyA9PSBudWxsKSB7IC8vIGl0IHdhcyBhbHJlYWR5IGNhY2hlZCBhcyBhIHJlc3VsdCBvZiBhIHByZXZpb3VzIHF1ZXJ5CisJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IHRoaXMubG9va3VwRW52aXJvbm1lbnQuZ2V0Q2FjaGVkVHlwZShjb21wb3VuZE5hbWUpOworCQlpZiAocmVmZXJlbmNlQmluZGluZyAhPSBudWxsICYmIChyZWZlcmVuY2VCaW5kaW5nIGluc3RhbmNlb2YgQmluYXJ5VHlwZUJpbmRpbmcpKSB7CisJCQkvLyBpZiB0aGUgYmluZGluZyBjb3VsZCBiZSBmb3VuZCBhbmQgaWYgaXQgY29tZXMgZnJvbSBhIGJpbmFyeSB0eXBlLAorCQkJYmluZGluZyA9IChCaW5hcnlUeXBlQmluZGluZylyZWZlcmVuY2VCaW5kaW5nOworCQl9CisJfQorCXJldHVybiBiaW5kaW5nOworfQorCiAKIAlwcml2YXRlIElOYW1lRW52aXJvbm1lbnQgZ2V0TmFtZUVudmlyb25tZW50KEphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQkvL3JldHVybiBwcm9qZWN0LmdldFNlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoKTsKIAkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWludCBsZW5ndGggPSByb290cy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aE5hbWVzID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotCQlpbnQgcm9vdE1vZGVzW10gPSBuZXcgaW50W2xlbmd0aF07Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07Ci0JCQlJUGF0aCBwYXRoID0gcm9vdC5nZXRQYXRoKCk7Ci0JCQlyb290TW9kZXNbaV0gPSAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpICA/IENsYXNzcGF0aERpcmVjdG9yeS5TT1VSQ0UgOiBDbGFzc3BhdGhEaXJlY3RvcnkuQklOQVJZOwotCQkJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKLQkJCQkvLyBwYXNzIGluIGEgcmVsYXRpdmUgcGF0aCAoZm9yIGludGVybmFsIGphcikgYXMgdGhpcyBpcyB3aGF0IGlzIG5lZWRlZCBieSBGaWxlTmFtZXdFbnZpcm9tZW50LmdldFppcEZpbGUoRmlsZSkKLQkJCQljbGFzc3BhdGhOYW1lc1tpXSA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdGFyZ2V0ID0gSmF2YU1vZGVsLmdldFRhcmdldCh3b3Jrc3BhY2VSb290LCBwYXRoLCBmYWxzZSk7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQljbGFzc3BhdGhOYW1lc1tpXSA9ICgoSVJlc291cmNlKXRhcmdldCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2xhc3NwYXRoTmFtZXNbaV0gPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVuY29kaW5nID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpOwotCQlyZXR1cm4gbmV3IEZpbGVOYW1lRW52aXJvbm1lbnQoY2xhc3NwYXRoTmFtZXMsIGVuY29kaW5nLCByb290TW9kZXMpOwotCQkKKwkJcmV0dXJuIG5ldyBKYXZhU2VhcmNoTmFtZUVudmlyb25tZW50KHByb2plY3QpOwogCX0KIAogCXB1YmxpYyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBkaWV0UGFyc2UoZmluYWwgY2hhcltdIHNvdXJjZSkgewpAQCAtMTIyNSw3ICsxMTI3LDEwIEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IHRoaXMuY2xhc3NGaWxlUmVhZGVyKHR5cGUpOwogCQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJCXNvdXJjZSA9IHNvdXJjZU1hcHBlci5maW5kU291cmNlKHR5cGUsIHJlYWRlcik7CisJCQkJCQlTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBzb3VyY2VNYXBwZXIuZmluZFNvdXJjZUZpbGVOYW1lKHR5cGUsIHJlYWRlcik7CisJCQkJCQlpZiAoc291cmNlRmlsZU5hbWUgIT0gbnVsbCkgeworCQkJCQkJCXNvdXJjZSA9IHNvdXJjZU1hcHBlci5maW5kU291cmNlKHR5cGUsIHNvdXJjZUZpbGVOYW1lKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTEyMzcsNyArMTE0Miw3IEBACiAJQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKEJpbmFyeVR5cGUpY2xhc3NGaWxlLmdldFR5cGUoKTsKIAlpZiAoY2xhc3NGaWxlLmlzT3BlbigpKSB7CiAJCS8vIHJldXNlIHRoZSBpbmZvIGZyb20gdGhlIGphdmEgbW9kZWwgY2FjaGUKLQkJcmV0dXJuIChJQmluYXJ5VHlwZSliaW5hcnlUeXBlLmdldFJhd0luZm8oKTsKKwkJcmV0dXJuIChJQmluYXJ5VHlwZSliaW5hcnlUeXBlLmdldEVsZW1lbnRJbmZvKCk7CiAJfSBlbHNlIHsKIAkJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IGluZm8KIAkJSUJpbmFyeVR5cGUgaW5mbzsKQEAgLTEyODEsMzIgKzExODYsMzUgQEAKIAkvKioKIAkgKiBMb2NhdGUgdGhlIG1hdGNoZXMgYW1vbmdzdCB0aGUgbWF0Y2hpbmcgb3BlbmFibGVzLgogCSAqLwotCXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzKEphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGxvY2F0ZU1hdGNoZXMoSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCQlNYXRjaGluZ09wZW5hYmxlW10gb3BlbmFibGVzID0gdGhpcy5tYXRjaGluZ09wZW5hYmxlcy5nZXRNYXRjaGluZ09wZW5hYmxlcyhqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKTsKIAkKLQkJYm9vbGVhbiBjb21waWxhdGlvbkFib3J0ZWQgPSBmYWxzZTsKKwkJdGhpcy5jb21waWxhdGlvbkFib3J0ZWQgPSBmYWxzZTsKIAogCQlpZiAodGhpcy5wYXR0ZXJuLm5lZWRzUmVzb2x2ZSkgewotCQkJLy8gYmluZGluZyBjcmVhdGlvbgotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG9wZW5hYmxlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeyAKLQkJCQlvcGVuYWJsZXNbaV0uYnVpbGRUeXBlQmluZGluZ3MoKTsKLQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg2KTsKLQkJCQkJfQorCQkJdGhpcy5jcmVhdGVBbmRSZXNvbHZlQmluZGluZ3Mob3BlbmFibGVzKTsKKwkJfQorCisJCS8vIGNyZWF0ZSBoaWVyYXJjaHkgcmVzb2x2ZXIgaWYgc2NvcGUgaXMgYSBoaWVyYXJjaHkgc2NvcGUKKwkJaWYgKHRoaXMuc2NvcGUgaW5zdGFuY2VvZiBIaWVyYXJjaHlTY29wZSkgeworCQkJSVR5cGUgZm9jdXNUeXBlID0gKChIaWVyYXJjaHlTY29wZSl0aGlzLnNjb3BlKS5mb2N1c1R5cGU7CisJCQlpZiAoZm9jdXNUeXBlICE9IG51bGwpIHsKKwkJCQlpZiAoIWZvY3VzVHlwZS5pc0JpbmFyeSgpKSB7CisJCQkJCS8vIGNhY2hlIGFsbCB0eXBlcyBpbiB0aGUgZm9jdXMnIGNvbXBpbGF0aW9uIHVuaXQgKGV2ZW4gc2Vjb25kYXJ5IHR5cGVzKQorCQkJCQl0aGlzLmFjY2VwdCgoSUNvbXBpbGF0aW9uVW5pdClmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwogCQkJCX0KKwkJCQkKKwkJCQljaGFyW10gZnVsbHlRdWFsaWZpZWROYW1lID0gZm9jdXNUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IG5ldyBIaWVyYXJjaHlSZXNvbHZlcih0aGlzLmxvb2t1cEVudmlyb25tZW50LCBudWxsLypoaWVyYXJjaHkgaXMgbm90IGdvaW5nIHRvIGJlIGNvbXB1dGVkKi8pOworCQkJCWlmICh0aGlzLmhpZXJhcmNoeVJlc29sdmVyLnNldEZvY3VzVHlwZShDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBmdWxseVF1YWxpZmllZE5hbWUpKSA9PSBudWxsKSB7CisJCQkJCS8vIGZvY3VzIHR5cGUgaXMgbm90IHZpc2libGUgZnJvbSB0aGlzIHByb2plY3QKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IG51bGw7CiAJCQl9Ci0JCi0JCQkvLyBiaW5kaW5nIHJlc29sdXRpb24KLQkJCXRyeSB7Ci0JCQkJdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jb21wbGV0ZVR5cGVCaW5kaW5ncygpOwotCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGg6IGl0IGNvdWxkIG5vdCBmaW5kIGJhc2UgY2xhc3NlcwotCQkJCS8vIGNvbnRpbnVlIHJlcG9ydGluZyBpbm5hY3VyYXRlIG1hdGNoZXMgKHNpbmNlIGJpbmRpbmdzIHdpbGwgYmUgbnVsbCkKLQkJCQljb21waWxhdGlvbkFib3J0ZWQgPSB0cnVlOwotCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5oaWVyYXJjaHlSZXNvbHZlciA9IG51bGw7CiAJCX0KIAogCQkvLyBtYXRjaGluZyBvcGVuYWJsZSByZXNvbHV0aW9uCkBAIC0xMzE5LDcgKzEyMjcsNiBAQAogCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUgPSBvcGVuYWJsZXNbaV07CiAJCQkJCiAJCQkJaWYgKCF0aGlzLmN1cnJlbnRNYXRjaGluZ09wZW5hYmxlLmhhc0FscmVhZHlEZWZpbmVkVHlwZSgpKSB7Ci0JCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUuc2hvdWxkUmVzb2x2ZSA9ICFjb21waWxhdGlvbkFib3J0ZWQ7CiAJCQkJCXRoaXMuY3VycmVudE1hdGNoaW5nT3BlbmFibGUubG9jYXRlTWF0Y2hlcygpOwogCQkJCX0gLy8gZWxzZSBza2lwIHR5cGUgaGFzIGl0IGlzIGhpZGRlbiBzbyBub3QgdmlzaWJsZQogCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CkBAIC0xMzQ0LDQgKzEyNTEsMjcgQEAKIAkJfQogCQl0aGlzLmN1cnJlbnRNYXRjaGluZ09wZW5hYmxlID0gbnVsbDsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisJdm9pZCBjcmVhdGVBbmRSZXNvbHZlQmluZGluZ3MoTWF0Y2hpbmdPcGVuYWJsZVtdIG9wZW5hYmxlcykgeworCQkvLyBiaW5kaW5nIGNyZWF0aW9uCisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvcGVuYWJsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsgCisJCQlvcGVuYWJsZXNbaV0uYnVpbGRUeXBlQmluZGluZ3MoKTsKKwkJCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyBiaW5kaW5nIHJlc29sdXRpb24KKwkJdHJ5IHsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3MgcGF0aDogaXQgY291bGQgbm90IGZpbmQgYmFzZSBjbGFzc2VzCisJCQkvLyBjb250aW51ZSByZXBvcnRpbmcgaW5uYWN1cmF0ZSBtYXRjaGVzIChzaW5jZSBiaW5kaW5ncyB3aWxsIGJlIG51bGwpCisJCQl0aGlzLmNvbXBpbGF0aW9uQWJvcnRlZCA9IHRydWU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvcjIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWE0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvcjIuamF2YQpAQCAtMCwwICsxLDEzODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSW52YWxpZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuSVR5cGVSZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlNvdXJjZVR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaGllcmFyY2h5LkhpZXJhcmNoeVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5IaWVyYXJjaHlTY29wZTsKKworLy8gVE9ETzogKGplcm9tZSkgcmVtb3ZlIGV4dGVuZHMKK3B1YmxpYyBjbGFzcyBNYXRjaExvY2F0b3IyIGV4dGVuZHMgTWF0Y2hMb2NhdG9yIGltcGxlbWVudHMgSVR5cGVSZXF1ZXN0b3IgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9BVF9PTkNFID0gNTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgUG90ZW50aWFsTWF0Y2hbXSBOT19QT1RFTlRJQUxfTUFUSCA9IG5ldyBQb3RlbnRpYWxNYXRjaFswXTsKKwkKKy8qCS8vIHBlcm1hbmVudCBzdGF0ZQorCXB1YmxpYyBTZWFyY2hQYXR0ZXJuIHBhdHRlcm47CisJcHVibGljIGludCBkZXRhaWxMZXZlbDsKKwlwdWJsaWMgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yOworCXB1YmxpYyBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlOworCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKKworCXB1YmxpYyBJV29ya2luZ0NvcHlbXSB3b3JraW5nQ29waWVzOworCXB1YmxpYyBIYW5kbGVGYWN0b3J5IGhhbmRsZUZhY3Rvcnk7CisKKwkvLyB0aGUgZm9sbG93aW5nIGlzIHZhbGlkIGZvciB0aGUgY3VycmVudCBwcm9qZWN0CisJcHVibGljIE1hdGNoTG9jYXRvclBhcnNlciBwYXJzZXI7CisJcHVibGljIElOYW1lRW52aXJvbm1lbnQgbmFtZUVudmlyb25tZW50OworCXB1YmxpYyBOYW1lTG9va3VwIG5hbWVMb29rdXA7CisJcHVibGljIExvb2t1cEVudmlyb25tZW50IGxvb2t1cEVudmlyb25tZW50OworCXB1YmxpYyBIaWVyYXJjaHlSZXNvbHZlciBoaWVyYXJjaHlSZXNvbHZlcjsKKwlib29sZWFuIGNvbXBpbGF0aW9uQWJvcnRlZDsKKyovCisJcHVibGljIFBvdGVudGlhbE1hdGNoU2V0IHBvdGVudGlhbE1hdGNoZXM7CisKKwlwdWJsaWMgaW50IHBhcnNlVGhyZXNob2xkID0gLTE7CisJcHVibGljIENvbXBpbGVyT3B0aW9ucyBvcHRpb25zOworCQorCS8vIG1hbmFnZW1lbnQgb2YgdW5pdCB0byBiZSBwcm9jZXNzZWQKKwlwdWJsaWMgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb25bXSB1bml0c1RvUHJvY2VzczsKKwlwdWJsaWMgUG90ZW50aWFsTWF0Y2hbXSBtYXRjaGVzVG9Qcm9jZXNzOworCXB1YmxpYyBpbnQgdG90YWxVbml0czsgLy8gKHRvdGFsVW5pdHMtMSkgZ2l2ZXMgdGhlIGxhc3QgdW5pdCBpbiB1bml0VG9Qcm9jZXNzCisJCisJcHVibGljIFBvdGVudGlhbE1hdGNoIGN1cnJlbnRQb3RlbnRpYWxNYXRjaDsKKwkKKwlwdWJsaWMgTWF0Y2hMb2NhdG9yMigKKwkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAorCQlpbnQgZGV0YWlsTGV2ZWwsCisJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSwKKwkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKwkJCQorCQlzdXBlcihwYXR0ZXJuLCBkZXRhaWxMZXZlbCwgY29sbGVjdG9yLCBzY29wZSwgcHJvZ3Jlc3NNb25pdG9yKTsKKwkJCisJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47CisJCXRoaXMuZGV0YWlsTGV2ZWwgPSBkZXRhaWxMZXZlbDsKKwkJdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisJCXRoaXMuc2NvcGUgPSBzY29wZTsKKwkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7CisJfQorCS8qKgorCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGJpbmFyeSB0eXBlCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElCaW5hcnlUeXBlIGJpbmFyeVR5cGUsIFBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nKSB7CisJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuY3JlYXRlQmluYXJ5VHlwZUZyb20oYmluYXJ5VHlwZSwgcGFja2FnZUJpbmRpbmcpOworCX0KKwkvKioKKwkgKiBBZGQgYW4gYWRkaXRpb25hbCBjb21waWxhdGlvbiB1bml0IGludG8gdGhlIGxvb3AKKwkgKiAgLT4gIGJ1aWxkIGNvbXBpbGF0aW9uIHVuaXQgZGVjbGFyYXRpb25zLCB0aGVpciBiaW5kaW5ncyBhbmQgcmVjb3JkIHRoZWlyIHJlc3VsdHMuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0KElDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCkgeworCQkvLyBTd2l0Y2ggdGhlIGN1cnJlbnQgcG9saWN5IGFuZCBjb21waWxhdGlvbiByZXN1bHQgZm9yIHRoaXMgdW5pdCB0byB0aGUgcmVxdWVzdGVkIG9uZS4KKwkJQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCA9CisJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgdG90YWxVbml0cywgdG90YWxVbml0cywgdGhpcy5vcHRpb25zLm1heFByb2JsZW1zUGVyVW5pdCk7CisJCXRyeSB7CisJCQkvLyBkaWV0IHBhcnNpbmcgZm9yIGxhcmdlIGNvbGxlY3Rpb24gb2YgdW5pdAorCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdDsKKwkJCU1hdGNoU2V0IG9yaWdpbmFsTWF0Y2hTZXQgPSB0aGlzLnBhcnNlci5tYXRjaFNldDsKKwkJCXRyeSB7CisJCQkJdGhpcy5wYXJzZXIubWF0Y2hTZXQgPSBuZXcgTWF0Y2hpbmdOb2RlU2V0KHRoaXMpOworCQkJCWlmICh0b3RhbFVuaXRzIDwgcGFyc2VUaHJlc2hvbGQpIHsKKwkJCQkJcGFyc2VkVW5pdCA9IHBhcnNlci5wYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwYXJzZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCB1bml0UmVzdWx0KTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCXRoaXMucGFyc2VyLm1hdGNoU2V0ID0gb3JpZ2luYWxNYXRjaFNldDsKKwkJCX0KKwkJCisJCQkvLyBpbml0aWFsIHR5cGUgYmluZGluZyBjcmVhdGlvbgorCQkJbG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCQl0aGlzLmFkZENvbXBpbGF0aW9uVW5pdChzb3VyY2VVbml0LCBwYXJzZWRVbml0KTsKKwkKKwkJCS8vIGJpbmRpbmcgcmVzb2x1dGlvbgorCQkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb25Vbml0IGUpIHsKKwkJCS8vIGF0IHRoaXMgcG9pbnQsIGN1cnJlbnRDb21waWxhdGlvblVuaXRSZXN1bHQgbWF5IG5vdCBiZSBzb3VyY2VVbml0LCBidXQgc29tZSBvdGhlcgorCQkJLy8gb25lIHJlcXVlc3RlZCBmdXJ0aGVyIGFsb25nIHRvIHJlc29sdmUgc291cmNlVW5pdC4KKwkJCWlmICh1bml0UmVzdWx0LmNvbXBpbGF0aW9uVW5pdCA9PSBzb3VyY2VVbml0KSB7IC8vIG9ubHkgcmVwb3J0IG9uY2UKKwkJCQkvL3JlcXVlc3Rvci5hY2NlcHRSZXN1bHQodW5pdFJlc3VsdC50YWdBc0FjY2VwdGVkKCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBlOyAvLyB3YW50IHRvIGFib3J0IGVuY2xvc2luZyByZXF1ZXN0IHRvIGNvbXBpbGUKKwkJCX0KKwkJfQorCX0KKwkvKioKKwkgKiBBZGQgYWRkaXRpb25hbCBzb3VyY2UgdHlwZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHQoSVNvdXJjZVR5cGVbXSBzb3VyY2VUeXBlcywgUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcpIHsKKwkJLy8gY2FzZSBvZiBTZWFyY2hhYmxlRW52aXJvbm1lbnQgb2YgYW4gSUphdmFQcm9qZWN0IGlzIHVzZWQKKwkJSVNvdXJjZVR5cGUgc291cmNlVHlwZSA9IHNvdXJjZVR5cGVzWzBdOworCQl3aGlsZSAoc291cmNlVHlwZS5nZXRFbmNsb3NpbmdUeXBlKCkgIT0gbnVsbCkKKwkJCXNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlLmdldEVuY2xvc2luZ1R5cGUoKTsKKwkJaWYgKHNvdXJjZVR5cGUgaW5zdGFuY2VvZiBTb3VyY2VUeXBlRWxlbWVudEluZm8pIHsKKwkJCS8vIGdldCBzb3VyY2UKKwkJCVNvdXJjZVR5cGVFbGVtZW50SW5mbyBlbGVtZW50SW5mbyA9IChTb3VyY2VUeXBlRWxlbWVudEluZm8pIHNvdXJjZVR5cGU7CisJCQlJVHlwZSB0eXBlID0gZWxlbWVudEluZm8uZ2V0SGFuZGxlKCk7CisJCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCl0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOworCQkJdGhpcy5hY2NlcHQoc291cmNlVW5pdCk7CisJCX0gZWxzZSB7CisJCQlDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPQorCQkJCW5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlLmdldEZpbGVOYW1lKCksIDAsIDAsIDApOworCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9CisJCQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdCgKKwkJCQkJc291cmNlVHlwZXMsCisJCQkJCXRydWUsIC8vIG5lZWQgZmllbGQgYW5kIG1ldGhvZHMKKwkJCQkJdHJ1ZSwgLy8gbmVlZCBtZW1iZXIgdHlwZXMKKwkJCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCisJCQkJCWxvb2t1cEVudmlyb25tZW50LnByb2JsZW1SZXBvcnRlciwKKwkJCQkJcmVzdWx0KTsKKwkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModW5pdCk7CisJCQl0aGlzLmxvb2t1cEVudmlyb25tZW50LmNvbXBsZXRlVHlwZUJpbmRpbmdzKHVuaXQsIHRydWUpOworCQl9CisJfQkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxhdGlvblVuaXQoCisJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCwKKwkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgeworCisJCS8vIGFwcGVuZCB0aGUgdW5pdCB0byB0aGUgbGlzdCBvZiBvbmVzIHRvIHByb2Nlc3MgbGF0ZXIgb24KKwkJaW50IHNpemUgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzLmxlbmd0aDsKKwkJaWYgKHRoaXMudG90YWxVbml0cyA9PSBzaXplKSB7CisJCQkvLyB3aGVuIGdyb3dpbmcgcmVwb3NpdGlvbiB1bml0cyBzdGFydGluZyBhdCBwb3NpdGlvbiAwCisJCQlpbnQgbmV3U2l6ZSA9IHNpemUgPT0gMCA/IDEgOiBzaXplICogMjsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJdGhpcy51bml0c1RvUHJvY2VzcywKKwkJCQkwLAorCQkJCSh0aGlzLnVuaXRzVG9Qcm9jZXNzID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW25ld1NpemVdKSwKKwkJCQkwLAorCQkJCXRoaXMudG90YWxVbml0cyk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJCXRoaXMubWF0Y2hlc1RvUHJvY2VzcywKKwkJCQkwLAorCQkJCSh0aGlzLm1hdGNoZXNUb1Byb2Nlc3MgPSBuZXcgUG90ZW50aWFsTWF0Y2hbbmV3U2l6ZV0pLAorCQkJCTAsCisJCQkJdGhpcy50b3RhbFVuaXRzKTsKKwkJfQorCQlpZiAoc291cmNlVW5pdCBpbnN0YW5jZW9mIFBvdGVudGlhbE1hdGNoKSB7CisJCQl0aGlzLm1hdGNoZXNUb1Byb2Nlc3NbdGhpcy50b3RhbFVuaXRzXSA9IChQb3RlbnRpYWxNYXRjaClzb3VyY2VVbml0OworCQl9CisJCXRoaXMudW5pdHNUb1Byb2Nlc3NbdGhpcy50b3RhbFVuaXRzXSA9IHBhcnNlZFVuaXQ7CisJCXRoaXMudG90YWxVbml0cysrOworCX0JCisJdm9pZCBhZGRQb3RlbnRpYWxNYXRjaChJUmVzb3VyY2UgcmVzb3VyY2UsIE9wZW5hYmxlIG9wZW5hYmxlKSB7CisJCVBvdGVudGlhbE1hdGNoIHBvdGVudGlhbE1hdGNoID0gbmV3IFBvdGVudGlhbE1hdGNoKHRoaXMsIHJlc291cmNlLCBvcGVuYWJsZSk7CisJCXRoaXMucG90ZW50aWFsTWF0Y2hlcy5hZGQocG90ZW50aWFsTWF0Y2gpOworCX0KKwkvKgorCSAqIENhY2hlcyB0aGUgZ2l2ZW4gYmluYXJ5IHR5cGUgaW4gdGhlIGxvb2t1cCBlbnZpcm9ubWVudCBhbmQgcmV0dXJucyBpdC4KKwkgKiBSZXR1cm5zIHRoZSBleGlzdGluZyBvbmUgaWYgYWxyZWFkeSBjYWNoZWQuCisJICogUmV0dXJucyBudWxsIGlmIHNvdXJjZSB0eXBlIGJpbmRpbmcgd2FzIGNhY2hlZC4KKwkgKi8KKwlCaW5hcnlUeXBlQmluZGluZyBjYWNoZUJpbmFyeVR5cGUoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlUeXBlIGVuY2xvc2luZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwkJaWYgKGVuY2xvc2luZ1R5cGUgIT0gbnVsbCkgeworCQkJLy8gZm9yY2UgY2FjaGluZyBvZiBlbmNsb3NpbmcgdHlwZXMgZmlyc3QsIHNvIHRoYXQgYmluYXJ5IHR5cGUgY2FuIGJlIGZvdW5kIGluIGxvb2t1cCBlbnZpcm9tZW50CisJCQl0aGlzLmNhY2hlQmluYXJ5VHlwZShlbmNsb3NpbmdUeXBlKTsKKwkJfQorCQlJQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKElCaW5hcnlUeXBlKSgoQmluYXJ5VHlwZSl0eXBlKS5nZXRFbGVtZW50SW5mbygpOworCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5sb29rdXBFbnZpcm9ubWVudC5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSk7CisJCWlmIChiaW5kaW5nID09IG51bGwpIHsgLy8gaXQgd2FzIGFscmVhZHkgY2FjaGVkIGFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgcXVlcnkKKwkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKSk7CisJCQlSZWZlcmVuY2VCaW5kaW5nIHJlZmVyZW5jZUJpbmRpbmcgPSB0aGlzLmxvb2t1cEVudmlyb25tZW50LmdldENhY2hlZFR5cGUoY29tcG91bmROYW1lKTsKKwkJCWlmIChyZWZlcmVuY2VCaW5kaW5nICE9IG51bGwgJiYgKHJlZmVyZW5jZUJpbmRpbmcgaW5zdGFuY2VvZiBCaW5hcnlUeXBlQmluZGluZykpIHsKKwkJCQkvLyBpZiB0aGUgYmluZGluZyBjb3VsZCBiZSBmb3VuZCBhbmQgaWYgaXQgY29tZXMgZnJvbSBhIGJpbmFyeSB0eXBlLAorCQkJCWJpbmRpbmcgPSAoQmluYXJ5VHlwZUJpbmRpbmcpcmVmZXJlbmNlQmluZGluZzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmluZGluZzsKKwl9CisJcHVibGljICBDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyKElUeXBlIHR5cGUpIHsKKwkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0eXBlLmdldENsYXNzRmlsZSgpOyAKKwkJaWYgKCgoSU9wZW5hYmxlKWNsYXNzRmlsZSkuaXNPcGVuKCkpIHsKKwkJCUphdmFNb2RlbE1hbmFnZXIgbWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpOworCQkJc3luY2hyb25pemVkKG1hbmFnZXIpeworCQkJCXJldHVybiAoQ2xhc3NGaWxlUmVhZGVyKW1hbmFnZXIuZ2V0SW5mbyh0eXBlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpcGtnLmdldFBhcmVudCgpOworCQkJdHJ5IHsKKwkJCQlpZiAocm9vdC5pc0FyY2hpdmUoKSkgeworCQkJCQlJUGF0aCB6aXBQYXRoID0gcm9vdC5pc0V4dGVybmFsKCkgPyByb290LmdldFBhdGgoKSA6IHJvb3QuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOworCQkJCQlpZiAoemlwUGF0aCA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gbG9jYXRpb24gaXMgbnVsbAorCQkJCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbTWF0Y2hMb2NhdG9yLmNsYXNzRmlsZVJlYWRlcigpXSBDcmVhdGluZyBaaXBGaWxlIG9uICIgKyB6aXBQYXRoKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCisJCQkJCQl9CisJCQkJCQkvLyBUT0RPOiAoamVyb21lKSBzaG91bGQgdXNlIEphdmFNb2RlbE1hbmFnZXIuZ2V0WmlwRmlsZSguLi4pIGluc3RlYWQKKwkJCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBQYXRoLnRvT1NTdHJpbmcoKSk7CisJCQkJCQljaGFyW10gcGtnUGF0aCA9IHBrZy5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQkJCQlDaGFyT3BlcmF0aW9uLnJlcGxhY2UocGtnUGF0aCwgJy4nLCAnLycpOworCQkJCQkJY2hhcltdIGNsYXNzRmlsZU5hbWUgPSBjbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOworCQkJCQkJY2hhcltdIHBhdGggPSBwa2dQYXRoLmxlbmd0aCA9PSAwID8gY2xhc3NGaWxlTmFtZSA6IENoYXJPcGVyYXRpb24uY29uY2F0KHBrZ1BhdGgsIGNsYXNzRmlsZU5hbWUsICcvJyk7CisJCQkJCQlyZXR1cm4gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoemlwRmlsZSwgbmV3IFN0cmluZyhwYXRoKSk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJemlwRmlsZS5jbG9zZSgpOworCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gQ2xhc3NGaWxlUmVhZGVyLnJlYWQodHlwZS5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChDbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogQWRkIHRoZSBpbml0aWFsIHNldCBvZiBjb21waWxhdGlvbiB1bml0cyBpbnRvIHRoZSBsb29wCisJICogIC0+ICBidWlsZCBjb21waWxhdGlvbiB1bml0IGRlY2xhcmF0aW9ucywgdGhlaXIgYmluZGluZ3MgYW5kIHJlY29yZCB0aGVpciByZXN1bHRzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFuZFJlc29sdmVCaW5kaW5ncyhQb3RlbnRpYWxNYXRjaFtdIHBvdGVudGlhbE1hdGNoZXMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworCisJCWZvciAoaW50IGkgPSBzdGFydCwgbWF4VW5pdHMgPSBzdGFydCtsZW5ndGg7IGkgPCBtYXhVbml0czsgaSsrKSB7CisJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKwkJCX0KKwkJCVBvdGVudGlhbE1hdGNoIHBvdGVudGlhbE1hdGNoID0gcG90ZW50aWFsTWF0Y2hlc1tpXTsKKwkJCXRyeSB7CisJCQkJaWYgKHBvdGVudGlhbE1hdGNoICE9IG51bGwpIHsKKwkJCQkJdGhpcy5wYXJzZXIubWF0Y2hTZXQgPSBwb3RlbnRpYWxNYXRjaC5tYXRjaGluZ05vZGVTZXQ7CisJCQkJfQorCQkJCUNvbXBpbGF0aW9uUmVzdWx0IHVuaXRSZXN1bHQgPQorCQkJCQluZXcgQ29tcGlsYXRpb25SZXN1bHQocG90ZW50aWFsTWF0Y2gsIGksIG1heFVuaXRzLCB0aGlzLm9wdGlvbnMubWF4UHJvYmxlbXNQZXJVbml0KTsKKwkJCQkJCisJCQkJaWYgKFNlYXJjaEVuZ2luZS5WRVJCT1NFKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyc2luZyAiICsgcG90ZW50aWFsTWF0Y2gub3BlbmFibGUudG9TdHJpbmdXaXRoQW5jZXN0b3JzKCkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCisJCQkJLy8gZGlldCBwYXJzaW5nIGZvciBsYXJnZSBjb2xsZWN0aW9uIG9mIHVuaXRzCisJCQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdDsKKwkJCQlpZiAodG90YWxVbml0cyA8IHBhcnNlVGhyZXNob2xkKSB7CisJCQkJCXBhcnNlZFVuaXQgPSB0aGlzLnBhcnNlci5wYXJzZShwb3RlbnRpYWxNYXRjaCwgdW5pdFJlc3VsdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGFyc2VkVW5pdCA9IHRoaXMucGFyc2VyLmRpZXRQYXJzZShwb3RlbnRpYWxNYXRjaCwgdW5pdFJlc3VsdCk7CisJCQkJfQorCQkJCQkJCQkKKwkJCQkvLyBpbml0aWFsIHR5cGUgYmluZGluZyBjcmVhdGlvbgorCQkJCWlmIChwYXJzZWRVbml0ICE9IG51bGwgJiYgIXBhcnNlZFVuaXQuaXNFbXB0eSgpKSB7CisJCQkJCXRoaXMubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3MocGFyc2VkVW5pdCk7CisJCQkJfQorCQkJCQorCQkJCXRoaXMuYWRkQ29tcGlsYXRpb25Vbml0KHBvdGVudGlhbE1hdGNoLCBwYXJzZWRVbml0KTsKKwkJCQkKKwkJCQkvLyBwcm9ncmVzcyByZXBvcnRpbmcKKwkJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNCk7CisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCQl0aGlzLnBhcnNlci5tYXRjaFNldCA9IG51bGw7CisJCQkJcG90ZW50aWFsTWF0Y2hlc1tpXSA9IG51bGw7IC8vIG5vIGxvbmdlciBob2xkIG9udG8gdGhlIHVuaXQKKwkJCX0KKwkJfQorCQkvLyBiaW5kaW5nIHJlc29sdXRpb24KKwkJbG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3MoKTsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbiBJRmllbGQgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHR5cGUuIAorCSAqLworCXB1YmxpYyBJRmllbGQgY3JlYXRlRmllbGRIYW5kbGUoCisJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQsCisJCUlUeXBlIHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiB0eXBlLmdldEZpZWxkKG5ldyBTdHJpbmcoZmllbGQubmFtZSkpOworCX0KKwkvKgorCSAqIENyZWF0ZXMgaGllcmFyY2h5IHJlc29sdmVyIGlmIG5lZWRlZC4gCisJICogUmV0dXJucyB3aGV0aGVyIGZvY3VzIGlzIHZpc2libGUuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlSGllcmFyY2h5UmVzb2x2ZXIoUG90ZW50aWFsTWF0Y2hbXSBwb3RlbnRpYWxNYXRjaGVzKSB7CisJCS8vIGNyZWF0ZSBoaWVyYXJjaHkgcmVzb2x2ZXIgaWYgc2NvcGUgaXMgYSBoaWVyYXJjaHkgc2NvcGUKKwkJSVR5cGUgZm9jdXNUeXBlID0gZ2V0Rm9jdXNUeXBlKCk7CisJCWlmIChmb2N1c1R5cGUgIT0gbnVsbCkgeworCQkJLy8gY2FjaGUgZm9jdXMgdHlwZSBpZiBub3QgYSBwb3RlbnRpYWwgbWF0Y2gKKwkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIGZvY3VzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS50b0NoYXJBcnJheSgpKTsKKwkJCWJvb2xlYW4gaXNQb3RlbnRpYWxNYXRjaCA9IGZhbHNlOworCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHBvdGVudGlhbE1hdGNoZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoQ2hhck9wZXJhdGlvbi5lcXVhbHMocG90ZW50aWFsTWF0Y2hlc1tpXS5jb21wb3VuZE5hbWUsIGNvbXBvdW5kTmFtZSkpIHsKKwkJCQkJaXNQb3RlbnRpYWxNYXRjaCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghaXNQb3RlbnRpYWxNYXRjaCkgeworCQkJCWlmIChmb2N1c1R5cGUuaXNCaW5hcnkoKSkgeworCQkJCQkvLyBjYWNoZSBiaW5hcnkgdHlwZQorCQkJCQl0cnkgeworCQkJCQkJdGhpcy5jYWNoZUJpbmFyeVR5cGUoZm9jdXNUeXBlKTsKKwkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGNhY2hlIGFsbCB0eXBlcyBpbiB0aGUgZm9jdXMnIGNvbXBpbGF0aW9uIHVuaXQgKGV2ZW4gc2Vjb25kYXJ5IHR5cGVzKQorCQkJCQl0aGlzLmFjY2VwdCgoSUNvbXBpbGF0aW9uVW5pdClmb2N1c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJLy8gcmVzb2x2ZSBmb2N1cyB0eXBlCisJCQl0aGlzLmhpZXJhcmNoeVJlc29sdmVyID0gbmV3IEhpZXJhcmNoeVJlc29sdmVyKHRoaXMubG9va3VwRW52aXJvbm1lbnQsIG51bGwvKmhpZXJhcmNoeSBpcyBub3QgZ29pbmcgdG8gYmUgY29tcHV0ZWQqLyk7CisJCQlpZiAodGhpcy5oaWVyYXJjaHlSZXNvbHZlci5zZXRGb2N1c1R5cGUoY29tcG91bmROYW1lKSA9PSBudWxsKSB7CisJCQkJLy8gZm9jdXMgdHlwZSBpcyBub3QgdmlzaWJsZSBmcm9tIHRoaXMgcHJvamVjdAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuaGllcmFyY2h5UmVzb2x2ZXIgPSBudWxsOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGFuIElJbXBvcnREZWNsYXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBpbXBvcnQgc3RhdGVtZW50CisJICovCisJcHVibGljIElKYXZhRWxlbWVudCBjcmVhdGVJbXBvcnRIYW5kbGUoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZikgeworCQljaGFyW10gaW1wb3J0TmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChpbXBvcnRSZWYuZ2V0SW1wb3J0TmFtZSgpLCAnLicpOworCQlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSB7CisJCQlpbXBvcnROYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQoaW1wb3J0TmFtZSwgIi4qIiAudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlPcGVuYWJsZSBjdXJyZW50T3BlbmFibGUgPSB0aGlzLmdldEN1cnJlbnRPcGVuYWJsZSgpOworCQlpZiAoY3VycmVudE9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisJCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXQpY3VycmVudE9wZW5hYmxlKS5nZXRJbXBvcnQoCisJCQkJbmV3IFN0cmluZyhpbXBvcnROYW1lKSk7CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSljdXJyZW50T3BlbmFibGUpLmdldFR5cGUoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbiBJSW5pdGlhbGl6ZXIgZnJvbSB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gYW5kIHR5cGUuIAorCSAqLworCXB1YmxpYyBJSW5pdGlhbGl6ZXIgY3JlYXRlSW5pdGlhbGl6ZXJIYW5kbGUoCisJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCwKKwkJRmllbGREZWNsYXJhdGlvbiBpbml0aWFsaXplciwKKwkJSVR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworCQkvLyBmaW5kIG9jY3VyZW5jZSBjb3VudCBvZiB0aGUgZ2l2ZW4gaW5pdGlhbGl6ZXIgaW4gaXRzIHR5cGUgZGVjbGFyYXRpb24KKwkJaW50IG9jY3VycmVuY2VDb3VudCA9IDA7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlRGVjbC5maWVsZHM7CisJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZHNbaV07CisJCQlpZiAoIWZpZWxkLmlzRmllbGQoKSkgeworCQkJCW9jY3VycmVuY2VDb3VudCsrOworCQkJCWlmIChmaWVsZC5lcXVhbHMoaW5pdGlhbGl6ZXIpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiB0eXBlLmdldEluaXRpYWxpemVyKG9jY3VycmVuY2VDb3VudCk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gSU1ldGhvZCBmcm9tIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIHR5cGUuIAorCSAqLworCXB1YmxpYyBJTWV0aG9kIGNyZWF0ZU1ldGhvZEhhbmRsZSgKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsCisJCUlUeXBlIHR5cGUpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCUFyZ3VtZW50W10gYXJndW1lbnRzID0gbWV0aG9kLmFyZ3VtZW50czsKKwkJaW50IGxlbmd0aCA9IGFyZ3VtZW50cyA9PSBudWxsID8gMCA6IGFyZ3VtZW50cy5sZW5ndGg7CisJCWlmICh0eXBlLmlzQmluYXJ5KCkpIHsKKwkJCS8vIGRvbid0IGNhY2hlIHRoZSBtZXRob2RzIG9mIHRoZSBiaW5hcnkgdHlwZQorCQkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IHRoaXMuY2xhc3NGaWxlUmVhZGVyKHR5cGUpOworCQkJaWYgKHJlYWRlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gcmVhZGVyLmdldE1ldGhvZHMoKTsKKworCQkJaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwLCBtZXRob2RzTGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtZXRob2RzTGVuZ3RoOyBpKyspIHsKKwkJCQkJSUJpbmFyeU1ldGhvZCBiaW5hcnlNZXRob2QgPSBtZXRob2RzW2ldOworCQkJCQljaGFyW10gc2VsZWN0b3IgPSBiaW5hcnlNZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gdHlwZS5nZXRFbGVtZW50TmFtZSgpLnRvQ2hhckFycmF5KCkgOiBiaW5hcnlNZXRob2QuZ2V0U2VsZWN0b3IoKTsKKwkJCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHNlbGVjdG9yLCBtZXRob2Quc2VsZWN0b3IpKSB7CisJCQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhuZXcgU3RyaW5nKGJpbmFyeU1ldGhvZC5nZXRNZXRob2REZXNjcmlwdG9yKCkpKTsKKwkJCQkJCWlmIChsZW5ndGggIT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSBjb250aW51ZTsKKwkJCQkJCWJvb2xlYW4gc2FtZVBhcmFtZXRlcnMgPSB0cnVlOworCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworCQkJCQkJCVR5cGVSZWZlcmVuY2UgcGFyYW1ldGVyVHlwZSA9IGFyZ3VtZW50c1tqXS50eXBlOworCQkJCQkJCWNoYXJbXSB0eXBlTmFtZSA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwYXJhbWV0ZXJUeXBlLmdldFR5cGVOYW1lKCksICcuJyk7CisJCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwYXJhbWV0ZXJUeXBlLmRpbWVuc2lvbnMoKTsgaysrKSB7CisJCQkJCQkJCXR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXQodHlwZU5hbWUsICJbXSIgLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCQkJCQkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZSA9IHBhcmFtZXRlclR5cGVzW2pdLnJlcGxhY2UoJy8nLCAnLicpOworCQkJCQkJCWlmICghU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVOYW1lKS5lbmRzV2l0aChuZXcgU3RyaW5nKHR5cGVOYW1lKSkpIHsKKwkJCQkJCQkJc2FtZVBhcmFtZXRlcnMgPSBmYWxzZTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcGFyYW1ldGVyVHlwZXNbal0gPSBwYXJhbWV0ZXJUeXBlTmFtZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoc2FtZVBhcmFtZXRlcnMpIHsKKwkJCQkJCQlyZXR1cm4gdHlwZS5nZXRNZXRob2QobmV3IFN0cmluZyhzZWxlY3RvciksIHBhcmFtZXRlclR5cGVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgeworCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJVHlwZVJlZmVyZW5jZSBwYXJhbWV0ZXJUeXBlID0gYXJndW1lbnRzW2ldLnR5cGU7CisJCQkJY2hhcltdIHR5cGVOYW1lID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhcmFtZXRlclR5cGUuZ2V0VHlwZU5hbWUoKSwgJy4nKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtZXRlclR5cGUuZGltZW5zaW9ucygpOyBqKyspIHsKKwkJCQkJdHlwZU5hbWUgPSBDaGFyT3BlcmF0aW9uLmNvbmNhdCh0eXBlTmFtZSwgIltdIiAudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXNbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0eXBlTmFtZSwgZmFsc2UpOworCQkJfQorCQkJcmV0dXJuIHR5cGUuZ2V0TWV0aG9kKG5ldyBTdHJpbmcobWV0aG9kLnNlbGVjdG9yKSwgcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpOworCQl9CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYW4gSVR5cGUgZnJvbSB0aGUgZ2l2ZW4gc2ltcGxlIHRvcCBsZXZlbCB0eXBlIG5hbWUuIAorCSAqLworCXB1YmxpYyBJVHlwZSBjcmVhdGVUeXBlSGFuZGxlKGNoYXJbXSBzaW1wbGVUeXBlTmFtZSkgeworCQlPcGVuYWJsZSBjdXJyZW50T3BlbmFibGUgPSB0aGlzLmdldEN1cnJlbnRPcGVuYWJsZSgpOworCQlpZiAoY3VycmVudE9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisJCQkvLyBjcmVhdGVzIGNvbXBpbGF0aW9uIHVuaXQKKwkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCljdXJyZW50T3BlbmFibGU7CisJCisJCQkvLyBjcmVhdGUgdHlwZQorCQkJcmV0dXJuIHVuaXQuZ2V0VHlwZShuZXcgU3RyaW5nKHNpbXBsZVR5cGVOYW1lKSk7CisJCX0gZWxzZSB7CisJCQlJVHlwZSB0eXBlOyAKKwkJCXRyeSB7CisJCQkJdHlwZSA9ICgob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKWN1cnJlbnRPcGVuYWJsZSkuZ2V0VHlwZSgpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCS8vIGVuc3VyZSB0aGlzIGlzIGEgdG9wIGxldmVsIHR5cGUgKHNlZSBidWcgMjAwMTEgIFNlYXJjaGluZyBmb3IgSW5uZXIgQ2xhc3NlcyBnaXZlcyBiYWQgc2VhcmNoIHJlc3VsdHMpCisJCQlyZXR1cm4gTWF0Y2hpbmdPcGVuYWJsZS5nZXRUb3BMZXZlbFR5cGUodHlwZSk7CisJCX0KKwl9CisJLyoqCisJICogQ3JlYXRlcyBhbiBJVHlwZSBmcm9tIHRoZSBnaXZlbiBzaW1wbGUgaW5uZXIgdHlwZSBuYW1lIGFuZCBwYXJlbnQgdHlwZS4gCisJICovCisJcHVibGljIElUeXBlIGNyZWF0ZVR5cGVIYW5kbGUoSVR5cGUgcGFyZW50LCBjaGFyW10gc2ltcGxlVHlwZU5hbWUpIHsKKwkJcmV0dXJuIHBhcmVudC5nZXRUeXBlKG5ldyBTdHJpbmcoc2ltcGxlVHlwZU5hbWUpKTsKKwl9CisJcHJvdGVjdGVkIE9wZW5hYmxlIGdldEN1cnJlbnRPcGVuYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoLm9wZW5hYmxlOworCX0KKwlwcm90ZWN0ZWQgSVJlc291cmNlIGdldEN1cnJlbnRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoLnJlc291cmNlOworCX0KKwlwcm90ZWN0ZWQgSVR5cGUgZ2V0Rm9jdXNUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zY29wZSBpbnN0YW5jZW9mIEhpZXJhcmNoeVNjb3BlID8gKChIaWVyYXJjaHlTY29wZSl0aGlzLnNjb3BlKS5mb2N1c1R5cGUgOiBudWxsOworCX0KKwlwdWJsaWMgSUJpbmFyeVR5cGUgZ2V0QmluYXJ5SW5mbyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUgY2xhc3NGaWxlLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQmluYXJ5VHlwZSBiaW5hcnlUeXBlID0gKEJpbmFyeVR5cGUpY2xhc3NGaWxlLmdldFR5cGUoKTsKKwkJaWYgKGNsYXNzRmlsZS5pc09wZW4oKSkgeworCQkJLy8gcmV1c2UgdGhlIGluZm8gZnJvbSB0aGUgamF2YSBtb2RlbCBjYWNoZQorCQkJcmV0dXJuIChJQmluYXJ5VHlwZSliaW5hcnlUeXBlLmdldEVsZW1lbnRJbmZvKCk7CisJCX0gZWxzZSB7CisJCQkvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgaW5mbworCQkJSUJpbmFyeVR5cGUgaW5mbzsKKwkJCXRyeSB7CisJCQkJSUphdmFFbGVtZW50IHBrZyA9IGNsYXNzRmlsZS5nZXRQYXJlbnQoKTsKKwkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdClwa2cuZ2V0UGFyZW50KCk7CisJCQkJaWYgKHJvb3QuaXNBcmNoaXZlKCkpIHsKKwkJCQkJLy8gY2xhc3MgZmlsZSBpbiBhIGphcgorCQkJCQlTdHJpbmcgcGtnUGF0aCA9IHBrZy5nZXRFbGVtZW50TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworCQkJCQlTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IAorCQkJCQkJKHBrZ1BhdGgubGVuZ3RoKCkgPiAwKSA/CisJCQkJCQkJcGtnUGF0aCArICIvIiArIGNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpIDogLy8kTk9OLU5MUy0xJAorCQkJCQkJCWNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpOworCQkJCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJemlwRmlsZSA9ICgoSmFyUGFja2FnZUZyYWdtZW50Um9vdClyb290KS5nZXRKYXIoKTsKKwkJCQkJCWluZm8gPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyLnJlYWQoCisJCQkJCQkJemlwRmlsZSwKKwkJCQkJCQljbGFzc0ZpbGVQYXRoKTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8vIGNsYXNzIGZpbGUgaW4gYSBkaXJlY3RvcnkKKwkJCQkJU3RyaW5nIG9zUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOworCQkJCQlpbmZvID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlci5yZWFkKG9zUGF0aCk7CisJCQkJfQorCQkJCXJldHVybiBpbmZvOworCQkJfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKGUsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU9fRVhDRVBUSU9OKTsKKwkJCX0KKwkJfQorCX0KKwlwcm90ZWN0ZWQgdm9pZCBnZXRNZXRob2RCb2RpZXMoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCwgaW50IHBsYWNlKSB7CisJCS8vZmlsbCB0aGUgbWV0aG9kcyBib2RpZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAorCisJCWlmICh1bml0Lmlnbm9yZU1ldGhvZEJvZGllcykgeworCQkJdW5pdC5pZ25vcmVGdXJ0aGVySW52ZXN0aWdhdGlvbiA9IHRydWU7CisJCQlyZXR1cm47CisJCQkvLyBpZiBpbml0aWFsIGRpZXQgcGFyc2UgZGlkIG5vdCB3b3JrLCBubyBuZWVkIHRvIGRpZyBpbnRvIG1ldGhvZCBib2RpZXMuCisJCX0KKworCQlpZiAocGxhY2UgPCBwYXJzZVRocmVzaG9sZCkKKwkJCXJldHVybjsgLy93b3JrIGFscmVhZHkgZG9uZSAuLi4KKworCQkvL3JlYWwgcGFyc2Ugb2YgdGhlIG1ldGhvZC4uLi4KKwkJdGhpcy5wYXJzZXIuc2Nhbm5lci5zZXRTb3VyY2UodW5pdC5jb21waWxhdGlvblJlc3VsdC5jb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSk7CisJCXRoaXMucGFyc2VyLnBhcnNlQm9kaWVzKHVuaXQpOworCX0KKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgcGFyc2VyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCwgYXMgd2VsbCBhcyBhIGxvb2t1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlpbml0aWFsaXplKHByb2plY3QsIE5PX1BPVEVOVElBTF9NQVRIKTsKKwl9CisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHBhcnNlciBmb3IgdGhlIGdpdmVuIHByb2plY3QsIGFzIHdlbGwgYXMgYSBsb29rdXAgZW52aXJvbm1lbnQuCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUHJvamVjdCBwcm9qZWN0LCBQb3RlbnRpYWxNYXRjaFtdIHBvdGVudGlhbE1hdGNoZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkvLyBjcmVhdGUgbmFtZSBlbnZpcm9ubWVudAorCQlpZiAodGhpcy5uYW1lRW52aXJvbm1lbnQgIT0gbnVsbCkgeyAvLyBjbGVhbnVwCisJCQl0aGlzLm5hbWVFbnZpcm9ubWVudC5jbGVhbnVwKCk7CisJCX0KKwkJaWYgKHBvdGVudGlhbE1hdGNoZXMubGVuZ3RoID09IDEpIHsKKwkJCS8vIGlmIG9ubHkgb25lIHBvdGVudGlhbCBtYXRjaCwgYSBmaWxlIG5hbWUgZW52aXJvbm1lbnQgY29zdHMgdG9vIG11Y2gsCisJCQkvLyBzbyB1c2UgdGhlIGV4aXN0aW5nIHNlYXJjaGFibGUgIGVudmlyb25tZW50IHdoaWNoIHdpbGwgcG9wdWxhdGUgdGhlIGphdmEgbW9kZWwKKwkJCS8vIG9ubHkgZm9yIHRoaXMgcG90ZW50aWFsIG1hdGNoIGFuZCBpdHMgcmVxdWlyZWQgdHlwZXMuCisJCQl0aGlzLm5hbWVFbnZpcm9ubWVudCA9IHByb2plY3QuZ2V0U2VhcmNoYWJsZU5hbWVFbnZpcm9ubWVudCgpOworCQl9IGVsc2UgeworCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQgPSBuZXcgSmF2YVNlYXJjaE5hbWVFbnZpcm9ubWVudDIocHJvamVjdCk7CisJCX0KKworCQkvLyBjcmVhdGUgbG9va3VwIGVudmlyb25tZW50CisJCXRoaXMub3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMocHJvamVjdC5nZXRPcHRpb25zKHRydWUpKTsKKwkJUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlciA9CisJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAorCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLAorCQkJCXRoaXMub3B0aW9ucywKKwkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KCkpOworCQl0aGlzLmxvb2t1cEVudmlyb25tZW50ID0KKwkJCW5ldyBMb29rdXBFbnZpcm9ubWVudCh0aGlzLCB0aGlzLm9wdGlvbnMsIHByb2JsZW1SZXBvcnRlciwgdGhpcy5uYW1lRW52aXJvbm1lbnQpOworCQkJCisJCS8vIGNyZWF0ZSBwYXJzZXIKKwkJdGhpcy5wYXJzZXIgPSBuZXcgTWF0Y2hMb2NhdG9yUGFyc2VyKHByb2JsZW1SZXBvcnRlciwgdGhpcy5vcHRpb25zLnNvdXJjZUxldmVsID49IENvbXBpbGVyT3B0aW9ucy5KREsxXzQpOworCQkJCQorCQkvLyByZW1lbWJlciBwcm9qZWN0J3MgbmFtZSBsb29rdXAKKwkJdGhpcy5uYW1lTG9va3VwID0gcHJvamVjdC5nZXROYW1lTG9va3VwKCk7CisJCQorCQkvLyBpbml0aWFsaXplIHF1ZXVlIG9mIHVuaXRzCisJCXRoaXMudG90YWxVbml0cyA9IDA7CisJCWludCBtYXhVbml0cyA9IHBvdGVudGlhbE1hdGNoZXMubGVuZ3RoOworCQl0aGlzLnVuaXRzVG9Qcm9jZXNzID0gbmV3IENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uW21heFVuaXRzXTsKKwkJdGhpcy5tYXRjaGVzVG9Qcm9jZXNzID0gbmV3IFBvdGVudGlhbE1hdGNoW21heFVuaXRzXTsKKworCX0KKwlwdWJsaWMgYm9vbGVhbiBoYXNBbHJlYWR5RGVmaW5lZFR5cGUoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdCkgeworCQlpZiAocGFyc2VkVW5pdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IHBhcnNlZFVuaXQuY29tcGlsYXRpb25SZXN1bHQ7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5wcm9ibGVtQ291bnQ7IGkrKykgeworCQkJSVByb2JsZW0gcHJvYmxlbSA9IHJlc3VsdC5wcm9ibGVtc1tpXTsKKwkJCWlmIChwcm9ibGVtLmdldElEKCkgPT0gSVByb2JsZW0uRHVwbGljYXRlVHlwZXMpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQkKKwkvKioKKwkgKiBMb2NhdGUgdGhlIG1hdGNoZXMgYW1vbmdzdCB0aGUgcG90ZW50aWFsIG1hdGNoZXMuCisJICovCisJcHJpdmF0ZSB2b2lkIGxvY2F0ZU1hdGNoZXMoSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlQb3RlbnRpYWxNYXRjaFtdIHBvdGVudGlhbE1hdGNoZXMgPSAKKwkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcy5nZXRQb3RlbnRpYWxNYXRjaGVzKAorCQkJCWdldEZvY3VzVHlwZSgpID09IG51bGwgPworCQkJCWphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkgOgorCQkJCWphdmFQcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOyAvLyBhbGwgcG90ZW50aWFsIG1hdGNoZXMgYXJlIHJlc29sdmVkIGluIHRoZSBmb2N1cycgcHJvamVjdCBjb250ZXh0CisJCQorCQlpbnQgbGVuZ3RoID0gcG90ZW50aWFsTWF0Y2hlcy5sZW5ndGg7CisJCWludCBpbmRleCA9IDA7CisJCXdoaWxlIChpbmRleCA8IGxlbmd0aCkgeworCQkJaW50IG1heCA9IE1hdGgubWluKE1BWF9BVF9PTkNFLCBsZW5ndGgtaW5kZXgpOworCQkJbG9jYXRlTWF0Y2hlcyhqYXZhUHJvamVjdCwgcG90ZW50aWFsTWF0Y2hlcywgaW5kZXgsIG1heCk7CisJCQlpbmRleCArPSBtYXg7CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIGxvY2F0ZU1hdGNoZXMoSmF2YVByb2plY3QgamF2YVByb2plY3QsIFBvdGVudGlhbE1hdGNoW10gcG90ZW50aWFsTWF0Y2hlcywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCisJCS8vIGNvcHkgYXJyYXkgYmVjYXVzZSBlbGVtZW50cyAgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIHJlbW92ZWQgYmVsb3cKKwkJUG90ZW50aWFsTWF0Y2hbXSBjb3B5ID0gbmV3IFBvdGVudGlhbE1hdGNoW2xlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkocG90ZW50aWFsTWF0Y2hlcywgc3RhcnQsIGNvcHksIDAsIGxlbmd0aCk7CisJCXRoaXMuaW5pdGlhbGl6ZShqYXZhUHJvamVjdCwgY29weSk7CisJCQorCQl0aGlzLmNvbXBpbGF0aW9uQWJvcnRlZCA9IGZhbHNlOworCQkKKwkJLy8gY3JlYXRlIGFuZCByZXNvbHZlIGJpbmRpbmcgKGVxdWl2YWxlbnQgdG8gYmVnaW5Db21waWxhdGlvbigpIGluIENvbXBpbGVyKQorCQl0cnkgeworCQkJdGhpcy5jcmVhdGVBbmRSZXNvbHZlQmluZGluZ3MocG90ZW50aWFsTWF0Y2hlcywgc3RhcnQsIGxlbmd0aCk7CisJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJdGhpcy5jb21waWxhdGlvbkFib3J0ZWQgPSB0cnVlOworCQl9CisJCQorCQkvLyBjcmVhdGUgaGllcmFyY2h5IHJlc29sdmVyIGlmIG5lZWRlZAorCQl0cnkgeworCQkJaWYgKCF0aGlzLmNvbXBpbGF0aW9uQWJvcnRlZCAmJiAhdGhpcy5jcmVhdGVIaWVyYXJjaHlSZXNvbHZlcihjb3B5KSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQl0aGlzLmNvbXBpbGF0aW9uQWJvcnRlZCA9IHRydWU7CisJCX0KKwkJCisJCS8vIGZyZWUgbWVtb3J5CisJCWNvcHkgPSBudWxsOworCQlwb3RlbnRpYWxNYXRjaGVzID0gbnVsbDsKKwkJCisJCS8vIHBvdGVudGlhbCBtYXRjaCByZXNvbHV0aW9uCisJCXRyeSB7CisJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy50b3RhbFVuaXRzOyBpKyspIHsKKwkJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiB0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCXVuaXQgPSB0aGlzLnVuaXRzVG9Qcm9jZXNzW2ldOworCQkJCXRyeSB7CisJCQkJCXByb2Nlc3ModW5pdCwgaSk7CisJCQkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkJCS8vIHByb2JsZW0gd2l0aCBjbGFzcyBwYXRoOiBpdCBjb3VsZCBub3QgZmluZCBiYXNlIGNsYXNzZXMKKwkJCQkJLy8gY29udGludWUgYW5kIHRyeSBuZXh0IG1hdGNoaW5nIG9wZW5hYmxlIHJlcG9ydGluZyBpbm5hY3VyYXRlIG1hdGNoZXMgKHNpbmNlIGJpbmRpbmdzIHdpbGwgYmUgbnVsbCkKKwkJCQkJdGhpcy5jb21waWxhdGlvbkFib3J0ZWQgPSB0cnVlOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEphdmFNb2RlbEV4Y2VwdGlvbikgeworCQkJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGg6IGl0IGNvdWxkIG5vdCBmaW5kIGJhc2UgY2xhc3NlcworCQkJCQkJLy8gY29udGludWUgYW5kIHRyeSBuZXh0IG1hdGNoaW5nIG9wZW5hYmxlIHJlcG9ydGluZyBpbm5hY3VyYXRlIG1hdGNoZXMgKHNpbmNlIGJpbmRpbmdzIHdpbGwgYmUgbnVsbCkKKwkJCQkJCXRoaXMuY29tcGlsYXRpb25BYm9ydGVkID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIGNvcmUgZXhjZXB0aW9uIHRocm93biBieSBjbGllbnQncyBjb2RlOiBsZXQgaXQgdGhyb3VnaAorCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCQkJfQorCQkJCX0gZmluYWxseSB7CisJCQkJCS8vIGNsZWFudXAgY29tcGlsYXRpb24gdW5pdCByZXN1bHQKKwkJCQkJdW5pdC5jbGVhblVwKCk7CisJCQkJCWlmICh0aGlzLm9wdGlvbnMudmVyYm9zZSkKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmJpbmQoImNvbXBpbGF0aW9uLmRvbmUiLCAvLyROT04tTkxTLTEkCisJCQkJCW5ldyBTdHJpbmdbXSB7CisJCQkJCQlTdHJpbmcudmFsdWVPZihpICsgMSksCisJCQkJCQlTdHJpbmcudmFsdWVPZih0b3RhbFVuaXRzKSwKKwkJCQkJCW5ldyBTdHJpbmcodW5pdHNUb1Byb2Nlc3NbaV0uZ2V0RmlsZU5hbWUoKSl9KSk7CisJCQkJfQorCQkJCXRoaXMudW5pdHNUb1Byb2Nlc3NbaV0gPSBudWxsOyAvLyByZWxlYXNlIHJlZmVyZW5jZSB0byBwcm9jZXNzZWQgdW5pdCBkZWNsYXJhdGlvbgorCQkJCXRoaXMubWF0Y2hlc1RvUHJvY2Vzc1tpXSA9IG51bGw7IC8vIHJlbGVhc2UgcmVmZXJlbmNlIHRvIHByb2Nlc3NlZCBwb3RlbnRpYWwgbWF0Y2gKKwkJCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCXRoaXMuY29tcGlsYXRpb25BYm9ydGVkID0gdHJ1ZTsKKwkJfQkJCisJfQorCQorCS8qKgorCSAqIExvY2F0ZSB0aGUgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW4gZmlsZXMgYW5kIHJlcG9ydCB0aGVtIHVzaW5nIHRoZSBzZWFyY2ggcmVxdWVzdG9yLiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKAorCQlTdHJpbmdbXSBmaWxlUGF0aHMsIAorCQlJV29ya3NwYWNlIHdvcmtzcGFjZSwKKwkJSVdvcmtpbmdDb3B5W10gd29ya2luZ0NvcGllcykKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkKKwkJaWYgKFNlYXJjaEVuZ2luZS5WRVJCT1NFKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW5nIG1hdGNoZXMgaW4gZmlsZXMgWyIpOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gZmlsZVBhdGhzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIHBhdGggPSBmaWxlUGF0aHNbaV07CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJdIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh3b3JraW5nQ29waWVzICE9IG51bGwpIHsKKwkJCQkgU3lzdGVtLm91dC5wcmludGxuKCJhbmQgd29ya2luZyBjb3BpZXMgWyIpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHdvcmtpbmdDb3BpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCQkJSVdvcmtpbmdDb3B5IHdjID0gd29ya2luZ0NvcGllc1tpXTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyAoKEphdmFFbGVtZW50KXdjKS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJdIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQkKKwkJSmF2YU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCk7CisJCXRyeSB7CisJCQkvLyBvcHRpbWl6ZSBhY2Nlc3MgdG8gemlwIGZpbGVzIGR1cmluZyBzZWFyY2ggb3BlcmF0aW9uCisJCQltYW5hZ2VyLmNhY2hlWmlwRmlsZXMoKTsKKwkJCQkKKwkJCS8vIGluaXRpYWxpemUgaGFuZGxlIGZhY3RvcnkgKHVzZWQgYXMgYSBjYWNoZSBvZiBoYW5kbGVzIHNvIGFzIHRvIG9wdGltaXplIHNwYWNlKQorCQkJaWYgKHRoaXMuaGFuZGxlRmFjdG9yeSA9PSBudWxsKSB7CisJCQkJdGhpcy5oYW5kbGVGYWN0b3J5ID0gbmV3IEhhbmRsZUZhY3Rvcnkod29ya3NwYWNlKTsKKwkJCX0KKwkJCQorCQkJLy8gaW5pdGlhbGl6ZSBsb2NhdG9yIHdpdGggd29ya2luZyBjb3BpZXMKKwkJCXRoaXMud29ya2luZ0NvcGllcyA9IHdvcmtpbmdDb3BpZXM7CisJCQkKKwkJCS8vIHN1YnN0aXR1dGUgY29tcGlsYXRpb24gdW5pdHMgd2l0aCB3b3JraW5nIGNvcGllcworCQkJSGFzaE1hcCB3Y1BhdGhzID0gbmV3IEhhc2hNYXAoKTsgLy8gYSBtYXAgZnJvbSBwYXRoIHRvIHdvcmtpbmcgY29waWVzCisJCQlpbnQgd2NMZW5ndGg7CisJCQlpZiAod29ya2luZ0NvcGllcyAhPSBudWxsICYmICh3Y0xlbmd0aCA9IHdvcmtpbmdDb3BpZXMubGVuZ3RoKSA+IDApIHsKKwkJCQlTdHJpbmdbXSBuZXdQYXRocyA9IG5ldyBTdHJpbmdbd2NMZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2NMZW5ndGg7IGkrKykgeworCQkJCQlJV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSB3b3JraW5nQ29waWVzW2ldOworCQkJCQlTdHJpbmcgcGF0aCA9IHdvcmtpbmdDb3B5LmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFBhdGgoKS50b1N0cmluZygpOworCQkJCQl3Y1BhdGhzLnB1dChwYXRoLCB3b3JraW5nQ29weSk7CisJCQkJCW5ld1BhdGhzW2ldID0gcGF0aDsKKwkJCQl9CisJCQkJaW50IGZpbGVQYXRoc0xlbmd0aCA9IGZpbGVQYXRocy5sZW5ndGg7CisJCQkJU3lzdGVtLmFycmF5Y29weShmaWxlUGF0aHMsIDAsIGZpbGVQYXRocyA9IG5ldyBTdHJpbmdbZmlsZVBhdGhzTGVuZ3RoK3djTGVuZ3RoXSwgMCwgZmlsZVBhdGhzTGVuZ3RoKTsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ld1BhdGhzLCAwLCBmaWxlUGF0aHMsIGZpbGVQYXRoc0xlbmd0aCwgd2NMZW5ndGgpOworCQkJfQorCQkJCisJCQlpbnQgbGVuZ3RoID0gZmlsZVBhdGhzLmxlbmd0aDsKKwkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgeworCQkJCWlmICh0aGlzLnBhdHRlcm4ubmVlZHNSZXNvbHZlKSB7CisJCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGxlbmd0aCAqIDEwKTsgLy8gMSBmb3IgZmlsZSBwYXRoLCA0IGZvciBwYXJzaW5nIGFuZCBiaW5kaW5nIGNyZWF0aW9uLCA1IGZvciBiaW5kaW5nIHJlc29sdXRpb24gLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGxlbmd0aCAqIDUpOyAvLyAxIGZvciBmaWxlIHBhdGgsIDQgZm9yIHBhcnNpbmcgYW5kIGJpbmRpbmcgY3JlYXRpb24gLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkKKwkJCS8vIHNvcnQgZmlsZSBwYXRocyBwcm9qZWN0cworCQkJVXRpbC5zb3J0KGZpbGVQYXRocyk7IAorCQkJCisJCQkvLyBpbml0aWFsaXplIHBhdHRlcm4gZm9yIHBvbHltb3JwaGljIHNlYXJjaCAoaWUuIG1ldGhvZCByZWZlcmVuY2UgcGF0dGVybikKKwkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcyA9IG5ldyBQb3RlbnRpYWxNYXRjaFNldCgpOworCQkJdGhpcy5wYXR0ZXJuLmluaXRpYWxpemVQb2x5bW9ycGhpY1NlYXJjaCh0aGlzLCBwcm9ncmVzc01vbml0b3IpOworCQkJCisJCQlJVHlwZSBmb2N1c1R5cGUgPSBnZXRGb2N1c1R5cGUoKTsKKwkJCUphdmFQcm9qZWN0IHByZXZpb3VzSmF2YVByb2plY3QgPSBmb2N1c1R5cGUgPT0gbnVsbCA/IG51bGwgOiAoSmF2YVByb2plY3QpZm9jdXNUeXBlLmdldEphdmFQcm9qZWN0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIHByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCVN0cmluZyBwYXRoU3RyaW5nID0gZmlsZVBhdGhzW2ldOworCQkJCQorCQkJCS8vIHNraXAgZHVwbGljYXRlIHBhdGhzCisJCQkJaWYgKGkgPiAwICYmIHBhdGhTdHJpbmcuZXF1YWxzKGZpbGVQYXRoc1tpLTFdKSkgY29udGludWU7CisJCQkJCisJCQkJT3BlbmFibGUgb3BlbmFibGU7CisJCQkJSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElXb3JraW5nQ29weSl3Y1BhdGhzLmdldChwYXRoU3RyaW5nKTsKKwkJCQlpZiAod29ya2luZ0NvcHkgIT0gbnVsbCkgeworCQkJCQlvcGVuYWJsZSA9IChPcGVuYWJsZSl3b3JraW5nQ29weTsKKwkJCQl9IGVsc2UgeworCQkJCQlvcGVuYWJsZSA9IHRoaXMuaGFuZGxlRmFjdG9yeS5jcmVhdGVPcGVuYWJsZShwYXRoU3RyaW5nLCB0aGlzLnNjb3BlKTsKKwkJCQkJaWYgKG9wZW5hYmxlID09IG51bGwpCisJCQkJCQljb250aW51ZTsgLy8gbWF0Y2ggaXMgb3V0c2lkZSBjbGFzc3BhdGgKKwkJCQl9CisJCisJCQkJLy8gY3JlYXRlIG5ldyBwYXJzZXIgYW5kIGxvb2t1cCBlbnZpcm9ubWVudCBpZiB0aGlzIGlzIGEgbmV3IHByb2plY3QKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgb3BlbmFibGUuZ2V0SmF2YVByb2plY3QoKTsKKwkJCQkJaWYgKHdvcmtpbmdDb3B5ICE9IG51bGwpIHsKKwkJCQkJCXJlc291cmNlID0gd29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlc291cmNlID0gb3BlbmFibGUuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJfQorCQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeyAvLyBjYXNlIG9mIGEgZmlsZSBpbiBhbiBleHRlcm5hbCBqYXIKKwkJCQkJCXJlc291cmNlID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworCQkJCQl9CisJCQkJCWlmIChmb2N1c1R5cGUgPT0gbnVsbCAvLyB3aGVuIHNlYXJjaGluZyBpbiBoaWVyYXJjaHksIGFsbCBwb3RlbnRpYWwgbWF0Y2hlcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIGZvY3VzIHByb2plY3QgY29udGV4dAorCQkJCQkJCSYmICFqYXZhUHJvamVjdC5lcXVhbHMocHJldmlvdXNKYXZhUHJvamVjdCkpIHsKKwkJCQkJCS8vIGxvY2F0ZSBtYXRjaGVzIGluIHByZXZpb3VzIHByb2plY3QKKwkJCQkJCWlmIChwcmV2aW91c0phdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMocHJldmlvdXNKYXZhUHJvamVjdCk7CisJCQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJaWYgKGUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJCQkJCQl0aHJvdyBlOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzcGF0aCBpbiB0aGlzIHByb2plY3QgLT4gc2tpcCBpdAorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcyA9IG5ldyBQb3RlbnRpYWxNYXRjaFNldCgpOworCQkJCQkJfQorCQorCQkJCQkJcHJldmlvdXNKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OworCQkJCQl9CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gZmlsZSBkb2Vzbid0IGV4aXN0IC0+IHNraXAgaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQorCQkJCS8vIGFkZCBwb3RlbnRpYWwgbWF0Y2gKKwkJCQl0aGlzLmFkZFBvdGVudGlhbE1hdGNoKHJlc291cmNlLCBvcGVuYWJsZSk7CisJCisJCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyBsYXN0IHByb2plY3QKKwkJCWlmIChwcmV2aW91c0phdmFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl0aGlzLmxvY2F0ZU1hdGNoZXMocHJldmlvdXNKYXZhUHJvamVjdCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKGUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJCQl0aHJvdyBlOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzcGF0aCBpbiBsYXN0IHByb2plY3QgLT4gc2tpcCBpdAorCQkJCQl9CisJCQkJfQorCQkJCXRoaXMucG90ZW50aWFsTWF0Y2hlcyA9IG5ldyBQb3RlbnRpYWxNYXRjaFNldCgpOworCQkJfSAKKwkJCQorCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7CisJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmICh0aGlzLm5hbWVFbnZpcm9ubWVudCAhPSBudWxsKSB7CisJCQkJdGhpcy5uYW1lRW52aXJvbm1lbnQuY2xlYW51cCgpOworCQkJfQorCQkJbWFuYWdlci5mbHVzaFppcEZpbGVzKCk7CisJCX0JCisJfQorCS8qKgorCSAqIExvY2F0ZXMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsb2NhdG9yJ3MgcGF0dGVybi4gCisJICovCisJcHVibGljIHZvaWQgbG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhJV29ya3NwYWNlIHdvcmtzcGFjZSkKKwkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyh0aGlzLnBhdHRlcm4sIHdvcmtzcGFjZSk7CisJfQorCisJLyoqCisJICogTG9jYXRlcyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VhcmNoIHBhdHRlcm4uIAorCSAqLworCXByaXZhdGUgdm9pZCBsb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKAorCQlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4sCisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlKQorCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJaWYgKHNlYXJjaFBhdHRlcm4gaW5zdGFuY2VvZiBPclBhdHRlcm4pIHsKKwkJCU9yUGF0dGVybiBvclBhdHRlcm4gPSAoT3JQYXR0ZXJuKSBzZWFyY2hQYXR0ZXJuOworCQkJdGhpcy5sb2NhdGVQYWNrYWdlRGVjbGFyYXRpb25zKG9yUGF0dGVybi5sZWZ0UGF0dGVybiwgd29ya3NwYWNlKTsKKwkJCXRoaXMubG9jYXRlUGFja2FnZURlY2xhcmF0aW9ucyhvclBhdHRlcm4ucmlnaHRQYXR0ZXJuLCB3b3Jrc3BhY2UpOworCQl9IGVsc2UKKwkJCWlmIChzZWFyY2hQYXR0ZXJuIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybikgeworCQkJCVBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm4gcGtnUGF0dGVybiA9CisJCQkJCShQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuKSBzZWFyY2hQYXR0ZXJuOworCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0KKwkJCQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SmF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3RzKCk7CisJCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHByb2plY3RzW2ldOworCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCQkJZm9yIChpbnQgaiA9IDAsIHJvb3RzTGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBqIDwgcm9vdHNMZW5ndGg7IGorKykgeworCQkJCQkJSUphdmFFbGVtZW50W10gcGtncyA9IHJvb3RzW2pdLmdldENoaWxkcmVuKCk7CisJCQkJCQlmb3IgKGludCBrID0gMCwgcGtzTGVuZ3RoID0gcGtncy5sZW5ndGg7IGsgPCBwa3NMZW5ndGg7IGsrKykgeworCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpcGtnc1trXTsKKwkJCQkJCQlpZiAocGtnLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCAKKwkJCQkJCQkJCSYmIHBrZ1BhdHRlcm4ubWF0Y2hlc05hbWUocGtnUGF0dGVybi5wa2dOYW1lLCBwa2cuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpKSkgeworCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwa2cuZ2V0UmVzb3VyY2UoKTsKKwkJCQkJCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsgLy8gY2FzZSBvZiBhIGZpbGUgaW4gYW4gZXh0ZXJuYWwgamFyCisJCQkJCQkJCQlyZXNvdXJjZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKwkJCQkJCQkJfQorCQkJCQkJCQl0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaCA9IG5ldyBQb3RlbnRpYWxNYXRjaCh0aGlzLCByZXNvdXJjZSwgbnVsbCk7CisJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQl0aGlzLnJlcG9ydCgtMSwgLTIsIHBrZywgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0gpOworCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgSmF2YU1vZGVsRXhjZXB0aW9uKSB7CisJCQkJCQkJCQkJdGhyb3cgKEphdmFNb2RlbEV4Y2VwdGlvbikgZTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJdGhyb3cgbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwl9CisJLyoKKwkgKiBQcm9jZXNzIGEgY29tcGlsYXRpb24gdW5pdCBhbHJlYWR5IHBhcnNlZCBhbmQgYnVpbGQuCisJICovCisJcHVibGljIHZvaWQgcHJvY2VzcyhDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0LCBpbnQgaSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlNYXRjaGluZ05vZGVTZXQgbWF0Y2hpbmdOb2RlU2V0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoID0gdGhpcy5tYXRjaGVzVG9Qcm9jZXNzW2ldOworCQkJaWYgKHRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoID09IG51bGwpIHJldHVybjsKKwkJCW1hdGNoaW5nTm9kZVNldCA9IHRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoLm1hdGNoaW5nTm9kZVNldDsKKwkJCQorCQkJaWYgKHVuaXQgPT0gbnVsbCB8fCB1bml0LmlzRW1wdHkoKSkgeworCQkJCWlmICh0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaC5vcGVuYWJsZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSkgeworCQkJCQl0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaC5sb2NhdGVNYXRjaGVzSW5DbGFzc0ZpbGUoKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGhhc0FscmVhZHlEZWZpbmVkVHlwZSh1bml0KSkgeworCQkJCS8vIHNraXAgdHlwZSBoYXMgaXQgaXMgaGlkZGVuIHNvIG5vdCB2aXNpYmxlCisJCQkJcmV0dXJuOworCQkJfQorCQorCQkJdGhpcy5wYXJzZXIubWF0Y2hTZXQgPSB0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaC5tYXRjaGluZ05vZGVTZXQ7CisJCQlnZXRNZXRob2RCb2RpZXModW5pdCwgaSk7CisJCQkJCQkKKwkJCS8vIHJlcG9ydCBtYXRjaGVzIHRoYXQgZG9uJ3QgbmVlZCByZXNvbHZlCisJCQltYXRjaGluZ05vZGVTZXQuY3VIYXNCZWVuUmVzb2x2ZWQgPSB0aGlzLmNvbXBpbGF0aW9uQWJvcnRlZDsKKwkJCW1hdGNoaW5nTm9kZVNldC5yZXBvcnRNYXRjaGluZyh1bml0KTsKKworCQkJaWYgKCh0aGlzLnBhdHRlcm4ubmVlZHNSZXNvbHZlIHx8IG1hdGNoaW5nTm9kZVNldC5uZWVkc1Jlc29sdmUoKS8qIFRPRE86IGRvIG5vdCBuZWVkIHRoaXMgY2hlY2sgYW55IGxvbmdlciAqLykgCisJCQkJCSYmIHVuaXQudHlwZXMgIT0gbnVsbCAKKwkJCQkJJiYgIXRoaXMuY29tcGlsYXRpb25BYm9ydGVkKSB7CisKKwkJCQlpZiAoU2VhcmNoRW5naW5lLlZFUkJPU0UpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZpbmcgIiArIHRoaXMuY3VycmVudFBvdGVudGlhbE1hdGNoLm9wZW5hYmxlLnRvU3RyaW5nV2l0aEFuY2VzdG9ycygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKworCQkJCS8vIGZhdWx0IGluIGZpZWxkcyAmIG1ldGhvZHMKKwkJCQlpZiAodW5pdC5zY29wZSAhPSBudWxsKQorCQkJCQl1bml0LnNjb3BlLmZhdWx0SW5UeXBlcygpOworCQkKKwkJCQkvLyB2ZXJpZnkgaW5oZXJpdGVkIG1ldGhvZHMKKwkJCQlpZiAodW5pdC5zY29wZSAhPSBudWxsKQorCQkJCQl1bml0LnNjb3BlLnZlcmlmeU1ldGhvZHModGhpcy5sb29rdXBFbnZpcm9ubWVudC5tZXRob2RWZXJpZmllcigpKTsKKwkJCisJCQkJLy8gdHlwZSBjaGVja2luZworCQkJCXVuaXQucmVzb2x2ZSgpOworCQkKKwkJCQkvLyByZWZyZXNoIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pdHMga25vd24gYXQgdGhpcyBzdGFnZQorCQkJCXVuaXQuY29tcGlsYXRpb25SZXN1bHQudG90YWxVbml0c0tub3duID0gdG90YWxVbml0czsKKworCQkJCS8vIHJlcG9ydCBtYXRjaGVzIHRoYXQgbmVlZGVkIHJlc29sdmUKKwkJCQltYXRjaGluZ05vZGVTZXQuY3VIYXNCZWVuUmVzb2x2ZWQgPSB0cnVlOworCQkJCW1hdGNoaW5nTm9kZVNldC5yZXBvcnRNYXRjaGluZyh1bml0KTsKKwkJCX0KKwkJfSBjYXRjaCAoQWJvcnRDb21waWxhdGlvbiBlKSB7CisJCQkvLyBjb3VsZCBub3QgcmVzb2x2ZTogcmVwb3J0IGlubmFjdXJhdGUgbWF0Y2hlcworCQkJaWYgKG1hdGNoaW5nTm9kZVNldCAhPSBudWxsKSB7CisJCQkJbWF0Y2hpbmdOb2RlU2V0LmN1SGFzQmVlblJlc29sdmVkID0gdHJ1ZTsKKwkJCQltYXRjaGluZ05vZGVTZXQucmVwb3J0TWF0Y2hpbmcodW5pdCk7CisJCQl9CisJCQlpZiAoIShlIGluc3RhbmNlb2YgQWJvcnRDb21waWxhdGlvblVuaXQpKSB7CisJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGgKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJdGhpcy5wYXJzZXIubWF0Y2hTZXQgPSBudWxsOworCQkJdGhpcy5jdXJyZW50UG90ZW50aWFsTWF0Y2ggPSBudWxsOworCQl9CisJfQorCXB1YmxpYyB2b2lkIHJlcG9ydCgKKwkJaW50IHNvdXJjZVN0YXJ0LAorCQlpbnQgc291cmNlRW5kLAorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKHRoaXMuc2NvcGUuZW5jbG9zZXMoZWxlbWVudCkpIHsKKwkJCWlmIChTZWFyY2hFbmdpbmUuVkVSQk9TRSkgeworCQkJCUlSZXNvdXJjZSByZXMgPSB0aGlzLmdldEN1cnJlbnRSZXNvdXJjZSgpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVwb3J0aW5nIG1hdGNoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0UmVzb3VyY2U6ICIgKyAocmVzID09IG51bGwgPyAiIDx1bmtub3duPiAiIDogcmVzLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRQb3NpdGlvbnM6IFsiICsgc291cmNlU3RhcnQgKyAiLCAiICsgc291cmNlRW5kICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0SmF2YSBlbGVtZW50OiAiICsgKChKYXZhRWxlbWVudCllbGVtZW50KS50b1N0cmluZ1dpdGhBbmNlc3RvcnMoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoYWNjdXJhY3kgPT0gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0gpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdEFjY3VyYWN5OiBFWEFDVF9NQVRDSCIpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdEFjY3VyYWN5OiBQT1RFTlRJQUxfTUFUQ0giKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0KKwkJCXRoaXMucmVwb3J0KAorCQkJCXRoaXMuZ2V0Q3VycmVudFJlc291cmNlKCksCisJCQkJc291cmNlU3RhcnQsCisJCQkJc291cmNlRW5kLAorCQkJCWVsZW1lbnQsCisJCQkJYWNjdXJhY3kpOworCQl9CisJfQorCXB1YmxpYyB2b2lkIHJlcG9ydCgKKwkJSVJlc291cmNlIHJlc291cmNlLAorCQlpbnQgc291cmNlU3RhcnQsCisJCWludCBzb3VyY2VFbmQsCisJCUlKYXZhRWxlbWVudCBlbGVtZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQl0aGlzLmNvbGxlY3Rvci5hY2NlcHQoCisJCQlyZXNvdXJjZSwKKwkJCXNvdXJjZVN0YXJ0LAorCQkJc291cmNlRW5kICsgMSwKKwkJCWVsZW1lbnQsCisJCQlhY2N1cmFjeSk7CisJfQorCS8qKgorCSAqIEZpbmRzIHRoZSBhY2N1cmF0ZSBwb3NpdGlvbnMgb2YgdGhlIHNlcXVlbmNlIG9mIHRva2VucyBnaXZlbiBieSBxdWFsaWZpZWROYW1lCisJICogaW4gdGhlIHNvdXJjZSBhbmQgcmVwb3J0cyBhIHJlZmVyZW5jZSB0byB0aGlzIHRoaXMgcXVhbGlmaWVkIG5hbWUKKwkgKiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZSgKKwkJaW50IHNvdXJjZVN0YXJ0LAorCQlpbnQgc291cmNlRW5kLAorCQljaGFyW11bXSBxdWFsaWZpZWROYW1lLAorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCisJCWlmIChhY2N1cmFjeSA9PSAtMSkgcmV0dXJuOworCQorCQkvLyBjb21wdXRlIHNvdXJjZSBwb3NpdGlvbnMgb2YgdGhlIHF1YWxpZmllZCByZWZlcmVuY2UgCisJCVNjYW5uZXIgc2Nhbm5lciA9IHRoaXMucGFyc2VyLnNjYW5uZXI7CisJCXNjYW5uZXIuc2V0U291cmNlKAorCQkJdGhpcy5jdXJyZW50UG90ZW50aWFsTWF0Y2guZ2V0Q29udGVudHMoKSk7CisJCXNjYW5uZXIucmVzZXRUbyhzb3VyY2VTdGFydCwgc291cmNlRW5kKTsKKwkKKwkJaW50IHJlZlNvdXJjZVN0YXJ0ID0gLTEsIHJlZlNvdXJjZUVuZCA9IC0xOworCQlpbnQgdG9rZW5OdW1iZXIgPSBxdWFsaWZpZWROYW1lLmxlbmd0aDsKKwkJaW50IHRva2VuID0gLTE7CisJCWludCBwcmV2aW91c1ZhbGlkID0gLTE7CisJCWludCBpID0gMDsKKwkJaW50IGN1cnJlbnRQb3NpdGlvbjsKKwkJZG8geworCQkJLy8gZmluZCBmaXJzdCB0b2tlbiB0aGF0IGlzIGFuIGlkZW50aWZpZXIgKHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbnMgaW5jbHVkZSBwYXJlbnRoZXNpc2VzIGluIHNvdXJjZSByYW5nZSAtIHNlZSBidWcgMjA2OTMgLSBGaW5kaW5nIHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzIGRvZXMgbm90IGZpbmQgYWxsIG9jY3VycmVuY2VzICApCisJCQlkbyB7CisJCQkJY3VycmVudFBvc2l0aW9uID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb247CisJCQkJdHJ5IHsKKwkJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfSB3aGlsZSAodG9rZW4gIT0gIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUlkZW50aWZpZXIgJiYgdG9rZW4gIT0gIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRik7CisJCisJCQlpZiAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKSB7CisJCQkJY2hhcltdIGN1cnJlbnRUb2tlblNvdXJjZSA9IHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCk7CisJCQkJYm9vbGVhbiBlcXVhbHMgPSBmYWxzZTsKKwkJCQl3aGlsZSAoaSA8IHRva2VuTnVtYmVyCisJCQkJCSYmICEoZXF1YWxzID0gdGhpcy5wYXR0ZXJuLm1hdGNoZXNOYW1lKHF1YWxpZmllZE5hbWVbaSsrXSwgY3VycmVudFRva2VuU291cmNlKSkpIHsKKwkJCQl9CisJCQkJaWYgKGVxdWFscyAmJiAocHJldmlvdXNWYWxpZCA9PSAtMSB8fCBwcmV2aW91c1ZhbGlkID09IGkgLSAyKSkgeworCQkJCQlwcmV2aW91c1ZhbGlkID0gaSAtIDE7CisJCQkJCWlmIChyZWZTb3VyY2VTdGFydCA9PSAtMSkgeworCQkJCQkJcmVmU291cmNlU3RhcnQgPSBjdXJyZW50UG9zaXRpb247CisJCQkJCX0KKwkJCQkJcmVmU291cmNlRW5kID0gc2Nhbm5lci5jdXJyZW50UG9zaXRpb24gLSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWkgPSAwOworCQkJCQlyZWZTb3VyY2VTdGFydCA9IC0xOworCQkJCQlwcmV2aW91c1ZhbGlkID0gLTE7CisJCQkJfQorCQkJCS8vIHJlYWQgJy4nCisJCQkJdHJ5IHsKKwkJCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOworCQkJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQkJaWYgKGkgPT0gdG9rZW5OdW1iZXIpIHsKKwkJCQkvLyBhY2NlcHQgcmVmZXJlbmNlCisJCQkJaWYgKHJlZlNvdXJjZVN0YXJ0ICE9IC0xKSB7CisJCQkJCXRoaXMucmVwb3J0KHJlZlNvdXJjZVN0YXJ0LCByZWZTb3VyY2VFbmQsIGVsZW1lbnQsIGFjY3VyYWN5KTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnJlcG9ydChzb3VyY2VTdGFydCwgc291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjeSk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJfSB3aGlsZSAodG9rZW4gIT0gVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRU9GKTsKKwkKKwl9CisJLyoqCisJICogRmluZHMgdGhlIGFjY3VyYXRlIHBvc2l0aW9ucyBvZiBlYWNoIHZhbGlkIHRva2VuIGluIHRoZSBzb3VyY2UgYW5kCisJICogcmVwb3J0cyBhIHJlZmVyZW5jZSB0byB0aGlzIHRva2VuIHRvIHRoZSBzZWFyY2ggcmVxdWVzdG9yLgorCSAqIEEgdG9rZW4gaXMgdmFsaWQgaWYgaXQgaGFzIGFuIGFjY3VycmFjeSB3aGljaCBpcyBub3QgLTEuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0QWNjdXJhdGVSZWZlcmVuY2UoCisJCWludCBzb3VyY2VTdGFydCwKKwkJaW50IHNvdXJjZUVuZCwKKwkJY2hhcltdW10gdG9rZW5zLAorCQlJSmF2YUVsZW1lbnQgZWxlbWVudCwKKwkJaW50W10gYWNjdXJhY2llcykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNvbXB1dGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgcXVhbGlmaWVkIHJlZmVyZW5jZSAKKwkJU2Nhbm5lciBzY2FubmVyID0gdGhpcy5wYXJzZXIuc2Nhbm5lcjsKKwkJc2Nhbm5lci5zZXRTb3VyY2UoCisJCQl0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaC5nZXRDb250ZW50cygpKTsKKwkJc2Nhbm5lci5yZXNldFRvKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOworCisJCWludCByZWZTb3VyY2VTdGFydCA9IC0xLCByZWZTb3VyY2VFbmQgPSAtMTsKKwkJaW50IGxlbmd0aCA9IHRva2Vucy5sZW5ndGg7CisJCWludCB0b2tlbiA9IC0xOworCQlpbnQgcHJldmlvdXNWYWxpZCA9IC0xOworCQlpbnQgaSA9IDA7CisJCWludCBhY2N1cmFjeUluZGV4ID0gMDsKKwkJZG8geworCQkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uOworCQkJLy8gcmVhZCB0b2tlbgorCQkJdHJ5IHsKKwkJCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJfQorCQkJaWYgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRikgeworCQkJCWNoYXJbXSBjdXJyZW50VG9rZW5Tb3VyY2UgPSBzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpOworCQkJCWJvb2xlYW4gZXF1YWxzID0gZmFsc2U7CisJCQkJd2hpbGUgKGkgPCBsZW5ndGgKKwkJCQkJJiYgIShlcXVhbHMgPSB0aGlzLnBhdHRlcm4ubWF0Y2hlc05hbWUodG9rZW5zW2krK10sIGN1cnJlbnRUb2tlblNvdXJjZSkpKSB7CisJCQkJfQorCQkJCWlmIChlcXVhbHMgJiYgKHByZXZpb3VzVmFsaWQgPT0gLTEgfHwgcHJldmlvdXNWYWxpZCA9PSBpIC0gMikpIHsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IGkgLSAxOworCQkJCQlpZiAocmVmU291cmNlU3RhcnQgPT0gLTEpIHsKKwkJCQkJCXJlZlNvdXJjZVN0YXJ0ID0gY3VycmVudFBvc2l0aW9uOworCQkJCQl9CisJCQkJCXJlZlNvdXJjZUVuZCA9IHNjYW5uZXIuY3VycmVudFBvc2l0aW9uIC0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlpID0gMDsKKwkJCQkJcmVmU291cmNlU3RhcnQgPSAtMTsKKwkJCQkJcHJldmlvdXNWYWxpZCA9IC0xOworCQkJCX0KKwkJCQkvLyByZWFkICcuJworCQkJCXRyeSB7CisJCQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKKwkJCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJCWlmIChhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdICE9IC0xKSB7CisJCQkJLy8gYWNjZXB0IHJlZmVyZW5jZQorCQkJCWlmIChyZWZTb3VyY2VTdGFydCAhPSAtMSkgeworCQkJCQl0aGlzLnJlcG9ydChyZWZTb3VyY2VTdGFydCwgcmVmU291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLnJlcG9ydChzb3VyY2VTdGFydCwgc291cmNlRW5kLCBlbGVtZW50LCBhY2N1cmFjaWVzW2FjY3VyYWN5SW5kZXhdKTsKKwkJCQl9CisJCQkJaSA9IDA7CisJCQl9CisJCQlyZWZTb3VyY2VTdGFydCA9IC0xOworCQkJcHJldmlvdXNWYWxpZCA9IC0xOworCQkJaWYgKGFjY3VyYWN5SW5kZXggPCBhY2N1cmFjaWVzLmxlbmd0aC0xKSB7CisJCQkJYWNjdXJhY3lJbmRleCsrOworCQkJfQorCQl9IHdoaWxlICh0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpOworCisJfQorCXB1YmxpYyB2b2lkIHJlcG9ydEJpbmFyeU1hdGNoKAorCQlJTWVtYmVyIGJpbmFyeU1lbWJlciwKKwkJSUJpbmFyeVR5cGUgaW5mbywKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCQorCQl0aGlzLnJlcG9ydEJpbmFyeU1hdGNoKG51bGwsIGJpbmFyeU1lbWJlciwgaW5mbywgYWNjdXJhY3kpOworCX0KKwlwdWJsaWMgdm9pZCByZXBvcnRCaW5hcnlNYXRjaCgKKwkJSVJlc291cmNlIHJlc291cmNlLAorCQlJTWVtYmVyIGJpbmFyeU1lbWJlciwKKwkJSUJpbmFyeVR5cGUgaW5mbywKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSVNvdXJjZVJhbmdlIHJhbmdlID0gYmluYXJ5TWVtYmVyLmdldE5hbWVSYW5nZSgpOworCQlpZiAocmFuZ2UuZ2V0T2Zmc2V0KCkgPT0gLTEpIHsKKwkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoQ2xhc3NGaWxlKSBiaW5hcnlNZW1iZXIuZ2V0Q2xhc3NGaWxlKCk7CisJCQlTb3VyY2VNYXBwZXIgbWFwcGVyID0gY2xhc3NGaWxlLmdldFNvdXJjZU1hcHBlcigpOworCQkJaWYgKG1hcHBlciAhPSBudWxsKSB7CisJCQkJSVR5cGUgdHlwZSA9IGNsYXNzRmlsZS5nZXRUeXBlKCk7CisJCQkJU3RyaW5nIHNvdXJjZUZpbGVOYW1lID0gbWFwcGVyLmZpbmRTb3VyY2VGaWxlTmFtZSh0eXBlLCBpbmZvKTsKKwkJCQlpZiAoc291cmNlRmlsZU5hbWUgIT0gbnVsbCkgeworCQkJCQljaGFyW10gY29udGVudHMgPSBtYXBwZXIuZmluZFNvdXJjZSh0eXBlLCBzb3VyY2VGaWxlTmFtZSk7CisJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7CisJCQkJCQlyYW5nZSA9IG1hcHBlci5tYXBTb3VyY2UodHlwZSwgY29udGVudHMsIGJpbmFyeU1lbWJlcik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaW50IHN0YXJ0SW5kZXggPSByYW5nZS5nZXRPZmZzZXQoKTsKKwkJaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHJhbmdlLmdldExlbmd0aCgpIC0gMTsKKwkJaWYgKHJlc291cmNlID09IG51bGwpIHsKKwkJCXRoaXMucmVwb3J0KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBiaW5hcnlNZW1iZXIsIGFjY3VyYWN5KTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucmVwb3J0KHJlc291cmNlLCBzdGFydEluZGV4LCBlbmRJbmRleCwgYmluYXJ5TWVtYmVyLCBhY2N1cmFjeSk7CisJCX0KKwl9CisJLyoqCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gZmllbGQgZGVjbGFyYXRpb24gdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0RmllbGREZWNsYXJhdGlvbigKKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLAorCQlJSmF2YUVsZW1lbnQgcGFyZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBhY2NlcHQgZmllbGQgZGVjbGFyYXRpb24KKwkJdGhpcy5yZXBvcnQoCisJCQlmaWVsZERlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQkJZmllbGREZWNsYXJhdGlvbi5zb3VyY2VFbmQsCisJCQkocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpID8KKwkJCQkoKElUeXBlKXBhcmVudCkuZ2V0RmllbGQobmV3IFN0cmluZyhmaWVsZERlY2xhcmF0aW9uLm5hbWUpKSA6CisJCQkJcGFyZW50LAorCQkJYWNjdXJhY3kpOworCX0KKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiBpbXBvcnQgdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0SW1wb3J0KEltcG9ydFJlZmVyZW5jZSByZWZlcmVuY2UsIGludCBhY2N1cmFjeSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNyZWF0ZSBkZWZpbmluZyBpbXBvcnQgaGFuZGxlCisJCUlKYXZhRWxlbWVudCBpbXBvcnRIYW5kbGUgPSB0aGlzLmNyZWF0ZUltcG9ydEhhbmRsZShyZWZlcmVuY2UpOworCisJCS8vIGFjY2VwdCByZWZlcmVuY2UKKwkJdGhpcy5wYXR0ZXJuLm1hdGNoUmVwb3J0SW1wb3J0UmVmKHJlZmVyZW5jZSwgbnVsbCwgaW1wb3J0SGFuZGxlLCBhY2N1cmFjeSwgdGhpcyk7CisJfQorCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRNZXRob2REZWNsYXJhdGlvbigKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKKwkJSUphdmFFbGVtZW50IHBhcmVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJLy8gY3JlYXRlIG1ldGhvZCBoYW5kbGUKKwkJCWVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU1ldGhvZEhhbmRsZShtZXRob2REZWNsYXJhdGlvbiwgKElUeXBlKXBhcmVudCk7CisJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCX0gZWxzZSB7CisJCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCQl9CisKKwkJLy8gY29tcHV0ZSBzb3VyY2UgcG9zaXRpb25zIG9mIHRoZSBzZWxlY3RvciAKKwkJU2Nhbm5lciBzY2FubmVyID0gcGFyc2VyLnNjYW5uZXI7CisJCWludCBuYW1lU291cmNlU3RhcnQgPSBtZXRob2REZWNsYXJhdGlvbi5zb3VyY2VTdGFydDsKKwkJc2Nhbm5lci5zZXRTb3VyY2UoCisJCQl0aGlzLmN1cnJlbnRQb3RlbnRpYWxNYXRjaC5nZXRDb250ZW50cygpKTsKKwkJc2Nhbm5lci5yZXNldFRvKG5hbWVTb3VyY2VTdGFydCwgbWV0aG9kRGVjbGFyYXRpb24uc291cmNlRW5kKTsKKwkJdHJ5IHsKKwkJCXNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7CisJCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJaW50IG5hbWVTb3VyY2VFbmQgPSBzY2FubmVyLmN1cnJlbnRQb3NpdGlvbiAtIDE7CisKKwkJLy8gYWNjZXB0IG1ldGhvZCBkZWNsYXJhdGlvbgorCQl0aGlzLnJlcG9ydChuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQsIGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5KTsKKwl9CisJLyoqCisJICogUmVwb3J0cyB0aGUgZ2l2ZW4gcGFja2FnZSBkZWNsYXJhdGlvbiB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBvcnRQYWNrYWdlRGVjbGFyYXRpb24oSW1wb3J0UmVmZXJlbmNlIG5vZGUpIHsKKwkJLy8gVEJECisJfQorCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBtZXRob2QgYW5kIHRoZSBtZXRob2QncyBkZWZpbmluZyB0eXBlcyAKKwkgKiBoYXZlIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0UmVmZXJlbmNlKAorCQlBc3ROb2RlIHJlZmVyZW5jZSwKKwkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKKwkJSUphdmFFbGVtZW50IHBhcmVudCwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgeworCQkJLy8gY3JlYXRlIGRlZmluaW5nIG1ldGhvZCBoYW5kbGUKKwkJCWVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU1ldGhvZEhhbmRsZShtZXRob2REZWNsYXJhdGlvbiwgKElUeXBlKXBhcmVudCk7CisJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSByZXR1cm47IC8vIGNhc2Ugb2YgYSBtYXRjaCBmb3VuZCBpbiBhIHR5cGUgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBjbGFzcyBmaWxlCisJCX0gZWxzZSB7CisJCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCQl9CisKKwkJLy8gYWNjZXB0IHJlZmVyZW5jZQorCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgdGhpcyk7CisJfQorCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBmaWVsZCBhbmQgZ2l2ZW4gdHlwZS4KKwkgKiBUaGUgZmllbGQncyBkZWZpbmluZyB0eXBlcyBoYXZlIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0UmVmZXJlbmNlKAorCQlBc3ROb2RlIHJlZmVyZW5jZSwKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKKwkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLAorCQlJSmF2YUVsZW1lbnQgcGFyZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudDsKKwkJaWYgKGZpZWxkRGVjbGFyYXRpb24uaXNGaWVsZCgpKSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJCQkvLyBjcmVhdGUgZGVmaW5pbmcgZmllbGQgaGFuZGxlCisJCQkJZW5jbG9zaW5nRWxlbWVudCA9IHRoaXMuY3JlYXRlRmllbGRIYW5kbGUoZmllbGREZWNsYXJhdGlvbiwgKElUeXBlKXBhcmVudCk7CisJCQkJaWYgKGVuY2xvc2luZ0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCQkJfQorCisJCQkvLyBhY2NlcHQgcmVmZXJlbmNlCisJCQl0aGlzLnBhdHRlcm4ubWF0Y2hSZXBvcnRSZWZlcmVuY2UocmVmZXJlbmNlLCBlbmNsb3NpbmdFbGVtZW50LCBhY2N1cmFjeSwgdGhpcyk7CisJCX0gZWxzZSB7IC8vIGluaXRpYWxpemVyCisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJCQkvLyBjcmVhdGUgZGVmaW5pbmcgaW5pdGlhbGl6ZXIKKwkJCQllbmNsb3NpbmdFbGVtZW50ID0KKwkJCQkJdGhpcy5jcmVhdGVJbml0aWFsaXplckhhbmRsZSgKKwkJCQkJCXR5cGVEZWNsYXJhdGlvbiwKKwkJCQkJCWZpZWxkRGVjbGFyYXRpb24sCisJCQkJCQkoSVR5cGUpcGFyZW50KTsKKwkJCQlpZiAoZW5jbG9zaW5nRWxlbWVudCA9PSBudWxsKSByZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWVuY2xvc2luZ0VsZW1lbnQgPSBwYXJlbnQ7CisJCQl9CisKKwkJCS8vIGFjY2VwdCByZWZlcmVuY2UKKwkJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZShyZWZlcmVuY2UsIGVuY2xvc2luZ0VsZW1lbnQsIGFjY3VyYWN5LCB0aGlzKTsKKwkJfQorCX0KKwkvKioKKwkgKiBSZXBvcnRzIHRoZSBnaXZlbiBzdXBlciB0eXBlIHJlZmVyZW5jZSB0byB0aGUgc2VhcmNoIHJlcXVlc3Rvci4KKwkgKiBJdCBpcyBkb25lIGluIHRoZSBnaXZlbiBkZWZpbmluZyB0eXBlICh3aXRoIHRoZSBnaXZlbiBzaW1wbGUgbmFtZXMpLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydFN1cGVyVHlwZVJlZmVyZW5jZSgKKwkJVHlwZVJlZmVyZW5jZSB0eXBlUmVmLAorCQlJSmF2YUVsZW1lbnQgdHlwZSwKKwkJaW50IGFjY3VyYWN5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gYWNjZXB0IHR5cGUgcmVmZXJlbmNlCisJCXRoaXMucGF0dGVybi5tYXRjaFJlcG9ydFJlZmVyZW5jZSh0eXBlUmVmLCB0eXBlLCBhY2N1cmFjeSwgdGhpcyk7CisJfQorCS8qKgorCSAqIFJlcG9ydHMgdGhlIGdpdmVuIHR5cGUgZGVjbGFyYXRpb24gdG8gdGhlIHNlYXJjaCByZXF1ZXN0b3IuCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0VHlwZURlY2xhcmF0aW9uKAorCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorCQlJSmF2YUVsZW1lbnQgcGFyZW50LAorCQlpbnQgYWNjdXJhY3kpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBhY2NlcHQgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9uCisJCXRoaXMucmVwb3J0KAorCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZVN0YXJ0LAorCQkJdHlwZURlY2xhcmF0aW9uLnNvdXJjZUVuZCwKKwkJCShwYXJlbnQgPT0gbnVsbCkgPworCQkJCXRoaXMuY3JlYXRlVHlwZUhhbmRsZSh0eXBlRGVjbGFyYXRpb24ubmFtZSkgOgorCQkJCShwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgPworCQkJCQl0aGlzLmNyZWF0ZVR5cGVIYW5kbGUoKElUeXBlKXBhcmVudCwgdHlwZURlY2xhcmF0aW9uLm5hbWUpIDoKKwkJCQkJcGFyZW50LAorCQkJYWNjdXJhY3kpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoTG9jYXRvclBhcnNlci5qYXZhCmluZGV4IGMzMWRhZmQuLmZmYmMzNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hMb2NhdG9yUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaExvY2F0b3JQYXJzZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwpAQCAtMTQ1LDYgKzE0NSwxMiBAQAogCQl0aGlzLm1hdGNoU2V0LmNoZWNrTWF0Y2hpbmcodGhpcy5leHByZXNzaW9uU3RhY2tbdGhpcy5leHByZXNzaW9uUHRyXSk7CiAJfQogfQorcHJvdGVjdGVkIHZvaWQgY29uc3VtZVByaW1hcnlOb05ld0FycmF5KCkgeworCS8vIHBvcCBwYXJlbnRoZXNpcyBwb3NpdGlvbnMgKGFuZCBkb24ndCB1cGRhdGUgZXhwcmVzc2lvbiBwb3NpdGlvbnMKKwkvLyAoc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzI5KQorCWludFB0ci0tOworCWludFB0ci0tOworfQogcHJvdGVjdGVkIHZvaWQgY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKSB7CiAJc3VwZXIuY29uc3VtZVNpbmdsZVR5cGVJbXBvcnREZWNsYXJhdGlvbk5hbWUoKTsKIAlpZiAodGhpcy5tYXRjaFNldCAhPSBudWxsKSB7CkBAIC0xODcsMTQgKzE5Myw3IEBACiAJCQkJCSYmIHVuaXQgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwpIHsKIAkJCQkvLyBwb3RlbnRpYWwgbWF0Y2hlcyB3ZXJlIGZvdW5kIHdoaWxlIGluaXRpYWxpemluZyB0aGUgc2VhcmNoIHBhdHRlcm4KIAkJCQkvLyBmcm9tIHRoZSBsb29rdXAgZW52aXJvbm1lbnQ6IGFkZCB0aGUgY29ycmVzcG9uZGluZyBvcGVuYWJsZSBpbiB0aGUgbGlzdAotCQkJCU1hdGNoaW5nT3BlbmFibGUgbWF0Y2hpbmdPcGVuYWJsZSA9IAotCQkJCQluZXcgTWF0Y2hpbmdPcGVuYWJsZSgKLQkJCQkJCWxvY2F0b3IsCi0JCQkJCQlmaWxlLCAKLQkJCQkJCWNvbXBpbGF0aW9uVW5pdCwgCi0JCQkJCQl1bml0LAotCQkJCQkJdGhpcy5tYXRjaFNldCk7Ci0JCQkJbG9jYXRvci5tYXRjaGluZ09wZW5hYmxlcy5hZGQobWF0Y2hpbmdPcGVuYWJsZSk7CisJCQkJbG9jYXRvci5hZGRNYXRjaGluZ09wZW5hYmxlKGZpbGUsIGNvbXBpbGF0aW9uVW5pdCwgdW5pdCwgdGhpcy5tYXRjaFNldCk7CiAJCQl9CiAJCQl0aGlzLm1hdGNoU2V0ID0gbnVsbDsKIAkJfSBlbHNlIHsKQEAgLTI3Myw3ICsyNzIsOSBAQAogCQkJCQl0aGlzLnBhcnNlKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIHVuaXQpOwogCQkJCQljb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSludWxsKTsKIAkJCQl9Ci0JCQl9CQorCQkJfSBlbHNlIGlmIChtZXRob2QuaXNEZWZhdWx0Q29uc3RydWN0b3IoKSkgeworCQkJCW1ldGhvZC5wYXJzZVN0YXRlbWVudHModGhpcywgdW5pdCk7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hTZXQuamF2YQppbmRleCA0Yzk5ZjI4Li5mNDQzNjQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoU2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaFNldC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKQEAgLTMzLDI4ICszNCwzMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJsb2NrU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5DbGFzc1Njb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZkxvbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKIAogLyoqCiAgKiBBIHNldCBvZiBtYXRjaGVzIGFuZCBwb3RlbnRpYWwgbWF0Y2hlcy4KICAqLworLy8gVE9ETzogKGplcm9tZSkgUmVtb3ZlIHdoZW4gc3dpdGNoaW5nIHRvIE1hdGNoTG9jYXRvcjIKIHB1YmxpYyBjbGFzcyBNYXRjaFNldCB7CiAJCi0JcHJpdmF0ZSBNYXRjaExvY2F0b3IgbG9jYXRvcjsKKwlNYXRjaExvY2F0b3IgbG9jYXRvcjsKIAlpbnQgbWF0Y2hDb250YWluZXI7CiAJYm9vbGVhbiBjdUhhc0JlZW5SZXNvbHZlZCA9IGZhbHNlOwogCiAJLyoqCiAJICogU2V0IG9mIG1hdGNoaW5nIGFzdCBub2RlcyB0aGF0IGRvbid0IG5lZWQgdG8gYmUgcmVzb2x2ZWQuCiAJICovCi0JcHJpdmF0ZSBNYXAgbWF0Y2hpbmdOb2RlcyA9IG5ldyBIYXNoTWFwKDUpOworCU1hcCBtYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoNSk7CisJSGFzaHRhYmxlT2ZMb25nIG1hdGNoaW5nTm9kZXNLZXlzID0gbmV3IEhhc2h0YWJsZU9mTG9uZyg1KTsKIAogCS8qKgogCSAqIFNldCBvZiBwb3RlbnRpYWwgbWF0Y2hpbmcgYXN0IG5vZGVzLiBUaGV5IG5lZWQgdG8gYmUgcmVzb2x2ZWQKIAkgKiB0byBkZXRlcm1pbmUgaWYgdGhleSByZWFsbHkgbWF0Y2ggdGhlIHNlYXJjaCBwYXR0ZXJuLgogCSAqLwotCXByaXZhdGUgTWFwIHBvdGVudGlhbE1hdGNoaW5nTm9kZXMgPSBuZXcgSGFzaE1hcCg1KTsKKwlNYXAgcG90ZW50aWFsTWF0Y2hpbmdOb2RlcyA9IG5ldyBIYXNoTWFwKDUpOworCUhhc2h0YWJsZU9mTG9uZyBwb3RlbnRpYWxNYXRjaGluZ05vZGVzS2V5cyA9IG5ldyBIYXNodGFibGVPZkxvbmcoNSk7CiAJCiAvKioKICAqIEFuIGFzdCB2aXNpdG9yIHRoYXQgdmlzaXRzIGxvY2FsIHR5cGUgZGVjbGFyYXRpb25zLgpAQCAtNzMsNyArNzgsMjAgQEAKIAl9CiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTG9jYWxUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBCbG9ja1Njb3BlIHNjb3BlKSB7CiAJCXRyeSB7CisJCQkvLyBjaGVjayB0eXBlIGRlY2xhcmF0aW9uCisJCQlJbnRlZ2VyIGxldmVsOworCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKW1hdGNoaW5nTm9kZXMucmVtb3ZlKHR5cGVEZWNsYXJhdGlvbikpICE9IG51bGwpIHsKKwkJCQlsb2NhdG9yLnJlcG9ydFR5cGVEZWNsYXJhdGlvbigKKwkJCQkJdHlwZURlY2xhcmF0aW9uLCAKKwkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCisJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJfQorCQkJCisJCQkvLyBjaGVjayBpbnNpZGUgdHlwZSBkZWNsYXJhdGlvbgogCQkJcmVwb3J0TWF0Y2hpbmcodHlwZURlY2xhcmF0aW9uLCBlbmNsb3NpbmdFbGVtZW50KTsKKwkJCQogCQkJcmV0dXJuIGZhbHNlOyAvLyBkb24ndCB2aXNpdCBtZW1iZXJzIGFzIHRoaXMgd2FzIGRvbmUgZHVyaW5nIHJlcG9ydE1hdGNoaW5nKC4uLikKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgV3JhcHBlZENvcmVFeGNlcHRpb24oZSk7CkBAIC0xMDIsMTAgKzEyMCwzNCBAQAogCXRoaXMubWF0Y2hDb250YWluZXIgPSBsb2NhdG9yLnBhdHRlcm4ubWF0Y2hDb250YWluZXIoKTsKIH0KIHB1YmxpYyB2b2lkIGFkZFBvc3NpYmxlTWF0Y2goQXN0Tm9kZSBub2RlKSB7CisKKwkvLyByZW1vdmUgZXhpc3Rpbmcgbm9kZSBhdCBzYW1lIHBvc2l0aW9uIGZyb20gc2V0CisJLy8gKGNhc2Ugb2YgcmVjb3ZlcnkgdGhhdCBjcmVhdGVkIHRoZSBzYW1lIG5vZGUgc2V2ZXJhbCB0aW1lCisJLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzY2KQorCWxvbmcga2V5ID0gKCgobG9uZykgbm9kZS5zb3VyY2VTdGFydCkgPDwgMzIpICsgbm9kZS5zb3VyY2VFbmQ7CisJQXN0Tm9kZSBleGlzdGluZyA9IChBc3ROb2RlKXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlc0tleXMuZ2V0KGtleSk7CisJaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcuZ2V0Q2xhc3MoKS5lcXVhbHMobm9kZS5nZXRDbGFzcygpKSkgeworCQl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMucmVtb3ZlKGV4aXN0aW5nKTsKKwl9CisKKwkvLyBhZGQgbm9kZSB0byBzZXQKIAl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uUE9TU0lCTEVfTUFUQ0gpKTsKKwl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG5vZGUpOwogfQogcHVibGljIHZvaWQgYWRkVHJ1c3RlZE1hdGNoKEFzdE5vZGUgbm9kZSkgeworCQorCS8vIHJlbW92ZSBleGlzdGluZyBub2RlIGF0IHNhbWUgcG9zaXRpb24gZnJvbSBzZXQKKwkvLyAoY2FzZSBvZiByZWNvdmVyeSB0aGF0IGNyZWF0ZWQgdGhlIHNhbWUgbm9kZSBzZXZlcmFsIHRpbWUKKwkvLyBzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNjYpCisJbG9uZyBrZXkgPSAoKChsb25nKSBub2RlLnNvdXJjZVN0YXJ0KSA8PCAzMikgKyBub2RlLnNvdXJjZUVuZDsKKwlBc3ROb2RlIGV4aXN0aW5nID0gKEFzdE5vZGUpdGhpcy5tYXRjaGluZ05vZGVzS2V5cy5nZXQoa2V5KTsKKwlpZiAoZXhpc3RpbmcgIT0gbnVsbCAmJiBleGlzdGluZy5nZXRDbGFzcygpLmVxdWFscyhub2RlLmdldENsYXNzKCkpKSB7CisJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoZXhpc3RpbmcpOworCX0KKwkKKwkvLyBhZGQgbm9kZSB0byBzZXQKIAl0aGlzLm1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0gpKTsKKwl0aGlzLm1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG5vZGUpOwogfQogcHVibGljIHZvaWQgY2hlY2tNYXRjaGluZyhBc3ROb2RlIG5vZGUpIHsKIAl0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaENoZWNrKG5vZGUsIHRoaXMpOwpAQCAtMTU4LDkgKzIwMCwxMyBAQAogCXJldHVybiB0aGlzLm5vZGVzSW5SYW5nZShzdGFydCwgZW5kLCB0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMpOwogfQogcHVibGljIEludGVnZXIgcmVtb3ZlUG9zc2libGVNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwlsb25nIGtleSA9ICgoKGxvbmcpIG5vZGUuc291cmNlU3RhcnQpIDw8IDMyKSArIG5vZGUuc291cmNlRW5kOworCXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlc0tleXMucHV0KGtleSwgbnVsbCk7CiAJcmV0dXJuIChJbnRlZ2VyKXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7CiB9CiBwdWJsaWMgSW50ZWdlciByZW1vdmVUcnVzdGVkTWF0Y2goQXN0Tm9kZSBub2RlKSB7CisJbG9uZyBrZXkgPSAoKChsb25nKSBub2RlLnNvdXJjZVN0YXJ0KSA8PCAzMikgKyBub2RlLnNvdXJjZUVuZDsKKwl0aGlzLm1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG51bGwpOwogCXJldHVybiAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG5vZGUpOwogfQogLyoqCkBAIC0xNjgsMjMgKzIxNCw5IEBACiAgKiBzZWFyY2ggcGF0dGVybiAoaWUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCiAgKiBOb3RlIHRoYXQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuCiAgKi8KLXByaXZhdGUgdm9pZCByZXBvcnRNYXRjaGluZyhBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCS8vIHJlZmVyZW5jZXMgaW4gdGhpcyBtZXRob2QKLQlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQsIG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKLQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7Ci0JCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7Ci0JCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKAotCQkJCW5vZGUsIAotCQkJCW1ldGhvZCwgCi0JCQkJcGFyZW50LCAKLQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPwotCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6Ci0JCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7Ci0JCQl0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG5vZGUpOwotCQl9Ci0JfQorcHJpdmF0ZSB2b2lkIHJlcG9ydE1hdGNoaW5nKEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBib29sZWFuIHR5cGVJbkhpZXJhcmNoeSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCS8vIGRlY2xhcmF0aW9uIGluIHRoaXMgbWV0aG9kCisJLy8gKE5COiBkZWNsYXJhdGlvbnMgbXVzdCBiZSBzZWFyY2hlZCBmaXJzdCAoc2VlIGJ1ZyAyMDYzMSBEZWNsYXJhdGlvbiBvZiBsb2NhbCBiaW5hcnkgdHlwZSBub3QgZm91bmQpCiAJaWYgKChtZXRob2QuYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgIT0gMCkgewogCQlMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBsb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG5ldyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvcigpOwogCQlsb2NhbERlY2xhcmF0aW9uVmlzaXRvci5lbmNsb3NpbmdFbGVtZW50ID0gCkBAIC0xOTcsNiArMjI5LDI1IEBACiAJCQl0aHJvdyBlLmNvcmVFeGNlcHRpb247CiAJCX0KIAl9CisJCisJLy8gcmVmZXJlbmNlcyBpbiB0aGlzIG1ldGhvZAorCWlmICh0eXBlSW5IaWVyYXJjaHkpIHsKKwkJQXN0Tm9kZVtdIG5vZGVzID0gdGhpcy5tYXRjaGluZ05vZGVzKG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKKwkJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KG5vZGUpOworCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5NRVRIT0QpICE9IDApIHsKKwkJCQl0aGlzLmxvY2F0b3IucmVwb3J0UmVmZXJlbmNlKAorCQkJCQlub2RlLCAKKwkJCQkJbWV0aG9kLCAKKwkJCQkJcGFyZW50LCAKKwkJCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8KKwkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKKwkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsKKwkJCX0KKwkJfQorCX0KIAlpZiAodGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzKG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQpLmxlbmd0aCA9PSAwKSB7CiAJCS8vIG5vIG5lZWQgdG8gcmVzb2x2ZSB0aGUgc3RhdGVtZW50cyBpbiB0aGUgbWV0aG9kCiAJCW1ldGhvZC5zdGF0ZW1lbnRzID0gbnVsbDsKQEAgLTIxNCw2ICsyNjUsMTAgQEAKIAkJCWludCBsZXZlbDsKIAkJCWlmIChub2RlIGluc3RhbmNlb2YgSW1wb3J0UmVmZXJlbmNlKSB7CiAJCQkJLy8gc3BlY2lhbCBjYXNlIGZvciBpbXBvcnQgcmVmczogdGhleSBkb24ndCBrbm93IHRoZWlyIGJpbmRpbmcKKwkJCQkKKwkJCQkvLyBpbXBvcnQgcmVmIGNhbm5vdCBiZSBpbiB0aGUgaGlyYXJjaHkgb2YgYSB0eXBlCisJCQkJaWYgKHRoaXMubG9jYXRvci5oaWVyYXJjaHlSZXNvbHZlciAhPSBudWxsKSBjb250aW51ZTsKKwkJCQkKIAkJCQlJbXBvcnRSZWZlcmVuY2UgaW1wb3J0UmVmID0gKEltcG9ydFJlZmVyZW5jZSlub2RlOwogCQkJCUJpbmRpbmcgYmluZGluZzsKIAkJCQlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSB7CkBAIC0yOTcsMjEgKzM1MiwyMyBAQAogICogc2VhcmNoIHBhdHRlcm4gKGllLiB0aGUgb25lcyBpbiB0aGUgbWF0Y2hpbmcgbm9kZXMgc2V0KQogICogTm90ZSB0aGF0IHRoZSBmaWVsZCBkZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuCiAgKi8KLXByaXZhdGUgdm9pZCByZXBvcnRNYXRjaGluZyhGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBUeXBlRGVjbGFyYXRpb24gdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUFzdE5vZGVbXSBub2RlcyA9IHRoaXMubWF0Y2hpbmdOb2RlcyhmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKLQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7Ci0JCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uRklFTEQpICE9IDApIHsKLQkJCXRoaXMubG9jYXRvci5yZXBvcnRSZWZlcmVuY2UoCi0JCQkJbm9kZSwgCi0JCQkJdHlwZSwgCi0JCQkJZmllbGQsIAotCQkJCXBhcmVudCwgCi0JCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8KLQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgotCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOwotCQkJdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsKK3ByaXZhdGUgdm9pZCByZXBvcnRNYXRjaGluZyhGaWVsZERlY2xhcmF0aW9uIGZpZWxkLCBJSmF2YUVsZW1lbnQgcGFyZW50LCBUeXBlRGVjbGFyYXRpb24gdHlwZSwgYm9vbGVhbiB0eXBlSW5IaWVyYXJjaHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAodHlwZUluSGllcmFyY2h5KSB7CisJCUFzdE5vZGVbXSBub2RlcyA9IHRoaXMubWF0Y2hpbmdOb2RlcyhmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCUFzdE5vZGUgbm9kZSA9IG5vZGVzW2ldOworCQkJSW50ZWdlciBsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7CisJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkZJRUxEKSAhPSAwKSB7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFJlZmVyZW5jZSgKKwkJCQkJbm9kZSwgCisJCQkJCXR5cGUsIAorCQkJCQlmaWVsZCwgCisJCQkJCXBhcmVudCwgCisJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7CisJCQl9CiAJCX0KIAl9CiAJaWYgKChmaWVsZC5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwKSB7CkBAIC0zMjMsNyArMzgwLDcgQEAKIAkJCQkJKElKYXZhRWxlbWVudCl0aGlzLmxvY2F0b3IuY3JlYXRlSW5pdGlhbGl6ZXJIYW5kbGUodHlwZSwgZmllbGQsIChJVHlwZSlwYXJlbnQpKSA6CiAJCQkJcGFyZW50OwogCQl0cnkgewotCQkJZmllbGQudHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChCbG9ja1Njb3BlKW51bGwpOworCQkJZmllbGQudHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChNZXRob2RTY29wZSludWxsKTsKIAkJfSBjYXRjaCAoV3JhcHBlZENvcmVFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgZS5jb3JlRXhjZXB0aW9uOwogCQl9CkBAIC0zMzUsNiArMzkyLDE0IEBACiAgKiBOb3RlIHRoYXQgdGhlIHR5cGUgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLgogICovCiBwdWJsaWMgdm9pZCByZXBvcnRNYXRjaGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZSwgSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQorCS8vIGZpbHRlciBvdXQgZWxlbWVudCBub3QgaW4gaGllcmFyY2h5IHNjb3BlCisJYm9vbGVhbiB0eXBlSW5IaWVyYXJjaHkgPSAKKwkJdGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyID09IG51bGwgCisJCQl8fCB0eXBlLmJpbmRpbmcgPT0gbnVsbAorCQkJfHwgdGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyLnN1Yk9yU3VwZXJPZkZvY3VzKHR5cGUuYmluZGluZyk7CisJCisJLy8gY3JlYXRlIHR5cGUgaGFuZGxlCiAJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CiAJaWYgKHBhcmVudCA9PSBudWxsKSB7CiAJCWVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmxvY2F0b3IuY3JlYXRlVHlwZUhhbmRsZSh0eXBlLm5hbWUpOwpAQCAtMzUxLDE3ICs0MTYsMTcgQEAKIAlpZiAoZmllbGRzICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKIAkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZHNbaV07Ci0JCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShmaWVsZCkpICE9IG51bGwpIHsKLQkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShmaWVsZCkpICE9IG51bGwKKwkJCQkmJiB0eXBlSW5IaWVyYXJjaHkKKwkJCQkmJiAodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKIAkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEZpZWxkRGVjbGFyYXRpb24oCiAJCQkJCQlmaWVsZCwgCiAJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKIAkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CiAJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgogCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7Ci0JCQkJfQogCQkJfQotCQkJdGhpcy5yZXBvcnRNYXRjaGluZyhmaWVsZCwgZW5jbG9zaW5nRWxlbWVudCwgdHlwZSk7CisJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKGZpZWxkLCBlbmNsb3NpbmdFbGVtZW50LCB0eXBlLCB0eXBlSW5IaWVyYXJjaHkpOwogCQl9CiAJfQogCkBAIC0zNzAsMTcgKzQzNSwxNyBAQAogCWlmIChtZXRob2RzICE9IG51bGwpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZXRob2QpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgeworCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobWV0aG9kKSkgIT0gbnVsbAorCQkJCSYmIHR5cGVJbkhpZXJhcmNoeQorCQkJCSYmICh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5DTEFTUykgIT0gMCkgewogCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0TWV0aG9kRGVjbGFyYXRpb24oCiAJCQkJCQltZXRob2QsIAogCQkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCiAJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPwogCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKIAkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOwotCQkJCX0KIAkJCX0KLQkJCXRoaXMucmVwb3J0TWF0Y2hpbmcobWV0aG9kLCBlbmNsb3NpbmdFbGVtZW50KTsKKwkJCXRoaXMucmVwb3J0TWF0Y2hpbmcobWV0aG9kLCBlbmNsb3NpbmdFbGVtZW50LCB0eXBlSW5IaWVyYXJjaHkpOwogCQl9CiAJfQogCkBAIC0zODksMTUgKzQ1NCwxNSBAQAogCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBpKyspIHsKIAkJCU1lbWJlclR5cGVEZWNsYXJhdGlvbiBtZW1iZXJUeXBlID0gbWVtYmVyVHlwZXNbaV07Ci0JCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZW1iZXJUeXBlKSkgIT0gbnVsbCkgewotCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG1lbWJlclR5cGUpKSAhPSBudWxsCisJCQkJJiYgdHlwZUluSGllcmFyY2h5CisJCQkJJiYgKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CiAJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRUeXBlRGVjbGFyYXRpb24oCiAJCQkJCQltZW1iZXJUeXBlLCAKIAkJCQkJCWVuY2xvc2luZ0VsZW1lbnQsIAogCQkJCQkJbGV2ZWwuaW50VmFsdWUoKSA9PSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIID8KIAkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CiAJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKLQkJCQl9CiAJCQl9CiAJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKG1lbWJlclR5cGUsIGVuY2xvc2luZ0VsZW1lbnQpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nTm9kZVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ05vZGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFhZmFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ05vZGVTZXQuamF2YQpAQCAtMCwwICsxLDU2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5BYnN0cmFjdFN5bnRheFRyZWVWaXNpdG9yQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5JbXBvcnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Mb2NhbFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lbWJlclR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmxvY2tTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkNsYXNzU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5NZXRob2RTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZkxvbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKKworLyoqCisgKiBBIHNldCBvZiBtYXRjaGVzIGFuZCBwb3RlbnRpYWwgbWF0Y2hlcy4KKyAqLworcHVibGljIGNsYXNzIE1hdGNoaW5nTm9kZVNldCBleHRlbmRzIE1hdGNoU2V0IHsgLy8gVE9ETzogKGplcm9tZSkgcmVtb3ZlIGV4dGVuZHMKKwkKKwlNYXRjaExvY2F0b3IyIGxvY2F0b3I7CisJaW50IG1hdGNoQ29udGFpbmVyOworCWJvb2xlYW4gY3VIYXNCZWVuUmVzb2x2ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIFNldCBvZiBtYXRjaGluZyBhc3Qgbm9kZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIHJlc29sdmVkLgorCSAqLworCU1hcCBtYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoNSk7CisJSGFzaHRhYmxlT2ZMb25nIG1hdGNoaW5nTm9kZXNLZXlzID0gbmV3IEhhc2h0YWJsZU9mTG9uZyg1KTsKKworCS8qKgorCSAqIFNldCBvZiBwb3RlbnRpYWwgbWF0Y2hpbmcgYXN0IG5vZGVzLiBUaGV5IG5lZWQgdG8gYmUgcmVzb2x2ZWQKKwkgKiB0byBkZXRlcm1pbmUgaWYgdGhleSByZWFsbHkgbWF0Y2ggdGhlIHNlYXJjaCBwYXR0ZXJuLgorCSAqLworCU1hcCBwb3RlbnRpYWxNYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoNSk7CisJSGFzaHRhYmxlT2ZMb25nIHBvdGVudGlhbE1hdGNoaW5nTm9kZXNLZXlzID0gbmV3IEhhc2h0YWJsZU9mTG9uZyg1KTsKKwkKKy8qKgorICogQW4gYXN0IHZpc2l0b3IgdGhhdCB2aXNpdHMgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBleHRlbmRzIEFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3JBZGFwdGVyIHsKKwlJSmF2YUVsZW1lbnQgZW5jbG9zaW5nRWxlbWVudDsKKwlwdWJsaWMgYm9vbGVhbiB2aXNpdCgKKwkJCUFub255bW91c0xvY2FsVHlwZURlY2xhcmF0aW9uIGFub255bW91c1R5cGVEZWNsYXJhdGlvbiwKKwkJCUJsb2NrU2NvcGUgc2NvcGUpIHsKKwkJdHJ5IHsKKwkJCXJlcG9ydE1hdGNoaW5nKGFub255bW91c1R5cGVEZWNsYXJhdGlvbiwgZW5jbG9zaW5nRWxlbWVudCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFdyYXBwZWRDb3JlRXhjZXB0aW9uKGUpOworCQl9CisJCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgbWVtYmVycyBhcyB0aGlzIHdhcyBkb25lIGR1cmluZyByZXBvcnRNYXRjaGluZyguLi4pCisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KExvY2FsVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQmxvY2tTY29wZSBzY29wZSkgeworCQl0cnkgeworCQkJLy8gY2hlY2sgdHlwZSBkZWNsYXJhdGlvbgorCQkJSW50ZWdlciBsZXZlbDsKKwkJCWlmICgobGV2ZWwgPSAoSW50ZWdlciltYXRjaGluZ05vZGVzLnJlbW92ZSh0eXBlRGVjbGFyYXRpb24pKSAhPSBudWxsKSB7CisJCQkJbG9jYXRvci5yZXBvcnRUeXBlRGVjbGFyYXRpb24oCisJCQkJCXR5cGVEZWNsYXJhdGlvbiwgCisJCQkJCWVuY2xvc2luZ0VsZW1lbnQsIAorCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCX0KKwkJCQorCQkJLy8gY2hlY2sgaW5zaWRlIHR5cGUgZGVjbGFyYXRpb24KKwkJCXJlcG9ydE1hdGNoaW5nKHR5cGVEZWNsYXJhdGlvbiwgZW5jbG9zaW5nRWxlbWVudCk7CisJCQkKKwkJCXJldHVybiBmYWxzZTsgLy8gZG9uJ3QgdmlzaXQgbWVtYmVycyBhcyB0aGlzIHdhcyBkb25lIGR1cmluZyByZXBvcnRNYXRjaGluZyguLi4pCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFdyYXBwZWRDb3JlRXhjZXB0aW9uKGUpOworCQl9CisJfQorCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENsYXNzU2NvcGUgc2NvcGUpIHsKKwkJdHJ5IHsKKwkJCXJlcG9ydE1hdGNoaW5nKHR5cGVEZWNsYXJhdGlvbiwgZW5jbG9zaW5nRWxlbWVudCk7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHZpc2l0IG1lbWJlcnMgYXMgdGhpcyB3YXMgZG9uZSBkdXJpbmcgcmVwb3J0TWF0Y2hpbmcoLi4uKQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkQ29yZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKwkKK30JCisKK3B1YmxpYyBjbGFzcyBXcmFwcGVkQ29yZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCXB1YmxpYyBDb3JlRXhjZXB0aW9uIGNvcmVFeGNlcHRpb247CisJcHVibGljIFdyYXBwZWRDb3JlRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gY29yZUV4Y2VwdGlvbikgeworCQl0aGlzLmNvcmVFeGNlcHRpb24gPSBjb3JlRXhjZXB0aW9uOworCX0KK30KKworcHVibGljIE1hdGNoaW5nTm9kZVNldChNYXRjaExvY2F0b3IyIGxvY2F0b3IpIHsKKwlzdXBlcihsb2NhdG9yKTsKKwl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworCXRoaXMubWF0Y2hDb250YWluZXIgPSBsb2NhdG9yLnBhdHRlcm4ubWF0Y2hDb250YWluZXIoKTsKK30KK3B1YmxpYyB2b2lkIGFkZFBvc3NpYmxlTWF0Y2goQXN0Tm9kZSBub2RlKSB7CisKKwkvLyByZW1vdmUgZXhpc3Rpbmcgbm9kZSBhdCBzYW1lIHBvc2l0aW9uIGZyb20gc2V0CisJLy8gKGNhc2Ugb2YgcmVjb3ZlcnkgdGhhdCBjcmVhdGVkIHRoZSBzYW1lIG5vZGUgc2V2ZXJhbCB0aW1lCisJLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzY2KQorCWxvbmcga2V5ID0gKCgobG9uZykgbm9kZS5zb3VyY2VTdGFydCkgPDwgMzIpICsgbm9kZS5zb3VyY2VFbmQ7CisJQXN0Tm9kZSBleGlzdGluZyA9IChBc3ROb2RlKXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlc0tleXMuZ2V0KGtleSk7CisJaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcuZ2V0Q2xhc3MoKS5lcXVhbHMobm9kZS5nZXRDbGFzcygpKSkgeworCQl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMucmVtb3ZlKGV4aXN0aW5nKTsKKwl9CisKKwkvLyBhZGQgbm9kZSB0byBzZXQKKwl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uUE9TU0lCTEVfTUFUQ0gpKTsKKwl0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG5vZGUpOworfQorcHVibGljIHZvaWQgYWRkVHJ1c3RlZE1hdGNoKEFzdE5vZGUgbm9kZSkgeworCQorCS8vIHJlbW92ZSBleGlzdGluZyBub2RlIGF0IHNhbWUgcG9zaXRpb24gZnJvbSBzZXQKKwkvLyAoY2FzZSBvZiByZWNvdmVyeSB0aGF0IGNyZWF0ZWQgdGhlIHNhbWUgbm9kZSBzZXZlcmFsIHRpbWUKKwkvLyBzZWUgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzNjYpCisJbG9uZyBrZXkgPSAoKChsb25nKSBub2RlLnNvdXJjZVN0YXJ0KSA8PCAzMikgKyBub2RlLnNvdXJjZUVuZDsKKwlBc3ROb2RlIGV4aXN0aW5nID0gKEFzdE5vZGUpdGhpcy5tYXRjaGluZ05vZGVzS2V5cy5nZXQoa2V5KTsKKwlpZiAoZXhpc3RpbmcgIT0gbnVsbCAmJiBleGlzdGluZy5nZXRDbGFzcygpLmVxdWFscyhub2RlLmdldENsYXNzKCkpKSB7CisJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoZXhpc3RpbmcpOworCX0KKwkKKwkvLyBhZGQgbm9kZSB0byBzZXQKKwl0aGlzLm1hdGNoaW5nTm9kZXMucHV0KG5vZGUsIG5ldyBJbnRlZ2VyKFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0gpKTsKKwl0aGlzLm1hdGNoaW5nTm9kZXNLZXlzLnB1dChrZXksIG5vZGUpOworfQorcHVibGljIHZvaWQgY2hlY2tNYXRjaGluZyhBc3ROb2RlIG5vZGUpIHsKKwl0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaENoZWNrKG5vZGUsIHRoaXMpOworfQorcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwlyZXR1cm4gCisJCXRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5zaXplKCkgPT0gMCAKKwkJJiYgdGhpcy5tYXRjaGluZ05vZGVzLnNpemUoKSA9PSAwOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBub2RlcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKi8KK3ByaXZhdGUgQXN0Tm9kZVtdIG1hdGNoaW5nTm9kZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJcmV0dXJuIHRoaXMubm9kZXNJblJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubWF0Y2hpbmdOb2Rlcyk7Cit9CitwdWJsaWMgYm9vbGVhbiBuZWVkc1Jlc29sdmUoKSB7CisJcmV0dXJuIHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5zaXplKCkgPiAwOworfQorLyoqCisgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBub2RlcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaW4gdGhlIHNvdXJjZSBvcmRlci4KKyAqLworcHJpdmF0ZSBBc3ROb2RlW10gbm9kZXNJblJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgTWFwIHNldCkgeworCS8vIGNvbGxlY3Qgbm9kZXMgaW4gdGhlIGdpdmVuIHJhbmdlCisJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOworCWZvciAoSXRlcmF0b3Iga2V5cyA9IHNldC5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlzLmhhc05leHQoKTspIHsKKwkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpa2V5cy5uZXh0KCk7CisJCWlmIChzdGFydCA8PSBub2RlLnNvdXJjZVN0YXJ0ICYmIG5vZGUuc291cmNlRW5kIDw9IGVuZCkgeworCQkJbm9kZXMuYWRkKG5vZGUpOworCQl9CisJfQorCUFzdE5vZGVbXSByZXN1bHQgPSBuZXcgQXN0Tm9kZVtub2Rlcy5zaXplKCldOworCW5vZGVzLnRvQXJyYXkocmVzdWx0KTsKKworCS8vIHNvcnQgbm9kZXMgYnkgc291cmNlIHN0YXJ0cworCVV0aWwuQ29tcGFyZXIgY29tcGFyZXIgPSBuZXcgVXRpbC5Db21wYXJlcigpIHsKKwkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQlBc3ROb2RlIG5vZGUxID0gKEFzdE5vZGUpIG8xOworCQkJQXN0Tm9kZSBub2RlMiA9IChBc3ROb2RlKSBvMjsKKwkJCXJldHVybiBub2RlMS5zb3VyY2VTdGFydCAtIG5vZGUyLnNvdXJjZVN0YXJ0OworCQl9CisJfTsKKwlVdGlsLnNvcnQocmVzdWx0LCBjb21wYXJlcik7CisJCQorCXJldHVybiByZXN1bHQ7Cit9CisvKioKKyAqIFJldHVybnMgdGhlIHBvdGVudGlhbCBtYXRjaGluZyBub2RlcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKi8KK3ByaXZhdGUgQXN0Tm9kZVtdIHBvdGVudGlhbE1hdGNoaW5nTm9kZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJcmV0dXJuIHRoaXMubm9kZXNJblJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcyk7Cit9CitwdWJsaWMgSW50ZWdlciByZW1vdmVQb3NzaWJsZU1hdGNoKEFzdE5vZGUgbm9kZSkgeworCWxvbmcga2V5ID0gKCgobG9uZykgbm9kZS5zb3VyY2VTdGFydCkgPDwgMzIpICsgbm9kZS5zb3VyY2VFbmQ7CisJdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzS2V5cy5wdXQoa2V5LCBudWxsKTsKKwlyZXR1cm4gKEludGVnZXIpdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLnJlbW92ZShub2RlKTsKK30KK3B1YmxpYyBJbnRlZ2VyIHJlbW92ZVRydXN0ZWRNYXRjaChBc3ROb2RlIG5vZGUpIHsKKwlsb25nIGtleSA9ICgoKGxvbmcpIG5vZGUuc291cmNlU3RhcnQpIDw8IDMyKSArIG5vZGUuc291cmNlRW5kOworCXRoaXMubWF0Y2hpbmdOb2Rlc0tleXMucHV0KGtleSwgbnVsbCk7CisJcmV0dXJuIChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7Cit9CisvKioKKyAqIFZpc2l0IHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIHJlcG9ydCB0aGUgbm9kZXMgdGhhdCBtYXRjaCBleGFjdGx5IHRoZQorICogc2VhcmNoIHBhdHRlcm4gKGllLiB0aGUgb25lcyBpbiB0aGUgbWF0Y2hpbmcgbm9kZXMgc2V0KQorICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLgorICovCitwcml2YXRlIHZvaWQgcmVwb3J0TWF0Y2hpbmcoQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIElKYXZhRWxlbWVudCBwYXJlbnQsIGJvb2xlYW4gdHlwZUluSGllcmFyY2h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJLy8gZGVjbGFyYXRpb24gaW4gdGhpcyBtZXRob2QKKwkvLyAoTkI6IGRlY2xhcmF0aW9ucyBtdXN0IGJlIHNlYXJjaGVkIGZpcnN0IChzZWUgYnVnIDIwNjMxIERlY2xhcmF0aW9uIG9mIGxvY2FsIGJpbmFyeSB0eXBlIG5vdCBmb3VuZCkKKwlpZiAoKG1ldGhvZC5iaXRzICYgQXN0Tm9kZS5IYXNMb2NhbFR5cGVNQVNLKSAhPSAwKSB7CisJCUxvY2FsRGVjbGFyYXRpb25WaXNpdG9yIGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yID0gbmV3IExvY2FsRGVjbGFyYXRpb25WaXNpdG9yKCk7CisJCWxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLmVuY2xvc2luZ0VsZW1lbnQgPSAKKwkJCShwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkgPworCQkJCXRoaXMubG9jYXRvci5jcmVhdGVNZXRob2RIYW5kbGUobWV0aG9kLCAoSVR5cGUpcGFyZW50KSA6CisJCQkJcGFyZW50OworCQl0cnkgeworCQkJbWV0aG9kLnRyYXZlcnNlKGxvY2FsRGVjbGFyYXRpb25WaXNpdG9yLCAoQ2xhc3NTY29wZSludWxsKTsKKwkJfSBjYXRjaCAoV3JhcHBlZENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZS5jb3JlRXhjZXB0aW9uOworCQl9CisJfQorCQorCS8vIHJlZmVyZW5jZXMgaW4gdGhpcyBtZXRob2QKKwlpZiAodHlwZUluSGllcmFyY2h5KSB7CisJCUFzdE5vZGVbXSBub2RlcyA9IHRoaXMubWF0Y2hpbmdOb2RlcyhtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQkJQXN0Tm9kZSBub2RlID0gbm9kZXNbaV07CisJCQlJbnRlZ2VyIGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLmdldChub2RlKTsKKwkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uTUVUSE9EKSAhPSAwKSB7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFJlZmVyZW5jZSgKKwkJCQkJbm9kZSwgCisJCQkJCW1ldGhvZCwgCisJCQkJCXBhcmVudCwgCisJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobm9kZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2RlcyhtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kKS5sZW5ndGggPT0gMCkgeworCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgdGhlIHN0YXRlbWVudHMgaW4gdGhlIG1ldGhvZAorCQltZXRob2Quc3RhdGVtZW50cyA9IG51bGw7CisJfQorfQorLyoqCisgKiBWaXNpdCB0aGUgZ2l2ZW4gcGFyc2UgdHJlZSBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCisgKiBzZWFyY2ggcGF0dGVybi4KKyAqLworcHVibGljIHZvaWQgcmVwb3J0TWF0Y2hpbmcoQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCWlmICh0aGlzLmN1SGFzQmVlblJlc29sdmVkKSB7CisJCS8vIG1vdmUgdGhlIHBvdGVudGlhbCBtYXRjaGluZyBub2RlcyB0aGF0IGV4YWN0bHkgbWF0Y2ggdGhlIHNlYXJjaCBwYXR0ZXJuIHRvIHRoZSBtYXRjaGluZyBub2RlcyBzZXQKKwkJZm9yIChJdGVyYXRvciBwb3RlbnRpYWxNYXRjaGVzID0gdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IHBvdGVudGlhbE1hdGNoZXMuaGFzTmV4dCgpOykgeworCQkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpIHBvdGVudGlhbE1hdGNoZXMubmV4dCgpOworCQkJaW50IGxldmVsOworCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJbXBvcnRSZWZlcmVuY2UpIHsKKwkJCQkvLyBzcGVjaWFsIGNhc2UgZm9yIGltcG9ydCByZWZzOiB0aGV5IGRvbid0IGtub3cgdGhlaXIgYmluZGluZworCQkJCQorCQkJCS8vIGltcG9ydCByZWYgY2Fubm90IGJlIGluIHRoZSBoaXJhcmNoeSBvZiBhIHR5cGUKKwkJCQlpZiAodGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyICE9IG51bGwpIGNvbnRpbnVlOworCQkJCQorCQkJCUltcG9ydFJlZmVyZW5jZSBpbXBvcnRSZWYgPSAoSW1wb3J0UmVmZXJlbmNlKW5vZGU7CisJCQkJQmluZGluZyBiaW5kaW5nOworCQkJCWlmIChpbXBvcnRSZWYub25EZW1hbmQpIHsKKwkJCQkJYmluZGluZyA9IHVuaXQuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGltcG9ydFJlZi50b2tlbnMsIDAsIGltcG9ydFJlZi50b2tlbnMubGVuZ3RoKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmluZGluZyA9IHVuaXQuc2NvcGUuZ2V0VHlwZU9yUGFja2FnZShpbXBvcnRSZWYudG9rZW5zKTsKKwkJCQl9CisJCQkJbGV2ZWwgPSB0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaExldmVsKGJpbmRpbmcpOworCisJCQkJaWYgKGxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggfHwgbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIKSB7CisJCQkJCS8vIGNyZWF0ZSBkZWZpbmluZyBpbXBvcnQgaGFuZGxlCisJCQkJCUlKYXZhRWxlbWVudCBpbXBvcnRIYW5kbGUgPSB0aGlzLmxvY2F0b3IuY3JlYXRlSW1wb3J0SGFuZGxlKGltcG9ydFJlZik7CisJCQkJCXRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoUmVwb3J0SW1wb3J0UmVmKAorCQkJCQkJaW1wb3J0UmVmLCAKKwkJCQkJCWJpbmRpbmcsIAorCQkJCQkJaW1wb3J0SGFuZGxlLCAKKwkJCQkJCWxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCwKKwkJCQkJCXRoaXMubG9jYXRvcik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsZXZlbCA9IHRoaXMubG9jYXRvci5wYXR0ZXJuLm1hdGNoTGV2ZWwobm9kZSwgdHJ1ZSk7CisJCQkJaWYgKGxldmVsID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggfHwgbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIKSB7CisJCQkJCXRoaXMubWF0Y2hpbmdOb2Rlcy5wdXQobm9kZSwgbmV3IEludGVnZXIobGV2ZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGhpcy5wb3RlbnRpYWxNYXRjaGluZ05vZGVzID0gbmV3IEhhc2hNYXAoKTsKKwl9CisJCisJLy8gcGFja2FnZSBkZWNsYXJhdGlvbgorCUltcG9ydFJlZmVyZW5jZSBwa2cgPSB1bml0LmN1cnJlbnRQYWNrYWdlOworCUludGVnZXIgbGV2ZWw7CisJaWYgKHBrZyAhPSBudWxsICYmIChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUocGtnKSkgIT0gbnVsbCkgeworCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNPTVBJTEFUSU9OX1VOSVQpICE9IDApIHsKKwkJCXRoaXMubG9jYXRvci5yZXBvcnRQYWNrYWdlRGVjbGFyYXRpb24ocGtnKTsKKwkJfQorCX0KKworCS8vIGltcG9ydCBkZWNsYXJhdGlvbnMKKwlpZiAoIXRoaXMuY3VIYXNCZWVuUmVzb2x2ZWQpIHsKKwkJSW1wb3J0UmVmZXJlbmNlW10gaW1wb3J0cyA9IHVuaXQuaW1wb3J0czsKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCQkJSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiA9IGltcG9ydHNbaV07CisJCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoaW1wb3J0UmVmKSkgIT0gbnVsbCkgeworCQkJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNPTVBJTEFUSU9OX1VOSVQpICE9IDApIHsKKwkJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRJbXBvcnQoCisJCQkJCQkJaW1wb3J0UmVmLCAKKwkJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IC8vIGVsc2UgaW1wb3J0IGRlY2xhcmF0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYWJvdmUKKworCS8vIHR5cGVzCisJVHlwZURlY2xhcmF0aW9uW10gdHlwZXMgPSB1bml0LnR5cGVzOworCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKwkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gdHlwZXNbaV07CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZSh0eXBlKSkgIT0gbnVsbCkgeworCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ09NUElMQVRJT05fVU5JVCkgIT0gMCkgeworCQkJCQl0aGlzLmxvY2F0b3IucmVwb3J0VHlwZURlY2xhcmF0aW9uKAorCQkJCQkJdHlwZSwgCisJCQkJCQludWxsLCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQkJfQorCQkJfQorCQkJdGhpcy5yZXBvcnRNYXRjaGluZyh0eXBlLCBudWxsKTsKKwkJfQorCX0KK30KKy8qKgorICogVmlzaXQgdGhlIGdpdmVuIGZpZWxkIGRlY2xhcmF0aW9uIGFuZCByZXBvcnQgdGhlIG5vZGVzIHRoYXQgbWF0Y2ggZXhhY3RseSB0aGUKKyAqIHNlYXJjaCBwYXR0ZXJuIChpZS4gdGhlIG9uZXMgaW4gdGhlIG1hdGNoaW5nIG5vZGVzIHNldCkKKyAqIE5vdGUgdGhhdCB0aGUgZmllbGQgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLgorICovCitwcml2YXRlIHZvaWQgcmVwb3J0TWF0Y2hpbmcoRmllbGREZWNsYXJhdGlvbiBmaWVsZCwgSUphdmFFbGVtZW50IHBhcmVudCwgVHlwZURlY2xhcmF0aW9uIHR5cGUsIGJvb2xlYW4gdHlwZUluSGllcmFyY2h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJaWYgKHR5cGVJbkhpZXJhcmNoeSkgeworCQlBc3ROb2RlW10gbm9kZXMgPSB0aGlzLm1hdGNoaW5nTm9kZXMoZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CisJCQlBc3ROb2RlIG5vZGUgPSBub2Rlc1tpXTsKKwkJCUludGVnZXIgbGV2ZWwgPSAoSW50ZWdlcil0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KG5vZGUpOworCQkJaWYgKCh0aGlzLm1hdGNoQ29udGFpbmVyICYgU2VhcmNoUGF0dGVybi5GSUVMRCkgIT0gMCkgeworCQkJCXRoaXMubG9jYXRvci5yZXBvcnRSZWZlcmVuY2UoCisJCQkJCW5vZGUsIAorCQkJCQl0eXBlLCAKKwkJCQkJZmllbGQsIAorCQkJCQlwYXJlbnQsIAorCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQl0aGlzLm1hdGNoaW5nTm9kZXMucmVtb3ZlKG5vZGUpOworCQkJfQorCQl9CisJfQorCWlmICgoZmllbGQuYml0cyAmIEFzdE5vZGUuSGFzTG9jYWxUeXBlTUFTSykgIT0gMCkgeworCQlMb2NhbERlY2xhcmF0aW9uVmlzaXRvciBsb2NhbERlY2xhcmF0aW9uVmlzaXRvciA9IG5ldyBMb2NhbERlY2xhcmF0aW9uVmlzaXRvcigpOworCQlsb2NhbERlY2xhcmF0aW9uVmlzaXRvci5lbmNsb3NpbmdFbGVtZW50ID0gCisJCQkocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpID8KKwkJCQkoZmllbGQuaXNGaWVsZCgpID8KKwkJCQkJKElKYXZhRWxlbWVudCl0aGlzLmxvY2F0b3IuY3JlYXRlRmllbGRIYW5kbGUoZmllbGQsIChJVHlwZSlwYXJlbnQpIDoKKwkJCQkJKElKYXZhRWxlbWVudCl0aGlzLmxvY2F0b3IuY3JlYXRlSW5pdGlhbGl6ZXJIYW5kbGUodHlwZSwgZmllbGQsIChJVHlwZSlwYXJlbnQpKSA6CisJCQkJcGFyZW50OworCQl0cnkgeworCQkJZmllbGQudHJhdmVyc2UobG9jYWxEZWNsYXJhdGlvblZpc2l0b3IsIChNZXRob2RTY29wZSludWxsKTsKKwkJfSBjYXRjaCAoV3JhcHBlZENvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZS5jb3JlRXhjZXB0aW9uOworCQl9CisJfQorfQorLyoqCisgKiBWaXNpdCB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJhdGlvbiBhbmQgcmVwb3J0IHRoZSBub2RlcyB0aGF0IG1hdGNoIGV4YWN0bHkgdGhlCisgKiBzZWFyY2ggcGF0dGVybiAoaWUuIHRoZSBvbmVzIGluIHRoZSBtYXRjaGluZyBub2RlcyBzZXQpCisgKiBOb3RlIHRoYXQgdGhlIHR5cGUgZGVjbGFyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLgorICovCitwdWJsaWMgdm9pZCByZXBvcnRNYXRjaGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZSwgSUphdmFFbGVtZW50IHBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQorCS8vIGZpbHRlciBvdXQgZWxlbWVudCBub3QgaW4gaGllcmFyY2h5IHNjb3BlCisJYm9vbGVhbiB0eXBlSW5IaWVyYXJjaHkgPSAKKwkJdGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyID09IG51bGwgCisJCQl8fCB0eXBlLmJpbmRpbmcgPT0gbnVsbAorCQkJfHwgdGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyLnN1Yk9yU3VwZXJPZkZvY3VzKHR5cGUuYmluZGluZyk7CisJCisJLy8gY3JlYXRlIHR5cGUgaGFuZGxlCisJSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCWVuY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmxvY2F0b3IuY3JlYXRlVHlwZUhhbmRsZSh0eXBlLm5hbWUpOworCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKKwkJZW5jbG9zaW5nRWxlbWVudCA9IHRoaXMubG9jYXRvci5jcmVhdGVUeXBlSGFuZGxlKChJVHlwZSlwYXJlbnQsIHR5cGUubmFtZSk7CisJCWlmIChlbmNsb3NpbmdFbGVtZW50ID09IG51bGwpIHJldHVybjsKKwl9IGVsc2UgeworCQllbmNsb3NpbmdFbGVtZW50ID0gcGFyZW50OworCX0KKwlJbnRlZ2VyIGxldmVsOworCQorCS8vIGZpZWxkcworCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZHMgPSB0eXBlLmZpZWxkczsKKwlpZiAoZmllbGRzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSBmaWVsZHNbaV07CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShmaWVsZCkpICE9IG51bGwKKwkJCQkmJiB0eXBlSW5IaWVyYXJjaHkKKwkJCQkmJiAodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEZpZWxkRGVjbGFyYXRpb24oCisJCQkJCQlmaWVsZCwgCisJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQl9CisJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKGZpZWxkLCBlbmNsb3NpbmdFbGVtZW50LCB0eXBlLCB0eXBlSW5IaWVyYXJjaHkpOworCQl9CisJfQorCisJLy8gbWV0aG9kcworCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2RzID0gdHlwZS5tZXRob2RzOworCWlmIChtZXRob2RzICE9IG51bGwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQlBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQlpZiAoKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShtZXRob2QpKSAhPSBudWxsCisJCQkJJiYgdHlwZUluSGllcmFyY2h5CisJCQkJJiYgKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRNZXRob2REZWNsYXJhdGlvbigKKwkJCQkJCW1ldGhvZCwgCisJCQkJCQllbmNsb3NpbmdFbGVtZW50LCAKKwkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0ggOgorCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLlBPVEVOVElBTF9NQVRDSCk7CisJCQl9CisJCQl0aGlzLnJlcG9ydE1hdGNoaW5nKG1ldGhvZCwgZW5jbG9zaW5nRWxlbWVudCwgdHlwZUluSGllcmFyY2h5KTsKKwkJfQorCX0KKworCS8vIG1lbWJlciB0eXBlcworCU1lbWJlclR5cGVEZWNsYXJhdGlvbltdIG1lbWJlclR5cGVzID0gdHlwZS5tZW1iZXJUeXBlczsKKwlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlNZW1iZXJUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZSA9IG1lbWJlclR5cGVzW2ldOworCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUobWVtYmVyVHlwZSkpICE9IG51bGwKKwkJCQkmJiB0eXBlSW5IaWVyYXJjaHkKKwkJCQkmJiAodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFR5cGVEZWNsYXJhdGlvbigKKwkJCQkJCW1lbWJlclR5cGUsIAorCQkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCisJCQkJCQlsZXZlbC5pbnRWYWx1ZSgpID09IFNlYXJjaFBhdHRlcm4uQUNDVVJBVEVfTUFUQ0ggPworCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKKwkJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJfQorCQkJdGhpcy5yZXBvcnRNYXRjaGluZyhtZW1iZXJUeXBlLCBlbmNsb3NpbmdFbGVtZW50KTsKKwkJfQorCX0KKworCS8vIHN1cGVyIHR5cGVzCisJaWYgKHR5cGUgaW5zdGFuY2VvZiBBbm9ueW1vdXNMb2NhbFR5cGVEZWNsYXJhdGlvbikgeworCQlUeXBlUmVmZXJlbmNlIHN1cGVyVHlwZSA9ICgoQW5vbnltb3VzTG9jYWxUeXBlRGVjbGFyYXRpb24pdHlwZSkuYWxsb2NhdGlvbi50eXBlOworCQlpZiAoc3VwZXJUeXBlICE9IG51bGwgJiYgKGxldmVsID0gKEludGVnZXIpdGhpcy5tYXRjaGluZ05vZGVzLnJlbW92ZShzdXBlclR5cGUpKSAhPSBudWxsKSB7CisJCQlpZiAoKHRoaXMubWF0Y2hDb250YWluZXIgJiBTZWFyY2hQYXR0ZXJuLkNMQVNTKSAhPSAwKSB7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydFN1cGVyVHlwZVJlZmVyZW5jZSgKKwkJCQkJc3VwZXJUeXBlLCAKKwkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCisJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJVHlwZVJlZmVyZW5jZSBzdXBlckNsYXNzID0gdHlwZS5zdXBlcmNsYXNzOworCQlpZiAoc3VwZXJDbGFzcyAhPSBudWxsICYmIChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5yZW1vdmUoc3VwZXJDbGFzcykpICE9IG51bGwpIHsKKwkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQl0aGlzLmxvY2F0b3IucmVwb3J0U3VwZXJUeXBlUmVmZXJlbmNlKAorCQkJCQlzdXBlckNsYXNzLCAKKwkJCQkJZW5jbG9zaW5nRWxlbWVudCwgCisJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5FWEFDVF9NQVRDSCA6CisJCQkJCQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3Rvci5QT1RFTlRJQUxfTUFUQ0gpOworCQkJfQorCQl9CisJCVR5cGVSZWZlcmVuY2VbXSBzdXBlckludGVyZmFjZXMgPSB0eXBlLnN1cGVySW50ZXJmYWNlczsKKwkJaWYgKHN1cGVySW50ZXJmYWNlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVySW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworCQkJCVR5cGVSZWZlcmVuY2Ugc3VwZXJJbnRlcmZhY2UgPSBzdXBlckludGVyZmFjZXNbaV07CisJCQkJaWYgKChsZXZlbCA9IChJbnRlZ2VyKXRoaXMubWF0Y2hpbmdOb2Rlcy5nZXQoc3VwZXJJbnRlcmZhY2UpKSAhPSBudWxsKSB7CisJCQkJCWlmICgodGhpcy5tYXRjaENvbnRhaW5lciAmIFNlYXJjaFBhdHRlcm4uQ0xBU1MpICE9IDApIHsKKwkJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRTdXBlclR5cGVSZWZlcmVuY2UoCisJCQkJCQkJc3VwZXJJbnRlcmZhY2UsIAorCQkJCQkJCWVuY2xvc2luZ0VsZW1lbnQsIAorCQkJCQkJCWxldmVsLmludFZhbHVlKCkgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/CisJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDoKKwkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlyZXN1bHQuYXBwZW5kKCJFeGFjdCBtYXRjaGVzOiIpOyAvLyROT04tTkxTLTEkCisJZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5tYXRjaGluZ05vZGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQlyZXN1bHQuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCUFzdE5vZGUgbm9kZSA9IChBc3ROb2RlKWl0ZXIubmV4dCgpOworCQlPYmplY3QgdmFsdWUgPSB0aGlzLm1hdGNoaW5nTm9kZXMuZ2V0KG5vZGUpOworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQlyZXN1bHQuYXBwZW5kKCdcdCcpOworCQkJaW50IGFjY3VyYWN5ID0gKChJbnRlZ2VyKXZhbHVlKS5pbnRWYWx1ZSgpOworCQkJc3dpdGNoIChhY2N1cmFjeSkgeworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTVBPU1NJQkxFX01BVENIOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJJTVBPU1NJQkxFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uUE9TU0lCTEVfTUFUQ0g6CisJCQkJCXJlc3VsdC5hcHBlbmQoIlBPU1NJQkxFX01BVENIOiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU5BQ0NVUkFURV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiSU5BQ0NVUkFURV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLkFDQ1VSQVRFX01BVENIOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJBQ0NVUkFURV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gCisJCXJlc3VsdC5hcHBlbmQobm9kZS50b1N0cmluZygwKSk7CisJfQorCXJlc3VsdC5hcHBlbmQoIlxuUG90ZW50aWFsIG1hdGNoZXM6Iik7IC8vJE5PTi1OTFMtMSQKKwlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLnBvdGVudGlhbE1hdGNoaW5nTm9kZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCXJlc3VsdC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJQXN0Tm9kZSBub2RlID0gKEFzdE5vZGUpaXRlci5uZXh0KCk7CisJCU9iamVjdCB2YWx1ZSA9IHRoaXMucG90ZW50aWFsTWF0Y2hpbmdOb2Rlcy5nZXQobm9kZSk7CisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKwkJCXJlc3VsdC5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWludCBhY2N1cmFjeSA9ICgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKTsKKwkJCXN3aXRjaCAoYWNjdXJhY3kpIHsKKwkJCQljYXNlIFNlYXJjaFBhdHRlcm4uSU1QT1NTSUJMRV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiSU1QT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLlBPU1NJQkxFX01BVENIOgorCQkJCQlyZXN1bHQuYXBwZW5kKCJQT1NTSUJMRV9NQVRDSDogIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0g6CisJCQkJCXJlc3VsdC5hcHBlbmQoIklOQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSDoKKwkJCQkJcmVzdWx0LmFwcGVuZCgiQUNDVVJBVEVfTUFUQ0g6ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlc3VsdC5hcHBlbmQobm9kZS50b1N0cmluZygwKSk7CisJfQorCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKK30KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWF0Y2hpbmdPcGVuYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ09wZW5hYmxlLmphdmEKaW5kZXggNWQ1NDVkMC4uYzU5NjUwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ09wZW5hYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ09wZW5hYmxlLmphdmEKQEAgLTEsNTcgKzEsNDEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5TWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5hcnlUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkFib3J0Q29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuT3BlbmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Xb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwogIAorLy8gVE9ETzogKGplcm9tZSkgUmVtb3ZlIHdoZW4gc3dpdGNoaW5nIHRvIE1hdGNoTG9jYXRvcjIKIHB1YmxpYyBjbGFzcyBNYXRjaGluZ09wZW5hYmxlIHsKKwlzdGF0aWMgZmluYWwgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gQUxSRUFEWV9SRVNPTFZFRCA9IG5ldyBDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbihudWxsLCBudWxsLCAwKTsKIAlwcml2YXRlIE1hdGNoTG9jYXRvciBsb2NhdG9yOwogCXB1YmxpYyBJUmVzb3VyY2UgcmVzb3VyY2U7CiAJcHVibGljIE9wZW5hYmxlIG9wZW5hYmxlOwogCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gcGFyc2VkVW5pdDsKKwlwcml2YXRlIGNoYXJbXSBzb3VyY2U7CiAJcHJpdmF0ZSBNYXRjaFNldCBtYXRjaFNldDsKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXNvbHZlID0gdHJ1ZTsKLXB1YmxpYyBNYXRjaGluZ09wZW5hYmxlKE1hdGNoTG9jYXRvciBsb2NhdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UsIE9wZW5hYmxlIG9wZW5hYmxlKSB7Ci0JdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JdGhpcy5vcGVuYWJsZSA9IG9wZW5hYmxlOwotfQorCiBwdWJsaWMgTWF0Y2hpbmdPcGVuYWJsZSgKIAkJTWF0Y2hMb2NhdG9yIGxvY2F0b3IsIAogCQlJUmVzb3VyY2UgcmVzb3VyY2UsIApAQCAtNjQsMzAgKzQ4LDQ0IEBACiAJdGhpcy5wYXJzZWRVbml0ID0gcGFyc2VkVW5pdDsKIAl0aGlzLm1hdGNoU2V0ID0gbWF0Y2hTZXQ7CiB9CitwdWJsaWMgc3RhdGljIElUeXBlIGdldFRvcExldmVsVHlwZShJVHlwZSBiaW5hcnlUeXBlKSB7CisJCisJLy8gZW5zdXJlIGl0IGlzIG5vdCBhIGxvY2FsIG9yIGFub3ltb3VzIHR5cGUgKHNlZSBidWcgMjg3NTIgIEogU2VhcmNoIHJlc3BvcnRzIG5vbi1leGlzdGVudCBKYXZhIGVsZW1lbnQpCisJU3RyaW5nIHR5cGVOYW1lID0gYmluYXJ5VHlwZS5nZXRFbGVtZW50TmFtZSgpOworCWludCBsYXN0RG9sbGFyID0gdHlwZU5hbWUubGFzdEluZGV4T2YoJyQnKTsKKwlpbnQgbGVuZ3RoID0gdHlwZU5hbWUubGVuZ3RoKCk7CisJaWYgKGxhc3REb2xsYXIgIT0gLTEgJiYgbGFzdERvbGxhciA8IGxlbmd0aC0xKSB7CisJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdCh0eXBlTmFtZS5jaGFyQXQobGFzdERvbGxhcisxKSkpIHsKKwkJCS8vIGxvY2FsIG9yIGFub255bW91cyB0eXBlCisJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBsYXN0RG9sbGFyKTsKKwkJCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gYmluYXJ5VHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDbGFzc0ZpbGUodHlwZU5hbWUrIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCisJCQl0cnkgeworCQkJCWJpbmFyeVR5cGUgPSBjbGFzc0ZpbGUuZ2V0VHlwZSgpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUgYXMgaW1wbGVtZW50YXRpb24gb2YgZ2V0VHlwZSgpIGNhbm5vdCB0aHJvdyB0aGlzIGV4Y2VwdGlvbgorCQkJfQorCQl9CisJfQorCQorCS8vIGVuc3VyZSBpdCBpcyBhIHRvcCBsZXZlbCB0eXBlCisJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGJpbmFyeVR5cGUuZ2V0RGVjbGFyaW5nVHlwZSgpOworCXdoaWxlIChkZWNsYXJpbmdUeXBlICE9IG51bGwpIHsKKwkJYmluYXJ5VHlwZSA9IGRlY2xhcmluZ1R5cGU7CisJCWRlY2xhcmluZ1R5cGUgPSBiaW5hcnlUeXBlLmdldERlY2xhcmluZ1R5cGUoKTsKKwl9CisJcmV0dXJuIGJpbmFyeVR5cGU7Cit9CiBwdWJsaWMgdm9pZCBidWlsZFR5cGVCaW5kaW5ncygpIHsKIAkKLQkvLyBpZiBhIHBhcnNlZCB1bml0IGV4aXRzLCBpdHMgYmluZGluZ3MgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQKLQlpZiAodGhpcy5wYXJzZWRVbml0ICE9IG51bGwpIHJldHVybjsKLQkKLQljaGFyW10gc291cmNlID0gdGhpcy5nZXRTb3VyY2UoKTsKLQlpZiAoc291cmNlID09IG51bGwpIHJldHVybjsKLQl0aGlzLmJ1aWxkVHlwZUJpbmRpbmdzKHNvdXJjZSk7Ci0JCQkKLQlpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSkgewotCQkvLyB0cnkgdG8gdXNlIHRoZSBtYWluIHR5cGUncyBjbGFzcyBmaWxlIGFzIHRoZSBvcGVuYWJsZQotCQlUeXBlRGVjbGFyYXRpb25bXSB0eXBlcyA9IHRoaXMucGFyc2VkVW5pdC50eXBlczsKLQkJaWYgKHR5cGVzICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc0ZpbGVOYW1lID0gb3BlbmFibGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB0eXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0eXBlc1tpXTsKLQkJCQlTdHJpbmcgc2ltcGxlVHlwZU5hbWUgPSBuZXcgU3RyaW5nKHR5cGVEZWNsYXJhdGlvbi5uYW1lKTsKLQkJCQlpZiAoY2xhc3NGaWxlTmFtZS5zdGFydHNXaXRoKHNpbXBsZVR5cGVOYW1lKSkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50IHBhcmVudCA9IChJUGFja2FnZUZyYWdtZW50KW9wZW5hYmxlLmdldFBhcmVudCgpOwotCQkJCQl0aGlzLm9wZW5hYmxlID0gKE9wZW5hYmxlKXBhcmVudC5nZXRDbGFzc0ZpbGUoc2ltcGxlVHlwZU5hbWUgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSAKLQkJfQorCWlmICh0aGlzLnBhcnNlZFVuaXQgPT0gbnVsbCkgeworCQljaGFyW10gc291cmNlID0gdGhpcy5nZXRTb3VyY2UoKTsKKwkJaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm47CisJCXRoaXMuYnVpbGRUeXBlQmluZGluZ3Moc291cmNlKTsKKwl9IGVsc2UgeworCQkvLyBpZiBhIHBhcnNlZCB1bml0J3Mgc2NvcGUgaXMgc2V0LCBpdHMgYmluZGluZ3MgaGF2ZSBhbHJlYWR5IGJlZW4gYnVpbHQKKwkJaWYgKHRoaXMucGFyc2VkVW5pdC5zY29wZSAhPSBudWxsKSByZXR1cm47CisJCQorCQl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuYnVpbGRUeXBlQmluZGluZ3ModGhpcy5wYXJzZWRVbml0KTsKIAl9CiB9CiBwcml2YXRlIHZvaWQgYnVpbGRUeXBlQmluZGluZ3MoZmluYWwgY2hhcltdIHNvdXJjZSkgewpAQCAtMTA4LDE0ICsxMDYsMjAgQEAKIAkJCQogCQkJLy8gaW5pdGlhbCB0eXBlIGJpbmRpbmcgY3JlYXRpb24KIAkJCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh0aGlzLnBhcnNlZFVuaXQpOwotCQl9IGVsc2UgewotCQkJLy8gZnJlZSBtZW1vcnkKLQkJCXRoaXMubG9jYXRvci5wYXJzZWRVbml0cy5wdXQocXVhbGlmaWVkTmFtZSwgbnVsbCk7Ci0JCX0KKwkJfSAKKworCQkvLyBmcmVlIG1lbW9yeSBhbmQgcmVtZW1iZXIgdGhhdCB0aGlzIHVuaXQgYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkIAorCQkvLyAoY2FzZSBvZiAyIG1hdGNoaW5nIG9wZW5hYmxlcyBvbiBhIGJpbmFyeSB0eXBlIGFuZCBpdHMgbWVtYmVyIHR5cGUpIAorCQl0aGlzLmxvY2F0b3IucGFyc2VkVW5pdHMucHV0KHF1YWxpZmllZE5hbWUsIEFMUkVBRFlfUkVTT0xWRUQpOworCiAJfSBmaW5hbGx5IHsKIAkJdGhpcy5sb2NhdG9yLnBhcnNlci5tYXRjaFNldCA9IG51bGw7CiAJfQogfQorcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwlpZiAoIShvYmogaW5zdGFuY2VvZiBNYXRjaGluZ09wZW5hYmxlKSkgcmV0dXJuIGZhbHNlOworCXJldHVybiB0aGlzLm9wZW5hYmxlLmVxdWFscygoKE1hdGNoaW5nT3BlbmFibGUpb2JqKS5vcGVuYWJsZSk7Cit9CiBwcml2YXRlIGNoYXJbXSBnZXRRdWFsaWZpZWROYW1lKCkgewogCWlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CiAJCS8vIGdldCBmaWxlIG5hbWUKQEAgLTEyNywyOSArMTMxLDMyIEBACiAJfSBlbHNlIHsKIAkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpdGhpcy5vcGVuYWJsZTsKIAkJdHJ5IHsKLQkJCXJldHVybiBjbGFzc0ZpbGUuZ2V0VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCk7CisJCQlJVHlwZSB0eXBlID0gZ2V0VG9wTGV2ZWxUeXBlKGNsYXNzRmlsZS5nZXRUeXBlKCkpOworCQkJcmV0dXJuIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlCiAJCX0KIAl9CiB9CiBwdWJsaWMgY2hhcltdIGdldFNvdXJjZSgpIHsKKwlpZiAodGhpcy5zb3VyY2UgIT0gbnVsbCkgcmV0dXJuIHNvdXJjZTsKIAl0cnkgewogCQlpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIFdvcmtpbmdDb3B5KSB7CiAJCQlJQnVmZmVyIGJ1ZmZlciA9IHRoaXMub3BlbmFibGUuZ2V0QnVmZmVyKCk7CiAJCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCQkJcmV0dXJuIGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7CisJCQl0aGlzLnNvdXJjZSA9IGJ1ZmZlci5nZXRDaGFyYWN0ZXJzKCk7CiAJCX0gZWxzZSBpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotCQkJcmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KChJRmlsZSl0aGlzLnJlc291cmNlKTsKKwkJCXRoaXMuc291cmNlID0gVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkoKElGaWxlKXRoaXMucmVzb3VyY2UpOwogCQl9IGVsc2UgaWYgKHRoaXMub3BlbmFibGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc0ZpbGUpIHsKIAkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXRoaXMub3BlbmFibGU7Ci0JCQlyZXR1cm4gdGhpcy5sb2NhdG9yLmZpbmRTb3VyY2UoY2xhc3NGaWxlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOworCQkJdGhpcy5zb3VyY2UgPSB0aGlzLmxvY2F0b3IuZmluZFNvdXJjZShjbGFzc0ZpbGUpOwogCQl9CiAJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIG51bGw7CiAJfQorCXJldHVybiB0aGlzLnNvdXJjZTsKK30KK3B1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIHRoaXMub3BlbmFibGUuaGFzaENvZGUoKTsKIH0KIHB1YmxpYyBib29sZWFuIGhhc0FscmVhZHlEZWZpbmVkVHlwZSgpIHsKIAlpZiAodGhpcy5wYXJzZWRVbml0ID09IG51bGwpIHJldHVybiBmYWxzZTsKQEAgLTE5NCwxOCArMjAxLDE1IEBACiAJCS8vIHJlc29sdmUKIAkJQmluYXJ5VHlwZUJpbmRpbmcgYmluZGluZyA9IG51bGw7CiAJCXRyeSB7Ci0JCQliaW5kaW5nID0gdGhpcy5sb2NhdG9yLmxvb2t1cEVudmlyb25tZW50LmNhY2hlQmluYXJ5VHlwZShpbmZvKTsKLQkJCWlmIChiaW5kaW5nID09IG51bGwpIHsgLy8gaXQgd2FzIGFscmVhZHkgY2FjaGVkIGFzIGEgcmVzdWx0IG9mIGEgcHJldmlvdXMgcXVlcnkKLQkJCQljaGFyW11bXSBjb21wb3VuZE5hbWUgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy4nLCBiaW5hcnlUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnRvQ2hhckFycmF5KCkpOwotCQkJCVJlZmVyZW5jZUJpbmRpbmcgcmVmZXJlbmNlQmluZGluZyA9IHRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5nZXRDYWNoZWRUeXBlKGNvbXBvdW5kTmFtZSk7Ci0JCQkJaWYgKHJlZmVyZW5jZUJpbmRpbmcgIT0gbnVsbCAmJiAocmVmZXJlbmNlQmluZGluZyBpbnN0YW5jZW9mIEJpbmFyeVR5cGVCaW5kaW5nKSkgewotCQkJCQkvLyBpZiB0aGUgYmluZGluZyBjb3VsZCBiZSBmb3VuZCBhbmQgaWYgaXQgY29tZXMgZnJvbSBhIHNvdXJjZSB0eXBlLAotCQkJCQliaW5kaW5nID0gKEJpbmFyeVR5cGVCaW5kaW5nKXJlZmVyZW5jZUJpbmRpbmc7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBtZXRob2RzCisJCQliaW5kaW5nID0gdGhpcy5sb2NhdG9yLmNhY2hlQmluYXJ5VHlwZShiaW5hcnlUeXBlKTsKIAkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkvLyBmaWx0ZXIgb3V0IGVsZW1lbnQgbm90IGluIGhpZXJhcmNoeSBzY29wZQorCQkJCWlmICh0aGlzLmxvY2F0b3IuaGllcmFyY2h5UmVzb2x2ZXIgIT0gbnVsbCAKKwkJCQkJCSYmICF0aGlzLmxvY2F0b3IuaGllcmFyY2h5UmVzb2x2ZXIuc3ViT3JTdXBlck9mRm9jdXMoYmluZGluZykpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkKKwkJCQkvLyBjaGVjayBtZXRob2RzCiAJCQkJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSBiaW5kaW5nLm1ldGhvZHMoKTsKIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKIAkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOwpAQCAtMjI4LDEwICsyMzIsOCBAQAogCQkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKIAkJCQkJfQogCQkJCX0KLQkJCX0KIAkJCi0JCQkvLyBjaGVjayBmaWVsZHMKLQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkvLyBjaGVjayBmaWVsZHMKIAkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBiaW5kaW5nLmZpZWxkcygpOwogCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCUZpZWxkQmluZGluZyBmaWVsZCA9IGZpZWxkc1tpXTsKQEAgLTMwMiw3ICszMDQsNyBAQAogCQkJdGhpcy5wYXJzZWRVbml0ID0gdGhpcy5sb2NhdG9yLmRpZXRQYXJzZShzb3VyY2UpOwogCQl9CiAJfQotCWlmICh0aGlzLnBhcnNlZFVuaXQgIT0gbnVsbCkgeworCWlmICh0aGlzLnBhcnNlZFVuaXQgIT0gbnVsbCAmJiB0aGlzLnBhcnNlZFVuaXQgIT0gQUxSRUFEWV9SRVNPTFZFRCkgewogCQl0cnkgewogCQkJdGhpcy5sb2NhdG9yLnBhcnNlci5tYXRjaFNldCA9IHRoaXMubWF0Y2hTZXQ7CiAJCQl0aGlzLmxvY2F0b3IucGFyc2VyLnNjYW5uZXIuc2V0U291cmNlKHNvdXJjZSk7CkBAIC0zMTIsMzggKzMxNCwzNiBAQAogCQkJdGhpcy5tYXRjaFNldC5yZXBvcnRNYXRjaGluZyhwYXJzZWRVbml0KTsKIAkJCQogCQkJLy8gcmVzb2x2ZSBpZiBuZWVkZWQKLQkJCWlmICh0aGlzLm1hdGNoU2V0Lm5lZWRzUmVzb2x2ZSgpKSB7Ci0JCQkJaWYgKHRoaXMucGFyc2VkVW5pdC50eXBlcyAhPSBudWxsKSB7Ci0JCQkJCWlmICh0aGlzLnNob3VsZFJlc29sdmUpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHRoaXMucGFyc2VkVW5pdC5zY29wZSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIGJpbmRpbmdzIHdlcmUgbm90IGNyZWF0ZWQgKGNhc2Ugb2YgYSBGaWVsZFJlZmVyZW5jZVBhdHRlcm4gdGhhdCBkb2Vzbid0IG5lZWQgcmVzb2x2ZSwgCi0JCQkJCQkJCS8vIGJ1dCB3ZSBuZWVkIHRvIHJlc29sdmUgYmVjYXVzZSBvZiBhIFNpbmdsZU5hbWVSZWZlcmVuY2UgYmVpbmcgYSBwb3RlbnRpYWwgbWF0Y2gpCi0JCQkJCQkJCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh0aGlzLnBhcnNlZFVuaXQpOwotCQkJCQkJCQl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuY29tcGxldGVUeXBlQmluZGluZ3ModGhpcy5wYXJzZWRVbml0LCB0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHRoaXMucGFyc2VkVW5pdC5zY29wZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMucGFyc2VkVW5pdC5zY29wZS5mYXVsdEluVHlwZXMoKTsKLQkJCQkJCQkJdGhpcy5wYXJzZWRVbml0LnJlc29sdmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gcmVwb3J0IG1hdGNoZXMgdGhhdCBuZWVkZWQgcmVzb2x2ZQotCQkJCQkJCXRoaXMubWF0Y2hTZXQuY3VIYXNCZWVuUmVzb2x2ZWQgPSB0cnVlOwotCQkJCQkJCXRoaXMubWF0Y2hTZXQucmVwb3J0TWF0Y2hpbmcodGhpcy5wYXJzZWRVbml0KTsKLQkJCQkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgewotCQkJCQkJCS8vIGNvdWxkIG5vdCByZXNvbHZlOiByZXBvcnQgaW5uYWN1cmF0ZSBtYXRjaGVzCi0JCQkJCQkJdGhpcy5tYXRjaFNldC5jdUhhc0JlZW5SZXNvbHZlZCA9IHRydWU7Ci0JCQkJCQkJdGhpcy5tYXRjaFNldC5yZXBvcnRNYXRjaGluZyh0aGlzLnBhcnNlZFVuaXQpOwotCQkJCQkJCWlmICghKGUgaW5zdGFuY2VvZiBBYm9ydENvbXBpbGF0aW9uVW5pdCkpIHsKLQkJCQkJCQkJLy8gcHJvYmxlbSB3aXRoIGNsYXNzIHBhdGgKLQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQl9CisJCQlpZiAodGhpcy5tYXRjaFNldC5uZWVkc1Jlc29sdmUoKSAmJiB0aGlzLnBhcnNlZFVuaXQudHlwZXMgIT0gbnVsbCkgeworCQkJCWlmICghdGhpcy5sb2NhdG9yLmNvbXBpbGF0aW9uQWJvcnRlZCkgeworCQkJCQl0cnkgeworCQkJCQkJaWYgKHRoaXMucGFyc2VkVW5pdC5zY29wZSA9PSBudWxsKSB7CisJCQkJCQkJLy8gYmluZGluZ3Mgd2VyZSBub3QgY3JlYXRlZCAoY2FzZSBvZiBhIEZpZWxkUmVmZXJlbmNlUGF0dGVybiB0aGF0IGRvZXNuJ3QgbmVlZCByZXNvbHZlLCAKKwkJCQkJCQkvLyBidXQgd2UgbmVlZCB0byByZXNvbHZlIGJlY2F1c2Ugb2YgYSBTaW5nbGVOYW1lUmVmZXJlbmNlIGJlaW5nIGEgcG90ZW50aWFsIG1hdGNoKQorCQkJCQkJCU1hdGNoaW5nT3BlbmFibGVbXSBvcGVuYWJsZXMgPSB0aGlzLmxvY2F0b3IubWF0Y2hpbmdPcGVuYWJsZXMuZ2V0TWF0Y2hpbmdPcGVuYWJsZXModGhpcy5vcGVuYWJsZS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOworCQkJCQkJCXRoaXMubG9jYXRvci5jcmVhdGVBbmRSZXNvbHZlQmluZGluZ3Mob3BlbmFibGVzKTsKIAkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHByb2JsZW0gb2N1cmVkIHdoaWxlIGNvbXBsZXRpbmcgdGhlIGJpbmRpbmdzIGZvciB0aGUgYmFzZSBjbGFzc2VzCi0JCQkJCQkvLyAtPiByZXBvcnQgaW5uYWN1cmF0ZSBtYXRjaGVzCisJCQkJCQlpZiAodGhpcy5wYXJzZWRVbml0LnNjb3BlICE9IG51bGwpIHsKKwkJCQkJCQl0aGlzLnBhcnNlZFVuaXQuc2NvcGUuZmF1bHRJblR5cGVzKCk7CisJCQkJCQkJdGhpcy5wYXJzZWRVbml0LnJlc29sdmUoKTsKKwkJCQkJCX0KKwkJCQkJCS8vIHJlcG9ydCBtYXRjaGVzIHRoYXQgbmVlZGVkIHJlc29sdmUKIAkJCQkJCXRoaXMubWF0Y2hTZXQuY3VIYXNCZWVuUmVzb2x2ZWQgPSB0cnVlOwogCQkJCQkJdGhpcy5tYXRjaFNldC5yZXBvcnRNYXRjaGluZyh0aGlzLnBhcnNlZFVuaXQpOworCQkJCQl9IGNhdGNoIChBYm9ydENvbXBpbGF0aW9uIGUpIHsKKwkJCQkJCS8vIGNvdWxkIG5vdCByZXNvbHZlOiByZXBvcnQgaW5uYWN1cmF0ZSBtYXRjaGVzCisJCQkJCQl0aGlzLm1hdGNoU2V0LmN1SGFzQmVlblJlc29sdmVkID0gdHJ1ZTsKKwkJCQkJCXRoaXMubWF0Y2hTZXQucmVwb3J0TWF0Y2hpbmcodGhpcy5wYXJzZWRVbml0KTsKKwkJCQkJCWlmICghKGUgaW5zdGFuY2VvZiBBYm9ydENvbXBpbGF0aW9uVW5pdCkpIHsKKwkJCQkJCQkvLyBwcm9ibGVtIHdpdGggY2xhc3MgcGF0aAorCQkJCQkJCXRocm93IGU7CisJCQkJCQl9CiAJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBwcm9ibGVtIG9jdXJlZCB3aGlsZSBjb21wbGV0aW5nIHRoZSBiaW5kaW5ncyBmb3IgdGhlIGJhc2UgY2xhc3NlcworCQkJCQkvLyAtPiByZXBvcnQgaW5uYWN1cmF0ZSBtYXRjaGVzCisJCQkJCXRoaXMubWF0Y2hTZXQuY3VIYXNCZWVuUmVzb2x2ZWQgPSB0cnVlOworCQkJCQl0aGlzLm1hdGNoU2V0LnJlcG9ydE1hdGNoaW5nKHRoaXMucGFyc2VkVW5pdCk7CiAJCQkJfQogCQkJfQogCQl9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NYXRjaGluZ09wZW5hYmxlU2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nT3BlbmFibGVTZXQuamF2YQppbmRleCBhYTMwZWE4Li5kYjJlOWJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nT3BlbmFibGVTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01hdGNoaW5nT3BlbmFibGVTZXQuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwpAQCAtMTcsNiArMTcsNyBAQAogLyoqCiAgKiBBIHNldCBvZiBNYXRjaGluZ09QZW5hYmxlcyB0aGF0IGlzIHNvcnRlZCBieSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzLgogICovCisvLyBUT0RPOiAoamVyb21lKSBSZW1vdmUgd2hlbiBzd2l0Y2hpbmcgdG8gTWF0Y2hMb2NhdG9yMgogcHVibGljIGNsYXNzIE1hdGNoaW5nT3BlbmFibGVTZXQgewogCXByaXZhdGUgSGFzaHRhYmxlT2ZPYmplY3Qgcm9vdHNUb09wZW5hYmxlID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KDUpOwogCXByaXZhdGUgaW50IGVsZW1lbnRDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2REZWNsYXJhdGlvblBhdHRlcm4uamF2YQppbmRleCBkNjk2MTIzLi5lNGM1MTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsMTggKzEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuTWV0aG9kRGVjbGFyYXRpb247CkBAIC0yMiw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuTWV0aG9kQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlJlZmVyZW5jZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhlZEZpbGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCmluZGV4IDIzNTQ3YTQuLjdlYzE3MTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTWV0aG9kUGF0dGVybi5qYXZhCkBAIC0xLDE2ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4gewogCkBAIC03MCw2ICs3MCw4IEBACiAgKi8KIHByb3RlY3RlZCBib29sZWFuIG5lZWRzUmVzb2x2ZSgpIHsKIAorCS8vIFRPRE86IChqZXJvbWUpIHNob3VsZCBuZWVkIHJlc29sdmUgb25seSBpZiBkZWNsYXJpbmdTaW1wbGVOYW1lLCBkZWNsYXJpbmdRdWFsaWZpY2F0aW9uLCByZXR1cm5RdWFsaWZpY2F0aW9uIG9yIHBhcmFtZXRlclF1YWxpZmljYXRpb25zW2ldIGlzIG5vdCBudWxsCisKIAkvLyBkZWNsYXJpbmcgdHlwZQogCWlmIChkZWNsYXJpbmdTaW1wbGVOYW1lICE9IG51bGwgfHwgZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NZXRob2RSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCA4NTc0ZmE4Li5hOTI1Y2M2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL01ldGhvZFJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lk1lc3NhZ2VTZW5kOwpAQCAtMjQsNyArMjUsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOwpAQCAtMTIwLDYgKzEyMCwxMCBAQAogCX0KIH0KIAorcHVibGljIGJvb2xlYW4gaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoqCiAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvZGUgZ2VuIHdpbGwgdXNlIGFuIGludm9rZSB2aXJ0dWFsIGZvciAKICAqIHRoaXMgbWVzc2FnZSBzZW5kIG9yIG5vdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlwbGVTZWFyY2hQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL011bHRpcGxlU2VhcmNoUGF0dGVybi5qYXZhCmluZGV4IDNjMjk3MzYuLjNlYjQzYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvTXVsdGlwbGVTZWFyY2hQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9NdWx0aXBsZVNlYXJjaFBhdHRlcm4uamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yTmFtZUNvbWJpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yTmFtZUNvbWJpbmVyLmphdmEKaW5kZXggZDk0ZmNkNS4uMjdhMTE3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9Pck5hbWVDb21iaW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JOYW1lQ29tYmluZXIuamF2YQpAQCAtMSwxNiArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSUluZGV4U2VhcmNoUmVxdWVzdG9yOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0aENvbWJpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0aENvbWJpbmVyLmphdmEKaW5kZXggMDlmMThkOS4uYWEwYTgxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdGhDb21iaW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXRoQ29tYmluZXIuamF2YQpAQCAtMSwxMyArMSwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvT3JQYXR0ZXJuLmphdmEKaW5kZXggYTI0YzBjNi4uODRjNmNhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9PclBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL09yUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEyMyw2ICsxMjMsMTMgQEAKIH0KIAogLyoqCisgKiBzZWUgU2VhcmNoUGF0dGVybi5pc1BvbHltb3JwaGljU2VhcmNoCisgKi8KK3B1YmxpYyBib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2goKSB7CisJcmV0dXJuIHRoaXMubGVmdFBhdHRlcm4uaXNQb2x5bW9ycGhpY1NlYXJjaCgpIHx8IHRoaXMucmlnaHRQYXR0ZXJuLmlzUG9seW1vcnBoaWNTZWFyY2goKTsKK30KKworLyoqCiAgKiBAc2VlIFNlYXJjaFBhdHRlcm4jbWF0Y2hMZXZlbChBc3ROb2RlLCBib29sZWFuKQogICovCiBwdWJsaWMgaW50IG1hdGNoTGV2ZWwoQXN0Tm9kZSBub2RlLCBib29sZWFuIHJlc29sdmUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKaW5kZXggZmU3MTIzOS4uMDAyYzI1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9QYWNrYWdlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IDEzNWFhMDQuLjIwZWFkNGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUGFja2FnZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTEsMTkgKzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW1wb3J0UmVmZXJlbmNlOwpAQCAtMjgsOCArMjksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOwpAQCAtNDYsOSArNDUsMTIgQEAKIAkKIHB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlUGF0dGVybihjaGFyW10gcGtnTmFtZSwgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKIAlzdXBlcihtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSk7CisJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKKwkJcGtnTmFtZSA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGtnTmFtZSk7CisJfQogCXRoaXMucGtnTmFtZSA9IHBrZ05hbWU7CiAJY2hhcltdW10gc3BsaXR0ZWROYW1lID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgcGtnTmFtZSk7Ci0JdGhpcy5zZWdtZW50cyA9IHNwbGl0dGVkTmFtZSA9PSBUeXBlQ29uc3RhbnRzLk5vQ2hhckNoYXIgPyBuZXcgY2hhcltdW117IHBrZ05hbWUgfSA6IHNwbGl0dGVkTmFtZTsKKwl0aGlzLnNlZ21lbnRzID0gc3BsaXR0ZWROYW1lID09IENoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSID8gbmV3IGNoYXJbXVtdeyBwa2dOYW1lIH0gOiBzcGxpdHRlZE5hbWU7CiAJdGhpcy5uZWVkc1Jlc29sdmUgPSBwa2dOYW1lICE9IG51bGw7CiB9CiAvKioKQEAgLTE4Miw3ICsxODQsNyBAQAogCQl9CiAJfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKSB7CiAJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcVR5cGVSZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSlyZWZlcmVuY2U7Ci0JCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcVR5cGVSZWYuYmluZGluZzsKKwkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBxVHlwZVJlZi5yZXNvbHZlZFR5cGU7CiAJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgewogCQkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7CiAJCX0KQEAgLTE5Niw3ICsxOTgsNyBAQAogCQkJdG9rZW5zID0gcVR5cGVSZWYudG9rZW5zOwogCQl9CiAJfQotCWlmICh0b2tlbnMgPT0gbnVsbCkgdG9rZW5zID0gTk9fQ0hBUl9DSEFSOworCWlmICh0b2tlbnMgPT0gbnVsbCkgdG9rZW5zID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZShyZWZlcmVuY2Uuc291cmNlU3RhcnQsIHJlZmVyZW5jZS5zb3VyY2VFbmQsIHRva2VucywgZWxlbWVudCwgYWNjdXJhY3kpOwogfQogLyoqCkBAIC0zODksNyArMzkxLDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoTGV2ZWwodHlwZVJlZi5iaW5kaW5nKTsKKwkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbCh0eXBlUmVmLnJlc29sdmVkVHlwZSk7CiAJfQogfQogLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BvdGVudGlhbE1hdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BvdGVudGlhbE1hdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4NDI3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUG90ZW50aWFsTWF0Y2guamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5hcnlUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkZpZWxkQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLk1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uQWJvcnRDb21waWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOworCitwdWJsaWMgY2xhc3MgUG90ZW50aWFsTWF0Y2ggaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19TT1VSQ0VfRklMRV9OQU1FID0gIk5PIFNPVVJDRSBGSUxFIE5BTUUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIE1hdGNoTG9jYXRvcjIgbG9jYXRvcjsKKwlwdWJsaWMgSVJlc291cmNlIHJlc291cmNlOworCXB1YmxpYyBPcGVuYWJsZSBvcGVuYWJsZTsKKwlwdWJsaWMgY2hhcltdW10gY29tcG91bmROYW1lOworCU1hdGNoaW5nTm9kZVNldCBtYXRjaGluZ05vZGVTZXQ7CisJcHJpdmF0ZSBTdHJpbmcgc291cmNlRmlsZU5hbWU7CisKKwlwdWJsaWMgUG90ZW50aWFsTWF0Y2goCisJCQlNYXRjaExvY2F0b3IyIGxvY2F0b3IsIAorCQkJSVJlc291cmNlIHJlc291cmNlLCAKKwkJCU9wZW5hYmxlIG9wZW5hYmxlKSB7CisJCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy5vcGVuYWJsZSA9IG9wZW5hYmxlOworCQl0aGlzLm1hdGNoaW5nTm9kZVNldCA9IG5ldyBNYXRjaGluZ05vZGVTZXQobG9jYXRvcik7CisJCWNoYXJbXSBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSgpOworCQlpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKSB7CisJCQl0aGlzLmNvbXBvdW5kTmFtZSA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHF1YWxpZmllZE5hbWUpOworCQl9CisJfQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzLmNvbXBvdW5kTmFtZSA9PSBudWxsKSByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIFBvdGVudGlhbE1hdGNoKSkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5lcXVhbHModGhpcy5jb21wb3VuZE5hbWUsICgoUG90ZW50aWFsTWF0Y2gpb2JqKS5jb21wb3VuZE5hbWUpOworCX0KKworCS8qCisJICogRmluZHMgdGhlIHNvdXJjZSBvZiB0aGlzIGNsYXNzIGZpbGUuCisJICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC4KKwkgKi8KKwlwcml2YXRlIGNoYXJbXSBmaW5kQ2xhc3NGaWxlU291cmNlKCkgeworCQlTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBnZXRTb3VyY2VGaWxlTmFtZSgpOworCQlpZiAoc291cmNlRmlsZU5hbWUgPT0gTk9fU09VUkNFX0ZJTEVfTkFNRSkgcmV0dXJuIG51bGw7CisJCWNoYXJbXSBzb3VyY2UgPSBudWxsOyAKKwkJdHJ5IHsKKwkJCVNvdXJjZU1hcHBlciBzb3VyY2VNYXBwZXIgPSB0aGlzLm9wZW5hYmxlLmdldFNvdXJjZU1hcHBlcigpOworCQkJaWYgKHNvdXJjZU1hcHBlciAhPSBudWxsKSB7CisJCQkJSVR5cGUgdHlwZSA9ICgoQ2xhc3NGaWxlKXRoaXMub3BlbmFibGUpLmdldFR5cGUoKTsKKwkJCQlzb3VyY2UgPSBzb3VyY2VNYXBwZXIuZmluZFNvdXJjZSh0eXBlLCBzb3VyY2VGaWxlTmFtZSk7CisJCQl9CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIHNvdXJjZTsKKwl9CisJLyoKKwkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgZmlsZSBuYW1lIG9mIHRoZSBjbGFzcyBmaWxlLgorCSAqIFJldHVybnMgTk9fU09VUkNFX0ZJTEVfTkFNRSBpZiBub3QgZm91bmQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSB7CisJCWlmICh0aGlzLnNvdXJjZUZpbGVOYW1lICE9IG51bGwpIHJldHVybiB0aGlzLnNvdXJjZUZpbGVOYW1lOworCQl0aGlzLnNvdXJjZUZpbGVOYW1lID0gTk9fU09VUkNFX0ZJTEVfTkFNRTsgCisJCXRyeSB7CisJCQlTb3VyY2VNYXBwZXIgc291cmNlTWFwcGVyID0gdGhpcy5vcGVuYWJsZS5nZXRTb3VyY2VNYXBwZXIoKTsKKwkJCWlmIChzb3VyY2VNYXBwZXIgIT0gbnVsbCkgeworCQkJCUlUeXBlIHR5cGUgPSAoKENsYXNzRmlsZSl0aGlzLm9wZW5hYmxlKS5nZXRUeXBlKCk7CisJCQkJQ2xhc3NGaWxlUmVhZGVyIHJlYWRlciA9IHRoaXMubG9jYXRvci5jbGFzc0ZpbGVSZWFkZXIodHlwZSk7CisJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7CisJCQkJCXRoaXMuc291cmNlRmlsZU5hbWUgPSBzb3VyY2VNYXBwZXIuZmluZFNvdXJjZUZpbGVOYW1lKHR5cGUsIHJlYWRlcik7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiB0aGlzLnNvdXJjZUZpbGVOYW1lOworCX0JCisJcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKwkJY2hhcltdIHNvdXJjZSA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIFdvcmtpbmdDb3B5KSB7CisJCQkJSUJ1ZmZlciBidWZmZXIgPSB0aGlzLm9wZW5hYmxlLmdldEJ1ZmZlcigpOworCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQkJc291cmNlID0gYnVmZmVyLmdldENoYXJhY3RlcnMoKTsKKwkJCX0gZWxzZSBpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgeworCQkJCXNvdXJjZSA9IFV0aWwuZ2V0UmVzb3VyY2VDb250ZW50c0FzQ2hhckFycmF5KChJRmlsZSl0aGlzLnJlc291cmNlKTsKKwkJCX0gZWxzZSBpZiAodGhpcy5vcGVuYWJsZSBpbnN0YW5jZW9mIENsYXNzRmlsZSkgeworCQkJCXNvdXJjZSA9IGZpbmRDbGFzc0ZpbGVTb3VyY2UoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlpZiAoc291cmNlID09IG51bGwpIHJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CisJCXJldHVybiBzb3VyY2U7CisJfQorCS8qCisJICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1haW4gdHlwZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAorCSAqIG9yIHRoZSBtYWluIHR5cGUgb2YgdGhlIC5qYXZhIGZpbGUgdGhhdCBkZWZpbmVkIHRoZSBjbGFzcyBmaWxlLgorCSAqLworCXByaXZhdGUgY2hhcltdIGdldFF1YWxpZmllZE5hbWUoKSB7CisJCWlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisJCQkvLyBnZXQgZmlsZSBuYW1lCisJCQlTdHJpbmcgZmlsZU5hbWUgPSB0aGlzLnJlc291cmNlLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKKwkJCS8vIGdldCBtYWluIHR5cGUgbmFtZQorCQkJY2hhcltdIG1haW5UeXBlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKS01KS50b0NoYXJBcnJheSgpOyAKKwkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpdGhpcy5vcGVuYWJsZTsKKwkJCXJldHVybiBjdS5nZXRUeXBlKG5ldyBTdHJpbmcobWFpblR5cGVOYW1lKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkudG9DaGFyQXJyYXkoKTsKKwkJfSBlbHNlIGlmICh0aGlzLm9wZW5hYmxlIGluc3RhbmNlb2YgQ2xhc3NGaWxlKSB7CisJCQlTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBnZXRTb3VyY2VGaWxlTmFtZSgpOworCQkJaWYgKHNvdXJjZUZpbGVOYW1lID09IE5PX1NPVVJDRV9GSUxFX05BTUUpIHsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gKChDbGFzc0ZpbGUpdGhpcy5vcGVuYWJsZSkuZ2V0VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpLnRvQ2hhckFycmF5KCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBzb3VyY2VGaWxlTmFtZS5zdWJzdHJpbmcoMCwgc291cmNlRmlsZU5hbWUubGVuZ3RoKCktNSk7IC8vIGxlbmd0aC0iLmphdmEiLmxlbmd0aCgpCisJCQlTdHJpbmcgcGtnTmFtZSA9IHRoaXMub3BlbmFibGUuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCWlmIChwa2dOYW1lLmxlbmd0aCgpID09IDApIHsKKwkJCQlyZXR1cm4gc2ltcGxlTmFtZS50b0NoYXJBcnJheSgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gKHBrZ05hbWUgKyAnLicgKyBzaW1wbGVOYW1lKS50b0NoYXJBcnJheSgpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJaWYgKHRoaXMuY29tcG91bmROYW1lID09IG51bGwpIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworCQlpbnQgaGFzaENvZGUgPSAwOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdGhpcy5jb21wb3VuZE5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCWhhc2hDb2RlICs9IENoYXJPcGVyYXRpb24uaGFzaENvZGUodGhpcy5jb21wb3VuZE5hbWVbaV0pOworCQl9CisJCXJldHVybiBoYXNoQ29kZTsKKwl9CisKKwlwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7IC8vIGNhbm5vdCBrbm93IHRoZSBtYWluIHR5cGUgbmFtZSB3aXRob3V0IG9wZW5pbmcgLmphdmEgb3IgLmNsYXNzIGZpbGUKKwkJICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTgyCisJfQorCXB1YmxpYyBjaGFyW11bXSBnZXRQYWNrYWdlTmFtZSgpIHsKKwkJaW50IGxlbmd0aDsKKwkJaWYgKChsZW5ndGggPSB0aGlzLmNvbXBvdW5kTmFtZS5sZW5ndGgpID4gMSkgeworCQkJcmV0dXJuIENoYXJPcGVyYXRpb24uc3ViYXJyYXkodGhpcy5jb21wb3VuZE5hbWUsIDAsIGxlbmd0aC0xKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKKwkJfQorCX0KKwkvKioKKwkgKiBMb2NhdGUgZGVjbGFyYXRpb24gaW4gdGhlIGN1cnJlbnQgY2xhc3MgZmlsZS4gVGhpcyBjbGFzcyBmaWxlIGlzIGFsd2F5cyBpbiBhIGphci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzSW5DbGFzc0ZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ2xhc3NGaWxlKXRoaXMub3BlbmFibGU7CisJCUlCaW5hcnlUeXBlIGluZm8gPSB0aGlzLmxvY2F0b3IuZ2V0QmluYXJ5SW5mbyhjbGFzc0ZpbGUsIHRoaXMucmVzb3VyY2UpOworCQlpZiAoaW5mbyA9PSBudWxsKSAKKwkJCXJldHVybjsgLy8gdW5hYmxlIHRvIGdvIGZ1cnRoZXIKKwkKKwkJLy8gY2hlY2sgY2xhc3MgZGVmaW5pdGlvbgorCQlCaW5hcnlUeXBlIGJpbmFyeVR5cGUgPSAoQmluYXJ5VHlwZSljbGFzc0ZpbGUuZ2V0VHlwZSgpOworCQlpZiAodGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hlc0JpbmFyeShpbmZvLCBudWxsKSkgeworCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKGJpbmFyeVR5cGUsIGluZm8sIElKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIKTsKKwkJfQorCQorCQlib29sZWFuIGNvbXBpbGF0aW9uQWJvcnRlZCA9IGZhbHNlOworCQlpZiAodGhpcy5sb2NhdG9yLnBhdHRlcm4ubmVlZHNSZXNvbHZlKSB7CisJCQkvLyByZXNvbHZlCisJCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJYmluZGluZyA9IHRoaXMubG9jYXRvci5jYWNoZUJpbmFyeVR5cGUoYmluYXJ5VHlwZSk7CisJCQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworCQkJCQkvLyBmaWx0ZXIgb3V0IGVsZW1lbnQgbm90IGluIGhpZXJhcmNoeSBzY29wZQorCQkJCQlpZiAodGhpcy5sb2NhdG9yLmhpZXJhcmNoeVJlc29sdmVyICE9IG51bGwgCisJCQkJCQkJJiYgIXRoaXMubG9jYXRvci5oaWVyYXJjaHlSZXNvbHZlci5zdWJPclN1cGVyT2ZGb2N1cyhiaW5kaW5nKSkgeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQorCQkJCQkvLyBjaGVjayBtZXRob2RzCisJCQkJCU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gYmluZGluZy5tZXRob2RzKCk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworCQkJCQkJTWV0aG9kQmluZGluZyBtZXRob2QgPSBtZXRob2RzW2ldOworCQkJCQkJaW50IGxldmVsID0gdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hMZXZlbChtZXRob2QpOworCQkJCQkJc3dpdGNoIChsZXZlbCkgeworCQkJCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTVBPU1NJQkxFX01BVENIOgorCQkJCQkJCWNhc2UgU2VhcmNoUGF0dGVybi5JTkFDQ1VSQVRFX01BVENIOgorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlJTWV0aG9kIG1ldGhvZEhhbmRsZSA9IAorCQkJCQkJCQkJYmluYXJ5VHlwZS5nZXRNZXRob2QoCisJCQkJCQkJCQkJbmV3IFN0cmluZyhtZXRob2QuaXNDb25zdHJ1Y3RvcigpID8gYmluZGluZy5jb21wb3VuZE5hbWVbYmluZGluZy5jb21wb3VuZE5hbWUubGVuZ3RoLTFdIDogbWV0aG9kLnNlbGVjdG9yKSwKKwkJCQkJCQkJCQlTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobmV3IFN0cmluZyhtZXRob2Quc2lnbmF0dXJlKCkpLnJlcGxhY2UoJy8nLCAnLicpKQorCQkJCQkJCQkJKTsKKwkJCQkJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKAorCQkJCQkJCQkJbWV0aG9kSGFuZGxlLCAKKwkJCQkJCQkJCWluZm8sIAorCQkJCQkJCQkJbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/IAorCQkJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDogCisJCQkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCisJCQkJCS8vIGNoZWNrIGZpZWxkcworCQkJCQlGaWVsZEJpbmRpbmdbXSBmaWVsZHMgPSBiaW5kaW5nLmZpZWxkcygpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJCQkJRmllbGRCaW5kaW5nIGZpZWxkID0gZmllbGRzW2ldOworCQkJCQkJaW50IGxldmVsID0gdGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hMZXZlbChmaWVsZCk7CisJCQkJCQlzd2l0Y2ggKGxldmVsKSB7CisJCQkJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklNUE9TU0lCTEVfTUFUQ0g6CisJCQkJCQkJY2FzZSBTZWFyY2hQYXR0ZXJuLklOQUNDVVJBVEVfTUFUQ0g6CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCUlGaWVsZCBmaWVsZEhhbmRsZSA9IGJpbmFyeVR5cGUuZ2V0RmllbGQobmV3IFN0cmluZyhmaWVsZC5uYW1lKSk7CisJCQkJCQkJCXRoaXMubG9jYXRvci5yZXBvcnRCaW5hcnlNYXRjaCgKKwkJCQkJCQkJCWZpZWxkSGFuZGxlLCAKKwkJCQkJCQkJCWluZm8sIAorCQkJCQkJCQkJbGV2ZWwgPT0gU2VhcmNoUGF0dGVybi5BQ0NVUkFURV9NQVRDSCA/IAorCQkJCQkJCQkJCUlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yLkVYQUNUX01BVENIIDogCisJCQkJCQkJCQkJSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKEFib3J0Q29tcGlsYXRpb24gZSkgeworCQkJCWJpbmRpbmcgPSBudWxsOworCQkJfQorCQorCQkJLy8gbm8gbmVlZCB0byBjaGVjayBiaW5hcnkgaW5mbyBpZiByZXNvbHZlIHdhcyBzdWNjZXNzZnVsCisJCQljb21waWxhdGlvbkFib3J0ZWQgPSBiaW5kaW5nID09IG51bGw7CisJCQlpZiAoIWNvbXBpbGF0aW9uQWJvcnRlZCkgcmV0dXJuOworCQl9CisJCisJCS8vIGlmIGNvbXBpbGF0aW9uIHdhcyBhYm9ydGVkIGl0IGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjbGFzcyBwYXRoOiAKKwkJLy8gcmVwb3J0IGFzIGEgcG90ZW50aWFsIG1hdGNoIGlmIGJpbmFyeSBpbmZvIG1hdGNoZXMgdGhlIHBhdHRlcm4KKwkJaW50IGFjY3VyYWN5ID0gY29tcGlsYXRpb25BYm9ydGVkID8gSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuUE9URU5USUFMX01BVENIIDogSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IuRVhBQ1RfTUFUQ0g7CisJCQorCQkvLyBjaGVjayBtZXRob2RzCisJCUlCaW5hcnlNZXRob2RbXSBtZXRob2RzID0gaW5mby5nZXRNZXRob2RzKCk7CisJCWludCBsZW5ndGggPSBtZXRob2RzID09IG51bGwgPyAwIDogbWV0aG9kcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlCaW5hcnlNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKKwkJCWlmICh0aGlzLmxvY2F0b3IucGF0dGVybi5tYXRjaGVzQmluYXJ5KG1ldGhvZCwgaW5mbykpIHsKKwkJCQlJTWV0aG9kIG1ldGhvZEhhbmRsZSA9IAorCQkJCQliaW5hcnlUeXBlLmdldE1ldGhvZCgKKwkJCQkJCW5ldyBTdHJpbmcobWV0aG9kLmlzQ29uc3RydWN0b3IoKSA/IGluZm8uZ2V0TmFtZSgpIDogbWV0aG9kLmdldFNlbGVjdG9yKCkpLAorCQkJCQkJU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKG5ldyBTdHJpbmcobWV0aG9kLmdldE1ldGhvZERlc2NyaXB0b3IoKSkucmVwbGFjZSgnLycsICcuJykpCisJCQkJCSk7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKG1ldGhvZEhhbmRsZSwgaW5mbywgYWNjdXJhY3kpOworCQkJfQorCQl9CisJCisJCS8vIGNoZWNrIGZpZWxkcworCQlJQmluYXJ5RmllbGRbXSBmaWVsZHMgPSBpbmZvLmdldEZpZWxkcygpOworCQlsZW5ndGggPSBmaWVsZHMgPT0gbnVsbCA/IDAgOiBmaWVsZHMubGVuZ3RoOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQlJQmluYXJ5RmllbGQgZmllbGQgPSBmaWVsZHNbaV07CisJCQlpZiAodGhpcy5sb2NhdG9yLnBhdHRlcm4ubWF0Y2hlc0JpbmFyeShmaWVsZCwgaW5mbykpIHsKKwkJCQlJRmllbGQgZmllbGRIYW5kbGUgPSBiaW5hcnlUeXBlLmdldEZpZWxkKG5ldyBTdHJpbmcoZmllbGQuZ2V0TmFtZSgpKSk7CisJCQkJdGhpcy5sb2NhdG9yLnJlcG9ydEJpbmFyeU1hdGNoKGZpZWxkSGFuZGxlLCBpbmZvLCBhY2N1cmFjeSk7CisJCQl9CisJCX0KKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRoaXMub3BlbmFibGUgPT0gbnVsbCA/ICJGYWtlIFBvdGVudGlhbE1hdGNoIiA6IHRoaXMub3BlbmFibGUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBjaGFyW10gZ2V0RmlsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLm9wZW5hYmxlLmdldFBhdGgoKS50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BvdGVudGlhbE1hdGNoU2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1BvdGVudGlhbE1hdGNoU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxOGE0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUG90ZW50aWFsTWF0Y2hTZXQuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkhhc2h0YWJsZU9mT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLk9iamVjdFZlY3RvcjsKKworLyoqCisgKiBBIHNldCBvZiBQb3RlbnRpYWxNYXRjaGVzIHRoYXQgaXMgc29ydGVkIGJ5IHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3RlbnRpYWxNYXRjaFNldCB7CisJcHJpdmF0ZSBIYXNodGFibGVPZk9iamVjdCByb290c1RvUG90ZW50aWFsTWF0Y2hlcyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCg1KTsKKwlwcml2YXRlIGludCBlbGVtZW50Q291bnQgPSAwOworCQorCXB1YmxpYyB2b2lkIGFkZChQb3RlbnRpYWxNYXRjaCBwb3RlbnRpYWxNYXRjaCkgeworCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcG90ZW50aWFsTWF0Y2gub3BlbmFibGUuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOworCQljaGFyW10gcGF0aCA9IHJvb3QuZ2V0UGF0aCgpLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKKwkJT2JqZWN0VmVjdG9yIHBvdGVudGlhbE1hdGNoZXMgPSAoT2JqZWN0VmVjdG9yKXRoaXMucm9vdHNUb1BvdGVudGlhbE1hdGNoZXMuZ2V0KHBhdGgpOworCQlpZiAocG90ZW50aWFsTWF0Y2hlcyA9PSBudWxsKSB7CisJCQlwb3RlbnRpYWxNYXRjaGVzID0gbmV3IE9iamVjdFZlY3RvcigpOworCQkJdGhpcy5yb290c1RvUG90ZW50aWFsTWF0Y2hlcy5wdXQocGF0aCwgcG90ZW50aWFsTWF0Y2hlcyk7CisJCQlwb3RlbnRpYWxNYXRjaGVzLmFkZChwb3RlbnRpYWxNYXRjaCk7CisJCQl0aGlzLmVsZW1lbnRDb3VudCsrOworCQl9IGVsc2UgaWYgKCFwb3RlbnRpYWxNYXRjaGVzLmNvbnRhaW5zKHBvdGVudGlhbE1hdGNoKSkgeworCQkJcG90ZW50aWFsTWF0Y2hlcy5hZGQocG90ZW50aWFsTWF0Y2gpOworCQkJdGhpcy5lbGVtZW50Q291bnQrKzsKKwkJfQorCX0KKwkKKwlwdWJsaWMgUG90ZW50aWFsTWF0Y2hbXSBnZXRQb3RlbnRpYWxNYXRjaGVzKElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMpIHsKKwkJUG90ZW50aWFsTWF0Y2hbXSByZXN1bHQgPSBuZXcgUG90ZW50aWFsTWF0Y2hbdGhpcy5lbGVtZW50Q291bnRdOworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gcm9vdHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSByb290c1tpXTsKKwkJCWNoYXJbXSBwYXRoID0gcm9vdC5nZXRQYXRoKCkudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworCQkJT2JqZWN0VmVjdG9yIHBvdGVudGlhbE1hdGNoZXMgPSAoT2JqZWN0VmVjdG9yKXRoaXMucm9vdHNUb1BvdGVudGlhbE1hdGNoZXMuZ2V0KHBhdGgpOworCQkJaWYgKHBvdGVudGlhbE1hdGNoZXMgIT0gbnVsbCkgeworCQkJCXBvdGVudGlhbE1hdGNoZXMuY29weUludG8ocmVzdWx0LCBpbmRleCk7CisJCQkJaW5kZXggKz0gcG90ZW50aWFsTWF0Y2hlcy5zaXplKCk7CisJCQl9CisJCX0KKwkJaWYgKGluZGV4IDwgdGhpcy5lbGVtZW50Q291bnQpIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoCisJCQkJcmVzdWx0LCAKKwkJCQkwLCAKKwkJCQlyZXN1bHQgPSBuZXcgUG90ZW50aWFsTWF0Y2hbaW5kZXhdLAorCQkJCTAsCisJCQkJaW5kZXgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1F1YWxpZmllZFR5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IDY1MjQ1NDUuLjNmNDg1MDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklCaW5hcnlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgUXVhbGlmaWVkVHlwZURlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIFR5cGVEZWNsYXJhdGlvblBhdHRlcm4gewpAQCAtNDcsNyArNDcsNyBAQAogCWludCBzbGFzaCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIHdvcmQsIG9sZFNsYXNoKzEpOwogCWNoYXJbXSBwa2dOYW1lOwogCWlmIChzbGFzaCA9PSBvbGRTbGFzaCsxKXsgCi0JCXBrZ05hbWUgPSBOT19DSEFSOworCQlwa2dOYW1lID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCX0gZWxzZSB7CiAJCXBrZ05hbWUgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIG9sZFNsYXNoKzEsIHNsYXNoKTsKIAl9CkBAIC02MSw3ICs2MSw3IEBACiAJCQllbmNsb3NpbmdUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHNsYXNoKzEsIHNpemUtMSkpOwogCQl9CiAJfSBlbHNlIHsKLQkJZW5jbG9zaW5nVHlwZU5hbWVzID0gTk9fQ0hBUl9DSEFSOworCQllbmNsb3NpbmdUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAl9CiAJdGhpcy5kZWNvZGVkUXVhbGlmaWNhdGlvbiA9IENoYXJPcGVyYXRpb24uY29uY2F0V2l0aChwa2dOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMsICcuJyk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1NlYXJjaFBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU2VhcmNoUGF0dGVybi5qYXZhCmluZGV4IGIxNTk3Y2YuLjc5YzJhZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU2VhcmNoUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU2VhcmNoUGF0dGVybi5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklUZXJtaW5hbFN5bWJvbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JbnZhbGlkSW5wdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwpAQCAtMzYsMTkgKzM2LDIyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5UeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5TY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5UZXJtaW5hbFRva2VuczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuQmxvY2tzSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4SW5wdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLklJbmRleFNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSUluZGV4Q29uc3RhbnRzOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGF0dGVybiBpbXBsZW1lbnRzIElTZWFyY2hQYXR0ZXJuLCBJSW5kZXhDb25zdGFudHMsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKIAogCXByb3RlY3RlZCBpbnQgbWF0Y2hNb2RlOwogCXByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1Jlc29sdmUgPSB0cnVlOworCXB1YmxpYyBib29sZWFuIG5lZWRzUmVzb2x2ZSA9IHRydWU7CisKKwkvKiBmb2N1cyBlbGVtZW50ICh1c2VkIGZvciByZWZlcmVuY2UgcGF0dGVybnMqLworCXB1YmxpYyBJSmF2YUVsZW1lbnQgZm9jdXM7CiAKIAkvKiBtYXRjaCBsZXZlbCAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9TU0lCTEVfTUFUQ0ggPSAwOwpAQCAtNjIsOCArNjUsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEID0gNDsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSA4OwogCQotCi0KIHB1YmxpYyBTZWFyY2hQYXR0ZXJuKGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CiAJdGhpcy5tYXRjaE1vZGUgPSBtYXRjaE1vZGU7CiAJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7CkBAIC03NSw3ICs3Niw3IEBACiAgKi8KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlQ29uc3RydWN0b3JQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKIAotCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlLCB0cnVlKTsgLy8gdG9rZW5pemUgd2hpdGUgc3BhY2VzCisJU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UgLypjb21tZW50Ki8sIHRydWUgLyp3aGl0ZXNwYWNlKi8sIGZhbHNlIC8qbmxzKi8sIGZhbHNlIC8qYXNzZXJ0Ki8sIG51bGwgLyp0YXNrVGFncyovLCBudWxsLyp0YXNrUHJpb3JpdGllcyovKTsKIAlzY2FubmVyLnNldFNvdXJjZShwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCkpOwogCWZpbmFsIGludCBJbnNpZGVOYW1lID0gMTsKIAlmaW5hbCBpbnQgSW5zaWRlUGFyYW1ldGVyID0gMjsKQEAgLTkxLDEzICs5MiwxMyBAQAogCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQl3aGlsZSAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpeworCXdoaWxlICh0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpewogCQlzd2l0Y2gobW9kZSl7CiAKIAkJCS8vIHJlYWQgZGVjbGFyaW5nIHR5cGUgYW5kIHNlbGVjdG9yCiAJCQljYXNlIEluc2lkZU5hbWUgOgogCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1Q6CiAJCQkJCQlpZiAoZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9PSBudWxsKXsKIAkJCQkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQkJCQkJZGVjbGFyaW5nUXVhbGlmaWNhdGlvbiA9IHR5cGVOYW1lOwpAQCAtMTA3LDIzICsxMDgsMTkgQEAKIAkJCQkJCX0KIAkJCQkJCXR5cGVOYW1lID0gbnVsbDsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTjoKIAkJCQkJCXBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1s1XTsKIAkJCQkJCXBhcmFtZXRlckNvdW50ID0gMDsKIAkJCQkJCW1vZGUgPSBJbnNpZGVQYXJhbWV0ZXI7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXI6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVNVUxUSVBMWToKKwkJCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKIAkJCQkJCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCXR5cGVOYW1lICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCS8vIHJlYWQgcGFyYW1ldGVyIHR5cGVzCkBAIC0xMzEsNyArMTI4LDcgQEAKIAkJCQlzd2l0Y2ggKHRva2VuKSB7CiAJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVDT01NQToKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVDT01NQToKIAkJCQkJCWlmIChwYXJhbWV0ZXJUeXBlID09IG51bGwpIHJldHVybiBudWxsOwogCQkJCQkJaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSBwYXJhbWV0ZXJDb3VudCl7CiAJCQkJCQkJU3lzdGVtLmFycmF5Y29weShwYXJhbWV0ZXJUeXBlcywgMCwgcGFyYW1ldGVyVHlwZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckNvdW50KjJdLCAwLCBwYXJhbWV0ZXJDb3VudCk7CkBAIC0xMzksNyArMTM2LDcgQEAKIAkJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsKIAkJCQkJCXBhcmFtZXRlclR5cGUgPSBudWxsOwogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSUEFSRU46CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lUlBBUkVOOgogCQkJCQkJZm91bmRDbG9zaW5nUGFyZW50aGVzaXMgPSB0cnVlOwogCQkJCQkJaWYgKHBhcmFtZXRlclR5cGUgIT0gbnVsbCl7CiAJCQkJCQkJaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSBwYXJhbWV0ZXJDb3VudCl7CkBAIC0xNDgsMjggKzE0NSwxMiBAQAogCQkJCQkJCXBhcmFtZXRlclR5cGVzW3BhcmFtZXRlckNvdW50KytdID0gcGFyYW1ldGVyVHlwZTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNLRVQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0tFVDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVieXRlOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY2hhcjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWZsb2F0OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1laW50OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXNob3J0OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldm9pZDoKKwkJCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCl7CiAJCQkJCQkJcGFyYW1ldGVyVHlwZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCXBhcmFtZXRlclR5cGUgKz0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIG51bGw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQl9CkBAIC0yNjYsNyArMjQ3LDcgQEAKICAqLwogcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVGaWVsZFBhdHRlcm4oU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewogCi0JU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIHRydWUpOyAvLyB0b2tlbml6ZSB3aGl0ZSBzcGFjZXMKKwlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSAvKmNvbW1lbnQqLywgdHJ1ZSAvKndoaXRlc3BhY2UqLywgZmFsc2UgLypubHMqLywgZmFsc2UgLyphc3NlcnQqLywgbnVsbCAvKnRhc2tUYWdzKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8pOyAKIAlzY2FubmVyLnNldFNvdXJjZShwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCkpOwogCWZpbmFsIGludCBJbnNpZGVEZWNsYXJpbmdQYXJ0ID0gMTsKIAlmaW5hbCBpbnQgSW5zaWRlVHlwZSA9IDI7CkBAIC0yODEsMTMgKzI2MiwxMyBAQAogCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQl3aGlsZSAodG9rZW4gIT0gSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YpeworCXdoaWxlICh0b2tlbiAhPSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVFT0YpewogCQlzd2l0Y2gobW9kZSl7CiAKIAkJCS8vIHJlYWQgZGVjbGFyaW5nIHR5cGUgYW5kIGZpZWxkTmFtZQogCQkJY2FzZSBJbnNpZGVEZWNsYXJpbmdQYXJ0IDoKIAkJCQlzd2l0Y2ggKHRva2VuKSB7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1Q6CisJCQkJCWNhc2UgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UOgogCQkJCQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCl7CiAJCQkJCQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKIAkJCQkJCQlkZWNsYXJpbmdUeXBlID0gZmllbGROYW1lOwpAQCAtMjk5LDIwICsyODAsMTYgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQljYXNlIFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRToKIAkJCQkJCWlmICghKFNjYW5uZXIuVG9rZW5OYW1lV0hJVEVTUEFDRSA9PSBsYXN0VG9rZW4gCi0JCQkJCQkJfHwgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1QgPT0gbGFzdFRva2VuKSl7CisJCQkJCQkJfHwgVGVybWluYWxUb2tlbnMuVG9rZW5OYW1lRE9UID09IGxhc3RUb2tlbikpewogCQkJCQkJCW1vZGUgPSBJbnNpZGVUeXBlOwogCQkJCQkJfQogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTVVMVElQTFk6CisJCQkJCWRlZmF1bHQ6IC8vIGFsbCBvdGhlciB0b2tlbnMgYXJlIGNvbnNpZGVyZWQgaWRlbnRpZmllcnMgKHNlZSBidWcgMjE3NjMgUHJvYmxlbSBpbiBKYXZhIHNlYXJjaCBbc2VhcmNoXSkKIAkJCQkJCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkgewogCQkJCQkJCWZpZWxkTmFtZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCWZpZWxkTmFtZSArPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwogCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQkvLyByZWFkIHR5cGUgCkBAIC0zMjAsMjggKzI5NywxMiBAQAogCQkJCXN3aXRjaCAodG9rZW4pIHsKIAkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUlkZW50aWZpZXI6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVNVUxUSVBMWToKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDS0VUOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lUkJSQUNLRVQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVib29sZWFuOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYnl0ZToKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWNoYXI6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVkb3VibGU6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmbG9hdDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWludDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWxvbmc6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzaG9ydDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXZvaWQ6CisJCQkJCWRlZmF1bHQ6IC8vIGFsbCBvdGhlciB0b2tlbnMgYXJlIGNvbnNpZGVyZWQgaWRlbnRpZmllcnMgKHNlZSBidWcgMjE3NjMgUHJvYmxlbSBpbiBKYXZhIHNlYXJjaCBbc2VhcmNoXSkKIAkJCQkJCWlmICh0eXBlID09IG51bGwpewogCQkJCQkJCXR5cGUgPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQl0eXBlICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCQlicmVhazsKIAkJfQpAQCAtNDc4LDcgKzQzOSw3IEBACiAgKi8KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlTWV0aG9kUGF0dGVybihTdHJpbmcgcGF0dGVyblN0cmluZywgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CiAKLQlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSwgdHJ1ZSk7IC8vIHRva2VuaXplIHdoaXRlIHNwYWNlcworCVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKGZhbHNlIC8qY29tbWVudCovLCB0cnVlIC8qd2hpdGVzcGFjZSovLCBmYWxzZSAvKm5scyovLCBmYWxzZSAvKmFzc2VydCovLCBudWxsIC8qdGFza1RhZ3MqLywgbnVsbC8qdGFza1ByaW9yaXRpZXMqLyk7IAogCXNjYW5uZXIuc2V0U291cmNlKHBhdHRlcm5TdHJpbmcudG9DaGFyQXJyYXkoKSk7CiAJZmluYWwgaW50IEluc2lkZVNlbGVjdG9yID0gMTsKIAlmaW5hbCBpbnQgSW5zaWRlUGFyYW1ldGVyID0gMjsKQEAgLTQ5NywxMyArNDU4LDEzIEBACiAJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCXdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRil7CisJd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRil7CiAJCXN3aXRjaChtb2RlKXsKIAogCQkJLy8gcmVhZCBkZWNsYXJpbmcgdHlwZSBhbmQgc2VsZWN0b3IKIAkJCWNhc2UgSW5zaWRlU2VsZWN0b3IgOgogCQkJCXN3aXRjaCAodG9rZW4pIHsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVET1Q6CiAJCQkJCQlpZiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKXsKIAkJCQkJCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQkJCQkJZGVjbGFyaW5nVHlwZSA9IHNlbGVjdG9yOwpAQCAtNTEzLDI3ICs0NzQsMjQgQEAKIAkJCQkJCX0KIAkJCQkJCXNlbGVjdG9yID0gbnVsbDsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTFBBUkVOOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUxQQVJFTjoKIAkJCQkJCXBhcmFtZXRlclR5cGVzID0gbmV3IFN0cmluZ1s1XTsKIAkJCQkJCXBhcmFtZXRlckNvdW50ID0gMDsKIAkJCQkJCW1vZGUgPSBJbnNpZGVQYXJhbWV0ZXI7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CiAJCQkJCQlpZiAoIShTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0UgPT0gbGFzdFRva2VuIAotCQkJCQkJCXx8IElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UID09IGxhc3RUb2tlbikpeworCQkJCQkJCXx8IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZURPVCA9PSBsYXN0VG9rZW4pKXsKIAkJCQkJCQltb2RlID0gSW5zaWRlUmV0dXJuVHlwZTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgorCQkJCQlkZWZhdWx0OiAvLyBhbGwgb3RoZXIgdG9rZW5zIGFyZSBjb25zaWRlcmVkIGlkZW50aWZpZXJzIChzZWUgYnVnIDIxNzYzIFByb2JsZW0gaW4gSmF2YSBzZWFyY2ggW3NlYXJjaF0pCiAJCQkJCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewogCQkJCQkJCXNlbGVjdG9yID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJc2VsZWN0b3IgKz0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIG51bGw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJLy8gcmVhZCBwYXJhbWV0ZXIgdHlwZXMKQEAgLTU0MSw3ICs0OTksNyBAQAogCQkJCXN3aXRjaCAodG9rZW4pIHsKIAkJCQkJY2FzZSBTY2FubmVyLlRva2VuTmFtZVdISVRFU1BBQ0U6CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUNPTU1BOgorCQkJCQljYXNlIFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUNPTU1BOgogCQkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAJCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsKIAkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAwLCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyQ291bnQqMl0sIDAsIHBhcmFtZXRlckNvdW50KTsKQEAgLTU0OSw3ICs1MDcsNyBAQAogCQkJCQkJcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVyQ291bnQrK10gPSBwYXJhbWV0ZXJUeXBlOwogCQkJCQkJcGFyYW1ldGVyVHlwZSA9IG51bGw7CiAJCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJQQVJFTjoKKwkJCQkJY2FzZSBUZXJtaW5hbFRva2Vucy5Ub2tlbk5hbWVSUEFSRU46CiAJCQkJCQlmb3VuZENsb3NpbmdQYXJlbnRoZXNpcyA9IHRydWU7CiAJCQkJCQlpZiAocGFyYW1ldGVyVHlwZSAhPSBudWxsKXsKIAkJCQkJCQlpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IHBhcmFtZXRlckNvdW50KXsKQEAgLTU1OSwyOCArNTE3LDEyIEBACiAJCQkJCQl9CiAJCQkJCQltb2RlID0gSW5zaWRlUmV0dXJuVHlwZTsKIAkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRE9UOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lSWRlbnRpZmllcjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTEJSQUNLRVQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVSQlJBQ0tFVDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVieXRlOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lY2hhcjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWZsb2F0OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1laW50OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZXNob3J0OgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1ldm9pZDoKKwkJCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCQkJaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCl7CiAJCQkJCQkJcGFyYW1ldGVyVHlwZSA9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJCQl9IGVsc2UgewogCQkJCQkJCXBhcmFtZXRlclR5cGUgKz0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIG51bGw7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJLy8gcmVhZCByZXR1cm4gdHlwZQpAQCAtNTg4LDI4ICs1MzAsMTIgQEAKIAkJCQlzd2l0Y2ggKHRva2VuKSB7CiAJCQkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgogCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVET1Q6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lTVVMVElQTFk6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVMQlJBQ0tFVDoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VUOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYm9vbGVhbjoKLQkJCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJ5dGU6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVjaGFyOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZG91YmxlOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lZmxvYXQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbnQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVsb25nOgotCQkJCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lc2hvcnQ6Ci0JCQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV2b2lkOgorCQkJCQlkZWZhdWx0OiAvLyBhbGwgb3RoZXIgdG9rZW5zIGFyZSBjb25zaWRlcmVkIGlkZW50aWZpZXJzIChzZWUgYnVnIDIxNzYzIFByb2JsZW0gaW4gSmF2YSBzZWFyY2ggW3NlYXJjaF0pCiAJCQkJCQlpZiAocmV0dXJuVHlwZSA9PSBudWxsKXsKIAkJCQkJCQlyZXR1cm5UeXBlID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcmV0dXJuVHlwZSArPSBuZXcgU3RyaW5nKHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkpOwogCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCX0KQEAgLTc5OCw3ICs3MjQsNyBAQAogCQkJU3RyaW5nIGZ1bGxEZWNsYXJpbmdOYW1lID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOwogCQkJbGFzdERvdCA9IGZ1bGxEZWNsYXJpbmdOYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAJCQljaGFyW10gZGVjbGFyaW5nU2ltcGxlTmFtZSA9IChsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKSA6IGZ1bGxEZWNsYXJpbmdOYW1lKS50b0NoYXJBcnJheSgpOwotCQkJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkgOiBOT19DSEFSOworCQkJY2hhcltdIGRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkgOiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQljaGFyW10gbmFtZSA9IGZpZWxkLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKTsKIAkJCWNoYXJbXSB0eXBlU2ltcGxlTmFtZTsKIAkJCWNoYXJbXSB0eXBlUXVhbGlmaWNhdGlvbjsKQEAgLTkxNiw3ICs4NDIsNyBAQAogCQkJZnVsbERlY2xhcmluZ05hbWUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOwogCQkJbGFzdERvdCA9IGZ1bGxEZWNsYXJpbmdOYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAJCQlkZWNsYXJpbmdTaW1wbGVOYW1lID0gKGxhc3REb3QgIT0gLTEgPyBmdWxsRGVjbGFyaW5nTmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpIDogZnVsbERlY2xhcmluZ05hbWUpLnRvQ2hhckFycmF5KCk7Ci0JCQlkZWNsYXJpbmdRdWFsaWZpY2F0aW9uID0gbGFzdERvdCAhPSAtMSA/IGZ1bGxEZWNsYXJpbmdOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KS50b0NoYXJBcnJheSgpIDogTk9fQ0hBUjsKKwkJCWRlY2xhcmluZ1F1YWxpZmljYXRpb24gPSBsYXN0RG90ICE9IC0xID8gZnVsbERlY2xhcmluZ05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpLnRvQ2hhckFycmF5KCkgOiBDaGFyT3BlcmF0aW9uLk5PX0NIQVI7CiAJCQljaGFyW10gc2VsZWN0b3IgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS50b0NoYXJBcnJheSgpOwogCQkJY2hhcltdIHJldHVyblNpbXBsZU5hbWU7CiAJCQljaGFyW10gcmV0dXJuUXVhbGlmaWNhdGlvbjsKQEAgLTEwNTgsNiArOTg0LDkgQEAKIAkJCXNlYXJjaFBhdHRlcm4gPSBjcmVhdGVQYWNrYWdlUGF0dGVybihlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIGxpbWl0VG8sIEVYQUNUX01BVENILCBDQVNFX1NFTlNJVElWRSk7CiAJCQlicmVhazsKIAl9CisJaWYgKHNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgeworCQlzZWFyY2hQYXR0ZXJuLmZvY3VzID0gZWxlbWVudDsKKwl9CiAJcmV0dXJuIHNlYXJjaFBhdHRlcm47CiB9CiBwcml2YXRlIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVR5cGVQYXR0ZXJuKGNoYXJbXSBzaW1wbGVOYW1lLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgaW50IGxpbWl0VG8pIHsKQEAgLTExMTUsNyArMTA0NCw3IEBACiAgKi8KIHByaXZhdGUgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlVHlwZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewogCi0JU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoZmFsc2UsIHRydWUpOyAvLyB0b2tlbml6ZSB3aGl0ZSBzcGFjZXMKKwlTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihmYWxzZSAvKmNvbW1lbnQqLywgdHJ1ZSAvKndoaXRlc3BhY2UqLywgZmFsc2UgLypubHMqLywgZmFsc2UgLyphc3NlcnQqLywgbnVsbCAvKnRhc2tUYWdzKi8sIG51bGwvKnRhc2tQcmlvcml0aWVzKi8pOyAKIAlzY2FubmVyLnNldFNvdXJjZShwYXR0ZXJuU3RyaW5nLnRvQ2hhckFycmF5KCkpOwogCVN0cmluZyB0eXBlID0gbnVsbDsKIAlpbnQgdG9rZW47CkBAIC0xMTI0LDMyICsxMDUzLDE2IEBACiAJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQotCXdoaWxlICh0b2tlbiAhPSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUVPRil7CisJd2hpbGUgKHRva2VuICE9IFRlcm1pbmFsVG9rZW5zLlRva2VuTmFtZUVPRil7CiAJCXN3aXRjaCAodG9rZW4pIHsKIAkJCWNhc2UgU2Nhbm5lci5Ub2tlbk5hbWVXSElURVNQQUNFOgogCQkJCWJyZWFrOwotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZURPVDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVJZGVudGlmaWVyOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZU1VTFRJUExZOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZUxCUkFDS0VUOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVJCUkFDS0VUOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWJvb2xlYW46Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lYnl0ZToKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVjaGFyOgotCQkJY2FzZSBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZWRvdWJsZToKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVmbG9hdDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVpbnQ6Ci0JCQljYXNlIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lbG9uZzoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVzaG9ydDoKLQkJCWNhc2UgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWV2b2lkOgorCQkJZGVmYXVsdDogLy8gYWxsIG90aGVyIHRva2VucyBhcmUgY29uc2lkZXJlZCBpZGVudGlmaWVycyAoc2VlIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdKQogCQkJCWlmICh0eXBlID09IG51bGwpewogCQkJCQl0eXBlID0gbmV3IFN0cmluZyhzY2FubmVyLmdldEN1cnJlbnRUb2tlblNvdXJjZSgpKTsKIAkJCQl9IGVsc2UgewogCQkJCQl0eXBlICs9IG5ldyBTdHJpbmcoc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKSk7CiAJCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQl0cnkgewogCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwpAQCAtMTIwNywxNiArMTEyMCwxNiBAQAogCQkJLy8gKHNlZSBidWcgMjA1MzIgIERlY2xhcmF0aW9uIG9mIG1lbWJlciBiaW5hcnkgdHlwZSBub3QgZm91bmQpCiAJCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CiAJCQlpZiAoZGVjbGFyaW5nVHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5PX0NIQVJfQ0hBUjsKKwkJCQlyZXR1cm4gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVI7CiAJCQl9IGVsc2UgewogCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KAogCQkJCQllbmNsb3NpbmdUeXBlTmFtZXMoZGVjbGFyaW5nVHlwZSksIAogCQkJCQlkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CiAJCQl9CiAJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6Ci0JCQlyZXR1cm4gCU5PX0NIQVJfQ0hBUjsKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLQkJCXJldHVybiAJQ2hhck9wZXJhdGlvbi5hcnJheUNvbmNhdCgKKwkJCXJldHVybiBDaGFyT3BlcmF0aW9uLmFycmF5Q29uY2F0KAogCQkJCWVuY2xvc2luZ1R5cGVOYW1lcygoSVR5cGUpcGFyZW50KSwgCiAJCQkJcGFyZW50LmdldEVsZW1lbnROYW1lKCkudG9DaGFyQXJyYXkoKSk7CiAJCWRlZmF1bHQ6CkBAIC0xMzA0LDYgKzEyMTcsNyBAQAogICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4uCiAgKi8KIHByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNOYW1lKGNoYXJbXSBwYXR0ZXJuLCBjaGFyW10gbmFtZSkgeworCWlmIChwYXR0ZXJuID09IG51bGwpIHJldHVybiB0cnVlOyAvLyBudWxsIGlzIGFzIGlmIGl0IHdhcyAiKiIKIAlpZiAobmFtZSAhPSBudWxsKXsKIAkJc3dpdGNoICh0aGlzLm1hdGNoTW9kZSkgewogCQkJY2FzZSBFWEFDVF9NQVRDSCA6CkBAIC0xMzExLDYgKzEyMjUsOSBAQAogCQkJY2FzZSBQUkVGSVhfTUFUQ0ggOgogCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLnByZWZpeEVxdWFscyhwYXR0ZXJuLCBuYW1lLCB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSk7CiAJCQljYXNlIFBBVFRFUk5fTUFUQ0ggOgorCQkJCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHsKKwkJCQkJcGF0dGVybiA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGF0dGVybik7CisJCQkJfQogCQkJCXJldHVybiBDaGFyT3BlcmF0aW9uLm1hdGNoKHBhdHRlcm4sIG5hbWUsIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKTsKIAkJfQogCX0KQEAgLTEzMzUsNiArMTI1Miw5IEBACiAJCQlwYXR0ZXJuID0gQ2hhck9wZXJhdGlvbi5jb25jYXQocXVhbGlmaWNhdGlvblBhdHRlcm4sIHNpbXBsZU5hbWVQYXR0ZXJuLCAnLicpOwogCQl9CiAJfQorCWlmICghdGhpcy5pc0Nhc2VTZW5zaXRpdmUpIHsKKwkJcGF0dGVybiA9IENoYXJPcGVyYXRpb24udG9Mb3dlckNhc2UocGF0dGVybik7CisJfQogCXJldHVybiAKIAkJQ2hhck9wZXJhdGlvbi5tYXRjaCgKIAkJCXBhdHRlcm4sCkBAIC0xMzc5LDEyICsxMjk5LDYgQEAKIAlyZXR1cm4gIlNlYXJjaFBhdHRlcm4iOyAvLyROT04tTkxTLTEkCiB9CiAKLQotCi0KLQotCi0KIC8qKgogICogSW5pdGlhbGl6ZXMgdGhpcyBzZWFyY2ggcGF0dGVybiBzbyB0aGF0IHBvbHltb3JwaGljIHNlYXJjaCBjYW4gYmUgcGVyZm9ybWVkLgogICovIApAQCAtMTM5Miw2ICsxMzA2LDEzIEBACiAJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCiB9CiAKKy8qCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXR0ZXJuIGlzIGEgcG9seW1vcnBoaWMgc2VhcmNoIHBhdHRlcm4uCisgKi8KK3B1YmxpYyBib29sZWFuIGlzUG9seW1vcnBoaWNTZWFyY2goKSB7CisJcmV0dXJuIGZhbHNlOworfQorCiAvKioKICAqIEZpbmRzIG91dCB3aGV0aGVyIHRoZSBnaXZlbiBhc3Qgbm9kZSBtYXRjaGVzIHRoaXMgc2VhcmNoIHBhdHRlcm4uCiAgKiBSZXR1cm5zIElNUE9TU0lCTEVfTUFUQ0ggaWYgaXQgZG9lc24ndC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmluZGV4IDZkNjdmMjQuLjMyZTQ3OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlckludGVyZmFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5tYXRjaGluZzsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLklJbmRleENvbnN0YW50czsKIAogcHVibGljIGNsYXNzIFN1cGVySW50ZXJmYWNlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFN1cGVyVHlwZVJlZmVyZW5jZVBhdHRlcm4gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVOYW1lc0NvbGxlY3Rvci5qYXZhCmluZGV4IDdhYzRkZWEuLmNiMTBmZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlTmFtZXNDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1N1cGVyVHlwZU5hbWVzQ29sbGVjdG9yLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CkBAIC00NSw4ICs0Niw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wYXJzZXIuU291cmNlVHlwZUNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5BYm9ydENvbXBpbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQmluYXJ5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLk9wZW5hYmxlOwpAQCAtMTM5LDggKzEzOCw4IEBACiBwcml2YXRlIENvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGJ1aWxkQmluZGluZ3MoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewogCWZpbmFsIElGaWxlIGZpbGUgPSAKIAkJY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSA/Ci0JCQkoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpIDoKLQkJCShJRmlsZSljb21waWxhdGlvblVuaXQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkoSUZpbGUpY29tcGlsYXRpb25Vbml0LmdldE9yaWdpbmFsRWxlbWVudCgpLmdldFJlc291cmNlKCkgOgorCQkJKElGaWxlKWNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpOwogCQogCS8vIGdldCBtYWluIHR5cGUgbmFtZQogCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwpAQCAtMTc4LDE1ICsxNzcsNyBAQAogCX0KIAlyZXR1cm4gdW5pdDsKIH0KLXByaXZhdGUgQmluYXJ5VHlwZUJpbmRpbmcgY2FjaGVCaW5hcnlUeXBlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIGVuY2xvc2luZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQlpZiAoZW5jbG9zaW5nVHlwZSAhPSBudWxsKSB7Ci0JCS8vIGZvcmNlIGNhY2hpbmcgb2YgZW5jbG9zaW5nIHR5cGVzIGZpcnN0LCBzbyB0aGF0IGJpbmFyeSB0eXBlIGNhbiBiZSBmb3VuZCBpbiBsb29rdXAgZW52aXJvbWVudAotCQl0aGlzLmNhY2hlQmluYXJ5VHlwZShlbmNsb3NpbmdUeXBlKTsKLQl9Ci0JSUJpbmFyeVR5cGUgYmluYXJ5VHlwZSA9IChJQmluYXJ5VHlwZSkoKEJpbmFyeVR5cGUpdHlwZSkuZ2V0UmF3SW5mbygpOwotCXJldHVybiB0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQuY2FjaGVCaW5hcnlUeXBlKGJpbmFyeVR5cGUpOwotfQorCiAKIHByb3RlY3RlZCBjaGFyW11bXVtdIGNvbGxlY3QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkKQEAgLTE5NSwxMyArMTg2LDE2IEBACiAJCXRoaXMucmVzdWx0ID0gbmV3IGNoYXJbMV1bXVtdOwogCQl0aGlzLnJlc3VsdEluZGV4ID0gMDsKIAkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpdGhpcy50eXBlLmdldEphdmFQcm9qZWN0KCk7Ci0JCXRoaXMubG9jYXRvci5jcmVhdGVQYXJzZXIoamF2YVByb2plY3QpOworCQl0aGlzLmxvY2F0b3IuaW5pdGlhbGl6ZU5hbWVFbnZpcm9ubWVudChqYXZhUHJvamVjdCk7CisJCXRoaXMubG9jYXRvci5pbml0aWFsaXplKGphdmFQcm9qZWN0KTsKIAkJc3luY2hyb25pemVkKHRoaXMubG9jYXRvci5uYW1lTG9va3VwKSB7IC8vIHByZXZlbnQgMiBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIG5hbWUgbG9va3VwIHdoaWxlIHRoZSB3b3JraW5nIGNvcGllcyBhcmUgc2V0CiAJCQl0aGlzLmxvY2F0b3IubmFtZUxvb2t1cC5zZXRVbml0c1RvTG9va0luc2lkZSh0aGlzLmxvY2F0b3Iud29ya2luZ0NvcGllcyk7CiAJCQl0cnkgewogCQkJCWlmICh0aGlzLnR5cGUuaXNCaW5hcnkoKSkgewotCQkJCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5jYWNoZUJpbmFyeVR5cGUodGhpcy50eXBlKTsKLQkJCQkJdGhpcy5jb2xsZWN0U3VwZXJUeXBlTmFtZXMoYmluZGluZyk7CisJCQkJCUJpbmFyeVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmxvY2F0b3IuY2FjaGVCaW5hcnlUeXBlKHRoaXMudHlwZSk7CisJCQkJCWlmIChiaW5kaW5nICE9IG51bGwpIHsKKwkJCQkJCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOworCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gdGhpcy50eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwogCQkJCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBwYXJzZWRVbml0ID0gdGhpcy5idWlsZEJpbmRpbmdzKHVuaXQpOwpAQCAtMjMyLDcgKzIyNiw3IEBACiAJCQl0cnkgewogCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBwYXRocy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogCQkJCQl0cnkgewotCQkJCQkJT3BlbmFibGUgb3BlbmFibGUgPSB0aGlzLmxvY2F0b3IuaGFuZGxlRmFjdG9yeS5jcmVhdGVPcGVuYWJsZShwYXRoc1tpXSk7CisJCQkJCQlPcGVuYWJsZSBvcGVuYWJsZSA9IHRoaXMubG9jYXRvci5oYW5kbGVGYWN0b3J5LmNyZWF0ZU9wZW5hYmxlKHBhdGhzW2ldLCB0aGlzLmxvY2F0b3Iuc2NvcGUpOwogCQkJCQkJaWYgKG9wZW5hYmxlID09IG51bGwpCiAJCQkJCQkJY29udGludWU7IC8vIG91dHNpZGUgY2xhc3NwYXRoCiAJCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IG9wZW5hYmxlLmdldEphdmFQcm9qZWN0KCk7CkBAIC0yNDEsNyArMjM1LDggQEAKIAkJCQkJCQkJdGhpcy5sb2NhdG9yLm5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUobnVsbCk7CiAJCQkJCQkJfQogCQkJCQkJCXByZXZpb3VzUHJvamVjdCA9IChKYXZhUHJvamVjdClwcm9qZWN0OwotCQkJCQkJCXRoaXMubG9jYXRvci5jcmVhdGVQYXJzZXIocHJldmlvdXNQcm9qZWN0KTsKKwkJCQkJCQl0aGlzLmxvY2F0b3IuaW5pdGlhbGl6ZU5hbWVFbnZpcm9ubWVudChwcmV2aW91c1Byb2plY3QpOworCQkJCQkJCXRoaXMubG9jYXRvci5pbml0aWFsaXplKHByZXZpb3VzUHJvamVjdCk7CiAJCQkJCQkJdGhpcy5sb2NhdG9yLm5hbWVMb29rdXAuc2V0VW5pdHNUb0xvb2tJbnNpZGUodGhpcy5sb2NhdG9yLndvcmtpbmdDb3BpZXMpOwogCQkJCQkJfQogCQkJCQkJaWYgKG9wZW5hYmxlIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewpAQCAtMjUyLDcgKzI0Nyw3IEBACiAJCQkJCQkJfQogCQkJCQkJfSBlbHNlIGlmIChvcGVuYWJsZSBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpIHsKIAkJCQkJCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChJQ2xhc3NGaWxlKW9wZW5hYmxlOwotCQkJCQkJCUJpbmFyeVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmNhY2hlQmluYXJ5VHlwZShjbGFzc0ZpbGUuZ2V0VHlwZSgpKTsKKwkJCQkJCQlCaW5hcnlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5sb2NhdG9yLmNhY2hlQmluYXJ5VHlwZShjbGFzc0ZpbGUuZ2V0VHlwZSgpKTsKIAkJCQkJCQlpZiAodGhpcy5tYXRjaGVzKGJpbmRpbmcpKSB7CiAJCQkJCQkJCXRoaXMuY29sbGVjdFN1cGVyVHlwZU5hbWVzKGJpbmRpbmcpOwogCQkJCQkJCX0KQEAgLTQyNCw3ICs0MTksMTMgQEAKIHB1YmxpYyB2b2lkIGFjY2VwdChJU291cmNlVHlwZVtdIHNvdXJjZVR5cGVzLCBQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZykgewogCUNvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VUeXBlc1swXS5nZXRGaWxlTmFtZSgpLCAxLCAxLCAwKTsKIAlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0KLQkJU291cmNlVHlwZUNvbnZlcnRlci5idWlsZENvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlcywgZmFsc2UsIHRydWUsIHRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5wcm9ibGVtUmVwb3J0ZXIsIHJlc3VsdCk7CisJCVNvdXJjZVR5cGVDb252ZXJ0ZXIuYnVpbGRDb21waWxhdGlvblVuaXQoCisJCQlzb3VyY2VUeXBlcywgLy9zb3VyY2VUeXBlc1swXSBpcyBhbHdheXMgdG9wbGV2ZWwgaGVyZQorCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGFuZCBtZXRob2RzCisJCQl0cnVlLCAvLyBuZWVkIG1lbWJlciB0eXBlcworCQkJZmFsc2UsIC8vIG5vIG5lZWQgZm9yIGZpZWxkIGluaXRpYWxpemF0aW9uCisJCQl0aGlzLmxvY2F0b3IubG9va3VwRW52aXJvbm1lbnQucHJvYmxlbVJlcG9ydGVyLCAKKwkJCXJlc3VsdCk7CiAKIAlpZiAodW5pdCAhPSBudWxsKSB7CiAJCXRoaXMubG9jYXRvci5sb29rdXBFbnZpcm9ubWVudC5idWlsZFR5cGVCaW5kaW5ncyh1bml0KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvU3VwZXJUeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKaW5kZXggYzlkMzhhNS4uYzdiZWUxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9TdXBlclR5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKQEAgLTEsMjIgKzEsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmc7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy4qOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuKjsKQEAgLTEzMiw3ICsxMzIsOCBAQAogCQl9CiAJCXRoaXMuZW50cnlSZXN1bHRzLnB1dChpbnB1dCwgZW50cmllcyk7CiAJfQotCQorCWlmIChlbnRyaWVzID09IE5PX0VOVFJZX1JFU1VMVCkgcmV0dXJuOworCiAJLyogb25seSBzZWxlY3QgZW50cmllcyB3aGljaCBhY3R1YWxseSBtYXRjaCB0aGUgZW50aXJlIHNlYXJjaCBwYXR0ZXJuICovCiAJaW50IHNsYXNoID0gU1VQRVJfUkVGLmxlbmd0aDsKIAljaGFyW10gc2ltcGxlTmFtZSA9IHRoaXMuc3VwZXJTaW1wbGVOYW1lOwpAQCAtMjYyLDcgKzI2Myw3IEBACiAKIAlUeXBlUmVmZXJlbmNlIHR5cGVSZWYgPSAoVHlwZVJlZmVyZW5jZSlub2RlOwogCWlmIChyZXNvbHZlKSB7Ci0JCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlUmVmLmJpbmRpbmc7CisJCVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlUmVmLnJlc29sdmVkVHlwZTsKIAkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVEZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmluZGV4IGMzZTg3YzMuLjM5ODU5NDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZURlY2xhcmF0aW9uUGF0dGVybi5qYXZhCkBAIC0xLDI0ICsxLDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Bc3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuQ2hhck9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRW50cnlSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguaW1wbC5JbmRleElucHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhlZEZpbGU7CkBAIC03OCw3ICs3OCw3IEBACiAJaW50IG9sZFNsYXNoID0gVFlQRV9ERUNMX0xFTkdUSCsxOwogCWludCBzbGFzaCA9IENoYXJPcGVyYXRpb24uaW5kZXhPZihTRVBBUkFUT1IsIHdvcmQsIG9sZFNsYXNoKzEpOwogCWlmIChzbGFzaCA9PSBvbGRTbGFzaCsxKXsgCi0JCXRoaXMuZGVjb2RlZFBhY2thZ2UgPSBOT19DSEFSOworCQl0aGlzLmRlY29kZWRQYWNrYWdlID0gQ2hhck9wZXJhdGlvbi5OT19DSEFSOwogCX0gZWxzZSB7CiAJCXRoaXMuZGVjb2RlZFBhY2thZ2UgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIG9sZFNsYXNoKzEsIHNsYXNoKTsKIAl9CkBAIC05MSw3ICs5MSw3IEBACiAJCQl0aGlzLmRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLnNwbGl0T24oJy8nLCBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KHdvcmQsIHNsYXNoKzEsIHNpemUtMSkpOwogCQl9CiAJfSBlbHNlIHsKLQkJdGhpcy5kZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzID0gTk9fQ0hBUl9DSEFSOworCQl0aGlzLmRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMgPSBDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUjsKIAl9CiB9CiAvKioKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWlmIChlbmNsb3NpbmdUeXBlTmFtZXMgIT0gbnVsbCl7CiAJCS8vIGVtcHR5IGNoYXJbXVtdIG1lYW5zIG5vIGVuY2xvc2luZyB0eXBlLCBpLmUuIHRoZSBkZWNvZGVkIG9uZSBpcyB0aGUgZW1wdHkgY2hhciBhcnJheQogCQlpZiAoZW5jbG9zaW5nVHlwZU5hbWVzLmxlbmd0aCA9PSAwKXsKLQkJCWlmIChkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzICE9IE5PX0NIQVJfQ0hBUikgcmV0dXJuIGZhbHNlOworCQkJaWYgKGRlY29kZWRFbmNsb3NpbmdUeXBlTmFtZXMgIT0gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpIHJldHVybiBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmICghQ2hhck9wZXJhdGlvbi5lcXVhbHMoZW5jbG9zaW5nVHlwZU5hbWVzLCBkZWNvZGVkRW5jbG9zaW5nVHlwZU5hbWVzLCBpc0Nhc2VTZW5zaXRpdmUpKSByZXR1cm4gZmFsc2U7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWF0Y2hpbmcvVHlwZVJlZmVyZW5jZVBhdHRlcm4uamF2YQppbmRleCA4MDViMDQ4Li4wNTM0ZTU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21hdGNoaW5nL1R5cGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tYXRjaGluZy9UeXBlUmVmZXJlbmNlUGF0dGVybi5qYXZhCkBAIC0xLDE5ICsxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLm1hdGNoaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXJyYXlUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKQEAgLTI0LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlNpbmdsZU5hbWVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5TaW5nbGVUeXBlUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLio7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5BcnJheUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuQmluZGluZ0lkczsKQEAgLTMxLDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlByb2JsZW1SZWZlcmVuY2VCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUmVmZXJlbmNlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIubG9va3VwLlR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLkNoYXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUVudHJ5UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LmltcGwuSW5kZXhJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5pbXBsLkluZGV4ZWRGaWxlOwpAQCAtNDMsNyArNDQsNiBAQAogCXByaXZhdGUgY2hhcltdIHF1YWxpZmljYXRpb247CiAJcHJpdmF0ZSBjaGFyW10gc2ltcGxlTmFtZTsKIAotCXByaXZhdGUgY2hhcltdIGRlY29kZWRRdWFsaWZpY2F0aW9uOwogCXByaXZhdGUgY2hhcltdIGRlY29kZWRTaW1wbGVOYW1lOwogCiAJcHJpdmF0ZSBzdGF0aWMgY2hhcltdW10gVEFHUyA9IHsgVFlQRV9SRUYsIFNVUEVSX1JFRiwgUkVGLCBDT05TVFJVQ1RPUl9SRUYgfTsKQEAgLTY2LDEwICs2NiwxMCBAQAogCXRoaXMuc2ltcGxlTmFtZSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHNpbXBsZU5hbWUgOiBDaGFyT3BlcmF0aW9uLnRvTG93ZXJDYXNlKHNpbXBsZU5hbWUpOwogCiAJaWYgKHNpbXBsZU5hbWUgPT0gbnVsbCkgewotCQl0aGlzLnNlZ21lbnRzID0gcXVhbGlmaWNhdGlvbiA9PSBudWxsID8gT05FX1NUQVJfQ0hBUiA6IENoYXJPcGVyYXRpb24uc3BsaXRPbignLicsIHF1YWxpZmljYXRpb24pOworCQl0aGlzLnNlZ21lbnRzID0gdGhpcy5xdWFsaWZpY2F0aW9uID09IG51bGwgPyBPTkVfU1RBUl9DSEFSIDogQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcuJywgdGhpcy5xdWFsaWZpY2F0aW9uKTsKIAl9CiAJCi0JdGhpcy5uZWVkc1Jlc29sdmUgPSBxdWFsaWZpY2F0aW9uICE9IG51bGw7CisJdGhpcy5uZWVkc1Jlc29sdmUgPSB0cnVlOyAvLyBhbHdheXMgcmVzb2x2ZSAoaW4gY2FzZSBvZiBhIHNpbXBsZSBuYW1lIHJlZmVyZW5jZSBiZWluZyBhIHBvdGVudGlhbCBtYXRjaCkKIH0KIC8qKgogICogRWl0aGVyIGRlY29kZSByZWYvbmFtZSwgdHlwZVJlZi9uYW1lIG9yIHN1cGVyUmVmL3N1cGVyTmFtZS9uYW1lCkBAIC0yNzgsNyArMjc4LDcgQEAKICAqLwogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxVHlwZVJlZiwgSUphdmFFbGVtZW50IGVsZW1lbnQsIGludCBhY2N1cmFjeSwgTWF0Y2hMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAljaGFyW11bXSB0b2tlbnMgPSBudWxsOwotCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcVR5cGVSZWYuYmluZGluZzsKKwlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHFUeXBlUmVmLnJlc29sdmVkVHlwZTsKIAlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHsKIAkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7CiAJfQpAQCAtMzcyLDggKzM3Miw2IEBACiAgKi8KIHByaXZhdGUgaW50IG1hdGNoTGV2ZWwoSW1wb3J0UmVmZXJlbmNlIGltcG9ydFJlZiwgYm9vbGVhbiByZXNvbHZlKSB7CiAKLQlpZiAoaW1wb3J0UmVmLm9uRGVtYW5kKSByZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKLQogCWNoYXJbXVtdIHRva2VucyA9IGltcG9ydFJlZi50b2tlbnM7CiAJaW50IGltcG9ydExlbmd0aCA9IHRva2Vucy5sZW5ndGg7CiAJCkBAIC00NDYsMTIgKzQ0NCwxNSBAQAogCQlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lUmVmLmJpbmRpbmc7CiAKIAkJaWYgKG5hbWVSZWYgaW5zdGFuY2VvZiBTaW5nbGVOYW1lUmVmZXJlbmNlKSB7Ci0JCQlpZiAoYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcgaW5zdGFuY2VvZiBQcm9ibGVtQmluZGluZyl7CisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJYmluZGluZyA9ICgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpYmluZGluZykub3JpZ2luYWw7CisJCQl9CisJCQlpZiAoYmluZGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmluZGluZykgeworCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOworCQkJfSBlbHNlIGlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykpewogCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOwotCQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpIHsKLQkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIElNUE9TU0lCTEVfTUFUQ0g7IC8vIG11c3QgYmUgYSB0eXBlIGJpbmRpbmcKKwkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgKFR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKIAkJCX0KIAkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkTmFtZVJlZmVyZW5jZQogCQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBudWxsOwpAQCAtNDY5LDYgKzQ3MCwxMiBAQAogCQkJCWNhc2UgQmluZGluZ0lkcy5MT0NBTCA6IC8vIHJlYWRpbmcgYSBsb2NhbCB2YXJpYWJsZQogCQkJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsgLy8gbm8gdHlwZSBtYXRjaCBpbiBpdAogCQkJCWNhc2UgQmluZGluZ0lkcy5UWVBFIDogLy89PT09PT09PT09PT09b25seSB0eXBlID09PT09PT09PT09PT09CisJCQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCQkJCWJpbmRpbmcgPSAoKFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKWJpbmRpbmcpLm9yaWdpbmFsOworCQkJCQl9CisJCQkJCWlmICghKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykpIHsKKwkJCQkJCXJldHVybiBJTkFDQ1VSQVRFX01BVENIOworCQkJCQl9CiAJCQkJCXR5cGVCaW5kaW5nID0gKFR5cGVCaW5kaW5nKWJpbmRpbmc7CiAJCQkJCWJyZWFrOwogCQkJCS8qCkBAIC00ODMsNiArNDkwLDE2IEBACiAJCQkJCQljaGFyW10gcGFydGlhbFF1YWxpZmllZE5hbWUgPSBwYkJpbmRpbmcubmFtZTsKIAkJCQkJCWxhc3RJbmRleCA9IENoYXJPcGVyYXRpb24ub2NjdXJlbmNlc09mKCcuJywgcGFydGlhbFF1YWxpZmllZE5hbWUpIC0gMTsgLy8gaW5kZXggb2YgbGFzdCBib3VuZCB0b2tlbiBpcyBvbmUgYmVmb3JlIHRoZSBwYiB0b2tlbgogCQkJCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgbGFzdEluZGV4IDwgMCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQkJCX0gZWxzZSBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFByb2JsZW1SZWZlcmVuY2VCaW5kaW5nKSB7CisJCQkJCQlQcm9ibGVtUmVmZXJlbmNlQmluZGluZyBwYkJpbmRpbmcgPSAoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpYmluZGluZzsKKwkJCQkJCWJpbmRpbmcgPSBwYkJpbmRpbmcub3JpZ2luYWw7CisJCQkJCQlpZiAoIShiaW5kaW5nIGluc3RhbmNlb2YgVHlwZUJpbmRpbmcpKSB7CisJCQkJCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CisJCQkJCQl9CisJCQkJCQl0eXBlQmluZGluZyA9IChUeXBlQmluZGluZyliaW5kaW5nOworCQkJCQkJY2hhcltdW10gcGFydGlhbFF1YWxpZmllZE5hbWUgPSBwYkJpbmRpbmcuY29tcG91bmROYW1lOworCQkJCQkJbGFzdEluZGV4ID0gcGFydGlhbFF1YWxpZmllZE5hbWUgPT0gbnVsbCA/IC0xIDogcGFydGlhbFF1YWxpZmllZE5hbWUubGVuZ3RoIC0gMTsgLy8gaW5kZXggb2YgbGFzdCBib3VuZCB0b2tlbiBpcyBvbmUgYmVmb3JlIHRoZSBwYiB0b2tlbgorCQkJCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgbGFzdEluZGV4IDwgMCkgcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQl9CkBAIC01MDksNyArNTI2LDcgQEAKICAqIFJlcG9ydHMgdGhlIG1hdGNoIG9mIHRoZSBnaXZlbiBhcnJheSB0eXBlIHJlZmVyZW5jZS4KICAqLwogcHJvdGVjdGVkIHZvaWQgbWF0Y2hSZXBvcnRSZWZlcmVuY2UoQXJyYXlUeXBlUmVmZXJlbmNlIGFycmF5UmVmLCBJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IGFjY3VyYWN5LCBNYXRjaExvY2F0b3IgbG9jYXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHRva2VucyA9IHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsID8gTk9fQ0hBUl9DSEFSIDogbmV3IGNoYXJbXVtdIHt0aGlzLnNpbXBsZU5hbWV9OworCWNoYXJbXVtdIHRva2VucyA9IHRoaXMuc2ltcGxlTmFtZSA9PSBudWxsID8gQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIgOiBuZXcgY2hhcltdW10ge3RoaXMuc2ltcGxlTmFtZX07CiAJbG9jYXRvci5yZXBvcnRBY2N1cmF0ZVJlZmVyZW5jZShhcnJheVJlZi5zb3VyY2VTdGFydCwgYXJyYXlSZWYuc291cmNlRW5kLCB0b2tlbnMsIGVsZW1lbnQsIGFjY3VyYWN5KTsKIH0KIApAQCAtNTQxLDM1ICs1NTgsNDMgQEAKIAkJCX0JCQkJCiAJCX0gCiAJfSBlbHNlIHsKLQkJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlUmVmLmJpbmRpbmc7CisJCVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZVJlZi5yZXNvbHZlZFR5cGU7CisJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIEFycmF5QmluZGluZykgeworCQkJdHlwZUJpbmRpbmcgPSAoKEFycmF5QmluZGluZyl0eXBlQmluZGluZykubGVhZkNvbXBvbmVudFR5cGU7CisJCX0KKwkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHsKKwkJCUJpbmRpbmcgYmluZGluZyA9ICgoUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLm9yaWdpbmFsOworCQkJaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBUeXBlQmluZGluZykgeworCQkJCXR5cGVCaW5kaW5nID0gKFR5cGVCaW5kaW5nKWJpbmRpbmc7CisJCQl9IGVsc2UgaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJCX0KKwkJfQogCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuIElOQUNDVVJBVEVfTUFUQ0g7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodHlwZUJpbmRpbmcgaW5zdGFuY2VvZiBBcnJheUJpbmRpbmcpIHR5cGVCaW5kaW5nID0gKChBcnJheUJpbmRpbmcpdHlwZUJpbmRpbmcpLmxlYWZDb21wb25lbnRUeXBlOwotCQkJaWYgKHR5cGVCaW5kaW5nIGluc3RhbmNlb2YgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcpIHJldHVybiBJTkFDQ1VSQVRFX01BVENIOwotCQkJaWYgKHR5cGVSZWYgaW5zdGFuY2VvZiBTaW5nbGVUeXBlUmVmZXJlbmNlKXsKLQkJCQlyZXR1cm4gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOwotCQkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkVHlwZVJlZmVyZW5jZQotCQkJCVF1YWxpZmllZFR5cGVSZWZlcmVuY2UgcVR5cGVSZWYgPSAoUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSl0eXBlUmVmOwotCQkJCWNoYXJbXVtdIHRva2VucyA9IHFUeXBlUmVmLnRva2VuczsKLQkJCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOwotCQkJCS8vIHRyeSB0byBtYXRjaCBhbGwgZW5jbG9zaW5nIHR5cGVzIGZvciB3aGljaCB0aGUgdG9rZW4gbWF0Y2hlcyBhcyB3ZWxsLgotCQkJCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsICYmIGxhc3RJbmRleCA+PSAwKXsKLQkJCQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2xhc3RJbmRleC0tXSkpIHsKLQkJCQkJCWludCBsZXZlbCA9IHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKLQkJCQkJCWlmIChsZXZlbCAhPSBJTVBPU1NJQkxFX01BVENIKSB7Ci0JCQkJCQkJcmV0dXJuIGxldmVsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpewotCQkJCQkJdHlwZUJpbmRpbmcgPSAoKFJlZmVyZW5jZUJpbmRpbmcpdHlwZUJpbmRpbmcpLmVuY2xvc2luZ1R5cGUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJfQorCQlpZiAodHlwZVJlZiBpbnN0YW5jZW9mIFNpbmdsZVR5cGVSZWZlcmVuY2UpeworCQkJcmV0dXJuIHRoaXMubWF0Y2hMZXZlbEZvclR5cGUodGhpcy5zaW1wbGVOYW1lLCB0aGlzLnF1YWxpZmljYXRpb24sIHR5cGVCaW5kaW5nKTsKKwkJfSBlbHNlIHsgLy8gUXVhbGlmaWVkVHlwZVJlZmVyZW5jZQorCQkJUXVhbGlmaWVkVHlwZVJlZmVyZW5jZSBxVHlwZVJlZiA9IChRdWFsaWZpZWRUeXBlUmVmZXJlbmNlKXR5cGVSZWY7CisJCQljaGFyW11bXSB0b2tlbnMgPSBxVHlwZVJlZi50b2tlbnM7CisJCQlpbnQgbGFzdEluZGV4ID0gdG9rZW5zLmxlbmd0aC0xOworCQkJLy8gdHJ5IHRvIG1hdGNoIGFsbCBlbmNsb3NpbmcgdHlwZXMgZm9yIHdoaWNoIHRoZSB0b2tlbiBtYXRjaGVzIGFzIHdlbGwuCisJCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiBsYXN0SW5kZXggPj0gMCl7CisJCQkJaWYgKG1hdGNoZXNOYW1lKHRoaXMuc2ltcGxlTmFtZSwgdG9rZW5zW2xhc3RJbmRleC0tXSkpIHsKKwkJCQkJaW50IGxldmVsID0gdGhpcy5tYXRjaExldmVsRm9yVHlwZSh0aGlzLnNpbXBsZU5hbWUsIHRoaXMucXVhbGlmaWNhdGlvbiwgdHlwZUJpbmRpbmcpOworCQkJCQlpZiAobGV2ZWwgIT0gSU1QT1NTSUJMRV9NQVRDSCkgeworCQkJCQkJcmV0dXJuIGxldmVsOwogCQkJCQl9CiAJCQkJfQotCQkJCXJldHVybiBJTVBPU1NJQkxFX01BVENIOwotCQkJfSAKLQkJfQorCQkJCWlmICh0eXBlQmluZGluZyBpbnN0YW5jZW9mIFJlZmVyZW5jZUJpbmRpbmcpeworCQkJCQl0eXBlQmluZGluZyA9ICgoUmVmZXJlbmNlQmluZGluZyl0eXBlQmluZGluZykuZW5jbG9zaW5nVHlwZSgpOworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGVCaW5kaW5nID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gSU1QT1NTSUJMRV9NQVRDSDsKKwkJfSAKIAkJCQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvbWVzc2FnZXMucHJvcGVydGllcwppbmRleCBmZWUxODQyLi4xNTU0MWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xLDMgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMgRWNsaXBzZSBKYXZhIENvcmUgU2VhcmNoIG1lc3NhZ2VzLgogCiBlbmdpbmUuc2VhcmNoaW5nID0gU2VhcmNoaW5nLi4uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSUpvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0lKb2IuamF2YQppbmRleCA3ZjdkNGU3Li5iNTNkNDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSUpvYi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9JSm9iLmphdmEKQEAgLTEsMTMgKzEsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MC41IAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzIsMTEgKzMyLDEyIEBACiAJICogY2FuIHRha2UgYW4gdW5kZXJ0ZXJtaW5lZCBhbW91bnQgb2YgdGltZS4KIAkgKi8KIAlwdWJsaWMgdm9pZCBjYW5jZWwoKTsKLQkKIAkvKioKLQkgKiBFeGVjdXRlIHRoZSBjdXJyZW50IGpvYiwgYW5zd2VyaW5nOgotCSAqICAgICAgUkVTQ0hFRFVMRSBpZiB0aGUgam9iIHNob3VsZCBiZSByZXNjaGVkdWxlZCBsYXRlciBvbgotCSAqICAgICAgQ09NUExFVEUgaWYgdGhlIGpvYiBpcyBvdmVyCisJICogRXhlY3V0ZSB0aGUgY3VycmVudCBqb2IsIGFuc3dlciB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCS8qKgorCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBqb2IgaXMgcmVhZHkgdG8gcnVuLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVhZHlUb1J1bigpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9Kb2JNYW5hZ2VyLmphdmEKaW5kZXggZjMzYTcxZC4uZjE3ODU0OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLnByb2Nlc3Npbmc7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKQEAgLTczLDEyICs3MywxOCBAQAogCX0KIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZSgpIHsKIAkJZW5hYmxlZCA9IGZhbHNlOworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRElTQUJMSU5HIGJhY2tncm91bmQgaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkvKioKIAkgKiBSZW1vdmUgdGhlIGluZGV4IGZyb20gY2FjaGUgZm9yIGEgZ2l2ZW4gcHJvamVjdC4KIAkgKiBQYXNzaW5nIG51bGwgYXMgYSBqb2IgZmFtaWx5IGRpc2NhcmRzIHRoZW0gYWxsLgogCSAqLwogCXB1YmxpYyB2b2lkIGRpc2NhcmRKb2JzKFN0cmluZyBqb2JGYW1pbHkpIHsKKworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRElTQ0FSRCAgIGJhY2tncm91bmQgam9iIGZhbWlseSAtICIgKyBqb2JGYW1pbHkpOyAvLyROT04tTkxTLTEkCisKIAkJYm9vbGVhbiB3YXNFbmFibGVkID0gaXNFbmFibGVkKCk7CiAJCXRyeSB7CiAJCQlJSm9iIGN1cnJlbnRKb2I7CkBAIC05NSw3ICsxMDEsOSBAQAogCQkJCS8vIHdhaXQgdW50aWwgY3VycmVudCBhY3RpdmUgam9iIGhhcyBmaW5pc2hlZAogCQkJCXdoaWxlICh0aHJlYWQgIT0gbnVsbCAmJiBleGVjdXRpbmcpewogCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MCk7CisJCQkJCQlpZiAoVkVSQk9TRSkKKwkJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IHdhaXRpbmcgZW5kIG9mIGN1cnJlbnQgYmFja2dyb3VuZCBqb2IgLSAiICsgY3VycmVudEpvYik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsKIAkJCQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKIAkJCQkJfQogCQkJCX0KQEAgLTExMSw2ICsxMTksOCBAQAogCQkJCQkJfHwgY3VycmVudEpvYi5iZWxvbmdzVG8oam9iRmFtaWx5KSkpIHsgLy8gY29weSBkb3duLCBjb21wYWN0aW5nCiAJCQkJCQlhd2FpdGluZ0pvYnNbKytsb2NdID0gY3VycmVudEpvYjsKIAkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChWRVJCT1NFKQorCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gZGlzY2FyZGluZyBiYWNrZ3JvdW5kIGpvYiAgLSAiICsgY3VycmVudEpvYik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWN1cnJlbnRKb2IuY2FuY2VsKCk7CiAJCQkJCX0KIAkJCQl9CkBAIC0xMjEsOSArMTMxLDEzIEBACiAJCQlpZiAod2FzRW5hYmxlZCkKIAkJCQllbmFibGUoKTsKIAkJfQorCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRElTQ0FSRCAgIERPTkUgd2l0aCBiYWNrZ3JvdW5kIGpvYiBmYW1pbHkgLSAiICsgam9iRmFtaWx5KTsgLy8kTk9OLU5MUy0xJAogCX0KIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlKCkgewogCQllbmFibGVkID0gdHJ1ZTsKKwkJaWYgKFZFUkJPU0UpCisJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkVOQUJMSU5HICBiYWNrZ3JvdW5kIGluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW5hYmxlZCgpIHsKIAkJcmV0dXJuIGVuYWJsZWQ7CkBAIC0xNzAsMTggKzE4NCwyMyBAQAogCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7CiAKIAkJaWYgKFZFUkJPU0UpCi0JCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIlNUQVJUSU5HIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvbmN1cnJlbnRKb2JXb3JrID0gMTAwOwotCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3MuYmVnaW5UYXNrKCIiLCBjb25jdXJyZW50Sm9iV29yayk7IC8vJE5PTi1OTFMtMSQKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiU1RBUlRJTkcgIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKCFzZWFyY2hKb2IuaXNSZWFkeVRvUnVuKCkpIHsKKwkJCWlmIChWRVJCT1NFKQorCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiQUJPUlRFRCAgIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBJSm9iLkZBSUxFRDsKIAkJfQorCisJCWludCBjb25jdXJyZW50Sm9iV29yayA9IDEwMDsKKwkJaWYgKHByb2dyZXNzICE9IG51bGwpCisJCQlwcm9ncmVzcy5iZWdpblRhc2soIiIsIGNvbmN1cnJlbnRKb2JXb3JrKTsgLy8kTk9OLU5MUy0xJAogCQlib29sZWFuIHN0YXR1cyA9IElKb2IuRkFJTEVEOwogCQlpZiAoYXdhaXRpbmdKb2JzQ291bnQoKSA+IDApIHsKIAkJCXN3aXRjaCAod2FpdGluZ1BvbGljeSkgewogCiAJCQkJY2FzZSBJSm9iLkZvcmNlSW1tZWRpYXRlIDoKIAkJCQkJaWYgKFZFUkJPU0UpCi0JCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIi0+IE5PVCBSRUFEWSAtIEZvcmNpbmcgaW1tZWRpYXRlIC0gIiArIHNlYXJjaEpvYik7Ly8kTk9OLU5MUy0xJAorCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBOT1QgUkVBRFkgLSBmb3JjaW5nIGltbWVkaWF0ZSAtICIgKyBzZWFyY2hKb2IpOy8vJE5PTi1OTFMtMSQKIAkJCQkJYm9vbGVhbiB3YXNFbmFibGVkID0gaXNFbmFibGVkKCk7CiAJCQkJCXRyeSB7CiAJCQkJCQlkaXNhYmxlKCk7IC8vIHBhdXNlIGluZGV4aW5nCkBAIC0xOTEsMTUgKzIxMCwxNiBAQAogCQkJCQkJCWVuYWJsZSgpOwogCQkJCQl9CiAJCQkJCWlmIChWRVJCT1NFKQotCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCJET05FIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRklOSVNIRUQgIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJCiAJCQkJY2FzZSBJSm9iLkNhbmNlbElmTm90UmVhZHkgOgogCQkJCQlpZiAoVkVSQk9TRSkKLQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gQ2FuY2VsbGluZyAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2dyZXNzLnNldENhbmNlbGVkKHRydWUpOworCQkJCQkJSm9iTWFuYWdlci52ZXJib3NlKCItPiBOT1QgUkVBRFkgLSBjYW5jZWxsaW5nIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHByb2dyZXNzICE9IG51bGwpIHByb2dyZXNzLnNldENhbmNlbGVkKHRydWUpOwogCQkJCQlpZiAoVkVSQk9TRSkKLQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiQ0FOQ0VMTEVEIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7CisJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkNBTkNFTEVEIGNvbmN1cnJlbnQgam9iIC0gIiArIHNlYXJjaEpvYik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CiAKIAkJCQljYXNlIElKb2IuV2FpdFVudGlsUmVhZHkgOgogCQkJCQlpbnQgYXdhaXRpbmdXb3JrOwpAQCAtMjE1LDggKzIzNSwxMSBAQAogCQkJCQlpbnQgb3JpZ2luYWxQcmlvcml0eSA9IHRoaXMudGhyZWFkLmdldFByaW9yaXR5KCk7CiAJCQkJCXRyeSB7CiAJCQkJCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCQkJCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMudGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0UHJpb3JpdHkoKSk7CisJCQkJCQkJCisJCQkJCQkJLy8gdXNlIGxvY2FsIHZhcmlhYmxlIHRvIGF2b2lkIHBvdGVudGlhbCBOUEUgKHNlZSBCdWcgMjA0MzUgTlBFIHdoZW4gc2VhcmNoaW5nIGphdmEgbWV0aG9kKQorCQkJCQkJCVRocmVhZCB0ID0gdGhpcy50aHJlYWQ7CisJCQkJCQkJaWYgKHQgIT0gbnVsbCkgeworCQkJCQkJCQl0LnNldFByaW9yaXR5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0UHJpb3JpdHkoKSk7CiAJCQkJCQkJfQogCQkJCQkJCXRoaXMuYXdhaXRpbmdDbGllbnRzKys7CiAJCQkJCQl9CkBAIC0yMjcsNyArMjUwLDcgQEAKIAkJCQkJCQkvLyBjdXJyZW50Sm9iIGNhbiBiZSBudWxsIHdoZW4gam9icyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHF1ZXVlIGJ1dCBqb2IgbWFuYWdlciBpcyBub3QgZW5hYmxlZAogCQkJCQkJCWlmIChjdXJyZW50Sm9iICE9IG51bGwgJiYgY3VycmVudEpvYiAhPSBwcmV2aW91c0pvYikgewogCQkJCQkJCQlpZiAoVkVSQk9TRSkKLQkJCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gV2FpdGluZyB1bnRpbCByZWFkeSAtICIgKyBzZWFyY2hKb2IpOy8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiLT4gTk9UIFJFQURZIC0gd2FpdGluZyB1bnRpbCByZWFkeSAtICIgKyBzZWFyY2hKb2IpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJaWYgKHN1YlByb2dyZXNzICE9IG51bGwpIHsKIAkJCQkJCQkJCXN1YlByb2dyZXNzLnN1YlRhc2soCiAJCQkJCQkJCQkJVXRpbC5iaW5kKCJtYW5hZ2VyLmZpbGVzVG9JbmRleCIsIEludGVnZXIudG9TdHJpbmcoYXdhaXRpbmdXb3JrKSkpOyAvLyROT04tTkxTLTEkCkBAIC0yNDMsOCArMjY2LDExIEBACiAJCQkJCX0gZmluYWxseSB7CiAJCQkJCQlzeW5jaHJvbml6ZWQodGhpcykgewogCQkJCQkJCXRoaXMuYXdhaXRpbmdDbGllbnRzLS07Ci0JCQkJCQkJaWYgKHRoaXMudGhyZWFkICE9IG51bGwpIHsKLQkJCQkJCQkJdGhpcy50aHJlYWQuc2V0UHJpb3JpdHkob3JpZ2luYWxQcmlvcml0eSk7CisJCQkJCQkJCisJCQkJCQkJLy8gdXNlIGxvY2FsIHZhcmlhYmxlIHRvIGF2b2lkIHBvdGVudGlhbCBOUEUgKHNlZSBCdWcgMjA0MzUgTlBFIHdoZW4gc2VhcmNoaW5nIGphdmEgbWV0aG9kKQorCQkJCQkJCVRocmVhZCB0ID0gdGhpcy50aHJlYWQ7CisJCQkJCQkJaWYgKHQgIT0gbnVsbCkgeworCQkJCQkJCQl0LnNldFByaW9yaXR5KG9yaWdpbmFsUHJpb3JpdHkpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtMjU4LDEyICsyODQsMTcgQEAKIAkJCXByb2dyZXNzLmRvbmUoKTsKIAkJfQogCQlpZiAoVkVSQk9TRSkKLQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRE9ORSBjb25jdXJyZW50IGpvYiAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCisJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIkZJTklTSEVEICBjb25jdXJyZW50IGpvYiAtICIgKyBzZWFyY2hKb2IpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBzdGF0dXM7CiAJfQogCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcHJvY2Vzc05hbWUoKTsKIAkKIAlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdChJSm9iIGpvYikgeworCQlpZiAoIWpvYi5pc1JlYWR5VG9SdW4oKSkgeworCQkJaWYgKFZFUkJPU0UpCisJCQkJSm9iTWFuYWdlci52ZXJib3NlKCJBQk9SVEVEIHJlcXVlc3Qgb2YgYmFja2dyb3VuZCBqb2IgLSAiICsgam9iKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CiAKIAkJLy8gYXBwZW5kIHRoZSBqb2IgdG8gdGhlIGxpc3Qgb2Ygb25lcyB0byBwcm9jZXNzIGxhdGVyIG9uCiAJCWludCBzaXplID0gYXdhaXRpbmdKb2JzLmxlbmd0aDsKQEAgLTI3OSwxMyArMzEwLDE1IEBACiAJCX0KIAkJYXdhaXRpbmdKb2JzW2pvYkVuZF0gPSBqb2I7CiAJCWlmIChWRVJCT1NFKQotCQkJSm9iTWFuYWdlci52ZXJib3NlKCJSRVFVRVNUSU5HIGpvYiAtICIgKyBqb2IpOyAvLyROT04tTkxTLTEkCisJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIlJFUVVFU1QgICBiYWNrZ3JvdW5kIGpvYiAtICIgKyBqb2IpOyAvLyROT04tTkxTLTEkCiAKIAl9CiAJLyoqCiAJICogRmx1c2ggY3VycmVudCBzdGF0ZQogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlpZiAoVkVSQk9TRSkKKwkJCUpvYk1hbmFnZXIudmVyYm9zZSgiUmVzZXQiKTsgLy8kTk9OLU5MUy0xJAogCiAJCWlmICh0aHJlYWQgIT0gbnVsbCkgewogCQkJZGlzY2FyZEpvYnMobnVsbCk7IC8vIGRpc2NhcmQgYWxsIGpvYnMKQEAgLTMxMywxNCArMzQ2LDE0IEBACiAJCQkJCQlpZiAoaWRsaW5nU3RhcnQgPCAwKQogCQkJCQkJCWlkbGluZ1N0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAJCQkJCQlub3RpZnlJZGxlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gaWRsaW5nU3RhcnQpOwotCQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCg1MDApOworCQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlkbGluZ1N0YXJ0ID0gLTE7CiAJCQkJCX0KIAkJCQkJaWYgKFZFUkJPU0UpIHsKIAkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZShhd2FpdGluZ0pvYnNDb3VudCgpICsgIiBhd2FpdGluZyBqb2JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiU1RBUlRJTkcgdG8gZXhlY3V0ZSAtICIgKyBqb2IpOyAvLyROT04tTkxTLTEkCisJCQkJCQlKb2JNYW5hZ2VyLnZlcmJvc2UoIlNUQVJUSU5HIGJhY2tncm91bmQgam9iIC0gIiArIGpvYik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCQl0cnkgewogCQkJCQkJZXhlY3V0aW5nID0gdHJ1ZTsKQEAgLTMyOSw3ICszNjIsNyBAQAogCQkJCQl9IGZpbmFsbHkgewogCQkJCQkJZXhlY3V0aW5nID0gZmFsc2U7CiAJCQkJCQlpZiAoVkVSQk9TRSkgewotCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRE9ORSBleGVjdXRpbmcgLSAiICsgam9iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRklOSVNIRUQgYmFja2dyb3VuZCBqb2IgLSAiICsgam9iKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQogCQkJCQkJbW92ZVRvTmV4dEpvYigpOwogCQkJCQkJaWYgKHRoaXMuYXdhaXRpbmdDbGllbnRzID09IDApIHsKQEAgLTM0Nyw5ICszODAsMjAgQEAKIAkJCQkvLyBrZWVwIGpvYiBtYW5hZ2VyIGFsaXZlCiAJCQkJdGhpcy5kaXNjYXJkSm9icyhudWxsKTsKIAkJCQl0aGlzLnRocmVhZCA9IG51bGw7Ci0JCQkJdGhpcy5yZXNldCgpOyAvLyB0aGlzIHdpbGwgZm9yayBhIG5ldyB0aHJlYWQKLQkJCQl0aHJvdyBlOworCQkJCXRoaXMucmVzZXQoKTsgLy8gdGhpcyB3aWxsIGZvcmsgYSBuZXcgdGhyZWFkIHdpdGggbm8gd2FpdGluZyBqb2JzLCBzb21lIGluZGV4ZXMgd2lsbCBiZSBpbmNvbnNpc3RlbnQKIAkJCX0KKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKEVycm9yIGUpIHsKKwkJCWlmICh0aGlzLnRocmVhZCAhPSBudWxsICYmICEoZSBpbnN0YW5jZW9mIFRocmVhZERlYXRoKSkgeworCQkJCS8vIGxvZyBleGNlcHRpb24KKwkJCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLmxvZyhlLCAiQmFja2dyb3VuZCBJbmRleGVyIENyYXNoIFJlY292ZXJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkKKwkJCQkvLyBrZWVwIGpvYiBtYW5hZ2VyIGFsaXZlCisJCQkJdGhpcy5kaXNjYXJkSm9icyhudWxsKTsKKwkJCQl0aGlzLnRocmVhZCA9IG51bGw7CisJCQkJdGhpcy5yZXNldCgpOyAvLyB0aGlzIHdpbGwgZm9yayBhIG5ldyB0aHJlYWQgd2l0aCBubyB3YWl0aW5nIGpvYnMsIHNvbWUgaW5kZXhlcyB3aWxsIGJlIGluY29uc2lzdGVudAorCQkJfQorCQkJdGhyb3cgZTsKIAkJfQogCX0KIAkvKioKQEAgLTM2Miw4ICs0MDYsMjAgQEAKIAkJVGhyZWFkIHRocmVhZCA9IHRoaXMudGhyZWFkOwogCQl0aGlzLnRocmVhZCA9IG51bGw7IC8vIG1hcmsgdGhlIGpvYiBtYW5hZ2VyIGFzIHNodXR0aW5nIGRvd24gc28gdGhhdCB0aGUgdGhyZWFkIHdpbGwgc3RvcCBieSBpdHNlbGYKIAkJdHJ5IHsKLQkJCXRocmVhZC5qb2luKCk7CisJCQlpZiAodGhyZWFkICE9IG51bGwpIHsgLy8gc2VlIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxODU4CisJCQkJdGhyZWFkLmpvaW4oKTsKKwkJCX0KIAkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOworCWJ1ZmZlci5hcHBlbmQoIkVuYWJsZWQ6IikuYXBwZW5kKHRoaXMuZW5hYmxlZCkuYXBwZW5kKCdcbicpOyAvLyROT04tTkxTLTEkCisJaW50IG51bUpvYnMgPSBqb2JFbmQgLSBqb2JTdGFydCArIDE7CisJYnVmZmVyLmFwcGVuZCgiSm9icyBpbiBxdWV1ZToiKS5hcHBlbmQobnVtSm9icykuYXBwZW5kKCdcbicpOyAvLyROT04tTkxTLTEkCisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Kb2JzICYmIGkgPCAxNTsgaSsrKSB7CisJCWJ1ZmZlci5hcHBlbmQoaSkuYXBwZW5kKCIgLSBqb2JbIitpKyJdOiAiKS5hcHBlbmQoYXdhaXRpbmdKb2JzW2pvYlN0YXJ0K2ldKS5hcHBlbmQoJ1xuJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CQorfQo=